Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 74.98 KB | None | 0 0
  1. package l2f.gameserver.model.entity.events.impl;
  2.  
  3. import java.io.Serializable;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.sql.Connection;
  6. import java.sql.PreparedStatement;
  7. import java.util.ArrayList;
  8. import java.util.Collections;
  9. import java.util.Comparator;
  10. import java.util.HashMap;
  11. import java.util.LinkedHashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Map.Entry;
  15. import java.util.StringTokenizer;
  16. import java.util.concurrent.ConcurrentHashMap;
  17. import java.util.concurrent.CopyOnWriteArrayList;
  18. import java.util.concurrent.ScheduledFuture;
  19.  
  20. import javolution.util.FastMap;
  21. import l2f.commons.annotations.Nullable;
  22. import l2f.commons.collections.MultiValueSet;
  23. import l2f.commons.threading.RunnableImpl;
  24. import l2f.commons.util.Rnd;
  25. import l2f.gameserver.Config;
  26. import l2f.gameserver.ThreadPoolManager;
  27. import l2f.gameserver.data.xml.holder.InstantZoneHolder;
  28. import l2f.gameserver.database.DatabaseFactory;
  29. import l2f.gameserver.instancemanager.ReflectionManager;
  30. import l2f.gameserver.listener.actor.player.OnPlayerExitListener;
  31. import l2f.gameserver.listener.zone.OnZoneEnterLeaveListener;
  32. import l2f.gameserver.model.Creature;
  33. import l2f.gameserver.model.Effect;
  34. import l2f.gameserver.model.GameObject;
  35. import l2f.gameserver.model.GameObjectsStorage;
  36. import l2f.gameserver.model.Party;
  37. import l2f.gameserver.model.Playable;
  38. import l2f.gameserver.model.Player;
  39. import l2f.gameserver.model.SimpleSpawner;
  40. import l2f.gameserver.model.Skill;
  41. import l2f.gameserver.model.World;
  42. import l2f.gameserver.model.Zone;
  43. import l2f.gameserver.model.base.InvisibleType;
  44. import l2f.gameserver.model.base.RestartType;
  45. import l2f.gameserver.model.entity.Reflection;
  46. import l2f.gameserver.model.entity.events.GlobalEvent;
  47. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubEventManager;
  48. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubEventManager.CLASSES;
  49. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubGameRoom;
  50. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubLastStatsManager;
  51. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubLastStatsManager.FightClubStatType;
  52. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubMap;
  53. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubPlayer;
  54. import l2f.gameserver.model.entity.events.fightclubmanager.FightClubTeam;
  55. import l2f.gameserver.model.instances.NpcInstance;
  56. import l2f.gameserver.model.instances.PetInstance;
  57. import l2f.gameserver.model.instances.SchemeBufferInstance;
  58. import l2f.gameserver.model.pledge.Clan;
  59. import l2f.gameserver.network.serverpackets.Earthquake;
  60. import l2f.gameserver.network.serverpackets.ExPVPMatchCCRecord;
  61. import l2f.gameserver.network.serverpackets.ExPVPMatchCCRetire;
  62. import l2f.gameserver.network.serverpackets.ExShowScreenMessage;
  63. import l2f.gameserver.network.serverpackets.RelationChanged;
  64. import l2f.gameserver.network.serverpackets.Say2;
  65. import l2f.gameserver.network.serverpackets.TutorialShowQuestionMark;
  66. import l2f.gameserver.network.serverpackets.components.ChatType;
  67. import l2f.gameserver.network.serverpackets.components.SystemMsg;
  68. import l2f.gameserver.skills.AbnormalEffect;
  69. import l2f.gameserver.tables.SkillTable;
  70. import l2f.gameserver.templates.DoorTemplate;
  71. import l2f.gameserver.templates.InstantZone;
  72. import l2f.gameserver.templates.ZoneTemplate;
  73. import l2f.gameserver.utils.BatchStatement;
  74. import l2f.gameserver.utils.Location;
  75. import l2f.gameserver.utils.Util;
  76.  
  77. import org.apache.commons.lang3.reflect.MethodUtils;
  78. import org.napile.primitive.maps.IntObjectMap;
  79. import org.napile.primitive.maps.impl.HashIntObjectMap;
  80.  
  81. public abstract class AbstractFightClub extends GlobalEvent {
  82.     private class ExitListener implements OnPlayerExitListener {
  83.         @Override
  84.         public void onPlayerExit(Player player) {
  85.             loggedOut(player);
  86.         }
  87.     }
  88.  
  89.     private class ZoneListener implements OnZoneEnterLeaveListener {
  90.         @Override
  91.         public void onZoneEnter(Zone zone, Creature actor) {
  92.             if (actor.isPlayer()) {
  93.                 FightClubPlayer fPlayer = getFightClubPlayer(actor);
  94.                 if (fPlayer != null) {
  95.                     actor.sendPacket(new Earthquake(actor.getLoc(), 0, 1));
  96.                     _leftZone.remove(getFightClubPlayer(actor));
  97.                 }
  98.             }
  99.         }
  100.  
  101.         @Override
  102.         public void onZoneLeave(Zone zone, Creature actor) {
  103.             if (actor.isPlayer() && _state != EVENT_STATE.NOT_ACTIVE) {
  104.                 FightClubPlayer fPlayer = getFightClubPlayer(actor);
  105.                 if (fPlayer != null)
  106.                     _leftZone.put(getFightClubPlayer(actor), zone);
  107.             }
  108.         }
  109.     }
  110.  
  111.     public static enum EVENT_STATE {
  112.         NOT_ACTIVE, COUNT_DOWN, PREPARATION, STARTED, OVER
  113.     }
  114.  
  115.     public static final String REGISTERED_PLAYERS = "registered_players";
  116.     public static final String LOGGED_OFF_PLAYERS = "logged_off_players";
  117.     public static final String FIGHTING_PLAYERS = "fighting_players";
  118.  
  119.     public static final int INSTANT_ZONE_ID = 400;
  120.     private static final int CLOSE_LOCATIONS_VALUE = 150;// Used for spawning
  121.                                                             // players
  122.     private static int LAST_OBJECT_ID = 1;// Used for event object id
  123.  
  124.     private static final int BADGES_FOR_MINUTE_OF_AFK = -1;
  125.  
  126.     private static final int TIME_FIRST_TELEPORT = 10;// in seconds
  127.     private static final int TIME_PLAYER_TELEPORTING = 15;// in seconds
  128.     private static final int TIME_PREPARATION_BEFORE_FIRST_ROUND = 30;// in
  129.                                                                         // seconds
  130.     private static final int TIME_PREPARATION_BETWEEN_NEXT_ROUNDS = 30;// in
  131.                                                                         // seconds
  132.                                                                         // -
  133.                                                                         // usable
  134.                                                                         // if
  135.                                                                         // there
  136.                                                                         // are
  137.                                                                         // more
  138.                                                                         // than
  139.                                                                         // 1
  140.                                                                         // round
  141.     private static final int TIME_AFTER_ROUND_END_TO_RETURN_SPAWN = 15;// in
  142.                                                                         // seconds
  143.                                                                         // -
  144.                                                                         // usable
  145.                                                                         // if
  146.                                                                         // there
  147.                                                                         // are
  148.                                                                         // more
  149.                                                                         // than
  150.                                                                         // 1
  151.                                                                         // round
  152.     private static final int TIME_TELEPORT_BACK_TOWN = 30;// in seconds
  153.     private static final int TIME_MAX_SECONDS_OUTSIDE_ZONE = 10;
  154.     private static final int TIME_TO_BE_AFK = 120;
  155.  
  156.     private static final String[] ROUND_NUMBER_IN_STRING = { "", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th",
  157.             "9th", "10th" };
  158.  
  159.     // Properties
  160.     private final int _objId;
  161.     private final String _desc;
  162.     private final String _icon;
  163.     private final int _roundRunTime;// in minutes
  164.     private final boolean _isAutoTimed;
  165.     private final int[][] _autoStartTimes;
  166.     private final boolean _teamed;
  167.     private final boolean _buffer;
  168.     private final int[][] _fighterBuffs;
  169.     private final int[][] _mageBuffs;
  170.     private final boolean _rootBetweenRounds;
  171.     private final CLASSES[] _excludedClasses;
  172.     private final int[] _excludedSkills;
  173.     private final boolean _roundEvent;
  174.     private final int _rounds;
  175.     private final int _respawnTime;// in seconds
  176.     private final boolean _ressAllowed;
  177.     private final boolean _instanced;
  178.     private final boolean _showPersonality;
  179.     // Badges
  180.     private final double _badgesKillPlayer;
  181.     // private final double _badgesKillPet;
  182.     // private final double _badgesDie;
  183.     protected final double _badgeWin;
  184.     private final int topKillerReward;
  185.  
  186.     // Event variables
  187.     protected EVENT_STATE _state = EVENT_STATE.NOT_ACTIVE;
  188.     private ExitListener _exitListener = new ExitListener();
  189.     private ZoneListener _zoneListener = new ZoneListener();
  190.     private FightClubMap _map;
  191.     private Reflection _reflection;
  192.     private final List<FightClubTeam> _teams = new CopyOnWriteArrayList<>();
  193.     private final Map<FightClubPlayer, Zone> _leftZone = new ConcurrentHashMap<>();
  194.     private int _currentRound = 0;
  195.     private boolean _dontLetAnyoneIn = false;
  196.     private FightClubGameRoom _room;
  197.  
  198.     // For duplicating events:
  199.     private MultiValueSet<String> _set;
  200.  
  201.     // Scores
  202.  
  203.     private final Map<Integer, Integer> _rscores = new ConcurrentHashMap<>();
  204.     private final Map<String, Integer> _scores = new ConcurrentHashMap<>();
  205.     private Map<String, Integer> _bestScores = new ConcurrentHashMap<>();
  206.     private boolean _scoredUpdated = true;
  207.  
  208.     // Before event start
  209.     private ScheduledFuture<?> _timer;
  210.  
  211.     public AbstractFightClub(MultiValueSet<String> set) {
  212.         super(set);
  213.         _objId = LAST_OBJECT_ID++;
  214.         _desc = set.getString("desc");
  215.         _icon = set.getString("icon");
  216.         _roundRunTime = set.getInteger("roundRunTime", -1);
  217.         _teamed = set.getBool("teamed");
  218.         _buffer = set.getBool("buffer");
  219.         _fighterBuffs = parseBuffs(set.getString("fighterBuffs", null));
  220.         _mageBuffs = parseBuffs(set.getString("mageBuffs", null));
  221.         _rootBetweenRounds = set.getBool("rootBetweenRounds");
  222.         _excludedClasses = parseExcludedClasses(set.getString("excludedClasses", ""));
  223.         _excludedSkills = parseExcludedSkills(set.getString("excludedSkills", null));
  224.         _isAutoTimed = set.getBool("isAutoTimed", false);
  225.         _autoStartTimes = parseAutoStartTimes(set.getString("autoTimes", ""));
  226.         _roundEvent = set.getBool("roundEvent");
  227.         _rounds = set.getInteger("rounds", -1);
  228.         _respawnTime = set.getInteger("respawnTime");
  229.         _ressAllowed = set.getBool("ressAllowed");
  230.         _instanced = set.getBool("instanced", true);
  231.         _showPersonality = set.getBool("showPersonality", true);
  232.         // Badges
  233.         _badgesKillPlayer = set.getDouble("badgesKillPlayer", 0);
  234.         // _badgesKillPet = set.getDouble("badgesKillPet", 0);
  235.         // _badgesDie = set.getDouble("badgesDie", 0);
  236.         _badgeWin = set.getDouble("badgesWin", 0);
  237.         topKillerReward = set.getInteger("topKillerReward", 0);
  238.  
  239.         _set = set;
  240.     }
  241.  
  242.     /**
  243.      * - Getting map - Saving room - Saving all players from Room as Registered
  244.      * in Event - Starting Teleport Timer
  245.      *
  246.      * @param room
  247.      *            of the event
  248.      */
  249.     public void prepareEvent(FightClubGameRoom room) {
  250.         _map = room.getMap();
  251.         _room = room;
  252.  
  253.         for (Player player : room.getAllPlayers()) {
  254.             addObject(REGISTERED_PLAYERS, new FightClubPlayer(player));
  255.             player.addEvent(this);
  256.         }
  257.  
  258.         startTeleportTimer(room);
  259.     }
  260.  
  261.     @Override
  262.     public void startEvent() {
  263.         super.startEvent();
  264.  
  265.         _state = EVENT_STATE.PREPARATION;
  266.  
  267.         // Getting all zones
  268.         IntObjectMap<DoorTemplate> doors = new HashIntObjectMap<>(0);
  269.         Map<String, ZoneTemplate> zones = new HashMap<>();
  270.         for (Entry<Integer, Map<String, ZoneTemplate>> entry : getMap().getTerritories().entrySet()) {
  271.             for (Entry<String, ZoneTemplate> team : entry.getValue().entrySet()) {
  272.                 zones.put(team.getKey(), team.getValue());
  273.             }
  274.         }
  275.  
  276.         // Creating reflection if needed
  277.         if (isInstanced())
  278.             createReflection(doors, zones);
  279.  
  280.         List<FightClubPlayer> playersToRemove = new ArrayList<>();
  281.         for (FightClubPlayer iFPlayer : getPlayers(REGISTERED_PLAYERS)) {
  282.             stopInvisibility(iFPlayer.getPlayer());
  283.             if (!checkIfRegisteredPlayerMeetCriteria(iFPlayer)) {
  284.                 playersToRemove.add(iFPlayer);
  285.                 continue;
  286.             }
  287.  
  288.             if (isHidePersonality())
  289.                 iFPlayer.getPlayer()
  290.                         .setPolyId(FightClubGameRoom.getPlayerClassGroup(iFPlayer.getPlayer()).getTransformId());
  291.         }
  292.  
  293.         for (FightClubPlayer playerToRemove : playersToRemove)
  294.             unregister(playerToRemove.getPlayer());
  295.  
  296.         if (isTeamed()) {
  297.             spreadIntoTeamsAndPartys();
  298.         }
  299.  
  300.         teleportRegisteredPlayers();
  301.  
  302.         updateEveryScore();
  303.  
  304.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS, REGISTERED_PLAYERS)) {
  305.             iFPlayer.getPlayer().isntAfk();
  306.             iFPlayer.getPlayer().setFightClubGameRoom(null);
  307.             SchemeBufferInstance.showWindow(iFPlayer.getPlayer());
  308.         }
  309.  
  310.         startNewTimer(true, TIME_PLAYER_TELEPORTING * 1000, "startRoundTimer", TIME_PREPARATION_BEFORE_FIRST_ROUND);
  311.  
  312.         ThreadPoolManager.getInstance().schedule(new LeftZoneThread(), 5000L);
  313.     }
  314.  
  315.     public void startRound() {
  316.         _state = EVENT_STATE.STARTED;
  317.  
  318.         _currentRound++;
  319.  
  320.         if (isRoundEvent())
  321.             if (_currentRound == _rounds)
  322.                 sendMessageToFighting(MESSAGE_TYPES.SCREEN_BIG, "Last Round STARTED!", true);
  323.             else
  324.                 sendMessageToFighting(MESSAGE_TYPES.SCREEN_BIG, "Round " + _currentRound + " STARTED!", true);
  325.         else
  326.             sendMessageToFighting(MESSAGE_TYPES.SCREEN_BIG, "Fight!", true);
  327.  
  328.         unrootPlayers();
  329.  
  330.         if (getRoundRuntime() > 0) {
  331.             startNewTimer(true, (int) ((double) getRoundRuntime() / 2 * 60000), "endRoundTimer",
  332.                     (int) ((double) getRoundRuntime() / 2 * 60));
  333.         }
  334.  
  335.         if (_currentRound == 1) {
  336.             ThreadPoolManager.getInstance().schedule(new TimeSpentOnEventThread(), 10 * 1000);
  337.             ThreadPoolManager.getInstance().schedule(new CheckAfkThread(), 1000);
  338.         }
  339.  
  340.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  341.             iFPlayer.getPlayer().updateZones();
  342.             hideScores(iFPlayer.getPlayer());
  343.             iFPlayer.getPlayer().broadcastUserInfo(true);
  344.         }
  345.     }
  346.  
  347.     public void endRound() {
  348.         _state = EVENT_STATE.OVER;
  349.  
  350.         if (!isLastRound())
  351.             sendMessageToFighting(MESSAGE_TYPES.SCREEN_BIG, "Round " + _currentRound + " is over!", false);
  352.         else {
  353.             sendMessageToFighting(MESSAGE_TYPES.SCREEN_BIG, "Event is now Over!", false);
  354.            
  355.         }
  356.  
  357.         ressAndHealPlayers();
  358.  
  359.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  360.             showScores(iFPlayer.getPlayer());
  361.  
  362.         if (!isLastRound()) {
  363.             // Changing team spawn location
  364.             if (isTeamed()) {
  365.                 for (FightClubTeam team : getTeams())
  366.                     team.setSpawnLoc(null);
  367.             }
  368.  
  369.             ThreadPoolManager.getInstance().schedule(() -> {
  370.                 for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  371.                     teleportSinglePlayer(iFPlayer, false, true);
  372.                 }
  373.  
  374.                 startNewTimer(true, 0, "startRoundTimer", TIME_PREPARATION_BETWEEN_NEXT_ROUNDS);
  375.  
  376.             }, TIME_AFTER_ROUND_END_TO_RETURN_SPAWN * 1000);
  377.         } else {
  378.             ThreadPoolManager.getInstance().schedule(() -> stopEvent(), 10 * 1000);
  379.  
  380.             if (isTeamed())
  381.                 announceWinnerTeam(true, null);
  382.             else
  383.                 announceWinnerPlayer(true, null);
  384.         }
  385.  
  386.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  387.             iFPlayer.getPlayer().broadcastUserInfo(true);
  388.     }
  389.  
  390.     @Override
  391.     public void stopEvent() {
  392.         _state = EVENT_STATE.NOT_ACTIVE;
  393.         super.stopEvent();
  394.         reCalcNextTime(false);
  395.         _room = null;
  396.  
  397.         showLastAFkMessage();
  398.         FightClubPlayer[] topKillers = getTopKillers();
  399.         announceTopKillers(topKillers);
  400.         giveRewards(topKillers);
  401.         saveResults();
  402.  
  403.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  404.             iFPlayer.getPlayer().broadcastCharInfo();
  405.             if (iFPlayer.getPlayer().getPet() != null)
  406.                 iFPlayer.getPlayer().getPet().broadcastCharInfo();
  407.         }
  408.         for (Player player : getAllFightingPlayers()) {
  409.             showScores(player);
  410.         }
  411.  
  412.         ThreadPoolManager.getInstance().schedule(() -> {
  413.             for (Player player : getAllFightingPlayers()) {
  414.                 leaveEvent(player, true);
  415.                 player.sendPacket(
  416.                         new ExShowScreenMessage("", 10, ExShowScreenMessage.ScreenMessageAlign.TOP_LEFT, false));
  417.             }
  418.             destroyMe();
  419.         }, 10 * 1000);
  420.     }
  421.  
  422.     public void destroyMe() {
  423.         if (getReflection() != null) {
  424.             for (Zone zone : getReflection().getZones())
  425.                 zone.removeListener(_zoneListener);
  426.             getReflection().collapse();
  427.         }
  428.         if (_timer != null)
  429.             _timer.cancel(false);
  430.         _timer = null;
  431.         _bestScores.clear();
  432.         _scores.clear();
  433.         _rscores.clear();
  434.         _leftZone.clear();
  435.         getObjects().clear();
  436.         _set = null;
  437.         _room = null;
  438.         _zoneListener = null;
  439.         for (Player player : GameObjectsStorage.getAllPlayersForIterate())
  440.             player.removeListener(_exitListener);
  441.         _exitListener = null;
  442.     }
  443.  
  444.     // ===============================================================================================================
  445.     // Unique event related actions
  446.     // ===============================================================================================================
  447.  
  448.     /**
  449.      * Remember that actor may be NULL/player/pet/npc. Victim: player/pet/npc
  450.      *
  451.      * @param actor
  452.      * @param victim
  453.      */
  454.     public void onKilled(Creature actor, Creature victim) {
  455.         if (victim.isPlayer() && getRespawnTime() > 0)
  456.             showScores(victim);
  457.  
  458.         if (actor != null && actor.isPlayer() && getFightClubPlayer(actor) != null)
  459.             FightClubLastStatsManager.getInstance().updateStat(actor.getPlayer(), FightClubStatType.KILL_PLAYER,
  460.                     getFightClubPlayer(actor).getKills(true));
  461.  
  462.         // Respawn type for non teamed events
  463.         if (victim.isPlayer() && getRespawnTime() > 0 && !_ressAllowed
  464.                 && getFightClubPlayer(victim.getPlayer()) != null)
  465.             startNewTimer(false, 0, "ressurectionTimer", getRespawnTime(), getFightClubPlayer(victim));
  466.     }
  467.  
  468.     /**
  469.      * Alexander Support for keeping track of damage done
  470.      *
  471.      * @param actor
  472.      * @param victim
  473.      * @param damage
  474.      */
  475.     public void onDamage(Creature actor, Creature victim, double damage) {
  476.  
  477.     }
  478.  
  479.     public void requestRespawn(Player activeChar, RestartType restartType) {
  480.         if (getRespawnTime() > 0)
  481.             startNewTimer(false, 0, "ressurectionTimer", getRespawnTime(), getFightClubPlayer(activeChar));
  482.     }
  483.  
  484.     @Override
  485.     public boolean canAttack(Creature target, Creature attacker, Skill skill, boolean force) {
  486.         if (_state != EVENT_STATE.STARTED)
  487.             return false;
  488.         Player player = attacker.getPlayer();
  489.         if (player == null)
  490.             return true;
  491.  
  492.         if (isTeamed()) {
  493.             FightClubPlayer targetFPlayer = getFightClubPlayer(target);
  494.             FightClubPlayer attackerFPlayer = getFightClubPlayer(attacker);
  495.  
  496.             if (targetFPlayer == null || attackerFPlayer == null
  497.                     || targetFPlayer.getTeam().equals(attackerFPlayer.getTeam()))
  498.                 return false;
  499.         }
  500.  
  501.         // if (isInvisible(player, player))
  502.         {
  503.             // return false;
  504.         }
  505.  
  506.         return true;
  507.     }
  508.  
  509.     @Override
  510.     public boolean canUseSkill(Creature caster, Creature target, Skill skill) {
  511.         if (_excludedSkills != null) {
  512.             for (int id : _excludedSkills)
  513.                 if (skill.getId() == id) {
  514.                     return false;
  515.                 }
  516.         }
  517.  
  518.         return true;
  519.     }
  520.  
  521.     @Override
  522.     public SystemMsg checkForAttack(Creature target, Creature attacker, Skill skill, boolean force) {
  523.         if (!canAttack(target, attacker, skill, force))
  524.             return SystemMsg.INVALID_TARGET;
  525.         return null;
  526.     }
  527.  
  528.     @Override
  529.     public boolean canRessurect(Player player, Creature creature, boolean force) {
  530.         return _ressAllowed;
  531.     }
  532.  
  533.     /**
  534.      * @param player
  535.      * @return -1 if it have to be unchanged
  536.      */
  537.     public int getMySpeed(Player player) {
  538.         return -1;
  539.     }
  540.  
  541.     /**
  542.      * @param player
  543.      * @return -1 if it have to be unchanged
  544.      */
  545.     public int getPAtkSpd(Player player) {
  546.         return -1;
  547.     }
  548.  
  549.     /**
  550.      * Removing window that appears after death
  551.      */
  552.     @Override
  553.     public void checkRestartLocs(Player player, Map<RestartType, Boolean> r) {
  554.         r.clear();
  555.         if (isTeamed() && getRespawnTime() > 0 && getFightClubPlayer(player) != null && _ressAllowed) {
  556.             r.put(RestartType.TO_FLAG, true);
  557.         }
  558.     }
  559.  
  560.     public boolean canUseBuffer(Player player, boolean heal) {
  561.         FightClubPlayer fPlayer = getFightClubPlayer(player);
  562.         if (!getBuffer())
  563.             return false;
  564.         if (player.isInCombat())
  565.             return false;
  566.         if (heal) {
  567.             if (player.isDead())
  568.                 return false;
  569.             if (_state != EVENT_STATE.STARTED)
  570.                 return true;
  571.             if (fPlayer.isInvisible())
  572.                 return true;
  573.             return false;
  574.         }
  575.         return true;
  576.     }
  577.  
  578.     public boolean canUsePositiveMagic(Creature user, Creature target) {
  579.         Player player = user.getPlayer();
  580.         if (player == null)
  581.             return true;
  582.  
  583.         return isFriend(user, target);
  584.     }
  585.  
  586.     @Override
  587.     public int getRelation(Player thisPlayer, Player target, int oldRelation) {
  588.         if (_state == EVENT_STATE.STARTED)
  589.             return isFriend(thisPlayer, target) ? getFriendRelation() : getWarRelation();
  590.         else
  591.             return oldRelation;
  592.     }
  593.  
  594.     public boolean canJoinParty(Player sender, Player receiver) {
  595.         return isFriend(sender, receiver);
  596.     }
  597.  
  598.     /**
  599.      * Join Clan, Join Ally, Command Channel
  600.      *
  601.      * @param sender
  602.      * @param receiver
  603.      * @return
  604.      */
  605.     public boolean canReceiveInvitations(Player sender, Player receiver) {
  606.         return true;
  607.     }
  608.  
  609.     public boolean canOpenStore(Player player) {
  610.         return false;
  611.     }
  612.  
  613.     public boolean canStandUp(Player player) {
  614.         return true;
  615.     }
  616.  
  617.     public boolean loseBuffsOnDeath(Player player) {
  618.         return false;
  619.     }
  620.  
  621.     protected boolean inScreenShowBeScoreNotKills() {
  622.         return true;
  623.     }
  624.  
  625.     protected boolean inScreenShowBeTeamNotInvidual() {
  626.         return isTeamed();
  627.     }
  628.  
  629.     public boolean isFriend(Creature c1, Creature c2) {
  630.         if (c1.equals(c2))
  631.             return true;
  632.  
  633.         if (!c1.isPlayable() || !c2.isPlayable()) {
  634.             return true;
  635.         }
  636.  
  637.         if (c1.isSummon() && c2.isPlayer() && c2.getPlayer().getPet() != null && c2.getPlayer().getPet().equals(c1)) {
  638.             return true;
  639.         }
  640.  
  641.         if (c2.isSummon() && c1.isPlayer() && c1.getPlayer().getPet() != null && c1.getPlayer().getPet().equals(c2)) {
  642.             return true;
  643.         }
  644.  
  645.         FightClubPlayer fPlayer1 = getFightClubPlayer(c1.getPlayer());
  646.         FightClubPlayer fPlayer2 = getFightClubPlayer(c2.getPlayer());
  647.  
  648.         if (isTeamed()) {
  649.             // Different teams
  650.             if (fPlayer1 == null || fPlayer2 == null || !fPlayer1.getTeam().equals(fPlayer2.getTeam())) {
  651.                 return false;
  652.             }
  653.             // Same team
  654.             else {
  655.                 return true;
  656.             }
  657.         } else {
  658.             return false;
  659.         }
  660.     }
  661.  
  662.     public boolean isInvisible(Player actor, Player watcher) {
  663.         return actor.getInvisibleType() == InvisibleType.NORMAL;
  664.     }
  665.  
  666.     public String getVisibleName(Player player, String currentName, boolean toMe) {
  667.         if (isHidePersonality() && !toMe)
  668.             return "Player";
  669.         return currentName;
  670.     }
  671.  
  672.     public String getVisibleTitle(Player player, String currentTitle, boolean toMe) {
  673.         return currentTitle;
  674.     }
  675.  
  676.     public int getVisibleTitleColor(Player player, int currentTitleColor, boolean toMe) {
  677.         return currentTitleColor;
  678.     }
  679.  
  680.     public int getVisibleNameColor(Player player, int currentNameColor, boolean toMe) {
  681.         if (isTeamed()) {
  682.             FightClubPlayer fPlayer = getFightClubPlayer(player);
  683.             return fPlayer.getTeam().getNickColor();
  684.         }
  685.         return currentNameColor;
  686.     }
  687.  
  688.     /*
  689.      *
  690.      * Badges
  691.      *
  692.      */
  693.     protected int getBadgesEarned(FightClubPlayer fPlayer, int currentValue, boolean topKiller) {
  694.         if (fPlayer == null)
  695.             return 0;
  696.         currentValue += addMultipleBadgeToPlayer(fPlayer.getKills(true), _badgesKillPlayer);
  697.  
  698.         currentValue += getRewardForWinningTeam(fPlayer, true);
  699.  
  700.         int minutesAFK = (int) Math.round((double) fPlayer.getTotalAfkSeconds() / 60);
  701.         currentValue += minutesAFK * BADGES_FOR_MINUTE_OF_AFK;
  702.  
  703.         // double reward
  704.         currentValue = Config.FIGHT_CLUB_REWARD_MULTIPLIER * currentValue;
  705.  
  706.         if (topKiller) {
  707.             currentValue += topKillerReward;
  708.         }
  709.  
  710.         return currentValue;
  711.     }
  712.  
  713.     /**
  714.      * @param score
  715.      * @param badgePerScore
  716.      * @return score*badges
  717.      */
  718.     protected int addMultipleBadgeToPlayer(int score, double badgePerScore) {
  719.         return (int) Math.floor(score * badgePerScore);
  720.     }
  721.  
  722.     private int getEndEventBadges(FightClubPlayer fPlayer) {
  723.         return 0;
  724.     }
  725.  
  726.     // ===============================================================================================================
  727.     // Actions same for all events
  728.     // ===============================================================================================================
  729.  
  730.     public void startTeleportTimer(FightClubGameRoom room) {
  731.         setState(EVENT_STATE.COUNT_DOWN);
  732.  
  733.         startNewTimer(true, 0, "teleportWholeRoomTimer", TIME_FIRST_TELEPORT);
  734.     }
  735.  
  736.     /**
  737.      * teleportSinglePlayer for first time, healing and ressing - all
  738.      * REGISTERED_PLAYERS
  739.      */
  740.     protected void teleportRegisteredPlayers() {
  741.         for (FightClubPlayer player : getPlayers(REGISTERED_PLAYERS)) {
  742.             teleportSinglePlayer(player, true, true);
  743.         }
  744.     }
  745.  
  746.     /**
  747.      * Teleporting player to event random location, rooting if _state is
  748.      * PREPARATION or OVER, cancelling negative effects IF @firstTime - removing
  749.      * from REGISTERED_PLAYERS and adding to FIGHTING_PLAYERS, showing question
  750.      * mark, buffing, sending event menu, sending messages about chat, setting
  751.      * invisibility if needed
  752.      *
  753.      * @param fPlayer
  754.      * @param firstTime
  755.      * @param healAndRess
  756.      */
  757.     protected void teleportSinglePlayer(FightClubPlayer fPlayer, boolean firstTime, boolean healAndRess) {
  758.         Player player = fPlayer.getPlayer();
  759.  
  760.         if (healAndRess) {
  761.             if (player.isDead())
  762.                 player.doRevive(100.);
  763.         }
  764.  
  765.         Location loc = getSinglePlayerSpawnLocation(fPlayer);
  766.  
  767.         if (isInstanced())
  768.             player.teleToLocation(loc, getReflection());
  769.         else
  770.             player.teleToLocation(loc);
  771.  
  772.         if (_state == EVENT_STATE.PREPARATION || _state == EVENT_STATE.OVER)
  773.             rootPlayer(player);
  774.  
  775.         // Cancelling negative effects
  776.         cancelNegativeEffects(player);
  777.         // Unsummon pets
  778.         if (player.getPet() instanceof PetInstance)
  779.             player.getPet().unSummon();
  780.         if (player.getPet() != null)
  781.             cancelNegativeEffects(player.getPet());
  782.  
  783.         if (firstTime) {
  784.             removeObject(REGISTERED_PLAYERS, fPlayer);
  785.             addObject(FIGHTING_PLAYERS, fPlayer);
  786.  
  787.             player.getEffectList().stopAllEffects();
  788.             if (player.getPet() != null)
  789.                 player.getPet().getEffectList().stopAllEffects();
  790.  
  791.             player.store(true);
  792.             player.sendPacket(new TutorialShowQuestionMark(100));
  793.  
  794.             player.sendPacket(new Say2(player.getObjectId(), ChatType.ALL, getName(),
  795.                     "Normal Chat is visible for every player in event."));
  796.             if (isTeamed()) {
  797.                 player.sendPacket(new Say2(player.getObjectId(), ChatType.ALL, getName(),
  798.                         "Battlefield(^) Chat is visible only to your team!"));
  799.                 player.sendPacket(new Say2(player.getObjectId(), ChatType.BATTLEFIELD, getName(),
  800.                         "Battlefield(^) Chat is visible only to your team!"));
  801.             }
  802.         }
  803.  
  804.         if (healAndRess) {
  805.             player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp(), true);
  806.             player.setCurrentCp(player.getMaxCp());
  807.             if (player.getPet() != null && !player.getPet().isDead()) {
  808.                 Playable pet = player.getPet();
  809.                 pet.setCurrentHpMp(pet.getMaxHp(), player.getMaxMp(), false);
  810.                 pet.broadcastCharInfo();
  811.             }
  812.             player.broadcastUserInfo(true);
  813.             player.broadcastStatusUpdate();
  814.             player.broadcastCharInfo();
  815.         }
  816.  
  817.         if (player.isMounted()) {
  818.             player.setMount(0, 0, 0);
  819.         }
  820.  
  821.         if (player.getTransformation() > 0) {
  822.             player.setTransformation(0);
  823.             player.setTransformationTemplate(0);
  824.             player.setTransformationName(null);
  825.         }
  826.     }
  827.  
  828.     protected Location getSinglePlayerSpawnLocation(FightClubPlayer fPlayer) {
  829.         Location[] spawns = null;
  830.         Location loc = null;
  831.  
  832.         if (!isTeamed())
  833.             spawns = getMap().getPlayerSpawns();
  834.         else
  835.             loc = getTeamSpawn(fPlayer, true);
  836.  
  837.         if (!isTeamed())
  838.             loc = getSafeLocation(spawns);
  839.  
  840.         // Make it a bit random
  841.         return Location.findPointToStay(loc, 0, CLOSE_LOCATIONS_VALUE / 2, fPlayer.getPlayer().getGeoIndex());
  842.     }
  843.  
  844.     public void unregister(Player player) {
  845.         FightClubPlayer fPlayer = getFightClubPlayer(player, REGISTERED_PLAYERS);
  846.         player.removeEvent(this);
  847.         removeObject(REGISTERED_PLAYERS, fPlayer);
  848.         player.sendMessage("You are no longer registered!");
  849.     }
  850.  
  851.     public boolean leaveEvent(Player player, boolean teleportTown) {
  852.         FightClubPlayer fPlayer = getFightClubPlayer(player);
  853.  
  854.         if (fPlayer == null)
  855.             return true;
  856.  
  857.         if (_state == EVENT_STATE.NOT_ACTIVE) {
  858.             if (fPlayer.isInvisible())
  859.                 stopInvisibility(player);
  860.             removeObject(FIGHTING_PLAYERS, fPlayer);
  861.             if (isTeamed())
  862.                 fPlayer.getTeam().removePlayer(fPlayer);
  863.             player.removeEvent(this);
  864.  
  865.             if (teleportTown)
  866.                 teleportBackToTown(player);
  867.             else
  868.                 player.doRevive();
  869.         } else // Leaving during event
  870.         {
  871.             rewardPlayer(fPlayer, false);
  872.             if (teleportTown)
  873.                 setInvisible(player, TIME_TELEPORT_BACK_TOWN, false);
  874.             else
  875.                 setInvisible(player, -1, false);
  876.             removeObject(FIGHTING_PLAYERS, fPlayer);
  877.             // Killing player - protection for Last Man standing
  878.             player.doDie(null);// Dont change order. Removing from 1.
  879.                                 // FIGHTING_PLAYERS 2. Do Die 3. Remove Event
  880.             player.removeEvent(this);
  881.  
  882.             if (teleportTown)
  883.                 startNewTimer(false, 0, "teleportBackSinglePlayerTimer", TIME_TELEPORT_BACK_TOWN, player);
  884.             else
  885.                 player.doRevive();
  886.         }
  887.  
  888.         hideScores(player);
  889.         updateScreenScores();
  890.  
  891.         if (getPlayers(FIGHTING_PLAYERS, REGISTERED_PLAYERS).isEmpty())
  892.             destroyMe();
  893.  
  894.         if (player.getParty() != null)
  895.             player.getParty().removePartyMember(player, true);
  896.  
  897.         return true;
  898.     }
  899.  
  900.     public void loggedOut(Player player) {
  901.         leaveEvent(player, true);
  902.     }
  903.  
  904.     protected void teleportBackToTown(Player player) {
  905.         if (player.isDead())
  906.             player.doRevive();
  907.         player.setPolyId(0);
  908.         Location loc = Location.findPointToStay(FightClubEventManager.RETURN_LOC, 0, 100, player.getGeoIndex());
  909.         player.teleToLocation(loc, ReflectionManager.DEFAULT);
  910.     }
  911.  
  912.     protected void rewardPlayer(FightClubPlayer fPlayer, boolean isTopKiller) {
  913.         int badgesToGive = getBadgesEarned(fPlayer, 0, isTopKiller);
  914.  
  915.         if (getState() == EVENT_STATE.NOT_ACTIVE)
  916.             badgesToGive += getEndEventBadges(fPlayer);
  917.  
  918.         badgesToGive = Math.max(0, badgesToGive);
  919.  
  920.         fPlayer.getPlayer().getInventory().addItem(FightClubEventManager.FIGHT_CLUB_BADGE_ID, badgesToGive,
  921.                 getName() + " Event");
  922.         sendMessageToPlayer(fPlayer, MESSAGE_TYPES.SCREEN_BIG, "You have earned " + badgesToGive + " Festival Adena!");
  923.         sendMessageToPlayer(fPlayer, MESSAGE_TYPES.NORMAL_MESSAGE,
  924.                 "You have earned " + badgesToGive + " Festival Adena!");
  925.     }
  926.  
  927.     @Nullable
  928.     private FightClubPlayer[] getTopKillers() {
  929.         if (!_teamed || topKillerReward == 0)
  930.             return null;
  931.  
  932.         FightClubPlayer[] topKillers = new FightClubPlayer[_teams.size()];
  933.         int[] topKillersKills = new int[_teams.size()];
  934.  
  935.         int teamIndex = 0;
  936.         for (FightClubTeam team : _teams) {
  937.             for (FightClubPlayer fPlayer : team.getPlayers()) {
  938.                 if (fPlayer != null) {
  939.                     if (fPlayer.getKills(true) == topKillersKills[teamIndex]) {
  940.                         topKillers[teamIndex] = null;
  941.                     } else if (fPlayer.getKills(true) > topKillersKills[teamIndex]) {
  942.                         topKillers[teamIndex] = fPlayer;
  943.                         topKillersKills[teamIndex] = fPlayer.getKills(true);
  944.                     }
  945.                 }
  946.             }
  947.             teamIndex++;
  948.         }
  949.         return topKillers;
  950.     }
  951.  
  952.     /**
  953.      * Make isTeamed() check before
  954.      *
  955.      * @param wholeEvent
  956.      * @param winnerOfTheRound
  957.      * @wholeEvent - true - We won Last Man Standing! false - We Won Round!
  958.      * @winnerOfTheRound if wholeEvent == false, set it to null
  959.      */
  960.     protected void announceWinnerTeam(boolean wholeEvent, FightClubTeam winnerOfTheRound) {
  961.         int bestScore = -1;
  962.         FightClubTeam bestTeam = null;
  963.         boolean draw = false;
  964.         if (wholeEvent) {
  965.             for (FightClubTeam team : getTeams())
  966.                 if (team.getScore() > bestScore) {
  967.                     draw = false;
  968.                     bestScore = team.getScore();
  969.                     bestTeam = team;
  970.                 } else if (team.getScore() == bestScore) {
  971.                     draw = true;
  972.                 }
  973.         } else
  974.             bestTeam = winnerOfTheRound;
  975.  
  976.         if (!draw) {
  977.             Say2 packet = new Say2(0, ChatType.COMMANDCHANNEL_ALL, bestTeam.getName() + " Team",
  978.                     "Won " + (wholeEvent ? getName() : " Round") + "!");
  979.             for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  980.                 iFPlayer.getPlayer().sendPacket(packet);
  981.         }
  982.  
  983.         updateScreenScores();
  984.     }
  985.  
  986.     /**
  987.      * It is checking all players by their scores. Not for teamed events!
  988.      *
  989.      * @param wholeEvent
  990.      * @param winnerOfTheRound
  991.      * @wholeEvent - true - I won Last Man Standing! false - I Won Round!
  992.      * @winnerOfTheRound if wholeEvent == false, set it to null
  993.      */
  994.     protected void announceWinnerPlayer(boolean wholeEvent, FightClubPlayer winnerOfTheRound) {
  995.         int bestScore = -1;
  996.         FightClubPlayer bestPlayer = null;
  997.         boolean draw = false;
  998.         if (wholeEvent) {
  999.             for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  1000.                 if (iFPlayer.getPlayer() != null && iFPlayer.getPlayer().isOnline())
  1001.                     if (iFPlayer.getScore() > bestScore) {
  1002.                         bestScore = iFPlayer.getScore();
  1003.                         bestPlayer = iFPlayer;
  1004.                     } else if (iFPlayer.getScore() == bestScore) {
  1005.                         draw = true;
  1006.                     }
  1007.         } else
  1008.             bestPlayer = winnerOfTheRound;
  1009.  
  1010.         if (!draw) {
  1011.             Say2 packet = new Say2(0, ChatType.COMMANDCHANNEL_ALL, bestPlayer.getPlayer().getName(),
  1012.                     "You Won " + (wholeEvent ? getName() : "Round") + "!");
  1013.             for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  1014.                 iFPlayer.getPlayer().sendPacket(packet);
  1015.         }
  1016.  
  1017.         updateScreenScores();
  1018.     }
  1019.  
  1020.     protected void updateScreenScores() {
  1021.         String msg = getScreenScores(inScreenShowBeScoreNotKills(), inScreenShowBeTeamNotInvidual());
  1022.  
  1023.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  1024.             sendMessageToPlayer(iFPlayer, MESSAGE_TYPES.SCREEN_SMALL, msg);
  1025.     }
  1026.  
  1027.     protected void updateScreenScores(Player player) {
  1028.         if (getFightClubPlayer(player) != null)
  1029.             sendMessageToPlayer(getFightClubPlayer(player), MESSAGE_TYPES.SCREEN_SMALL,
  1030.                     getScreenScores(inScreenShowBeScoreNotKills(), inScreenShowBeTeamNotInvidual()));
  1031.     }
  1032.  
  1033.     protected String getScorePlayerName(FightClubPlayer fPlayer) {
  1034.         return fPlayer.getPlayer().getName() + (isTeamed() ? " (" + fPlayer.getTeam().getName() + " Team)" : "");
  1035.     }
  1036.  
  1037.     /**
  1038.      * Player Ranking is being updated
  1039.      *
  1040.      * @param fPlayer
  1041.      */
  1042.     protected void updatePlayerScore(FightClubPlayer fPlayer) {
  1043.         _scores.put(getScorePlayerName(fPlayer), fPlayer.getKills(true));
  1044.         _rscores.put(fPlayer.getPlayer().getObjectId(), fPlayer.getKills(true));
  1045.         _scoredUpdated = true;
  1046.  
  1047.         /*
  1048.          * for(FightClubPlayer iterFPlayer : getPlayers(FIGHTING_PLAYERS)) if
  1049.          * (iterFPlayer.isShowRank()) showScores(iterFPlayer.getPlayer());
  1050.          */
  1051.  
  1052.         if (!isTeamed())
  1053.             updateScreenScores();
  1054.     }
  1055.  
  1056.     protected void showScores(Creature c) {
  1057.         Map<String, Integer> scores = getBestScores();
  1058.  
  1059.         FightClubPlayer fPlayer = getFightClubPlayer(c);
  1060.         fPlayer.setShowRank(true);
  1061.        
  1062.         c.sendPacket(new ExPVPMatchCCRecord(scores));
  1063.     }
  1064.    
  1065.     protected  void saveResults() {
  1066.  
  1067.         Connection con = null;
  1068.         PreparedStatement statement = null;
  1069.  
  1070.         try {
  1071.             con = DatabaseFactory.getInstance().getConnection();
  1072.             statement = BatchStatement.createPreparedStatement(con,
  1073.                     "REPLACE INTO character_event_kills(obj_Id,kills) VALUES(?,?)");
  1074.             for (Entry<Integer, Integer> i : _rscores.entrySet()) {
  1075.                 statement.setInt(1, i.getKey());
  1076.                 statement.setInt(2, i.getValue());
  1077.                 statement.addBatch();
  1078.             }
  1079.             statement.executeBatch();
  1080.  
  1081.         } catch (Exception ex) {
  1082.             ex.printStackTrace();
  1083.         }
  1084.     }
  1085.  
  1086.     protected void hideScores(Creature c) {
  1087.         c.sendPacket(ExPVPMatchCCRetire.STATIC);
  1088.     }
  1089.  
  1090.     /**
  1091.      * If player is AFK: getting him back from it If player isn't AFK: checking
  1092.      * if he is in combat and asking if he really wants it
  1093.      *
  1094.      * @param fPlayer
  1095.      * @param setAsAfk
  1096.      */
  1097.     protected void handleAfk(FightClubPlayer fPlayer, boolean setAsAfk) {
  1098.         Player player = fPlayer.getPlayer();
  1099.  
  1100.         if (setAsAfk) {
  1101.             fPlayer.setAfk(true);
  1102.             fPlayer.setAfkStartTime(player.getLastNotAfkTime());
  1103.  
  1104.             sendMessageToPlayer(player, MESSAGE_TYPES.CRITICAL, "You are considered as AFK Player!");
  1105.         } else if (fPlayer.isAfk()) {
  1106.             int totalAfkTime = (int) ((System.currentTimeMillis() - fPlayer.getAfkStartTime()) / 1000);
  1107.             totalAfkTime -= TIME_TO_BE_AFK;
  1108.             if (totalAfkTime > 5) {
  1109.                 fPlayer.setAfk(false);
  1110.  
  1111.                 fPlayer.addTotalAfkSeconds(totalAfkTime);
  1112.                 sendMessageToPlayer(player, MESSAGE_TYPES.CRITICAL, "You were afk for " + totalAfkTime + " seconds!");
  1113.             }
  1114.         }
  1115.     }
  1116.  
  1117.     /**
  1118.      * @param player
  1119.      * @param seconds
  1120.      * @param sendMessages
  1121.      * @seconds - If seconds > 0, starts new timer that stopsInvisiblity when
  1122.      *          its over.
  1123.      * @SendMessages - Should timer send messages like VISIBLE IN X SECONDS?
  1124.      */
  1125.     protected void setInvisible(Player player, int seconds, boolean sendMessages) {
  1126.         FightClubPlayer fPlayer = getFightClubPlayer(player);
  1127.         fPlayer.setInvisible(true);
  1128.  
  1129.         player.setInvisibleType(InvisibleType.NORMAL);
  1130.         player.startAbnormalEffect(AbnormalEffect.STEALTH);
  1131.         player.sendUserInfo(true);
  1132.         World.removeObjectFromPlayers(player);
  1133.  
  1134.         if (seconds > 0)
  1135.             startNewTimer(false, 0, "setInvisible", seconds, fPlayer, sendMessages);
  1136.     }
  1137.  
  1138.     protected void stopInvisibility(Player player) {
  1139.         FightClubPlayer fPlayer = getFightClubPlayer(player);
  1140.  
  1141.         if (fPlayer != null)
  1142.             fPlayer.setInvisible(false);
  1143.  
  1144.         player.setInvisibleType(InvisibleType.NONE);
  1145.         player.stopAbnormalEffect(AbnormalEffect.STEALTH);
  1146.         player.broadcastCharInfo();
  1147.         if (player.getPet() != null)
  1148.             player.getPet().broadcastCharInfo();
  1149.     }
  1150.  
  1151.     protected void rootPlayer(Player player) {
  1152.         if (!isRootBetweenRounds())
  1153.             return;
  1154.         List<Playable> toRoot = new ArrayList<>();
  1155.         toRoot.add(player);
  1156.         if (player.getPet() != null)
  1157.             toRoot.add(player.getPet());
  1158.  
  1159.         if (!player.isRooted()) {
  1160.             player.startRooted();
  1161.         }
  1162.         player.stopMove();
  1163.         player.startAbnormalEffect(AbnormalEffect.ROOT);
  1164.     }
  1165.  
  1166.     protected void unrootPlayers() {
  1167.         if (!isRootBetweenRounds())
  1168.             return;
  1169.  
  1170.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  1171.             Player player = iFPlayer.getPlayer();
  1172.             if (player.isRooted()) {
  1173.                 try {
  1174.                     player.stopRooted();
  1175.                 } catch (IllegalStateException e) {
  1176.  
  1177.                 }
  1178.                 player.stopAbnormalEffect(AbnormalEffect.ROOT);
  1179.             }
  1180.         }
  1181.     }
  1182.  
  1183.     protected void ressAndHealPlayers() {
  1184.         for (FightClubPlayer fPlayer : getPlayers(FIGHTING_PLAYERS)) {
  1185.             Player player = fPlayer.getPlayer();
  1186.  
  1187.             if (player.isDead())
  1188.                 player.doRevive(100.);
  1189.  
  1190.             cancelNegativeEffects(player);
  1191.             if (player.getPet() != null)
  1192.                 cancelNegativeEffects(player.getPet());
  1193.  
  1194.             buffPlayer(player);
  1195.         }
  1196.     }
  1197.  
  1198.     protected int getWarRelation() {
  1199.         int result = 0;
  1200.  
  1201.         result |= RelationChanged.RELATION_CLAN_MEMBER;
  1202.         result |= RelationChanged.RELATION_1SIDED_WAR;
  1203.         result |= RelationChanged.RELATION_MUTUAL_WAR;
  1204.  
  1205.         return result;
  1206.     }
  1207.  
  1208.     protected int getFriendRelation() {
  1209.         int result = 0;
  1210.  
  1211.         result |= RelationChanged.RELATION_CLAN_MEMBER;
  1212.         result |= RelationChanged.RELATION_CLAN_MATE;
  1213.  
  1214.         return result;
  1215.     }
  1216.  
  1217.     /**
  1218.      * Getting one location out of locs and spawning npc in there.
  1219.      * Set @respawnInSeconds to 0 if you don't want them to respawn
  1220.      *
  1221.      * @param id
  1222.      * @param locs
  1223.      * @param respawnInSeconds
  1224.      * @return
  1225.      */
  1226.     protected NpcInstance chooseLocAndSpawnNpc(int id, Location[] locs, int respawnInSeconds) {
  1227.         return spawnNpc(id, getSafeLocation(locs), respawnInSeconds);
  1228.     }
  1229.  
  1230.     /**
  1231.      * Set @respawnInSeconds to 0 if you don't want them to respawn
  1232.      *
  1233.      * @param id
  1234.      * @param loc
  1235.      * @param respawnInSeconds
  1236.      * @return
  1237.      */
  1238.     protected NpcInstance spawnNpc(int id, Location loc, int respawnInSeconds) {
  1239.         SimpleSpawner spawn = new SimpleSpawner(id);
  1240.         spawn.setLoc(loc);
  1241.         spawn.setAmount(1);
  1242.         spawn.setHeading(loc.h);
  1243.         spawn.setRespawnDelay(Math.max(0, respawnInSeconds));
  1244.         spawn.setReflection(getReflection());
  1245.         List<NpcInstance> npcs = spawn.initAndReturn();
  1246.  
  1247.         if (respawnInSeconds <= 0)
  1248.             spawn.stopRespawn();
  1249.  
  1250.         return npcs.get(0);
  1251.     }
  1252.  
  1253.     /**
  1254.      * @param seconds
  1255.      * @return "5 minutes" after pasting 300 seconds
  1256.      */
  1257.     protected static String getFixedTime(int seconds) {
  1258.         int minutes = seconds / 60;
  1259.         String result = "";
  1260.         if (seconds >= 60) {
  1261.             result = minutes + " minute" + (minutes > 1 ? "s" : "");
  1262.         } else {
  1263.             result = seconds + " second" + (seconds > 1 ? "s" : "");
  1264.         }
  1265.         return result;
  1266.     }
  1267.  
  1268.     private void buffPlayer(Player player) {
  1269.         if (getBuffer()) {
  1270.             int[][] buffs;
  1271.             if (player.isMageClass())
  1272.                 buffs = _mageBuffs;
  1273.             else
  1274.                 buffs = _fighterBuffs;
  1275.  
  1276.             giveBuffs(player, buffs);
  1277.  
  1278.             if (player.getPet() != null)
  1279.                 giveBuffs(player.getPet(), _fighterBuffs);
  1280.         }
  1281.     }
  1282.  
  1283.     private static void giveBuffs(final Playable playable, int[][] buffs) {
  1284.         Skill buff;
  1285.         for (int[] buff1 : buffs) {
  1286.             buff = SkillTable.getInstance().getInfo(buff1[0], buff1[1]);
  1287.             if (buff == null) {
  1288.                 continue;
  1289.             }
  1290.             buff.getEffects(playable, playable, false, false);
  1291.         }
  1292.  
  1293.         ThreadPoolManager.getInstance().schedule(() -> {
  1294.             playable.setCurrentHp(playable.getMaxHp(), true);
  1295.             playable.setCurrentMp(playable.getMaxMp());
  1296.             playable.setCurrentCp(playable.getMaxCp());
  1297.         }, 1000);
  1298.     }
  1299.  
  1300.     private void announceTopKillers(FightClubPlayer[] topKillers) {
  1301.         if (topKillers == null)
  1302.             return;
  1303.  
  1304.         for (FightClubPlayer fPlayer : topKillers)
  1305.             if (fPlayer != null) {
  1306.                 String message = fPlayer.getPlayer().getName()
  1307.                         + " had most kills" /*
  1308.                                              * + (_teamed ? " from " +
  1309.                                              * fPlayer.getTeam().getName() +
  1310.                                              * " Team" : "")
  1311.                                              */ + " on " + getName() + " Event!";
  1312.                 FightClubEventManager.getInstance().sendToAllMsg(this, message);
  1313.             }
  1314.     }
  1315.  
  1316.     public enum MESSAGE_TYPES {
  1317.         GM, NORMAL_MESSAGE, SCREEN_BIG, SCREEN_SMALL, CRITICAL
  1318.     }
  1319.  
  1320.     protected void sendMessageToFightingAndRegistered(MESSAGE_TYPES type, String msg) {
  1321.         sendMessageToFighting(type, msg, false);
  1322.         sendMessageToRegistered(type, msg);
  1323.     }
  1324.  
  1325.     protected void sendMessageToTeam(FightClubTeam team, MESSAGE_TYPES type, String msg) {
  1326.         // Team Members
  1327.         for (FightClubPlayer iFPlayer : team.getPlayers())
  1328.             sendMessageToPlayer(iFPlayer, type, msg);
  1329.     }
  1330.  
  1331.     protected void sendMessageToFighting(MESSAGE_TYPES type, String msg, boolean skipJustTeleported)// TODO
  1332.                                                                                                     // ogarnac
  1333.                                                                                                     // skipJustTeleported,
  1334.                                                                                                     // to
  1335.                                                                                                     // juz
  1336.                                                                                                     // nie
  1337.                                                                                                     // jest
  1338.                                                                                                     // potrzebne
  1339.     {
  1340.         // Fighting
  1341.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  1342.             if (!skipJustTeleported || !iFPlayer.isInvisible())
  1343.                 sendMessageToPlayer(iFPlayer, type, msg);
  1344.     }
  1345.  
  1346.     protected void sendMessageToRegistered(MESSAGE_TYPES type, String msg) {
  1347.         // Registered
  1348.         for (FightClubPlayer iFPlayer : getPlayers(REGISTERED_PLAYERS))
  1349.             sendMessageToPlayer(iFPlayer, type, msg);
  1350.     }
  1351.  
  1352.     public void sendMessageToPlayer(FightClubPlayer fPlayer, MESSAGE_TYPES type, String msg) {
  1353.         sendMessageToPlayer(fPlayer.getPlayer(), type, msg);
  1354.     }
  1355.  
  1356.     protected void sendMessageToPlayer(Player player, MESSAGE_TYPES type, String msg) {
  1357.         switch (type) {
  1358.         case GM:
  1359.             player.sendPacket(new Say2(player.getObjectId(), ChatType.CRITICAL_ANNOUNCE, player.getName(), msg));
  1360.             updateScreenScores(player);
  1361.             break;
  1362.         case NORMAL_MESSAGE:
  1363.             player.sendMessage(msg);
  1364.             break;
  1365.         case SCREEN_BIG:
  1366.             player.sendPacket(
  1367.                     new ExShowScreenMessage(msg, 3000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true));
  1368.             updateScreenScores(player);
  1369.             break;
  1370.         case SCREEN_SMALL:
  1371.             player.sendPacket(
  1372.                     new ExShowScreenMessage(msg, 600000, ExShowScreenMessage.ScreenMessageAlign.TOP_LEFT, false));
  1373.             break;
  1374.         case CRITICAL:
  1375.             player.sendPacket(new Say2(player.getObjectId(), ChatType.COMMANDCHANNEL_ALL, player.getName(), msg));
  1376.             updateScreenScores(player);
  1377.             break;
  1378.         }
  1379.     }
  1380.  
  1381.     public void setState(EVENT_STATE state) {
  1382.         _state = state;
  1383.     }
  1384.  
  1385.     // ===============================================================================================================
  1386.     // Event Getters
  1387.     // ===============================================================================================================
  1388.  
  1389.     public EVENT_STATE getState() {
  1390.         return _state;
  1391.     }
  1392.  
  1393.     public int getObjectId() {
  1394.         return _objId;
  1395.     }
  1396.  
  1397.     public int getEventId() {
  1398.         return getId();
  1399.     }
  1400.  
  1401.     public String getDescription() {
  1402.         return _desc;
  1403.     }
  1404.  
  1405.     public String getIcon() {
  1406.         return _icon;
  1407.     }
  1408.  
  1409.     public boolean isAutoTimed() {
  1410.         return _isAutoTimed;
  1411.     }
  1412.  
  1413.     public int[][] getAutoStartTimes() {
  1414.         return _autoStartTimes;
  1415.     }
  1416.  
  1417.     public FightClubMap getMap() {
  1418.         return _map;
  1419.     }
  1420.  
  1421.     public boolean isTeamed() {
  1422.         return _teamed;
  1423.     }
  1424.  
  1425.     protected boolean isInstanced() {
  1426.         return _instanced;
  1427.     }
  1428.  
  1429.     @Override
  1430.     public Reflection getReflection() {
  1431.         return _reflection;
  1432.     }
  1433.  
  1434.     /**
  1435.      * @return -1 in case
  1436.      */
  1437.     public int getRoundRuntime() {
  1438.         return _roundRunTime;
  1439.     }
  1440.  
  1441.     public int getRespawnTime() {
  1442.         return _respawnTime;
  1443.     }
  1444.  
  1445.     public boolean isRoundEvent() {
  1446.         return _roundEvent;
  1447.     }
  1448.  
  1449.     public int getTotalRounds() {
  1450.         return _rounds;
  1451.     }
  1452.  
  1453.     public int getCurrentRound() {
  1454.         return _currentRound;
  1455.     }
  1456.  
  1457.     public boolean getBuffer() {
  1458.         return _buffer;
  1459.     }
  1460.  
  1461.     protected boolean isRootBetweenRounds() {
  1462.         return _rootBetweenRounds;
  1463.     }
  1464.  
  1465.     public boolean isLastRound() {
  1466.         return !isRoundEvent() || getCurrentRound() == getTotalRounds();
  1467.     }
  1468.  
  1469.     protected List<FightClubTeam> getTeams() {
  1470.         return _teams;
  1471.     }
  1472.  
  1473.     public MultiValueSet<String> getSet() {
  1474.         return _set;
  1475.     }
  1476.  
  1477.     public void clearSet() {
  1478.         _set = null;
  1479.     }
  1480.  
  1481.     public CLASSES[] getExcludedClasses() {
  1482.         return _excludedClasses;
  1483.     }
  1484.  
  1485.     public boolean isHidePersonality() {
  1486.         return !_showPersonality;
  1487.     }
  1488.  
  1489.     protected int getTeamTotalKills(FightClubTeam team) {
  1490.         if (!isTeamed())
  1491.             return 0;
  1492.         int totalKills = 0;
  1493.         for (FightClubPlayer iFPlayer : team.getPlayers())
  1494.             totalKills += iFPlayer.getKills(true);
  1495.  
  1496.         return totalKills;
  1497.     }
  1498.  
  1499.     /**
  1500.      * @param groups
  1501.      * @return players count from the groups
  1502.      */
  1503.     public int getPlayersCount(String... groups) {
  1504.         return getPlayers(groups).size();
  1505.     }
  1506.  
  1507.     public List<FightClubPlayer> getPlayers(String... groups) {
  1508.         if (groups.length == 1) {
  1509.             List<FightClubPlayer> fPlayers = getObjects(groups[0]);
  1510.             return fPlayers;
  1511.         } else {
  1512.             List<FightClubPlayer> newList = new ArrayList<>();
  1513.             for (String group : groups) {
  1514.                 List<FightClubPlayer> fPlayers = getObjects(group);
  1515.                 newList.addAll(fPlayers);
  1516.             }
  1517.             return newList;
  1518.         }
  1519.     }
  1520.  
  1521.     public List<Player> getAllFightingPlayers() {
  1522.         List<FightClubPlayer> fPlayers = getPlayers(FIGHTING_PLAYERS);
  1523.         List<Player> players = new ArrayList<>(fPlayers.size());
  1524.         for (FightClubPlayer fPlayer : fPlayers)
  1525.             players.add(fPlayer.getPlayer());
  1526.         return players;
  1527.     }
  1528.  
  1529.     public List<Player> getMyTeamFightingPlayers(Player player) {
  1530.         FightClubTeam fTeam = getFightClubPlayer(player).getTeam();
  1531.         List<FightClubPlayer> fPlayers = getPlayers(FIGHTING_PLAYERS);
  1532.         List<Player> players = new ArrayList<>(fPlayers.size());
  1533.  
  1534.         if (!isTeamed()) {
  1535.             player.sendPacket(new Say2(player.getObjectId(), ChatType.BATTLEFIELD, getName(),
  1536.                     "(There are no teams, only you can see the message)"));
  1537.             players.add(player);
  1538.         } else {
  1539.             for (FightClubPlayer iFPlayer : fPlayers)
  1540.                 if (iFPlayer.getTeam().equals(fTeam))
  1541.                     players.add(iFPlayer.getPlayer());
  1542.         }
  1543.         return players;
  1544.     }
  1545.  
  1546.     /**
  1547.      * Looking for FightClubPlayer ONLY in FIGHTING_PLAYERS
  1548.      *
  1549.      * @param creature
  1550.      * @return
  1551.      */
  1552.     public FightClubPlayer getFightClubPlayer(Creature creature) {
  1553.         return getFightClubPlayer(creature, FIGHTING_PLAYERS);
  1554.     }
  1555.  
  1556.     /**
  1557.      * Looking for FightClubPlayer in specific groups
  1558.      *
  1559.      * @param creature
  1560.      * @param groups
  1561.      * @return
  1562.      */
  1563.     public FightClubPlayer getFightClubPlayer(Creature creature, String... groups) {
  1564.         if (!creature.isPlayable())
  1565.             return null;
  1566.  
  1567.         int lookedPlayerId = creature.getPlayer().getObjectId();
  1568.  
  1569.         for (FightClubPlayer iFPlayer : getPlayers(groups))
  1570.             if (iFPlayer.getPlayer().getObjectId() == lookedPlayerId)
  1571.                 return iFPlayer;
  1572.         return null;
  1573.     }
  1574.  
  1575.     // ===============================================================================================================
  1576.     // Private actions
  1577.     // ===============================================================================================================
  1578.  
  1579.     /**
  1580.      * Getting teams and partys from FightClubGameRoom and making them actually
  1581.      * exist
  1582.      */
  1583.     protected void spreadIntoTeamsAndPartys() {
  1584.         // Creating teams
  1585.         for (int i = 0; i < _room.getTeamsCount(); i++) {
  1586.             _teams.add(new FightClubTeam(i + 1));
  1587.         }
  1588.  
  1589.         // Sort the player list by level
  1590.         final List<Player> players = new ArrayList<>(_room.getAllPlayers());
  1591.  
  1592.         // Alexander - Sort participants list by level and then by class, trying
  1593.         // to make the teams as equal as possible
  1594.         Collections.sort(players,
  1595.                 PlayerComparator.getComparator(PlayerComparator.LEVEL_SORT, PlayerComparator.CLASS_SORT));
  1596.  
  1597.         int index = 0;
  1598.         for (Player player : players) {
  1599.             FightClubPlayer fPlayer = getFightClubPlayer(player, REGISTERED_PLAYERS);
  1600.             if (fPlayer == null)
  1601.                 continue;
  1602.  
  1603.             final FightClubTeam team = _teams.get(index % _room.getTeamsCount());
  1604.             fPlayer.setTeam(team);
  1605.             team.addPlayer(fPlayer);
  1606.  
  1607.             index++;
  1608.         }
  1609.  
  1610.         for (FightClubTeam team : _teams) {
  1611.             List<List<Player>> partys = spreadTeamInPartys(team);
  1612.             for (List<Player> party : partys) {
  1613.                 createParty(party);
  1614.             }
  1615.         }
  1616.     }
  1617.  
  1618.     /**
  1619.      * Spreading Players in team into List of Partys(Party = List<Player> with 9
  1620.      * as MAX Count)
  1621.      *
  1622.      * @param team
  1623.      *            team to create Partys
  1624.      * @return List<Party(List<Player>)>
  1625.      */
  1626.     protected List<List<Player>> spreadTeamInPartys(FightClubTeam team) {
  1627.         // Creating Map<Class, List of Players>
  1628.         Map<CLASSES, List<Player>> classesMap = new FastMap<>();
  1629.         for (CLASSES clazz : CLASSES.values()) {
  1630.             classesMap.put(clazz, new ArrayList<Player>());
  1631.         }
  1632.  
  1633.         // Adding players to map
  1634.         for (FightClubPlayer iFPlayer : team.getPlayers()) {
  1635.             Player player = iFPlayer.getPlayer();
  1636.             CLASSES clazz = FightClubGameRoom.getPlayerClassGroup(player);
  1637.             classesMap.get(clazz).add(player);
  1638.         }
  1639.  
  1640.         // Getting Party Count
  1641.         int partyCount = (int) Math.ceil(team.getPlayers().size() / (double) Party.MAX_SIZE);
  1642.  
  1643.         // Creating "Partys"
  1644.         List<List<Player>> partys = new ArrayList<>();
  1645.         for (int i = 0; i < partyCount; i++) {
  1646.             partys.add(new ArrayList<Player>());
  1647.         }
  1648.  
  1649.         if (partyCount == 0)
  1650.             return partys;
  1651.  
  1652.         // Adding players from map to Partys
  1653.         int finishedOnIndex = 0;
  1654.         for (Entry<CLASSES, List<Player>> clazzEntry : classesMap.entrySet()) {
  1655.             for (Player player : clazzEntry.getValue()) {
  1656.                 partys.get(finishedOnIndex).add(player);
  1657.                 finishedOnIndex++;
  1658.                 if (finishedOnIndex == partyCount)
  1659.                     finishedOnIndex = 0;
  1660.             }
  1661.         }
  1662.  
  1663.         return partys;
  1664.     }
  1665.  
  1666.     /**
  1667.      * Creating Real Party from List<Player> Checking listOfPlayers count,
  1668.      * removing from current party
  1669.      *
  1670.      * @param listOfPlayers
  1671.      *            players to create party
  1672.      */
  1673.     protected void createParty(List<Player> listOfPlayers) {
  1674.         if (listOfPlayers.size() <= 1)
  1675.             return;
  1676.  
  1677.         Party newParty = null;
  1678.         for (Player player : listOfPlayers) {
  1679.             if (player.getParty() != null)
  1680.                 player.getParty().removePartyMember(player, true);
  1681.  
  1682.             if (newParty == null) {
  1683.                 player.setParty(newParty = new Party(player, Party.ITEM_ORDER_SPOIL));
  1684.             } else {
  1685.                 player.joinParty(newParty);
  1686.             }
  1687.         }
  1688.     }
  1689.  
  1690.     private synchronized void createReflection(IntObjectMap<DoorTemplate> doors, Map<String, ZoneTemplate> zones) {
  1691.         InstantZone iz = InstantZoneHolder.getInstance().getInstantZone(INSTANT_ZONE_ID);
  1692.  
  1693.         _reflection = new Reflection();
  1694.         _reflection.init(iz);
  1695.         _reflection.init(doors, zones);
  1696.  
  1697.         for (Zone zone : _reflection.getZones())
  1698.             zone.addListener(_zoneListener);
  1699.     }
  1700.  
  1701.     /**
  1702.      * @param locations
  1703.      * @return Finding location where nobodyIsClose
  1704.      */
  1705.     private Location getSafeLocation(Location[] locations) {
  1706.         Location safeLoc = null;
  1707.         int checkedCount = 0;
  1708.         boolean isOk = false;
  1709.  
  1710.         while (!isOk) {
  1711.             safeLoc = Rnd.get(locations);
  1712.  
  1713.             // Checking if nobody is close to spawn, only in single player
  1714.             // events
  1715.             isOk = nobodyIsClose(safeLoc);
  1716.             checkedCount++;
  1717.  
  1718.             // If players are close to every spawn, choose something anyway.
  1719.             if (checkedCount > locations.length * 2)
  1720.                 isOk = true;
  1721.         }
  1722.  
  1723.         return safeLoc;
  1724.     }
  1725.  
  1726.     /**
  1727.      * @param fPlayer
  1728.      * @param randomNotClosestToPt
  1729.      * @return
  1730.      * @randomNotClosestToPt If true - @return random location from team locs
  1731.      * @randomNotClosestToPt If false - @return location closest to team members
  1732.      */
  1733.     protected Location getTeamSpawn(FightClubPlayer fPlayer, boolean randomNotClosestToPt) {
  1734.         FightClubTeam team = fPlayer.getTeam();
  1735.         Location[] spawnLocs = getMap().getTeamSpawns().get(team.getIndex());
  1736.  
  1737.         if (randomNotClosestToPt || _state != EVENT_STATE.STARTED) {
  1738.             return Rnd.get(spawnLocs);
  1739.             // if (team.getSpawnLoc() == null)
  1740.             // {
  1741.             // team.setSpawnLoc(Rnd.get(spawnLocs));
  1742.             // }
  1743.             // return team.getSpawnLoc();
  1744.         } else {
  1745.             List<Player> playersToCheck = new ArrayList<>();
  1746.             if (fPlayer.getParty() != null)
  1747.                 playersToCheck = fPlayer.getParty().getMembers();
  1748.             else
  1749.                 for (FightClubPlayer iFPlayer : team.getPlayers())
  1750.                     playersToCheck.add(iFPlayer.getPlayer());
  1751.  
  1752.             Map<Location, Integer> spawnLocations = new FastMap<>(spawnLocs.length);
  1753.             for (Location loc : spawnLocs)
  1754.                 spawnLocations.put(loc, 0);
  1755.  
  1756.             for (Player player : playersToCheck)
  1757.                 if (player != null && player.isOnline() && !player.isDead()) {
  1758.                     Location winner = null;
  1759.                     double winnerDist = -1;
  1760.                     for (Location loc : spawnLocs)
  1761.                         if (winnerDist <= 0 || winnerDist < player.getDistance(loc)) {
  1762.                             winner = loc;
  1763.                             winnerDist = player.getDistance(loc);
  1764.                         }
  1765.  
  1766.                     if (winner != null)
  1767.                         spawnLocations.put(winner, spawnLocations.get(winner) + 1);
  1768.                 }
  1769.  
  1770.             Location winner = null;
  1771.             double points = -1;
  1772.             for (Entry<Location, Integer> spawn : spawnLocations.entrySet())
  1773.                 if (points < spawn.getValue()) {
  1774.                     winner = spawn.getKey();
  1775.                     points = spawn.getValue();
  1776.                 }
  1777.  
  1778.             if (points <= 0)
  1779.                 return Rnd.get(spawnLocs);
  1780.             return winner;
  1781.         }
  1782.     }
  1783.  
  1784.     protected boolean isPlayerActive(Player player) {
  1785.         if (player == null)
  1786.             return false;
  1787.         if (player.isDead())
  1788.             return false;
  1789.         if (!player.getReflection().equals(getReflection()))
  1790.             return false;
  1791.         if (System.currentTimeMillis() - player.getLastNotAfkTime() > 120000)// If
  1792.                                                                                 // inactive
  1793.                                                                                 // for
  1794.                                                                                 // at
  1795.                                                                                 // least
  1796.                                                                                 // 2
  1797.                                                                                 // minutes
  1798.             return false;
  1799.  
  1800.         boolean insideZone = false;
  1801.         for (Zone zone : getReflection().getZones())
  1802.             if (zone.checkIfInZone(player.getX(), player.getY(), player.getZ(), player.getReflection()))
  1803.                 insideZone = true;
  1804.         if (!insideZone)
  1805.             return false;
  1806.  
  1807.         return true;
  1808.     }
  1809.  
  1810.     /**
  1811.      * Sending rewardPlayer method to every FIGHTING_PLAYERS
  1812.      *
  1813.      * @param topKillers
  1814.      */
  1815.     private void giveRewards(FightClubPlayer[] topKillers) {
  1816.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS))
  1817.             if (iFPlayer != null)
  1818.                 rewardPlayer(iFPlayer, Util.arrayContains(topKillers, iFPlayer));
  1819.     }
  1820.  
  1821.     private void showLastAFkMessage() {
  1822.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  1823.             int minutesAFK = (int) Math.round((double) iFPlayer.getTotalAfkSeconds() / 60);
  1824.             int badgesDecreased = -minutesAFK * BADGES_FOR_MINUTE_OF_AFK;
  1825.             sendMessageToPlayer(iFPlayer, MESSAGE_TYPES.NORMAL_MESSAGE,
  1826.                     "Reward decreased by " + badgesDecreased + " Coins for AFK time!");
  1827.         }
  1828.     }
  1829.  
  1830.     /**
  1831.      * @return 25 <Name, Points> - players with most points
  1832.      */
  1833.     private Map<String, Integer> getBestScores() {
  1834.         if (!_scoredUpdated)
  1835.             return _bestScores;
  1836.  
  1837.         List<Integer> points = new ArrayList<Integer>(_scores.values());
  1838.         Collections.sort(points);
  1839.         Collections.reverse(points);
  1840.  
  1841.         int cap;
  1842.         if (points.size() <= 26)
  1843.             cap = points.get(points.size() - 1).intValue();
  1844.         else
  1845.             cap = points.get(25).intValue();
  1846.         Map<String, Integer> finalResult = new LinkedHashMap<>();
  1847.  
  1848.         List<Entry<String, Integer>> toAdd = new ArrayList<>();
  1849.         for (Entry<String, Integer> i : _scores.entrySet())
  1850.             if (i.getValue().intValue() > cap && finalResult.size() < 25)
  1851.                 toAdd.add(i);
  1852.  
  1853.         if (finalResult.size() < 25) {
  1854.             for (Entry<String, Integer> i : _scores.entrySet())
  1855.                 if (i.getValue().intValue() == cap) {
  1856.                     toAdd.add(i);
  1857.                     if (finalResult.size() == 25)
  1858.                         break;
  1859.                 }
  1860.         }
  1861.  
  1862.         for (int i = 0; i < toAdd.size(); i++) {
  1863.             Entry<String, Integer> biggestEntry = null;
  1864.             for (Entry<String, Integer> entry : toAdd) {
  1865.                 if (!finalResult.containsKey(entry.getKey())
  1866.                         && (biggestEntry == null || entry.getValue().intValue() > biggestEntry.getValue().intValue()))
  1867.                     biggestEntry = entry;
  1868.             }
  1869.             if (biggestEntry != null)
  1870.                 finalResult.put(biggestEntry.getKey(), biggestEntry.getValue());
  1871.         }
  1872.  
  1873.         _bestScores = finalResult;
  1874.         _scoredUpdated = false;
  1875.  
  1876.         return finalResult;
  1877.     }
  1878.  
  1879.     /**
  1880.      * Updating score of every FIGHTING_PLAYERS
  1881.      */
  1882.     private void updateEveryScore() {
  1883.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  1884.             _scores.put(getScorePlayerName(iFPlayer), iFPlayer.getKills(true));
  1885.             _rscores.put(iFPlayer.getPlayer().getObjectId(), iFPlayer.getKills(true));
  1886.             _scoredUpdated = true;
  1887.         }
  1888.     }
  1889.  
  1890.     /**
  1891.      * @param showScoreNotKills
  1892.      *            - true - Score: - false - "Kills:"
  1893.      * @param teamPointsNotInvidual
  1894.      *            - true: Team Score/Kills, false: Player Score/Kills
  1895.      * @return
  1896.      */
  1897.     private String getScreenScores(boolean showScoreNotKills, boolean teamPointsNotInvidual) {
  1898.         StringBuilder builder = new StringBuilder();
  1899.         if (_teamed && teamPointsNotInvidual) {
  1900.             List<FightClubTeam> teams = getTeams();
  1901.             Collections.sort(teams, new BestTeamComparator(showScoreNotKills));
  1902.             for (FightClubTeam team : teams)
  1903.                 builder.append(team.getName()).append(" Team: ")
  1904.                         .append(showScoreNotKills ? team.getScore() : getTeamTotalKills(team)).append(' ')
  1905.                         .append(showScoreNotKills ? "Points" : "Kills").append('\n');
  1906.         } else {
  1907.             List<FightClubPlayer> fPlayers = getPlayers(FIGHTING_PLAYERS);
  1908.             List<FightClubPlayer> changedFPlayers = new ArrayList<>(fPlayers.size());
  1909.             changedFPlayers.addAll(fPlayers);
  1910.  
  1911.             Collections.sort(changedFPlayers, new BestPlayerComparator(showScoreNotKills));
  1912.             int max = Math.min(10, changedFPlayers.size());
  1913.             for (int i = 0; i < max; i++)
  1914.                 builder.append(changedFPlayers.get(i).getPlayer().getName()).append(' ')
  1915.                         .append(showScoreNotKills ? "Score" : "Kills").append(": ")
  1916.                         .append(showScoreNotKills ? changedFPlayers.get(i).getScore()
  1917.                                 : changedFPlayers.get(i).getKills(true))
  1918.                         .append('\n');
  1919.         }
  1920.  
  1921.         return builder.toString();
  1922.     }
  1923.  
  1924.     protected int getRewardForWinningTeam(FightClubPlayer fPlayer, boolean atLeast1Kill) {
  1925.         if (!_teamed || _state != EVENT_STATE.OVER && _state != EVENT_STATE.NOT_ACTIVE)
  1926.             return 0;
  1927.  
  1928.         if (atLeast1Kill && fPlayer.getKills(true) <= 0
  1929.                 && FightClubGameRoom.getPlayerClassGroup(fPlayer.getPlayer()) != CLASSES.HEALERS)
  1930.             return 0;
  1931.  
  1932.         FightClubTeam winner = null;
  1933.         int winnerPoints = -1;
  1934.         boolean sameAmount = false;
  1935.         for (FightClubTeam team : getTeams()) {
  1936.             if (team.getScore() > winnerPoints) {
  1937.                 winner = team;
  1938.                 winnerPoints = team.getScore();
  1939.                 sameAmount = false;
  1940.             } else if (team.getScore() == winnerPoints) {
  1941.                 sameAmount = true;
  1942.             }
  1943.         }
  1944.  
  1945.         if (!sameAmount && fPlayer.getTeam().equals(winner)) {
  1946.             return (int) _badgeWin;
  1947.         } else {
  1948.             return 0;
  1949.         }
  1950.     }
  1951.  
  1952.     /**
  1953.      * @param loc
  1954.      * @return checking if nobody is near(CLOSE_LOCATIONS_VALUE) loc
  1955.      */
  1956.     private boolean nobodyIsClose(Location loc) {
  1957.         for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  1958.             Location playerLoc = iFPlayer.getPlayer().getLoc();
  1959.             if (Math.abs(playerLoc.getX() - loc.getX()) <= CLOSE_LOCATIONS_VALUE)
  1960.                 return false;
  1961.             if (Math.abs(playerLoc.getY() - loc.getY()) <= CLOSE_LOCATIONS_VALUE)
  1962.                 return false;
  1963.         }
  1964.         return true;
  1965.     }
  1966.  
  1967.     /**
  1968.      * Checking every REGISTERED_PLAYERS if he meets criteria
  1969.      */
  1970.     private void checkIfRegisteredMeetCriteria() {
  1971.         for (FightClubPlayer iFPlayer : getPlayers(REGISTERED_PLAYERS)) {
  1972.             checkIfRegisteredPlayerMeetCriteria(iFPlayer);
  1973.         }
  1974.     }
  1975.  
  1976.     /**
  1977.      * If he doesn't, unregistering player
  1978.      *
  1979.      * @param fPlayer
  1980.      * @return player meets criteria
  1981.      */
  1982.     private boolean checkIfRegisteredPlayerMeetCriteria(FightClubPlayer fPlayer) {
  1983.         if (!FightClubEventManager.getInstance().canPlayerParticipate(fPlayer.getPlayer(), true, true)) {
  1984.             return false;
  1985.         } else {
  1986.             return true;
  1987.         }
  1988.     }
  1989.  
  1990.     /**
  1991.      * Removing all debuffs
  1992.      *
  1993.      * @param playable
  1994.      */
  1995.     private void cancelNegativeEffects(Playable playable) {
  1996.         List<Effect> _buffList = new ArrayList<Effect>();
  1997.  
  1998.         for (Effect e : playable.getEffectList().getAllEffects()) {
  1999.             if (e.isOffensive() && e.isCancelable())
  2000.                 _buffList.add(e);
  2001.         }
  2002.  
  2003.         for (Effect e : _buffList) {
  2004.             e.exit();
  2005.         }
  2006.     }
  2007.  
  2008.     /**
  2009.      * @param classes
  2010.      *            like TANKS;DAMAGE_DEALERS
  2011.      * @return array of CLASS_TYPES
  2012.      */
  2013.     private CLASSES[] parseExcludedClasses(String classes) {
  2014.         if (classes.equals(""))
  2015.             return new CLASSES[0];
  2016.  
  2017.         String[] classType = classes.split(";");
  2018.         CLASSES[] realTypes = new CLASSES[classType.length];
  2019.  
  2020.         for (int i = 0; i < classType.length; i++)
  2021.             realTypes[i] = CLASSES.valueOf(classType[i]);
  2022.  
  2023.         return realTypes;
  2024.     }
  2025.  
  2026.     protected int[] parseExcludedSkills(String ids) {
  2027.         if (ids == null || ids.isEmpty())
  2028.             return null;
  2029.         StringTokenizer st = new StringTokenizer(ids, ";");
  2030.         int[] realIds = new int[st.countTokens()];
  2031.         int index = 0;
  2032.         while (st.hasMoreTokens()) {
  2033.             realIds[index] = Integer.parseInt(st.nextToken());
  2034.             index++;
  2035.         }
  2036.         return realIds;
  2037.     }
  2038.  
  2039.     private int[][] parseAutoStartTimes(String times) {
  2040.         if (times == null || times.isEmpty())
  2041.             return null;
  2042.  
  2043.         StringTokenizer st = new StringTokenizer(times, ",");
  2044.         int[][] realTimes = new int[st.countTokens()][2];
  2045.         int index = 0;
  2046.         while (st.hasMoreTokens()) {
  2047.             String[] hourMin = st.nextToken().split(":");
  2048.             int[] realHourMin = { Integer.parseInt(hourMin[0]), Integer.parseInt(hourMin[1]) };
  2049.             realTimes[index] = realHourMin;
  2050.             index++;
  2051.         }
  2052.         return realTimes;
  2053.     }
  2054.  
  2055.     private int[][] parseBuffs(String buffs) {
  2056.         if (buffs == null || buffs.isEmpty())
  2057.             return null;
  2058.  
  2059.         StringTokenizer st = new StringTokenizer(buffs, ";");
  2060.         int[][] realBuffs = new int[st.countTokens()][2];
  2061.         int index = 0;
  2062.         while (st.hasMoreTokens()) {
  2063.             String[] skillLevel = st.nextToken().split(",");
  2064.             int[] realHourMin = { Integer.parseInt(skillLevel[0]), Integer.parseInt(skillLevel[1]) };
  2065.             realBuffs[index] = realHourMin;
  2066.             index++;
  2067.         }
  2068.         return realBuffs;
  2069.     }
  2070.  
  2071.     /**
  2072.      * Stops: {5, 15, 30, 60, 300, 600, 900}
  2073.      *
  2074.      * @param totalLeftTimeInSeconds
  2075.      * @return
  2076.      */
  2077.     private int getTimeToWait(int totalLeftTimeInSeconds) {
  2078.         int toWait = 1;
  2079.  
  2080.         int[] stops = { 5, 15, 30, 60, 300, 600, 900 };
  2081.  
  2082.         for (int stop : stops)
  2083.             if (totalLeftTimeInSeconds > stop)
  2084.                 toWait = stop;
  2085.  
  2086.         return toWait;
  2087.     }
  2088.  
  2089.     /**
  2090.      * Thread that adds Seconds spent on event to every fPlayer
  2091.      */
  2092.     private class TimeSpentOnEventThread extends RunnableImpl {
  2093.         @Override
  2094.         public void runImpl() {
  2095.             if (_state == EVENT_STATE.STARTED) {
  2096.                 for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  2097.                     if (iFPlayer.getPlayer() == null || !iFPlayer.getPlayer().isOnline())
  2098.                         continue;
  2099.  
  2100.                     if (iFPlayer.isAfk())
  2101.                         continue;
  2102.  
  2103.                     iFPlayer.incSecondsSpentOnEvent(10);
  2104.                 }
  2105.             }
  2106.  
  2107.             if (_state != EVENT_STATE.NOT_ACTIVE)
  2108.                 ThreadPoolManager.getInstance().schedule(new TimeSpentOnEventThread(), 10 * 1000);
  2109.         }
  2110.     }
  2111.  
  2112.     private class LeftZoneThread extends RunnableImpl {
  2113.         @Override
  2114.         public void runImpl() {
  2115.             List<FightClubPlayer> toDelete = new ArrayList<>();
  2116.             Say2 packet = new Say2(0, ChatType.COMMANDCHANNEL_ALL, "Error", "Go Back To Event Zone!");
  2117.  
  2118.             for (Entry<FightClubPlayer, Zone> entry : _leftZone.entrySet()) {
  2119.                 Player player = entry.getKey().getPlayer();
  2120.                 if (player == null || !player.isOnline() || _state == EVENT_STATE.NOT_ACTIVE
  2121.                         || entry.getValue().checkIfInZone(player) || player.isDead() || player.isTeleporting()) {
  2122.                     toDelete.add(entry.getKey());
  2123.                     continue;
  2124.                 }
  2125.  
  2126.                 int power = (int) Math.max(400, entry.getValue().findDistanceToZone(player, true) - 4000);
  2127.  
  2128.                 player.sendPacket(new Earthquake(player.getLoc(), power, 5));
  2129.                 player.sendPacket(packet);
  2130.                 entry.getKey().increaseSecondsOutsideZone();
  2131.  
  2132.                 if (entry.getKey().getSecondsOutsideZone() >= TIME_MAX_SECONDS_OUTSIDE_ZONE) {
  2133.                     player.doDie(null);
  2134.                     toDelete.add(entry.getKey());
  2135.                     entry.getKey().clearSecondsOutsideZone();
  2136.                 }
  2137.             }
  2138.  
  2139.             for (FightClubPlayer playerToDelete : toDelete) {
  2140.                 if (playerToDelete != null) {
  2141.                     _leftZone.remove(playerToDelete);
  2142.                     playerToDelete.clearSecondsOutsideZone();
  2143.                 }
  2144.             }
  2145.  
  2146.             if (_state != EVENT_STATE.NOT_ACTIVE)
  2147.                 ThreadPoolManager.getInstance().schedule(this, 1000L);
  2148.         }
  2149.     }
  2150.  
  2151.     protected boolean isAfkTimerStopped(Player player) {
  2152.         return player.isDead() && !_ressAllowed && _respawnTime <= 0;
  2153.     }
  2154.  
  2155.     private class CheckAfkThread extends RunnableImpl {
  2156.         @Override
  2157.         public void runImpl() {
  2158.             long currentTime = System.currentTimeMillis();
  2159.             for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  2160.                 Player player = iFPlayer.getPlayer();
  2161.                 boolean isAfk = (player.getLastNotAfkTime() + TIME_TO_BE_AFK * 1000) < currentTime;
  2162.  
  2163.                 if (isAfkTimerStopped(player))// Cannot do any actions, doesn't
  2164.                                                 // mean he is afk
  2165.                     continue;
  2166.  
  2167.                 if (iFPlayer.isAfk()) {
  2168.                     if (!isAfk) {
  2169.                         handleAfk(iFPlayer, false);// Just came back from afk
  2170.                     } else if (_state != EVENT_STATE.OVER) {
  2171.                         sendMessageToPlayer(player, MESSAGE_TYPES.CRITICAL, "You are in AFK mode!");
  2172.                     }
  2173.                 } else if (_state == EVENT_STATE.NOT_ACTIVE) {
  2174.                     handleAfk(iFPlayer, false);
  2175.                 } else if (isAfk) {
  2176.                     handleAfk(iFPlayer, true);// Just started to be afk
  2177.                 }
  2178.             }
  2179.  
  2180.             if (getState() != EVENT_STATE.NOT_ACTIVE) {
  2181.                 ThreadPoolManager.getInstance().schedule(this, 1000);
  2182.             } else {
  2183.                 for (FightClubPlayer iFPlayer : getPlayers(FIGHTING_PLAYERS)) {
  2184.                     if (iFPlayer.isAfk())
  2185.                         handleAfk(iFPlayer, false);
  2186.                 }
  2187.             }
  2188.         }
  2189.     }
  2190.  
  2191.     private class BestTeamComparator implements Comparator<FightClubTeam>, Serializable {
  2192.         private static final long serialVersionUID = -7744947898101934099L;
  2193.         private final boolean _scoreNotKills;
  2194.  
  2195.         private BestTeamComparator(boolean scoreNotKills) {
  2196.             _scoreNotKills = scoreNotKills;
  2197.         }
  2198.  
  2199.         @Override
  2200.         public int compare(FightClubTeam o1, FightClubTeam o2) {
  2201.             if (_scoreNotKills)
  2202.                 return Integer.compare(o2.getScore(), o1.getScore());
  2203.             else {
  2204.                 return Integer.compare(getTeamTotalKills(o2), getTeamTotalKills(o1));
  2205.             }
  2206.         }
  2207.     }
  2208.  
  2209.     private static class BestPlayerComparator implements Comparator<FightClubPlayer>, Serializable {
  2210.         private static final long serialVersionUID = -7889180585474342293L;
  2211.         private final boolean _scoreNotKills;
  2212.  
  2213.         private BestPlayerComparator(boolean scoreNotKills) {
  2214.             _scoreNotKills = scoreNotKills;
  2215.         }
  2216.  
  2217.         @Override
  2218.         public int compare(FightClubPlayer arg0, FightClubPlayer arg1) {
  2219.             if (_scoreNotKills)
  2220.                 return Integer.compare(arg1.getScore(), arg0.getScore());
  2221.             else
  2222.                 return Integer.compare(arg1.getKills(true), arg0.getKills(true));
  2223.         }
  2224.     }
  2225.  
  2226.     // ===============================================================================================================
  2227.     // Event Timers
  2228.     // ===============================================================================================================
  2229.  
  2230.     /**
  2231.      * Big Timer - Waiting for first players, later registered teleporting to
  2232.      * event
  2233.      *
  2234.      * @param eventObjId
  2235.      * @param secondsLeft
  2236.      * @return
  2237.      */
  2238.     @Deprecated
  2239.     public static boolean teleportWholeRoomTimer(int eventObjId, int secondsLeft) {
  2240.         AbstractFightClub event = FightClubEventManager.getInstance().getEventByObjId(eventObjId);
  2241.         if (secondsLeft == 0) {
  2242.             event._dontLetAnyoneIn = true;
  2243.             event.startEvent();
  2244.         } else {
  2245.             event.checkIfRegisteredMeetCriteria();
  2246.             event.sendMessageToRegistered(MESSAGE_TYPES.SCREEN_BIG,
  2247.                     "You are going to be teleported in " + getFixedTime(secondsLeft) + "!");
  2248.         }
  2249.         return true;
  2250.     }
  2251.  
  2252.     /**
  2253.      * Big Timer - Starting round timer
  2254.      *
  2255.      * @param eventObjId
  2256.      * @param secondsLeft
  2257.      * @return
  2258.      */
  2259.     @Deprecated
  2260.     public static boolean startRoundTimer(int eventObjId, int secondsLeft) {
  2261.         AbstractFightClub event = FightClubEventManager.getInstance().getEventByObjId(eventObjId);
  2262.  
  2263.         if (secondsLeft > 0) {
  2264.             String firstWord;
  2265.             if (event.isRoundEvent())
  2266.                 firstWord = ((event.getCurrentRound() + 1) == event.getTotalRounds() ? "Last"
  2267.                         : ROUND_NUMBER_IN_STRING[event.getCurrentRound() + 1]) + " Round";
  2268.             else
  2269.                 firstWord = "Match";
  2270.             String message = firstWord + " is going to start in " + getFixedTime(secondsLeft) + "!";
  2271.             event.sendMessageToFighting(MESSAGE_TYPES.SCREEN_BIG, message, true);
  2272.         } else
  2273.             event.startRound();
  2274.  
  2275.         return true;
  2276.     }
  2277.  
  2278.     /**
  2279.      * Big timer - Watching when event ends
  2280.      *
  2281.      * @param eventObjId
  2282.      * @param secondsLeft
  2283.      * @return
  2284.      */
  2285.     @Deprecated
  2286.     public static boolean endRoundTimer(int eventObjId, int secondsLeft) {
  2287.         AbstractFightClub event = FightClubEventManager.getInstance().getEventByObjId(eventObjId);
  2288.         if (secondsLeft > 0)
  2289.             event.sendMessageToFighting(MESSAGE_TYPES.SCREEN_BIG, (!event.isLastRound() ? "Round" : "Match")
  2290.                     + " is going to be Over in " + getFixedTime(secondsLeft) + "!", false);
  2291.         else
  2292.             event.endRound();
  2293.  
  2294.         return true;
  2295.     }
  2296.  
  2297.     /**
  2298.      * Small timer - shutdown
  2299.      *
  2300.      * @param eventObjId
  2301.      * @param secondsLeft
  2302.      * @return
  2303.      */
  2304.     @Deprecated
  2305.     public static boolean shutDownTimer(int eventObjId, int secondsLeft) {
  2306.         AbstractFightClub event = FightClubEventManager.getInstance().getEventByObjId(eventObjId);
  2307.  
  2308.         if (!FightClubEventManager.getInstance().serverShuttingDown()) {
  2309.             event._dontLetAnyoneIn = false;
  2310.             return false;
  2311.         }
  2312.  
  2313.         if (secondsLeft < 180) {
  2314.             // Check to make it just once
  2315.             if (!event._dontLetAnyoneIn) {
  2316.                 event.sendMessageToRegistered(MESSAGE_TYPES.CRITICAL,
  2317.                         "You are no longer registered because of Shutdown!");
  2318.                 for (FightClubPlayer player : event.getPlayers(REGISTERED_PLAYERS)) {
  2319.                     event.unregister(player.getPlayer());
  2320.                 }
  2321.                 event.getObjects(REGISTERED_PLAYERS).clear();
  2322.                 event._dontLetAnyoneIn = true;
  2323.             }
  2324.         }
  2325.  
  2326.         if (secondsLeft < 60) {
  2327.             event._timer.cancel(false);
  2328.             event.sendMessageToFighting(MESSAGE_TYPES.CRITICAL, "Event ended because of Shutdown!", false);
  2329.             event.setState(EVENT_STATE.OVER);
  2330.             event.stopEvent();
  2331.  
  2332.             event._dontLetAnyoneIn = false;
  2333.             return false;
  2334.         }
  2335.         return true;
  2336.     }
  2337.  
  2338.     /**
  2339.      * Small Timer - Teleporting player back from the event. Remove him from
  2340.      * players list before
  2341.      *
  2342.      * @param eventObjId
  2343.      * @param secondsLeft
  2344.      * @param player
  2345.      * @return
  2346.      */
  2347.     @Deprecated
  2348.     public static boolean teleportBackSinglePlayerTimer(int eventObjId, int secondsLeft, Player player) {
  2349.         AbstractFightClub event = FightClubEventManager.getInstance().getEventByObjId(eventObjId);
  2350.  
  2351.         if (player == null || !player.isOnline())
  2352.             return false;
  2353.  
  2354.         if (secondsLeft > 0)
  2355.             event.sendMessageToPlayer(player, MESSAGE_TYPES.SCREEN_BIG,
  2356.                     "You are going to be teleported back in " + getFixedTime(secondsLeft) + "!");
  2357.         else {
  2358.             event.teleportBackToTown(player);
  2359.         }
  2360.  
  2361.         return true;
  2362.     }
  2363.  
  2364.     /**
  2365.      * Small Timer - Ressurecting player
  2366.      *
  2367.      * @param eventObjId
  2368.      * @param secondsLeft
  2369.      * @param fPlayer
  2370.      * @return
  2371.      */
  2372.     @Deprecated
  2373.     public static boolean ressurectionTimer(int eventObjId, int secondsLeft, FightClubPlayer fPlayer) {
  2374.         AbstractFightClub event = FightClubEventManager.getInstance().getEventByObjId(eventObjId);
  2375.         Player player = fPlayer.getPlayer();
  2376.  
  2377.         if (player == null || !player.isOnline() || !player.isDead())
  2378.             return false;
  2379.  
  2380.         if (secondsLeft > 0)
  2381.             player.sendMessage("Respawn in " + getFixedTime(secondsLeft) + "!");
  2382.         else {
  2383.             event.hideScores(player);
  2384.             event.teleportSinglePlayer(fPlayer, false, true);
  2385.         }
  2386.         return true;
  2387.     }
  2388.  
  2389.     /**
  2390.      * Small Timer - Making player visible again
  2391.      *
  2392.      * @param eventObjId
  2393.      * @param secondsLeft
  2394.      * @param fPlayer
  2395.      * @param sendMessages
  2396.      * @return
  2397.      */
  2398.     @Deprecated
  2399.     public static boolean setInvisible(int eventObjId, int secondsLeft, FightClubPlayer fPlayer, boolean sendMessages) {
  2400.         AbstractFightClub event = FightClubEventManager.getInstance().getEventByObjId(eventObjId);
  2401.         if (fPlayer.getPlayer() == null || !fPlayer.getPlayer().isOnline())
  2402.             return false;
  2403.  
  2404.         if (secondsLeft > 0) {
  2405.             if (sendMessages)
  2406.                 event.sendMessageToPlayer(fPlayer, MESSAGE_TYPES.SCREEN_BIG,
  2407.                         "Visible in " + getFixedTime(secondsLeft) + "!");
  2408.         } else {
  2409.             if (sendMessages && event.getState() == EVENT_STATE.STARTED)
  2410.                 event.sendMessageToPlayer(fPlayer, MESSAGE_TYPES.SCREEN_BIG, "Fight!");
  2411.             event.stopInvisibility(fPlayer.getPlayer());
  2412.         }
  2413.         return true;
  2414.  
  2415.     }
  2416.  
  2417.     /**
  2418.      * Starting new Small or Big timer
  2419.      *
  2420.      * @param saveAsMainTimer
  2421.      * @param firstWaitingTimeInMilis
  2422.      * @param methodName
  2423.      * @param args
  2424.      * @saveAsMainTimer - should it be save to _timer?
  2425.      * @firstWaitingTimeInMilis - time before sending first msg
  2426.      * @methodName - name of the method that will be run, between every sleep
  2427.      *             and at the end
  2428.      * @args - arguments that method takes(except int eventObjId)
  2429.      */
  2430.     public void startNewTimer(boolean saveAsMainTimer, int firstWaitingTimeInMilis, String methodName, Object... args) {
  2431.         ScheduledFuture<?> timer = ThreadPoolManager.getInstance()
  2432.                 .schedule(new SmartTimer(methodName, saveAsMainTimer, args), firstWaitingTimeInMilis);
  2433.  
  2434.         if (saveAsMainTimer)
  2435.             _timer = timer;
  2436.     }
  2437.  
  2438.     private class SmartTimer extends RunnableImpl {
  2439.         private final String _methodName;
  2440.         private final Object[] _args;
  2441.         private final boolean _saveAsMain;
  2442.  
  2443.         private SmartTimer(String methodName, boolean saveAsMainTimer, Object... args) {
  2444.             _methodName = methodName;
  2445.  
  2446.             Object[] changedArgs = new Object[args.length + 1];
  2447.             changedArgs[0] = getObjectId();
  2448.             for (int i = 0; i < args.length; i++)
  2449.                 changedArgs[i + 1] = args[i];
  2450.             _args = changedArgs;
  2451.             _saveAsMain = saveAsMainTimer;
  2452.         }
  2453.  
  2454.         @Override
  2455.         public void runImpl() {
  2456.             // Preparing parameters
  2457.             Class<?>[] parameterTypes = new Class<?>[_args.length];
  2458.             for (int i = 0; i < _args.length; i++)
  2459.                 parameterTypes[i] = _args[i] != null ? _args[i].getClass() : null;
  2460.  
  2461.             int waitingTime = (int) _args[1];
  2462.  
  2463.             try {
  2464.                 Object ret = MethodUtils.invokeMethod(AbstractFightClub.this, _methodName, _args, parameterTypes);
  2465.  
  2466.                 if ((boolean) ret == false)
  2467.                     return;
  2468.             } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
  2469.                 e.printStackTrace();
  2470.             }
  2471.  
  2472.             if (waitingTime > 0) {
  2473.                 int toWait = getTimeToWait(waitingTime);
  2474.  
  2475.                 waitingTime -= toWait;
  2476.  
  2477.                 _args[1] = waitingTime;
  2478.  
  2479.                 ScheduledFuture<?> timer = ThreadPoolManager.getInstance().schedule(this, toWait * 1000);
  2480.  
  2481.                 if (_saveAsMain)
  2482.                     _timer = timer;
  2483.             } else
  2484.                 return;
  2485.         }
  2486.     }
  2487.  
  2488.     @Override
  2489.     public void reCalcNextTime(boolean onInit) {
  2490.         clearActions();
  2491.  
  2492.         registerActions();
  2493.     }
  2494.  
  2495.     @Override
  2496.     protected long startTimeMillis() {
  2497.         return 0;
  2498.     }
  2499.  
  2500.     @Override
  2501.     public void onAddEvent(GameObject o) {
  2502.         if (o.isPlayer()) {
  2503.             o.getPlayer().addListener(_exitListener);
  2504.         }
  2505.     }
  2506.  
  2507.     @Override
  2508.     public void onRemoveEvent(GameObject o) {
  2509.         if (o.isPlayer()) {
  2510.             o.getPlayer().removeListener(_exitListener);
  2511.         }
  2512.     }
  2513.  
  2514.     @Override
  2515.     public boolean isInProgress() {
  2516.         return _state != EVENT_STATE.NOT_ACTIVE;
  2517.     }
  2518.  
  2519.     // Enum especial que contiene muchos sorts para los pjs y una funcion para
  2520.     // hacer sorting encadenado
  2521.     public static enum PlayerComparator implements Comparator<Player> {
  2522.         LEVEL_SORT {
  2523.             @Override
  2524.             public int compare(Player left, Player right) {
  2525.                 if (left == null || right == null)
  2526.                     return 0;
  2527.  
  2528.                 return Integer.valueOf(left.getLevel()).compareTo(right.getLevel());
  2529.             }
  2530.         },
  2531.         CLASS_SORT {
  2532.             @Override
  2533.             public int compare(Player left, Player right) {
  2534.                 if (left == null || right == null)
  2535.                     return 0;
  2536.  
  2537.                 return Integer.valueOf(left.getClassId().getType2().ordinal())
  2538.                         .compareTo(right.getClassId().getType2().ordinal());
  2539.             }
  2540.         };
  2541.  
  2542.         // Este comparador funciona como un comparador encadenado, donde si es
  2543.         // igual se sigue al proximo y asi hasta lograr un resultado
  2544.         public static Comparator<Player> getComparator(final PlayerComparator... multipleOptions) {
  2545.             return new Comparator<Player>() {
  2546.                 @Override
  2547.                 public int compare(Player o1, Player o2) {
  2548.                     for (PlayerComparator option : multipleOptions) {
  2549.                         int result = option.compare(o1, o2);
  2550.                         if (result != 0) {
  2551.                             return result;
  2552.                         }
  2553.                     }
  2554.                     return 0;
  2555.                 }
  2556.             };
  2557.         }
  2558.     }
  2559. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement