Guest User

Untitled

a guest
Jul 5th, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 31.17 KB | None | 0 0
  1. package events.TvT;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import javolution.util.FastMap;
  7. import l2r.gameserver.Announcements;
  8. import l2r.gameserver.ThreadPoolManager;
  9. import l2r.gameserver.ai.CtrlEvent;
  10. import l2r.gameserver.data.xml.holder.InstantZoneHolder;
  11. import l2r.gameserver.data.xml.holder.ItemHolder;
  12. import l2r.gameserver.instancemanager.ReflectionManager;
  13. import l2r.gameserver.listener.actor.player.OnPlayerExitListener;
  14. import l2r.gameserver.model.Creature;
  15. import l2r.gameserver.model.Effect;
  16. import l2r.gameserver.model.GameObjectsStorage;
  17. import l2r.gameserver.model.Player;
  18. import l2r.gameserver.model.Skill;
  19. import l2r.gameserver.model.Summon;
  20. import l2r.gameserver.model.base.ClassId;
  21. import l2r.gameserver.model.entity.Reflection;
  22. import l2r.gameserver.model.entity.events.GameEvent;
  23. import l2r.gameserver.model.entity.events.GameEventManager;
  24. import l2r.gameserver.model.entity.olympiad.Olympiad;
  25. import l2r.gameserver.model.instances.DoorInstance;
  26. import l2r.gameserver.model.items.ItemInstance;
  27. import l2r.gameserver.network.serverpackets.ChangeWaitType;
  28. import l2r.gameserver.network.serverpackets.ExShowScreenMessage;
  29. import l2r.gameserver.network.serverpackets.Revive;
  30. import l2r.gameserver.network.serverpackets.components.ChatType;
  31. import l2r.gameserver.network.serverpackets.components.CustomMessage;
  32. import l2r.gameserver.scripts.ScriptFile;
  33. import l2r.gameserver.skills.effects.EffectTemplate;
  34. import l2r.gameserver.stats.Env;
  35. import l2r.gameserver.tables.SkillTable;
  36. import l2r.gameserver.templates.InstantZone;
  37. import l2r.gameserver.utils.GArray;
  38. import l2r.gameserver.utils.Location;
  39. import l2r.gameserver.utils.Strings;
  40.  
  41. import org.apache.commons.lang3.ArrayUtils;
  42. import org.slf4j.Logger;
  43. import org.slf4j.LoggerFactory;
  44.  
  45. public class TvT extends GameEvent implements ScriptFile, OnPlayerExitListener
  46. {
  47.     private int _state = 0;
  48.     private static TvT _instance;
  49.     private static final Logger _log = LoggerFactory.getLogger(TvT.class);
  50.  
  51.     private FastMap<Player, Integer> _participants = new FastMap<Player, Integer>();
  52.     private FastMap<Player, List<Effect>> returnBuffs = new FastMap<Player, List<Effect>>();
  53.     private List<Effect> _effects;
  54.     private FastMap<Player, Integer> live_list = new FastMap<Player, Integer>();
  55.     private int[] _score;
  56.     private int curr_round = 1;
  57.  
  58.     public long startBattle = 0;
  59.     private Reflection _ref;
  60.     private InstantZone _instantZone;
  61.  
  62.     public TvT()
  63.     {
  64.         _instance = this;
  65.     }
  66.  
  67.     public static TvT getInstance()
  68.     {
  69.         if (_instance == null)
  70.             _instance = new TvT();
  71.         return _instance;
  72.     }
  73.  
  74.     @Override
  75.     public int getState()
  76.     {
  77.         return _state;
  78.     }
  79.  
  80.     @Override
  81.     public String getName()
  82.     {
  83.         return "TvT";
  84.     }
  85.  
  86.     public long getNextTime()
  87.     {
  88.         long next_time = getConfigs().START_TIME;
  89.  
  90.         while (next_time <= System.currentTimeMillis() / 1000)
  91.         {
  92.             getConfigs().START_TIME += 86400;
  93.             setNextEvent();
  94.             next_time = getConfigs().START_TIME;
  95.         }
  96.  
  97.         return next_time;
  98.     }
  99.  
  100.     public void setNextEvent()
  101.     {
  102.         if (TvTConfig._configs != null && TvTConfig._configs.size() > 1)
  103.         {
  104.             TvTConfig._configs.sort();
  105.         }
  106.     }
  107.  
  108.     public Configs getConfigs()
  109.     {
  110.         return TvTConfig._configs == null ? null : TvTConfig._configs.get(0);
  111.     }
  112.  
  113.     @Override
  114.     public boolean canUseItem(Player actor, ItemInstance item)
  115.     {
  116.         if(_state == 2)
  117.         {
  118.             if((item.isHeroWeapon() && !getConfigs().ALLOW_HERO_WEAPONS) || ArrayUtils.contains(getConfigs().getRestictId(), item.getItemId()))
  119.             {
  120.                 actor.sendMessage(actor.isLangRus() ? "Запрещено использовать во время ивентов." : "You may not use during the events.");
  121.                 return false;
  122.             }
  123.         }
  124.         return true;
  125.     }
  126.  
  127.     @Override
  128.     public void onLoad()
  129.     {
  130.         TvTConfig.load();
  131.         GameEventManager.getInstance().registerEvent(getInstance());
  132.         _log.info("Loaded Event: TvT");
  133.         _state = 0;
  134.     }
  135.  
  136.     @Override
  137.     public void onReload()
  138.     {
  139.         if (_ref != null)
  140.             _ref.clearReflection(1, false);
  141.         if (TvTConfig._configs.size() > 0)
  142.             TvTConfig._configs.clear();
  143.         if (_state != 0)
  144.             finish();
  145.         onLoad();
  146.     }
  147.  
  148.     @Override
  149.     public void onShutdown()
  150.     {
  151.         _state = 0;
  152.     }
  153.  
  154.     @Override
  155.     public boolean register(Player player)
  156.     {
  157.         if (!canRegister(player, true))
  158.             return false;
  159.  
  160.         player.setPvPTeam(TeamWithMinPlayers());
  161.         _participants.put(player, 0);
  162.         player.sendMessage(new CustomMessage("scripts.events.TvT.TvT.YouRegistred", player, new Object[0]));
  163.         player._event = this;
  164.         return true;
  165.     }
  166.  
  167.     public void addPlayer()
  168.     {
  169.         registerPlayer();
  170.     }
  171.  
  172.     public void registerPlayer()
  173.     {
  174.         Player player = getSelf();
  175.         GameEvent event = GameEventManager.getInstance().findEvent("TvT");
  176.         event.register(player);
  177.     }
  178.  
  179.     @Override
  180.     public void unreg(Player player)
  181.     {
  182.         if (player == null)
  183.             return;
  184.  
  185.         if (_state == 2 || !isParticipant(player))
  186.         {
  187.             player.sendMessage(new CustomMessage("scripts.events.TvT.TvT.YouCancelRegistration", player, new Object[0]));
  188.             return;
  189.         }
  190.         _participants.remove(player);
  191.         player._event = null;
  192.         player.setPvPTeam(0);
  193.         player.allowPvPTeam();
  194.         player.sendMessage(new CustomMessage("scripts.events.TvT.TvT.YouRegistrationCanceled", player, new Object[0]));
  195.     }
  196.  
  197.     @Override
  198.     public void remove(Player player)
  199.     {
  200.         if (player == null)
  201.             return;
  202.  
  203.         if (_participants.containsKey(player))
  204.             _participants.remove(player);
  205.         if (live_list.containsKey(player))
  206.             live_list.remove(player);
  207.         player.setPvPTeam(0);
  208.         player.allowPvPTeam();
  209.         player._event = null;
  210.         player.sendMessage(new CustomMessage("scripts.events.TvT.TvT.YouDisqualified", player, new Object[0]));
  211.     }
  212.  
  213.     public boolean canRegister(Player player, boolean first)
  214.     {
  215.         if (getConfigs().ALLOW_TAKE_ITEM)
  216.         {
  217.             long take_item_count = getItemCount(player, getConfigs().TAKE_ITEM_ID);
  218.             String name_take_items = ItemHolder.getInstance().getTemplate(getConfigs().TAKE_ITEM_ID).getName();
  219.             if(take_item_count > 0)
  220.             {
  221.                 if((int)take_item_count < getConfigs().TAKE_COUNT)
  222.                 {
  223.                     player.sendMessage("Недостаточно" + name_take_items + "для участия.");
  224.                     return false;
  225.                 }
  226.             }
  227.             else
  228.             {
  229.                 player.sendMessage("У Вас нет " + name_take_items + ", требуется для участия.");
  230.                 return false;
  231.             }
  232.         }
  233.         if (first && _state != 1)
  234.         {
  235.             player.sendMessage("Процесс регистрации не активен.");
  236.             return false;
  237.         }
  238.         if (first && isParticipant(player))
  239.         {
  240.             player.sendMessage("Вы уже являетесь участником этого эвента.");
  241.             return false;
  242.         }
  243.         if (player.isMounted())
  244.         {
  245.             player.sendMessage("Отзовите питомца.");
  246.             return false;
  247.         }
  248.         if (player.isInDuel())
  249.         {
  250.             player.sendMessage("Вы должны завершить дуель.");
  251.             return false;
  252.         }
  253.         if (player.getLevel() < getConfigs().MIN_LEVEL || player.getLevel() > getConfigs().MAX_LEVEL)
  254.         {
  255.             player.sendMessage("Вы не подходите для участия в эвенте с таким уровнем.");
  256.             return false;
  257.         }
  258.         if (first && player._event != null)
  259.         {
  260.             player.sendMessage("Вы уже зарегестрированы на другом эвенте.");
  261.             return false;
  262.         }
  263.         if (player.isInOlympiadMode() || Olympiad.isRegistered(player))
  264.         {
  265.             player.sendMessage("Вы уже зарегестрированы на Олимпиаде.");
  266.             return false;
  267.         }
  268.         if (player.isInParty() && player.getParty().isInDimensionalRift())
  269.         {
  270.             player.sendMessage("Вы уже зарегестрированы на другом эвенте.");
  271.             return false;
  272.         }
  273.         if (player.isTeleporting())
  274.         {
  275.             player.sendMessage("Вы находитесь в процессе телепортации.");
  276.             return false;
  277.         }
  278.         if (first && _participants.size() >= getConfigs().MAX_PARTICIPANTS)
  279.         {
  280.             player.sendMessage("Достигнуто максимальное кол-во участников.");
  281.             return false;
  282.         }
  283.         if (player.isCursedWeaponEquipped())
  284.         {
  285.             player.sendMessage("С проклятым оружием на эвент нельзя.");
  286.             return false;
  287.         }
  288.         if (player.getKarma() > 0)
  289.         {
  290.             player.sendMessage("PK не может учавствовать в эвенте.");
  291.             return false;
  292.         }
  293.         return true;
  294.     }
  295.  
  296.     public boolean canTeleport(Player player)
  297.     {
  298.         if(player.isCursedWeaponEquipped())
  299.         {
  300.             player.sendMessage("С проклятым оружием на эвент нельзя.");
  301.             return false;
  302.         }
  303.         if(player.getKarma() > 0)
  304.         {
  305.             player.sendMessage("PK не может учавствовать в эвенте.");
  306.             return false;
  307.         }
  308.         return true;
  309.     }
  310.  
  311.     public void question()
  312.     {
  313.         for(Player player : GameObjectsStorage.getAllPlayersForIterate())
  314.         {
  315.             if(player != null && ((player.getLevel() >= getConfigs().MIN_LEVEL && player.getLevel() <= getConfigs().MAX_LEVEL) || player.getReflection().getId() <= 0 || !player.isInOlympiadMode() || !Olympiad.isRegistered(player) || !player.isInOfflineMode()))
  316.             {
  317.                 player.scriptRequest(new CustomMessage("scripts.events.TvT.TvT.AskPlayer", player).toString(), "events.TvT.TvT:registerPlayer", new Object[0]);
  318.             }
  319.         }
  320.     }
  321.  
  322.     public int getCountPlayers()
  323.     {
  324.         return _participants.size();
  325.     }
  326.  
  327.     public void canRegisters()
  328.     {
  329.         if (_participants != null)
  330.             for (Player player : _participants.keySet())
  331.                 if (!canRegister(player, false))
  332.                     player.sendMessage("Если все условия не будут соблюдены - вы будите дисквалифицированы");
  333.     }
  334.  
  335.     @Override
  336.     public boolean isParticipant(Player player)
  337.     {
  338.         return _participants.containsKey(player);
  339.     }
  340.  
  341.     public int TeamWithMinPlayers()
  342.     {
  343.         int[] count = new int[getConfigs().TEAM_COUNTS + 1];
  344.  
  345.         for (Player player : _participants.keySet())
  346.         {
  347.             count[player.getPvPTeam()] += 1;
  348.         }
  349.         int min = count[1];
  350.  
  351.         for (int i = 1; i < count.length; i++)
  352.             min = Math.min(min, count[i]);
  353.         for (int i = 1; i < count.length; i++)
  354.         {
  355.             if (count[i] != min)
  356.                 continue;
  357.             min = i;
  358.         }
  359.         return min;
  360.     }
  361.  
  362.     public void sayToAll(String adress, String[] replacements, boolean all)
  363.     {
  364.         if (all)
  365.             Announcements.getInstance().announceByCustomMessage(adress, replacements, ChatType.CRITICAL_ANNOUNCE);
  366.         else
  367.             for (Player player : _participants.keySet())
  368.                 Announcements.getInstance().announceToPlayerByCustomMessage(player, adress, replacements, ChatType.CRITICAL_ANNOUNCE);
  369.     }
  370.  
  371.     public void startRegistration()
  372.     {
  373.         _state = 1;
  374.         sayToAll("scripts.events.TvT.TvT.AnnounceRegistrationStarted", new String[] { getName(),  "" + getConfigs().MIN_LEVEL, "" + getConfigs().MAX_LEVEL }, true);
  375.         question();
  376.        
  377.         _score = new int[getConfigs().TEAM_COUNTS + 1];
  378.  
  379.         if (getConfigs().TIME_TO_START_BATTLE >= 30)
  380.             ThreadPoolManager.getInstance().schedule(new StartMessages("scripts.events.TvT.TvT.EventStartOver", new String[] { "30" }), (getConfigs().TIME_TO_START_BATTLE - 30) * 1000);
  381.         if (getConfigs().TIME_TO_START_BATTLE >= 10)
  382.             ThreadPoolManager.getInstance().schedule(new StartMessages("scripts.events.TvT.TvT.EventStartOver", new String[] { "10" }), (getConfigs().TIME_TO_START_BATTLE - 10) * 1000);
  383.         for (int i = 5; i >= 1; i--)
  384.         {
  385.             if (getConfigs().TIME_TO_START_BATTLE - i >= i)
  386.                 ThreadPoolManager.getInstance().schedule(new StartMessages("scripts.events.TvT.TvT.EventStartOver", new String[] { Integer.toString(i) }), (getConfigs().TIME_TO_START_BATTLE - i) * 1000);
  387.         }
  388.         ThreadPoolManager.getInstance().schedule(new TaskVoid("canRegisters", null), (getConfigs().TIME_TO_START_BATTLE - 10) * 1000);
  389.         ThreadPoolManager.getInstance().schedule(new TaskVoid("start", null), getConfigs().TIME_TO_START_BATTLE * 1000);
  390.     }
  391.  
  392.     private void initRef()
  393.     {
  394.         _ref = new Reflection();
  395.         _instantZone = InstantZoneHolder.getInstance().getInstantZone(603);
  396.         _ref.init(_instantZone);
  397.     }
  398.  
  399.     @Override
  400.     public void start()
  401.     {
  402.         initRef();
  403.  
  404.         if (_state == 0)
  405.         {
  406.             startRegistration();
  407.         }
  408.         else if (_state == 1)
  409.         {
  410.             if (getCountPlayers() >= getConfigs().MIN_PARTICIPANTS)
  411.             {
  412.                 teleportPlayersToColiseum();
  413.                 ThreadPoolManager.getInstance().schedule(new go(), getConfigs().PAUSE_TIME * 1000);
  414.                 sayToAll("scripts.events.TvT.TvT.AnnounceTeleportToColiseum", null, true);
  415.                 _state = 2;
  416.             }
  417.             else
  418.             {
  419.                 sayToAll("scripts.events.TvT.TvT.AnnounceEventCanceled", new String[] { getName() }, true);
  420.                 for(Player player : _participants.keySet())
  421.                 {
  422.                     player.setPvPTeam(0);
  423.                     player.allowPvPTeam();
  424.                     player._event = null;
  425.                 }
  426.                 _participants.clear();
  427.                 _state = 0;
  428.                 abort();
  429.             }
  430.         }
  431.         else
  432.         {
  433.             sayToAll("scripts.events.TvT.TvT.AnnounceStartError", null, true);
  434.         }
  435.     }
  436.  
  437.     @Override
  438.     public void finish()
  439.     {
  440.         sayToAll("scripts.events.TvT.TvT.AnnounceEventEnd", null, false);
  441.  
  442.         if (_state == 2)
  443.         {
  444.             int WinTeam = -1;
  445.             int count = 0;
  446.             int max = 0;
  447.  
  448.             for (int i = 0; i < _score.length - 1; i++)
  449.             {
  450.                 max = Math.max(_score[i], _score[(i + 1)]);
  451.             }
  452.             for (int i = 0; i < _score.length; i++)
  453.             {
  454.                 if (_score[i] != max)
  455.                     continue;
  456.                 WinTeam = i;
  457.                 count++;
  458.             }
  459.             if (count != 1 || WinTeam == -1 || _score[WinTeam] == 0)
  460.             {
  461.                 sayToAll("scripts.events.TvT.TvT.EventDraw", null, false);
  462.             }
  463.             else
  464.             {
  465.                 rewardToWinTeam(WinTeam);
  466.             }
  467.             ThreadPoolManager.getInstance().schedule(new TaskVoid("restorePlayers", null), 1000L);
  468.             ThreadPoolManager.getInstance().schedule(new TaskVoid("teleportPlayersToSavedCoords", null), 2000L);
  469.         }
  470.         ThreadPoolManager.getInstance().schedule(new TaskVoid("clearAll", null), 3500L);
  471.         GameEventManager.getInstance().nextEvent();
  472.         _state = 0;
  473.     }
  474.  
  475.     @Override
  476.     public void abort()
  477.     {
  478.         finish();
  479.         if (_state > 0)
  480.             sayToAll("scripts.events.TvT.TvT.EventCompletedManually", new String[] { getName() }, true);
  481.     }
  482.  
  483.     @Override
  484.     public void onLogout(Player player)
  485.     {
  486.         if (player == null || player.getPvPTeam() < 1)
  487.         {
  488.             return;
  489.         }
  490.  
  491.         if (_state == 1 && _participants.containsKey(player))
  492.         {
  493.             unreg(player);
  494.             player.setPvPTeam(0);
  495.             player.allowPvPTeam();
  496.             player._event = null;
  497.             return;
  498.         }
  499.  
  500.         if (_state == 2 && _participants.containsKey(player))
  501.         {
  502.             try
  503.             {
  504.                 if(player != null)
  505.                     player.teleToLocation(player._stablePoint, ReflectionManager.DEFAULT);
  506.                 remove(player);
  507.                 player.setPvPTeam(0);
  508.                 player.allowPvPTeam();
  509.                 player._event = null;
  510.             }
  511.             catch (Exception e)
  512.             {
  513.                 e.printStackTrace();
  514.             }
  515.         }
  516.     }
  517.  
  518.     public void teleportPlayersToSavedCoords()
  519.     {
  520.         for (Player player : _participants.keySet())
  521.         {
  522.             teleportPlayerToSavedCoords(player);
  523.         }
  524.     }
  525.  
  526.     public void teleportPlayerToSavedCoords(Player player)
  527.     {
  528.         try
  529.         {
  530.             if(player == null)
  531.                 return;
  532.             if (player._stablePoint == null) // игрока не портнуло на стадион
  533.                 return;
  534.             player.getEffectList().stopAllEffects();
  535.             if(player.getPet() != null)
  536.             {
  537.                 Summon summon = player.getPet();
  538.                 summon.unSummon();
  539.             }
  540.             player.teleToLocation(player._stablePoint, ReflectionManager.DEFAULT);
  541.             if (getConfigs().STOP_ALL_EFFECTS)
  542.                 ThreadPoolManager.getInstance().schedule(new TaskVoid("returnBuffsToPlayers", player), 500L);
  543.             player._stablePoint = null;
  544.             player.setPvPTeam(0);
  545.             player.allowPvPTeam();
  546.             player._event = null;
  547.         }
  548.         catch (Exception e)
  549.         {
  550.             e.printStackTrace();
  551.         }
  552.     }
  553.  
  554.     @Override
  555.     public void doDie(Creature killer, Creature self)
  556.     {
  557.         if (self == null || killer == null)
  558.             return;
  559.         if ((self instanceof Player) && (killer instanceof Player))
  560.         {
  561.             Player player = (Player)self;
  562.             Player kill = (Player)killer;
  563.             if (_participants.containsKey(player))
  564.                 _participants.put(player, _participants.get(player) + 1);
  565.             if(getConfigs().ALLOW_KILL_BONUS && _participants.containsKey(kill))
  566.                 addItem(kill, getConfigs().KILL_BONUS_ID, getConfigs().KILL_BONUS_COUNT);
  567.             if (_state == 2 && player.getPvPTeam() > 0 && kill.getPvPTeam() > 0 && _participants.containsKey(player) && _participants.containsKey(kill))
  568.             {
  569.                 if (getConfigs().RESURRECTION_TIME == 0)
  570.                 {
  571.                     if (player != null)
  572.                     {
  573.                         player.setFakeDeath(true);
  574.                         player.getAI().notifyEvent(CtrlEvent.EVT_FAKE_DEATH, null, null);
  575.                         player.broadcastPacket(new ChangeWaitType(player, ChangeWaitType.WT_START_FAKEDEATH));
  576.                         player.broadcastCharInfo();
  577.                         player.abortCast(true, false);
  578.                         player.abortAttack(true, false);
  579.                         show(new CustomMessage("scripts.events.TvT.TvT.YouDead", player), player);
  580.                         live_list.remove(player);
  581.                     }
  582.                 }
  583.                 else
  584.                 {
  585.                     if (killer != null)
  586.                         _score[kill.getPvPTeam()] += 1;
  587.                     if (player != null)
  588.                     {
  589.                         player.setFakeDeath(true);
  590.                         player.getAI().notifyEvent(CtrlEvent.EVT_FAKE_DEATH, null, null);
  591.                         player.broadcastPacket(new ChangeWaitType(player, ChangeWaitType.WT_START_FAKEDEATH));
  592.                         player.broadcastCharInfo();
  593.                         player.abortCast(true, false);
  594.                         player.abortAttack(true, false);
  595.                         player.sendMessage(new CustomMessage("scripts.events.TvT.TvT.YouWillBeRessuction", player, new Object[0]).add(new Object[] { getConfigs().RESURRECTION_TIME }));
  596.                         ThreadPoolManager.getInstance().schedule(new TaskVoid("ResurrectionPlayer", player), getConfigs().RESURRECTION_TIME * 1000);
  597.                     }
  598.                 }
  599.             }
  600.         }
  601.     }
  602.  
  603.     public boolean checkRound(boolean finish)
  604.     {
  605.         if (!finish)
  606.         {
  607.             int liveTeamCount = 0;
  608.             int team = 0;
  609.             for (int i = 1; i <= getConfigs().TEAM_COUNTS; i++)
  610.             {
  611.                 if (!live_list.containsValue(Integer.valueOf(i)))
  612.                     continue;
  613.                 liveTeamCount++;
  614.                 team = i;
  615.                 if (liveTeamCount > 1)
  616.                     return false;
  617.             }
  618.  
  619.             _score[team] += 1;
  620.         }
  621.  
  622.         if (curr_round >= getConfigs().NUMBER_OF_ROUNDS)
  623.             finish();
  624.         else
  625.             nextRound();
  626.  
  627.         return true;
  628.     }
  629.  
  630.     public void nextRound()
  631.     {
  632.         for(Player player : _participants.keySet())
  633.         {
  634.             restorePlayer(player);
  635.             Reflection ref = _ref;
  636.             InstantZone instantZone = ref.getInstancedZone();
  637.             Location tele = Location.findPointToStay(instantZone.getTeleportCoords().get(player.getPvPTeam() - 1), 50, 50, ref.getGeoIndex());
  638.             player.teleToLocation(tele, ref);
  639.             if(getConfigs().NUMBER_OF_ROUNDS > 0)
  640.                 live_list.put(player, player.getPvPTeam());
  641.             player.sendPacket(new ExShowScreenMessage(new CustomMessage("scripts.events.TvT.TvT.StartBattle", player, new Object[0]).toString(), getConfigs().PAUSE_TIME * 700, ExShowScreenMessage.ScreenMessageAlign.MIDDLE_CENTER, true));
  642.         }
  643.         curr_round += 1;
  644.         paralyzePlayers();
  645.         ThreadPoolManager.getInstance().schedule(new go(), getConfigs().PAUSE_TIME * 1000);
  646.     }
  647.  
  648.     public void teleportPlayersToColiseum()
  649.     {
  650.         for(Player player : _participants.keySet())
  651.         {
  652.             if (!canRegister(player, false))
  653.             {
  654.                 remove(player);
  655.                 continue;
  656.             }
  657.             if(getConfigs().ALLOW_TAKE_ITEM)
  658.                 removeItem(player, getConfigs().TAKE_ITEM_ID, (long)getConfigs().TAKE_COUNT);
  659.             ItemInstance wpn = player.getActiveWeaponInstance();
  660.             if(wpn != null && wpn.isHeroWeapon() && !getConfigs().ALLOW_HERO_WEAPONS)
  661.             {
  662.                 player.getInventory().unEquipItem(wpn);
  663.                 player.abortAttack(true, true);
  664.             }
  665.             unRide(player);
  666.             if(getConfigs().STOP_ALL_EFFECTS)
  667.                 removeBuff(player);
  668.             if(player.getParty() != null)
  669.                 player.leaveParty();
  670.             player.allowPvPTeam();
  671.             player._stablePoint = player._stablePoint == null ? player.getReflection().getReturnLoc() == null ? player.getLoc() : player.getReflection().getReturnLoc() : player._stablePoint;
  672.             Reflection ref = _ref;
  673.             InstantZone instantZone = ref.getInstancedZone();
  674.             Location tele = Location.findPointToStay(instantZone.getTeleportCoords().get(player.getPvPTeam() - 1), 50, 50, ref.getGeoIndex());
  675.             player.teleToLocation(tele, ref);
  676.             restorePlayer(player);
  677.             if(getConfigs().NUMBER_OF_ROUNDS > 0)
  678.                 live_list.put(player, Integer.valueOf(player.getPvPTeam()));
  679.             player.sendPacket(new ExShowScreenMessage(new CustomMessage("scripts.events.TvT.TvT.StartBattle", player, new Object[0]).toString(), getConfigs().PAUSE_TIME * 700, ExShowScreenMessage.ScreenMessageAlign.MIDDLE_CENTER, true));
  680.         }
  681.  
  682.         paralyzePlayers();
  683.     }
  684.  
  685.     public void removeBuff(Player player)
  686.     {
  687.         if(player != null)
  688.         {
  689.             List<Effect> effectList = player.getEffectList().getAllEffects();
  690.             _effects = new ArrayList<Effect>(effectList.size());
  691.  
  692.             if (player.isCastingNow())
  693.             {
  694.                 player.abortCast(true, true);
  695.             }
  696.             for(Effect $effect : effectList)
  697.             {
  698.                 Effect effect = $effect.getTemplate().getEffect(new Env($effect.getEffector(), $effect.getEffected(), $effect.getSkill()));
  699.                 effect.setCount($effect.getCount());
  700.                 effect.setPeriod($effect.getCount() == 1 ? $effect.getPeriod() - $effect.getTime() : $effect.getPeriod());
  701.                 _effects.add(effect);
  702.             }
  703.             if(player.getPet() != null)
  704.             {
  705.                 Summon summon = player.getPet();
  706.                 summon.unSummon();
  707.             }
  708.             returnBuffs.put(player, _effects);
  709.             player.getEffectList().stopAllEffects();
  710.         }
  711.     }
  712.  
  713.     public void returnBuffsToPlayers(Player player)
  714.     {
  715.         for(Effect e : returnBuffs.get(player))
  716.             player.getEffectList().addEffect(e);
  717.     }
  718.  
  719.     public void paralyzePlayers()
  720.     {
  721.         Skill revengeSkill = SkillTable.getInstance().getInfo(4515, 1);
  722.         for (Player player : _participants.keySet())
  723.         {
  724.             player.getEffectList().stopEffect(1411);
  725.             revengeSkill.getEffects(player, player, false, false);
  726.             if (player.getPet() != null)
  727.                 revengeSkill.getEffects(player, player.getPet(), false, false);
  728.         }
  729.     }
  730.  
  731.     public void unParalyzePlayers()
  732.     {
  733.         for (Player player : _participants.keySet())
  734.         {
  735.             player.getEffectList().stopEffect(4515);
  736.             if (player.getPet() != null)
  737.                 player.getPet().getEffectList().stopEffect(4515);
  738.             if(player.isInParty())
  739.                 player.leaveParty();
  740.         }
  741.     }
  742.  
  743.     public void restorePlayer(Player player)
  744.     {
  745.         ClassId nclassId = ClassId.VALUES[player.getClassId().getId()];
  746.         if(player.isFakeDeath())
  747.         {
  748.             player.setFakeDeath(false);
  749.             player.broadcastPacket(new ChangeWaitType(player, ChangeWaitType.WT_STOP_FAKEDEATH));
  750.             player.broadcastPacket(new Revive(player));
  751.             player.broadcastCharInfo();
  752.         }
  753.         if(nclassId.isMage())
  754.             playerBuff(player, getConfigs().LIST_MAGE_MAG_SUPPORT);
  755.         else
  756.             playerBuff(player, getConfigs().LIST_MAGE_FAITER_SUPPORT);
  757.         player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
  758.         player.setCurrentCp(player.getMaxCp());
  759.     }
  760.  
  761.     public void restorePlayers()
  762.     {
  763.         for (Player player : _participants.keySet())
  764.         {
  765.             if(player.isFakeDeath())
  766.             {
  767.                 player.setFakeDeath(false);
  768.                 player.broadcastPacket(new ChangeWaitType(player, ChangeWaitType.WT_STOP_FAKEDEATH));
  769.                 player.broadcastPacket(new Revive(player));
  770.                 player.broadcastCharInfo();
  771.             }
  772.             player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
  773.             player.setCurrentCp(player.getMaxCp());
  774.         }
  775.     }
  776.  
  777.     public void ResurrectionPlayer(Player player)
  778.     {
  779.         if ((player._event == null) || (_state != 2) || (!_participants.containsKey(player)))
  780.             return;
  781.         Reflection ref = _ref;
  782.         InstantZone instantZone = ref.getInstancedZone();
  783.         Location tele = Location.findPointToStay(instantZone.getTeleportCoords().get(player.getPvPTeam() - 1), 50, 50, ref.getGeoIndex());
  784.         player.teleToLocation(tele, ref);
  785.         restorePlayer(player);
  786.     }
  787.  
  788.     private void clearAll()
  789.     {
  790.         for(Player player : _participants.keySet())
  791.         {
  792.             player.setPvPTeam(0);
  793.             player.allowPvPTeam();
  794.             player._event = null;
  795.         }
  796.         _participants.clear();
  797.         live_list.clear();
  798.     }
  799.  
  800.     public void rewardToWinTeam(int WinTeam)
  801.     {
  802.         int count = 0;
  803.         for (Player player : _participants.keySet())
  804.         {
  805.             if (player != null && player.getPvPTeam() == WinTeam)
  806.                 count++;
  807.         }
  808.         if (count < 1)
  809.             return;
  810.  
  811.         for (Player player : _participants.keySet())
  812.         {
  813.             if (player != null && player.getPvPTeam() == WinTeam)// && _participants.get(player) >= getConfigs().REWARD_FOR_KILL)
  814.             {
  815.                 for(int i = 0; i < getConfigs().getRewardId().length; i++)
  816.                     addItem(player, getConfigs().getRewardId()[i], getConfigs().getRewardCount()[i]);
  817.             }
  818.         }
  819.         sayToAll("scripts.events.TvT.TvT.EventWin", new String[] { getConfigs().TEAM_NAME.get(WinTeam - 1), getConfigs().NUMBER_OF_ROUNDS > 0 ? "Очков" : "Убийств", Integer.toString(_score[WinTeam]) }, false);
  820.     }
  821.  
  822.     public StringBuffer getInformation(Player player)
  823.     {
  824.         int rounds = getConfigs().NUMBER_OF_ROUNDS;
  825.         long min = (getConfigs().START_TIME - System.currentTimeMillis() / 1000L) / 60L;
  826.         String time = min + " минут";
  827.         String reward = "";//getConfigs().REWARD_COUNT + " " + ItemHolder.getInstance().getTemplate(getConfigs().REWARD_ITEM_ID).getName();
  828.  
  829.         StringBuffer content = new StringBuffer();
  830.         content.append("<table width=425 cellspacing=0>");
  831.         content.append("<tr><td align=center>Эвент: <font color=LEVEL>").append(getName()).append("</font></td></tr>");
  832.         content.append("<tr><td align=center>Тип: <font color=LEVEL>").append(rounds > 0 ? "По раундам" : "По времени").append("</font></td></tr>");
  833.         content.append("<tr><td align=center>Приз: <font color=LEVEL>").append(reward).append("</font></td></tr>");
  834.         content.append("<tr><td align=center>Кол-во команд: <font color=LEVEL>").append(getConfigs().TEAM_COUNTS).append("</font></td></tr>");
  835.         content.append("<tr><td align=center>Мин/Макс участников: <font color=LEVEL>").append(getConfigs().MIN_PARTICIPANTS).append("/").append(getConfigs().MAX_PARTICIPANTS).append("</font></td></tr>");
  836.         if (_state == 1)
  837.         {
  838.             content.append("<tr><td align=center>");
  839.             if (_participants == null || !_participants.containsKey(player))
  840.                 content.append(Strings.htmlButton("Зарегестрироваться", "bypass -h _bbseventreg;" + getName(), 120, 25));
  841.             else
  842.                 content.append(Strings.htmlButton("Отмена", "bypass -h _bbseventunreg;", 120, 25));
  843.                 content.append("</td></tr>");
  844.         }
  845.         else
  846.         {
  847.             content.append("<tr><td align=center>Начало через: <font color=LEVEL>").append(time).append("</font></td></tr>");
  848.         }
  849.         content.append("</table>");
  850.         return content;
  851.     }
  852.  
  853.     class TaskVoid implements Runnable
  854.     {
  855.         String _name;
  856.         Player _player;
  857.  
  858.         TaskVoid(String name, Player player)
  859.         {
  860.             _name = name;
  861.             _player = player;
  862.         }
  863.  
  864.         public void run()
  865.         {
  866.             if (_name.equals("canRegisters"))
  867.                 canRegisters();
  868.             else if (_name.equals("start"))
  869.                 start();
  870.             else if (_name.equals("restorePlayers"))
  871.                 restorePlayers();
  872.             else if (_name.equals("returnBuffsToPlayers"))
  873.                 returnBuffsToPlayers(_player);
  874.             else if (_name.equals("teleportPlayersToSavedCoords"))
  875.                 teleportPlayersToSavedCoords();
  876.             else if (_name.equals("clearAll"))
  877.                 clearAll();
  878.             else if (_name.equals("ResurrectionPlayer"))
  879.                 ResurrectionPlayer(_player);
  880.         }
  881.     }
  882.  
  883.     class StartMessages implements Runnable
  884.     {
  885.         String _adress;
  886.         String[] _replacing;
  887.  
  888.         StartMessages(String adress, String[] replacing)
  889.         {
  890.             _adress = adress;
  891.             _replacing = replacing;
  892.         }
  893.  
  894.         public void run()
  895.         {
  896.             if (_state == 1)
  897.                 sayToAll(_adress, _replacing, true);
  898.         }
  899.     }
  900.  
  901.     public class go implements Runnable
  902.     {
  903.         public go()
  904.         {
  905.         }
  906.  
  907.         public void run()
  908.         {
  909.             openDoors();
  910.             unParalyzePlayers();
  911.             int time = getConfigs().TIME_TO_END_BATTLE;
  912.  
  913.             sayToAll("scripts.events.TvT.TvT.RoundStarted", null, false);
  914.  
  915.             while (time >= 0 && _state == 2)
  916.             {
  917.                 int sec = time - time / 60 * 60;
  918.  
  919.                 for (Player player : _participants.keySet())
  920.                 {
  921.                     String message;
  922.                     if (getConfigs().NUMBER_OF_ROUNDS > 0)
  923.                     {
  924.                         message = "Раунд: " + curr_round + " из " + getConfigs().NUMBER_OF_ROUNDS;
  925.                         message = message + "\nКоманда: " + getConfigs().TEAM_NAME.get(player.getPvPTeam() - 1);
  926.                     }
  927.                     else
  928.                     {
  929.                         message = "\nКоманда: " + getConfigs().TEAM_NAME.get(player.getPvPTeam() - 1);
  930.                     }
  931.  
  932.                     if (sec < 10)
  933.                         message = message + "\nОсталось: " + time / 60 + ":0" + sec;
  934.                     else
  935.                     {
  936.                         message = message + "\nОсталось: " + time / 60 + ":" + sec;
  937.                     }
  938.                     player.sendPacket(new ExShowScreenMessage(message, 2000, ExShowScreenMessage.ScreenMessageAlign.BOTTOM_RIGHT, false));
  939.                 }
  940.                 if(getCountPlayers() <= 1)
  941.                     finish();
  942.                 if (getConfigs().NUMBER_OF_ROUNDS > 0 && checkRound(false))
  943.                     return;
  944.                 try
  945.                 {
  946.                     Thread.sleep(1000);
  947.                 }
  948.                 catch (Exception e)
  949.                 {
  950.                     e.printStackTrace();
  951.                 }
  952.                 time--;
  953.             }
  954.  
  955.             if (getConfigs().NUMBER_OF_ROUNDS > 0)
  956.                 checkRound(true);
  957.             else
  958.                 finish();
  959.         }
  960.     }
  961.  
  962.     public void openDoors()
  963.     {
  964.         for(DoorInstance door : _ref.getDoors())
  965.             door.openMe();
  966.     }
  967.  
  968.     @SuppressWarnings("unused")
  969.     private void playersBuff()
  970.     {
  971.         for(Player player : _participants.keySet())
  972.         {
  973.             ClassId nclassId = ClassId.VALUES[player.getClassId().getId()];
  974.             if(nclassId.isMage())
  975.                 playerBuff(player, getConfigs().LIST_MAGE_MAG_SUPPORT);
  976.             else
  977.                 playerBuff(player, getConfigs().LIST_MAGE_FAITER_SUPPORT);
  978.         }
  979.     }
  980.  
  981.     private void playerBuff(Player player, GArray<Integer> list)
  982.     {
  983.         int time = getConfigs().TIME_MAGE_SUPPORT;
  984.         Summon pet = player.getPet();
  985.         Skill skill = null;
  986.  
  987.         for(int i : list)
  988.         {
  989.             int lvl = SkillTable.getInstance().getBaseLevel(i);
  990.            
  991.             skill = SkillTable.getInstance().getInfo(i, lvl);
  992.             if(pet != null)
  993.                 for(EffectTemplate et : skill.getEffectTemplates())
  994.                 {  
  995.                     Env env = new Env(pet, pet, skill);
  996.                     Effect effect = et.getEffect(env);
  997.                     effect.setPeriod(time * 60000);
  998.                     pet.getEffectList().addEffect(effect);
  999.                     pet.updateEffectIcons();
  1000.                 }
  1001.             else
  1002.                 for(EffectTemplate et : skill.getEffectTemplates())
  1003.                 {  
  1004.                     Env env = new Env(player, player, skill);
  1005.                     Effect effect = et.getEffect(env);
  1006.                     effect.setPeriod(time * 60000);
  1007.                     player.getEffectList().addEffect(effect);
  1008.                     player.sendChanges();
  1009.                     player.updateEffectIcons();
  1010.                 }
  1011.         }
  1012.     }
  1013.  
  1014.     @Override
  1015.     public boolean canAttack(Creature attacker, Creature target)
  1016.     {
  1017.         if(_state == 2)
  1018.         {
  1019.             if(attacker.getTeam() == target.getTeam())
  1020.                 return false;
  1021.             if(target.isFakeDeath())
  1022.                 return false;
  1023.         }
  1024.         return true;
  1025.     }
  1026.  
  1027.     @Override
  1028.     public boolean canUseSkill(Creature caster, Creature target, Skill skill)
  1029.     {
  1030.         if(_state == 2)
  1031.         {
  1032.             if(caster.getTeam() == target.getTeam() && skill.isOffensive())
  1033.                 return false;
  1034.             if(skill.isHeroic() && !getConfigs().ALLOW_HERO_WEAPONS)
  1035.             {
  1036.                 caster.sendMessage(caster.getPlayer().isLangRus() ? "Запрещено использовать во время ивентов." : "You may not use during the events.");
  1037.                 return false;
  1038.             }
  1039.             if(target.isFakeDeath())
  1040.                 return false;
  1041.         }
  1042.         return true;
  1043.     }
  1044.  
  1045.     @Override
  1046.     public String minLvl()
  1047.     {
  1048.         return "" + getConfigs().MIN_LEVEL;
  1049.     }
  1050.  
  1051.     @Override
  1052.     public String maxLvl()
  1053.     {
  1054.         return "" + getConfigs().MAX_LEVEL;
  1055.     }
  1056.  
  1057.     @Override
  1058.     public void onPlayerExit(Player player)
  1059.     {
  1060.         if(player.getPvPTeam() == 0)
  1061.             return;
  1062.  
  1063.         // Вышел или вылетел во время эвента
  1064.         if(_state > 1 && player != null && player.getPvPTeam() != 0 && _participants.containsKey(player))
  1065.         {
  1066.             try
  1067.             {
  1068.                 if(player != null) 
  1069.                     player.teleToLocation(player._stablePoint, ReflectionManager.DEFAULT);
  1070.                 remove(player);
  1071.                 player.setPvPTeam(0);
  1072.                 player.allowPvPTeam();
  1073.                 player._event = null;
  1074.             }
  1075.             catch (Exception e)
  1076.             {
  1077.                 e.printStackTrace();
  1078.             }
  1079.         }
  1080.     }
  1081. }
Advertisement
Add Comment
Please, Sign In to add comment