Advertisement
Guest User

TvT BETA

a guest
Feb 23rd, 2020
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.66 KB | None | 0 0
  1. package net.sf.l2j.gameserver.model.entity.events;
  2.  
  3. import java.util.Calendar;
  4. import java.util.List;
  5. import java.util.concurrent.CopyOnWriteArrayList;
  6.  
  7. import net.sf.l2j.commons.concurrent.ThreadPool;
  8. import net.sf.l2j.commons.random.Rnd;
  9.  
  10. import net.sf.l2j.Config;
  11. import net.sf.l2j.gameserver.data.ItemTable;
  12. import net.sf.l2j.gameserver.data.sql.SpawnTable;
  13. import net.sf.l2j.gameserver.data.xml.MapRegionData;
  14. import net.sf.l2j.gameserver.data.xml.NpcData;
  15. import net.sf.l2j.gameserver.enums.MessageType;
  16. import net.sf.l2j.gameserver.enums.TeamType;
  17. import net.sf.l2j.gameserver.model.World;
  18. import net.sf.l2j.gameserver.model.actor.Creature;
  19. import net.sf.l2j.gameserver.model.actor.Npc;
  20. import net.sf.l2j.gameserver.model.actor.Player;
  21. import net.sf.l2j.gameserver.model.actor.Summon;
  22. import net.sf.l2j.gameserver.model.actor.instance.Pet;
  23. import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
  24. import net.sf.l2j.gameserver.model.entity.Duel.DuelState;
  25. import net.sf.l2j.gameserver.model.group.Party;
  26. import net.sf.l2j.gameserver.model.holder.IntIntHolder;
  27. import net.sf.l2j.gameserver.model.olympiad.OlympiadManager;
  28. import net.sf.l2j.gameserver.model.spawn.L2Spawn;
  29. import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
  30.  
  31. /**
  32. * @author Williams
  33. *
  34. */
  35. public final class TvTEvent extends Event
  36. {
  37. private List<Player> _registered = new CopyOnWriteArrayList<>();
  38. private List<Player> _blueTeam = new CopyOnWriteArrayList<>();
  39. private List<Player> _redTeam = new CopyOnWriteArrayList<>();
  40.  
  41. private Npc _npcManager;
  42.  
  43. private int _tick;
  44.  
  45. private TvTEvent()
  46. {
  47. if (Config.TVT_ENABLE)
  48. {
  49. _state = EventState.AWAITING;
  50. ThreadPool.scheduleAtFixedRate(this, 1000, 1000);
  51. LOGGER.info("TvTEvent: Engine is enable.");
  52. }
  53. else
  54. {
  55. _state = EventState.INACTIVE;
  56. LOGGER.info("TvTEvent: Engine is disabled.");
  57. }
  58. }
  59.  
  60. @Override
  61. public void run()
  62. {
  63. if (_state == EventState.AWAITING)
  64. {
  65. final Calendar calendar = Calendar.getInstance();
  66. final int hour = calendar.get(Calendar.HOUR_OF_DAY);
  67. final int minute = calendar.get(Calendar.MINUTE);
  68.  
  69. for (String time : Config.TVT_SCHEDULER_TIMES)
  70. {
  71. final String[] splitTime = time.split(":");
  72. if (Integer.parseInt(splitTime[0]) == hour && Integer.parseInt(splitTime[1]) == minute)
  73. {
  74. register();
  75. break;
  76. }
  77. }
  78. }
  79. else if (_state == EventState.REGISTRATION)
  80. {
  81. switch (_tick)
  82. {
  83. case 7200:
  84. case 3600:
  85. World.announceToOnlinePlayers("TvTEvent: " + _tick / 3600 + " hour(s) until registration is closed!", true);
  86. break;
  87.  
  88. case 1800:
  89. case 900:
  90. case 600:
  91. case 300:
  92. case 180:
  93. case 60:
  94. World.announceToOnlinePlayers("TvTEvent: " + _tick / 60 + " minute(s) until registration is closed!", true);
  95. break;
  96.  
  97. case 30:
  98. case 10:
  99. case 5:
  100. World.announceToOnlinePlayers("TvTEvent: " + _tick + " second(s) until registration is closed!", true);
  101. break;
  102. }
  103.  
  104. if (_tick == 0)
  105. prepareTeams();
  106.  
  107. _tick--;
  108. }
  109. else if (_state == EventState.PROCESSING)
  110. {
  111. switch (_tick)
  112. {
  113. case 7200:
  114. case 3600:
  115. World.announceToOnlinePlayers(_tick / 3600 + " hour(s) until event is finished!");
  116. break;
  117.  
  118. case 1800:
  119. case 900:
  120. case 600:
  121. case 300:
  122. case 60:
  123. World.announceToOnlinePlayers(_tick / 60 + " minute(s) until the event is finished!");
  124. break;
  125.  
  126. case 30:
  127. case 10:
  128. World.announceToOnlinePlayers(_tick + " second(s) until the event is finished!");
  129. break;
  130. }
  131.  
  132. if (_tick == 0)
  133. eventRemovals();
  134.  
  135. _tick--;
  136. }
  137. }
  138.  
  139. public void register()
  140. {
  141. if (Config.TVT_ENABLE)
  142. {
  143. _state = EventState.REGISTRATION;
  144.  
  145. try
  146. {
  147. final NpcTemplate template = NpcData.getInstance().getTemplate(Config.TVT_NPC_ID);
  148. final L2Spawn spawn = new L2Spawn(template);
  149. spawn.setLoc(Config.TVT_NPC_LOCATION.getX(), Config.TVT_NPC_LOCATION.getY(), Config.TVT_NPC_LOCATION.getZ(), 0);
  150. spawn.setRespawnDelay(60000);
  151. spawn.setRespawnState(false);
  152.  
  153. SpawnTable.getInstance().addSpawn(spawn, false);
  154.  
  155. _npcManager = spawn.doSpawn(false);
  156. _npcManager.broadcastPacket(new MagicSkillUse(_npcManager, _npcManager, 1034, 1, 1, 1));
  157. }
  158. catch (Exception e){}
  159.  
  160. World.announceToOnlinePlayers("TvT Event: Recruiting levels: " + Config.MIN_LEVEL + " to " + Config.MAX_LEVEL + ".", true);
  161. World.announceToOnlinePlayers("TvT Event: Max players in team: "+ Config.MAX_PARTICIOANTS +".", true);
  162. World.announceToOnlinePlayers("TvT Event: Commands /register /unregister.", true);
  163.  
  164. for (IntIntHolder reward: Config.TVT_REWARDS)
  165. World.announceToOnlinePlayers("TvT Event: Reward "+ reward.getValue() + "-" + ItemTable.getInstance().getTemplate(reward.getId()).getName() , true);
  166.  
  167. _tick = Config.TVT_PARTICIPATION_TIME * 60;
  168. }
  169. else
  170. _state = EventState.AWAITING;
  171. }
  172.  
  173. public void prepareTeams()
  174. {
  175. if (Config.TVT_ENABLE)
  176. {
  177. _state = EventState.PROCESSING;
  178. _tick = Config.TVT_RUNNING_TIME * 60;
  179.  
  180. while (_registered.size() > 0)
  181. {
  182. Player player = _registered.get(Rnd.get(_registered.size()));
  183.  
  184. // First create 2 event teams
  185. if (_blueTeam.size() > _redTeam.size())
  186. {
  187. _redTeam.add(player);
  188. player.setTeam(TeamType.RED);
  189. }
  190. else
  191. {
  192. _blueTeam.add(player);
  193. player.setTeam(TeamType.BLUE);
  194. }
  195.  
  196. // Abort casting if player casting
  197. if (player.isCastingNow())
  198. player.abortCast();
  199.  
  200. player.getAppearance().setVisible();
  201.  
  202. if (player.isDead())
  203. player.doRevive();
  204. else
  205. {
  206. player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
  207. player.setCurrentCp(player.getMaxCp());
  208. }
  209.  
  210. // Remove Buffs
  211. player.stopAllEffectsExceptThoseThatLastThroughDeath();
  212.  
  213. // stop any cubic that has been given by other player.
  214. player.stopCubicsByOthers();
  215.  
  216. // Dismount player, if mounted.
  217. if (player.isMounted())
  218. player.dismount();
  219. else
  220. {
  221. final Summon summon = player.getSummon();
  222.  
  223. // Unsummon pets directly.
  224. if (summon instanceof Pet)
  225. summon.unSummon(player);
  226. // Remove servitor buffs and cancel animations.
  227. else if (summon != null)
  228. {
  229. summon.stopAllEffectsExceptThoseThatLastThroughDeath();
  230. summon.abortAttack();
  231. summon.abortCast();
  232. }
  233. }
  234.  
  235. // Remove player from his party
  236. if (player.getParty() != null)
  237. {
  238. Party party = player.getParty();
  239. party.removePartyMember(player, MessageType.EXPELLED);
  240. }
  241.  
  242. // Remove Duel State
  243. if (player.isInDuel())
  244. player.setDuelState(DuelState.INTERRUPTED);
  245.  
  246. _registered.remove(player);
  247. }
  248.  
  249. // Port teams
  250. for (Player blue : _blueTeam)
  251. {
  252. if (blue == null)
  253. continue;
  254.  
  255. blue.teleToLocation(Config.TVT_BLUE_SPAWN_LOCATION);
  256. }
  257.  
  258. for (Player red : _redTeam)
  259. {
  260. if (red == null)
  261. continue;
  262.  
  263. red.teleToLocation(Config.TVT_RED_SPAWN_LOCATION);
  264. }
  265. }
  266. else
  267. {
  268. World.announceToOnlinePlayers("TvTEvent: cancelled due to lack of Participation.", true);
  269. _state = EventState.AWAITING;
  270. }
  271. }
  272.  
  273. public void eventRemovals()
  274. {
  275. // Blue team
  276. for (Player blue : _blueTeam)
  277. {
  278. if (blue == null)
  279. continue;
  280.  
  281. // Give rewards
  282. if (_state != EventState.AWAITING && (blue.getBlueKills() > blue.getRedKills() || blue.getBlueKills() == blue.getRedKills() && Config.REWARD_DIE))
  283. {
  284. for (IntIntHolder reward : Config.TVT_REWARDS)
  285. {
  286. if (reward == null)
  287. continue;
  288.  
  289. blue.addItem("TvTReward", reward.getId(), reward.getValue(), null, true);
  290. }
  291. }
  292.  
  293. if (blue.isDead())
  294. blue.doRevive();
  295.  
  296. removePlayer(blue);
  297. blue.teleToLocation(Config.TVT_NPC_LOCATION);
  298. }
  299.  
  300. // Red team
  301. for (Player red : _redTeam)
  302. {
  303. if (red == null)
  304. continue;
  305.  
  306. // Give rewards
  307. if (_state != EventState.AWAITING && (red.getBlueKills() < red.getRedKills() || red.getBlueKills() == red.getRedKills() && Config.REWARD_DIE))
  308. {
  309. for (IntIntHolder reward : Config.TVT_REWARDS)
  310. {
  311. if (reward == null)
  312. continue;
  313.  
  314. red.addItem("TvTReward", reward.getId(), reward.getValue(), null, true);
  315. }
  316. }
  317.  
  318. if (red.isDead())
  319. red.doRevive();
  320.  
  321. removePlayer(red);
  322. red.teleToLocation(Config.TVT_NPC_LOCATION);
  323. }
  324.  
  325. for (Player player : World.getInstance().getPlayers())
  326. {
  327. // Event ended in a tie and no rewards will be given
  328. if (player.getBlueKills() == player.getRedKills() && !Config.REWARD_DIE)
  329. World.announceToOnlinePlayers("TvT Event: Event ended in a Tie. No rewards will be given!", true);
  330.  
  331. // clean teams
  332. _blueTeam.clear();
  333. _redTeam.clear();
  334.  
  335. // clean kills
  336. player.getBlueKills();
  337. player.getRedKills();
  338. }
  339. _state = EventState.AWAITING;
  340. }
  341.  
  342. @Override
  343. public void registerPlayer(Player player)
  344. {
  345. if (_state != EventState.REGISTRATION)
  346. {
  347. player.sendMessage("TvT Registration is not in progress.");
  348. return;
  349. }
  350.  
  351. if (player.isFestivalParticipant())
  352. {
  353. player.sendMessage("Festival participants cannot register to the event.");
  354. return;
  355. }
  356.  
  357. if (player.isInJail())
  358. {
  359. player.sendMessage("Jailed players cannot register to the event.");
  360. return;
  361. }
  362.  
  363. if (player.isDead())
  364. {
  365. player.sendMessage("Dead players cannot register to the event.");
  366. return;
  367. }
  368.  
  369. if (OlympiadManager.getInstance().isRegisteredInComp(player))
  370. {
  371. player.sendMessage("Grand Olympiad participants cannot register to the event.");
  372. return;
  373. }
  374.  
  375. if ((player.getLevel() < Config.MIN_LEVEL) || (player.getLevel() > Config.MAX_LEVEL))
  376. {
  377. player.sendMessage("You have not reached the appropriate level to join the event.");
  378. return;
  379. }
  380.  
  381. if (_registered.size() == Config.MAX_PARTICIOANTS)
  382. {
  383. player.sendMessage("There is no more room for you to register to the event.");
  384. return;
  385. }
  386.  
  387. for (Player registered : _registered)
  388. {
  389. if (registered == null)
  390. continue;
  391.  
  392. if (registered.getObjectId() == player.getObjectId())
  393. {
  394. player.sendMessage("You are already registered in the TvT event.");
  395. return;
  396. }
  397.  
  398. // Check if dual boxing is not allowed
  399. if (!Config.DUAL_BOX)
  400. {
  401. if ((registered.getClient() == null) || (player.getClient() == null))
  402. continue;
  403.  
  404. String ip1 = player.getClient().getConnection().getInetAddress().getHostAddress();
  405. String ip2 = registered.getClient().getConnection().getInetAddress().getHostAddress();
  406. if ((ip1 != null) && (ip2 != null) && ip1.equals(ip2))
  407. {
  408. player.sendMessage("Your IP is already registered in the TvT event.");
  409. return;
  410. }
  411. }
  412. }
  413.  
  414. _registered.add(player);
  415.  
  416. player.sendMessage("You have registered to participate in the TvT Event.");
  417.  
  418. super.registerPlayer(player);
  419. }
  420.  
  421. @Override
  422. public void removePlayer(Player player)
  423. {
  424. if (_registered.contains(player))
  425. {
  426. _registered.remove(player);
  427. player.sendMessage("You have been removed from the TvT Event registration list.");
  428. }
  429. else if (player.getTeam() == TeamType.BLUE)
  430. _blueTeam.remove(player);
  431. else if (player.getTeam() == TeamType.RED)
  432. _redTeam.remove(player);
  433.  
  434. // If no participants left, abort event
  435. if ((player.getTeam().getId() > 0) && (_blueTeam.size() == 0) && (_redTeam.size() == 0))
  436. _state = EventState.AWAITING;
  437.  
  438. // Now, remove team status
  439. player.setTeam(TeamType.NONE);
  440.  
  441. super.removePlayer(player);
  442. }
  443.  
  444. @Override
  445. public boolean isRegistered(Player player)
  446. {
  447. return _registered.contains(player);
  448. }
  449.  
  450. public List<Player> getBlueTeam()
  451. {
  452. return _blueTeam;
  453. }
  454.  
  455. public List<Player> getRedTeam()
  456. {
  457. return _redTeam;
  458. }
  459.  
  460. public List<Player> getRegistered()
  461. {
  462. return _registered;
  463. }
  464.  
  465. @Override
  466. public void onDie(Creature killer)
  467. {
  468. if (killer == null)
  469. return;
  470.  
  471. if (killer instanceof Player)
  472. {
  473. final Player player = ((Player) killer);
  474.  
  475. player.sendMessage("You will be respawned in " + Config.PLAYER_RESPAWN_DELAY + " seconds.");
  476. ThreadPool.schedule(new Runnable()
  477. {
  478. @Override
  479. public void run()
  480. {
  481. if (!player.isDead())
  482. return;
  483.  
  484. player.doRevive();
  485.  
  486. if (player.getTeam() == TeamType.BLUE)
  487. player.teleToLocation(Config.TVT_BLUE_SPAWN_LOCATION);
  488. else if (player.getTeam() == TeamType.RED)
  489. player.teleToLocation(Config.TVT_RED_SPAWN_LOCATION);
  490. // Player has probably left event for some reason
  491. else
  492. player.teleportTo(MapRegionData.TeleportType.TOWN);
  493. }
  494. }, Config.PLAYER_RESPAWN_DELAY * 1000L);
  495. }
  496. }
  497.  
  498. @Override
  499. public void onKill(Player player, Player target)
  500. {
  501. if (player == null || target == null)
  502. return;
  503.  
  504. // Increase kills only if victim belonged to enemy team
  505. if (player.getTeam() == TeamType.BLUE && target.getTeam() == TeamType.RED)
  506. player.increaseBlueKills();
  507. else if (player.getTeam() == TeamType.RED && target.getTeam() == TeamType.BLUE)
  508. player.increaseRedKills();
  509.  
  510. player.broadcastTitleInfo();
  511. player.broadcastUserInfo();
  512. }
  513.  
  514. @Override
  515. public void onRevive(Creature killer)
  516. {
  517. if (killer == null)
  518. return;
  519.  
  520. // Heal Player fully
  521. killer.setCurrentHpMp(killer.getMaxHp(), killer.getMaxMp());
  522. killer.setCurrentCp(killer.getMaxCp());
  523. }
  524.  
  525. public static final TvTEvent getInstance()
  526. {
  527. return SingletonHolder.INSTANCE;
  528. }
  529.  
  530. private static class SingletonHolder
  531. {
  532. protected static final TvTEvent INSTANCE = new TvTEvent();
  533. }
  534. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement