Sync with L2jServer HighFive Nov 14th 2015.
This commit is contained in:
@@ -18,21 +18,21 @@
|
||||
*/
|
||||
package com.l2jserver.gameserver.instancemanager;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import com.l2jserver.gameserver.enums.PrivateStoreType;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.entity.Duel;
|
||||
import com.l2jserver.gameserver.model.skills.Skill;
|
||||
import com.l2jserver.gameserver.model.zone.ZoneId;
|
||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
||||
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
|
||||
import com.l2jserver.util.Rnd;
|
||||
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
||||
|
||||
public final class DuelManager
|
||||
{
|
||||
private static final List<String> ARENAS = Arrays.asList("OlympiadGrassyArena.xml", "OlympiadHerossVestigesArena.xml", "OlympiadOrbisArena.xml", "OlympiadThreeBridgesArena.xml");
|
||||
private final Map<Integer, Duel> _duels = new ConcurrentHashMap<>();
|
||||
private final AtomicInteger _currentDuelId = new AtomicInteger();
|
||||
|
||||
@@ -46,7 +46,7 @@ public final class DuelManager
|
||||
return _duels.get(duelId);
|
||||
}
|
||||
|
||||
public void addDuel(L2PcInstance playerA, L2PcInstance playerB, int partyDuel)
|
||||
public void addDuel(L2PcInstance playerA, L2PcInstance playerB, boolean partyDuel)
|
||||
{
|
||||
if ((playerA == null) || (playerB == null))
|
||||
{
|
||||
@@ -55,7 +55,7 @@ public final class DuelManager
|
||||
|
||||
// return if a player has PvPFlag
|
||||
String engagedInPvP = "The duel was canceled because a duelist engaged in PvP combat.";
|
||||
if (partyDuel == 1)
|
||||
if (partyDuel)
|
||||
{
|
||||
boolean playerInPvP = false;
|
||||
for (L2PcInstance temp : playerA.getParty().getMembers())
|
||||
@@ -154,23 +154,6 @@ public final class DuelManager
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes player from duel.
|
||||
* @param player - the removed player
|
||||
*/
|
||||
public void onRemoveFromParty(L2PcInstance player)
|
||||
{
|
||||
if ((player == null) || !player.isInDuel())
|
||||
{
|
||||
return;
|
||||
}
|
||||
final Duel duel = getDuel(player.getDuelId());
|
||||
if (duel != null)
|
||||
{
|
||||
duel.onRemoveFromParty(player);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Broadcasts a packet to the team opposing the given player.
|
||||
* @param player
|
||||
@@ -183,43 +166,81 @@ public final class DuelManager
|
||||
return;
|
||||
}
|
||||
final Duel duel = getDuel(player.getDuelId());
|
||||
|
||||
if (duel == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ((duel.getPlayerA() == null) || (duel.getPlayerB() == null))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (duel.getPlayerA() == player)
|
||||
if (duel.getTeamA().contains(player))
|
||||
{
|
||||
duel.broadcastToTeam2(packet);
|
||||
}
|
||||
else if (duel.getPlayerB() == player)
|
||||
else
|
||||
{
|
||||
duel.broadcastToTeam1(packet);
|
||||
}
|
||||
else if (duel.isPartyDuel())
|
||||
{
|
||||
if ((duel.getPlayerA().getParty() != null) && duel.getPlayerA().getParty().getMembers().contains(player))
|
||||
{
|
||||
duel.broadcastToTeam2(packet);
|
||||
}
|
||||
else if ((duel.getPlayerB().getParty() != null) && duel.getPlayerB().getParty().getMembers().contains(player))
|
||||
{
|
||||
duel.broadcastToTeam1(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets new a random Olympiad Stadium instance name.
|
||||
* @return an instance name
|
||||
* Checks if this player might join / start a duel.<br>
|
||||
* @param player
|
||||
* @param target
|
||||
* @param partyDuel
|
||||
* @return true if the player might join/start a duel.
|
||||
*/
|
||||
public String getDuelArena()
|
||||
public static boolean canDuel(L2PcInstance player, L2PcInstance target, boolean partyDuel)
|
||||
{
|
||||
return ARENAS.get(Rnd.get(ARENAS.size()));
|
||||
SystemMessageId reason = null;
|
||||
if (target.isInCombat() || target.isJailed())
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_ENGAGED_IN_BATTLE;
|
||||
}
|
||||
else if (target.isTransformed())
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_POLYMORPHED;
|
||||
}
|
||||
else if (target.isDead() || target.isAlikeDead() || ((target.getCurrentHp() < (target.getMaxHp() / 2)) || (target.getCurrentMp() < (target.getMaxMp() / 2))))
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_S_HP_OR_MP_IS_BELOW_50;
|
||||
}
|
||||
else if (target.isInDuel())
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_ALREADY_ENGAGED_IN_A_DUEL;
|
||||
}
|
||||
else if (target.isInOlympiadMode())
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_PARTICIPATING_IN_THE_OLYMPIAD_OR_THE_CEREMONY_OF_CHAOS;
|
||||
}
|
||||
else if (target.isCursedWeaponEquipped())
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_IN_A_CHAOTIC_OR_PURPLE_STATE;
|
||||
}
|
||||
else if (target.getPrivateStoreType() != PrivateStoreType.NONE)
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_ENGAGED_IN_A_PRIVATE_STORE_OR_MANUFACTURE;
|
||||
}
|
||||
else if (target.isMounted() || target.isInBoat())
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_RIDING_A_BOAT_FENRIR_OR_STRIDER;
|
||||
}
|
||||
else if (target.isFishing())
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_DUEL_BECAUSE_C1_IS_CURRENTLY_FISHING;
|
||||
}
|
||||
else if ((!partyDuel && target.isInsideZone(ZoneId.PEACE)) || target.isInsideZone(ZoneId.PVP) || target.isInsideZone(ZoneId.SIEGE))
|
||||
{
|
||||
reason = SystemMessageId.C1_CANNOT_MAKE_A_CHALLENGE_TO_A_DUEL_BECAUSE_C1_IS_CURRENTLY_IN_A_DUEL_PROHIBITED_AREA_PEACEFUL_ZONE_BATTLE_ZONE_NEAR_WATER_RESTART_PROHIBITED_AREA;
|
||||
}
|
||||
|
||||
if (reason != null)
|
||||
{
|
||||
SystemMessage msg = SystemMessage.getSystemMessage(reason);
|
||||
msg.addString(target.getName());
|
||||
player.sendPacket(msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static final DuelManager getInstance()
|
||||
|
Reference in New Issue
Block a user