Guest User

Untitled

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