· 6 years ago · Jan 21, 2020, 02:41 AM
1### Eclipse Workspace Patch 1.0
2#P L2jFrozen_GameServer
3Index: head-src/com/l2jfrozen/gameserver/event/FormalLMS.java
4===================================================================
5--- head-src/com/l2jfrozen/gameserver/event/FormalLMS.java (nonexistent)
6+++ head-src/com/l2jfrozen/gameserver/event/FormalLMS.java (working copy)
7@@ -0,0 +1,54 @@
8+/*
9+ * This program is free software; you can redistribute it and/or modify
10+ * it under the terms of the GNU General Public License as published by
11+ * the Free Software Foundation; either version 2, or (at your option)
12+ * any later version.
13+ *
14+ * This program is distributed in the hope that it will be useful,
15+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+ * GNU General Public License for more details.
18+ *
19+ * You should have received a copy of the GNU General Public License
20+ * along with this program; if not, write to the Free Software
21+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22+ * 02111-1307, USA.
23+ *
24+ * http://www.gnu.org/copyleft/gpl.html
25+ */
26+package com.l2jfrozen.gameserver.event;
27+
28+
29+import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
30+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
31+
32+/**
33+ *
34+ *
35+ * @author Rizel
36+ */
37+public class FormalLMS
38+{
39+ private L2ItemInstance formalWear;
40+
41+ @SuppressWarnings("synthetic-access")
42+ private static class SingletonHolder
43+ {
44+ protected static final FormalLMS _instance = new FormalLMS();
45+ }
46+
47+ public static FormalLMS getInstance()
48+ {
49+ return SingletonHolder._instance;
50+ }
51+
52+ public FormalLMS()
53+ {
54+ formalWear = ItemTable.getInstance().createItem("", 6408, 1, null, null);
55+ }
56+
57+ public int getOID()
58+ {
59+ return formalWear.getObjectId();
60+ }
61+}
62Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/Logout.java
63===================================================================
64--- head-src/com/l2jfrozen/gameserver/network/clientpackets/Logout.java (revision 1132)
65+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/Logout.java (working copy)
66@@ -21,6 +21,7 @@
67 import com.l2jfrozen.Config;
68 import com.l2jfrozen.gameserver.communitybbs.Manager.RegionBBSManager;
69 import com.l2jfrozen.gameserver.datatables.SkillTable;
70+import com.l2jfrozen.gameserver.event.EventManager;
71 import com.l2jfrozen.gameserver.model.L2Character;
72 import com.l2jfrozen.gameserver.model.L2Party;
73 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
74@@ -96,6 +97,13 @@
75 return;
76 }
77
78+ if (EventManager.getInstance().isRegistered(player) && !EventManager.getInstance().getBoolean("restartAllowed"))
79+ {
80+ player.sendMessage("You cannot logout while you are a participant in an event.");
81+ sendPacket(new ActionFailed());
82+ return;
83+ }
84+
85 if (player.isInOlympiadMode() || Olympiad.getInstance().isRegistered(player))
86 {
87 player.sendMessage("You can't Logout in Olympiad mode.");
88Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/UseItem.java
89===================================================================
90--- head-src/com/l2jfrozen/gameserver/network/clientpackets/UseItem.java (revision 1132)
91+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/UseItem.java (working copy)
92@@ -25,6 +25,7 @@
93 import org.apache.log4j.Logger;
94
95 import com.l2jfrozen.Config;
96+import com.l2jfrozen.gameserver.event.EventManager;
97 import com.l2jfrozen.gameserver.ai.CtrlIntention;
98 import com.l2jfrozen.gameserver.datatables.SkillTable;
99 import com.l2jfrozen.gameserver.handler.IItemHandler;
100@@ -175,6 +176,9 @@
101 activeChar.sendMessage("Blessed Scroll of Escape: Castle cannot be used due to unsuitable terms.");
102 return;
103 }
104+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(activeChar))
105+ if (!EventManager.getInstance().getCurrentEvent().onUseItem(activeChar,item))
106+ return;
107
108 if (activeChar.isFishing() && (itemId < 6535 || itemId > 6540))
109 {
110Index: head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java
111===================================================================
112--- head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java (nonexistent)
113+++ head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java (working copy)
114@@ -0,0 +1,280 @@
115+/*
116+ * This program is free software: you can redistribute it and/or modify it under
117+ * the terms of the GNU General Public License as published by the Free Software
118+ * Foundation, either version 3 of the License, or (at your option) any later
119+ * version.
120+ *
121+ * This program is distributed in the hope that it will be useful, but WITHOUT
122+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
123+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
124+ * details.
125+ *
126+ * You should have received a copy of the GNU General Public License along with
127+ * this program. If not, see <http://www.gnu.org/licenses/>.
128+ */
129+package com.l2jfrozen.gameserver.event;
130+
131+import javolution.text.TextBuilder;
132+import javolution.util.FastMap;
133+
134+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
135+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
136+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
137+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
138+
139+/**
140+ * @author Rizel
141+ *
142+ */
143+public class DoubleDomination extends Event
144+{
145+ private class Core implements Runnable
146+ {
147+ public void run()
148+ {
149+ try
150+ {
151+ switch (eventState)
152+ {
153+ case START:
154+ divideIntoTeams(2);
155+ preparePlayers();
156+ teleportToTeamPos();
157+ createPartyOfTeam(1);
158+ createPartyOfTeam(2);
159+ forceSitAll();
160+ setStatus(EventState.FIGHT);
161+ debug("The event started with " + players.size() + " players");
162+ schedule(20000);
163+ break;
164+
165+ case FIGHT:
166+ forceStandAll();
167+ setStatus(EventState.END);
168+ debug("The fight started");
169+ clock.startClock(getInt("matchTime"));
170+ break;
171+
172+ case END:
173+ clock.setTime(0);
174+ if (winnerTeam == 0)
175+ winnerTeam = getWinnerTeam();
176+
177+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
178+ unSpawnZones();
179+ setStatus(EventState.INACTIVE);
180+ debug("The event ended. Winner: " + winnerTeam);
181+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Domination points!");
182+ break;
183+ }
184+ }
185+ catch (Throwable e)
186+ {
187+ e.printStackTrace();
188+ EventManager.getInstance().end("Error! Event ended.");
189+ }
190+ }
191+ }
192+
193+ private enum EventState
194+ {
195+ START, FIGHT, END, INACTIVE
196+ }
197+
198+ private EventState eventState;
199+
200+ private Core task;
201+
202+ private FastMap<L2Spawn, Integer> zones;
203+
204+ private int time;
205+
206+ private int holder;
207+
208+ public DoubleDomination()
209+ {
210+ super();
211+ eventId = 3;
212+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
213+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
214+ task = new Core();
215+ zones = new FastMap<L2Spawn, Integer>();
216+ winnerTeam = 0;
217+ time = 0;
218+ holder = 0;
219+ }
220+
221+ @Override
222+ protected void clockTick()
223+ {
224+ int team1 = 0;
225+ int team2 = 0;
226+
227+ for (L2Spawn zone : zones.keySet())
228+ {
229+ for (L2PcInstance player : getPlayerList())
230+ switch (getTeam(player))
231+ {
232+ case 1:
233+ if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn())) <= getInt("zoneRadius"))
234+ team1++;
235+ break;
236+
237+ case 2:
238+ if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn())) <= getInt("zoneRadius"))
239+ team2++;
240+ break;
241+ }
242+
243+ if (team1 > team2)
244+ zones.getEntry(zone).setValue(1);
245+
246+ if (team2 > team1)
247+ zones.getEntry(zone).setValue(2);
248+
249+ if (team1 == team2)
250+ zones.getEntry(zone).setValue(0);
251+
252+ team1 = 0;
253+ team2 = 0;
254+ }
255+
256+ if (zones.containsValue(1) && (!zones.containsValue(0) && !zones.containsValue(2)))
257+ {
258+ if (holder != 1)
259+ {
260+ announce(getPlayerList(), "The " + teams.get(1).getName() + " team captured both zones. Score in 10sec!");
261+ holder = 1;
262+ time = 0;
263+ }
264+
265+ if (time == getInt("timeToScore") - 1)
266+ {
267+ for (L2PcInstance player : getPlayersOfTeam(1))
268+ increasePlayersScore(player);
269+ teams.get(1).increaseScore();
270+ teleportToTeamPos();
271+ time = 0;
272+ announce(getPlayerList(), "The " + teams.get(1).getName() + " team scored!");
273+ holder = 0;
274+ }
275+ else
276+ time++;
277+
278+ }
279+ else if (zones.containsValue(2) && (!zones.containsValue(0) && !zones.containsValue(1)))
280+ {
281+ if (holder != 2)
282+ {
283+ announce(getPlayerList(), "The " + teams.get(2).getName() + " team captured both zones. Score in 10sec!");
284+ holder = 1;
285+ time = 0;
286+ }
287+
288+ if (time == getInt("timeToScore") - 1)
289+ {
290+ for (L2PcInstance player : getPlayersOfTeam(2))
291+ increasePlayersScore(player);
292+ teams.get(2).increaseScore();
293+ teleportToTeamPos();
294+ time = 0;
295+ announce(getPlayerList(), "The " + teams.get(2).getName() + " team scored!");
296+ holder = 0;
297+ }
298+ else
299+ time++;
300+ }
301+ else
302+ {
303+ if (holder != 0)
304+ announce(getPlayerList(), "Canceled!");
305+
306+ holder = 0;
307+ time = 0;
308+ }
309+
310+ }
311+
312+ /**
313+ * @see net.sf.l2j.gameserver.event.Event#endEvent()
314+ */
315+ @Override
316+ protected void endEvent()
317+ {
318+ setStatus(EventState.END);
319+ clock.setTime(0);
320+
321+ }
322+
323+ @Override
324+ protected String getScorebar()
325+ {
326+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
327+ }
328+
329+ @Override
330+ public void onDie(L2PcInstance victim, L2PcInstance killer)
331+ {
332+ super.onDie(victim, killer);
333+ addToResurrector(victim);
334+ }
335+
336+ @Override
337+ protected void schedule(int time)
338+ {
339+ tpm.scheduleGeneral(task, time);
340+ }
341+
342+ private void setStatus(EventState s)
343+ {
344+ eventState = s;
345+ }
346+
347+ @Override
348+ protected void showHtml(L2PcInstance player, int obj)
349+ {
350+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
351+ TextBuilder sb = new TextBuilder();
352+
353+ 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>");
354+ sb.append("<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>");
355+ sb.append("<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>");
356+ sb.append("<br><table width=270>");
357+ int i = 0;
358+ for (EventTeam team : teams.values())
359+ {
360+ i++;
361+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
362+ for (L2PcInstance p : getPlayersOfTeam(i))
363+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
364+ }
365+
366+ sb.append("</table></body></html>");
367+ html.setHtml(sb.toString());
368+ player.sendPacket(html);
369+
370+ }
371+
372+ @Override
373+ protected void start()
374+ {
375+ int[] z1pos = getPosition("Zone", 1);
376+ int[] z2pos = getPosition("Zone", 2);
377+ zones.put(spawnNPC(z1pos[0], z1pos[1], z1pos[2], getInt("zoneNpcId")), 0);
378+ zones.put(spawnNPC(z2pos[0], z2pos[1], z2pos[2], getInt("zoneNpcId")), 0);
379+ setStatus(EventState.START);
380+ schedule(1);
381+ }
382+
383+ private void unSpawnZones()
384+ {
385+ for (L2Spawn s : zones.keySet())
386+ {
387+ s.getLastSpawn().deleteMe();
388+ s.stopRespawn();
389+ SpawnTable.getInstance().deleteSpawn(s, true);
390+ zones.remove(s);
391+ }
392+ }
393+
394+}
395\ No newline at end of file
396Index: head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Capture.java
397===================================================================
398--- head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Capture.java (nonexistent)
399+++ head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Capture.java (working copy)
400@@ -0,0 +1,35 @@
401+package com.l2jfrozen.gameserver.handler.skillhandlers;
402+
403+import com.l2jfrozen.gameserver.handler.ISkillHandler;
404+import com.l2jfrozen.gameserver.model.L2Object;
405+import com.l2jfrozen.gameserver.model.L2Skill;
406+import com.l2jfrozen.gameserver.model.L2Character;
407+import com.l2jfrozen.gameserver.model.L2Skill.SkillType;
408+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
409+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
410+import com.l2jfrozen.gameserver.event.EventManager;
411+
412+public class Capture implements ISkillHandler
413+{
414+private static final SkillType[] SKILL_IDS =
415+{ SkillType.CAPTURE };
416+
417+public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
418+{
419+if (!(activeChar instanceof L2PcInstance))
420+return;
421+
422+if(!(targets[0] instanceof L2NpcInstance))
423+return;
424+
425+L2PcInstance player = (L2PcInstance) activeChar;
426+L2NpcInstance target = (L2NpcInstance) targets[0];
427+
428+EventManager.getInstance().getCurrentEvent().useCapture(player, target);
429+}
430+
431+public SkillType[] getSkillIds()
432+{
433+return SKILL_IDS;
434+}
435+}
436\ No newline at end of file
437Index: head-src/com/l2jfrozen/gameserver/event/CTF.java
438===================================================================
439--- head-src/com/l2jfrozen/gameserver/event/CTF.java (nonexistent)
440+++ head-src/com/l2jfrozen/gameserver/event/CTF.java (working copy)
441@@ -0,0 +1,401 @@
442+package com.l2jfrozen.gameserver.event;
443+
444+import javolution.text.TextBuilder;
445+
446+import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
447+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
448+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
449+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
450+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
451+import com.l2jfrozen.gameserver.model.Inventory;
452+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
453+import com.l2jfrozen.gameserver.network.serverpackets.InventoryUpdate;
454+import com.l2jfrozen.gameserver.network.serverpackets.ItemList;
455+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
456+import com.l2jfrozen.gameserver.network.serverpackets.SocialAction;
457+import com.l2jfrozen.gameserver.templates.L2EtcItemType;
458+
459+public class CTF extends Event
460+{
461+ private class Core implements Runnable
462+ {
463+
464+ public void run()
465+ {
466+ try
467+ {
468+ switch (eventState)
469+ {
470+ case START:
471+ divideIntoTeams(2);
472+ preparePlayers();
473+ teleportToTeamPos();
474+ createPartyOfTeam(1);
475+ createPartyOfTeam(2);
476+ forceSitAll();
477+ spawnFlagsAndHolders();
478+ setStatus(EventState.FIGHT);
479+ debug("The event started with " + players.size() + " players");
480+ schedule(20000);
481+ break;
482+
483+ case FIGHT:
484+ forceStandAll();
485+ setStatus(EventState.END);
486+ debug("The fight started");
487+ clock.startClock(getInt("matchTime"));
488+ break;
489+
490+ case END:
491+ clock.setTime(0);
492+ if (winnerTeam == 0)
493+ winnerTeam = getWinnerTeam();
494+
495+ unspawnFlagsAndHolders();
496+ debug("The flags unspawned");
497+ if (playerWithRedFlag != null)
498+ unequipFlag(playerWithRedFlag);
499+ if (playerWithBlueFlag != null)
500+ unequipFlag(playerWithBlueFlag);
501+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
502+ setStatus(EventState.INACTIVE);
503+ debug("The event ended. Winner: " + winnerTeam);
504+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Flags taken!");
505+ break;
506+ }
507+ }
508+ catch (Throwable e)
509+ {
510+ e.printStackTrace();
511+ EventManager.getInstance().end("Error! Event ended.");
512+ }
513+ }
514+ }
515+
516+ private enum EventState
517+ {
518+ START, FIGHT, END, TELEPORT, INACTIVE
519+ }
520+
521+ private EventState eventState;
522+
523+ private Core task;
524+
525+ private L2Spawn redFlagNpc;
526+ private L2Spawn blueFlagNpc;
527+ private L2Spawn redHolderNpc;
528+ private L2Spawn blueHolderNpc;
529+ private int redFlagStatus;
530+ private int blueFlagStatus;
531+ private L2PcInstance playerWithRedFlag;
532+ private L2PcInstance playerWithBlueFlag;
533+
534+ public CTF()
535+ {
536+ super();
537+ eventId = 10;
538+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
539+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
540+ task = new Core();
541+ winnerTeam = 0;
542+ playerWithRedFlag = null;
543+ playerWithBlueFlag = null;
544+ blueFlagStatus = 0;
545+ redFlagStatus = 0;
546+
547+ }
548+
549+ @Override
550+ protected void endEvent()
551+ {
552+ winnerTeam = players.head().getNext().getValue()[0];
553+
554+ setStatus(EventState.END);
555+ clock.setTime(0);
556+
557+ }
558+
559+ private void equipFlag(L2PcInstance player, int flag)
560+ {
561+ L2ItemInstance wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
562+ if (wpn != null)
563+ player.getInventory().unEquipItemInBodySlotAndRecord(Inventory.PAPERDOLL_RHAND);
564+
565+ wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
566+ if (wpn != null)
567+ player.getInventory().unEquipItemInBodySlotAndRecord(Inventory.PAPERDOLL_LHAND);
568+
569+ player.getInventory().equipItem(ItemTable.getInstance().createItem("", 6718, 1, player, null));
570+ player.broadcastPacket(new SocialAction(player.getObjectId(), 16));
571+ switch (flag)
572+ {
573+ case 1:
574+ playerWithBlueFlag = player;
575+ announce(getPlayerList(), player.getName() + " took the Blue flag!");
576+ unspawnNPC(blueFlagNpc);
577+ break;
578+ case 2:
579+ playerWithRedFlag = player;
580+ announce(getPlayerList(), player.getName() + " took the Red flag!");
581+ unspawnNPC(redFlagNpc);
582+ break;
583+ default:
584+ break;
585+ }
586+ player.broadcastUserInfo();
587+ CreatureSay cs = new CreatureSay(player.getObjectId(), 15, ":", "You got it! Run back! ::"); // 8D
588+ player.sendPacket(cs);
589+ }
590+
591+ @Override
592+ protected String getScorebar()
593+ {
594+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
595+ }
596+
597+ @Override
598+ public void onDie(L2PcInstance victim, L2PcInstance killer)
599+ {
600+ super.onDie(victim, killer);
601+ if (playerWithRedFlag == victim)
602+ {
603+ announce(getPlayerList(), victim.getName() + " dropped the Red flag!");
604+ redFlagStatus = 2;
605+ unequipFlag(victim);
606+ redFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("redFlagId"));
607+ }
608+ if (playerWithBlueFlag == victim)
609+ {
610+ announce(getPlayerList(), victim.getName() + " dropped the Blue flag!");
611+ blueFlagStatus = 2;
612+ unequipFlag(victim);
613+ blueFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("blueFlagId"));
614+ }
615+
616+ addToResurrector(victim);
617+ }
618+
619+ @Override
620+ public void onLogout(L2PcInstance player)
621+ {
622+ super.onLogout(player);
623+
624+ if (playerWithRedFlag == player)
625+ {
626+ announce(getPlayerList(), player.getName() + " dropped the Red flag!");
627+ redFlagStatus = 2;
628+ unequipFlag(player);
629+ redFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("redFlagId"));
630+ }
631+ if (playerWithBlueFlag == player)
632+ {
633+ announce(getPlayerList(), player.getName() + " dropped the Blue flag!");
634+ blueFlagStatus = 2;
635+ unequipFlag(player);
636+ blueFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("blueFlagId"));
637+ }
638+
639+ }
640+
641+ @Override
642+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
643+ {
644+ if (!(npc.getNpcId() == getInt("blueFlagId") || npc.getNpcId() == getInt("blueFlagHolderId") || npc.getNpcId() == getInt("redFlagId") || npc.getNpcId() == getInt("redFlagHolderId")))
645+ return false;
646+
647+ //Blue holder
648+ if (npc.getNpcId() == getInt("blueFlagHolderId"))
649+ if (player == playerWithRedFlag && blueFlagStatus == 0)
650+ {
651+ announce(getPlayerList(), "The Blue team scored!");
652+ teams.get(getTeam(player)).increaseScore();
653+ increasePlayersScore(player);
654+ player.addItem("Event", 6392, 4, player, true);
655+ returnFlag(2);
656+ }
657+
658+ //Red holder
659+ if (npc.getNpcId() == getInt("redFlagHolderId"))
660+ if (player == playerWithBlueFlag && redFlagStatus == 0)
661+ {
662+ announce(getPlayerList(), "The Red team scored!");
663+ teams.get(getTeam(player)).increaseScore();
664+ increasePlayersScore(player);
665+ player.addItem("Event", 6392, 4, player, true);
666+ returnFlag(1);
667+ }
668+
669+ //Blue flag
670+ if (npc.getNpcId() == getInt("blueFlagId"))
671+ {
672+ if (blueFlagStatus == 2)
673+ {
674+ //blue player
675+ if (getTeam(player) == 1)
676+ returnFlag(1);
677+
678+ //red player
679+ if (getTeam(player) == 2)
680+ equipFlag(player, 1);
681+ }
682+ if (blueFlagStatus == 0)
683+ if (getTeam(player) == 2)
684+ {
685+ equipFlag(player, 1);
686+ unspawnNPC(blueFlagNpc);
687+ blueFlagStatus = 1;
688+ }
689+
690+ }
691+
692+ //Red flag
693+ if (npc.getNpcId() == getInt("redFlagId"))
694+ {
695+ if (redFlagStatus == 2)
696+ {
697+ //red player
698+ if (getTeam(player) == 2)
699+ returnFlag(2);
700+
701+ //blue player
702+ if (getTeam(player) == 1)
703+ equipFlag(player, 2);
704+ }
705+ if (redFlagStatus == 0)
706+ if (getTeam(player) == 1)
707+ {
708+ equipFlag(player, 2);
709+ unspawnNPC(redFlagNpc);
710+ redFlagStatus = 1;
711+ }
712+ }
713+ return true;
714+ }
715+
716+ @Override
717+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
718+ {
719+ if (playerWithRedFlag == player || playerWithBlueFlag == player)
720+ return false;
721+
722+ if (item.getItemType() == L2EtcItemType.POTION)
723+ return false;
724+
725+ return true;
726+ }
727+
728+ private void returnFlag(int flag)
729+ {
730+ int[] pos;
731+ switch (flag)
732+ {
733+ case 1:
734+ if (playerWithBlueFlag != null)
735+ unequipFlag(playerWithBlueFlag);
736+ if (blueFlagStatus == 2)
737+ unspawnNPC(blueFlagNpc);
738+
739+ pos = getPosition("BlueFlag", 1);
740+ blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
741+ blueFlagStatus = 0;
742+ announce(getPlayerList(), "The Blue flag returned!");
743+ break;
744+
745+ case 2:
746+ if (playerWithRedFlag != null)
747+ unequipFlag(playerWithRedFlag);
748+ if (redFlagStatus == 2)
749+ unspawnNPC(redFlagNpc);
750+
751+ pos = getPosition("RedFlag", 1);
752+ redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
753+ redFlagStatus = 0;
754+ announce(getPlayerList(), "The Red flag returned!");
755+ break;
756+ }
757+ }
758+
759+ @Override
760+ protected void schedule(int time)
761+ {
762+ tpm.scheduleGeneral(task, time);
763+ }
764+
765+ private void setStatus(EventState s)
766+ {
767+ eventState = s;
768+ }
769+
770+ @Override
771+ protected void showHtml(L2PcInstance player, int obj)
772+ {
773+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
774+ TextBuilder sb = new TextBuilder();
775+
776+ 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>");
777+ sb.append("<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>");
778+ sb.append("<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>");
779+ sb.append("<br><table width=270>");
780+ int i = 0;
781+ for (EventTeam team : teams.values())
782+ {
783+ i++;
784+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
785+ for (L2PcInstance p : getPlayersOfTeam(i))
786+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
787+ }
788+
789+ sb.append("</table></body></html>");
790+ html.setHtml(sb.toString());
791+ player.sendPacket(html);
792+
793+ }
794+
795+ private void spawnFlagsAndHolders()
796+ {
797+ int[] pos = getPosition("BlueFlag", 1);
798+ blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
799+ blueHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("blueFlagHolderId"));
800+
801+ pos = getPosition("RedFlag", 1);
802+ redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
803+ redHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("redFlagHolderId"));
804+ debug("The flags spawned.");
805+ }
806+
807+ @Override
808+ protected void start()
809+ {
810+ setStatus(EventState.START);
811+ schedule(1);
812+ }
813+
814+ private void unequipFlag(L2PcInstance player)
815+ {
816+ L2ItemInstance wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
817+ if (wpn != null)
818+ {
819+ L2ItemInstance[] unequiped = player.getInventory().unEquipItemInBodySlotAndRecord(wpn.getItem().getBodyPart());
820+ player.getInventory().destroyItemByItemId("", 6718, 1, player, null);
821+ InventoryUpdate iu = new InventoryUpdate();
822+ for (L2ItemInstance element : unequiped)
823+ iu.addModifiedItem(element);
824+ player.sendPacket(iu);
825+ player.sendPacket(new ItemList(player, true));
826+ player.broadcastUserInfo();
827+ }
828+
829+ if (player == playerWithRedFlag)
830+ playerWithRedFlag = null;
831+ if (player == playerWithBlueFlag)
832+ playerWithBlueFlag = null;
833+ }
834+
835+ private void unspawnFlagsAndHolders()
836+ {
837+ unspawnNPC(blueFlagNpc);
838+ unspawnNPC(blueHolderNpc);
839+ unspawnNPC(redFlagNpc);
840+ unspawnNPC(redHolderNpc);
841+ }
842+}
843\ No newline at end of file
844Index: head-src/com/l2jfrozen/gameserver/event/EventBuffer.java
845===================================================================
846--- head-src/com/l2jfrozen/gameserver/event/EventBuffer.java (nonexistent)
847+++ head-src/com/l2jfrozen/gameserver/event/EventBuffer.java (working copy)
848@@ -0,0 +1,315 @@
849+/*
850+ * This program is free software: you can redistribute it and/or modify it under
851+ * the terms of the GNU General Public License as published by the Free Software
852+ * Foundation, either version 3 of the License, or (at your option) any later
853+ * version.
854+ *
855+ * This program is distributed in the hope that it will be useful, but WITHOUT
856+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
857+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
858+ * details.
859+ *
860+ * You should have received a copy of the GNU General Public License along with
861+ * this program. If not, see <http://www.gnu.org/licenses/>.
862+ */
863+package com.l2jfrozen.gameserver.event;
864+
865+import java.sql.Connection;
866+import java.sql.PreparedStatement;
867+import java.sql.ResultSet;
868+import java.util.Map;
869+import java.util.StringTokenizer;
870+
871+import javolution.text.TextBuilder;
872+import javolution.util.FastList;
873+import javolution.util.FastMap;
874+
875+import com.l2jfrozen.util.database.L2DatabaseFactory;
876+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
877+import com.l2jfrozen.gameserver.datatables.SkillTable;
878+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
879+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
880+
881+/**
882+ * @author Rizel
883+ *
884+ */
885+public class EventBuffer
886+{
887+ private static class SingletonHolder
888+ {
889+ protected static final EventBuffer _instance = new EventBuffer();
890+ }
891+ private class UpdateTask implements Runnable
892+ {
893+ public void run()
894+ {
895+ updateSQL();
896+ }
897+ }
898+ public static EventBuffer getInstance()
899+ {
900+ return SingletonHolder._instance;
901+ }
902+
903+ private FastMap<String, FastList<Integer>> buffTemplates;
904+
905+ private FastMap<String, Boolean> changes;
906+
907+ private UpdateTask updateTask;
908+
909+ public EventBuffer()
910+ {
911+ updateTask = new UpdateTask();
912+ changes = new FastMap<String, Boolean>();
913+ buffTemplates = new FastMap<String, FastList<Integer>>();
914+ loadSQL();
915+ ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(updateTask, 600000, 600000);
916+ }
917+
918+ protected void buffPlayer(L2PcInstance player)
919+ {
920+ boolean bss = player.checkBss();
921+ boolean sps = player.checkSps();
922+ boolean ss = player.checkSs();
923+
924+ String playerId = "" + player.getObjectId() + player.getClassIndex();
925+
926+ if(!buffTemplates.containsKey(playerId))
927+ {
928+ EventManager.getInstance().debug("The player : "+player.getName()+" ("+playerId+") without template");
929+ return;
930+ }
931+
932+ for (int skillId : buffTemplates.get(playerId))
933+ SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getEffects(player, player, ss, sps, bss);
934+ }
935+
936+ public void changeList(L2PcInstance player, int buff, boolean action)
937+ {
938+ String playerId = "" + player.getObjectId() + player.getClassIndex();
939+
940+ if (!buffTemplates.containsKey(playerId))
941+ {
942+ buffTemplates.put(playerId, new FastList<Integer>());
943+ changes.put(playerId, true);
944+ }
945+ else
946+ {
947+ if (!changes.containsKey(playerId))
948+ changes.put(playerId, false);
949+
950+ if (action)
951+ buffTemplates.get(playerId).add(buff);
952+ else
953+ buffTemplates.get(playerId).remove(buffTemplates.get(playerId).indexOf(buff));
954+
955+ }
956+
957+ }
958+
959+ private void loadSQL()
960+ {
961+ if (!EventManager.getInstance().getBoolean("eventBufferEnabled"))
962+ return;
963+
964+ Connection con = null;
965+ PreparedStatement statement = null;
966+ try
967+ {
968+ con = L2DatabaseFactory.getInstance().getConnection();
969+ statement = con.prepareStatement("SELECT * FROM event_buffs");
970+ ResultSet rset = statement.executeQuery();
971+ int count = 0;
972+ while (rset.next())
973+ {
974+ count++;
975+
976+ buffTemplates.put(rset.getString("player"), new FastList<Integer>());
977+
978+ StringTokenizer st = new StringTokenizer(rset.getString("buffs"), ",");
979+
980+ FastList<Integer> templist = new FastList<Integer>();
981+
982+ while (st.hasMoreTokens())
983+ templist.add(Integer.parseInt(st.nextToken()));
984+
985+ buffTemplates.getEntry(rset.getString("player")).setValue(templist);
986+ }
987+ rset.close();
988+ statement.close();
989+
990+ EventManager.getInstance().debug("Buffer loaded: " + count + " players template.");
991+ }
992+ catch (Exception e)
993+ {
994+ System.out.println("EventBuffs SQL catch");
995+ }
996+ finally
997+ {
998+ try { con.close(); } catch (Exception e) {}
999+ }
1000+ }
1001+
1002+ protected boolean playerHaveTemplate(L2PcInstance player)
1003+ {
1004+ String playerId = "" + player.getObjectId() + player.getClassIndex();
1005+
1006+ if (buffTemplates.containsKey(playerId))
1007+ return true;
1008+ else
1009+ return false;
1010+ }
1011+
1012+ public void showHtml(L2PcInstance player)
1013+ {
1014+ try{
1015+ String playerId = "" + player.getObjectId() + player.getClassIndex();
1016+
1017+ if (!buffTemplates.containsKey(playerId))
1018+ {
1019+ buffTemplates.put(playerId, new FastList<Integer>());
1020+ changes.put(playerId, true);
1021+ }
1022+
1023+ StringTokenizer st = new StringTokenizer(EventManager.getInstance().getString("allowedBuffsList"), ",");
1024+
1025+ FastList<Integer> skillList = new FastList<Integer>();
1026+
1027+ while (st.hasMoreTokens())
1028+ skillList.add(Integer.parseInt(st.nextToken()));
1029+
1030+ NpcHtmlMessage html = new NpcHtmlMessage(0);
1031+ TextBuilder sb = new TextBuilder();
1032+
1033+ 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>");
1034+ sb.append("<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>");
1035+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td>Added buffs:</td></tr></table><br>");
1036+ sb.append("<center><table width=270>");
1037+
1038+ int c = 0;
1039+ for (int skillId : buffTemplates.get(playerId))
1040+ {
1041+ c++;
1042+ String skillStr = "0000";
1043+ if (skillId < 100)
1044+ skillStr = "00" + skillId;
1045+ else if (skillId > 99 && skillId < 1000)
1046+ skillStr = "0" + skillId;
1047+ else if (skillId > 4698 && skillId < 4701)
1048+ skillStr = "1331";
1049+ else if (skillId > 4701 && skillId < 4704)
1050+ skillStr = "1332";
1051+ else
1052+ skillStr = "" + skillId;
1053+
1054+ if (c % 2 == 1)
1055+ sb.append("<tr><td width=33><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100><a action=\"bypass -h eventbuffer " + skillId + " 0\">" + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + "</a></td>");
1056+ if (c % 2 == 0)
1057+ sb.append("<td width=33><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100><a action=\"bypass -h eventbuffer " + skillId + " 0\">" + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + "</a></td></tr>");
1058+ }
1059+
1060+ if (c % 2 == 1)
1061+ sb.append("<td width=33></td><td width=100></td></tr>");
1062+
1063+ sb.append("</table><br>");
1064+
1065+ sb.append("<br><br><center><table width=270 bgcolor=5A5A5A><tr><td>Available buffs:</td></tr></table><br>");
1066+ sb.append("<center><table width=270>");
1067+
1068+ c = 0;
1069+ for (int skillId : skillList)
1070+ {
1071+ String skillStr = "0000";
1072+ if (skillId < 100)
1073+ skillStr = "00" + skillId;
1074+ else if (skillId > 99 && skillId < 1000)
1075+ skillStr = "0" + skillId;
1076+ else if (skillId > 4698 && skillId < 4701)
1077+ skillStr = "1331";
1078+ else if (skillId > 4701 && skillId < 4704)
1079+ skillStr = "1332";
1080+ else
1081+ skillStr = "" + skillId;
1082+
1083+ if (!buffTemplates.get(playerId).contains(skillId))
1084+ {
1085+ c++;
1086+ if (c % 2 == 1)
1087+ sb.append("<tr><td width=32><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100>" + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "<a action=\"bypass -h eventbuffer " + skillId + " 1\">" : "") + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "</a>" : "") + "</td>");
1088+ if (c % 2 == 0)
1089+ sb.append("<td width=32><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100>" + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "<a action=\"bypass -h eventbuffer " + skillId + " 1\">" : "") + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "</a>" : "") + "</td></tr>");
1090+ }
1091+ }
1092+
1093+ if (c % 2 == 1)
1094+ sb.append("<td width=33></td><td width=100></td></tr>");
1095+
1096+ sb.append("</table>");
1097+
1098+ sb.append("</body></html>");
1099+ html.setHtml(sb.toString());
1100+ player.sendPacket(html);
1101+ }
1102+ catch(Throwable e)
1103+ {
1104+ e.printStackTrace();
1105+ }
1106+ }
1107+
1108+ public void updateSQL()
1109+ {
1110+ Connection con = null;
1111+ PreparedStatement statement = null;
1112+
1113+ try
1114+ {
1115+ con = L2DatabaseFactory.getInstance().getConnection();
1116+
1117+ for (Map.Entry<String, Boolean> player : changes.entrySet())
1118+ {
1119+
1120+ TextBuilder sb = new TextBuilder();
1121+
1122+ int c = 0;
1123+ for (int buffid : buffTemplates.get(player.getKey()))
1124+ if (c == 0)
1125+ {
1126+ sb.append(buffid);
1127+ c++;
1128+ }
1129+ else
1130+ sb.append("," + buffid);
1131+
1132+ if (player.getValue())
1133+ {
1134+ statement = con.prepareStatement("INSERT INTO event_buffs(player,buffs) VALUES (?,?)");
1135+ statement.setString(1, player.getKey());
1136+ statement.setString(2, sb.toString());
1137+
1138+ statement.executeUpdate();
1139+ statement.close();
1140+ }
1141+ else
1142+ {
1143+ statement = con.prepareStatement("UPDATE event_buffs SET buffs=? WHERE player=?");
1144+ statement.setString(1, sb.toString());
1145+ statement.setString(2, player.getKey());
1146+
1147+ statement.executeUpdate();
1148+ statement.close();
1149+ }
1150+ }
1151+ }
1152+ catch (Exception e)
1153+ {
1154+ System.out.println("EventBuffs SQL catch");
1155+ }
1156+ finally
1157+ {
1158+ try { con.close(); } catch (Exception e) {}
1159+ }
1160+
1161+ changes.clear();
1162+ }
1163+}
1164\ No newline at end of file
1165Index: head-src/com/l2jfrozen/gameserver/event/TvT.java
1166===================================================================
1167--- head-src/com/l2jfrozen/gameserver/event/TvT.java (nonexistent)
1168+++ head-src/com/l2jfrozen/gameserver/event/TvT.java (working copy)
1169@@ -0,0 +1,151 @@
1170+package com.l2jfrozen.gameserver.event;
1171+
1172+import javolution.text.TextBuilder;
1173+
1174+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
1175+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
1176+
1177+public class TvT extends Event
1178+{
1179+ private class Core implements Runnable
1180+ {
1181+ public void run()
1182+ {
1183+ try
1184+ {
1185+ switch (eventState)
1186+ {
1187+ case START:
1188+ divideIntoTeams(2);
1189+ preparePlayers();
1190+ teleportToTeamPos();
1191+ createPartyOfTeam(1);
1192+ createPartyOfTeam(2);
1193+ forceSitAll();
1194+ setStatus(EventState.FIGHT);
1195+ schedule(20000);
1196+ break;
1197+
1198+ case FIGHT:
1199+ forceStandAll();
1200+ setStatus(EventState.END);
1201+ clock.startClock(getInt("matchTime"));
1202+ break;
1203+
1204+ case END:
1205+ clock.setTime(0);
1206+ if (winnerTeam == 0)
1207+ winnerTeam = getWinnerTeam();
1208+
1209+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
1210+ setStatus(EventState.INACTIVE);
1211+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " kills!");
1212+ break;
1213+ }
1214+ }
1215+ catch (Throwable e)
1216+ {
1217+ e.printStackTrace();
1218+ EventManager.getInstance().end("Error! Event ended.");
1219+ }
1220+ }
1221+ }
1222+
1223+ private enum EventState
1224+ {
1225+ START, FIGHT, END, TELEPORT, INACTIVE
1226+ }
1227+
1228+ private EventState eventState;
1229+
1230+ private Core task;
1231+
1232+ public TvT()
1233+ {
1234+ super();
1235+ eventId = 7;
1236+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
1237+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
1238+ task = new Core();
1239+ winnerTeam = 0;
1240+ }
1241+
1242+ @Override
1243+ protected void endEvent()
1244+ {
1245+ winnerTeam = players.head().getNext().getValue()[0];
1246+
1247+ setStatus(EventState.END);
1248+ clock.setTime(0);
1249+
1250+ }
1251+
1252+ @Override
1253+ protected String getScorebar()
1254+ {
1255+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
1256+ }
1257+
1258+ @Override
1259+ public void onDie(L2PcInstance victim, L2PcInstance killer)
1260+ {
1261+ super.onDie(victim, killer);
1262+ addToResurrector(victim);
1263+ }
1264+
1265+ @Override
1266+ public void onKill(L2PcInstance victim, L2PcInstance killer)
1267+ {
1268+ super.onKill(victim, killer);
1269+ if (getPlayersTeam(killer) != getPlayersTeam(victim))
1270+ {
1271+ getPlayersTeam(killer).increaseScore();
1272+ killer.addItem("Event", 6392, 1, killer, true);
1273+ increasePlayersScore(killer);
1274+ }
1275+
1276+ }
1277+
1278+ @Override
1279+ protected void schedule(int time)
1280+ {
1281+ tpm.scheduleGeneral(task, time);
1282+ }
1283+
1284+ private void setStatus(EventState s)
1285+ {
1286+ eventState = s;
1287+ }
1288+
1289+ @Override
1290+ protected void showHtml(L2PcInstance player, int obj)
1291+ {
1292+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
1293+ TextBuilder sb = new TextBuilder();
1294+
1295+ 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>");
1296+ sb.append("<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>");
1297+ sb.append("<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>");
1298+ sb.append("<br><table width=270>");
1299+ int i = 0;
1300+ for (EventTeam team : teams.values())
1301+ {
1302+ i++;
1303+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
1304+ for (L2PcInstance p : getPlayersOfTeam(i))
1305+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
1306+ }
1307+
1308+ sb.append("</table></body></html>");
1309+ html.setHtml(sb.toString());
1310+ player.sendPacket(html);
1311+
1312+ }
1313+
1314+ @Override
1315+ protected void start()
1316+ {
1317+ setStatus(EventState.START);
1318+ schedule(1);
1319+ }
1320+}
1321\ No newline at end of file
1322Index: head-src/com/l2jfrozen/gameserver/event/Zombie.java
1323===================================================================
1324--- head-src/com/l2jfrozen/gameserver/event/Zombie.java (nonexistent)
1325+++ head-src/com/l2jfrozen/gameserver/event/Zombie.java (working copy)
1326@@ -0,0 +1,212 @@
1327+package com.l2jfrozen.gameserver.event;
1328+
1329+import javolution.text.TextBuilder;
1330+
1331+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
1332+import com.l2jfrozen.gameserver.model.L2Object;
1333+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
1334+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
1335+
1336+/**
1337+ * @author Rizel
1338+ *
1339+ */
1340+public class Zombie extends Event
1341+{
1342+ private class Core implements Runnable
1343+ {
1344+ public void run()
1345+ {
1346+ try
1347+ {
1348+ switch (eventState)
1349+ {
1350+ case START:
1351+ divideIntoTeams(1);
1352+ preparePlayers();
1353+ teleportToRandom();
1354+ forceSitAll();
1355+ unequip();
1356+ setStatus(EventState.FIGHT);
1357+ schedule(20000);
1358+ break;
1359+
1360+ case FIGHT:
1361+ forceStandAll();
1362+ transform(getRandomPlayer());
1363+ setStatus(EventState.END);
1364+ clock.startClock(getInt("matchTime"));
1365+ break;
1366+
1367+ case END:
1368+ setStatus(EventState.INACTIVE);
1369+ clock.setTime(0);
1370+
1371+ if (getPlayersWithStatus(0).size() != 1)
1372+ {
1373+ msgToAll("Tie!");
1374+ EventManager.getInstance().end("The match has ended in a tie!");
1375+ }
1376+
1377+ else
1378+ {
1379+ L2PcInstance winner = getWinner();
1380+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
1381+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event!");
1382+ }
1383+
1384+ break;
1385+ }
1386+ }
1387+ catch (Throwable e)
1388+ {
1389+ e.printStackTrace();
1390+ EventManager.getInstance().end("Error! Event ended.");
1391+ }
1392+ }
1393+ }
1394+
1395+ private enum EventState
1396+ {
1397+ START, FIGHT, END, INACTIVE
1398+ }
1399+
1400+ private EventState eventState;
1401+
1402+ private Core task;
1403+
1404+ public Zombie()
1405+ {
1406+ super();
1407+ eventId = 9;
1408+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
1409+ task = new Core();
1410+ }
1411+
1412+ @Override
1413+ public boolean canAttack(L2PcInstance player, L2Object target)
1414+ {
1415+ if (target instanceof L2PcInstance)
1416+ if (getStatus(player) == 1 && getStatus((L2PcInstance) target) == 0)
1417+ return true;
1418+
1419+ return false;
1420+ }
1421+
1422+ @Override
1423+ protected void endEvent()
1424+ {
1425+ setStatus(EventState.END);
1426+ clock.setTime(0);
1427+ }
1428+
1429+ @Override
1430+ protected String getScorebar()
1431+ {
1432+ return "Humans: " + getPlayersWithStatus(0).size() + " Time: " + clock.getTime();
1433+ }
1434+
1435+ private L2PcInstance getWinner()
1436+ {
1437+ return getPlayersWithStatus(0).head().getNext().getValue();
1438+ }
1439+
1440+ @Override
1441+ public void onHit(L2PcInstance actor, L2PcInstance target)
1442+ {
1443+ if (eventState == EventState.END)
1444+ {
1445+ if (getStatus(actor) == 1 && getStatus(target) == 0)
1446+ {
1447+ transform(target);
1448+ increasePlayersScore(actor);
1449+ actor.addItem("Event", 6392, 2, actor, true);
1450+ }
1451+
1452+ if (getPlayersWithStatus(0).size() == 1)
1453+ schedule(1);
1454+ }
1455+
1456+ }
1457+
1458+ @Override
1459+ public void onLogout(L2PcInstance player)
1460+ {
1461+ if (getStatus(player) == 1 && getPlayersWithStatus(1).size() == 1)
1462+ {
1463+ super.onLogout(player);
1464+ transform(getRandomPlayer());
1465+ }
1466+ else
1467+ {
1468+ super.onLogout(player);
1469+ }
1470+
1471+ }
1472+
1473+ @Override
1474+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
1475+ {
1476+ return false;
1477+ }
1478+
1479+ @Override
1480+ protected void schedule(int time)
1481+ {
1482+ tpm.scheduleGeneral(task, time);
1483+ }
1484+
1485+ private void setStatus(EventState s)
1486+ {
1487+ eventState = s;
1488+ }
1489+
1490+ /* (non-Javadoc)
1491+ * @see net.sf.l2j.gameserver.event.Event#showHtml(net.sf.l2j.gameserver.model.actor.instance.L2PcInstance, int)
1492+ */
1493+ @Override
1494+ protected void showHtml(L2PcInstance player, int obj)
1495+ {
1496+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
1497+ TextBuilder sb = new TextBuilder();
1498+
1499+ 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>");
1500+ sb.append("<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>");
1501+ sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
1502+ sb.append("<br><table width=270>");
1503+
1504+ for (L2PcInstance p : getPlayersOfTeam(1))
1505+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + (getStatus(p) == 1 ? "Zombie" : "Human") + "</td></tr>");
1506+
1507+ sb.append("</table></body></html>");
1508+ html.setHtml(sb.toString());
1509+ player.sendPacket(html);
1510+
1511+ }
1512+
1513+ @Override
1514+ protected void start()
1515+ {
1516+ setStatus(EventState.START);
1517+ schedule(1);
1518+ }
1519+
1520+ private void teleportToRandom()
1521+ {
1522+ for (L2PcInstance player : players.keySet())
1523+ {
1524+ int[] loc = getPosition("All", 0);
1525+ player.teleToLocation(loc[0], loc[1], loc[2]);
1526+ }
1527+ }
1528+
1529+ protected void transform(L2PcInstance player)
1530+ {
1531+ setStatus(player, 1);
1532+ polymorph(player,25375);
1533+ player.getAppearance().setNameColor(255, 0, 0);
1534+ player.broadcastUserInfo();
1535+ player.getInventory().unEquipItemInSlot(10);
1536+ player.getInventory().unEquipItemInSlot(16);
1537+ }
1538+}
1539\ No newline at end of file
1540Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java
1541===================================================================
1542--- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java (revision 1132)
1543+++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java (working copy)
1544@@ -145,7 +145,7 @@
1545 import com.l2jfrozen.gameserver.model.entity.L2Rebirth;
1546 import com.l2jfrozen.gameserver.model.entity.event.CTF;
1547 import com.l2jfrozen.gameserver.model.entity.event.DM;
1548-import com.l2jfrozen.gameserver.model.entity.event.L2Event;
1549+//import com.l2jfrozen.gameserver.model.entity.event.L2Event;
1550 import com.l2jfrozen.gameserver.model.entity.event.TvT;
1551 import com.l2jfrozen.gameserver.model.entity.event.VIP;
1552 import com.l2jfrozen.gameserver.model.entity.olympiad.Olympiad;
1553@@ -245,6 +245,8 @@
1554 import com.l2jfrozen.util.database.L2DatabaseFactory;
1555 import com.l2jfrozen.util.random.Rnd;
1556
1557+import com.l2jfrozen.gameserver.event.EventManager;
1558+
1559 /**
1560 * This class represents all player characters in the world.<br>
1561 * There is always a client-thread connected to this (except if a player-store is activated upon logout).
1562@@ -4441,7 +4443,7 @@
1563 return;
1564 }
1565
1566- if (L2Event.active && eventSitForced)
1567+ if (EventManager.getInstance().isRunning() && eventSitForced)
1568 {
1569 sendMessage("A dark force beyond your mortal understanding makes your knees to shake when you try to stand up ...");
1570 }
1571@@ -5832,6 +5834,13 @@
1572 return;
1573 }
1574 }
1575+
1576+ if (!EventManager.getInstance().canTargetPlayer(this, player))
1577+ {
1578+ player.sendPacket(new ActionFailed());
1579+ return;
1580+ }
1581+
1582 // Check if the L2PcInstance is confused
1583 if (player.isOutOfControl())
1584 {
1585@@ -7401,6 +7410,19 @@
1586 doPkInfo(pk);
1587 }
1588
1589+ L2PcInstance ek = null;
1590+
1591+ if (killer instanceof L2PcInstance)
1592+ ek = (L2PcInstance) killer;
1593+ if (killer instanceof L2Summon)
1594+ ek = ((L2Summon) killer).getOwner();
1595+
1596+ if (ek != null && EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered(ek))
1597+ {
1598+ EventManager.getInstance().getCurrentEvent().onKill(this,ek);
1599+ EventManager.getInstance().getCurrentEvent().onDie(this,ek);
1600+ }
1601+
1602 if (atEvent)
1603 {
1604 pk.kills.add(getName());
1605@@ -7852,6 +7874,9 @@
1606 if (isInDuel() && targetPlayer.isInDuel())
1607 return;
1608
1609+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered(targetPlayer))
1610+ return;
1611+
1612 // If in Arena, do nothing
1613 if (isInsideZone(ZONE_PVP) || targetPlayer.isInsideZone(ZONE_PVP))
1614 return;
1615@@ -8525,6 +8550,9 @@
1616 if (isInsideZone(ZONE_PVP))
1617 return;
1618
1619+ if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
1620+ return;
1621+
1622 setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_NORMAL_TIME);
1623
1624 if (getPvpFlag() == 0)
1625@@ -8553,6 +8581,9 @@
1626 if (player_target == null)
1627 return;
1628
1629+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
1630+ return;
1631+
1632 if ((TvT.is_started() && _inEventTvT && player_target._inEventTvT) || (DM.is_started() && _inEventDM && player_target._inEventDM) || (CTF.is_started() && _inEventCTF && player_target._inEventCTF) || (VIP._started && _inEventVIP && player_target._inEventVIP))
1633 return;
1634
1635@@ -8667,6 +8698,9 @@
1636 LOGGER.debug(getName() + " died and lost " + lostExp + " experience.");
1637 }
1638
1639+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
1640+ lostExp = 0;
1641+
1642 // Set the new Experience value of the L2PcInstance
1643 getStat().addExp(-lostExp);
1644 }
1645@@ -11843,6 +11877,9 @@
1646 if (isInsideZone(ZONE_PVP) && ((L2PcInstance) attacker).isInsideZone(ZONE_PVP))
1647 return true;
1648
1649+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance)attacker) && EventManager.getInstance().isRunning())
1650+ return true;
1651+
1652 if (getClan() != null)
1653 {
1654 Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ());
1655@@ -11928,6 +11965,10 @@
1656 */
1657 public void useMagic(final L2Skill skill, final boolean forceUse, final boolean dontMove)
1658 {
1659+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this))
1660+ if(!EventManager.getInstance().getCurrentEvent().onUseMagic(skill))
1661+ return;
1662+
1663 if (isDead())
1664 {
1665 abortCast();
1666@@ -12637,6 +12678,9 @@
1667 // SkillDat skilldatpet = getCurrentPetSkill();
1668 if (skill.isPvpSkill()) // pvp skill
1669 {
1670+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance)target) && EventManager.getInstance().isRunning())
1671+ return true;
1672+
1673 if (getClan() != null && ((L2PcInstance) target).getClan() != null)
1674 {
1675 if (getClan().isAtWarWith(((L2PcInstance) target).getClan().getClanId()) && ((L2PcInstance) target).getClan().isAtWarWith(getClan().getClanId()))
1676@@ -12650,11 +12694,15 @@
1677 else if ((skilldat != null && !skilldat.isCtrlPressed() && skill.isOffensive() && !srcIsSummon)
1678 /* || (skilldatpet != null && !skilldatpet.isCtrlPressed() && skill.isOffensive() && srcIsSummon) */)
1679 {
1680+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance)target) && EventManager.getInstance().isRunning())
1681+ return true;
1682+
1683 if (getClan() != null && ((L2PcInstance) target).getClan() != null)
1684 {
1685 if (getClan().isAtWarWith(((L2PcInstance) target).getClan().getClanId()) && ((L2PcInstance) target).getClan().isAtWarWith(getClan().getClanId()))
1686 return true; // in clan war player can attack whites even without ctrl
1687 }
1688+
1689 if (((L2PcInstance) target).getPvpFlag() == 0 && // target's pvp flag is not set and
1690 ((L2PcInstance) target).getKarma() == 0 // target has no karma
1691 )
1692@@ -14843,6 +14891,9 @@
1693 */
1694 public synchronized boolean setActiveClass(final int classIndex)
1695 {
1696+ if (EventManager.getInstance().players.contains(this))
1697+ return false;
1698+
1699 if (isInCombat() || this.getAI().getIntention() == CtrlIntention.AI_INTENTION_ATTACK)
1700 {
1701 sendMessage("Impossible switch class if in combat");
1702@@ -16339,6 +16390,10 @@
1703 setXYZ(_obsX, _obsY, _obsZ);
1704 }
1705
1706+ EventManager.getInstance().onLogout(this);
1707+ if(EventManager.getInstance().isRegistered(this))
1708+ EventManager.getInstance().getCurrentEvent().onLogout(this);
1709+
1710 if (isTeleporting())
1711 {
1712 try
1713@@ -17587,6 +17642,9 @@
1714 if (getDeathPenaltyBuffLevel() >= 15) // maximum level reached
1715 return;
1716
1717+ if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
1718+ return;
1719+
1720 if (getDeathPenaltyBuffLevel() != 0)
1721 {
1722 L2Skill skill = SkillTable.getInstance().getInfo(5076, getDeathPenaltyBuffLevel());
1723Index: head-src/com/l2jfrozen/gameserver/event/Bomb.java
1724===================================================================
1725--- head-src/com/l2jfrozen/gameserver/event/Bomb.java (nonexistent)
1726+++ head-src/com/l2jfrozen/gameserver/event/Bomb.java (working copy)
1727@@ -0,0 +1,261 @@
1728+package com.l2jfrozen.gameserver.event;
1729+
1730+import javolution.text.TextBuilder;
1731+import javolution.util.FastList;
1732+import javolution.util.FastMap;
1733+
1734+import com.l2jfrozen.gameserver.datatables.SkillTable;
1735+import com.l2jfrozen.gameserver.model.L2Object;
1736+import com.l2jfrozen.gameserver.model.L2Skill;
1737+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
1738+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
1739+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
1740+import com.l2jfrozen.gameserver.network.serverpackets.MagicSkillLaunched;
1741+import com.l2jfrozen.gameserver.network.serverpackets.MagicSkillUser;
1742+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
1743+import com.l2jfrozen.gameserver.network.serverpackets.NpcInfo;
1744+import com.l2jfrozen.util.random.Rnd;
1745+
1746+public class Bomb extends Event
1747+{
1748+ private class Bomber implements Runnable
1749+ {
1750+ public void run()
1751+ {
1752+ explode(bombs.head().getNext().getKey());
1753+ bombs.remove(bombs.head().getNext().getKey());
1754+ }
1755+ }
1756+
1757+ private class Core implements Runnable
1758+ {
1759+ public void run()
1760+ {
1761+ try
1762+ {
1763+ switch (eventState)
1764+ {
1765+ case START:
1766+ divideIntoTeams(2);
1767+ preparePlayers();
1768+ teleportToTeamPos();
1769+ createPartyOfTeam(1);
1770+ createPartyOfTeam(2);
1771+ forceSitAll();
1772+ unequip();
1773+ giveSkill();
1774+ debug("The event initialized with " + players.size() + " players");
1775+ setStatus(EventState.FIGHT);
1776+ schedule(20000);
1777+ break;
1778+
1779+ case FIGHT:
1780+ forceStandAll();
1781+ setStatus(EventState.END);
1782+ debug("The fight started");
1783+ clock.startClock(getInt("matchTime"));
1784+ break;
1785+
1786+ case END:
1787+ clock.setTime(0);
1788+ if (winnerTeam == 0)
1789+ winnerTeam = getWinnerTeam();
1790+
1791+ removeSkill();
1792+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
1793+ debug("The event ended. Winner: " + winnerTeam);
1794+ setStatus(EventState.INACTIVE);
1795+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " kills!");
1796+ break;
1797+ }
1798+ }
1799+ catch (Throwable e)
1800+ {
1801+ e.printStackTrace();
1802+ EventManager.getInstance().end("Error! Event ended.");
1803+ }
1804+ }
1805+ }
1806+
1807+ private enum EventState
1808+ {
1809+ START, FIGHT, END, TELEPORT, INACTIVE
1810+ }
1811+
1812+ private EventState eventState;
1813+
1814+ private Core task;
1815+
1816+ private FastMap<L2Spawn, L2PcInstance> bombs;
1817+
1818+ private Bomber bomber;
1819+
1820+ public Bomb()
1821+ {
1822+ super();
1823+ eventId = 12;
1824+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
1825+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
1826+ task = new Core();
1827+ bomber = new Bomber();
1828+ bombs = new FastMap<L2Spawn, L2PcInstance>();
1829+ winnerTeam = 0;
1830+ }
1831+
1832+ @Override
1833+ public void dropBomb(L2PcInstance player)
1834+ {
1835+ bombs.put(spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("bombNpcId")), player);
1836+ bombs.tail().getPrevious().getKey().getLastSpawn().setTitle((getTeam(player) == 1 ? "Blue" : "Red"));
1837+ bombs.tail().getPrevious().getKey().getLastSpawn().broadcastStatusUpdate();
1838+
1839+ for(L2PcInstance p : getPlayerList())
1840+ p.sendPacket(new NpcInfo(bombs.tail().getPrevious().getKey().getLastSpawn(), p));
1841+
1842+ tpm.scheduleGeneral(bomber, 3000);
1843+ }
1844+
1845+ @Override
1846+ protected void endEvent()
1847+ {
1848+ winnerTeam = players.head().getNext().getValue()[0];
1849+
1850+ setStatus(EventState.END);
1851+ clock.setTime(0);
1852+
1853+ }
1854+
1855+ private void explode(L2Spawn bomb)
1856+ {
1857+ FastList<L2Object> victims = new FastList<L2Object>();
1858+
1859+ for (L2PcInstance player : getPlayerList())
1860+ {
1861+ if(player == null)
1862+ continue;
1863+
1864+ if(player.isInvul())
1865+ continue;
1866+
1867+ if (getTeam(bombs.get(bomb)) != getTeam(player) && Math.sqrt(player.getPlanDistanceSq(bomb.getLastSpawn())) <= getInt("bombRadius"))
1868+ {
1869+ player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, bomb.getLastSpawn());
1870+ increasePlayersScore(bombs.get(bomb));
1871+ EventStats.getInstance().tempTable.get(player.getObjectId())[2] = EventStats.getInstance().tempTable.get(player.getObjectId())[2] + 1;
1872+ addToResurrector(player);
1873+
1874+ victims.add(player);
1875+
1876+ if (getTeam(player) == 1)
1877+ teams.get(2).increaseScore();
1878+ if (getTeam(player) == 2)
1879+ teams.get(1).increaseScore();
1880+ }
1881+ if (victims.size() != 0)
1882+ {
1883+ bomb.getLastSpawn().broadcastPacket(new MagicSkillUser(bomb.getLastSpawn(), (L2PcInstance) victims.head().getNext().getValue(), 18, 1, 0, 0));
1884+ bomb.getLastSpawn().broadcastPacket(new MagicSkillLaunched(bomb.getLastSpawn(), 18, 1, victims.toArray(new L2Object[victims.size()])));
1885+ victims.clear();
1886+ }
1887+ }
1888+ unspawnNPC(bomb);
1889+ }
1890+
1891+ @Override
1892+ protected String getScorebar()
1893+ {
1894+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
1895+ }
1896+
1897+ @Override
1898+ protected int getWinnerTeam()
1899+ {
1900+ if (teams.get(1).getScore() > teams.get(2).getScore())
1901+ return 1;
1902+ if (teams.get(2).getScore() > teams.get(1).getScore())
1903+ return 2;
1904+ if (teams.get(1).getScore() == teams.get(2).getScore())
1905+ if (Rnd.nextInt(1) == 1)
1906+ return 1;
1907+ else
1908+ return 2;
1909+
1910+ return 1;
1911+ }
1912+
1913+ private void giveSkill()
1914+ {
1915+ for (L2PcInstance player : getPlayerList())
1916+ player.addSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
1917+ }
1918+
1919+
1920+ @Override
1921+ public void onLogout(L2PcInstance player)
1922+ {
1923+ player.removeSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
1924+ }
1925+
1926+ @Override
1927+ public boolean onUseMagic(L2Skill skill)
1928+ {
1929+ if (skill.getId() == getInt("bombSkillId"))
1930+ return true;
1931+
1932+ return false;
1933+
1934+ }
1935+
1936+ private void removeSkill()
1937+ {
1938+ for (L2PcInstance player : getPlayerList())
1939+ player.removeSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
1940+ }
1941+
1942+ @Override
1943+ protected void schedule(int time)
1944+ {
1945+ tpm.scheduleGeneral(task, time);
1946+ }
1947+
1948+ private void setStatus(EventState s)
1949+ {
1950+ eventState = s;
1951+ }
1952+
1953+ @Override
1954+ protected void showHtml(L2PcInstance player, int obj)
1955+ {
1956+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
1957+ TextBuilder sb = new TextBuilder();
1958+
1959+ 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>");
1960+ sb.append("<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>");
1961+ sb.append("<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>");
1962+ sb.append("<br><table width=270>");
1963+ int i = 0;
1964+ for (EventTeam team : teams.values())
1965+ {
1966+ i++;
1967+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
1968+ for (L2PcInstance p : getPlayersOfTeam(i))
1969+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
1970+ }
1971+
1972+ sb.append("</table></body></html>");
1973+ html.setHtml(sb.toString());
1974+ player.sendPacket(html);
1975+
1976+ }
1977+
1978+ @Override
1979+ protected void start()
1980+ {
1981+ setStatus(EventState.START);
1982+ schedule(1);
1983+ }
1984+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
1985+ {
1986+ return false;
1987+ }
1988+}
1989\ No newline at end of file
1990Index: config/Events.xml
1991===================================================================
1992--- config/Events.xml (nonexistent)
1993+++ config/Events.xml (working copy)
1994@@ -0,0 +1,350 @@
1995+<?xml version="1.0" encoding="UTF-8"?>
1996+<events>
1997+ <!-- Core settings -->
1998+ <event id="0">
1999+ <property name="registerTime" value="300" />
2000+ <property name="betweenEventsTime" value="10800" />
2001+ <property name="firstAfterStartTime" value="1800" />
2002+ <property name="managerNpcId" value="50001" />
2003+ <property name="showVotePopupAt" value="600" />
2004+ <property name="votePopupEnabled" value="false" />
2005+ <property name="debug" value="false" />
2006+ <property name="statTrackingEnabled" value="true" />
2007+ <property name="eventBufferEnabled" value="false" />
2008+ <property name="allowedBuffsList" value="1068,1085,1086,1087" />
2009+ <property name="maxBuffNum" value="2" />
2010+ <property name="friendlyFireEnabled" value="false" />
2011+ <property name="restartAllowed" value="false" />
2012+ <restriction type="item" ids="" />
2013+ <restriction type="skill" ids="1374,1375,1376,395,396" />
2014+ </event>
2015+
2016+ <!-- DeathMatch -->
2017+ <event id="1">
2018+ <property name="minLvl" value="70" />
2019+ <property name="maxLvl" value="80" />
2020+ <property name="eventName" value="Deathmatch" />
2021+ <property name="ids" value="1" />
2022+ <property name="matchTime" value="240" />
2023+ <property name="rewardId" value="6392" />
2024+ <property name="rewardAmmount" value="20" />
2025+ <property name="allowPotions" value="false" />
2026+ <property name="allowUseMagic" value="true" />
2027+ <property name="removeBuffs" value="false" />
2028+ <property name="minPlayers" value="8" />
2029+ <color owner="All" r="255" g="255" b="255"/>
2030+ <position owner="All" x="106037" y="114816" z="-1560" radius="700" />
2031+ <restriction type="item" ids="" />
2032+ <restriction type="skill" ids="" />
2033+ </event>
2034+
2035+ <!-- Domination -->
2036+ <event id="2">
2037+ <property name="minLvl" value="70" />
2038+ <property name="maxLvl" value="80" />
2039+ <property name="eventName" value="Domination" />
2040+ <property name="ids" value="2" />
2041+ <property name="matchTime" value="240" />
2042+ <property name="rewardId" value="6392" />
2043+ <property name="rewardAmmount" value="10" />
2044+ <property name="allowPotions" value="false" />
2045+ <property name="allowUseMagic" value="true" />
2046+ <property name="removeBuffs" value="false" />
2047+ <property name="minPlayers" value="8" />
2048+ <property name="zoneRadius" value="170" />
2049+ <property name="zoneNpcId" value="9103" />
2050+ <color owner="Blue" r="0" g="0" b="255"/>
2051+ <color owner="Red" r="255" g="0" b="0"/>
2052+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2053+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2054+ <position owner="Zone" x="106108" y="114969" z="-1587" radius="0" />
2055+ <restriction type="item" ids="" />
2056+ <restriction type="skill" ids="" />
2057+ </event>
2058+
2059+ <!-- Double Domination -->
2060+ <event id="3">
2061+ <property name="minLvl" value="70" />
2062+ <property name="maxLvl" value="80" />
2063+ <property name="eventName" value="Double Domination" />
2064+ <property name="ids" value="3" />
2065+ <property name="matchTime" value="240" />
2066+ <property name="rewardId" value="6392" />
2067+ <property name="rewardAmmount" value="10" />
2068+ <property name="allowPotions" value="false" />
2069+ <property name="allowUseMagic" value="true" />
2070+ <property name="removeBuffs" value="false" />
2071+ <property name="minPlayers" value="8" />
2072+ <property name="zoneRadius" value="170" />
2073+ <property name="zoneNpcId" value="9103" />
2074+ <property name="timeToScore" value="10" />
2075+ <color owner="Blue" r="0" g="0" b="255"/>
2076+ <color owner="Red" r="255" g="0" b="0"/>
2077+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2078+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2079+ <position owner="Zone" x="106995" y="114556" z="-1587" radius="0" />
2080+ <position owner="Zone" x="104823" y="115175" z="-1587" radius="0" />
2081+ <restriction type="item" ids="" />
2082+ <restriction type="skill" ids="" />
2083+ </event>
2084+
2085+ <!-- Last Man Standing -->
2086+ <event id="4">
2087+ <property name="minLvl" value="70" />
2088+ <property name="maxLvl" value="80" />
2089+ <property name="eventName" value="Last Man Standing" />
2090+ <property name="ids" value="4" />
2091+ <property name="matchTime" value="300" />
2092+ <property name="rewardId" value="6392" />
2093+ <property name="rewardAmmount" value="25" />
2094+ <property name="allowPotions" value="false" />
2095+ <property name="allowUseMagic" value="true" />
2096+ <property name="removeBuffs" value="false" />
2097+ <property name="minPlayers" value="8" />
2098+ <color owner="All" r="255" g="255" b="255"/>
2099+ <position owner="All" x="106037" y="114816" z="-1560" radius="700" />
2100+ <restriction type="item" ids="" />
2101+ <restriction type="skill" ids="" />
2102+ </event>
2103+
2104+ <!-- Lucky Chests -->
2105+ <event id="5">
2106+ <property name="minLvl" value="40" />
2107+ <property name="maxLvl" value="80" />
2108+ <property name="eventName" value="Lucky Chests" />
2109+ <property name="ids" value="5" />
2110+ <property name="matchTime" value="180" />
2111+ <property name="rewardId" value="6392" />
2112+ <property name="rewardAmmount" value="20" />
2113+ <property name="allowPotions" value="false" />
2114+ <property name="allowUseMagic" value="false" />
2115+ <property name="removeBuffs" value="true" />
2116+ <property name="minPlayers" value="8" />
2117+ <property name="chestNpcId" value="9102" />
2118+ <property name="numberOfChests" value="300" />
2119+ <color owner="All" r="255" g="255" b="255"/>
2120+ <position owner="All" x="106037" y="114816" z="-1560" radius="100" />
2121+ <position owner="Chests" x="106037" y="114816" z="-1560" radius="700" />
2122+ <restriction type="item" ids="" />
2123+ <restriction type="skill" ids="" />
2124+ </event>
2125+
2126+ <!-- Simon Says -->
2127+ <event id="6">
2128+ <property name="minLvl" value="40" />
2129+ <property name="maxLvl" value="80" />
2130+ <property name="eventName" value="Simon Says" />
2131+ <property name="ids" value="6" />
2132+ <property name="roundTime" value="10" />
2133+ <property name="rewardId" value="6392" />
2134+ <property name="rewardAmmount" value="25" />
2135+ <property name="allowPotions" value="false" />
2136+ <property name="allowUseMagic" value="false" />
2137+ <property name="removeBuffs" value="false" />
2138+ <property name="minPlayers" value="8" />
2139+ <property name="simonNpcId" value="9101" />
2140+ <property name="lengthOfFirstWord" value="3" />
2141+ <property name="increasePerRound" value="1" />
2142+ <color owner="All" r="255" g="255" b="255"/>
2143+ <position owner="All" x="106037" y="114816" z="-1560" radius="100" />
2144+ <position owner="Simon" x="106037" y="114816" z="-1560" radius="0" />
2145+ <restriction type="item" ids="" />
2146+ <restriction type="skill" ids="" />
2147+ </event>
2148+
2149+ <!-- Team vs Team -->
2150+ <event id="7">
2151+ <property name="minLvl" value="70" />
2152+ <property name="maxLvl" value="80" />
2153+ <property name="eventName" value="Team vs Team" />
2154+ <property name="ids" value="7" />
2155+ <property name="matchTime" value="300" />
2156+ <property name="rewardId" value="6392" />
2157+ <property name="rewardAmmount" value="10" />
2158+ <property name="allowPotions" value="false" />
2159+ <property name="allowUseMagic" value="true" />
2160+ <property name="removeBuffs" value="true" />
2161+ <property name="minPlayers" value="8" />
2162+ <color owner="Blue" r="0" g="0" b="255"/>
2163+ <color owner="Red" r="255" g="0" b="0"/>
2164+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2165+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2166+ <restriction type="item" ids="" />
2167+ <restriction type="skill" ids="" />
2168+ </event>
2169+
2170+ <!-- VIP Team vs Team -->
2171+ <event id="8">
2172+ <property name="minLvl" value="70" />
2173+ <property name="maxLvl" value="80" />
2174+ <property name="eventName" value="VIP Team vs Team" />
2175+ <property name="ids" value="8" />
2176+ <property name="matchTime" value="300" />
2177+ <property name="rewardId" value="6392" />
2178+ <property name="rewardAmmount" value="10" />
2179+ <property name="allowPotions" value="false" />
2180+ <property name="allowUseMagic" value="true" />
2181+ <property name="removeBuffs" value="true" />
2182+ <property name="minPlayers" value="8" />
2183+ <color owner="Blue" r="0" g="0" b="255"/>
2184+ <color owner="Red" r="255" g="0" b="0"/>
2185+ <color owner="BlueVIP" r="0" g="255" b="255"/>
2186+ <color owner="RedVIP" r="255" g="155" b="0"/>
2187+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2188+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2189+ <restriction type="item" ids="" />
2190+ <restriction type="skill" ids="" />
2191+ </event>
2192+
2193+ <!-- Zombie -->
2194+ <event id="9">
2195+ <property name="minLvl" value="40" />
2196+ <property name="maxLvl" value="80" />
2197+ <property name="eventName" value="Zombie" />
2198+ <property name="ids" value="9" />
2199+ <property name="matchTime" value="240" />
2200+ <property name="rewardId" value="6392" />
2201+ <property name="rewardAmmount" value="25" />
2202+ <property name="allowPotions" value="false" />
2203+ <property name="allowUseMagic" value="false" />
2204+ <property name="removeBuffs" value="true" />
2205+ <property name="minPlayers" value="8" />
2206+ <color owner="All" r="255" g="255" b="255"/>
2207+ <color owner="Zombie" r="255" g="0" b="0"/>
2208+ <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
2209+ <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
2210+ <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
2211+ <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
2212+ <restriction type="item" ids="" />
2213+ <restriction type="skill" ids="" />
2214+ </event>
2215+
2216+ <!-- Capture the Flag -->
2217+ <event id="10">
2218+ <property name="minLvl" value="70" />
2219+ <property name="maxLvl" value="80" />
2220+ <property name="eventName" value="Capture the Flag" />
2221+ <property name="ids" value="10" />
2222+ <property name="matchTime" value="300" />
2223+ <property name="rewardId" value="6392" />
2224+ <property name="rewardAmmount" value="10" />
2225+ <property name="allowPotions" value="false" />
2226+ <property name="allowUseMagic" value="true" />
2227+ <property name="removeBuffs" value="true" />
2228+ <property name="minPlayers" value="8" />
2229+ <property name="blueFlagId" value="9104" />
2230+ <property name="redFlagId" value="9105" />
2231+ <property name="blueFlagHolderId" value="9106" />
2232+ <property name="redFlagHolderId" value="9107" />
2233+ <color owner="Blue" r="0" g="0" b="255"/>
2234+ <color owner="Red" r="255" g="0" b="0"/>
2235+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2236+ <position owner="BlueFlag" x="106391" y="116331" z="-1587" radius="0" />
2237+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2238+ <position owner="RedFlag" x="105696" y="113522" z="-1587" radius="0" />
2239+ <restriction type="item" ids="" />
2240+ <restriction type="skill" ids="" />
2241+ </event>
2242+
2243+
2244+ <!-- Russian Roulette -->
2245+ <event id="11">
2246+ <property name="minLvl" value="40" />
2247+ <property name="maxLvl" value="80" />
2248+ <property name="eventName" value="Russian Roulette" />
2249+ <property name="ids" value="11" />
2250+ <property name="matchTime" value="240" />
2251+ <property name="rewardId" value="6392" />
2252+ <property name="rewardAmmount" value="15" />
2253+ <property name="allowPotions" value="false" />
2254+ <property name="allowUseMagic" value="false" />
2255+ <property name="removeBuffs" value="false" />
2256+ <property name="minPlayers" value="8" />
2257+ <property name="russianNpcId" value="9108" />
2258+ <property name="numberOfRussians" value="6" />
2259+ <property name="roundTime" value="10" />
2260+ <color owner="All" r="255" g="255" b="255"/>
2261+ <position owner="All" x="106037" y="114816" z="-1560" radius="100" />
2262+ <position owner="Russian" x="106109" y="114947" z="-1587" radius="0" />
2263+ <position owner="Russian" x="106176" y="114792" z="-1587" radius="0" />
2264+ <position owner="Russian" x="106138" y="114658" z="-1587" radius="0" />
2265+ <position owner="Russian" x="106010" y="114607" z="-1587" radius="0" />
2266+ <position owner="Russian" x="105859" y="114672" z="-1587" radius="0" />
2267+ <position owner="Russian" x="105875" y="114837" z="-1587" radius="0" />
2268+ <restriction type="item" ids="" />
2269+ <restriction type="skill" ids="" />
2270+ </event>
2271+
2272+ <!-- Bomb Fight -->
2273+ <event id="12">
2274+ <property name="minLvl" value="40" />
2275+ <property name="maxLvl" value="80" />
2276+ <property name="eventName" value="Bomb Fight" />
2277+ <property name="ids" value="12" />
2278+ <property name="matchTime" value="300" />
2279+ <property name="rewardId" value="6392" />
2280+ <property name="rewardAmmount" value="10" />
2281+ <property name="allowPotions" value="false" />
2282+ <property name="allowUseMagic" value="true" />
2283+ <property name="removeBuffs" value="true" />
2284+ <property name="minPlayers" value="8" />
2285+ <property name="bombNpcId" value="9109" />
2286+ <property name="bombRadius" value="100" />
2287+ <property name="bombSkillId" value="5220" />
2288+ <color owner="Blue" r="0" g="0" b="255"/>
2289+ <color owner="Red" r="255" g="0" b="0"/>
2290+ <position owner="Blue" x="11619" y="-49691" z="-3008" radius="50" />
2291+ <position owner="Red" x="12720" y="-48594" z="-3035" radius="50" />
2292+ <restriction type="item" ids="" />
2293+ <restriction type="skill" ids="" />
2294+ </event>
2295+
2296+ <!-- Mutant -->
2297+ <event id="13">
2298+ <property name="minLvl" value="70" />
2299+ <property name="maxLvl" value="80" />
2300+ <property name="eventName" value="Mutant" />
2301+ <property name="ids" value="13" />
2302+ <property name="matchTime" value="240" />
2303+ <property name="rewardId" value="6392" />
2304+ <property name="rewardAmmount" value="25" />
2305+ <property name="allowPotions" value="false" />
2306+ <property name="allowUseMagic" value="true" />
2307+ <property name="removeBuffs" value="true" />
2308+ <property name="minPlayers" value="8" />
2309+ <property name="mutantBuffId" value="9007" />
2310+ <color owner="All" r="255" g="255" b="255"/>
2311+ <position owner="All" x="106037" y="114816" z="-1560" radius="700" />
2312+ <restriction type="item" ids="" />
2313+ <restriction type="skill" ids="" />
2314+ </event>
2315+
2316+ <!-- Battlefield -->
2317+ <event id="14">
2318+ <property name="minLvl" value="70" />
2319+ <property name="maxLvl" value="80" />
2320+ <property name="eventName" value="Battlefield" />
2321+ <property name="ids" value="14" />
2322+ <property name="matchTime" value="300" />
2323+ <property name="rewardId" value="6392" />
2324+ <property name="rewardAmmount" value="10" />
2325+ <property name="allowPotions" value="false" />
2326+ <property name="allowUseMagic" value="true" />
2327+ <property name="removeBuffs" value="false" />
2328+ <property name="minPlayers" value="8" />
2329+ <property name="numOfBases" value="5" />
2330+ <property name="baseNpcId" value="9110" />
2331+ <property name="captureSkillId" value="5219" />
2332+ <color owner="Blue" r="0" g="0" b="255"/>
2333+ <color owner="Red" r="255" g="0" b="0"/>
2334+ <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
2335+ <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
2336+ <position owner="Base" x="106037" y="114816" z="-1587" radius="0" />
2337+ <position owner="Base" x="106995" y="114556" z="-1587" radius="0" />
2338+ <position owner="Base" x="104823" y="115175" z="-1587" radius="0" />
2339+ <position owner="Base" x="105752" y="116245" z="-1587" radius="0" />
2340+ <position owner="Base" x="106907" y="113671" z="-1587" radius="0" />
2341+ <restriction type="item" ids="" />
2342+ <restriction type="skill" ids="" />
2343+ </event>
2344+</events>
2345\ No newline at end of file
2346Index: head-src/com/l2jfrozen/gameserver/event/Mutant.java
2347===================================================================
2348--- head-src/com/l2jfrozen/gameserver/event/Mutant.java (nonexistent)
2349+++ head-src/com/l2jfrozen/gameserver/event/Mutant.java (working copy)
2350@@ -0,0 +1,212 @@
2351+/*
2352+ * This program is free software: you can redistribute it and/or modify it under
2353+ * the terms of the GNU General Public License as published by the Free Software
2354+ * Foundation, either version 3 of the License, or (at your option) any later
2355+ * version.
2356+ *
2357+ * This program is distributed in the hope that it will be useful, but WITHOUT
2358+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
2359+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
2360+ * details.
2361+ *
2362+ * You should have received a copy of the GNU General Public License along with
2363+ * this program. If not, see <http://www.gnu.org/licenses/>.
2364+ */
2365+package com.l2jfrozen.gameserver.event;
2366+
2367+import javolution.text.TextBuilder;
2368+
2369+import com.l2jfrozen.gameserver.datatables.SkillTable;
2370+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
2371+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
2372+import com.l2jfrozen.gameserver.model.L2Object;
2373+
2374+/**
2375+ * @author Rizel
2376+ *
2377+ */
2378+public class Mutant extends Event
2379+{
2380+
2381+ private class Core implements Runnable
2382+ {
2383+ public void run()
2384+ {
2385+ try
2386+ {
2387+ switch (eventState)
2388+ {
2389+ case START:
2390+ divideIntoTeams(1);
2391+ preparePlayers();
2392+ teleportToTeamPos();
2393+ forceSitAll();
2394+ setStatus(EventState.FIGHT);
2395+ schedule(20000);
2396+ break;
2397+
2398+ case FIGHT:
2399+ forceStandAll();
2400+ transformMutant(getRandomPlayer());
2401+ setStatus(EventState.END);
2402+ clock.startClock(getInt("matchTime"));
2403+ break;
2404+
2405+ case END:
2406+ clock.setTime(0);
2407+ untransformMutant();
2408+ L2PcInstance winner = getPlayerWithMaxScore();
2409+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
2410+ setStatus(EventState.INACTIVE);
2411+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " kills!");
2412+ break;
2413+ }
2414+ }
2415+ catch (Throwable e)
2416+ {
2417+ e.printStackTrace();
2418+ EventManager.getInstance().end("Error! Event ended.");
2419+ }
2420+ }
2421+ }
2422+
2423+ private enum EventState
2424+ {
2425+ START, FIGHT, END, INACTIVE
2426+ }
2427+
2428+ private EventState eventState;
2429+
2430+ private Core task;
2431+
2432+ private L2PcInstance mutant;
2433+
2434+ public Mutant()
2435+ {
2436+ super();
2437+ eventId = 13;
2438+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
2439+ task = new Core();
2440+ }
2441+
2442+ /**
2443+ * @see net.sf.l2j.gameserver.event.Event#endEvent()
2444+ */
2445+ @Override
2446+ protected void endEvent()
2447+ {
2448+ setStatus(EventState.END);
2449+ clock.setTime(0);
2450+ }
2451+
2452+ @Override
2453+ protected String getScorebar()
2454+ {
2455+ return "Max: " + getScore(getPlayerWithMaxScore()) + " Time: " + clock.getTime() + "";
2456+ }
2457+
2458+ @Override
2459+ public void onDie(L2PcInstance victim, L2PcInstance killer)
2460+ {
2461+ super.onDie(victim, killer);
2462+ addToResurrector(victim);
2463+ }
2464+
2465+ @Override
2466+ public void onKill(L2PcInstance victim, L2PcInstance killer)
2467+ {
2468+ super.onKill(victim, killer);
2469+ if (getStatus(killer) == 1)
2470+ increasePlayersScore(killer);
2471+ if (getStatus(killer) == 0 && getStatus(victim) == 1)
2472+ transformMutant(killer);
2473+ killer.addItem("Event", 6392, 1, killer, true);
2474+ }
2475+
2476+ @Override
2477+ public void onLogout(L2PcInstance player)
2478+ {
2479+ super.onLogout(player);
2480+
2481+ if (mutant == player)
2482+ transformMutant(getRandomPlayer());
2483+ }
2484+
2485+ @Override
2486+ protected void schedule(int time)
2487+ {
2488+ tpm.scheduleGeneral(task, time);
2489+ }
2490+
2491+ private void setStatus(EventState s)
2492+ {
2493+ eventState = s;
2494+ }
2495+
2496+ @Override
2497+ protected void showHtml(L2PcInstance player, int obj)
2498+ {
2499+ if (players.size() > 0)
2500+ {
2501+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
2502+ TextBuilder sb = new TextBuilder();
2503+
2504+ 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>");
2505+ sb.append("<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>");
2506+ sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
2507+ sb.append("<br><table width=270>");
2508+
2509+ for (L2PcInstance p : getPlayersOfTeam(1))
2510+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
2511+
2512+ sb.append("</table></body></html>");
2513+ html.setHtml(sb.toString());
2514+ player.sendPacket(html);
2515+ }
2516+
2517+ }
2518+
2519+ @Override
2520+ protected void start()
2521+ {
2522+ setStatus(EventState.START);
2523+ schedule(1);
2524+ }
2525+
2526+ private void transformMutant(L2PcInstance player)
2527+ {
2528+ player.addSkill(SkillTable.getInstance().getInfo(getInt("mutantBuffId"), 1), false);
2529+ setStatus(player, 1);
2530+ untransformMutant();
2531+ polymorph(player,25286);
2532+ player.getAppearance().setNameColor(255, 0, 0);
2533+ player.broadcastUserInfo();
2534+ mutant = player;
2535+
2536+ }
2537+
2538+ private void untransformMutant()
2539+ {
2540+ if (mutant != null)
2541+ {
2542+ mutant.getAppearance().setNameColor(getColor("All")[0], getColor("All")[1], getColor("All")[2]);
2543+ mutant.removeSkill(SkillTable.getInstance().getInfo(getInt("mutantBuffId"), 1), false);
2544+ setStatus(mutant, 0);
2545+ unpolymorph(mutant);
2546+ mutant.broadcastUserInfo();
2547+ mutant = null;
2548+ }
2549+ }
2550+ @Override
2551+ public boolean canAttack(L2PcInstance player, L2Object target)
2552+ {
2553+ if (target instanceof L2PcInstance)
2554+ if (getStatus(player) == 0 && getStatus((L2PcInstance) target) == 0)
2555+ return false;
2556+ else
2557+ return true;
2558+
2559+ return false;
2560+ }
2561+
2562+}
2563\ No newline at end of file
2564Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/Say2.java
2565===================================================================
2566--- head-src/com/l2jfrozen/gameserver/network/clientpackets/Say2.java (revision 1132)
2567+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/Say2.java (working copy)
2568@@ -30,6 +30,8 @@
2569
2570 import com.l2jfrozen.Config;
2571 import com.l2jfrozen.gameserver.datatables.csv.MapRegionTable;
2572+import com.l2jfrozen.gameserver.event.EventManager;
2573+import com.l2jfrozen.gameserver.event.LMS;
2574 import com.l2jfrozen.gameserver.handler.IVoicedCommandHandler;
2575 import com.l2jfrozen.gameserver.handler.VoicedCommandHandler;
2576 import com.l2jfrozen.gameserver.managers.PetitionManager;
2577@@ -68,6 +70,8 @@
2578 public final static int HERO_VOICE = 17; // %
2579 public final static int CRITICAL_ANNOUNCE = 18;
2580
2581+ private boolean _isInLMS;
2582+
2583 private final static String[] CHAT_NAMES =
2584 {
2585 "ALL ",
2586@@ -268,7 +272,18 @@
2587 }
2588
2589 final CreatureSay cs = new CreatureSay(activeChar.getObjectId(), _type, activeChar.getName(), _text);
2590- switch (_type)
2591+ if (EventManager.getInstance().isRegistered(activeChar))
2592+ EventManager.getInstance().getCurrentEvent().onSay(_type, activeChar, _text);
2593+
2594+ _isInLMS = EventManager.getInstance().isRegistered(activeChar) && EventManager.getInstance().getCurrentEvent() instanceof LMS;
2595+
2596+ if(_isInLMS)
2597+ {
2598+ activeChar.sendMessage("You cannot talk while in LMS");
2599+ return;
2600+ }
2601+
2602+ switch (_type)
2603 {
2604 case TELL:
2605 final L2PcInstance receiver = L2World.getInstance().getPlayer(_target);
2606Index: head-src/com/l2jfrozen/gameserver/Shutdown.java
2607===================================================================
2608--- head-src/com/l2jfrozen/gameserver/Shutdown.java (revision 1132)
2609+++ head-src/com/l2jfrozen/gameserver/Shutdown.java (working copy)
2610@@ -23,6 +23,8 @@
2611 import org.apache.log4j.Logger;
2612
2613 import com.l2jfrozen.Config;
2614+import com.l2jfrozen.gameserver.event.EventBuffer;
2615+import com.l2jfrozen.gameserver.event.EventManager;
2616 import com.l2jfrozen.gameserver.controllers.GameTimeController;
2617 import com.l2jfrozen.gameserver.controllers.TradeController;
2618 import com.l2jfrozen.gameserver.datatables.CharSchemesTable;
2619@@ -706,6 +708,9 @@
2620
2621 CharSchemesTable.getInstance().onServerShutdown();
2622
2623+ if(EventManager.getInstance().getBoolean("eventBufferEnabled"))
2624+ EventBuffer.getInstance().updateSQL();
2625+
2626 // Save items on ground before closing
2627 if (Config.SAVE_DROPPED_ITEM)
2628 {
2629Index: head-src/com/l2jfrozen/gameserver/model/L2Character.java
2630===================================================================
2631--- head-src/com/l2jfrozen/gameserver/model/L2Character.java (revision 1132)
2632+++ head-src/com/l2jfrozen/gameserver/model/L2Character.java (working copy)
2633@@ -47,6 +47,7 @@
2634 import com.l2jfrozen.gameserver.datatables.csv.MapRegionTable;
2635 import com.l2jfrozen.gameserver.datatables.csv.MapRegionTable.TeleportWhereType;
2636 import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
2637+import com.l2jfrozen.gameserver.event.EventManager;
2638 import com.l2jfrozen.gameserver.geo.GeoData;
2639 import com.l2jfrozen.gameserver.geo.pathfinding.Node;
2640 import com.l2jfrozen.gameserver.geo.pathfinding.PathFinding;
2641@@ -1006,6 +1007,53 @@
2642 */
2643 protected void doAttack(final L2Character target)
2644 {
2645+ if (this instanceof L2PcInstance)
2646+ if (EventManager.getInstance().isRegistered((L2PcInstance) this))
2647+ {
2648+
2649+ if (target instanceof L2PcInstance)
2650+ if (EventManager.getInstance().areTeammates(
2651+ (L2PcInstance) this, (L2PcInstance) target)
2652+ && !EventManager.getInstance().getBoolean(
2653+ "friendlyFireEnabled"))
2654+ {
2655+ sendPacket(new ActionFailed());
2656+ return;
2657+ }
2658+
2659+ if (!EventManager.getInstance().getCurrentEvent()
2660+ .canAttack((L2PcInstance) this, target))
2661+ {
2662+ sendPacket(new ActionFailed());
2663+ return;
2664+ }
2665+ }
2666+
2667+ if (this instanceof L2Summon)
2668+ {
2669+ if (EventManager.getInstance().isRegistered(
2670+ ((L2Summon) this).getOwner()))
2671+ {
2672+ if (target instanceof L2PcInstance)
2673+ if (EventManager.getInstance()
2674+ .areTeammates(((L2Summon) this).getOwner(),
2675+ (L2PcInstance) target)
2676+ && !EventManager.getInstance().getBoolean(
2677+ "friendlyFireEnabled"))
2678+ {
2679+ sendPacket(new ActionFailed());
2680+ return;
2681+ }
2682+
2683+ if (!EventManager.getInstance().getCurrentEvent()
2684+ .canAttack(((L2Summon) this).getOwner(), target))
2685+ {
2686+ sendPacket(new ActionFailed());
2687+ return;
2688+ }
2689+ }
2690+ }
2691+
2692 if (Config.DEBUG)
2693 {
2694 LOGGER.debug(getName() + " doAttack: target=" + target);
2695@@ -1360,6 +1408,10 @@
2696 weaponInst.setChargedSoulshot(L2ItemInstance.CHARGED_NONE);
2697 }
2698
2699+ if(this instanceof L2PcInstance && target instanceof L2PcInstance)
2700+ if(EventManager.getInstance().isRegistered((L2PcInstance)this))
2701+ EventManager.getInstance().getCurrentEvent().onHit((L2PcInstance)this,(L2PcInstance)target);
2702+
2703 if (player != null)
2704 {
2705 if (player.isCursedWeaponEquiped())
2706@@ -1716,6 +1768,75 @@
2707 */
2708 public void doCast(final L2Skill skill)
2709 {
2710+ try{
2711+ if(getTarget() != null)
2712+ {
2713+ if (this instanceof L2PcInstance)
2714+ {
2715+ if (EventManager.getInstance().isRegistered((L2PcInstance) this))
2716+ {
2717+ if (!EventManager.getInstance().getCurrentEvent()
2718+ .canAttack((L2PcInstance) this, getTarget()))
2719+ return;
2720+
2721+ if (this.getTarget() instanceof L2PcInstance)
2722+ if (EventManager.getInstance().areTeammates(
2723+ (L2PcInstance) this,
2724+ (L2PcInstance) this.getTarget())
2725+ && !EventManager.getInstance().getBoolean(
2726+ "friendlyFireEnabled")
2727+ && skill.isOffensive())
2728+ {
2729+ getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
2730+ return;
2731+ }
2732+
2733+ if (!EventManager.getInstance().getCurrentEvent()
2734+ .canAttack((L2PcInstance) this, this.getTarget()))
2735+ {
2736+ getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
2737+ return;
2738+ }
2739+ }
2740+ }
2741+
2742+ if (this instanceof L2Summon)
2743+ {
2744+ if(((L2Summon) this).getOwner() != null)
2745+ if (EventManager.getInstance().isRegistered(
2746+ ((L2Summon) this).getOwner()))
2747+ {
2748+ if (!EventManager.getInstance().getCurrentEvent()
2749+ .canAttack(((L2Summon) this).getOwner(), getTarget()))
2750+ return;
2751+
2752+ if (this.getTarget() instanceof L2PcInstance)
2753+ if (EventManager.getInstance().areTeammates(
2754+ ((L2Summon) this).getOwner(),
2755+ (L2PcInstance) this.getTarget())
2756+ && !EventManager.getInstance().getBoolean(
2757+ "friendlyFireEnabled")
2758+ && skill.isOffensive())
2759+ {
2760+ getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
2761+ return;
2762+ }
2763+
2764+ if (!EventManager
2765+ .getInstance()
2766+ .getCurrentEvent()
2767+ .canAttack(((L2Summon) this).getOwner(),
2768+ this.getTarget()))
2769+ {
2770+ getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
2771+ return;
2772+
2773+ }
2774+ }
2775+ }
2776+ }
2777+ }catch(ClassCastException e){}
2778+
2779 final L2Character activeChar = this;
2780
2781 if (skill == null)
2782Index: head-src/com/l2jfrozen/gameserver/event/Simon.java
2783===================================================================
2784--- head-src/com/l2jfrozen/gameserver/event/Simon.java (nonexistent)
2785+++ head-src/com/l2jfrozen/gameserver/event/Simon.java (working copy)
2786@@ -0,0 +1,308 @@
2787+package com.l2jfrozen.gameserver.event;
2788+
2789+import javolution.text.TextBuilder;
2790+
2791+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
2792+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
2793+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
2794+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
2795+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
2796+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
2797+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
2798+import com.l2jfrozen.util.random.Rnd;
2799+
2800+/**
2801+ * @author Rizel
2802+ *
2803+ */
2804+public class Simon extends Event
2805+{
2806+
2807+ private class Core implements Runnable
2808+ {
2809+ public void run()
2810+ {
2811+ try
2812+ {
2813+ switch (eventState)
2814+ {
2815+ case START:
2816+ divideIntoTeams(1);
2817+ preparePlayers();
2818+ teleportToTeamPos();
2819+ forceSitAll();
2820+ unequip();
2821+ setStatus(EventState.SAY);
2822+ schedule(30000);
2823+ break;
2824+
2825+ case SAY:
2826+ round++;
2827+ say = createNewRandomString(getInt("lengthOfFirstWord") + getInt("increasePerRound") * round);
2828+ sendToPlayers(say.toUpperCase());
2829+ setStatus(EventState.CHECK);
2830+ schedule(getInt("roundTime") * 1000);
2831+ break;
2832+
2833+ case CHECK:
2834+ if (removeAfkers())
2835+ {
2836+ setAllToFalse();
2837+ setStatus(EventState.SAY);
2838+ schedule(getInt("roundTime") * 1000);
2839+ }
2840+ break;
2841+
2842+ case END:
2843+ setStatus(EventState.INACTIVE);
2844+ forceStandAll();
2845+
2846+ if (winner != null)
2847+ {
2848+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
2849+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event!");
2850+ }
2851+ else
2852+ EventManager.getInstance().end("The match ended in a tie!");
2853+ break;
2854+ }
2855+ }
2856+ catch (Throwable e)
2857+ {
2858+ e.printStackTrace();
2859+ EventManager.getInstance().end("Error! Event ended.");
2860+ }
2861+ }
2862+ }
2863+
2864+ private enum EventState
2865+ {
2866+ START, SAY, CHECK, END, INACTIVE
2867+ }
2868+
2869+ private EventState eventState;
2870+
2871+ private Core task;
2872+
2873+ private int round;
2874+
2875+ private String say;
2876+
2877+ private L2NpcInstance npc;
2878+
2879+ private L2Spawn spawn;
2880+
2881+ private CreatureSay message;
2882+
2883+ private L2PcInstance winner;
2884+
2885+ public Simon()
2886+ {
2887+ super();
2888+ eventId = 6;
2889+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
2890+ task = new Core();
2891+ round = 0;
2892+ spawn = null;
2893+ npc = null;
2894+ winner = null;
2895+ }
2896+
2897+ private String createNewRandomString(int size)
2898+ {
2899+ String str = "";
2900+
2901+ for (int i = 0; i < size; i++)
2902+ str = str + (char) (Rnd.nextInt(26) + 97);
2903+
2904+ return str;
2905+ }
2906+
2907+ @Override
2908+ protected void endEvent()
2909+ {
2910+ winner = players.head().getNext().getKey();
2911+ setStatus(EventState.END);
2912+ schedule(1);
2913+
2914+ }
2915+
2916+ @Override
2917+ protected String getScorebar()
2918+ {
2919+ return "";
2920+ }
2921+
2922+ @Override
2923+ public void onSay(int type, L2PcInstance player, String text)
2924+ {
2925+ if (eventState == EventState.CHECK && getStatus(player) != -1)
2926+ {
2927+ if (text.equalsIgnoreCase(say))
2928+ {
2929+ setStatus(player, 1);
2930+ player.sendMessage("Correct!");
2931+ increasePlayersScore(player);
2932+ player.getAppearance().setNameColor(0, 255, 0);
2933+ player.broadcastUserInfo();
2934+ }
2935+
2936+ else
2937+ {
2938+ setStatus(player, -1);
2939+ player.sendMessage("Wrong!");
2940+ player.getAppearance().setNameColor(255, 0, 0);
2941+ player.broadcastUserInfo();
2942+ }
2943+
2944+ int falses = 0;
2945+ L2PcInstance falsed = null;
2946+ for (L2PcInstance p : getPlayerList())
2947+ if (getStatus(p) == 0)
2948+ {
2949+ falses++;
2950+ falsed = p;
2951+ }
2952+
2953+ if (falses == 1)
2954+ {
2955+ int count = 0;
2956+ for (L2PcInstance pla : getPlayerList())
2957+ if (getStatus(pla) == 1)
2958+ count++;
2959+
2960+ if (count >= 1)
2961+ {
2962+ falsed.sendMessage("Last one!");
2963+ falsed.getAppearance().setNameColor(255, 0, 0);
2964+ falsed.broadcastUserInfo();
2965+ setStatus(falsed, -1);
2966+ }
2967+
2968+ if (count == 0)
2969+ {
2970+ winner = getPlayersWithStatus(0).head().getNext().getValue();
2971+ setStatus(EventState.END);
2972+ schedule(1);
2973+ }
2974+
2975+ }
2976+
2977+ if (countOfPositiveStatus() == 1)
2978+ {
2979+ winner = getPlayersWithStatus(1).head().getNext().getValue();
2980+ setStatus(EventState.END);
2981+ schedule(1);
2982+ }
2983+
2984+ }
2985+
2986+ }
2987+
2988+ private boolean removeAfkers()
2989+ {
2990+
2991+ for (L2PcInstance player : getPlayerList())
2992+ {
2993+ if (getStatus(player) == 0)
2994+ {
2995+
2996+ player.sendMessage("Timeout!");
2997+ player.getAppearance().setNameColor(255, 0, 0);
2998+ player.broadcastUserInfo();
2999+ setStatus(player, -1);
3000+ }
3001+
3002+ if (countOfPositiveStatus() == 1)
3003+ {
3004+ if (getPlayersWithStatus(1).size() == 1)
3005+ winner = getPlayersWithStatus(1).head().getNext().getValue();
3006+ else
3007+ winner = null;
3008+
3009+ setStatus(EventState.END);
3010+ schedule(1);
3011+ return false;
3012+ }
3013+ }
3014+ return true;
3015+ }
3016+
3017+ @Override
3018+ public void reset()
3019+ {
3020+ super.reset();
3021+ round = 0;
3022+ players.clear();
3023+ say = "";
3024+ npc.deleteMe();
3025+ spawn.stopRespawn();
3026+ SpawnTable.getInstance().deleteSpawn(spawn, true);
3027+ npc = null;
3028+ spawn = null;
3029+ }
3030+
3031+ @Override
3032+ protected void schedule(int time)
3033+ {
3034+ tpm.scheduleGeneral(task, time);
3035+ }
3036+
3037+ private void sendToPlayers(String text)
3038+ {
3039+ message = new CreatureSay(npc.getObjectId(), 1, "Simon", text);
3040+ for (L2PcInstance player : getPlayerList())
3041+ player.sendPacket(message);
3042+ }
3043+
3044+ private void setAllToFalse()
3045+ {
3046+ for (L2PcInstance player : getPlayerList())
3047+ if (getStatus(player) != -1)
3048+ {
3049+ setStatus(player, 0);
3050+ player.getAppearance().setNameColor(255, 255, 255);
3051+ player.broadcastUserInfo();
3052+ }
3053+ }
3054+
3055+ private void setStatus(EventState s)
3056+ {
3057+ eventState = s;
3058+ }
3059+
3060+ @Override
3061+ protected void showHtml(L2PcInstance player, int obj)
3062+ {
3063+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
3064+ TextBuilder sb = new TextBuilder();
3065+
3066+ 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>");
3067+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>Running</td><td width=130><center>" + getString("eventName") + "</td><td width=70>Time: ?</td></tr></table>");
3068+ sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
3069+ sb.append("<br><table width=270>");
3070+
3071+ for (L2PcInstance p : getPlayersOfTeam(1))
3072+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
3073+
3074+ sb.append("</table></body></html>");
3075+ html.setHtml(sb.toString());
3076+ player.sendPacket(html);
3077+ }
3078+
3079+ @Override
3080+ protected void start()
3081+ {
3082+ int[] npcpos = getPosition("Simon", 1);
3083+ spawn = spawnNPC(npcpos[0], npcpos[1], npcpos[2], getInt("simonNpcId"));
3084+ npc = spawn.getLastSpawn();
3085+ setStatus(EventState.START);
3086+ schedule(1);
3087+ }
3088+
3089+ @Override
3090+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
3091+ {
3092+ return false;
3093+ }
3094+}
3095\ No newline at end of file
3096Index: head-src/com/l2jfrozen/gameserver/event/dm.java
3097===================================================================
3098--- head-src/com/l2jfrozen/gameserver/event/dm.java (nonexistent)
3099+++ head-src/com/l2jfrozen/gameserver/event/dm.java (working copy)
3100@@ -0,0 +1,139 @@
3101+package com.l2jfrozen.gameserver.event;
3102+
3103+import javolution.text.TextBuilder;
3104+
3105+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3106+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
3107+
3108+public class dm extends Event
3109+{
3110+private class Core implements Runnable
3111+{
3112+public void run()
3113+{
3114+try
3115+{
3116+switch (eventState)
3117+{
3118+case START:
3119+divideIntoTeams(1);
3120+preparePlayers();
3121+teleportToTeamPos();
3122+forceSitAll();
3123+setStatus(EventState.FIGHT);
3124+debug("The event started with " + players.size() + " player");
3125+schedule(20000);
3126+break;
3127+
3128+case FIGHT:
3129+forceStandAll();
3130+setStatus(EventState.END);
3131+debug("The fight started");
3132+clock.startClock(getInt("matchTime"));
3133+break;
3134+
3135+case END:
3136+clock.setTime(0);
3137+L2PcInstance winner = getPlayerWithMaxScore();
3138+giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
3139+setStatus(EventState.INACTIVE);
3140+debug("The event ended. Winner: " + winner.getName());
3141+EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " kills!");
3142+break;
3143+}
3144+}
3145+catch (Throwable e)
3146+{
3147+e.printStackTrace();
3148+EventManager.getInstance().end("Error! Event ended.");
3149+}
3150+}
3151+}
3152+
3153+private enum EventState
3154+{
3155+START, FIGHT, END, INACTIVE
3156+}
3157+
3158+private EventState eventState;
3159+
3160+private Core task;
3161+
3162+public dm()
3163+{
3164+super();
3165+eventId = 1;
3166+createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
3167+task = new Core();
3168+}
3169+
3170+@Override
3171+protected void endEvent()
3172+{
3173+setStatus(EventState.END);
3174+clock.setTime(0);
3175+
3176+}
3177+
3178+@Override
3179+protected String getScorebar()
3180+{
3181+return "Max: " + getScore(getPlayerWithMaxScore()) + " Time: " + clock.getTime() + "";
3182+}
3183+
3184+@Override
3185+public void onDie(L2PcInstance victim, L2PcInstance killer)
3186+{
3187+super.onDie(victim, killer);
3188+addToResurrector(victim);
3189+}
3190+
3191+@Override
3192+public void onKill(L2PcInstance victim, L2PcInstance killer)
3193+{
3194+super.onKill(victim, killer);
3195+killer.addItem("Event", 6392, 1, killer, true);
3196+increasePlayersScore(killer);
3197+}
3198+
3199+@Override
3200+protected void schedule(int time)
3201+{
3202+tpm.scheduleGeneral(task, time);
3203+}
3204+
3205+private void setStatus(EventState s)
3206+{
3207+eventState = s;
3208+}
3209+
3210+@Override
3211+protected void showHtml(L2PcInstance player, int obj)
3212+{
3213+if (players.size() > 0)
3214+{
3215+NpcHtmlMessage html = new NpcHtmlMessage(obj);
3216+TextBuilder sb = new TextBuilder();
3217+
3218+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>");
3219+sb.append("<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>");
3220+sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
3221+sb.append("<br><table width=270>");
3222+
3223+for (L2PcInstance p : getPlayersOfTeam(1))
3224+sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
3225+
3226+sb.append("</table></body></html>");
3227+html.setHtml(sb.toString());
3228+player.sendPacket(html);
3229+}
3230+}
3231+
3232+@Override
3233+protected void start()
3234+{
3235+setStatus(EventState.START);
3236+schedule(1);
3237+}
3238+
3239+}
3240\ No newline at end of file
3241Index: head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Bomb.java
3242===================================================================
3243--- head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Bomb.java (nonexistent)
3244+++ head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Bomb.java (working copy)
3245@@ -0,0 +1,30 @@
3246+package com.l2jfrozen.gameserver.handler.skillhandlers;
3247+
3248+import com.l2jfrozen.gameserver.event.EventManager;
3249+import com.l2jfrozen.gameserver.handler.ISkillHandler;
3250+import com.l2jfrozen.gameserver.model.L2Character;
3251+import com.l2jfrozen.gameserver.model.L2Object;
3252+import com.l2jfrozen.gameserver.model.L2Skill;
3253+import com.l2jfrozen.gameserver.model.L2Skill.SkillType;
3254+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3255+
3256+public class Bomb implements ISkillHandler
3257+{
3258+private static final SkillType[] SKILL_IDS =
3259+{ SkillType.BOMB };
3260+
3261+public void useSkill(L2Character activeChar, L2Skill skill,
3262+L2Object[] targets)
3263+{
3264+
3265+if (!(activeChar instanceof L2PcInstance))
3266+return;
3267+
3268+EventManager.getInstance().getCurrentEvent().dropBomb((L2PcInstance)activeChar);
3269+}
3270+
3271+public SkillType[] getSkillIds()
3272+{
3273+return SKILL_IDS;
3274+}
3275+}
3276\ No newline at end of file
3277Index: head-src/com/l2jfrozen/gameserver/GameServer.java
3278===================================================================
3279--- head-src/com/l2jfrozen/gameserver/GameServer.java (revision 1132)
3280+++ head-src/com/l2jfrozen/gameserver/GameServer.java (working copy)
3281@@ -78,6 +78,9 @@
3282 import com.l2jfrozen.gameserver.datatables.xml.AugmentationData;
3283 import com.l2jfrozen.gameserver.datatables.xml.ExperienceData;
3284 import com.l2jfrozen.gameserver.datatables.xml.ZoneData;
3285+import com.l2jfrozen.gameserver.event.EventBuffer;
3286+import com.l2jfrozen.gameserver.event.EventManager;
3287+import com.l2jfrozen.gameserver.event.EventStats;
3288 import com.l2jfrozen.gameserver.geo.GeoData;
3289 import com.l2jfrozen.gameserver.geo.geoeditorcon.GeoEditorListener;
3290 import com.l2jfrozen.gameserver.geo.pathfinding.PathFinding;
3291@@ -122,7 +125,6 @@
3292 import com.l2jfrozen.gameserver.model.entity.Announcements;
3293 import com.l2jfrozen.gameserver.model.entity.Hero;
3294 import com.l2jfrozen.gameserver.model.entity.MonsterRace;
3295-import com.l2jfrozen.gameserver.model.entity.event.manager.EventManager;
3296 import com.l2jfrozen.gameserver.model.entity.olympiad.Olympiad;
3297 import com.l2jfrozen.gameserver.model.entity.sevensigns.SevenSigns;
3298 import com.l2jfrozen.gameserver.model.entity.sevensigns.SevenSignsFestival;
3299@@ -559,7 +561,7 @@
3300 else
3301 LOGGER.info("All custom mods are Disabled.");
3302
3303- Util.printSection("EventManager");
3304+ /*Util.printSection("EventManager");
3305 EventManager.getInstance().startEventRegistration();
3306
3307 if (EventManager.TVT_EVENT_ENABLED || EventManager.CTF_EVENT_ENABLED || EventManager.DM_EVENT_ENABLED)
3308@@ -572,7 +574,7 @@
3309 LOGGER.info("DM Event is Enabled.");
3310 }
3311 else
3312- LOGGER.info("All events are Disabled.");
3313+ LOGGER.info("All events are Disabled.");*/
3314
3315 if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
3316 OfflineTradeTable.restoreOfflineTraders();
3317@@ -610,6 +612,11 @@
3318 LOGGER.info("GameServer Started, free memory " + Memory.getFreeMemory() + " Mb of " + Memory.getTotalMemory() + " Mb");
3319 LOGGER.info("Used memory: " + Memory.getUsedMemory() + " MB");
3320
3321+ EventManager.getInstance();
3322+ EventStats.getInstance();
3323+ if (EventManager.getInstance().getBoolean("eventBufferEnabled"))
3324+ EventBuffer.getInstance();
3325+
3326 Util.printSection("Java specific");
3327 LOGGER.info("JRE name: " + System.getProperty("java.vendor"));
3328 LOGGER.info("JRE specification version: " + System.getProperty("java.specification.version"));
3329Index: head-src/com/l2jfrozen/gameserver/event/Battlefield.java
3330===================================================================
3331--- head-src/com/l2jfrozen/gameserver/event/Battlefield.java (nonexistent)
3332+++ head-src/com/l2jfrozen/gameserver/event/Battlefield.java (working copy)
3333@@ -0,0 +1,238 @@
3334+package com.l2jfrozen.gameserver.event;
3335+
3336+import java.util.Map;
3337+
3338+import javolution.text.TextBuilder;
3339+import javolution.util.FastMap;
3340+
3341+import com.l2jfrozen.gameserver.datatables.SkillTable;
3342+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
3343+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
3344+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3345+import com.l2jfrozen.gameserver.network.serverpackets.NpcInfo;
3346+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
3347+import com.l2jfrozen.util.random.Rnd;
3348+
3349+public class Battlefield extends Event
3350+{
3351+ private class Core implements Runnable
3352+ {
3353+
3354+ public void run()
3355+ {
3356+ try{
3357+ switch (eventState)
3358+ {
3359+ case START:
3360+ divideIntoTeams(2);
3361+ preparePlayers();
3362+ teleportToTeamPos();
3363+ createPartyOfTeam(1);
3364+ createPartyOfTeam(2);
3365+ forceSitAll();
3366+ giveSkill();
3367+ spawnBases();
3368+ setStatus(EventState.FIGHT);
3369+ schedule(20000);
3370+ break;
3371+
3372+ case FIGHT:
3373+ forceStandAll();
3374+ setStatus(EventState.END);
3375+ clock.startClock(getInt("matchTime"));
3376+ break;
3377+
3378+ case END:
3379+ clock.setTime(0);
3380+ if (winnerTeam == 0)
3381+ winnerTeam = getWinnerTeam();
3382+
3383+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
3384+ unspawnBases();
3385+ removeSkill();
3386+ setStatus(EventState.INACTIVE);
3387+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " points!");
3388+ break;
3389+ }
3390+ }
3391+ catch (Throwable e)
3392+ {
3393+ e.printStackTrace();
3394+ EventManager.getInstance().end("Error! Event ended.");
3395+ }
3396+ }
3397+
3398+ }
3399+
3400+ private enum EventState
3401+ {
3402+ START, FIGHT, END, TELEPORT, INACTIVE
3403+ }
3404+
3405+ private EventState eventState;
3406+
3407+ private Core task;
3408+
3409+ private int winnerTeam;
3410+
3411+ private FastMap<Integer,L2Spawn> bases;
3412+
3413+ private FastMap<Integer,Integer> owners;
3414+
3415+ public Battlefield()
3416+ {
3417+ super();
3418+ eventId = 14;
3419+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
3420+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
3421+ bases = new FastMap<Integer,L2Spawn>();
3422+ owners = new FastMap<Integer,Integer>();
3423+ task = new Core();
3424+ winnerTeam = 0;
3425+ }
3426+
3427+ @Override
3428+ protected void endEvent()
3429+ {
3430+ winnerTeam = players.head().getNext().getValue()[0];
3431+
3432+ setStatus(EventState.END);
3433+ schedule(1);
3434+ }
3435+
3436+ @Override
3437+ protected String getScorebar()
3438+ {
3439+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
3440+ }
3441+
3442+ @Override
3443+ protected int getWinnerTeam()
3444+ {
3445+ if (teams.get(1).getScore() > teams.get(2).getScore())
3446+ return 1;
3447+ if (teams.get(2).getScore() > teams.get(1).getScore())
3448+ return 2;
3449+ if (teams.get(1).getScore() == teams.get(2).getScore())
3450+ if (Rnd.nextInt(1) == 1)
3451+ return 1;
3452+ else
3453+ return 2;
3454+
3455+ return 1;
3456+ }
3457+
3458+ @Override
3459+ public void onDie(L2PcInstance victim, L2PcInstance killer)
3460+ {
3461+ super.onDie(victim, killer);
3462+ addToResurrector(victim);
3463+ }
3464+
3465+ @Override
3466+ protected void schedule(int time)
3467+ {
3468+ tpm.scheduleGeneral(task, time);
3469+ }
3470+
3471+ private void setStatus(EventState s)
3472+ {
3473+ eventState = s;
3474+ }
3475+
3476+ @Override
3477+ protected void showHtml(L2PcInstance player, int obj)
3478+ {
3479+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
3480+ TextBuilder sb = new TextBuilder();
3481+ sb.append("<html><body><table width=300>" + "<tr><td><center>Event phase</td></tr>" + "<tr><td><center>" + getString("eventName") + " - " + clock.getTime() + "</td></tr>" + "<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=300>");
3482+
3483+ int i = 0;
3484+ for (EventTeam team : teams.values())
3485+ {
3486+ i++;
3487+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
3488+ for (L2PcInstance p : getPlayersOfTeam(i))
3489+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
3490+ }
3491+
3492+ sb.append("</table><br></body></html>");
3493+ html.setHtml(sb.toString());
3494+ player.sendPacket(html);
3495+
3496+ }
3497+
3498+ @Override
3499+ protected void start()
3500+ {
3501+ setStatus(EventState.START);
3502+ schedule(1);
3503+ }
3504+
3505+ private void spawnBases()
3506+ {
3507+ for(int i = 1; i <= getInt("numOfBases"); i++)
3508+ {
3509+ bases.put(i, spawnNPC(getPosition("Base",i)[0],getPosition("Base",i)[1],getPosition("Base",i)[2],getInt("baseNpcId")));
3510+ bases.get(i).getLastSpawn().setTitle("- Neutral -");
3511+ owners.put(i, 0);
3512+ }
3513+ }
3514+
3515+ private void unspawnBases()
3516+ {
3517+ for(L2Spawn base: bases.values())
3518+ unspawnNPC(base);
3519+ }
3520+
3521+ @Override
3522+ public void reset()
3523+ {
3524+ super.reset();
3525+ bases.clear();
3526+ owners.clear();
3527+ }
3528+
3529+ @Override
3530+ protected void clockTick()
3531+ {
3532+ for(int owner : owners.values())
3533+ if(owner != 0)
3534+ teams.get(owner).increaseScore(1);
3535+ }
3536+
3537+ @Override
3538+ public void useCapture(L2PcInstance player, L2NpcInstance base)
3539+ {
3540+ if(base.getNpcId() != getInt("baseNpcId"))
3541+ return;
3542+
3543+ for(Map.Entry<Integer, L2Spawn> baseSpawn: bases.entrySet())
3544+ if(baseSpawn.getValue().getLastSpawn().getObjectId() == base.getObjectId())
3545+ {
3546+ if(owners.get(baseSpawn.getKey()) == getTeam(player))
3547+ return;
3548+
3549+ owners.getEntry(baseSpawn.getKey()).setValue(getTeam(player));
3550+ baseSpawn.getValue().getLastSpawn().setTitle("- "+teams.get(getTeam(player)).getName()+" -");
3551+ for(L2PcInstance p : getPlayerList())
3552+ p.sendPacket(new NpcInfo(baseSpawn.getValue().getLastSpawn(), p));
3553+
3554+ announce(getPlayerList(),"The "+teams.get(getTeam(player)).getName()+" team captured a base!");
3555+ increasePlayersScore(player);
3556+ player.addItem("Event", 6392, 2, player, true);
3557+ }
3558+ }
3559+
3560+ private void removeSkill()
3561+ {
3562+ for (L2PcInstance player : getPlayerList())
3563+ player.removeSkill(SkillTable.getInstance().getInfo(getInt("captureSkillId"), 1), false);
3564+ }
3565+
3566+ private void giveSkill()
3567+ {
3568+ for (L2PcInstance player : getPlayerList())
3569+ player.addSkill(SkillTable.getInstance().getInfo(getInt("captureSkillId"), 1), false);
3570+ }
3571+}
3572\ No newline at end of file
3573Index: head-src/com/l2jfrozen/gameserver/event/Bomb.java
3574===================================================================
3575--- head-src/com/l2jfrozen/gameserver/event/Bomb.java (nonexistent)
3576+++ head-src/com/l2jfrozen/gameserver/event/Bomb.java (working copy)
3577@@ -0,0 +1,261 @@
3578+package com.l2jfrozen.gameserver.event;
3579+
3580+import javolution.text.TextBuilder;
3581+import javolution.util.FastList;
3582+import javolution.util.FastMap;
3583+
3584+import com.l2jfrozen.gameserver.datatables.SkillTable;
3585+import com.l2jfrozen.gameserver.model.L2Object;
3586+import com.l2jfrozen.gameserver.model.L2Skill;
3587+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
3588+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
3589+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3590+import com.l2jfrozen.gameserver.network.serverpackets.MagicSkillLaunched;
3591+import com.l2jfrozen.gameserver.network.serverpackets.MagicSkillUser;
3592+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
3593+import com.l2jfrozen.gameserver.network.serverpackets.NpcInfo;
3594+import com.l2jfrozen.util.random.Rnd;
3595+
3596+public class Bomb extends Event
3597+{
3598+ private class Bomber implements Runnable
3599+ {
3600+ public void run()
3601+ {
3602+ explode(bombs.head().getNext().getKey());
3603+ bombs.remove(bombs.head().getNext().getKey());
3604+ }
3605+ }
3606+
3607+ private class Core implements Runnable
3608+ {
3609+ public void run()
3610+ {
3611+ try
3612+ {
3613+ switch (eventState)
3614+ {
3615+ case START:
3616+ divideIntoTeams(2);
3617+ preparePlayers();
3618+ teleportToTeamPos();
3619+ createPartyOfTeam(1);
3620+ createPartyOfTeam(2);
3621+ forceSitAll();
3622+ unequip();
3623+ giveSkill();
3624+ debug("The event initialized with " + players.size() + " players");
3625+ setStatus(EventState.FIGHT);
3626+ schedule(20000);
3627+ break;
3628+
3629+ case FIGHT:
3630+ forceStandAll();
3631+ setStatus(EventState.END);
3632+ debug("The fight started");
3633+ clock.startClock(getInt("matchTime"));
3634+ break;
3635+
3636+ case END:
3637+ clock.setTime(0);
3638+ if (winnerTeam == 0)
3639+ winnerTeam = getWinnerTeam();
3640+
3641+ removeSkill();
3642+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
3643+ debug("The event ended. Winner: " + winnerTeam);
3644+ setStatus(EventState.INACTIVE);
3645+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " kills!");
3646+ break;
3647+ }
3648+ }
3649+ catch (Throwable e)
3650+ {
3651+ e.printStackTrace();
3652+ EventManager.getInstance().end("Error! Event ended.");
3653+ }
3654+ }
3655+ }
3656+
3657+ private enum EventState
3658+ {
3659+ START, FIGHT, END, TELEPORT, INACTIVE
3660+ }
3661+
3662+ private EventState eventState;
3663+
3664+ private Core task;
3665+
3666+ private FastMap<L2Spawn, L2PcInstance> bombs;
3667+
3668+ private Bomber bomber;
3669+
3670+ public Bomb()
3671+ {
3672+ super();
3673+ eventId = 12;
3674+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
3675+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
3676+ task = new Core();
3677+ bomber = new Bomber();
3678+ bombs = new FastMap<L2Spawn, L2PcInstance>();
3679+ winnerTeam = 0;
3680+ }
3681+
3682+ @Override
3683+ public void dropBomb(L2PcInstance player)
3684+ {
3685+ bombs.put(spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("bombNpcId")), player);
3686+ bombs.tail().getPrevious().getKey().getLastSpawn().setTitle((getTeam(player) == 1 ? "Blue" : "Red"));
3687+ bombs.tail().getPrevious().getKey().getLastSpawn().broadcastStatusUpdate();
3688+
3689+ for(L2PcInstance p : getPlayerList())
3690+ p.sendPacket(new NpcInfo(bombs.tail().getPrevious().getKey().getLastSpawn(), p));
3691+
3692+ tpm.scheduleGeneral(bomber, 3000);
3693+ }
3694+
3695+ @Override
3696+ protected void endEvent()
3697+ {
3698+ winnerTeam = players.head().getNext().getValue()[0];
3699+
3700+ setStatus(EventState.END);
3701+ clock.setTime(0);
3702+
3703+ }
3704+
3705+ private void explode(L2Spawn bomb)
3706+ {
3707+ FastList<L2Object> victims = new FastList<L2Object>();
3708+
3709+ for (L2PcInstance player : getPlayerList())
3710+ {
3711+ if(player == null)
3712+ continue;
3713+
3714+ if(player.isInvul())
3715+ continue;
3716+
3717+ if (getTeam(bombs.get(bomb)) != getTeam(player) && Math.sqrt(player.getPlanDistanceSq(bomb.getLastSpawn())) <= getInt("bombRadius"))
3718+ {
3719+ player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, bomb.getLastSpawn());
3720+ increasePlayersScore(bombs.get(bomb));
3721+ EventStats.getInstance().tempTable.get(player.getObjectId())[2] = EventStats.getInstance().tempTable.get(player.getObjectId())[2] + 1;
3722+ addToResurrector(player);
3723+
3724+ victims.add(player);
3725+
3726+ if (getTeam(player) == 1)
3727+ teams.get(2).increaseScore();
3728+ if (getTeam(player) == 2)
3729+ teams.get(1).increaseScore();
3730+ }
3731+ if (victims.size() != 0)
3732+ {
3733+ bomb.getLastSpawn().broadcastPacket(new MagicSkillUser(bomb.getLastSpawn(), (L2PcInstance) victims.head().getNext().getValue(), 18, 1, 0, 0));
3734+ bomb.getLastSpawn().broadcastPacket(new MagicSkillLaunched(bomb.getLastSpawn(), 18, 1, victims.toArray(new L2Object[victims.size()])));
3735+ victims.clear();
3736+ }
3737+ }
3738+ unspawnNPC(bomb);
3739+ }
3740+
3741+ @Override
3742+ protected String getScorebar()
3743+ {
3744+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
3745+ }
3746+
3747+ @Override
3748+ protected int getWinnerTeam()
3749+ {
3750+ if (teams.get(1).getScore() > teams.get(2).getScore())
3751+ return 1;
3752+ if (teams.get(2).getScore() > teams.get(1).getScore())
3753+ return 2;
3754+ if (teams.get(1).getScore() == teams.get(2).getScore())
3755+ if (Rnd.nextInt(1) == 1)
3756+ return 1;
3757+ else
3758+ return 2;
3759+
3760+ return 1;
3761+ }
3762+
3763+ private void giveSkill()
3764+ {
3765+ for (L2PcInstance player : getPlayerList())
3766+ player.addSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
3767+ }
3768+
3769+
3770+ @Override
3771+ public void onLogout(L2PcInstance player)
3772+ {
3773+ player.removeSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
3774+ }
3775+
3776+ @Override
3777+ public boolean onUseMagic(L2Skill skill)
3778+ {
3779+ if (skill.getId() == getInt("bombSkillId"))
3780+ return true;
3781+
3782+ return false;
3783+
3784+ }
3785+
3786+ private void removeSkill()
3787+ {
3788+ for (L2PcInstance player : getPlayerList())
3789+ player.removeSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
3790+ }
3791+
3792+ @Override
3793+ protected void schedule(int time)
3794+ {
3795+ tpm.scheduleGeneral(task, time);
3796+ }
3797+
3798+ private void setStatus(EventState s)
3799+ {
3800+ eventState = s;
3801+ }
3802+
3803+ @Override
3804+ protected void showHtml(L2PcInstance player, int obj)
3805+ {
3806+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
3807+ TextBuilder sb = new TextBuilder();
3808+
3809+ 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>");
3810+ sb.append("<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>");
3811+ sb.append("<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>");
3812+ sb.append("<br><table width=270>");
3813+ int i = 0;
3814+ for (EventTeam team : teams.values())
3815+ {
3816+ i++;
3817+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
3818+ for (L2PcInstance p : getPlayersOfTeam(i))
3819+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
3820+ }
3821+
3822+ sb.append("</table></body></html>");
3823+ html.setHtml(sb.toString());
3824+ player.sendPacket(html);
3825+
3826+ }
3827+
3828+ @Override
3829+ protected void start()
3830+ {
3831+ setStatus(EventState.START);
3832+ schedule(1);
3833+ }
3834+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
3835+ {
3836+ return false;
3837+ }
3838+}
3839\ No newline at end of file
3840Index: head-src/com/l2jfrozen/gameserver/event/CTF.java
3841===================================================================
3842--- head-src/com/l2jfrozen/gameserver/event/CTF.java (nonexistent)
3843+++ head-src/com/l2jfrozen/gameserver/event/CTF.java (working copy)
3844@@ -0,0 +1,401 @@
3845+package com.l2jfrozen.gameserver.event;
3846+
3847+import javolution.text.TextBuilder;
3848+
3849+import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
3850+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
3851+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
3852+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
3853+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3854+import com.l2jfrozen.gameserver.model.Inventory;
3855+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
3856+import com.l2jfrozen.gameserver.network.serverpackets.InventoryUpdate;
3857+import com.l2jfrozen.gameserver.network.serverpackets.ItemList;
3858+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
3859+import com.l2jfrozen.gameserver.network.serverpackets.SocialAction;
3860+import com.l2jfrozen.gameserver.templates.L2EtcItemType;
3861+
3862+public class CTF extends Event
3863+{
3864+ private class Core implements Runnable
3865+ {
3866+
3867+ public void run()
3868+ {
3869+ try
3870+ {
3871+ switch (eventState)
3872+ {
3873+ case START:
3874+ divideIntoTeams(2);
3875+ preparePlayers();
3876+ teleportToTeamPos();
3877+ createPartyOfTeam(1);
3878+ createPartyOfTeam(2);
3879+ forceSitAll();
3880+ spawnFlagsAndHolders();
3881+ setStatus(EventState.FIGHT);
3882+ debug("The event started with " + players.size() + " players");
3883+ schedule(20000);
3884+ break;
3885+
3886+ case FIGHT:
3887+ forceStandAll();
3888+ setStatus(EventState.END);
3889+ debug("The fight started");
3890+ clock.startClock(getInt("matchTime"));
3891+ break;
3892+
3893+ case END:
3894+ clock.setTime(0);
3895+ if (winnerTeam == 0)
3896+ winnerTeam = getWinnerTeam();
3897+
3898+ unspawnFlagsAndHolders();
3899+ debug("The flags unspawned");
3900+ if (playerWithRedFlag != null)
3901+ unequipFlag(playerWithRedFlag);
3902+ if (playerWithBlueFlag != null)
3903+ unequipFlag(playerWithBlueFlag);
3904+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
3905+ setStatus(EventState.INACTIVE);
3906+ debug("The event ended. Winner: " + winnerTeam);
3907+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Flags taken!");
3908+ break;
3909+ }
3910+ }
3911+ catch (Throwable e)
3912+ {
3913+ e.printStackTrace();
3914+ EventManager.getInstance().end("Error! Event ended.");
3915+ }
3916+ }
3917+ }
3918+
3919+ private enum EventState
3920+ {
3921+ START, FIGHT, END, TELEPORT, INACTIVE
3922+ }
3923+
3924+ private EventState eventState;
3925+
3926+ private Core task;
3927+
3928+ private L2Spawn redFlagNpc;
3929+ private L2Spawn blueFlagNpc;
3930+ private L2Spawn redHolderNpc;
3931+ private L2Spawn blueHolderNpc;
3932+ private int redFlagStatus;
3933+ private int blueFlagStatus;
3934+ private L2PcInstance playerWithRedFlag;
3935+ private L2PcInstance playerWithBlueFlag;
3936+
3937+ public CTF()
3938+ {
3939+ super();
3940+ eventId = 10;
3941+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
3942+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
3943+ task = new Core();
3944+ winnerTeam = 0;
3945+ playerWithRedFlag = null;
3946+ playerWithBlueFlag = null;
3947+ blueFlagStatus = 0;
3948+ redFlagStatus = 0;
3949+
3950+ }
3951+
3952+ @Override
3953+ protected void endEvent()
3954+ {
3955+ winnerTeam = players.head().getNext().getValue()[0];
3956+
3957+ setStatus(EventState.END);
3958+ clock.setTime(0);
3959+
3960+ }
3961+
3962+ private void equipFlag(L2PcInstance player, int flag)
3963+ {
3964+ L2ItemInstance wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
3965+ if (wpn != null)
3966+ player.getInventory().unEquipItemInBodySlotAndRecord(Inventory.PAPERDOLL_RHAND);
3967+
3968+ wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
3969+ if (wpn != null)
3970+ player.getInventory().unEquipItemInBodySlotAndRecord(Inventory.PAPERDOLL_LHAND);
3971+
3972+ player.getInventory().equipItem(ItemTable.getInstance().createItem("", 6718, 1, player, null));
3973+ player.broadcastPacket(new SocialAction(player.getObjectId(), 16));
3974+ switch (flag)
3975+ {
3976+ case 1:
3977+ playerWithBlueFlag = player;
3978+ announce(getPlayerList(), player.getName() + " took the Blue flag!");
3979+ unspawnNPC(blueFlagNpc);
3980+ break;
3981+ case 2:
3982+ playerWithRedFlag = player;
3983+ announce(getPlayerList(), player.getName() + " took the Red flag!");
3984+ unspawnNPC(redFlagNpc);
3985+ break;
3986+ default:
3987+ break;
3988+ }
3989+ player.broadcastUserInfo();
3990+ CreatureSay cs = new CreatureSay(player.getObjectId(), 15, ":", "You got it! Run back! ::"); // 8D
3991+ player.sendPacket(cs);
3992+ }
3993+
3994+ @Override
3995+ protected String getScorebar()
3996+ {
3997+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
3998+ }
3999+
4000+ @Override
4001+ public void onDie(L2PcInstance victim, L2PcInstance killer)
4002+ {
4003+ super.onDie(victim, killer);
4004+ if (playerWithRedFlag == victim)
4005+ {
4006+ announce(getPlayerList(), victim.getName() + " dropped the Red flag!");
4007+ redFlagStatus = 2;
4008+ unequipFlag(victim);
4009+ redFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("redFlagId"));
4010+ }
4011+ if (playerWithBlueFlag == victim)
4012+ {
4013+ announce(getPlayerList(), victim.getName() + " dropped the Blue flag!");
4014+ blueFlagStatus = 2;
4015+ unequipFlag(victim);
4016+ blueFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("blueFlagId"));
4017+ }
4018+
4019+ addToResurrector(victim);
4020+ }
4021+
4022+ @Override
4023+ public void onLogout(L2PcInstance player)
4024+ {
4025+ super.onLogout(player);
4026+
4027+ if (playerWithRedFlag == player)
4028+ {
4029+ announce(getPlayerList(), player.getName() + " dropped the Red flag!");
4030+ redFlagStatus = 2;
4031+ unequipFlag(player);
4032+ redFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("redFlagId"));
4033+ }
4034+ if (playerWithBlueFlag == player)
4035+ {
4036+ announce(getPlayerList(), player.getName() + " dropped the Blue flag!");
4037+ blueFlagStatus = 2;
4038+ unequipFlag(player);
4039+ blueFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("blueFlagId"));
4040+ }
4041+
4042+ }
4043+
4044+ @Override
4045+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
4046+ {
4047+ if (!(npc.getNpcId() == getInt("blueFlagId") || npc.getNpcId() == getInt("blueFlagHolderId") || npc.getNpcId() == getInt("redFlagId") || npc.getNpcId() == getInt("redFlagHolderId")))
4048+ return false;
4049+
4050+ //Blue holder
4051+ if (npc.getNpcId() == getInt("blueFlagHolderId"))
4052+ if (player == playerWithRedFlag && blueFlagStatus == 0)
4053+ {
4054+ announce(getPlayerList(), "The Blue team scored!");
4055+ teams.get(getTeam(player)).increaseScore();
4056+ increasePlayersScore(player);
4057+ player.addItem("Event", 6392, 4, player, true);
4058+ returnFlag(2);
4059+ }
4060+
4061+ //Red holder
4062+ if (npc.getNpcId() == getInt("redFlagHolderId"))
4063+ if (player == playerWithBlueFlag && redFlagStatus == 0)
4064+ {
4065+ announce(getPlayerList(), "The Red team scored!");
4066+ teams.get(getTeam(player)).increaseScore();
4067+ increasePlayersScore(player);
4068+ player.addItem("Event", 6392, 4, player, true);
4069+ returnFlag(1);
4070+ }
4071+
4072+ //Blue flag
4073+ if (npc.getNpcId() == getInt("blueFlagId"))
4074+ {
4075+ if (blueFlagStatus == 2)
4076+ {
4077+ //blue player
4078+ if (getTeam(player) == 1)
4079+ returnFlag(1);
4080+
4081+ //red player
4082+ if (getTeam(player) == 2)
4083+ equipFlag(player, 1);
4084+ }
4085+ if (blueFlagStatus == 0)
4086+ if (getTeam(player) == 2)
4087+ {
4088+ equipFlag(player, 1);
4089+ unspawnNPC(blueFlagNpc);
4090+ blueFlagStatus = 1;
4091+ }
4092+
4093+ }
4094+
4095+ //Red flag
4096+ if (npc.getNpcId() == getInt("redFlagId"))
4097+ {
4098+ if (redFlagStatus == 2)
4099+ {
4100+ //red player
4101+ if (getTeam(player) == 2)
4102+ returnFlag(2);
4103+
4104+ //blue player
4105+ if (getTeam(player) == 1)
4106+ equipFlag(player, 2);
4107+ }
4108+ if (redFlagStatus == 0)
4109+ if (getTeam(player) == 1)
4110+ {
4111+ equipFlag(player, 2);
4112+ unspawnNPC(redFlagNpc);
4113+ redFlagStatus = 1;
4114+ }
4115+ }
4116+ return true;
4117+ }
4118+
4119+ @Override
4120+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
4121+ {
4122+ if (playerWithRedFlag == player || playerWithBlueFlag == player)
4123+ return false;
4124+
4125+ if (item.getItemType() == L2EtcItemType.POTION)
4126+ return false;
4127+
4128+ return true;
4129+ }
4130+
4131+ private void returnFlag(int flag)
4132+ {
4133+ int[] pos;
4134+ switch (flag)
4135+ {
4136+ case 1:
4137+ if (playerWithBlueFlag != null)
4138+ unequipFlag(playerWithBlueFlag);
4139+ if (blueFlagStatus == 2)
4140+ unspawnNPC(blueFlagNpc);
4141+
4142+ pos = getPosition("BlueFlag", 1);
4143+ blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
4144+ blueFlagStatus = 0;
4145+ announce(getPlayerList(), "The Blue flag returned!");
4146+ break;
4147+
4148+ case 2:
4149+ if (playerWithRedFlag != null)
4150+ unequipFlag(playerWithRedFlag);
4151+ if (redFlagStatus == 2)
4152+ unspawnNPC(redFlagNpc);
4153+
4154+ pos = getPosition("RedFlag", 1);
4155+ redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
4156+ redFlagStatus = 0;
4157+ announce(getPlayerList(), "The Red flag returned!");
4158+ break;
4159+ }
4160+ }
4161+
4162+ @Override
4163+ protected void schedule(int time)
4164+ {
4165+ tpm.scheduleGeneral(task, time);
4166+ }
4167+
4168+ private void setStatus(EventState s)
4169+ {
4170+ eventState = s;
4171+ }
4172+
4173+ @Override
4174+ protected void showHtml(L2PcInstance player, int obj)
4175+ {
4176+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
4177+ TextBuilder sb = new TextBuilder();
4178+
4179+ 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>");
4180+ sb.append("<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>");
4181+ sb.append("<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>");
4182+ sb.append("<br><table width=270>");
4183+ int i = 0;
4184+ for (EventTeam team : teams.values())
4185+ {
4186+ i++;
4187+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
4188+ for (L2PcInstance p : getPlayersOfTeam(i))
4189+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
4190+ }
4191+
4192+ sb.append("</table></body></html>");
4193+ html.setHtml(sb.toString());
4194+ player.sendPacket(html);
4195+
4196+ }
4197+
4198+ private void spawnFlagsAndHolders()
4199+ {
4200+ int[] pos = getPosition("BlueFlag", 1);
4201+ blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
4202+ blueHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("blueFlagHolderId"));
4203+
4204+ pos = getPosition("RedFlag", 1);
4205+ redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
4206+ redHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("redFlagHolderId"));
4207+ debug("The flags spawned.");
4208+ }
4209+
4210+ @Override
4211+ protected void start()
4212+ {
4213+ setStatus(EventState.START);
4214+ schedule(1);
4215+ }
4216+
4217+ private void unequipFlag(L2PcInstance player)
4218+ {
4219+ L2ItemInstance wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
4220+ if (wpn != null)
4221+ {
4222+ L2ItemInstance[] unequiped = player.getInventory().unEquipItemInBodySlotAndRecord(wpn.getItem().getBodyPart());
4223+ player.getInventory().destroyItemByItemId("", 6718, 1, player, null);
4224+ InventoryUpdate iu = new InventoryUpdate();
4225+ for (L2ItemInstance element : unequiped)
4226+ iu.addModifiedItem(element);
4227+ player.sendPacket(iu);
4228+ player.sendPacket(new ItemList(player, true));
4229+ player.broadcastUserInfo();
4230+ }
4231+
4232+ if (player == playerWithRedFlag)
4233+ playerWithRedFlag = null;
4234+ if (player == playerWithBlueFlag)
4235+ playerWithBlueFlag = null;
4236+ }
4237+
4238+ private void unspawnFlagsAndHolders()
4239+ {
4240+ unspawnNPC(blueFlagNpc);
4241+ unspawnNPC(blueHolderNpc);
4242+ unspawnNPC(redFlagNpc);
4243+ unspawnNPC(redHolderNpc);
4244+ }
4245+}
4246\ No newline at end of file
4247Index: head-src/com/l2jfrozen/gameserver/event/Domination.java
4248===================================================================
4249--- head-src/com/l2jfrozen/gameserver/event/Domination.java (nonexistent)
4250+++ head-src/com/l2jfrozen/gameserver/event/Domination.java (working copy)
4251@@ -0,0 +1,197 @@
4252+package com.l2jfrozen.gameserver.event;
4253+
4254+import javolution.text.TextBuilder;
4255+import javolution.util.FastList;
4256+
4257+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
4258+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
4259+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
4260+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
4261+
4262+public class Domination extends Event
4263+{
4264+ private class Core implements Runnable
4265+ {
4266+ public void run()
4267+ {
4268+ try
4269+ {
4270+ switch (eventState)
4271+ {
4272+ case START:
4273+ divideIntoTeams(2);
4274+ preparePlayers();
4275+ teleportToTeamPos();
4276+ createPartyOfTeam(1);
4277+ createPartyOfTeam(2);
4278+ forceSitAll();
4279+ debug("The event started with " + players.size() + " player");
4280+ setStatus(EventState.FIGHT);
4281+ schedule(20000);
4282+ break;
4283+
4284+ case FIGHT:
4285+ forceStandAll();
4286+ setStatus(EventState.END);
4287+ debug("The event started");
4288+ clock.startClock(getInt("matchTime"));
4289+ break;
4290+
4291+ case END:
4292+ clock.setTime(0);
4293+ if (winnerTeam == 0)
4294+ winnerTeam = getWinnerTeam();
4295+
4296+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
4297+ unSpawnZones();
4298+ setStatus(EventState.INACTIVE);
4299+ debug("The event ended. Winner: " + winnerTeam);
4300+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Domination points!");
4301+ break;
4302+ }
4303+ }
4304+ catch (Throwable e)
4305+ {
4306+ e.printStackTrace();
4307+ EventManager.getInstance().end("Error! Event ended.");
4308+ }
4309+ }
4310+ }
4311+
4312+ private enum EventState
4313+ {
4314+ START, FIGHT, END, INACTIVE
4315+ }
4316+
4317+ private EventState eventState;
4318+
4319+ private Core task;
4320+
4321+ private FastList<L2Spawn> zones;
4322+
4323+ public Domination()
4324+ {
4325+ super();
4326+ eventId = 2;
4327+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
4328+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
4329+ task = new Core();
4330+ zones = new FastList<L2Spawn>();
4331+ winnerTeam = 0;
4332+ }
4333+
4334+ @Override
4335+ protected void clockTick()
4336+ {
4337+ int team1 = 0;
4338+ int team2 = 0;
4339+
4340+ for (L2PcInstance player : getPlayerList())
4341+ switch (getTeam(player))
4342+ {
4343+ case 1:
4344+ if (Math.sqrt(player.getPlanDistanceSq(zones.getFirst().getLastSpawn())) <= getInt("zoneRadius"))
4345+ team1++;
4346+ break;
4347+
4348+ case 2:
4349+ if (Math.sqrt(player.getPlanDistanceSq(zones.getFirst().getLastSpawn())) <= getInt("zoneRadius"))
4350+ team2++;
4351+ break;
4352+ }
4353+
4354+ if (team1 > team2)
4355+ {
4356+ for (L2PcInstance player : getPlayersOfTeam(1))
4357+ increasePlayersScore(player);
4358+ teams.get(1).increaseScore();
4359+ }
4360+
4361+ if (team2 > team1)
4362+ {
4363+ for (L2PcInstance player : getPlayersOfTeam(2))
4364+ increasePlayersScore(player);
4365+ teams.get(2).increaseScore();
4366+ }
4367+
4368+ }
4369+
4370+ @Override
4371+ protected void endEvent()
4372+ {
4373+ setStatus(EventState.END);
4374+ clock.setTime(0);
4375+
4376+ }
4377+
4378+ @Override
4379+ protected String getScorebar()
4380+ {
4381+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
4382+ }
4383+
4384+ @Override
4385+ public void onDie(L2PcInstance victim, L2PcInstance killer)
4386+ {
4387+ super.onDie(victim, killer);
4388+ killer.addItem("Event", 6392, 1, killer, true);
4389+ addToResurrector(victim);
4390+ }
4391+
4392+ @Override
4393+ protected void schedule(int time)
4394+ {
4395+ tpm.scheduleGeneral(task, time);
4396+ }
4397+
4398+ private void setStatus(EventState s)
4399+ {
4400+ eventState = s;
4401+ }
4402+
4403+ @Override
4404+ protected void showHtml(L2PcInstance player, int obj)
4405+ {
4406+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
4407+ TextBuilder sb = new TextBuilder();
4408+
4409+ 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>");
4410+ sb.append("<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>");
4411+ sb.append("<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>");
4412+ sb.append("<br><table width=270>");
4413+ int i = 0;
4414+ for (EventTeam team : teams.values())
4415+ {
4416+ i++;
4417+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
4418+ for (L2PcInstance p : getPlayersOfTeam(i))
4419+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
4420+ }
4421+
4422+ sb.append("</table></body></html>");
4423+ html.setHtml(sb.toString());
4424+ player.sendPacket(html);
4425+
4426+ }
4427+
4428+ @Override
4429+ protected void start()
4430+ {
4431+ int[] npcpos = getPosition("Zone", 1);
4432+ zones.add(spawnNPC(npcpos[0], npcpos[1], npcpos[2], getInt("zoneNpcId")));
4433+ setStatus(EventState.START);
4434+ schedule(1);
4435+ }
4436+
4437+ private void unSpawnZones()
4438+ {
4439+ for (L2Spawn s : zones)
4440+ {
4441+ s.getLastSpawn().deleteMe();
4442+ s.stopRespawn();
4443+ SpawnTable.getInstance().deleteSpawn(s, true);
4444+ zones.remove(s);
4445+ }
4446+ }
4447+
4448+}
4449\ No newline at end of file
4450Index: head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java
4451===================================================================
4452--- head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java (nonexistent)
4453+++ head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java (working copy)
4454@@ -0,0 +1,280 @@
4455+/*
4456+ * This program is free software: you can redistribute it and/or modify it under
4457+ * the terms of the GNU General Public License as published by the Free Software
4458+ * Foundation, either version 3 of the License, or (at your option) any later
4459+ * version.
4460+ *
4461+ * This program is distributed in the hope that it will be useful, but WITHOUT
4462+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
4463+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
4464+ * details.
4465+ *
4466+ * You should have received a copy of the GNU General Public License along with
4467+ * this program. If not, see <http://www.gnu.org/licenses/>.
4468+ */
4469+package com.l2jfrozen.gameserver.event;
4470+
4471+import javolution.text.TextBuilder;
4472+import javolution.util.FastMap;
4473+
4474+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
4475+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
4476+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
4477+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
4478+
4479+/**
4480+ * @author Rizel
4481+ *
4482+ */
4483+public class DoubleDomination extends Event
4484+{
4485+ private class Core implements Runnable
4486+ {
4487+ public void run()
4488+ {
4489+ try
4490+ {
4491+ switch (eventState)
4492+ {
4493+ case START:
4494+ divideIntoTeams(2);
4495+ preparePlayers();
4496+ teleportToTeamPos();
4497+ createPartyOfTeam(1);
4498+ createPartyOfTeam(2);
4499+ forceSitAll();
4500+ setStatus(EventState.FIGHT);
4501+ debug("The event started with " + players.size() + " players");
4502+ schedule(20000);
4503+ break;
4504+
4505+ case FIGHT:
4506+ forceStandAll();
4507+ setStatus(EventState.END);
4508+ debug("The fight started");
4509+ clock.startClock(getInt("matchTime"));
4510+ break;
4511+
4512+ case END:
4513+ clock.setTime(0);
4514+ if (winnerTeam == 0)
4515+ winnerTeam = getWinnerTeam();
4516+
4517+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
4518+ unSpawnZones();
4519+ setStatus(EventState.INACTIVE);
4520+ debug("The event ended. Winner: " + winnerTeam);
4521+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Domination points!");
4522+ break;
4523+ }
4524+ }
4525+ catch (Throwable e)
4526+ {
4527+ e.printStackTrace();
4528+ EventManager.getInstance().end("Error! Event ended.");
4529+ }
4530+ }
4531+ }
4532+
4533+ private enum EventState
4534+ {
4535+ START, FIGHT, END, INACTIVE
4536+ }
4537+
4538+ private EventState eventState;
4539+
4540+ private Core task;
4541+
4542+ private FastMap<L2Spawn, Integer> zones;
4543+
4544+ private int time;
4545+
4546+ private int holder;
4547+
4548+ public DoubleDomination()
4549+ {
4550+ super();
4551+ eventId = 3;
4552+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
4553+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
4554+ task = new Core();
4555+ zones = new FastMap<L2Spawn, Integer>();
4556+ winnerTeam = 0;
4557+ time = 0;
4558+ holder = 0;
4559+ }
4560+
4561+ @Override
4562+ protected void clockTick()
4563+ {
4564+ int team1 = 0;
4565+ int team2 = 0;
4566+
4567+ for (L2Spawn zone : zones.keySet())
4568+ {
4569+ for (L2PcInstance player : getPlayerList())
4570+ switch (getTeam(player))
4571+ {
4572+ case 1:
4573+ if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn())) <= getInt("zoneRadius"))
4574+ team1++;
4575+ break;
4576+
4577+ case 2:
4578+ if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn())) <= getInt("zoneRadius"))
4579+ team2++;
4580+ break;
4581+ }
4582+
4583+ if (team1 > team2)
4584+ zones.getEntry(zone).setValue(1);
4585+
4586+ if (team2 > team1)
4587+ zones.getEntry(zone).setValue(2);
4588+
4589+ if (team1 == team2)
4590+ zones.getEntry(zone).setValue(0);
4591+
4592+ team1 = 0;
4593+ team2 = 0;
4594+ }
4595+
4596+ if (zones.containsValue(1) && (!zones.containsValue(0) && !zones.containsValue(2)))
4597+ {
4598+ if (holder != 1)
4599+ {
4600+ announce(getPlayerList(), "The " + teams.get(1).getName() + " team captured both zones. Score in 10sec!");
4601+ holder = 1;
4602+ time = 0;
4603+ }
4604+
4605+ if (time == getInt("timeToScore") - 1)
4606+ {
4607+ for (L2PcInstance player : getPlayersOfTeam(1))
4608+ increasePlayersScore(player);
4609+ teams.get(1).increaseScore();
4610+ teleportToTeamPos();
4611+ time = 0;
4612+ announce(getPlayerList(), "The " + teams.get(1).getName() + " team scored!");
4613+ holder = 0;
4614+ }
4615+ else
4616+ time++;
4617+
4618+ }
4619+ else if (zones.containsValue(2) && (!zones.containsValue(0) && !zones.containsValue(1)))
4620+ {
4621+ if (holder != 2)
4622+ {
4623+ announce(getPlayerList(), "The " + teams.get(2).getName() + " team captured both zones. Score in 10sec!");
4624+ holder = 1;
4625+ time = 0;
4626+ }
4627+
4628+ if (time == getInt("timeToScore") - 1)
4629+ {
4630+ for (L2PcInstance player : getPlayersOfTeam(2))
4631+ increasePlayersScore(player);
4632+ teams.get(2).increaseScore();
4633+ teleportToTeamPos();
4634+ time = 0;
4635+ announce(getPlayerList(), "The " + teams.get(2).getName() + " team scored!");
4636+ holder = 0;
4637+ }
4638+ else
4639+ time++;
4640+ }
4641+ else
4642+ {
4643+ if (holder != 0)
4644+ announce(getPlayerList(), "Canceled!");
4645+
4646+ holder = 0;
4647+ time = 0;
4648+ }
4649+
4650+ }
4651+
4652+ /**
4653+ * @see net.sf.l2j.gameserver.event.Event#endEvent()
4654+ */
4655+ @Override
4656+ protected void endEvent()
4657+ {
4658+ setStatus(EventState.END);
4659+ clock.setTime(0);
4660+
4661+ }
4662+
4663+ @Override
4664+ protected String getScorebar()
4665+ {
4666+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
4667+ }
4668+
4669+ @Override
4670+ public void onDie(L2PcInstance victim, L2PcInstance killer)
4671+ {
4672+ super.onDie(victim, killer);
4673+ addToResurrector(victim);
4674+ }
4675+
4676+ @Override
4677+ protected void schedule(int time)
4678+ {
4679+ tpm.scheduleGeneral(task, time);
4680+ }
4681+
4682+ private void setStatus(EventState s)
4683+ {
4684+ eventState = s;
4685+ }
4686+
4687+ @Override
4688+ protected void showHtml(L2PcInstance player, int obj)
4689+ {
4690+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
4691+ TextBuilder sb = new TextBuilder();
4692+
4693+ 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>");
4694+ sb.append("<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>");
4695+ sb.append("<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>");
4696+ sb.append("<br><table width=270>");
4697+ int i = 0;
4698+ for (EventTeam team : teams.values())
4699+ {
4700+ i++;
4701+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
4702+ for (L2PcInstance p : getPlayersOfTeam(i))
4703+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
4704+ }
4705+
4706+ sb.append("</table></body></html>");
4707+ html.setHtml(sb.toString());
4708+ player.sendPacket(html);
4709+
4710+ }
4711+
4712+ @Override
4713+ protected void start()
4714+ {
4715+ int[] z1pos = getPosition("Zone", 1);
4716+ int[] z2pos = getPosition("Zone", 2);
4717+ zones.put(spawnNPC(z1pos[0], z1pos[1], z1pos[2], getInt("zoneNpcId")), 0);
4718+ zones.put(spawnNPC(z2pos[0], z2pos[1], z2pos[2], getInt("zoneNpcId")), 0);
4719+ setStatus(EventState.START);
4720+ schedule(1);
4721+ }
4722+
4723+ private void unSpawnZones()
4724+ {
4725+ for (L2Spawn s : zones.keySet())
4726+ {
4727+ s.getLastSpawn().deleteMe();
4728+ s.stopRespawn();
4729+ SpawnTable.getInstance().deleteSpawn(s, true);
4730+ zones.remove(s);
4731+ }
4732+ }
4733+
4734+}
4735\ No newline at end of file
4736Index: head-src/com/l2jfrozen/gameserver/event/Event.java
4737===================================================================
4738--- head-src/com/l2jfrozen/gameserver/event/Event.java (nonexistent)
4739+++ head-src/com/l2jfrozen/gameserver/event/Event.java (working copy)
4740@@ -0,0 +1,696 @@
4741+package com.l2jfrozen.gameserver.event;
4742+
4743+import java.util.Set;
4744+
4745+import javolution.util.FastList;
4746+import javolution.util.FastMap;
4747+
4748+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
4749+import com.l2jfrozen.gameserver.datatables.SkillTable;
4750+import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
4751+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
4752+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
4753+import com.l2jfrozen.gameserver.model.L2Object;
4754+import com.l2jfrozen.gameserver.model.L2Party;
4755+import com.l2jfrozen.gameserver.model.L2Skill;
4756+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
4757+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
4758+import com.l2jfrozen.gameserver.model.L2Summon;
4759+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
4760+import com.l2jfrozen.gameserver.model.actor.instance.L2PetInstance;
4761+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
4762+import com.l2jfrozen.gameserver.network.serverpackets.ExShowScreenMessage;
4763+import com.l2jfrozen.gameserver.network.serverpackets.Ride;
4764+import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
4765+import com.l2jfrozen.gameserver.templates.L2EtcItemType;
4766+import com.l2jfrozen.gameserver.util.Broadcast;
4767+import com.l2jfrozen.util.random.Rnd;
4768+
4769+/**
4770+ * @author Rizel
4771+ *
4772+ */
4773+public abstract class Event
4774+{
4775+ protected class Clock implements Runnable
4776+ {
4777+ protected String getTime()
4778+ {
4779+ String mins = "" + time / 60;
4780+ String secs = (time % 60 < 10 ? "0" + time % 60 : "" + time % 60);
4781+ return "" + mins + ":" + secs + "";
4782+ }
4783+
4784+ public void run()
4785+ {
4786+ clockTick();
4787+ scorebartext = getScorebar();
4788+ for (L2PcInstance player : getPlayerList())
4789+ player.sendPacket(new ExShowScreenMessage(1, -1, 2, false, 1, 0, 0, false, 2000, false, scorebartext));
4790+
4791+ if (time <= 0)
4792+ schedule(1);
4793+ else
4794+ {
4795+ time--;
4796+ tpm.scheduleGeneral(clock, 1000);
4797+ }
4798+ }
4799+
4800+ protected void setTime(int t)
4801+ {
4802+ time = t;
4803+ }
4804+
4805+ protected void startClock(int mt)
4806+ {
4807+ time = mt;
4808+ tpm.scheduleGeneral(clock, 1);
4809+ }
4810+ }
4811+
4812+ protected class ResurrectorTask implements Runnable
4813+ {
4814+ private L2PcInstance player;
4815+
4816+ public ResurrectorTask(L2PcInstance p)
4817+ {
4818+ player = p;
4819+ ThreadPoolManager.getInstance().scheduleGeneral(this, 7000);
4820+ debug("Resurrector task created: " + player.getName());
4821+ }
4822+
4823+ public void run()
4824+ {
4825+ if (EventManager.getInstance().isRegistered(player))
4826+ {
4827+ debug("Resurrector task executed: " + player.getName());
4828+ player.doRevive();
4829+
4830+ if(EventManager.getInstance().getBoolean("eventBufferEnabled"))
4831+ EventBuffer.getInstance().buffPlayer(player);
4832+
4833+ player.setCurrentCp(player.getMaxCp());
4834+ player.setCurrentHp(player.getMaxHp());
4835+ player.setCurrentMp(player.getMaxMp());
4836+ teleportToTeamPos(player);
4837+ }
4838+
4839+ }
4840+ }
4841+
4842+ protected int eventId;
4843+
4844+ //Config
4845+ protected EventConfig config = EventConfig.getInstance();
4846+
4847+ protected static int[] startpos = EventManager.npcPos;
4848+
4849+ protected FastMap<Integer, EventTeam> teams;
4850+
4851+ //TEAM-STATUS-SCORE
4852+ protected FastMap<L2PcInstance, int[]> players;
4853+
4854+ protected ThreadPoolManager tpm;
4855+
4856+ protected ResurrectorTask resurrectorTask;
4857+
4858+ private String scorebartext;
4859+
4860+ protected Clock clock;
4861+
4862+ protected int time;
4863+
4864+ protected int winnerTeam;
4865+
4866+ protected int loserTeam;
4867+
4868+ public Event()
4869+ {
4870+ teams = new FastMap<Integer, EventTeam>();
4871+ clock = new Clock();
4872+ tpm = ThreadPoolManager.getInstance();
4873+ players = new FastMap<L2PcInstance, int[]>();
4874+ time = 0;
4875+ }
4876+
4877+ protected void addToResurrector(L2PcInstance player)
4878+ {
4879+ new ResurrectorTask(player);
4880+ }
4881+
4882+ protected void announce(Set<L2PcInstance> list, String text)
4883+ {
4884+ for (L2PcInstance player : list)
4885+ player.sendPacket(new CreatureSay(0, 18, "", "[Event] " + text));
4886+ }
4887+
4888+ public boolean canAttack(L2PcInstance player, L2Object target)
4889+ {
4890+ return true;
4891+ }
4892+
4893+ protected void clockTick()
4894+ {
4895+
4896+ }
4897+
4898+ protected int countOfPositiveStatus()
4899+ {
4900+ int count = 0;
4901+ for (L2PcInstance player : getPlayerList())
4902+ if (getStatus(player) >= 0)
4903+ count++;
4904+
4905+ return count;
4906+ }
4907+
4908+ protected void createNewTeam(int id, String name, int[] color, int[] startPos)
4909+ {
4910+ teams.put(id, new EventTeam(id, name, color, startPos));
4911+ }
4912+
4913+ protected void createPartyOfTeam(int teamId)
4914+ {
4915+ int count = 0;
4916+ L2Party party = null;
4917+
4918+ FastList<L2PcInstance> list = new FastList<L2PcInstance>();
4919+
4920+ for (L2PcInstance p : players.keySet())
4921+ if (getTeam(p) == teamId)
4922+ list.add(p);
4923+
4924+ for (L2PcInstance player : list)
4925+ {
4926+ if (count % 9 == 0 && list.size() - count != 1)
4927+ party = new L2Party(player, 1);
4928+ if (count % 9 < 9)
4929+ player.joinParty(party);
4930+ count++;
4931+ }
4932+ }
4933+
4934+ protected void debug(String text)
4935+ {
4936+ EventManager.getInstance().debug(text);
4937+ }
4938+
4939+ protected void divideIntoTeams(int number)
4940+ {
4941+ int i = 0;
4942+ while (EventManager.getInstance().players.size() != 0)
4943+ {
4944+ i++;
4945+ L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
4946+ players.put(player, new int[] { i, 0, 0 });
4947+ EventManager.getInstance().players.remove(player);
4948+ if (i == number)
4949+ i = 0;
4950+ }
4951+ }
4952+
4953+ public void dropBomb(L2PcInstance player)
4954+ {
4955+
4956+ }
4957+
4958+ protected abstract void endEvent();
4959+
4960+ protected void forceSitAll()
4961+ {
4962+ for (L2PcInstance player : players.keySet())
4963+ {
4964+ if (player.isCastingNow())
4965+ player.abortCast();
4966+ if (player.isAttackingNow())
4967+ player.abortAttack();
4968+ player.sitDown();
4969+ player.eventSitForced = true;
4970+ }
4971+ }
4972+
4973+ protected void forceStandAll()
4974+ {
4975+ for (L2PcInstance player : players.keySet())
4976+ {
4977+ player.eventSitForced = false;
4978+ player.standUp();
4979+ }
4980+
4981+ }
4982+
4983+ public boolean getBoolean(String propName)
4984+ {
4985+ return config.getBoolean(eventId, propName);
4986+ }
4987+
4988+ public int[] getColor(String owner)
4989+ {
4990+ return config.getColor(eventId, owner);
4991+ }
4992+
4993+ public int getInt(String propName)
4994+ {
4995+ return config.getInt(eventId, propName);
4996+ }
4997+
4998+ protected Set<L2PcInstance> getPlayerList()
4999+ {
5000+ return players.keySet();
5001+ }
5002+
5003+ protected FastList<L2PcInstance> getPlayersOfTeam(int team)
5004+ {
5005+ FastList<L2PcInstance> list = new FastList<L2PcInstance>();
5006+
5007+ for (L2PcInstance player : getPlayerList())
5008+ if (getTeam(player) == team)
5009+ list.add(player);
5010+
5011+ return list;
5012+ }
5013+
5014+ protected EventTeam getPlayersTeam(L2PcInstance player)
5015+ {
5016+ return teams.get(players.get(player)[0]);
5017+ }
5018+
5019+ protected FastList<L2PcInstance> getPlayersWithStatus(int status)
5020+ {
5021+ FastList<L2PcInstance> list = new FastList<L2PcInstance>();
5022+
5023+ for (L2PcInstance player : getPlayerList())
5024+ if (getStatus(player) == status)
5025+ list.add(player);
5026+
5027+ return list;
5028+ }
5029+
5030+ protected L2PcInstance getPlayerWithMaxScore()
5031+ {
5032+ L2PcInstance max;
5033+ max = players.head().getNext().getKey();
5034+ for (L2PcInstance player : players.keySet())
5035+ if (players.get(player)[2] > players.get(max)[2])
5036+ max = player;
5037+
5038+ return max;
5039+ }
5040+
5041+ protected void unequip(){
5042+ for (L2PcInstance player : players.keySet())
5043+ {
5044+ player.getInventory().unEquipItemInSlot(7);
5045+ player.getInventory().unEquipItemInSlot(8);
5046+ player.getInventory().unEquipItemInSlot(14);
5047+ }
5048+ }
5049+
5050+ public int[] getPosition(String owner, int num)
5051+ {
5052+ return config.getPosition(eventId, owner, num);
5053+ }
5054+
5055+ protected L2PcInstance getRandomPlayer()
5056+ {
5057+ FastList<L2PcInstance> temp = new FastList<L2PcInstance>();
5058+ for (L2PcInstance player : players.keySet())
5059+ temp.add(player);
5060+
5061+ return temp.get(Rnd.get(temp.size()));
5062+ }
5063+
5064+ protected L2PcInstance getRandomPlayerFromTeam(int team)
5065+ {
5066+ FastList<L2PcInstance> temp = new FastList<L2PcInstance>();
5067+ for (L2PcInstance player : players.keySet())
5068+ if (getTeam(player) == team)
5069+ temp.add(player);
5070+
5071+ return temp.get(Rnd.get(temp.size()));
5072+ }
5073+
5074+ public FastList<Integer> getRestriction(String type)
5075+ {
5076+ return config.getRestriction(eventId, type);
5077+ }
5078+
5079+ protected int getScore(L2PcInstance player)
5080+ {
5081+ return players.get(player)[2];
5082+ }
5083+
5084+ protected abstract String getScorebar();
5085+
5086+ protected int getStatus(L2PcInstance player)
5087+ {
5088+ return players.get(player)[1];
5089+ }
5090+
5091+ public String getString(String propName)
5092+ {
5093+ return config.getString(eventId, propName);
5094+ }
5095+
5096+ public int getTeam(L2PcInstance player)
5097+ {
5098+ return players.get(player)[0];
5099+ }
5100+
5101+ protected int getWinnerTeam()
5102+ {
5103+ FastList<EventTeam> t = new FastList<EventTeam>();
5104+
5105+ for (EventTeam team : teams.values())
5106+ {
5107+ if (t.size() == 0)
5108+ {
5109+ t.add(team);
5110+ continue;
5111+ }
5112+
5113+ if (team.getScore() > t.getFirst().getScore())
5114+ {
5115+ t.clear();
5116+ t.add(team);
5117+ continue;
5118+ }
5119+ if (team.getScore() == t.getFirst().getScore())
5120+ t.add(team);
5121+
5122+ }
5123+
5124+ if (t.size() > 1)
5125+ return t.get(Rnd.get(t.size())).getId();
5126+ else
5127+ return t.getFirst().getId();
5128+
5129+ }
5130+
5131+ protected void giveReward(FastList<L2PcInstance> players, int id, int ammount)
5132+ {
5133+ for (L2PcInstance player : players)
5134+ {
5135+ if(player == null)
5136+ continue;
5137+
5138+ player.addItem("Event", id, ammount, player, true);
5139+ EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
5140+ }
5141+
5142+ }
5143+
5144+ protected void giveReward(L2PcInstance player, int id, int ammount)
5145+ {
5146+ EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
5147+
5148+ player.addItem("Event", id, ammount, player, true);
5149+ }
5150+
5151+ protected void increasePlayersScore(L2PcInstance player)
5152+ {
5153+ int old = getScore(player);
5154+ setScore(player, old + 1);
5155+ EventStats.getInstance().tempTable.get(player.getObjectId())[3] = EventStats.getInstance().tempTable.get(player.getObjectId())[3] + 1;
5156+ }
5157+
5158+ protected void msgToAll(String text)
5159+ {
5160+ for (L2PcInstance player : players.keySet())
5161+ player.sendMessage(text);
5162+ }
5163+
5164+ public void onDie(L2PcInstance victim, L2PcInstance killer)
5165+ {
5166+ EventStats.getInstance().tempTable.get(victim.getObjectId())[2] = EventStats.getInstance().tempTable.get(victim.getObjectId())[2] + 1;
5167+ return;
5168+ }
5169+
5170+ public void onHit(L2PcInstance actor, L2PcInstance target)
5171+ {
5172+ }
5173+
5174+ public void onKill(L2PcInstance victim, L2PcInstance killer)
5175+ {
5176+ EventStats.getInstance().tempTable.get(killer.getObjectId())[1] = EventStats.getInstance().tempTable.get(killer.getObjectId())[1] + 1;
5177+ return;
5178+ }
5179+
5180+ public void onLogout(L2PcInstance player)
5181+ {
5182+ if (players.containsKey(player))
5183+ removePlayer(player);
5184+
5185+ player.setXYZ(EventManager.getInstance().positions.get(player)[0], EventManager.getInstance().positions.get(player)[1], EventManager.getInstance().positions.get(player)[2]);
5186+ player.setTitle(EventManager.getInstance().titles.get(player));
5187+
5188+ if (teams.size() == 1)
5189+ if (getPlayerList().size() == 1)
5190+ {
5191+ endEvent();
5192+ return;
5193+ }
5194+
5195+ if (teams.size() > 1)
5196+ {
5197+ int t = players.head().getNext().getValue()[0];
5198+ for (L2PcInstance p : getPlayerList())
5199+ if (getTeam(p) != t)
5200+ return;
5201+
5202+ endEvent();
5203+ return;
5204+
5205+ }
5206+ }
5207+
5208+ public void onSay(int type, L2PcInstance player, String text)
5209+ {
5210+ return;
5211+ }
5212+
5213+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
5214+ {
5215+ return false;
5216+ }
5217+
5218+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
5219+ {
5220+ if (EventManager.getInstance().getRestriction("item").contains(item.getItemId()) || getRestriction("item").contains(item.getItemId()))
5221+ return false;
5222+
5223+ if (item.getItemType() == L2EtcItemType.POTION && !getBoolean("allowPotions"))
5224+ return false;
5225+
5226+ if (item.getItemType() == L2EtcItemType.SCROLL)
5227+ return false;
5228+
5229+ return true;
5230+ }
5231+
5232+ public boolean onUseMagic(L2Skill skill)
5233+ {
5234+ if (EventManager.getInstance().getRestriction("skill").contains(skill.getId()) || getRestriction("skill").contains(skill.getId()))
5235+ return false;
5236+
5237+ if (skill.getSkillType() == L2Skill.SkillType.RESURRECT)
5238+ return false;
5239+
5240+ if (skill.getSkillType() == L2Skill.SkillType.SUMMON_FRIEND)
5241+ return false;
5242+
5243+ if (skill.getSkillType() == L2Skill.SkillType.RECALL)
5244+ return false;
5245+
5246+ if (skill.getSkillType() == L2Skill.SkillType.FAKE_DEATH)
5247+ return false;
5248+
5249+ return true;
5250+ }
5251+
5252+ protected void prepare(L2PcInstance player)
5253+ {
5254+ if (player.isCastingNow())
5255+ player.abortCast();
5256+ player.getAppearance().setVisible();
5257+
5258+ if (player.getPet() != null)
5259+ {
5260+ L2Summon summon = player.getPet();
5261+ if (summon instanceof L2PetInstance)
5262+ summon.unSummon(player);
5263+ }
5264+
5265+ if(player.isMounted())
5266+ {
5267+ if(player.setMountType(0))
5268+ {
5269+ if(player.isFlying())
5270+ {
5271+ player.removeSkill(SkillTable.getInstance().getInfo(4289, 1));
5272+ }
5273+ Ride dismount = new Ride(player.getObjectId(), Ride.ACTION_DISMOUNT, 0);
5274+ Broadcast.toSelfAndKnownPlayers(player, dismount);
5275+ player.setMountObjectID(0);
5276+ dismount = null;
5277+ }
5278+ }
5279+
5280+ if (getBoolean("removeBuffs"))
5281+ {
5282+ player.stopAllEffects();
5283+ if (player.getPet() != null)
5284+ {
5285+ L2Summon summon = player.getPet();
5286+ if (summon instanceof L2Summon)
5287+ summon.unSummon(player);
5288+ }
5289+ }
5290+
5291+ if (player.getParty() != null)
5292+ {
5293+ L2Party party = player.getParty();
5294+ party.removePartyMember(player);
5295+ }
5296+ int[] nameColor = getPlayersTeam(player).getTeamColor();
5297+ player.getAppearance().setNameColor(nameColor[0], nameColor[1], nameColor[2]);
5298+ player.setTitle("<- 0 ->");
5299+
5300+ if(EventManager.getInstance().getBoolean("eventBufferEnabled"))
5301+ EventBuffer.getInstance().buffPlayer(player);
5302+
5303+ player.broadcastUserInfo();
5304+ }
5305+
5306+ protected void preparePlayers()
5307+ {
5308+ for (L2PcInstance player : players.keySet())
5309+ prepare(player);
5310+ }
5311+
5312+ protected void removePlayer(L2PcInstance player)
5313+ {
5314+ players.remove(player);
5315+ }
5316+
5317+ public void reset()
5318+ {
5319+ players.clear();
5320+ tpm.purge();
5321+ winnerTeam = 0;
5322+
5323+ for (EventTeam team : teams.values())
5324+ team.setScore(0);
5325+
5326+ debug("Event reseted");
5327+ }
5328+
5329+ protected abstract void schedule(int time);
5330+
5331+ protected void selectPlayers(int teamId, int playerCount)
5332+ {
5333+ for (int i = 0; i < playerCount; i++)
5334+ {
5335+ L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
5336+ players.put(player, new int[] { teamId, 0, 0 });
5337+ EventManager.getInstance().players.remove(player);
5338+ }
5339+
5340+ }
5341+
5342+ protected void setScore(L2PcInstance player, int score)
5343+ {
5344+ players.get(player)[2] = score;
5345+ player.setTitle("<- " + score + " ->");
5346+ player.broadcastUserInfo();
5347+ }
5348+
5349+ protected void setStatus(L2PcInstance player, int status)
5350+ {
5351+ if (players.containsKey(player))
5352+ players.get(player)[1] = status;
5353+ }
5354+
5355+ protected void setTeam(L2PcInstance player, int team)
5356+ {
5357+ players.get(player)[0] = team;
5358+ }
5359+
5360+ protected abstract void showHtml(L2PcInstance player, int obj);
5361+
5362+ protected L2Spawn spawnNPC(int xPos, int yPos, int zPos, int npcId)
5363+ {
5364+ final L2NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
5365+ try
5366+ {
5367+ final L2Spawn spawn = new L2Spawn(template);
5368+ spawn.setLocx(xPos);
5369+ spawn.setLocy(yPos);
5370+ spawn.setLocz(zPos);
5371+ spawn.setAmount(1);
5372+ spawn.setHeading(0);
5373+ spawn.setRespawnDelay(1);
5374+ SpawnTable.getInstance().addNewSpawn(spawn, false);
5375+ spawn.init();
5376+ return spawn;
5377+ }
5378+ catch (Exception e)
5379+ {
5380+ return null;
5381+ }
5382+ }
5383+
5384+ protected abstract void start();
5385+
5386+ protected void teleportPlayer(L2PcInstance player, int[] coordinates)
5387+ {
5388+ player.teleToLocation(coordinates[0] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[1] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[2]);
5389+ }
5390+
5391+ protected void teleportToTeamPos()
5392+ {
5393+ for (L2PcInstance player : players.keySet())
5394+ {
5395+ teleportToTeamPos(player);
5396+ }
5397+
5398+ }
5399+
5400+ protected void teleportToTeamPos(L2PcInstance player)
5401+ {
5402+ int[] pos = getPosition(teams.get(getTeam(player)).getName(), 0);
5403+ teleportPlayer(player, pos);
5404+ }
5405+
5406+ protected void unspawnNPC(L2Spawn npcSpawn)
5407+ {
5408+ if (npcSpawn == null)
5409+ return;
5410+
5411+ npcSpawn.getLastSpawn().deleteMe();
5412+ npcSpawn.stopRespawn();
5413+ SpawnTable.getInstance().deleteSpawn(npcSpawn, true);
5414+ }
5415+
5416+ public int numberOfTeams()
5417+ {
5418+ return teams.size();
5419+ }
5420+
5421+ public void useCapture(L2PcInstance player, L2NpcInstance base){}
5422+
5423+ protected void polymorph(L2PcInstance player, int id)
5424+ {
5425+ player.getPoly().setPolyInfo("", String.valueOf(id));
5426+ player.decayMe();
5427+ player.spawnMe(player.getX(),player.getY(),player.getZ());
5428+ }
5429+
5430+ protected void unpolymorph(L2PcInstance player)
5431+ {
5432+ player.getPoly().setPolyInfo(null, "1");
5433+ player.decayMe();
5434+ player.spawnMe(player.getX(),player.getY(),player.getZ());
5435+ }
5436+}
5437\ No newline at end of file
5438Index: head-src/com/l2jfrozen/gameserver/event/EventBuffer.java
5439===================================================================
5440--- head-src/com/l2jfrozen/gameserver/event/EventBuffer.java (nonexistent)
5441+++ head-src/com/l2jfrozen/gameserver/event/EventBuffer.java (working copy)
5442@@ -0,0 +1,315 @@
5443+/*
5444+ * This program is free software: you can redistribute it and/or modify it under
5445+ * the terms of the GNU General Public License as published by the Free Software
5446+ * Foundation, either version 3 of the License, or (at your option) any later
5447+ * version.
5448+ *
5449+ * This program is distributed in the hope that it will be useful, but WITHOUT
5450+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
5451+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
5452+ * details.
5453+ *
5454+ * You should have received a copy of the GNU General Public License along with
5455+ * this program. If not, see <http://www.gnu.org/licenses/>.
5456+ */
5457+package com.l2jfrozen.gameserver.event;
5458+
5459+import java.sql.Connection;
5460+import java.sql.PreparedStatement;
5461+import java.sql.ResultSet;
5462+import java.util.Map;
5463+import java.util.StringTokenizer;
5464+
5465+import javolution.text.TextBuilder;
5466+import javolution.util.FastList;
5467+import javolution.util.FastMap;
5468+
5469+import com.l2jfrozen.util.database.L2DatabaseFactory;
5470+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
5471+import com.l2jfrozen.gameserver.datatables.SkillTable;
5472+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
5473+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
5474+
5475+/**
5476+ * @author Rizel
5477+ *
5478+ */
5479+public class EventBuffer
5480+{
5481+ private static class SingletonHolder
5482+ {
5483+ protected static final EventBuffer _instance = new EventBuffer();
5484+ }
5485+ private class UpdateTask implements Runnable
5486+ {
5487+ public void run()
5488+ {
5489+ updateSQL();
5490+ }
5491+ }
5492+ public static EventBuffer getInstance()
5493+ {
5494+ return SingletonHolder._instance;
5495+ }
5496+
5497+ private FastMap<String, FastList<Integer>> buffTemplates;
5498+
5499+ private FastMap<String, Boolean> changes;
5500+
5501+ private UpdateTask updateTask;
5502+
5503+ public EventBuffer()
5504+ {
5505+ updateTask = new UpdateTask();
5506+ changes = new FastMap<String, Boolean>();
5507+ buffTemplates = new FastMap<String, FastList<Integer>>();
5508+ loadSQL();
5509+ ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(updateTask, 600000, 600000);
5510+ }
5511+
5512+ protected void buffPlayer(L2PcInstance player)
5513+ {
5514+ boolean bss = player.checkBss();
5515+ boolean sps = player.checkSps();
5516+ boolean ss = player.checkSs();
5517+
5518+ String playerId = "" + player.getObjectId() + player.getClassIndex();
5519+
5520+ if(!buffTemplates.containsKey(playerId))
5521+ {
5522+ EventManager.getInstance().debug("The player : "+player.getName()+" ("+playerId+") without template");
5523+ return;
5524+ }
5525+
5526+ for (int skillId : buffTemplates.get(playerId))
5527+ SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getEffects(player, player, ss, sps, bss);
5528+ }
5529+
5530+ public void changeList(L2PcInstance player, int buff, boolean action)
5531+ {
5532+ String playerId = "" + player.getObjectId() + player.getClassIndex();
5533+
5534+ if (!buffTemplates.containsKey(playerId))
5535+ {
5536+ buffTemplates.put(playerId, new FastList<Integer>());
5537+ changes.put(playerId, true);
5538+ }
5539+ else
5540+ {
5541+ if (!changes.containsKey(playerId))
5542+ changes.put(playerId, false);
5543+
5544+ if (action)
5545+ buffTemplates.get(playerId).add(buff);
5546+ else
5547+ buffTemplates.get(playerId).remove(buffTemplates.get(playerId).indexOf(buff));
5548+
5549+ }
5550+
5551+ }
5552+
5553+ private void loadSQL()
5554+ {
5555+ if (!EventManager.getInstance().getBoolean("eventBufferEnabled"))
5556+ return;
5557+
5558+ Connection con = null;
5559+ PreparedStatement statement = null;
5560+ try
5561+ {
5562+ con = L2DatabaseFactory.getInstance().getConnection();
5563+ statement = con.prepareStatement("SELECT * FROM event_buffs");
5564+ ResultSet rset = statement.executeQuery();
5565+ int count = 0;
5566+ while (rset.next())
5567+ {
5568+ count++;
5569+
5570+ buffTemplates.put(rset.getString("player"), new FastList<Integer>());
5571+
5572+ StringTokenizer st = new StringTokenizer(rset.getString("buffs"), ",");
5573+
5574+ FastList<Integer> templist = new FastList<Integer>();
5575+
5576+ while (st.hasMoreTokens())
5577+ templist.add(Integer.parseInt(st.nextToken()));
5578+
5579+ buffTemplates.getEntry(rset.getString("player")).setValue(templist);
5580+ }
5581+ rset.close();
5582+ statement.close();
5583+
5584+ EventManager.getInstance().debug("Buffer loaded: " + count + " players template.");
5585+ }
5586+ catch (Exception e)
5587+ {
5588+ System.out.println("EventBuffs SQL catch");
5589+ }
5590+ finally
5591+ {
5592+ try { con.close(); } catch (Exception e) {}
5593+ }
5594+ }
5595+
5596+ protected boolean playerHaveTemplate(L2PcInstance player)
5597+ {
5598+ String playerId = "" + player.getObjectId() + player.getClassIndex();
5599+
5600+ if (buffTemplates.containsKey(playerId))
5601+ return true;
5602+ else
5603+ return false;
5604+ }
5605+
5606+ public void showHtml(L2PcInstance player)
5607+ {
5608+ try{
5609+ String playerId = "" + player.getObjectId() + player.getClassIndex();
5610+
5611+ if (!buffTemplates.containsKey(playerId))
5612+ {
5613+ buffTemplates.put(playerId, new FastList<Integer>());
5614+ changes.put(playerId, true);
5615+ }
5616+
5617+ StringTokenizer st = new StringTokenizer(EventManager.getInstance().getString("allowedBuffsList"), ",");
5618+
5619+ FastList<Integer> skillList = new FastList<Integer>();
5620+
5621+ while (st.hasMoreTokens())
5622+ skillList.add(Integer.parseInt(st.nextToken()));
5623+
5624+ NpcHtmlMessage html = new NpcHtmlMessage(0);
5625+ TextBuilder sb = new TextBuilder();
5626+
5627+ 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>");
5628+ sb.append("<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>");
5629+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td>Added buffs:</td></tr></table><br>");
5630+ sb.append("<center><table width=270>");
5631+
5632+ int c = 0;
5633+ for (int skillId : buffTemplates.get(playerId))
5634+ {
5635+ c++;
5636+ String skillStr = "0000";
5637+ if (skillId < 100)
5638+ skillStr = "00" + skillId;
5639+ else if (skillId > 99 && skillId < 1000)
5640+ skillStr = "0" + skillId;
5641+ else if (skillId > 4698 && skillId < 4701)
5642+ skillStr = "1331";
5643+ else if (skillId > 4701 && skillId < 4704)
5644+ skillStr = "1332";
5645+ else
5646+ skillStr = "" + skillId;
5647+
5648+ if (c % 2 == 1)
5649+ sb.append("<tr><td width=33><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100><a action=\"bypass -h eventbuffer " + skillId + " 0\">" + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + "</a></td>");
5650+ if (c % 2 == 0)
5651+ sb.append("<td width=33><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100><a action=\"bypass -h eventbuffer " + skillId + " 0\">" + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + "</a></td></tr>");
5652+ }
5653+
5654+ if (c % 2 == 1)
5655+ sb.append("<td width=33></td><td width=100></td></tr>");
5656+
5657+ sb.append("</table><br>");
5658+
5659+ sb.append("<br><br><center><table width=270 bgcolor=5A5A5A><tr><td>Available buffs:</td></tr></table><br>");
5660+ sb.append("<center><table width=270>");
5661+
5662+ c = 0;
5663+ for (int skillId : skillList)
5664+ {
5665+ String skillStr = "0000";
5666+ if (skillId < 100)
5667+ skillStr = "00" + skillId;
5668+ else if (skillId > 99 && skillId < 1000)
5669+ skillStr = "0" + skillId;
5670+ else if (skillId > 4698 && skillId < 4701)
5671+ skillStr = "1331";
5672+ else if (skillId > 4701 && skillId < 4704)
5673+ skillStr = "1332";
5674+ else
5675+ skillStr = "" + skillId;
5676+
5677+ if (!buffTemplates.get(playerId).contains(skillId))
5678+ {
5679+ c++;
5680+ if (c % 2 == 1)
5681+ sb.append("<tr><td width=32><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100>" + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "<a action=\"bypass -h eventbuffer " + skillId + " 1\">" : "") + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "</a>" : "") + "</td>");
5682+ if (c % 2 == 0)
5683+ sb.append("<td width=32><img src=\"Icon.skill" + skillStr + "\" width=32 height=32></td><td width=100>" + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "<a action=\"bypass -h eventbuffer " + skillId + " 1\">" : "") + SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getName() + ((EventManager.getInstance().getInt("maxBuffNum") - buffTemplates.get(playerId).size()) != 0 ? "</a>" : "") + "</td></tr>");
5684+ }
5685+ }
5686+
5687+ if (c % 2 == 1)
5688+ sb.append("<td width=33></td><td width=100></td></tr>");
5689+
5690+ sb.append("</table>");
5691+
5692+ sb.append("</body></html>");
5693+ html.setHtml(sb.toString());
5694+ player.sendPacket(html);
5695+ }
5696+ catch(Throwable e)
5697+ {
5698+ e.printStackTrace();
5699+ }
5700+ }
5701+
5702+ public void updateSQL()
5703+ {
5704+ Connection con = null;
5705+ PreparedStatement statement = null;
5706+
5707+ try
5708+ {
5709+ con = L2DatabaseFactory.getInstance().getConnection();
5710+
5711+ for (Map.Entry<String, Boolean> player : changes.entrySet())
5712+ {
5713+
5714+ TextBuilder sb = new TextBuilder();
5715+
5716+ int c = 0;
5717+ for (int buffid : buffTemplates.get(player.getKey()))
5718+ if (c == 0)
5719+ {
5720+ sb.append(buffid);
5721+ c++;
5722+ }
5723+ else
5724+ sb.append("," + buffid);
5725+
5726+ if (player.getValue())
5727+ {
5728+ statement = con.prepareStatement("INSERT INTO event_buffs(player,buffs) VALUES (?,?)");
5729+ statement.setString(1, player.getKey());
5730+ statement.setString(2, sb.toString());
5731+
5732+ statement.executeUpdate();
5733+ statement.close();
5734+ }
5735+ else
5736+ {
5737+ statement = con.prepareStatement("UPDATE event_buffs SET buffs=? WHERE player=?");
5738+ statement.setString(1, sb.toString());
5739+ statement.setString(2, player.getKey());
5740+
5741+ statement.executeUpdate();
5742+ statement.close();
5743+ }
5744+ }
5745+ }
5746+ catch (Exception e)
5747+ {
5748+ System.out.println("EventBuffs SQL catch");
5749+ }
5750+ finally
5751+ {
5752+ try { con.close(); } catch (Exception e) {}
5753+ }
5754+
5755+ changes.clear();
5756+ }
5757+}
5758\ No newline at end of file
5759Index: head-src/com/l2jfrozen/gameserver/event/EventConfig.java
5760===================================================================
5761--- head-src/com/l2jfrozen/gameserver/event/EventConfig.java (nonexistent)
5762+++ head-src/com/l2jfrozen/gameserver/event/EventConfig.java (working copy)
5763@@ -0,0 +1,270 @@
5764+package com.l2jfrozen.gameserver.event;
5765+
5766+import java.io.File;
5767+import java.util.StringTokenizer;
5768+import java.util.logging.Logger;
5769+
5770+import javax.xml.parsers.DocumentBuilder;
5771+import javax.xml.parsers.DocumentBuilderFactory;
5772+
5773+import javolution.util.FastList;
5774+import javolution.util.FastMap;
5775+
5776+import org.w3c.dom.Document;
5777+import org.w3c.dom.NamedNodeMap;
5778+import org.w3c.dom.Node;
5779+
5780+import com.l2jfrozen.util.random.Rnd;
5781+
5782+public class EventConfig
5783+{
5784+
5785+ @SuppressWarnings("synthetic-access")
5786+ private static class SingletonHolder
5787+ {
5788+ protected static final EventConfig _instance = new EventConfig();
5789+ }
5790+
5791+ public static EventConfig getInstance()
5792+ {
5793+ return SingletonHolder._instance;
5794+ }
5795+
5796+ private Logger _log = Logger.getLogger(EventConfig.class.getName());
5797+ public FastMap<Integer, FastMap<String, String>> config;
5798+
5799+ public FastMap<Integer, FastMap<String, FastMap<Integer, int[]>>> positions;
5800+
5801+ public FastMap<Integer, FastMap<String, int[]>> colors;
5802+
5803+ public FastMap<Integer, FastMap<String, FastList<Integer>>> restrictions;
5804+
5805+ public EventConfig()
5806+ {
5807+ config = new FastMap<Integer, FastMap<String, String>>();
5808+ positions = new FastMap<Integer, FastMap<String, FastMap<Integer, int[]>>>();
5809+ colors = new FastMap<Integer, FastMap<String, int[]>>();
5810+ restrictions = new FastMap<Integer, FastMap<String, FastList<Integer>>>();
5811+ loadConfigs();
5812+ }
5813+
5814+ private void addColor(int id, String owner, int[] color)
5815+ {
5816+ if (!colors.containsKey(id))
5817+ colors.put(id, new FastMap<String, int[]>());
5818+
5819+ colors.get(id).put(owner, color);
5820+ }
5821+
5822+ private void addPosition(int id, String owner, int x, int y, int z, int radius)
5823+ {
5824+
5825+ if (!positions.containsKey(id))
5826+ positions.put(id, new FastMap<String, FastMap<Integer, int[]>>());
5827+ if (!positions.get(id).containsKey(owner))
5828+ positions.get(id).put(owner, new FastMap<Integer, int[]>());
5829+
5830+ positions.get(id).get(owner).put(positions.get(id).get(owner).size() + 1, new int[] { x, y, z, radius });
5831+ }
5832+
5833+ private void addProperty(int id, String propName, String value)
5834+ {
5835+ if (!config.containsKey(id))
5836+ config.put(id, new FastMap<String, String>());
5837+
5838+ config.get(id).put(propName, value);
5839+ }
5840+
5841+ private void addRestriction(int id, String type, String ids)
5842+ {
5843+ if (!restrictions.containsKey(id))
5844+ restrictions.put(id, new FastMap<String, FastList<Integer>>());
5845+
5846+ FastList<Integer> idlist = new FastList<Integer>();
5847+ StringTokenizer st = new StringTokenizer(ids, ",");
5848+ while (st.hasMoreTokens())
5849+ idlist.add(Integer.parseInt(st.nextToken()));
5850+
5851+ restrictions.get(id).put(type, idlist);
5852+ }
5853+
5854+ public boolean getBoolean(int event, String propName)
5855+ {
5856+ if (!(config.containsKey(event)))
5857+ {
5858+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
5859+ return false;
5860+ }
5861+
5862+ if (config.get(event).containsKey(propName))
5863+ return Boolean.parseBoolean(config.get(event).get(propName));
5864+ else
5865+ {
5866+ _log.warning("Event: Try to get a non existing property: " + propName);
5867+ return false;
5868+ }
5869+
5870+ }
5871+
5872+ public int[] getColor(int event, String owner)
5873+ {
5874+ if (!(colors.containsKey(event)))
5875+ {
5876+ _log.warning("Event: Try to get a color of a non existing event: ID: " + event);
5877+ return new int[] { 255, 255, 255 };
5878+ }
5879+
5880+ if (colors.get(event).containsKey(owner))
5881+ return colors.get(event).get(owner);
5882+ else
5883+ {
5884+ _log.warning("Event: Try to get a non existing color: " + owner);
5885+ return new int[] { 255, 255, 255 };
5886+ }
5887+ }
5888+
5889+ public int getInt(int event, String propName)
5890+ {
5891+ if (!(config.containsKey(event)))
5892+ {
5893+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
5894+ return -1;
5895+ }
5896+
5897+ if (config.get(event).containsKey(propName))
5898+ return Integer.parseInt(config.get(event).get(propName));
5899+ else
5900+ {
5901+ _log.warning("Event: Try to get a non existing property: " + propName);
5902+ return -1;
5903+ }
5904+ }
5905+
5906+ public int[] getPosition(int event, String owner, int num)
5907+ {
5908+ if (!positions.containsKey(event))
5909+ {
5910+ _log.warning("Event: Try to get a position of a non existing event: ID: " + event);
5911+ return new int[] {};
5912+ }
5913+ if (!positions.get(event).containsKey(owner))
5914+ {
5915+ _log.warning("Event: Try to get a position of a non existing owner: " + owner);
5916+ return new int[] {};
5917+ }
5918+ if (!positions.get(event).get(owner).containsKey(num) && num != 0)
5919+ {
5920+ _log.warning("Event: Try to get a non existing position: " + num);
5921+ return new int[] {};
5922+ }
5923+
5924+ if (num == 0)
5925+ return positions.get(event).get(owner).get(Rnd.get(positions.get(event).get(owner).size()) + 1);
5926+ else
5927+ return positions.get(event).get(owner).get(num);
5928+ }
5929+
5930+ public FastList<Integer> getRestriction(int event, String type)
5931+ {
5932+ if (!(restrictions.containsKey(event)))
5933+ {
5934+ _log.warning("Event: Try to get a restriction of a non existing event: ID: " + event);
5935+ return null;
5936+ }
5937+ if (restrictions.get(event).containsKey(type))
5938+ return restrictions.get(event).get(type);
5939+ else
5940+ {
5941+ _log.warning("Event: Try to get a non existing restriction: " + type);
5942+ return null;
5943+ }
5944+ }
5945+
5946+ public String getString(int event, String propName)
5947+ {
5948+ if (!(config.containsKey(event)))
5949+ {
5950+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
5951+ return null;
5952+ }
5953+
5954+ if (config.get(event).containsKey(propName))
5955+ return config.get(event).get(propName);
5956+ else
5957+ {
5958+ _log.warning("Event: Try to get a non existing property: " + propName);
5959+ return null;
5960+ }
5961+
5962+ }
5963+
5964+ private void loadConfigs()
5965+ {
5966+ File configFile = new File("./config/Events.xml");
5967+ Document doc = null;
5968+ try
5969+ {
5970+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
5971+ dbf.setIgnoringComments(true);
5972+ dbf.setValidating(false);
5973+ DocumentBuilder db = dbf.newDocumentBuilder();
5974+ doc = db.parse(configFile);
5975+
5976+ for (Node root = doc.getFirstChild(); root != null; root = root.getNextSibling())
5977+ if ("events".equalsIgnoreCase(root.getNodeName()))
5978+ for (Node event = root.getFirstChild(); event != null; event = event.getNextSibling())
5979+ if ("event".equalsIgnoreCase(event.getNodeName()))
5980+ {
5981+ NamedNodeMap eventAttrs = event.getAttributes();
5982+ int eventId = Integer.parseInt(eventAttrs.getNamedItem("id").getNodeValue());
5983+
5984+ for (Node property = event.getFirstChild(); property != null; property = property.getNextSibling())
5985+ {
5986+
5987+ if ("property".equalsIgnoreCase(property.getNodeName()))
5988+ {
5989+ NamedNodeMap propAttrs = property.getAttributes();
5990+ String name = propAttrs.getNamedItem("name").getNodeValue();
5991+ String value = propAttrs.getNamedItem("value").getNodeValue();
5992+ addProperty(eventId, name, value);
5993+ }
5994+
5995+ if ("position".equalsIgnoreCase(property.getNodeName()))
5996+ {
5997+ NamedNodeMap propAttrs = property.getAttributes();
5998+ String owner = propAttrs.getNamedItem("owner").getNodeValue();
5999+ String x = propAttrs.getNamedItem("x").getNodeValue();
6000+ String y = propAttrs.getNamedItem("y").getNodeValue();
6001+ String z = propAttrs.getNamedItem("z").getNodeValue();
6002+ String radius = propAttrs.getNamedItem("radius").getNodeValue();
6003+ addPosition(eventId, owner, Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z), Integer.parseInt(radius));
6004+
6005+ }
6006+
6007+ if ("color".equalsIgnoreCase(property.getNodeName()))
6008+ {
6009+ NamedNodeMap propAttrs = property.getAttributes();
6010+ String owner = propAttrs.getNamedItem("owner").getNodeValue();
6011+ int r = Integer.parseInt(propAttrs.getNamedItem("r").getNodeValue());
6012+ int g = Integer.parseInt(propAttrs.getNamedItem("g").getNodeValue());
6013+ int b = Integer.parseInt(propAttrs.getNamedItem("b").getNodeValue());
6014+ addColor(eventId, owner, new int[] { r, g, b });
6015+ }
6016+
6017+ if ("restriction".equalsIgnoreCase(property.getNodeName()))
6018+ {
6019+ NamedNodeMap propAttrs = property.getAttributes();
6020+ String type = propAttrs.getNamedItem("type").getNodeValue();
6021+ String ids = propAttrs.getNamedItem("ids").getNodeValue();
6022+ addRestriction(eventId, type, ids);
6023+ }
6024+ }
6025+ }
6026+ }
6027+ catch (Exception e)
6028+ {
6029+
6030+ }
6031+
6032+ }
6033+}
6034\ No newline at end of file
6035Index: head-src/com/l2jfrozen/gameserver/event/EventManager.java
6036===================================================================
6037--- head-src/com/l2jfrozen/gameserver/event/EventManager.java (nonexistent)
6038+++ head-src/com/l2jfrozen/gameserver/event/EventManager.java (working copy)
6039@@ -0,0 +1,727 @@
6040+package com.l2jfrozen.gameserver.event;
6041+
6042+import java.io.FileWriter;
6043+import java.io.IOException;
6044+import java.text.SimpleDateFormat;
6045+import java.util.Date;
6046+import java.util.Map;
6047+import java.util.Random;
6048+
6049+import javolution.text.TextBuilder;
6050+import javolution.util.FastList;
6051+import javolution.util.FastMap;
6052+
6053+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
6054+import com.l2jfrozen.gameserver.model.L2Character;
6055+import com.l2jfrozen.gameserver.model.L2Party;
6056+import com.l2jfrozen.gameserver.model.L2World;
6057+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
6058+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
6059+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
6060+import com.l2jfrozen.gameserver.util.Broadcast;
6061+
6062+public final class EventManager
6063+{
6064+
6065+ private class Countdown implements Runnable
6066+ {
6067+ protected String getTime()
6068+ {
6069+ String mins = "" + counter / 60;
6070+ String secs = (counter % 60 < 10 ? "0" + counter % 60 : "" + counter % 60);
6071+ return "" + mins + ":" + secs + "";
6072+ }
6073+
6074+ @SuppressWarnings("synthetic-access")
6075+ public void run()
6076+ {
6077+ if (status == State.REGISTERING)
6078+
6079+ switch (counter)
6080+ {
6081+ case 300:
6082+ case 240:
6083+ case 180:
6084+ case 120:
6085+ case 60:
6086+ announce("" + counter / 60 + " min(s) left to register, " + getCurrentEvent().getString("eventName"));
6087+ break;
6088+ case 30:
6089+ case 10:
6090+ announce("" + counter + " seconds left to register!");
6091+ break;
6092+ }
6093+
6094+ if (status == State.VOTING)
6095+ if (counter == getInt("showVotePopupAt") && getBoolean("votePopupEnabled"))
6096+ {
6097+ NpcHtmlMessage html = new NpcHtmlMessage(0);
6098+ TextBuilder sb = new TextBuilder();
6099+ int count = 0;
6100+
6101+ 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>");
6102+
6103+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>Voting</td><td width=130><center>Time left: " + cdtask.getTime() + "</td><td width=70>Votes: " + votes.size() + "</td></tr></table><br>");
6104+
6105+ for (Map.Entry<Integer, Event> event : events.entrySet())
6106+ {
6107+ count++;
6108+ sb.append("<center><table width=270 " + (count % 2 == 1 ? "" : "bgcolor=5A5A5A") + "><tr><td width=180>" + event.getValue().getString("eventName") + "</td><td width=30>Info</td><td width=30>");
6109+ sb.append("<a action=\"bypass -h eventvote " + event.getKey() + "\">Vote</a>");
6110+ sb.append("</td><td width=30><center>" + getVoteCount(event.getKey()) + "</td></tr></table>");
6111+ }
6112+
6113+ sb.append("</body></html>");
6114+ html.setHtml(sb.toString());
6115+
6116+ for (L2PcInstance player : L2World.getInstance().getAllPlayers())
6117+ {
6118+ if (votes.containsKey(player) || player.getLevel() < 40)
6119+ continue;
6120+
6121+ player.sendPacket(html);
6122+ }
6123+ }
6124+
6125+ if (counter == 0)
6126+ schedule(1);
6127+ else
6128+ {
6129+ counter--;
6130+ tpm.scheduleGeneral(cdtask, 1000);
6131+ }
6132+
6133+ }
6134+ }
6135+
6136+ private class Scheduler implements Runnable
6137+ {
6138+ @SuppressWarnings("synthetic-access")
6139+ public void run()
6140+ {
6141+ switch (status)
6142+ {
6143+ case VOTING:
6144+ if (votes.size() > 0)
6145+ setCurrentEvent(getVoteWinner());
6146+ else
6147+ setCurrentEvent(eventIds.get(rnd.nextInt(eventIds.size())));
6148+
6149+ announce("The next event will be: " + getCurrentEvent().getString("eventName"));
6150+ announce("Registering phase started! You have " + getInt("registerTime") / 60 + " mins to register!");
6151+ announce("Event joinable in giran.");
6152+ setStatus(State.REGISTERING);
6153+ debug("Registering phase started.");
6154+ counter = getInt("registerTime") - 1;
6155+ tpm.scheduleGeneral(cdtask, 1);
6156+ break;
6157+
6158+ case REGISTERING:
6159+ announce("Registering phase ended!");
6160+ debug("Registering phase ended.");
6161+ if (countOfRegistered() < getCurrentEvent().getInt("minPlayers"))
6162+ {
6163+ debug("Lack of participants.");
6164+ announce("Theres not enough participants! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
6165+ players.clear();
6166+ colors.clear();
6167+ positions.clear();
6168+ setStatus(State.VOTING);
6169+ counter = getInt("betweenEventsTime") - 1;
6170+ tpm.scheduleGeneral(cdtask, 1);
6171+ }
6172+ else
6173+ {
6174+ debug("Event starts.");
6175+ announce("Event started!");
6176+ setStatus(State.RUNNING);
6177+ msgToAll("You'll be teleported to the event in 10 secs");
6178+ schedule(10000);
6179+ }
6180+ break;
6181+
6182+ case RUNNING:
6183+ getCurrentEvent().start();
6184+
6185+ for (L2PcInstance player : players)
6186+ EventStats.getInstance().tempTable.put(player.getObjectId(), new int[] { 0, 0, 0, 0 });
6187+
6188+ break;
6189+
6190+ case TELE_BACK:
6191+ msgToAll("You'll be teleported back in 10 secs");
6192+ setStatus(State.END);
6193+ debug("Teleporting back.");
6194+ schedule(10000);
6195+ break;
6196+
6197+ case END:
6198+ teleBackEveryone();
6199+ if (getBoolean("statTrackingEnabled"))
6200+ {
6201+ EventStats.getInstance().applyChanges();
6202+ EventStats.getInstance().tempTable.clear();
6203+ EventStats.getInstance().updateSQL(getCurrentEvent().getPlayerList(), getCurrentEvent().eventId);
6204+ }
6205+ getCurrentEvent().reset();
6206+ setCurrentEvent(0);
6207+ players.clear();
6208+ colors.clear();
6209+ positions.clear();
6210+ titles.clear();
6211+ announce("Event ended! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
6212+ setStatus(State.VOTING);
6213+ counter = getInt("betweenEventsTime") - 1;
6214+ debug("Event ended.");
6215+ tpm.scheduleGeneral(cdtask, 1);
6216+ break;
6217+
6218+ }
6219+ }
6220+ }
6221+
6222+ @SuppressWarnings("synthetic-access")
6223+ private static class SingletonHolder
6224+ {
6225+ protected static final EventManager _instance = new EventManager();
6226+ }
6227+
6228+ // Manager Statuses
6229+ protected enum State
6230+ {
6231+ REGISTERING, VOTING, RUNNING, TELE_BACK, END
6232+ }
6233+
6234+ public static EventManager getInstance()
6235+ {
6236+ return SingletonHolder._instance;
6237+ }
6238+
6239+ private EventConfig config;
6240+ // Event instances
6241+ public FastMap<Integer, Event> events;
6242+
6243+ // The list of registered players
6244+ public FastList<L2PcInstance> players;
6245+
6246+ // The current event
6247+ private Event current;
6248+
6249+ // Original name colors
6250+ private FastMap<L2PcInstance, Integer> colors;
6251+
6252+ //Original titles
6253+ protected FastMap<L2PcInstance, String> titles;
6254+
6255+ //Original positions
6256+ protected FastMap<L2PcInstance, int[]> positions;
6257+
6258+ // Votes for the events
6259+ private FastMap<L2PcInstance, Integer> votes;
6260+
6261+ private State status;
6262+
6263+ private int counter;
6264+
6265+ private Countdown cdtask;
6266+
6267+ // NPC location
6268+ public static int[] npcPos = { 82698, 148638, -3473 };
6269+
6270+ // Threadpoolmanager
6271+ private ThreadPoolManager tpm;
6272+
6273+ // Scheduler
6274+ private Scheduler task;
6275+
6276+ private Random rnd = new Random();
6277+
6278+ private FileWriter writer;
6279+
6280+ private FastList<Integer> eventIds;
6281+
6282+ private static final SimpleDateFormat _formatter = new SimpleDateFormat("dd/MM/yyyy H:mm:ss");
6283+
6284+ public EventManager()
6285+ {
6286+ config = EventConfig.getInstance();
6287+
6288+ events = new FastMap<Integer, Event>();
6289+ players = new FastList<L2PcInstance>();
6290+ votes = new FastMap<L2PcInstance, Integer>();
6291+ titles = new FastMap<L2PcInstance, String>();
6292+ colors = new FastMap<L2PcInstance, Integer>();
6293+ positions = new FastMap<L2PcInstance, int[]>();
6294+ eventIds = new FastList<Integer>();
6295+ status = State.VOTING;
6296+ tpm = ThreadPoolManager.getInstance();
6297+ task = new Scheduler();
6298+ cdtask = new Countdown();
6299+ counter = 0;
6300+
6301+ // Add the events to the list
6302+ events.put(1, new dm());
6303+ events.put(2, new Domination());
6304+ events.put(3, new DoubleDomination());
6305+ events.put(4, new LMS());
6306+ events.put(5, new Lucky());
6307+ events.put(6, new Simon());
6308+ events.put(7, new TvT());
6309+ events.put(8, new VIPTvT());
6310+ events.put(9, new Zombie());
6311+ events.put(10, new CTF());
6312+ events.put(11, new Russian());
6313+ events.put(12, new Bomb());
6314+ events.put(13, new Mutant());
6315+ events.put(14, new Battlefield());
6316+
6317+ for(int eventId : events.keySet())
6318+ eventIds.add(eventId);
6319+
6320+ debug(events.size() + " event imported.");
6321+
6322+ // Start the scheduler
6323+ counter = getInt("firstAfterStartTime") - 1;
6324+ tpm.scheduleGeneral(cdtask, 1);
6325+
6326+ System.out.println("Event Engine Started");
6327+ }
6328+
6329+ public boolean addVote(L2PcInstance player, int eventId)
6330+ {
6331+ if (getStatus() != State.VOTING)
6332+ {
6333+ player.sendMessage("You cant vote now!");
6334+ return false;
6335+ }
6336+ if (votes.containsKey(player))
6337+ {
6338+ player.sendMessage("You already voted for an event!");
6339+ return false;
6340+ }
6341+ if (player.getLevel() < 40)
6342+ {
6343+ player.sendMessage("Your level is too low to vote for events!");
6344+ return false;
6345+ }
6346+ else
6347+ {
6348+ player.sendMessage("You succesfully voted for the event");
6349+ votes.put(player, eventId);
6350+ return true;
6351+ }
6352+ }
6353+
6354+ private void announce(String text)
6355+ {
6356+ Broadcast.toAllOnlinePlayers(new CreatureSay(0, 18, "", "[Event] " + text));
6357+ }
6358+
6359+ private boolean canRegister(L2PcInstance player)
6360+ {
6361+ if (players.contains(player))
6362+ {
6363+ player.sendMessage("You already registered to the event!");
6364+ return false;
6365+ }
6366+
6367+ if (player.isInJail())
6368+ {
6369+ player.sendMessage("You cant register from the jail.");
6370+ return false;
6371+ }
6372+
6373+ if (player.isInOlympiadMode())
6374+ {
6375+ player.sendMessage("You cant register while youre in the olympiad.");
6376+ return false;
6377+ }
6378+
6379+ if (player.getLevel() > getCurrentEvent().getInt("maxLvl"))
6380+ {
6381+ player.sendMessage("Youre greater than the max allowed lvl.");
6382+ return false;
6383+ }
6384+
6385+ if (player.getLevel() < getCurrentEvent().getInt("minLvl"))
6386+ {
6387+ player.sendMessage("Youre lower than the min allowed lvl.");
6388+ return false;
6389+ }
6390+
6391+ if (player.getKarma() > 0)
6392+ {
6393+ player.sendMessage("You cant register if you have karma.");
6394+ return false;
6395+ }
6396+
6397+ if (player.isCursedWeaponEquiped())
6398+ {
6399+ player.sendMessage("You cant register with a cursed weapon.");
6400+ return false;
6401+ }
6402+
6403+ if (player.isDead())
6404+ {
6405+ player.sendMessage("You cant register while youre dead.");
6406+ return false;
6407+ }
6408+
6409+ return true;
6410+ } /*
6411+ * If theres a running event and
6412+ */
6413+
6414+ public boolean canTargetPlayer(L2PcInstance target, L2PcInstance self)
6415+ {
6416+ if (getStatus() == State.RUNNING)
6417+ {
6418+ if ((isRegistered(target) && isRegistered(self)) || (!isRegistered(target) && !isRegistered(self)))
6419+ return true;
6420+ else
6421+ return false;
6422+ }
6423+ else
6424+ return true;
6425+ }
6426+
6427+ protected int countOfRegistered()
6428+ {
6429+ return players.size();
6430+ }
6431+
6432+ protected void debug(String message)
6433+ {
6434+ if (!getBoolean("debug"))
6435+ return;
6436+
6437+ String today = _formatter.format(new Date());
6438+
6439+ try
6440+ {
6441+ writer = new FileWriter("log/EventEngine.log", true);
6442+ writer.write(today + " - " + message + "\r\n");
6443+ }
6444+ catch (IOException e)
6445+ {
6446+
6447+ }
6448+ finally
6449+ {
6450+ try
6451+ {
6452+ writer.close();
6453+ }
6454+ catch (Exception e)
6455+ {
6456+ }
6457+ }
6458+ }
6459+
6460+ protected void end(String text)
6461+ {
6462+ announce(text);
6463+ status = State.TELE_BACK;
6464+ schedule(1);
6465+ }
6466+
6467+ public boolean getBoolean(String propName)
6468+ {
6469+ return config.getBoolean(0, propName);
6470+ }
6471+
6472+ public Event getCurrentEvent()
6473+ {
6474+ return current;
6475+ }
6476+
6477+ public FastList<String> getEventNames()
6478+ {
6479+ FastList<String> map = new FastList<String>();
6480+ for (Event event : events.values())
6481+ map.add(event.getString("eventName"));
6482+ return map;
6483+ }
6484+
6485+ public int getInt(String propName)
6486+ {
6487+ return config.getInt(0, propName);
6488+ }
6489+
6490+ protected int[] getPosition(String owner, int num)
6491+ {
6492+ return config.getPosition(0, owner, num);
6493+ }
6494+
6495+ public FastList<Integer> getRestriction(String type)
6496+ {
6497+ return config.getRestriction(0, type);
6498+ }
6499+
6500+ private State getStatus()
6501+ {
6502+ return status;
6503+ }
6504+
6505+ protected String getString(String propName)
6506+ {
6507+ return config.getString(0, propName);
6508+ }
6509+
6510+ private int getVoteCount(int event)
6511+ {
6512+ int count = 0;
6513+ for (int e : votes.values())
6514+ if (e == event)
6515+ count++;
6516+
6517+ return count;
6518+ }
6519+
6520+ private int getVoteWinner()
6521+ {
6522+ int old = 0;
6523+ FastMap<Integer, Integer> temp = new FastMap<Integer, Integer>();
6524+
6525+ for (int vote : votes.values())
6526+ if (!temp.containsKey(vote))
6527+ temp.put(vote, 1);
6528+ else
6529+ {
6530+ old = temp.get(vote);
6531+ old++;
6532+ temp.getEntry(vote).setValue(old);
6533+ }
6534+
6535+ int max = temp.head().getNext().getValue();
6536+ int result = temp.head().getNext().getKey();
6537+
6538+ for (Map.Entry<Integer, Integer> entry : temp.entrySet())
6539+ if (entry.getValue() > max)
6540+ {
6541+ max = entry.getValue();
6542+ result = entry.getKey();
6543+ }
6544+
6545+ votes.clear();
6546+ temp = null;
6547+ return result;
6548+
6549+ }
6550+
6551+ public boolean isRegistered(L2PcInstance player)
6552+ {
6553+ if (getCurrentEvent() != null)
6554+ return getCurrentEvent().players.containsKey(player);
6555+ else
6556+ return false;
6557+ }
6558+
6559+ public boolean isRegistered(L2Character player)
6560+ {
6561+ if (getCurrentEvent() != null)
6562+ return getCurrentEvent().players.containsKey(player);
6563+ else
6564+ return false;
6565+ }
6566+
6567+ public boolean isRunning()
6568+ {
6569+ if (getStatus() == State.RUNNING)
6570+ return true;
6571+ else
6572+ return false;
6573+ }
6574+
6575+ private void msgToAll(String text)
6576+ {
6577+ for (L2PcInstance player : players)
6578+ player.sendMessage(text);
6579+ }
6580+
6581+ public void onLogout(L2PcInstance player)
6582+ {
6583+ if (votes.containsKey(player))
6584+ votes.remove(player);
6585+ if (players.contains(player))
6586+ {
6587+ players.remove(player);
6588+ colors.remove(player);
6589+ titles.remove(player);
6590+ positions.remove(player);
6591+ }
6592+ }
6593+
6594+ public boolean registerPlayer(L2PcInstance player)
6595+ {
6596+ if (getStatus() != State.REGISTERING)
6597+ {
6598+ player.sendMessage("You can't register now!");
6599+ return false;
6600+ }
6601+
6602+ if(getBoolean("eventBufferEnabled"))
6603+ if (!EventBuffer.getInstance().playerHaveTemplate(player))
6604+ {
6605+ player.sendMessage("You have to set a buff template first!");
6606+ EventBuffer.getInstance().showHtml(player);
6607+ return false;
6608+ }
6609+
6610+ if (canRegister(player))
6611+ {
6612+ player.sendMessage("You succesfully registered to the event!");
6613+ players.add(player);
6614+ titles.put(player, player.getTitle());
6615+ colors.put(player, player.getAppearance().getNameColor());
6616+ positions.put(player, new int[] { player.getX(), player.getY(), player.getZ() });
6617+ return true;
6618+ }
6619+ else
6620+ {
6621+ player.sendMessage("You failed on registering to the event!");
6622+ return false;
6623+ }
6624+ }
6625+
6626+ protected void schedule(int time)
6627+ {
6628+ tpm.scheduleGeneral(task, time);
6629+ }
6630+
6631+ private void setCurrentEvent(int eventId)
6632+ {
6633+ if (eventId == 0)
6634+ current = null;
6635+ else
6636+ current = events.get(eventId);
6637+
6638+ debug("Changed current event to: " + (current == null ? "null" : current.getString("eventName")));
6639+ }
6640+
6641+ protected void setStatus(State s)
6642+ {
6643+ status = s;
6644+ }
6645+
6646+ public void showFirstHtml(L2PcInstance player, int obj)
6647+ {
6648+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
6649+ TextBuilder sb = new TextBuilder();
6650+ int count = 0;
6651+
6652+ sb.append("<html><body><table width=270><tr><td width=130>Event Engine </td><td width=70>"+(getBoolean("eventBufferEnabled") ? "<a action=\"bypass -h eventbuffershow\">Buffer</a>" : "")+"</td><td width=70><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table><br>");
6653+
6654+ if (getStatus() == State.VOTING)
6655+ {
6656+
6657+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>Events</td><td width=130><center>Time left: " + cdtask.getTime() + "</td>"+/*<td width=70>Votes: " + votes.size() + "</td>*/"</tr></table><br>");
6658+
6659+ for (Map.Entry<Integer, Event> event : events.entrySet())
6660+ {
6661+ count++;
6662+ 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>*/);
6663+
6664+ /*if (!votes.containsKey(player))
6665+ sb.append("<a action=\"bypass -h npc_" + obj + "_" + event.getKey() + "\">Vote</a>");
6666+ else
6667+ sb.append("Vote");*/
6668+
6669+ sb.append(/*</td><td width=30><center>" + getVoteCount(event.getKey()) + "</td>*/"</tr></table>");
6670+ }
6671+ sb.append("</body></html>");
6672+ html.setHtml(sb.toString());
6673+ player.sendPacket(html);
6674+ }
6675+
6676+ if (getStatus() == State.REGISTERING)
6677+ {
6678+
6679+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>");
6680+ if (players.contains(player))
6681+ sb.append("<a action=\"bypass -h npc_" + obj + "_unreg\">Unregister</a>");
6682+ else
6683+ sb.append("<a action=\"bypass -h npc_" + obj + "_reg\">Register</a>");
6684+
6685+ 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>");
6686+
6687+ for (L2PcInstance p : EventManager.getInstance().players)
6688+ {
6689+ count++;
6690+ 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>");
6691+ }
6692+
6693+ sb.append("</body></html>");
6694+ html.setHtml(sb.toString());
6695+ player.sendPacket(html);
6696+ }
6697+ if (getStatus() == State.RUNNING)
6698+ getCurrentEvent().showHtml(player, obj);
6699+
6700+ }
6701+
6702+ private void teleBackEveryone()
6703+ {
6704+ for (L2PcInstance player : getCurrentEvent().getPlayerList())
6705+ {
6706+ if(player.getPoly().isMorphed())
6707+ {
6708+ player.getPoly().setPolyInfo(null, "1");
6709+ player.decayMe();
6710+ player.spawnMe(player.getX(),player.getY(),player.getZ());
6711+ }
6712+ player.teleToLocation(positions.get(player)[0], positions.get(player)[1], positions.get(player)[2]);
6713+ player.getAppearance().setNameColor(colors.get(player));
6714+ player.setTitle(titles.get(player));
6715+ if (player.getParty() != null)
6716+ {
6717+ L2Party party = player.getParty();
6718+ party.removePartyMember(player);
6719+ }
6720+
6721+ player.broadcastUserInfo();
6722+ if (player.isDead())
6723+ player.doRevive();
6724+ }
6725+
6726+ }
6727+
6728+ public boolean unregisterPlayer(L2PcInstance player)
6729+ {
6730+ if (!players.contains(player))
6731+ {
6732+ player.sendMessage("You're not registered to the event!");
6733+ return false;
6734+ }
6735+ if (getStatus() != State.REGISTERING)
6736+ {
6737+ player.sendMessage("You can't unregister now!");
6738+ return false;
6739+ }
6740+ else
6741+ {
6742+ player.sendMessage("You succesfully unregistered from the event!");
6743+ players.remove(player);
6744+ colors.remove(player);
6745+ positions.remove(player);
6746+ return true;
6747+ }
6748+ }
6749+
6750+ public boolean areTeammates(L2PcInstance player, L2PcInstance target)
6751+ {
6752+ if(getCurrentEvent() == null)
6753+ return false;
6754+
6755+ if(getCurrentEvent().numberOfTeams() == 1)
6756+ return false;
6757+
6758+ if(getCurrentEvent().numberOfTeams() > 1)
6759+ if(getCurrentEvent().getTeam(player) == getCurrentEvent().getTeam(target))
6760+ return true;
6761+ else
6762+ return false;
6763+
6764+ return false;
6765+ }
6766+}
6767\ No newline at end of file
6768Index: head-src/com/l2jfrozen/gameserver/event/EventStats.java
6769===================================================================
6770--- head-src/com/l2jfrozen/gameserver/event/EventStats.java (nonexistent)
6771+++ head-src/com/l2jfrozen/gameserver/event/EventStats.java (working copy)
6772@@ -0,0 +1,383 @@
6773+package com.l2jfrozen.gameserver.event;
6774+
6775+import java.sql.Connection;
6776+import java.sql.PreparedStatement;
6777+import java.sql.ResultSet;
6778+import java.util.Map;
6779+import java.util.Set;
6780+
6781+import javolution.text.TextBuilder;
6782+import javolution.util.FastMap;
6783+
6784+import com.l2jfrozen.util.database.L2DatabaseFactory;
6785+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
6786+import com.l2jfrozen.gameserver.network.serverpackets.ShowBoard;
6787+
6788+public class EventStats
6789+{
6790+
6791+ private static class SingletonHolder
6792+ {
6793+ protected static final EventStats _instance = new EventStats();
6794+ }
6795+
6796+ private class StatModell
6797+ {
6798+ protected int num;
6799+ protected int wins;
6800+ protected int losses;
6801+ protected int kills;
6802+ protected int deaths;
6803+ protected int scores;
6804+
6805+ private StatModell(int num, int wins, int losses, int kills, int deaths, int scores)
6806+ {
6807+ this.num = num;
6808+ this.wins = wins;
6809+ this.losses = losses;
6810+ this.kills = kills;
6811+ this.deaths = deaths;
6812+ this.scores = scores;
6813+ }
6814+
6815+ }
6816+
6817+ public static EventStats getInstance()
6818+ {
6819+ return SingletonHolder._instance;
6820+ }
6821+
6822+ private FastMap<Integer, FastMap<Integer, StatModell>> stats;
6823+
6824+ protected FastMap<Integer, int[]> tempTable;
6825+
6826+ private FastMap<Integer, ShowBoard> htmls;
6827+
6828+ private FastMap<Integer, int[]> statSums;
6829+
6830+ public EventStats()
6831+ {
6832+ stats = new FastMap<Integer, FastMap<Integer, StatModell>>();
6833+ tempTable = new FastMap<Integer, int[]>();
6834+ htmls = new FastMap<Integer, ShowBoard>();
6835+ statSums = new FastMap<Integer, int[]>();
6836+ loadSQL();
6837+ }
6838+
6839+ protected void applyChanges()
6840+ {
6841+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
6842+ return;
6843+
6844+ int eventId = EventManager.getInstance().getCurrentEvent().eventId;
6845+ for (L2PcInstance player : EventManager.getInstance().getCurrentEvent().getPlayerList())
6846+ {
6847+ int playerId = player.getObjectId();
6848+
6849+ if (!stats.containsKey(playerId))
6850+ stats.put(playerId, new FastMap<Integer, StatModell>());
6851+
6852+ if (!stats.get(playerId).containsKey(eventId))
6853+ stats.get(playerId).put(eventId, new StatModell(0, 0, 0, 0, 0, 0));
6854+
6855+ if (tempTable.get(playerId)[0] == 1)
6856+ stats.get(playerId).get(eventId).wins = stats.get(playerId).get(eventId).wins + 1;
6857+ else
6858+ stats.get(playerId).get(eventId).losses = stats.get(playerId).get(eventId).losses + 1;
6859+
6860+ stats.get(playerId).get(eventId).num = stats.get(playerId).get(eventId).num + 1;
6861+ stats.get(playerId).get(eventId).kills = stats.get(playerId).get(eventId).kills + tempTable.get(playerId)[1];
6862+ stats.get(playerId).get(eventId).deaths = stats.get(playerId).get(eventId).deaths + tempTable.get(playerId)[2];
6863+ stats.get(playerId).get(eventId).scores = stats.get(playerId).get(eventId).scores + tempTable.get(playerId)[3];
6864+ }
6865+ EventManager.getInstance().debug("applyChanges finished");
6866+ }
6867+
6868+ protected void createHtmls()
6869+ {
6870+ htmls.clear();
6871+ TextBuilder sb = new TextBuilder();
6872+ Connection con = null;
6873+ PreparedStatement statement = null;
6874+ try
6875+ {
6876+ con = L2DatabaseFactory.getInstance().getConnection();
6877+ 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");
6878+ ResultSet rset = statement.executeQuery();
6879+ rset.last();
6880+ rset.beforeFirst();
6881+ int count = 0;
6882+ while (rset.next())
6883+ {
6884+ count++;
6885+ if (count % 10 == 1)
6886+ 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>");
6887+
6888+ 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>");
6889+
6890+ if (count % 10 == 0)
6891+ {
6892+ sb.append("</table></body></html>");
6893+ htmls.put(count / 10, new ShowBoard(sb.toString(), "101"));
6894+ sb.clear();
6895+ }
6896+ }
6897+ if (count % 10 != 0 && !htmls.containsKey(count / 10 + 1))
6898+ {
6899+ sb.append("</table></body></html>");
6900+ htmls.put((count / 10 + 1), new ShowBoard(sb.toString(), "101"));
6901+ sb.clear();
6902+ }
6903+ rset.close();
6904+ statement.close();
6905+ }
6906+ catch (Exception e)
6907+ {
6908+ System.out.println("create SQL exception.");
6909+ }
6910+ finally
6911+ {
6912+ try { con.close(); } catch (Exception e) {}
6913+ }
6914+ EventManager.getInstance().debug("createHtmls finished");
6915+ }
6916+
6917+ private void loadSQL()
6918+ {
6919+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
6920+ return;
6921+
6922+ Connection con = null;
6923+ PreparedStatement statement = null;
6924+ try
6925+ {
6926+ con = L2DatabaseFactory.getInstance().getConnection();
6927+ statement = con.prepareStatement("SELECT * FROM event_stats");
6928+ ResultSet rset = statement.executeQuery();
6929+ int count = 0;
6930+ while (rset.next())
6931+ {
6932+ count++;
6933+ if (!stats.containsKey(rset.getInt("player")))
6934+ stats.put(rset.getInt("player"), new FastMap<Integer, StatModell>());
6935+
6936+ 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")));
6937+ }
6938+ rset.close();
6939+ statement.close();
6940+
6941+ EventManager.getInstance().debug("Stats loaded: " + count + " records.");
6942+ }
6943+ catch (Exception e)
6944+ {
6945+ System.out.println("EventStats SQL catch");
6946+ }
6947+ finally
6948+ {
6949+ try { con.close(); } catch (Exception e) {}
6950+ }
6951+ createHtmls();
6952+ }
6953+
6954+ public void showHtml(int id, L2PcInstance player)
6955+ {
6956+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
6957+ {
6958+ player.sendMessage("The stat tracking is disabled.");
6959+ return;
6960+ }
6961+ player.sendPacket(htmls.get(id));
6962+ player.sendPacket(new ShowBoard(null, "102"));
6963+ player.sendPacket(new ShowBoard(null, "103"));
6964+ }
6965+
6966+ public void showPlayerStats(int playerId, L2PcInstance player)
6967+ {
6968+ TextBuilder sb = new TextBuilder();
6969+ 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>");
6970+
6971+ if (stats.containsKey(playerId))
6972+ for (Map.Entry<Integer, StatModell> event : stats.get(playerId).entrySet())
6973+ {
6974+ StatModell stats = event.getValue();
6975+
6976+ if(EventManager.getInstance().events.containsKey(event.getKey()))
6977+ 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>");
6978+ }
6979+
6980+ sb.append("</table></body></html>");
6981+ player.sendPacket(new ShowBoard(sb.toString(), "101"));
6982+ player.sendPacket(new ShowBoard(null, "102"));
6983+ player.sendPacket(new ShowBoard(null, "103"));
6984+ }
6985+
6986+ public int getEventKills(int playerId)
6987+ {
6988+ int kills = 0;
6989+
6990+ if(!stats.containsKey(playerId))
6991+ return 0;
6992+ else
6993+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
6994+ kills += statmodell.getValue().kills;
6995+
6996+ return kills;
6997+ }
6998+
6999+ public int getEvents(int playerId)
7000+ {
7001+ int num = 0;
7002+
7003+ if(!stats.containsKey(playerId))
7004+ return 0;
7005+ else
7006+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
7007+ num += statmodell.getValue().num;
7008+
7009+ return num;
7010+ }
7011+
7012+ public int getEventWins(int playerId)
7013+ {
7014+ int wins = 0;
7015+
7016+ if(!stats.containsKey(playerId))
7017+ return 0;
7018+ else
7019+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
7020+ wins += statmodell.getValue().wins;
7021+
7022+ return wins;
7023+ }
7024+
7025+ // num | wins | losses | kills | deaths | fav_event_id
7026+ protected void sumPlayerStats()
7027+ {
7028+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
7029+ return;
7030+
7031+ statSums.clear();
7032+
7033+ for (int playerId : stats.keySet())
7034+ {
7035+
7036+ int num = 0;
7037+ int wins = 0;
7038+ int losses = 0;
7039+ int kills = 0;
7040+ int deaths = 0;
7041+ int faveventid = 0;
7042+ int faveventamm = 0;
7043+
7044+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
7045+ {
7046+ num += statmodell.getValue().num;
7047+ wins += statmodell.getValue().wins;
7048+ losses += statmodell.getValue().losses;
7049+ kills += statmodell.getValue().kills;
7050+ deaths += statmodell.getValue().deaths;
7051+
7052+ if (statmodell.getValue().num > faveventamm)
7053+ {
7054+ faveventamm = statmodell.getValue().num;
7055+ faveventid = statmodell.getKey();
7056+ }
7057+ }
7058+
7059+ statSums.put(playerId, new int[] { num, wins, losses, kills, deaths, faveventid });
7060+
7061+ }
7062+ EventManager.getInstance().debug("sumPlayerStats finished");
7063+ }
7064+
7065+ protected void updateSQL(Set<L2PcInstance> players, int eventId)
7066+ {
7067+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
7068+ return;
7069+
7070+ sumPlayerStats();
7071+ Connection con = null;
7072+ PreparedStatement statement = null;
7073+ try
7074+ {
7075+ con = L2DatabaseFactory.getInstance().getConnection();
7076+
7077+ for (L2PcInstance player : players)
7078+ {
7079+ int id = player.getObjectId();
7080+
7081+ if (statSums.get(id)[0] != 1)
7082+ {
7083+ statement = con.prepareStatement("UPDATE event_stats_full SET num=?, winpercent=?, kdratio=?, wins=?, losses=?, kills=?, deaths=?, favevent=? WHERE player=?");
7084+ statement.setInt(1, statSums.get(id)[0]);
7085+ statement.setInt(2, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
7086+ statement.setDouble(3, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
7087+ statement.setInt(4, statSums.get(id)[1]);
7088+ statement.setInt(5, statSums.get(id)[2]);
7089+ statement.setInt(6, statSums.get(id)[3]);
7090+ statement.setInt(7, statSums.get(id)[4]);
7091+ statement.setInt(8, statSums.get(id)[5]);
7092+ statement.setInt(9, id);
7093+
7094+ statement.executeUpdate();
7095+ statement.close();
7096+ }
7097+ else
7098+ {
7099+ statement = con.prepareStatement("INSERT INTO event_stats_full(player,num,winpercent,kdratio,wins,losses,kills,deaths,favevent) VALUES (?,?,?,?,?,?,?,?,?)");
7100+ statement.setInt(1, id);
7101+ statement.setInt(2, statSums.get(id)[0]);
7102+ statement.setInt(3, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
7103+ statement.setDouble(4, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
7104+ statement.setInt(5, statSums.get(id)[1]);
7105+ statement.setInt(6, statSums.get(id)[2]);
7106+ statement.setInt(7, statSums.get(id)[3]);
7107+ statement.setInt(8, statSums.get(id)[4]);
7108+ statement.setInt(9, statSums.get(id)[5]);
7109+ statement.executeUpdate();
7110+ statement.close();
7111+ }
7112+
7113+ if (stats.get(id).get(eventId).num != 1)
7114+ {
7115+ statement = con.prepareStatement("UPDATE event_stats SET num=?, wins=?, losses=?, kills=?, deaths=?, scores=? WHERE player=? AND event=?");
7116+ statement.setInt(1, stats.get(id).get(eventId).num);
7117+ statement.setInt(2, stats.get(id).get(eventId).wins);
7118+ statement.setInt(3, stats.get(id).get(eventId).losses);
7119+ statement.setInt(4, stats.get(id).get(eventId).kills);
7120+ statement.setInt(5, stats.get(id).get(eventId).deaths);
7121+ statement.setInt(6, stats.get(id).get(eventId).scores);
7122+ statement.setInt(7, id);
7123+ statement.setInt(8, eventId);
7124+ statement.executeUpdate();
7125+ statement.close();
7126+ }
7127+ else
7128+ {
7129+ statement = con.prepareStatement("INSERT INTO event_stats(player,event,num,wins,losses,kills,deaths,scores) VALUES (?,?,?,?,?,?,?,?)");
7130+ statement.setInt(1, id);
7131+ statement.setInt(2, eventId);
7132+ statement.setInt(3, stats.get(id).get(eventId).num);
7133+ statement.setInt(4, stats.get(id).get(eventId).wins);
7134+ statement.setInt(5, stats.get(id).get(eventId).losses);
7135+ statement.setInt(6, stats.get(id).get(eventId).kills);
7136+ statement.setInt(7, stats.get(id).get(eventId).deaths);
7137+ statement.setInt(8, stats.get(id).get(eventId).scores);
7138+ statement.executeUpdate();
7139+ statement.close();
7140+ }
7141+
7142+ }
7143+ }
7144+ catch (Exception e)
7145+ {
7146+ System.out.println("EventStats SQL catch");
7147+ }
7148+ finally
7149+ {
7150+ try { con.close(); } catch (Exception e) {}
7151+ }
7152+ EventManager.getInstance().debug("updateSQL finished");
7153+ createHtmls();
7154+ }
7155+}
7156\ No newline at end of file
7157Index: head-src/com/l2jfrozen/gameserver/event/EventTeam.java
7158===================================================================
7159--- head-src/com/l2jfrozen/gameserver/event/EventTeam.java (nonexistent)
7160+++ head-src/com/l2jfrozen/gameserver/event/EventTeam.java (working copy)
7161@@ -0,0 +1,109 @@
7162+/*
7163+ * This program is free software: you can redistribute it and/or modify it under
7164+ * the terms of the GNU General Public License as published by the Free Software
7165+ * Foundation, either version 3 of the License, or (at your option) any later
7166+ * version.
7167+ *
7168+ * This program is distributed in the hope that it will be useful, but WITHOUT
7169+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
7170+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
7171+ * details.
7172+ *
7173+ * You should have received a copy of the GNU General Public License along with
7174+ * this program. If not, see <http://www.gnu.org/licenses/>.
7175+ */
7176+package com.l2jfrozen.gameserver.event;
7177+
7178+/**
7179+ * @author Rizel
7180+ *
7181+ */
7182+public class EventTeam implements Comparable<EventTeam>
7183+{
7184+ private int score;
7185+
7186+ private String name;
7187+
7188+ private int[] nameColor;
7189+
7190+ private int[] startPos;
7191+
7192+ private int id;
7193+
7194+ public EventTeam(int id, String name, int[] color, int[] startPos)
7195+ {
7196+ this.id = id;
7197+ score = 0;
7198+ this.name = name;
7199+ nameColor = color;
7200+ this.startPos = startPos;
7201+ }
7202+
7203+ public int compareTo(EventTeam second)
7204+ {
7205+
7206+ if (getScore() > second.getScore())
7207+ return 1;
7208+ if (getScore() < second.getScore())
7209+ return -1;
7210+ if (getScore() == second.getScore())
7211+ return 0;
7212+
7213+ return 0;
7214+
7215+ }
7216+
7217+ protected String getHexaColor()
7218+ {
7219+ String hexa;
7220+ Integer i1 = nameColor[0];
7221+ Integer i2 = nameColor[1];
7222+ Integer i3 = nameColor[2];
7223+ hexa = "" + (i1 > 15 ? Integer.toHexString(i1) : "0" + Integer.toHexString(i1)) + (i2 > 15 ? Integer.toHexString(i2) : "0" + Integer.toHexString(i2)) + (i3 > 15 ? Integer.toHexString(i3) : "0" + Integer.toHexString(i3));
7224+ return hexa;
7225+ }
7226+
7227+ protected int getId()
7228+ {
7229+ return id;
7230+ }
7231+
7232+ protected String getName()
7233+ {
7234+ return name;
7235+ }
7236+
7237+ protected int getScore()
7238+ {
7239+ return score;
7240+ }
7241+
7242+ protected int[] getTeamColor()
7243+ {
7244+ return nameColor;
7245+ }
7246+
7247+ protected int[] getTeamPos()
7248+ {
7249+ return startPos;
7250+ }
7251+
7252+ protected void increaseScore()
7253+ {
7254+ score++;
7255+ }
7256+
7257+ /* (non-Javadoc)
7258+ * @see java.lang.Comparable#compareTo(java.lang.Object)
7259+ */
7260+
7261+ protected void increaseScore(int ammount)
7262+ {
7263+ score += ammount;
7264+ }
7265+
7266+ protected void setScore(int ammount)
7267+ {
7268+ score = ammount;
7269+ }
7270+}
7271\ No newline at end of file
7272Index: head-src/com/l2jfrozen/gameserver/event/FormalLMS.java
7273===================================================================
7274--- head-src/com/l2jfrozen/gameserver/event/FormalLMS.java (nonexistent)
7275+++ head-src/com/l2jfrozen/gameserver/event/FormalLMS.java (working copy)
7276@@ -0,0 +1,54 @@
7277+/*
7278+ * This program is free software; you can redistribute it and/or modify
7279+ * it under the terms of the GNU General Public License as published by
7280+ * the Free Software Foundation; either version 2, or (at your option)
7281+ * any later version.
7282+ *
7283+ * This program is distributed in the hope that it will be useful,
7284+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
7285+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7286+ * GNU General Public License for more details.
7287+ *
7288+ * You should have received a copy of the GNU General Public License
7289+ * along with this program; if not, write to the Free Software
7290+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
7291+ * 02111-1307, USA.
7292+ *
7293+ * http://www.gnu.org/copyleft/gpl.html
7294+ */
7295+package com.l2jfrozen.gameserver.event;
7296+
7297+
7298+import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
7299+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
7300+
7301+/**
7302+ *
7303+ *
7304+ * @author Rizel
7305+ */
7306+public class FormalLMS
7307+{
7308+ private L2ItemInstance formalWear;
7309+
7310+ @SuppressWarnings("synthetic-access")
7311+ private static class SingletonHolder
7312+ {
7313+ protected static final FormalLMS _instance = new FormalLMS();
7314+ }
7315+
7316+ public static FormalLMS getInstance()
7317+ {
7318+ return SingletonHolder._instance;
7319+ }
7320+
7321+ public FormalLMS()
7322+ {
7323+ formalWear = ItemTable.getInstance().createItem("", 6408, 1, null, null);
7324+ }
7325+
7326+ public int getOID()
7327+ {
7328+ return formalWear.getObjectId();
7329+ }
7330+}
7331Index: head-src/com/l2jfrozen/gameserver/event/LMS.java
7332===================================================================
7333--- head-src/com/l2jfrozen/gameserver/event/LMS.java (nonexistent)
7334+++ head-src/com/l2jfrozen/gameserver/event/LMS.java (working copy)
7335@@ -0,0 +1,141 @@
7336+package com.l2jfrozen.gameserver.event;
7337+
7338+import javolution.text.TextBuilder;
7339+
7340+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
7341+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
7342+import com.l2jfrozen.util.random.Rnd;
7343+
7344+/**
7345+ * @author Rizel
7346+ *
7347+ */
7348+public class LMS extends Event
7349+{
7350+ private class Core implements Runnable
7351+ {
7352+ public void run()
7353+ {
7354+ try
7355+ {
7356+ switch (eventState)
7357+ {
7358+ case START:
7359+ divideIntoTeams(1);
7360+ preparePlayers();
7361+ teleportToTeamPos();
7362+ forceSitAll();
7363+ setStatus(EventState.FIGHT);
7364+ debug("The event started with " + players.size() + " players.");
7365+ schedule(20000);
7366+ break;
7367+
7368+ case FIGHT:
7369+ forceStandAll();
7370+ setStatus(EventState.END);
7371+ debug("The event started.");
7372+ clock.startClock(getInt("matchTime"));
7373+ break;
7374+
7375+ case END:
7376+ clock.setTime(0);
7377+ debug("The event ended.");
7378+ L2PcInstance winner = getPlayersWithStatus(0).get(Rnd.get(getPlayersWithStatus(0).size()));
7379+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
7380+ setStatus(EventState.INACTIVE);
7381+ EventManager.getInstance().end(winner.getName() + " is the Last Man Standing!");
7382+ break;
7383+ }
7384+ }
7385+ catch (Throwable e)
7386+ {
7387+ e.printStackTrace();
7388+ EventManager.getInstance().end("Error! Event ended.");
7389+ }
7390+ }
7391+ }
7392+
7393+ private enum EventState
7394+ {
7395+ START, FIGHT, END, INACTIVE
7396+ }
7397+
7398+ private EventState eventState;
7399+
7400+ private Core task;
7401+
7402+ public LMS()
7403+ {
7404+ super();
7405+ eventId = 4;
7406+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
7407+ task = new Core();
7408+ }
7409+
7410+ @Override
7411+ protected void endEvent()
7412+ {
7413+ setStatus(EventState.END);
7414+ clock.setTime(0);
7415+ }
7416+
7417+ @Override
7418+ protected String getScorebar()
7419+ {
7420+ return "Players: " + getPlayersWithStatus(0).size() + " Time: " + clock.getTime();
7421+ }
7422+
7423+ @Override
7424+ public void onKill(L2PcInstance victim, L2PcInstance killer)
7425+ {
7426+ super.onKill(victim, killer);
7427+ increasePlayersScore(killer);
7428+ setStatus(victim, 1);
7429+ if (getPlayersWithStatus(0).size() == 1)
7430+ {
7431+ setStatus(EventState.END);
7432+ clock.setTime(0);
7433+ }
7434+ }
7435+
7436+ @Override
7437+ protected void schedule(int time)
7438+ {
7439+ tpm.scheduleGeneral(task, time);
7440+ }
7441+
7442+ private void setStatus(EventState s)
7443+ {
7444+ eventState = s;
7445+ }
7446+
7447+ /* (non-Javadoc)
7448+ * @see net.sf.l2j.gameserver.event.Event#showHtml(net.sf.l2j.gameserver.model.actor.instance.L2PcInstance, int)
7449+ */
7450+ @Override
7451+ protected void showHtml(L2PcInstance player, int obj)
7452+ {
7453+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
7454+ TextBuilder sb = new TextBuilder();
7455+
7456+ 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>");
7457+ sb.append("<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>");
7458+ sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
7459+ sb.append("<br><table width=270>");
7460+
7461+ for (L2PcInstance p : getPlayersOfTeam(1))
7462+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + (getStatus(p) == 1 ? "Dead" : "Alive") + "</td></tr>");
7463+
7464+ sb.append("</table></body></html>");
7465+ html.setHtml(sb.toString());
7466+ player.sendPacket(html);
7467+
7468+ }
7469+
7470+ @Override
7471+ protected void start()
7472+ {
7473+ setStatus(EventState.START);
7474+ schedule(1);
7475+ }
7476+}
7477\ No newline at end of file
7478Index: head-src/com/l2jfrozen/gameserver/event/Lucky.java
7479===================================================================
7480--- head-src/com/l2jfrozen/gameserver/event/Lucky.java (nonexistent)
7481+++ head-src/com/l2jfrozen/gameserver/event/Lucky.java (working copy)
7482@@ -0,0 +1,215 @@
7483+/*
7484+ * This program is free software: you can redistribute it and/or modify it under
7485+ * the terms of the GNU General Public License as published by the Free Software
7486+ * Foundation, either version 3 of the License, or (at your option) any later
7487+ * version.
7488+ *
7489+ * This program is distributed in the hope that it will be useful, but WITHOUT
7490+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
7491+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
7492+ * details.
7493+ *
7494+ * You should have received a copy of the GNU General Public License along with
7495+ * this program. If not, see <http://www.gnu.org/licenses/>.
7496+ */
7497+package com.l2jfrozen.gameserver.event;
7498+
7499+import javolution.text.TextBuilder;
7500+import javolution.util.FastList;
7501+
7502+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
7503+import com.l2jfrozen.gameserver.model.L2Skill;
7504+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
7505+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
7506+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
7507+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
7508+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
7509+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
7510+import com.l2jfrozen.util.random.Rnd;
7511+
7512+/**
7513+ * @author Rizel
7514+ *
7515+ */
7516+public class Lucky extends Event
7517+{
7518+ private class Core implements Runnable
7519+ {
7520+ public void run()
7521+ {
7522+ try
7523+ {
7524+ switch (eventState)
7525+ {
7526+ case START:
7527+ divideIntoTeams(1);
7528+ preparePlayers();
7529+ teleportToTeamPos();
7530+ forceSitAll();
7531+ unequip();
7532+ setStatus(EventState.FIGHT);
7533+ schedule(30000);
7534+ break;
7535+
7536+ case FIGHT:
7537+ forceStandAll();
7538+ int[] coor = getPosition("Chests", 1);
7539+ for (int i = 0; i < getInt("numberOfChests"); i++)
7540+ chests.add(spawnNPC(coor[0] + (Rnd.get(coor[3] * 2) - coor[3]), coor[1] + (Rnd.get(coor[3] * 2) - coor[3]), coor[2], getInt("chestNpcId")));
7541+ setStatus(EventState.END);
7542+ clock.startClock(getInt("matchTime"));
7543+ break;
7544+
7545+ case END:
7546+ clock.setTime(0);
7547+ unSpawnChests();
7548+ L2PcInstance winner = getPlayerWithMaxScore();
7549+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
7550+ setStatus(EventState.INACTIVE);
7551+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " opened chests!");
7552+ break;
7553+ }
7554+ }
7555+ catch (Throwable e)
7556+ {
7557+ e.printStackTrace();
7558+ EventManager.getInstance().end("Error! Event ended.");
7559+ }
7560+ }
7561+ }
7562+
7563+ private enum EventState
7564+ {
7565+ START, FIGHT, END, INACTIVE
7566+ }
7567+
7568+ private EventState eventState;
7569+
7570+ private Core task;
7571+
7572+ private FastList<L2Spawn> chests;
7573+
7574+ public Lucky()
7575+ {
7576+ super();
7577+ eventId = 5;
7578+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
7579+ task = new Core();
7580+ chests = new FastList<L2Spawn>();
7581+ }
7582+
7583+ /**
7584+ * @see net.sf.l2j.gameserver.event.Event#endEvent()
7585+ */
7586+ @Override
7587+ protected void endEvent()
7588+ {
7589+
7590+ setStatus(EventState.END);
7591+ clock.setTime(0);
7592+
7593+ }
7594+
7595+ @Override
7596+ protected String getScorebar()
7597+ {
7598+ return "Max: " + getScore(getPlayerWithMaxScore()) + " Time: " + clock.getTime() + "";
7599+ }
7600+
7601+ @Override
7602+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
7603+ {
7604+ if (npc.getNpcId() != getInt("chestNpcId"))
7605+ return false;
7606+
7607+ if (Rnd.get(3) == 0)
7608+ {
7609+ player.sendPacket(new CreatureSay(npc.getObjectId(), 0, "Chest", "BoOoOoMm!"));
7610+ player.stopAllEffects();
7611+ player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, player);
7612+ EventStats.getInstance().tempTable.get(player.getObjectId())[2] = EventStats.getInstance().tempTable.get(player.getObjectId())[2] + 1;
7613+ addToResurrector(player);
7614+ }
7615+ else
7616+ {
7617+ npc.doDie(npc);
7618+ player.addItem("Event", 6392, 1, player, true);
7619+ increasePlayersScore(player);
7620+ }
7621+
7622+ npc.deleteMe();
7623+ npc.getSpawn().stopRespawn();
7624+ SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), true);
7625+ chests.remove(npc.getSpawn());
7626+
7627+ if (chests.size() == 0)
7628+ clock.setTime(0);
7629+
7630+ return true;
7631+ }
7632+
7633+ @Override
7634+ protected void schedule(int time)
7635+ {
7636+ tpm.scheduleGeneral(task, time);
7637+ }
7638+
7639+ private void setStatus(EventState s)
7640+ {
7641+ eventState = s;
7642+ }
7643+ public boolean onUseMagic(L2Skill skill)
7644+ {
7645+ return false;
7646+ }
7647+
7648+ @Override
7649+ protected void showHtml(L2PcInstance player, int obj)
7650+ {
7651+ if (players.size() > 0)
7652+ {
7653+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
7654+ TextBuilder sb = new TextBuilder();
7655+
7656+ 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>");
7657+ sb.append("<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>");
7658+ sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
7659+ sb.append("<br><table width=270>");
7660+
7661+ for (L2PcInstance p : getPlayersOfTeam(1))
7662+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
7663+
7664+ sb.append("</table></body></html>");
7665+ html.setHtml(sb.toString());
7666+ player.sendPacket(html);
7667+
7668+ }
7669+
7670+ }
7671+
7672+ /* (non-Javadoc)
7673+ * @see net.sf.l2j.gameserver.event.Event#start()
7674+ */
7675+ @Override
7676+ protected void start()
7677+ {
7678+ setStatus(EventState.START);
7679+ schedule(1);
7680+ }
7681+
7682+ private void unSpawnChests()
7683+ {
7684+ for (L2Spawn s : chests)
7685+ {
7686+ s.getLastSpawn().deleteMe();
7687+ s.stopRespawn();
7688+ SpawnTable.getInstance().deleteSpawn(s, true);
7689+ chests.remove(s);
7690+ }
7691+ }
7692+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
7693+ {
7694+ return false;
7695+ }
7696+
7697+}
7698\ No newline at end of file
7699Index: head-src/com/l2jfrozen/gameserver/event/Mutant.java
7700===================================================================
7701--- head-src/com/l2jfrozen/gameserver/event/Mutant.java (nonexistent)
7702+++ head-src/com/l2jfrozen/gameserver/event/Mutant.java (working copy)
7703@@ -0,0 +1,212 @@
7704+/*
7705+ * This program is free software: you can redistribute it and/or modify it under
7706+ * the terms of the GNU General Public License as published by the Free Software
7707+ * Foundation, either version 3 of the License, or (at your option) any later
7708+ * version.
7709+ *
7710+ * This program is distributed in the hope that it will be useful, but WITHOUT
7711+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
7712+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
7713+ * details.
7714+ *
7715+ * You should have received a copy of the GNU General Public License along with
7716+ * this program. If not, see <http://www.gnu.org/licenses/>.
7717+ */
7718+package com.l2jfrozen.gameserver.event;
7719+
7720+import javolution.text.TextBuilder;
7721+
7722+import com.l2jfrozen.gameserver.datatables.SkillTable;
7723+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
7724+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
7725+import com.l2jfrozen.gameserver.model.L2Object;
7726+
7727+/**
7728+ * @author Rizel
7729+ *
7730+ */
7731+public class Mutant extends Event
7732+{
7733+
7734+ private class Core implements Runnable
7735+ {
7736+ public void run()
7737+ {
7738+ try
7739+ {
7740+ switch (eventState)
7741+ {
7742+ case START:
7743+ divideIntoTeams(1);
7744+ preparePlayers();
7745+ teleportToTeamPos();
7746+ forceSitAll();
7747+ setStatus(EventState.FIGHT);
7748+ schedule(20000);
7749+ break;
7750+
7751+ case FIGHT:
7752+ forceStandAll();
7753+ transformMutant(getRandomPlayer());
7754+ setStatus(EventState.END);
7755+ clock.startClock(getInt("matchTime"));
7756+ break;
7757+
7758+ case END:
7759+ clock.setTime(0);
7760+ untransformMutant();
7761+ L2PcInstance winner = getPlayerWithMaxScore();
7762+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
7763+ setStatus(EventState.INACTIVE);
7764+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " kills!");
7765+ break;
7766+ }
7767+ }
7768+ catch (Throwable e)
7769+ {
7770+ e.printStackTrace();
7771+ EventManager.getInstance().end("Error! Event ended.");
7772+ }
7773+ }
7774+ }
7775+
7776+ private enum EventState
7777+ {
7778+ START, FIGHT, END, INACTIVE
7779+ }
7780+
7781+ private EventState eventState;
7782+
7783+ private Core task;
7784+
7785+ private L2PcInstance mutant;
7786+
7787+ public Mutant()
7788+ {
7789+ super();
7790+ eventId = 13;
7791+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
7792+ task = new Core();
7793+ }
7794+
7795+ /**
7796+ * @see net.sf.l2j.gameserver.event.Event#endEvent()
7797+ */
7798+ @Override
7799+ protected void endEvent()
7800+ {
7801+ setStatus(EventState.END);
7802+ clock.setTime(0);
7803+ }
7804+
7805+ @Override
7806+ protected String getScorebar()
7807+ {
7808+ return "Max: " + getScore(getPlayerWithMaxScore()) + " Time: " + clock.getTime() + "";
7809+ }
7810+
7811+ @Override
7812+ public void onDie(L2PcInstance victim, L2PcInstance killer)
7813+ {
7814+ super.onDie(victim, killer);
7815+ addToResurrector(victim);
7816+ }
7817+
7818+ @Override
7819+ public void onKill(L2PcInstance victim, L2PcInstance killer)
7820+ {
7821+ super.onKill(victim, killer);
7822+ if (getStatus(killer) == 1)
7823+ increasePlayersScore(killer);
7824+ if (getStatus(killer) == 0 && getStatus(victim) == 1)
7825+ transformMutant(killer);
7826+ killer.addItem("Event", 6392, 1, killer, true);
7827+ }
7828+
7829+ @Override
7830+ public void onLogout(L2PcInstance player)
7831+ {
7832+ super.onLogout(player);
7833+
7834+ if (mutant == player)
7835+ transformMutant(getRandomPlayer());
7836+ }
7837+
7838+ @Override
7839+ protected void schedule(int time)
7840+ {
7841+ tpm.scheduleGeneral(task, time);
7842+ }
7843+
7844+ private void setStatus(EventState s)
7845+ {
7846+ eventState = s;
7847+ }
7848+
7849+ @Override
7850+ protected void showHtml(L2PcInstance player, int obj)
7851+ {
7852+ if (players.size() > 0)
7853+ {
7854+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
7855+ TextBuilder sb = new TextBuilder();
7856+
7857+ 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>");
7858+ sb.append("<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>");
7859+ sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
7860+ sb.append("<br><table width=270>");
7861+
7862+ for (L2PcInstance p : getPlayersOfTeam(1))
7863+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
7864+
7865+ sb.append("</table></body></html>");
7866+ html.setHtml(sb.toString());
7867+ player.sendPacket(html);
7868+ }
7869+
7870+ }
7871+
7872+ @Override
7873+ protected void start()
7874+ {
7875+ setStatus(EventState.START);
7876+ schedule(1);
7877+ }
7878+
7879+ private void transformMutant(L2PcInstance player)
7880+ {
7881+ player.addSkill(SkillTable.getInstance().getInfo(getInt("mutantBuffId"), 1), false);
7882+ setStatus(player, 1);
7883+ untransformMutant();
7884+ polymorph(player,25286);
7885+ player.getAppearance().setNameColor(255, 0, 0);
7886+ player.broadcastUserInfo();
7887+ mutant = player;
7888+
7889+ }
7890+
7891+ private void untransformMutant()
7892+ {
7893+ if (mutant != null)
7894+ {
7895+ mutant.getAppearance().setNameColor(getColor("All")[0], getColor("All")[1], getColor("All")[2]);
7896+ mutant.removeSkill(SkillTable.getInstance().getInfo(getInt("mutantBuffId"), 1), false);
7897+ setStatus(mutant, 0);
7898+ unpolymorph(mutant);
7899+ mutant.broadcastUserInfo();
7900+ mutant = null;
7901+ }
7902+ }
7903+ @Override
7904+ public boolean canAttack(L2PcInstance player, L2Object target)
7905+ {
7906+ if (target instanceof L2PcInstance)
7907+ if (getStatus(player) == 0 && getStatus((L2PcInstance) target) == 0)
7908+ return false;
7909+ else
7910+ return true;
7911+
7912+ return false;
7913+ }
7914+
7915+}
7916\ No newline at end of file
7917Index: head-src/com/l2jfrozen/gameserver/event/Russian.java
7918===================================================================
7919--- head-src/com/l2jfrozen/gameserver/event/Russian.java (nonexistent)
7920+++ head-src/com/l2jfrozen/gameserver/event/Russian.java (working copy)
7921@@ -0,0 +1,289 @@
7922+package com.l2jfrozen.gameserver.event;
7923+
7924+import java.util.Map;
7925+
7926+import javolution.text.TextBuilder;
7927+import javolution.util.FastList;
7928+import javolution.util.FastMap;
7929+
7930+import com.l2jfrozen.gameserver.model.L2Object;
7931+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
7932+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
7933+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
7934+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
7935+import com.l2jfrozen.util.random.Rnd;
7936+
7937+/**
7938+ * @author Rizel
7939+ *
7940+ */
7941+public class Russian extends Event
7942+{
7943+
7944+ private class Core implements Runnable
7945+ {
7946+ public void run()
7947+ {
7948+ try
7949+ {
7950+ switch (eventState)
7951+ {
7952+ case START:
7953+ divideIntoTeams(1);
7954+ preparePlayers();
7955+ teleportToTeamPos();
7956+ forceSitAll();
7957+ spawnRussians();
7958+ setStatus(EventState.CHOOSE);
7959+ debug("The event started with " + players.size() + " players");
7960+ schedule(30000);
7961+ break;
7962+
7963+ case CHOOSE:
7964+ if (round == 0)
7965+ forceStandAll();
7966+
7967+ round++;
7968+ setStatus(EventState.CHECK);
7969+ debug("Choose phase.");
7970+ schedule(getInt("roundTime") * 1000);
7971+ break;
7972+
7973+ case CHECK:
7974+ debug("Check phase");
7975+ removeAfkers();
7976+ killRandomRussian();
7977+
7978+ if (countOfPositiveStatus() != 0)
7979+ {
7980+ if (russians.size() != 1)
7981+ {
7982+ for (L2PcInstance player : getPlayersWithStatus(1))
7983+ {
7984+ setStatus(player, 0);
7985+ increasePlayersScore(player);
7986+ player.getAppearance().setNameColor(255, 255, 255);
7987+ player.broadcastUserInfo();
7988+ }
7989+
7990+ for (FastList<L2PcInstance> chose : choses.values())
7991+ chose.reset();
7992+
7993+ setStatus(EventState.CHOOSE);
7994+ schedule(getInt("roundTime") * 1000);
7995+ }
7996+ else
7997+ {
7998+ for (L2PcInstance player : getPlayersWithStatus(1))
7999+ giveReward(player, getInt("rewardId"), getInt("rewardAmmount"));
8000+
8001+ unspawnRussians();
8002+ debug("Event ended. " + countOfPositiveStatus() + " players survived");
8003+ EventManager.getInstance().end("Congratulation! " + countOfPositiveStatus() + " players survived the event!");
8004+ }
8005+
8006+ }
8007+ else
8008+ {
8009+ unspawnRussians();
8010+ debug("Event ended. Noone survived");
8011+ EventManager.getInstance().end("Unfortunatly no-one survived the event!");
8012+ }
8013+ break;
8014+ }
8015+ }
8016+ catch (Throwable e)
8017+ {
8018+ e.printStackTrace();
8019+ EventManager.getInstance().end("Error! Event ended.");
8020+ }
8021+
8022+ }
8023+ }
8024+
8025+ private enum EventState
8026+ {
8027+ START, CHOOSE, CHECK, INACTIVE
8028+ }
8029+
8030+ private EventState eventState;
8031+
8032+ private Core task;
8033+
8034+ private int round;
8035+
8036+ private FastMap<Integer, L2Spawn> russians;
8037+
8038+ private FastMap<Integer, FastList<L2PcInstance>> choses;
8039+
8040+ public Russian()
8041+ {
8042+ super();
8043+ eventId = 11;
8044+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
8045+ task = new Core();
8046+ round = 0;
8047+ russians = new FastMap<Integer, L2Spawn>();
8048+ choses = new FastMap<Integer, FastList<L2PcInstance>>();
8049+ }
8050+
8051+ @Override
8052+ public boolean canAttack(L2PcInstance player, L2Object target)
8053+ {
8054+ return false;
8055+ }
8056+
8057+ @Override
8058+ protected void endEvent()
8059+ {
8060+ L2PcInstance winner = players.head().getNext().getKey();
8061+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
8062+
8063+ unspawnRussians();
8064+ debug("Event ended. 1 player survived");
8065+ EventManager.getInstance().end("Congratulation! 1 player survived the event!");
8066+
8067+ }
8068+
8069+ @Override
8070+ protected String getScorebar()
8071+ {
8072+ return "";
8073+ }
8074+
8075+ private void killRandomRussian()
8076+ {
8077+ FastList<Integer> ids = new FastList<Integer>();
8078+ for (int id : russians.keySet())
8079+ ids.add(id);
8080+ int russnum = ids.get(Rnd.get(ids.size()));
8081+ L2Spawn russian = russians.get(russnum);
8082+ unspawnNPC(russian);
8083+ announce(getPlayerList(), "The #" + russnum + " russian died.");
8084+
8085+ for (L2PcInstance victim : choses.get(russnum))
8086+ {
8087+ setStatus(victim, -1);
8088+ victim.stopAllEffects();
8089+ victim.reduceCurrentHp(victim.getMaxHp() + victim.getMaxCp() + 1, victim);
8090+ victim.sendMessage("Your russian died!");
8091+ victim.getAppearance().setNameColor(255, 255, 255);
8092+ }
8093+ debug("Russian #" + russnum + " died");
8094+ russians.remove(russnum);
8095+ }
8096+
8097+ @Override
8098+ public void onLogout(L2PcInstance player)
8099+ {
8100+ super.onLogout(player);
8101+
8102+ for (FastList<L2PcInstance> list : choses.values())
8103+ if (list.contains(player))
8104+ list.remove(player);
8105+ }
8106+
8107+ @Override
8108+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
8109+ {
8110+ if (npc.getNpcId() != getInt("russianNpcId"))
8111+ return false;
8112+
8113+ if (getStatus(player) != 0)
8114+ return true;
8115+
8116+ for (Map.Entry<Integer, L2Spawn> russian : russians.entrySet())
8117+ if (russian.getValue().getLastSpawn().getObjectId() == npc.getObjectId())
8118+ {
8119+ choses.get(russian.getKey()).add(player);
8120+ player.getAppearance().setNameColor(0, 255, 0);
8121+ player.broadcastUserInfo();
8122+ setStatus(player, 1);
8123+ }
8124+
8125+ return true;
8126+ }
8127+
8128+ private void removeAfkers()
8129+ {
8130+ int c = 0;
8131+ for (L2PcInstance player : getPlayerList())
8132+ if (getStatus(player) == 0)
8133+ {
8134+
8135+ player.sendMessage("Timeout!");
8136+ player.stopAllEffects();
8137+ player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, player);
8138+ setStatus(player, -1);
8139+ c++;
8140+ }
8141+ debug(c + " afkers removed");
8142+ }
8143+
8144+ @Override
8145+ public void reset()
8146+ {
8147+ super.reset();
8148+ round = 0;
8149+ russians.clear();
8150+ choses.clear();
8151+ }
8152+
8153+ @Override
8154+ protected void schedule(int time)
8155+ {
8156+ tpm.scheduleGeneral(task, time);
8157+ }
8158+
8159+ private void setStatus(EventState s)
8160+ {
8161+ eventState = s;
8162+ }
8163+
8164+ @Override
8165+ protected void showHtml(L2PcInstance player, int obj)
8166+ {
8167+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
8168+ TextBuilder sb = new TextBuilder();
8169+
8170+ 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>");
8171+ sb.append("<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>");
8172+ sb.append("<table width=270><tr><td><center>Russians left: " + russians.size() + "</td></tr></table>");
8173+ sb.append("<br><table width=270>");
8174+
8175+ for (L2PcInstance p : getPlayersOfTeam(1))
8176+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + (getStatus(p) == 1 ? "Dead" : "Alive") + "</td></tr>");
8177+
8178+ sb.append("</table></body></html>");
8179+ html.setHtml(sb.toString());
8180+ player.sendPacket(html);
8181+
8182+ }
8183+
8184+ private void spawnRussians()
8185+ {
8186+ for (int i = 1; i <= getInt("numberOfRussians"); i++)
8187+ {
8188+ int[] pos = getPosition("Russian", i);
8189+ russians.put(i, spawnNPC(pos[0], pos[1], pos[2], getInt("russianNpcId")));
8190+ choses.put(i, new FastList<L2PcInstance>());
8191+ russians.get(i).getLastSpawn().setTitle("--" + i + "--");
8192+ }
8193+ debug("Russians spawned");
8194+ }
8195+
8196+ @Override
8197+ protected void start()
8198+ {
8199+ setStatus(EventState.START);
8200+ schedule(1);
8201+ }
8202+
8203+ private void unspawnRussians()
8204+ {
8205+ for (L2Spawn russian : russians.values())
8206+ unspawnNPC(russian);
8207+
8208+ debug("Russians unspawned");
8209+ }
8210+}
8211\ No newline at end of file
8212Index: head-src/com/l2jfrozen/gameserver/event/Simon.java
8213===================================================================
8214--- head-src/com/l2jfrozen/gameserver/event/Simon.java (nonexistent)
8215+++ head-src/com/l2jfrozen/gameserver/event/Simon.java (working copy)
8216@@ -0,0 +1,308 @@
8217+package com.l2jfrozen.gameserver.event;
8218+
8219+import javolution.text.TextBuilder;
8220+
8221+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
8222+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
8223+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
8224+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
8225+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
8226+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
8227+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
8228+import com.l2jfrozen.util.random.Rnd;
8229+
8230+/**
8231+ * @author Rizel
8232+ *
8233+ */
8234+public class Simon extends Event
8235+{
8236+
8237+ private class Core implements Runnable
8238+ {
8239+ public void run()
8240+ {
8241+ try
8242+ {
8243+ switch (eventState)
8244+ {
8245+ case START:
8246+ divideIntoTeams(1);
8247+ preparePlayers();
8248+ teleportToTeamPos();
8249+ forceSitAll();
8250+ unequip();
8251+ setStatus(EventState.SAY);
8252+ schedule(30000);
8253+ break;
8254+
8255+ case SAY:
8256+ round++;
8257+ say = createNewRandomString(getInt("lengthOfFirstWord") + getInt("increasePerRound") * round);
8258+ sendToPlayers(say.toUpperCase());
8259+ setStatus(EventState.CHECK);
8260+ schedule(getInt("roundTime") * 1000);
8261+ break;
8262+
8263+ case CHECK:
8264+ if (removeAfkers())
8265+ {
8266+ setAllToFalse();
8267+ setStatus(EventState.SAY);
8268+ schedule(getInt("roundTime") * 1000);
8269+ }
8270+ break;
8271+
8272+ case END:
8273+ setStatus(EventState.INACTIVE);
8274+ forceStandAll();
8275+
8276+ if (winner != null)
8277+ {
8278+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
8279+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event!");
8280+ }
8281+ else
8282+ EventManager.getInstance().end("The match ended in a tie!");
8283+ break;
8284+ }
8285+ }
8286+ catch (Throwable e)
8287+ {
8288+ e.printStackTrace();
8289+ EventManager.getInstance().end("Error! Event ended.");
8290+ }
8291+ }
8292+ }
8293+
8294+ private enum EventState
8295+ {
8296+ START, SAY, CHECK, END, INACTIVE
8297+ }
8298+
8299+ private EventState eventState;
8300+
8301+ private Core task;
8302+
8303+ private int round;
8304+
8305+ private String say;
8306+
8307+ private L2NpcInstance npc;
8308+
8309+ private L2Spawn spawn;
8310+
8311+ private CreatureSay message;
8312+
8313+ private L2PcInstance winner;
8314+
8315+ public Simon()
8316+ {
8317+ super();
8318+ eventId = 6;
8319+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
8320+ task = new Core();
8321+ round = 0;
8322+ spawn = null;
8323+ npc = null;
8324+ winner = null;
8325+ }
8326+
8327+ private String createNewRandomString(int size)
8328+ {
8329+ String str = "";
8330+
8331+ for (int i = 0; i < size; i++)
8332+ str = str + (char) (Rnd.nextInt(26) + 97);
8333+
8334+ return str;
8335+ }
8336+
8337+ @Override
8338+ protected void endEvent()
8339+ {
8340+ winner = players.head().getNext().getKey();
8341+ setStatus(EventState.END);
8342+ schedule(1);
8343+
8344+ }
8345+
8346+ @Override
8347+ protected String getScorebar()
8348+ {
8349+ return "";
8350+ }
8351+
8352+ @Override
8353+ public void onSay(int type, L2PcInstance player, String text)
8354+ {
8355+ if (eventState == EventState.CHECK && getStatus(player) != -1)
8356+ {
8357+ if (text.equalsIgnoreCase(say))
8358+ {
8359+ setStatus(player, 1);
8360+ player.sendMessage("Correct!");
8361+ increasePlayersScore(player);
8362+ player.getAppearance().setNameColor(0, 255, 0);
8363+ player.broadcastUserInfo();
8364+ }
8365+
8366+ else
8367+ {
8368+ setStatus(player, -1);
8369+ player.sendMessage("Wrong!");
8370+ player.getAppearance().setNameColor(255, 0, 0);
8371+ player.broadcastUserInfo();
8372+ }
8373+
8374+ int falses = 0;
8375+ L2PcInstance falsed = null;
8376+ for (L2PcInstance p : getPlayerList())
8377+ if (getStatus(p) == 0)
8378+ {
8379+ falses++;
8380+ falsed = p;
8381+ }
8382+
8383+ if (falses == 1)
8384+ {
8385+ int count = 0;
8386+ for (L2PcInstance pla : getPlayerList())
8387+ if (getStatus(pla) == 1)
8388+ count++;
8389+
8390+ if (count >= 1)
8391+ {
8392+ falsed.sendMessage("Last one!");
8393+ falsed.getAppearance().setNameColor(255, 0, 0);
8394+ falsed.broadcastUserInfo();
8395+ setStatus(falsed, -1);
8396+ }
8397+
8398+ if (count == 0)
8399+ {
8400+ winner = getPlayersWithStatus(0).head().getNext().getValue();
8401+ setStatus(EventState.END);
8402+ schedule(1);
8403+ }
8404+
8405+ }
8406+
8407+ if (countOfPositiveStatus() == 1)
8408+ {
8409+ winner = getPlayersWithStatus(1).head().getNext().getValue();
8410+ setStatus(EventState.END);
8411+ schedule(1);
8412+ }
8413+
8414+ }
8415+
8416+ }
8417+
8418+ private boolean removeAfkers()
8419+ {
8420+
8421+ for (L2PcInstance player : getPlayerList())
8422+ {
8423+ if (getStatus(player) == 0)
8424+ {
8425+
8426+ player.sendMessage("Timeout!");
8427+ player.getAppearance().setNameColor(255, 0, 0);
8428+ player.broadcastUserInfo();
8429+ setStatus(player, -1);
8430+ }
8431+
8432+ if (countOfPositiveStatus() == 1)
8433+ {
8434+ if (getPlayersWithStatus(1).size() == 1)
8435+ winner = getPlayersWithStatus(1).head().getNext().getValue();
8436+ else
8437+ winner = null;
8438+
8439+ setStatus(EventState.END);
8440+ schedule(1);
8441+ return false;
8442+ }
8443+ }
8444+ return true;
8445+ }
8446+
8447+ @Override
8448+ public void reset()
8449+ {
8450+ super.reset();
8451+ round = 0;
8452+ players.clear();
8453+ say = "";
8454+ npc.deleteMe();
8455+ spawn.stopRespawn();
8456+ SpawnTable.getInstance().deleteSpawn(spawn, true);
8457+ npc = null;
8458+ spawn = null;
8459+ }
8460+
8461+ @Override
8462+ protected void schedule(int time)
8463+ {
8464+ tpm.scheduleGeneral(task, time);
8465+ }
8466+
8467+ private void sendToPlayers(String text)
8468+ {
8469+ message = new CreatureSay(npc.getObjectId(), 1, "Simon", text);
8470+ for (L2PcInstance player : getPlayerList())
8471+ player.sendPacket(message);
8472+ }
8473+
8474+ private void setAllToFalse()
8475+ {
8476+ for (L2PcInstance player : getPlayerList())
8477+ if (getStatus(player) != -1)
8478+ {
8479+ setStatus(player, 0);
8480+ player.getAppearance().setNameColor(255, 255, 255);
8481+ player.broadcastUserInfo();
8482+ }
8483+ }
8484+
8485+ private void setStatus(EventState s)
8486+ {
8487+ eventState = s;
8488+ }
8489+
8490+ @Override
8491+ protected void showHtml(L2PcInstance player, int obj)
8492+ {
8493+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
8494+ TextBuilder sb = new TextBuilder();
8495+
8496+ 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>");
8497+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>Running</td><td width=130><center>" + getString("eventName") + "</td><td width=70>Time: ?</td></tr></table>");
8498+ sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
8499+ sb.append("<br><table width=270>");
8500+
8501+ for (L2PcInstance p : getPlayersOfTeam(1))
8502+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
8503+
8504+ sb.append("</table></body></html>");
8505+ html.setHtml(sb.toString());
8506+ player.sendPacket(html);
8507+ }
8508+
8509+ @Override
8510+ protected void start()
8511+ {
8512+ int[] npcpos = getPosition("Simon", 1);
8513+ spawn = spawnNPC(npcpos[0], npcpos[1], npcpos[2], getInt("simonNpcId"));
8514+ npc = spawn.getLastSpawn();
8515+ setStatus(EventState.START);
8516+ schedule(1);
8517+ }
8518+
8519+ @Override
8520+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
8521+ {
8522+ return false;
8523+ }
8524+}
8525\ No newline at end of file
8526Index: head-src/com/l2jfrozen/gameserver/event/TvT.java
8527===================================================================
8528--- head-src/com/l2jfrozen/gameserver/event/TvT.java (nonexistent)
8529+++ head-src/com/l2jfrozen/gameserver/event/TvT.java (working copy)
8530@@ -0,0 +1,151 @@
8531+package com.l2jfrozen.gameserver.event;
8532+
8533+import javolution.text.TextBuilder;
8534+
8535+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
8536+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
8537+
8538+public class TvT extends Event
8539+{
8540+ private class Core implements Runnable
8541+ {
8542+ public void run()
8543+ {
8544+ try
8545+ {
8546+ switch (eventState)
8547+ {
8548+ case START:
8549+ divideIntoTeams(2);
8550+ preparePlayers();
8551+ teleportToTeamPos();
8552+ createPartyOfTeam(1);
8553+ createPartyOfTeam(2);
8554+ forceSitAll();
8555+ setStatus(EventState.FIGHT);
8556+ schedule(20000);
8557+ break;
8558+
8559+ case FIGHT:
8560+ forceStandAll();
8561+ setStatus(EventState.END);
8562+ clock.startClock(getInt("matchTime"));
8563+ break;
8564+
8565+ case END:
8566+ clock.setTime(0);
8567+ if (winnerTeam == 0)
8568+ winnerTeam = getWinnerTeam();
8569+
8570+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
8571+ setStatus(EventState.INACTIVE);
8572+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " kills!");
8573+ break;
8574+ }
8575+ }
8576+ catch (Throwable e)
8577+ {
8578+ e.printStackTrace();
8579+ EventManager.getInstance().end("Error! Event ended.");
8580+ }
8581+ }
8582+ }
8583+
8584+ private enum EventState
8585+ {
8586+ START, FIGHT, END, TELEPORT, INACTIVE
8587+ }
8588+
8589+ private EventState eventState;
8590+
8591+ private Core task;
8592+
8593+ public TvT()
8594+ {
8595+ super();
8596+ eventId = 7;
8597+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
8598+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
8599+ task = new Core();
8600+ winnerTeam = 0;
8601+ }
8602+
8603+ @Override
8604+ protected void endEvent()
8605+ {
8606+ winnerTeam = players.head().getNext().getValue()[0];
8607+
8608+ setStatus(EventState.END);
8609+ clock.setTime(0);
8610+
8611+ }
8612+
8613+ @Override
8614+ protected String getScorebar()
8615+ {
8616+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
8617+ }
8618+
8619+ @Override
8620+ public void onDie(L2PcInstance victim, L2PcInstance killer)
8621+ {
8622+ super.onDie(victim, killer);
8623+ addToResurrector(victim);
8624+ }
8625+
8626+ @Override
8627+ public void onKill(L2PcInstance victim, L2PcInstance killer)
8628+ {
8629+ super.onKill(victim, killer);
8630+ if (getPlayersTeam(killer) != getPlayersTeam(victim))
8631+ {
8632+ getPlayersTeam(killer).increaseScore();
8633+ killer.addItem("Event", 6392, 1, killer, true);
8634+ increasePlayersScore(killer);
8635+ }
8636+
8637+ }
8638+
8639+ @Override
8640+ protected void schedule(int time)
8641+ {
8642+ tpm.scheduleGeneral(task, time);
8643+ }
8644+
8645+ private void setStatus(EventState s)
8646+ {
8647+ eventState = s;
8648+ }
8649+
8650+ @Override
8651+ protected void showHtml(L2PcInstance player, int obj)
8652+ {
8653+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
8654+ TextBuilder sb = new TextBuilder();
8655+
8656+ 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>");
8657+ sb.append("<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>");
8658+ sb.append("<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>");
8659+ sb.append("<br><table width=270>");
8660+ int i = 0;
8661+ for (EventTeam team : teams.values())
8662+ {
8663+ i++;
8664+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
8665+ for (L2PcInstance p : getPlayersOfTeam(i))
8666+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
8667+ }
8668+
8669+ sb.append("</table></body></html>");
8670+ html.setHtml(sb.toString());
8671+ player.sendPacket(html);
8672+
8673+ }
8674+
8675+ @Override
8676+ protected void start()
8677+ {
8678+ setStatus(EventState.START);
8679+ schedule(1);
8680+ }
8681+}
8682\ No newline at end of file
8683Index: head-src/com/l2jfrozen/gameserver/event/VIPTvT.java
8684===================================================================
8685--- head-src/com/l2jfrozen/gameserver/event/VIPTvT.java (nonexistent)
8686+++ head-src/com/l2jfrozen/gameserver/event/VIPTvT.java (working copy)
8687@@ -0,0 +1,207 @@
8688+package com.l2jfrozen.gameserver.event;
8689+
8690+import javolution.text.TextBuilder;
8691+import javolution.util.FastMap;
8692+
8693+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
8694+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
8695+
8696+public class VIPTvT extends Event
8697+{
8698+ private class Core implements Runnable
8699+ {
8700+ public void run()
8701+ {
8702+ try
8703+ {
8704+ switch (eventState)
8705+ {
8706+ case START:
8707+ divideIntoTeams(2);
8708+ preparePlayers();
8709+ teleportToTeamPos();
8710+ createPartyOfTeam(1);
8711+ createPartyOfTeam(2);
8712+ selectNewVipOfTeam(1);
8713+ selectNewVipOfTeam(2);
8714+ forceSitAll();
8715+ setStatus(EventState.FIGHT);
8716+ schedule(20000);
8717+ break;
8718+
8719+ case FIGHT:
8720+ forceStandAll();
8721+ setStatus(EventState.END);
8722+ clock.startClock(getInt("matchTime"));
8723+ break;
8724+
8725+ case END:
8726+ clock.setTime(0);
8727+ if (winnerTeam == 0)
8728+ winnerTeam = getWinnerTeam();
8729+
8730+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
8731+ setStatus(EventState.INACTIVE);
8732+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " VIP kills!");
8733+ break;
8734+ }
8735+ }
8736+ catch (Throwable e)
8737+ {
8738+ e.printStackTrace();
8739+ EventManager.getInstance().end("Error! Event ended.");
8740+ }
8741+
8742+ }
8743+ }
8744+
8745+ private enum EventState
8746+ {
8747+ START, FIGHT, END, TELEPORT, INACTIVE
8748+ }
8749+
8750+ private EventState eventState;
8751+
8752+ private Core task;
8753+
8754+ private FastMap<Integer, L2PcInstance> vips;
8755+
8756+ public VIPTvT()
8757+ {
8758+ super();
8759+ eventId = 8;
8760+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
8761+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
8762+ task = new Core();
8763+ vips = new FastMap<Integer, L2PcInstance>();
8764+ winnerTeam = 0;
8765+ }
8766+
8767+ @Override
8768+ protected void endEvent()
8769+ {
8770+ winnerTeam = players.head().getNext().getValue()[0];
8771+
8772+ setStatus(EventState.END);
8773+ clock.setTime(0);
8774+
8775+ }
8776+
8777+ @Override
8778+ protected String getScorebar()
8779+ {
8780+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
8781+ }
8782+
8783+ @Override
8784+ public void onDie(L2PcInstance victim, L2PcInstance killer)
8785+ {
8786+ super.onDie(victim, killer);
8787+ if (vips.get(1) == victim)
8788+ {
8789+ teams.get(2).increaseScore();
8790+ increasePlayersScore(killer);
8791+ killer.addItem("Event", 6392, 3, killer, true);
8792+ selectNewVipOfTeam(1);
8793+ }
8794+ if (vips.get(2) == victim)
8795+ {
8796+ teams.get(1).increaseScore();
8797+ increasePlayersScore(killer);
8798+ killer.addItem("Event", 6392, 3, killer, true);
8799+ selectNewVipOfTeam(2);
8800+ }
8801+
8802+ addToResurrector(victim);
8803+ }
8804+
8805+ @Override
8806+ protected void schedule(int time)
8807+ {
8808+ tpm.scheduleGeneral(task, time);
8809+ }
8810+
8811+ private void selectNewVipOfTeam(int team)
8812+ {
8813+ if (vips.get(team) != null)
8814+ {
8815+ int[] nameColor = teams.get(getTeam(vips.get(team))).getTeamColor();
8816+ vips.get(team).getAppearance().setNameColor(nameColor[0], nameColor[1], nameColor[2]);
8817+ }
8818+
8819+ L2PcInstance newvip = getRandomPlayerFromTeam(team);
8820+ vips.getEntry(team).setValue(newvip);
8821+ if (team == 1)
8822+ {
8823+ int[] c = getColor("BlueVIP");
8824+ newvip.getAppearance().setNameColor(c[0], c[1], c[2]);
8825+ }
8826+
8827+ if (team == 2)
8828+ {
8829+ int[] c = getColor("RedVIP");
8830+ newvip.getAppearance().setNameColor(c[0], c[1], c[2]);
8831+ }
8832+
8833+ if (!newvip.isDead())
8834+ {
8835+ newvip.setCurrentCp(newvip.getMaxCp());
8836+ newvip.setCurrentMp(newvip.getMaxMp());
8837+ newvip.setCurrentHp(newvip.getMaxHp());
8838+ }
8839+
8840+ newvip.broadcastUserInfo();
8841+
8842+ }
8843+
8844+ private void setStatus(EventState s)
8845+ {
8846+ eventState = s;
8847+ }
8848+
8849+ @Override
8850+ protected void showHtml(L2PcInstance player, int obj)
8851+ {
8852+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
8853+ TextBuilder sb = new TextBuilder();
8854+
8855+ 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>");
8856+ sb.append("<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>");
8857+ sb.append("<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>");
8858+ sb.append("<br><table width=270>");
8859+ int i = 0;
8860+ for (EventTeam team : teams.values())
8861+ {
8862+ i++;
8863+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
8864+ for (L2PcInstance p : getPlayersOfTeam(i))
8865+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
8866+ }
8867+
8868+ sb.append("</table></body></html>");
8869+ html.setHtml(sb.toString());
8870+ player.sendPacket(html);
8871+
8872+ }
8873+
8874+ @Override
8875+ protected void start()
8876+ {
8877+ vips.put(1, null);
8878+ vips.put(2, null);
8879+ setStatus(EventState.START);
8880+ schedule(1);
8881+ }
8882+
8883+ @Override
8884+ public void onLogout(L2PcInstance player)
8885+ {
8886+ super.onLogout(player);
8887+
8888+ if(vips.get(1) == player)
8889+ selectNewVipOfTeam(1);
8890+ if(vips.get(2) == player)
8891+ selectNewVipOfTeam(2);
8892+
8893+ }
8894+}
8895\ No newline at end of file
8896Index: head-src/com/l2jfrozen/gameserver/event/Zombie.java
8897===================================================================
8898--- head-src/com/l2jfrozen/gameserver/event/Zombie.java (nonexistent)
8899+++ head-src/com/l2jfrozen/gameserver/event/Zombie.java (working copy)
8900@@ -0,0 +1,212 @@
8901+package com.l2jfrozen.gameserver.event;
8902+
8903+import javolution.text.TextBuilder;
8904+
8905+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
8906+import com.l2jfrozen.gameserver.model.L2Object;
8907+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
8908+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
8909+
8910+/**
8911+ * @author Rizel
8912+ *
8913+ */
8914+public class Zombie extends Event
8915+{
8916+ private class Core implements Runnable
8917+ {
8918+ public void run()
8919+ {
8920+ try
8921+ {
8922+ switch (eventState)
8923+ {
8924+ case START:
8925+ divideIntoTeams(1);
8926+ preparePlayers();
8927+ teleportToRandom();
8928+ forceSitAll();
8929+ unequip();
8930+ setStatus(EventState.FIGHT);
8931+ schedule(20000);
8932+ break;
8933+
8934+ case FIGHT:
8935+ forceStandAll();
8936+ transform(getRandomPlayer());
8937+ setStatus(EventState.END);
8938+ clock.startClock(getInt("matchTime"));
8939+ break;
8940+
8941+ case END:
8942+ setStatus(EventState.INACTIVE);
8943+ clock.setTime(0);
8944+
8945+ if (getPlayersWithStatus(0).size() != 1)
8946+ {
8947+ msgToAll("Tie!");
8948+ EventManager.getInstance().end("The match has ended in a tie!");
8949+ }
8950+
8951+ else
8952+ {
8953+ L2PcInstance winner = getWinner();
8954+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
8955+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event!");
8956+ }
8957+
8958+ break;
8959+ }
8960+ }
8961+ catch (Throwable e)
8962+ {
8963+ e.printStackTrace();
8964+ EventManager.getInstance().end("Error! Event ended.");
8965+ }
8966+ }
8967+ }
8968+
8969+ private enum EventState
8970+ {
8971+ START, FIGHT, END, INACTIVE
8972+ }
8973+
8974+ private EventState eventState;
8975+
8976+ private Core task;
8977+
8978+ public Zombie()
8979+ {
8980+ super();
8981+ eventId = 9;
8982+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
8983+ task = new Core();
8984+ }
8985+
8986+ @Override
8987+ public boolean canAttack(L2PcInstance player, L2Object target)
8988+ {
8989+ if (target instanceof L2PcInstance)
8990+ if (getStatus(player) == 1 && getStatus((L2PcInstance) target) == 0)
8991+ return true;
8992+
8993+ return false;
8994+ }
8995+
8996+ @Override
8997+ protected void endEvent()
8998+ {
8999+ setStatus(EventState.END);
9000+ clock.setTime(0);
9001+ }
9002+
9003+ @Override
9004+ protected String getScorebar()
9005+ {
9006+ return "Humans: " + getPlayersWithStatus(0).size() + " Time: " + clock.getTime();
9007+ }
9008+
9009+ private L2PcInstance getWinner()
9010+ {
9011+ return getPlayersWithStatus(0).head().getNext().getValue();
9012+ }
9013+
9014+ @Override
9015+ public void onHit(L2PcInstance actor, L2PcInstance target)
9016+ {
9017+ if (eventState == EventState.END)
9018+ {
9019+ if (getStatus(actor) == 1 && getStatus(target) == 0)
9020+ {
9021+ transform(target);
9022+ increasePlayersScore(actor);
9023+ actor.addItem("Event", 6392, 2, actor, true);
9024+ }
9025+
9026+ if (getPlayersWithStatus(0).size() == 1)
9027+ schedule(1);
9028+ }
9029+
9030+ }
9031+
9032+ @Override
9033+ public void onLogout(L2PcInstance player)
9034+ {
9035+ if (getStatus(player) == 1 && getPlayersWithStatus(1).size() == 1)
9036+ {
9037+ super.onLogout(player);
9038+ transform(getRandomPlayer());
9039+ }
9040+ else
9041+ {
9042+ super.onLogout(player);
9043+ }
9044+
9045+ }
9046+
9047+ @Override
9048+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
9049+ {
9050+ return false;
9051+ }
9052+
9053+ @Override
9054+ protected void schedule(int time)
9055+ {
9056+ tpm.scheduleGeneral(task, time);
9057+ }
9058+
9059+ private void setStatus(EventState s)
9060+ {
9061+ eventState = s;
9062+ }
9063+
9064+ /* (non-Javadoc)
9065+ * @see net.sf.l2j.gameserver.event.Event#showHtml(net.sf.l2j.gameserver.model.actor.instance.L2PcInstance, int)
9066+ */
9067+ @Override
9068+ protected void showHtml(L2PcInstance player, int obj)
9069+ {
9070+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
9071+ TextBuilder sb = new TextBuilder();
9072+
9073+ 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>");
9074+ sb.append("<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>");
9075+ sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
9076+ sb.append("<br><table width=270>");
9077+
9078+ for (L2PcInstance p : getPlayersOfTeam(1))
9079+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + (getStatus(p) == 1 ? "Zombie" : "Human") + "</td></tr>");
9080+
9081+ sb.append("</table></body></html>");
9082+ html.setHtml(sb.toString());
9083+ player.sendPacket(html);
9084+
9085+ }
9086+
9087+ @Override
9088+ protected void start()
9089+ {
9090+ setStatus(EventState.START);
9091+ schedule(1);
9092+ }
9093+
9094+ private void teleportToRandom()
9095+ {
9096+ for (L2PcInstance player : players.keySet())
9097+ {
9098+ int[] loc = getPosition("All", 0);
9099+ player.teleToLocation(loc[0], loc[1], loc[2]);
9100+ }
9101+ }
9102+
9103+ protected void transform(L2PcInstance player)
9104+ {
9105+ setStatus(player, 1);
9106+ polymorph(player,25375);
9107+ player.getAppearance().setNameColor(255, 0, 0);
9108+ player.broadcastUserInfo();
9109+ player.getInventory().unEquipItemInSlot(10);
9110+ player.getInventory().unEquipItemInSlot(16);
9111+ }
9112+}
9113\ No newline at end of file
9114Index: head-src/com/l2jfrozen/gameserver/event/dm.java
9115===================================================================
9116--- head-src/com/l2jfrozen/gameserver/event/dm.java (nonexistent)
9117+++ head-src/com/l2jfrozen/gameserver/event/dm.java (working copy)
9118@@ -0,0 +1,139 @@
9119+package com.l2jfrozen.gameserver.event;
9120+
9121+import javolution.text.TextBuilder;
9122+
9123+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
9124+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
9125+
9126+public class dm extends Event
9127+{
9128+private class Core implements Runnable
9129+{
9130+public void run()
9131+{
9132+try
9133+{
9134+switch (eventState)
9135+{
9136+case START:
9137+divideIntoTeams(1);
9138+preparePlayers();
9139+teleportToTeamPos();
9140+forceSitAll();
9141+setStatus(EventState.FIGHT);
9142+debug("The event started with " + players.size() + " player");
9143+schedule(20000);
9144+break;
9145+
9146+case FIGHT:
9147+forceStandAll();
9148+setStatus(EventState.END);
9149+debug("The fight started");
9150+clock.startClock(getInt("matchTime"));
9151+break;
9152+
9153+case END:
9154+clock.setTime(0);
9155+L2PcInstance winner = getPlayerWithMaxScore();
9156+giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
9157+setStatus(EventState.INACTIVE);
9158+debug("The event ended. Winner: " + winner.getName());
9159+EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " kills!");
9160+break;
9161+}
9162+}
9163+catch (Throwable e)
9164+{
9165+e.printStackTrace();
9166+EventManager.getInstance().end("Error! Event ended.");
9167+}
9168+}
9169+}
9170+
9171+private enum EventState
9172+{
9173+START, FIGHT, END, INACTIVE
9174+}
9175+
9176+private EventState eventState;
9177+
9178+private Core task;
9179+
9180+public dm()
9181+{
9182+super();
9183+eventId = 1;
9184+createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
9185+task = new Core();
9186+}
9187+
9188+@Override
9189+protected void endEvent()
9190+{
9191+setStatus(EventState.END);
9192+clock.setTime(0);
9193+
9194+}
9195+
9196+@Override
9197+protected String getScorebar()
9198+{
9199+return "Max: " + getScore(getPlayerWithMaxScore()) + " Time: " + clock.getTime() + "";
9200+}
9201+
9202+@Override
9203+public void onDie(L2PcInstance victim, L2PcInstance killer)
9204+{
9205+super.onDie(victim, killer);
9206+addToResurrector(victim);
9207+}
9208+
9209+@Override
9210+public void onKill(L2PcInstance victim, L2PcInstance killer)
9211+{
9212+super.onKill(victim, killer);
9213+killer.addItem("Event", 6392, 1, killer, true);
9214+increasePlayersScore(killer);
9215+}
9216+
9217+@Override
9218+protected void schedule(int time)
9219+{
9220+tpm.scheduleGeneral(task, time);
9221+}
9222+
9223+private void setStatus(EventState s)
9224+{
9225+eventState = s;
9226+}
9227+
9228+@Override
9229+protected void showHtml(L2PcInstance player, int obj)
9230+{
9231+if (players.size() > 0)
9232+{
9233+NpcHtmlMessage html = new NpcHtmlMessage(obj);
9234+TextBuilder sb = new TextBuilder();
9235+
9236+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>");
9237+sb.append("<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>");
9238+sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
9239+sb.append("<br><table width=270>");
9240+
9241+for (L2PcInstance p : getPlayersOfTeam(1))
9242+sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
9243+
9244+sb.append("</table></body></html>");
9245+html.setHtml(sb.toString());
9246+player.sendPacket(html);
9247+}
9248+}
9249+
9250+@Override
9251+protected void start()
9252+{
9253+setStatus(EventState.START);
9254+schedule(1);
9255+}
9256+
9257+}
9258\ No newline at end of file
9259Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/ExShowScreenMessage.java
9260===================================================================
9261--- head-src/com/l2jfrozen/gameserver/network/serverpackets/ExShowScreenMessage.java (revision 1132)
9262+++ head-src/com/l2jfrozen/gameserver/network/serverpackets/ExShowScreenMessage.java (working copy)
9263@@ -21,26 +21,40 @@
9264 */
9265 public class ExShowScreenMessage extends L2GameServerPacket
9266 {
9267+ public static enum SMPOS
9268+ {
9269+ DUMMY,
9270+ TOP_LEFT,
9271+ TOP_CENTER,
9272+ TOP_RIGHT,
9273+ MIDDLE_LEFT,
9274+ MIDDLE_CENTER,
9275+ MIDDLE_RIGHT,
9276+ BOTTOM_CENTER,
9277+ BOTTOM_RIGHT,
9278+ }
9279+
9280 private final int _type;
9281 private final int _sysMessageId;
9282- private final int _unk1;
9283+ private final boolean _hide;
9284 private final int _unk2;
9285 private final int _unk3;
9286- private final int _unk4;
9287+ private final boolean _fade;
9288 private final int _size;
9289 private final int _position;
9290 private final boolean _effect;
9291 private final String _text;
9292 private final int _time;
9293
9294+
9295 public ExShowScreenMessage(final String text, final int time)
9296 {
9297 _type = 1;
9298 _sysMessageId = -1;
9299- _unk1 = 0;
9300+ _hide = false;
9301 _unk2 = 0;
9302 _unk3 = 0;
9303- _unk4 = 0;
9304+ _fade = false;
9305 _position = 0x02;
9306 _text = text;
9307 _time = time;
9308@@ -48,14 +62,34 @@
9309 _effect = false;
9310 }
9311
9312- public ExShowScreenMessage(final int type, final int messageId, final int position, final int unk1, final int size, final int unk2, final int unk3, final boolean showEffect, final int time, final int unk4, final String text)
9313+
9314+ public ExShowScreenMessage(String text, int time, SMPOS pos, boolean effect)
9315+ {
9316+ this(text, time, pos.ordinal(), effect);
9317+ }
9318+
9319+ public ExShowScreenMessage(String text, int time, int pos, boolean effect)
9320 {
9321+ _type = 1;
9322+ _sysMessageId = -1;
9323+ _hide = false;
9324+ _unk2 = 0;
9325+ _unk3 = 0;
9326+ _fade = false;
9327+ _position = pos;
9328+ _text = text;
9329+ _time = time;
9330+ _size = 0;
9331+ _effect = effect;
9332+ }
9333+
9334+ public ExShowScreenMessage(int type, int messageId, int position, boolean hide, int size, int unk2, int unk3, boolean showEffect, int time, boolean fade, String text){
9335 _type = type;
9336 _sysMessageId = messageId;
9337- _unk1 = unk1;
9338+ _hide = hide;
9339 _unk2 = unk2;
9340 _unk3 = unk3;
9341- _unk4 = unk4;
9342+ _fade = fade;
9343 _position = position;
9344 _text = text;
9345 _time = time;
9346@@ -64,12 +98,6 @@
9347 }
9348
9349 @Override
9350- public String getType()
9351- {
9352- return "[S]FE:39 ExShowScreenMessage";
9353- }
9354-
9355- @Override
9356 protected void writeImpl()
9357 {
9358 writeC(0xfe);
9359@@ -77,13 +105,19 @@
9360 writeD(_type); // 0 - system messages, 1 - your defined text
9361 writeD(_sysMessageId); // system message id (_type must be 0 otherwise no effect)
9362 writeD(_position); // message position
9363- writeD(_unk1); // ?
9364+ writeD(_hide == true ? 1 : 0); // hide
9365 writeD(_size); // font size 0 - normal, 1 - small
9366 writeD(_unk2); // ?
9367 writeD(_unk3); // ?
9368 writeD(_effect ? 1 : 0); // upper effect (0 - disabled, 1 enabled) - _position must be 2 (center) otherwise no effect
9369 writeD(_time); // time
9370- writeD(_unk4); // ?
9371+ writeD(_fade == true ? 1 : 0); // fade effect (0 - disabled, 1 enabled)
9372 writeS(_text); // your text (_type must be 1, otherwise no effect)
9373 }
9374+
9375+ @Override
9376+ public String getType()
9377+ {
9378+ return "[S]FE:38 ExShowScreenMessage";
9379+ }
9380 }
9381\ No newline at end of file
9382Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/Die.java
9383===================================================================
9384--- head-src/com/l2jfrozen/gameserver/network/serverpackets/Die.java (revision 1132)
9385+++ head-src/com/l2jfrozen/gameserver/network/serverpackets/Die.java (working copy)
9386@@ -20,6 +20,7 @@
9387 */
9388 package com.l2jfrozen.gameserver.network.serverpackets;
9389
9390+import com.l2jfrozen.gameserver.event.EventManager;
9391 import com.l2jfrozen.gameserver.datatables.AccessLevel;
9392 import com.l2jfrozen.gameserver.datatables.sql.AccessLevels;
9393 import com.l2jfrozen.gameserver.managers.CastleManager;
9394@@ -46,6 +47,7 @@
9395 private boolean _sweepable;
9396 private boolean _canTeleport;
9397 private AccessLevel _access = AccessLevels.getInstance()._userAccessLevel;
9398+ private boolean _event;
9399 private com.l2jfrozen.gameserver.model.L2Clan _clan;
9400 L2Character _activeChar;
9401
9402@@ -60,6 +62,7 @@
9403 final L2PcInstance player = (L2PcInstance) cha;
9404 _access = player.getAccessLevel();
9405 _clan = player.getClan();
9406+ _event = EventManager.getInstance().isRegistered((L2PcInstance)cha);
9407 _canTeleport = !((TvT.is_started() && player._inEventTvT) || (DM.is_started() && player._inEventDM) || (CTF.is_started() && player._inEventCTF) || player.isInFunEvent() || player.isPendingRevive());
9408 }
9409 _charObjId = cha.getObjectId();
9410@@ -88,45 +91,57 @@
9411 // sweepable
9412 // 6d 04 00 00 00 - FIXED
9413
9414- writeD(_canTeleport ? 0x01 : 0); // 6d 00 00 00 00 - to nearest village
9415+ if(_event)
9416+ {
9417+ writeD(0x00);
9418+ writeD(0x00); // 6d 01 00 00 00 - to hide away
9419+ writeD(0x00); // 6d 02 00 00 00 - to castle
9420+ writeD(0x00);
9421+ }
9422+ else
9423+ {
9424+ writeD(_canTeleport ? 0x01 : 0); // 6d 00 00 00 00 - to nearest village
9425
9426- if (_canTeleport && _clan != null)
9427+ if(_canTeleport && _clan != null)
9428 {
9429- L2SiegeClan siegeClan = null;
9430- Boolean isInDefense = false;
9431- final Castle castle = CastleManager.getInstance().getCastle(_activeChar);
9432- final Fort fort = FortManager.getInstance().getFort(_activeChar);
9433-
9434- if (castle != null && castle.getSiege().getIsInProgress())
9435- {
9436 // siege in progress
9437- siegeClan = castle.getSiege().getAttackerClan(_clan);
9438- if (siegeClan == null && castle.getSiege().checkIsDefender(_clan))
9439+ L2SiegeClan siegeClan = null;
9440+ Boolean isInDefense = false;
9441+ Castle castle = CastleManager.getInstance().getCastle(_activeChar);
9442+ Fort fort = FortManager.getInstance().getFort(_activeChar);
9443+
9444+ if (castle != null && castle.getSiege().getIsInProgress())
9445 {
9446- isInDefense = true;
9447+ //siege in progress
9448+ siegeClan = castle.getSiege().getAttackerClan(_clan);
9449+ if (siegeClan == null && castle.getSiege().checkIsDefender(_clan))
9450+ {
9451+ isInDefense = true;
9452+ }
9453 }
9454- }
9455- else if (fort != null && fort.getSiege().getIsInProgress())
9456- {
9457- // siege in progress
9458- siegeClan = fort.getSiege().getAttackerClan(_clan);
9459- if (siegeClan == null && fort.getSiege().checkIsDefender(_clan))
9460- {
9461- isInDefense = true;
9462- }
9463- }
9464-
9465- writeD(_clan.getHasHideout() > 0 ? 0x01 : 0x00); // 6d 01 00 00 00 - to hide away
9466- writeD(_clan.getHasCastle() > 0 || _clan.getHasFort() > 0 || isInDefense ? 0x01 : 0x00); // 6d 02 00 00 00 - to castle
9467- writeD(siegeClan != null && !isInDefense && siegeClan.getFlag().size() > 0 ? 0x01 : 0x00); // 6d 03 00 00 00 - to siege HQ
9468- }
9469- else
9470- {
9471- writeD(0x00); // 6d 01 00 00 00 - to hide away
9472- writeD(0x00); // 6d 02 00 00 00 - to castle
9473- writeD(0x00); // 6d 03 00 00 00 - to siege HQ
9474+ else if(fort != null && fort.getSiege().getIsInProgress())
9475+ {
9476+ //siege in progress
9477+ siegeClan = fort.getSiege().getAttackerClan(_clan);
9478+ if(siegeClan == null && fort.getSiege().checkIsDefender(_clan))
9479+ {
9480+ isInDefense = true;
9481+ }
9482+ }
9483+
9484+ writeD(_clan.getHasHideout() > 0 ? 0x01 : 0x00); // 6d 01 00 00 00 - to hide away
9485+ writeD(_clan.getHasCastle() > 0 || _clan.getHasFort() > 0 || isInDefense ? 0x01 : 0x00); // 6d 02 00 00 00 - to castle
9486+ writeD(siegeClan != null && !isInDefense && siegeClan.getFlag().size() > 0 ? 0x01 : 0x00); // 6d 03 00 00 00 - to siege HQ
9487 }
9488
9489+ else
9490+ {
9491+ writeD(0x00); // 6d 01 00 00 00 - to hide away
9492+ writeD(0x00); // 6d 02 00 00 00 - to castle
9493+ writeD(0x00); // 6d 03 00 00 00 - to siege HQ
9494+ }
9495+ }
9496+
9497 writeD(_sweepable ? 0x01 : 0x00); // sweepable (blue glow)
9498 writeD(_access.allowFixedRes() ? 0x01 : 0x00); // 6d 04 00 00 00 - to FIXED
9499 }
9500Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java
9501===================================================================
9502--- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java (revision 1132)
9503+++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java (working copy)
9504@@ -39,6 +39,7 @@
9505 import com.l2jfrozen.gameserver.datatables.sql.HelperBuffTable;
9506 import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
9507 import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
9508+import com.l2jfrozen.gameserver.event.EventManager;
9509 import com.l2jfrozen.gameserver.idfactory.IdFactory;
9510 import com.l2jfrozen.gameserver.managers.CastleManager;
9511 import com.l2jfrozen.gameserver.managers.CustomNpcInstanceManager;
9512@@ -2966,6 +2967,20 @@
9513 break;
9514 }
9515
9516+ if (npcId == EventManager.getInstance().getInt("managerNpcId"))
9517+ {
9518+ EventManager.getInstance().showFirstHtml(player,getObjectId());
9519+ player.sendPacket( new ActionFailed() );
9520+ return;
9521+ }
9522+
9523+ if (EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(player))
9524+ if (EventManager.getInstance().getCurrentEvent().onTalkNpc(this,player))
9525+ {
9526+ player.sendPacket( new ActionFailed() );
9527+ return;
9528+ }
9529+
9530 if (this instanceof L2CastleTeleporterInstance)
9531 {
9532 ((L2CastleTeleporterInstance) this).showChatWindow(player);
9533Index: head-src/com/l2jfrozen/gameserver/event/EventStats.java
9534===================================================================
9535--- head-src/com/l2jfrozen/gameserver/event/EventStats.java (nonexistent)
9536+++ head-src/com/l2jfrozen/gameserver/event/EventStats.java (working copy)
9537@@ -0,0 +1,383 @@
9538+package com.l2jfrozen.gameserver.event;
9539+
9540+import java.sql.Connection;
9541+import java.sql.PreparedStatement;
9542+import java.sql.ResultSet;
9543+import java.util.Map;
9544+import java.util.Set;
9545+
9546+import javolution.text.TextBuilder;
9547+import javolution.util.FastMap;
9548+
9549+import com.l2jfrozen.util.database.L2DatabaseFactory;
9550+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
9551+import com.l2jfrozen.gameserver.network.serverpackets.ShowBoard;
9552+
9553+public class EventStats
9554+{
9555+
9556+ private static class SingletonHolder
9557+ {
9558+ protected static final EventStats _instance = new EventStats();
9559+ }
9560+
9561+ private class StatModell
9562+ {
9563+ protected int num;
9564+ protected int wins;
9565+ protected int losses;
9566+ protected int kills;
9567+ protected int deaths;
9568+ protected int scores;
9569+
9570+ private StatModell(int num, int wins, int losses, int kills, int deaths, int scores)
9571+ {
9572+ this.num = num;
9573+ this.wins = wins;
9574+ this.losses = losses;
9575+ this.kills = kills;
9576+ this.deaths = deaths;
9577+ this.scores = scores;
9578+ }
9579+
9580+ }
9581+
9582+ public static EventStats getInstance()
9583+ {
9584+ return SingletonHolder._instance;
9585+ }
9586+
9587+ private FastMap<Integer, FastMap<Integer, StatModell>> stats;
9588+
9589+ protected FastMap<Integer, int[]> tempTable;
9590+
9591+ private FastMap<Integer, ShowBoard> htmls;
9592+
9593+ private FastMap<Integer, int[]> statSums;
9594+
9595+ public EventStats()
9596+ {
9597+ stats = new FastMap<Integer, FastMap<Integer, StatModell>>();
9598+ tempTable = new FastMap<Integer, int[]>();
9599+ htmls = new FastMap<Integer, ShowBoard>();
9600+ statSums = new FastMap<Integer, int[]>();
9601+ loadSQL();
9602+ }
9603+
9604+ protected void applyChanges()
9605+ {
9606+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
9607+ return;
9608+
9609+ int eventId = EventManager.getInstance().getCurrentEvent().eventId;
9610+ for (L2PcInstance player : EventManager.getInstance().getCurrentEvent().getPlayerList())
9611+ {
9612+ int playerId = player.getObjectId();
9613+
9614+ if (!stats.containsKey(playerId))
9615+ stats.put(playerId, new FastMap<Integer, StatModell>());
9616+
9617+ if (!stats.get(playerId).containsKey(eventId))
9618+ stats.get(playerId).put(eventId, new StatModell(0, 0, 0, 0, 0, 0));
9619+
9620+ if (tempTable.get(playerId)[0] == 1)
9621+ stats.get(playerId).get(eventId).wins = stats.get(playerId).get(eventId).wins + 1;
9622+ else
9623+ stats.get(playerId).get(eventId).losses = stats.get(playerId).get(eventId).losses + 1;
9624+
9625+ stats.get(playerId).get(eventId).num = stats.get(playerId).get(eventId).num + 1;
9626+ stats.get(playerId).get(eventId).kills = stats.get(playerId).get(eventId).kills + tempTable.get(playerId)[1];
9627+ stats.get(playerId).get(eventId).deaths = stats.get(playerId).get(eventId).deaths + tempTable.get(playerId)[2];
9628+ stats.get(playerId).get(eventId).scores = stats.get(playerId).get(eventId).scores + tempTable.get(playerId)[3];
9629+ }
9630+ EventManager.getInstance().debug("applyChanges finished");
9631+ }
9632+
9633+ protected void createHtmls()
9634+ {
9635+ htmls.clear();
9636+ TextBuilder sb = new TextBuilder();
9637+ Connection con = null;
9638+ PreparedStatement statement = null;
9639+ try
9640+ {
9641+ con = L2DatabaseFactory.getInstance().getConnection();
9642+ 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");
9643+ ResultSet rset = statement.executeQuery();
9644+ rset.last();
9645+ rset.beforeFirst();
9646+ int count = 0;
9647+ while (rset.next())
9648+ {
9649+ count++;
9650+ if (count % 10 == 1)
9651+ 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>");
9652+
9653+ 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>");
9654+
9655+ if (count % 10 == 0)
9656+ {
9657+ sb.append("</table></body></html>");
9658+ htmls.put(count / 10, new ShowBoard(sb.toString(), "101"));
9659+ sb.clear();
9660+ }
9661+ }
9662+ if (count % 10 != 0 && !htmls.containsKey(count / 10 + 1))
9663+ {
9664+ sb.append("</table></body></html>");
9665+ htmls.put((count / 10 + 1), new ShowBoard(sb.toString(), "101"));
9666+ sb.clear();
9667+ }
9668+ rset.close();
9669+ statement.close();
9670+ }
9671+ catch (Exception e)
9672+ {
9673+ System.out.println("create SQL exception.");
9674+ }
9675+ finally
9676+ {
9677+ try { con.close(); } catch (Exception e) {}
9678+ }
9679+ EventManager.getInstance().debug("createHtmls finished");
9680+ }
9681+
9682+ private void loadSQL()
9683+ {
9684+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
9685+ return;
9686+
9687+ Connection con = null;
9688+ PreparedStatement statement = null;
9689+ try
9690+ {
9691+ con = L2DatabaseFactory.getInstance().getConnection();
9692+ statement = con.prepareStatement("SELECT * FROM event_stats");
9693+ ResultSet rset = statement.executeQuery();
9694+ int count = 0;
9695+ while (rset.next())
9696+ {
9697+ count++;
9698+ if (!stats.containsKey(rset.getInt("player")))
9699+ stats.put(rset.getInt("player"), new FastMap<Integer, StatModell>());
9700+
9701+ 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")));
9702+ }
9703+ rset.close();
9704+ statement.close();
9705+
9706+ EventManager.getInstance().debug("Stats loaded: " + count + " records.");
9707+ }
9708+ catch (Exception e)
9709+ {
9710+ System.out.println("EventStats SQL catch");
9711+ }
9712+ finally
9713+ {
9714+ try { con.close(); } catch (Exception e) {}
9715+ }
9716+ createHtmls();
9717+ }
9718+
9719+ public void showHtml(int id, L2PcInstance player)
9720+ {
9721+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
9722+ {
9723+ player.sendMessage("The stat tracking is disabled.");
9724+ return;
9725+ }
9726+ player.sendPacket(htmls.get(id));
9727+ player.sendPacket(new ShowBoard(null, "102"));
9728+ player.sendPacket(new ShowBoard(null, "103"));
9729+ }
9730+
9731+ public void showPlayerStats(int playerId, L2PcInstance player)
9732+ {
9733+ TextBuilder sb = new TextBuilder();
9734+ 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>");
9735+
9736+ if (stats.containsKey(playerId))
9737+ for (Map.Entry<Integer, StatModell> event : stats.get(playerId).entrySet())
9738+ {
9739+ StatModell stats = event.getValue();
9740+
9741+ if(EventManager.getInstance().events.containsKey(event.getKey()))
9742+ 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>");
9743+ }
9744+
9745+ sb.append("</table></body></html>");
9746+ player.sendPacket(new ShowBoard(sb.toString(), "101"));
9747+ player.sendPacket(new ShowBoard(null, "102"));
9748+ player.sendPacket(new ShowBoard(null, "103"));
9749+ }
9750+
9751+ public int getEventKills(int playerId)
9752+ {
9753+ int kills = 0;
9754+
9755+ if(!stats.containsKey(playerId))
9756+ return 0;
9757+ else
9758+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
9759+ kills += statmodell.getValue().kills;
9760+
9761+ return kills;
9762+ }
9763+
9764+ public int getEvents(int playerId)
9765+ {
9766+ int num = 0;
9767+
9768+ if(!stats.containsKey(playerId))
9769+ return 0;
9770+ else
9771+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
9772+ num += statmodell.getValue().num;
9773+
9774+ return num;
9775+ }
9776+
9777+ public int getEventWins(int playerId)
9778+ {
9779+ int wins = 0;
9780+
9781+ if(!stats.containsKey(playerId))
9782+ return 0;
9783+ else
9784+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
9785+ wins += statmodell.getValue().wins;
9786+
9787+ return wins;
9788+ }
9789+
9790+ // num | wins | losses | kills | deaths | fav_event_id
9791+ protected void sumPlayerStats()
9792+ {
9793+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
9794+ return;
9795+
9796+ statSums.clear();
9797+
9798+ for (int playerId : stats.keySet())
9799+ {
9800+
9801+ int num = 0;
9802+ int wins = 0;
9803+ int losses = 0;
9804+ int kills = 0;
9805+ int deaths = 0;
9806+ int faveventid = 0;
9807+ int faveventamm = 0;
9808+
9809+ for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
9810+ {
9811+ num += statmodell.getValue().num;
9812+ wins += statmodell.getValue().wins;
9813+ losses += statmodell.getValue().losses;
9814+ kills += statmodell.getValue().kills;
9815+ deaths += statmodell.getValue().deaths;
9816+
9817+ if (statmodell.getValue().num > faveventamm)
9818+ {
9819+ faveventamm = statmodell.getValue().num;
9820+ faveventid = statmodell.getKey();
9821+ }
9822+ }
9823+
9824+ statSums.put(playerId, new int[] { num, wins, losses, kills, deaths, faveventid });
9825+
9826+ }
9827+ EventManager.getInstance().debug("sumPlayerStats finished");
9828+ }
9829+
9830+ protected void updateSQL(Set<L2PcInstance> players, int eventId)
9831+ {
9832+ if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
9833+ return;
9834+
9835+ sumPlayerStats();
9836+ Connection con = null;
9837+ PreparedStatement statement = null;
9838+ try
9839+ {
9840+ con = L2DatabaseFactory.getInstance().getConnection();
9841+
9842+ for (L2PcInstance player : players)
9843+ {
9844+ int id = player.getObjectId();
9845+
9846+ if (statSums.get(id)[0] != 1)
9847+ {
9848+ statement = con.prepareStatement("UPDATE event_stats_full SET num=?, winpercent=?, kdratio=?, wins=?, losses=?, kills=?, deaths=?, favevent=? WHERE player=?");
9849+ statement.setInt(1, statSums.get(id)[0]);
9850+ statement.setInt(2, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
9851+ statement.setDouble(3, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
9852+ statement.setInt(4, statSums.get(id)[1]);
9853+ statement.setInt(5, statSums.get(id)[2]);
9854+ statement.setInt(6, statSums.get(id)[3]);
9855+ statement.setInt(7, statSums.get(id)[4]);
9856+ statement.setInt(8, statSums.get(id)[5]);
9857+ statement.setInt(9, id);
9858+
9859+ statement.executeUpdate();
9860+ statement.close();
9861+ }
9862+ else
9863+ {
9864+ statement = con.prepareStatement("INSERT INTO event_stats_full(player,num,winpercent,kdratio,wins,losses,kills,deaths,favevent) VALUES (?,?,?,?,?,?,?,?,?)");
9865+ statement.setInt(1, id);
9866+ statement.setInt(2, statSums.get(id)[0]);
9867+ statement.setInt(3, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
9868+ statement.setDouble(4, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
9869+ statement.setInt(5, statSums.get(id)[1]);
9870+ statement.setInt(6, statSums.get(id)[2]);
9871+ statement.setInt(7, statSums.get(id)[3]);
9872+ statement.setInt(8, statSums.get(id)[4]);
9873+ statement.setInt(9, statSums.get(id)[5]);
9874+ statement.executeUpdate();
9875+ statement.close();
9876+ }
9877+
9878+ if (stats.get(id).get(eventId).num != 1)
9879+ {
9880+ statement = con.prepareStatement("UPDATE event_stats SET num=?, wins=?, losses=?, kills=?, deaths=?, scores=? WHERE player=? AND event=?");
9881+ statement.setInt(1, stats.get(id).get(eventId).num);
9882+ statement.setInt(2, stats.get(id).get(eventId).wins);
9883+ statement.setInt(3, stats.get(id).get(eventId).losses);
9884+ statement.setInt(4, stats.get(id).get(eventId).kills);
9885+ statement.setInt(5, stats.get(id).get(eventId).deaths);
9886+ statement.setInt(6, stats.get(id).get(eventId).scores);
9887+ statement.setInt(7, id);
9888+ statement.setInt(8, eventId);
9889+ statement.executeUpdate();
9890+ statement.close();
9891+ }
9892+ else
9893+ {
9894+ statement = con.prepareStatement("INSERT INTO event_stats(player,event,num,wins,losses,kills,deaths,scores) VALUES (?,?,?,?,?,?,?,?)");
9895+ statement.setInt(1, id);
9896+ statement.setInt(2, eventId);
9897+ statement.setInt(3, stats.get(id).get(eventId).num);
9898+ statement.setInt(4, stats.get(id).get(eventId).wins);
9899+ statement.setInt(5, stats.get(id).get(eventId).losses);
9900+ statement.setInt(6, stats.get(id).get(eventId).kills);
9901+ statement.setInt(7, stats.get(id).get(eventId).deaths);
9902+ statement.setInt(8, stats.get(id).get(eventId).scores);
9903+ statement.executeUpdate();
9904+ statement.close();
9905+ }
9906+
9907+ }
9908+ }
9909+ catch (Exception e)
9910+ {
9911+ System.out.println("EventStats SQL catch");
9912+ }
9913+ finally
9914+ {
9915+ try { con.close(); } catch (Exception e) {}
9916+ }
9917+ EventManager.getInstance().debug("updateSQL finished");
9918+ createHtmls();
9919+ }
9920+}
9921\ No newline at end of file
9922Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/CharInfo.java
9923===================================================================
9924--- head-src/com/l2jfrozen/gameserver/network/serverpackets/CharInfo.java (revision 1132)
9925+++ head-src/com/l2jfrozen/gameserver/network/serverpackets/CharInfo.java (working copy)
9926@@ -26,12 +26,15 @@
9927 import org.apache.log4j.Logger;
9928
9929 import com.l2jfrozen.Config;
9930+import com.l2jfrozen.gameserver.event.EventManager;
9931 import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
9932 import com.l2jfrozen.gameserver.managers.CursedWeaponsManager;
9933 import com.l2jfrozen.gameserver.model.Inventory;
9934 import com.l2jfrozen.gameserver.model.L2Character;
9935 import com.l2jfrozen.gameserver.model.actor.instance.L2CubicInstance;
9936 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
9937+import com.l2jfrozen.gameserver.event.LMS;
9938+import com.l2jfrozen.gameserver.event.dm;
9939 import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
9940
9941 /**
9942@@ -89,6 +92,8 @@
9943 private int _flyWalkSpd;
9944 private final float _moveMultiplier, _attackSpeedMultiplier;
9945 private final int _maxCp;
9946+ private boolean _isInLMS;
9947+ private boolean _isInDM;
9948
9949 /**
9950 * @param cha
9951@@ -110,6 +115,8 @@
9952 _swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
9953 _swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
9954 _maxCp = _activeChar.getMaxCp();
9955+ _isInLMS = EventManager.getInstance().isRegistered(_activeChar) && EventManager.getInstance().getCurrentEvent() instanceof LMS;
9956+ _isInDM = EventManager.getInstance().isRegistered(_activeChar) && EventManager.getInstance().getCurrentEvent() instanceof dm;
9957 }
9958
9959 @Override
9960@@ -172,7 +179,16 @@
9961 // writeC(_activeChar.getAppearance().getInvisible() ? 1 : 0); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)
9962 // }
9963
9964- writeS(_activeChar.getName());
9965+ //writeS(_activeChar.getName());
9966+ if(_isInLMS || _isInDM)
9967+ {
9968+ writeS("Player");
9969+ }
9970+ else
9971+ {
9972+ writeS(_activeChar.getName());
9973+ }
9974+ //->writeS(_activeChar.getName());
9975
9976 if (_activeChar.getAppearance().getInvisible())
9977 // if(gmSeeInvis)
9978@@ -218,6 +234,14 @@
9979 writeD(_heading);
9980 writeD(_activeChar.getObjectId());
9981 writeS(_activeChar.getName());
9982+ if (_isInLMS || _isInDM)
9983+ {
9984+ writeS("Player");
9985+ }
9986+ else
9987+ {
9988+ writeS(_activeChar.getName());
9989+ }
9990 writeD(_activeChar.getRace().ordinal());
9991 writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
9992
9993@@ -230,18 +254,48 @@
9994 writeD(_activeChar.getBaseClass());
9995 }
9996
9997- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR));
9998- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
9999- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
10000- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
10001- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
10002- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
10003- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
10004- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
10005- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
10006- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
10007- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
10008- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
10009+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR));
10010+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
10011+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
10012+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
10013+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
10014+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
10015+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
10016+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
10017+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
10018+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
10019+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
10020+ //writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
10021+ if(_isInLMS || _isInDM)
10022+ {
10023+ writeD(0);
10024+ writeD(0);
10025+ writeD(0);
10026+ writeD(0);
10027+ writeD(0);
10028+ writeD(6408);
10029+ writeD(0);
10030+ writeD(0);
10031+ writeD(0);
10032+ writeD(0);
10033+ writeD(0);
10034+ writeD(0);
10035+ }
10036+ else
10037+ {
10038+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR));
10039+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
10040+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
10041+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
10042+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
10043+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
10044+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
10045+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
10046+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
10047+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
10048+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
10049+ writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
10050+ }
10051
10052 // c6 new h's
10053 writeH(0x00);
10054@@ -303,10 +357,24 @@
10055 writeS(_activeChar.getTitle());
10056 }
10057
10058- writeD(_activeChar.getClanId());
10059- writeD(_activeChar.getClanCrestId());
10060- writeD(_activeChar.getAllyId());
10061- writeD(_activeChar.getAllyCrestId());
10062+ //writeD(_activeChar.getClanId());
10063+ //writeD(_activeChar.getClanCrestId());
10064+ //writeD(_activeChar.getAllyId());
10065+ //writeD(_activeChar.getAllyCrestId());
10066+ if (_isInLMS || _isInDM)
10067+ {
10068+ writeD(0);
10069+ writeD(0);
10070+ writeD(0);
10071+ writeD(0);
10072+ }
10073+ else
10074+ {
10075+ writeD(_activeChar.getClanId());
10076+ writeD(_activeChar.getClanCrestId());
10077+ writeD(_activeChar.getAllyId());
10078+ writeD(_activeChar.getAllyCrestId());
10079+ }
10080 // In UserInfo leader rights and siege flags, but here found nothing??
10081 // Therefore RelationChanged packet with that info is required
10082 writeD(0);
10083Index: head-src/com/l2jfrozen/gameserver/event/Lucky.java
10084===================================================================
10085--- head-src/com/l2jfrozen/gameserver/event/Lucky.java (nonexistent)
10086+++ head-src/com/l2jfrozen/gameserver/event/Lucky.java (working copy)
10087@@ -0,0 +1,215 @@
10088+/*
10089+ * This program is free software: you can redistribute it and/or modify it under
10090+ * the terms of the GNU General Public License as published by the Free Software
10091+ * Foundation, either version 3 of the License, or (at your option) any later
10092+ * version.
10093+ *
10094+ * This program is distributed in the hope that it will be useful, but WITHOUT
10095+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10096+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
10097+ * details.
10098+ *
10099+ * You should have received a copy of the GNU General Public License along with
10100+ * this program. If not, see <http://www.gnu.org/licenses/>.
10101+ */
10102+package com.l2jfrozen.gameserver.event;
10103+
10104+import javolution.text.TextBuilder;
10105+import javolution.util.FastList;
10106+
10107+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
10108+import com.l2jfrozen.gameserver.model.L2Skill;
10109+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
10110+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
10111+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
10112+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
10113+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
10114+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
10115+import com.l2jfrozen.util.random.Rnd;
10116+
10117+/**
10118+ * @author Rizel
10119+ *
10120+ */
10121+public class Lucky extends Event
10122+{
10123+ private class Core implements Runnable
10124+ {
10125+ public void run()
10126+ {
10127+ try
10128+ {
10129+ switch (eventState)
10130+ {
10131+ case START:
10132+ divideIntoTeams(1);
10133+ preparePlayers();
10134+ teleportToTeamPos();
10135+ forceSitAll();
10136+ unequip();
10137+ setStatus(EventState.FIGHT);
10138+ schedule(30000);
10139+ break;
10140+
10141+ case FIGHT:
10142+ forceStandAll();
10143+ int[] coor = getPosition("Chests", 1);
10144+ for (int i = 0; i < getInt("numberOfChests"); i++)
10145+ chests.add(spawnNPC(coor[0] + (Rnd.get(coor[3] * 2) - coor[3]), coor[1] + (Rnd.get(coor[3] * 2) - coor[3]), coor[2], getInt("chestNpcId")));
10146+ setStatus(EventState.END);
10147+ clock.startClock(getInt("matchTime"));
10148+ break;
10149+
10150+ case END:
10151+ clock.setTime(0);
10152+ unSpawnChests();
10153+ L2PcInstance winner = getPlayerWithMaxScore();
10154+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
10155+ setStatus(EventState.INACTIVE);
10156+ EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " opened chests!");
10157+ break;
10158+ }
10159+ }
10160+ catch (Throwable e)
10161+ {
10162+ e.printStackTrace();
10163+ EventManager.getInstance().end("Error! Event ended.");
10164+ }
10165+ }
10166+ }
10167+
10168+ private enum EventState
10169+ {
10170+ START, FIGHT, END, INACTIVE
10171+ }
10172+
10173+ private EventState eventState;
10174+
10175+ private Core task;
10176+
10177+ private FastList<L2Spawn> chests;
10178+
10179+ public Lucky()
10180+ {
10181+ super();
10182+ eventId = 5;
10183+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
10184+ task = new Core();
10185+ chests = new FastList<L2Spawn>();
10186+ }
10187+
10188+ /**
10189+ * @see net.sf.l2j.gameserver.event.Event#endEvent()
10190+ */
10191+ @Override
10192+ protected void endEvent()
10193+ {
10194+
10195+ setStatus(EventState.END);
10196+ clock.setTime(0);
10197+
10198+ }
10199+
10200+ @Override
10201+ protected String getScorebar()
10202+ {
10203+ return "Max: " + getScore(getPlayerWithMaxScore()) + " Time: " + clock.getTime() + "";
10204+ }
10205+
10206+ @Override
10207+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
10208+ {
10209+ if (npc.getNpcId() != getInt("chestNpcId"))
10210+ return false;
10211+
10212+ if (Rnd.get(3) == 0)
10213+ {
10214+ player.sendPacket(new CreatureSay(npc.getObjectId(), 0, "Chest", "BoOoOoMm!"));
10215+ player.stopAllEffects();
10216+ player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, player);
10217+ EventStats.getInstance().tempTable.get(player.getObjectId())[2] = EventStats.getInstance().tempTable.get(player.getObjectId())[2] + 1;
10218+ addToResurrector(player);
10219+ }
10220+ else
10221+ {
10222+ npc.doDie(npc);
10223+ player.addItem("Event", 6392, 1, player, true);
10224+ increasePlayersScore(player);
10225+ }
10226+
10227+ npc.deleteMe();
10228+ npc.getSpawn().stopRespawn();
10229+ SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), true);
10230+ chests.remove(npc.getSpawn());
10231+
10232+ if (chests.size() == 0)
10233+ clock.setTime(0);
10234+
10235+ return true;
10236+ }
10237+
10238+ @Override
10239+ protected void schedule(int time)
10240+ {
10241+ tpm.scheduleGeneral(task, time);
10242+ }
10243+
10244+ private void setStatus(EventState s)
10245+ {
10246+ eventState = s;
10247+ }
10248+ public boolean onUseMagic(L2Skill skill)
10249+ {
10250+ return false;
10251+ }
10252+
10253+ @Override
10254+ protected void showHtml(L2PcInstance player, int obj)
10255+ {
10256+ if (players.size() > 0)
10257+ {
10258+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
10259+ TextBuilder sb = new TextBuilder();
10260+
10261+ 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>");
10262+ sb.append("<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>");
10263+ sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
10264+ sb.append("<br><table width=270>");
10265+
10266+ for (L2PcInstance p : getPlayersOfTeam(1))
10267+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
10268+
10269+ sb.append("</table></body></html>");
10270+ html.setHtml(sb.toString());
10271+ player.sendPacket(html);
10272+
10273+ }
10274+
10275+ }
10276+
10277+ /* (non-Javadoc)
10278+ * @see net.sf.l2j.gameserver.event.Event#start()
10279+ */
10280+ @Override
10281+ protected void start()
10282+ {
10283+ setStatus(EventState.START);
10284+ schedule(1);
10285+ }
10286+
10287+ private void unSpawnChests()
10288+ {
10289+ for (L2Spawn s : chests)
10290+ {
10291+ s.getLastSpawn().deleteMe();
10292+ s.stopRespawn();
10293+ SpawnTable.getInstance().deleteSpawn(s, true);
10294+ chests.remove(s);
10295+ }
10296+ }
10297+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
10298+ {
10299+ return false;
10300+ }
10301+
10302+}
10303\ No newline at end of file
10304Index: head-src/com/l2jfrozen/gameserver/model/entity/olympiad/Olympiad.java
10305===================================================================
10306--- head-src/com/l2jfrozen/gameserver/model/entity/olympiad/Olympiad.java (revision 1132)
10307+++ head-src/com/l2jfrozen/gameserver/model/entity/olympiad/Olympiad.java (working copy)
10308@@ -48,6 +48,7 @@
10309 import org.apache.log4j.Logger;
10310
10311 import com.l2jfrozen.Config;
10312+import com.l2jfrozen.gameserver.event.EventManager;
10313 import com.l2jfrozen.gameserver.managers.OlympiadStadiaManager;
10314 import com.l2jfrozen.gameserver.model.L2World;
10315 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
10316@@ -425,6 +426,11 @@
10317 noble.sendPacket(sm);
10318 return false;
10319 }
10320+ if (EventManager.getInstance().players.contains(noble))
10321+ {
10322+ noble.sendMessage("You can't join olympiad while participating on an Event.");
10323+ return false;
10324+ }
10325
10326 if (!noble.isNoble())
10327 {
10328@@ -971,12 +977,16 @@
10329 spectator.sendPacket(new SystemMessage(SystemMessageId.WHILE_YOU_ARE_ON_THE_WAITING_LIST_YOU_ARE_NOT_ALLOWED_TO_WATCH_THE_GAME));
10330 return;
10331 }
10332+ if (EventManager.getInstance().players.contains(spectator))
10333+ {
10334+ spectator.sendMessage("You can not observe games while registered for an event!");
10335+ return;
10336+ }
10337 if (spectator.isRegisteredInFunEvent())
10338 {
10339 spectator.sendMessage("You are already registered to an Event");
10340 return;
10341 }
10342-
10343 OlympiadManager.STADIUMS[id].addSpectator(id, spectator, storeCoords);
10344 if (OlympiadManager.getInstance().getOlympiadGame(id) != null)
10345 {
10346Index: head-src/com/l2jfrozen/gameserver/event/VIPTvT.java
10347===================================================================
10348--- head-src/com/l2jfrozen/gameserver/event/VIPTvT.java (nonexistent)
10349+++ head-src/com/l2jfrozen/gameserver/event/VIPTvT.java (working copy)
10350@@ -0,0 +1,207 @@
10351+package com.l2jfrozen.gameserver.event;
10352+
10353+import javolution.text.TextBuilder;
10354+import javolution.util.FastMap;
10355+
10356+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
10357+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
10358+
10359+public class VIPTvT extends Event
10360+{
10361+ private class Core implements Runnable
10362+ {
10363+ public void run()
10364+ {
10365+ try
10366+ {
10367+ switch (eventState)
10368+ {
10369+ case START:
10370+ divideIntoTeams(2);
10371+ preparePlayers();
10372+ teleportToTeamPos();
10373+ createPartyOfTeam(1);
10374+ createPartyOfTeam(2);
10375+ selectNewVipOfTeam(1);
10376+ selectNewVipOfTeam(2);
10377+ forceSitAll();
10378+ setStatus(EventState.FIGHT);
10379+ schedule(20000);
10380+ break;
10381+
10382+ case FIGHT:
10383+ forceStandAll();
10384+ setStatus(EventState.END);
10385+ clock.startClock(getInt("matchTime"));
10386+ break;
10387+
10388+ case END:
10389+ clock.setTime(0);
10390+ if (winnerTeam == 0)
10391+ winnerTeam = getWinnerTeam();
10392+
10393+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
10394+ setStatus(EventState.INACTIVE);
10395+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " VIP kills!");
10396+ break;
10397+ }
10398+ }
10399+ catch (Throwable e)
10400+ {
10401+ e.printStackTrace();
10402+ EventManager.getInstance().end("Error! Event ended.");
10403+ }
10404+
10405+ }
10406+ }
10407+
10408+ private enum EventState
10409+ {
10410+ START, FIGHT, END, TELEPORT, INACTIVE
10411+ }
10412+
10413+ private EventState eventState;
10414+
10415+ private Core task;
10416+
10417+ private FastMap<Integer, L2PcInstance> vips;
10418+
10419+ public VIPTvT()
10420+ {
10421+ super();
10422+ eventId = 8;
10423+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
10424+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
10425+ task = new Core();
10426+ vips = new FastMap<Integer, L2PcInstance>();
10427+ winnerTeam = 0;
10428+ }
10429+
10430+ @Override
10431+ protected void endEvent()
10432+ {
10433+ winnerTeam = players.head().getNext().getValue()[0];
10434+
10435+ setStatus(EventState.END);
10436+ clock.setTime(0);
10437+
10438+ }
10439+
10440+ @Override
10441+ protected String getScorebar()
10442+ {
10443+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
10444+ }
10445+
10446+ @Override
10447+ public void onDie(L2PcInstance victim, L2PcInstance killer)
10448+ {
10449+ super.onDie(victim, killer);
10450+ if (vips.get(1) == victim)
10451+ {
10452+ teams.get(2).increaseScore();
10453+ increasePlayersScore(killer);
10454+ killer.addItem("Event", 6392, 3, killer, true);
10455+ selectNewVipOfTeam(1);
10456+ }
10457+ if (vips.get(2) == victim)
10458+ {
10459+ teams.get(1).increaseScore();
10460+ increasePlayersScore(killer);
10461+ killer.addItem("Event", 6392, 3, killer, true);
10462+ selectNewVipOfTeam(2);
10463+ }
10464+
10465+ addToResurrector(victim);
10466+ }
10467+
10468+ @Override
10469+ protected void schedule(int time)
10470+ {
10471+ tpm.scheduleGeneral(task, time);
10472+ }
10473+
10474+ private void selectNewVipOfTeam(int team)
10475+ {
10476+ if (vips.get(team) != null)
10477+ {
10478+ int[] nameColor = teams.get(getTeam(vips.get(team))).getTeamColor();
10479+ vips.get(team).getAppearance().setNameColor(nameColor[0], nameColor[1], nameColor[2]);
10480+ }
10481+
10482+ L2PcInstance newvip = getRandomPlayerFromTeam(team);
10483+ vips.getEntry(team).setValue(newvip);
10484+ if (team == 1)
10485+ {
10486+ int[] c = getColor("BlueVIP");
10487+ newvip.getAppearance().setNameColor(c[0], c[1], c[2]);
10488+ }
10489+
10490+ if (team == 2)
10491+ {
10492+ int[] c = getColor("RedVIP");
10493+ newvip.getAppearance().setNameColor(c[0], c[1], c[2]);
10494+ }
10495+
10496+ if (!newvip.isDead())
10497+ {
10498+ newvip.setCurrentCp(newvip.getMaxCp());
10499+ newvip.setCurrentMp(newvip.getMaxMp());
10500+ newvip.setCurrentHp(newvip.getMaxHp());
10501+ }
10502+
10503+ newvip.broadcastUserInfo();
10504+
10505+ }
10506+
10507+ private void setStatus(EventState s)
10508+ {
10509+ eventState = s;
10510+ }
10511+
10512+ @Override
10513+ protected void showHtml(L2PcInstance player, int obj)
10514+ {
10515+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
10516+ TextBuilder sb = new TextBuilder();
10517+
10518+ 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>");
10519+ sb.append("<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>");
10520+ sb.append("<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>");
10521+ sb.append("<br><table width=270>");
10522+ int i = 0;
10523+ for (EventTeam team : teams.values())
10524+ {
10525+ i++;
10526+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
10527+ for (L2PcInstance p : getPlayersOfTeam(i))
10528+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
10529+ }
10530+
10531+ sb.append("</table></body></html>");
10532+ html.setHtml(sb.toString());
10533+ player.sendPacket(html);
10534+
10535+ }
10536+
10537+ @Override
10538+ protected void start()
10539+ {
10540+ vips.put(1, null);
10541+ vips.put(2, null);
10542+ setStatus(EventState.START);
10543+ schedule(1);
10544+ }
10545+
10546+ @Override
10547+ public void onLogout(L2PcInstance player)
10548+ {
10549+ super.onLogout(player);
10550+
10551+ if(vips.get(1) == player)
10552+ selectNewVipOfTeam(1);
10553+ if(vips.get(2) == player)
10554+ selectNewVipOfTeam(2);
10555+
10556+ }
10557+}
10558\ No newline at end of file
10559Index: head-src/com/l2jfrozen/gameserver/event/Domination.java
10560===================================================================
10561--- head-src/com/l2jfrozen/gameserver/event/Domination.java (nonexistent)
10562+++ head-src/com/l2jfrozen/gameserver/event/Domination.java (working copy)
10563@@ -0,0 +1,197 @@
10564+package com.l2jfrozen.gameserver.event;
10565+
10566+import javolution.text.TextBuilder;
10567+import javolution.util.FastList;
10568+
10569+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
10570+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
10571+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
10572+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
10573+
10574+public class Domination extends Event
10575+{
10576+ private class Core implements Runnable
10577+ {
10578+ public void run()
10579+ {
10580+ try
10581+ {
10582+ switch (eventState)
10583+ {
10584+ case START:
10585+ divideIntoTeams(2);
10586+ preparePlayers();
10587+ teleportToTeamPos();
10588+ createPartyOfTeam(1);
10589+ createPartyOfTeam(2);
10590+ forceSitAll();
10591+ debug("The event started with " + players.size() + " player");
10592+ setStatus(EventState.FIGHT);
10593+ schedule(20000);
10594+ break;
10595+
10596+ case FIGHT:
10597+ forceStandAll();
10598+ setStatus(EventState.END);
10599+ debug("The event started");
10600+ clock.startClock(getInt("matchTime"));
10601+ break;
10602+
10603+ case END:
10604+ clock.setTime(0);
10605+ if (winnerTeam == 0)
10606+ winnerTeam = getWinnerTeam();
10607+
10608+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
10609+ unSpawnZones();
10610+ setStatus(EventState.INACTIVE);
10611+ debug("The event ended. Winner: " + winnerTeam);
10612+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Domination points!");
10613+ break;
10614+ }
10615+ }
10616+ catch (Throwable e)
10617+ {
10618+ e.printStackTrace();
10619+ EventManager.getInstance().end("Error! Event ended.");
10620+ }
10621+ }
10622+ }
10623+
10624+ private enum EventState
10625+ {
10626+ START, FIGHT, END, INACTIVE
10627+ }
10628+
10629+ private EventState eventState;
10630+
10631+ private Core task;
10632+
10633+ private FastList<L2Spawn> zones;
10634+
10635+ public Domination()
10636+ {
10637+ super();
10638+ eventId = 2;
10639+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
10640+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
10641+ task = new Core();
10642+ zones = new FastList<L2Spawn>();
10643+ winnerTeam = 0;
10644+ }
10645+
10646+ @Override
10647+ protected void clockTick()
10648+ {
10649+ int team1 = 0;
10650+ int team2 = 0;
10651+
10652+ for (L2PcInstance player : getPlayerList())
10653+ switch (getTeam(player))
10654+ {
10655+ case 1:
10656+ if (Math.sqrt(player.getPlanDistanceSq(zones.getFirst().getLastSpawn())) <= getInt("zoneRadius"))
10657+ team1++;
10658+ break;
10659+
10660+ case 2:
10661+ if (Math.sqrt(player.getPlanDistanceSq(zones.getFirst().getLastSpawn())) <= getInt("zoneRadius"))
10662+ team2++;
10663+ break;
10664+ }
10665+
10666+ if (team1 > team2)
10667+ {
10668+ for (L2PcInstance player : getPlayersOfTeam(1))
10669+ increasePlayersScore(player);
10670+ teams.get(1).increaseScore();
10671+ }
10672+
10673+ if (team2 > team1)
10674+ {
10675+ for (L2PcInstance player : getPlayersOfTeam(2))
10676+ increasePlayersScore(player);
10677+ teams.get(2).increaseScore();
10678+ }
10679+
10680+ }
10681+
10682+ @Override
10683+ protected void endEvent()
10684+ {
10685+ setStatus(EventState.END);
10686+ clock.setTime(0);
10687+
10688+ }
10689+
10690+ @Override
10691+ protected String getScorebar()
10692+ {
10693+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
10694+ }
10695+
10696+ @Override
10697+ public void onDie(L2PcInstance victim, L2PcInstance killer)
10698+ {
10699+ super.onDie(victim, killer);
10700+ killer.addItem("Event", 6392, 1, killer, true);
10701+ addToResurrector(victim);
10702+ }
10703+
10704+ @Override
10705+ protected void schedule(int time)
10706+ {
10707+ tpm.scheduleGeneral(task, time);
10708+ }
10709+
10710+ private void setStatus(EventState s)
10711+ {
10712+ eventState = s;
10713+ }
10714+
10715+ @Override
10716+ protected void showHtml(L2PcInstance player, int obj)
10717+ {
10718+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
10719+ TextBuilder sb = new TextBuilder();
10720+
10721+ 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>");
10722+ sb.append("<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>");
10723+ sb.append("<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>");
10724+ sb.append("<br><table width=270>");
10725+ int i = 0;
10726+ for (EventTeam team : teams.values())
10727+ {
10728+ i++;
10729+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
10730+ for (L2PcInstance p : getPlayersOfTeam(i))
10731+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
10732+ }
10733+
10734+ sb.append("</table></body></html>");
10735+ html.setHtml(sb.toString());
10736+ player.sendPacket(html);
10737+
10738+ }
10739+
10740+ @Override
10741+ protected void start()
10742+ {
10743+ int[] npcpos = getPosition("Zone", 1);
10744+ zones.add(spawnNPC(npcpos[0], npcpos[1], npcpos[2], getInt("zoneNpcId")));
10745+ setStatus(EventState.START);
10746+ schedule(1);
10747+ }
10748+
10749+ private void unSpawnZones()
10750+ {
10751+ for (L2Spawn s : zones)
10752+ {
10753+ s.getLastSpawn().deleteMe();
10754+ s.stopRespawn();
10755+ SpawnTable.getInstance().deleteSpawn(s, true);
10756+ zones.remove(s);
10757+ }
10758+ }
10759+
10760+}
10761\ No newline at end of file
10762Index: head-src/com/l2jfrozen/gameserver/event/EventManager.java
10763===================================================================
10764--- head-src/com/l2jfrozen/gameserver/event/EventManager.java (nonexistent)
10765+++ head-src/com/l2jfrozen/gameserver/event/EventManager.java (working copy)
10766@@ -0,0 +1,727 @@
10767+package com.l2jfrozen.gameserver.event;
10768+
10769+import java.io.FileWriter;
10770+import java.io.IOException;
10771+import java.text.SimpleDateFormat;
10772+import java.util.Date;
10773+import java.util.Map;
10774+import java.util.Random;
10775+
10776+import javolution.text.TextBuilder;
10777+import javolution.util.FastList;
10778+import javolution.util.FastMap;
10779+
10780+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
10781+import com.l2jfrozen.gameserver.model.L2Character;
10782+import com.l2jfrozen.gameserver.model.L2Party;
10783+import com.l2jfrozen.gameserver.model.L2World;
10784+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
10785+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
10786+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
10787+import com.l2jfrozen.gameserver.util.Broadcast;
10788+
10789+public final class EventManager
10790+{
10791+
10792+ private class Countdown implements Runnable
10793+ {
10794+ protected String getTime()
10795+ {
10796+ String mins = "" + counter / 60;
10797+ String secs = (counter % 60 < 10 ? "0" + counter % 60 : "" + counter % 60);
10798+ return "" + mins + ":" + secs + "";
10799+ }
10800+
10801+ @SuppressWarnings("synthetic-access")
10802+ public void run()
10803+ {
10804+ if (status == State.REGISTERING)
10805+
10806+ switch (counter)
10807+ {
10808+ case 300:
10809+ case 240:
10810+ case 180:
10811+ case 120:
10812+ case 60:
10813+ announce("" + counter / 60 + " min(s) left to register, " + getCurrentEvent().getString("eventName"));
10814+ break;
10815+ case 30:
10816+ case 10:
10817+ announce("" + counter + " seconds left to register!");
10818+ break;
10819+ }
10820+
10821+ if (status == State.VOTING)
10822+ if (counter == getInt("showVotePopupAt") && getBoolean("votePopupEnabled"))
10823+ {
10824+ NpcHtmlMessage html = new NpcHtmlMessage(0);
10825+ TextBuilder sb = new TextBuilder();
10826+ int count = 0;
10827+
10828+ 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>");
10829+
10830+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>Voting</td><td width=130><center>Time left: " + cdtask.getTime() + "</td><td width=70>Votes: " + votes.size() + "</td></tr></table><br>");
10831+
10832+ for (Map.Entry<Integer, Event> event : events.entrySet())
10833+ {
10834+ count++;
10835+ sb.append("<center><table width=270 " + (count % 2 == 1 ? "" : "bgcolor=5A5A5A") + "><tr><td width=180>" + event.getValue().getString("eventName") + "</td><td width=30>Info</td><td width=30>");
10836+ sb.append("<a action=\"bypass -h eventvote " + event.getKey() + "\">Vote</a>");
10837+ sb.append("</td><td width=30><center>" + getVoteCount(event.getKey()) + "</td></tr></table>");
10838+ }
10839+
10840+ sb.append("</body></html>");
10841+ html.setHtml(sb.toString());
10842+
10843+ for (L2PcInstance player : L2World.getInstance().getAllPlayers())
10844+ {
10845+ if (votes.containsKey(player) || player.getLevel() < 40)
10846+ continue;
10847+
10848+ player.sendPacket(html);
10849+ }
10850+ }
10851+
10852+ if (counter == 0)
10853+ schedule(1);
10854+ else
10855+ {
10856+ counter--;
10857+ tpm.scheduleGeneral(cdtask, 1000);
10858+ }
10859+
10860+ }
10861+ }
10862+
10863+ private class Scheduler implements Runnable
10864+ {
10865+ @SuppressWarnings("synthetic-access")
10866+ public void run()
10867+ {
10868+ switch (status)
10869+ {
10870+ case VOTING:
10871+ if (votes.size() > 0)
10872+ setCurrentEvent(getVoteWinner());
10873+ else
10874+ setCurrentEvent(eventIds.get(rnd.nextInt(eventIds.size())));
10875+
10876+ announce("The next event will be: " + getCurrentEvent().getString("eventName"));
10877+ announce("Registering phase started! You have " + getInt("registerTime") / 60 + " mins to register!");
10878+ announce("Event joinable in giran.");
10879+ setStatus(State.REGISTERING);
10880+ debug("Registering phase started.");
10881+ counter = getInt("registerTime") - 1;
10882+ tpm.scheduleGeneral(cdtask, 1);
10883+ break;
10884+
10885+ case REGISTERING:
10886+ announce("Registering phase ended!");
10887+ debug("Registering phase ended.");
10888+ if (countOfRegistered() < getCurrentEvent().getInt("minPlayers"))
10889+ {
10890+ debug("Lack of participants.");
10891+ announce("Theres not enough participants! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
10892+ players.clear();
10893+ colors.clear();
10894+ positions.clear();
10895+ setStatus(State.VOTING);
10896+ counter = getInt("betweenEventsTime") - 1;
10897+ tpm.scheduleGeneral(cdtask, 1);
10898+ }
10899+ else
10900+ {
10901+ debug("Event starts.");
10902+ announce("Event started!");
10903+ setStatus(State.RUNNING);
10904+ msgToAll("You'll be teleported to the event in 10 secs");
10905+ schedule(10000);
10906+ }
10907+ break;
10908+
10909+ case RUNNING:
10910+ getCurrentEvent().start();
10911+
10912+ for (L2PcInstance player : players)
10913+ EventStats.getInstance().tempTable.put(player.getObjectId(), new int[] { 0, 0, 0, 0 });
10914+
10915+ break;
10916+
10917+ case TELE_BACK:
10918+ msgToAll("You'll be teleported back in 10 secs");
10919+ setStatus(State.END);
10920+ debug("Teleporting back.");
10921+ schedule(10000);
10922+ break;
10923+
10924+ case END:
10925+ teleBackEveryone();
10926+ if (getBoolean("statTrackingEnabled"))
10927+ {
10928+ EventStats.getInstance().applyChanges();
10929+ EventStats.getInstance().tempTable.clear();
10930+ EventStats.getInstance().updateSQL(getCurrentEvent().getPlayerList(), getCurrentEvent().eventId);
10931+ }
10932+ getCurrentEvent().reset();
10933+ setCurrentEvent(0);
10934+ players.clear();
10935+ colors.clear();
10936+ positions.clear();
10937+ titles.clear();
10938+ announce("Event ended! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
10939+ setStatus(State.VOTING);
10940+ counter = getInt("betweenEventsTime") - 1;
10941+ debug("Event ended.");
10942+ tpm.scheduleGeneral(cdtask, 1);
10943+ break;
10944+
10945+ }
10946+ }
10947+ }
10948+
10949+ @SuppressWarnings("synthetic-access")
10950+ private static class SingletonHolder
10951+ {
10952+ protected static final EventManager _instance = new EventManager();
10953+ }
10954+
10955+ // Manager Statuses
10956+ protected enum State
10957+ {
10958+ REGISTERING, VOTING, RUNNING, TELE_BACK, END
10959+ }
10960+
10961+ public static EventManager getInstance()
10962+ {
10963+ return SingletonHolder._instance;
10964+ }
10965+
10966+ private EventConfig config;
10967+ // Event instances
10968+ public FastMap<Integer, Event> events;
10969+
10970+ // The list of registered players
10971+ public FastList<L2PcInstance> players;
10972+
10973+ // The current event
10974+ private Event current;
10975+
10976+ // Original name colors
10977+ private FastMap<L2PcInstance, Integer> colors;
10978+
10979+ //Original titles
10980+ protected FastMap<L2PcInstance, String> titles;
10981+
10982+ //Original positions
10983+ protected FastMap<L2PcInstance, int[]> positions;
10984+
10985+ // Votes for the events
10986+ private FastMap<L2PcInstance, Integer> votes;
10987+
10988+ private State status;
10989+
10990+ private int counter;
10991+
10992+ private Countdown cdtask;
10993+
10994+ // NPC location
10995+ public static int[] npcPos = { 82698, 148638, -3473 };
10996+
10997+ // Threadpoolmanager
10998+ private ThreadPoolManager tpm;
10999+
11000+ // Scheduler
11001+ private Scheduler task;
11002+
11003+ private Random rnd = new Random();
11004+
11005+ private FileWriter writer;
11006+
11007+ private FastList<Integer> eventIds;
11008+
11009+ private static final SimpleDateFormat _formatter = new SimpleDateFormat("dd/MM/yyyy H:mm:ss");
11010+
11011+ public EventManager()
11012+ {
11013+ config = EventConfig.getInstance();
11014+
11015+ events = new FastMap<Integer, Event>();
11016+ players = new FastList<L2PcInstance>();
11017+ votes = new FastMap<L2PcInstance, Integer>();
11018+ titles = new FastMap<L2PcInstance, String>();
11019+ colors = new FastMap<L2PcInstance, Integer>();
11020+ positions = new FastMap<L2PcInstance, int[]>();
11021+ eventIds = new FastList<Integer>();
11022+ status = State.VOTING;
11023+ tpm = ThreadPoolManager.getInstance();
11024+ task = new Scheduler();
11025+ cdtask = new Countdown();
11026+ counter = 0;
11027+
11028+ // Add the events to the list
11029+ events.put(1, new dm());
11030+ events.put(2, new Domination());
11031+ events.put(3, new DoubleDomination());
11032+ events.put(4, new LMS());
11033+ events.put(5, new Lucky());
11034+ events.put(6, new Simon());
11035+ events.put(7, new TvT());
11036+ events.put(8, new VIPTvT());
11037+ events.put(9, new Zombie());
11038+ events.put(10, new CTF());
11039+ events.put(11, new Russian());
11040+ events.put(12, new Bomb());
11041+ events.put(13, new Mutant());
11042+ events.put(14, new Battlefield());
11043+
11044+ for(int eventId : events.keySet())
11045+ eventIds.add(eventId);
11046+
11047+ debug(events.size() + " event imported.");
11048+
11049+ // Start the scheduler
11050+ counter = getInt("firstAfterStartTime") - 1;
11051+ tpm.scheduleGeneral(cdtask, 1);
11052+
11053+ System.out.println("Event Engine Started");
11054+ }
11055+
11056+ public boolean addVote(L2PcInstance player, int eventId)
11057+ {
11058+ if (getStatus() != State.VOTING)
11059+ {
11060+ player.sendMessage("You cant vote now!");
11061+ return false;
11062+ }
11063+ if (votes.containsKey(player))
11064+ {
11065+ player.sendMessage("You already voted for an event!");
11066+ return false;
11067+ }
11068+ if (player.getLevel() < 40)
11069+ {
11070+ player.sendMessage("Your level is too low to vote for events!");
11071+ return false;
11072+ }
11073+ else
11074+ {
11075+ player.sendMessage("You succesfully voted for the event");
11076+ votes.put(player, eventId);
11077+ return true;
11078+ }
11079+ }
11080+
11081+ private void announce(String text)
11082+ {
11083+ Broadcast.toAllOnlinePlayers(new CreatureSay(0, 18, "", "[Event] " + text));
11084+ }
11085+
11086+ private boolean canRegister(L2PcInstance player)
11087+ {
11088+ if (players.contains(player))
11089+ {
11090+ player.sendMessage("You already registered to the event!");
11091+ return false;
11092+ }
11093+
11094+ if (player.isInJail())
11095+ {
11096+ player.sendMessage("You cant register from the jail.");
11097+ return false;
11098+ }
11099+
11100+ if (player.isInOlympiadMode())
11101+ {
11102+ player.sendMessage("You cant register while youre in the olympiad.");
11103+ return false;
11104+ }
11105+
11106+ if (player.getLevel() > getCurrentEvent().getInt("maxLvl"))
11107+ {
11108+ player.sendMessage("Youre greater than the max allowed lvl.");
11109+ return false;
11110+ }
11111+
11112+ if (player.getLevel() < getCurrentEvent().getInt("minLvl"))
11113+ {
11114+ player.sendMessage("Youre lower than the min allowed lvl.");
11115+ return false;
11116+ }
11117+
11118+ if (player.getKarma() > 0)
11119+ {
11120+ player.sendMessage("You cant register if you have karma.");
11121+ return false;
11122+ }
11123+
11124+ if (player.isCursedWeaponEquiped())
11125+ {
11126+ player.sendMessage("You cant register with a cursed weapon.");
11127+ return false;
11128+ }
11129+
11130+ if (player.isDead())
11131+ {
11132+ player.sendMessage("You cant register while youre dead.");
11133+ return false;
11134+ }
11135+
11136+ return true;
11137+ } /*
11138+ * If theres a running event and
11139+ */
11140+
11141+ public boolean canTargetPlayer(L2PcInstance target, L2PcInstance self)
11142+ {
11143+ if (getStatus() == State.RUNNING)
11144+ {
11145+ if ((isRegistered(target) && isRegistered(self)) || (!isRegistered(target) && !isRegistered(self)))
11146+ return true;
11147+ else
11148+ return false;
11149+ }
11150+ else
11151+ return true;
11152+ }
11153+
11154+ protected int countOfRegistered()
11155+ {
11156+ return players.size();
11157+ }
11158+
11159+ protected void debug(String message)
11160+ {
11161+ if (!getBoolean("debug"))
11162+ return;
11163+
11164+ String today = _formatter.format(new Date());
11165+
11166+ try
11167+ {
11168+ writer = new FileWriter("log/EventEngine.log", true);
11169+ writer.write(today + " - " + message + "\r\n");
11170+ }
11171+ catch (IOException e)
11172+ {
11173+
11174+ }
11175+ finally
11176+ {
11177+ try
11178+ {
11179+ writer.close();
11180+ }
11181+ catch (Exception e)
11182+ {
11183+ }
11184+ }
11185+ }
11186+
11187+ protected void end(String text)
11188+ {
11189+ announce(text);
11190+ status = State.TELE_BACK;
11191+ schedule(1);
11192+ }
11193+
11194+ public boolean getBoolean(String propName)
11195+ {
11196+ return config.getBoolean(0, propName);
11197+ }
11198+
11199+ public Event getCurrentEvent()
11200+ {
11201+ return current;
11202+ }
11203+
11204+ public FastList<String> getEventNames()
11205+ {
11206+ FastList<String> map = new FastList<String>();
11207+ for (Event event : events.values())
11208+ map.add(event.getString("eventName"));
11209+ return map;
11210+ }
11211+
11212+ public int getInt(String propName)
11213+ {
11214+ return config.getInt(0, propName);
11215+ }
11216+
11217+ protected int[] getPosition(String owner, int num)
11218+ {
11219+ return config.getPosition(0, owner, num);
11220+ }
11221+
11222+ public FastList<Integer> getRestriction(String type)
11223+ {
11224+ return config.getRestriction(0, type);
11225+ }
11226+
11227+ private State getStatus()
11228+ {
11229+ return status;
11230+ }
11231+
11232+ protected String getString(String propName)
11233+ {
11234+ return config.getString(0, propName);
11235+ }
11236+
11237+ private int getVoteCount(int event)
11238+ {
11239+ int count = 0;
11240+ for (int e : votes.values())
11241+ if (e == event)
11242+ count++;
11243+
11244+ return count;
11245+ }
11246+
11247+ private int getVoteWinner()
11248+ {
11249+ int old = 0;
11250+ FastMap<Integer, Integer> temp = new FastMap<Integer, Integer>();
11251+
11252+ for (int vote : votes.values())
11253+ if (!temp.containsKey(vote))
11254+ temp.put(vote, 1);
11255+ else
11256+ {
11257+ old = temp.get(vote);
11258+ old++;
11259+ temp.getEntry(vote).setValue(old);
11260+ }
11261+
11262+ int max = temp.head().getNext().getValue();
11263+ int result = temp.head().getNext().getKey();
11264+
11265+ for (Map.Entry<Integer, Integer> entry : temp.entrySet())
11266+ if (entry.getValue() > max)
11267+ {
11268+ max = entry.getValue();
11269+ result = entry.getKey();
11270+ }
11271+
11272+ votes.clear();
11273+ temp = null;
11274+ return result;
11275+
11276+ }
11277+
11278+ public boolean isRegistered(L2PcInstance player)
11279+ {
11280+ if (getCurrentEvent() != null)
11281+ return getCurrentEvent().players.containsKey(player);
11282+ else
11283+ return false;
11284+ }
11285+
11286+ public boolean isRegistered(L2Character player)
11287+ {
11288+ if (getCurrentEvent() != null)
11289+ return getCurrentEvent().players.containsKey(player);
11290+ else
11291+ return false;
11292+ }
11293+
11294+ public boolean isRunning()
11295+ {
11296+ if (getStatus() == State.RUNNING)
11297+ return true;
11298+ else
11299+ return false;
11300+ }
11301+
11302+ private void msgToAll(String text)
11303+ {
11304+ for (L2PcInstance player : players)
11305+ player.sendMessage(text);
11306+ }
11307+
11308+ public void onLogout(L2PcInstance player)
11309+ {
11310+ if (votes.containsKey(player))
11311+ votes.remove(player);
11312+ if (players.contains(player))
11313+ {
11314+ players.remove(player);
11315+ colors.remove(player);
11316+ titles.remove(player);
11317+ positions.remove(player);
11318+ }
11319+ }
11320+
11321+ public boolean registerPlayer(L2PcInstance player)
11322+ {
11323+ if (getStatus() != State.REGISTERING)
11324+ {
11325+ player.sendMessage("You can't register now!");
11326+ return false;
11327+ }
11328+
11329+ if(getBoolean("eventBufferEnabled"))
11330+ if (!EventBuffer.getInstance().playerHaveTemplate(player))
11331+ {
11332+ player.sendMessage("You have to set a buff template first!");
11333+ EventBuffer.getInstance().showHtml(player);
11334+ return false;
11335+ }
11336+
11337+ if (canRegister(player))
11338+ {
11339+ player.sendMessage("You succesfully registered to the event!");
11340+ players.add(player);
11341+ titles.put(player, player.getTitle());
11342+ colors.put(player, player.getAppearance().getNameColor());
11343+ positions.put(player, new int[] { player.getX(), player.getY(), player.getZ() });
11344+ return true;
11345+ }
11346+ else
11347+ {
11348+ player.sendMessage("You failed on registering to the event!");
11349+ return false;
11350+ }
11351+ }
11352+
11353+ protected void schedule(int time)
11354+ {
11355+ tpm.scheduleGeneral(task, time);
11356+ }
11357+
11358+ private void setCurrentEvent(int eventId)
11359+ {
11360+ if (eventId == 0)
11361+ current = null;
11362+ else
11363+ current = events.get(eventId);
11364+
11365+ debug("Changed current event to: " + (current == null ? "null" : current.getString("eventName")));
11366+ }
11367+
11368+ protected void setStatus(State s)
11369+ {
11370+ status = s;
11371+ }
11372+
11373+ public void showFirstHtml(L2PcInstance player, int obj)
11374+ {
11375+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
11376+ TextBuilder sb = new TextBuilder();
11377+ int count = 0;
11378+
11379+ sb.append("<html><body><table width=270><tr><td width=130>Event Engine </td><td width=70>"+(getBoolean("eventBufferEnabled") ? "<a action=\"bypass -h eventbuffershow\">Buffer</a>" : "")+"</td><td width=70><a action=\"bypass -h eventstats 1\">Statistics</a></td></tr></table><br>");
11380+
11381+ if (getStatus() == State.VOTING)
11382+ {
11383+
11384+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>Events</td><td width=130><center>Time left: " + cdtask.getTime() + "</td>"+/*<td width=70>Votes: " + votes.size() + "</td>*/"</tr></table><br>");
11385+
11386+ for (Map.Entry<Integer, Event> event : events.entrySet())
11387+ {
11388+ count++;
11389+ 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>*/);
11390+
11391+ /*if (!votes.containsKey(player))
11392+ sb.append("<a action=\"bypass -h npc_" + obj + "_" + event.getKey() + "\">Vote</a>");
11393+ else
11394+ sb.append("Vote");*/
11395+
11396+ sb.append(/*</td><td width=30><center>" + getVoteCount(event.getKey()) + "</td>*/"</tr></table>");
11397+ }
11398+ sb.append("</body></html>");
11399+ html.setHtml(sb.toString());
11400+ player.sendPacket(html);
11401+ }
11402+
11403+ if (getStatus() == State.REGISTERING)
11404+ {
11405+
11406+ sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>");
11407+ if (players.contains(player))
11408+ sb.append("<a action=\"bypass -h npc_" + obj + "_unreg\">Unregister</a>");
11409+ else
11410+ sb.append("<a action=\"bypass -h npc_" + obj + "_reg\">Register</a>");
11411+
11412+ 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>");
11413+
11414+ for (L2PcInstance p : EventManager.getInstance().players)
11415+ {
11416+ count++;
11417+ 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>");
11418+ }
11419+
11420+ sb.append("</body></html>");
11421+ html.setHtml(sb.toString());
11422+ player.sendPacket(html);
11423+ }
11424+ if (getStatus() == State.RUNNING)
11425+ getCurrentEvent().showHtml(player, obj);
11426+
11427+ }
11428+
11429+ private void teleBackEveryone()
11430+ {
11431+ for (L2PcInstance player : getCurrentEvent().getPlayerList())
11432+ {
11433+ if(player.getPoly().isMorphed())
11434+ {
11435+ player.getPoly().setPolyInfo(null, "1");
11436+ player.decayMe();
11437+ player.spawnMe(player.getX(),player.getY(),player.getZ());
11438+ }
11439+ player.teleToLocation(positions.get(player)[0], positions.get(player)[1], positions.get(player)[2]);
11440+ player.getAppearance().setNameColor(colors.get(player));
11441+ player.setTitle(titles.get(player));
11442+ if (player.getParty() != null)
11443+ {
11444+ L2Party party = player.getParty();
11445+ party.removePartyMember(player);
11446+ }
11447+
11448+ player.broadcastUserInfo();
11449+ if (player.isDead())
11450+ player.doRevive();
11451+ }
11452+
11453+ }
11454+
11455+ public boolean unregisterPlayer(L2PcInstance player)
11456+ {
11457+ if (!players.contains(player))
11458+ {
11459+ player.sendMessage("You're not registered to the event!");
11460+ return false;
11461+ }
11462+ if (getStatus() != State.REGISTERING)
11463+ {
11464+ player.sendMessage("You can't unregister now!");
11465+ return false;
11466+ }
11467+ else
11468+ {
11469+ player.sendMessage("You succesfully unregistered from the event!");
11470+ players.remove(player);
11471+ colors.remove(player);
11472+ positions.remove(player);
11473+ return true;
11474+ }
11475+ }
11476+
11477+ public boolean areTeammates(L2PcInstance player, L2PcInstance target)
11478+ {
11479+ if(getCurrentEvent() == null)
11480+ return false;
11481+
11482+ if(getCurrentEvent().numberOfTeams() == 1)
11483+ return false;
11484+
11485+ if(getCurrentEvent().numberOfTeams() > 1)
11486+ if(getCurrentEvent().getTeam(player) == getCurrentEvent().getTeam(target))
11487+ return true;
11488+ else
11489+ return false;
11490+
11491+ return false;
11492+ }
11493+}
11494\ No newline at end of file
11495Index: head-src/com/l2jfrozen/gameserver/model/L2Skill.java
11496===================================================================
11497--- head-src/com/l2jfrozen/gameserver/model/L2Skill.java (revision 1132)
11498+++ head-src/com/l2jfrozen/gameserver/model/L2Skill.java (working copy)
11499@@ -33,6 +33,7 @@
11500 import com.l2jfrozen.gameserver.datatables.HeroSkillTable;
11501 import com.l2jfrozen.gameserver.datatables.SkillTable;
11502 import com.l2jfrozen.gameserver.datatables.sql.SkillTreeTable;
11503+import com.l2jfrozen.gameserver.event.EventManager;
11504 import com.l2jfrozen.gameserver.geo.GeoData;
11505 import com.l2jfrozen.gameserver.managers.SiegeManager;
11506 import com.l2jfrozen.gameserver.model.actor.instance.L2ArtefactInstance;
11507@@ -264,6 +265,8 @@
11508 COREDONE,
11509 ZAKENPLAYER,
11510 ZAKENSELF,
11511+ BOMB,
11512+ CAPTURE,
11513
11514 // unimplemented
11515 NOTDONE;
11516@@ -2009,6 +2012,20 @@
11517 }
11518 }
11519
11520+ if (obj instanceof L2PcInstance && activeChar instanceof L2PcInstance)
11521+ if(EventManager.getInstance().getCurrentEvent().numberOfTeams() > 1 &&
11522+ EventManager.getInstance().isRegistered((L2PcInstance)activeChar) &&
11523+ EventManager.getInstance().isRegistered((L2PcInstance)obj) &&
11524+ EventManager.getInstance().getCurrentEvent().getTeam((L2PcInstance)obj) == EventManager.getInstance().getCurrentEvent().getTeam((L2PcInstance)activeChar))
11525+ continue;
11526+
11527+ if (obj instanceof L2Summon && activeChar instanceof L2PcInstance)
11528+ if(EventManager.getInstance().getCurrentEvent().numberOfTeams() > 1 &&
11529+ EventManager.getInstance().isRegistered((L2PcInstance)activeChar) &&
11530+ EventManager.getInstance().isRegistered(((L2Summon)obj).getOwner()) &&
11531+ EventManager.getInstance().getCurrentEvent().getTeam(((L2Summon)obj).getOwner()) == EventManager.getInstance().getCurrentEvent().getTeam((L2PcInstance)activeChar))
11532+ continue;
11533+
11534 targetList.add((L2Character) obj);
11535 }
11536 }
11537Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestJoinParty.java
11538===================================================================
11539--- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestJoinParty.java (revision 1132)
11540+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestJoinParty.java (working copy)
11541@@ -23,6 +23,8 @@
11542 import org.apache.log4j.Logger;
11543
11544 import com.l2jfrozen.Config;
11545+import com.l2jfrozen.gameserver.event.EventManager;
11546+import com.l2jfrozen.gameserver.event.LMS;
11547 import com.l2jfrozen.gameserver.model.L2Party;
11548 import com.l2jfrozen.gameserver.model.L2World;
11549 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
11550@@ -39,6 +41,7 @@
11551
11552 private String _name;
11553 private int _itemDistribution;
11554+ private boolean _isInLMS;
11555
11556 @Override
11557 protected void readImpl()
11558@@ -52,10 +55,15 @@
11559 {
11560 final L2PcInstance requestor = getClient().getActiveChar();
11561 final L2PcInstance target = L2World.getInstance().getPlayer(_name);
11562+ _isInLMS = EventManager.getInstance().isRegistered(requestor) && EventManager.getInstance().getCurrentEvent() instanceof LMS;
11563
11564 if (requestor == null)
11565 return;
11566-
11567+ if (_isInLMS)
11568+ {
11569+ requestor.sendMessage("You cannot make party in LMS");
11570+ return;
11571+ }
11572 if (!getClient().getFloodProtectors().getPartyInvitation().tryPerformAction("PartyInvitation"))
11573 {
11574 requestor.sendMessage("You Cannot Invite into Party So Fast!");
11575Index: head-src/com/l2jfrozen/gameserver/event/Event.java
11576===================================================================
11577--- head-src/com/l2jfrozen/gameserver/event/Event.java (nonexistent)
11578+++ head-src/com/l2jfrozen/gameserver/event/Event.java (working copy)
11579@@ -0,0 +1,696 @@
11580+package com.l2jfrozen.gameserver.event;
11581+
11582+import java.util.Set;
11583+
11584+import javolution.util.FastList;
11585+import javolution.util.FastMap;
11586+
11587+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
11588+import com.l2jfrozen.gameserver.datatables.SkillTable;
11589+import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
11590+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
11591+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
11592+import com.l2jfrozen.gameserver.model.L2Object;
11593+import com.l2jfrozen.gameserver.model.L2Party;
11594+import com.l2jfrozen.gameserver.model.L2Skill;
11595+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
11596+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
11597+import com.l2jfrozen.gameserver.model.L2Summon;
11598+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
11599+import com.l2jfrozen.gameserver.model.actor.instance.L2PetInstance;
11600+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
11601+import com.l2jfrozen.gameserver.network.serverpackets.ExShowScreenMessage;
11602+import com.l2jfrozen.gameserver.network.serverpackets.Ride;
11603+import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
11604+import com.l2jfrozen.gameserver.templates.L2EtcItemType;
11605+import com.l2jfrozen.gameserver.util.Broadcast;
11606+import com.l2jfrozen.util.random.Rnd;
11607+
11608+/**
11609+ * @author Rizel
11610+ *
11611+ */
11612+public abstract class Event
11613+{
11614+ protected class Clock implements Runnable
11615+ {
11616+ protected String getTime()
11617+ {
11618+ String mins = "" + time / 60;
11619+ String secs = (time % 60 < 10 ? "0" + time % 60 : "" + time % 60);
11620+ return "" + mins + ":" + secs + "";
11621+ }
11622+
11623+ public void run()
11624+ {
11625+ clockTick();
11626+ scorebartext = getScorebar();
11627+ for (L2PcInstance player : getPlayerList())
11628+ player.sendPacket(new ExShowScreenMessage(1, -1, 2, false, 1, 0, 0, false, 2000, false, scorebartext));
11629+
11630+ if (time <= 0)
11631+ schedule(1);
11632+ else
11633+ {
11634+ time--;
11635+ tpm.scheduleGeneral(clock, 1000);
11636+ }
11637+ }
11638+
11639+ protected void setTime(int t)
11640+ {
11641+ time = t;
11642+ }
11643+
11644+ protected void startClock(int mt)
11645+ {
11646+ time = mt;
11647+ tpm.scheduleGeneral(clock, 1);
11648+ }
11649+ }
11650+
11651+ protected class ResurrectorTask implements Runnable
11652+ {
11653+ private L2PcInstance player;
11654+
11655+ public ResurrectorTask(L2PcInstance p)
11656+ {
11657+ player = p;
11658+ ThreadPoolManager.getInstance().scheduleGeneral(this, 7000);
11659+ debug("Resurrector task created: " + player.getName());
11660+ }
11661+
11662+ public void run()
11663+ {
11664+ if (EventManager.getInstance().isRegistered(player))
11665+ {
11666+ debug("Resurrector task executed: " + player.getName());
11667+ player.doRevive();
11668+
11669+ if(EventManager.getInstance().getBoolean("eventBufferEnabled"))
11670+ EventBuffer.getInstance().buffPlayer(player);
11671+
11672+ player.setCurrentCp(player.getMaxCp());
11673+ player.setCurrentHp(player.getMaxHp());
11674+ player.setCurrentMp(player.getMaxMp());
11675+ teleportToTeamPos(player);
11676+ }
11677+
11678+ }
11679+ }
11680+
11681+ protected int eventId;
11682+
11683+ //Config
11684+ protected EventConfig config = EventConfig.getInstance();
11685+
11686+ protected static int[] startpos = EventManager.npcPos;
11687+
11688+ protected FastMap<Integer, EventTeam> teams;
11689+
11690+ //TEAM-STATUS-SCORE
11691+ protected FastMap<L2PcInstance, int[]> players;
11692+
11693+ protected ThreadPoolManager tpm;
11694+
11695+ protected ResurrectorTask resurrectorTask;
11696+
11697+ private String scorebartext;
11698+
11699+ protected Clock clock;
11700+
11701+ protected int time;
11702+
11703+ protected int winnerTeam;
11704+
11705+ protected int loserTeam;
11706+
11707+ public Event()
11708+ {
11709+ teams = new FastMap<Integer, EventTeam>();
11710+ clock = new Clock();
11711+ tpm = ThreadPoolManager.getInstance();
11712+ players = new FastMap<L2PcInstance, int[]>();
11713+ time = 0;
11714+ }
11715+
11716+ protected void addToResurrector(L2PcInstance player)
11717+ {
11718+ new ResurrectorTask(player);
11719+ }
11720+
11721+ protected void announce(Set<L2PcInstance> list, String text)
11722+ {
11723+ for (L2PcInstance player : list)
11724+ player.sendPacket(new CreatureSay(0, 18, "", "[Event] " + text));
11725+ }
11726+
11727+ public boolean canAttack(L2PcInstance player, L2Object target)
11728+ {
11729+ return true;
11730+ }
11731+
11732+ protected void clockTick()
11733+ {
11734+
11735+ }
11736+
11737+ protected int countOfPositiveStatus()
11738+ {
11739+ int count = 0;
11740+ for (L2PcInstance player : getPlayerList())
11741+ if (getStatus(player) >= 0)
11742+ count++;
11743+
11744+ return count;
11745+ }
11746+
11747+ protected void createNewTeam(int id, String name, int[] color, int[] startPos)
11748+ {
11749+ teams.put(id, new EventTeam(id, name, color, startPos));
11750+ }
11751+
11752+ protected void createPartyOfTeam(int teamId)
11753+ {
11754+ int count = 0;
11755+ L2Party party = null;
11756+
11757+ FastList<L2PcInstance> list = new FastList<L2PcInstance>();
11758+
11759+ for (L2PcInstance p : players.keySet())
11760+ if (getTeam(p) == teamId)
11761+ list.add(p);
11762+
11763+ for (L2PcInstance player : list)
11764+ {
11765+ if (count % 9 == 0 && list.size() - count != 1)
11766+ party = new L2Party(player, 1);
11767+ if (count % 9 < 9)
11768+ player.joinParty(party);
11769+ count++;
11770+ }
11771+ }
11772+
11773+ protected void debug(String text)
11774+ {
11775+ EventManager.getInstance().debug(text);
11776+ }
11777+
11778+ protected void divideIntoTeams(int number)
11779+ {
11780+ int i = 0;
11781+ while (EventManager.getInstance().players.size() != 0)
11782+ {
11783+ i++;
11784+ L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
11785+ players.put(player, new int[] { i, 0, 0 });
11786+ EventManager.getInstance().players.remove(player);
11787+ if (i == number)
11788+ i = 0;
11789+ }
11790+ }
11791+
11792+ public void dropBomb(L2PcInstance player)
11793+ {
11794+
11795+ }
11796+
11797+ protected abstract void endEvent();
11798+
11799+ protected void forceSitAll()
11800+ {
11801+ for (L2PcInstance player : players.keySet())
11802+ {
11803+ if (player.isCastingNow())
11804+ player.abortCast();
11805+ if (player.isAttackingNow())
11806+ player.abortAttack();
11807+ player.sitDown();
11808+ player.eventSitForced = true;
11809+ }
11810+ }
11811+
11812+ protected void forceStandAll()
11813+ {
11814+ for (L2PcInstance player : players.keySet())
11815+ {
11816+ player.eventSitForced = false;
11817+ player.standUp();
11818+ }
11819+
11820+ }
11821+
11822+ public boolean getBoolean(String propName)
11823+ {
11824+ return config.getBoolean(eventId, propName);
11825+ }
11826+
11827+ public int[] getColor(String owner)
11828+ {
11829+ return config.getColor(eventId, owner);
11830+ }
11831+
11832+ public int getInt(String propName)
11833+ {
11834+ return config.getInt(eventId, propName);
11835+ }
11836+
11837+ protected Set<L2PcInstance> getPlayerList()
11838+ {
11839+ return players.keySet();
11840+ }
11841+
11842+ protected FastList<L2PcInstance> getPlayersOfTeam(int team)
11843+ {
11844+ FastList<L2PcInstance> list = new FastList<L2PcInstance>();
11845+
11846+ for (L2PcInstance player : getPlayerList())
11847+ if (getTeam(player) == team)
11848+ list.add(player);
11849+
11850+ return list;
11851+ }
11852+
11853+ protected EventTeam getPlayersTeam(L2PcInstance player)
11854+ {
11855+ return teams.get(players.get(player)[0]);
11856+ }
11857+
11858+ protected FastList<L2PcInstance> getPlayersWithStatus(int status)
11859+ {
11860+ FastList<L2PcInstance> list = new FastList<L2PcInstance>();
11861+
11862+ for (L2PcInstance player : getPlayerList())
11863+ if (getStatus(player) == status)
11864+ list.add(player);
11865+
11866+ return list;
11867+ }
11868+
11869+ protected L2PcInstance getPlayerWithMaxScore()
11870+ {
11871+ L2PcInstance max;
11872+ max = players.head().getNext().getKey();
11873+ for (L2PcInstance player : players.keySet())
11874+ if (players.get(player)[2] > players.get(max)[2])
11875+ max = player;
11876+
11877+ return max;
11878+ }
11879+
11880+ protected void unequip(){
11881+ for (L2PcInstance player : players.keySet())
11882+ {
11883+ player.getInventory().unEquipItemInSlot(7);
11884+ player.getInventory().unEquipItemInSlot(8);
11885+ player.getInventory().unEquipItemInSlot(14);
11886+ }
11887+ }
11888+
11889+ public int[] getPosition(String owner, int num)
11890+ {
11891+ return config.getPosition(eventId, owner, num);
11892+ }
11893+
11894+ protected L2PcInstance getRandomPlayer()
11895+ {
11896+ FastList<L2PcInstance> temp = new FastList<L2PcInstance>();
11897+ for (L2PcInstance player : players.keySet())
11898+ temp.add(player);
11899+
11900+ return temp.get(Rnd.get(temp.size()));
11901+ }
11902+
11903+ protected L2PcInstance getRandomPlayerFromTeam(int team)
11904+ {
11905+ FastList<L2PcInstance> temp = new FastList<L2PcInstance>();
11906+ for (L2PcInstance player : players.keySet())
11907+ if (getTeam(player) == team)
11908+ temp.add(player);
11909+
11910+ return temp.get(Rnd.get(temp.size()));
11911+ }
11912+
11913+ public FastList<Integer> getRestriction(String type)
11914+ {
11915+ return config.getRestriction(eventId, type);
11916+ }
11917+
11918+ protected int getScore(L2PcInstance player)
11919+ {
11920+ return players.get(player)[2];
11921+ }
11922+
11923+ protected abstract String getScorebar();
11924+
11925+ protected int getStatus(L2PcInstance player)
11926+ {
11927+ return players.get(player)[1];
11928+ }
11929+
11930+ public String getString(String propName)
11931+ {
11932+ return config.getString(eventId, propName);
11933+ }
11934+
11935+ public int getTeam(L2PcInstance player)
11936+ {
11937+ return players.get(player)[0];
11938+ }
11939+
11940+ protected int getWinnerTeam()
11941+ {
11942+ FastList<EventTeam> t = new FastList<EventTeam>();
11943+
11944+ for (EventTeam team : teams.values())
11945+ {
11946+ if (t.size() == 0)
11947+ {
11948+ t.add(team);
11949+ continue;
11950+ }
11951+
11952+ if (team.getScore() > t.getFirst().getScore())
11953+ {
11954+ t.clear();
11955+ t.add(team);
11956+ continue;
11957+ }
11958+ if (team.getScore() == t.getFirst().getScore())
11959+ t.add(team);
11960+
11961+ }
11962+
11963+ if (t.size() > 1)
11964+ return t.get(Rnd.get(t.size())).getId();
11965+ else
11966+ return t.getFirst().getId();
11967+
11968+ }
11969+
11970+ protected void giveReward(FastList<L2PcInstance> players, int id, int ammount)
11971+ {
11972+ for (L2PcInstance player : players)
11973+ {
11974+ if(player == null)
11975+ continue;
11976+
11977+ player.addItem("Event", id, ammount, player, true);
11978+ EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
11979+ }
11980+
11981+ }
11982+
11983+ protected void giveReward(L2PcInstance player, int id, int ammount)
11984+ {
11985+ EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
11986+
11987+ player.addItem("Event", id, ammount, player, true);
11988+ }
11989+
11990+ protected void increasePlayersScore(L2PcInstance player)
11991+ {
11992+ int old = getScore(player);
11993+ setScore(player, old + 1);
11994+ EventStats.getInstance().tempTable.get(player.getObjectId())[3] = EventStats.getInstance().tempTable.get(player.getObjectId())[3] + 1;
11995+ }
11996+
11997+ protected void msgToAll(String text)
11998+ {
11999+ for (L2PcInstance player : players.keySet())
12000+ player.sendMessage(text);
12001+ }
12002+
12003+ public void onDie(L2PcInstance victim, L2PcInstance killer)
12004+ {
12005+ EventStats.getInstance().tempTable.get(victim.getObjectId())[2] = EventStats.getInstance().tempTable.get(victim.getObjectId())[2] + 1;
12006+ return;
12007+ }
12008+
12009+ public void onHit(L2PcInstance actor, L2PcInstance target)
12010+ {
12011+ }
12012+
12013+ public void onKill(L2PcInstance victim, L2PcInstance killer)
12014+ {
12015+ EventStats.getInstance().tempTable.get(killer.getObjectId())[1] = EventStats.getInstance().tempTable.get(killer.getObjectId())[1] + 1;
12016+ return;
12017+ }
12018+
12019+ public void onLogout(L2PcInstance player)
12020+ {
12021+ if (players.containsKey(player))
12022+ removePlayer(player);
12023+
12024+ player.setXYZ(EventManager.getInstance().positions.get(player)[0], EventManager.getInstance().positions.get(player)[1], EventManager.getInstance().positions.get(player)[2]);
12025+ player.setTitle(EventManager.getInstance().titles.get(player));
12026+
12027+ if (teams.size() == 1)
12028+ if (getPlayerList().size() == 1)
12029+ {
12030+ endEvent();
12031+ return;
12032+ }
12033+
12034+ if (teams.size() > 1)
12035+ {
12036+ int t = players.head().getNext().getValue()[0];
12037+ for (L2PcInstance p : getPlayerList())
12038+ if (getTeam(p) != t)
12039+ return;
12040+
12041+ endEvent();
12042+ return;
12043+
12044+ }
12045+ }
12046+
12047+ public void onSay(int type, L2PcInstance player, String text)
12048+ {
12049+ return;
12050+ }
12051+
12052+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
12053+ {
12054+ return false;
12055+ }
12056+
12057+ public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
12058+ {
12059+ if (EventManager.getInstance().getRestriction("item").contains(item.getItemId()) || getRestriction("item").contains(item.getItemId()))
12060+ return false;
12061+
12062+ if (item.getItemType() == L2EtcItemType.POTION && !getBoolean("allowPotions"))
12063+ return false;
12064+
12065+ if (item.getItemType() == L2EtcItemType.SCROLL)
12066+ return false;
12067+
12068+ return true;
12069+ }
12070+
12071+ public boolean onUseMagic(L2Skill skill)
12072+ {
12073+ if (EventManager.getInstance().getRestriction("skill").contains(skill.getId()) || getRestriction("skill").contains(skill.getId()))
12074+ return false;
12075+
12076+ if (skill.getSkillType() == L2Skill.SkillType.RESURRECT)
12077+ return false;
12078+
12079+ if (skill.getSkillType() == L2Skill.SkillType.SUMMON_FRIEND)
12080+ return false;
12081+
12082+ if (skill.getSkillType() == L2Skill.SkillType.RECALL)
12083+ return false;
12084+
12085+ if (skill.getSkillType() == L2Skill.SkillType.FAKE_DEATH)
12086+ return false;
12087+
12088+ return true;
12089+ }
12090+
12091+ protected void prepare(L2PcInstance player)
12092+ {
12093+ if (player.isCastingNow())
12094+ player.abortCast();
12095+ player.getAppearance().setVisible();
12096+
12097+ if (player.getPet() != null)
12098+ {
12099+ L2Summon summon = player.getPet();
12100+ if (summon instanceof L2PetInstance)
12101+ summon.unSummon(player);
12102+ }
12103+
12104+ if(player.isMounted())
12105+ {
12106+ if(player.setMountType(0))
12107+ {
12108+ if(player.isFlying())
12109+ {
12110+ player.removeSkill(SkillTable.getInstance().getInfo(4289, 1));
12111+ }
12112+ Ride dismount = new Ride(player.getObjectId(), Ride.ACTION_DISMOUNT, 0);
12113+ Broadcast.toSelfAndKnownPlayers(player, dismount);
12114+ player.setMountObjectID(0);
12115+ dismount = null;
12116+ }
12117+ }
12118+
12119+ if (getBoolean("removeBuffs"))
12120+ {
12121+ player.stopAllEffects();
12122+ if (player.getPet() != null)
12123+ {
12124+ L2Summon summon = player.getPet();
12125+ if (summon instanceof L2Summon)
12126+ summon.unSummon(player);
12127+ }
12128+ }
12129+
12130+ if (player.getParty() != null)
12131+ {
12132+ L2Party party = player.getParty();
12133+ party.removePartyMember(player);
12134+ }
12135+ int[] nameColor = getPlayersTeam(player).getTeamColor();
12136+ player.getAppearance().setNameColor(nameColor[0], nameColor[1], nameColor[2]);
12137+ player.setTitle("<- 0 ->");
12138+
12139+ if(EventManager.getInstance().getBoolean("eventBufferEnabled"))
12140+ EventBuffer.getInstance().buffPlayer(player);
12141+
12142+ player.broadcastUserInfo();
12143+ }
12144+
12145+ protected void preparePlayers()
12146+ {
12147+ for (L2PcInstance player : players.keySet())
12148+ prepare(player);
12149+ }
12150+
12151+ protected void removePlayer(L2PcInstance player)
12152+ {
12153+ players.remove(player);
12154+ }
12155+
12156+ public void reset()
12157+ {
12158+ players.clear();
12159+ tpm.purge();
12160+ winnerTeam = 0;
12161+
12162+ for (EventTeam team : teams.values())
12163+ team.setScore(0);
12164+
12165+ debug("Event reseted");
12166+ }
12167+
12168+ protected abstract void schedule(int time);
12169+
12170+ protected void selectPlayers(int teamId, int playerCount)
12171+ {
12172+ for (int i = 0; i < playerCount; i++)
12173+ {
12174+ L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
12175+ players.put(player, new int[] { teamId, 0, 0 });
12176+ EventManager.getInstance().players.remove(player);
12177+ }
12178+
12179+ }
12180+
12181+ protected void setScore(L2PcInstance player, int score)
12182+ {
12183+ players.get(player)[2] = score;
12184+ player.setTitle("<- " + score + " ->");
12185+ player.broadcastUserInfo();
12186+ }
12187+
12188+ protected void setStatus(L2PcInstance player, int status)
12189+ {
12190+ if (players.containsKey(player))
12191+ players.get(player)[1] = status;
12192+ }
12193+
12194+ protected void setTeam(L2PcInstance player, int team)
12195+ {
12196+ players.get(player)[0] = team;
12197+ }
12198+
12199+ protected abstract void showHtml(L2PcInstance player, int obj);
12200+
12201+ protected L2Spawn spawnNPC(int xPos, int yPos, int zPos, int npcId)
12202+ {
12203+ final L2NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
12204+ try
12205+ {
12206+ final L2Spawn spawn = new L2Spawn(template);
12207+ spawn.setLocx(xPos);
12208+ spawn.setLocy(yPos);
12209+ spawn.setLocz(zPos);
12210+ spawn.setAmount(1);
12211+ spawn.setHeading(0);
12212+ spawn.setRespawnDelay(1);
12213+ SpawnTable.getInstance().addNewSpawn(spawn, false);
12214+ spawn.init();
12215+ return spawn;
12216+ }
12217+ catch (Exception e)
12218+ {
12219+ return null;
12220+ }
12221+ }
12222+
12223+ protected abstract void start();
12224+
12225+ protected void teleportPlayer(L2PcInstance player, int[] coordinates)
12226+ {
12227+ player.teleToLocation(coordinates[0] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[1] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[2]);
12228+ }
12229+
12230+ protected void teleportToTeamPos()
12231+ {
12232+ for (L2PcInstance player : players.keySet())
12233+ {
12234+ teleportToTeamPos(player);
12235+ }
12236+
12237+ }
12238+
12239+ protected void teleportToTeamPos(L2PcInstance player)
12240+ {
12241+ int[] pos = getPosition(teams.get(getTeam(player)).getName(), 0);
12242+ teleportPlayer(player, pos);
12243+ }
12244+
12245+ protected void unspawnNPC(L2Spawn npcSpawn)
12246+ {
12247+ if (npcSpawn == null)
12248+ return;
12249+
12250+ npcSpawn.getLastSpawn().deleteMe();
12251+ npcSpawn.stopRespawn();
12252+ SpawnTable.getInstance().deleteSpawn(npcSpawn, true);
12253+ }
12254+
12255+ public int numberOfTeams()
12256+ {
12257+ return teams.size();
12258+ }
12259+
12260+ public void useCapture(L2PcInstance player, L2NpcInstance base){}
12261+
12262+ protected void polymorph(L2PcInstance player, int id)
12263+ {
12264+ player.getPoly().setPolyInfo("", String.valueOf(id));
12265+ player.decayMe();
12266+ player.spawnMe(player.getX(),player.getY(),player.getZ());
12267+ }
12268+
12269+ protected void unpolymorph(L2PcInstance player)
12270+ {
12271+ player.getPoly().setPolyInfo(null, "1");
12272+ player.decayMe();
12273+ player.spawnMe(player.getX(),player.getY(),player.getZ());
12274+ }
12275+}
12276\ No newline at end of file
12277Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java
12278===================================================================
12279--- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java (revision 1132)
12280+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java (working copy)
12281@@ -20,11 +20,17 @@
12282 */
12283 package com.l2jfrozen.gameserver.network.clientpackets;
12284
12285+import java.sql.Connection;
12286+import java.sql.PreparedStatement;
12287+import java.sql.ResultSet;
12288 import org.apache.log4j.Logger;
12289
12290 import com.l2jfrozen.Config;
12291 import com.l2jfrozen.gameserver.ai.CtrlIntention;
12292 import com.l2jfrozen.gameserver.communitybbs.CommunityBoard;
12293+import com.l2jfrozen.gameserver.event.EventBuffer;
12294+import com.l2jfrozen.gameserver.event.EventManager;
12295+import com.l2jfrozen.gameserver.event.EventStats;
12296 import com.l2jfrozen.gameserver.datatables.sql.AdminCommandAccessRights;
12297 import com.l2jfrozen.gameserver.handler.AdminCommandHandler;
12298 import com.l2jfrozen.gameserver.handler.IAdminCommandHandler;
12299@@ -45,6 +51,7 @@
12300 import com.l2jfrozen.gameserver.network.serverpackets.ActionFailed;
12301 import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
12302 import com.l2jfrozen.gameserver.util.GMAudit;
12303+import com.l2jfrozen.util.database.L2DatabaseFactory;
12304
12305 public final class RequestBypassToServer extends L2GameClientPacket
12306 {
12307@@ -117,6 +124,18 @@
12308
12309 ach.useAdminCommand(_command, activeChar);
12310 }
12311+ else if (_command.startsWith("event_vote"))
12312+ {
12313+ EventManager.getInstance().addVote(activeChar, Integer.parseInt(_command.substring(11)));
12314+ }
12315+ else if(_command.equals("event_register"))
12316+ {
12317+ EventManager.getInstance().registerPlayer(activeChar);
12318+ }
12319+ else if(_command.equals("event_unregister"))
12320+ {
12321+ EventManager.getInstance().unregisterPlayer(activeChar);
12322+ }
12323 else if (_command.equals("come_here") && activeChar.isGM())
12324 {
12325 comeHere(activeChar);
12326@@ -307,7 +326,52 @@
12327 player.processQuestEvent(p.substring(0, idx), p.substring(idx).trim());
12328 }
12329 }
12330-
12331+ else if (_command.startsWith("eventvote "))
12332+ {
12333+ EventManager.getInstance().addVote(activeChar, Integer.parseInt(_command.substring(10)));
12334+ }
12335+ else if (_command.startsWith("eventstats "))
12336+ {
12337+ Connection con = null;
12338+ PreparedStatement statement = null;
12339+ con = L2DatabaseFactory.getInstance().getConnection();
12340+ 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");
12341+ ResultSet rset = statement.executeQuery();
12342+ if (!rset.last())
12343+ {
12344+ rset.close();
12345+ statement.close();
12346+ con.close();
12347+ this.getClient().activeChar.sendMessage("Currently there are no statistics to show.");
12348+ return;
12349+ }
12350+ rset.close();
12351+ statement.close();
12352+ con.close();
12353+ EventStats.getInstance().showHtml(Integer.parseInt(_command.substring(11)),activeChar);
12354+ }
12355+ else if (_command.startsWith("eventstats_show "))
12356+ {
12357+ EventStats.getInstance().showPlayerStats(Integer.parseInt(_command.substring(16)),activeChar);
12358+ }
12359+ else if (_command.equals("eventbuffershow"))
12360+ {
12361+ EventBuffer.getInstance().showHtml(activeChar);
12362+ }
12363+ else if (_command.startsWith("eventbuffer "))
12364+ {
12365+ EventBuffer.getInstance().changeList(activeChar, Integer.parseInt(_command.substring(12,_command.length()-2)), (Integer.parseInt(_command.substring(_command.length()-1)) == 0 ? false : true));
12366+ EventBuffer.getInstance().showHtml(activeChar);
12367+ }
12368+ else if (_command.startsWith("eventinfo "))
12369+ {
12370+ int eventId = Integer.valueOf(_command.substring(10));
12371+
12372+ NpcHtmlMessage html = new NpcHtmlMessage(0);
12373+ html.setFile("data/html/eventinfo/"+eventId+".htm");
12374+ activeChar.sendPacket(html);
12375+ activeChar.sendPacket(ActionFailed.STATIC_PACKET);
12376+ }
12377 // Jstar's Custom Bypass Caller!
12378 else if (_command.startsWith("custom_"))
12379 {
12380Index: head-src/com/l2jfrozen/gameserver/event/EventTeam.java
12381===================================================================
12382--- head-src/com/l2jfrozen/gameserver/event/EventTeam.java (nonexistent)
12383+++ head-src/com/l2jfrozen/gameserver/event/EventTeam.java (working copy)
12384@@ -0,0 +1,109 @@
12385+/*
12386+ * This program is free software: you can redistribute it and/or modify it under
12387+ * the terms of the GNU General Public License as published by the Free Software
12388+ * Foundation, either version 3 of the License, or (at your option) any later
12389+ * version.
12390+ *
12391+ * This program is distributed in the hope that it will be useful, but WITHOUT
12392+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12393+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
12394+ * details.
12395+ *
12396+ * You should have received a copy of the GNU General Public License along with
12397+ * this program. If not, see <http://www.gnu.org/licenses/>.
12398+ */
12399+package com.l2jfrozen.gameserver.event;
12400+
12401+/**
12402+ * @author Rizel
12403+ *
12404+ */
12405+public class EventTeam implements Comparable<EventTeam>
12406+{
12407+ private int score;
12408+
12409+ private String name;
12410+
12411+ private int[] nameColor;
12412+
12413+ private int[] startPos;
12414+
12415+ private int id;
12416+
12417+ public EventTeam(int id, String name, int[] color, int[] startPos)
12418+ {
12419+ this.id = id;
12420+ score = 0;
12421+ this.name = name;
12422+ nameColor = color;
12423+ this.startPos = startPos;
12424+ }
12425+
12426+ public int compareTo(EventTeam second)
12427+ {
12428+
12429+ if (getScore() > second.getScore())
12430+ return 1;
12431+ if (getScore() < second.getScore())
12432+ return -1;
12433+ if (getScore() == second.getScore())
12434+ return 0;
12435+
12436+ return 0;
12437+
12438+ }
12439+
12440+ protected String getHexaColor()
12441+ {
12442+ String hexa;
12443+ Integer i1 = nameColor[0];
12444+ Integer i2 = nameColor[1];
12445+ Integer i3 = nameColor[2];
12446+ hexa = "" + (i1 > 15 ? Integer.toHexString(i1) : "0" + Integer.toHexString(i1)) + (i2 > 15 ? Integer.toHexString(i2) : "0" + Integer.toHexString(i2)) + (i3 > 15 ? Integer.toHexString(i3) : "0" + Integer.toHexString(i3));
12447+ return hexa;
12448+ }
12449+
12450+ protected int getId()
12451+ {
12452+ return id;
12453+ }
12454+
12455+ protected String getName()
12456+ {
12457+ return name;
12458+ }
12459+
12460+ protected int getScore()
12461+ {
12462+ return score;
12463+ }
12464+
12465+ protected int[] getTeamColor()
12466+ {
12467+ return nameColor;
12468+ }
12469+
12470+ protected int[] getTeamPos()
12471+ {
12472+ return startPos;
12473+ }
12474+
12475+ protected void increaseScore()
12476+ {
12477+ score++;
12478+ }
12479+
12480+ /* (non-Javadoc)
12481+ * @see java.lang.Comparable#compareTo(java.lang.Object)
12482+ */
12483+
12484+ protected void increaseScore(int ammount)
12485+ {
12486+ score += ammount;
12487+ }
12488+
12489+ protected void setScore(int ammount)
12490+ {
12491+ score = ammount;
12492+ }
12493+}
12494\ No newline at end of file
12495Index: head-src/com/l2jfrozen/gameserver/event/EventConfig.java
12496===================================================================
12497--- head-src/com/l2jfrozen/gameserver/event/EventConfig.java (nonexistent)
12498+++ head-src/com/l2jfrozen/gameserver/event/EventConfig.java (working copy)
12499@@ -0,0 +1,270 @@
12500+package com.l2jfrozen.gameserver.event;
12501+
12502+import java.io.File;
12503+import java.util.StringTokenizer;
12504+import java.util.logging.Logger;
12505+
12506+import javax.xml.parsers.DocumentBuilder;
12507+import javax.xml.parsers.DocumentBuilderFactory;
12508+
12509+import javolution.util.FastList;
12510+import javolution.util.FastMap;
12511+
12512+import org.w3c.dom.Document;
12513+import org.w3c.dom.NamedNodeMap;
12514+import org.w3c.dom.Node;
12515+
12516+import com.l2jfrozen.util.random.Rnd;
12517+
12518+public class EventConfig
12519+{
12520+
12521+ @SuppressWarnings("synthetic-access")
12522+ private static class SingletonHolder
12523+ {
12524+ protected static final EventConfig _instance = new EventConfig();
12525+ }
12526+
12527+ public static EventConfig getInstance()
12528+ {
12529+ return SingletonHolder._instance;
12530+ }
12531+
12532+ private Logger _log = Logger.getLogger(EventConfig.class.getName());
12533+ public FastMap<Integer, FastMap<String, String>> config;
12534+
12535+ public FastMap<Integer, FastMap<String, FastMap<Integer, int[]>>> positions;
12536+
12537+ public FastMap<Integer, FastMap<String, int[]>> colors;
12538+
12539+ public FastMap<Integer, FastMap<String, FastList<Integer>>> restrictions;
12540+
12541+ public EventConfig()
12542+ {
12543+ config = new FastMap<Integer, FastMap<String, String>>();
12544+ positions = new FastMap<Integer, FastMap<String, FastMap<Integer, int[]>>>();
12545+ colors = new FastMap<Integer, FastMap<String, int[]>>();
12546+ restrictions = new FastMap<Integer, FastMap<String, FastList<Integer>>>();
12547+ loadConfigs();
12548+ }
12549+
12550+ private void addColor(int id, String owner, int[] color)
12551+ {
12552+ if (!colors.containsKey(id))
12553+ colors.put(id, new FastMap<String, int[]>());
12554+
12555+ colors.get(id).put(owner, color);
12556+ }
12557+
12558+ private void addPosition(int id, String owner, int x, int y, int z, int radius)
12559+ {
12560+
12561+ if (!positions.containsKey(id))
12562+ positions.put(id, new FastMap<String, FastMap<Integer, int[]>>());
12563+ if (!positions.get(id).containsKey(owner))
12564+ positions.get(id).put(owner, new FastMap<Integer, int[]>());
12565+
12566+ positions.get(id).get(owner).put(positions.get(id).get(owner).size() + 1, new int[] { x, y, z, radius });
12567+ }
12568+
12569+ private void addProperty(int id, String propName, String value)
12570+ {
12571+ if (!config.containsKey(id))
12572+ config.put(id, new FastMap<String, String>());
12573+
12574+ config.get(id).put(propName, value);
12575+ }
12576+
12577+ private void addRestriction(int id, String type, String ids)
12578+ {
12579+ if (!restrictions.containsKey(id))
12580+ restrictions.put(id, new FastMap<String, FastList<Integer>>());
12581+
12582+ FastList<Integer> idlist = new FastList<Integer>();
12583+ StringTokenizer st = new StringTokenizer(ids, ",");
12584+ while (st.hasMoreTokens())
12585+ idlist.add(Integer.parseInt(st.nextToken()));
12586+
12587+ restrictions.get(id).put(type, idlist);
12588+ }
12589+
12590+ public boolean getBoolean(int event, String propName)
12591+ {
12592+ if (!(config.containsKey(event)))
12593+ {
12594+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
12595+ return false;
12596+ }
12597+
12598+ if (config.get(event).containsKey(propName))
12599+ return Boolean.parseBoolean(config.get(event).get(propName));
12600+ else
12601+ {
12602+ _log.warning("Event: Try to get a non existing property: " + propName);
12603+ return false;
12604+ }
12605+
12606+ }
12607+
12608+ public int[] getColor(int event, String owner)
12609+ {
12610+ if (!(colors.containsKey(event)))
12611+ {
12612+ _log.warning("Event: Try to get a color of a non existing event: ID: " + event);
12613+ return new int[] { 255, 255, 255 };
12614+ }
12615+
12616+ if (colors.get(event).containsKey(owner))
12617+ return colors.get(event).get(owner);
12618+ else
12619+ {
12620+ _log.warning("Event: Try to get a non existing color: " + owner);
12621+ return new int[] { 255, 255, 255 };
12622+ }
12623+ }
12624+
12625+ public int getInt(int event, String propName)
12626+ {
12627+ if (!(config.containsKey(event)))
12628+ {
12629+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
12630+ return -1;
12631+ }
12632+
12633+ if (config.get(event).containsKey(propName))
12634+ return Integer.parseInt(config.get(event).get(propName));
12635+ else
12636+ {
12637+ _log.warning("Event: Try to get a non existing property: " + propName);
12638+ return -1;
12639+ }
12640+ }
12641+
12642+ public int[] getPosition(int event, String owner, int num)
12643+ {
12644+ if (!positions.containsKey(event))
12645+ {
12646+ _log.warning("Event: Try to get a position of a non existing event: ID: " + event);
12647+ return new int[] {};
12648+ }
12649+ if (!positions.get(event).containsKey(owner))
12650+ {
12651+ _log.warning("Event: Try to get a position of a non existing owner: " + owner);
12652+ return new int[] {};
12653+ }
12654+ if (!positions.get(event).get(owner).containsKey(num) && num != 0)
12655+ {
12656+ _log.warning("Event: Try to get a non existing position: " + num);
12657+ return new int[] {};
12658+ }
12659+
12660+ if (num == 0)
12661+ return positions.get(event).get(owner).get(Rnd.get(positions.get(event).get(owner).size()) + 1);
12662+ else
12663+ return positions.get(event).get(owner).get(num);
12664+ }
12665+
12666+ public FastList<Integer> getRestriction(int event, String type)
12667+ {
12668+ if (!(restrictions.containsKey(event)))
12669+ {
12670+ _log.warning("Event: Try to get a restriction of a non existing event: ID: " + event);
12671+ return null;
12672+ }
12673+ if (restrictions.get(event).containsKey(type))
12674+ return restrictions.get(event).get(type);
12675+ else
12676+ {
12677+ _log.warning("Event: Try to get a non existing restriction: " + type);
12678+ return null;
12679+ }
12680+ }
12681+
12682+ public String getString(int event, String propName)
12683+ {
12684+ if (!(config.containsKey(event)))
12685+ {
12686+ _log.warning("Event: Try to get a property of a non existing event: ID: " + event);
12687+ return null;
12688+ }
12689+
12690+ if (config.get(event).containsKey(propName))
12691+ return config.get(event).get(propName);
12692+ else
12693+ {
12694+ _log.warning("Event: Try to get a non existing property: " + propName);
12695+ return null;
12696+ }
12697+
12698+ }
12699+
12700+ private void loadConfigs()
12701+ {
12702+ File configFile = new File("./config/Events.xml");
12703+ Document doc = null;
12704+ try
12705+ {
12706+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
12707+ dbf.setIgnoringComments(true);
12708+ dbf.setValidating(false);
12709+ DocumentBuilder db = dbf.newDocumentBuilder();
12710+ doc = db.parse(configFile);
12711+
12712+ for (Node root = doc.getFirstChild(); root != null; root = root.getNextSibling())
12713+ if ("events".equalsIgnoreCase(root.getNodeName()))
12714+ for (Node event = root.getFirstChild(); event != null; event = event.getNextSibling())
12715+ if ("event".equalsIgnoreCase(event.getNodeName()))
12716+ {
12717+ NamedNodeMap eventAttrs = event.getAttributes();
12718+ int eventId = Integer.parseInt(eventAttrs.getNamedItem("id").getNodeValue());
12719+
12720+ for (Node property = event.getFirstChild(); property != null; property = property.getNextSibling())
12721+ {
12722+
12723+ if ("property".equalsIgnoreCase(property.getNodeName()))
12724+ {
12725+ NamedNodeMap propAttrs = property.getAttributes();
12726+ String name = propAttrs.getNamedItem("name").getNodeValue();
12727+ String value = propAttrs.getNamedItem("value").getNodeValue();
12728+ addProperty(eventId, name, value);
12729+ }
12730+
12731+ if ("position".equalsIgnoreCase(property.getNodeName()))
12732+ {
12733+ NamedNodeMap propAttrs = property.getAttributes();
12734+ String owner = propAttrs.getNamedItem("owner").getNodeValue();
12735+ String x = propAttrs.getNamedItem("x").getNodeValue();
12736+ String y = propAttrs.getNamedItem("y").getNodeValue();
12737+ String z = propAttrs.getNamedItem("z").getNodeValue();
12738+ String radius = propAttrs.getNamedItem("radius").getNodeValue();
12739+ addPosition(eventId, owner, Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z), Integer.parseInt(radius));
12740+
12741+ }
12742+
12743+ if ("color".equalsIgnoreCase(property.getNodeName()))
12744+ {
12745+ NamedNodeMap propAttrs = property.getAttributes();
12746+ String owner = propAttrs.getNamedItem("owner").getNodeValue();
12747+ int r = Integer.parseInt(propAttrs.getNamedItem("r").getNodeValue());
12748+ int g = Integer.parseInt(propAttrs.getNamedItem("g").getNodeValue());
12749+ int b = Integer.parseInt(propAttrs.getNamedItem("b").getNodeValue());
12750+ addColor(eventId, owner, new int[] { r, g, b });
12751+ }
12752+
12753+ if ("restriction".equalsIgnoreCase(property.getNodeName()))
12754+ {
12755+ NamedNodeMap propAttrs = property.getAttributes();
12756+ String type = propAttrs.getNamedItem("type").getNodeValue();
12757+ String ids = propAttrs.getNamedItem("ids").getNodeValue();
12758+ addRestriction(eventId, type, ids);
12759+ }
12760+ }
12761+ }
12762+ }
12763+ catch (Exception e)
12764+ {
12765+
12766+ }
12767+
12768+ }
12769+}
12770\ No newline at end of file
12771Index: head-src/com/l2jfrozen/gameserver/event/Battlefield.java
12772===================================================================
12773--- head-src/com/l2jfrozen/gameserver/event/Battlefield.java (nonexistent)
12774+++ head-src/com/l2jfrozen/gameserver/event/Battlefield.java (working copy)
12775@@ -0,0 +1,238 @@
12776+package com.l2jfrozen.gameserver.event;
12777+
12778+import java.util.Map;
12779+
12780+import javolution.text.TextBuilder;
12781+import javolution.util.FastMap;
12782+
12783+import com.l2jfrozen.gameserver.datatables.SkillTable;
12784+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
12785+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
12786+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
12787+import com.l2jfrozen.gameserver.network.serverpackets.NpcInfo;
12788+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
12789+import com.l2jfrozen.util.random.Rnd;
12790+
12791+public class Battlefield extends Event
12792+{
12793+ private class Core implements Runnable
12794+ {
12795+
12796+ public void run()
12797+ {
12798+ try{
12799+ switch (eventState)
12800+ {
12801+ case START:
12802+ divideIntoTeams(2);
12803+ preparePlayers();
12804+ teleportToTeamPos();
12805+ createPartyOfTeam(1);
12806+ createPartyOfTeam(2);
12807+ forceSitAll();
12808+ giveSkill();
12809+ spawnBases();
12810+ setStatus(EventState.FIGHT);
12811+ schedule(20000);
12812+ break;
12813+
12814+ case FIGHT:
12815+ forceStandAll();
12816+ setStatus(EventState.END);
12817+ clock.startClock(getInt("matchTime"));
12818+ break;
12819+
12820+ case END:
12821+ clock.setTime(0);
12822+ if (winnerTeam == 0)
12823+ winnerTeam = getWinnerTeam();
12824+
12825+ giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
12826+ unspawnBases();
12827+ removeSkill();
12828+ setStatus(EventState.INACTIVE);
12829+ EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " points!");
12830+ break;
12831+ }
12832+ }
12833+ catch (Throwable e)
12834+ {
12835+ e.printStackTrace();
12836+ EventManager.getInstance().end("Error! Event ended.");
12837+ }
12838+ }
12839+
12840+ }
12841+
12842+ private enum EventState
12843+ {
12844+ START, FIGHT, END, TELEPORT, INACTIVE
12845+ }
12846+
12847+ private EventState eventState;
12848+
12849+ private Core task;
12850+
12851+ private int winnerTeam;
12852+
12853+ private FastMap<Integer,L2Spawn> bases;
12854+
12855+ private FastMap<Integer,Integer> owners;
12856+
12857+ public Battlefield()
12858+ {
12859+ super();
12860+ eventId = 14;
12861+ createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
12862+ createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
12863+ bases = new FastMap<Integer,L2Spawn>();
12864+ owners = new FastMap<Integer,Integer>();
12865+ task = new Core();
12866+ winnerTeam = 0;
12867+ }
12868+
12869+ @Override
12870+ protected void endEvent()
12871+ {
12872+ winnerTeam = players.head().getNext().getValue()[0];
12873+
12874+ setStatus(EventState.END);
12875+ schedule(1);
12876+ }
12877+
12878+ @Override
12879+ protected String getScorebar()
12880+ {
12881+ return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + " " + teams.get(2).getName() + ": " + teams.get(2).getScore() + " Time: " + clock.getTime();
12882+ }
12883+
12884+ @Override
12885+ protected int getWinnerTeam()
12886+ {
12887+ if (teams.get(1).getScore() > teams.get(2).getScore())
12888+ return 1;
12889+ if (teams.get(2).getScore() > teams.get(1).getScore())
12890+ return 2;
12891+ if (teams.get(1).getScore() == teams.get(2).getScore())
12892+ if (Rnd.nextInt(1) == 1)
12893+ return 1;
12894+ else
12895+ return 2;
12896+
12897+ return 1;
12898+ }
12899+
12900+ @Override
12901+ public void onDie(L2PcInstance victim, L2PcInstance killer)
12902+ {
12903+ super.onDie(victim, killer);
12904+ addToResurrector(victim);
12905+ }
12906+
12907+ @Override
12908+ protected void schedule(int time)
12909+ {
12910+ tpm.scheduleGeneral(task, time);
12911+ }
12912+
12913+ private void setStatus(EventState s)
12914+ {
12915+ eventState = s;
12916+ }
12917+
12918+ @Override
12919+ protected void showHtml(L2PcInstance player, int obj)
12920+ {
12921+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
12922+ TextBuilder sb = new TextBuilder();
12923+ sb.append("<html><body><table width=300>" + "<tr><td><center>Event phase</td></tr>" + "<tr><td><center>" + getString("eventName") + " - " + clock.getTime() + "</td></tr>" + "<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=300>");
12924+
12925+ int i = 0;
12926+ for (EventTeam team : teams.values())
12927+ {
12928+ i++;
12929+ sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
12930+ for (L2PcInstance p : getPlayersOfTeam(i))
12931+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
12932+ }
12933+
12934+ sb.append("</table><br></body></html>");
12935+ html.setHtml(sb.toString());
12936+ player.sendPacket(html);
12937+
12938+ }
12939+
12940+ @Override
12941+ protected void start()
12942+ {
12943+ setStatus(EventState.START);
12944+ schedule(1);
12945+ }
12946+
12947+ private void spawnBases()
12948+ {
12949+ for(int i = 1; i <= getInt("numOfBases"); i++)
12950+ {
12951+ bases.put(i, spawnNPC(getPosition("Base",i)[0],getPosition("Base",i)[1],getPosition("Base",i)[2],getInt("baseNpcId")));
12952+ bases.get(i).getLastSpawn().setTitle("- Neutral -");
12953+ owners.put(i, 0);
12954+ }
12955+ }
12956+
12957+ private void unspawnBases()
12958+ {
12959+ for(L2Spawn base: bases.values())
12960+ unspawnNPC(base);
12961+ }
12962+
12963+ @Override
12964+ public void reset()
12965+ {
12966+ super.reset();
12967+ bases.clear();
12968+ owners.clear();
12969+ }
12970+
12971+ @Override
12972+ protected void clockTick()
12973+ {
12974+ for(int owner : owners.values())
12975+ if(owner != 0)
12976+ teams.get(owner).increaseScore(1);
12977+ }
12978+
12979+ @Override
12980+ public void useCapture(L2PcInstance player, L2NpcInstance base)
12981+ {
12982+ if(base.getNpcId() != getInt("baseNpcId"))
12983+ return;
12984+
12985+ for(Map.Entry<Integer, L2Spawn> baseSpawn: bases.entrySet())
12986+ if(baseSpawn.getValue().getLastSpawn().getObjectId() == base.getObjectId())
12987+ {
12988+ if(owners.get(baseSpawn.getKey()) == getTeam(player))
12989+ return;
12990+
12991+ owners.getEntry(baseSpawn.getKey()).setValue(getTeam(player));
12992+ baseSpawn.getValue().getLastSpawn().setTitle("- "+teams.get(getTeam(player)).getName()+" -");
12993+ for(L2PcInstance p : getPlayerList())
12994+ p.sendPacket(new NpcInfo(baseSpawn.getValue().getLastSpawn(), p));
12995+
12996+ announce(getPlayerList(),"The "+teams.get(getTeam(player)).getName()+" team captured a base!");
12997+ increasePlayersScore(player);
12998+ player.addItem("Event", 6392, 2, player, true);
12999+ }
13000+ }
13001+
13002+ private void removeSkill()
13003+ {
13004+ for (L2PcInstance player : getPlayerList())
13005+ player.removeSkill(SkillTable.getInstance().getInfo(getInt("captureSkillId"), 1), false);
13006+ }
13007+
13008+ private void giveSkill()
13009+ {
13010+ for (L2PcInstance player : getPlayerList())
13011+ player.addSkill(SkillTable.getInstance().getInfo(getInt("captureSkillId"), 1), false);
13012+ }
13013+}
13014\ No newline at end of file
13015Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2EventManagerInstance.java
13016===================================================================
13017--- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2EventManagerInstance.java (nonexistent)
13018+++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2EventManagerInstance.java (working copy)
13019@@ -0,0 +1,50 @@
13020+package com.l2jfrozen.gameserver.model.actor.instance;
13021+
13022+import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
13023+import com.l2jfrozen.gameserver.event.EventManager;
13024+import javolution.text.TextBuilder;
13025+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
13026+
13027+public class L2EventManagerInstance extends L2FolkInstance
13028+{
13029+private int objectId;
13030+
13031+ public L2EventManagerInstance(int objectId, L2NpcTemplate template)
13032+ {
13033+ super(objectId, template);
13034+ this.objectId = objectId;
13035+ }
13036+
13037+ @Override
13038+ public void onBypassFeedback(L2PcInstance player, String command)
13039+ {
13040+ if (command.startsWith("reg"))
13041+ {
13042+ EventManager.getInstance().registerPlayer(player);
13043+ }
13044+ if (command.startsWith("unreg"))
13045+ {
13046+ EventManager.getInstance().unregisterPlayer(player);
13047+ }
13048+ if (command.startsWith("list"))
13049+ {
13050+ NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
13051+ TextBuilder sb = new TextBuilder();
13052+ sb.append("<html><body><center>Select an event to vote for it:<br>");
13053+
13054+ int i = 0;
13055+ for(String name: EventManager.getInstance().getEventNames())
13056+ {
13057+ i++;
13058+ sb.append (" <a action=\"bypass -h npc_"+objectId+"_"+i+"\">- "+name+" -</a> <br>");
13059+ }
13060+ sb.append("</center></body></html>");
13061+ html.setHtml(sb.toString());
13062+ player.sendPacket(html);
13063+ }
13064+ else
13065+ {
13066+ EventManager.getInstance().addVote(player,Integer.parseInt(command));
13067+ }
13068+ }
13069+}
13070\ No newline at end of file
13071Index: head-src/com/l2jfrozen/gameserver/handler/SkillHandler.java
13072===================================================================
13073--- head-src/com/l2jfrozen/gameserver/handler/SkillHandler.java (revision 1132)
13074+++ head-src/com/l2jfrozen/gameserver/handler/SkillHandler.java (working copy)
13075@@ -29,6 +29,8 @@
13076 import com.l2jfrozen.gameserver.handler.skillhandlers.BalanceLife;
13077 import com.l2jfrozen.gameserver.handler.skillhandlers.BeastFeed;
13078 import com.l2jfrozen.gameserver.handler.skillhandlers.Blow;
13079+import com.l2jfrozen.gameserver.handler.skillhandlers.Bomb;
13080+import com.l2jfrozen.gameserver.handler.skillhandlers.Capture;
13081 import com.l2jfrozen.gameserver.handler.skillhandlers.Charge;
13082 import com.l2jfrozen.gameserver.handler.skillhandlers.ClanGate;
13083 import com.l2jfrozen.gameserver.handler.skillhandlers.CombatPointHeal;
13084@@ -122,6 +124,8 @@
13085 registerSkillHandler(new GetPlayer());
13086 registerSkillHandler(new ZakenPlayer());
13087 registerSkillHandler(new ZakenSelf());
13088+ registerSkillHandler(new Bomb());
13089+ registerSkillHandler(new Capture());
13090 LOGGER.info("SkillHandler: Loaded " + _datatable.size() + " handlers.");
13091
13092 }
13093Index: head-src/com/l2jfrozen/gameserver/event/Russian.java
13094===================================================================
13095--- head-src/com/l2jfrozen/gameserver/event/Russian.java (nonexistent)
13096+++ head-src/com/l2jfrozen/gameserver/event/Russian.java (working copy)
13097@@ -0,0 +1,289 @@
13098+package com.l2jfrozen.gameserver.event;
13099+
13100+import java.util.Map;
13101+
13102+import javolution.text.TextBuilder;
13103+import javolution.util.FastList;
13104+import javolution.util.FastMap;
13105+
13106+import com.l2jfrozen.gameserver.model.L2Object;
13107+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
13108+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
13109+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
13110+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
13111+import com.l2jfrozen.util.random.Rnd;
13112+
13113+/**
13114+ * @author Rizel
13115+ *
13116+ */
13117+public class Russian extends Event
13118+{
13119+
13120+ private class Core implements Runnable
13121+ {
13122+ public void run()
13123+ {
13124+ try
13125+ {
13126+ switch (eventState)
13127+ {
13128+ case START:
13129+ divideIntoTeams(1);
13130+ preparePlayers();
13131+ teleportToTeamPos();
13132+ forceSitAll();
13133+ spawnRussians();
13134+ setStatus(EventState.CHOOSE);
13135+ debug("The event started with " + players.size() + " players");
13136+ schedule(30000);
13137+ break;
13138+
13139+ case CHOOSE:
13140+ if (round == 0)
13141+ forceStandAll();
13142+
13143+ round++;
13144+ setStatus(EventState.CHECK);
13145+ debug("Choose phase.");
13146+ schedule(getInt("roundTime") * 1000);
13147+ break;
13148+
13149+ case CHECK:
13150+ debug("Check phase");
13151+ removeAfkers();
13152+ killRandomRussian();
13153+
13154+ if (countOfPositiveStatus() != 0)
13155+ {
13156+ if (russians.size() != 1)
13157+ {
13158+ for (L2PcInstance player : getPlayersWithStatus(1))
13159+ {
13160+ setStatus(player, 0);
13161+ increasePlayersScore(player);
13162+ player.getAppearance().setNameColor(255, 255, 255);
13163+ player.broadcastUserInfo();
13164+ }
13165+
13166+ for (FastList<L2PcInstance> chose : choses.values())
13167+ chose.reset();
13168+
13169+ setStatus(EventState.CHOOSE);
13170+ schedule(getInt("roundTime") * 1000);
13171+ }
13172+ else
13173+ {
13174+ for (L2PcInstance player : getPlayersWithStatus(1))
13175+ giveReward(player, getInt("rewardId"), getInt("rewardAmmount"));
13176+
13177+ unspawnRussians();
13178+ debug("Event ended. " + countOfPositiveStatus() + " players survived");
13179+ EventManager.getInstance().end("Congratulation! " + countOfPositiveStatus() + " players survived the event!");
13180+ }
13181+
13182+ }
13183+ else
13184+ {
13185+ unspawnRussians();
13186+ debug("Event ended. Noone survived");
13187+ EventManager.getInstance().end("Unfortunatly no-one survived the event!");
13188+ }
13189+ break;
13190+ }
13191+ }
13192+ catch (Throwable e)
13193+ {
13194+ e.printStackTrace();
13195+ EventManager.getInstance().end("Error! Event ended.");
13196+ }
13197+
13198+ }
13199+ }
13200+
13201+ private enum EventState
13202+ {
13203+ START, CHOOSE, CHECK, INACTIVE
13204+ }
13205+
13206+ private EventState eventState;
13207+
13208+ private Core task;
13209+
13210+ private int round;
13211+
13212+ private FastMap<Integer, L2Spawn> russians;
13213+
13214+ private FastMap<Integer, FastList<L2PcInstance>> choses;
13215+
13216+ public Russian()
13217+ {
13218+ super();
13219+ eventId = 11;
13220+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
13221+ task = new Core();
13222+ round = 0;
13223+ russians = new FastMap<Integer, L2Spawn>();
13224+ choses = new FastMap<Integer, FastList<L2PcInstance>>();
13225+ }
13226+
13227+ @Override
13228+ public boolean canAttack(L2PcInstance player, L2Object target)
13229+ {
13230+ return false;
13231+ }
13232+
13233+ @Override
13234+ protected void endEvent()
13235+ {
13236+ L2PcInstance winner = players.head().getNext().getKey();
13237+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
13238+
13239+ unspawnRussians();
13240+ debug("Event ended. 1 player survived");
13241+ EventManager.getInstance().end("Congratulation! 1 player survived the event!");
13242+
13243+ }
13244+
13245+ @Override
13246+ protected String getScorebar()
13247+ {
13248+ return "";
13249+ }
13250+
13251+ private void killRandomRussian()
13252+ {
13253+ FastList<Integer> ids = new FastList<Integer>();
13254+ for (int id : russians.keySet())
13255+ ids.add(id);
13256+ int russnum = ids.get(Rnd.get(ids.size()));
13257+ L2Spawn russian = russians.get(russnum);
13258+ unspawnNPC(russian);
13259+ announce(getPlayerList(), "The #" + russnum + " russian died.");
13260+
13261+ for (L2PcInstance victim : choses.get(russnum))
13262+ {
13263+ setStatus(victim, -1);
13264+ victim.stopAllEffects();
13265+ victim.reduceCurrentHp(victim.getMaxHp() + victim.getMaxCp() + 1, victim);
13266+ victim.sendMessage("Your russian died!");
13267+ victim.getAppearance().setNameColor(255, 255, 255);
13268+ }
13269+ debug("Russian #" + russnum + " died");
13270+ russians.remove(russnum);
13271+ }
13272+
13273+ @Override
13274+ public void onLogout(L2PcInstance player)
13275+ {
13276+ super.onLogout(player);
13277+
13278+ for (FastList<L2PcInstance> list : choses.values())
13279+ if (list.contains(player))
13280+ list.remove(player);
13281+ }
13282+
13283+ @Override
13284+ public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
13285+ {
13286+ if (npc.getNpcId() != getInt("russianNpcId"))
13287+ return false;
13288+
13289+ if (getStatus(player) != 0)
13290+ return true;
13291+
13292+ for (Map.Entry<Integer, L2Spawn> russian : russians.entrySet())
13293+ if (russian.getValue().getLastSpawn().getObjectId() == npc.getObjectId())
13294+ {
13295+ choses.get(russian.getKey()).add(player);
13296+ player.getAppearance().setNameColor(0, 255, 0);
13297+ player.broadcastUserInfo();
13298+ setStatus(player, 1);
13299+ }
13300+
13301+ return true;
13302+ }
13303+
13304+ private void removeAfkers()
13305+ {
13306+ int c = 0;
13307+ for (L2PcInstance player : getPlayerList())
13308+ if (getStatus(player) == 0)
13309+ {
13310+
13311+ player.sendMessage("Timeout!");
13312+ player.stopAllEffects();
13313+ player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, player);
13314+ setStatus(player, -1);
13315+ c++;
13316+ }
13317+ debug(c + " afkers removed");
13318+ }
13319+
13320+ @Override
13321+ public void reset()
13322+ {
13323+ super.reset();
13324+ round = 0;
13325+ russians.clear();
13326+ choses.clear();
13327+ }
13328+
13329+ @Override
13330+ protected void schedule(int time)
13331+ {
13332+ tpm.scheduleGeneral(task, time);
13333+ }
13334+
13335+ private void setStatus(EventState s)
13336+ {
13337+ eventState = s;
13338+ }
13339+
13340+ @Override
13341+ protected void showHtml(L2PcInstance player, int obj)
13342+ {
13343+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
13344+ TextBuilder sb = new TextBuilder();
13345+
13346+ 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>");
13347+ sb.append("<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>");
13348+ sb.append("<table width=270><tr><td><center>Russians left: " + russians.size() + "</td></tr></table>");
13349+ sb.append("<br><table width=270>");
13350+
13351+ for (L2PcInstance p : getPlayersOfTeam(1))
13352+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + (getStatus(p) == 1 ? "Dead" : "Alive") + "</td></tr>");
13353+
13354+ sb.append("</table></body></html>");
13355+ html.setHtml(sb.toString());
13356+ player.sendPacket(html);
13357+
13358+ }
13359+
13360+ private void spawnRussians()
13361+ {
13362+ for (int i = 1; i <= getInt("numberOfRussians"); i++)
13363+ {
13364+ int[] pos = getPosition("Russian", i);
13365+ russians.put(i, spawnNPC(pos[0], pos[1], pos[2], getInt("russianNpcId")));
13366+ choses.put(i, new FastList<L2PcInstance>());
13367+ russians.get(i).getLastSpawn().setTitle("--" + i + "--");
13368+ }
13369+ debug("Russians spawned");
13370+ }
13371+
13372+ @Override
13373+ protected void start()
13374+ {
13375+ setStatus(EventState.START);
13376+ schedule(1);
13377+ }
13378+
13379+ private void unspawnRussians()
13380+ {
13381+ for (L2Spawn russian : russians.values())
13382+ unspawnNPC(russian);
13383+
13384+ debug("Russians unspawned");
13385+ }
13386+}
13387\ No newline at end of file
13388Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java
13389===================================================================
13390--- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java (revision 1132)
13391+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java (working copy)
13392@@ -26,6 +26,7 @@
13393 import com.l2jfrozen.gameserver.GameServer;
13394 import com.l2jfrozen.gameserver.communitybbs.Manager.RegionBBSManager;
13395 import com.l2jfrozen.gameserver.datatables.SkillTable;
13396+import com.l2jfrozen.gameserver.event.EventManager;
13397 import com.l2jfrozen.gameserver.model.Inventory;
13398 import com.l2jfrozen.gameserver.model.L2Party;
13399 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
13400@@ -113,7 +114,12 @@
13401 sendPacket(RestartResponse.valueOf(false));
13402 return;
13403 }
13404-
13405+ if (EventManager.getInstance().isRegistered(player) && !EventManager.getInstance().getBoolean("restartAllowed"))
13406+ {
13407+ player.sendMessage("You cannot restart while you are a participant in an event.");
13408+ sendPacket(new ActionFailed());
13409+ return;
13410+ }
13411 // Prevent player from restarting if they are a festival participant
13412 // and it is in progress, otherwise notify party members that the player
13413 // is not longer a participant.
13414Index: head-src/com/l2jfrozen/gameserver/event/LMS.java
13415===================================================================
13416--- head-src/com/l2jfrozen/gameserver/event/LMS.java (nonexistent)
13417+++ head-src/com/l2jfrozen/gameserver/event/LMS.java (working copy)
13418@@ -0,0 +1,141 @@
13419+package com.l2jfrozen.gameserver.event;
13420+
13421+import javolution.text.TextBuilder;
13422+
13423+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
13424+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
13425+import com.l2jfrozen.util.random.Rnd;
13426+
13427+/**
13428+ * @author Rizel
13429+ *
13430+ */
13431+public class LMS extends Event
13432+{
13433+ private class Core implements Runnable
13434+ {
13435+ public void run()
13436+ {
13437+ try
13438+ {
13439+ switch (eventState)
13440+ {
13441+ case START:
13442+ divideIntoTeams(1);
13443+ preparePlayers();
13444+ teleportToTeamPos();
13445+ forceSitAll();
13446+ setStatus(EventState.FIGHT);
13447+ debug("The event started with " + players.size() + " players.");
13448+ schedule(20000);
13449+ break;
13450+
13451+ case FIGHT:
13452+ forceStandAll();
13453+ setStatus(EventState.END);
13454+ debug("The event started.");
13455+ clock.startClock(getInt("matchTime"));
13456+ break;
13457+
13458+ case END:
13459+ clock.setTime(0);
13460+ debug("The event ended.");
13461+ L2PcInstance winner = getPlayersWithStatus(0).get(Rnd.get(getPlayersWithStatus(0).size()));
13462+ giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
13463+ setStatus(EventState.INACTIVE);
13464+ EventManager.getInstance().end(winner.getName() + " is the Last Man Standing!");
13465+ break;
13466+ }
13467+ }
13468+ catch (Throwable e)
13469+ {
13470+ e.printStackTrace();
13471+ EventManager.getInstance().end("Error! Event ended.");
13472+ }
13473+ }
13474+ }
13475+
13476+ private enum EventState
13477+ {
13478+ START, FIGHT, END, INACTIVE
13479+ }
13480+
13481+ private EventState eventState;
13482+
13483+ private Core task;
13484+
13485+ public LMS()
13486+ {
13487+ super();
13488+ eventId = 4;
13489+ createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
13490+ task = new Core();
13491+ }
13492+
13493+ @Override
13494+ protected void endEvent()
13495+ {
13496+ setStatus(EventState.END);
13497+ clock.setTime(0);
13498+ }
13499+
13500+ @Override
13501+ protected String getScorebar()
13502+ {
13503+ return "Players: " + getPlayersWithStatus(0).size() + " Time: " + clock.getTime();
13504+ }
13505+
13506+ @Override
13507+ public void onKill(L2PcInstance victim, L2PcInstance killer)
13508+ {
13509+ super.onKill(victim, killer);
13510+ increasePlayersScore(killer);
13511+ setStatus(victim, 1);
13512+ if (getPlayersWithStatus(0).size() == 1)
13513+ {
13514+ setStatus(EventState.END);
13515+ clock.setTime(0);
13516+ }
13517+ }
13518+
13519+ @Override
13520+ protected void schedule(int time)
13521+ {
13522+ tpm.scheduleGeneral(task, time);
13523+ }
13524+
13525+ private void setStatus(EventState s)
13526+ {
13527+ eventState = s;
13528+ }
13529+
13530+ /* (non-Javadoc)
13531+ * @see net.sf.l2j.gameserver.event.Event#showHtml(net.sf.l2j.gameserver.model.actor.instance.L2PcInstance, int)
13532+ */
13533+ @Override
13534+ protected void showHtml(L2PcInstance player, int obj)
13535+ {
13536+ NpcHtmlMessage html = new NpcHtmlMessage(obj);
13537+ TextBuilder sb = new TextBuilder();
13538+
13539+ 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>");
13540+ sb.append("<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>");
13541+ sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
13542+ sb.append("<br><table width=270>");
13543+
13544+ for (L2PcInstance p : getPlayersOfTeam(1))
13545+ sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + (getStatus(p) == 1 ? "Dead" : "Alive") + "</td></tr>");
13546+
13547+ sb.append("</table></body></html>");
13548+ html.setHtml(sb.toString());
13549+ player.sendPacket(html);
13550+
13551+ }
13552+
13553+ @Override
13554+ protected void start()
13555+ {
13556+ setStatus(EventState.START);
13557+ schedule(1);
13558+ }
13559+}
13560\ No newline at end of file
13561#P L2jFrozen_DataPack
13562Index: data/html/default/9110.htm
13563===================================================================
13564--- data/html/default/9110.htm (nonexistent)
13565+++ data/html/default/9110.htm (working copy)
13566@@ -0,0 +1,3 @@
13567+<html><body>
13568+Use the Capture skill on the base in order to capture it and score for your team!
13569+</body></html>
13570\ No newline at end of file
13571Index: data/html/eventinfo/12.htm
13572===================================================================
13573--- data/html/eventinfo/12.htm (nonexistent)
13574+++ data/html/eventinfo/12.htm (working copy)
13575@@ -0,0 +1,23 @@
13576+<html><body>
13577+<table><tr><td><center><font color="FFFF00">Bomb Fight<br></font></center></td></tr>
13578+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13579+<tr><td>All players get a new skill Bomb</td></tr>
13580+<tr><td>This is the only skill you can deal dmg with</td></tr>
13581+<tr><td>3 seconds after you put a bomb, all surrounding enemies dies and you get scored</td></tr>
13582+<tr><td>Team with most kills wins</td></tr>
13583+<tr><td>If both teams got same score then a random team wins</td></tr>
13584+<tr><td>Reward for every 2 kills: 1 Medal</td></tr>
13585+<tr><td>Event reward: 1 apigas</td></tr>
13586+<tr><td>Event duration: 5 minutes</td></tr>
13587+<tr><td>Levels allowed: 40-80</td></tr>
13588+<tr><td>Minimum players: 8</td></tr>
13589+<tr><td>Self buff event</td></tr>
13590+<tr><td>Ressurection time: 7 Seconds<br></td></tr>
13591+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13592+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13593+<tr><td>Dualboxing is not allowed during event</td></tr>
13594+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13595+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13596+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13597+</table>
13598+</body></html>
13599\ No newline at end of file
13600Index: data/html/eventinfo/6.htm
13601===================================================================
13602--- data/html/eventinfo/6.htm (nonexistent)
13603+++ data/html/eventinfo/6.htm (working copy)
13604@@ -0,0 +1,25 @@
13605+<html><body>
13606+<table><tr><td><center><font color="FFFF00">Simon says<br></font></center></td></tr>
13607+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13608+<tr><td>The goal is to say exact text as the NPC says as fast as possible</td></tr>
13609+<tr><td>If player didnt say the text within 10 seconds he's out</td></tr>
13610+<tr><td>If player said the word wrong he is out</td></tr>
13611+<tr><td>If player said the word last he is out</td></tr>
13612+<tr><td>Red nick means you're out</td></tr>
13613+<tr><td>Green nick means you said the word correct</td></tr>
13614+<tr><td>All players are in sitting position during the event</td></tr>
13615+<tr><td>The winner is the last person to stay with green nick</td></tr>
13616+<tr><td>Event reward: 25 medals</td></tr>
13617+<tr><td>Levels allowed: 40-80</td></tr>
13618+<tr><td>Event duration: Until there's 1 winner</td></tr>
13619+<tr><td>Minimum players: 8</td></tr>
13620+<tr><td>Self buff event</td></tr>
13621+<tr><td>Ressurection time: None<br></td></tr>
13622+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13623+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13624+<tr><td>Dualboxing is not allowed during event</td></tr>
13625+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13626+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13627+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13628+</table>
13629+</body></html>
13630\ No newline at end of file
13631Index: data/html/default/9101.htm
13632===================================================================
13633--- data/html/default/9101.htm (nonexistent)
13634+++ data/html/default/9101.htm (working copy)
13635@@ -0,0 +1,3 @@
13636+<html><body>
13637+Say excactly what i say as soon as possible.
13638+</body></html>
13639\ No newline at end of file
13640Index: data/html/eventinfo/5.htm
13641===================================================================
13642--- data/html/eventinfo/5.htm (nonexistent)
13643+++ data/html/eventinfo/5.htm (working copy)
13644@@ -0,0 +1,23 @@
13645+<html><body>
13646+<table><tr><td><center><font color="FFFF00">Lucky Chests<br></font></center></td></tr>
13647+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13648+<tr><td>The goal is to have most chests succesfully opened</td></tr>
13649+<tr><td>There is a chance that a chest will explode and get you killed</td></tr>
13650+<tr><td>The event ends when alll chests are opened or time runs out</td></tr>
13651+<tr><td>The player with most chests opened wins</td></tr>
13652+<tr><td>If there's more than 1 player with max score, then a random player wins</td></tr>
13653+<tr><td>Reward for every Chest opened: 1 Medal</td></tr>
13654+<tr><td>Event reward: 20 medals</td></tr>
13655+<tr><td>Levels allowed: 40-80</td></tr>
13656+<tr><td>Event duration: 3 minutes</td></tr>
13657+<tr><td>Minimum players: 8</td></tr>
13658+<tr><td>Self buff event</td></tr>
13659+<tr><td>Ressurection time: 7 sec<br></td></tr>
13660+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13661+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13662+<tr><td>Dualboxing is not allowed during event</td></tr>
13663+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13664+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13665+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13666+</table>
13667+</body></html>
13668\ No newline at end of file
13669Index: sql/npc.sql
13670===================================================================
13671--- sql/npc.sql (revision 1132)
13672+++ sql/npc.sql (working copy)
13673@@ -6637,8 +6637,17 @@
13674 INSERT INTO `npc` VALUES ('35654', '35654', 'Court Magician', '0', 'Goddard', '0', 'Monster3.Elite_Mage', '6.50', '21.96', '70', 'male', 'L2CastleMagician', '40', '3862', '1493', '11.85', '2.78', '40', '43', '30', '21', '20', '10', '0', '0', '1314', '470', '780', '382', '278', '0', '333', '8687', '0', '0', '88', '132', null, '0', '0', '0', 'LAST_HIT');
13675 INSERT INTO `npc` VALUES ('35655', '35655', 'Court Magician', '0', 'Rune', '0', 'Monster3.Elite_Mage', '6.50', '21.96', '70', 'male', 'L2CastleMagician', '40', '3862', '1493', '11.85', '2.78', '40', '43', '30', '21', '20', '10', '0', '0', '1314', '470', '780', '382', '278', '0', '333', '8687', '0', '0', '88', '132', null, '0', '0', '0', 'LAST_HIT');
13676 INSERT INTO `npc` VALUES ('35656', '35656', 'Court Magician', '0', 'Schuttgart', '0', 'Monster3.Elite_Mage', '6.50', '21.96', '70', 'male', 'L2CastleMagician', '40', '3862', '1493', '11.85', '2.78', '40', '43', '30', '21', '20', '10', '0', '0', '1314', '470', '780', '382', '278', '0', '333', '8687', '0', '0', '88', '132', null, '0', '0', '0', 'LAST_HIT');
13677+INSERT INTO `npc` VALUES ('9101', '30026', 'Simon', 1, 'Event', 1, 'NPC.a_fighterguild_master_Mhuman', 8.00, 23.50, 70, 'male', 'L2Npc', 40, 3862, 1493, 11.85, 2.78, 40, 43, 30, 21, 20, 10, 0, 0, 1314, 470, 780, 382, 278, 0, 333, 0, 0, 0, 55, 132, NULL, 0, 1, 0, 'LAST_HIT'),
13678+INSERT INTO `npc` VALUES ('9102', '18284', 'Treasure Chest', '0', '', '0', 'LineageMonster.mimic', '8.50', '8.50', '78', 'male', 'L2Npc', 40, 4428, 1784, 13.43, 3.09, 40, 43, 30, 21, 20, 10, 7300, 799, 1715, 555, 1069, 451, 278, 0, 333, 0, 0, 0, 88, 181, NULL, NULL, 0, 0, 'LAST_HIT'),
13679+INSERT INTO `npc` VALUES ('9103', '31772', 'Zone', 1, '', 0, 'LineageNPC.heroes_obelisk_dwarf', 23.00, 80.00, 70, 'etc', 'L2Npc', 40, 3862, 1493, 11.85, 2.78, 40, 43, 30, 21, 20, 10, 0, 0, 1314, 470, 780, 382, 278, 0, 333, 0, 0, 0, 50, 120, NULL, NULL, 1, 0, 'LAST_HIT'),
13680+INSERT INTO `npc` VALUES ('9104', '35062', 'Blue Flag', 1, '', 0, 'Deco.flag_a', 21.00, 82.00, 1, 'etc', 'L2Npc', 40, 158000, 989, 3.16, 0.91, 40, 43, 30, 21, 20, 10, 0, 0, 652, 753, 358, 295, 423, 0, 333, 0, 0, 0, 55, 132, NULL, 0, 1, 0, 'LAST_HIT'),
13681+INSERT INTO `npc` VALUES ('9105', '35062', 'Red Flag', 1, '', 0, 'Deco.flag_a', 21.00, 82.00, 1, 'etc', 'L2Npc', 40, 158000, 989, 3.16, 0.91, 40, 43, 30, 21, 20, 10, 0, 0, 652, 753, 358, 295, 423, 0, 333, 0, 0, 0, 55, 132, NULL, 0, 1, 0, 'LAST_HIT'),
13682+INSERT INTO `npc` VALUES ('9106', '32027', 'Blue Flag Holder', 0, '', 0, 'NpcEV.grail_brazier_b', 9.50, 29.00, 78, 'male', 'L2Npc', 40, 3862, 1493, 11.85, 2.78, 40, 43, 30, 21, 20, 10, 0, 0, 1314, 470, 780, 382, 278, 0, 333, 0, 0, 0, 88, 132, NULL, 0, 0, 0, 'LAST_HIT'),
13683+INSERT INTO `npc` VALUES ('9107', '32027', 'Red Flag Holder', 0, '', 0, 'NpcEV.grail_brazier_b', 9.50, 29.00, 78, 'male', 'L2Npc', 40, 3862, 1493, 11.85, 2.78, 40, 43, 30, 21, 20, 10, 0, 0, 1314, 470, 780, 382, 278, 0, 333, 0, 0, 0, 88, 132, NULL, 0, 0, 0, 'LAST_HIT'),
13684+INSERT INTO `npc` VALUES ('9108', '18284', 'Russian', 0, '', 0, 'LineageMonster.mimic', 8.50, 8.50, 78, 'male', 'L2Npc', 40, 4428, 1784, 13.43, 3.09, 40, 43, 30, 21, 20, 10, 7300, 799, 1715, 555, 1069, 451, 278, 0, 333, 0, 0, 0, 88, 181, NULL, NULL, 0, 0, 'LAST_HIT'),
13685+INSERT INTO `npc` VALUES ('9109', '18284', 'Bomb', 1, '', 0, 'LineageMonster.mimic', 8.50, 8.50, 78, 'male', 'L2Npc', 40, 4428, 1784, 13.43, 3.09, 40, 43, 30, 21, 20, 10, 7300, 799, 1715, 555, 1069, 451, 278, 0, 333, 0, 0, 0, 88, 181, NULL, NULL, 0, 0, 'LAST_HIT'),
13686+INSERT INTO `npc` VALUES ('9110', '35062', 'Base', 1, '', 0, 'Deco.flag_a', 21.00, 82.00, 1, 'etc', 'L2Npc', 40, 158000, 989, 3.16, 0.91, 40, 43, 30, 21, 20, 10, 0, 0, 652, 753, 358, 295, 423, 0, 333, 0, 0, 0, 55, 132, NULL, 0, 1, 0, 'LAST_HIT');
13687 INSERT INTO `npc` VALUES ('55559', '32001', 'Preacher of Doom', '0', '', '0', 'Monster.dark_horror', '9.50', '29.00', '70', 'male', 'L2Npc', '40', '3862', '1493', '11.85', '2.78', '40', '43', '30', '21', '20', '10', '0', '0', '1314', '470', '780', '382', '278', '0', '333', '0', '0', '0', '88', '132', null, '0', '0', '0', 'LAST_HIT');
13688-
13689 INSERT INTO `npc` VALUES ('25164', '25164', 'Pet of Skylancer', '0', 'Raid Fighter', '0', 'Monster.skeleton_archer', '11.00', '27.00', '69', 'male', 'L2Minion', '500', '21176', '1493', '223.73', '8.75', '40', '43', '30', '41', '35', '10', '22852', '2260', '19755', '1840', '15424', '747', '249', '0', '227', '279', '0', '0', '80', '120', null, '0', '1', '0', 'LAST_HIT');
13690 INSERT INTO `npc` VALUES ('25165', '25165', 'Slave Warrior of Skylancer', '0', 'Raid Fighter', '0', 'Monster.bugbear', '17.00', '35.00', '69', 'male', 'L2Minion', '40', '15898', '1493', '223.73', '8.75', '40', '43', '30', '41', '35', '10', '22852', '2260', '6668', '1840', '8676', '747', '278', '0', '253', '0', '0', '0', '80', '120', null, '0', '0', '0', 'LAST_HIT');
13691 INSERT INTO `npc` VALUES ('27198', '27198', 'Gremlin', '0', '', '0', 'Monster.gremlin', '10.00', '15.00', '1', 'male', 'L2Monster', '40', '62', '44', '3.16', '0.91', '40', '43', '30', '21', '35', '10', '29', '2', '9', '39', '3', '32', '278', '0', '253', '0', '0', '0', '20', '50', null, '0', '0', '0', 'LAST_HIT');
13692Index: data/html/eventinfo/2.htm
13693===================================================================
13694--- data/html/eventinfo/2.htm (nonexistent)
13695+++ data/html/eventinfo/2.htm (working copy)
13696@@ -0,0 +1,23 @@
13697+<html><body>
13698+<table><tr><td><center><font color="FFFF00">Domination<br></font></center></td></tr>
13699+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13700+<tr><td>Team vs team event</td></tr>
13701+<tr><td>The goal is to have more players near the Zone than the enemy team</td></tr>
13702+<tr><td>For every second a team got more players than enemy team near zone, they get a point.</td></tr>
13703+<tr><td>the team with most Domination points wins</td></tr>
13704+<tr><td>If both team got same score, then a random team wins</td></tr>
13705+<tr><td>Reward for every kill: 1 medal</td></tr>
13706+<tr><td>Event reward: 10 medals</td></tr>
13707+<tr><td>Levels allowed: 70-80</td></tr>
13708+<tr><td>Event duration: 4 minutes</td></tr>
13709+<tr><td>Minimum players: 8</td></tr>
13710+<tr><td>Full buff event</td></tr>
13711+<tr><td>Ressurection time: 7 sec<br></td></tr>
13712+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13713+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13714+<tr><td>Dualboxing is not allowed during event</td></tr>
13715+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13716+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13717+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13718+</table>
13719+</body></html>
13720\ No newline at end of file
13721Index: data/html/eventinfo/10.htm
13722===================================================================
13723--- data/html/eventinfo/10.htm (nonexistent)
13724+++ data/html/eventinfo/10.htm (working copy)
13725@@ -0,0 +1,22 @@
13726+<html><body>
13727+<table><tr><td><center><font color="FFFF00">Capture the flag<br></font></center></td></tr>
13728+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13729+<tr><td>Each team has a flag they got to protect</td></tr>
13730+<tr><td>If a team takes enemy flag and bring it back they get scored</td></tr>
13731+<tr><td>Team with most flags taken wins</td></tr>
13732+<tr><td>If both teams has same score then a random team wins</td></tr>
13733+<tr><td>Reward for each flag taken: 4 medals</td></tr>
13734+<tr><td>Event reward: 10 medals</td></tr>
13735+<tr><td>Event duration: 5 minutes</td></tr>
13736+<tr><td>Levels allowed: 70-80</td></tr>
13737+<tr><td>Minimum players: 8</td></tr>
13738+<tr><td>Self buff event</td></tr>
13739+<tr><td>Ressurection time: 7 sec<br></td></tr>
13740+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13741+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13742+<tr><td>Dualboxing is not allowed during event</td></tr>
13743+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13744+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13745+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13746+</table>
13747+</body></html>
13748\ No newline at end of file
13749Index: data/html/eventinfo/3.htm
13750===================================================================
13751--- data/html/eventinfo/3.htm (nonexistent)
13752+++ data/html/eventinfo/3.htm (working copy)
13753@@ -0,0 +1,23 @@
13754+<html><body>
13755+<table><tr><td><center><font color="FFFF00">Double Domination<br></font></center></td></tr>
13756+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13757+<tr><td>Team vs team event</td></tr>
13758+<tr><td>The goal is to have more players near both Zones than the enemy team</td></tr>
13759+<tr><td>If a team got more players in both zones for 10 seconds, they get a point</td></tr>
13760+<tr><td>After a team gets scored, both teams gets teleported to intial locations</td></tr>
13761+<tr><td>the team with most domination points wins</td></tr>
13762+<tr><td>If both team got same score, then a random team wins</td></tr>
13763+<tr><td>Event reward: 2 apigas</td></tr>
13764+<tr><td>Levels allowed: 70-80</td></tr>
13765+<tr><td>Event duration: 4 minutes</td></tr>
13766+<tr><td>Minimum players: 8</td></tr>
13767+<tr><td>Full buff event</td></tr>
13768+<tr><td>Ressurection time: 7 sec<br></td></tr>
13769+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13770+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13771+<tr><td>Dualboxing is not allowed during event</td></tr>
13772+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13773+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13774+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13775+</table>
13776+</body></html>
13777\ No newline at end of file
13778Index: data/html/eventinfo/1.htm
13779===================================================================
13780--- data/html/eventinfo/1.htm (nonexistent)
13781+++ data/html/eventinfo/1.htm (working copy)
13782@@ -0,0 +1,21 @@
13783+<html><body>
13784+<table><tr><td><center><font color="FFFF00">Death Match<br></font></center></td></tr>
13785+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13786+<tr><td>All vs all event</td></tr>
13787+<tr><td>the player with most kills wins</td></tr>
13788+<tr><td>If there is more than 1 player with max score, then a random player wins</td></tr>
13789+<tr><td>Players will get 1 medal for every kill</td></tr>
13790+<tr><td>Event reward: 20 medals</td></tr>
13791+<tr><td>Levels allowed: 70-80</td></tr>
13792+<tr><td>Event duration: 4 minutes</td></tr>
13793+<tr><td>Minimum players: 8</td></tr>
13794+<tr><td>Full buff event</td></tr>
13795+<tr><td>Ressurection time: 7 sec<br></td></tr>
13796+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13797+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13798+<tr><td>Dualboxing is not allowed during event</td></tr>
13799+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13800+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13801+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13802+</table>
13803+</body></html>
13804\ No newline at end of file
13805Index: data/html/eventinfo/10.htm
13806===================================================================
13807--- data/html/eventinfo/10.htm (nonexistent)
13808+++ data/html/eventinfo/10.htm (working copy)
13809@@ -0,0 +1,22 @@
13810+<html><body>
13811+<table><tr><td><center><font color="FFFF00">Capture the flag<br></font></center></td></tr>
13812+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13813+<tr><td>Each team has a flag they got to protect</td></tr>
13814+<tr><td>If a team takes enemy flag and bring it back they get scored</td></tr>
13815+<tr><td>Team with most flags taken wins</td></tr>
13816+<tr><td>If both teams has same score then a random team wins</td></tr>
13817+<tr><td>Reward for each flag taken: 4 medals</td></tr>
13818+<tr><td>Event reward: 10 medals</td></tr>
13819+<tr><td>Event duration: 5 minutes</td></tr>
13820+<tr><td>Levels allowed: 70-80</td></tr>
13821+<tr><td>Minimum players: 8</td></tr>
13822+<tr><td>Self buff event</td></tr>
13823+<tr><td>Ressurection time: 7 sec<br></td></tr>
13824+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13825+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13826+<tr><td>Dualboxing is not allowed during event</td></tr>
13827+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13828+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13829+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13830+</table>
13831+</body></html>
13832\ No newline at end of file
13833Index: data/html/eventinfo/11.htm
13834===================================================================
13835--- data/html/eventinfo/11.htm (nonexistent)
13836+++ data/html/eventinfo/11.htm (working copy)
13837@@ -0,0 +1,24 @@
13838+<html><body>
13839+<table><tr><td><center><font color="FFFF00">Russian Roluette<br></font></center></td></tr>
13840+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13841+<tr><td>6 Chests spawns</td></tr>
13842+<tr><td>Every person need to choose a chest on every round</td></tr>
13843+<tr><td>Each round lasts for 10 seconds</td></tr>
13844+<tr><td>Green nick means u have choosen a chest for the round</td></tr>
13845+<tr><td>If you haven't choosen any chest you die</td></tr>
13846+<tr><td>If your chest dies you die</td></tr>
13847+<tr><td>Winners are all players who succesfully survived to the last chest</td></tr>
13848+<tr><td>Event reward: 15 medals</td></tr>
13849+<tr><td>Event duration: 4 minutes</td></tr>
13850+<tr><td>Levels allowed: 40-80</td></tr>
13851+<tr><td>Minimum players: 8</td></tr>
13852+<tr><td>Full buff event</td></tr>
13853+<tr><td>Ressurection time: None<br></td></tr>
13854+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13855+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13856+<tr><td>Dualboxing is not allowed during event</td></tr>
13857+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13858+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13859+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13860+</table>
13861+</body></html>
13862\ No newline at end of file
13863Index: data/html/eventinfo/12.htm
13864===================================================================
13865--- data/html/eventinfo/12.htm (nonexistent)
13866+++ data/html/eventinfo/12.htm (working copy)
13867@@ -0,0 +1,23 @@
13868+<html><body>
13869+<table><tr><td><center><font color="FFFF00">Bomb Fight<br></font></center></td></tr>
13870+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13871+<tr><td>All players get a new skill Bomb</td></tr>
13872+<tr><td>This is the only skill you can deal dmg with</td></tr>
13873+<tr><td>3 seconds after you put a bomb, all surrounding enemies dies and you get scored</td></tr>
13874+<tr><td>Team with most kills wins</td></tr>
13875+<tr><td>If both teams got same score then a random team wins</td></tr>
13876+<tr><td>Reward for every 2 kills: 1 Medal</td></tr>
13877+<tr><td>Event reward: 1 apigas</td></tr>
13878+<tr><td>Event duration: 5 minutes</td></tr>
13879+<tr><td>Levels allowed: 40-80</td></tr>
13880+<tr><td>Minimum players: 8</td></tr>
13881+<tr><td>Self buff event</td></tr>
13882+<tr><td>Ressurection time: 7 Seconds<br></td></tr>
13883+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13884+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13885+<tr><td>Dualboxing is not allowed during event</td></tr>
13886+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13887+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13888+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13889+</table>
13890+</body></html>
13891\ No newline at end of file
13892Index: data/html/eventinfo/13.htm
13893===================================================================
13894--- data/html/eventinfo/13.htm (nonexistent)
13895+++ data/html/eventinfo/13.htm (working copy)
13896@@ -0,0 +1,22 @@
13897+<html><body>
13898+<table><tr><td><center><font color="FFFF00">Mutant<br></font></center></td></tr>
13899+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13900+<tr><td>1 random player becomes a mutant</td></tr>
13901+<tr><td>Mutant gets: 3x p.def/m.def 2x p.atk/m.atk/c.spd/atk.spd and 30% resist to debuffs</td></tr>
13902+<tr><td>Only the mutant can score</td></tr>
13903+<tr><td>Everyone else can kill mutant only</td></tr>
13904+<tr><td>If 2 or more players get same score then a random player wins</td></tr>
13905+<tr><td>Event reward: 2 apigas</td></tr>
13906+<tr><td>Event duration: 4 minutes</td></tr>
13907+<tr><td>Levels allowed: 70-80</td></tr>
13908+<tr><td>Minimum players: 8</td></tr>
13909+<tr><td>Self buff event</td></tr>
13910+<tr><td>Ressurection time: 7 Seconds<br></td></tr>
13911+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13912+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13913+<tr><td>Dualboxing is not allowed during event</td></tr>
13914+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13915+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13916+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13917+</table>
13918+</body></html>
13919\ No newline at end of file
13920Index: data/html/eventinfo/14.htm
13921===================================================================
13922--- data/html/eventinfo/14.htm (nonexistent)
13923+++ data/html/eventinfo/14.htm (working copy)
13924@@ -0,0 +1,23 @@
13925+<html><body>
13926+<table><tr><td><center><font color="FFFF00">Battlefield<br></font></center></td></tr>
13927+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13928+<tr><td>All players get skill "Capture"</td></tr>
13929+<tr><td>The goal is to capture as much bases as possible</td></tr>
13930+<tr><td>For each base a team got they will get 1 point every second</td></tr>
13931+<tr><td>Team with most score wins</td></tr>
13932+<tr><td>If both teams got same score then a random team wins</td></tr>
13933+<tr><td>Reward for every base capture: 2 medals</td></tr>
13934+<tr><td>Event reward: 10 medals</td></tr>
13935+<tr><td>Event duration: 5 minutes</td></tr>
13936+<tr><td>Levels allowed: 70-80</td></tr>
13937+<tr><td>Minimum players: 8</td></tr>
13938+<tr><td>Full buff event</td></tr>
13939+<tr><td>Ressurection time: 7 Seconds<br></td></tr>
13940+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13941+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13942+<tr><td>Dualboxing is not allowed during event</td></tr>
13943+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13944+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13945+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13946+</table>
13947+</body></html>
13948\ No newline at end of file
13949Index: data/html/eventinfo/2.htm
13950===================================================================
13951--- data/html/eventinfo/2.htm (nonexistent)
13952+++ data/html/eventinfo/2.htm (working copy)
13953@@ -0,0 +1,23 @@
13954+<html><body>
13955+<table><tr><td><center><font color="FFFF00">Domination<br></font></center></td></tr>
13956+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13957+<tr><td>Team vs team event</td></tr>
13958+<tr><td>The goal is to have more players near the Zone than the enemy team</td></tr>
13959+<tr><td>For every second a team got more players than enemy team near zone, they get a point.</td></tr>
13960+<tr><td>the team with most Domination points wins</td></tr>
13961+<tr><td>If both team got same score, then a random team wins</td></tr>
13962+<tr><td>Reward for every kill: 1 medal</td></tr>
13963+<tr><td>Event reward: 10 medals</td></tr>
13964+<tr><td>Levels allowed: 70-80</td></tr>
13965+<tr><td>Event duration: 4 minutes</td></tr>
13966+<tr><td>Minimum players: 8</td></tr>
13967+<tr><td>Full buff event</td></tr>
13968+<tr><td>Ressurection time: 7 sec<br></td></tr>
13969+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13970+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
13971+<tr><td>Dualboxing is not allowed during event</td></tr>
13972+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
13973+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
13974+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
13975+</table>
13976+</body></html>
13977\ No newline at end of file
13978Index: data/html/eventinfo/3.htm
13979===================================================================
13980--- data/html/eventinfo/3.htm (nonexistent)
13981+++ data/html/eventinfo/3.htm (working copy)
13982@@ -0,0 +1,23 @@
13983+<html><body>
13984+<table><tr><td><center><font color="FFFF00">Double Domination<br></font></center></td></tr>
13985+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
13986+<tr><td>Team vs team event</td></tr>
13987+<tr><td>The goal is to have more players near both Zones than the enemy team</td></tr>
13988+<tr><td>If a team got more players in both zones for 10 seconds, they get a point</td></tr>
13989+<tr><td>After a team gets scored, both teams gets teleported to intial locations</td></tr>
13990+<tr><td>the team with most domination points wins</td></tr>
13991+<tr><td>If both team got same score, then a random team wins</td></tr>
13992+<tr><td>Event reward: 2 apigas</td></tr>
13993+<tr><td>Levels allowed: 70-80</td></tr>
13994+<tr><td>Event duration: 4 minutes</td></tr>
13995+<tr><td>Minimum players: 8</td></tr>
13996+<tr><td>Full buff event</td></tr>
13997+<tr><td>Ressurection time: 7 sec<br></td></tr>
13998+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
13999+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14000+<tr><td>Dualboxing is not allowed during event</td></tr>
14001+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14002+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14003+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14004+</table>
14005+</body></html>
14006\ No newline at end of file
14007Index: data/html/eventinfo/4.htm
14008===================================================================
14009--- data/html/eventinfo/4.htm (nonexistent)
14010+++ data/html/eventinfo/4.htm (working copy)
14011@@ -0,0 +1,20 @@
14012+<html><body>
14013+<table><tr><td><center><font color="FFFF00">Last man standing<br></font></center></td></tr>
14014+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14015+<tr><td>Free for all event</td></tr>
14016+<tr><td>The last person to stay alive is the winner</td></tr>
14017+<tr><td>Reward for every 2 kills: 1 Medal</td></tr>
14018+<tr><td>Event reward: 25 medals</td></tr>
14019+<tr><td>Levels allowed: 70-80</td></tr>
14020+<tr><td>Event duration: 5 minutes</td></tr>
14021+<tr><td>Minimum players: 8</td></tr>
14022+<tr><td>Full buff event</td></tr>
14023+<tr><td>Ressurection time: None<br></td></tr>
14024+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14025+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14026+<tr><td>Dualboxing is not allowed during event</td></tr>
14027+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14028+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14029+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14030+</table>
14031+</body></html>
14032\ No newline at end of file
14033Index: data/html/eventinfo/5.htm
14034===================================================================
14035--- data/html/eventinfo/5.htm (nonexistent)
14036+++ data/html/eventinfo/5.htm (working copy)
14037@@ -0,0 +1,23 @@
14038+<html><body>
14039+<table><tr><td><center><font color="FFFF00">Lucky Chests<br></font></center></td></tr>
14040+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14041+<tr><td>The goal is to have most chests succesfully opened</td></tr>
14042+<tr><td>There is a chance that a chest will explode and get you killed</td></tr>
14043+<tr><td>The event ends when alll chests are opened or time runs out</td></tr>
14044+<tr><td>The player with most chests opened wins</td></tr>
14045+<tr><td>If there's more than 1 player with max score, then a random player wins</td></tr>
14046+<tr><td>Reward for every Chest opened: 1 Medal</td></tr>
14047+<tr><td>Event reward: 20 medals</td></tr>
14048+<tr><td>Levels allowed: 40-80</td></tr>
14049+<tr><td>Event duration: 3 minutes</td></tr>
14050+<tr><td>Minimum players: 8</td></tr>
14051+<tr><td>Self buff event</td></tr>
14052+<tr><td>Ressurection time: 7 sec<br></td></tr>
14053+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14054+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14055+<tr><td>Dualboxing is not allowed during event</td></tr>
14056+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14057+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14058+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14059+</table>
14060+</body></html>
14061\ No newline at end of file
14062Index: data/html/eventinfo/6.htm
14063===================================================================
14064--- data/html/eventinfo/6.htm (nonexistent)
14065+++ data/html/eventinfo/6.htm (working copy)
14066@@ -0,0 +1,25 @@
14067+<html><body>
14068+<table><tr><td><center><font color="FFFF00">Simon says<br></font></center></td></tr>
14069+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14070+<tr><td>The goal is to say exact text as the NPC says as fast as possible</td></tr>
14071+<tr><td>If player didnt say the text within 10 seconds he's out</td></tr>
14072+<tr><td>If player said the word wrong he is out</td></tr>
14073+<tr><td>If player said the word last he is out</td></tr>
14074+<tr><td>Red nick means you're out</td></tr>
14075+<tr><td>Green nick means you said the word correct</td></tr>
14076+<tr><td>All players are in sitting position during the event</td></tr>
14077+<tr><td>The winner is the last person to stay with green nick</td></tr>
14078+<tr><td>Event reward: 25 medals</td></tr>
14079+<tr><td>Levels allowed: 40-80</td></tr>
14080+<tr><td>Event duration: Until there's 1 winner</td></tr>
14081+<tr><td>Minimum players: 8</td></tr>
14082+<tr><td>Self buff event</td></tr>
14083+<tr><td>Ressurection time: None<br></td></tr>
14084+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14085+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14086+<tr><td>Dualboxing is not allowed during event</td></tr>
14087+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14088+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14089+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14090+</table>
14091+</body></html>
14092\ No newline at end of file
14093Index: data/html/eventinfo/7.htm
14094===================================================================
14095--- data/html/eventinfo/7.htm (nonexistent)
14096+++ data/html/eventinfo/7.htm (working copy)
14097@@ -0,0 +1,21 @@
14098+<html><body>
14099+<table><tr><td><center><font color="FFFF00">Team vs team<br></font></center></td></tr>
14100+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14101+<tr><td>The goal is to get more kills than enemy team</td></tr>
14102+<tr><td>team with most score wins</td></tr>
14103+<tr><td>If both teams has same score then a random team wins</td></tr>
14104+<tr><td>Reward for every kill: 1 medal</td></tr>
14105+<tr><td>Event reward: 10 medals</td></tr>
14106+<tr><td>Event Duration: 5 minutes</td></tr>
14107+<tr><td>Levels allowed: 70-80</td></tr>
14108+<tr><td>Minimum players: 8</td></tr>
14109+<tr><td>Self buff event</td></tr>
14110+<tr><td>Ressurection time: 7 sec<br></td></tr>
14111+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14112+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14113+<tr><td>Dualboxing is not allowed during event</td></tr>
14114+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14115+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14116+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14117+</table>
14118+</body></html>
14119\ No newline at end of file
14120Index: data/html/eventinfo/8.htm
14121===================================================================
14122--- data/html/eventinfo/8.htm (nonexistent)
14123+++ data/html/eventinfo/8.htm (working copy)
14124@@ -0,0 +1,22 @@
14125+<html><body>
14126+<table><tr><td><center><font color="FFFF00">VIP<br></font></center></td></tr>
14127+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14128+<tr><td>The goal is to kill the enemy VIP</td></tr>
14129+<tr><td>team get score for every VIP kill</td></tr>
14130+<tr><td>If both teams has same score then a random team wins</td></tr>
14131+<tr><td>Event duration: 5 minutes</td></tr>
14132+<tr><td>team with most VIP kills wins</td></tr>
14133+<tr><td>Reward per VIP kill: 3 medals</td></tr>
14134+<tr><td>Event reward: 10 medals</td></tr>
14135+<tr><td>Levels allowed: 70-80</td></tr>
14136+<tr><td>Minimum players: 8</td></tr>
14137+<tr><td>Self buff event</td></tr>
14138+<tr><td>Ressurection time: 7 sec<br></td></tr>
14139+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14140+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14141+<tr><td>Dualboxing is not allowed during event</td></tr>
14142+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14143+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14144+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14145+</table>
14146+</body></html>
14147\ No newline at end of file
14148Index: data/html/eventinfo/9.htm
14149===================================================================
14150--- data/html/eventinfo/9.htm (nonexistent)
14151+++ data/html/eventinfo/9.htm (working copy)
14152@@ -0,0 +1,20 @@
14153+<html><body>
14154+<table><tr><td><center><font color="FFFF00">Zombies<br></font></center></td></tr>
14155+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14156+<tr><td>1 Random person turns into a zombie</td></tr>
14157+<tr><td>zombie gets 2 medal for every "kill"</td></tr>
14158+<tr><td>Last to stay human wins</td></tr>
14159+<tr><td>Event reward: 2 apigas</td></tr>
14160+<tr><td>Event duration: 4 minutes</td></tr>
14161+<tr><td>Levels allowed: 40-80</td></tr>
14162+<tr><td>Minimum players: 8</td></tr>
14163+<tr><td>Self buff event</td></tr>
14164+<tr><td>Ressurection time: None<br></td></tr>
14165+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14166+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14167+<tr><td>Dualboxing is not allowed during event</td></tr>
14168+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14169+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14170+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14171+</table>
14172+</body></html>
14173\ No newline at end of file
14174Index: data/html/eventinfo/7.htm
14175===================================================================
14176--- data/html/eventinfo/7.htm (nonexistent)
14177+++ data/html/eventinfo/7.htm (working copy)
14178@@ -0,0 +1,21 @@
14179+<html><body>
14180+<table><tr><td><center><font color="FFFF00">Team vs team<br></font></center></td></tr>
14181+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14182+<tr><td>The goal is to get more kills than enemy team</td></tr>
14183+<tr><td>team with most score wins</td></tr>
14184+<tr><td>If both teams has same score then a random team wins</td></tr>
14185+<tr><td>Reward for every kill: 1 medal</td></tr>
14186+<tr><td>Event reward: 10 medals</td></tr>
14187+<tr><td>Event Duration: 5 minutes</td></tr>
14188+<tr><td>Levels allowed: 70-80</td></tr>
14189+<tr><td>Minimum players: 8</td></tr>
14190+<tr><td>Self buff event</td></tr>
14191+<tr><td>Ressurection time: 7 sec<br></td></tr>
14192+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14193+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14194+<tr><td>Dualboxing is not allowed during event</td></tr>
14195+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14196+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14197+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14198+</table>
14199+</body></html>
14200\ No newline at end of file
14201Index: data/html/eventinfo/11.htm
14202===================================================================
14203--- data/html/eventinfo/11.htm (nonexistent)
14204+++ data/html/eventinfo/11.htm (working copy)
14205@@ -0,0 +1,24 @@
14206+<html><body>
14207+<table><tr><td><center><font color="FFFF00">Russian Roluette<br></font></center></td></tr>
14208+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14209+<tr><td>6 Chests spawns</td></tr>
14210+<tr><td>Every person need to choose a chest on every round</td></tr>
14211+<tr><td>Each round lasts for 10 seconds</td></tr>
14212+<tr><td>Green nick means u have choosen a chest for the round</td></tr>
14213+<tr><td>If you haven't choosen any chest you die</td></tr>
14214+<tr><td>If your chest dies you die</td></tr>
14215+<tr><td>Winners are all players who succesfully survived to the last chest</td></tr>
14216+<tr><td>Event reward: 15 medals</td></tr>
14217+<tr><td>Event duration: 4 minutes</td></tr>
14218+<tr><td>Levels allowed: 40-80</td></tr>
14219+<tr><td>Minimum players: 8</td></tr>
14220+<tr><td>Full buff event</td></tr>
14221+<tr><td>Ressurection time: None<br></td></tr>
14222+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14223+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14224+<tr><td>Dualboxing is not allowed during event</td></tr>
14225+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14226+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14227+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14228+</table>
14229+</body></html>
14230\ No newline at end of file
14231Index: data/html/eventinfo/4.htm
14232===================================================================
14233--- data/html/eventinfo/4.htm (nonexistent)
14234+++ data/html/eventinfo/4.htm (working copy)
14235@@ -0,0 +1,20 @@
14236+<html><body>
14237+<table><tr><td><center><font color="FFFF00">Last man standing<br></font></center></td></tr>
14238+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14239+<tr><td>Free for all event</td></tr>
14240+<tr><td>The last person to stay alive is the winner</td></tr>
14241+<tr><td>Reward for every 2 kills: 1 Medal</td></tr>
14242+<tr><td>Event reward: 25 medals</td></tr>
14243+<tr><td>Levels allowed: 70-80</td></tr>
14244+<tr><td>Event duration: 5 minutes</td></tr>
14245+<tr><td>Minimum players: 8</td></tr>
14246+<tr><td>Full buff event</td></tr>
14247+<tr><td>Ressurection time: None<br></td></tr>
14248+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14249+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14250+<tr><td>Dualboxing is not allowed during event</td></tr>
14251+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14252+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14253+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14254+</table>
14255+</body></html>
14256\ No newline at end of file
14257Index: sql/custom_npc.sql
14258===================================================================
14259--- sql/custom_npc.sql (revision 1132)
14260+++ sql/custom_npc.sql (working copy)
14261@@ -51,3 +51,5 @@
14262 INSERT ignore INTO custom_npc
14263 values
14264 ('31228', '31228', 'Roy the Cat', '1', 'Classes Trader', '1', 'Monster.cat_the_cat', '9.00', '16.00', '70', 'male', 'L2ClassMaster', '40', '3862', '1493', '11.85', '2.78', '40', '43', '30', '21', '20', '10', '490', '10', '1335', '470', '780', '382', '278', '0', '333', '0', '0', '0', '88', '132', null, '0', '0', '0', 'LAST_HIT');
14265+
14266+INSERT INTO `custom_npc` VALUES ('50001', '31822', 'Event Manager', '1', 'L2Warcraft', '1', 'LineageMonster5.br_wooldie', '10', '16', '80', 'male', 'L2EventManager', '40', '20000000', '40', '8.5', '3', '40', '43', '30', '21', '20', '20', '0', '0', '8', '40', '5', '30', '253', '0', '333', '0', '0', '0', '25', '120', 'Null', '0', '0', '0', 'LAST_HIT');
14267\ No newline at end of file
14268Index: data/stats/skills/5200-5299.xml
14269===================================================================
14270--- data/stats/skills/5200-5299.xml (revision 1132)
14271+++ data/stats/skills/5200-5299.xml (working copy)
14272@@ -298,7 +298,7 @@
14273 <set name="effectRange" val="900"/>
14274 </skill>
14275 <!-- Status:Fixed Pack:l2jfrozen author:Nefer -->
14276- <skill id="5219" levels="1" name="Huge Pig Stun">
14277+ <!-- <skill id="5219" levels="1" name="Huge Pig Stun">
14278 <set name="magicLvl" val="95"/>
14279 <set name="lvlDepend" val="1"/>
14280 <set name="power" val="50"/>
14281@@ -332,7 +332,31 @@
14282 <for>
14283 <effect count="5" name="Fear" time="6" val="0"/>
14284 </for>
14285- </skill>
14286+ </skill> -->
14287+ <skill id="5219" levels="1" name="Capture">
14288+ <set name="mpInitialConsume" val="50" />
14289+ <set name="target" val="TARGET_ONE" />
14290+ <set name="reuseDelay" val="10000" />
14291+ <set name="hitTime" val="2000" />
14292+ <set name="staticReuse" val="true" />
14293+ <set name="staticHitTime" val="true" />
14294+ <set name="skillType" val="CAPTURE" />
14295+ <set name="operateType" val="OP_ACTIVE" />
14296+ <set name="castRange" val="85" />
14297+ <set name="effectRange" val="400" />
14298+ </skill>
14299+ <skill id="5220" levels="1" name="Bomb">
14300+ <set name="mpInitialConsume" val="50" />
14301+ <set name="target" val="TARGET_SELF" />
14302+ <set name="reuseDelay" val="10000" />
14303+ <set name="hitTime" val="1000" />
14304+ <set name="staticReuse" val="true" />
14305+ <set name="staticHitTime" val="true" />
14306+ <set name="skillType" val="BOMB" />
14307+ <set name="operateType" val="OP_ACTIVE" />
14308+ <set name="castRange" val="85" />
14309+ <set name="effectRange" val="400" />
14310+</skill>
14311 <!-- Status:Fixed Pack:l2jfrozen author:Nefer -->
14312 <skill id="5267" levels="9" name="Trap Explosion">
14313 <table name="#magicLvl">28 36 44 48 52 56 60 68 74</table>
14314Index: data/html/eventinfo/1.htm
14315===================================================================
14316--- data/html/eventinfo/1.htm (nonexistent)
14317+++ data/html/eventinfo/1.htm (working copy)
14318@@ -0,0 +1,21 @@
14319+<html><body>
14320+<table><tr><td><center><font color="FFFF00">Death Match<br></font></center></td></tr>
14321+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14322+<tr><td>All vs all event</td></tr>
14323+<tr><td>the player with most kills wins</td></tr>
14324+<tr><td>If there is more than 1 player with max score, then a random player wins</td></tr>
14325+<tr><td>Players will get 1 medal for every kill</td></tr>
14326+<tr><td>Event reward: 20 medals</td></tr>
14327+<tr><td>Levels allowed: 70-80</td></tr>
14328+<tr><td>Event duration: 4 minutes</td></tr>
14329+<tr><td>Minimum players: 8</td></tr>
14330+<tr><td>Full buff event</td></tr>
14331+<tr><td>Ressurection time: 7 sec<br></td></tr>
14332+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14333+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14334+<tr><td>Dualboxing is not allowed during event</td></tr>
14335+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14336+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14337+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14338+</table>
14339+</body></html>
14340\ No newline at end of file
14341Index: sql/phoenix.sql
14342===================================================================
14343--- sql/phoenix.sql (nonexistent)
14344+++ sql/phoenix.sql (working copy)
14345@@ -0,0 +1,32 @@
14346+CREATE TABLE IF NOT EXISTS `event_stats` (
14347+ `id` int(11) NOT NULL AUTO_INCREMENT,
14348+ `player` int(11) NOT NULL,
14349+ `event` int(2) NOT NULL,
14350+ `num` int(11) NOT NULL,
14351+ `wins` int(11) NOT NULL,
14352+ `losses` int(11) NOT NULL,
14353+ `kills` int(11) NOT NULL,
14354+ `deaths` int(11) NOT NULL,
14355+ `scores` int(11) NOT NULL,
14356+ PRIMARY KEY (`id`)
14357+) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
14358+
14359+CREATE TABLE IF NOT EXISTS `event_stats_full` (
14360+ `id` int(11) NOT NULL AUTO_INCREMENT,
14361+ `player` int(11) NOT NULL,
14362+ `num` int(11) NOT NULL,
14363+ `winpercent` int(11) NOT NULL,
14364+ `kdratio` double NOT NULL,
14365+ `wins` int(11) NOT NULL,
14366+ `losses` int(11) NOT NULL,
14367+ `kills` int(11) NOT NULL,
14368+ `deaths` int(11) NOT NULL,
14369+ `favevent` int(11) NOT NULL,
14370+ PRIMARY KEY (`id`)
14371+) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
14372+
14373+CREATE TABLE IF NOT EXISTS `event_buffs` (
14374+ `player` varchar(30) NOT NULL,
14375+ `buffs` varchar(200) NOT NULL,
14376+ PRIMARY KEY (`player`)
14377+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
14378\ No newline at end of file
14379Index: data/html/eventinfo/13.htm
14380===================================================================
14381--- data/html/eventinfo/13.htm (nonexistent)
14382+++ data/html/eventinfo/13.htm (working copy)
14383@@ -0,0 +1,22 @@
14384+<html><body>
14385+<table><tr><td><center><font color="FFFF00">Mutant<br></font></center></td></tr>
14386+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14387+<tr><td>1 random player becomes a mutant</td></tr>
14388+<tr><td>Mutant gets: 3x p.def/m.def 2x p.atk/m.atk/c.spd/atk.spd and 30% resist to debuffs</td></tr>
14389+<tr><td>Only the mutant can score</td></tr>
14390+<tr><td>Everyone else can kill mutant only</td></tr>
14391+<tr><td>If 2 or more players get same score then a random player wins</td></tr>
14392+<tr><td>Event reward: 2 apigas</td></tr>
14393+<tr><td>Event duration: 4 minutes</td></tr>
14394+<tr><td>Levels allowed: 70-80</td></tr>
14395+<tr><td>Minimum players: 8</td></tr>
14396+<tr><td>Self buff event</td></tr>
14397+<tr><td>Ressurection time: 7 Seconds<br></td></tr>
14398+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14399+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14400+<tr><td>Dualboxing is not allowed during event</td></tr>
14401+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14402+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14403+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14404+</table>
14405+</body></html>
14406\ No newline at end of file
14407Index: data/stats/skills/9000-9099.xml
14408===================================================================
14409--- data/stats/skills/9000-9099.xml (revision 1132)
14410+++ data/stats/skills/9000-9099.xml (working copy)
14411@@ -109,4 +109,20 @@
14412 <add order="0x10" stat="STR" val="#lvl"/>
14413 </for>
14414 </skill>
14415+ <skill id="9007" levels="1" name="Mutant">
14416+ <set name="target" val="TARGET_SELF" />
14417+ <set name="skillType" val="BUFF" />
14418+ <set name="operateType" val="OP_PASSIVE" />
14419+ <for>
14420+ <mul order="0x30" stat="pDef" val="5" />
14421+ <mul order="0x30" stat="mDef" val="5" />
14422+ <mul order="0x30" stat="mAtk" val="3" />
14423+ <mul order="0x30" stat="pAtk" val="3" />
14424+ <mul order="0x30" stat="mAtkSpd" val="2" />
14425+ <mul order="0x30" stat="pAtkSpd" val="2" />
14426+ <mul order="0x30" stat="rootVuln" val="0.7"/>
14427+ <mul order="0x30" stat="stunVuln" val="0.7"/>
14428+ <mul order="0x30" stat="paralyzeVuln" val="0.7"/>
14429+ </for>
14430+ </skill>
14431 </list>
14432\ No newline at end of file
14433Index: data/html/eventinfo/9.htm
14434===================================================================
14435--- data/html/eventinfo/9.htm (nonexistent)
14436+++ data/html/eventinfo/9.htm (working copy)
14437@@ -0,0 +1,20 @@
14438+<html><body>
14439+<table><tr><td><center><font color="FFFF00">Zombies<br></font></center></td></tr>
14440+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14441+<tr><td>1 Random person turns into a zombie</td></tr>
14442+<tr><td>zombie gets 2 medal for every "kill"</td></tr>
14443+<tr><td>Last to stay human wins</td></tr>
14444+<tr><td>Event reward: 2 apigas</td></tr>
14445+<tr><td>Event duration: 4 minutes</td></tr>
14446+<tr><td>Levels allowed: 40-80</td></tr>
14447+<tr><td>Minimum players: 8</td></tr>
14448+<tr><td>Self buff event</td></tr>
14449+<tr><td>Ressurection time: None<br></td></tr>
14450+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14451+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14452+<tr><td>Dualboxing is not allowed during event</td></tr>
14453+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14454+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14455+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14456+</table>
14457+</body></html>
14458\ No newline at end of file
14459Index: data/html/eventinfo/8.htm
14460===================================================================
14461--- data/html/eventinfo/8.htm (nonexistent)
14462+++ data/html/eventinfo/8.htm (working copy)
14463@@ -0,0 +1,22 @@
14464+<html><body>
14465+<table><tr><td><center><font color="FFFF00">VIP<br></font></center></td></tr>
14466+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14467+<tr><td>The goal is to kill the enemy VIP</td></tr>
14468+<tr><td>team get score for every VIP kill</td></tr>
14469+<tr><td>If both teams has same score then a random team wins</td></tr>
14470+<tr><td>Event duration: 5 minutes</td></tr>
14471+<tr><td>team with most VIP kills wins</td></tr>
14472+<tr><td>Reward per VIP kill: 3 medals</td></tr>
14473+<tr><td>Event reward: 10 medals</td></tr>
14474+<tr><td>Levels allowed: 70-80</td></tr>
14475+<tr><td>Minimum players: 8</td></tr>
14476+<tr><td>Self buff event</td></tr>
14477+<tr><td>Ressurection time: 7 sec<br></td></tr>
14478+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14479+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14480+<tr><td>Dualboxing is not allowed during event</td></tr>
14481+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14482+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14483+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14484+</table>
14485+</body></html>
14486\ No newline at end of file
14487Index: data/html/eventinfo/14.htm
14488===================================================================
14489--- data/html/eventinfo/14.htm (nonexistent)
14490+++ data/html/eventinfo/14.htm (working copy)
14491@@ -0,0 +1,23 @@
14492+<html><body>
14493+<table><tr><td><center><font color="FFFF00">Battlefield<br></font></center></td></tr>
14494+<tr><td><font color="00CCFF"><b>Event Information</b></font></td></tr>
14495+<tr><td>All players get skill "Capture"</td></tr>
14496+<tr><td>The goal is to capture as much bases as possible</td></tr>
14497+<tr><td>For each base a team got they will get 1 point every second</td></tr>
14498+<tr><td>Team with most score wins</td></tr>
14499+<tr><td>If both teams got same score then a random team wins</td></tr>
14500+<tr><td>Reward for every base capture: 2 medals</td></tr>
14501+<tr><td>Event reward: 10 medals</td></tr>
14502+<tr><td>Event duration: 5 minutes</td></tr>
14503+<tr><td>Levels allowed: 70-80</td></tr>
14504+<tr><td>Minimum players: 8</td></tr>
14505+<tr><td>Full buff event</td></tr>
14506+<tr><td>Ressurection time: 7 Seconds<br></td></tr>
14507+<tr><td><font color="00CCFF"><b>Rules</b></font></td></tr>
14508+<tr><td><font color="FF0000">Be Warned!</font></td></tr>
14509+<tr><td>Dualboxing is not allowed during event</td></tr>
14510+<tr><td>Feeding enemy team is not allowed, this means buffing/going in naked etc.</td></tr>
14511+<tr><td>In general if a char registers just to ruin event he gets risked getting punished.<br></td></tr>
14512+<tr><td><center><font color="9933FF">www.L2Warcraft.com<br></font></center></td></tr>
14513+</table>
14514+</body></html>
14515\ No newline at end of file
14516Index: data/html/default/9103.htm
14517===================================================================
14518--- data/html/default/9103.htm (nonexistent)
14519+++ data/html/default/9103.htm (working copy)
14520@@ -0,0 +1,7 @@
14521+<html><body>
14522+Instructions:<br>
14523+Incase of Domination:<br>
14524+The team must have more players near the Zone than the enemy in order to score.<br><br>
14525+Incase of Double Domination:<br>
14526+The team must have more players in both zones for 10 seconds than the enemy in order to score.
14527+</body></html>
14528\ No newline at end of file