Просмотр исходного кода

BETA: Retail like Party system messages by Nyaran.
* Minor improves by Plim and me.
* Some JavaDocs by me.

Zoey76 13 лет назад
Родитель
Сommit
a21d11326d

+ 3 - 0
L2J_Server_BETA/java/com/l2jserver/Config.java

@@ -194,6 +194,7 @@ public final class Config
 	public static boolean REMOVE_CASTLE_CIRCLETS;
 	public static int ALT_PARTY_RANGE;
 	public static int ALT_PARTY_RANGE2;
+	public static boolean ALT_LEAVE_PARTY_LEADER;
 	public static long STARTING_ADENA;
 	public static byte STARTING_LEVEL;
 	public static int STARTING_SP;
@@ -1666,6 +1667,7 @@ public final class Config
 					REMOVE_CASTLE_CIRCLETS = Boolean.parseBoolean(Character.getProperty("RemoveCastleCirclets", "true"));
 					ALT_PARTY_RANGE = Integer.parseInt(Character.getProperty("AltPartyRange", "1600"));
 					ALT_PARTY_RANGE2 = Integer.parseInt(Character.getProperty("AltPartyRange2", "1400"));
+					ALT_LEAVE_PARTY_LEADER = Boolean.parseBoolean(Character.getProperty("AltLeavePartyLeader", "False"));
 					STARTING_ADENA = Long.parseLong(Character.getProperty("StartingAdena", "0"));
 					STARTING_LEVEL = Byte.parseByte(Character.getProperty("StartingLevel", "1"));
 					STARTING_SP = Integer.parseInt(Character.getProperty("StartingSP", "0"));
@@ -3227,6 +3229,7 @@ public final class Config
 		else if (pName.equalsIgnoreCase("AlternateClassMaster")) ALTERNATE_CLASS_MASTER = Boolean.parseBoolean(pValue);
 		else if (pName.equalsIgnoreCase("AltPartyRange")) ALT_PARTY_RANGE = Integer.parseInt(pValue);
 		else if (pName.equalsIgnoreCase("AltPartyRange2")) ALT_PARTY_RANGE2 = Integer.parseInt(pValue);
+		else if (pName.equalsIgnoreCase("AltLeavePartyLeader")) ALT_LEAVE_PARTY_LEADER = Boolean.parseBoolean(pValue);
 		
 		else if (pName.equalsIgnoreCase("CraftingEnabled")) IS_CRAFTING_ENABLED = Boolean.parseBoolean(pValue);
 		else if (pName.equalsIgnoreCase("CraftMasterwork")) CRAFT_MASTERWORK = Boolean.parseBoolean(pValue);

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSignsFestival.java

@@ -42,6 +42,7 @@ import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ItemInstance;
 import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.L2Party.messageType;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.SpawnListener;
@@ -1456,7 +1457,7 @@ public class SevenSignsFestival implements SpawnListener
 			if (festivalParty != null && festivalParty.getMemberCount() < Config.ALT_FESTIVAL_MIN_PLAYER)
 			{
 				updateParticipants(player, null); // under minimum count
-				festivalParty.removePartyMember(player);
+				festivalParty.removePartyMember(player, messageType.Expelled);
 			}
 		}
 	}

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/CursedWeapon.java

@@ -27,6 +27,7 @@ import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;
 import com.l2jserver.gameserver.instancemanager.TransformationManager;
+import com.l2jserver.gameserver.model.L2Party.messageType;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -429,7 +430,7 @@ public class CursedWeapon
 		_player.setKarma(9999999);
 		_player.setPkKills(0);
 		if (_player.isInParty())
-			_player.getParty().removePartyMember(_player);
+			_player.getParty().removePartyMember(_player, messageType.Expelled);
 		
 		// Disable All Skills
 		// Do Transform

+ 106 - 46
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Party.java

@@ -90,6 +90,18 @@ public class L2Party
 	private Future<?> _checkTask = null;
 	private Future<?> _positionBroadcastTask = null;
 	private PartyMemberPosition _positionPacket;
+	private boolean _disbanding = false;
+	
+	/**
+	 * The message type send to the party members.
+	 */
+	public enum messageType
+	{
+		Expelled,
+		Left,
+		None,
+		Disconnected
+	}
 	
 	/**
 	 * constructor ensures party has always one member - leader
@@ -216,31 +228,41 @@ public class L2Party
 	}
 	
 	/**
-	 * true if player is party leader
-	 * @param player
-	 * @return
+	 * 
+	 * @param player the player to check.
+	 * @return {code true} if player is party leader.
 	 */
-	public boolean isLeader(L2PcInstance player) { return (getLeader().equals(player)); }
+	public boolean isLeader(L2PcInstance player)
+	{
+		return getLeader().equals(player);
+	}
 	
 	/**
-	 * Returns the Object ID for the party leader to be used as a unique identifier of this party
-	 * @return int
+	 * @return the Object ID for the party leader to be used as a unique identifier of this party-
 	 */
-	public int getPartyLeaderOID() { return getLeader().getObjectId(); }
+	public int getPartyLeaderOID()
+	{
+		return getLeader().getObjectId();
+	}
 	
 	/**
-	 * Broadcasts packet to every party member
-	 * @param msg
+	 * Broadcasts packet to all party member.
+	 * @param packet the packet to be broadcasted.
 	 */
-	public void broadcastToPartyMembers(L2GameServerPacket msg)
+	public void broadcastToPartyMembers(L2GameServerPacket packet)
 	{
 		for (L2PcInstance member : getPartyMembers())
 		{
 			if (member != null)
-				member.sendPacket(msg);
+			{
+				member.sendPacket(packet);
+			}
 		}
 	}
 	
+	/**
+	 * Broadcasts UI update and User Info for new party leader.
+	 */
 	public void broadcastToPartyMembersNewLeader()
 	{
 		for (L2PcInstance member : getPartyMembers())
@@ -358,49 +380,61 @@ public class L2Party
 	}
 	
 	/**
-	 * Remove player from party
-	 * Overloaded method that takes player's name as parameter
-	 * @param name
+	 * Removes a party member using its name.
+	 * @param name player the player to be removed from the party.
+	 * @param type the message type {@link messageType}.
 	 */
-	public void removePartyMember(String name)
+	public synchronized void removePartyMember(String name, messageType type)
 	{
-		L2PcInstance player = getPlayerByName(name);
-		
-		if (player != null)
-			removePartyMember(player);
+		removePartyMember(getPlayerByName(name), type);
 	}
 	
 	/**
-	 * Remove player from party
-	 * @param player
+	 * Removes a party member instance.
+	 * @param player the player to be removed from the party.
+	 * @param type the message type {@link messageType}.
 	 */
-	public void removePartyMember(L2PcInstance player)
-	{
-		removePartyMember(player, true);
-	}
-	
-	public synchronized void removePartyMember(L2PcInstance player, boolean sendMessage)
+	public synchronized void removePartyMember(L2PcInstance player, messageType type)
 	{
 		if (getPartyMembers().contains(player))
 		{
-			boolean isLeader = isLeader(player);
+			final boolean isLeader = isLeader(player);
+			if (!_disbanding)
+			{
+				if ((getPartyMembers().size() == 2) || isLeader && !Config.ALT_LEAVE_PARTY_LEADER && (type != messageType.Disconnected))
+				{
+					disbandParty();
+					return;
+				}
+			}
+			
 			getPartyMembers().remove(player);
 			recalculatePartyLevel();
 			
 			if (player.isFestivalParticipant())
+			{
 				SevenSignsFestival.getInstance().updateParticipants(player, this);
+			}
 			
 			if(player.isInDuel())
+			{
 				DuelManager.getInstance().onRemoveFromParty(player);
+			}
 			
 			try
 			{
 				if (player.getFusionSkill() != null)
+				{
 					player.abortCast();
+				}
 				
 				for (L2Character character : player.getKnownList().getKnownCharacters())
-					if (character.getFusionSkill() != null && character.getFusionSkill().getTarget() == player)
+				{
+					if ((character.getFusionSkill() != null) && (character.getFusionSkill().getTarget() == player))
+					{
 						character.abortCast();
+					}
+				}
 			}
 			catch (Exception e)
 			{
@@ -408,44 +442,49 @@ public class L2Party
 			}
 			
 			SystemMessage msg;
-			
-			if (sendMessage)
+			if (type == messageType.Expelled)
+			{
+				player.sendPacket(SystemMessageId.HAVE_BEEN_EXPELLED_FROM_PARTY);
+				msg = SystemMessage.getSystemMessage(SystemMessageId.C1_WAS_EXPELLED_FROM_PARTY);
+				msg.addString(player.getName());
+				broadcastToPartyMembers(msg);
+			}
+			else if ((type == messageType.Left) || (type == messageType.Disconnected))
 			{
-				msg = SystemMessage.getSystemMessage(SystemMessageId.YOU_LEFT_PARTY);
-				player.sendPacket(msg);
+				player.sendPacket(SystemMessageId.YOU_LEFT_PARTY);
 				msg = SystemMessage.getSystemMessage(SystemMessageId.C1_LEFT_PARTY);
 				msg.addString(player.getName());
 				broadcastToPartyMembers(msg);
 			}
 			
+			//UI update.
 			player.sendPacket(new PartySmallWindowDeleteAll());
 			player.setParty(null);
-			
 			broadcastToPartyMembers(new PartySmallWindowDelete(player));
-			L2Summon summon = player.getPet();
+			final L2Summon summon = player.getPet();
 			if (summon != null)
 			{
 				broadcastToPartyMembers(new ExPartyPetWindowDelete(summon));
 			}
 			
 			if (isInDimensionalRift())
+			{
 				_dr.partyMemberExited(player);
+			}
 			
 			// Close the CCInfoWindow
 			if (isInCommandChannel())
 			{
 				player.sendPacket(new ExCloseMPCC());
 			}
-			
-			if (isLeader && getPartyMembers().size() > 1)
+			if (isLeader && (getPartyMembers().size() > 1) && (Config.ALT_LEAVE_PARTY_LEADER || (type == messageType.Disconnected)))
 			{
 				msg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_BECOME_A_PARTY_LEADER);
 				msg.addString(getLeader().getName());
 				broadcastToPartyMembers(msg);
 				broadcastToPartyMembersNewLeader();
 			}
-			
-			if (getPartyMembers().size() == 1)
+			else if (getPartyMembers().size() == 1)
 			{
 				if (isInCommandChannel())
 				{
@@ -459,12 +498,14 @@ public class L2Party
 						getCommandChannel().removeParty(this);
 					}
 				}
-				L2PcInstance leader = getLeader();
-				if (leader != null)
+				
+				if (getLeader() != null)
 				{
-					leader.setParty(null);
-					if (leader.isInDuel())
-						DuelManager.getInstance().onRemoveFromParty(leader);
+					getLeader().setParty(null);
+					if (getLeader().isInDuel())
+					{
+						DuelManager.getInstance().onRemoveFromParty(getLeader());
+					}
 				}
 				if (_checkTask != null)
 				{
@@ -477,7 +518,25 @@ public class L2Party
 					_positionBroadcastTask = null;
 				}
 				_members.clear();
-				
+			}
+		}
+	}
+	
+	/**
+	 * Disperse a party and sends a message to all its members.
+	 */
+	public void disbandParty()
+	{
+		_disbanding = true;
+		if (_members != null)
+		{
+			broadcastToPartyMembers(SystemMessage.getSystemMessage(SystemMessageId.PARTY_DISPERSED));
+			for (L2PcInstance member : _members)
+			{
+				if (member != null)
+				{
+					removePartyMember(member, messageType.None);
+				}
 			}
 		}
 	}
@@ -543,7 +602,8 @@ public class L2Party
 	{
 		for(L2PcInstance member : getPartyMembers())
 		{
-			if (member.getName().equalsIgnoreCase(name)) return member;
+			if (member.getName().equalsIgnoreCase(name))
+				return member;
 		}
 		return null;
 	}

+ 3 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -109,6 +109,7 @@ import com.l2jserver.gameserver.model.L2ManufactureItem;
 import com.l2jserver.gameserver.model.L2ManufactureList;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.L2Party.messageType;
 import com.l2jserver.gameserver.model.L2PetData;
 import com.l2jserver.gameserver.model.L2PetLevelData;
 import com.l2jserver.gameserver.model.L2PremiumItem;
@@ -6786,7 +6787,7 @@ public final class L2PcInstance extends L2Playable
 	{
 		if (isInParty())
 		{
-			_party.removePartyMember(this);
+			_party.removePartyMember(this, messageType.Disconnected);
 			_party = null;
 		}
 	}
@@ -9944,7 +9945,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		
 		if (getParty() != null)
-			getParty().removePartyMember(this);
+			getParty().removePartyMember(this, messageType.Expelled);
 		
 		_olympiadGameId = id;
 		if (isSitting())

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java

@@ -28,6 +28,7 @@ import com.l2jserver.gameserver.model.L2ItemInstance;
 import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.L2Skill;
 import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.L2Party.messageType;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -240,7 +241,7 @@ public abstract class AbstractOlympiadGame
 			{
 				final L2Party party = player.getParty();
 				if (party != null)
-					party.removePartyMember(player);
+					party.removePartyMember(player, messageType.Expelled);
 			}
 			// Remove Agathion
 			if (player.getAgathionId() > 0)

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAnswerJoinParty.java

@@ -14,6 +14,7 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
+import com.l2jserver.gameserver.model.L2Party.messageType;
 import com.l2jserver.gameserver.model.PartyMatchRoom;
 import com.l2jserver.gameserver.model.PartyMatchRoomList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -109,18 +110,17 @@ public final class RequestAnswerJoinParty extends L2GameClientPacket
 			
 			//activate garbage collection if there are no other members in party (happens when we were creating new one)
 			if (requestor.isInParty() && requestor.getParty().getMemberCount() == 1)
-				requestor.getParty().removePartyMember(requestor, false);
+				requestor.getParty().removePartyMember(requestor, messageType.None);
 		}
 		else // 0
 		{
-			requestor.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PLAYER_DECLINED));
+			//requestor.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PLAYER_DECLINED)); FIXME: Done in client?
 			
 			//activate garbage collection if there are no other members in party (happens when we were creating new one)
 			if (requestor.isInParty() && requestor.getParty().getMemberCount() == 1)
-				requestor.getParty().removePartyMember(requestor, false);
+				requestor.getParty().removePartyMember(requestor, messageType.None);
 		}
 		
-		
 		if (requestor.isInParty())
 			requestor.getParty().setPendingInvitation(false); // if party is null, there is no need of decreasing
 		

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestOustPartyMember.java

@@ -14,6 +14,7 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
+import com.l2jserver.gameserver.model.L2Party.messageType;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 /**
@@ -46,7 +47,7 @@ public final class RequestOustPartyMember extends L2GameClientPacket
 			if (activeChar.getParty().isInDimensionalRift() && !activeChar.getParty().getDimensionalRift().getRevivedAtWaitingRoom().contains(activeChar))
 				activeChar.sendMessage("You can't dismiss party member when you are in Dimensional Rift.");
 			else
-				activeChar.getParty().removePartyMember(_name);
+				activeChar.getParty().removePartyMember(_name, messageType.Expelled);
 		}
 	}
 	

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestWithDrawalParty.java

@@ -15,6 +15,7 @@
 package com.l2jserver.gameserver.network.clientpackets;
 
 import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.L2Party.messageType;
 import com.l2jserver.gameserver.model.PartyMatchRoom;
 import com.l2jserver.gameserver.model.PartyMatchRoomList;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -53,7 +54,7 @@ public final class RequestWithDrawalParty extends L2GameClientPacket
 				player.sendMessage("You can't exit party when you are in Dimensional Rift.");
 			else
 			{
-				party.removePartyMember(player);
+				party.removePartyMember(player, messageType.Left);
 				
 				if(player.isInPartyMatchRoom())
 				{

+ 5 - 0
L2J_Server_BETA/java/config/Character.properties

@@ -575,6 +575,11 @@ AltPartyRange = 1600
 # Default: 1400
 AltPartyRange2 = 1400
 
+# If true, when party leader leaves party, next member in party will be the leader.
+# If false the party be will dispersed.
+# Default: False
+AltLeavePartyLeader = False
+
 
 # ---------------------------------------------------------------------------
 # Random