ok here is my ffa service but is not complete functioning i have modified all to work but it need to be complied in to the main source to work
Files in the main source to be change
extract global zip to : aion emu\trunk\AL-Game\src\com\aionemu\gameserver\services
extract l18n zip to : aion emu\trunk\AL-Game\src\com\aionemu\gameserver\utils
goto trunk\AL-Game\src\com\aionemu\gameserver\services\player
and change this in PlayerReviveService.java
Code:
public static final void revive(final Player player, int hpPercent, int mpPercent, boolean setSoulsickness, int resurrectionSkill) {
player.getKnownList().doOnAllPlayers(new Visitor<Player>() {
@Override
public void visit(Player visitor) {
VisibleObject target = visitor.getTarget();
if (target != null && target.getObjectId() == player.getObjectId()) {
visitor.setTarget(null);
PacketSendUtility.sendPacket(visitor, new SM_TARGET_SELECTED(null));
}
}
});
boolean isNoResurrectPenalty = player.getController().isNoResurrectPenaltyInEffect();
player.getMoveController().stopFalling(player.getZ());
player.setPlayerResActivate(false);
player.getLifeStats().setCurrentHpPercent(isNoResurrectPenalty ? 100 : hpPercent);
player.getLifeStats().setCurrentMpPercent(isNoResurrectPenalty ? 100 : mpPercent);
if (player.getCommonData().getDp() > 0 && !isNoResurrectPenalty)
player.getCommonData().setDp(0);
if (player.getWorldId() == 300350000)
player.getCommonData().setDp(4000);
player.getLifeStats().triggerRestoreOnRevive();
if ((!isNoResurrectPenalty) && (setSoulsickness)) {
player.getController().updateSoulSickness(resurrectionSkill);
goto trunk\AL-Game\src\com\aionemu\gameserver\model\gameobjects\player
and change this in player.java
Code:
package com.aionemu.gameserver.model.gameobjects.player;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javolution.util.FastList;
import javolution.util.FastMap;
import com.aionemu.commons.database.dao.DAOManager;
import com.aionemu.gameserver.configs.administration.AdminConfig;
import com.aionemu.gameserver.configs.main.MembershipConfig;
import com.aionemu.gameserver.configs.main.SecurityConfig;
import com.aionemu.gameserver.controllers.FlyController;
import com.aionemu.gameserver.controllers.PlayerController;
import com.aionemu.gameserver.controllers.attack.AggroList;
import com.aionemu.gameserver.controllers.attack.AttackStatus;
import com.aionemu.gameserver.controllers.attack.PlayerAggroList;
import com.aionemu.gameserver.controllers.effect.PlayerEffectController;
import com.aionemu.gameserver.controllers.movement.PlayerMoveController;
import com.aionemu.gameserver.controllers.observer.ActionObserver;
import com.aionemu.gameserver.dao.PlayerVarsDAO;
import com.aionemu.gameserver.dataholders.DataManager;
import com.aionemu.gameserver.model.CreatureType;
import com.aionemu.gameserver.model.Gender;
import com.aionemu.gameserver.model.PlayerClass;
import com.aionemu.gameserver.model.Race;
import com.aionemu.gameserver.model.TribeClass;
import com.aionemu.gameserver.model.account.Account;
import com.aionemu.gameserver.model.actions.PlayerActions;
import com.aionemu.gameserver.model.actions.PlayerMode;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.Kisk;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.PersistentState;
import com.aionemu.gameserver.model.gameobjects.Pet;
import com.aionemu.gameserver.model.gameobjects.Summon;
import com.aionemu.gameserver.model.gameobjects.SummonedObject;
import com.aionemu.gameserver.model.gameobjects.Trap;
import com.aionemu.gameserver.model.gameobjects.player.AbyssRank.AbyssRankUpdateType;
import com.aionemu.gameserver.model.gameobjects.player.FriendList.Status;
import com.aionemu.gameserver.model.gameobjects.player.emotion.EmotionList;
import com.aionemu.gameserver.model.gameobjects.player.motion.MotionList;
import com.aionemu.gameserver.model.gameobjects.player.npcFaction.NpcFactions;
import com.aionemu.gameserver.model.gameobjects.player.title.TitleList;
import com.aionemu.gameserver.model.gameobjects.state.CreatureState;
import com.aionemu.gameserver.model.gameobjects.state.CreatureVisualState;
import com.aionemu.gameserver.model.house.House;
import com.aionemu.gameserver.model.house.HouseRegistry;
import com.aionemu.gameserver.model.house.HouseStatus;
import com.aionemu.gameserver.model.ingameshop.InGameShop;
import com.aionemu.gameserver.model.items.ItemCooldown;
import com.aionemu.gameserver.model.items.storage.IStorage;
import com.aionemu.gameserver.model.items.storage.LegionStorageProxy;
import com.aionemu.gameserver.model.items.storage.Storage;
import com.aionemu.gameserver.model.items.storage.StorageType;
import com.aionemu.gameserver.model.skill.PlayerSkillList;
import com.aionemu.gameserver.model.stats.container.PlayerGameStats;
import com.aionemu.gameserver.model.stats.container.PlayerLifeStats;
import com.aionemu.gameserver.model.team.legion.Legion;
import com.aionemu.gameserver.model.team.legion.LegionMember;
import com.aionemu.gameserver.model.team2.TeamMember;
import com.aionemu.gameserver.model.team2.TemporaryPlayerTeam;
import com.aionemu.gameserver.model.team2.alliance.PlayerAlliance;
import com.aionemu.gameserver.model.team2.alliance.PlayerAllianceGroup;
import com.aionemu.gameserver.model.team2.common.legacy.LootGroupRules;
import com.aionemu.gameserver.model.team2.group.PlayerGroup;
import com.aionemu.gameserver.model.templates.BoundRadius;
import com.aionemu.gameserver.model.templates.flypath.FlyPathEntry;
import com.aionemu.gameserver.model.templates.item.ItemAttackType;
import com.aionemu.gameserver.model.templates.item.ItemTemplate;
import com.aionemu.gameserver.model.templates.item.ItemUseLimits;
import com.aionemu.gameserver.model.templates.ride.RideInfo;
import com.aionemu.gameserver.model.templates.stats.PlayerStatsTemplate;
import com.aionemu.gameserver.model.templates.windstreams.WindstreamPath;
import com.aionemu.gameserver.model.templates.zone.ZoneType;
import com.aionemu.gameserver.network.aion.AionConnection;
import com.aionemu.gameserver.network.aion.serverpackets.SM_STATS_INFO;
import com.aionemu.gameserver.questEngine.model.QuestState;
import com.aionemu.gameserver.questEngine.model.QuestStatus;
import com.aionemu.gameserver.services.HousingService;
import com.aionemu.gameserver.services.global.FFAService;
import com.aionemu.gameserver.services.serialkillers.SerialKiller;
import com.aionemu.gameserver.skillengine.condition.ChainCondition;
import com.aionemu.gameserver.skillengine.effect.AbnormalState;
import com.aionemu.gameserver.skillengine.effect.EffectTemplate;
import com.aionemu.gameserver.skillengine.effect.RebirthEffect;
import com.aionemu.gameserver.skillengine.effect.ResurrectBaseEffect;
import com.aionemu.gameserver.skillengine.model.ChainSkills;
import com.aionemu.gameserver.skillengine.model.Effect;
import com.aionemu.gameserver.skillengine.model.SkillTemplate;
import com.aionemu.gameserver.skillengine.task.CraftingTask;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.rates.Rates;
import com.aionemu.gameserver.utils.rates.RegularRates;
import com.aionemu.gameserver.world.World;
import com.aionemu.gameserver.world.WorldPosition;
import com.aionemu.gameserver.world.zone.ZoneInstance;
/**
* This class is representing Player object, it contains all needed data.
*
* @author -Nemesiss-
* @author SoulKeeper
* @author alexa026
* @author cura
*/
public class Player extends Creature {
public RideInfo ride;
public InRoll inRoll;
public InGameShop inGameShop;
public WindstreamPath windstreamPath;
private PlayerAppearance playerAppearance;
private PlayerAppearance savedPlayerAppearance;
private PlayerCommonData playerCommonData;
private Account playerAccount;
private LegionMember legionMember;
private int specialKills;//External
private boolean isInFFAPVP;
private boolean isInCrazy;
private int rndPoint = 0;
public boolean isInFFAPVP(){
return isInFFAPVP;
}
public void setInFFAPVP(boolean isInFFAPVP) {
this.isInFFAPVP = isInFFAPVP;
}
public void setSpecialKills(int specialKills) {
this.specialKills = specialKills;
}
public int getSpecialKills() {
return specialKills;
}
private MacroList macroList;
private PlayerSkillList skillList;
private FriendList friendList;
private BlockList blockList;
private PetList toyPetList;
private Mailbox mailbox;
private PrivateStore store;
private TitleList titleList;
private QuestStateList questStateList;
private RecipeList recipeList;
private List<House> houses;
and this:
Code:
/**
* Player enemies:<br>
* - different race<br>
* - duel partner<br>
* - in pvp zone
*
* @param enemy
* @return
*/
@Override
public boolean isEnemyFrom(Player player) {
if (player.getWorldId() == FFAService.worldId && FFAService.getInstance().isEnemy(player, getController().getOwner()))
return true;
return player.getObjectId() != getObjectId()
&& (getAdminEnmity() > 1 || player.getAdminEnmity() > 1 || isPvP(player) || getController().isDueling(player) || (isInsideZoneType(ZoneType.PVP) && player.isInsideZoneType(ZoneType.PVP)
&& !isInSameTeam(player) && player.getWorldId() != 30350000 && player.getWorldId() != 30350000));
}
public boolean isAggroIconTo(Player player) {
if (getAdminEnmity() > 1 || player.getAdminEnmity() > 1)
return true;
return !player.getRace().equals(getRace());
}
private boolean isPvP(Player player) {
int worldId = player.getWorldId();
if (!player.getRace().equals(getRace())) {
if (worldId == 30350000 || worldId == 30350000) {
return isInsideZoneType(ZoneType.PVP) && player.isInsideZoneType(ZoneType.PVP);
}
return true;
}
return false;
}
private boolean isInDisablePvPZone() {
List<ZoneInstance> zones = this.getPosition().getMapRegion().getZones(this);
for (ZoneInstance zone : zones) {
if (!zone.isPvpAllowed()) {
return true;
}
goto : trunk\AL-Game\src\com\aionemu\gameserver\services\instance
and change this in instanceService.java
Code:
package com.aionemu.gameserver.services.instance;
import java.util.Iterator;
import javolution.util.FastList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aionemu.gameserver.configs.main.AutoGroupConfig;
import com.aionemu.gameserver.configs.main.CustomConfig;
import com.aionemu.gameserver.configs.main.MembershipConfig;
import com.aionemu.gameserver.dataholders.DataManager;
import com.aionemu.gameserver.instance.InstanceEngine;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.team2.alliance.PlayerAlliance;
import com.aionemu.gameserver.model.team2.group.PlayerGroup;
import com.aionemu.gameserver.model.team2.league.League;
import com.aionemu.gameserver.model.templates.world.WorldMapTemplate;
import com.aionemu.gameserver.network.aion.SystemMessageId;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.services.AutoGroupService;
import com.aionemu.gameserver.services.HousingService;
import com.aionemu.gameserver.services.global.FFAStruct;
import com.aionemu.gameserver.services.teleport.TeleportService2;
import com.aionemu.gameserver.spawnengine.SpawnEngine;
import com.aionemu.gameserver.spawnengine.WalkerFormator;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.World;
import com.aionemu.gameserver.world.WorldMap;
import com.aionemu.gameserver.world.WorldMap2DInstance;
import com.aionemu.gameserver.world.WorldMapInstance;
import com.aionemu.gameserver.world.WorldMapInstanceFactory;
import com.aionemu.gameserver.world.WorldMapType;
import com.aionemu.gameserver.world.zone.ZoneInstance;
and this:
Code:
/**
* @param worldId
* @param ownerId
* - playerObjectId or Legion id in future
* @return
*/
public synchronized static WorldMapInstance getNextAvailableInstance(int worldId, int ownerId) {
WorldMap map = World.getInstance().getWorldMap(worldId);
if (!map.isInstanceType())
throw new UnsupportedOperationException("Invalid call for next available instance of " + worldId);
int nextInstanceId = map.getNextInstanceId();
WorldMapInstance worldMapInstance = WorldMapInstanceFactory.createWorldMapInstance(map, nextInstanceId, ownerId);
if(worldMapInstance.isPersonal()){
log.info("Calling Personal Instance " + worldId + " Owner:" + ownerId);
} else {
log.info("Calling Instance " + worldId + " Owner: " + ownerId);
}
map.addInstance(nextInstanceId, worldMapInstance);
SpawnEngine.spawnInstance(worldId, worldMapInstance.getInstanceId(), 0, ownerId);
InstanceEngine.getInstance().onInstanceCreate(worldMapInstance);
if (map.isInstanceType() && worldId != FFAStruct.worldId) {
startInstanceChecker(worldMapInstance);
}
return worldMapInstance;
}
and this :
Code:
private boolean canDestroySoloInstance() {
return System.currentTimeMillis() > this.soloInstanceDestroyTime;
}
private void updateSoloInstanceDestroyTime() {
this.soloInstanceDestroyTime = System.currentTimeMillis() + SOLO_INSTANCES_DESTROY_DELAY;
}
@Override
public void run() {
int instanceId = worldMapInstance.getInstanceId();
int worldId = worldMapInstance.getMapId();
WorldMap map = World.getInstance().getWorldMap(worldId);
PlayerGroup registeredGroup = worldMapInstance.getRegisteredGroup();
if (registeredGroup == null && worldId != FFAStruct.worldId) {
if (worldMapInstance.playersCount() == 0) {
map.removeWorldMapInstance(instanceId);
InstanceService.destroyInstance(worldMapInstance);
return;
}
Iterator<Player> playerIterator = worldMapInstance.playerIterator();
int mapId = worldMapInstance.getMapId();
while (playerIterator.hasNext()) {
Player player = playerIterator.next();
if ((player.isOnline()) && (player.getWorldId() == mapId)) {
return;
}
}
map.removeWorldMapInstance(instanceId);
InstanceService.destroyInstance(worldMapInstance);
}
else if (registeredGroup.size() == 0) {
map.removeWorldMapInstance(instanceId);
InstanceService.destroyInstance(worldMapInstance);
}
}
}
public static void onLogOut(Player player) {
player.getPosition().getWorldMapInstance().getInstanceHandler().onPlayerLogOut(player);
}
goto trunk\AL-Game\src\com\aionemu\gameserver\configs\main
and change paste this in CustomConfig.java
Code:
@Property(key = "gameserver.reward.service.enable", defaultValue = "false")
public static boolean ENABLE_REWARD_SERVICE;
/**
* FFA System
*/
@Property(key = "gameserver.ffa.enable", defaultValue = "true")
public static boolean FFA_ENABLED;
/**
* PvPGrind System
*/
@Property(key = "gameserver.pvpgrind.update", defaultValue = "0 0 0 ? * *")
public static String PVP_GRIND_UP_RULE;
@Property(key = "gameserver.pvpgrind.enable", defaultValue = "true")
public static boolean PVP_GRIND_ENABLE;
/**
* Limits Config
*/
@Property(key = "gameserver.limits.enable", defaultValue = "true")
public static boolean LIMITS_ENABLED;
complie and build AL-Game and insert it on libs
next we need to create the command
goto Aion Lightning 4.0 - 1-Click by Dwarfpicker v2.5\AIONEmulator\game\config\main
and in custom.properties insert this
# ----------------------------
# FFA System (FreeForAll)
# ----------------------------
# Enable FFA System
# Default: false
gameserver.ffa.enable = true
# ----------------------------
# PvP Grind System
# ----------------------------
# Enable PvP Grind System
# Default: true
gameserver.pvpgrind.enable = true
# PvP Grind Update Rule (After Server Restart)
# Default: 0 0 0 ? * *
gameserver.pvpgrind.update = 0 0 0 ? * *
and last extract the ffa command here: Aion Lightning 4.0 - 1-Click by Dwarfpicker v2.5\AIONEmulator\game\data\scripts\system\handlers\admincommands
change the value in Aion Lightning 4.0 - 1-Click by Dwarfpicker v2.5\AIONEmulator\game\config\administration
commands.properties
add this
fixpath = 3
fsc = 3
ffa = 0
freefly = 3
test it in game use .ffa enter to enter to the instance .ffa info to see how many players is in
and .ffa leave to leave the instance
for me is working everything exept the custom messeges in the instance beacuse is target the l18n/custommassegeid.java
even if i put the language.xml in the AL-Game\data\scripts\system
and into handlers the language folder.....
and also the .ffa leave is not working propetly when you use it, it dosen't teleport you to your previous location..
SO TEST it and let me know if anyone can fix those 2 things FFA will be perfect.