diff --git a/trunk/dist/game/config/Custom.properties b/trunk/dist/game/config/Custom.properties index 29c92ef198..36ca61f6f3 100644 --- a/trunk/dist/game/config/Custom.properties +++ b/trunk/dist/game/config/Custom.properties @@ -599,3 +599,48 @@ CommunityTeleportPrice = 0 # Price for Buffs # Default: 0 (free) CommunityBuffPrice = 0 + + +# --------------------------------------------------------------------------- +# Faction System (Good vs Evil) +# --------------------------------------------------------------------------- + +# Enable faction system +# Default: False +EnableFactionSystem = False + +# Starting location for all players +# Default: 85332,16199,-1252 +StartingLocation = 85332,16199,-1252 + +# Faction manager npc id +# Default: 109 +FactionManagerNpcId = 109 + +# Spawn location for faction manager npc +# Default: 140221,-124559,-1904,25821 +ManagerSpawnLocation = 85712,15974,-1260,26808 + +# Good base location +# Default: 45306,48878,-3058 +GoodBaseLocation = 45306,48878,-3058 + +# Evil base location +# Default: -44037,-113283,-237 +EvilBaseLocation = -44037,-113283,-237 + +# Good team name +# Default: Good +GoodTeamName = Good + +# Evil team name +# Default: Evil +EvilTeamName = Evil + +# Good name color +# Default: 00FF00 +GoodNameColor = 00FF00 + +# Evil name color +# Default: 0000FF +EvilNameColor = 0000FF diff --git a/trunk/dist/game/data/scripts.cfg b/trunk/dist/game/data/scripts.cfg index 9771b2b2f7..668e478520 100644 --- a/trunk/dist/game/data/scripts.cfg +++ b/trunk/dist/game/data/scripts.cfg @@ -221,6 +221,7 @@ custom/NewbieCoupons/NewbieCoupons.java custom/RaidbossInfo/RaidbossInfo.java custom/NpcLocationInfo/NpcLocationInfo.java custom/Validators/SubClassSkills.java +custom/FactionManager/FactionManager.java # Custom Events custom/events/Elpies/Elpies.java diff --git a/trunk/dist/game/data/scripts/custom/FactionManager/FactionManager.java b/trunk/dist/game/data/scripts/custom/FactionManager/FactionManager.java new file mode 100644 index 0000000000..89626eb5c4 --- /dev/null +++ b/trunk/dist/game/data/scripts/custom/FactionManager/FactionManager.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package custom.FactionManager; + +import ai.npc.AbstractNpcAI; + +import com.l2jserver.Config; +import com.l2jserver.gameserver.model.L2World; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.clientpackets.Say2; +import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; + +/** + * @author Mobius + */ +public class FactionManager extends AbstractNpcAI +{ + // NPC + private static final int MANAGER = Config.FACTION_MANAGER_NPCID; + // Other + private static final String[] TEXTS = + { + Config.FACTION_GOOD_TEAM_NAME + " or " + Config.FACTION_EVIL_TEAM_NAME + "?", + "Select your faction!", + "The choice is yours!" + }; + + private FactionManager() + { + super(FactionManager.class.getSimpleName(), "custom"); + addSpawnId(MANAGER); + addStartNpc(MANAGER); + addTalkId(MANAGER); + addFirstTalkId(MANAGER); + + if (Config.FACTION_SYSTEM_ENABLED) + { + addSpawn(MANAGER, Config.FACTION_MANAGER_LOCATION, false, 0); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + switch (event) + { + case "selectGoodFaction": + { + player.setGood(); + player.getAppearance().setNameColor(Config.FACTION_GOOD_NAME_COLOR); + player.getAppearance().setTitleColor(Config.FACTION_GOOD_NAME_COLOR); + player.setTitle(Config.FACTION_GOOD_TEAM_NAME); + player.sendMessage("You are now fighting for the " + Config.FACTION_GOOD_TEAM_NAME + " faction."); + player.teleToLocation(Config.FACTION_GOOD_BASE_LOCATION); + broadcastMessageToFaction(Config.FACTION_GOOD_TEAM_NAME, Config.FACTION_GOOD_TEAM_NAME + " faction grows stronger with the arrival of " + player.getName() + "."); + L2World.addFactionPlayerToWorld(player); + break; + } + case "selectEvilFaction": + { + player.setEvil(); + player.getAppearance().setNameColor(Config.FACTION_EVIL_NAME_COLOR); + player.getAppearance().setTitleColor(Config.FACTION_EVIL_NAME_COLOR); + player.setTitle(Config.FACTION_EVIL_TEAM_NAME); + player.sendMessage("You are now fighting for the " + Config.FACTION_EVIL_TEAM_NAME + " faction."); + player.teleToLocation(Config.FACTION_EVIL_BASE_LOCATION); + broadcastMessageToFaction(Config.FACTION_EVIL_TEAM_NAME, Config.FACTION_EVIL_TEAM_NAME + " faction grows stronger with the arrival of " + player.getName() + "."); + L2World.addFactionPlayerToWorld(player); + break; + } + case "SPEAK": + { + if (npc != null) + { + broadcastNpcSay(npc, Say2.NPC_ALL, TEXTS[getRandom(TEXTS.length)]); + } + break; + } + } + return super.onAdvEvent(event, npc, player); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) + { + String htmltext = null; + final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId()); + packet.setHtml(getHtm(player.getHtmlPrefix(), "manager.html")); + packet.replace("%name%", player.getName()); + packet.replace("%good%", Config.FACTION_GOOD_TEAM_NAME); + packet.replace("%evil%", Config.FACTION_EVIL_TEAM_NAME); + player.sendPacket(packet); + return htmltext; + } + + @Override + public String onSpawn(L2Npc npc) + { + startQuestTimer("SPEAK", 10000, npc, null, true); + return super.onSpawn(npc); + } + + private void broadcastMessageToFaction(String factionName, String message) + { + if (factionName == Config.FACTION_GOOD_TEAM_NAME) + { + for (L2PcInstance player : L2World.getInstance().getAllGoodPlayers()) + { + player.sendMessage(message); + } + } + else + { + for (L2PcInstance player : L2World.getInstance().getAllEvilPlayers()) + { + player.sendMessage(message); + } + } + } + + public static void main(String[] args) + { + new FactionManager(); + } +} diff --git a/trunk/dist/game/data/scripts/custom/FactionManager/manager.html b/trunk/dist/game/data/scripts/custom/FactionManager/manager.html new file mode 100644 index 0000000000..6792590b0b --- /dev/null +++ b/trunk/dist/game/data/scripts/custom/FactionManager/manager.html @@ -0,0 +1,6 @@ +Faction Manager:
+What will your destiny be %name%? +Will you choose to be %good%? ...or maybe %evil%?
+ + + \ No newline at end of file diff --git a/trunk/dist/tools/sql/server/characters.sql b/trunk/dist/tools/sql/server/characters.sql index 0e38bb3966..6a074ff829 100644 --- a/trunk/dist/tools/sql/server/characters.sql +++ b/trunk/dist/tools/sql/server/characters.sql @@ -60,4 +60,7 @@ CREATE TABLE IF NOT EXISTS `characters` ( KEY `char_name` (`char_name`), KEY `clanid` (`clanid`), KEY `online` (`online`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Faction System +ALTER TABLE `characters` ADD `faction` TINYINT UNSIGNED NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/trunk/java/com/l2jserver/Config.java b/trunk/java/com/l2jserver/Config.java index 74a6110243..5a11734cc7 100644 --- a/trunk/java/com/l2jserver/Config.java +++ b/trunk/java/com/l2jserver/Config.java @@ -61,6 +61,7 @@ import org.w3c.dom.Node; import com.l2jserver.gameserver.engines.DocumentParser; import com.l2jserver.gameserver.enums.IllegalActionPunishmentType; import com.l2jserver.gameserver.model.L2World; +import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.holders.ItemHolder; import com.l2jserver.gameserver.model.itemcontainer.Inventory; import com.l2jserver.gameserver.util.FloodProtectorConfig; @@ -817,6 +818,16 @@ public final class Config public static int COMMUNITYBOARD_CURRENCY; public static int COMMUNITYBOARD_TELEPORT_PRICE; public static int COMMUNITYBOARD_BUFF_PRICE; + public static boolean FACTION_SYSTEM_ENABLED; + public static Location FACTION_STARTING_LOCATION; + public static int FACTION_MANAGER_NPCID; + public static Location FACTION_MANAGER_LOCATION; + public static Location FACTION_GOOD_BASE_LOCATION; + public static Location FACTION_EVIL_BASE_LOCATION; + public static String FACTION_GOOD_TEAM_NAME; + public static String FACTION_EVIL_TEAM_NAME; + public static int FACTION_GOOD_NAME_COLOR; + public static int FACTION_EVIL_NAME_COLOR; // -------------------------------------------------- // NPC Settings @@ -2608,6 +2619,22 @@ public final class Config COMMUNITYBOARD_TELEPORT_PRICE = CustomSettings.getInt("CommunityTeleportPrice", 0); COMMUNITYBOARD_BUFF_PRICE = CustomSettings.getInt("CommunityBuffPrice", 0); + String[] tempString; + FACTION_SYSTEM_ENABLED = Boolean.valueOf(CustomSettings.getBoolean("EnableFactionSystem", false)); + tempString = CustomSettings.getString("StartingLocation", "85332,16199,-1252").split(","); + FACTION_STARTING_LOCATION = new Location(Integer.parseInt(tempString[0]), Integer.parseInt(tempString[1]), Integer.parseInt(tempString[2])); + FACTION_MANAGER_NPCID = CustomSettings.getInt("FactionManagerNpcId", 109); + tempString = CustomSettings.getString("ManagerSpawnLocation", "85712,15974,-1260,26808").split(","); + FACTION_MANAGER_LOCATION = new Location(Integer.parseInt(tempString[0]), Integer.parseInt(tempString[1]), Integer.parseInt(tempString[2]), tempString[3] != null ? Integer.parseInt(tempString[3]) : 0); + tempString = CustomSettings.getString("GoodBaseLocation", "45306,48878,-3058").split(","); + FACTION_GOOD_BASE_LOCATION = new Location(Integer.parseInt(tempString[0]), Integer.parseInt(tempString[1]), Integer.parseInt(tempString[2])); + tempString = CustomSettings.getString("EvilBaseLocation", "-44037,-113283,-237").split(","); + FACTION_EVIL_BASE_LOCATION = new Location(Integer.parseInt(tempString[0]), Integer.parseInt(tempString[1]), Integer.parseInt(tempString[2])); + FACTION_GOOD_TEAM_NAME = CustomSettings.getString("GoodTeamName", "Good"); + FACTION_EVIL_TEAM_NAME = CustomSettings.getString("EvilTeamName", "Evil"); + FACTION_GOOD_NAME_COLOR = Integer.decode("0x" + CustomSettings.getString("GoodNameColor", "00FF00")); + FACTION_EVIL_NAME_COLOR = Integer.decode("0x" + CustomSettings.getString("EvilNameColor", "0000FF")); + // Load PvP L2Properties file (if exists) final PropertiesParser PVPSettings = new PropertiesParser(PVP_CONFIG_FILE); diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Clan.java b/trunk/java/com/l2jserver/gameserver/model/L2Clan.java index dcd8ee4183..2d9f7934f0 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Clan.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Clan.java @@ -2258,6 +2258,11 @@ public class L2Clan implements IIdentifiable, INamable activeChar.sendPacket(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET); return false; } + if (Config.FACTION_SYSTEM_ENABLED && ((activeChar.isGood() && target.isEvil()) || (activeChar.isEvil() && target.isGood()))) + { + activeChar.sendPacket(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET); + return false; + } if (activeChar.getObjectId() == target.getObjectId()) { activeChar.sendPacket(SystemMessageId.YOU_CANNOT_ASK_YOURSELF_TO_APPLY_TO_A_CLAN); @@ -2337,6 +2342,11 @@ public class L2Clan implements IIdentifiable, INamable activeChar.sendPacket(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET); return false; } + if (Config.FACTION_SYSTEM_ENABLED && ((activeChar.isGood() && target.isEvil()) || (activeChar.isEvil() && target.isGood()))) + { + activeChar.sendPacket(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET); + return false; + } if (activeChar.getObjectId() == target.getObjectId()) { activeChar.sendPacket(SystemMessageId.YOU_CANNOT_ASK_YOURSELF_TO_APPLY_TO_A_CLAN); diff --git a/trunk/java/com/l2jserver/gameserver/model/L2World.java b/trunk/java/com/l2jserver/gameserver/model/L2World.java index 719811925e..ea0877fb4b 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2World.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2World.java @@ -72,6 +72,10 @@ public final class L2World /** Map containing all the players in game. */ private final Map _allPlayers = new ConcurrentHashMap<>(); + /** Map containing all the Good players in game. */ + private final static Map _allGoodPlayers = new ConcurrentHashMap<>(); + /** Map containing all the Evil players in game. */ + private final static Map _allEvilPlayers = new ConcurrentHashMap<>(); /** Map containing all visible objects. */ private final Map _allObjects = new ConcurrentHashMap<>(); /** Map used for debug. */ @@ -165,6 +169,16 @@ public final class L2World return _allPlayers.values(); } + public Collection getAllGoodPlayers() + { + return _allGoodPlayers.values(); + } + + public Collection getAllEvilPlayers() + { + return _allEvilPlayers.values(); + } + /** * Gets all players sorted by the given comparator. * @param comparator the comparator @@ -186,6 +200,16 @@ public final class L2World return _allPlayers.size(); } + public int getAllgoodPlayersCount() + { + return _allGoodPlayers.size(); + } + + public int getAllevilPlayersCount() + { + return _allEvilPlayers.size(); + } + /** * If you have access to player objectId use {@link #getPlayer(int playerObjId)} * @param name Name of the player to get Instance @@ -315,6 +339,23 @@ public final class L2World public void addPlayerToWorld(L2PcInstance player) { _allPlayers.put(player.getObjectId(), player); + + if (Config.FACTION_SYSTEM_ENABLED) + { + addFactionPlayerToWorld(player); + } + } + + public static void addFactionPlayerToWorld(L2PcInstance player) + { + if (player.isGood()) + { + _allGoodPlayers.put(player.getObjectId(), player); + } + else if (player.isEvil()) + { + _allEvilPlayers.put(player.getObjectId(), player); + } } /** @@ -324,6 +365,18 @@ public final class L2World public void removeFromAllPlayers(L2PcInstance player) { _allPlayers.remove(player.getObjectId()); + + if (Config.FACTION_SYSTEM_ENABLED) + { + if (player.isGood()) + { + _allGoodPlayers.remove(player.getObjectId()); + } + else if (player.isEvil()) + { + _allEvilPlayers.remove(player.getObjectId()); + } + } } /** diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java b/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java index 24688e9e80..a1c860b41f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java @@ -980,14 +980,17 @@ public abstract class L2Summon extends L2Playable */ public void doAttack() { - if (getOwner() != null) + final L2PcInstance owner = getOwner(); + final L2Object target = getOwner().getTarget(); + + if ((owner != null) && (target != null)) { - final L2Object target = getOwner().getTarget(); - if (target != null) + if (Config.FACTION_SYSTEM_ENABLED && target.isPlayer() && ((owner.isGood() && target.getActingPlayer().isGood()) || (owner.isEvil() && target.getActingPlayer().isEvil()))) { - setTarget(target); - getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); + return; } + setTarget(target); + getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java index 2eedb52bbd..aac108ae32 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java @@ -360,7 +360,7 @@ public final class L2PcInstance extends L2Playable // Character Character SQL String Definitions: private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,charId,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,fame,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,title_color,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,newbie,nobless,power_grade,createDate) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; - private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,fame=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=? WHERE charId=?"; + private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,fame=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=?,faction=? WHERE charId=?"; private static final String RESTORE_CHARACTER = "SELECT * FROM characters WHERE charId=?"; // Character Teleport Bookmark: @@ -421,6 +421,11 @@ public final class L2PcInstance extends L2Playable @Override public void doAttack(L2Character target) { + if (Config.FACTION_SYSTEM_ENABLED && target.isPlayer() && ((isGood() && target.getActingPlayer().isGood()) || (isEvil() && target.getActingPlayer().isEvil()))) + { + return; + } + super.doAttack(target); // cancel the recent fake-death protection instantly if the player attacks or casts spells @@ -595,6 +600,10 @@ public final class L2PcInstance extends L2Playable private boolean _noble = false; private boolean _hero = false; + /** Faction System */ + private boolean _isGood = false; + private boolean _isEvil = false; + /** The L2FolkInstance corresponding to the last Folk which one the player talked. */ private L2Npc _lastFolkNpc = null; @@ -5534,6 +5543,17 @@ public final class L2PcInstance extends L2Playable } else { + if (Config.FACTION_SYSTEM_ENABLED && ((isGood() && targetPlayer.isEvil()) || (isEvil() && targetPlayer.isGood()))) + { + increasePvpKills(target); + return; + } + + if (Config.FACTION_SYSTEM_ENABLED && ((isGood() && targetPlayer.isGood()) || (isEvil() && targetPlayer.isEvil()))) + { + increasePkKillsAndKarma(target); + } + // Target player doesn't have pvp flag set // check about wars if ((targetPlayer.getClan() != null) && (getClan() != null) && getClan().isAtWarWith(targetPlayer.getClanId()) && targetPlayer.getClan().isAtWarWith(getClanId()) && (targetPlayer.getPledgeType() != L2Clan.SUBUNIT_ACADEMY) && (getPledgeType() != L2Clan.SUBUNIT_ACADEMY)) @@ -5593,8 +5613,11 @@ public final class L2PcInstance extends L2Playable return; } - // Calculate new karma. (calculate karma before incrase pk count!) - setKarma(getKarma() + Formulas.calculateKarmaGain(getPkKills(), target.isSummon())); + if (!Config.FACTION_SYSTEM_ENABLED) + { + // Calculate new karma. (calculate karma before incrase pk count!) + setKarma(getKarma() + Formulas.calculateKarmaGain(getPkKills(), target.isSummon())); + } // PK Points are increased only if you kill a player. if (target.isPlayer()) @@ -5632,6 +5655,11 @@ public final class L2PcInstance extends L2Playable return; } + if (Config.FACTION_SYSTEM_ENABLED && target.isPlayer() && ((isGood() && player_target.isEvil()) || (isEvil() && player_target.isGood()))) + { + return; + } + if ((isInDuel() && (player_target.getDuelId() == getDuelId()))) { return; @@ -6908,6 +6936,19 @@ public final class L2PcInstance extends L2Playable player.setNewbie(rset.getInt("newbie")); player.setNoble(rset.getInt("nobless") == 1); + if (Config.FACTION_SYSTEM_ENABLED) + { + final int factionId = rset.getInt("faction"); + if (factionId == 1) + { + player.setGood(); + } + if (factionId == 2) + { + player.setEvil(); + } + } + player.setClanJoinExpiryTime(rset.getLong("clan_join_expiry_time")); if (player.getClanJoinExpiryTime() < System.currentTimeMillis()) { @@ -7477,7 +7518,19 @@ public final class L2PcInstance extends L2Playable statement.setInt(47, getBookMarkSlot()); statement.setInt(48, 0); // unset statement.setString(49, getLang()); - statement.setInt(50, getObjectId()); + + int factionId = 0; + if (isGood()) + { + factionId = 1; + } + if (isEvil()) + { + factionId = 2; + } + statement.setInt(50, factionId); + + statement.setInt(51, getObjectId()); statement.execute(); } @@ -8434,6 +8487,11 @@ public final class L2PcInstance extends L2Playable { return true; } + + if (Config.FACTION_SYSTEM_ENABLED && ((isGood() && attackerPlayer.isEvil()) || (isEvil() && attackerPlayer.isGood()))) + { + return true; + } } else if (attacker instanceof L2DefenderInstance) { @@ -8657,6 +8715,18 @@ public final class L2PcInstance extends L2Playable return false; } + if ((Config.FACTION_SYSTEM_ENABLED && target.isPlayer() && skill.isBad()) && ((isGood() && target.getActingPlayer().isGood()) || (isEvil() && target.getActingPlayer().isEvil()))) + { + sendPacket(ActionFailed.STATIC_PACKET); + return false; + } + + if ((Config.FACTION_SYSTEM_ENABLED && target.isPlayer() && !skill.isBad()) && ((isGood() && target.getActingPlayer().isEvil()) || (isEvil() && target.getActingPlayer().isGood()))) + { + sendPacket(ActionFailed.STATIC_PACKET); + return false; + } + // skills can be used on Walls and Doors only during siege if (target.isDoor()) { @@ -14347,6 +14417,26 @@ public final class L2PcInstance extends L2Playable _jumpTrackId = jumpTrackId; } + public boolean isGood() + { + return _isGood; + } + + public boolean isEvil() + { + return _isEvil; + } + + public void setGood() + { + _isGood = true; + } + + public void setEvil() + { + _isEvil = true; + } + /** * @param target the target * @return {@code true} if this player got war with the target, {@code false} otherwise. diff --git a/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java b/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java index 34ab107a9c..69bc3a2acb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java +++ b/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java @@ -1219,6 +1219,11 @@ public final class Skill implements IIdentifiable return false; } } + + if (Config.FACTION_SYSTEM_ENABLED && target.isPlayer() && ((player.isGood() && targetPlayer.isGood()) || (player.isEvil() && targetPlayer.isEvil()))) + { + return false; + } } } else diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerJoinPartyRoom.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerJoinPartyRoom.java index 5241c1ae4d..04a12bed79 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerJoinPartyRoom.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerJoinPartyRoom.java @@ -18,6 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; +import com.l2jserver.Config; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.PartyMatchRoom; import com.l2jserver.gameserver.model.PartyMatchRoomList; @@ -69,6 +70,13 @@ public final class AnswerJoinPartyRoom extends L2GameClientPacket return; } + if (Config.FACTION_SYSTEM_ENABLED && ((player.isEvil() && partner.isGood()) || (player.isGood() && partner.isEvil()))) + { + player.sendMessage("You cannot party with different team members."); + player.setActiveRequester(null); + return; + } + // If answer is positive, join the requester's PartyRoom. if ((_answer == 1) && !partner.isRequestExpired()) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerTradeRequest.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerTradeRequest.java index c19127c87d..6d2bc1233a 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerTradeRequest.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/AnswerTradeRequest.java @@ -18,6 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; +import com.l2jserver.Config; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; @@ -75,6 +76,14 @@ public final class AnswerTradeRequest extends L2GameClientPacket return; } + if (Config.FACTION_SYSTEM_ENABLED && ((player.isEvil() && partner.isGood()) || (player.isGood() && partner.isEvil()))) + { + player.sendPacket(new TradeDone(0)); + player.sendMessage("You cannot trade with different team members."); + player.setActiveRequester(null); + return; + } + if ((_response == 1) && !partner.isRequestExpired()) { player.startTrade(partner); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java index 35aba69238..c0366c8204 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java @@ -295,6 +295,10 @@ public final class CharacterCreate extends L2GameClientPacket Location createLoc = new Location(Config.CUSTOM_STARTING_LOC_X, Config.CUSTOM_STARTING_LOC_Y, Config.CUSTOM_STARTING_LOC_Z); newChar.setXYZInvisible(createLoc.getX(), createLoc.getY(), createLoc.getZ()); } + else if (Config.FACTION_SYSTEM_ENABLED) + { + newChar.setXYZInvisible(Config.FACTION_STARTING_LOCATION.getX(), Config.FACTION_STARTING_LOCATION.getY(), Config.FACTION_STARTING_LOCATION.getZ()); + } else { Location createLoc = template.getCreationPoint(); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java index 895b5371a6..1bf7bea97d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java @@ -388,6 +388,25 @@ public class EnterWorld extends L2GameClientPacket activeChar.sendPacket(new ExUnReadMailCount(activeChar)); } + // Faction System + if (Config.FACTION_SYSTEM_ENABLED) + { + if (activeChar.isGood()) + { + activeChar.getAppearance().setNameColor(Config.FACTION_GOOD_NAME_COLOR); + activeChar.getAppearance().setTitleColor(Config.FACTION_GOOD_NAME_COLOR); + activeChar.sendMessage("Welcome " + activeChar.getName() + ", you are fighting for the " + Config.FACTION_GOOD_TEAM_NAME + " faction."); + activeChar.sendPacket(new ExShowScreenMessage("Welcome " + activeChar.getName() + ", you are fighting for the " + Config.FACTION_GOOD_TEAM_NAME + " faction.", 10000)); + } + else if (activeChar.isEvil()) + { + activeChar.getAppearance().setNameColor(Config.FACTION_EVIL_NAME_COLOR); + activeChar.getAppearance().setTitleColor(Config.FACTION_EVIL_NAME_COLOR); + activeChar.sendMessage("Welcome " + activeChar.getName() + ", you are fighting for the " + Config.FACTION_EVIL_TEAM_NAME + " faction."); + activeChar.sendPacket(new ExShowScreenMessage("Welcome " + activeChar.getName() + ", you are fighting for the " + Config.FACTION_EVIL_TEAM_NAME + " faction.", 10000)); + } + } + Quest.playerEnter(activeChar); // Send Quest List diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDuelStart.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDuelStart.java index ae413dd073..83562d0f80 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDuelStart.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDuelStart.java @@ -82,6 +82,11 @@ public final class RequestDuelStart extends L2GameClientPacket activeChar.sendPacket(msg); return; } + else if (Config.FACTION_SYSTEM_ENABLED && ((activeChar.isEvil() && targetChar.isGood()) || (activeChar.isGood() && targetChar.isEvil()))) + { + activeChar.sendPacket(SystemMessageId.YOU_ARE_UNABLE_TO_REQUEST_A_DUEL_AT_THIS_TIME); + return; + } // Duel is a party duel if (_partyDuel == 1) diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java index 78de82ad17..c924af2438 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestFriendInvite.java @@ -18,6 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; +import com.l2jserver.Config; import com.l2jserver.gameserver.model.BlockList; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -97,6 +98,11 @@ public final class RequestFriendInvite extends L2GameClientPacket activeChar.sendPacket(sm); return; } + if (Config.FACTION_SYSTEM_ENABLED && ((friend.isEvil() && activeChar.isGood()) || (friend.isGood() && activeChar.isEvil()))) + { + activeChar.sendMessage("You cannot have a friend of the opposing faction."); + return; + } // Friend request sent. activeChar.onTransactionRequest(friend); friend.sendPacket(new FriendAddRequest(activeChar.getName())); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java index 53a599880a..5bd6c16616 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java @@ -120,6 +120,15 @@ public final class RequestPrivateStoreBuy extends L2GameClientPacket return; } + if (Config.FACTION_SYSTEM_ENABLED) + { + if ((storePlayer.isEvil() && player.isGood()) || (storePlayer.isGood() && player.isEvil())) + { + player.sendMessage("You cant buy from different faction members."); + return; + } + } + TradeList storeList = storePlayer.getSellList(); if (storeList == null) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java index b0bab33495..331b050be6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java @@ -139,6 +139,15 @@ public final class RequestPrivateStoreSell extends L2GameClientPacket return; } + if (Config.FACTION_SYSTEM_ENABLED) + { + if ((storePlayer.isEvil() && player.isGood()) || (storePlayer.isGood() && player.isEvil())) + { + player.sendMessage("You cant sell on different faction members."); + return; + } + } + // Update offline trade record, if realtime saving is enabled if (Config.OFFLINE_TRADE_ENABLE && Config.STORE_OFFLINE_TRADE_IN_REALTIME && ((storePlayer.getClient() == null) || storePlayer.getClient().isDetached())) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/TradeRequest.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/TradeRequest.java index 4a786d0f4c..d51d4eaa5f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/TradeRequest.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/TradeRequest.java @@ -190,6 +190,12 @@ public final class TradeRequest extends L2GameClientPacket return; } + if (Config.FACTION_SYSTEM_ENABLED && ((player.isEvil() && partner.isGood()) || (player.isGood() && partner.isEvil()))) + { + player.sendMessage("You cannot trade with different team members."); + return; + } + player.onTransactionRequest(partner); partner.sendPacket(new SendTradeRequest(player.getObjectId())); sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_REQUESTED_A_TRADE_WITH_C1); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java index a6d9702d5a..fcfee56c26 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendInvite.java @@ -18,6 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets.friend; +import com.l2jserver.Config; import com.l2jserver.gameserver.model.BlockList; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -100,6 +101,11 @@ public final class RequestFriendInvite extends L2GameClientPacket activeChar.sendPacket(sm); return; } + if (Config.FACTION_SYSTEM_ENABLED && ((friend.isEvil() && activeChar.isGood()) || (friend.isGood() && activeChar.isEvil()))) + { + activeChar.sendMessage("You cannot have a friend of the opposing faction."); + return; + } // Friend request sent. activeChar.onTransactionRequest(friend); friend.sendPacket(new FriendAddRequest(activeChar.getName())); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMenteeAdd.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMenteeAdd.java index 6c0dbc307c..66d2732292 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMenteeAdd.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMenteeAdd.java @@ -18,6 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets.mentoring; +import com.l2jserver.Config; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; @@ -53,6 +54,12 @@ public class RequestMenteeAdd extends L2GameClientPacket return; } + if (Config.FACTION_SYSTEM_ENABLED && ((mentor.isEvil() && mentee.isGood()) || (mentor.isGood() && mentee.isEvil()))) + { + mentor.sendMessage("You cannot mentor a member of the opposing faction."); + return; + } + if (ConfirmMenteeAdd.validate(mentor, mentee)) { mentor.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_OFFERED_TO_BECOME_S1_S_MENTOR).addCharName(mentee));