· 9 years ago · Jan 30, 2017, 11:08 PM
1
2### Eclipse Workspace Patch 1.0
3#P aCis_gameserver
4Index: java/net/sf/l2j/gameserver/handler/SkillHandler.java
5===================================================================
6--- java/net/sf/l2j/gameserver/handler/SkillHandler.java (revision 6)
7+++ java/net/sf/l2j/gameserver/handler/SkillHandler.java (working copy)
8@@ -18,7 +18,9 @@
9
10 import net.sf.l2j.gameserver.handler.skillhandlers.BalanceLife;
11 import net.sf.l2j.gameserver.handler.skillhandlers.Blow;
12+import net.sf.l2j.gameserver.handler.skillhandlers.Bomb;
13 import net.sf.l2j.gameserver.handler.skillhandlers.Cancel;
14+import net.sf.l2j.gameserver.handler.skillhandlers.Capture;
15 import net.sf.l2j.gameserver.handler.skillhandlers.CombatPointHeal;
16 import net.sf.l2j.gameserver.handler.skillhandlers.Continuous;
17 import net.sf.l2j.gameserver.handler.skillhandlers.CpDamPercent;
18@@ -94,6 +96,8 @@
19 registerSkillHandler(new Sweep());
20 registerSkillHandler(new TakeCastle());
21 registerSkillHandler(new Unlock());
22+ registerSkillHandler(new Capture());
23 }
24
25 public void registerSkillHandler(ISkillHandler handler)
26Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestGiveNickName.java
27===================================================================
28--- java/net/sf/l2j/gameserver/network/clientpackets/RequestGiveNickName.java (revision 6)
29+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestGiveNickName.java (working copy)
30@@ -14,6 +14,7 @@
31 */
32 package net.sf.l2j.gameserver.network.clientpackets;
33
34+import net.sf.l2j.gameserver.event.EventManager;
35 import net.sf.l2j.gameserver.model.L2Clan;
36 import net.sf.l2j.gameserver.model.L2ClanMember;
37 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
38@@ -39,6 +40,12 @@
39 if (activeChar == null)
40 return;
41
42+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(activeChar))
43+ {
44+ activeChar.sendMessage("You cannot change title while participating in an event.");
45+ return;
46+ }
47+
48 // Noblesse can bestow a title to themselves
49 if (activeChar.isNoble() && _target.matches(activeChar.getName()))
50 {
51Index: java/net/sf/l2j/gameserver/event/DM.java
52===================================================================
53--- java/net/sf/l2j/gameserver/event/DM.java (revision 0)
54+++ java/net/sf/l2j/gameserver/event/DM.java (revision 0)
55@@ -0,0 +1,139 @@
56+package net.sf.l2j.gameserver.event;
57+
58+import net.sf.l2j.gameserver.model.actor.L2Character;
59+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
60+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
61+
62+public class DM extends Event
63+{
64+ protected EventState eventState;
65+ private Core task = new Core();
66+ private enum EventState
67+ {
68+ START, FIGHT, END, INACTIVE
69+ }
70+
71+ protected class Core implements Runnable
72+ {
73+ @Override
74+ public void run()
75+ {
76+ try
77+ {
78+ switch (eventState)
79+ {
80+ case START:
81+ divideIntoTeams(1);
82+ preparePlayers();
83+ teleportToTeamPos();
84+ InvisAll();
85+ setStatus(EventState.FIGHT);
86+ schedule(20000);
87+ break;
88+
89+ case FIGHT:
90+ unInvisAll();
91+ sendMsg();
92+ setStatus(EventState.END);
93+ clock.startClock(getInt("matchTime"));
94+ break;
95+
96+ case END:
97+ clock.setTime(0);
98+ L2PcInstance winner = getPlayerWithMaxScore();
99+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
100+ setStatus(EventState.INACTIVE);
101+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " kills!");
102+ break;
103+ }
104+ }
105+ catch (Throwable e)
106+ {
107+ e.printStackTrace();
108+ EventManager.getInstance().end("Error! Event ended.");
109+ }
110+ }
111+ }
112+
113+ public DM()
114+ {
115+ super();
116+ eventId = 1;
117+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
118+ }
119+
120+ @Override
121+ protected void endEvent()
122+ {
123+ setStatus(EventState.END);
124+ clock.setTime(0);
125+ }
126+
127+ @Override
128+ public void onDie(L2PcInstance victim, L2Character killer)
129+ {
130+ super.onDie(victim, killer);
131+ addToResurrector(victim);
132+ }
133+
134+ @Override
135+ public void onKill(L2Character victim, L2PcInstance killer)
136+ {
137+ super.onKill(victim, killer);
138+ increasePlayersScore(killer);
139+ }
140+
141+ @Override
142+ protected void schedule(int time)
143+ {
144+ tpm.scheduleGeneral(task, time);
145+ }
146+
147+ protected void setStatus(EventState s)
148+ {
149+ eventState = s;
150+ }
151+
152+ @Override
153+ protected void showHtml(L2PcInstance player, int obj)
154+ {
155+ if (players.size() > 0)
156+ {
157+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
158+ StringBuilder sb = new StringBuilder();
159+ sb.append("<html><body><table width=270><tr><td width=200>Event Engine </td><td><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table><br><center><table width=270 bgcolor=5A5A5A><tr><td width=70>Running</td><td width=130><center>" + getString("eventName") + "</td><td width=70>Time: " + clock.getTime() + "</td></tr></table><table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table><br><table width=270>");
160+
161+ for (L2PcInstance p : getPlayersOfTeam(1))
162+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
163+
164+ sb.append("</table></body></html>");
165+ html.setHtml(sb.toString());
166+ player.sendPacket(html);
167+ }
168+ }
169+
170+ @Override
171+ public boolean onSay(int type, L2PcInstance player, String text)
172+ {
173+ return false;
174+ }
175+
176+ @Override
177+ protected void start()
178+ {
179+ setStatus(EventState.START);
180+ schedule(1);
181+ }
182+
183+ @Override
184+ protected String getStartingMsg()
185+ {
186+ return "Free For All!";
187+ }
188+
189+ @Override
190+ protected String getScorebar()
191+ {
192+ return "Max: " + getScore(getPlayerWithMaxScore()) + " Time: " + clock.getTime() + "";
193+ }
194+}
195\ No newline at end of file
196Index: java/net/sf/l2j/gameserver/event/TvT.java
197===================================================================
198--- java/net/sf/l2j/gameserver/event/TvT.java (revision 0)
199+++ java/net/sf/l2j/gameserver/event/TvT.java (revision 0)
200@@ -0,0 +1,155 @@
201+package net.sf.l2j.gameserver.event;
202+
203+import javolution.text.TextBuilder;
204+
205+import net.sf.l2j.gameserver.model.actor.L2Character;
206+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
207+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
208+
209+public class TvT extends Event
210+{
211+ protected EventState eventState;
212+ private Core task = new Core();
213+ private enum EventState
214+ {
215+ START, FIGHT, END, TELEPORT, INACTIVE
216+ }
217+
218+ protected class Core implements Runnable
219+ {
220+ @Override
221+ public void run()
222+ {
223+ try
224+ {
225+ switch (eventState)
226+ {
227+ case START:
228+ divideIntoTeams(2);
229+ preparePlayers();
230+ teleportToTeamPos();
231+ createPartyOfTeam(1);
232+ createPartyOfTeam(2);
233+ forceSitAll();
234+ setStatus(EventState.FIGHT);
235+ schedule(20000);
236+ break;
237+
238+ case FIGHT:
239+ forceStandAll();
240+ sendMsg();
241+ setStatus(EventState.END);
242+ clock.startClock(getInt("matchTime"));
243+ break;
244+
245+ case END:
246+ clock.setTime(0);
247+ if (winnerTeam == 0)
248+ winnerTeam = getWinnerTeam();
249+
250+ setStatus(EventState.INACTIVE);
251+
252+ if (winnerTeam == 0)
253+ EventManager.getInstance().end("The event ended in a tie! both teams had " + teams.get(1).getScore() + " kills!");
254+ else
255+ {
256+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
257+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " kills!");
258+ }
259+ break;
260+ }
261+ }
262+ catch (Throwable e)
263+ {
264+ e.printStackTrace();
265+ EventManager.getInstance().end("Error! Event ended.");
266+ }
267+ }
268+ }
269+
270+ public TvT()
271+ {
272+ super();
273+ eventId = 7;
274+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
275+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
276+ }
277+
278+ @Override
279+ protected void endEvent()
280+ {
281+ winnerTeam = players.head().getNext().getValue()[0];
282+
283+ setStatus(EventState.END);
284+ clock.setTime(0);
285+ }
286+
287+ @Override
288+ public void onDie(L2PcInstance victim, L2Character killer)
289+ {
290+ super.onDie(victim, killer);
291+ addToResurrector(victim);
292+ }
293+
294+ @Override
295+ public void onKill(L2Character victim, L2PcInstance killer)
296+ {
297+ super.onKill(victim, killer);
298+ if (getPlayersTeam(killer) != getPlayersTeam((L2PcInstance) victim))
299+ {
300+ getPlayersTeam(killer).increaseScore();
301+ increasePlayersScore(killer);
302+ }
303+ }
304+
305+ @Override
306+ protected void schedule(int time)
307+ {
308+ tpm.scheduleGeneral(task, time);
309+ }
310+
311+ protected void setStatus(EventState s)
312+ {
313+ eventState = s;
314+ }
315+
316+ @Override
317+ protected void showHtml(L2PcInstance player, int obj)
318+ {
319+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
320+ TextBuilder sb = new TextBuilder();
321+ sb.append("<html><body><table width=270><tr><td width=200>Event Engine </td><td><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table><br><center><table width=270 bgcolor=5A5A5A><tr><td width=70>Running</td><td width=130><center>" + getString("eventName") + "</td><td width=70>Time: " + clock.getTime() + "</td></tr></table><center><table width=270><tr><td><center><font color=" + teams.get(1).getHexaColor() + ">" + teams.get(1).getScore() + "</font> - " + "<font color=" + teams.get(2).getHexaColor() + ">" + teams.get(2).getScore() + "</font></td></tr></table><br><table width=270>");
322+
323+ int i = 0;
324+ for (EventTeam team : teams.values())
325+ {
326+ i++;
327+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
328+ for (L2PcInstance p : getPlayersOfTeam(i))
329+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
330+ }
331+
332+ sb.append("</table></body></html>");
333+ html.setHtml(sb.toString());
334+ player.sendPacket(html);
335+ }
336+
337+ @Override
338+ protected void start()
339+ {
340+ setStatus(EventState.START);
341+ schedule(1);
342+ }
343+
344+ @Override
345+ protected String getStartingMsg()
346+ {
347+ return "Go and kill your enemies!";
348+ }
349+
350+ @Override
351+ protected String getScorebar()
352+ {
353+ return teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
354+ }
355+}
356\ No newline at end of file
357Index: java/net/sf/l2j/gameserver/event/CTF.java
358===================================================================
359--- java/net/sf/l2j/gameserver/event/CTF.java (revision 0)
360+++ java/net/sf/l2j/gameserver/event/CTF.java (revision 0)
361@@ -0,0 +1,407 @@
362+package net.sf.l2j.gameserver.event;
363+
364+import javolution.text.TextBuilder;
365+
366+import net.sf.l2j.gameserver.datatables.ItemTable;
367+import net.sf.l2j.gameserver.model.L2ItemInstance;
368+import net.sf.l2j.gameserver.model.L2Spawn;
369+import net.sf.l2j.gameserver.model.actor.L2Character;
370+import net.sf.l2j.gameserver.model.actor.L2Npc;
371+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
372+import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
373+import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
374+import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
375+import net.sf.l2j.gameserver.network.serverpackets.ItemList;
376+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
377+import net.sf.l2j.gameserver.network.serverpackets.SocialAction;
378+
379+public class CTF extends Event
380+{
381+ protected EventState eventState;
382+ protected L2PcInstance playerWithRedFlag;
383+ protected L2PcInstance playerWithBlueFlag;
384+ private Core task = new Core();
385+ private L2Spawn redFlagNpc;
386+ private L2Spawn blueFlagNpc;
387+ private L2Spawn redHolderNpc;
388+ private L2Spawn blueHolderNpc;
389+ private int redFlagStatus;
390+ private int blueFlagStatus;
391+ private enum EventState
392+ {
393+ START, FIGHT, END, TELEPORT, INACTIVE
394+ }
395+
396+ protected class Core implements Runnable
397+ {
398+ @Override
399+ public void run()
400+ {
401+ try
402+ {
403+ switch (eventState)
404+ {
405+ case START:
406+ divideIntoTeams(2);
407+ preparePlayers();
408+ teleportToTeamPos();
409+ createPartyOfTeam(1);
410+ createPartyOfTeam(2);
411+ forceSitAll();
412+ spawnFlagsAndHolders();
413+ setStatus(EventState.FIGHT);
414+ schedule(20000);
415+ break;
416+
417+ case FIGHT:
418+ forceStandAll();
419+ sendMsg();
420+ setStatus(EventState.END);
421+ clock.startClock(getInt("matchTime"));
422+ break;
423+
424+ case END:
425+ clock.setTime(0);
426+ if (winnerTeam == 0)
427+ winnerTeam = getWinnerTeam();
428+
429+ unspawnFlagsAndHolders();
430+ if (playerWithRedFlag != null)
431+ unequipFlag(playerWithRedFlag);
432+ if (playerWithBlueFlag != null)
433+ unequipFlag(playerWithBlueFlag);
434+ setStatus(EventState.INACTIVE);
435+
436+ if (winnerTeam == 0)
437+ EventManager.getInstance().end("The event ended in a tie! both teams had " + teams.get(1).getScore() + " flags taken!");
438+ else
439+ {
440+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
441+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " flags taken!");
442+ }
443+ break;
444+ }
445+ }
446+ catch (Throwable e)
447+ {
448+ e.printStackTrace();
449+ EventManager.getInstance().end("Error! Event ended.");
450+ }
451+ }
452+ }
453+
454+ public CTF()
455+ {
456+ super();
457+ eventId = 10;
458+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
459+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
460+ }
461+
462+ @Override
463+ protected void endEvent()
464+ {
465+ winnerTeam = players.head().getNext().getValue()[0];
466+
467+ setStatus(EventState.END);
468+ clock.setTime(0);
469+ }
470+
471+ private void equipFlag(L2PcInstance player, int flag)
472+ {
473+ L2ItemInstance wpn = player.getActiveWeaponInstance();
474+ if (wpn != null)
475+ player.useEquippableItem(wpn, false);
476+
477+ wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
478+ if (wpn != null)
479+ player.useEquippableItem(wpn, false);
480+
481+ player.getInventory().equipItem(ItemTable.getInstance().createItem("", 6718, 1, player, null));
482+ player.broadcastPacket(new SocialAction(player, 16));
483+
484+ switch (flag)
485+ {
486+ case 1:
487+ playerWithBlueFlag = player;
488+ announce(getPlayerList(), player.getName() + " took the Blue flag!");
489+ unspawnNPC(blueFlagNpc);
490+ break;
491+ case 2:
492+ playerWithRedFlag = player;
493+ announce(getPlayerList(), player.getName() + " took the Red flag!");
494+ unspawnNPC(redFlagNpc);
495+ break;
496+ }
497+
498+ player.broadcastUserInfo();
499+ CreatureSay cs = new CreatureSay(player.getObjectId(), 15, ":", "You got it! Run back! ::");
500+ player.sendPacket(cs);
501+ }
502+
503+ @Override
504+ public void onDie(L2PcInstance victim, L2Character killer)
505+ {
506+ super.onDie(victim, killer);
507+
508+ if (playerWithRedFlag == victim)
509+ {
510+ announce(getPlayerList(), victim.getName() + " dropped the Red flag!");
511+ redFlagStatus = 2;
512+ unequipFlag(victim);
513+ redFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("redFlagId"));
514+ }
515+
516+ if (playerWithBlueFlag == victim)
517+ {
518+ announce(getPlayerList(), victim.getName() + " dropped the Blue flag!");
519+ blueFlagStatus = 2;
520+ unequipFlag(victim);
521+ blueFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("blueFlagId"));
522+ }
523+
524+ addToResurrector(victim);
525+ }
526+
527+ @Override
528+ public void onLogout(L2PcInstance player)
529+ {
530+ super.onLogout(player);
531+
532+ if (playerWithRedFlag == player)
533+ {
534+ announce(getPlayerList(), player.getName() + " dropped the Red flag!");
535+ redFlagStatus = 2;
536+ unequipFlag(player);
537+ redFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("redFlagId"));
538+ }
539+
540+ if (playerWithBlueFlag == player)
541+ {
542+ announce(getPlayerList(), player.getName() + " dropped the Blue flag!");
543+ blueFlagStatus = 2;
544+ unequipFlag(player);
545+ blueFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("blueFlagId"));
546+ }
547+ }
548+
549+ @Override
550+ public boolean onTalkNpc(L2Npc npc, L2PcInstance player)
551+ {
552+ if (npc.getNpcId() != getInt("blueFlagId") && npc.getNpcId() != getInt("blueFlagHolderId") && npc.getNpcId() != getInt("redFlagId") && npc.getNpcId() != getInt("redFlagHolderId"))
553+ return false;
554+
555+ // Blue holder
556+ if (npc.getNpcId() == getInt("blueFlagHolderId"))
557+ {
558+ if (player == playerWithRedFlag)
559+ {
560+ if (blueFlagStatus == 0)
561+ {
562+ announce(getPlayerList(), "The Blue team scored!");
563+ teams.get(getTeam(player)).increaseScore();
564+ increasePlayersScore(player);
565+ returnFlag(2);
566+ }
567+ else
568+ player.sendMessage("Your team must kill enemy flag owner and return the flag in order to score!");
569+ }
570+ }
571+ // Red holder
572+ else if (npc.getNpcId() == getInt("redFlagHolderId"))
573+ {
574+ if (player == playerWithBlueFlag)
575+ {
576+ if (redFlagStatus == 0)
577+ {
578+ announce(getPlayerList(), "The Red team scored!");
579+ teams.get(getTeam(player)).increaseScore();
580+ increasePlayersScore(player);
581+ returnFlag(1);
582+ }
583+ else
584+ player.sendMessage("Your team must kill enemy flag owner and return the flag in order to score!");
585+ }
586+ }
587+ // Blue flag
588+ else if (npc.getNpcId() == getInt("blueFlagId"))
589+ {
590+ if (blueFlagStatus == 2)
591+ {
592+ // blue player
593+ if (getTeam(player) == 1)
594+ returnFlag(1);
595+
596+ // red player
597+ if (getTeam(player) == 2)
598+ equipFlag(player, 1);
599+ }
600+ if (blueFlagStatus == 0)
601+ {
602+ if (getTeam(player) == 2)
603+ {
604+ equipFlag(player, 1);
605+ unspawnNPC(blueFlagNpc);
606+ blueFlagStatus = 1;
607+ }
608+ }
609+ }
610+ // Red flag
611+ else
612+ {
613+ if (redFlagStatus == 2)
614+ {
615+ // red player
616+ if (getTeam(player) == 2)
617+ returnFlag(2);
618+
619+ // blue player
620+ if (getTeam(player) == 1)
621+ equipFlag(player, 2);
622+ }
623+ if (redFlagStatus == 0)
624+ {
625+ if (getTeam(player) == 1)
626+ {
627+ equipFlag(player, 2);
628+ unspawnNPC(redFlagNpc);
629+ redFlagStatus = 1;
630+ }
631+ }
632+ }
633+
634+ return true;
635+ }
636+
637+ @Override
638+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
639+ {
640+ if (playerWithRedFlag == player || playerWithBlueFlag == player)
641+ return false;
642+
643+ return super.onUseItem(player, item);
644+ }
645+
646+ private void returnFlag(int flag)
647+ {
648+ int[] pos;
649+
650+ switch (flag)
651+ {
652+ case 1:
653+ if (playerWithBlueFlag != null)
654+ unequipFlag(playerWithBlueFlag);
655+ if (blueFlagStatus == 2)
656+ unspawnNPC(blueFlagNpc);
657+
658+ pos = getPosition("BlueFlag", 1);
659+ blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
660+ blueFlagStatus = 0;
661+ announce(getPlayerList(), "The Blue flag returned!");
662+ break;
663+
664+ case 2:
665+ if (playerWithRedFlag != null)
666+ unequipFlag(playerWithRedFlag);
667+ if (redFlagStatus == 2)
668+ unspawnNPC(redFlagNpc);
669+
670+ pos = getPosition("RedFlag", 1);
671+ redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
672+ redFlagStatus = 0;
673+ announce(getPlayerList(), "The Red flag returned!");
674+ break;
675+ }
676+ }
677+
678+ @Override
679+ protected void schedule(int time)
680+ {
681+ tpm.scheduleGeneral(task, time);
682+ }
683+
684+ protected void setStatus(EventState s)
685+ {
686+ eventState = s;
687+ }
688+
689+ @Override
690+ protected void showHtml(L2PcInstance player, int obj)
691+ {
692+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
693+ TextBuilder sb = new TextBuilder();
694+ sb.append("<html><body><table width=270><tr><td width=200>Event Engine </td><td><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table><br><center><table width=270 bgcolor=5A5A5A><tr><td width=70>Running</td><td width=130><center>" + getString("eventName") + "</td><td width=70>Time: " + clock.getTime() + "</td></tr></table><center><table width=270><tr><td><center><font color=" + teams.get(1).getHexaColor() + ">" + teams.get(1).getScore() + "</font> - <font color=" + teams.get(2).getHexaColor() + ">" + teams.get(2).getScore() + "</font></td></tr></table><br><table width=270>");
695+
696+ int i = 0;
697+ for (EventTeam team : teams.values())
698+ {
699+ i++;
700+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
701+ for (L2PcInstance p : getPlayersOfTeam(i))
702+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
703+ }
704+
705+ sb.append("</table></body></html>");
706+ html.setHtml(sb.toString());
707+ player.sendPacket(html);
708+ }
709+
710+ protected void spawnFlagsAndHolders()
711+ {
712+ int[] pos = getPosition("BlueFlag", 1);
713+ blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
714+ blueHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("blueFlagHolderId"));
715+
716+ pos = getPosition("RedFlag", 1);
717+ redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
718+ redHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("redFlagHolderId"));
719+ }
720+
721+ @Override
722+ protected void start()
723+ {
724+ setStatus(EventState.START);
725+ schedule(1);
726+ }
727+
728+ @Override
729+ protected String getStartingMsg()
730+ {
731+ return "Steal the enemy flag while keeping yours safe!";
732+ }
733+
734+ @Override
735+ protected String getScorebar()
736+ {
737+ return teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
738+ }
739+
740+ protected void unequipFlag(L2PcInstance player)
741+ {
742+ L2ItemInstance wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
743+ if (wpn != null)
744+ {
745+ L2ItemInstance[] unequiped = player.getInventory().unEquipItemInBodySlotAndRecord(wpn.getItem().getBodyPart());
746+ player.getInventory().destroyItemByItemId("", 6718, 1, player, null);
747+ InventoryUpdate iu = new InventoryUpdate();
748+ for (L2ItemInstance element : unequiped)
749+ iu.addModifiedItem(element);
750+ player.sendPacket(iu);
751+ player.sendPacket(new ItemList(player, true));
752+ player.broadcastUserInfo();
753+ }
754+
755+ if (player == playerWithRedFlag)
756+ playerWithRedFlag = null;
757+ if (player == playerWithBlueFlag)
758+ playerWithBlueFlag = null;
759+ }
760+
761+ protected void unspawnFlagsAndHolders()
762+ {
763+ unspawnNPC(blueFlagNpc);
764+ unspawnNPC(blueHolderNpc);
765+ unspawnNPC(redFlagNpc);
766+ unspawnNPC(redHolderNpc);
767+ }
768+}
769\ No newline at end of file
770Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEvents.java
771===================================================================
772--- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEvents.java (revision 0)
773+++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEvents.java (revision 0)
774@@ -0,0 +1,235 @@
775+/*
776+ * This program is free software: you can redistribute it and/or modify it under
777+ * the terms of the GNU General Public License as published by the Free Software
778+ * Foundation, either version 3 of the License, or (at your option) any later
779+ * version.
780+ *
781+ * This program is distributed in the hope that it will be useful, but WITHOUT
782+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
783+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
784+ * details.
785+ *
786+ * You should have received a copy of the GNU General Public License along with
787+ * this program. If not, see <http://www.gnu.org/licenses/>.
788+ */
789+package net.sf.l2j.gameserver.handler.admincommandhandlers;
790+
791+import java.util.StringTokenizer;
792+
793+import javolution.text.TextBuilder;
794+import javolution.util.FastMap;
795+
796+import net.sf.l2j.gameserver.event.Event;
797+import net.sf.l2j.gameserver.event.EventConfig;
798+import net.sf.l2j.gameserver.event.EventManager;
799+import net.sf.l2j.gameserver.event.Simon;
800+import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
801+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
802+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
803+
804+public class AdminEvents implements IAdminCommandHandler
805+{
806+ private static final String[] ADMIN_COMMANDS =
807+ {
808+ "admin_events",
809+ "admin_enableEvent",
810+ "admin_configureEvent",
811+ "admin_event_set",
812+ "admin_event_start",
813+ "admin_event_finish"
814+ };
815+
816+ @Override
817+ public boolean useAdminCommand(String command, L2PcInstance activeChar)
818+ {
819+ if (command.startsWith("admin_events"))
820+ listEvents(activeChar);
821+ else if (command.startsWith("admin_enableEvent"))
822+ {
823+ StringTokenizer st = new StringTokenizer(command, " ");
824+ try
825+ {
826+ st.nextToken();
827+ int eid = Integer.parseInt(st.nextToken());
828+ if (EventManager.getInstance().getCurrentEvent() != null && EventManager.getInstance().getCurrentEvent().getInt("ids") == eid)
829+ activeChar.sendMessage("Cannot disable a running event");
830+ else
831+ {
832+ EventManager.getInstance().enableEvent(eid, Integer.parseInt(st.nextToken()));
833+ listEvents(activeChar);
834+ }
835+ }
836+ catch (Exception e)
837+ {
838+ activeChar.sendMessage("Wrong parameters given. syntax is enableEvent [eventId] [0 to disable or 1 to enable]");
839+ }
840+ }
841+ else if (command.startsWith("admin_configureEvent"))
842+ {
843+ StringTokenizer st = new StringTokenizer(command, " ");
844+ try
845+ {
846+ st.nextToken();
847+ showMainPage(activeChar, Integer.parseInt(st.nextToken()));
848+ }
849+ catch (Exception e)
850+ {
851+ activeChar.sendMessage("Wrong parameters given. syntax is admin_configureEvent [eventId]");
852+ }
853+ }
854+ else if (command.startsWith("admin_event_set"))
855+ {
856+ StringTokenizer st = new StringTokenizer(command, " ");
857+ try
858+ {
859+ st.nextToken();
860+ int eid = Integer.parseInt(st.nextToken());
861+ EventConfig.getInstance().addProperty(eid, st.nextToken(), st.nextToken());
862+ showMainPage(activeChar, eid);
863+ }
864+ catch (Exception e)
865+ {
866+ activeChar.sendMessage("Wrong parameters given.");
867+ }
868+ }
869+ else if (command.startsWith("admin_event_start"))
870+ {
871+ if (EventManager.getInstance().getCurrentEvent() != null)
872+ activeChar.sendMessage("An event is already running.");
873+ else
874+ {
875+ StringTokenizer st = new StringTokenizer(command, " ");
876+ st.nextToken();
877+ EventManager.getInstance().manualStart(Integer.parseInt(st.nextToken()));
878+ }
879+ }
880+ else if (command.startsWith("admin_event_finish"))
881+ {
882+ if (EventManager.getInstance().getCurrentEvent() != null)
883+ EventManager.getInstance().manualStop();
884+ else
885+ activeChar.sendMessage("No event currently running.");
886+ }
887+ return true;
888+ }
889+
890+ @Override
891+ public String[] getAdminCommandList()
892+ {
893+ return ADMIN_COMMANDS;
894+ }
895+
896+ private static void listEvents(L2PcInstance activeChar)
897+ {
898+ NpcHtmlMessage html = new NpcHtmlMessage(0);
899+ TextBuilder tb = new TextBuilder();
900+ int count = 0;
901+
902+ tb.append("<html><body>Edit the following events as you wish - <a action=\"bypass -h admin_configureEvent 0\">General Configs</a><br>");
903+
904+ FastMap<Integer, String> events = EventManager.getInstance().getEventMap();
905+ for (int id : events.keySet())
906+ {
907+ count++;
908+ tb.append("<center><table width=270 " + (count % 2 == 1 ? "" : "bgcolor=5A5A5A") + "><tr><td width=145>" + events.get(id) + "</td><td width=60>" + (EventManager.getInstance().isEnabled(id) ? "<a action=\"bypass -h admin_enableEvent " + id + " 0\">Disable</a>" : "<a action=\"bypass -h admin_enableEvent " + id + " 1\">Enable</a>") + "</td><td width=65><a action=\"bypass -h admin_configureEvent " + id + "\">Configure</a></td></tr></table>");
909+ }
910+
911+ tb.append("</body></html>");
912+ html.setHtml(tb.toString());
913+ activeChar.sendPacket(html);
914+ }
915+
916+ private static void showMainPage(L2PcInstance activeChar, int eventId)
917+ {
918+ NpcHtmlMessage adminReply = new NpcHtmlMessage(0);
919+ TextBuilder replyMSG = new TextBuilder();
920+
921+ if (eventId == 0)
922+ {
923+ EventManager e = EventManager.getInstance();
924+
925+ replyMSG.append("<html><title>General Configs</title><body>");
926+ replyMSG.append("<center><font color=\"LEVEL\">[General Configs]</font></center><br><br>");
927+ replyMSG.append("<table><tr><td><edit var=\"input\" width=\"190\"></td></tr></table><br>");
928+ replyMSG.append("<table><tr>");
929+ replyMSG.append("<td width=\"100\"><button value=\"Register Time\" action=\"bypass -h admin_event_set 0 registerTime $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
930+ replyMSG.append("<td width=\"100\"><button value=\"Between Time\" action=\"bypass -h admin_event_set 0 betweenEventsTime $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
931+ replyMSG.append("</tr></table><br><table><tr>");
932+ replyMSG.append("<td width=\"100\"><button value=\"Voting Enabled\" action=\"bypass -h admin_event_set 0 votePopupEnabled " + (e.getBoolean("votePopupEnabled") ? "false" : "true") + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
933+ replyMSG.append("<td width=\"100\"><button value=\"Show Vote At\" action=\"bypass -h admin_event_set 0 showVotePopupAt $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
934+ replyMSG.append("</tr></table><br><table><tr>");
935+ replyMSG.append("<td width=\"100\"><button value=\"Debug Enabled\" action=\"bypass -h admin_event_set 0 debug " + (e.getBoolean("debug") ? "false" : "true") + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
936+ replyMSG.append("<td width=\"100\"><button value=\"Tracking Enabled\" action=\"bypass -h admin_event_set 0 statTrackingEnabled " + (e.getBoolean("statTrackingEnabled") ? "false" : "true") + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
937+ replyMSG.append("</tr></table><br><table><tr>");
938+ replyMSG.append("<td width=\"100\"><button value=\"Buffer Enabled\" action=\"bypass -h admin_event_set 0 eventBufferEnabled " + (e.getBoolean("eventBufferEnabled") ? "false" : "true") + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
939+ replyMSG.append("<td width=\"100\"><button value=\"Buff Number\" action=\"bypass -h admin_event_set 0 maxBuffNum $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
940+ replyMSG.append("</tr></table><br><table><tr>");
941+ replyMSG.append("<td width=\"100\"><button value=\"Dualbox Protection\" action=\"bypass -h admin_event_set 0 dualboxAllowed " + (e.getBoolean("dualboxAllowed") ? "false" : "true") + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
942+ replyMSG.append("<td width=\"100\"><button value=\"Anti AFK Time\" action=\"bypass -h admin_event_set 0 antiAfkTime $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
943+ replyMSG.append("</tr></table><br><table><tr>");
944+ replyMSG.append("<td width=\"100\"><button value=\"Anti AFK Tries\" action=\"bypass -h admin_event_set 0 antiAfkDisallowAfter $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
945+ replyMSG.append("<td width=\"100\"><button value=\"Anti AFK Block Time\" action=\"bypass -h admin_event_set 0 antiAfkDisallowTime $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
946+ replyMSG.append("</tr></table><br><br>");
947+ replyMSG.append("<center><font color=\"LEVEL\">[Current Configs]</font></center><br>");
948+ replyMSG.append("Register Time: <font color=\"00FF00\">" + e.getInt("registerTime") + "</font><br>");
949+ replyMSG.append("Between Events Time: <font color=\"00FF00\">" + e.getInt("betweenEventsTime") + "</font><br>");
950+ replyMSG.append("Voting Enabled: <font color=\"00FF00\">" + e.getString("votePopupEnabled") + "</font><br>");
951+ replyMSG.append("Show Vote At: <font color=\"00FF00\">" + e.getInt("showVotePopupAt") + "</font><br>");
952+ replyMSG.append("Debug Enabled: <font color=\"00FF00\">" + e.getString("debug") + "</font><br>");
953+ replyMSG.append("Stat Tracking Enabled: <font color=\"00FF00\">" + e.getString("statTrackingEnabled") + "</font><br>");
954+ replyMSG.append("Buffer Enabled: <font color=\"00FF00\">" + e.getString("eventBufferEnabled") + "</font><br>");
955+ replyMSG.append("Buff Max Amount: <font color=\"00FF00\">" + e.getInt("maxBuffNum") + "</font><br>");
956+ replyMSG.append("Dualbox Protection Disabled: <font color=\"00FF00\">" + e.getString("dualboxAllowed") + "</font><br>");
957+ replyMSG.append("Anti AFK Time: <font color=\"00FF00\">" + e.getInt("antiAfkTime") + "</font><br>");
958+ replyMSG.append("Anti AFK Block After: <font color=\"00FF00\">" + e.getInt("antiAfkDisallowAfter") + "</font><br>");
959+ replyMSG.append("Anti AFK Block Time: <font color=\"00FF00\">" + e.getInt("antiAfkDisallowTime") + "</font><br>");
960+ }
961+ else
962+ {
963+ Event e = EventManager.getInstance().getEvent(eventId);
964+
965+ if (e == null)
966+ {
967+ activeChar.sendMessage("No event with id " + eventId);
968+ return;
969+ }
970+
971+ replyMSG.append("<html><title>" + e.getString("eventName") + "</title><body>");
972+ replyMSG.append("<center><font color=\"LEVEL\">[" + e.getString("eventName") + "]</font></center><br><br>");
973+ replyMSG.append("<table><tr><td><edit var=\"input\" width=\"190\"></td></tr></table><br>");
974+ replyMSG.append("<table><tr>");
975+ replyMSG.append("<td width=\"100\"><button value=\"Min Lvl\" action=\"bypass -h admin_event_set " + eventId + " minLvl $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
976+ replyMSG.append("<td width=\"100\"><button value=\"Max Lvl\" action=\"bypass -h admin_event_set " + eventId + " maxLvl $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
977+ replyMSG.append("</tr></table><br><table><tr>");
978+ replyMSG.append("<td width=\"100\"><button value=\"Reward ID\" action=\"bypass -h admin_event_set " + eventId + " rewardId $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
979+ replyMSG.append("<td width=\"100\"><button value=\"Reward Amount\" action=\"bypass -h admin_event_set " + eventId + " rewardAmmount $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
980+ replyMSG.append("</tr></table><br><table><tr>");
981+ if (e instanceof Simon)
982+ replyMSG.append("<td width=\"100\"><button value=\"Round Time\" action=\"bypass -h admin_event_set " + eventId + " roundTime $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
983+ else
984+ replyMSG.append("<td width=\"100\"><button value=\"Event Time\" action=\"bypass -h admin_event_set " + eventId + " matchTime $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
985+ replyMSG.append("<td width=\"100\"><button value=\"Min Players\" action=\"bypass -h admin_event_set " + eventId + " minPlayers $input\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
986+ replyMSG.append("</tr></table><br><table><tr>");
987+ replyMSG.append("<td width=\"100\"><button value=\"Allow Magic\" action=\"bypass -h admin_event_set " + eventId + " allowUseMagic " + (e.getBoolean("allowUseMagic") ? "false" : "true") + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
988+ replyMSG.append("<td width=\"100\"><button value=\"Remove Buffs\" action=\"bypass -h admin_event_set " + eventId + " removeBuffs " + (e.getBoolean("removeBuffs") ? "false" : "true") + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
989+ replyMSG.append("</tr></table><br><table><tr>");
990+ replyMSG.append("<td width=\"100\"><button value=\"Start\" action=\"bypass -h admin_event_start " + eventId + "\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
991+ replyMSG.append("<td width=\"100\"><button value=\"Finish\" action=\"bypass -h admin_event_finish\" width=90 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
992+ replyMSG.append("</tr></table><br><br>");
993+ replyMSG.append("<center><font color=\"LEVEL\">[Current Configs]</font></center><br>");
994+ replyMSG.append("Name: <font color=\"00FF00\">" + e.getString("eventName") + "</font><br>");
995+ replyMSG.append("Reward ID: <font color=\"00FF00\">" + e.getInt("rewardId") + "</font><br>");
996+ replyMSG.append("Reward Amount: <font color=\"00FF00\">" + e.getInt("rewardAmmount") + "</font><br>");
997+ replyMSG.append("Min Lvl: <font color=\"00FF00\">" + e.getInt("minLvl") + "</font><br>");
998+ replyMSG.append("Max Lvl: <font color=\"00FF00\">" + e.getInt("maxLvl") + "</font><br>");
999+ replyMSG.append("Min Players: <font color=\"00FF00\">" + e.getInt("minPlayers") + "</font><br>");
1000+ replyMSG.append("Event Time: <font color=\"00FF00\">" + e.getInt("matchTime") + "</font><br>");
1001+ replyMSG.append("Allow Magic: <font color=\"00FF00\">" + e.getString("allowUseMagic") + "</font><br>");
1002+ replyMSG.append("Remove Buffs: <font color=\"00FF00\">" + e.getString("removeBuffs") + "</font><br>");
1003+ }
1004+
1005+ replyMSG.append("</body></html>");
1006+ adminReply.setHtml(replyMSG.toString());
1007+ activeChar.sendPacket(adminReply);
1008+ }
1009+}
1010Index: java/net/sf/l2j/gameserver/model/actor/instance/L2EventManagerInstance.java
1011===================================================================
1012--- java/net/sf/l2j/gameserver/model/actor/instance/L2EventManagerInstance.java (revision 0)
1013+++ java/net/sf/l2j/gameserver/model/actor/instance/L2EventManagerInstance.java (revision 0)
1014@@ -0,0 +1,43 @@
1015+package net.sf.l2j.gameserver.model.actor.instance;
1016+
1017+import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
1018+import net.sf.l2j.gameserver.event.EventManager;
1019+import javolution.text.TextBuilder;
1020+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
1021+
1022+public class L2EventManagerInstance extends L2NpcInstance
1023+{
1024+private int objectId;
1025+
1026+ public L2EventManagerInstance(int objectId, L2NpcTemplate template)
1027+ {
1028+ super(objectId, template);
1029+ this.objectId = objectId;
1030+ }
1031+
1032+ @Override
1033+ public void onBypassFeedback(L2PcInstance player, String command)
1034+ {
1035+ if (command.startsWith("reg"))
1036+ EventManager.getInstance().registerPlayer(player);
1037+ else if (command.startsWith("unreg"))
1038+ EventManager.getInstance().unregisterPlayer(player);
1039+ if (command.startsWith("list"))
1040+ {
1041+ NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
1042+ TextBuilder sb = new TextBuilder();
1043+ sb.append("<html><body><center>Select an event to vote for:<br>");
1044+ int i = 0;
1045+ for(String name: EventManager.getInstance().getEventNames())
1046+ {
1047+ i++;
1048+ sb.append (" <a action=\"bypass -h npc_"+objectId+"_"+i+"\">- "+name+" -</a> <br>");
1049+ }
1050+ sb.append("</center></body></html>");
1051+ html.setHtml(sb.toString());
1052+ player.sendPacket(html);
1053+ }
1054+ else
1055+ EventManager.getInstance().addVote(player,Integer.parseInt(command));
1056+ }
1057+}
1058Index: java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossInstance.java
1059===================================================================
1060--- java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossInstance.java (revision 6)
1061+++ java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossInstance.java (working copy)
1062@@ -18,6 +18,7 @@
1063
1064 import net.sf.l2j.Config;
1065 import net.sf.l2j.gameserver.ThreadPoolManager;
1066+import net.sf.l2j.gameserver.event.EventManager;
1067 import net.sf.l2j.gameserver.instancemanager.RaidBossPointsManager;
1068 import net.sf.l2j.gameserver.instancemanager.RaidBossSpawnManager;
1069 import net.sf.l2j.gameserver.instancemanager.RaidBossSpawnManager.StatusEnum;
1070@@ -78,6 +79,9 @@
1071 final L2PcInstance player = killer.getActingPlayer();
1072 if (player != null)
1073 {
1074+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(player))
1075+ EventManager.getInstance().getCurrentEvent().onKill(this, player);
1076+
1077 broadcastPacket(SystemMessage.getSystemMessage(SystemMessageId.RAID_WAS_SUCCESSFUL));
1078 broadcastPacket(new PlaySound("systemmsg_e.1209"));
1079
1080Index: java/net/sf/l2j/gameserver/GameServer.java
1081===================================================================
1082--- java/net/sf/l2j/gameserver/GameServer.java (revision 6)
1083+++ java/net/sf/l2j/gameserver/GameServer.java (working copy)
1084@@ -57,11 +57,15 @@
1085 import net.sf.l2j.gameserver.datatables.StaticObjects;
1086 import net.sf.l2j.gameserver.datatables.SummonItemsData;
1087 import net.sf.l2j.gameserver.datatables.TeleportLocationTable;
1088+import net.sf.l2j.gameserver.event.EventBuffer;
1089+import net.sf.l2j.gameserver.event.EventManager;
1090+import net.sf.l2j.gameserver.event.EventStats;
1091 import net.sf.l2j.gameserver.handler.AdminCommandHandler;
1092 import net.sf.l2j.gameserver.handler.ChatHandler;
1093 import net.sf.l2j.gameserver.handler.ItemHandler;
1094 import net.sf.l2j.gameserver.handler.SkillHandler;
1095 import net.sf.l2j.gameserver.handler.UserCommandHandler;
1096+import net.sf.l2j.gameserver.handler.VoicedCommandHandler;
1097 import net.sf.l2j.gameserver.idfactory.IdFactory;
1098 import net.sf.l2j.gameserver.instancemanager.AuctionManager;
1099 import net.sf.l2j.gameserver.instancemanager.BoatManager;
1100@@ -270,6 +274,7 @@
1101 _log.config("ItemHandler: Loaded " + ItemHandler.getInstance().size() + " handlers.");
1102 _log.config("SkillHandler: Loaded " + SkillHandler.getInstance().size() + " handlers.");
1103 _log.config("UserCommandHandler: Loaded " + UserCommandHandler.getInstance().size() + " handlers.");
1104+ _log.config("VoicedCommandHandler: Loaded " + VoicedCommandHandler.getInstance().size() + " handlers.");
1105
1106 if (Config.ALLOW_WEDDING)
1107 CoupleManager.getInstance();
1108@@ -277,6 +282,11 @@
1109 if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED)
1110 FishingChampionshipManager.getInstance();
1111
1112+ EventManager.getInstance();
1113+ EventStats.getInstance();
1114+ if (EventManager.getInstance().getBoolean("eventBufferEnabled"))
1115+ EventBuffer.getInstance();
1116+
1117 Util.printSection("System");
1118 TaskManager.getInstance();
1119Index: java/net/sf/l2j/gameserver/network/serverpackets/ExColosseumFenceInfoPacket.java
1120===================================================================
1121--- java/net/sf/l2j/gameserver/network/serverpackets/ExColosseumFenceInfoPacket.java (revision 0)
1122+++ java/net/sf/l2j/gameserver/network/serverpackets/ExColosseumFenceInfoPacket.java (revision 0)
1123@@ -0,0 +1,35 @@
1124+package net.sf.l2j.gameserver.network.serverpackets;
1125+
1126+import net.sf.l2j.gameserver.model.actor.instance.L2FenceInstance;
1127+
1128+public class ExColosseumFenceInfoPacket extends L2GameServerPacket
1129+{
1130+ private static final String _S__FE_03_EXCOLOSSEUMFENCEINFOPACKET = "[S] FE:03 ExColosseumFenceInfoPacket";
1131+ private L2FenceInstance _fence;
1132+
1133+ public ExColosseumFenceInfoPacket(L2FenceInstance fence)
1134+ {
1135+ _fence = fence;
1136+ }
1137+
1138+ @Override
1139+ protected void writeImpl()
1140+ {
1141+ writeC(0xfe);
1142+ writeH(0x09);
1143+
1144+ writeD(_fence.getObjectId());
1145+ writeD(_fence.getType());
1146+ writeD(_fence.getX());
1147+ writeD(_fence.getY());
1148+ writeD(_fence.getZ());
1149+ writeD(_fence.getWidth());
1150+ writeD(_fence.getLength());
1151+ }
1152+
1153+ @Override
1154+ public String getType()
1155+ {
1156+ return _S__FE_03_EXCOLOSSEUMFENCEINFOPACKET;
1157+ }
1158+}
1159Index: java/net/sf/l2j/gameserver/event/EventStats.java
1160===================================================================
1161--- java/net/sf/l2j/gameserver/event/EventStats.java (revision 0)
1162+++ java/net/sf/l2j/gameserver/event/EventStats.java (revision 0)
1163@@ -0,0 +1,393 @@
1164+package net.sf.l2j.gameserver.event;
1165+
1166+import java.sql.Connection;
1167+import java.sql.PreparedStatement;
1168+import java.sql.ResultSet;
1169+import java.util.Map;
1170+import java.util.Set;
1171+
1172+import javolution.text.TextBuilder;
1173+import javolution.util.FastMap;
1174+
1175+import net.sf.l2j.L2DatabaseFactory;
1176+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
1177+import net.sf.l2j.gameserver.network.serverpackets.ShowBoard;
1178+
1179+public class EventStats
1180+{
1181+ protected FastMap<Integer, int[]> tempTable;
1182+ private FastMap<Integer, FastMap<Integer, StatModell>> stats;
1183+ private FastMap<Integer, ShowBoard> htmls;
1184+ private FastMap<Integer, int[]> statSums;
1185+
1186+ private static class SingletonHolder
1187+ {
1188+ protected static final EventStats _instance = new EventStats();
1189+ }
1190+
1191+ public static EventStats getInstance()
1192+ {
1193+ return SingletonHolder._instance;
1194+ }
1195+
1196+ protected class StatModell
1197+ {
1198+ protected int num;
1199+ protected int wins;
1200+ protected int losses;
1201+ protected int kills;
1202+ protected int deaths;
1203+ protected int scores;
1204+
1205+ protected StatModell(int num, int wins, int losses, int kills, int deaths, int scores)
1206+ {
1207+ this.num = num;
1208+ this.wins = wins;
1209+ this.losses = losses;
1210+ this.kills = kills;
1211+ this.deaths = deaths;
1212+ this.scores = scores;
1213+ }
1214+ }
1215+
1216+ public EventStats()
1217+ {
1218+ stats = new FastMap<>();
1219+ tempTable = new FastMap<>();
1220+ htmls = new FastMap<>();
1221+ statSums = new FastMap<>();
1222+ loadSQL();
1223+ }
1224+
1225+ protected void applyChanges()
1226+ {
1227+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
1228+ return;
1229+
1230+ int eventId = EventManager.getInstance().getCurrentEvent().eventId;
1231+ for (L2PcInstance player : EventManager.getInstance().getCurrentEvent().getPlayerList())
1232+ {
1233+ int playerId = player.getObjectId();
1234+
1235+ if (!stats.containsKey(playerId))
1236+ stats.put(playerId, new FastMap<Integer, StatModell>());
1237+
1238+ if (!stats.get(playerId).containsKey(eventId))
1239+ stats.get(playerId).put(eventId, new StatModell(0, 0, 0, 0, 0, 0));
1240+
1241+ if (tempTable.get(playerId)[0] == 1)
1242+ stats.get(playerId).get(eventId).wins = stats.get(playerId).get(eventId).wins + 1;
1243+ else
1244+ stats.get(playerId).get(eventId).losses = stats.get(playerId).get(eventId).losses + 1;
1245+
1246+ stats.get(playerId).get(eventId).num = stats.get(playerId).get(eventId).num + 1;
1247+ stats.get(playerId).get(eventId).kills = stats.get(playerId).get(eventId).kills + tempTable.get(playerId)[1];
1248+ stats.get(playerId).get(eventId).deaths = stats.get(playerId).get(eventId).deaths + tempTable.get(playerId)[2];
1249+ stats.get(playerId).get(eventId).scores = stats.get(playerId).get(eventId).scores + tempTable.get(playerId)[3];
1250+ }
1251+ }
1252+
1253+ protected void createHtmls()
1254+ {
1255+ htmls.clear();
1256+ TextBuilder sb = new TextBuilder();
1257+ Connection con = null;
1258+ PreparedStatement statement = null;
1259+ try
1260+ {
1261+ con = L2DatabaseFactory.getInstance().getConnection();
1262+ statement = con.prepareStatement("SELECT characters.char_name, event_stats_full.* FROM event_stats_full INNER JOIN characters ON characters.obj_Id = event_stats_full.player ORDER BY event_stats_full.wins DESC");
1263+ ResultSet rset = statement.executeQuery();
1264+ rset.last();
1265+ rset.beforeFirst();
1266+ int count = 0;
1267+ while (rset.next())
1268+ {
1269+ count++;
1270+ if (count % 10 == 1)
1271+ sb.append("<html><body><br><br><center><table width=615 bgcolor=5A5A5A><tr><td width=30><center>Rank</td><td width=100><center>Name</td><td width=55><center>Events</td><td width=55><center>Win%</td><td width=55><center>K:D</td><td width=55><center>Wins</td><td width=55><center>Losses</td><td width=55><center>Kills</td><td width=55><center>Deaths</td><td width=100><center>Favourite Event</td></tr></table><br>" + "<center><table width=635>");
1272+
1273+ sb.append("<tr><td width=30><center>" + count + "</td><td width=100>" + rset.getString("char_name") + "</td><td width=55><center>" + rset.getInt("num") + "</td><td width=55><center>" + rset.getInt("winpercent") + "%</td><td width=55><center>" + rset.getDouble("kdratio") + "</td><td width=55><center>" + rset.getInt("wins") + "</td><td width=55><center>" + rset.getInt("losses") + "</td><td width=55><center>" + rset.getInt("kills") + "</td>" + "<td width=55><center>" + rset.getInt("deaths") + "</td><td width=120><center>" + EventManager.getInstance().events.get(rset.getInt("favevent")).getString("eventName") + "</td></tr>");
1274+
1275+ if (count % 10 == 0)
1276+ {
1277+ sb.append("</table></body></html>");
1278+ htmls.put(count / 10, new ShowBoard(sb.toString(), "101"));
1279+ sb.clear();
1280+ }
1281+ }
1282+ if (count % 10 != 0 && !htmls.containsKey(count / 10 + 1))
1283+ {
1284+ sb.append("</table></body></html>");
1285+ htmls.put((count / 10 + 1), new ShowBoard(sb.toString(), "101"));
1286+ sb.clear();
1287+ }
1288+ rset.close();
1289+ statement.close();
1290+ }
1291+ catch (Exception e)
1292+ {
1293+ System.out.println("create SQL exception. " + e);
1294+ }
1295+ finally
1296+ {
1297+ try
1298+ {
1299+ if (con != null)
1300+ con.close();
1301+ }
1302+ catch (Exception e)
1303+ {
1304+
1305+ }
1306+ }
1307+ }
1308+
1309+ private void loadSQL()
1310+ {
1311+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
1312+ return;
1313+
1314+ Connection con = null;
1315+ PreparedStatement statement = null;
1316+ try
1317+ {
1318+ con = L2DatabaseFactory.getInstance().getConnection();
1319+ statement = con.prepareStatement("SELECT * FROM event_stats");
1320+ ResultSet rset = statement.executeQuery();
1321+ while (rset.next())
1322+ {
1323+ if (!stats.containsKey(rset.getInt("player")))
1324+ stats.put(rset.getInt("player"), new FastMap<Integer, StatModell>());
1325+
1326+ stats.get(rset.getInt("player")).put(rset.getInt("event"), new StatModell(rset.getInt("num"), rset.getInt("wins"), rset.getInt("losses"), rset.getInt("kills"), rset.getInt("deaths"), rset.getInt("scores")));
1327+ }
1328+ rset.close();
1329+ statement.close();
1330+ }
1331+ catch (Exception e)
1332+ {
1333+ System.out.println("EventStats SQL catch " + e);
1334+ }
1335+ finally
1336+ {
1337+ try
1338+ {
1339+ if (con != null)
1340+ con.close();
1341+ }
1342+ catch (Exception e)
1343+ {
1344+
1345+ }
1346+ }
1347+ createHtmls();
1348+ }
1349+
1350+ public void showHtml(int id, L2PcInstance player)
1351+ {
1352+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
1353+ {
1354+ player.sendMessage("The stat tracking is disabled.");
1355+ return;
1356+ }
1357+
1358+ player.sendPacket(htmls.get(id));
1359+ player.sendPacket(new ShowBoard(null, "102"));
1360+ player.sendPacket(new ShowBoard(null, "103"));
1361+ }
1362+
1363+ public void showPlayerStats(int playerId, L2PcInstance player)
1364+ {
1365+ TextBuilder sb = new TextBuilder();
1366+ sb.append("<html><body><br><br><center><table width=640 bgcolor=5A5A5A><tr><td width=120><center>Event</td><td width=65><center>Count</td><td width=65><center>Win%</td><td width=65><center>K:D</td><td width=65><center>Wins</td><td width=65><center>Losses</td><td width=65><center>Kills</td><td width=65><center>Deaths</td><td width=65><center>Scores</td></tr></table><br>" + "<center><table width=640>");
1367+
1368+ if (stats.containsKey(playerId))
1369+ {
1370+ for (Map.Entry<Integer, StatModell> event : stats.get(playerId).entrySet())
1371+ {
1372+ StatModell stats = event.getValue();
1373+
1374+ if(EventManager.getInstance().events.containsKey(event.getKey()))
1375+ sb.append("<tr><td width=120>" + EventManager.getInstance().events.get(event.getKey()).getString("eventName") + "</td><td width=65><center>" + stats.num + "</td><td width=65><center>" + (stats.wins / stats.num) * 100 + "%</td><td width=65><center>" + (stats.deaths == 0 ? (double) stats.kills / stats.num : (double) ((stats.kills / stats.deaths) / stats.num)) + "</td><td width=65><center>" + stats.wins + "</td><td width=65><center>" + stats.losses + "</td><td width=65><center>" + stats.kills / stats.num + "</td><td width=65><center>" + stats.deaths / stats.num + "</td><td width=65><center>" + stats.scores / stats.num + "</td></tr>");
1376+ }
1377+ }
1378+
1379+ sb.append("</table></body></html>");
1380+ player.sendPacket(new ShowBoard(sb.toString(), "101"));
1381+ player.sendPacket(new ShowBoard(null, "102"));
1382+ player.sendPacket(new ShowBoard(null, "103"));
1383+ }
1384+
1385+ public int getEventKills(int playerId)
1386+ {
1387+ int kills = 0;
1388+
1389+ if(!stats.containsKey(playerId))
1390+ return 0;
1391+
1392+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
1393+ kills += statmodell.getValue().kills;
1394+
1395+ return kills;
1396+ }
1397+
1398+ public int getEvents(int playerId)
1399+ {
1400+ int num = 0;
1401+
1402+ if(!stats.containsKey(playerId))
1403+ return 0;
1404+
1405+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
1406+ num += statmodell.getValue().num;
1407+
1408+ return num;
1409+ }
1410+
1411+ public int getEventWins(int playerId)
1412+ {
1413+ int wins = 0;
1414+
1415+ if(!stats.containsKey(playerId))
1416+ return 0;
1417+
1418+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
1419+ wins += statmodell.getValue().wins;
1420+
1421+ return wins;
1422+ }
1423+
1424+ // num | wins | losses | kills | deaths | fav_event_id
1425+ protected void sumPlayerStats()
1426+ {
1427+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
1428+ return;
1429+
1430+ statSums.clear();
1431+
1432+ for (int playerId : stats.keySet())
1433+ {
1434+ int num = 0;
1435+ int wins = 0;
1436+ int losses = 0;
1437+ int kills = 0;
1438+ int deaths = 0;
1439+ int faveventid = 0;
1440+ int faveventamm = 0;
1441+
1442+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
1443+ {
1444+ num += statmodell.getValue().num;
1445+ wins += statmodell.getValue().wins;
1446+ losses += statmodell.getValue().losses;
1447+ kills += statmodell.getValue().kills;
1448+ deaths += statmodell.getValue().deaths;
1449+
1450+ if (statmodell.getValue().num > faveventamm)
1451+ {
1452+ faveventamm = statmodell.getValue().num;
1453+ faveventid = statmodell.getKey();
1454+ }
1455+ }
1456+ statSums.put(playerId, new int[] { num, wins, losses, kills, deaths, faveventid });
1457+ }
1458+ }
1459+
1460+ protected void updateSQL(Set<L2PcInstance> players, int eventId)
1461+ {
1462+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
1463+ return;
1464+
1465+ sumPlayerStats();
1466+ Connection con = null;
1467+ PreparedStatement statement = null;
1468+ try
1469+ {
1470+ con = L2DatabaseFactory.getInstance().getConnection();
1471+
1472+ for (L2PcInstance player : players)
1473+ {
1474+ int id = player.getObjectId();
1475+
1476+ if (statSums.get(id)[0] != 1)
1477+ {
1478+ statement = con.prepareStatement("UPDATE event_stats_full SET num=?, winpercent=?, kdratio=?, wins=?, losses=?, kills=?, deaths=?, favevent=? WHERE player=?");
1479+ statement.setInt(1, statSums.get(id)[0]);
1480+ statement.setInt(2, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
1481+ statement.setDouble(3, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
1482+ statement.setInt(4, statSums.get(id)[1]);
1483+ statement.setInt(5, statSums.get(id)[2]);
1484+ statement.setInt(6, statSums.get(id)[3]);
1485+ statement.setInt(7, statSums.get(id)[4]);
1486+ statement.setInt(8, statSums.get(id)[5]);
1487+ statement.setInt(9, id);
1488+
1489+ statement.executeUpdate();
1490+ statement.close();
1491+ }
1492+ else
1493+ {
1494+ statement = con.prepareStatement("INSERT INTO event_stats_full(player,num,winpercent,kdratio,wins,losses,kills,deaths,favevent) VALUES (?,?,?,?,?,?,?,?,?)");
1495+ statement.setInt(1, id);
1496+ statement.setInt(2, statSums.get(id)[0]);
1497+ statement.setInt(3, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
1498+ statement.setDouble(4, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
1499+ statement.setInt(5, statSums.get(id)[1]);
1500+ statement.setInt(6, statSums.get(id)[2]);
1501+ statement.setInt(7, statSums.get(id)[3]);
1502+ statement.setInt(8, statSums.get(id)[4]);
1503+ statement.setInt(9, statSums.get(id)[5]);
1504+ statement.executeUpdate();
1505+ statement.close();
1506+ }
1507+
1508+ if (stats.get(id).get(eventId).num != 1)
1509+ {
1510+ statement = con.prepareStatement("UPDATE event_stats SET num=?, wins=?, losses=?, kills=?, deaths=?, scores=? WHERE player=? AND event=?");
1511+ statement.setInt(1, stats.get(id).get(eventId).num);
1512+ statement.setInt(2, stats.get(id).get(eventId).wins);
1513+ statement.setInt(3, stats.get(id).get(eventId).losses);
1514+ statement.setInt(4, stats.get(id).get(eventId).kills);
1515+ statement.setInt(5, stats.get(id).get(eventId).deaths);
1516+ statement.setInt(6, stats.get(id).get(eventId).scores);
1517+ statement.setInt(7, id);
1518+ statement.setInt(8, eventId);
1519+ statement.executeUpdate();
1520+ statement.close();
1521+ }
1522+ else
1523+ {
1524+ statement = con.prepareStatement("INSERT INTO event_stats(player,event,num,wins,losses,kills,deaths,scores) VALUES (?,?,?,?,?,?,?,?)");
1525+ statement.setInt(1, id);
1526+ statement.setInt(2, eventId);
1527+ statement.setInt(3, stats.get(id).get(eventId).num);
1528+ statement.setInt(4, stats.get(id).get(eventId).wins);
1529+ statement.setInt(5, stats.get(id).get(eventId).losses);
1530+ statement.setInt(6, stats.get(id).get(eventId).kills);
1531+ statement.setInt(7, stats.get(id).get(eventId).deaths);
1532+ statement.setInt(8, stats.get(id).get(eventId).scores);
1533+ statement.executeUpdate();
1534+ statement.close();
1535+ }
1536+ }
1537+ }
1538+ catch (Exception e)
1539+ {
1540+ System.out.println("EventStats SQL catch " + e);
1541+ }
1542+ finally
1543+ {
1544+ try
1545+ {
1546+ if (con != null)
1547+ con.close();
1548+ }
1549+ catch (Exception e)
1550+ {
1551+
1552+ }
1553+ }
1554+ createHtmls();
1555+ }
1556+}
1557\ No newline at end of file
1558Index: java/net/sf/l2j/gameserver/model/olympiad/OlympiadManager.java
1559===================================================================
1560--- java/net/sf/l2j/gameserver/model/olympiad/OlympiadManager.java (revision 6)
1561+++ java/net/sf/l2j/gameserver/model/olympiad/OlympiadManager.java (working copy)
1562@@ -21,6 +21,7 @@
1563 import java.util.concurrent.CopyOnWriteArrayList;
1564
1565 import net.sf.l2j.Config;
1566+import net.sf.l2j.gameserver.event.EventManager;
1567 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
1568 import net.sf.l2j.gameserver.network.SystemMessageId;
1569 import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
1570@@ -155,6 +156,12 @@
1571 return false;
1572 }
1573
1574+ if (EventManager.getInstance().players.contains(player))
1575+ {
1576+ player.sendMessage("You can't join olympiad while participating in an Event.");
1577+ return false;
1578+ }
1579+
1580 switch (type)
1581 {
1582 case CLASSED:
1583\ No newline at end of file
1584Index: java/net/sf/l2j/gameserver/network/clientpackets/Logout.java
1585===================================================================
1586--- java/net/sf/l2j/gameserver/network/clientpackets/Logout.java (revision 6)
1587+++ java/net/sf/l2j/gameserver/network/clientpackets/Logout.java (working copy)
1588@@ -16,6 +16,7 @@
1589
1590 import net.sf.l2j.Config;
1591 import net.sf.l2j.gameserver.SevenSignsFestival;
1592+import net.sf.l2j.gameserver.event.EventManager;
1593 import net.sf.l2j.gameserver.model.L2Party;
1594 import net.sf.l2j.gameserver.model.actor.L2Character;
1595 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
1596@@ -70,6 +71,13 @@
1597 return;
1598 }
1599
1600+ if (EventManager.getInstance().isRegistered(player))
1601+ {
1602+ player.sendMessage("You cannot logout while you are a participant of an event.");
1603+ player.sendPacket(ActionFailed.STATIC_PACKET);
1604+ return;
1605+ }
1606+
1607 // Prevent player from logging out if they are a festival participant and it is in progress,
1608 // otherwise notify party members that the player is not longer a participant.
1609 if (player.isFestivalParticipant())
1610Index: java/net/sf/l2j/gameserver/network/clientpackets/Say2.java
1611===================================================================
1612--- java/net/sf/l2j/gameserver/network/clientpackets/Say2.java (revision 6)
1613+++ java/net/sf/l2j/gameserver/network/clientpackets/Say2.java (working copy)
1614@@ -19,6 +19,7 @@
1615 import java.util.logging.Logger;
1616
1617 import net.sf.l2j.Config;
1618+import net.sf.l2j.gameserver.event.EventManager;
1619 import net.sf.l2j.gameserver.handler.ChatHandler;
1620 import net.sf.l2j.gameserver.handler.IChatHandler;
1621 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
1622@@ -197,6 +198,12 @@
1623
1624 _text = _text.replaceAll("\\\\n", "");
1625
1626+ if (EventManager.getInstance().isRegistered(activeChar) && !EventManager.getInstance().getCurrentEvent().onSay(_type, activeChar, _text))
1627+ {
1628+ activeChar.sendMessage("You cannot talk right now.");
1629+ return;
1630+ }
1631+
1632 IChatHandler handler = ChatHandler.getInstance().getChatHandler(_type);
1633 if (handler != null)
1634 handler.handleChat(_type, activeChar, _target, _text);
1635Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java
1636===================================================================
1637--- java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java (revision 6)
1638+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java (working copy)
1639@@ -15,6 +15,7 @@
1640 package net.sf.l2j.gameserver.network.clientpackets;
1641
1642 import net.sf.l2j.Config;
1643+import net.sf.l2j.gameserver.event.EventManager;
1644 import net.sf.l2j.gameserver.model.BlockList;
1645 import net.sf.l2j.gameserver.model.L2Party;
1646 import net.sf.l2j.gameserver.model.L2World;
1647@@ -45,6 +46,12 @@
1648 if (requestor == null)
1649 return;
1650
1651+ if (EventManager.getInstance().isRegistered(requestor) && EventManager.getInstance().isSpecialEvent())
1652+ {
1653+ requestor.sendMessage("You cannot make a party while in LMS or DM events.");
1654+ return;
1655+ }
1656+
1657 final L2PcInstance target = L2World.getInstance().getPlayer(_name);
1658 if (target == null)
1659 {
1660Index: java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java
1661===================================================================
1662--- java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java (revision 6)
1663+++ java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java (working copy)
1664@@ -22,6 +22,7 @@
1665 import net.sf.l2j.gameserver.datatables.ClanTable;
1666 import net.sf.l2j.gameserver.datatables.SkillTable;
1667 import net.sf.l2j.gameserver.datatables.SkillTreeTable;
1668+import net.sf.l2j.gameserver.event.EventManager;
1669 import net.sf.l2j.gameserver.instancemanager.SiegeManager;
1670 import net.sf.l2j.gameserver.model.L2Clan;
1671 import net.sf.l2j.gameserver.model.L2Clan.SubPledge;
1672@@ -170,6 +171,12 @@
1673 return;
1674 }
1675
1676+ if (EventManager.getInstance().players.contains(player))
1677+ {
1678+ player.sendMessage("Subclass cannot be changed while registered to event.");
1679+ return;
1680+ }
1681+
1682 NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
1683
1684 int cmdChoice = 0;
1685Index: java/net/sf/l2j/gameserver/event/EventManager.java
1686===================================================================
1687--- java/net/sf/l2j/gameserver/event/EventManager.java (revision 0)
1688+++ java/net/sf/l2j/gameserver/event/EventManager.java (revision 0)
1689@@ -0,0 +1,955 @@
1690+package net.sf.l2j.gameserver.event;
1691+
1692+import java.util.Map;
1693+import java.util.Random;
1694+
1695+import javolution.text.TextBuilder;
1696+import javolution.util.FastList;
1697+import javolution.util.FastMap;
1698+
1699+import net.sf.l2j.gameserver.ThreadPoolManager;
1700+import net.sf.l2j.gameserver.datatables.DoorTable;
1701+import net.sf.l2j.gameserver.datatables.FenceTable;
1702+import net.sf.l2j.gameserver.idfactory.IdFactory;
1703+import net.sf.l2j.gameserver.model.actor.L2Character;
1704+import net.sf.l2j.gameserver.model.L2World;
1705+import net.sf.l2j.gameserver.model.actor.instance.L2FenceInstance;
1706+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
1707+import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
1708+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
1709+import net.sf.l2j.gameserver.util.Broadcast;
1710+import net.sf.l2j.util.Rnd;
1711+
1712+public final class EventManager
1713+{
1714+ private EventConfig config;
1715+ public FastMap<Integer, Event> disabled;
1716+ public FastMap<Integer, Event> events;
1717+ public FastList<L2PcInstance> players;
1718+ public FastMap<String, Integer> afkers;
1719+ private Event current;
1720+ protected FastMap<L2PcInstance, Integer> colors;
1721+ protected FastMap<L2PcInstance, String> titles;
1722+ protected FastMap<L2PcInstance, int[]> positions;
1723+ protected FastMap<L2PcInstance, Integer> votes;
1724+ protected State status;
1725+ protected int counter;
1726+ protected Countdown cdtask;
1727+ protected ThreadPoolManager tpm;
1728+ private Scheduler task;
1729+ protected Random rnd = new Random();
1730+ protected FastList<Integer> eventIds;
1731+ protected enum State
1732+ {
1733+ REGISTERING, VOTING, RUNNING, END
1734+ }
1735+
1736+ protected class Countdown implements Runnable
1737+ {
1738+ protected String getTime()
1739+ {
1740+ String mins = "" + counter / 60;
1741+ String secs = (counter % 60 < 10 ? "0" + counter % 60 : "" + counter % 60);
1742+ return mins + ":" + secs;
1743+ }
1744+
1745+ @Override
1746+ public void run()
1747+ {
1748+ if (status == State.REGISTERING)
1749+ {
1750+ switch (counter)
1751+ {
1752+ case 300:
1753+ case 240:
1754+ case 180:
1755+ case 120:
1756+ case 60:
1757+ announce(counter / 60 + " min(s) left to register, " + getCurrentEvent().getString("eventName"));
1758+ break;
1759+ case 30:
1760+ case 10:
1761+ announce(counter + " seconds left to register!");
1762+ break;
1763+ }
1764+ }
1765+
1766+ if (status == State.VOTING && counter == getInt("showVotePopupAt") && getBoolean("votePopupEnabled"))
1767+ {
1768+ NpcHtmlMessage html = new NpcHtmlMessage(0);
1769+ TextBuilder sb = new TextBuilder();
1770+ int i = 0, roll1, roll2, roll3, count = 0;
1771+
1772+ roll1 = Rnd.get(events.size()) + 1;
1773+ do
1774+ {
1775+ roll2 = Rnd.get(events.size()) + 1;
1776+ } while (roll2 == roll1);
1777+ do
1778+ {
1779+ roll3 = Rnd.get(events.size()) + 1;
1780+ } while (roll3 == roll2 || roll3 == roll1);
1781+
1782+ sb.append("<html><body><center><table width=270><tr><td width=270><center>Event Engine - Vote for your favourite event!</center></td></tr></table></center><br>");
1783+
1784+ for (Map.Entry<Integer, Event> event : events.entrySet())
1785+ {
1786+ i++;
1787+ if (i == roll1 || i == roll2 || i == roll3)
1788+ {
1789+ count++;
1790+ sb.append("<center><table width=270 " + (count % 2 == 1 ? "" : "bgcolor=5A5A5A") + "><tr><td width=240>" + event.getValue().getString("eventName") + "</td><td width=30><a action=\"bypass -h eventvote " + event.getKey() + "\">Vote</a></td></tr></table></center>");
1791+ }
1792+ if (count == 3)
1793+ break;
1794+ }
1795+
1796+ sb.append("</body></html>");
1797+ html.setHtml(sb.toString());
1798+
1799+ for (L2PcInstance player : L2World.getInstance().getAllPlayers().values())
1800+ {
1801+ if (votes.containsKey(player) || player.getLevel() < 40)
1802+ continue;
1803+
1804+ player.sendPacket(html);
1805+ }
1806+ }
1807+
1808+ if (counter == 0)
1809+ schedule(1);
1810+ else
1811+ {
1812+ counter--;
1813+ tpm.scheduleGeneral(cdtask, 1000);
1814+ }
1815+ }
1816+ }
1817+
1818+ private class AntiAfk implements Runnable
1819+ {
1820+ private L2PcInstance _player;
1821+
1822+ public AntiAfk(L2PcInstance player)
1823+ {
1824+ _player = player;
1825+ }
1826+
1827+ @Override
1828+ public void run()
1829+ {
1830+ if (getCurrentEvent() == null)
1831+ return;
1832+
1833+ if (_player.getAntiAfk() == 0)
1834+ {
1835+ _player.sendMessage("You were AFK during the event and therefore you are kicked.");
1836+
1837+ if (_player.getPoly().isMorphed())
1838+ {
1839+ _player.getPoly().setPolyInfo(null, "1");
1840+ _player.decayMe();
1841+ _player.spawnMe(_player.getX(), _player.getY(), _player.getZ());
1842+ }
1843+
1844+ if (_player.isDead())
1845+ _player.doRevive();
1846+
1847+ _player.teleToLocation(positions.get(_player)[0], positions.get(_player)[1], positions.get(_player)[2], 0);
1848+ _player.getAppearance().setNameColor(colors.get(_player));
1849+ _player.setTitle(titles.get(_player));
1850+
1851+ if (_player.getParty() != null)
1852+ _player.leaveParty();
1853+
1854+ _player.broadcastUserInfo();
1855+
1856+ // pretend a logout
1857+ getCurrentEvent().onLogout(_player);
1858+
1859+ if (afkers.containsKey(_player.getAccountName()))
1860+ {
1861+ afkers.put(_player.getAccountName(), afkers.get(_player.getAccountName()) + 1);
1862+
1863+ if (afkers.get(_player.getAccountName()) == getInt("antiAfkDisallowAfter"))
1864+ tpm.scheduleGeneral(new AntiAfkDisallow(_player), getInt("antiAfkDisallowTime"));
1865+ }
1866+ else
1867+ afkers.put(_player.getAccountName(), 1);
1868+ }
1869+ else if (_player.isOnline())
1870+ {
1871+ if (!_player.isDead())
1872+ _player.setAntiAfk(_player.getAntiAfk() - 1);
1873+
1874+ tpm.scheduleGeneral(this, 1000);
1875+ }
1876+ }
1877+ }
1878+
1879+ private class AntiAfkDisallow implements Runnable
1880+ {
1881+ private L2PcInstance _player;
1882+
1883+ public AntiAfkDisallow(L2PcInstance player)
1884+ {
1885+ _player = player;
1886+ }
1887+
1888+ @Override
1889+ public void run()
1890+ {
1891+ afkers.remove(_player);
1892+ }
1893+ }
1894+
1895+ protected class Scheduler implements Runnable
1896+ {
1897+ @Override
1898+ public void run()
1899+ {
1900+ switch (status)
1901+ {
1902+ case VOTING:
1903+ if (votes.size() > 0)
1904+ setCurrentEvent(getVoteWinner());
1905+ else
1906+ setCurrentEvent(eventIds.get(rnd.nextInt(eventIds.size())));
1907+
1908+ announce("The next event will be: " + getCurrentEvent().getString("eventName"));
1909+ announce("Registering phase started! You have " + getInt("registerTime") / 60 + " minutes to register!");
1910+ announce("To register use .register or visit the event manager.");
1911+ setStatus(State.REGISTERING);
1912+ counter = getInt("registerTime") - 1;
1913+ tpm.scheduleGeneral(cdtask, 1);
1914+ break;
1915+
1916+ case REGISTERING:
1917+ announce("Registering phase ended!");
1918+ if (players.size() < getCurrentEvent().getInt("minPlayers"))
1919+ {
1920+ announce("There are not enough participants! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
1921+ players.clear();
1922+ colors.clear();
1923+ positions.clear();
1924+ setStatus(State.VOTING);
1925+ counter = getInt("betweenEventsTime") - 1;
1926+ tpm.scheduleGeneral(cdtask, 1);
1927+ }
1928+ else
1929+ {
1930+ announce("Event started!");
1931+ setStatus(State.RUNNING);
1932+ msgToAll("You'll be teleported to the event in 10 seconds.");
1933+ schedule(10000);
1934+ }
1935+ break;
1936+
1937+ case RUNNING:
1938+ if (getCurrentEvent() instanceof Korean)
1939+ {
1940+ if (players.size() < 15) // 1vs1 and 2vs2
1941+ {
1942+ if (players.size() % 2 != 0)
1943+ players.removeLast();
1944+ }
1945+ else // 3vs3
1946+ {
1947+ while (players.size() % 3 != 0)
1948+ players.removeLast();
1949+ }
1950+ }
1951+
1952+ getCurrentEvent().start();
1953+
1954+ for (L2PcInstance player : players)
1955+ {
1956+ EventStats.getInstance().tempTable.put(player.getObjectId(), new int[] { 0, 0, 0, 0 });
1957+
1958+ if (getInt("antiAfkTime") > 0)
1959+ {
1960+ player.setAntiAfk(getInt("antiAfkTime"));
1961+ tpm.scheduleGeneral(new AntiAfk(player), 30000);
1962+ }
1963+ }
1964+ break;
1965+
1966+ case END:
1967+ teleBackEveryone();
1968+ if (getBoolean("statTrackingEnabled"))
1969+ {
1970+ EventStats.getInstance().applyChanges();
1971+ EventStats.getInstance().tempTable.clear();
1972+ EventStats.getInstance().updateSQL(getCurrentEvent().getPlayerList(), getCurrentEvent().eventId);
1973+ }
1974+ getCurrentEvent().reset();
1975+ setCurrentEvent(0);
1976+ players.clear();
1977+ colors.clear();
1978+ positions.clear();
1979+ titles.clear();
1980+ announce("Event ended! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
1981+ setStatus(State.VOTING);
1982+ counter = getInt("betweenEventsTime") - 1;
1983+ tpm.scheduleGeneral(cdtask, 1);
1984+ break;
1985+ }
1986+ }
1987+ }
1988+
1989+ private static class SingletonHolder
1990+ {
1991+ protected static final EventManager _instance = new EventManager();
1992+ }
1993+
1994+ public static EventManager getInstance()
1995+ {
1996+ return SingletonHolder._instance;
1997+ }
1998+
1999+ public EventManager()
2000+ {
2001+ config = EventConfig.getInstance();
2002+
2003+ events = new FastMap<>();
2004+ disabled = new FastMap<>();
2005+ players = new FastList<>();
2006+ afkers = new FastMap<>();
2007+ votes = new FastMap<>();
2008+ titles = new FastMap<>();
2009+ colors = new FastMap<>();
2010+ positions = new FastMap<>();
2011+ eventIds = new FastList<>();
2012+ status = State.VOTING;
2013+ tpm = ThreadPoolManager.getInstance();
2014+ task = new Scheduler();
2015+ cdtask = new Countdown();
2016+ counter = 0;
2017+
2018+ FastList<Integer> disabledEvents = getRestriction("disabledEvents");
2019+
2020+ // Add the events to the list
2021+ if (!disabledEvents.contains(1))
2022+ events.put(1, new DM());
2023+ else
2024+ disabled.put(1, new DM());
2025+
2026+ if (!disabledEvents.contains(2))
2027+ events.put(2, new TvT());
2028+ else
2029+ disabled.put(2, new TvT());
2030+
2031+ if (!disabledEvents.contains(3))
2032+ events.put(3, new CTF());
2033+ else
2034+ disabled.put(3, new CTF());
2035+
2036+ for (int eventId : events.keySet())
2037+ eventIds.add(eventId);
2038+
2039+ // Start the scheduler
2040+ counter = getInt("firstAfterStartTime") - 1;
2041+ tpm.scheduleGeneral(cdtask, 1);
2042+
2043+ setZombiesEvent();
2044+
2045+ System.out.println("Event Engine Started");
2046+ }
2047+
2048+ public boolean addVote(L2PcInstance player, int eventId)
2049+ {
2050+ if (getStatus() != State.VOTING)
2051+ {
2052+ player.sendMessage("You can't vote now!");
2053+ return false;
2054+ }
2055+ if (votes.containsKey(player))
2056+ {
2057+ player.sendMessage("You have already voted for an event!");
2058+ return false;
2059+ }
2060+ if (player.getLevel() < 40)
2061+ {
2062+ player.sendMessage("Your level is too low to vote for events!");
2063+ return false;
2064+ }
2065+
2066+ player.sendMessage("You have succesfully voted for the event");
2067+ votes.put(player, eventId);
2068+ return true;
2069+ }
2070+
2071+ protected static void announce(String text)
2072+ {
2073+ Broadcast.toAllOnlinePlayers(new CreatureSay(0, 18, "", "[Event] " + text));
2074+ }
2075+
2076+ private boolean canRegister(L2PcInstance player)
2077+ {
2078+ if (players.contains(player))
2079+ {
2080+ player.sendMessage("You are already registered to the event!");
2081+ return false;
2082+ }
2083+ if (player.isInJail())
2084+ {
2085+ player.sendMessage("You can't register from the jail.");
2086+ return false;
2087+ }
2088+ if (player.isInOlympiadMode())
2089+ {
2090+ player.sendMessage("You can't register while you are in the olympiad.");
2091+ return false;
2092+ }
2093+ if (player.getLevel() > getCurrentEvent().getInt("maxLvl"))
2094+ {
2095+ player.sendMessage("You are greater than the maximum allowed lvl.");
2096+ return false;
2097+ }
2098+ if (player.getLevel() < getCurrentEvent().getInt("minLvl"))
2099+ {
2100+ player.sendMessage("You are lower than the minimum allowed lvl.");
2101+ return false;
2102+ }
2103+ if (player.getKarma() > 0)
2104+ {
2105+ player.sendMessage("You can't register if you have karma.");
2106+ return false;
2107+ }
2108+ if (player.isCursedWeaponEquipped())
2109+ {
2110+ player.sendMessage("You can't register with a cursed weapon.");
2111+ return false;
2112+ }
2113+ if (player.isDead())
2114+ {
2115+ player.sendMessage("You can't register while you are dead.");
2116+ return false;
2117+ }
2118+ if (afkers.containsKey(player.getAccountName()) && afkers.get(player.getAccountName()) == getInt("antiAfkDisallowAfter"))
2119+ {
2120+ player.sendMessage("You can't register because you were AFK inside events.");
2121+ return false;
2122+ }
2123+ if (!getBoolean("dualboxAllowed"))
2124+ {
2125+ String ip = player.getClient().getConnection().getInetAddress().getHostAddress();
2126+ for (L2PcInstance p : players)
2127+ {
2128+ if (p.getClient().getConnection().getInetAddress().getHostAddress().equalsIgnoreCase(ip))
2129+ {
2130+ player.sendMessage("You have already joined the event with another character.");
2131+ return false;
2132+ }
2133+ }
2134+ }
2135+
2136+ return true;
2137+ }
2138+
2139+ public boolean canTargetPlayer(L2PcInstance target, L2PcInstance self)
2140+ {
2141+ if (getStatus() == State.RUNNING)
2142+ {
2143+ if ((isRegistered(target) && isRegistered(self)) || (!isRegistered(target) && !isRegistered(self)))
2144+ return true;
2145+
2146+ return false;
2147+ }
2148+
2149+ return true;
2150+ }
2151+
2152+ protected void end(String text)
2153+ {
2154+ announce(text);
2155+ status = State.END;
2156+ schedule(1);
2157+ }
2158+
2159+ public boolean getBoolean(String propName)
2160+ {
2161+ return config.getBoolean(0, propName);
2162+ }
2163+
2164+ public Event getCurrentEvent()
2165+ {
2166+ return current;
2167+ }
2168+
2169+ public FastList<String> getEventNames()
2170+ {
2171+ FastList<String> map = new FastList<>();
2172+ for (Event event : events.values())
2173+ map.add(event.getString("eventName"));
2174+
2175+ return map;
2176+ }
2177+
2178+ public FastMap<Integer, String> getEventMap()
2179+ {
2180+ FastMap<Integer, String> map = new FastMap<>();
2181+ for (Event event : disabled.values())
2182+ map.put(event.getInt("ids"), event.getString("eventName"));
2183+ for (Event event : events.values())
2184+ map.put(event.getInt("ids"), event.getString("eventName"));
2185+
2186+ return map;
2187+ }
2188+
2189+ public Event getEvent(int id)
2190+ {
2191+ for (Event event : events.values())
2192+ {
2193+ if (event.getInt("ids") == id)
2194+ return event;
2195+ }
2196+ for (Event event : disabled.values())
2197+ {
2198+ if (event.getInt("ids") == id)
2199+ return event;
2200+ }
2201+
2202+ return null;
2203+ }
2204+
2205+ public void enableEvent(int id, int enable)
2206+ {
2207+ if (enable == 1)
2208+ {
2209+ if (disabled.containsKey(id))
2210+ events.put(id, disabled.remove(id));
2211+ }
2212+ else
2213+ {
2214+ if (events.containsKey(id))
2215+ disabled.put(id, events.remove(id));
2216+ }
2217+ }
2218+
2219+ public boolean isEnabled(int id)
2220+ {
2221+ if (events.containsKey(id))
2222+ return true;
2223+
2224+ return false;
2225+ }
2226+
2227+ public int getInt(String propName)
2228+ {
2229+ return config.getInt(0, propName);
2230+ }
2231+
2232+ protected int[] getPosition(String owner, int num)
2233+ {
2234+ return config.getPosition(0, owner, num);
2235+ }
2236+
2237+ public FastList<Integer> getRestriction(String type)
2238+ {
2239+ return config.getRestriction(0, type);
2240+ }
2241+
2242+ public int getInt(int eventId, String propName)
2243+ {
2244+ return config.getInt(eventId, propName);
2245+ }
2246+
2247+ public boolean getBoolean(int eventId, String propName)
2248+ {
2249+ return config.getBoolean(eventId, propName);
2250+ }
2251+
2252+ public String getString(int eventId, String propName)
2253+ {
2254+ return config.getString(eventId, propName);
2255+ }
2256+
2257+ private State getStatus()
2258+ {
2259+ return status;
2260+ }
2261+
2262+ public String getString(String propName)
2263+ {
2264+ return config.getString(0, propName);
2265+ }
2266+
2267+ private int getVoteCount(int event)
2268+ {
2269+ int count = 0;
2270+ for (int e : votes.values())
2271+ if (e == event)
2272+ count++;
2273+
2274+ return count;
2275+ }
2276+
2277+ protected int getVoteWinner()
2278+ {
2279+ int old = 0;
2280+ FastMap<Integer, Integer> temp = new FastMap<>();
2281+
2282+ for (int vote : votes.values())
2283+ {
2284+ if (!temp.containsKey(vote))
2285+ temp.put(vote, 1);
2286+ else
2287+ {
2288+ old = temp.get(vote);
2289+ old++;
2290+ temp.getEntry(vote).setValue(old);
2291+ }
2292+ }
2293+
2294+ int max = temp.head().getNext().getValue();
2295+ int result = temp.head().getNext().getKey();
2296+
2297+ for (Map.Entry<Integer, Integer> entry : temp.entrySet())
2298+ {
2299+ if (entry.getValue() > max)
2300+ {
2301+ max = entry.getValue();
2302+ result = entry.getKey();
2303+ }
2304+ }
2305+
2306+ votes.clear();
2307+ temp = null;
2308+ return result;
2309+ }
2310+
2311+ public boolean isRegistered(L2PcInstance player)
2312+ {
2313+ if (getCurrentEvent() != null)
2314+ return getCurrentEvent().players.containsKey(player);
2315+
2316+ return false;
2317+ }
2318+
2319+ public boolean isRegistered(L2Character player)
2320+ {
2321+ if (getCurrentEvent() != null)
2322+ return getCurrentEvent().players.containsKey(player);
2323+
2324+ return false;
2325+ }
2326+
2327+ public boolean isRunning()
2328+ {
2329+ if (getStatus() == State.RUNNING)
2330+ return true;
2331+
2332+ return false;
2333+ }
2334+
2335+ protected void msgToAll(String text)
2336+ {
2337+ for (L2PcInstance player : players)
2338+ player.sendMessage(text);
2339+ }
2340+
2341+ public void onLogout(L2PcInstance player)
2342+ {
2343+ if (votes.containsKey(player))
2344+ votes.remove(player);
2345+ if (players.contains(player))
2346+ {
2347+ players.remove(player);
2348+ colors.remove(player);
2349+ titles.remove(player);
2350+ positions.remove(player);
2351+ }
2352+ }
2353+
2354+ public boolean registerPlayer(L2PcInstance player)
2355+ {
2356+ if (getStatus() != State.REGISTERING)
2357+ {
2358+ player.sendMessage("You can't register now!");
2359+ return false;
2360+ }
2361+ if (getBoolean("eventBufferEnabled"))
2362+ {
2363+ if (!EventBuffer.getInstance().playerHaveTemplate(player))
2364+ {
2365+ player.sendMessage("You have to set a buff template first!");
2366+ EventBuffer.getInstance().showHtml(player);
2367+ return false;
2368+ }
2369+ }
2370+ if (canRegister(player))
2371+ {
2372+ player.sendMessage("You have succesfully registered to the event!");
2373+ players.add(player);
2374+ titles.put(player, player.getTitle());
2375+ colors.put(player, player.getAppearance().getNameColor());
2376+ positions.put(player, new int[] { player.getX(), player.getY(), player.getZ() });
2377+ return true;
2378+ }
2379+
2380+ player.sendMessage("You have failed registering to the event!");
2381+ return false;
2382+ }
2383+
2384+ protected void schedule(int time)
2385+ {
2386+ tpm.scheduleGeneral(task, time);
2387+ }
2388+
2389+ protected void setCurrentEvent(int eventId)
2390+ {
2391+ current = eventId == 0 ? null : events.get(eventId);
2392+ }
2393+
2394+ protected void setStatus(State s)
2395+ {
2396+ status = s;
2397+ }
2398+
2399+ public void showFirstHtml(L2PcInstance player, int obj)
2400+ {
2401+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
2402+ TextBuilder sb = new TextBuilder();
2403+ int count = 0;
2404+
2405+ sb.append("<html><body><center><table width=270><tr><td width=145>Event Engine</td><td width=75>" + (getBoolean("eventBufferEnabled") ? "<a action=\"bypass -h eventbuffershow\">Buffer</a>" : "") + "</td><td width=50><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table></center><br>");
2406+
2407+ if (getStatus() == State.VOTING)
2408+ {
2409+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=90>Events</td><td width=140><center>Time left: " + cdtask.getTime() + "</center></td><td width=40><center>Votes</center></td></tr></table></center><br>");
2410+
2411+ for (Map.Entry<Integer, Event> event : events.entrySet())
2412+ {
2413+ count++;
2414+ sb.append("<center><table width=270 " + (count % 2 == 1 ? "" : "bgcolor=5A5A5A") + "><tr><td width=180>" + event.getValue().getString("eventName") + "</td><td width=30><a action=\"bypass -h eventinfo " + event.getKey() + "\">Info</a></td><td width=30><center>" + getVoteCount(event.getKey()) + "</td></tr></table></center>");
2415+ }
2416+
2417+ sb.append("</body></html>");
2418+ html.setHtml(sb.toString());
2419+ player.sendPacket(html);
2420+ }
2421+ else if (getStatus() == State.REGISTERING)
2422+ {
2423+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>");
2424+
2425+ if (players.contains(player))
2426+ sb.append("<a action=\"bypass -h npc_" + obj + "_unreg\">Unregister</a>");
2427+ else
2428+ sb.append("<a action=\"bypass -h npc_" + obj + "_reg\">Register</a>");
2429+
2430+ sb.append("</td><td width=130><center><a action=\"bypass -h eventinfo " + getCurrentEvent().getInt("ids") + "\">" + getCurrentEvent().getString("eventName") + "</a></td><td width=70>Time: " + cdtask.getTime() + "</td></tr></table><br>");
2431+
2432+ for (L2PcInstance p : EventManager.getInstance().players)
2433+ {
2434+ count++;
2435+ sb.append("<center><table width=270 " + (count % 2 == 1 ? "" : "bgcolor=5A5A5A") + "><tr><td width=120>" + p.getName() + "</td><td width=40>lvl " + p.getLevel() + "</td><td width=110>" + p.getTemplate().className + "</td></tr></table>");
2436+ }
2437+
2438+ sb.append("</body></html>");
2439+ html.setHtml(sb.toString());
2440+ player.sendPacket(html);
2441+ }
2442+ else if (getStatus() == State.RUNNING)
2443+ getCurrentEvent().showHtml(player, obj);
2444+ }
2445+
2446+ protected void teleBackEveryone()
2447+ {
2448+ for (L2PcInstance player : getCurrentEvent().getPlayerList())
2449+ {
2450+ if (player.getPoly().isMorphed())
2451+ {
2452+ player.getPoly().setPolyInfo(null, "1");
2453+ player.decayMe();
2454+ player.spawnMe(player.getX(),player.getY(),player.getZ());
2455+ }
2456+
2457+ if (player.isDead())
2458+ player.doRevive();
2459+
2460+ player.teleToLocation(positions.get(player)[0], positions.get(player)[1], positions.get(player)[2], 0);
2461+ player.getAppearance().setNameColor(colors.get(player));
2462+ player.setTitle(titles.get(player));
2463+
2464+ if (player.getParty() != null)
2465+ player.leaveParty();
2466+
2467+ player.broadcastUserInfo();
2468+ }
2469+ }
2470+
2471+ public boolean unregisterPlayer(L2PcInstance player)
2472+ {
2473+ if (!players.contains(player))
2474+ {
2475+ player.sendMessage("You are not registered to the event!");
2476+ return false;
2477+ }
2478+ else if (getStatus() != State.REGISTERING)
2479+ {
2480+ player.sendMessage("You can't unregister now!");
2481+ return false;
2482+ }
2483+
2484+ player.sendMessage("You have succesfully unregistered from the event!");
2485+ players.remove(player);
2486+ colors.remove(player);
2487+ positions.remove(player);
2488+ return true;
2489+ }
2490+
2491+ public boolean areTeammates(L2PcInstance player, L2PcInstance target)
2492+ {
2493+ if (getCurrentEvent() == null)
2494+ return false;
2495+
2496+ if (getCurrentEvent().numberOfTeams() < 2)
2497+ return false;
2498+
2499+ if (getCurrentEvent().getTeam(player) == getCurrentEvent().getTeam(target))
2500+ return true;
2501+
2502+ return false;
2503+ }
2504+
2505+ public void manualStart(int eventId)
2506+ {
2507+ setCurrentEvent(eventId);
2508+ announce("The next event will be: " + getCurrentEvent().getString("eventName"));
2509+ announce("Registering phase started! You have " + getInt("registerTime") / 60 + " minutes to register!");
2510+ announce("To register use .register or visit the event manager.");
2511+ setStatus(State.REGISTERING);
2512+ counter = getInt("registerTime") - 1;
2513+ }
2514+
2515+ public void manualStop()
2516+ {
2517+ announce("The event has been aborted by a GM.");
2518+ if (getStatus() == State.REGISTERING)
2519+ {
2520+ getCurrentEvent().reset();
2521+ setCurrentEvent(0);
2522+ players.clear();
2523+ colors.clear();
2524+ positions.clear();
2525+ titles.clear();
2526+ setStatus(State.VOTING);
2527+ counter = getInt("betweenEventsTime") - 1;
2528+ }
2529+ else
2530+ getCurrentEvent().endEvent();
2531+ }
2532+
2533+ public boolean isSpecialEvent()
2534+ {
2535+ return getCurrentEvent() != null && (getCurrentEvent() instanceof LMS || getCurrentEvent() instanceof DM);
2536+ }
2537+
2538+ public static void setZombiesEvent()
2539+ {
2540+ for (int i = 0;i < 3;i++)
2541+ {
2542+ L2FenceInstance fence = new L2FenceInstance(IdFactory.getInstance().getNextId(), 2, 500, 0, 57227, -29805);
2543+ fence.spawnMe(57227, -29805, 574);
2544+ FenceTable.addFence(fence);
2545+ }
2546+ for (int i = 0;i < 3;i++)
2547+ {
2548+ L2FenceInstance fence = new L2FenceInstance(IdFactory.getInstance().getNextId(), 2, 0, 500, 57399, -29611);
2549+ fence.spawnMe(57399, -29611, 574);
2550+ FenceTable.addFence(fence);
2551+ }
2552+ for (int i = 0;i < 3;i++)
2553+ {
2554+ L2FenceInstance fence = new L2FenceInstance(IdFactory.getInstance().getNextId(), 2, 400, 0, 58591, -29566);
2555+ fence.spawnMe(58591, -29566, 574);
2556+ FenceTable.addFence(fence);
2557+ }
2558+ for (int i = 0;i < 3;i++)
2559+ {
2560+ L2FenceInstance fence = new L2FenceInstance(IdFactory.getInstance().getNextId(), 2, 0, 400, 58720, -29789);
2561+ fence.spawnMe(58720, -29789, 574);
2562+ FenceTable.addFence(fence);
2563+ }
2564+ DoorTable.getInstance().getDoor(21170006).openMe();
2565+ DoorTable.getInstance().getDoor(21170005).openMe();
2566+ DoorTable.getInstance().getDoor(21170004).openMe();
2567+ DoorTable.getInstance().getDoor(21170003).openMe();
2568+ }
2569+}
2570\ No newline at end of file
2571Index: java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java
2572===================================================================
2573--- java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java (revision 1)
2574+++ java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java (working copy)
2575@@ -14,7 +14,11 @@
2576 */
2577 package net.sf.l2j.gameserver.handler.chathandlers;
2578
2579+import java.util.StringTokenizer;
2580+
2581 import net.sf.l2j.gameserver.handler.IChatHandler;
2582+import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
2583+import net.sf.l2j.gameserver.handler.VoicedCommandHandler;
2584 import net.sf.l2j.gameserver.model.BlockList;
2585 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
2586 import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
2587@@ -37,15 +41,43 @@
2588 @Override
2589 public void handleChat(int type, L2PcInstance activeChar, String params, String text)
2590 {
2591- CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
2592+ boolean vcd_used = false;
2593+ if (text.startsWith("."))
2594+ {
2595+ StringTokenizer st = new StringTokenizer(text);
2596+ IVoicedCommandHandler vch;
2597+ String command = "";
2598
2599- for (L2PcInstance player : activeChar.getKnownList().getKnownTypeInRadius(L2PcInstance.class, 1250))
2600+ if (st.countTokens() > 1)
2601+ {
2602+ command = st.nextToken().substring(1);
2603+ params = text.substring(command.length() + 2);
2604+ vch = VoicedCommandHandler.getInstance().getHandler(command);
2605+ }
2606+ else
2607+ {
2608+ command = text.substring(1);
2609+ vch = VoicedCommandHandler.getInstance().getHandler(command);
2610+ }
2611+
2612+ if (vch != null)
2613+ {
2614+ vch.useVoicedCommand(command, activeChar, params);
2615+ vcd_used = true;
2616+ }
2617+ }
2618+ if (!vcd_used)
2619 {
2620- if (!BlockList.isBlocked(player, activeChar))
2621- player.sendPacket(cs);
2622- }
2623-
2624- activeChar.sendPacket(cs);
2625+ CreatureSay cs = new CreatureSay(activeChar.getObjectId(), type, activeChar.getName(), text);
2626+
2627+ for (L2PcInstance player : activeChar.getKnownList().getKnownTypeInRadius(L2PcInstance.class, 1250))
2628+ {
2629+ if (!BlockList.isBlocked(player, activeChar))
2630+ player.sendPacket(cs);
2631+ }
2632+
2633+ activeChar.sendPacket(cs);
2634+ }
2635 }
2636
2637 /**
2638Index: config/Events.xml
2639===================================================================
2640--- config/Events.xml (revision 0)
2641+++ config/Events.xml (revision 0)
2642@@ -0,0 +1,452 @@
2643+<?xml version="1.0" encoding="UTF-8"?>
2644+<events>
2645+ <!-- Core settings -->
2646+ <event id="0">
2647+ <property name="registerTime" value="300" />
2648+ <property name="betweenEventsTime" value="7200" />
2649+ <property name="firstAfterStartTime" value="1800" />
2650+ <property name="managerNpcId" value="50001" />
2651+ <property name="showVotePopupAt" value="600" />
2652+ <property name="votePopupEnabled" value="true" />
2653+ <property name="debug" value="false" />
2654+ <property name="statTrackingEnabled" value="true" />
2655+ <property name="eventBufferEnabled" value="false" />
2656+ <property name="allowedBuffsList" value="264,266,267,268,269,270,271,272,273,274,275,276,277,304,305,306,307,308,309,310,349,363,364,365,1035,1036,1040,1043,1045,1048,1059,1062,1068,1077,1078,1085,1086,1087,1182,1189,1191,1204,1240,1242,1243,1259,1268,1284,1303,1304,1352,1353,1354,1355,1356,1357,1363,1388,1389,1392,1393,1397,1413,265,1044" />
2657+ <property name="maxBuffNum" value="24" />
2658+ <property name="dualboxAllowed" value="true" />
2659+ <property name="antiAfkTime" value="60" /> <!-- 0 to disable -->
2660+ <property name="antiAfkDisallowAfter" value="3" />
2661+ <property name="antiAfkDisallowTime" value="43200" />
2662+ <property name="siteUrl" value="acis.i-live.eu" />
2663+ <restriction type="disabledEvents" ids="" />
2664+ <restriction type="item" ids="6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621" />
2665+ <restriction type="skill" ids="1374,1375,1376,395,396" />
2666+ </event>
2667+ <!-- DeathMatch -->
2668+ <event id="1">
2669+ <property name="minLvl" value="76" />
2670+ <property name="maxLvl" value="80" />
2671+ <property name="eventName" value="Deathmatch" />
2672+ <property name="ids" value="1" />
2673+ <property name="matchTime" value="300" />
2674+ <property name="rewardId" value="6392" />
2675+ <property name="rewardAmmount" value="2" />
2676+ <property name="allowPotions" value="false" />
2677+ <property name="allowUseMagic" value="true" />
2678+ <property name="removeBuffs" value="false" />
2679+ <property name="minPlayers" value="8" />
2680+ <color owner="All" r="255" g="255" b="255"/>
2681+ <position owner="All" x="106037" y="114816" z="-1560" radius="700" />
2682+ <restriction type="item" ids="" />
2683+ <restriction type="skill" ids="" />
2684+ </event>
2685+
2686+ <!-- Team vs Team -->
2687+ <event id="2">
2688+ <property name="minLvl" value="76" />
2689+ <property name="maxLvl" value="80" />
2690+ <property name="eventName" value="Team vs Team" />
2691+ <property name="ids" value="2" />
2692+ <property name="matchTime" value="300" />
2693+ <property name="rewardId" value="6392" />
2694+ <property name="rewardAmmount" value="2" />
2695+ <property name="allowPotions" value="false" />
2696+ <property name="allowUseMagic" value="true" />
2697+ <property name="removeBuffs" value="false" />
2698+ <property name="minPlayers" value="8" />
2699+ <color owner="Blue" r="0" g="0" b="255"/>
2700+ <color owner="Red" r="255" g="0" b="0"/>
2701+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2702+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2703+ <restriction type="item" ids="" />
2704+ <restriction type="skill" ids="" />
2705+ </event>
2706+
2707+ <!-- Capture the Flag -->
2708+ <event id="3">
2709+ <property name="minLvl" value="76" />
2710+ <property name="maxLvl" value="80" />
2711+ <property name="eventName" value="Capture the Flag" />
2712+ <property name="ids" value="3" />
2713+ <property name="matchTime" value="300" />
2714+ <property name="rewardId" value="6392" />
2715+ <property name="rewardAmmount" value="2" />
2716+ <property name="allowPotions" value="false" />
2717+ <property name="allowUseMagic" value="true" />
2718+ <property name="removeBuffs" value="false" />
2719+ <property name="minPlayers" value="8" />
2720+ <property name="blueFlagId" value="9104" />
2721+ <property name="redFlagId" value="9105" />
2722+ <property name="blueFlagHolderId" value="9106" />
2723+ <property name="redFlagHolderId" value="9107" />
2724+ <color owner="Blue" r="0" g="0" b="255"/>
2725+ <color owner="Red" r="255" g="0" b="0"/>
2726+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2727+ <position owner="BlueFlag" x="106391" y="116331" z="-1587" radius="0" />
2728+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2729+ <position owner="RedFlag" x="105696" y="113522" z="-1587" radius="0" />
2730+ <restriction type="item" ids="" />
2731+ <restriction type="skill" ids="" />
2732+ </event>
2733+</events>
2734\ No newline at end of file
2735Index: java/net/sf/l2j/gameserver/handler/usercommandhandlers/Escape.java
2736===================================================================
2737--- java/net/sf/l2j/gameserver/handler/usercommandhandlers/Escape.java (revision 6)
2738+++ java/net/sf/l2j/gameserver/handler/usercommandhandlers/Escape.java (working copy)
2739@@ -15,6 +15,7 @@
2740 package net.sf.l2j.gameserver.handler.usercommandhandlers;
2741
2742 import net.sf.l2j.gameserver.datatables.SkillTable;
2743+import net.sf.l2j.gameserver.event.EventManager;
2744 import net.sf.l2j.gameserver.handler.IUserCommandHandler;
2745 import net.sf.l2j.gameserver.instancemanager.GrandBossManager;
2746 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
2747@@ -31,7 +32,7 @@
2748 @Override
2749 public boolean useUserCommand(int id, L2PcInstance activeChar)
2750 {
2751- if (activeChar.isCastingNow() || activeChar.isSitting() || activeChar.isMovementDisabled() || activeChar.isOutOfControl() || activeChar.isInOlympiadMode() || activeChar.inObserverMode() || activeChar.isFestivalParticipant() || activeChar.isInJail() || (GrandBossManager.getInstance().getZone(activeChar) != null && !activeChar.isGM()))
2752+ if (EventManager.getInstance().isRegistered(activeChar) || activeChar.isCastingNow() || activeChar.isSitting() || activeChar.isMovementDisabled() || activeChar.isOutOfControl() || activeChar.isInOlympiadMode() || activeChar.inObserverMode() || activeChar.isFestivalParticipant() || activeChar.isInJail() || (GrandBossManager.getInstance().getZone(activeChar) != null && !activeChar.isGM()))
2753 {
2754 activeChar.sendMessage("Your current state doesn't allow you to use the /unstuck command.");
2755 return false;
2756Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
2757===================================================================
2758--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 6)
2759+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy)
2760@@ -36,6 +36,7 @@
2761
2762 import net.sf.l2j.Config;
2763 import net.sf.l2j.L2DatabaseFactory;
2764+import net.sf.l2j.gameserver.Announcements;
2765 import net.sf.l2j.gameserver.GameTimeController;
2766 import net.sf.l2j.gameserver.GeoData;
2767 import net.sf.l2j.gameserver.ItemsAutoDestroy;
2768@@ -63,6 +64,7 @@
2769 import net.sf.l2j.gameserver.datatables.SkillTable;
2770 import net.sf.l2j.gameserver.datatables.SkillTable.FrequentSkill;
2771 import net.sf.l2j.gameserver.datatables.SkillTreeTable;
2772+import net.sf.l2j.gameserver.event.EventManager;
2773 import net.sf.l2j.gameserver.handler.IItemHandler;
2774 import net.sf.l2j.gameserver.handler.ItemHandler;
2775 import net.sf.l2j.gameserver.instancemanager.CastleManager;
2776@@ -572,6 +574,8 @@
2777 // WorldPosition used by TARGET_SIGNET_GROUND
2778 private Point3D _currentSkillWorldPosition;
2779
2780+ private int antiAfkTime;
2781+
2782 private L2AccessLevel _accessLevel;
2783
2784 private boolean _messageRefusal = false; // message refusal mode
2785@@ -3329,6 +3333,12 @@
2786 @Override
2787 public void onAction(L2PcInstance player)
2788 {
2789+ if (!EventManager.getInstance().canTargetPlayer(this, player))
2790+ {
2791+ player.sendPacket(ActionFailed.STATIC_PACKET);
2792+ return;
2793+ }
2794+
2795 // Check if the player already target this L2PcInstance
2796 if (player.getTarget() != this)
2797 {
2798@@ -4103,6 +4113,17 @@
2799 CursedWeaponsManager.getInstance().drop(_cursedWeaponEquippedId, killer);
2800 else
2801 {
2802+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this))
2803+ {
2804+ if (killer.isRaid() || killer.isRaidMinion())
2805+ EventManager.getInstance().getCurrentEvent().onDie(this, killer);
2806+ else if (pk != null && EventManager.getInstance().isRegistered(pk))
2807+ {
2808+ EventManager.getInstance().getCurrentEvent().onKill(this, pk);
2809+ EventManager.getInstance().getCurrentEvent().onDie(this, pk);
2810+ }
2811+ }
2812+
2813 if (pk == null || !pk.isCursedWeaponEquipped())
2814 {
2815 onDieDropItem(killer); // Check if any item should be dropped
2816@@ -4290,6 +4311,20 @@
2817 if (isInDuel() && targetPlayer.isInDuel())
2818 return;
2819
2820+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered(targetPlayer))
2821+ {
2822+ if (!(target instanceof L2Summon))
2823+ {
2824+ increasePvpKills();
2825+ SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_S2);
2826+ sm.addZoneName(getX(), getY(), getZ());
2827+ sm.addString("- " + getName() + " killed " + targetPlayer.getName() + ".");
2828+ Announcements.announceToAll(sm);
2829+ }
2830+
2831+ return;
2832+ }
2833+
2834 // If in Arena, do nothing
2835 if (isInsideZone(ZONE_PVP) || targetPlayer.isInsideZone(ZONE_PVP))
2836 return;
2837@@ -4419,6 +4454,9 @@
2838 if (isInsideZone(ZONE_PVP))
2839 return;
2840
2841+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
2842+ return;
2843+
2844 PvpFlagTaskManager.getInstance().addPvpFlagTask(this, System.currentTimeMillis() + Config.PVP_NORMAL_TIME);
2845
2846 if (getPvpFlag() == 0)
2847@@ -4431,6 +4469,9 @@
2848 if (player == null)
2849 return;
2850
2851+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
2852+ return;
2853+
2854 if ((isInDuel() && player.getDuelId() == getDuelId()))
2855 return;
2856
2857@@ -4470,6 +4511,9 @@
2858 */
2859 public void deathPenalty(boolean atwar)
2860 {
2861+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
2862+ return;
2863+
2864 // Get the level of the L2PcInstance
2865 final int lvl = getLevel();
2866
2867@@ -4998,6 +5042,9 @@
2868 L2ItemInstance wpn = getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
2869 if (wpn != null)
2870 {
2871+ if (wpn.getItemId() == 9999)
2872+ return false;
2873+
2874 L2ItemInstance[] unequipped = getInventory().unEquipItemInBodySlotAndRecord(wpn.getItem().getBodyPart());
2875 InventoryUpdate iu = new InventoryUpdate();
2876 for (L2ItemInstance itm : unequipped)
2877@@ -5024,6 +5071,9 @@
2878 L2ItemInstance sld = getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
2879 if (sld != null)
2880 {
2881+ if (sld.getItemId() == 17 && EventManager.getInstance().isRegistered(this))
2882+ return false;
2883+
2884 L2ItemInstance[] unequipped = getInventory().unEquipItemInBodySlotAndRecord(sld.getItem().getBodyPart());
2885 InventoryUpdate iu = new InventoryUpdate();
2886 for (L2ItemInstance itm : unequipped)
2887@@ -6875,6 +6925,9 @@
2888 if (isInsideZone(ZONE_PVP) && cha.isInsideZone(ZONE_PVP))
2889 return true;
2890
2891+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered(attacker))
2892+ return true;
2893+
2894 if (getClan() != null)
2895 {
2896 Siege siege = SiegeManager.getSiege(getX(), getY(), getZ());
2897@@ -6928,6 +6981,20 @@
2898 @Override
2899 public boolean useMagic(L2Skill skill, boolean forceUse, boolean dontMove)
2900 {
2901+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this))
2902+ {
2903+ if (!EventManager.getInstance().getCurrentEvent().getBoolean("allowUseMagic"))
2904+ {
2905+ sendPacket(ActionFailed.STATIC_PACKET);
2906+ return false;
2907+ }
2908+
2909+ if (!EventManager.getInstance().getCurrentEvent().onUseMagic(skill))
2910+ {
2911+ sendPacket(ActionFailed.STATIC_PACKET);
2912+ return false;
2913+ }
2914+ }
2915 // Cancels the use of skills when player uses a cursed weapon or is flying.
2916 if ((isCursedWeaponEquipped() && !skill.isDemonicSkill()) // If CW, allow ONLY demonic skills.
2917 || (getMountType() == 1 && !skill.isStriderSkill()) // If mounted, allow ONLY Strider skills.
2918@@ -7506,6 +7573,9 @@
2919
2920 if (skill.isPvpSkill()) // pvp skill
2921 {
2922+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance) target))
2923+ return true;
2924+
2925 // in clan war player can attack whites even with sleep etc.
2926 if (getClan() != null && ((L2PcInstance) target).getClan() != null)
2927 {
2928@@ -7519,6 +7589,9 @@
2929 }
2930 else if ((skilldat != null && !skilldat.isCtrlPressed() && skill.isOffensive() && !srcIsSummon) || (skilldatpet != null && !skilldatpet.isCtrlPressed() && skill.isOffensive() && srcIsSummon))
2931 {
2932+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance) target))
2933+ return true;
2934+
2935 // in clan war player can attack whites even with sleep etc.
2936 if (getClan() != null && ((L2PcInstance) target).getClan() != null)
2937 {
2938@@ -8555,6 +8628,9 @@
2939 if (!_subclassLock.tryLock())
2940 return false;
2941
2942+ if (EventManager.getInstance().players.contains(this))
2943+ return false;
2944+
2945 try
2946 {
2947 int oldClassId = getSubClasses().get(classIndex).getClassId();
2948@@ -9340,6 +9416,10 @@
2949 @Override
2950 public void deleteMe()
2951 {
2952+ EventManager.getInstance().onLogout(this);
2953+ if (EventManager.getInstance().isRegistered(this))
2954+ EventManager.getInstance().getCurrentEvent().onLogout(this);
2955+
2956 cleanup();
2957 store();
2958 super.deleteMe();
2959@@ -10161,6 +10241,16 @@
2960 return _punishTimer;
2961 }
2962
2963+ public int getAntiAfk()
2964+ {
2965+ return antiAfkTime;
2966+ }
2967+
2968+ public void setAntiAfk(int antiAfk)
2969+ {
2970+ antiAfkTime = antiAfk;
2971+ }
2972+
2973 public void setPunishTimer(long time)
2974 {
2975 _punishTimer = time;
2976@@ -10275,6 +10365,9 @@
2977 if (getDeathPenaltyBuffLevel() >= 15) // maximum level reached
2978 return;
2979
2980+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
2981+ return;
2982+
2983 if (getDeathPenaltyBuffLevel() != 0)
2984 {
2985 L2Skill skill = SkillTable.getInstance().getInfo(5076, getDeathPenaltyBuffLevel());
2986@@ -10739,7 +10832,7 @@
2987 if (summonerChar == null)
2988 return false;
2989
2990- if (summonerChar.isInOlympiadMode() || summonerChar.inObserverMode() || summonerChar.isInsideZone(L2Character.ZONE_NOSUMMONFRIEND) || summonerChar.isMounted())
2991+ if (summonerChar.isInOlympiadMode() || summonerChar.inObserverMode() || summonerChar.isInsideZone(L2Character.ZONE_NOSUMMONFRIEND) || summonerChar.isMounted() || EventManager.getInstance().isRegistered(summonerChar))
2992 return false;
2993
2994 return true;
2995@@ -10788,6 +10881,12 @@
2996 return false;
2997 }
2998
2999+ if (EventManager.getInstance().isRegistered(targetChar))
3000+ {
3001+ summonerChar.sendMessage("Your cannot summon a player that is in event.");
3002+ return false;
3003+ }
3004+
3005 return true;
3006 }
3007
3008Index: java/net/sf/l2j/gameserver/event/EventConfig.java
3009===================================================================
3010--- java/net/sf/l2j/gameserver/event/EventConfig.java (revision 0)
3011+++ java/net/sf/l2j/gameserver/event/EventConfig.java (revision 0)
3012@@ -0,0 +1,251 @@
3013+package net.sf.l2j.gameserver.event;
3014+
3015+import java.io.File;
3016+import java.util.StringTokenizer;
3017+import java.util.logging.Logger;
3018+
3019+import javax.xml.parsers.DocumentBuilder;
3020+import javax.xml.parsers.DocumentBuilderFactory;
3021+
3022+import javolution.util.FastList;
3023+import javolution.util.FastMap;
3024+
3025+import org.w3c.dom.Document;
3026+import org.w3c.dom.NamedNodeMap;
3027+import org.w3c.dom.Node;
3028+
3029+import net.sf.l2j.util.Rnd;
3030+
3031+public class EventConfig
3032+{
3033+ private Logger _log = Logger.getLogger(EventConfig.class.getName());
3034+ public FastMap<Integer, FastMap<String, String>> config;
3035+ public FastMap<Integer, FastMap<String, FastMap<Integer, int[]>>> positions;
3036+ public FastMap<Integer, FastMap<String, int[]>> colors;
3037+ public FastMap<Integer, FastMap<String, FastList<Integer>>> restrictions;
3038+
3039+ private static class SingletonHolder
3040+ {
3041+ protected static final EventConfig _instance = new EventConfig();
3042+ }
3043+
3044+ public static EventConfig getInstance()
3045+ {
3046+ return SingletonHolder._instance;
3047+ }
3048+
3049+ public EventConfig()
3050+ {
3051+ config = new FastMap<>();
3052+ positions = new FastMap<>();
3053+ colors = new FastMap<>();
3054+ restrictions = new FastMap<>();
3055+ loadConfigs();
3056+ }
3057+
3058+ private void addColor(int id, String owner, int[] color)
3059+ {
3060+ if (!colors.containsKey(id))
3061+ colors.put(id, new FastMap<String, int[]>());
3062+
3063+ colors.get(id).put(owner, color);
3064+ }
3065+
3066+ private void addPosition(int id, String owner, int x, int y, int z, int radius)
3067+ {
3068+ if (!positions.containsKey(id))
3069+ positions.put(id, new FastMap<String, FastMap<Integer, int[]>>());
3070+ if (!positions.get(id).containsKey(owner))
3071+ positions.get(id).put(owner, new FastMap<Integer, int[]>());
3072+
3073+ positions.get(id).get(owner).put(positions.get(id).get(owner).size() + 1, new int[] { x, y, z, radius });
3074+ }
3075+
3076+ public void addProperty(int id, String propName, String value)
3077+ {
3078+ if (!config.containsKey(id))
3079+ config.put(id, new FastMap<String, String>());
3080+
3081+ config.get(id).put(propName, value);
3082+ }
3083+
3084+ private void addRestriction(int id, String type, String ids)
3085+ {
3086+ if (!restrictions.containsKey(id))
3087+ restrictions.put(id, new FastMap<String, FastList<Integer>>());
3088+
3089+ FastList<Integer> idlist = new FastList<>();
3090+ StringTokenizer st = new StringTokenizer(ids, ",");
3091+ while (st.hasMoreTokens())
3092+ idlist.add(Integer.parseInt(st.nextToken()));
3093+
3094+ restrictions.get(id).put(type, idlist);
3095+ }
3096+
3097+ public boolean getBoolean(int event, String propName)
3098+ {
3099+ if (!(config.containsKey(event)))
3100+ {
3101+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
3102+ return false;
3103+ }
3104+
3105+ if (config.get(event).containsKey(propName))
3106+ return Boolean.parseBoolean(config.get(event).get(propName));
3107+
3108+ _log.warning("Event: Try to get a non existing property: " + propName);
3109+ return false;
3110+ }
3111+
3112+ public int[] getColor(int event, String owner)
3113+ {
3114+ if (!(colors.containsKey(event)))
3115+ {
3116+ _log.warning("Event: Try to get a color of a non existing event: ID: " + event);
3117+ return new int[] { 255, 255, 255 };
3118+ }
3119+
3120+ if (colors.get(event).containsKey(owner))
3121+ return colors.get(event).get(owner);
3122+
3123+ _log.warning("Event: Try to get a non existing color: " + owner);
3124+ return new int[] { 255, 255, 255 };
3125+ }
3126+
3127+ public int getInt(int event, String propName)
3128+ {
3129+ if (!(config.containsKey(event)))
3130+ {
3131+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
3132+ return -1;
3133+ }
3134+
3135+ if (config.get(event).containsKey(propName))
3136+ return Integer.parseInt(config.get(event).get(propName));
3137+
3138+ _log.warning("Event: Try to get a non existing property: " + propName);
3139+ return -1;
3140+ }
3141+
3142+ public int[] getPosition(int event, String owner, int num)
3143+ {
3144+ if (!positions.containsKey(event))
3145+ {
3146+ _log.warning("Event: Try to get a position of a non existing event: ID: " + event);
3147+ return new int[] {};
3148+ }
3149+ if (!positions.get(event).containsKey(owner))
3150+ {
3151+ _log.warning("Event: Try to get a position of a non existing owner: " + owner);
3152+ return new int[] {};
3153+ }
3154+ if (!positions.get(event).get(owner).containsKey(num) && num != 0)
3155+ {
3156+ _log.warning("Event: Try to get a non existing position: " + num);
3157+ return new int[] {};
3158+ }
3159+
3160+ if (num == 0)
3161+ return positions.get(event).get(owner).get(Rnd.get(positions.get(event).get(owner).size()) + 1);
3162+ return positions.get(event).get(owner).get(num);
3163+ }
3164+
3165+ public FastList<Integer> getRestriction(int event, String type)
3166+ {
3167+ if (!(restrictions.containsKey(event)))
3168+ {
3169+ _log.warning("Event: Try to get a restriction of a non existing event: ID: " + event);
3170+ return null;
3171+ }
3172+ if (restrictions.get(event).containsKey(type))
3173+ return restrictions.get(event).get(type);
3174+
3175+ _log.warning("Event: Try to get a non existing restriction: " + type);
3176+ return null;
3177+ }
3178+
3179+ public String getString(int event, String propName)
3180+ {
3181+ if (!(config.containsKey(event)))
3182+ {
3183+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
3184+ return null;
3185+ }
3186+
3187+ if (config.get(event).containsKey(propName))
3188+ return config.get(event).get(propName);
3189+
3190+ _log.warning("Event: Try to get a non existing property: " + propName);
3191+ return null;
3192+ }
3193+
3194+ private void loadConfigs()
3195+ {
3196+ File configFile = new File("./config/Events.xml");
3197+ Document doc = null;
3198+ try
3199+ {
3200+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
3201+ dbf.setIgnoringComments(true);
3202+ dbf.setValidating(false);
3203+ DocumentBuilder db = dbf.newDocumentBuilder();
3204+ doc = db.parse(configFile);
3205+
3206+ for (Node root = doc.getFirstChild(); root != null; root = root.getNextSibling())
3207+ {
3208+ if ("events".equalsIgnoreCase(root.getNodeName()))
3209+ {
3210+ for (Node event = root.getFirstChild(); event != null; event = event.getNextSibling())
3211+ {
3212+ if ("event".equalsIgnoreCase(event.getNodeName()))
3213+ {
3214+ NamedNodeMap eventAttrs = event.getAttributes();
3215+ int eventId = Integer.parseInt(eventAttrs.getNamedItem("id").getNodeValue());
3216+
3217+ for (Node property = event.getFirstChild(); property != null; property = property.getNextSibling())
3218+ {
3219+ if ("property".equalsIgnoreCase(property.getNodeName()))
3220+ {
3221+ NamedNodeMap propAttrs = property.getAttributes();
3222+ String name = propAttrs.getNamedItem("name").getNodeValue();
3223+ String value = propAttrs.getNamedItem("value").getNodeValue();
3224+ addProperty(eventId, name, value);
3225+ }
3226+ else if ("position".equalsIgnoreCase(property.getNodeName()))
3227+ {
3228+ NamedNodeMap propAttrs = property.getAttributes();
3229+ String owner = propAttrs.getNamedItem("owner").getNodeValue();
3230+ String x = propAttrs.getNamedItem("x").getNodeValue();
3231+ String y = propAttrs.getNamedItem("y").getNodeValue();
3232+ String z = propAttrs.getNamedItem("z").getNodeValue();
3233+ String radius = propAttrs.getNamedItem("radius").getNodeValue();
3234+ addPosition(eventId, owner, Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z), Integer.parseInt(radius));
3235+ }
3236+ else if ("color".equalsIgnoreCase(property.getNodeName()))
3237+ {
3238+ NamedNodeMap propAttrs = property.getAttributes();
3239+ String owner = propAttrs.getNamedItem("owner").getNodeValue();
3240+ int r = Integer.parseInt(propAttrs.getNamedItem("r").getNodeValue());
3241+ int g = Integer.parseInt(propAttrs.getNamedItem("g").getNodeValue());
3242+ int b = Integer.parseInt(propAttrs.getNamedItem("b").getNodeValue());
3243+ addColor(eventId, owner, new int[] { r, g, b });
3244+ }
3245+ else if ("restriction".equalsIgnoreCase(property.getNodeName()))
3246+ {
3247+ NamedNodeMap propAttrs = property.getAttributes();
3248+ String type = propAttrs.getNamedItem("type").getNodeValue();
3249+ String ids = propAttrs.getNamedItem("ids").getNodeValue();
3250+ addRestriction(eventId, type, ids);
3251+ }
3252+ }
3253+ }
3254+ }
3255+ }
3256+ }
3257+ }
3258+ catch (Exception e)
3259+ {
3260+
3261+ }
3262+ }
3263+}
3264\ No newline at end of file
3265Index: java/net/sf/l2j/gameserver/event/DoubleDomination.java
3266===================================================================
3267--- java/net/sf/l2j/gameserver/event/DoubleDomination.java (revision 0)
3268+++ java/net/sf/l2j/gameserver/event/DoubleDomination.java (revision 0)
3269@@ -0,0 +1,269 @@
3270+/*
3271+ * This program is free software: you can redistribute it and/or modify it under
3272+ * the terms of the GNU General Public License as published by the Free Software
3273+ * Foundation, either version 3 of the License, or (at your option) any later
3274+ * version.
3275+ *
3276+ * This program is distributed in the hope that it will be useful, but WITHOUT
3277+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
3278+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
3279+ * details.
3280+ *
3281+ * You should have received a copy of the GNU General Public License along with
3282+ * this program. If not, see <http://www.gnu.org/licenses/>.
3283+ */
3284+package net.sf.l2j.gameserver.event;
3285+
3286+import javolution.text.TextBuilder;
3287+import javolution.util.FastMap;
3288+
3289+import net.sf.l2j.gameserver.datatables.SpawnTable;
3290+import net.sf.l2j.gameserver.model.L2Spawn;
3291+import net.sf.l2j.gameserver.model.actor.L2Character;
3292+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
3293+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
3294+
3295+public class DoubleDomination extends Event
3296+{
3297+ protected EventState eventState;
3298+ private Core task = new Core();
3299+ private FastMap<L2Spawn, Integer> zones = new FastMap<>();
3300+ private int time;
3301+ private int holder;
3302+ private enum EventState
3303+ {
3304+ START, FIGHT, END, INACTIVE
3305+ }
3306+
3307+ protected class Core implements Runnable
3308+ {
3309+ @Override
3310+ public void run()
3311+ {
3312+ try
3313+ {
3314+ switch (eventState)
3315+ {
3316+ case START:
3317+ divideIntoTeams(2);
3318+ preparePlayers();
3319+ teleportToTeamPos();
3320+ createPartyOfTeam(1);
3321+ createPartyOfTeam(2);
3322+ forceSitAll();
3323+ setStatus(EventState.FIGHT);
3324+ schedule(20000);
3325+ break;
3326+
3327+ case FIGHT:
3328+ forceStandAll();
3329+ sendMsg();
3330+ setStatus(EventState.END);
3331+ clock.startClock(getInt("matchTime"));
3332+ break;
3333+
3334+ case END:
3335+ clock.setTime(0);
3336+ if (winnerTeam == 0)
3337+ winnerTeam = getWinnerTeam();
3338+
3339+ unSpawnZones();
3340+ setStatus(EventState.INACTIVE);
3341+
3342+ if (winnerTeam == 0)
3343+ EventManager.getInstance().end("The event ended in a tie! both teams had " + teams.get(1).getScore() + " domination points!");
3344+ else
3345+ {
3346+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
3347+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " domination points!");
3348+ }
3349+ break;
3350+ }
3351+ }
3352+ catch (Throwable e)
3353+ {
3354+ e.printStackTrace();
3355+ EventManager.getInstance().end("Error! Event ended.");
3356+ }
3357+ }
3358+ }
3359+
3360+ public DoubleDomination()
3361+ {
3362+ super();
3363+ eventId = 3;
3364+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
3365+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
3366+ }
3367+
3368+ @Override
3369+ protected void clockTick()
3370+ {
3371+ int team1 = 0;
3372+ int team2 = 0;
3373+
3374+ for (L2Spawn zone : zones.keySet())
3375+ {
3376+ for (L2PcInstance player : getPlayerList())
3377+ {
3378+ switch (getTeam(player))
3379+ {
3380+ case 1:
3381+ if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn().getX(), zone.getLastSpawn().getY())) <= getInt("zoneRadius"))
3382+ team1++;
3383+ break;
3384+
3385+ case 2:
3386+ if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn().getX(), zone.getLastSpawn().getY())) <= getInt("zoneRadius"))
3387+ team2++;
3388+ break;
3389+ }
3390+ }
3391+
3392+ if (team1 > team2)
3393+ zones.getEntry(zone).setValue(1);
3394+
3395+ if (team2 > team1)
3396+ zones.getEntry(zone).setValue(2);
3397+
3398+ if (team1 == team2)
3399+ zones.getEntry(zone).setValue(0);
3400+
3401+ team1 = 0;
3402+ team2 = 0;
3403+ }
3404+
3405+ if (zones.containsValue(1) && (!zones.containsValue(0) && !zones.containsValue(2)))
3406+ {
3407+ if (holder != 1)
3408+ {
3409+ announce(getPlayerList(), "The " + teams.get(1).getName() + " team captured both zones. Score in 10sec!");
3410+ holder = 1;
3411+ time = 0;
3412+ }
3413+
3414+ if (time == getInt("timeToScore") - 1)
3415+ {
3416+ for (L2PcInstance player : getPlayersOfTeam(1))
3417+ increasePlayersScore(player);
3418+ teams.get(1).increaseScore();
3419+ teleportToTeamPos();
3420+ time = 0;
3421+ announce(getPlayerList(), "The " + teams.get(1).getName() + " team scored!");
3422+ holder = 0;
3423+ }
3424+ else
3425+ time++;
3426+ }
3427+ else if (zones.containsValue(2) && (!zones.containsValue(0) && !zones.containsValue(1)))
3428+ {
3429+ if (holder != 2)
3430+ {
3431+ announce(getPlayerList(), "The " + teams.get(2).getName() + " team captured both zones. Score in 10sec!");
3432+ holder = 1;
3433+ time = 0;
3434+ }
3435+
3436+ if (time == getInt("timeToScore") - 1)
3437+ {
3438+ for (L2PcInstance player : getPlayersOfTeam(2))
3439+ increasePlayersScore(player);
3440+ teams.get(2).increaseScore();
3441+ teleportToTeamPos();
3442+ time = 0;
3443+ announce(getPlayerList(), "The " + teams.get(2).getName() + " team scored!");
3444+ holder = 0;
3445+ }
3446+ else
3447+ time++;
3448+ }
3449+ else
3450+ {
3451+ if (holder != 0)
3452+ announce(getPlayerList(), "Canceled!");
3453+
3454+ holder = 0;
3455+ time = 0;
3456+ }
3457+ }
3458+
3459+ @Override
3460+ protected void endEvent()
3461+ {
3462+ setStatus(EventState.END);
3463+ clock.setTime(0);
3464+ }
3465+
3466+ @Override
3467+ public void onDie(L2PcInstance victim, L2Character killer)
3468+ {
3469+ super.onDie(victim, killer);
3470+ addToResurrector(victim);
3471+ }
3472+
3473+ @Override
3474+ protected void schedule(int time)
3475+ {
3476+ tpm.scheduleGeneral(task, time);
3477+ }
3478+
3479+ protected void setStatus(EventState s)
3480+ {
3481+ eventState = s;
3482+ }
3483+
3484+ @Override
3485+ protected void showHtml(L2PcInstance player, int obj)
3486+ {
3487+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
3488+ TextBuilder sb = new TextBuilder();
3489+ sb.append("<html><body><table width=270><tr><td width=200>Event Engine </td><td><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table><br><center><table width=270 bgcolor=5A5A5A><tr><td width=70>Running</td><td width=130><center>" + getString("eventName") + "</td><td width=70>Time: " + clock.getTime() + "</td></tr></table><table width=270><tr><td><center><font color=" + teams.get(1).getHexaColor() + ">" + teams.get(1).getScore() + "</font> - <font color=" + teams.get(2).getHexaColor() + ">" + teams.get(2).getScore() + "</font></td></tr></table><br><table width=270>");
3490+
3491+ int i = 0;
3492+ for (EventTeam team : teams.values())
3493+ {
3494+ i++;
3495+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
3496+ for (L2PcInstance p : getPlayersOfTeam(i))
3497+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
3498+ }
3499+
3500+ sb.append("</table></body></html>");
3501+ html.setHtml(sb.toString());
3502+ player.sendPacket(html);
3503+ }
3504+
3505+ @Override
3506+ protected void start()
3507+ {
3508+ int[] z1pos = getPosition("Zone", 1);
3509+ int[] z2pos = getPosition("Zone", 2);
3510+ zones.put(spawnNPC(z1pos[0], z1pos[1], z1pos[2], getInt("zoneNpcId")), 0);
3511+ zones.put(spawnNPC(z2pos[0], z2pos[1], z2pos[2], getInt("zoneNpcId")), 0);
3512+ setStatus(EventState.START);
3513+ schedule(1);
3514+ }
3515+
3516+ @Override
3517+ protected String getStartingMsg()
3518+ {
3519+ return "Get as many team members as possible near both zones to score!";
3520+ }
3521+
3522+ @Override
3523+ protected String getScorebar()
3524+ {
3525+ return teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
3526+ }
3527+
3528+ protected void unSpawnZones()
3529+ {
3530+ for (L2Spawn s : zones.keySet())
3531+ {
3532+ s.getLastSpawn().deleteMe();
3533+ s.stopRespawn();
3534+ SpawnTable.getInstance().deleteSpawn(s, true);
3535+ zones.remove(s);
3536+ }
3537+ }
3538+}
3539\ No newline at end of file
3540Index: java/net/sf/l2j/gameserver/handler/IVoicedCommandHandler.java
3541===================================================================
3542--- java/net/sf/l2j/gameserver/handler/IVoicedCommandHandler.java (revision 0)
3543+++ java/net/sf/l2j/gameserver/handler/IVoicedCommandHandler.java (working copy)
3544@@ -0,0 +1,24 @@
3545+/*
3546+ * This program is free software: you can redistribute it and/or modify it under
3547+ * the terms of the GNU General Public License as published by the Free Software
3548+ * Foundation, either version 3 of the License, or (at your option) any later
3549+ * version.
3550+ *
3551+ * This program is distributed in the hope that it will be useful, but WITHOUT
3552+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
3553+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
3554+ * details.
3555+ *
3556+ * You should have received a copy of the GNU General Public License along with
3557+ * this program. If not, see <http://www.gnu.org/licenses/>.
3558+ */
3559+package net.sf.l2j.gameserver.handler;
3560+
3561+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
3562+
3563+public interface IVoicedCommandHandler
3564+{
3565+ public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params);
3566+
3567+ public String[] getVoicedCommandList();
3568+}
3569Index: java/net/sf/l2j/gameserver/model/actor/L2Playable.java
3570===================================================================
3571--- java/net/sf/l2j/gameserver/model/actor/L2Playable.java (revision 6)
3572+++ java/net/sf/l2j/gameserver/model/actor/L2Playable.java (working copy)
3573@@ -15,6 +15,7 @@
3574 package net.sf.l2j.gameserver.model.actor;
3575
3576 import net.sf.l2j.gameserver.ai.CtrlEvent;
3577+import net.sf.l2j.gameserver.event.EventManager;
3578 import net.sf.l2j.gameserver.model.CharEffectList;
3579 import net.sf.l2j.gameserver.model.L2Effect;
3580 import net.sf.l2j.gameserver.model.L2Skill;
3581@@ -127,8 +128,12 @@
3582 // Stop HP/MP/CP Regeneration task
3583 getStatus().stopHpMpRegeneration();
3584
3585+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this))
3586+ {
3587+ // do nothing
3588+ }
3589 // Stop all active skills effects in progress
3590- if (isPhoenixBlessed())
3591+ else if (isPhoenixBlessed())
3592 {
3593 // remove Lucky Charm if player has SoulOfThePhoenix/Salvation buff
3594 if (getCharmOfLuck())
3595Index: java/net/sf/l2j/gameserver/handler/skillhandlers/Capture.java
3596===================================================================
3597--- java/net/sf/l2j/gameserver/handler/skillhandlers/Capture.java (revision 0)
3598+++ java/net/sf/l2j/gameserver/handler/skillhandlers/Capture.java (revision 0)
3599@@ -0,0 +1,33 @@
3600+package net.sf.l2j.gameserver.handler.skillhandlers;
3601+
3602+import net.sf.l2j.gameserver.handler.ISkillHandler;
3603+import net.sf.l2j.gameserver.model.L2Object;
3604+import net.sf.l2j.gameserver.model.L2Skill;
3605+import net.sf.l2j.gameserver.model.actor.L2Character;
3606+import net.sf.l2j.gameserver.model.actor.L2Npc;
3607+import net.sf.l2j.gameserver.templates.skills.L2SkillType;
3608+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
3609+import net.sf.l2j.gameserver.event.EventManager;
3610+
3611+public class Capture implements ISkillHandler
3612+{
3613+ private static final L2SkillType[] SKILL_IDS = {L2SkillType.CAPTURE};
3614+
3615+ @Override
3616+ public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
3617+ {
3618+ if (!(activeChar instanceof L2PcInstance))
3619+ return;
3620+
3621+ if(!(targets[0] instanceof L2Npc))
3622+ return;
3623+
3624+ EventManager.getInstance().getCurrentEvent().useCapture((L2PcInstance) activeChar, (L2Npc) targets[0]);
3625+ }
3626+
3627+ @Override
3628+ public L2SkillType[] getSkillIds()
3629+ {
3630+ return SKILL_IDS;
3631+ }
3632+}
3633\ No newline at end of file
3634Index: java/net/sf/l2j/gameserver/event/EventBuffer.java
3635===================================================================
3636--- java/net/sf/l2j/gameserver/event/EventBuffer.java (revision 0)
3637+++ java/net/sf/l2j/gameserver/event/EventBuffer.java (revision 0)
3638@@ -0,0 +1,265 @@
3639+/*
3640+ * This program is free software: you can redistribute it and/or modify it under
3641+ * the terms of the GNU General Public License as published by the Free Software
3642+ * Foundation, either version 3 of the License, or (at your option) any later
3643+ * version.
3644+ *
3645+ * This program is distributed in the hope that it will be useful, but WITHOUT
3646+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
3647+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
3648+ * details.
3649+ *
3650+ * You should have received a copy of the GNU General Public License along with
3651+ * this program. If not, see <http://www.gnu.org/licenses/>.
3652+ */
3653+package net.sf.l2j.gameserver.event;
3654+
3655+import java.sql.Connection;
3656+import java.sql.PreparedStatement;
3657+import java.sql.ResultSet;
3658+import java.util.Map;
3659+import java.util.StringTokenizer;
3660+
3661+import javolution.text.TextBuilder;
3662+import javolution.util.FastList;
3663+import javolution.util.FastMap;
3664+
3665+import net.sf.l2j.L2DatabaseFactory;
3666+import net.sf.l2j.gameserver.ThreadPoolManager;
3667+import net.sf.l2j.gameserver.datatables.SkillTable;
3668+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
3669+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
3670+
3671+public class EventBuffer
3672+{
3673+ private FastMap<String, FastList<Integer>> buffTemplates;
3674+ private FastMap<String, Boolean> changes;
3675+ private UpdateTask updateTask;
3676+
3677+ private static class SingletonHolder
3678+ {
3679+ protected static final EventBuffer _instance = new EventBuffer();
3680+ }
3681+
3682+ public static EventBuffer getInstance()
3683+ {
3684+ return SingletonHolder._instance;
3685+ }
3686+
3687+ protected class UpdateTask implements Runnable
3688+ {
3689+ @Override
3690+ public void run()
3691+ {
3692+ updateSQL();
3693+ }
3694+ }
3695+
3696+ public EventBuffer()
3697+ {
3698+ updateTask = new UpdateTask();
3699+ changes = new FastMap<>();
3700+ buffTemplates = new FastMap<>();
3701+ loadSQL();
3702+ ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(updateTask, 600000, 600000);
3703+ }
3704+
3705+ protected void buffPlayer(L2PcInstance player)
3706+ {
3707+ String playerId = "" + player.getObjectId() + player.getClassIndex();
3708+
3709+ if (!buffTemplates.containsKey(playerId))
3710+ return;
3711+
3712+ for (int skillId : buffTemplates.get(playerId))
3713+ SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId)).getEffects(player, player);
3714+ }
3715+
3716+ public void changeList(L2PcInstance player, int buff, boolean action)
3717+ {
3718+ String playerId = "" + player.getObjectId() + player.getClassIndex();
3719+
3720+ if (!buffTemplates.containsKey(playerId))
3721+ {
3722+ buffTemplates.put(playerId, new FastList<Integer>());
3723+ changes.put(playerId, true);
3724+ }
3725+ else
3726+ {
3727+ if (!changes.containsKey(playerId))
3728+ changes.put(playerId, false);
3729+
3730+ if (action)
3731+ buffTemplates.get(playerId).add(buff);
3732+ else
3733+ buffTemplates.get(playerId).remove(buffTemplates.get(playerId).indexOf(buff));
3734+ }
3735+ }
3736+
3737+ private void loadSQL()
3738+ {
3739+ if (!EventManager.getInstance().getBoolean("eventBufferEnabled"))
3740+ return;
3741+
3742+ Connection con = null;
3743+ PreparedStatement statement = null;
3744+ try
3745+ {
3746+ con = L2DatabaseFactory.getInstance().getConnection();
3747+ statement = con.prepareStatement("SELECT * FROM event_buffs");
3748+ ResultSet rset = statement.executeQuery();
3749+
3750+ while (rset.next())
3751+ {
3752+ buffTemplates.put(rset.getString("player"), new FastList<Integer>());
3753+ StringTokenizer st = new StringTokenizer(rset.getString("buffs"), ",");
3754+ FastList<Integer> templist = new FastList<>();
3755+ while (st.hasMoreTokens())
3756+ templist.add(Integer.parseInt(st.nextToken()));
3757+ buffTemplates.getEntry(rset.getString("player")).setValue(templist);
3758+ }
3759+
3760+ rset.close();
3761+ statement.close();
3762+ }
3763+ catch (Exception e)
3764+ {
3765+ System.out.println("EventBuffs SQL catch " + e);
3766+ }
3767+ finally
3768+ {
3769+ try
3770+ {
3771+ if (con != null)
3772+ con.close();
3773+ }
3774+ catch (Exception e)
3775+ {
3776+
3777+ }
3778+ }
3779+ }
3780+
3781+ protected boolean playerHaveTemplate(L2PcInstance player)
3782+ {
3783+ String playerId = "" + player.getObjectId() + player.getClassIndex();
3784+
3785+ if (buffTemplates.containsKey(playerId))
3786+ return true;
3787+
3788+ return false;
3789+ }
3790+
3791+ public void showHtml(L2PcInstance player)
3792+ {
3793+ try
3794+ {
3795+ String playerId = "" + player.getObjectId() + player.getClassIndex();
3796+
3797+ if (!buffTemplates.containsKey(playerId))
3798+ {
3799+ buffTemplates.put(playerId, new FastList<Integer>());
3800+ changes.put(playerId, true);
3801+ }
3802+
3803+ StringTokenizer st = new StringTokenizer(EventManager.getInstance().getString("allowedBuffsList"), ",");
3804+ FastList<Integer> skillList = new FastList<>();
3805+
3806+ while (st.hasMoreTokens())
3807+ skillList.add(Integer.parseInt(st.nextToken()));
3808+
3809+ NpcHtmlMessage html = new NpcHtmlMessage(0);
3810+ TextBuilder sb = new TextBuilder();
3811+
3812+ sb.append("<html><body><table width=270><tr><td width=200>Event Engine </td><td><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table><br><center><table width=270 bgcolor=5A5A5A><tr><td width=70>Edit Buffs</td><td width=80></td><td width=120>Remaining slots: " + (EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) + "</td></tr></table><br><br><table width=270 bgcolor=5A5A5A><tr><td>Added buffs:</td></tr></table><br>");
3813+
3814+ for (int skillId : buffTemplates.get(playerId))
3815+ sb.append("<a action=\"bypass -h eventbuffer " + skillId + " 0\">" + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId)).getName() + "</a><br>");
3816+
3817+ sb.append("<br><table width=270 bgcolor=5A5A5A><tr><td>Available buffs:</td></tr></table><br>");
3818+
3819+ for (int skillId : skillList)
3820+ {
3821+ if (!buffTemplates.get(playerId).contains(skillId))
3822+ {
3823+ if (EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size() != 0)
3824+ sb.append("<a action=\"bypass -h eventbuffer " + skillId + " 1\">" + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId)).getName() + "</a><br>");
3825+ else
3826+ break;
3827+ }
3828+ }
3829+
3830+ sb.append("</center></body></html>");
3831+ html.setHtml(sb.toString());
3832+ player.sendPacket(html);
3833+ }
3834+ catch (Throwable e)
3835+ {
3836+ e.printStackTrace();
3837+ }
3838+ }
3839+
3840+ public void updateSQL()
3841+ {
3842+ Connection con = null;
3843+ PreparedStatement statement = null;
3844+
3845+ try
3846+ {
3847+ con = L2DatabaseFactory.getInstance().getConnection();
3848+
3849+ for (Map.Entry<String, Boolean> player : changes.entrySet())
3850+ {
3851+ TextBuilder sb = new TextBuilder();
3852+
3853+ int c = 0;
3854+ for (int buffid : buffTemplates.get(player.getKey()))
3855+ {
3856+ if (c == 0)
3857+ {
3858+ sb.append(buffid);
3859+ c++;
3860+ }
3861+ else
3862+ sb.append("," + buffid);
3863+ }
3864+
3865+ if (player.getValue())
3866+ {
3867+ statement = con.prepareStatement("INSERT INTO event_buffs(player,buffs) VALUES (?,?)");
3868+ statement.setString(1, player.getKey());
3869+ statement.setString(2, sb.toString());
3870+
3871+ statement.executeUpdate();
3872+ statement.close();
3873+ }
3874+ else
3875+ {
3876+ statement = con.prepareStatement("UPDATE event_buffs SET buffs=? WHERE player=?");
3877+ statement.setString(1, sb.toString());
3878+ statement.setString(2, player.getKey());
3879+
3880+ statement.executeUpdate();
3881+ statement.close();
3882+ }
3883+ }
3884+ }
3885+ catch (Exception e)
3886+ {
3887+ System.out.println("EventBuffs SQL catch" + e);
3888+ }
3889+ finally
3890+ {
3891+ try
3892+ {
3893+ if (con != null)
3894+ con.close();
3895+ }
3896+ catch (Exception e)
3897+ {
3898+
3899+ }
3900+ }
3901+ changes.clear();
3902+ }
3903+}
3904\ No newline at end of file
3905Index: java/net/sf/l2j/gameserver/event/Event.java
3906===================================================================
3907--- java/net/sf/l2j/gameserver/event/Event.java (revision 0)
3908+++ java/net/sf/l2j/gameserver/event/Event.java (revision 0)
3909@@ -0,0 +1,740 @@
3910+package net.sf.l2j.gameserver.event;
3911+
3912+import java.util.ArrayList;
3913+import java.util.Set;
3914+
3915+import javolution.util.FastList;
3916+import javolution.util.FastMap;
3917+
3918+import net.sf.l2j.gameserver.ThreadPoolManager;
3919+import net.sf.l2j.gameserver.datatables.NpcTable;
3920+import net.sf.l2j.gameserver.datatables.SpawnTable;
3921+import net.sf.l2j.gameserver.model.L2Effect;
3922+import net.sf.l2j.gameserver.model.L2ItemInstance;
3923+import net.sf.l2j.gameserver.model.L2Object;
3924+import net.sf.l2j.gameserver.model.L2Party;
3925+import net.sf.l2j.gameserver.model.L2Skill;
3926+import net.sf.l2j.gameserver.model.L2Spawn;
3927+import net.sf.l2j.gameserver.model.actor.L2Character;
3928+import net.sf.l2j.gameserver.model.actor.L2Npc;
3929+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
3930+import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
3931+import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
3932+import net.sf.l2j.gameserver.skills.AbnormalEffect;
3933+import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
3934+import net.sf.l2j.gameserver.templates.item.L2EtcItemType;
3935+import net.sf.l2j.gameserver.templates.skills.L2SkillType;
3936+import net.sf.l2j.util.Rnd;
3937+
3938+public abstract class Event
3939+{
3940+ protected static final int[] ITEMS = {6707, 6709, 6708, 6710, 6704, 6701, 6702, 6703, 6706, 6705, 6713, 6714, 6712, 6711, 6697, 6688, 6696, 6691, 7579, 6695, 6694, 6689, 6693, 6690};
3941+ protected int eventId;
3942+ protected EventConfig config = EventConfig.getInstance();
3943+ protected FastMap<Integer, EventTeam> teams;
3944+ protected ThreadPoolManager tpm;
3945+ protected ResurrectorTask resurrectorTask;
3946+ protected Clock clock;
3947+ protected String scorebartext;
3948+ protected int time;
3949+ protected int winnerTeam;
3950+ protected int loserTeam;
3951+ private FastMap<L2PcInstance, ArrayList<L2Skill>> summons;
3952+
3953+ // TEAM-STATUS-SCORE
3954+ protected FastMap<L2PcInstance, int[]> players;
3955+
3956+ protected class Clock implements Runnable
3957+ {
3958+ private int totalTime;
3959+
3960+ protected String getTime()
3961+ {
3962+ String mins = "" + time / 60;
3963+ String secs = (time % 60 < 10 ? "0" + time % 60 : "" + time % 60);
3964+ return mins + ":" + secs + "";
3965+ }
3966+
3967+ @Override
3968+ public void run()
3969+ {
3970+ clockTick();
3971+
3972+ if (time < totalTime)
3973+ {
3974+ scorebartext = getScorebar();
3975+ if (scorebartext != "")
3976+ {
3977+ for (L2PcInstance player : getPlayerList())
3978+ player.sendPacket(new ExShowScreenMessage(1, -1, 3, false, 1, 0, 0, false, 2000, false, scorebartext));
3979+ }
3980+ }
3981+
3982+ if (time <= 0)
3983+ schedule(1);
3984+ else
3985+ {
3986+ time--;
3987+ tpm.scheduleGeneral(clock, 1000);
3988+ }
3989+ }
3990+
3991+ protected void setTime(int t)
3992+ {
3993+ time = t;
3994+ }
3995+
3996+ protected void startClock(int mt)
3997+ {
3998+ totalTime = mt - 2;
3999+ time = mt;
4000+ tpm.scheduleGeneral(clock, 1);
4001+ }
4002+ }
4003+
4004+ protected class ResurrectorTask implements Runnable
4005+ {
4006+ private L2PcInstance player;
4007+
4008+ public ResurrectorTask(L2PcInstance p)
4009+ {
4010+ player = p;
4011+ ThreadPoolManager.getInstance().scheduleGeneral(this, 7000);
4012+ }
4013+
4014+ @Override
4015+ public void run()
4016+ {
4017+ if (EventManager.getInstance().isRegistered(player))
4018+ {
4019+ player.doRevive();
4020+
4021+ player.setCurrentCp(player.getMaxCp());
4022+ player.setCurrentHp(player.getMaxHp());
4023+ player.setCurrentMp(player.getMaxMp());
4024+ teleportToTeamPos(player);
4025+ }
4026+ }
4027+ }
4028+
4029+ public Event()
4030+ {
4031+ teams = new FastMap<>();
4032+ clock = new Clock();
4033+ tpm = ThreadPoolManager.getInstance();
4034+ players = new FastMap<>();
4035+ summons = new FastMap<>();
4036+ time = 0;
4037+ }
4038+
4039+ protected void clockTick()
4040+ {
4041+
4042+ }
4043+
4044+ public void dropBomb(L2PcInstance player)
4045+ {
4046+
4047+ }
4048+
4049+ public void onHit(L2PcInstance actor, L2PcInstance target)
4050+ {
4051+
4052+ }
4053+
4054+ public void useCapture(L2PcInstance player, L2Npc base)
4055+ {
4056+
4057+ }
4058+
4059+ protected void addToResurrector(L2PcInstance player)
4060+ {
4061+ new ResurrectorTask(player);
4062+ }
4063+
4064+ protected void announce(Set<L2PcInstance> list, String text)
4065+ {
4066+ for (L2PcInstance player : list)
4067+ player.sendPacket(new CreatureSay(0, 18, "", "[Event] " + text));
4068+ }
4069+
4070+ public boolean canAttack(L2PcInstance player, L2Object target)
4071+ {
4072+ return true;
4073+ }
4074+
4075+ protected int countOfPositiveStatus()
4076+ {
4077+ int count = 0;
4078+ for (L2PcInstance player : getPlayerList())
4079+ if (getStatus(player) >= 0)
4080+ count++;
4081+
4082+ return count;
4083+ }
4084+
4085+ protected void createNewTeam(int id, String name, int[] color, int[] startPos)
4086+ {
4087+ teams.put(id, new EventTeam(id, name, color, startPos));
4088+ }
4089+
4090+ protected void createPartyOfTeam(int teamId)
4091+ {
4092+ int count = 0;
4093+ L2Party party = null;
4094+
4095+ FastList<L2PcInstance> list = new FastList<>();
4096+
4097+ for (L2PcInstance p : players.keySet())
4098+ if (getTeam(p) == teamId)
4099+ list.add(p);
4100+
4101+ for (L2PcInstance player : list)
4102+ {
4103+ if (count % 9 == 0 && list.size() - count != 1)
4104+ party = new L2Party(player, 1);
4105+ if (count % 9 < 9)
4106+ player.joinParty(party);
4107+ count++;
4108+ }
4109+ }
4110+
4111+ protected void divideIntoTeams(int number)
4112+ {
4113+ int i = 0;
4114+
4115+ while (EventManager.getInstance().players.size() != 0)
4116+ {
4117+ i++;
4118+ L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
4119+
4120+ // skip healers
4121+ if (player.getClassId().getId() == 16 || player.getClassId().getId() == 97)
4122+ continue;
4123+
4124+ players.put(player, new int[] { i, 0, 0 });
4125+ EventManager.getInstance().players.remove(player);
4126+ if (i == number)
4127+ i = 0;
4128+ }
4129+
4130+ i = getPlayersOfTeam(1).size() > getPlayersOfTeam(2).size() ? 1 : 0;
4131+
4132+ // healers here
4133+ while (EventManager.getInstance().players.size() != 0)
4134+ {
4135+ i++;
4136+ L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
4137+
4138+ players.put(player, new int[] { i, 0, 0 });
4139+ EventManager.getInstance().players.remove(player);
4140+ if (i == number)
4141+ i = 0;
4142+ }
4143+ }
4144+
4145+ protected void forceSitAll()
4146+ {
4147+ for (L2PcInstance player : players.keySet())
4148+ {
4149+ player.abortAttack();
4150+ player.abortCast();
4151+ player.setIsParalyzed(true);
4152+ player.setIsInvul(true);
4153+ player.startAbnormalEffect(AbnormalEffect.HOLD_2);
4154+ }
4155+ }
4156+
4157+ protected void forceStandAll()
4158+ {
4159+ for (L2PcInstance player : players.keySet())
4160+ {
4161+ player.stopAbnormalEffect(AbnormalEffect.HOLD_2);
4162+ player.setIsInvul(false);
4163+ player.setIsParalyzed(false);
4164+ }
4165+ }
4166+
4167+ protected void InvisAll()
4168+ {
4169+ for (L2PcInstance player : players.keySet())
4170+ {
4171+ player.abortAttack();
4172+ player.abortCast();
4173+ player.getAppearance().setInvisible();
4174+ }
4175+ }
4176+
4177+ protected void unInvisAll()
4178+ {
4179+ for (L2PcInstance player : players.keySet())
4180+ {
4181+ player.getAppearance().setVisible();
4182+ player.broadcastCharInfo();
4183+ }
4184+ }
4185+
4186+ public boolean getBoolean(String propName)
4187+ {
4188+ return config.getBoolean(eventId, propName);
4189+ }
4190+
4191+ public int[] getColor(String owner)
4192+ {
4193+ return config.getColor(eventId, owner);
4194+ }
4195+
4196+ public int getInt(String propName)
4197+ {
4198+ return config.getInt(eventId, propName);
4199+ }
4200+
4201+ protected Set<L2PcInstance> getPlayerList()
4202+ {
4203+ return players.keySet();
4204+ }
4205+
4206+ protected FastList<L2PcInstance> getPlayersOfTeam(int team)
4207+ {
4208+ FastList<L2PcInstance> list = new FastList<>();
4209+
4210+ for (L2PcInstance player : getPlayerList())
4211+ if (getTeam(player) == team)
4212+ list.add(player);
4213+
4214+ return list;
4215+ }
4216+
4217+ protected EventTeam getPlayersTeam(L2PcInstance player)
4218+ {
4219+ return teams.get(players.get(player)[0]);
4220+ }
4221+
4222+ protected FastList<L2PcInstance> getPlayersWithStatus(int status)
4223+ {
4224+ FastList<L2PcInstance> list = new FastList<>();
4225+
4226+ for (L2PcInstance player : getPlayerList())
4227+ if (getStatus(player) == status)
4228+ list.add(player);
4229+
4230+ return list;
4231+ }
4232+
4233+ protected L2PcInstance getPlayerWithMaxScore()
4234+ {
4235+ L2PcInstance max = players.head().getNext().getKey();
4236+
4237+ for (L2PcInstance player : players.keySet())
4238+ if (players.get(player)[2] > players.get(max)[2])
4239+ max = player;
4240+
4241+ return max;
4242+ }
4243+
4244+ protected void unequip()
4245+ {
4246+ for (L2PcInstance player : players.keySet())
4247+ {
4248+ player.getInventory().unEquipItemInSlot(7);
4249+ player.getInventory().unEquipItemInSlot(8);
4250+ }
4251+ }
4252+
4253+ public int[] getPosition(String owner, int num)
4254+ {
4255+ return config.getPosition(eventId, owner, num);
4256+ }
4257+
4258+ protected L2PcInstance getRandomPlayer()
4259+ {
4260+ FastList<L2PcInstance> temp = new FastList<>();
4261+ for (L2PcInstance player : players.keySet())
4262+ temp.add(player);
4263+
4264+ return temp.get(Rnd.get(temp.size()));
4265+ }
4266+
4267+ protected L2PcInstance getRandomPlayerFromTeam(int team)
4268+ {
4269+ FastList<L2PcInstance> temp = new FastList<>();
4270+ for (L2PcInstance player : players.keySet())
4271+ if (getTeam(player) == team)
4272+ temp.add(player);
4273+
4274+ return temp.get(Rnd.get(temp.size()));
4275+ }
4276+
4277+ protected FastList<L2PcInstance> getPlayersFromTeamWithStatus(int team, int status)
4278+ {
4279+ FastList<L2PcInstance> players = getPlayersWithStatus(status);
4280+ FastList<L2PcInstance> temp = new FastList<>();
4281+
4282+ for (L2PcInstance player : players)
4283+ if (getTeam(player) == team)
4284+ temp.add(player);
4285+
4286+ return temp;
4287+ }
4288+
4289+ protected L2PcInstance getRandomPlayerFromTeamWithStatus(int team, int status)
4290+ {
4291+ FastList<L2PcInstance> temp = getPlayersFromTeamWithStatus(team, status);
4292+ return temp.get(Rnd.get(temp.size()));
4293+ }
4294+
4295+ public FastList<Integer> getRestriction(String type)
4296+ {
4297+ return config.getRestriction(eventId, type);
4298+ }
4299+
4300+ protected int getScore(L2PcInstance player)
4301+ {
4302+ return players.get(player)[2];
4303+ }
4304+
4305+ protected int getStatus(L2PcInstance player)
4306+ {
4307+ return players.get(player)[1];
4308+ }
4309+
4310+ public String getString(String propName)
4311+ {
4312+ return config.getString(eventId, propName);
4313+ }
4314+
4315+ public int getTeam(L2PcInstance player)
4316+ {
4317+ return players.get(player)[0];
4318+ }
4319+
4320+ protected int getWinnerTeam()
4321+ {
4322+ FastList<EventTeam> t = new FastList<>();
4323+
4324+ for (EventTeam team : teams.values())
4325+ {
4326+ if (t.size() == 0)
4327+ {
4328+ t.add(team);
4329+ continue;
4330+ }
4331+
4332+ if (team.getScore() > t.getFirst().getScore())
4333+ {
4334+ t.clear();
4335+ t.add(team);
4336+ continue;
4337+ }
4338+
4339+ if (team.getScore() == t.getFirst().getScore())
4340+ t.add(team);
4341+ }
4342+
4343+ if (t.size() > 1)
4344+ return 0;
4345+
4346+ return t.getFirst().getId();
4347+ }
4348+
4349+ protected void giveReward(FastList<L2PcInstance> players, int id, int ammount)
4350+ {
4351+ for (L2PcInstance player : players)
4352+ {
4353+ if (player == null)
4354+ continue;
4355+
4356+ player.addItem("Event", id, ammount, player, true);
4357+ EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
4358+ }
4359+ }
4360+
4361+ protected void giveReward(L2PcInstance player, int id, int ammount)
4362+ {
4363+ EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
4364+ player.addItem("Event", id, ammount, player, true);
4365+ }
4366+
4367+ protected void increasePlayersScore(L2PcInstance player)
4368+ {
4369+ int old = getScore(player);
4370+ setScore(player, old + 1);
4371+ EventStats.getInstance().tempTable.get(player.getObjectId())[3] = EventStats.getInstance().tempTable.get(player.getObjectId())[3] + 1;
4372+ }
4373+
4374+ protected void msgToAll(String text)
4375+ {
4376+ for (L2PcInstance player : players.keySet())
4377+ player.sendMessage(text);
4378+ }
4379+
4380+ public void onDie(L2PcInstance victim, L2Character killer)
4381+ {
4382+ EventStats.getInstance().tempTable.get(victim.getObjectId())[2] = EventStats.getInstance().tempTable.get(victim.getObjectId())[2] + 1;
4383+ }
4384+
4385+ public void onKill(L2Character victim, L2PcInstance killer)
4386+ {
4387+ EventStats.getInstance().tempTable.get(killer.getObjectId())[1] = EventStats.getInstance().tempTable.get(killer.getObjectId())[1] + 1;
4388+ }
4389+
4390+ public void onLogout(L2PcInstance player)
4391+ {
4392+ if (players.containsKey(player))
4393+ removePlayer(player);
4394+
4395+ player.setXYZ(EventManager.getInstance().positions.get(player)[0], EventManager.getInstance().positions.get(player)[1], EventManager.getInstance().positions.get(player)[2]);
4396+ player.setTitle(EventManager.getInstance().titles.get(player));
4397+
4398+ if (teams.size() == 1)
4399+ {
4400+ if (getPlayerList().size() == 1)
4401+ endEvent();
4402+ }
4403+ else
4404+ {
4405+ int t = players.head().getNext().getValue()[0];
4406+ for (L2PcInstance p : getPlayerList())
4407+ if (getTeam(p) != t)
4408+ return;
4409+
4410+ endEvent();
4411+ }
4412+ }
4413+
4414+ public boolean onSay(int type, L2PcInstance player, String text)
4415+ {
4416+ return true;
4417+ }
4418+
4419+ public boolean onTalkNpc(L2Npc npc, L2PcInstance player)
4420+ {
4421+ return false;
4422+ }
4423+
4424+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
4425+ {
4426+ if (EventManager.getInstance().getRestriction("item").contains(item.getItemId()) || getRestriction("item").contains(item.getItemId()))
4427+ return false;
4428+
4429+ if (item.getItemType() == L2EtcItemType.POTION && !getBoolean("allowPotions"))
4430+ return false;
4431+
4432+ if (item.getItemType() == L2EtcItemType.SCROLL)
4433+ return false;
4434+
4435+ if (item.getItemType() == L2EtcItemType.PET_COLLAR)
4436+ return false;
4437+
4438+ return true;
4439+ }
4440+
4441+ public boolean onUseMagic(L2Skill skill)
4442+ {
4443+ if (EventManager.getInstance().getRestriction("skill").contains(skill.getId()) || getRestriction("skill").contains(skill.getId()))
4444+ return false;
4445+
4446+ if (skill.getSkillType() == L2SkillType.RESURRECT && !(this instanceof RaidBoss))
4447+ return false;
4448+
4449+ if (skill.getSkillType() == L2SkillType.SUMMON_FRIEND)
4450+ return false;
4451+
4452+ if (skill.getSkillType() == L2SkillType.RECALL)
4453+ return false;
4454+
4455+ if (skill.getSkillType() == L2SkillType.FAKE_DEATH)
4456+ return false;
4457+
4458+ return true;
4459+ }
4460+
4461+ protected void prepare(L2PcInstance player)
4462+ {
4463+ if (player.isDead())
4464+ player.doRevive();
4465+
4466+ if (player.isCastingNow())
4467+ player.abortCast();
4468+
4469+ player.getAppearance().setVisible();
4470+
4471+ if (player.hasPet())
4472+ player.getPet().unSummon(player);
4473+
4474+ if (player.isMounted())
4475+ player.dismount();
4476+
4477+ if (getBoolean("removeBuffs"))
4478+ {
4479+ player.stopAllEffects();
4480+ if (player.hasServitor())
4481+ player.getPet().unSummon(player);
4482+ }
4483+ else
4484+ {
4485+ for (L2Effect e : player.getAllEffects())
4486+ if (e.getStackType().equals("hero_buff"))
4487+ e.exit();
4488+
4489+ if (player.hasServitor())
4490+ {
4491+ ArrayList<L2Skill> summonBuffs = new ArrayList<>();
4492+
4493+ for (L2Effect e : player.getPet().getAllEffects())
4494+ {
4495+ if (e.getStackType().equals("hero_buff"))
4496+ e.exit();
4497+ else
4498+ summonBuffs.add(e.getSkill());
4499+ }
4500+
4501+ summons.put(player, summonBuffs);
4502+ }
4503+ }
4504+
4505+ L2ItemInstance wpn = player.getActiveWeaponInstance();
4506+ if (wpn != null && wpn.isHeroItem())
4507+ player.useEquippableItem(wpn, false);
4508+
4509+ if (player.getParty() != null)
4510+ {
4511+ L2Party party = player.getParty();
4512+ party.removePartyMember(player);
4513+ }
4514+
4515+ int[] nameColor = getPlayersTeam(player).getTeamColor();
4516+ player.getAppearance().setNameColor(nameColor[0], nameColor[1], nameColor[2]);
4517+ player.setTitle("<- 0 ->");
4518+
4519+ if (EventManager.getInstance().getBoolean("eventBufferEnabled"))
4520+ EventBuffer.getInstance().buffPlayer(player);
4521+
4522+ player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
4523+ player.setCurrentCp(player.getMaxCp());
4524+
4525+ player.broadcastUserInfo();
4526+ }
4527+
4528+ public ArrayList<L2Skill> getSummonBuffs(L2PcInstance player)
4529+ {
4530+ return summons.get(player);
4531+ }
4532+
4533+ protected void preparePlayers()
4534+ {
4535+ for (L2PcInstance player : players.keySet())
4536+ prepare(player);
4537+ }
4538+
4539+ protected void removePlayer(L2PcInstance player)
4540+ {
4541+ players.remove(player);
4542+ }
4543+
4544+ public void reset()
4545+ {
4546+ players.clear();
4547+ summons.clear();
4548+ tpm.purge();
4549+ winnerTeam = 0;
4550+
4551+ for (EventTeam team : teams.values())
4552+ team.setScore(0);
4553+ }
4554+
4555+ protected void selectPlayers(int teamId, int playerCount)
4556+ {
4557+ for (int i = 0; i < playerCount; i++)
4558+ {
4559+ L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
4560+ players.put(player, new int[] { teamId, 0, 0 });
4561+ EventManager.getInstance().players.remove(player);
4562+ }
4563+ }
4564+
4565+ protected void setScore(L2PcInstance player, int score)
4566+ {
4567+ players.get(player)[2] = score;
4568+ player.setTitle("<- " + score + " ->");
4569+ player.broadcastUserInfo();
4570+ }
4571+
4572+ protected void setStatus(L2PcInstance player, int status)
4573+ {
4574+ if (players.containsKey(player))
4575+ players.get(player)[1] = status;
4576+ }
4577+
4578+ protected void setTeam(L2PcInstance player, int team)
4579+ {
4580+ players.get(player)[0] = team;
4581+ }
4582+
4583+ protected L2Spawn spawnNPC(int xPos, int yPos, int zPos, int npcId)
4584+ {
4585+ final L2NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
4586+
4587+ try
4588+ {
4589+ final L2Spawn spawn = new L2Spawn(template);
4590+ spawn.setLocx(xPos);
4591+ spawn.setLocy(yPos);
4592+ spawn.setLocz(zPos);
4593+ spawn.setHeading(0);
4594+ spawn.setRespawnDelay(1);
4595+ SpawnTable.getInstance().addNewSpawn(spawn, false);
4596+ spawn.init();
4597+ return spawn;
4598+ }
4599+ catch (Exception e)
4600+ {
4601+ return null;
4602+ }
4603+ }
4604+
4605+ protected void teleportPlayer(L2PcInstance player, int[] coordinates)
4606+ {
4607+ player.teleToLocation(coordinates[0] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[1] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[2], 0);
4608+ }
4609+
4610+ protected void teleportToTeamPos()
4611+ {
4612+ for (L2PcInstance player : players.keySet())
4613+ teleportToTeamPos(player);
4614+ }
4615+
4616+ protected void teleportToTeamPos(L2PcInstance player)
4617+ {
4618+ int[] pos = getPosition(teams.get(getTeam(player)).getName(), 0);
4619+ teleportPlayer(player, pos);
4620+ }
4621+
4622+ protected void unspawnNPC(L2Spawn npcSpawn)
4623+ {
4624+ if (npcSpawn == null)
4625+ return;
4626+
4627+ npcSpawn.getLastSpawn().deleteMe();
4628+ npcSpawn.stopRespawn();
4629+ SpawnTable.getInstance().deleteSpawn(npcSpawn, true);
4630+ }
4631+
4632+ public int numberOfTeams()
4633+ {
4634+ return teams.size();
4635+ }
4636+
4637+ protected void sendMsg()
4638+ {
4639+ for (L2PcInstance player : getPlayerList())
4640+ player.sendPacket(new ExShowScreenMessage(1, -1, 2, false, 0, 0, 0, false, 3000, false, getStartingMsg()));
4641+ }
4642+
4643+ protected abstract void endEvent();
4644+ protected abstract String getStartingMsg();
4645+ protected abstract String getScorebar();
4646+ protected abstract void start();
4647+ protected abstract void showHtml(L2PcInstance player, int obj);
4648+ protected abstract void schedule(int time);
4649+}
4650\ No newline at end of file
4651Index: java/net/sf/l2j/gameserver/network/serverpackets/Die.java
4652===================================================================
4653--- java/net/sf/l2j/gameserver/network/serverpackets/Die.java (revision 6)
4654+++ java/net/sf/l2j/gameserver/network/serverpackets/Die.java (working copy)
4655@@ -15,6 +15,7 @@
4656 package net.sf.l2j.gameserver.network.serverpackets;
4657
4658 import net.sf.l2j.gameserver.datatables.AccessLevels;
4659+import net.sf.l2j.gameserver.event.EventManager;
4660 import net.sf.l2j.gameserver.instancemanager.CastleManager;
4661 import net.sf.l2j.gameserver.model.L2AccessLevel;
4662 import net.sf.l2j.gameserver.model.L2Clan;
4663@@ -32,6 +33,7 @@
4664 private L2AccessLevel _access = AccessLevels._userAccessLevel;
4665 private L2Clan _clan;
4666 L2Character _activeChar;
4667+ private boolean _event;
4668
4669 public Die(L2Character cha)
4670 {
4671@@ -41,7 +43,7 @@
4672 L2PcInstance player = (L2PcInstance) cha;
4673 _access = player.getAccessLevel();
4674 _clan = player.getClan();
4675-
4676+ _event = EventManager.getInstance().isRegistered(cha);
4677 }
4678 _charObjId = cha.getObjectId();
4679 _fake = !cha.isDead();
4680@@ -58,32 +60,43 @@
4681
4682 writeC(0x06);
4683 writeD(_charObjId);
4684- writeD(0x01); // to nearest village
4685
4686- if (_clan != null)
4687- {
4688- L2SiegeClan siegeClan = null;
4689- boolean isInDefense = false;
4690-
4691- Castle castle = CastleManager.getInstance().getCastle(_activeChar);
4692- if (castle != null && castle.getSiege().getIsInProgress())
4693- {
4694- // siege in progress
4695- siegeClan = castle.getSiege().getAttackerClan(_clan);
4696- if (siegeClan == null && castle.getSiege().checkIsDefender(_clan))
4697- isInDefense = true;
4698- }
4699-
4700- writeD(_clan.hasHideout() ? 0x01 : 0x00); // to hide away
4701- writeD(_clan.hasCastle() || isInDefense ? 0x01 : 0x00); // to castle
4702- writeD(siegeClan != null && !isInDefense && !siegeClan.getFlag().isEmpty() ? 0x01 : 0x00); // to siege HQ
4703- }
4704- else
4705- {
4706- writeD(0x00); // to hide away
4707- writeD(0x00); // to castle
4708- writeD(0x00); // to siege HQ
4709- }
4710+ if (_event)
4711+ {
4712+ writeD(0x00);
4713+ writeD(0x00);
4714+ writeD(0x00);
4715+ writeD(0x00);
4716+ }
4717+ else
4718+ {
4719+ writeD(0x01); // to nearest village
4720+
4721+ if (_clan != null)
4722+ {
4723+ L2SiegeClan siegeClan = null;
4724+ boolean isInDefense = false;
4725+
4726+ Castle castle = CastleManager.getInstance().getCastle(_activeChar);
4727+ if (castle != null && castle.getSiege().getIsInProgress())
4728+ {
4729+ // siege in progress
4730+ siegeClan = castle.getSiege().getAttackerClan(_clan);
4731+ if (siegeClan == null && castle.getSiege().checkIsDefender(_clan))
4732+ isInDefense = true;
4733+ }
4734+
4735+ writeD(_clan.hasHideout() ? 0x01 : 0x00); // to hide away
4736+ writeD(_clan.hasCastle() || isInDefense ? 0x01 : 0x00); // to castle
4737+ writeD(siegeClan != null && !isInDefense && !siegeClan.getFlag().isEmpty() ? 0x01 : 0x00); // to siege HQ
4738+ }
4739+ else
4740+ {
4741+ writeD(0x00); // to hide away
4742+ writeD(0x00); // to castle
4743+ writeD(0x00); // to siege HQ
4744+ }
4745+ }
4746
4747 writeD(_sweepable ? 0x01 : 0x00); // sweepable (blue glow)
4748 writeD(_access.allowFixedRes() ? 0x01 : 0x00); // FIXED
4749Index: java/net/sf/l2j/gameserver/network/L2GamePacketHandler.java
4750===================================================================
4751--- java/net/sf/l2j/gameserver/network/L2GamePacketHandler.java (revision 6)
4752+++ java/net/sf/l2j/gameserver/network/L2GamePacketHandler.java (working copy)
4753@@ -18,6 +18,7 @@
4754 import java.util.logging.Logger;
4755
4756 import net.sf.l2j.Config;
4757+import net.sf.l2j.gameserver.event.EventManager;
4758 import net.sf.l2j.gameserver.network.L2GameClient.GameClientState;
4759 import net.sf.l2j.gameserver.network.clientpackets.*;
4760 import net.sf.l2j.util.Util;
4761@@ -98,6 +99,9 @@
4762 }
4763 break;
4764 case IN_GAME:
4765+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().getInt("antiAfkTime") > 0 && EventManager.getInstance().isRegistered(client.getActiveChar()))
4766+ client.getActiveChar().setAntiAfk(EventManager.getInstance().getInt("antiAfkTime"));
4767+
4768 switch (opcode)
4769 {
4770 case 0x01:
4771Index: java/net/sf/l2j/gameserver/GeoEngine.java
4772===================================================================
4773--- java/net/sf/l2j/gameserver/GeoEngine.java (revision 6)
4774+++ java/net/sf/l2j/gameserver/GeoEngine.java (working copy)
4775@@ -34,6 +34,7 @@
4776
4777 import net.sf.l2j.Config;
4778 import net.sf.l2j.gameserver.datatables.DoorTable;
4779+import net.sf.l2j.gameserver.datatables.FenceTable;
4780 import net.sf.l2j.gameserver.model.L2Object;
4781 import net.sf.l2j.gameserver.model.L2Spawn;
4782 import net.sf.l2j.gameserver.model.L2World;
4783@@ -117,6 +118,9 @@
4784 if (DoorTable.getInstance().checkIfDoorsBetween(cha.getX(), cha.getY(), cha.getZ(), target.getX(), target.getY(), target.getZ()))
4785 return false;
4786
4787+ if (!FenceTable.canSeeTarget(cha, target.getX(), target.getY()))
4788+ return false;
4789+
4790 if (cha.getZ() >= target.getZ())
4791 return canSeeTarget(cha.getX(), cha.getY(), cha.getZ(), target.getX(), target.getY(), target.getZ());
4792
4793@@ -166,9 +170,13 @@
4794 @Override
4795 public boolean canSeeTargetDebug(L2PcInstance gm, L2Object target)
4796 {
4797+ if (!FenceTable.canSeeTarget(gm, target.getX(), target.getY()))
4798+ return false;
4799+
4800 // comments: see above
4801 int z = gm.getZ() + 45;
4802 int z2 = target.getZ() + 45;
4803+
4804 if (target instanceof L2DoorInstance)
4805 {
4806 gm.sendMessage("door always true");
4807@@ -207,6 +215,9 @@
4808 if (DoorTable.getInstance().checkIfDoorsBetween(x, y, z, tx, ty, tz))
4809 return startpoint;
4810
4811+ if (!FenceTable.canSeeTarget(x,y, tx, ty))
4812+ return startpoint;
4813+
4814 Location destiny = new Location(tx, ty, tz);
4815 return moveCheck(startpoint, destiny, (x - L2World.MAP_MIN_X) >> 4, (y - L2World.MAP_MIN_Y) >> 4, z, (tx - L2World.MAP_MIN_X) >> 4, (ty - L2World.MAP_MIN_Y) >> 4, tz);
4816 }
4817Index: java/net/sf/l2j/gameserver/model/actor/L2Character.java
4818===================================================================
4819--- java/net/sf/l2j/gameserver/model/actor/L2Character.java (revision 6)
4820+++ java/net/sf/l2j/gameserver/model/actor/L2Character.java (working copy)
4821@@ -39,6 +39,7 @@
4822 import net.sf.l2j.gameserver.datatables.MapRegionTable;
4823 import net.sf.l2j.gameserver.datatables.MapRegionTable.TeleportWhereType;
4824 import net.sf.l2j.gameserver.datatables.SkillTable.FrequentSkill;
4825+import net.sf.l2j.gameserver.event.EventManager;
4826 import net.sf.l2j.gameserver.handler.ISkillHandler;
4827 import net.sf.l2j.gameserver.handler.SkillHandler;
4828 import net.sf.l2j.gameserver.instancemanager.DimensionalRiftManager;
4829@@ -590,6 +591,26 @@
4830 if (Config.DEBUG)
4831 _log.fine(getName() + " doAttack: target=" + target);
4832
4833+ if (this instanceof L2PcInstance && EventManager.getInstance().isRegistered(this) || this instanceof L2Summon && EventManager.getInstance().isRegistered(((L2Summon) this).getOwner()))
4834+ {
4835+ L2PcInstance p = getActingPlayer();
4836+ L2PcInstance t = null;
4837+ if (target instanceof L2PcInstance || target instanceof L2Summon)
4838+ {
4839+ t = target.getActingPlayer();
4840+ if (EventManager.getInstance().areTeammates(p, t))
4841+ {
4842+ sendPacket(ActionFailed.STATIC_PACKET);
4843+ return;
4844+ }
4845+ }
4846+ if (!EventManager.getInstance().getCurrentEvent().canAttack(p, target))
4847+ {
4848+ sendPacket(ActionFailed.STATIC_PACKET);
4849+ return;
4850+ }
4851+ }
4852+
4853 if (!isAlikeDead() && target != null)
4854 {
4855 if (this instanceof L2Npc && target.isAlikeDead() || !getKnownList().knowsObject(target))
4856@@ -777,6 +798,9 @@
4857 player.updatePvPStatus(target);
4858 }
4859
4860+ if (this instanceof L2PcInstance && target instanceof L2PcInstance && EventManager.getInstance().isRegistered(this))
4861+ EventManager.getInstance().getCurrentEvent().onHit((L2PcInstance) this, (L2PcInstance) target);
4862+
4863 // Check if hit isn't missed
4864 if (!hitted)
4865 // Abort the attack of the L2Character and send Server->Client ActionFailed packet
4866@@ -806,7 +830,7 @@
4867
4868 // If we didn't miss the hit, discharge the shoulshots, if any
4869 setChargedShot(ShotType.SOULSHOT, false);
4870-
4871+
4872 if (player != null)
4873 {
4874 if (player.isCursedWeaponEquipped())
4875@@ -1144,6 +1168,45 @@
4876
4877 return;
4878 }
4879+
4880+ try
4881+ {
4882+ if (getTarget() != null && (this instanceof L2PcInstance || this instanceof L2Summon))
4883+ {
4884+ boolean isArea = false;
4885+ switch (skill.getTargetType())
4886+ {
4887+ case TARGET_AREA:
4888+ case TARGET_FRONT_AREA:
4889+ case TARGET_BEHIND_AREA:
4890+ case TARGET_AURA:
4891+ case TARGET_FRONT_AURA:
4892+ case TARGET_BEHIND_AURA:
4893+ isArea = true;
4894+ }
4895+
4896+ if (!isArea)
4897+ {
4898+ L2PcInstance p = getActingPlayer();
4899+ if (p != null && EventManager.getInstance().isRegistered(p))
4900+ {
4901+ if (!EventManager.getInstance().getCurrentEvent().canAttack(p, getTarget()))
4902+ {
4903+ getAI().setIntention(AI_INTENTION_ACTIVE);
4904+ return;
4905+ }
4906+
4907+ if (getTarget() instanceof L2PcInstance && EventManager.getInstance().areTeammates(p, (L2PcInstance) getTarget()) && skill.isOffensive())
4908+ {
4909+ getAI().setIntention(AI_INTENTION_ACTIVE);
4910+ return;
4911+ }
4912+ }
4913+ }
4914+ }
4915+ }
4916+ catch(ClassCastException e){}
4917+
4918 // Override casting type
4919 if (skill.isSimultaneousCast() && !simultaneously)
4920 simultaneously = true;
4921Index: java/net/sf/l2j/gameserver/model/L2Skill.java
4922===================================================================
4923--- java/net/sf/l2j/gameserver/model/L2Skill.java (revision 6)
4924+++ java/net/sf/l2j/gameserver/model/L2Skill.java (working copy)
4925@@ -24,6 +24,7 @@
4926 import net.sf.l2j.gameserver.datatables.ItemTable;
4927 import net.sf.l2j.gameserver.datatables.SkillTable;
4928 import net.sf.l2j.gameserver.datatables.SkillTreeTable;
4929+import net.sf.l2j.gameserver.event.EventManager;
4930 import net.sf.l2j.gameserver.model.actor.L2Attackable;
4931 import net.sf.l2j.gameserver.model.actor.L2Character;
4932 import net.sf.l2j.gameserver.model.actor.L2Npc;
4933@@ -1431,6 +1432,15 @@
4934 if (!checkForAreaOffensiveSkills(activeChar, obj, this, srcInArena))
4935 continue;
4936
4937+ if (EventManager.getInstance().isRunning() && (obj instanceof L2PcInstance || obj instanceof L2Summon) && activeChar instanceof L2PcInstance)
4938+ {
4939+ L2PcInstance o = obj.getActingPlayer();
4940+ if (EventManager.getInstance().isRegistered(activeChar) &&
4941+ EventManager.getInstance().isRegistered(o) &&
4942+ EventManager.getInstance().areTeammates(o, (L2PcInstance) activeChar))
4943+ continue;
4944+ }
4945+
4946 if (onlyFirst)
4947 return new L2Character[]
4948 {
4949@@ -1472,6 +1482,16 @@
4950 if (!checkForAreaOffensiveSkills(activeChar, obj, this, srcInArena))
4951 continue;
4952
4953+ if (EventManager.getInstance().isRunning() && (obj instanceof L2PcInstance || obj instanceof L2Summon) && activeChar instanceof L2PcInstance)
4954+ {
4955+ L2PcInstance o = obj.getActingPlayer();
4956+ if (EventManager.getInstance().getCurrentEvent().numberOfTeams() > 1 &&
4957+ EventManager.getInstance().isRegistered((L2PcInstance)activeChar) &&
4958+ EventManager.getInstance().isRegistered(o) &&
4959+ EventManager.getInstance().getCurrentEvent().getTeam(o) == EventManager.getInstance().getCurrentEvent().getTeam((L2PcInstance)activeChar))
4960+ continue;
4961+ }
4962+
4963 targetList.add(obj);
4964 }
4965
4966@@ -2048,11 +2068,20 @@
4967 final L2Summon targetSummon = (L2Summon) target;
4968 final L2PcInstance summonOwner = targetSummon.getActingPlayer();
4969
4970- if (activeChar instanceof L2PcInstance && activeChar.getPet() != targetSummon && !targetSummon.isDead() && (summonOwner.getPvpFlag() != 0 || summonOwner.getKarma() > 0) || (summonOwner.isInsideZone(L2Character.ZONE_PVP) && ((L2PcInstance) activeChar).isInsideZone(L2Character.ZONE_PVP)) || (summonOwner.isInDuel() && ((L2PcInstance) activeChar).isInDuel() && summonOwner.getDuelId() == ((L2PcInstance) activeChar).getDuelId()))
4971- return new L2Character[]
4972- {
4973- targetSummon
4974- };
4975+ if (activeChar instanceof L2PcInstance)
4976+ {
4977+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(activeChar) && EventManager.getInstance().isRegistered(summonOwner) && !EventManager.getInstance().areTeammates(summonOwner, (L2PcInstance) activeChar))
4978+ return new L2Character[]
4979+ {
4980+ targetSummon
4981+ };
4982+
4983+ if (activeChar.getPet() != targetSummon && !targetSummon.isDead() && (summonOwner.getPvpFlag() != 0 || summonOwner.getKarma() > 0) || (summonOwner.isInsideZone(L2Character.ZONE_PVP) && ((L2PcInstance) activeChar).isInsideZone(L2Character.ZONE_PVP)) || (summonOwner.isInDuel() && ((L2PcInstance) activeChar).isInDuel() && summonOwner.getDuelId() == ((L2PcInstance) activeChar).getDuelId()))
4984+ return new L2Character[]
4985+ {
4986+ targetSummon
4987+ };
4988+ }
4989 }
4990 return _emptyTargetList;
4991 }
4992
4993\ No newline at end of file
4994Index: java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java
4995===================================================================
4996--- java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java (revision 6)
4997+++ java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java (working copy)
4998@@ -16,9 +16,11 @@
4999
5000 import net.sf.l2j.Config;
5001 import net.sf.l2j.gameserver.datatables.NpcTable;
5002+import net.sf.l2j.gameserver.event.EventManager;
5003 import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
5004 import net.sf.l2j.gameserver.model.Location;
5005 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
5006+import net.sf.l2j.gameserver.model.base.Race;
5007 import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
5008 import net.sf.l2j.gameserver.skills.AbnormalEffect;
5009
5010@@ -30,7 +32,8 @@
5011 private final int _mAtkSpd, _pAtkSpd;
5012 private final int _runSpd, _walkSpd;
5013 private final float _moveMultiplier;
5014-
5015+ private boolean _inSpecialEvent;
5016+
5017 public CharInfo(L2PcInstance cha)
5018 {
5019 _activeChar = cha;
5020@@ -47,6 +50,8 @@
5021 _moveMultiplier = _activeChar.getMovementSpeedMultiplier();
5022 _runSpd = (int) (_activeChar.getRunSpeed() / _moveMultiplier);
5023 _walkSpd = (int) (_activeChar.getWalkSpeed() / _moveMultiplier);
5024+
5025+ _inSpecialEvent = EventManager.getInstance().isRegistered(_activeChar) && EventManager.getInstance().isSpecialEvent();
5026 }
5027
5028 @Override
5029@@ -67,27 +72,55 @@
5030 writeD(_z);
5031 writeD(_heading);
5032 writeD(_activeChar.getObjectId());
5033- writeS(_activeChar.getName());
5034- writeD(_activeChar.getRace().ordinal());
5035- writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
5036
5037+ if (_inSpecialEvent)
5038+ {
5039+ writeS("Player");
5040+ writeD(Race.Dwarf.ordinal());
5041+ writeD(1);
5042+ }
5043+ else
5044+ {
5045+ writeS(_activeChar.getName());
5046+ writeD(_activeChar.getRace().ordinal());
5047+ writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
5048+ }
5049+
5050 if (_activeChar.getClassIndex() == 0)
5051 writeD(_activeChar.getClassId().getId());
5052 else
5053 writeD(_activeChar.getBaseClass());
5054
5055- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
5056- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
5057- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
5058- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
5059- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
5060- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
5061- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
5062- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
5063- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
5064- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
5065- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
5066- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
5067+ if (_inSpecialEvent)
5068+ {
5069+ writeD(0);
5070+ writeD(0);
5071+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
5072+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
5073+ writeD(0);
5074+ writeD(6408);
5075+ writeD(0);
5076+ writeD(0);
5077+ writeD(0);
5078+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
5079+ writeD(0);
5080+ writeD(0);
5081+ }
5082+ else
5083+ {
5084+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
5085+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
5086+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
5087+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
5088+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
5089+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
5090+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
5091+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
5092+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
5093+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
5094+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
5095+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
5096+ }
5097
5098 // c6 new h's
5099 writeH(0x00);
5100@@ -138,6 +171,11 @@
5101 writeF(NpcTable.getInstance().getTemplate(_activeChar.getMountNpcId()).getCollisionRadius());
5102 writeF(NpcTable.getInstance().getTemplate(_activeChar.getMountNpcId()).getCollisionHeight());
5103 }
5104+ else if (_inSpecialEvent)
5105+ {
5106+ writeF(9);
5107+ writeF(18);
5108+ }
5109 else
5110 {
5111 writeF(_activeChar.getBaseTemplate().getCollisionRadius());
5112@@ -150,13 +188,25 @@
5113
5114 if (gmSeeInvis)
5115 writeS("Invisible");
5116+ else if (_inSpecialEvent)
5117+ writeS("");
5118 else
5119 writeS(_activeChar.getTitle());
5120
5121- writeD(_activeChar.getClanId());
5122- writeD(_activeChar.getClanCrestId());
5123- writeD(_activeChar.getAllyId());
5124- writeD(_activeChar.getAllyCrestId());
5125+ if (_inSpecialEvent)
5126+ {
5127+ writeD(0);
5128+ writeD(0);
5129+ writeD(0);
5130+ writeD(0);
5131+ }
5132+ else
5133+ {
5134+ writeD(_activeChar.getClanId());
5135+ writeD(_activeChar.getClanCrestId());
5136+ writeD(_activeChar.getAllyId());
5137+ writeD(_activeChar.getAllyCrestId());
5138+ }
5139
5140 writeD(0);
5141
5142Index: java/net/sf/l2j/gameserver/model/actor/L2Summon.java
5143===================================================================
5144--- java/net/sf/l2j/gameserver/model/actor/L2Summon.java (revision 6)
5145+++ java/net/sf/l2j/gameserver/model/actor/L2Summon.java (working copy)
5146@@ -20,6 +20,7 @@
5147 import net.sf.l2j.gameserver.ai.L2CharacterAI;
5148 import net.sf.l2j.gameserver.ai.L2SummonAI;
5149 import net.sf.l2j.gameserver.datatables.ItemTable;
5150+import net.sf.l2j.gameserver.event.EventManager;
5151 import net.sf.l2j.gameserver.handler.IItemHandler;
5152 import net.sf.l2j.gameserver.handler.ItemHandler;
5153 import net.sf.l2j.gameserver.model.L2ItemInstance;
5154@@ -97,8 +98,12 @@
5155 _showSummonAnimation = true;
5156 _owner = owner;
5157 _ai = new L2SummonAI(new L2Summon.AIAccessor());
5158+
5159+ setXYZInvisible(owner.getX() + 50, owner.getY() + 100, owner.getZ() + 100);
5160
5161- setXYZInvisible(owner.getX() + 50, owner.getY() + 100, owner.getZ() + 100);
5162+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(owner))
5163+ for (L2Skill skill : EventManager.getInstance().getCurrentEvent().getSummonBuffs(owner))
5164+ skill.getEffects(owner, this);
5165 }
5166
5167 @Override
5168Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
5169===================================================================
5170--- java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java (revision 6)
5171+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java (working copy)
5172@@ -16,6 +16,7 @@
5173
5174 import net.sf.l2j.Config;
5175 import net.sf.l2j.gameserver.SevenSignsFestival;
5176+import net.sf.l2j.gameserver.event.EventManager;
5177 import net.sf.l2j.gameserver.model.L2Party;
5178 import net.sf.l2j.gameserver.model.actor.L2Character;
5179 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
5180@@ -78,6 +79,13 @@
5181 return;
5182 }
5183
5184+ if (EventManager.getInstance().isRegistered(player))
5185+ {
5186+ player.sendMessage("You cannot restart while you are a participant of an event.");
5187+ sendPacket(RestartResponse.valueOf(false));
5188+ return;
5189+ }
5190+
5191 // Prevent player from restarting if they are a festival participant and it is in progress,
5192 // otherwise notify party members that the player is not longer a participant.
5193 if (player.isFestivalParticipant())
5194Index: java/net/sf/l2j/gameserver/templates/skills/L2SkillType.java
5195===================================================================
5196--- java/net/sf/l2j/gameserver/templates/skills/L2SkillType.java (revision 6)
5197+++ java/net/sf/l2j/gameserver/templates/skills/L2SkillType.java (working copy)
5198@@ -161,6 +161,10 @@
5199 // Skill is done within the core.
5200 COREDONE,
5201
5202+ /// Event
5203+ BOMB,
5204+ CAPTURE,
5205+
5206 // unimplemented
5207 NOTDONE;
5208
5209\ No newline at end of file
5210Index: java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java
5211===================================================================
5212--- java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (revision 6)
5213+++ java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (working copy)
5214@@ -35,6 +35,7 @@
5215 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminEditNpc;
5216 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminEffects;
5217 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminEnchant;
5218+import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminEvents;
5219 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminExpSp;
5220 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminGeodata;
5221 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminGm;
5222@@ -129,6 +130,7 @@
5223 registerAdminCommandHandler(new AdminTeleport());
5224 registerAdminCommandHandler(new AdminUnblockIp());
5225 registerAdminCommandHandler(new AdminZone());
5226+ registerAdminCommandHandler(new AdminEvents());
5227 }
5228
5229 public void registerAdminCommandHandler(IAdminCommandHandler handler)
5230
5231Index: java/net/sf/l2j/gameserver/event/EventTeam.java
5232===================================================================
5233--- java/net/sf/l2j/gameserver/event/EventTeam.java (revision 0)
5234+++ java/net/sf/l2j/gameserver/event/EventTeam.java (revision 0)
5235@@ -0,0 +1,89 @@
5236+/*
5237+ * This program is free software: you can redistribute it and/or modify it under
5238+ * the terms of the GNU General Public License as published by the Free Software
5239+ * Foundation, either version 3 of the License, or (at your option) any later
5240+ * version.
5241+ *
5242+ * This program is distributed in the hope that it will be useful, but WITHOUT
5243+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
5244+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
5245+ * details.
5246+ *
5247+ * You should have received a copy of the GNU General Public License along with
5248+ * this program. If not, see <http://www.gnu.org/licenses/>.
5249+ */
5250+package net.sf.l2j.gameserver.event;
5251+
5252+public class EventTeam implements Comparable<EventTeam>
5253+{
5254+ private int score;
5255+ private String name;
5256+ private int[] nameColor;
5257+ private int[] startPos;
5258+ private int id;
5259+
5260+ public EventTeam(int id, String name, int[] color, int[] startPos)
5261+ {
5262+ this.id = id;
5263+ this.name = name;
5264+ this.startPos = startPos;
5265+ score = 0;
5266+ nameColor = color;
5267+ }
5268+
5269+ @Override
5270+ public int compareTo(EventTeam second)
5271+ {
5272+ if (getScore() > second.getScore())
5273+ return 1;
5274+ else if (getScore() < second.getScore())
5275+ return -1;
5276+
5277+ return 0;
5278+ }
5279+
5280+ protected String getHexaColor()
5281+ {
5282+ return (nameColor[0] > 15 ? Integer.toHexString(nameColor[0]) : "0" + Integer.toHexString(nameColor[0])) + (nameColor[1] > 15 ? Integer.toHexString(nameColor[1]) : "0" + Integer.toHexString(nameColor[1])) + (nameColor[2] > 15 ? Integer.toHexString(nameColor[2]) : "0" + Integer.toHexString(nameColor[2]));
5283+ }
5284+
5285+ protected int getId()
5286+ {
5287+ return id;
5288+ }
5289+
5290+ protected String getName()
5291+ {
5292+ return name;
5293+ }
5294+
5295+ protected int getScore()
5296+ {
5297+ return score;
5298+ }
5299+
5300+ protected int[] getTeamColor()
5301+ {
5302+ return nameColor;
5303+ }
5304+
5305+ protected int[] getTeamPos()
5306+ {
5307+ return startPos;
5308+ }
5309+
5310+ protected void increaseScore()
5311+ {
5312+ score++;
5313+ }
5314+
5315+ protected void increaseScore(int ammount)
5316+ {
5317+ score += ammount;
5318+ }
5319+
5320+ protected void setScore(int ammount)
5321+ {
5322+ score = ammount;
5323+ }
5324+}
5325\ No newline at end of file
5326Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
5327===================================================================
5328--- java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (revision 6)
5329+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (working copy)
5330@@ -20,6 +20,10 @@
5331 import net.sf.l2j.Config;
5332 import net.sf.l2j.gameserver.communitybbs.CommunityBoard;
5333 import net.sf.l2j.gameserver.datatables.AdminCommandAccessRights;
5334+import net.sf.l2j.gameserver.datatables.ItemTable;
5335+import net.sf.l2j.gameserver.event.EventBuffer;
5336+import net.sf.l2j.gameserver.event.EventManager;
5337+import net.sf.l2j.gameserver.event.EventStats;
5338 import net.sf.l2j.gameserver.handler.AdminCommandHandler;
5339 import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
5340 import net.sf.l2j.gameserver.model.L2Object;
5341@@ -91,6 +95,18 @@
5342
5343 ach.useAdminCommand(_command, activeChar);
5344 }
5345+ else if (_command.startsWith("event_vote"))
5346+ {
5347+ EventManager.getInstance().addVote(activeChar, Integer.parseInt(_command.substring(11)));
5348+ }
5349+ else if (_command.equals("event_register"))
5350+ {
5351+ EventManager.getInstance().registerPlayer(activeChar);
5352+ }
5353+ else if (_command.equals("event_unregister"))
5354+ {
5355+ EventManager.getInstance().unregisterPlayer(activeChar);
5356+ }
5357 else if (_command.startsWith("player_help "))
5358 {
5359 playerHelp(activeChar, _command.substring(12));
5360@@ -142,6 +158,51 @@
5361 else
5362 activeChar.processQuestEvent(str[0], str[1]);
5363 }
5364+ else if (_command.startsWith("eventvote "))
5365+ {
5366+ EventManager.getInstance().addVote(activeChar, Integer.parseInt(_command.substring(10)));
5367+ }
5368+ else if (_command.startsWith("eventstats "))
5369+ {
5370+ try
5371+ {
5372+ EventStats.getInstance().showHtml(Integer.parseInt(_command.substring(11)),activeChar);
5373+ }
5374+ catch (Exception e)
5375+ {
5376+ activeChar.sendMessage("Currently there are no statistics to show.");
5377+ }
5378+ }
5379+ else if (_command.startsWith("eventstats_show "))
5380+ {
5381+ EventStats.getInstance().showPlayerStats(Integer.parseInt(_command.substring(16)),activeChar);
5382+ }
5383+ else if (_command.equals("eventbuffershow"))
5384+ {
5385+ EventBuffer.getInstance().showHtml(activeChar);
5386+ }
5387+ else if (_command.startsWith("eventbuffer "))
5388+ {
5389+ EventBuffer.getInstance().changeList(activeChar, Integer.parseInt(_command.substring(12,_command.length()-2)), (Integer.parseInt(_command.substring(_command.length()-1)) == 0 ? false : true));
5390+ EventBuffer.getInstance().showHtml(activeChar);
5391+ }
5392+ else if (_command.startsWith("eventinfo "))
5393+ {
5394+ int eventId = Integer.valueOf(_command.substring(10));
5395+
5396+ NpcHtmlMessage html = new NpcHtmlMessage(0);
5397+ html.setFile("data/html/eventinfo/" + eventId + ".htm");
5398+ html.replace("%amount%", String.valueOf(EventManager.getInstance().getInt(eventId, "rewardAmmount")));
5399+ html.replace("%item%", ItemTable.getInstance().createDummyItem(EventManager.getInstance().getInt(eventId, "rewardId")).getItemName());
5400+ html.replace("%minlvl%", String.valueOf(EventManager.getInstance().getInt(eventId, "minLvl")));
5401+ html.replace("%maxlvl%", String.valueOf(EventManager.getInstance().getInt(eventId, "maxLvl")));
5402+ html.replace("%time%", String.valueOf(EventManager.getInstance().getInt(eventId, "matchTime") / 60));
5403+ html.replace("%players%", String.valueOf(EventManager.getInstance().getInt(eventId, "minPlayers")));
5404+ html.replace("%url%", EventManager.getInstance().getString("siteUrl"));
5405+ html.replace("%buffs%", EventManager.getInstance().getBoolean(eventId, "removeBuffs") ? "Self" : "Full");
5406+ activeChar.sendPacket(html);
5407+ activeChar.sendPacket(ActionFailed.STATIC_PACKET);
5408+ }
5409 else if (_command.startsWith("_match"))
5410 {
5411 String params = _command.substring(_command.indexOf("?") + 1);
5412@@ -178,6 +239,12 @@
5413 return;
5414 }
5415
5416+ if (EventManager.getInstance().players.contains(activeChar))
5417+ {
5418+ activeChar.sendMessage("You can not observe games while registered for an event!");
5419+ return;
5420+ }
5421+
5422 final int arenaId = Integer.parseInt(_command.substring(12).trim());
5423 final OlympiadGameTask nextArena = OlympiadGameManager.getInstance().getOlympiadTask(arenaId);
5424 if (nextArena != null)
5425
5426\ No newline at end of file
5427Index: java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java
5428===================================================================
5429--- java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java (revision 6)
5430+++ java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java (working copy)
5431@@ -17,6 +17,7 @@
5432 import net.sf.l2j.Config;
5433 import net.sf.l2j.gameserver.GameTimeController;
5434 import net.sf.l2j.gameserver.ThreadPoolManager;
5435+import net.sf.l2j.gameserver.event.EventManager;
5436 import net.sf.l2j.gameserver.handler.IItemHandler;
5437 import net.sf.l2j.gameserver.handler.ItemHandler;
5438 import net.sf.l2j.gameserver.model.L2ItemInstance;
5439@@ -130,6 +131,9 @@
5440 return;
5441 }
5442
5443+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(activeChar) && !EventManager.getInstance().getCurrentEvent().onUseItem(activeChar, item))
5444+ return;
5445+
5446 if (activeChar.isFishing() && (_itemId < 6535 || _itemId > 6540))
5447 {
5448 // You cannot do anything else while fishing
5449Index: java/net/sf/l2j/gameserver/model/actor/instance/L2WeddingManagerInstance.java
5450===================================================================
5451--- java/net/sf/l2j/gameserver/model/actor/instance/L2WeddingManagerInstance.java (revision 6)
5452+++ java/net/sf/l2j/gameserver/model/actor/instance/L2WeddingManagerInstance.java (working copy)
5453@@ -20,6 +20,7 @@
5454 import net.sf.l2j.gameserver.Announcements;
5455 import net.sf.l2j.gameserver.ai.CtrlIntention;
5456 import net.sf.l2j.gameserver.datatables.SkillTable.FrequentSkill;
5457+import net.sf.l2j.gameserver.event.EventManager;
5458 import net.sf.l2j.gameserver.instancemanager.CastleManager;
5459 import net.sf.l2j.gameserver.instancemanager.CoupleManager;
5460 import net.sf.l2j.gameserver.model.L2ItemInstance;
5461@@ -143,7 +144,7 @@
5462 }
5463
5464 // Simple checks to avoid exploits
5465- if (partner.isInJail() || partner.isInOlympiadMode() || partner.isInDuel() || partner.isFestivalParticipant() || (partner.isInParty() && partner.getParty().isInDimensionalRift()) || partner.inObserverMode())
5466+ if (EventManager.getInstance().isRegistered(partner) || partner.isInJail() || partner.isInOlympiadMode() || partner.isInDuel() || partner.isFestivalParticipant() || (partner.isInParty() && partner.getParty().isInDimensionalRift()) || partner.inObserverMode())
5467 {
5468 player.sendMessage("Due to the current partner's status, the teleportation failed.");
5469 return;
5470Index: java/net/sf/l2j/gameserver/model/actor/L2Npc.java
5471===================================================================
5472--- java/net/sf/l2j/gameserver/model/actor/L2Npc.java (revision 6)
5473+++ java/net/sf/l2j/gameserver/model/actor/L2Npc.java (working copy)
5474@@ -33,6 +33,7 @@
5475 import net.sf.l2j.gameserver.datatables.ItemTable;
5476 import net.sf.l2j.gameserver.datatables.SkillTable;
5477 import net.sf.l2j.gameserver.datatables.SkillTable.FrequentSkill;
5478+import net.sf.l2j.gameserver.event.EventManager;
5479 import net.sf.l2j.gameserver.idfactory.IdFactory;
5480 import net.sf.l2j.gameserver.instancemanager.CastleManager;
5481 import net.sf.l2j.gameserver.instancemanager.DimensionalRiftManager;
5482@@ -1483,6 +1484,19 @@
5483 else
5484 filename = getHtmlPath(npcId, val);
5485
5486+ if (npcId == EventManager.getInstance().getInt("managerNpcId"))
5487+ {
5488+ EventManager.getInstance().showFirstHtml(player,getObjectId());
5489+ player.sendPacket(ActionFailed.STATIC_PACKET);
5490+ return;
5491+ }
5492+
5493+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(player) && EventManager.getInstance().getCurrentEvent().onTalkNpc(this, player))
5494+ {
5495+ player.sendPacket(ActionFailed.STATIC_PACKET);
5496+ return;
5497+ }
5498+
5499 // Send a Server->Client NpcHtmlMessage containing the text of the L2Npc to the L2PcInstance
5500 NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
5501 html.setFile(filename);
5502Index: java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/EventJoin.java
5503===================================================================
5504--- java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/EventJoin.java (revision 0)
5505+++ java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/EventJoin.java (revision 0)
5506@@ -0,0 +1,40 @@
5507+/*
5508+ * This program is free software: you can redistribute it and/or modify it under
5509+ * the terms of the GNU General Public License as published by the Free Software
5510+ * Foundation, either version 3 of the License, or (at your option) any later
5511+ * version.
5512+ *
5513+ * This program is distributed in the hope that it will be useful, but WITHOUT
5514+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
5515+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
5516+ * details.
5517+ *
5518+ * You should have received a copy of the GNU General Public License along with
5519+ * this program. If not, see <http://www.gnu.org/licenses/>.
5520+ */
5521+package net.sf.l2j.gameserver.handler.voicedcommandhandlers;
5522+
5523+import net.sf.l2j.gameserver.event.EventManager;
5524+import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
5525+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
5526+
5527+public class EventJoin implements IVoicedCommandHandler
5528+{
5529+ private static final String[] _voicedCommands = { "register","unregister" };
5530+
5531+ @Override
5532+ public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target)
5533+ {
5534+ if (command.equalsIgnoreCase("register"))
5535+ EventManager.getInstance().registerPlayer(activeChar);
5536+ else if (command.equalsIgnoreCase("unregister"))
5537+ EventManager.getInstance().unregisterPlayer(activeChar);
5538+ return true;
5539+ }
5540+
5541+ @Override
5542+ public String[] getVoicedCommandList()
5543+ {
5544+ return _voicedCommands;
5545+ }
5546+}
5547\ No newline at end of file
5548Index: java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
5549===================================================================
5550--- java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java (revision 0)
5551+++ java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java (working copy)
5552@@ -0,0 +1,64 @@
5553+/*
5554+ * This program is free software: you can redistribute it and/or modify it under
5555+ * the terms of the GNU General Public License as published by the Free Software
5556+ * Foundation, either version 3 of the License, or (at your option) any later
5557+ * version.
5558+ *
5559+ * This program is distributed in the hope that it will be useful, but WITHOUT
5560+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
5561+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
5562+ * details.
5563+ *
5564+ * You should have received a copy of the GNU General Public License along with
5565+ * this program. If not, see <http://www.gnu.org/licenses/>.
5566+ */
5567+package net.sf.l2j.gameserver.handler;
5568+
5569+import java.util.HashMap;
5570+import java.util.Map;
5571+
5572+import net.sf.l2j.gameserver.handler.voicedcommandhandlers.EventJoin;
5573+
5574+public class VoicedCommandHandler
5575+{
5576+ private final Map<Integer, IVoicedCommandHandler> _datatable = new HashMap<>();
5577+
5578+ public static VoicedCommandHandler getInstance()
5579+ {
5580+ return SingletonHolder._instance;
5581+ }
5582+
5583+ protected VoicedCommandHandler()
5584+ {
5585+ // coloque aqui os comandos
5586+ registerHandler(new EventJoin());
5587+ }
5588+
5589+ public void registerHandler(IVoicedCommandHandler handler)
5590+ {
5591+ String[] ids = handler.getVoicedCommandList();
5592+
5593+ for (int i = 0; i < ids.length; i++)
5594+ _datatable.put(ids[i].hashCode(), handler);
5595+ }
5596+
5597+ public IVoicedCommandHandler getHandler(String voicedCommand)
5598+ {
5599+ String command = voicedCommand;
5600+
5601+ if (voicedCommand.indexOf(" ") != -1)
5602+ command = voicedCommand.substring(0, voicedCommand.indexOf(" "));
5603+
5604+ return _datatable.get(command.hashCode());
5605+ }
5606+
5607+ public int size()
5608+ {
5609+ return _datatable.size();
5610+ }
5611+
5612+ private static class SingletonHolder
5613+ {
5614+ protected static final VoicedCommandHandler _instance = new VoicedCommandHandler();
5615+ }
5616+}
5617
5618
5619### Eclipse Workspace Patch 1.0
5620#P aCis_datapack
5621Index: tools/database_installer.sh
5622===================================================================
5623--- tools/database_installer.sh (revision 6)
5624+++ tools/database_installer.sh (working copy)
5625@@ -139,6 +139,7 @@
5626 $MYG < ../sql/spawnlist_4s.sql &> /dev/null
5627 $MYG < ../sql/spawnlist.sql &> /dev/null
5628 $MYG < ../sql/topic.sql &> /dev/null
5629+$MYG < ../sql/events.sql &> /dev/null
5630 echo ""
5631 echo "Was fast, isn't it ?"
5632 }
5633Index: data/html/default/9110.htm
5634===================================================================
5635--- data/html/default/9110.htm (revision 0)
5636+++ data/html/default/9110.htm (revision 0)
5637@@ -0,0 +1,3 @@
5638+<html><body>
5639+Use the Capture skill on the base in order to capture it and score for your team!
5640+</body></html>
5641\ No newline at end of file
5642Index: data/html/default/9101.htm
5643===================================================================
5644--- data/html/default/9101.htm (revision 0)
5645+++ data/html/default/9101.htm (revision 0)
5646@@ -0,0 +1,3 @@
5647+<html><body>
5648+Say excactly what i say as soon as possible.
5649+</body></html>
5650\ No newline at end of file
5651Index: data/xml/skills/5200-5299.xml
5652===================================================================
5653--- data/xml/skills/5200-5299.xml (revision 6)
5654+++ data/xml/skills/5200-5299.xml (working copy)
5655@@ -287,41 +287,28 @@
5656 <set name="castRange" val="400" />
5657 <set name="effectRange" val="900" />
5658 </skill>
5659- <skill id="5219" levels="1" name="Huge Pig Stun">
5660- <set name="magicLvl" val="95" />
5661- <set name="lvlDepend" val="1" />
5662- <set name="power" val="50" />
5663- <set name="mpConsume" val="43" />
5664- <set name="target" val="TARGET_AREA" />
5665- <set name="skillRadius" val="200" />
5666- <set name="hitTime" val="6000" />
5667- <set name="coolTime" val="2000" />
5668- <set name="reuseDelay" val="6000" />
5669- <set name="skillType" val="STUN" />
5670- <set name="operateType" val="OP_ACTIVE" />
5671- <set name="isDebuff" val="true" />
5672- <set name="castRange" val="600" />
5673- <set name="effectRange" val="1100" />
5674- <for>
5675- <effect name="Stun" time="9" val="0" stackOrder="1" stackType="stun" />
5676- </for>
5677- </skill>
5678- <skill id="5220" levels="1" name="Huge Pig Fear">
5679- <set name="magicLvl" val="95" />
5680- <set name="mpConsume" val="43" />
5681- <set name="power" val="50" />
5682- <set name="target" val="TARGET_AREA" />
5683- <set name="skillRadius" val="200" />
5684- <set name="reuseDelay" val="6000" />
5685- <set name="hitTime" val="6000" />
5686- <set name="skillType" val="FEAR" />
5687- <set name="coolTime" val="2000" />
5688- <set name="isDebuff" val="true" />
5689- <set name="operateType" val="OP_ACTIVE" />
5690- <set name="castRange" val="600" />
5691- <set name="effectRange" val="1100" />
5692- <for>
5693- <effect count="5" name="Fear" time="6" val="0" stackOrder="1" stackType="turn_flee" />
5694- </for>
5695- </skill>
5696+ <skill id="5219" levels="1" name="Capture">
5697+ <set name="mpInitialConsume" val="50" />
5698+ <set name="target" val="TARGET_ONE" />
5699+ <set name="reuseDelay" val="10000" />
5700+ <set name="hitTime" val="5000" />
5701+ <set name="staticReuse" val="true" />
5702+ <set name="staticHitTime" val="true" />
5703+ <set name="skillType" val="CAPTURE" />
5704+ <set name="operateType" val="OP_ACTIVE" />
5705+ <set name="castRange" val="85" />
5706+ <set name="effectRange" val="400" />
5707+ </skill>
5708 </list>
5709\ No newline at end of file
5710Index: data/html/default/9103.htm
5711===================================================================
5712--- data/html/default/9103.htm (revision 0)
5713+++ data/html/default/9103.htm (revision 0)
5714@@ -0,0 +1,3 @@
5715+<html><body>
5716+The team with more players near the zone gets scored.
5717+</body></html>
5718\ No newline at end of file
5719Index: sql/events.sql
5720===================================================================
5721--- sql/events.sql (revision 0)
5722+++ sql/events.sql (revision 0)
5723@@ -0,0 +1,32 @@
5724+CREATE TABLE IF NOT EXISTS `event_stats` (
5725+ `id` int(11) NOT NULL AUTO_INCREMENT,
5726+ `player` int(11) NOT NULL,
5727+ `event` int(2) NOT NULL,
5728+ `num` int(11) NOT NULL,
5729+ `wins` int(11) NOT NULL,
5730+ `losses` int(11) NOT NULL,
5731+ `kills` int(11) NOT NULL,
5732+ `deaths` int(11) NOT NULL,
5733+ `scores` int(11) NOT NULL,
5734+ PRIMARY KEY (`id`)
5735+) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
5736+
5737+CREATE TABLE IF NOT EXISTS `event_stats_full` (
5738+ `id` int(11) NOT NULL AUTO_INCREMENT,
5739+ `player` int(11) NOT NULL,
5740+ `num` int(11) NOT NULL,
5741+ `winpercent` int(11) NOT NULL,
5742+ `kdratio` double NOT NULL,
5743+ `wins` int(11) NOT NULL,
5744+ `losses` int(11) NOT NULL,
5745+ `kills` int(11) NOT NULL,
5746+ `deaths` int(11) NOT NULL,
5747+ `favevent` int(11) NOT NULL,
5748+ PRIMARY KEY (`id`)
5749+) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
5750+
5751+CREATE TABLE IF NOT EXISTS `event_buffs` (
5752+ `player` varchar(30) NOT NULL,
5753+ `buffs` varchar(200) NOT NULL,
5754+ PRIMARY KEY (`player`)
5755+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
5756\ No newline at end of file
5757Index: data/xml/admin_commands_rights.xml
5758===================================================================
5759--- data/xml/admin_commands_rights.xml (revision 6)
5760+++ data/xml/admin_commands_rights.xml (working copy)
5761@@ -14,6 +14,19 @@
5762 <aCar name="admin_tradeoff" accessLevel="1" />
5763 <aCar name="admin_reload" accessLevel="1" />
5764 <aCar name="admin_script_load" accessLevel="1" />
5765+
5766+ <!-- EVENTS -->
5767+ <aCar name="admin_events" accessLevel="1" />
5768+ <aCar name="admin_enableEvent" accessLevel="1" />
5769+ <aCar name="admin_configureEvent" accessLevel="1" />
5770+ <aCar name="admin_event_set" accessLevel="1" />
5771+ <aCar name="admin_event_finish" accessLevel="1" />
5772+ <aCar name="admin_event_start" accessLevel="1" />
5773+
5774 <!-- ANNOUNCEMENTS -->
5775 <aCar name="admin_list_announcements" accessLevel="1" />
5776Index: tools/database_installer.bat
5777===================================================================
5778--- tools/database_installer.bat (revision 6)
5779+++ tools/database_installer.bat (working copy)
5780@@ -96,6 +96,7 @@
5781 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/itemsonground.sql
5782 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/mods_wedding.sql
5783 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/olympiad_data.sql
5784+%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/events.sql
5785 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/olympiad_fights.sql
5786 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/olympiad_nobles_eom.sql
5787 %mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/olympiad_nobles.sql
5788Index: data/xml/skills/9000-9099.xml
5789===================================================================
5790--- data/xml/skills/9000-9099.xml (revision 0)
5791+++ data/xml/skills/9000-9099.xml (revision 0)
5792@@ -0,0 +1,27 @@
5793+ <?xml version='1.0' encoding='utf-8'?>
5794+ <list>
5795+ <skill id="9007" levels="1" name="Mutant">
5796+ <set name="target" val="TARGET_SELF" />
5797+ <set name="skillType" val="BUFF" />
5798+ <set name="operateType" val="OP_PASSIVE" />
5799+ <for>
5800+ <mul order="0x30" stat="pDef" val="5" />
5801+ <mul order="0x30" stat="mDef" val="5" />
5802+ <mul order="0x30" stat="mAtk" val="3" />
5803+ <mul order="0x30" stat="pAtk" val="3" />
5804+ <mul order="0x30" stat="mAtkSpd" val="2" />
5805+ <mul order="0x30" stat="pAtkSpd" val="2" />
5806+ <mul order="0x30" stat="rootVuln" val="0.7"/>
5807+ <mul order="0x30" stat="stunVuln" val="0.7"/>
5808+ <mul order="0x30" stat="paralyzeVuln" val="0.7"/>
5809+ </for>
5810+ </skill>
5811+ <skill id="9008" levels="1" name="Zombie">
5812+ <set name="target" val="TARGET_SELF" />
5813+ <set name="skillType" val="BUFF" />
5814+ <set name="operateType" val="OP_PASSIVE" />
5815+ <for>
5816+ <add order="0x40" stat="runSpd" val="150"/>
5817+ </for>
5818+ </skill>
5819+</list>
5820\ No newline at end of file
5821Index: data/xml/items/9900-9999.xml
5822===================================================================
5823--- data/xml/items/9900-9999.xml (revision 0)
5824+++ data/xml/items/9900-9999.xml (revision 0)
5825@@ -0,0 +1,28 @@
5826+<?xml version="1.0" encoding="UTF-8"?>
5827+<list>
5828+ <item id="9999" type="Weapon" name="Anti Zombie Bow">
5829+ <set name="default_action" val="equip" />
5830+ <set name="weapon_type" val="bow" />
5831+ <set name="bodypart" val="lrhand" />
5832+ <set name="random_damage" val="5" />
5833+ <set name="attack_range" val="500" />
5834+ <set name="damage_range" val="0;0;10;0" />
5835+ <set name="material" val="steel" />
5836+ <set name="weight" val="1880" />
5837+ <set name="soulshots" val="7" />
5838+ <set name="spiritshots" val="2" />
5839+ <set name="mp_consume" val="3" />
5840+ <set name="reuse_delay" val="1500" />
5841+ <set name="is_tradable" val="false" />
5842+ <set name="is_dropable" val="false" />
5843+ <set name="is_destroyable" val="false" />
5844+ <set name="is_sellable" val="false" />
5845+ <for>
5846+ <set order="0x08" stat="pAtk" val="64" />
5847+ <set order="0x08" stat="mAtk" val="21" />
5848+ <set order="0x08" stat="rCrit" val="12" />
5849+ <sub order="0x10" stat="accCombat" val="3" />
5850+ <set order="0x08" stat="pAtkSpd" val="293" />
5851+ </for>
5852+ </item>
5853+</list>
5854\ No newline at end of file