/* * 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 com.l2jserver.gameserver.instancemanager; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; 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.network.serverpackets.L2GameServerPacket; public final class DuelManager { private final Map _duels = new ConcurrentHashMap<>(); private final AtomicInteger _currentDuelId = new AtomicInteger(); protected DuelManager() { } public Duel getDuel(int duelId) { return _duels.get(duelId); } public void addDuel(L2PcInstance playerA, L2PcInstance playerB, int partyDuel) { if ((playerA == null) || (playerB == null)) { return; } // return if a player has PvPFlag String engagedInPvP = "The duel was canceled because a duelist engaged in PvP combat."; if (partyDuel == 1) { boolean playerInPvP = false; for (L2PcInstance temp : playerA.getParty().getMembers()) { if (temp.getPvpFlag() != 0) { playerInPvP = true; break; } } if (!playerInPvP) { for (L2PcInstance temp : playerB.getParty().getMembers()) { if (temp.getPvpFlag() != 0) { playerInPvP = true; break; } } } // A player has PvP flag if (playerInPvP) { for (L2PcInstance temp : playerA.getParty().getMembers()) { temp.sendMessage(engagedInPvP); } for (L2PcInstance temp : playerB.getParty().getMembers()) { temp.sendMessage(engagedInPvP); } return; } } else { if ((playerA.getPvpFlag() != 0) || (playerB.getPvpFlag() != 0)) { playerA.sendMessage(engagedInPvP); playerB.sendMessage(engagedInPvP); return; } } final int duelId = _currentDuelId.incrementAndGet(); _duels.put(duelId, new Duel(playerA, playerB, partyDuel, duelId)); } public void removeDuel(Duel duel) { _duels.remove(duel.getId()); } public void doSurrender(L2PcInstance player) { if ((player == null) || !player.isInDuel()) { return; } final Duel duel = getDuel(player.getDuelId()); duel.doSurrender(player); } /** * Updates player states. * @param player - the dying player */ public void onPlayerDefeat(L2PcInstance player) { if ((player == null) || !player.isInDuel()) { return; } final Duel duel = getDuel(player.getDuelId()); if (duel != null) { duel.onPlayerDefeat(player); } } /** * Registers a buff which will be removed if the duel ends * @param player * @param buff */ public void onBuff(L2PcInstance player, Skill buff) { if ((player == null) || !player.isInDuel() || (buff == null)) { return; } final Duel duel = getDuel(player.getDuelId()); if (duel != null) { duel.onBuff(player, buff); } } /** * 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 * @param packet */ public void broadcastToOppositTeam(L2PcInstance player, L2GameServerPacket packet) { if ((player == null) || !player.isInDuel()) { return; } final Duel duel = getDuel(player.getDuelId()); if (duel == null) { return; } if ((duel.getPlayerA() == null) || (duel.getPlayerB() == null)) { return; } if (duel.getPlayerA() == player) { duel.broadcastToTeam2(packet); } else if (duel.getPlayerB() == player) { 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); } } } public static final DuelManager getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { protected static final DuelManager _instance = new DuelManager(); } }