DuelManager.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package com.l2jserver.gameserver.instancemanager;
  16. import java.util.logging.Logger;
  17. import javolution.util.FastList;
  18. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  19. import com.l2jserver.gameserver.model.effects.L2Effect;
  20. import com.l2jserver.gameserver.model.entity.Duel;
  21. import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
  22. public class DuelManager
  23. {
  24. private static final Logger _log = Logger.getLogger(DuelManager.class.getName());
  25. public static final DuelManager getInstance()
  26. {
  27. return SingletonHolder._instance;
  28. }
  29. // =========================================================
  30. // Data Field
  31. private FastList<Duel> _duels;
  32. private int _currentDuelId = 0x90;
  33. // =========================================================
  34. // Constructor
  35. private DuelManager()
  36. {
  37. _log.info("Initializing DuelManager");
  38. _duels = new FastList<Duel>();
  39. }
  40. // =========================================================
  41. // Method - Private
  42. private int getNextDuelId()
  43. {
  44. // In case someone wants to run the server forever :)
  45. if (++_currentDuelId >= 2147483640)
  46. _currentDuelId = 1;
  47. return _currentDuelId;
  48. }
  49. // =========================================================
  50. // Method - Public
  51. public Duel getDuel(int duelId)
  52. {
  53. for (FastList.Node<Duel> e = _duels.head(), end = _duels.tail(); (e = e.getNext()) != end;)
  54. {
  55. if (e.getValue().getId() == duelId)
  56. return e.getValue();
  57. }
  58. return null;
  59. }
  60. public void addDuel(L2PcInstance playerA, L2PcInstance playerB, int partyDuel)
  61. {
  62. if (playerA == null || playerB == null)
  63. return;
  64. // return if a player has PvPFlag
  65. String engagedInPvP = "The duel was canceled because a duelist engaged in PvP combat.";
  66. if (partyDuel == 1)
  67. {
  68. boolean playerInPvP = false;
  69. for (L2PcInstance temp : playerA.getParty().getPartyMembers())
  70. {
  71. if (temp.getPvpFlag() != 0)
  72. {
  73. playerInPvP = true;
  74. break;
  75. }
  76. }
  77. if (!playerInPvP)
  78. {
  79. for (L2PcInstance temp : playerB.getParty().getPartyMembers())
  80. {
  81. if (temp.getPvpFlag() != 0)
  82. {
  83. playerInPvP = true;
  84. break;
  85. }
  86. }
  87. }
  88. // A player has PvP flag
  89. if (playerInPvP)
  90. {
  91. for (L2PcInstance temp : playerA.getParty().getPartyMembers())
  92. {
  93. temp.sendMessage(engagedInPvP);
  94. }
  95. for (L2PcInstance temp : playerB.getParty().getPartyMembers())
  96. {
  97. temp.sendMessage(engagedInPvP);
  98. }
  99. return;
  100. }
  101. }
  102. else
  103. {
  104. if (playerA.getPvpFlag() != 0 || playerB.getPvpFlag() != 0)
  105. {
  106. playerA.sendMessage(engagedInPvP);
  107. playerB.sendMessage(engagedInPvP);
  108. return;
  109. }
  110. }
  111. Duel duel = new Duel(playerA, playerB, partyDuel, getNextDuelId());
  112. _duels.add(duel);
  113. }
  114. public void removeDuel(Duel duel)
  115. {
  116. _duels.remove(duel);
  117. }
  118. public void doSurrender(L2PcInstance player)
  119. {
  120. if (player == null || !player.isInDuel())
  121. return;
  122. Duel duel = getDuel(player.getDuelId());
  123. duel.doSurrender(player);
  124. }
  125. /**
  126. * Updates player states.
  127. * @param player - the dieing player
  128. */
  129. public void onPlayerDefeat(L2PcInstance player)
  130. {
  131. if (player == null || !player.isInDuel())
  132. return;
  133. Duel duel = getDuel(player.getDuelId());
  134. if (duel != null)
  135. duel.onPlayerDefeat(player);
  136. }
  137. /**
  138. * Registers a buff which will be removed if the duel ends
  139. * @param player
  140. * @param buff
  141. */
  142. public void onBuff(L2PcInstance player, L2Effect buff)
  143. {
  144. if (player == null || !player.isInDuel() || buff == null)
  145. return;
  146. Duel duel = getDuel(player.getDuelId());
  147. if (duel != null)
  148. duel.onBuff(player, buff);
  149. }
  150. /**
  151. * Removes player from duel.
  152. * @param player - the removed player
  153. */
  154. public void onRemoveFromParty(L2PcInstance player)
  155. {
  156. if (player == null || !player.isInDuel())
  157. return;
  158. Duel duel = getDuel(player.getDuelId());
  159. if (duel != null)
  160. duel.onRemoveFromParty(player);
  161. }
  162. /**
  163. * Broadcasts a packet to the team opposing the given player.
  164. * @param player
  165. * @param packet
  166. */
  167. public void broadcastToOppositTeam(L2PcInstance player, L2GameServerPacket packet)
  168. {
  169. if (player == null || !player.isInDuel())
  170. return;
  171. Duel duel = getDuel(player.getDuelId());
  172. if (duel == null)
  173. return;
  174. if (duel.getPlayerA() == null || duel.getPlayerB() == null)
  175. return;
  176. if (duel.getPlayerA() == player)
  177. {
  178. duel.broadcastToTeam2(packet);
  179. }
  180. else if (duel.getPlayerB() == player)
  181. {
  182. duel.broadcastToTeam1(packet);
  183. }
  184. else if (duel.isPartyDuel())
  185. {
  186. if (duel.getPlayerA().getParty() != null && duel.getPlayerA().getParty().getPartyMembers().contains(player))
  187. {
  188. duel.broadcastToTeam2(packet);
  189. }
  190. else if (duel.getPlayerB().getParty() != null && duel.getPlayerB().getParty().getPartyMembers().contains(player))
  191. {
  192. duel.broadcastToTeam1(packet);
  193. }
  194. }
  195. }
  196. @SuppressWarnings("synthetic-access")
  197. private static class SingletonHolder
  198. {
  199. protected static final DuelManager _instance = new DuelManager();
  200. }
  201. }