Guest User

Untitled

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