|
@@ -90,6 +90,18 @@ public class L2Party
|
|
private Future<?> _checkTask = null;
|
|
private Future<?> _checkTask = null;
|
|
private Future<?> _positionBroadcastTask = null;
|
|
private Future<?> _positionBroadcastTask = null;
|
|
private PartyMemberPosition _positionPacket;
|
|
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
|
|
* 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())
|
|
for (L2PcInstance member : getPartyMembers())
|
|
{
|
|
{
|
|
if (member != null)
|
|
if (member != null)
|
|
- member.sendPacket(msg);
|
|
|
|
|
|
+ {
|
|
|
|
+ member.sendPacket(packet);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Broadcasts UI update and User Info for new party leader.
|
|
|
|
+ */
|
|
public void broadcastToPartyMembersNewLeader()
|
|
public void broadcastToPartyMembersNewLeader()
|
|
{
|
|
{
|
|
for (L2PcInstance member : getPartyMembers())
|
|
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))
|
|
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);
|
|
getPartyMembers().remove(player);
|
|
recalculatePartyLevel();
|
|
recalculatePartyLevel();
|
|
|
|
|
|
if (player.isFestivalParticipant())
|
|
if (player.isFestivalParticipant())
|
|
|
|
+ {
|
|
SevenSignsFestival.getInstance().updateParticipants(player, this);
|
|
SevenSignsFestival.getInstance().updateParticipants(player, this);
|
|
|
|
+ }
|
|
|
|
|
|
if(player.isInDuel())
|
|
if(player.isInDuel())
|
|
|
|
+ {
|
|
DuelManager.getInstance().onRemoveFromParty(player);
|
|
DuelManager.getInstance().onRemoveFromParty(player);
|
|
|
|
+ }
|
|
|
|
|
|
try
|
|
try
|
|
{
|
|
{
|
|
if (player.getFusionSkill() != null)
|
|
if (player.getFusionSkill() != null)
|
|
|
|
+ {
|
|
player.abortCast();
|
|
player.abortCast();
|
|
|
|
+ }
|
|
|
|
|
|
for (L2Character character : player.getKnownList().getKnownCharacters())
|
|
for (L2Character character : player.getKnownList().getKnownCharacters())
|
|
- if (character.getFusionSkill() != null && character.getFusionSkill().getTarget() == player)
|
|
|
|
|
|
+ {
|
|
|
|
+ if ((character.getFusionSkill() != null) && (character.getFusionSkill().getTarget() == player))
|
|
|
|
+ {
|
|
character.abortCast();
|
|
character.abortCast();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
catch (Exception e)
|
|
{
|
|
{
|
|
@@ -408,44 +442,49 @@ public class L2Party
|
|
}
|
|
}
|
|
|
|
|
|
SystemMessage msg;
|
|
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 = SystemMessage.getSystemMessage(SystemMessageId.C1_LEFT_PARTY);
|
|
msg.addString(player.getName());
|
|
msg.addString(player.getName());
|
|
broadcastToPartyMembers(msg);
|
|
broadcastToPartyMembers(msg);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ //UI update.
|
|
player.sendPacket(new PartySmallWindowDeleteAll());
|
|
player.sendPacket(new PartySmallWindowDeleteAll());
|
|
player.setParty(null);
|
|
player.setParty(null);
|
|
-
|
|
|
|
broadcastToPartyMembers(new PartySmallWindowDelete(player));
|
|
broadcastToPartyMembers(new PartySmallWindowDelete(player));
|
|
- L2Summon summon = player.getPet();
|
|
|
|
|
|
+ final L2Summon summon = player.getPet();
|
|
if (summon != null)
|
|
if (summon != null)
|
|
{
|
|
{
|
|
broadcastToPartyMembers(new ExPartyPetWindowDelete(summon));
|
|
broadcastToPartyMembers(new ExPartyPetWindowDelete(summon));
|
|
}
|
|
}
|
|
|
|
|
|
if (isInDimensionalRift())
|
|
if (isInDimensionalRift())
|
|
|
|
+ {
|
|
_dr.partyMemberExited(player);
|
|
_dr.partyMemberExited(player);
|
|
|
|
+ }
|
|
|
|
|
|
// Close the CCInfoWindow
|
|
// Close the CCInfoWindow
|
|
if (isInCommandChannel())
|
|
if (isInCommandChannel())
|
|
{
|
|
{
|
|
player.sendPacket(new ExCloseMPCC());
|
|
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 = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_BECOME_A_PARTY_LEADER);
|
|
msg.addString(getLeader().getName());
|
|
msg.addString(getLeader().getName());
|
|
broadcastToPartyMembers(msg);
|
|
broadcastToPartyMembers(msg);
|
|
broadcastToPartyMembersNewLeader();
|
|
broadcastToPartyMembersNewLeader();
|
|
}
|
|
}
|
|
-
|
|
|
|
- if (getPartyMembers().size() == 1)
|
|
|
|
|
|
+ else if (getPartyMembers().size() == 1)
|
|
{
|
|
{
|
|
if (isInCommandChannel())
|
|
if (isInCommandChannel())
|
|
{
|
|
{
|
|
@@ -459,12 +498,14 @@ public class L2Party
|
|
getCommandChannel().removeParty(this);
|
|
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)
|
|
if (_checkTask != null)
|
|
{
|
|
{
|
|
@@ -477,7 +518,25 @@ public class L2Party
|
|
_positionBroadcastTask = null;
|
|
_positionBroadcastTask = null;
|
|
}
|
|
}
|
|
_members.clear();
|
|
_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())
|
|
for(L2PcInstance member : getPartyMembers())
|
|
{
|
|
{
|
|
- if (member.getName().equalsIgnoreCase(name)) return member;
|
|
|
|
|
|
+ if (member.getName().equalsIgnoreCase(name))
|
|
|
|
+ return member;
|
|
}
|
|
}
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|