Axelut

Engine aCis dm tvt

May 11th, 2023
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff --git a/L2jOne_C6_Interlude/data/xml/events/DeathMatch.xml b/L2jOne_C6_Interlude/data/xml/events/DeathMatch.xml
  2. new file mode 100644
  3. index 0000000..1403ec3
  4. --- /dev/null
  5. +++ b/L2jOne_C6_Interlude/data/xml/events/DeathMatch.xml
  6. @@ -0,0 +1,79 @@
  7. +<?xml version="1.0" encoding="UTF-8"?>
  8. +<!-- Death Match Event -->
  9. +<dm>
  10. + <!-- Times Death Match will occur (24h format) -->
  11. + <EventTimeInterval val="17:21" />
  12. +
  13. + <!-- Event duration time (in minutes) -->
  14. + <Duration val="10" />
  15. +
  16. + <!-- The minimum and maximum number of players to start the event -->
  17. + <Participants min="2" max="50" />
  18. +
  19. + <!-- The minimum and maximum level allowed to participate at the event -->
  20. + <Level min="76" max="85" />
  21. +
  22. + <!-- Time for registration (in minutes) -->
  23. + <TimeToRegistration val="10" />
  24. +
  25. + <!-- Time for registration (in seconds) -->
  26. + <TimeToTeleport val="10" />
  27. +
  28. + <!-- Require item to register in the event? -->
  29. + <AllowTakeItems val="false" />
  30. + <!-- Item ID and Count required to register -->
  31. + <TakeItems id="57" count="100000" />
  32. +
  33. + <!-- Allow give reward for kill? -->
  34. + <AllowKillBonus val="false" />
  35. + <!-- Reward ID and Count for each kill -->
  36. + <KillReward id="57" count="100000" />
  37. +
  38. + <!-- Coordinates where the players will spawn -->
  39. + <PlayerEventCoordinates x="-213471" y="244903" z="2021" h="32768" />
  40. +
  41. + <!-- Stop all effects at the start of the event? -->
  42. + <StopAllEffects val="true" />
  43. +
  44. + <!-- Hide the player names and titles at the event? -->
  45. + <HidePlayersIdentity val="true" />
  46. +
  47. + <!-- Enable / Disable the participation with multiple boxes -->
  48. + <AllowMultipleBoxes val="false" />
  49. +
  50. + <!-- Reward ID and Count for the winner. For multiple rewards separate with (,) -->
  51. + <Rewards1stPlace id="3470,9627,6673" count="25,3,1" />
  52. +
  53. + <!-- Reward ID and Count for the second place. For multiple rewards separate with (,) -->
  54. + <Rewards2ndPlace id="3470,9627,6673" count="15,2,1" />
  55. +
  56. + <!-- Reward ID and Count for the third place. For multiple rewards separate with (,) -->
  57. + <Rewards3rdPlace id="3470,9627,6673" count="5,1,1" />
  58. +
  59. + <!-- Reward in case of tie? -->
  60. + <RewardTie val="true" />
  61. +
  62. + <!-- List of buffs given to the players, separate with (,) -->
  63. + <ListMageSupport val="1078,1085,1303,1517,1518,1519,1535,1536,1537,1538" />
  64. + <ListFighterSupport val="1499,1500,1501,1502,1503,1504,1517" />
  65. +
  66. + <!-- List of the restricted items on the event, separate with (,) -->
  67. + <!--<RestrictItems val="" />-->
  68. +
  69. + <!-- List of the restricted skills on the event, separate with (,) -->
  70. + <!--<RestrictSkills val="" />-->
  71. +
  72. + <!-- Allow player to use potions during the event? -->
  73. + <AllowPotions val="false" />
  74. +
  75. + <!-- Allow player to use scrolls during the event? -->
  76. + <AllowScrolls val="false" />
  77. +
  78. + <!-- Allow player to use summons by items during the event? -->
  79. + <AllowSummonByItem val="false" />
  80. +
  81. + <!-- Require a minimal amount of kills to receive the reward? -->
  82. + <RequireMinFragsToReward val="false" />
  83. + <!-- Minimal amount of kills to receive the reward -->
  84. + <MinFragsRequired val="1" />
  85. +</dm>
  86. \ No newline at end of file
  87. diff --git a/L2jOne_C6_Interlude/data/xml/events/TvT.xml b/L2jOne_C6_Interlude/data/xml/events/TvT.xml
  88. new file mode 100644
  89. index 0000000..530e237
  90. --- /dev/null
  91. +++ b/L2jOne_C6_Interlude/data/xml/events/TvT.xml
  92. @@ -0,0 +1,84 @@
  93. +<?xml version='1.0' encoding='utf-8'?>
  94. +<!-- TvT Event -->
  95. +<tvt>
  96. + <!-- Times TvT will occur (24h format) -->
  97. + <EventTimeInterval val="18:11" />
  98. +
  99. + <!-- Event duration time (in minutes) -->
  100. + <Duration val="1" />
  101. +
  102. + <!-- The minimum and maximum number of players to start the event -->
  103. + <Participants min="5" max="250" />
  104. +
  105. + <!-- The minimum and maximum level allowed to participate at the event -->
  106. + <Level min="76" max="85" />
  107. +
  108. + <!-- Time for registration (in minutes) -->
  109. + <TimeToRegistration val="10" />
  110. +
  111. + <!-- Time for registration (in seconds) -->
  112. + <TimeToTeleport val="10" />
  113. +
  114. + <!-- Require item to register in the event? -->
  115. + <AllowTakeItems val="true" />
  116. + <!-- Item ID and Count required to register -->
  117. + <TakeItems id="57" count="100000" />
  118. +
  119. + <!-- Allow give reward for kill? -->
  120. + <AllowKillBonus val="false" />
  121. + <!-- Reward ID and Count for each kill -->
  122. + <KillReward id="57" count="100000" />
  123. +
  124. + <!-- Stop all effects at the start of the event? -->
  125. + <StopAllEffects val="true" />
  126. +
  127. + <!-- Hide the player names and titles at the event? -->
  128. + <HidePlayersIdentity val="true" />
  129. +
  130. + <!-- Team ids, colors, names and coordinates. Min. 2 teams -->
  131. + <Team id="1" name="Green" color="009933" coordinates="-84640,-45360,-10683,-9380" />
  132. + <Team id="2" name="Blue" color="CC6600" coordinates="-79120,-45440,-10683,-23248" />
  133. + <Team id="3" name="Red" color="000099" coordinates="-77408,-50656,-10683,29664" />
  134. + <Team id="4" name="Orange" color="0099FF" coordinates="-81904,-53904,-10683,17044" />
  135. + <Team id="5" name="Yellow" color="00CCFF" coordinates="-86359,-50593,-10649,3704" />
  136. +
  137. + <!-- Reward ID and Count for the players of the winner team. For multiple rewards separate with (,) -->
  138. + <Rewards id="3470,9627,6673" count="10,1,1" />
  139. +
  140. + <!-- Reward all winner teams in case of tie? -->
  141. + <RewardTeamTie val="true" />
  142. +
  143. + <!-- List of buffs given to the players, separate with (,) -->
  144. + <ListMageSupport val="1078,1085,1303,1517,1518,1519,1535,1536,1537,1538" />
  145. + <ListFighterSupport val="1499,1500,1501,1502,1503,1504,1517" />
  146. +
  147. + <!-- List of the restricted items on the event, separate with (,) -->
  148. + <!--<RestrictItems val="" />-->
  149. +
  150. + <!-- List of the restricted skills on the event, separate with (,) -->
  151. + <!--<RestrictSkills val="" />-->
  152. +
  153. + <!-- Allow player to use potions during the event? -->
  154. + <AllowPotions val="false" />
  155. +
  156. + <!-- Allow player to use scrolls during the event? -->
  157. + <AllowScrolls val="false" />
  158. +
  159. + <!-- Allow player to use summons by items during the event? -->
  160. + <AllowSummonByItem val="false" />
  161. +
  162. + <!-- Allow player to target team members during the event? -->
  163. + <AllowTargetTeamMembers val="false" />
  164. +
  165. + <!-- Require a minimal amount of kills to receive the reward? -->
  166. + <RequireMinFragsToReward val="true" />
  167. + <!-- Minimal amount of kills to receive the reward -->
  168. + <MinFragsRequired val="1" />
  169. +
  170. + <!-- In total there are 2 types of TvT: (1) The winning team is determined
  171. + by number of dead characters rivals. (2) The winning team is determined by number
  172. + of rounds won. In this case, you must use the <NumberOfRounds val="5"/> number
  173. + of rounds. Also the "Duration" in this case stands for each round! Do not
  174. + use together! -->
  175. + <NumberOfRounds val="1" />
  176. +</tvt>
  177. \ No newline at end of file
  178. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/actor/Player.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/actor/Player.java
  179. index c0e585c..e2069af 100644
  180. --- a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/actor/Player.java
  181. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/actor/Player.java
  182. @@ -133,6 +133,7 @@
  183. import net.sf.l2j.gameserver.model.craft.ManufactureList;
  184. import net.sf.l2j.gameserver.model.entity.Castle;
  185. import net.sf.l2j.gameserver.model.entity.Duel.DuelState;
  186. +import net.sf.l2j.gameserver.model.gameevent.GameEvent;
  187. import net.sf.l2j.gameserver.model.group.CommandChannel;
  188. import net.sf.l2j.gameserver.model.group.Party;
  189. import net.sf.l2j.gameserver.model.group.PartyMatchRoom;
  190. @@ -463,6 +464,7 @@
  191. private final int[] _loto = new int[5];
  192. private final int[] _race = new int[2];
  193.  
  194. + private GameEvent _event;
  195. private TeamType _team = TeamType.NONE;
  196.  
  197. private int _alliedVarkaKetra; // lvl of alliance with ketra orcs or varka silenos, used in quests and aggro checks [-5,-1] varka, 0 neutral, [1,5] ketra
  198. @@ -2747,6 +2749,9 @@
  199. stopFakeDeath(true);
  200. }
  201.  
  202. + if (getEvent() != null)
  203. + getEvent().onKill(killer, this);
  204. +
  205. if (killer != null)
  206. {
  207. final Player pk = killer.getActingPlayer();
  208. @@ -6085,6 +6090,22 @@
  209. return _lvlJoinedAcademy > 0;
  210. }
  211.  
  212. + public void setEvent(GameEvent event)
  213. + {
  214. + _event = event;
  215. + }
  216. +
  217. + public GameEvent getEvent()
  218. + {
  219. + return _event;
  220. + }
  221. +
  222. + public boolean isInEvent()
  223. + {
  224. + final GameEvent event = getEvent();
  225. + return (event != null) && (event.isRunning() && event.isParticipant(getObjectId()));
  226. + }
  227. +
  228. public void setTeam(TeamType team)
  229. {
  230. _team = team;
  231. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEvent.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEvent.java
  232. new file mode 100644
  233. index 0000000..74b7153
  234. --- /dev/null
  235. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEvent.java
  236. @@ -0,0 +1,499 @@
  237. +package net.sf.l2j.gameserver.model.gameevent;
  238. +
  239. +import java.util.Collection;
  240. +
  241. +import net.sf.l2j.commons.logging.CLogger;
  242. +import net.sf.l2j.commons.random.Rnd;
  243. +
  244. +import net.sf.l2j.gameserver.data.SkillTable;
  245. +import net.sf.l2j.gameserver.data.xml.DoorData;
  246. +import net.sf.l2j.gameserver.data.xml.ItemData;
  247. +import net.sf.l2j.gameserver.model.actor.Creature;
  248. +import net.sf.l2j.gameserver.model.actor.Npc;
  249. +import net.sf.l2j.gameserver.model.actor.Player;
  250. +import net.sf.l2j.gameserver.model.actor.instance.Door;
  251. +import net.sf.l2j.gameserver.model.gameevent.config.GameEventConfig;
  252. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  253. +import net.sf.l2j.gameserver.model.olympiad.OlympiadManager;
  254. +import net.sf.l2j.gameserver.network.SystemMessageId;
  255. +import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  256. +import net.sf.l2j.gameserver.skills.L2Skill;
  257. +
  258. +public abstract class GameEvent
  259. +{
  260. + protected static final CLogger LOGGER = new CLogger(GameEvent.class.getName());
  261. +
  262. + public enum EventState
  263. + {
  264. + INACTIVE,
  265. + REGISTER,
  266. + STARTED,
  267. + REWARDING
  268. + }
  269. +
  270. + private EventState _state = EventState.INACTIVE;
  271. + protected String _eventName = "";
  272. +
  273. + public abstract GameEventConfig getConfigs();
  274. + public abstract void init();
  275. + protected abstract String calculateRewards();
  276. + protected abstract void teleportPlayersToArena();
  277. + protected abstract void teleportPlayersBack();
  278. + protected abstract void clear();
  279. + public abstract boolean isParticipant(int objectId);
  280. + public abstract int getCountPlayers();
  281. + public abstract boolean addParticipant(GameEventPlayer eventPlayer);
  282. + public abstract boolean removeParticipant(Player player);
  283. +
  284. + public abstract void sysMsgToAllParticipants(String message);
  285. +
  286. + public abstract void onKill(Creature killerCharacter, Player killedplayer);
  287. +
  288. + public abstract boolean onSkillUse(Player caster, L2Skill skill);
  289. +
  290. + public abstract void onLogin(Player player);
  291. +
  292. + public abstract boolean onAction(Player player, int targetObjectId);
  293. +
  294. + /**
  295. + * Gets the Game Event state
  296. + * @return EventState: _state
  297. + */
  298. + public EventState getState()
  299. + {
  300. + synchronized (_state)
  301. + {
  302. + return _state;
  303. + }
  304. + }
  305. +
  306. + /**
  307. + * Sets the Game Event state
  308. + * @param state as EventState
  309. + */
  310. + protected void setState(EventState state)
  311. + {
  312. + synchronized (_state)
  313. + {
  314. + _state = state;
  315. + }
  316. + }
  317. +
  318. + public String getName()
  319. + {
  320. + return _eventName;
  321. + }
  322. +
  323. + public boolean isInactive()
  324. + {
  325. + return getState() == EventState.INACTIVE;
  326. + }
  327. +
  328. + public boolean isRunning()
  329. + {
  330. + return getState() == EventState.STARTED;
  331. + }
  332. +
  333. + public boolean isRegistrating()
  334. + {
  335. + return getState() == EventState.REGISTER;
  336. + }
  337. +
  338. + /**
  339. + * Method called to check if a player can register at the event
  340. + * @param player as Player
  341. + * @param first as Integer
  342. + * @return boolean: true if the player can register, otherwise false
  343. + */
  344. + protected boolean canRegister(Player player, boolean first)
  345. + {
  346. + if (first && getConfigs().ALLOW_TAKE_ITEM)
  347. + {
  348. + if (player.getInventory().getItemCount(getConfigs().TAKE_ITEM_ID, -1) < getConfigs().TAKE_COUNT)
  349. + {
  350. + player.sendMessage("You don't have enough " + ItemData.getInstance().getTemplate(getConfigs().TAKE_ITEM_ID).getName() + " to participate.");
  351. + return false;
  352. + }
  353. + }
  354. +
  355. + if (first && !isRegistrating())
  356. + {
  357. + player.sendMessage("The registration process is not active.");
  358. + return false;
  359. + }
  360. +
  361. + if (first && isParticipant(player.getObjectId()))
  362. + {
  363. + player.sendMessage("You are already registred.");
  364. + return false;
  365. + }
  366. +
  367. + if (player.isTeleporting())
  368. + {
  369. + player.sendMessage("You are in a teleporting process.");
  370. + return false;
  371. + }
  372. +
  373. + if (!player.isOnline())
  374. + {
  375. + player.sendMessage("You have to be online to register.");
  376. + return false;
  377. + }
  378. +
  379. + if (player.isMounted())
  380. + {
  381. + player.sendMessage("Revoke your pet before register.");
  382. + return false;
  383. + }
  384. +
  385. + if (player.isInDuel())
  386. + {
  387. + player.sendMessage("You must complete the duel before register.");
  388. + return false;
  389. + }
  390. +
  391. + if (first && (player.getEvent() != null))
  392. + {
  393. + player.sendMessage("You are already registered in another event.");
  394. + return false;
  395. + }
  396. +
  397. + if (player.isInOlympiadMode() || OlympiadManager.getInstance().isRegistered(player))
  398. + {
  399. + player.sendMessage("You are already registered in the Olympics.");
  400. + return false;
  401. + }
  402. +
  403. + if (player.isInParty() && player.getParty().isInDimensionalRift())
  404. + {
  405. + player.sendMessage("You are already registered in another event.");
  406. + return false;
  407. + }
  408. +
  409. + if (player.isCursedWeaponEquipped())
  410. + {
  411. + player.sendMessage("You can't register to the event with a cursed weapon.");
  412. + return false;
  413. + }
  414. +
  415. + if (player.isDead())
  416. + {
  417. + player.sendMessage("You can't register while you are dead.");
  418. + return false;
  419. + }
  420. +
  421. + if (player.getKarma() > 0)
  422. + {
  423. + player.sendMessage("PK's can't participate in the opening event.");
  424. + return false;
  425. + }
  426. +
  427. + if ((player.getStatus().getLevel() < getConfigs().MIN_LEVEL) || (player.getStatus().getLevel() > getConfigs().MAX_LEVEL))
  428. + {
  429. + player.sendMessage("You are not eligible to participate in the opening event with this level.");
  430. + return false;
  431. + }
  432. +
  433. + if (first && (getCountPlayers() >= getConfigs().MAX_PARTICIPANTS))
  434. + {
  435. + player.sendMessage("The opening event has reached the maximum number of participants.");
  436. + return false;
  437. + }
  438. +
  439. + return true;
  440. + }
  441. +
  442. + /**
  443. + * Method called to start the event registration process
  444. + */
  445. + public void startRegistration()
  446. + {
  447. + setState(EventState.REGISTER);
  448. + }
  449. +
  450. + /**
  451. + * Method called to register a player in the event
  452. + * @param player as Player
  453. + * @return boolean: true if success, otherwise false
  454. + */
  455. + public boolean register(Player player)
  456. + {
  457. + if (player == null)
  458. + return false;
  459. +
  460. + if (!canRegister(player, true))
  461. + return false;
  462. +
  463. + final GameEventPlayer eventPlayer = new GameEventPlayer(player, getConfigs().PLAYER_CREDITS);
  464. +
  465. + if (getConfigs().ALLOW_TAKE_ITEM)
  466. + {
  467. + if (player.destroyItemByItemId("Event Participation Fee", getConfigs().TAKE_ITEM_ID, getConfigs().TAKE_COUNT, null, true))
  468. + {
  469. + if (addParticipant(eventPlayer))
  470. + return true;
  471. + }
  472. + }
  473. +
  474. + if (addParticipant(eventPlayer))
  475. + return true;
  476. +
  477. + return false;
  478. + }
  479. +
  480. + /**
  481. + * Method called to remove the player registration in the event
  482. + * @param player as Player
  483. + * @return boolean: true if success, otherwise false
  484. + */
  485. + public boolean unRegister(Player player)
  486. + {
  487. + if (player == null)
  488. + return false;
  489. +
  490. + if ((getState() == EventState.STARTED) || !isParticipant(player.getObjectId()))
  491. + {
  492. + player.sendMessage("You can't cancel your registration to the event at this moment!");
  493. + return false;
  494. + }
  495. +
  496. + if (removeParticipant(player))
  497. + {
  498. + player.sendMessage("Your registration at the " + _eventName + " Event was cancelled!");
  499. + return true;
  500. + }
  501. +
  502. + return false;
  503. + }
  504. +
  505. + /**
  506. + * Method called to start the event
  507. + * @return boolean: true if success, otherwise false
  508. + */
  509. + public boolean start()
  510. + {
  511. + if (getCountPlayers() >= getConfigs().MIN_PARTICIPANTS)
  512. + {
  513. + setState(EventState.STARTED);
  514. + closeDoors();
  515. + teleportPlayersToArena();
  516. + return true;
  517. + }
  518. + clear();
  519. + setState(EventState.INACTIVE);
  520. + return false;
  521. + }
  522. +
  523. + /**
  524. + * Method called to stop the running event
  525. + */
  526. + public void stop()
  527. + {
  528. + openDoors();
  529. + teleportPlayersBack();
  530. + clear();
  531. + setState(EventState.INACTIVE);
  532. + }
  533. +
  534. + /**
  535. + * Method used to close the instance door(s)
  536. + */
  537. + protected void closeDoors()
  538. + {
  539. + Collection<Door> doorsToClose = DoorData.getInstance().getDoors();
  540. +
  541. + for (Door door : doorsToClose)
  542. + {
  543. + if (door != null)
  544. + door.closeMe();
  545. + }
  546. + }
  547. +
  548. + /**
  549. + * Method used to open the instance door(s)
  550. + */
  551. + protected void openDoors()
  552. + {
  553. + Collection<Door> doorsToOpen = DoorData.getInstance().getDoors();
  554. +
  555. + for (Door door : doorsToOpen)
  556. + {
  557. + if (door != null)
  558. + door.openMe();
  559. + }
  560. + }
  561. +
  562. + /**
  563. + * Method called to put the kill rewards into the players inventory
  564. + * @param player as Player
  565. + */
  566. + protected void giveKillBonus(Player player)
  567. + {
  568. + SystemMessage systemMessage = null;
  569. +
  570. + player.addItem(_eventName, getConfigs().TAKE_ITEM_ID, getConfigs().TAKE_COUNT, player, true);
  571. +
  572. + if (getConfigs().TAKE_COUNT > 1)
  573. + {
  574. + systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
  575. + systemMessage.addItemName(getConfigs().TAKE_ITEM_ID);
  576. + systemMessage.addItemNumber(getConfigs().TAKE_COUNT);
  577. + }
  578. + else
  579. + {
  580. + systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
  581. + systemMessage.addItemName(getConfigs().TAKE_ITEM_ID);
  582. + }
  583. +
  584. + player.sendPacket(systemMessage);
  585. + }
  586. +
  587. + /**
  588. + * Method called to put the rewards into the players inventory
  589. + * @param player as Player
  590. + * @param rewards as Integer
  591. + */
  592. + protected void deliverRewards(Player player, int[][] rewards)
  593. + {
  594. + SystemMessage systemMessage = null;
  595. +
  596. + for (int[] reward : rewards)
  597. + {
  598. + player.getInventory().addItem(_eventName, reward[0], reward[1], player, player);
  599. +
  600. + if (reward[1] > 1)
  601. + {
  602. + systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
  603. + systemMessage.addItemName(reward[0]);
  604. + systemMessage.addItemNumber(reward[1]);
  605. + }
  606. + else
  607. + {
  608. + systemMessage = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
  609. + systemMessage.addItemName(reward[0]);
  610. + }
  611. +
  612. + player.sendPacket(systemMessage);
  613. + }
  614. + }
  615. +
  616. + /**
  617. + * Method called on Appearing packet received (player finished teleporting)<br>
  618. + * Buff player's with event buffs
  619. + * @param player
  620. + */
  621. + public void onTeleported(Player player)
  622. + {
  623. + if (!isRunning() || (player == null) || !isParticipant(player.getObjectId()))
  624. + return;
  625. +
  626. + if ((getConfigs().LIST_MAGE_SUPPORT != null) && (getConfigs().LIST_MAGE_SUPPORT.length != 0) || (getConfigs().LIST_FIGHTER_SUPPORT != null) && (getConfigs().LIST_FIGHTER_SUPPORT.length != 0))
  627. + {
  628. + for (Integer skillId : player.isMageClass() ? getConfigs().LIST_MAGE_SUPPORT : getConfigs().LIST_FIGHTER_SUPPORT)
  629. + {
  630. + final L2Skill skill = SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId));
  631. + if (skill != null)
  632. + skill.getEffects(player, player);
  633. + }
  634. + }
  635. + }
  636. +
  637. + /**
  638. + * Called when a player logs out
  639. + * @param player as Player
  640. + */
  641. + public void onLogout(Player player)
  642. + {
  643. + if ((player != null) && (isRunning() || isRegistrating()))
  644. + {
  645. + if (removeParticipant(player))
  646. + player.setXYZInvisible((83447 + Rnd.get(101)) - 50, (148638 + Rnd.get(101)) - 50, -3400); // Giran
  647. + }
  648. + }
  649. +
  650. + /**
  651. + * Method called on every summon item use
  652. + * @param objectId as Integer
  653. + * @return boolean: true if player is allowed to summon by item, otherwise false
  654. + */
  655. + public boolean onItemSummon(int objectId)
  656. + {
  657. + if (isRunning() && isParticipant(objectId) && !getConfigs().ALLOW_SUMMON_BY_ITEM)
  658. + return false;
  659. +
  660. + return true;
  661. + }
  662. +
  663. + /**
  664. + * Method called on every Scroll use
  665. + * @param objectId as Integer
  666. + * @return boolean: true if player is allowed to use scroll, otherwise false
  667. + */
  668. + public boolean onScrollUse(int objectId)
  669. + {
  670. + if (isRunning() && isParticipant(objectId) && !getConfigs().ALLOW_SCROLLS)
  671. + return false;
  672. +
  673. + return true;
  674. + }
  675. +
  676. + /**
  677. + * Method called on every Potion use
  678. + * @param objectId as Integer
  679. + * @return boolean: true if player is allowed to use potion, otherwise false
  680. + */
  681. + public boolean onPotionUse(int objectId)
  682. + {
  683. + if (isRunning() && isParticipant(objectId) && !getConfigs().ALLOW_POTIONS)
  684. + return false;
  685. +
  686. + return true;
  687. + }
  688. +
  689. + /**
  690. + * Method called on every Escape use
  691. + * @param objectId as Integer
  692. + * @return boolean: true if player is allowed to use escape, otherwise false
  693. + */
  694. + public boolean onEscapeUse(int objectId)
  695. + {
  696. + if (isRunning() && isParticipant(objectId))
  697. + return false;
  698. +
  699. + return true;
  700. + }
  701. +
  702. + /**
  703. + * Method called on every Item use
  704. + * @param actor as Player
  705. + * @param item as ItemInstance
  706. + * @return boolean: true if the player is allowed to use the item, otherwise false
  707. + */
  708. + public boolean onItemUse(Player actor, ItemInstance item)
  709. + {
  710. + if (!isRunning() || !isParticipant(actor.getObjectId()))
  711. + return true;
  712. +
  713. + if ((getConfigs().RESTRICT_ITEMS != null) && (getConfigs().RESTRICT_ITEMS.length != 0))
  714. + {
  715. + for (int itemId : getConfigs().RESTRICT_ITEMS)
  716. + {
  717. + if (item.getItemId() == itemId)
  718. + return false;
  719. + }
  720. + }
  721. +
  722. + return true;
  723. + }
  724. +
  725. + /**
  726. + * Method called when a player interact with an event npc
  727. + * @param player as Player
  728. + * @param npc as Npc
  729. + * @return boolean: true if implemented by the event, otherwise false
  730. + */
  731. + public boolean onInteract(Player player, Npc npc)
  732. + {
  733. + return false;
  734. + }
  735. +}
  736. \ No newline at end of file
  737. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventManager.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventManager.java
  738. new file mode 100644
  739. index 0000000..51f7689
  740. --- /dev/null
  741. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventManager.java
  742. @@ -0,0 +1,246 @@
  743. +package net.sf.l2j.gameserver.model.gameevent;
  744. +
  745. +import java.util.Calendar;
  746. +import java.util.HashMap;
  747. +import java.util.Map;
  748. +import java.util.concurrent.ScheduledFuture;
  749. +
  750. +import net.sf.l2j.commons.logging.CLogger;
  751. +import net.sf.l2j.commons.pool.ThreadPool;
  752. +
  753. +import net.sf.l2j.gameserver.model.World;
  754. +
  755. +public class GameEventManager
  756. +{
  757. + protected static final CLogger LOGGER = new CLogger(GameEventManager.class.getName());
  758. +
  759. + private final Map<String, GameEvent> _events;
  760. + private GameEvent _event;
  761. + private GameEventStartTask task;
  762. + private String _currentEventName = "-";
  763. + private String _nextEventInfo = "-";
  764. +
  765. + public GameEventManager()
  766. + {
  767. + _events = new HashMap<>();
  768. + _event = null;
  769. + }
  770. +
  771. + public void registerEvent(GameEvent gameEvent)
  772. + {
  773. + _events.put(gameEvent.getName(), gameEvent);
  774. + LOGGER.info("Game Event Engine - Event registered: " + gameEvent.getName());
  775. + }
  776. +
  777. + public GameEvent getEvent()
  778. + {
  779. + return _event;
  780. + }
  781. +
  782. + public void startRegistration()
  783. + {
  784. + _currentEventName = getEvent().getName();
  785. + _nextEventInfo = "-";
  786. + getEvent().startRegistration();
  787. + World.announceToOnlinePlayers(getEvent().getName() + " Event: Registration opened for " + getEvent().getConfigs().REGISTRATION_TIME + " minute(s). Type .join to register!", true);
  788. + task.setStartTime(System.currentTimeMillis() + (60000L * getEvent().getConfigs().REGISTRATION_TIME));
  789. + ThreadPool.execute(task);
  790. + }
  791. +
  792. + public void startEvent()
  793. + {
  794. + if (!getEvent().start())
  795. + {
  796. + World.announceToOnlinePlayers(getEvent().getName() + " Event: Event cancelled due to lack of Participation.", true);
  797. + scheduleNextEvent();
  798. + _currentEventName = "-";
  799. + }
  800. + else
  801. + {
  802. + getEvent().sysMsgToAllParticipants(getEvent().getName() + " Event: Teleporting participants to an arena in " + getEvent().getConfigs().TELEPORT_TIME + " second(s).");
  803. + task.setStartTime(System.currentTimeMillis() + (60000L * getEvent().getConfigs().EVENT_DURATION_TIME));
  804. + ThreadPool.execute(task);
  805. + }
  806. + }
  807. +
  808. + public void endEvent()
  809. + {
  810. + World.announceToOnlinePlayers(getEvent().getName() + " Event: " + getEvent().calculateRewards(), true);
  811. + getEvent().sysMsgToAllParticipants(getEvent().getName() + " Event: Teleporting back in " + getEvent().getConfigs().TELEPORT_TIME + " second(s).");
  812. + getEvent().stop();
  813. + scheduleNextEvent();
  814. + _currentEventName = "-";
  815. + }
  816. +
  817. + public Calendar nextEventStartTime(GameEvent gameEvent)
  818. + {
  819. + Calendar currentTime = Calendar.getInstance();
  820. + Calendar nextStartTime = null;
  821. +
  822. + if (gameEvent.getConfigs().EVENT_INTERVAL != null)
  823. + {
  824. + for (String timeOfDay : gameEvent.getConfigs().EVENT_INTERVAL)
  825. + {
  826. + Calendar testStartTime = Calendar.getInstance();
  827. + testStartTime.setLenient(true);
  828. +
  829. + String[] splitTimeOfDay = timeOfDay.split(":");
  830. + testStartTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(splitTimeOfDay[0]));
  831. + testStartTime.set(Calendar.MINUTE, Integer.parseInt(splitTimeOfDay[1]));
  832. +
  833. + if (testStartTime.getTimeInMillis() < currentTime.getTimeInMillis())
  834. + testStartTime.add(Calendar.DAY_OF_MONTH, 1);
  835. +
  836. + if ((nextStartTime == null) || (testStartTime.getTimeInMillis() < nextStartTime.getTimeInMillis()))
  837. + nextStartTime = testStartTime;
  838. + }
  839. + }
  840. + return nextStartTime;
  841. + }
  842. +
  843. + public void scheduleNextEvent()
  844. + {
  845. + if ((_events != null) && !_events.isEmpty())
  846. + {
  847. + Calendar nextStartTime = null;
  848. +
  849. + for (GameEvent gameEvent : _events.values())
  850. + {
  851. + final Calendar tempNextStartTime = nextEventStartTime(gameEvent);
  852. + if (tempNextStartTime == null)
  853. + continue;
  854. +
  855. + if (nextStartTime == null)
  856. + {
  857. + nextStartTime = tempNextStartTime;
  858. + _event = gameEvent;
  859. + }
  860. + else
  861. + {
  862. + if (tempNextStartTime.getTimeInMillis() < nextStartTime.getTimeInMillis())
  863. + {
  864. + nextStartTime = tempNextStartTime;
  865. + _event = gameEvent;
  866. + }
  867. + }
  868. + }
  869. +
  870. + if (nextStartTime != null)
  871. + {
  872. + _nextEventInfo = _event.getName() + " in " + ((nextStartTime.getTimeInMillis() - System.currentTimeMillis()) / 60000L) + " minutes!";
  873. + task = new GameEventStartTask(nextStartTime.getTimeInMillis());
  874. + ThreadPool.execute(task);
  875. + LOGGER.info("Game Event Engine - Next Event: " + _event.getName() + " in " + ((nextStartTime.getTimeInMillis() - System.currentTimeMillis()) / 60000L) + " minutes!");
  876. + }
  877. + }
  878. + }
  879. +
  880. + public void skipDelay()
  881. + {
  882. + if (task.nextRun.cancel(false))
  883. + {
  884. + task.setStartTime(System.currentTimeMillis());
  885. + ThreadPool.execute(task);
  886. + }
  887. + }
  888. +
  889. + public String getCurrentEventName()
  890. + {
  891. + return _currentEventName;
  892. + }
  893. +
  894. + public String getNextEventInfo()
  895. + {
  896. + return _nextEventInfo;
  897. + }
  898. +
  899. + public class GameEventStartTask implements Runnable
  900. + {
  901. + private long _startTime;
  902. + public ScheduledFuture<?> nextRun;
  903. +
  904. + public GameEventStartTask(long startTime)
  905. + {
  906. + _startTime = startTime;
  907. + }
  908. +
  909. + public void setStartTime(long startTime)
  910. + {
  911. + _startTime = startTime;
  912. + }
  913. +
  914. + @Override
  915. + public void run()
  916. + {
  917. + int delay = (int) Math.round((_startTime - System.currentTimeMillis()) / 1000.0);
  918. +
  919. + if (delay > 0)
  920. + announce(delay);
  921. +
  922. + int nextMsg = 0;
  923. + if (delay > 3600)
  924. + nextMsg = delay - 3600;
  925. + else if (delay > 1800)
  926. + nextMsg = delay - 1800;
  927. + else if (delay > 900)
  928. + nextMsg = delay - 900;
  929. + else if (delay > 600)
  930. + nextMsg = delay - 600;
  931. + else if (delay > 300)
  932. + nextMsg = delay - 300;
  933. + else if (delay > 60)
  934. + nextMsg = delay - 60;
  935. + else if (delay > 5)
  936. + nextMsg = delay - 5;
  937. + else if (delay > 0)
  938. + nextMsg = delay;
  939. + else
  940. + {
  941. + if (getEvent().isInactive())
  942. + startRegistration();
  943. + else if (getEvent().isRegistrating())
  944. + startEvent();
  945. + else
  946. + endEvent();
  947. + }
  948. +
  949. + if (delay > 0)
  950. + nextRun = ThreadPool.schedule(this, nextMsg * 1000);
  951. + }
  952. +
  953. + private void announce(long time)
  954. + {
  955. + if ((time >= 3600) && ((time % 3600) == 0))
  956. + {
  957. + if (getEvent().isRegistrating())
  958. + World.announceToOnlinePlayers(getEvent().getName() + " Event: " + (time / 60 / 60) + " hour(s) until registration is closed! Type .join to register!", true);
  959. + else if (getEvent().isRunning())
  960. + getEvent().sysMsgToAllParticipants(getEvent().getName() + " Event: " + (time / 60 / 60) + " hour(s) until event is finished!");
  961. + }
  962. + else if (time >= 60)
  963. + {
  964. + if (getEvent().isRegistrating())
  965. + World.announceToOnlinePlayers(getEvent().getName() + " Event: " + (time / 60) + " minute(s) until registration is closed! Type .join to register!", true);
  966. + else if (getEvent().isRunning())
  967. + getEvent().sysMsgToAllParticipants(getEvent().getName() + " Event: " + (time / 60) + " minute(s) until the event is finished!");
  968. + }
  969. + else
  970. + {
  971. + if (getEvent().isRegistrating())
  972. + World.announceToOnlinePlayers(getEvent().getName() + " Event: " + time + " second(s) until registration is closed! Type .join to register!", true);
  973. + else if (getEvent().isRunning())
  974. + getEvent().sysMsgToAllParticipants(getEvent().getName() + " Event: " + time + " second(s) until the event is finished!");
  975. + }
  976. + }
  977. + }
  978. +
  979. + public static GameEventManager getInstance()
  980. + {
  981. + return SingletonHolder.INSTANCE;
  982. + }
  983. +
  984. + private static class SingletonHolder
  985. + {
  986. + protected static final GameEventManager INSTANCE = new GameEventManager();
  987. + }
  988. +}
  989. \ No newline at end of file
  990. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventPlayer.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventPlayer.java
  991. new file mode 100644
  992. index 0000000..c20a952
  993. --- /dev/null
  994. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventPlayer.java
  995. @@ -0,0 +1,109 @@
  996. +package net.sf.l2j.gameserver.model.gameevent;
  997. +
  998. +import net.sf.l2j.gameserver.model.actor.Player;
  999. +
  1000. +public class GameEventPlayer implements Comparable<GameEventPlayer>
  1001. +{
  1002. + private Player _player;
  1003. + private int _kills;
  1004. + private int _deaths;
  1005. + private int _credits;
  1006. + private int _originalNameColor;
  1007. + private int _originalTitleColor;
  1008. + private int[] _originalCoordinates;
  1009. +
  1010. + public GameEventPlayer(Player player, int playerCredits)
  1011. + {
  1012. + _player = player;
  1013. + _kills = 0;
  1014. + _deaths = 0;
  1015. + _credits = playerCredits;
  1016. + }
  1017. +
  1018. + public Player getPlayer()
  1019. + {
  1020. + return _player;
  1021. + }
  1022. +
  1023. + public void setPlayer(Player player)
  1024. + {
  1025. + _player = player;
  1026. + }
  1027. +
  1028. + public int getKills()
  1029. + {
  1030. + return _kills;
  1031. + }
  1032. +
  1033. + public void increaseKills()
  1034. + {
  1035. + ++_kills;
  1036. + }
  1037. +
  1038. + public int getDeaths()
  1039. + {
  1040. + return _deaths;
  1041. + }
  1042. +
  1043. + public int getCredits()
  1044. + {
  1045. + return _credits;
  1046. + }
  1047. +
  1048. + public void increaseDeaths()
  1049. + {
  1050. + ++_deaths;
  1051. + }
  1052. +
  1053. + public void decreaseCredits()
  1054. + {
  1055. + --_credits;
  1056. + }
  1057. +
  1058. + public int getOriginalNameColor()
  1059. + {
  1060. + return _originalNameColor;
  1061. + }
  1062. +
  1063. + public int getOriginalTitleColor()
  1064. + {
  1065. + return _originalTitleColor;
  1066. + }
  1067. +
  1068. + public void setOriginalNameColor(int originalNameColor)
  1069. + {
  1070. + _originalNameColor = originalNameColor;
  1071. + }
  1072. +
  1073. + public void setOriginalTitleColor(int originalTitleColor)
  1074. + {
  1075. + _originalTitleColor = originalTitleColor;
  1076. + }
  1077. +
  1078. + public int[] getOriginalCoordinates()
  1079. + {
  1080. + return _originalCoordinates;
  1081. + }
  1082. +
  1083. + public void setOriginalCoordinates(int[] originalCoordinates)
  1084. + {
  1085. + _originalCoordinates = originalCoordinates;
  1086. + }
  1087. +
  1088. + @Override
  1089. + public int compareTo(GameEventPlayer anotherEventPlayer)
  1090. + {
  1091. + Integer c1 = Integer.valueOf(anotherEventPlayer.getKills() - getKills());
  1092. + Integer c2 = Integer.valueOf(getDeaths() - anotherEventPlayer.getDeaths());
  1093. + Integer c3 = getPlayer().getName().compareTo(anotherEventPlayer.getPlayer().getName());
  1094. +
  1095. + if (c1 == 0)
  1096. + {
  1097. + if (c2 == 0)
  1098. + return c3;
  1099. +
  1100. + return c2;
  1101. + }
  1102. + return c1;
  1103. + }
  1104. +}
  1105. \ No newline at end of file
  1106. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventTeam.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventTeam.java
  1107. new file mode 100644
  1108. index 0000000..8eec94f
  1109. --- /dev/null
  1110. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventTeam.java
  1111. @@ -0,0 +1,95 @@
  1112. +package net.sf.l2j.gameserver.model.gameevent;
  1113. +
  1114. +import java.util.Map;
  1115. +import java.util.concurrent.ConcurrentHashMap;
  1116. +
  1117. +public class GameEventTeam
  1118. +{
  1119. + private final int _id;
  1120. + private final String _name;
  1121. + private final int _color;
  1122. + private final int[] _coordinates;
  1123. + private int _points;
  1124. + private final Map<Integer, GameEventPlayer> _participatedPlayers;
  1125. +
  1126. + public GameEventTeam(int id, String name, int color, int[] coordinates)
  1127. + {
  1128. + _id = id;
  1129. + _name = name;
  1130. + _color = color;
  1131. + _coordinates = coordinates;
  1132. + _points = 0;
  1133. + _participatedPlayers = new ConcurrentHashMap<>();
  1134. + }
  1135. +
  1136. + public boolean addPlayer(GameEventPlayer eventPlayer)
  1137. + {
  1138. + if (eventPlayer == null)
  1139. + return false;
  1140. +
  1141. + _participatedPlayers.put(eventPlayer.getPlayer().getObjectId(), eventPlayer);
  1142. +
  1143. + return true;
  1144. + }
  1145. +
  1146. + public void removePlayer(int objectId)
  1147. + {
  1148. + _participatedPlayers.remove(objectId);
  1149. + }
  1150. +
  1151. + public void increasePoints()
  1152. + {
  1153. + ++_points;
  1154. + }
  1155. +
  1156. + public void cleanMe()
  1157. + {
  1158. + _participatedPlayers.clear();
  1159. + _points = 0;
  1160. + }
  1161. +
  1162. + public boolean containsPlayer(int objectId)
  1163. + {
  1164. + return _participatedPlayers.containsKey(objectId);
  1165. + }
  1166. +
  1167. + public int getId()
  1168. + {
  1169. + return _id;
  1170. + }
  1171. +
  1172. + public String getName()
  1173. + {
  1174. + return _name;
  1175. + }
  1176. +
  1177. + public int getColor()
  1178. + {
  1179. + return _color;
  1180. + }
  1181. +
  1182. + public int[] getCoordinates()
  1183. + {
  1184. + return _coordinates;
  1185. + }
  1186. +
  1187. + public int getPoints()
  1188. + {
  1189. + return _points;
  1190. + }
  1191. +
  1192. + public Map<Integer, GameEventPlayer> getParticipatedPlayers()
  1193. + {
  1194. + return _participatedPlayers;
  1195. + }
  1196. +
  1197. + public int getParticipatedPlayerCount()
  1198. + {
  1199. + return _participatedPlayers.size();
  1200. + }
  1201. +
  1202. + public GameEventPlayer getEventPlayer(int objectId)
  1203. + {
  1204. + return _participatedPlayers.get(objectId);
  1205. + }
  1206. +}
  1207. \ No newline at end of file
  1208. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventTeleporter.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventTeleporter.java
  1209. new file mode 100644
  1210. index 0000000..4c66e71
  1211. --- /dev/null
  1212. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/GameEventTeleporter.java
  1213. @@ -0,0 +1,107 @@
  1214. +package net.sf.l2j.gameserver.model.gameevent;
  1215. +
  1216. +import net.sf.l2j.commons.pool.ThreadPool;
  1217. +import net.sf.l2j.commons.random.Rnd;
  1218. +
  1219. +import net.sf.l2j.gameserver.enums.MessageType;
  1220. +import net.sf.l2j.gameserver.enums.TeamType;
  1221. +import net.sf.l2j.gameserver.model.actor.Player;
  1222. +import net.sf.l2j.gameserver.model.actor.Summon;
  1223. +import net.sf.l2j.gameserver.model.entity.Duel.DuelState;
  1224. +import net.sf.l2j.gameserver.model.group.Party;
  1225. +
  1226. +public class GameEventTeleporter implements Runnable
  1227. +{
  1228. + private GameEventPlayer _eventPlayer = null;
  1229. + private GameEvent _event = null;
  1230. + private int[] _coordinates = new int[3];
  1231. +
  1232. + public GameEventTeleporter(GameEventPlayer eventPlayer, int[] coordinates, boolean fastSchedule)
  1233. + {
  1234. + _eventPlayer = eventPlayer;
  1235. + _event = eventPlayer.getPlayer().getEvent();
  1236. + _coordinates = coordinates;
  1237. + ThreadPool.schedule(this, fastSchedule ? 0 : _event.getConfigs().TELEPORT_TIME * 1000);
  1238. + }
  1239. +
  1240. + @Override
  1241. + public void run()
  1242. + {
  1243. + if ((_eventPlayer == null) || (_event == null))
  1244. + return;
  1245. +
  1246. + final Player player = _eventPlayer.getPlayer();
  1247. + if (player == null)
  1248. + return;
  1249. +
  1250. + final Summon summon = player.getSummon();
  1251. + if (summon != null)
  1252. + summon.unSummon(player);
  1253. +
  1254. + if (_event.getConfigs().STOP_ALL_EFFECTS == true)
  1255. + player.stopAllEffectsExceptThoseThatLastThroughDeath();
  1256. +
  1257. + if (player.isInParty())
  1258. + {
  1259. + final Party party = player.getParty();
  1260. + party.removePartyMember(player, MessageType.EXPELLED);
  1261. + }
  1262. +
  1263. + if (player.isInDuel())
  1264. + player.setDuelState(DuelState.INTERRUPTED);
  1265. +
  1266. + player.doRevive();
  1267. +
  1268. + player.teleportTo((_coordinates[0] + Rnd.get(101)) - 50, (_coordinates[1] + Rnd.get(101)) - 50, _coordinates[2], 0);
  1269. +
  1270. + if (_event.isRunning())
  1271. + {
  1272. + _eventPlayer.setOriginalNameColor(player.getAppearance().getNameColor());
  1273. + _eventPlayer.setOriginalTitleColor(player.getAppearance().getTitleColor());
  1274. +
  1275. + if (_event instanceof TeamGameEvent)
  1276. + {
  1277. + TeamGameEvent teamGameEvent = (TeamGameEvent) _event;
  1278. +
  1279. + final GameEventTeam team = teamGameEvent.getParticipantTeam(player.getObjectId());
  1280. + if (team != null)
  1281. + {
  1282. + if (teamGameEvent.getConfigs().TEAMS.size() <= 2)
  1283. + player.setTeam(team.getId() == 1 ? TeamType.BLUE : TeamType.RED);
  1284. + else
  1285. + player.getAppearance().setNameColor(team.getColor());
  1286. + }
  1287. + }
  1288. + else if (_event instanceof IndividualGameEvent)
  1289. + player.setTeam(TeamType.BLUE);
  1290. +
  1291. + if (_event.getConfigs().HIDE_PLAYERS_IDENTITY)
  1292. + player.getAppearance().setTitleColor(Integer.decode("0x" + "333333"));
  1293. +
  1294. + player.doRevive();
  1295. + }
  1296. + else
  1297. + {
  1298. + if (_event instanceof TeamGameEvent)
  1299. + {
  1300. + TeamGameEvent teamGameEvent = (TeamGameEvent) _event;
  1301. +
  1302. + if (teamGameEvent.getConfigs().TEAMS.size() <= 2)
  1303. + player.setTeam(TeamType.NONE);
  1304. + else
  1305. + player.getAppearance().setNameColor(_eventPlayer.getOriginalNameColor());
  1306. + }
  1307. + else if (_event instanceof IndividualGameEvent)
  1308. + player.setTeam(TeamType.NONE);
  1309. +
  1310. + if (_event.getConfigs().HIDE_PLAYERS_IDENTITY)
  1311. + player.getAppearance().setTitleColor(_eventPlayer.getOriginalTitleColor());
  1312. +
  1313. + player.doRevive();
  1314. + player.setEvent(null);
  1315. + }
  1316. +
  1317. + player.getStatus().setMaxCpHpMp();
  1318. + player.broadcastUserInfo();
  1319. + }
  1320. +}
  1321. \ No newline at end of file
  1322. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/IndividualGameEvent.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/IndividualGameEvent.java
  1323. new file mode 100644
  1324. index 0000000..521dbd5
  1325. --- /dev/null
  1326. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/IndividualGameEvent.java
  1327. @@ -0,0 +1,245 @@
  1328. +package net.sf.l2j.gameserver.model.gameevent;
  1329. +
  1330. +import java.util.Map;
  1331. +import java.util.TreeSet;
  1332. +
  1333. +import net.sf.l2j.gameserver.enums.SayType;
  1334. +import net.sf.l2j.gameserver.model.actor.Player;
  1335. +import net.sf.l2j.gameserver.model.gameevent.config.IndividualGameEventConfig;
  1336. +import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
  1337. +import net.sf.l2j.gameserver.skills.L2Skill;
  1338. +
  1339. +public abstract class IndividualGameEvent extends GameEvent
  1340. +{
  1341. + protected Map<Integer, GameEventPlayer> _participants;
  1342. +
  1343. + @Override
  1344. + public abstract IndividualGameEventConfig getConfigs();
  1345. +
  1346. + /**
  1347. + * Method called to verify if a player is participant at the event
  1348. + * @param eventPlayerObjectId as Integer
  1349. + * @return boolean: true if the player is participant, otherwise false
  1350. + */
  1351. + @Override
  1352. + public boolean isParticipant(int eventPlayerObjectId)
  1353. + {
  1354. + return _participants.containsKey(eventPlayerObjectId);
  1355. + }
  1356. +
  1357. + /**
  1358. + * Method that returns the total of the event players
  1359. + * @return Integer playersCount
  1360. + */
  1361. + @Override
  1362. + public int getCountPlayers()
  1363. + {
  1364. + return _participants.size();
  1365. + }
  1366. +
  1367. + /**
  1368. + * Add a GameEvent player to a team
  1369. + * @param eventPlayer as GameEventPlayer
  1370. + * @return boolean: true if success, otherwise false
  1371. + */
  1372. + @Override
  1373. + public boolean addParticipant(GameEventPlayer eventPlayer)
  1374. + {
  1375. + if (_participants.containsKey(eventPlayer.getPlayer().getObjectId()))
  1376. + return false;
  1377. +
  1378. + _participants.put(eventPlayer.getPlayer().getObjectId(), eventPlayer);
  1379. + eventPlayer.getPlayer().setEvent(this);
  1380. +
  1381. + return true;
  1382. + }
  1383. +
  1384. + /**
  1385. + * Removes a GameEvent player from it's team
  1386. + * @param player as Player
  1387. + * @return boolean: true if success, otherwise false
  1388. + */
  1389. + @Override
  1390. + public boolean removeParticipant(Player player)
  1391. + {
  1392. + if (!_participants.containsKey(player.getObjectId()))
  1393. + return false;
  1394. +
  1395. + _participants.remove(player.getObjectId());
  1396. + player.setEvent(null);
  1397. +
  1398. + return true;
  1399. + }
  1400. +
  1401. + /**
  1402. + * Method called to teleport players to the arena
  1403. + */
  1404. + @Override
  1405. + public void teleportPlayersToArena()
  1406. + {
  1407. + for (GameEventPlayer eventPlayer : _participants.values())
  1408. + {
  1409. + if ((eventPlayer != null) && (eventPlayer.getPlayer() != null))
  1410. + {
  1411. + int[] playerCoordinates = new int[]
  1412. + {
  1413. + eventPlayer.getPlayer().getX(),
  1414. + eventPlayer.getPlayer().getY(),
  1415. + eventPlayer.getPlayer().getZ(),
  1416. + };
  1417. + eventPlayer.setOriginalCoordinates(playerCoordinates);
  1418. + new GameEventTeleporter(eventPlayer, getConfigs().EVENT_COORDINATES, false);
  1419. + }
  1420. + }
  1421. + }
  1422. +
  1423. + /**
  1424. + * Method called to teleport players back
  1425. + */
  1426. + @Override
  1427. + public void teleportPlayersBack()
  1428. + {
  1429. + for (GameEventPlayer eventPlayer : _participants.values())
  1430. + {
  1431. + if ((eventPlayer != null) && (eventPlayer.getPlayer() != null))
  1432. + new GameEventTeleporter(eventPlayer, eventPlayer.getOriginalCoordinates(), false);
  1433. + }
  1434. + }
  1435. +
  1436. + /**
  1437. + * Method used to send messages to all the event participants
  1438. + * @param message as String
  1439. + */
  1440. + @Override
  1441. + public void sysMsgToAllParticipants(String message)
  1442. + {
  1443. + for (GameEventPlayer eventPlayer : _participants.values())
  1444. + {
  1445. + if ((eventPlayer != null) && (eventPlayer.getPlayer() != null))
  1446. + eventPlayer.getPlayer().sendPacket(new CreatureSay(SayType.CRITICAL_ANNOUNCE, _eventName, message));
  1447. + }
  1448. + }
  1449. +
  1450. + /**
  1451. + * Method called to get the informations about the 1st position player
  1452. + * @param countPos as Integer
  1453. + * @return String: player informations
  1454. + */
  1455. + public String[] getFirstPosition(int countPos)
  1456. + {
  1457. + TreeSet<GameEventPlayer> players = new TreeSet<>();
  1458. + players.addAll(_participants.values());
  1459. +
  1460. + String text = "";
  1461. +
  1462. + for (int i = 0; i < countPos; i++)
  1463. + {
  1464. + if (players.isEmpty())
  1465. + break;
  1466. +
  1467. + GameEventPlayer player = players.first();
  1468. + if (player.getKills() == 0)
  1469. + break;
  1470. +
  1471. + text = player.getPlayer().getName() + "," + String.valueOf(player.getKills()) + ";";
  1472. + players.remove(player);
  1473. +
  1474. + int playerPointPrev = player.getKills();
  1475. +
  1476. + if (!getConfigs().REWARD_EVENT_TIE)
  1477. + continue;
  1478. +
  1479. + while (!players.isEmpty())
  1480. + {
  1481. + player = players.first();
  1482. + if (player.getKills() != playerPointPrev)
  1483. + break;
  1484. +
  1485. + text = player.getPlayer().getName() + "," + String.valueOf(player.getKills()) + ";";
  1486. + players.remove(player);
  1487. + }
  1488. + }
  1489. +
  1490. + if (text != "")
  1491. + return text.split("\\;");
  1492. +
  1493. + return null;
  1494. + }
  1495. +
  1496. + /**
  1497. + * Method called on every Skill use
  1498. + * @param caster as Player
  1499. + * @param skill as L2Skill
  1500. + * @return boolean: true if the player is allowed to use the skill, otherwise false
  1501. + */
  1502. + @Override
  1503. + public boolean onSkillUse(Player caster, L2Skill skill)
  1504. + {
  1505. + if (!isRunning() || !isParticipant(caster.getObjectId()))
  1506. + return true;
  1507. +
  1508. + if ((getConfigs().RESTRICT_SKILLS != null) && (getConfigs().RESTRICT_SKILLS.length != 0))
  1509. + {
  1510. + for (int skillId : getConfigs().RESTRICT_SKILLS)
  1511. + {
  1512. + if (skillId == skill.getId())
  1513. + return false;
  1514. + }
  1515. + }
  1516. +
  1517. + return true;
  1518. + }
  1519. +
  1520. + /**
  1521. + * Method called on every onAction in L2PcIstance
  1522. + * @param player as Player
  1523. + * @param targetedPlayerObjectId as Integer
  1524. + * @return boolean: true if player is allowed to target, otherwise false
  1525. + */
  1526. + @Override
  1527. + public boolean onAction(Player player, int targetedPlayerObjectId)
  1528. + {
  1529. + if ((player == null) || !isRunning())
  1530. + return true;
  1531. +
  1532. + if (player.isGM())
  1533. + return true;
  1534. +
  1535. + if (!isParticipant(player.getObjectId()) && isParticipant(targetedPlayerObjectId))
  1536. + return false;
  1537. +
  1538. + if (isParticipant(player.getObjectId()) && !isParticipant(targetedPlayerObjectId))
  1539. + return false;
  1540. +
  1541. + return true;
  1542. + }
  1543. +
  1544. + /**
  1545. + * Method called when a player logs in
  1546. + * @param player as Player
  1547. + */
  1548. + @Override
  1549. + public void onLogin(Player player)
  1550. + {
  1551. + if ((player == null) || (!isRunning()))
  1552. + return;
  1553. +
  1554. + if (isParticipant(player.getObjectId()))
  1555. + {
  1556. + final GameEventPlayer eventPlayer = _participants.get(player.getObjectId());
  1557. + if (eventPlayer == null)
  1558. + return;
  1559. +
  1560. + new GameEventTeleporter(eventPlayer, getConfigs().EVENT_COORDINATES, true);
  1561. + }
  1562. + }
  1563. +
  1564. + /**
  1565. + * Method called to clear event attributes
  1566. + */
  1567. + @Override
  1568. + protected void clear()
  1569. + {
  1570. + _participants.clear();
  1571. + }
  1572. +}
  1573. \ No newline at end of file
  1574. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/TeamGameEvent.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/TeamGameEvent.java
  1575. new file mode 100644
  1576. index 0000000..87e7cab
  1577. --- /dev/null
  1578. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/TeamGameEvent.java
  1579. @@ -0,0 +1,360 @@
  1580. +package net.sf.l2j.gameserver.model.gameevent;
  1581. +
  1582. +import java.util.ArrayList;
  1583. +import java.util.List;
  1584. +
  1585. +import net.sf.l2j.gameserver.enums.SayType;
  1586. +import net.sf.l2j.gameserver.model.actor.Player;
  1587. +import net.sf.l2j.gameserver.model.gameevent.config.TeamGameEventConfig;
  1588. +import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
  1589. +import net.sf.l2j.gameserver.skills.L2Skill;
  1590. +
  1591. +public abstract class TeamGameEvent extends GameEvent
  1592. +{
  1593. + protected GameEventTeam[] _teams;
  1594. + protected int _rounds = 1;
  1595. +
  1596. + @Override
  1597. + public abstract TeamGameEventConfig getConfigs();
  1598. +
  1599. + /**
  1600. + * Method called to verify if a player is participant at the event
  1601. + * @param objectId as Integer
  1602. + * @return boolean: true if the player is participant, otherwise false
  1603. + */
  1604. + @Override
  1605. + public boolean isParticipant(int objectId)
  1606. + {
  1607. + boolean isParticipant = false;
  1608. + for (GameEventTeam team : _teams)
  1609. + {
  1610. + if (team.containsPlayer(objectId))
  1611. + isParticipant = true;
  1612. + }
  1613. + return isParticipant;
  1614. + }
  1615. +
  1616. + /**
  1617. + * Method that returns the total of the event players
  1618. + * @return Integer playersCount
  1619. + */
  1620. + @Override
  1621. + public int getCountPlayers()
  1622. + {
  1623. + int playersCount = 0;
  1624. +
  1625. + for (GameEventTeam team : _teams)
  1626. + playersCount = team.getParticipatedPlayerCount();
  1627. +
  1628. + return playersCount;
  1629. + }
  1630. +
  1631. + /**
  1632. + * Method that returns a list of the event teams
  1633. + * @return GameEventTeam[]: _teams
  1634. + */
  1635. + public GameEventTeam[] getTeams()
  1636. + {
  1637. + return _teams;
  1638. + }
  1639. +
  1640. + /**
  1641. + * Method that returns the team id with less players
  1642. + * @return GameEventTeam team
  1643. + */
  1644. + private GameEventTeam getTeamWithMinPlayers()
  1645. + {
  1646. + GameEventTeam teamWithMinPlayers = null;
  1647. + int playersCount = getConfigs().MAX_PARTICIPANTS;
  1648. +
  1649. + for (GameEventTeam team : _teams)
  1650. + {
  1651. + if (playersCount > team.getParticipatedPlayerCount())
  1652. + {
  1653. + playersCount = team.getParticipatedPlayerCount();
  1654. + teamWithMinPlayers = team;
  1655. + }
  1656. + }
  1657. + return teamWithMinPlayers;
  1658. + }
  1659. +
  1660. + /**
  1661. + * Method used to retrieve the Team of the event player
  1662. + * @param objectId as Integer
  1663. + * @return GameEventTeam participantTeam
  1664. + */
  1665. + public GameEventTeam getParticipantTeam(int objectId)
  1666. + {
  1667. + GameEventTeam participantTeam = null;
  1668. + for (GameEventTeam team : _teams)
  1669. + {
  1670. + if (team.containsPlayer(objectId))
  1671. + participantTeam = team;
  1672. + }
  1673. +
  1674. + return participantTeam;
  1675. + }
  1676. +
  1677. + /**
  1678. + * Add a GameEvent player to a team
  1679. + * @param eventPlayer as GameEventPlayer
  1680. + * @return boolean: true if success, otherwise false
  1681. + */
  1682. + @Override
  1683. + public boolean addParticipant(GameEventPlayer eventPlayer)
  1684. + {
  1685. + if (getTeamWithMinPlayers().addPlayer(eventPlayer))
  1686. + {
  1687. + eventPlayer.getPlayer().setEvent(this);
  1688. + return true;
  1689. + }
  1690. + return false;
  1691. + }
  1692. +
  1693. + /**
  1694. + * Removes a GameEvent player from it's team
  1695. + * @param player as Player
  1696. + * @return boolean: true if success, otherwise false
  1697. + */
  1698. + @Override
  1699. + public boolean removeParticipant(Player player)
  1700. + {
  1701. + final GameEventTeam playerTeam = getParticipantTeam(player.getObjectId());
  1702. + if (playerTeam != null)
  1703. + {
  1704. + playerTeam.removePlayer(player.getObjectId());
  1705. + player.setEvent(null);
  1706. +
  1707. + return true;
  1708. + }
  1709. +
  1710. + return false;
  1711. + }
  1712. +
  1713. + /**
  1714. + * Method called to teleport players to the arena
  1715. + */
  1716. + @Override
  1717. + public void teleportPlayersToArena()
  1718. + {
  1719. + for (GameEventTeam team : _teams)
  1720. + {
  1721. + for (GameEventPlayer eventPlayer : team.getParticipatedPlayers().values())
  1722. + {
  1723. + if ((eventPlayer != null) && (eventPlayer.getPlayer() != null))
  1724. + {
  1725. + int[] playerCoordinates = new int[]
  1726. + {
  1727. + eventPlayer.getPlayer().getX(),
  1728. + eventPlayer.getPlayer().getY(),
  1729. + eventPlayer.getPlayer().getZ(),
  1730. + };
  1731. + eventPlayer.setOriginalCoordinates(playerCoordinates);
  1732. + eventPlayer.getPlayer().doRevive();
  1733. + new GameEventTeleporter(eventPlayer, team.getCoordinates(), false);
  1734. + }
  1735. + }
  1736. + }
  1737. + }
  1738. +
  1739. + /**
  1740. + * Method called to teleport players back
  1741. + */
  1742. + @Override
  1743. + public void teleportPlayersBack()
  1744. + {
  1745. + for (GameEventTeam team : _teams)
  1746. + {
  1747. + for (GameEventPlayer eventPlayer : team.getParticipatedPlayers().values())
  1748. + {
  1749. + if ((eventPlayer != null) && (eventPlayer.getPlayer() != null))
  1750. + new GameEventTeleporter(eventPlayer, eventPlayer.getOriginalCoordinates(), false);
  1751. + }
  1752. + }
  1753. + }
  1754. +
  1755. + /**
  1756. + * Method called to set the winner teams
  1757. + * @return String: msg
  1758. + */
  1759. + @Override
  1760. + public String calculateRewards()
  1761. + {
  1762. + List<GameEventTeam> winners = new ArrayList<>(getConfigs().TEAMS.size());
  1763. + GameEventTeam winnerTeam = null;
  1764. + int maxPoints = 0;
  1765. + String msg = "";
  1766. +
  1767. + for (GameEventTeam team : _teams)
  1768. + {
  1769. + if ((maxPoints == 0) && (team.getPoints() > 0))
  1770. + {
  1771. + maxPoints = team.getPoints();
  1772. + winnerTeam = team;
  1773. + }
  1774. + else if ((team.getPoints() == maxPoints) && (team.getPoints() > 0))
  1775. + {
  1776. + maxPoints = team.getPoints();
  1777. + winners.add(team);
  1778. + winners.add(winnerTeam);
  1779. + winnerTeam = null;
  1780. + }
  1781. + else if ((team.getPoints() > maxPoints))
  1782. + {
  1783. + maxPoints = team.getPoints();
  1784. + winnerTeam = team;
  1785. + winners.clear();
  1786. + }
  1787. + }
  1788. +
  1789. + setState(EventState.REWARDING);
  1790. +
  1791. + if (winnerTeam != null)
  1792. + {
  1793. + reward(winnerTeam);
  1794. + msg = _eventName + ": Event finish. Team " + winnerTeam.getName() + " won with " + winnerTeam.getPoints() + " kills.";
  1795. + }
  1796. + else if (winners.size() >= 2)
  1797. + {
  1798. + if (getConfigs().REWARD_EVENT_TIE)
  1799. + {
  1800. + for (GameEventTeam team : winners)
  1801. + reward(team);
  1802. + }
  1803. + msg = _eventName + ": Event has ended with both teams tying!";
  1804. + }
  1805. + else if (winners.isEmpty())
  1806. + msg = _eventName + ": Event has ended with both teams tying without any points!";
  1807. +
  1808. + winners.clear();
  1809. +
  1810. + return msg;
  1811. + }
  1812. +
  1813. + /**
  1814. + * Method used to reward the winner team(s)
  1815. + * @param team as GameEventTeam
  1816. + */
  1817. + public void reward(GameEventTeam team)
  1818. + {
  1819. + for (GameEventPlayer eventPlayer : team.getParticipatedPlayers().values())
  1820. + {
  1821. + if (eventPlayer == null)
  1822. + continue;
  1823. +
  1824. + final Player player = eventPlayer.getPlayer();
  1825. + if (player == null)
  1826. + continue;
  1827. +
  1828. + if (getConfigs().REQUIRE_MIN_FRAGS_TO_REWARD && (eventPlayer.getKills() < getConfigs().MIN_FRAGS_TO_REWARD))
  1829. + {
  1830. + player.sendMessage("You did not killed enough players at the event to receive the reward!");
  1831. + continue;
  1832. + }
  1833. +
  1834. + if (getConfigs().REWARDS != null)
  1835. + deliverRewards(player, getConfigs().REWARDS);
  1836. + }
  1837. + }
  1838. +
  1839. + /**
  1840. + * Method used to send messages to all the event participants
  1841. + * @param message as String
  1842. + */
  1843. + @Override
  1844. + public void sysMsgToAllParticipants(String message)
  1845. + {
  1846. + for (GameEventTeam team : _teams)
  1847. + {
  1848. + for (GameEventPlayer eventPlayer : team.getParticipatedPlayers().values())
  1849. + {
  1850. + if ((eventPlayer != null) && (eventPlayer.getPlayer() != null))
  1851. + {
  1852. + final CreatureSay cs = new CreatureSay(SayType.CRITICAL_ANNOUNCE, _eventName, message);
  1853. + eventPlayer.getPlayer().sendPacket(cs);
  1854. + }
  1855. + }
  1856. + }
  1857. + }
  1858. +
  1859. + /**
  1860. + * Method called on every Skill use
  1861. + * @param caster as Player
  1862. + * @param skill as L2Skill
  1863. + * @return boolean: true if the player is allowed to use the skill, otherwise false
  1864. + */
  1865. + @Override
  1866. + public boolean onSkillUse(Player caster, L2Skill skill)
  1867. + {
  1868. + if (!isRunning() || !isParticipant(caster.getObjectId()))
  1869. + return true;
  1870. +
  1871. + if ((getConfigs().RESTRICT_SKILLS != null) && (getConfigs().RESTRICT_SKILLS.length != 0))
  1872. + {
  1873. + for (int skillId : getConfigs().RESTRICT_SKILLS)
  1874. + {
  1875. + if (skillId == skill.getId())
  1876. + return false;
  1877. + }
  1878. + }
  1879. + return true;
  1880. + }
  1881. +
  1882. + /**
  1883. + * Method called on every onAction in L2PcIstance
  1884. + * @param player as Player
  1885. + * @param targetedPlayerObjectId as Integer
  1886. + * @return boolean: true if player is allowed to target, otherwise false
  1887. + */
  1888. + @Override
  1889. + public boolean onAction(Player player, int targetedPlayerObjectId)
  1890. + {
  1891. + if ((player == null) || !isRunning())
  1892. + return true;
  1893. +
  1894. + if (player.isGM())
  1895. + return true;
  1896. +
  1897. + GameEventTeam playerTeam = getParticipantTeam(player.getObjectId());
  1898. + GameEventTeam targetedPlayerTeam = getParticipantTeam(targetedPlayerObjectId);
  1899. +
  1900. + if (((playerTeam != null) && (targetedPlayerTeam == null)) || ((playerTeam == null) && (targetedPlayerTeam != null)))
  1901. + return false;
  1902. +
  1903. + if ((playerTeam != null) && (targetedPlayerTeam != null) && (playerTeam == targetedPlayerTeam) && (player.getObjectId() != targetedPlayerObjectId) && !getConfigs().ALLOW_TARGET_TEAM_MEMBERS)
  1904. + return false;
  1905. +
  1906. + return true;
  1907. + }
  1908. +
  1909. + /**
  1910. + * Method called when a player logs in
  1911. + * @param player as Player
  1912. + */
  1913. + @Override
  1914. + public void onLogin(Player player)
  1915. + {
  1916. + if ((player == null) || (!isRunning()))
  1917. + return;
  1918. +
  1919. + final GameEventTeam team = getParticipantTeam(player.getObjectId());
  1920. + if (team == null)
  1921. + return;
  1922. +
  1923. + final GameEventPlayer eventPlayer = team.getEventPlayer(player.getObjectId());
  1924. + if (eventPlayer == null)
  1925. + return;
  1926. +
  1927. + new GameEventTeleporter(eventPlayer, team.getCoordinates(), true);
  1928. + }
  1929. +
  1930. + /**
  1931. + * Method called to clear event attributes
  1932. + */
  1933. + @Override
  1934. + protected void clear()
  1935. + {
  1936. + for (GameEventTeam team : _teams)
  1937. + team.cleanMe();
  1938. + }
  1939. +}
  1940. \ No newline at end of file
  1941. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/GameEventConfig.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/GameEventConfig.java
  1942. new file mode 100644
  1943. index 0000000..3e7eea3
  1944. --- /dev/null
  1945. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/GameEventConfig.java
  1946. @@ -0,0 +1,33 @@
  1947. +package net.sf.l2j.gameserver.model.gameevent.config;
  1948. +
  1949. +public abstract class GameEventConfig
  1950. +{
  1951. + public String[] EVENT_INTERVAL;
  1952. + public byte EVENT_DURATION_TIME = 10;
  1953. + public byte TELEPORT_TIME = 15;
  1954. + public byte REGISTRATION_TIME = 10;
  1955. + public short MIN_PARTICIPANTS = 2;
  1956. + public short MAX_PARTICIPANTS = 10;
  1957. + public byte MIN_LEVEL = 1;
  1958. + public byte MAX_LEVEL = 85;
  1959. + public boolean ALLOW_TAKE_ITEM = false;
  1960. + public short TAKE_ITEM_ID = 0;
  1961. + public int TAKE_COUNT = 0;
  1962. + public boolean ALLOW_KILL_BONUS = false;
  1963. + public short KILL_BONUS_ID = 0;
  1964. + public int KILL_BONUS_COUNT = 0;
  1965. + public boolean STOP_ALL_EFFECTS = true;
  1966. + public int[] LIST_MAGE_SUPPORT;
  1967. + public int[] LIST_FIGHTER_SUPPORT;
  1968. + public int[] RESTRICT_ITEMS;
  1969. + public int[] RESTRICT_SKILLS;
  1970. + public boolean HIDE_PLAYERS_IDENTITY = false;
  1971. + public boolean REWARD_EVENT_TIE = false;
  1972. + public int[][] REWARDS;
  1973. + public boolean ALLOW_POTIONS = false;
  1974. + public boolean ALLOW_SCROLLS = false;
  1975. + public boolean ALLOW_SUMMON_BY_ITEM = false;
  1976. + public boolean REQUIRE_MIN_FRAGS_TO_REWARD = false;
  1977. + public byte MIN_FRAGS_TO_REWARD = 0;
  1978. + public byte PLAYER_CREDITS = 0;
  1979. +}
  1980. \ No newline at end of file
  1981. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/IGameEventConfig.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/IGameEventConfig.java
  1982. new file mode 100644
  1983. index 0000000..ec08693
  1984. --- /dev/null
  1985. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/IGameEventConfig.java
  1986. @@ -0,0 +1,6 @@
  1987. +package net.sf.l2j.gameserver.model.gameevent.config;
  1988. +
  1989. +public interface IGameEventConfig
  1990. +{
  1991. + public void load();
  1992. +}
  1993. \ No newline at end of file
  1994. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/IndividualGameEventConfig.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/IndividualGameEventConfig.java
  1995. new file mode 100644
  1996. index 0000000..3bd4ede
  1997. --- /dev/null
  1998. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/IndividualGameEventConfig.java
  1999. @@ -0,0 +1,6 @@
  2000. +package net.sf.l2j.gameserver.model.gameevent.config;
  2001. +
  2002. +public class IndividualGameEventConfig extends GameEventConfig
  2003. +{
  2004. + public int[] EVENT_COORDINATES;
  2005. +}
  2006. \ No newline at end of file
  2007. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/TeamGameEventConfig.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/TeamGameEventConfig.java
  2008. new file mode 100644
  2009. index 0000000..6bf05e6
  2010. --- /dev/null
  2011. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/config/TeamGameEventConfig.java
  2012. @@ -0,0 +1,46 @@
  2013. +package net.sf.l2j.gameserver.model.gameevent.config;
  2014. +
  2015. +import java.util.ArrayList;
  2016. +import java.util.List;
  2017. +
  2018. +public abstract class TeamGameEventConfig extends GameEventConfig
  2019. +{
  2020. + public List<GameEventTeamConfig> TEAMS = new ArrayList<>();
  2021. + public boolean ALLOW_TARGET_TEAM_MEMBERS = false;
  2022. +
  2023. + public class GameEventTeamConfig
  2024. + {
  2025. + private final int _id;
  2026. + private final String _name;
  2027. + private final int _color;
  2028. + private final int[] _coordinates;
  2029. +
  2030. + public GameEventTeamConfig(int id, String name, int color, int[] coordinates)
  2031. + {
  2032. + _id = id;
  2033. + _name = name;
  2034. + _color = color;
  2035. + _coordinates = coordinates;
  2036. + }
  2037. +
  2038. + public int getId()
  2039. + {
  2040. + return _id;
  2041. + }
  2042. +
  2043. + public String getName()
  2044. + {
  2045. + return _name;
  2046. + }
  2047. +
  2048. + public int getColor()
  2049. + {
  2050. + return _color;
  2051. + }
  2052. +
  2053. + public int[] getCoordinates()
  2054. + {
  2055. + return _coordinates;
  2056. + }
  2057. + }
  2058. +}
  2059. \ No newline at end of file
  2060. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/dm/DMConfig.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/dm/DMConfig.java
  2061. new file mode 100644
  2062. index 0000000..0a411d2
  2063. --- /dev/null
  2064. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/dm/DMConfig.java
  2065. @@ -0,0 +1,264 @@
  2066. +package net.sf.l2j.gameserver.model.gameevent.dm;
  2067. +
  2068. +import java.io.File;
  2069. +
  2070. +import javax.xml.parsers.DocumentBuilderFactory;
  2071. +
  2072. +import net.sf.l2j.commons.logging.CLogger;
  2073. +
  2074. +import net.sf.l2j.gameserver.model.gameevent.config.IGameEventConfig;
  2075. +import net.sf.l2j.gameserver.model.gameevent.config.IndividualGameEventConfig;
  2076. +
  2077. +import org.w3c.dom.Document;
  2078. +import org.w3c.dom.NamedNodeMap;
  2079. +import org.w3c.dom.Node;
  2080. +
  2081. +public class DMConfig extends IndividualGameEventConfig implements IGameEventConfig
  2082. +{
  2083. + private static final CLogger LOGGER = new CLogger(DMConfig.class.getName());
  2084. +
  2085. + public int[][] REWARDS_1ST_PLACE;
  2086. + public int[][] REWARDS_2ND_PLACE;
  2087. + public int[][] REWARDS_3RD_PLACE;
  2088. +
  2089. + private DMConfig()
  2090. + {
  2091. + load();
  2092. + }
  2093. +
  2094. + @Override
  2095. + public void load()
  2096. + {
  2097. + try
  2098. + {
  2099. + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  2100. + factory.setValidating(false);
  2101. + factory.setIgnoringComments(true);
  2102. +
  2103. + File file = new File("./data/xml/events/DeathMatch.xml");
  2104. +
  2105. + Document doc = factory.newDocumentBuilder().parse(file);
  2106. +
  2107. + for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
  2108. + {
  2109. + if (!"dm".equalsIgnoreCase(n.getNodeName()))
  2110. + continue;
  2111. +
  2112. + NamedNodeMap attrs = n.getAttributes();
  2113. +
  2114. + for (Node cd = n.getFirstChild(); cd != null; cd = cd.getNextSibling())
  2115. + {
  2116. + if ("EventTimeInterval".equalsIgnoreCase(cd.getNodeName()))
  2117. + {
  2118. + attrs = cd.getAttributes();
  2119. + EVENT_INTERVAL = attrs.getNamedItem("val").getNodeValue().split(",");
  2120. + }
  2121. + else if ("Duration".equalsIgnoreCase(cd.getNodeName()))
  2122. + {
  2123. + attrs = cd.getAttributes();
  2124. + EVENT_DURATION_TIME = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2125. + }
  2126. + else if ("Participants".equalsIgnoreCase(cd.getNodeName()))
  2127. + {
  2128. + attrs = cd.getAttributes();
  2129. + MIN_PARTICIPANTS = Short.parseShort(attrs.getNamedItem("min").getNodeValue());
  2130. + MAX_PARTICIPANTS = Short.parseShort(attrs.getNamedItem("max").getNodeValue());
  2131. + }
  2132. + else if ("Level".equalsIgnoreCase(cd.getNodeName()))
  2133. + {
  2134. + attrs = cd.getAttributes();
  2135. + MIN_LEVEL = Byte.parseByte(attrs.getNamedItem("min").getNodeValue());
  2136. + MAX_LEVEL = Byte.parseByte(attrs.getNamedItem("max").getNodeValue());
  2137. + }
  2138. + else if ("TimeToRegistration".equalsIgnoreCase(cd.getNodeName()))
  2139. + {
  2140. + attrs = cd.getAttributes();
  2141. + REGISTRATION_TIME = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2142. + }
  2143. + else if ("TimeToTeleport".equalsIgnoreCase(cd.getNodeName()))
  2144. + {
  2145. + attrs = cd.getAttributes();
  2146. + TELEPORT_TIME = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2147. + }
  2148. + else if ("AllowTakeItem".equalsIgnoreCase(cd.getNodeName()))
  2149. + {
  2150. + attrs = cd.getAttributes();
  2151. + ALLOW_TAKE_ITEM = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2152. + }
  2153. + else if ("TakeItem".equalsIgnoreCase(cd.getNodeName()))
  2154. + {
  2155. + attrs = cd.getAttributes();
  2156. + TAKE_ITEM_ID = Short.parseShort(attrs.getNamedItem("id").getNodeValue());
  2157. + TAKE_COUNT = Integer.parseInt(attrs.getNamedItem("count").getNodeValue());
  2158. + }
  2159. + else if ("AllowKillBonus".equalsIgnoreCase(cd.getNodeName()))
  2160. + {
  2161. + attrs = cd.getAttributes();
  2162. + ALLOW_KILL_BONUS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2163. + }
  2164. + else if ("KillReward".equalsIgnoreCase(cd.getNodeName()))
  2165. + {
  2166. + attrs = cd.getAttributes();
  2167. + KILL_BONUS_ID = Short.parseShort(attrs.getNamedItem("id").getNodeValue());
  2168. + KILL_BONUS_COUNT = Integer.parseInt(attrs.getNamedItem("count").getNodeValue());
  2169. + }
  2170. + else if ("PlayerEventCoordinates".equalsIgnoreCase(cd.getNodeName()))
  2171. + {
  2172. + attrs = cd.getAttributes();
  2173. + int x = Integer.parseInt(attrs.getNamedItem("x").getNodeValue());
  2174. + int y = Integer.parseInt(attrs.getNamedItem("y").getNodeValue());
  2175. + int z = Integer.parseInt(attrs.getNamedItem("z").getNodeValue());
  2176. + int h = Integer.parseInt(attrs.getNamedItem("h").getNodeValue());
  2177. + EVENT_COORDINATES = new int[]
  2178. + {
  2179. + x,
  2180. + y,
  2181. + z,
  2182. + h
  2183. + };
  2184. + }
  2185. + else if ("StopAllEffects".equalsIgnoreCase(cd.getNodeName()))
  2186. + {
  2187. + attrs = cd.getAttributes();
  2188. + STOP_ALL_EFFECTS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2189. + }
  2190. + else if ("HidePlayersIdentity".equalsIgnoreCase(cd.getNodeName()))
  2191. + {
  2192. + attrs = cd.getAttributes();
  2193. + HIDE_PLAYERS_IDENTITY = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2194. + }
  2195. + else if ("Rewards1stPlace".equalsIgnoreCase(cd.getNodeName()))
  2196. + {
  2197. + attrs = cd.getAttributes();
  2198. + String[] itemIds = attrs.getNamedItem("id").getNodeValue().split(",");
  2199. + String[] counts = attrs.getNamedItem("count").getNodeValue().split(",");
  2200. + REWARDS_1ST_PLACE = new int[itemIds.length][];
  2201. + for (int i = 0; i < itemIds.length; i++)
  2202. + {
  2203. + REWARDS_1ST_PLACE[i] = new int[]
  2204. + {
  2205. + Integer.parseInt(itemIds[i]),
  2206. + Integer.parseInt(counts[i])
  2207. + };
  2208. + }
  2209. + }
  2210. + else if ("Rewards2ndPlace".equalsIgnoreCase(cd.getNodeName()))
  2211. + {
  2212. + attrs = cd.getAttributes();
  2213. + String[] itemIds = attrs.getNamedItem("id").getNodeValue().split(",");
  2214. + String[] counts = attrs.getNamedItem("count").getNodeValue().split(",");
  2215. + REWARDS_2ND_PLACE = new int[itemIds.length][];
  2216. + for (int i = 0; i < itemIds.length; i++)
  2217. + {
  2218. + REWARDS_2ND_PLACE[i] = new int[]
  2219. + {
  2220. + Integer.parseInt(itemIds[i]),
  2221. + Integer.parseInt(counts[i])
  2222. + };
  2223. + }
  2224. + }
  2225. + else if ("Rewards3rdPlace".equalsIgnoreCase(cd.getNodeName()))
  2226. + {
  2227. + attrs = cd.getAttributes();
  2228. + String[] itemIds = attrs.getNamedItem("id").getNodeValue().split(",");
  2229. + String[] counts = attrs.getNamedItem("count").getNodeValue().split(",");
  2230. + REWARDS_3RD_PLACE = new int[itemIds.length][];
  2231. + for (int i = 0; i < itemIds.length; i++)
  2232. + {
  2233. + REWARDS_3RD_PLACE[i] = new int[]
  2234. + {
  2235. + Integer.parseInt(itemIds[i]),
  2236. + Integer.parseInt(counts[i])
  2237. + };
  2238. + }
  2239. + }
  2240. + else if ("RewardTie".equalsIgnoreCase(cd.getNodeName()))
  2241. + {
  2242. + attrs = cd.getAttributes();
  2243. + REWARD_EVENT_TIE = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2244. + }
  2245. + else if ("ListMageSupport".equalsIgnoreCase(cd.getNodeName()))
  2246. + {
  2247. + attrs = cd.getAttributes();
  2248. + String[] skills = attrs.getNamedItem("val").getNodeValue().split(",");
  2249. + LIST_MAGE_SUPPORT = new int[skills.length];
  2250. + for (int i = 0; i < skills.length; i++)
  2251. + {
  2252. + LIST_MAGE_SUPPORT[i] = Integer.parseInt(skills[i]);
  2253. + }
  2254. + }
  2255. + else if ("ListFighterSupport".equalsIgnoreCase(cd.getNodeName()))
  2256. + {
  2257. + attrs = cd.getAttributes();
  2258. + String[] skills = attrs.getNamedItem("val").getNodeValue().split(",");
  2259. + LIST_FIGHTER_SUPPORT = new int[skills.length];
  2260. + for (int i = 0; i < skills.length; i++)
  2261. + {
  2262. + LIST_FIGHTER_SUPPORT[i] = Integer.parseInt(skills[i]);
  2263. + }
  2264. + }
  2265. + else if ("RestrictItems".equalsIgnoreCase(cd.getNodeName()))
  2266. + {
  2267. + attrs = cd.getAttributes();
  2268. + String[] items = attrs.getNamedItem("val").getNodeValue().split(",");
  2269. + RESTRICT_ITEMS = new int[items.length];
  2270. + for (int i = 0; i < items.length; i++)
  2271. + {
  2272. + RESTRICT_ITEMS[i] = Integer.parseInt(items[i]);
  2273. + }
  2274. +
  2275. + }
  2276. + else if ("RestrictSkills".equalsIgnoreCase(cd.getNodeName()))
  2277. + {
  2278. + attrs = cd.getAttributes();
  2279. + String[] skills = attrs.getNamedItem("val").getNodeValue().split(",");
  2280. + RESTRICT_SKILLS = new int[skills.length];
  2281. + for (int i = 0; i < skills.length; i++)
  2282. + {
  2283. + RESTRICT_SKILLS[i] = Integer.parseInt(skills[i]);
  2284. + }
  2285. + }
  2286. + else if ("AllowPotions".equalsIgnoreCase(cd.getNodeName()))
  2287. + {
  2288. + attrs = cd.getAttributes();
  2289. + ALLOW_POTIONS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2290. + }
  2291. + else if ("AllowScrolls".equalsIgnoreCase(cd.getNodeName()))
  2292. + {
  2293. + attrs = cd.getAttributes();
  2294. + ALLOW_SCROLLS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2295. + }
  2296. + else if ("AllowSummonByItem".equalsIgnoreCase(cd.getNodeName()))
  2297. + {
  2298. + attrs = cd.getAttributes();
  2299. + ALLOW_SUMMON_BY_ITEM = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2300. + }
  2301. + else if ("RequireMinFragsToReward".equalsIgnoreCase(cd.getNodeName()))
  2302. + {
  2303. + attrs = cd.getAttributes();
  2304. + REQUIRE_MIN_FRAGS_TO_REWARD = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2305. + }
  2306. + else if ("MinFragsRequired".equalsIgnoreCase(cd.getNodeName()))
  2307. + {
  2308. + attrs = cd.getAttributes();
  2309. + MIN_FRAGS_TO_REWARD = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2310. + }
  2311. + }
  2312. + }
  2313. + }
  2314. + catch (Exception e)
  2315. + {
  2316. + LOGGER.warn("Error parsing DeathMatch.xml, by error: " + e.getMessage());
  2317. + }
  2318. + }
  2319. +
  2320. + public static DMConfig getInstance()
  2321. + {
  2322. + return SingletonHolder.INSTANCE;
  2323. + }
  2324. +
  2325. + private static class SingletonHolder
  2326. + {
  2327. + protected static final DMConfig INSTANCE = new DMConfig();
  2328. + }
  2329. +}
  2330. \ No newline at end of file
  2331. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/dm/DMEvent.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/dm/DMEvent.java
  2332. new file mode 100644
  2333. index 0000000..5b7d6a6
  2334. --- /dev/null
  2335. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/dm/DMEvent.java
  2336. @@ -0,0 +1,174 @@
  2337. +package net.sf.l2j.gameserver.model.gameevent.dm;
  2338. +
  2339. +import java.util.HashMap;
  2340. +import java.util.TreeSet;
  2341. +
  2342. +import net.sf.l2j.gameserver.model.gameevent.GameEventTeleporter;
  2343. +import net.sf.l2j.gameserver.model.gameevent.IndividualGameEvent;
  2344. +import net.sf.l2j.gameserver.enums.SayType;
  2345. +import net.sf.l2j.gameserver.model.World;
  2346. +import net.sf.l2j.gameserver.model.actor.Creature;
  2347. +import net.sf.l2j.gameserver.model.actor.Player;
  2348. +import net.sf.l2j.gameserver.model.actor.Summon;
  2349. +import net.sf.l2j.gameserver.model.gameevent.GameEventManager;
  2350. +import net.sf.l2j.gameserver.model.gameevent.GameEventPlayer;
  2351. +import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
  2352. +
  2353. +public final class DMEvent extends IndividualGameEvent
  2354. +{
  2355. + @Override
  2356. + public void init()
  2357. + {
  2358. + _eventName = "Death Match";
  2359. + _participants = new HashMap<>();
  2360. +
  2361. + setState(EventState.INACTIVE);
  2362. +
  2363. + GameEventManager.getInstance().registerEvent(this);
  2364. + }
  2365. +
  2366. + @Override
  2367. + public DMConfig getConfigs()
  2368. + {
  2369. + return DMConfig.getInstance();
  2370. + }
  2371. +
  2372. + /**
  2373. + * Method called to set the winners
  2374. + * @return String: msg
  2375. + */
  2376. + @Override
  2377. + public String calculateRewards()
  2378. + {
  2379. + TreeSet<GameEventPlayer> players = new TreeSet<>();
  2380. + players.addAll(_participants.values());
  2381. +
  2382. + for (int i = 0; i < 3; i++)
  2383. + {
  2384. + if (players.isEmpty())
  2385. + break;
  2386. +
  2387. + GameEventPlayer player = players.first();
  2388. +
  2389. + if (player.getKills() == 0)
  2390. + break;
  2391. +
  2392. + reward(player, i + 1);
  2393. + players.remove(player);
  2394. +
  2395. + int playerPointPrev = player.getKills();
  2396. +
  2397. + if (getConfigs().REWARD_EVENT_TIE)
  2398. + continue;
  2399. +
  2400. + while (!players.isEmpty())
  2401. + {
  2402. + player = players.first();
  2403. +
  2404. + if (player.getKills() != playerPointPrev)
  2405. + break;
  2406. +
  2407. + reward(player, i + 1);
  2408. + players.remove(player);
  2409. + }
  2410. + }
  2411. +
  2412. + setState(EventState.REWARDING);
  2413. +
  2414. + String[] topPositions;
  2415. + topPositions = getFirstPosition(3);
  2416. +
  2417. + if (topPositions != null)
  2418. + {
  2419. + World.announceToOnlinePlayers(_eventName + " Event: Winners", true);
  2420. + for (String topPosition : topPositions)
  2421. + {
  2422. + String[] row = topPosition.split("\\,");
  2423. + World.announceToOnlinePlayers(_eventName + " Event: " + row[0] + " with " + row[1] + " kills.", true);
  2424. + }
  2425. + }
  2426. + else
  2427. + World.announceToOnlinePlayers(_eventName + " Event: No players win the match (nobody was killed).", true);
  2428. +
  2429. + return "Ended, thanks to everyone who participated!";
  2430. + }
  2431. +
  2432. + private void reward(GameEventPlayer eventPlayer, int pos)
  2433. + {
  2434. + if (eventPlayer == null)
  2435. + return;
  2436. +
  2437. + final Player player = eventPlayer.getPlayer();
  2438. + if (player == null)
  2439. + return;
  2440. +
  2441. + int[][] rewards = null;
  2442. + if (pos == 1)
  2443. + rewards = getConfigs().REWARDS_1ST_PLACE;
  2444. + else if (pos == 2)
  2445. + rewards = getConfigs().REWARDS_2ND_PLACE;
  2446. + else if (pos == 3)
  2447. + rewards = getConfigs().REWARDS_3RD_PLACE;
  2448. +
  2449. + if (rewards != null)
  2450. + deliverRewards(player, rewards);
  2451. + }
  2452. +
  2453. + /**
  2454. + * Method called when a player is killed
  2455. + * @param killer as Creature
  2456. + * @param killed as Player
  2457. + */
  2458. + @Override
  2459. + public void onKill(Creature killer, Player killed)
  2460. + {
  2461. + if ((killed == null) || (killer == null) || !isRunning() || !isParticipant(killed.getObjectId()))
  2462. + return;
  2463. +
  2464. + final GameEventPlayer killedEventPlayer = _participants.get(killed.getObjectId());
  2465. + if (killedEventPlayer == null)
  2466. + return;
  2467. +
  2468. + new GameEventTeleporter(killedEventPlayer, getConfigs().EVENT_COORDINATES, false);
  2469. +
  2470. + Player killerPlayer = null;
  2471. +
  2472. + if (killer.getSummon() != null)
  2473. + {
  2474. + killerPlayer = ((Summon) killer).getOwner();
  2475. +
  2476. + if (killerPlayer == null)
  2477. + return;
  2478. + }
  2479. + else
  2480. + killerPlayer = (Player) killer;
  2481. +
  2482. + if (isParticipant(killerPlayer.getObjectId()))
  2483. + {
  2484. + GameEventPlayer killerEventPlayer = _participants.get(killerPlayer.getObjectId());
  2485. +
  2486. + killerEventPlayer.increaseKills();
  2487. + killerPlayer.sendPacket(new CreatureSay(killerPlayer.getObjectId(), SayType.PARTYROOM_ALL, killerPlayer.getName(), "I have killed " + killed.getName() + "!"));
  2488. + killerPlayer.sendMessage("Your kills: " + killerEventPlayer.getKills());
  2489. + killerPlayer.sendMessage("Your deaths: " + killerEventPlayer.getDeaths());
  2490. +
  2491. + killedEventPlayer.increaseDeaths();
  2492. + killed.sendPacket(new CreatureSay(killerPlayer.getObjectId(), SayType.PARTYROOM_ALL, killerPlayer.getName(), "I killed you!"));
  2493. + killed.sendMessage("Your kills: " + killerEventPlayer.getKills());
  2494. + killed.sendMessage("Your deaths: " + killedEventPlayer.getDeaths());
  2495. + }
  2496. +
  2497. + if (getConfigs().ALLOW_KILL_BONUS)
  2498. + giveKillBonus(killerPlayer);
  2499. + }
  2500. +
  2501. + public static DMEvent getInstance()
  2502. + {
  2503. + return SingletonHolder.INSTANCE;
  2504. + }
  2505. +
  2506. + private static class SingletonHolder
  2507. + {
  2508. + protected static final DMEvent INSTANCE = new DMEvent();
  2509. + }
  2510. +}
  2511. \ No newline at end of file
  2512. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/tvt/TvTConfig.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/tvt/TvTConfig.java
  2513. new file mode 100644
  2514. index 0000000..81ef484
  2515. --- /dev/null
  2516. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/tvt/TvTConfig.java
  2517. @@ -0,0 +1,236 @@
  2518. +package net.sf.l2j.gameserver.model.gameevent.tvt;
  2519. +
  2520. +import java.io.File;
  2521. +
  2522. +import javax.xml.parsers.DocumentBuilderFactory;
  2523. +
  2524. +import org.w3c.dom.Document;
  2525. +import org.w3c.dom.NamedNodeMap;
  2526. +import org.w3c.dom.Node;
  2527. +
  2528. +import net.sf.l2j.commons.logging.CLogger;
  2529. +
  2530. +import net.sf.l2j.gameserver.model.gameevent.config.IGameEventConfig;
  2531. +import net.sf.l2j.gameserver.model.gameevent.config.TeamGameEventConfig;
  2532. +
  2533. +public class TvTConfig extends TeamGameEventConfig implements IGameEventConfig
  2534. +{
  2535. + protected static final CLogger LOGGER = new CLogger(TvTConfig.class.getName());
  2536. +
  2537. + /* TODO: IMPLEMENT */
  2538. + public byte NUMBER_OF_ROUNDS = 0;
  2539. + /* ------------------------------ */
  2540. +
  2541. + private TvTConfig()
  2542. + {
  2543. + load();
  2544. + }
  2545. +
  2546. + @Override
  2547. + public void load()
  2548. + {
  2549. + try
  2550. + {
  2551. + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  2552. + factory.setValidating(false);
  2553. + factory.setIgnoringComments(true);
  2554. +
  2555. + File file = new File("./data/xml/events/TvT.xml");
  2556. +
  2557. + Document doc = factory.newDocumentBuilder().parse(file);
  2558. +
  2559. + for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
  2560. + {
  2561. + if (!"tvt".equalsIgnoreCase(n.getNodeName()))
  2562. + continue;
  2563. +
  2564. + for (Node cd = n.getFirstChild(); cd != null; cd = cd.getNextSibling())
  2565. + {
  2566. + NamedNodeMap attrs = n.getAttributes();
  2567. +
  2568. + if ("EventTimeInterval".equalsIgnoreCase(cd.getNodeName()))
  2569. + {
  2570. + attrs = cd.getAttributes();
  2571. + EVENT_INTERVAL = attrs.getNamedItem("val").getNodeValue().split(",");
  2572. + }
  2573. + else if ("Duration".equalsIgnoreCase(cd.getNodeName()))
  2574. + {
  2575. + attrs = cd.getAttributes();
  2576. + EVENT_DURATION_TIME = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2577. + }
  2578. + else if ("Participants".equalsIgnoreCase(cd.getNodeName()))
  2579. + {
  2580. + attrs = cd.getAttributes();
  2581. + MIN_PARTICIPANTS = Short.parseShort(attrs.getNamedItem("min").getNodeValue());
  2582. + MAX_PARTICIPANTS = Short.parseShort(attrs.getNamedItem("max").getNodeValue());
  2583. + }
  2584. + else if ("Level".equalsIgnoreCase(cd.getNodeName()))
  2585. + {
  2586. + attrs = cd.getAttributes();
  2587. + MIN_LEVEL = Byte.parseByte(attrs.getNamedItem("min").getNodeValue());
  2588. + MAX_LEVEL = Byte.parseByte(attrs.getNamedItem("max").getNodeValue());
  2589. + }
  2590. + else if ("TimeToRegistration".equalsIgnoreCase(cd.getNodeName()))
  2591. + {
  2592. + attrs = cd.getAttributes();
  2593. + REGISTRATION_TIME = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2594. + }
  2595. + else if ("TimeToTeleport".equalsIgnoreCase(cd.getNodeName()))
  2596. + {
  2597. + attrs = cd.getAttributes();
  2598. + TELEPORT_TIME = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2599. + }
  2600. + else if ("AllowTakeItem".equalsIgnoreCase(cd.getNodeName()))
  2601. + {
  2602. + attrs = cd.getAttributes();
  2603. + ALLOW_TAKE_ITEM = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2604. + }
  2605. + else if ("TakeItem".equalsIgnoreCase(cd.getNodeName()))
  2606. + {
  2607. + attrs = cd.getAttributes();
  2608. + TAKE_ITEM_ID = Short.parseShort(attrs.getNamedItem("id").getNodeValue());
  2609. + TAKE_COUNT = Integer.parseInt(attrs.getNamedItem("count").getNodeValue());
  2610. + }
  2611. + else if ("AllowKillBonus".equalsIgnoreCase(cd.getNodeName()))
  2612. + {
  2613. + attrs = cd.getAttributes();
  2614. + ALLOW_KILL_BONUS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2615. + }
  2616. + else if ("KillReward".equalsIgnoreCase(cd.getNodeName()))
  2617. + {
  2618. + attrs = cd.getAttributes();
  2619. + KILL_BONUS_ID = Short.parseShort(attrs.getNamedItem("id").getNodeValue());
  2620. + KILL_BONUS_COUNT = Integer.parseInt(attrs.getNamedItem("count").getNodeValue());
  2621. + }
  2622. + else if ("StopAllEffects".equalsIgnoreCase(cd.getNodeName()))
  2623. + {
  2624. + attrs = cd.getAttributes();
  2625. + STOP_ALL_EFFECTS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2626. + }
  2627. + else if ("HidePlayersIdentity".equalsIgnoreCase(cd.getNodeName()))
  2628. + {
  2629. + attrs = cd.getAttributes();
  2630. + HIDE_PLAYERS_IDENTITY = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2631. + }
  2632. + else if ("Team".equalsIgnoreCase(cd.getNodeName()))
  2633. + {
  2634. + attrs = cd.getAttributes();
  2635. + byte teamId = Byte.parseByte(attrs.getNamedItem("id").getNodeValue());
  2636. + String name = attrs.getNamedItem("name").getNodeValue();
  2637. + int color = Integer.decode("0x" + attrs.getNamedItem("color").getNodeValue());
  2638. + String[] coord = attrs.getNamedItem("coordinates").getNodeValue().split(",");
  2639. + int[] coordinates = new int[4];
  2640. +
  2641. + for (int i = 0; i < coord.length; i++)
  2642. + coordinates[i] = Integer.parseInt(coord[i]);
  2643. +
  2644. + TEAMS.add(new GameEventTeamConfig(teamId, name, color, coordinates));
  2645. + }
  2646. + else if ("Rewards".equalsIgnoreCase(cd.getNodeName()))
  2647. + {
  2648. + attrs = cd.getAttributes();
  2649. + String[] itemIds = attrs.getNamedItem("id").getNodeValue().split(",");
  2650. + String[] counts = attrs.getNamedItem("count").getNodeValue().split(",");
  2651. + REWARDS = new int[itemIds.length][];
  2652. + for (int i = 0; i < itemIds.length; i++)
  2653. + {
  2654. + REWARDS[i] = new int[]
  2655. + {
  2656. + Integer.parseInt(itemIds[i]),
  2657. + Integer.parseInt(counts[i])
  2658. + };
  2659. + }
  2660. + }
  2661. + else if ("RewardTeamTie".equalsIgnoreCase(cd.getNodeName()))
  2662. + {
  2663. + attrs = cd.getAttributes();
  2664. + REWARD_EVENT_TIE = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2665. + }
  2666. + else if ("ListMageSupport".equalsIgnoreCase(cd.getNodeName()))
  2667. + {
  2668. + attrs = cd.getAttributes();
  2669. + String[] skills = attrs.getNamedItem("val").getNodeValue().split(",");
  2670. + LIST_MAGE_SUPPORT = new int[skills.length];
  2671. +
  2672. + for (int i = 0; i < skills.length; i++)
  2673. + LIST_MAGE_SUPPORT[i] = Integer.parseInt(skills[i]);
  2674. + }
  2675. + else if ("ListFighterSupport".equalsIgnoreCase(cd.getNodeName()))
  2676. + {
  2677. + attrs = cd.getAttributes();
  2678. + String[] skills = attrs.getNamedItem("val").getNodeValue().split(",");
  2679. + LIST_FIGHTER_SUPPORT = new int[skills.length];
  2680. +
  2681. + for (int i = 0; i < skills.length; i++)
  2682. + LIST_FIGHTER_SUPPORT[i] = Integer.parseInt(skills[i]);
  2683. + }
  2684. + else if ("RestrictItems".equalsIgnoreCase(cd.getNodeName()))
  2685. + {
  2686. + attrs = cd.getAttributes();
  2687. + String[] items = attrs.getNamedItem("val").getNodeValue().split(",");
  2688. + RESTRICT_ITEMS = new int[items.length];
  2689. + for (int i = 0; i < items.length; i++)
  2690. + RESTRICT_ITEMS[i] = Integer.parseInt(items[i]);
  2691. + }
  2692. + else if ("RestrictSkills".equalsIgnoreCase(cd.getNodeName()))
  2693. + {
  2694. + attrs = cd.getAttributes();
  2695. + String[] skills = attrs.getNamedItem("val").getNodeValue().split(",");
  2696. + RESTRICT_SKILLS = new int[skills.length];
  2697. + for (int i = 0; i < skills.length; i++)
  2698. + RESTRICT_SKILLS[i] = Integer.parseInt(skills[i]);
  2699. + }
  2700. + else if ("AllowPotions".equalsIgnoreCase(cd.getNodeName()))
  2701. + {
  2702. + attrs = cd.getAttributes();
  2703. + ALLOW_POTIONS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2704. + }
  2705. + else if ("AllowScrolls".equalsIgnoreCase(cd.getNodeName()))
  2706. + {
  2707. + attrs = cd.getAttributes();
  2708. + ALLOW_SCROLLS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2709. + }
  2710. + else if ("AllowSummonByItem".equalsIgnoreCase(cd.getNodeName()))
  2711. + {
  2712. + attrs = cd.getAttributes();
  2713. + ALLOW_SUMMON_BY_ITEM = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2714. + }
  2715. + else if ("AllowTargetTeamMembers".equalsIgnoreCase(cd.getNodeName()))
  2716. + {
  2717. + attrs = cd.getAttributes();
  2718. + ALLOW_TARGET_TEAM_MEMBERS = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2719. + }
  2720. + else if ("RequireMinFragsToReward".equalsIgnoreCase(cd.getNodeName()))
  2721. + {
  2722. + attrs = cd.getAttributes();
  2723. + REQUIRE_MIN_FRAGS_TO_REWARD = Boolean.parseBoolean(attrs.getNamedItem("val").getNodeValue());
  2724. + }
  2725. + else if ("MinFragsRequired".equalsIgnoreCase(cd.getNodeName()))
  2726. + {
  2727. + attrs = cd.getAttributes();
  2728. + MIN_FRAGS_TO_REWARD = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2729. + }
  2730. + else if ("NumberOfRounds".equalsIgnoreCase(cd.getNodeName()))
  2731. + {
  2732. + attrs = cd.getAttributes();
  2733. + NUMBER_OF_ROUNDS = Byte.parseByte(attrs.getNamedItem("val").getNodeValue());
  2734. + }
  2735. + }
  2736. + }
  2737. + }
  2738. + catch (Exception e)
  2739. + {
  2740. + LOGGER.warn("Error parsing TvT.xml, by error: " + e.getMessage());
  2741. + }
  2742. + }
  2743. +
  2744. + public static TvTConfig getInstance()
  2745. + {
  2746. + return SingletonHolder.INSTANCE;
  2747. + }
  2748. +
  2749. + private static class SingletonHolder
  2750. + {
  2751. + protected static final TvTConfig INSTANCE = new TvTConfig();
  2752. + }
  2753. +}
  2754. \ No newline at end of file
  2755. diff --git a/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/tvt/TvTEvent.java b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/tvt/TvTEvent.java
  2756. new file mode 100644
  2757. index 0000000..bc8787a
  2758. --- /dev/null
  2759. +++ b/L2jOne_C6_Interlude/java/net/sf/l2j/gameserver/model/gameevent/tvt/TvTEvent.java
  2760. @@ -0,0 +1,109 @@
  2761. +package net.sf.l2j.gameserver.model.gameevent.tvt;
  2762. +
  2763. +import java.util.List;
  2764. +
  2765. +import net.sf.l2j.gameserver.enums.SayType;
  2766. +import net.sf.l2j.gameserver.model.actor.Creature;
  2767. +import net.sf.l2j.gameserver.model.actor.Player;
  2768. +import net.sf.l2j.gameserver.model.actor.Summon;
  2769. +import net.sf.l2j.gameserver.model.gameevent.GameEventManager;
  2770. +import net.sf.l2j.gameserver.model.gameevent.GameEventPlayer;
  2771. +import net.sf.l2j.gameserver.model.gameevent.GameEventTeam;
  2772. +import net.sf.l2j.gameserver.model.gameevent.GameEventTeleporter;
  2773. +import net.sf.l2j.gameserver.model.gameevent.TeamGameEvent;
  2774. +import net.sf.l2j.gameserver.model.gameevent.config.TeamGameEventConfig.GameEventTeamConfig;
  2775. +import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
  2776. +
  2777. +public final class TvTEvent extends TeamGameEvent
  2778. +{
  2779. + @Override
  2780. + public void init()
  2781. + {
  2782. + _eventName = "Team vs Team";
  2783. +
  2784. + List<GameEventTeamConfig> teamsConfig = getConfigs().TEAMS;
  2785. + _teams = new GameEventTeam[teamsConfig.size()];
  2786. + for (int i = 0; i < teamsConfig.size(); i++)
  2787. + _teams[i] = new GameEventTeam(teamsConfig.get(i).getId(), teamsConfig.get(i).getName(), teamsConfig.get(i).getColor(), teamsConfig.get(i).getCoordinates());
  2788. +
  2789. + setState(EventState.INACTIVE);
  2790. +
  2791. + GameEventManager.getInstance().registerEvent(this);
  2792. + }
  2793. +
  2794. + @Override
  2795. + public TvTConfig getConfigs()
  2796. + {
  2797. + return TvTConfig.getInstance();
  2798. + }
  2799. +
  2800. + /**
  2801. + * Method called when a player is killed
  2802. + * @param killer as Creature
  2803. + * @param killed as Player
  2804. + */
  2805. + @Override
  2806. + public void onKill(Creature killer, Player killed)
  2807. + {
  2808. + if ((killed == null) || (killer == null) || !isRunning())
  2809. + return;
  2810. +
  2811. + final GameEventTeam killedTeam = getParticipantTeam(killed.getObjectId());
  2812. + if (killedTeam == null)
  2813. + return;
  2814. +
  2815. + final GameEventPlayer killedEventPlayer = killedTeam.getEventPlayer(killed.getObjectId());
  2816. + if (killedEventPlayer == null)
  2817. + return;
  2818. +
  2819. + new GameEventTeleporter(killedEventPlayer, killedTeam.getCoordinates(), false);
  2820. +
  2821. + Player killerPlayer = null;
  2822. +
  2823. + if (killer.getSummon() != null)
  2824. + {
  2825. + killerPlayer = ((Summon) killer).getOwner();
  2826. +
  2827. + if (killerPlayer == null)
  2828. + return;
  2829. + }
  2830. + else
  2831. + killerPlayer = (Player) killer;
  2832. +
  2833. + final GameEventTeam killerTeam = getParticipantTeam(killerPlayer.getObjectId());
  2834. + if (killerTeam == null)
  2835. + return;
  2836. +
  2837. + final GameEventPlayer killerEventPlayer = killerTeam.getEventPlayer(killerPlayer.getObjectId());
  2838. + if (killerEventPlayer == null)
  2839. + return;
  2840. +
  2841. + if (killerTeam.getId() != killedTeam.getId())
  2842. + {
  2843. + killedEventPlayer.increaseDeaths();
  2844. + killedEventPlayer.increaseKills();
  2845. + killerTeam.increasePoints();
  2846. +
  2847. + CreatureSay cs = new CreatureSay(killerPlayer.getObjectId(), SayType.PARTYROOM_ALL, killerPlayer.getName(), "I have killed " + killed.getName() + "!");
  2848. +
  2849. + for (GameEventPlayer eventPlayer : killerTeam.getParticipatedPlayers().values())
  2850. + {
  2851. + if ((eventPlayer != null) && (eventPlayer.getPlayer() != null))
  2852. + eventPlayer.getPlayer().sendPacket(cs);
  2853. + }
  2854. + }
  2855. +
  2856. + if (getConfigs().ALLOW_KILL_BONUS)
  2857. + giveKillBonus(killerPlayer);
  2858. + }
  2859. +
  2860. + public static TvTEvent getInstance()
  2861. + {
  2862. + return SingletonHolder.INSTANCE;
  2863. + }
  2864. +
  2865. + private static class SingletonHolder
  2866. + {
  2867. + protected static final TvTEvent INSTANCE = new TvTEvent();
  2868. + }
  2869. +}
  2870. \ No newline at end of file
  2871.  
Add Comment
Please, Sign In to add comment