View difference between Paste ID: hGcmUrg5 and 4br0dVnn
SHOW: | | - or go back to the newest paste.
1
### Eclipse Workspace Patch 1.0
2
#P L2jFrozen_GameServer
3
Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/Say2.java
4
===================================================================
5
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/Say2.java	(revision 936)
6
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/Say2.java	(working copy)
7
@@ -27,6 +27,8 @@
8
 
9
 import com.l2jfrozen.Config;
10
 import com.l2jfrozen.gameserver.datatables.csv.MapRegionTable;
11
+import com.l2jfrozen.gameserver.event.EventManager;
12
+import com.l2jfrozen.gameserver.event.LMS;
13
 import com.l2jfrozen.gameserver.handler.IVoicedCommandHandler;
14
 import com.l2jfrozen.gameserver.handler.VoicedCommandHandler;
15
 import com.l2jfrozen.gameserver.managers.PetitionManager;
16
@@ -64,6 +66,8 @@
17
 	public final static int PARTYROOM_ALL = 16; //(Red)
18
 	public final static int PARTYROOM_COMMANDER = 15; //(Yellow)
19
 	public final static int HERO_VOICE = 17; //%
20
+	
21
+	private boolean _isInLMS;
22
 
23
 	private final static String[] CHAT_NAMES =
24
 	{
25
@@ -277,6 +281,18 @@
26
 		}
27
 		
28
 		CreatureSay cs = new CreatureSay(activeChar.getObjectId(), _type, activeChar.getName(), _text);
29
+		
30
+		if(EventManager.getInstance().isRegistered(activeChar))
31
+				EventManager.getInstance().getCurrentEvent().onSay(_type, activeChar, _text);
32
+		
33
+		_isInLMS = EventManager.getInstance().isRegistered(activeChar) && EventManager.getInstance().getCurrentEvent() instanceof LMS;
34
+		
35
+		if(_isInLMS)
36
+		{
37
+			activeChar.sendMessage("You cannot talk while in LMS");
38
+			return;
39
+		}
40
+		
41
 		switch(_type)
42
 		{
43
 			case TELL:
44
Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java
45
===================================================================
46
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java	(revision 936)
47
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java	(working copy)
48
@@ -24,6 +24,7 @@
49
 import com.l2jfrozen.gameserver.GameServer;
50
 import com.l2jfrozen.gameserver.communitybbs.Manager.RegionBBSManager;
51
 import com.l2jfrozen.gameserver.datatables.SkillTable;
52
+import com.l2jfrozen.gameserver.event.EventManager;
53
 import com.l2jfrozen.gameserver.model.Inventory;
54
 import com.l2jfrozen.gameserver.model.L2Party;
55
 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
56
@@ -111,6 +112,13 @@
57
 			sendPacket(RestartResponse.valueOf(false));
58
 			return;
59
 		}
60
+		
61
+        if(EventManager.getInstance().isRegistered(player) && !EventManager.getInstance().getBoolean("restartAllowed"))
62
+    	{
63
+    		player.sendMessage("You cannot restart while you are a participant in an event.");
64
+    		sendPacket(new ActionFailed());
65
+    		return;
66
+    	}
67
 
68
 		// Prevent player from restarting if they are a festival participant
69
 		// and it is in progress, otherwise notify party members that the player
70
Index: head-src/com/l2jfrozen/gameserver/event/CTF.java
71
===================================================================
72
--- head-src/com/l2jfrozen/gameserver/event/CTF.java	(revision 0)
73
+++ head-src/com/l2jfrozen/gameserver/event/CTF.java	(revision 0)
74
@@ -0,0 +1,401 @@
75
+package com.l2jfrozen.gameserver.event;
76
+
77
+import javolution.text.TextBuilder;
78
+
79
+import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
80
+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
81
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
82
+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
83
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
84
+import com.l2jfrozen.gameserver.model.Inventory;
85
+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
86
+import com.l2jfrozen.gameserver.network.serverpackets.InventoryUpdate;
87
+import com.l2jfrozen.gameserver.network.serverpackets.ItemList;
88
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
89
+import com.l2jfrozen.gameserver.network.serverpackets.SocialAction;
90
+import com.l2jfrozen.gameserver.templates.L2EtcItemType;
91
+
92
+public class CTF extends Event
93
+{
94
+	private class Core implements Runnable
95
+	{
96
+
97
+		public void run()
98
+		{
99
+			try
100
+			{
101
+				switch (eventState)
102
+				{
103
+					case START:
104
+						divideIntoTeams(2);
105
+						preparePlayers();
106
+						teleportToTeamPos();
107
+						createPartyOfTeam(1);
108
+						createPartyOfTeam(2);
109
+						forceSitAll();
110
+						spawnFlagsAndHolders();
111
+						setStatus(EventState.FIGHT);
112
+						debug("The event started with " + players.size() + " players");
113
+						schedule(20000);
114
+						break;
115
+
116
+					case FIGHT:
117
+						forceStandAll();
118
+						setStatus(EventState.END);
119
+						debug("The fight started");
120
+						clock.startClock(getInt("matchTime"));
121
+						break;
122
+
123
+					case END:
124
+						clock.setTime(0);
125
+						if (winnerTeam == 0)
126
+							winnerTeam = getWinnerTeam();
127
+						
128
+						unspawnFlagsAndHolders();
129
+						debug("The flags unspawned");
130
+						if (playerWithRedFlag != null)
131
+							unequipFlag(playerWithRedFlag);
132
+						if (playerWithBlueFlag != null)
133
+							unequipFlag(playerWithBlueFlag);
134
+						giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
135
+						setStatus(EventState.INACTIVE);
136
+						debug("The event ended. Winner: " + winnerTeam);
137
+						EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Flags taken!");
138
+						break;
139
+				}
140
+			}
141
+			catch (Throwable e)
142
+			{
143
+				e.printStackTrace();
144
+				EventManager.getInstance().end("Error! Event ended.");
145
+			}
146
+		}
147
+	}
148
+
149
+	private enum EventState
150
+	{
151
+		START, FIGHT, END, TELEPORT, INACTIVE
152
+	}
153
+
154
+	private EventState eventState;
155
+
156
+	private Core task;
157
+
158
+	private L2Spawn redFlagNpc;
159
+	private L2Spawn blueFlagNpc;
160
+	private L2Spawn redHolderNpc;
161
+	private L2Spawn blueHolderNpc;
162
+	private int redFlagStatus;
163
+	private int blueFlagStatus;
164
+	private L2PcInstance playerWithRedFlag;
165
+	private L2PcInstance playerWithBlueFlag;
166
+
167
+	public CTF()
168
+	{
169
+		super();
170
+		eventId = 10;
171
+		createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
172
+		createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
173
+		task = new Core();
174
+		winnerTeam = 0;
175
+		playerWithRedFlag = null;
176
+		playerWithBlueFlag = null;
177
+		blueFlagStatus = 0;
178
+		redFlagStatus = 0;
179
+
180
+	}
181
+
182
+	@Override
183
+	protected void endEvent()
184
+	{
185
+		winnerTeam = players.head().getNext().getValue()[0];
186
+
187
+		setStatus(EventState.END);
188
+		clock.setTime(0);
189
+
190
+	}
191
+
192
+	private void equipFlag(L2PcInstance player, int flag)
193
+	{
194
+		L2ItemInstance wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
195
+		if (wpn != null)
196
+			player.getInventory().unEquipItemInBodySlotAndRecord(Inventory.PAPERDOLL_RHAND);
197
+
198
+		wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
199
+		if (wpn != null)
200
+			player.getInventory().unEquipItemInBodySlotAndRecord(Inventory.PAPERDOLL_LHAND);
201
+
202
+		player.getInventory().equipItem(ItemTable.getInstance().createItem("", 6718, 1, player, null));
203
+		player.broadcastPacket(new SocialAction(player.getObjectId(), 16));
204
+		switch (flag)
205
+		{
206
+			case 1:
207
+				playerWithBlueFlag = player;
208
+				announce(getPlayerList(), player.getName() + " took the Blue flag!");
209
+				unspawnNPC(blueFlagNpc);
210
+				break;
211
+			case 2:
212
+				playerWithRedFlag = player;
213
+				announce(getPlayerList(), player.getName() + " took the Red flag!");
214
+				unspawnNPC(redFlagNpc);
215
+				break;
216
+			default:
217
+				break;
218
+		}
219
+		player.broadcastUserInfo();
220
+		CreatureSay cs = new CreatureSay(player.getObjectId(), 15, ":", "You got it! Run back! ::"); // 8D
221
+		player.sendPacket(cs);
222
+	}
223
+
224
+	@Override
225
+	protected String getScorebar()
226
+	{
227
+		return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + "  " + teams.get(2).getName() + ": " + teams.get(2).getScore() + "  Time: " + clock.getTime();
228
+	}
229
+
230
+	@Override
231
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
232
+	{
233
+		super.onDie(victim, killer);
234
+		if (playerWithRedFlag == victim)
235
+		{
236
+			announce(getPlayerList(), victim.getName() + " dropped the Red flag!");
237
+			redFlagStatus = 2;
238
+			unequipFlag(victim);
239
+			redFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("redFlagId"));
240
+		}
241
+		if (playerWithBlueFlag == victim)
242
+		{
243
+			announce(getPlayerList(), victim.getName() + " dropped the Blue flag!");
244
+			blueFlagStatus = 2;
245
+			unequipFlag(victim);
246
+			blueFlagNpc = spawnNPC(victim.getX(), victim.getY(), victim.getZ(), getInt("blueFlagId"));
247
+		}
248
+
249
+		addToResurrector(victim);
250
+	}
251
+
252
+	@Override
253
+	public void onLogout(L2PcInstance player)
254
+	{
255
+		super.onLogout(player);
256
+
257
+		if (playerWithRedFlag == player)
258
+		{
259
+			announce(getPlayerList(), player.getName() + " dropped the Red flag!");
260
+			redFlagStatus = 2;
261
+			unequipFlag(player);
262
+			redFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("redFlagId"));
263
+		}
264
+		if (playerWithBlueFlag == player)
265
+		{
266
+			announce(getPlayerList(), player.getName() + " dropped the Blue flag!");
267
+			blueFlagStatus = 2;
268
+			unequipFlag(player);
269
+			blueFlagNpc = spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("blueFlagId"));
270
+		}
271
+
272
+	}
273
+
274
+	@Override
275
+	public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
276
+	{
277
+		if (!(npc.getNpcId() == getInt("blueFlagId") || npc.getNpcId() == getInt("blueFlagHolderId") || npc.getNpcId() == getInt("redFlagId") || npc.getNpcId() == getInt("redFlagHolderId")))
278
+			return false;
279
+
280
+		//Blue holder
281
+		if (npc.getNpcId() == getInt("blueFlagHolderId"))
282
+			if (player == playerWithRedFlag && blueFlagStatus == 0)
283
+			{
284
+				announce(getPlayerList(), "The Blue team scored!");
285
+				teams.get(getTeam(player)).increaseScore();
286
+				increasePlayersScore(player);
287
+				player.addItem("Event", 6392, 4, player, true);
288
+				returnFlag(2);
289
+			}
290
+
291
+		//Red holder
292
+		if (npc.getNpcId() == getInt("redFlagHolderId"))
293
+			if (player == playerWithBlueFlag && redFlagStatus == 0)
294
+			{
295
+				announce(getPlayerList(), "The Red team scored!");
296
+				teams.get(getTeam(player)).increaseScore();
297
+				increasePlayersScore(player);
298
+				player.addItem("Event", 6392, 4, player, true);
299
+				returnFlag(1);
300
+			}
301
+
302
+		//Blue flag
303
+		if (npc.getNpcId() == getInt("blueFlagId"))
304
+		{
305
+			if (blueFlagStatus == 2)
306
+			{
307
+				//blue player
308
+				if (getTeam(player) == 1)
309
+					returnFlag(1);
310
+
311
+				//red player
312
+				if (getTeam(player) == 2)
313
+					equipFlag(player, 1);
314
+			}
315
+			if (blueFlagStatus == 0)
316
+				if (getTeam(player) == 2)
317
+				{
318
+					equipFlag(player, 1);
319
+					unspawnNPC(blueFlagNpc);
320
+					blueFlagStatus = 1;
321
+				}
322
+
323
+		}
324
+
325
+		//Red flag
326
+		if (npc.getNpcId() == getInt("redFlagId"))
327
+		{
328
+			if (redFlagStatus == 2)
329
+			{
330
+				//red player
331
+				if (getTeam(player) == 2)
332
+					returnFlag(2);
333
+
334
+				//blue player
335
+				if (getTeam(player) == 1)
336
+					equipFlag(player, 2);
337
+			}
338
+			if (redFlagStatus == 0)
339
+				if (getTeam(player) == 1)
340
+				{
341
+					equipFlag(player, 2);
342
+					unspawnNPC(redFlagNpc);
343
+					redFlagStatus = 1;
344
+				}
345
+		}
346
+		return true;
347
+	}
348
+
349
+	@Override
350
+	public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
351
+	{
352
+		if (playerWithRedFlag == player || playerWithBlueFlag == player)
353
+			return false;
354
+
355
+		if (item.getItemType() == L2EtcItemType.POTION)
356
+			return false;
357
+		
358
+		return true;
359
+	}
360
+
361
+	private void returnFlag(int flag)
362
+	{
363
+		int[] pos;
364
+		switch (flag)
365
+		{
366
+			case 1:
367
+				if (playerWithBlueFlag != null)
368
+					unequipFlag(playerWithBlueFlag);
369
+				if (blueFlagStatus == 2)
370
+					unspawnNPC(blueFlagNpc);
371
+
372
+				pos = getPosition("BlueFlag", 1);
373
+				blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
374
+				blueFlagStatus = 0;
375
+				announce(getPlayerList(), "The Blue flag returned!");
376
+				break;
377
+
378
+			case 2:
379
+				if (playerWithRedFlag != null)
380
+					unequipFlag(playerWithRedFlag);
381
+				if (redFlagStatus == 2)
382
+					unspawnNPC(redFlagNpc);
383
+
384
+				pos = getPosition("RedFlag", 1);
385
+				redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
386
+				redFlagStatus = 0;
387
+				announce(getPlayerList(), "The Red flag returned!");
388
+				break;
389
+		}
390
+	}
391
+
392
+	@Override
393
+	protected void schedule(int time)
394
+	{
395
+		tpm.scheduleGeneral(task, time);
396
+	}
397
+
398
+	private void setStatus(EventState s)
399
+	{
400
+		eventState = s;
401
+	}
402
+
403
+	@Override
404
+	protected void showHtml(L2PcInstance player, int obj)
405
+	{
406
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
407
+		TextBuilder sb = new TextBuilder();
408
+
409
+		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>");
410
+		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>");
411
+		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>");
412
+		sb.append("<br><table width=270>");
413
+		int i = 0;
414
+		for (EventTeam team : teams.values())
415
+		{
416
+			i++;
417
+			sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
418
+			for (L2PcInstance p : getPlayersOfTeam(i))
419
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
420
+		}
421
+
422
+		sb.append("</table></body></html>");
423
+		html.setHtml(sb.toString());
424
+		player.sendPacket(html);
425
+
426
+	}
427
+
428
+	private void spawnFlagsAndHolders()
429
+	{
430
+		int[] pos = getPosition("BlueFlag", 1);
431
+		blueFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("blueFlagId"));
432
+		blueHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("blueFlagHolderId"));
433
+
434
+		pos = getPosition("RedFlag", 1);
435
+		redFlagNpc = spawnNPC(pos[0], pos[1], pos[2], getInt("redFlagId"));
436
+		redHolderNpc = spawnNPC(pos[0]+50, pos[1], pos[2], getInt("redFlagHolderId"));
437
+		debug("The flags spawned.");
438
+	}
439
+
440
+	@Override
441
+	protected void start()
442
+	{
443
+		setStatus(EventState.START);
444
+		schedule(1);
445
+	}
446
+
447
+	private void unequipFlag(L2PcInstance player)
448
+	{
449
+		L2ItemInstance wpn = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
450
+		if (wpn != null)
451
+		{
452
+			L2ItemInstance[] unequiped = player.getInventory().unEquipItemInBodySlotAndRecord(wpn.getItem().getBodyPart());
453
+			player.getInventory().destroyItemByItemId("", 6718, 1, player, null);
454
+			InventoryUpdate iu = new InventoryUpdate();
455
+			for (L2ItemInstance element : unequiped)
456
+				iu.addModifiedItem(element);
457
+			player.sendPacket(iu);
458
+			player.sendPacket(new ItemList(player, true));
459
+			player.broadcastUserInfo();
460
+		}
461
+
462
+		if (player == playerWithRedFlag)
463
+			playerWithRedFlag = null;
464
+		if (player == playerWithBlueFlag)
465
+			playerWithBlueFlag = null;
466
+	}
467
+
468
+	private void unspawnFlagsAndHolders()
469
+	{
470
+		unspawnNPC(blueFlagNpc);
471
+		unspawnNPC(blueHolderNpc);
472
+		unspawnNPC(redFlagNpc);
473
+		unspawnNPC(redHolderNpc);
474
+	}
475
+}
476
\ No newline at end of file
477
Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/CharInfo.java
478
===================================================================
479
--- head-src/com/l2jfrozen/gameserver/network/serverpackets/CharInfo.java	(revision 936)
480
+++ head-src/com/l2jfrozen/gameserver/network/serverpackets/CharInfo.java	(working copy)
481
@@ -22,12 +22,15 @@
482
 import java.util.logging.Logger;
483
 
484
 import com.l2jfrozen.Config;
485
+import com.l2jfrozen.gameserver.event.EventManager;
486
 import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
487
 import com.l2jfrozen.gameserver.managers.CursedWeaponsManager;
488
 import com.l2jfrozen.gameserver.model.Inventory;
489
 import com.l2jfrozen.gameserver.model.L2Character;
490
 import com.l2jfrozen.gameserver.model.actor.instance.L2CubicInstance;
491
 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
492
+import com.l2jfrozen.gameserver.event.LMS;
493
+import com.l2jfrozen.gameserver.event.dm;
494
 import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
495
 
496
 /**
497
@@ -80,6 +83,8 @@
498
 	private int _runSpd, _walkSpd, _swimRunSpd, _swimWalkSpd, _flRunSpd, _flWalkSpd, _flyRunSpd, _flyWalkSpd;
499
 	private float _moveMultiplier, _attackSpeedMultiplier;
500
 	private int _maxCp;
501
+	private boolean _isInLMS;
502
+	private boolean _isInDM;
503
 
504
 	/**
505
 	 * @param cha 
506
@@ -101,6 +106,8 @@
507
 		_swimRunSpd = _flRunSpd = _flyRunSpd = _runSpd;
508
 		_swimWalkSpd = _flWalkSpd = _flyWalkSpd = _walkSpd;
509
 		_maxCp = _activeChar.getMaxCp();
510
+		_isInLMS = EventManager.getInstance().isRegistered(_activeChar) && EventManager.getInstance().getCurrentEvent() instanceof LMS;
511
+		_isInDM = EventManager.getInstance().isRegistered(_activeChar) && EventManager.getInstance().getCurrentEvent() instanceof dm;
512
 	}
513
 
514
 	@Override
515
@@ -163,7 +170,15 @@
516
 				//	writeC(_activeChar.getAppearance().getInvisible() ? 1 : 0); // invisible ?? 0=false  1=true   2=summoned (only works if model has a summon animation)
517
 				//}
518
 
519
-				writeS(_activeChar.getName());
520
+				if(_isInLMS || _isInDM)
521
+				{
522
+					writeS("Player");
523
+				}
524
+				else
525
+				{			
526
+					writeS(_activeChar.getName());
527
+				}
528
+				//->writeS(_activeChar.getName());
529
 
530
 				if(_activeChar.getAppearance().getInvisible())
531
 				//if(gmSeeInvis)
532
@@ -208,7 +223,14 @@
533
 			writeD(_z);
534
 			writeD(_heading);
535
 			writeD(_activeChar.getObjectId());
536
-			writeS(_activeChar.getName());
537
+			if(_isInLMS || _isInDM)
538
+			{
539
+				writeS("Player");
540
+			}
541
+			else
542
+			{
543
+				writeS(_activeChar.getName());
544
+			}
545
 			writeD(_activeChar.getRace().ordinal());
546
 			writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
547
 
548
@@ -221,18 +243,36 @@
549
 				writeD(_activeChar.getBaseClass());
550
 			}
551
 
552
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR));
553
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
554
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
555
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
556
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
557
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
558
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
559
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
560
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
561
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
562
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
563
-			writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
564
+			if(_isInLMS || _isInDM)
565
+            {
566
+				 writeD(0);
567
+				 writeD(0);
568
+				 writeD(0);
569
+				 writeD(0);
570
+				 writeD(0);
571
+				 writeD(6408);
572
+				 writeD(0);
573
+				 writeD(0);
574
+				 writeD(0);
575
+				 writeD(0);
576
+				 writeD(0);
577
+				 writeD(0);
578
+            }
579
+            else
580
+            {
581
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR));
582
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
583
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
584
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
585
+	   		 	 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
586
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
587
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
588
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
589
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
590
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
591
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
592
+	   			 writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
593
+            }
594
 
595
 			// c6 new h's
596
 			writeH(0x00);
597
@@ -294,10 +334,20 @@
598
 				writeS(_activeChar.getTitle());
599
 			}
600
 
601
-			writeD(_activeChar.getClanId());
602
-			writeD(_activeChar.getClanCrestId());
603
-			writeD(_activeChar.getAllyId());
604
-			writeD(_activeChar.getAllyCrestId());
605
+	        if(_isInLMS || _isInDM)
606
+            {
607
+				writeD(0);
608
+				writeD(0);
609
+				writeD(0);
610
+				writeD(0);
611
+            }
612
+            else
613
+            {
614
+            	writeD(_activeChar.getClanId());
615
+    			writeD(_activeChar.getClanCrestId());
616
+    			writeD(_activeChar.getAllyId());
617
+    			writeD(_activeChar.getAllyCrestId());
618
+            }
619
 			// In UserInfo leader rights and siege flags, but here found nothing??
620
 			// Therefore RelationChanged packet with that info is required
621
 			writeD(0);
622
Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/Logout.java
623
===================================================================
624
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/Logout.java	(revision 936)
625
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/Logout.java	(working copy)
626
@@ -19,6 +19,7 @@
627
 import com.l2jfrozen.Config;
628
 import com.l2jfrozen.gameserver.communitybbs.Manager.RegionBBSManager;
629
 import com.l2jfrozen.gameserver.datatables.SkillTable;
630
+import com.l2jfrozen.gameserver.event.EventManager;
631
 import com.l2jfrozen.gameserver.model.L2Party;
632
 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
633
 import com.l2jfrozen.gameserver.model.entity.olympiad.Olympiad;
634
@@ -90,6 +91,13 @@
635
 			player.sendPacket(SystemMessage.sendString("A superior power doesn't allow you to leave the event."));
636
 			return;
637
 		}
638
+		
639
+		if(EventManager.getInstance().isRegistered(player) && !EventManager.getInstance().getBoolean("restartAllowed"))
640
+		{
641
+			player.sendMessage("You cannot logout while you are a participant in an event.");
642
+			sendPacket(new ActionFailed());
643
+			return;
644
+		}
645
 
646
 		if(player.isInOlympiadMode() || Olympiad.getInstance().isRegistered(player))
647
 		{
648
Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java
649
===================================================================
650
--- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java	(revision 936)
651
+++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2PcInstance.java	(working copy)
652
@@ -138,7 +138,7 @@
653
 import com.l2jfrozen.gameserver.model.entity.Duel;
654
 import com.l2jfrozen.gameserver.model.entity.event.CTF;
655
 import com.l2jfrozen.gameserver.model.entity.event.DM;
656
-import com.l2jfrozen.gameserver.model.entity.event.L2Event;
657
+//import com.l2jfrozen.gameserver.model.entity.event.L2Event;
658
 import com.l2jfrozen.gameserver.model.entity.event.TvT;
659
 import com.l2jfrozen.gameserver.model.entity.event.VIP;
660
 import com.l2jfrozen.gameserver.model.entity.olympiad.Olympiad;
661
@@ -233,7 +233,7 @@
662
 import com.l2jfrozen.util.Point3D;
663
 import com.l2jfrozen.util.database.L2DatabaseFactory;
664
 import com.l2jfrozen.util.random.Rnd;
665
-
666
+import com.l2jfrozen.gameserver.event.EventManager;
667
 
668
 /**
669
  * This class represents all player characters in the world. There is always a client-thread connected to this (except
670
@@ -4545,7 +4545,7 @@
671
 			return;
672
 		}
673
 		
674
-		if(L2Event.active && eventSitForced)
675
+		if (EventManager.getInstance().isRunning() && eventSitForced)
676
 		{
677
 			sendMessage("A dark force beyond your mortal understanding makes your knees to shake when you try to stand up ...");
678
 		}
679
@@ -5883,6 +5883,11 @@
680
                 return;
681
             }
682
         }
683
+		if(!EventManager.getInstance().canTargetPlayer(this, player))
684
+		{
685
+			player.sendPacket(new ActionFailed());
686
+			return;
687
+		}
688
 		// Check if the L2PcInstance is confused
689
 		if(player.isOutOfControl())
690
 		{
691
@@ -7296,6 +7301,19 @@
692
 					doPkInfo(pk);
693
 				}
694
 			}
695
+			
696
+			L2PcInstance ek = null;
697
+			
698
+			if (killer instanceof L2PcInstance)
699
+				ek = (L2PcInstance) killer;
700
+			if(killer instanceof L2Summon)
701
+				ek = ((L2Summon) killer).getOwner();
702
+			
703
+			if(ek != null && EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered(ek))
704
+			{
705
+				EventManager.getInstance().getCurrentEvent().onKill(this,ek);
706
+				EventManager.getInstance().getCurrentEvent().onDie(this,ek);
707
+			}
708
 
709
 			if(atEvent && pk != null)
710
 			{
711
@@ -7754,6 +7772,9 @@
712
 		// If in duel and you kill (only can kill l2summon), do nothing
713
 		if(isInDuel() && targetPlayer.isInDuel())
714
 			return;
715
+		
716
+		if (EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered(targetPlayer))
717
+			return;
718
 
719
 		// If in Arena, do nothing
720
 		if(isInsideZone(ZONE_PVP) || targetPlayer.isInsideZone(ZONE_PVP))
721
@@ -8432,6 +8453,9 @@
722
 
723
 		if(isInsideZone(ZONE_PVP))
724
 			return;
725
+		
726
+		if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
727
+			return;
728
 
729
 		setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_NORMAL_TIME);
730
 
731
@@ -8461,6 +8485,9 @@
732
 
733
 		if(player_target == null)
734
 			return;
735
+		
736
+		if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
737
+			return;
738
 
739
 		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))
740
 			return;
741
@@ -8579,6 +8606,9 @@
742
 		{
743
 			_log.fine(getName() + " died and lost " + lostExp + " experience.");
744
 		}
745
+		
746
+		if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
747
+			lostExp = 0;
748
 
749
 		// Set the new Experience value of the L2PcInstance
750
 		getStat().addExp(-lostExp);
751
@@ -11818,6 +11848,9 @@
752
 			// Check if the L2PcInstance is in an arena or a siege area
753
 			if(isInsideZone(ZONE_PVP) && ((L2PcInstance) attacker).isInsideZone(ZONE_PVP))
754
 				return true;
755
+			
756
+			if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance)attacker) && EventManager.getInstance().isRunning())
757
+				return true;
758
 
759
 			if(getClan() != null)
760
 			{
761
@@ -11907,6 +11940,17 @@
762
 	 */
763
 	public void useMagic(L2Skill skill, boolean forceUse, boolean dontMove)
764
 	{
765
+		if(EventManager.getInstance().isRegistered(this)) 
766
+		 	if(!EventManager.getInstance().getCurrentEvent().getBoolean("allowUseMagic")) 
767
+		 	{ 
768
+		 		sendPacket(new ActionFailed()); 
769
+		 		return; 
770
+		 	} 
771
+		
772
+		if(EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(this))
773
+			if(!EventManager.getInstance().getCurrentEvent().onUseMagic(skill))
774
+				return;
775
+		
776
 		if(isDead())
777
 		{
778
 			abortCast();
779
@@ -12617,6 +12661,9 @@
780
 			//SkillDat skilldatpet = getCurrentPetSkill();
781
 			if(skill.isPvpSkill()) // pvp skill
782
 			{
783
+				if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance)target) && EventManager.getInstance().isRunning())
784
+					return true;
785
+				
786
 				if(getClan() != null && ((L2PcInstance)target).getClan() != null)
787
 				{
788
 					if(getClan().isAtWarWith(((L2PcInstance)target).getClan().getClanId()) && ((L2PcInstance)target).getClan().isAtWarWith(getClan().getClanId()))
789
@@ -12631,6 +12678,9 @@
790
 			else if ((skilldat != null && !skilldat.isCtrlPressed() && skill.isOffensive() && !srcIsSummon)
791
 					/*|| (skilldatpet != null && !skilldatpet.isCtrlPressed() && skill.isOffensive() && srcIsSummon)*/)
792
 			{
793
+				if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRegistered((L2PcInstance)target) && EventManager.getInstance().isRunning())
794
+					return true;
795
+				
796
 				if(getClan() != null && ((L2PcInstance)target).getClan() != null)
797
 				{
798
 					if(getClan().isAtWarWith(((L2PcInstance)target).getClan().getClanId()) && ((L2PcInstance)target).getClan().isAtWarWith(getClan().getClanId()))
799
@@ -14855,6 +14905,9 @@
800
 	 */
801
 	public synchronized boolean setActiveClass(int classIndex)
802
 	{
803
+		if(EventManager.getInstance().players.contains(this)) 
804
+			return false;
805
+		
806
 		if(isInCombat() || this.getAI().getIntention() == CtrlIntention.AI_INTENTION_ATTACK){
807
 			sendMessage("Impossible switch class if in combat");
808
 			sendPacket( ActionFailed.STATIC_PACKET );
809
@@ -16378,6 +16431,10 @@
810
 			setXYZ(_obsX, _obsY, _obsZ);
811
 		}
812
 		
813
+		EventManager.getInstance().onLogout(this);
814
+		if(EventManager.getInstance().isRegistered(this))
815
+			EventManager.getInstance().getCurrentEvent().onLogout(this);
816
+		
817
 	      if(isTeleporting())
818
 	        {
819
 	         try
820
@@ -17641,6 +17698,9 @@
821
 	{
822
 		if(getDeathPenaltyBuffLevel() >= 15) //maximum level reached
823
 			return;
824
+		
825
+		if(EventManager.getInstance().isRegistered(this) && EventManager.getInstance().isRunning())
826
+			return;
827
 
828
 		if(getDeathPenaltyBuffLevel() != 0)
829
 		{
830
Index: head-src/com/l2jfrozen/gameserver/event/Domination.java
831
===================================================================
832
--- head-src/com/l2jfrozen/gameserver/event/Domination.java	(revision 0)
833
+++ head-src/com/l2jfrozen/gameserver/event/Domination.java	(revision 0)
834
@@ -0,0 +1,197 @@
835
+package com.l2jfrozen.gameserver.event;
836
+
837
+import javolution.text.TextBuilder;
838
+import javolution.util.FastList;
839
+
840
+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
841
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
842
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
843
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
844
+
845
+public class Domination extends Event
846
+{
847
+	private class Core implements Runnable
848
+	{
849
+		public void run()
850
+		{
851
+			try
852
+			{
853
+				switch (eventState)
854
+				{
855
+					case START:
856
+						divideIntoTeams(2);
857
+						preparePlayers();
858
+						teleportToTeamPos();
859
+						createPartyOfTeam(1);
860
+						createPartyOfTeam(2);
861
+						forceSitAll();
862
+						debug("The event started with " + players.size() + " player");
863
+						setStatus(EventState.FIGHT);
864
+						schedule(20000);
865
+						break;
866
+
867
+					case FIGHT:
868
+						forceStandAll();
869
+						setStatus(EventState.END);
870
+						debug("The event started");
871
+						clock.startClock(getInt("matchTime"));
872
+						break;
873
+
874
+					case END:
875
+						clock.setTime(0);
876
+						if (winnerTeam == 0)
877
+							winnerTeam = getWinnerTeam();
878
+						
879
+						giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
880
+						unSpawnZones();
881
+						setStatus(EventState.INACTIVE);
882
+						debug("The event ended. Winner: " + winnerTeam);
883
+						EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Domination points!");
884
+						break;
885
+				}
886
+			}
887
+			catch (Throwable e)
888
+			{
889
+				e.printStackTrace();
890
+				EventManager.getInstance().end("Error! Event ended.");
891
+			}
892
+		}
893
+	}
894
+
895
+	private enum EventState
896
+	{
897
+		START, FIGHT, END, INACTIVE
898
+	}
899
+
900
+	private EventState eventState;
901
+
902
+	private Core task;
903
+
904
+	private FastList<L2Spawn> zones;
905
+
906
+	public Domination()
907
+	{
908
+		super();
909
+		eventId = 2;
910
+		createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
911
+		createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
912
+		task = new Core();
913
+		zones = new FastList<L2Spawn>();
914
+		winnerTeam = 0;
915
+	}
916
+
917
+	@Override
918
+	protected void clockTick()
919
+	{
920
+		int team1 = 0;
921
+		int team2 = 0;
922
+
923
+		for (L2PcInstance player : getPlayerList())
924
+			switch (getTeam(player))
925
+			{
926
+				case 1:
927
+					if (Math.sqrt(player.getPlanDistanceSq(zones.getFirst().getLastSpawn())) <= getInt("zoneRadius"))
928
+						team1++;
929
+					break;
930
+
931
+				case 2:
932
+					if (Math.sqrt(player.getPlanDistanceSq(zones.getFirst().getLastSpawn())) <= getInt("zoneRadius"))
933
+						team2++;
934
+					break;
935
+			}
936
+
937
+		if (team1 > team2)
938
+		{
939
+			for (L2PcInstance player : getPlayersOfTeam(1))
940
+				increasePlayersScore(player);
941
+			teams.get(1).increaseScore();
942
+		}
943
+
944
+		if (team2 > team1)
945
+		{
946
+			for (L2PcInstance player : getPlayersOfTeam(2))
947
+				increasePlayersScore(player);
948
+			teams.get(2).increaseScore();
949
+		}
950
+
951
+	}
952
+
953
+	@Override
954
+	protected void endEvent()
955
+	{
956
+		setStatus(EventState.END);
957
+		clock.setTime(0);
958
+
959
+	}
960
+
961
+	@Override
962
+	protected String getScorebar()
963
+	{
964
+		return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + "  " + teams.get(2).getName() + ": " + teams.get(2).getScore() + "  Time: " + clock.getTime();
965
+	}
966
+
967
+	@Override
968
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
969
+	{
970
+		super.onDie(victim, killer);
971
+		killer.addItem("Event", 6392, 1, killer, true);
972
+		addToResurrector(victim);
973
+	}
974
+
975
+	@Override
976
+	protected void schedule(int time)
977
+	{
978
+		tpm.scheduleGeneral(task, time);
979
+	}
980
+
981
+	private void setStatus(EventState s)
982
+	{
983
+		eventState = s;
984
+	}
985
+
986
+	@Override
987
+	protected void showHtml(L2PcInstance player, int obj)
988
+	{
989
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
990
+		TextBuilder sb = new TextBuilder();
991
+
992
+		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>");
993
+		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>");
994
+		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>");
995
+		sb.append("<br><table width=270>");
996
+		int i = 0;
997
+		for (EventTeam team : teams.values())
998
+		{
999
+			i++;
1000
+			sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
1001
+			for (L2PcInstance p : getPlayersOfTeam(i))
1002
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
1003
+		}
1004
+
1005
+		sb.append("</table></body></html>");
1006
+		html.setHtml(sb.toString());
1007
+		player.sendPacket(html);
1008
+
1009
+	}
1010
+
1011
+	@Override
1012
+	protected void start()
1013
+	{
1014
+		int[] npcpos = getPosition("Zone", 1);
1015
+		zones.add(spawnNPC(npcpos[0], npcpos[1], npcpos[2], getInt("zoneNpcId")));
1016
+		setStatus(EventState.START);
1017
+		schedule(1);
1018
+	}
1019
+
1020
+	private void unSpawnZones()
1021
+	{
1022
+		for (L2Spawn s : zones)
1023
+		{
1024
+			s.getLastSpawn().deleteMe();
1025
+			s.stopRespawn();
1026
+			SpawnTable.getInstance().deleteSpawn(s, true);
1027
+			zones.remove(s);
1028
+		}
1029
+	}
1030
+
1031
+}
1032
\ No newline at end of file
1033
Index: head-src/com/l2jfrozen/gameserver/GameServer.java
1034
===================================================================
1035
--- head-src/com/l2jfrozen/gameserver/GameServer.java	(revision 936)
1036
+++ head-src/com/l2jfrozen/gameserver/GameServer.java	(working copy)
1037
@@ -74,6 +74,9 @@
1038
 import com.l2jfrozen.gameserver.datatables.xml.AugmentationData;
1039
 import com.l2jfrozen.gameserver.datatables.xml.ExperienceData;
1040
 import com.l2jfrozen.gameserver.datatables.xml.ZoneData;
1041
+import com.l2jfrozen.gameserver.event.EventBuffer;
1042
+import com.l2jfrozen.gameserver.event.EventManager;
1043
+import com.l2jfrozen.gameserver.event.EventStats;
1044
 import com.l2jfrozen.gameserver.geo.GeoData;
1045
 import com.l2jfrozen.gameserver.geo.geoeditorcon.GeoEditorListener;
1046
 import com.l2jfrozen.gameserver.geo.pathfinding.PathFinding;
1047
@@ -118,7 +121,7 @@
1048
 import com.l2jfrozen.gameserver.model.entity.Announcements;
1049
 import com.l2jfrozen.gameserver.model.entity.Hero;
1050
 import com.l2jfrozen.gameserver.model.entity.MonsterRace;
1051
-import com.l2jfrozen.gameserver.model.entity.event.manager.EventManager;
1052
+//import com.l2jfrozen.gameserver.model.entity.event.manager.EventManager;
1053
 import com.l2jfrozen.gameserver.model.entity.olympiad.Olympiad;
1054
 import com.l2jfrozen.gameserver.model.entity.sevensigns.SevenSigns;
1055
 import com.l2jfrozen.gameserver.model.entity.sevensigns.SevenSignsFestival;
1056
@@ -531,7 +534,7 @@
1057
 		else
1058
 			_log.info("All custom mods are Disabled.");
1059
 		
1060
-		Util.printSection("EventManager");
1061
+		/*Util.printSection("EventManager");
1062
 		EventManager.getInstance().startEventRegistration();
1063
 		
1064
 		if(EventManager.TVT_EVENT_ENABLED || EventManager.CTF_EVENT_ENABLED || EventManager.DM_EVENT_ENABLED)
1065
@@ -544,7 +547,7 @@
1066
 				_log.info("DM Event is Enabled.");
1067
 		}
1068
 		else
1069
-			_log.info("All events are Disabled.");
1070
+			_log.info("All events are Disabled.");*/
1071
 		
1072
 		if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
1073
 			OfflineTradeTable.restoreOfflineTraders(); 
1074
@@ -555,6 +558,11 @@
1075
 		_log.info("Maximum Numbers of Connected Players: " + Config.MAXIMUM_ONLINE_USERS);
1076
 		_log.info("GameServer Started, free memory " + Memory.getFreeMemory() + " Mb of " + Memory.getTotalMemory() + " Mb");
1077
 		_log.info("Used memory: " + Memory.getUsedMemory() + " MB");
1078
+		
1079
+		EventManager.getInstance();
1080
+		EventStats.getInstance();
1081
+		 if(EventManager.getInstance().getBoolean("eventBufferEnabled"))
1082
+			 EventBuffer.getInstance();
1083
 
1084
 		Util.printSection("Status");
1085
 		System.gc();
1086
Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2EventManagerInstance.java
1087
===================================================================
1088
--- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2EventManagerInstance.java	(revision 0)
1089
+++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2EventManagerInstance.java	(revision 0)
1090
@@ -0,0 +1,50 @@
1091
+package com.l2jfrozen.gameserver.model.actor.instance;
1092
+
1093
+import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
1094
+import com.l2jfrozen.gameserver.event.EventManager;
1095
+import javolution.text.TextBuilder;
1096
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
1097
+
1098
+public class L2EventManagerInstance extends L2FolkInstance
1099
+{
1100
+private int objectId;
1101
+
1102
+	public L2EventManagerInstance(int objectId, L2NpcTemplate template)
1103
+	{
1104
+		super(objectId, template);
1105
+		this.objectId = objectId;
1106
+	}
1107
+	
1108
+	@Override
1109
+	public void onBypassFeedback(L2PcInstance player, String command)
1110
+	{
1111
+		if (command.startsWith("reg"))
1112
+		{
1113
+			EventManager.getInstance().registerPlayer(player);
1114
+		}
1115
+		if (command.startsWith("unreg"))
1116
+		{
1117
+			EventManager.getInstance().unregisterPlayer(player);
1118
+		}
1119
+		if (command.startsWith("list"))
1120
+		{
1121
+			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
1122
+         	TextBuilder sb = new TextBuilder();
1123
+            sb.append("<html><body><center>Select an event to vote for it:<br>");
1124
+      	
1125
+        	int i = 0;
1126
+        	for(String name: EventManager.getInstance().getEventNames())
1127
+        	{
1128
+        		i++;
1129
+        		sb.append (" <a action=\"bypass -h npc_"+objectId+"_"+i+"\">- "+name+" -</a>  <br>");
1130
+        	}
1131
+        	sb.append("</center></body></html>");
1132
+        	html.setHtml(sb.toString());
1133
+            player.sendPacket(html);
1134
+		}
1135
+		else
1136
+		{
1137
+			EventManager.getInstance().addVote(player,Integer.parseInt(command));
1138
+		}
1139
+	}
1140
+}
1141
\ No newline at end of file
1142
Index: head-src/com/l2jfrozen/gameserver/event/EventConfig.java
1143
===================================================================
1144
--- head-src/com/l2jfrozen/gameserver/event/EventConfig.java	(revision 0)
1145
+++ head-src/com/l2jfrozen/gameserver/event/EventConfig.java	(revision 0)
1146
@@ -0,0 +1,270 @@
1147
+package com.l2jfrozen.gameserver.event;
1148
+
1149
+import java.io.File;
1150
+import java.util.StringTokenizer;
1151
+import java.util.logging.Logger;
1152
+
1153
+import javax.xml.parsers.DocumentBuilder;
1154
+import javax.xml.parsers.DocumentBuilderFactory;
1155
+
1156
+import javolution.util.FastList;
1157
+import javolution.util.FastMap;
1158
+
1159
+import org.w3c.dom.Document;
1160
+import org.w3c.dom.NamedNodeMap;
1161
+import org.w3c.dom.Node;
1162
+
1163
+import com.l2jfrozen.util.random.Rnd;
1164
+
1165
+public class EventConfig
1166
+{
1167
+
1168
+	@SuppressWarnings("synthetic-access")
1169
+	private static class SingletonHolder
1170
+	{
1171
+		protected static final EventConfig _instance = new EventConfig();
1172
+	}
1173
+
1174
+	public static EventConfig getInstance()
1175
+	{
1176
+		return SingletonHolder._instance;
1177
+	}
1178
+
1179
+	private Logger _log = Logger.getLogger(EventConfig.class.getName());
1180
+	public FastMap<Integer, FastMap<String, String>> config;
1181
+
1182
+	public FastMap<Integer, FastMap<String, FastMap<Integer, int[]>>> positions;
1183
+
1184
+	public FastMap<Integer, FastMap<String, int[]>> colors;
1185
+
1186
+	public FastMap<Integer, FastMap<String, FastList<Integer>>> restrictions;
1187
+
1188
+	public EventConfig()
1189
+	{
1190
+		config = new FastMap<Integer, FastMap<String, String>>();
1191
+		positions = new FastMap<Integer, FastMap<String, FastMap<Integer, int[]>>>();
1192
+		colors = new FastMap<Integer, FastMap<String, int[]>>();
1193
+		restrictions = new FastMap<Integer, FastMap<String, FastList<Integer>>>();
1194
+		loadConfigs();
1195
+	}
1196
+
1197
+	private void addColor(int id, String owner, int[] color)
1198
+	{
1199
+		if (!colors.containsKey(id))
1200
+			colors.put(id, new FastMap<String, int[]>());
1201
+
1202
+		colors.get(id).put(owner, color);
1203
+	}
1204
+
1205
+	private void addPosition(int id, String owner, int x, int y, int z, int radius)
1206
+	{
1207
+
1208
+		if (!positions.containsKey(id))
1209
+			positions.put(id, new FastMap<String, FastMap<Integer, int[]>>());
1210
+		if (!positions.get(id).containsKey(owner))
1211
+			positions.get(id).put(owner, new FastMap<Integer, int[]>());
1212
+
1213
+		positions.get(id).get(owner).put(positions.get(id).get(owner).size() + 1, new int[] { x, y, z, radius });
1214
+	}
1215
+
1216
+	private void addProperty(int id, String propName, String value)
1217
+	{
1218
+		if (!config.containsKey(id))
1219
+			config.put(id, new FastMap<String, String>());
1220
+
1221
+		config.get(id).put(propName, value);
1222
+	}
1223
+
1224
+	private void addRestriction(int id, String type, String ids)
1225
+	{
1226
+		if (!restrictions.containsKey(id))
1227
+			restrictions.put(id, new FastMap<String, FastList<Integer>>());
1228
+
1229
+		FastList<Integer> idlist = new FastList<Integer>();
1230
+		StringTokenizer st = new StringTokenizer(ids, ",");
1231
+		while (st.hasMoreTokens())
1232
+			idlist.add(Integer.parseInt(st.nextToken()));
1233
+
1234
+		restrictions.get(id).put(type, idlist);
1235
+	}
1236
+
1237
+	public boolean getBoolean(int event, String propName)
1238
+	{
1239
+		if (!(config.containsKey(event)))
1240
+		{
1241
+			_log.warning("Event: Try to get a property of a non existing event: ID: " + event);
1242
+			return false;
1243
+		}
1244
+
1245
+		if (config.get(event).containsKey(propName))
1246
+			return Boolean.parseBoolean(config.get(event).get(propName));
1247
+		else
1248
+		{
1249
+			_log.warning("Event: Try to get a non existing property: " + propName);
1250
+			return false;
1251
+		}
1252
+
1253
+	}
1254
+
1255
+	public int[] getColor(int event, String owner)
1256
+	{
1257
+		if (!(colors.containsKey(event)))
1258
+		{
1259
+			_log.warning("Event: Try to get a color of a non existing event: ID: " + event);
1260
+			return new int[] { 255, 255, 255 };
1261
+		}
1262
+
1263
+		if (colors.get(event).containsKey(owner))
1264
+			return colors.get(event).get(owner);
1265
+		else
1266
+		{
1267
+			_log.warning("Event: Try to get a non existing color: " + owner);
1268
+			return new int[] { 255, 255, 255 };
1269
+		}
1270
+	}
1271
+
1272
+	public int getInt(int event, String propName)
1273
+	{
1274
+		if (!(config.containsKey(event)))
1275
+		{
1276
+			_log.warning("Event: Try to get a property of a non existing event: ID: " + event);
1277
+			return -1;
1278
+		}
1279
+
1280
+		if (config.get(event).containsKey(propName))
1281
+			return Integer.parseInt(config.get(event).get(propName));
1282
+		else
1283
+		{
1284
+			_log.warning("Event: Try to get a non existing property: " + propName);
1285
+			return -1;
1286
+		}
1287
+	}
1288
+
1289
+	public int[] getPosition(int event, String owner, int num)
1290
+	{
1291
+		if (!positions.containsKey(event))
1292
+		{
1293
+			_log.warning("Event: Try to get a position of a non existing event: ID: " + event);
1294
+			return new int[] {};
1295
+		}
1296
+		if (!positions.get(event).containsKey(owner))
1297
+		{
1298
+			_log.warning("Event: Try to get a position of a non existing owner: " + owner);
1299
+			return new int[] {};
1300
+		}
1301
+		if (!positions.get(event).get(owner).containsKey(num) && num != 0)
1302
+		{
1303
+			_log.warning("Event: Try to get a non existing position: " + num);
1304
+			return new int[] {};
1305
+		}
1306
+
1307
+		if (num == 0)
1308
+			return positions.get(event).get(owner).get(Rnd.get(positions.get(event).get(owner).size()) + 1);
1309
+		else
1310
+			return positions.get(event).get(owner).get(num);
1311
+	}
1312
+
1313
+	public FastList<Integer> getRestriction(int event, String type)
1314
+	{
1315
+		if (!(restrictions.containsKey(event)))
1316
+		{
1317
+			_log.warning("Event: Try to get a restriction of a non existing event: ID: " + event);
1318
+			return null;
1319
+		}
1320
+		if (restrictions.get(event).containsKey(type))
1321
+			return restrictions.get(event).get(type);
1322
+		else
1323
+		{
1324
+			_log.warning("Event: Try to get a non existing restriction: " + type);
1325
+			return null;
1326
+		}
1327
+	}
1328
+
1329
+	public String getString(int event, String propName)
1330
+	{
1331
+		if (!(config.containsKey(event)))
1332
+		{
1333
+			_log.warning("Event: Try to get a property of a non existing event: ID: " + event);
1334
+			return null;
1335
+		}
1336
+
1337
+		if (config.get(event).containsKey(propName))
1338
+			return config.get(event).get(propName);
1339
+		else
1340
+		{
1341
+			_log.warning("Event: Try to get a non existing property: " + propName);
1342
+			return null;
1343
+		}
1344
+
1345
+	}
1346
+
1347
+	private void loadConfigs()
1348
+	{
1349
+		File configFile = new File("./config/Events.xml");
1350
+		Document doc = null;
1351
+		try
1352
+		{
1353
+			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
1354
+			dbf.setIgnoringComments(true);
1355
+			dbf.setValidating(false);
1356
+			DocumentBuilder db = dbf.newDocumentBuilder();
1357
+			doc = db.parse(configFile);
1358
+
1359
+			for (Node root = doc.getFirstChild(); root != null; root = root.getNextSibling())
1360
+				if ("events".equalsIgnoreCase(root.getNodeName()))
1361
+					for (Node event = root.getFirstChild(); event != null; event = event.getNextSibling())
1362
+						if ("event".equalsIgnoreCase(event.getNodeName()))
1363
+						{
1364
+							NamedNodeMap eventAttrs = event.getAttributes();
1365
+							int eventId = Integer.parseInt(eventAttrs.getNamedItem("id").getNodeValue());
1366
+
1367
+							for (Node property = event.getFirstChild(); property != null; property = property.getNextSibling())
1368
+							{
1369
+
1370
+								if ("property".equalsIgnoreCase(property.getNodeName()))
1371
+								{
1372
+									NamedNodeMap propAttrs = property.getAttributes();
1373
+									String name = propAttrs.getNamedItem("name").getNodeValue();
1374
+									String value = propAttrs.getNamedItem("value").getNodeValue();
1375
+									addProperty(eventId, name, value);
1376
+								}
1377
+
1378
+								if ("position".equalsIgnoreCase(property.getNodeName()))
1379
+								{
1380
+									NamedNodeMap propAttrs = property.getAttributes();
1381
+									String owner = propAttrs.getNamedItem("owner").getNodeValue();
1382
+									String x = propAttrs.getNamedItem("x").getNodeValue();
1383
+									String y = propAttrs.getNamedItem("y").getNodeValue();
1384
+									String z = propAttrs.getNamedItem("z").getNodeValue();
1385
+									String radius = propAttrs.getNamedItem("radius").getNodeValue();
1386
+									addPosition(eventId, owner, Integer.parseInt(x), Integer.parseInt(y), Integer.parseInt(z), Integer.parseInt(radius));
1387
+
1388
+								}
1389
+
1390
+								if ("color".equalsIgnoreCase(property.getNodeName()))
1391
+								{
1392
+									NamedNodeMap propAttrs = property.getAttributes();
1393
+									String owner = propAttrs.getNamedItem("owner").getNodeValue();
1394
+									int r = Integer.parseInt(propAttrs.getNamedItem("r").getNodeValue());
1395
+									int g = Integer.parseInt(propAttrs.getNamedItem("g").getNodeValue());
1396
+									int b = Integer.parseInt(propAttrs.getNamedItem("b").getNodeValue());
1397
+									addColor(eventId, owner, new int[] { r, g, b });
1398
+								}
1399
+
1400
+								if ("restriction".equalsIgnoreCase(property.getNodeName()))
1401
+								{
1402
+									NamedNodeMap propAttrs = property.getAttributes();
1403
+									String type = propAttrs.getNamedItem("type").getNodeValue();
1404
+									String ids = propAttrs.getNamedItem("ids").getNodeValue();
1405
+									addRestriction(eventId, type, ids);
1406
+								}
1407
+							}
1408
+						}
1409
+		}
1410
+		catch (Exception e)
1411
+		{
1412
+
1413
+		}
1414
+
1415
+	}
1416
+}
1417
\ No newline at end of file
1418
Index: head-src/com/l2jfrozen/gameserver/event/Event.java
1419
===================================================================
1420
--- head-src/com/l2jfrozen/gameserver/event/Event.java	(revision 0)
1421
+++ head-src/com/l2jfrozen/gameserver/event/Event.java	(revision 0)
1422
@@ -0,0 +1,696 @@
1423
+package com.l2jfrozen.gameserver.event;
1424
+
1425
+import java.util.Set;
1426
+
1427
+import javolution.util.FastList;
1428
+import javolution.util.FastMap;
1429
+
1430
+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
1431
+import com.l2jfrozen.gameserver.datatables.SkillTable;
1432
+import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
1433
+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
1434
+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
1435
+import com.l2jfrozen.gameserver.model.L2Object;
1436
+import com.l2jfrozen.gameserver.model.L2Party;
1437
+import com.l2jfrozen.gameserver.model.L2Skill;
1438
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
1439
+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
1440
+import com.l2jfrozen.gameserver.model.L2Summon;
1441
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
1442
+import com.l2jfrozen.gameserver.model.actor.instance.L2PetInstance;
1443
+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
1444
+import com.l2jfrozen.gameserver.network.serverpackets.ExShowScreenMessage;
1445
+import com.l2jfrozen.gameserver.network.serverpackets.Ride;
1446
+import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
1447
+import com.l2jfrozen.gameserver.templates.L2EtcItemType;
1448
+import com.l2jfrozen.gameserver.util.Broadcast;
1449
+import com.l2jfrozen.util.random.Rnd;
1450
+
1451
+/**
1452
+ * @author Rizel
1453
+ *
1454
+ */
1455
+public abstract class Event
1456
+{
1457
+	protected class Clock implements Runnable
1458
+	{
1459
+		protected String getTime()
1460
+		{
1461
+			String mins = "" + time / 60;
1462
+			String secs = (time % 60 < 10 ? "0" + time % 60 : "" + time % 60);
1463
+			return "" + mins + ":" + secs + "";
1464
+		}
1465
+
1466
+		public void run()
1467
+		{
1468
+			clockTick();
1469
+			scorebartext = getScorebar();
1470
+			for (L2PcInstance player : getPlayerList())
1471
+				player.sendPacket(new ExShowScreenMessage(1, -1, 2, false, 1, 0, 0, false, 2000, false, scorebartext));
1472
+
1473
+			if (time <= 0)
1474
+				schedule(1);
1475
+			else
1476
+			{
1477
+				time--;
1478
+				tpm.scheduleGeneral(clock, 1000);
1479
+			}
1480
+		}
1481
+
1482
+		protected void setTime(int t)
1483
+		{
1484
+			time = t;
1485
+		}
1486
+
1487
+		protected void startClock(int mt)
1488
+		{
1489
+			time = mt;
1490
+			tpm.scheduleGeneral(clock, 1);
1491
+		}
1492
+	}
1493
+
1494
+	protected class ResurrectorTask implements Runnable
1495
+	{
1496
+		private L2PcInstance player;
1497
+
1498
+		public ResurrectorTask(L2PcInstance p)
1499
+		{
1500
+			player = p;
1501
+			ThreadPoolManager.getInstance().scheduleGeneral(this, 7000);
1502
+			debug("Resurrector task created: " + player.getName());
1503
+		}
1504
+
1505
+		public void run()
1506
+		{
1507
+			if (EventManager.getInstance().isRegistered(player))
1508
+			{
1509
+				debug("Resurrector task executed: " + player.getName());
1510
+				player.doRevive();
1511
+				
1512
+				if(EventManager.getInstance().getBoolean("eventBufferEnabled")) 
1513
+				 	EventBuffer.getInstance().buffPlayer(player);
1514
+				
1515
+				player.setCurrentCp(player.getMaxCp());
1516
+				player.setCurrentHp(player.getMaxHp());
1517
+				player.setCurrentMp(player.getMaxMp());
1518
+				teleportToTeamPos(player);
1519
+			}
1520
+
1521
+		}
1522
+	}
1523
+
1524
+	protected int eventId;
1525
+
1526
+	//Config
1527
+	protected EventConfig config = EventConfig.getInstance();
1528
+
1529
+	protected static int[] startpos = EventManager.npcPos;
1530
+
1531
+	protected FastMap<Integer, EventTeam> teams;
1532
+
1533
+	//TEAM-STATUS-SCORE
1534
+	protected FastMap<L2PcInstance, int[]> players;
1535
+
1536
+	protected ThreadPoolManager tpm;
1537
+
1538
+	protected ResurrectorTask resurrectorTask;
1539
+
1540
+	private String scorebartext;
1541
+
1542
+	protected Clock clock;
1543
+
1544
+	protected int time;
1545
+
1546
+	protected int winnerTeam;
1547
+	
1548
+	protected int loserTeam;
1549
+
1550
+	public Event()
1551
+	{
1552
+		teams = new FastMap<Integer, EventTeam>();
1553
+		clock = new Clock();
1554
+		tpm = ThreadPoolManager.getInstance();
1555
+		players = new FastMap<L2PcInstance, int[]>();
1556
+		time = 0;
1557
+	}
1558
+
1559
+	protected void addToResurrector(L2PcInstance player)
1560
+	{
1561
+		new ResurrectorTask(player);
1562
+	}
1563
+
1564
+	protected void announce(Set<L2PcInstance> list, String text)
1565
+	{
1566
+		for (L2PcInstance player : list)
1567
+			player.sendPacket(new CreatureSay(0, 18, "", "[Event] " + text));
1568
+	}
1569
+
1570
+	public boolean canAttack(L2PcInstance player, L2Object target)
1571
+	{
1572
+		return true;
1573
+	}
1574
+
1575
+	protected void clockTick()
1576
+	{
1577
+
1578
+	}
1579
+
1580
+	protected int countOfPositiveStatus()
1581
+	{
1582
+		int count = 0;
1583
+		for (L2PcInstance player : getPlayerList())
1584
+			if (getStatus(player) >= 0)
1585
+				count++;
1586
+
1587
+		return count;
1588
+	}
1589
+
1590
+	protected void createNewTeam(int id, String name, int[] color, int[] startPos)
1591
+	{
1592
+		teams.put(id, new EventTeam(id, name, color, startPos));
1593
+	}
1594
+
1595
+	protected void createPartyOfTeam(int teamId)
1596
+	{
1597
+		int count = 0;
1598
+		L2Party party = null;
1599
+
1600
+		FastList<L2PcInstance> list = new FastList<L2PcInstance>();
1601
+
1602
+		for (L2PcInstance p : players.keySet())
1603
+			if (getTeam(p) == teamId)
1604
+				list.add(p);
1605
+
1606
+		for (L2PcInstance player : list)
1607
+		{
1608
+			if (count % 9 == 0 && list.size() - count != 1)
1609
+				party = new L2Party(player, 1);
1610
+			if (count % 9 < 9)
1611
+				player.joinParty(party);
1612
+			count++;
1613
+		}
1614
+	}
1615
+
1616
+	protected void debug(String text)
1617
+	{
1618
+		EventManager.getInstance().debug(text);
1619
+	}
1620
+
1621
+	protected void divideIntoTeams(int number)
1622
+	{
1623
+		int i = 0;
1624
+		while (EventManager.getInstance().players.size() != 0)
1625
+		{
1626
+			i++;
1627
+			L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
1628
+			players.put(player, new int[] { i, 0, 0 });
1629
+			EventManager.getInstance().players.remove(player);
1630
+			if (i == number)
1631
+				i = 0;
1632
+		}
1633
+	}
1634
+
1635
+	public void dropBomb(L2PcInstance player)
1636
+	{
1637
+
1638
+	}
1639
+
1640
+	protected abstract void endEvent();
1641
+
1642
+	protected void forceSitAll()
1643
+	{
1644
+		for (L2PcInstance player : players.keySet())
1645
+		{
1646
+			if (player.isCastingNow())
1647
+					player.abortCast();
1648
+			if (player.isAttackingNow())
1649
+				    player.abortAttack();
1650
+			player.sitDown();
1651
+			player.eventSitForced = true;
1652
+		}
1653
+	}
1654
+
1655
+	protected void forceStandAll()
1656
+	{
1657
+		for (L2PcInstance player : players.keySet())
1658
+		{
1659
+			player.eventSitForced = false;
1660
+			player.standUp();
1661
+		}
1662
+
1663
+	}
1664
+
1665
+	public boolean getBoolean(String propName)
1666
+	{
1667
+		return config.getBoolean(eventId, propName);
1668
+	}
1669
+
1670
+	public int[] getColor(String owner)
1671
+	{
1672
+		return config.getColor(eventId, owner);
1673
+	}
1674
+
1675
+	public int getInt(String propName)
1676
+	{
1677
+		return config.getInt(eventId, propName);
1678
+	}
1679
+
1680
+	protected Set<L2PcInstance> getPlayerList()
1681
+	{
1682
+		return players.keySet();
1683
+	}
1684
+
1685
+	protected FastList<L2PcInstance> getPlayersOfTeam(int team)
1686
+	{
1687
+		FastList<L2PcInstance> list = new FastList<L2PcInstance>();
1688
+
1689
+		for (L2PcInstance player : getPlayerList())
1690
+			if (getTeam(player) == team)
1691
+				list.add(player);
1692
+
1693
+		return list;
1694
+	}
1695
+
1696
+	protected EventTeam getPlayersTeam(L2PcInstance player)
1697
+	{
1698
+		return teams.get(players.get(player)[0]);
1699
+	}
1700
+
1701
+	protected FastList<L2PcInstance> getPlayersWithStatus(int status)
1702
+	{
1703
+		FastList<L2PcInstance> list = new FastList<L2PcInstance>();
1704
+
1705
+		for (L2PcInstance player : getPlayerList())
1706
+			if (getStatus(player) == status)
1707
+				list.add(player);
1708
+
1709
+		return list;
1710
+	}
1711
+
1712
+	protected L2PcInstance getPlayerWithMaxScore()
1713
+	{
1714
+		L2PcInstance max;
1715
+		max = players.head().getNext().getKey();
1716
+		for (L2PcInstance player : players.keySet())
1717
+			if (players.get(player)[2] > players.get(max)[2])
1718
+				max = player;
1719
+
1720
+		return max;
1721
+	}
1722
+	
1723
+	protected void unequip(){
1724
+		for (L2PcInstance player : players.keySet())
1725
+		{
1726
+		player.getInventory().unEquipItemInSlot(7);
1727
+		player.getInventory().unEquipItemInSlot(8);
1728
+		player.getInventory().unEquipItemInSlot(14);
1729
+		}
1730
+	}
1731
+
1732
+	public int[] getPosition(String owner, int num)
1733
+	{
1734
+		return config.getPosition(eventId, owner, num);
1735
+	}
1736
+
1737
+	protected L2PcInstance getRandomPlayer()
1738
+	{
1739
+		FastList<L2PcInstance> temp = new FastList<L2PcInstance>();
1740
+		for (L2PcInstance player : players.keySet())
1741
+			temp.add(player);
1742
+
1743
+		return temp.get(Rnd.get(temp.size()));
1744
+	}
1745
+
1746
+	protected L2PcInstance getRandomPlayerFromTeam(int team)
1747
+	{
1748
+		FastList<L2PcInstance> temp = new FastList<L2PcInstance>();
1749
+		for (L2PcInstance player : players.keySet())
1750
+			if (getTeam(player) == team)
1751
+				temp.add(player);
1752
+
1753
+		return temp.get(Rnd.get(temp.size()));
1754
+	}
1755
+
1756
+	public FastList<Integer> getRestriction(String type)
1757
+	{
1758
+		return config.getRestriction(eventId, type);
1759
+	}
1760
+
1761
+	protected int getScore(L2PcInstance player)
1762
+	{
1763
+		return players.get(player)[2];
1764
+	}
1765
+
1766
+	protected abstract String getScorebar();
1767
+
1768
+	protected int getStatus(L2PcInstance player)
1769
+	{
1770
+		return players.get(player)[1];
1771
+	}
1772
+
1773
+	public String getString(String propName)
1774
+	{
1775
+		return config.getString(eventId, propName);
1776
+	}
1777
+
1778
+	public int getTeam(L2PcInstance player)
1779
+	{
1780
+		return players.get(player)[0];
1781
+	}
1782
+
1783
+	protected int getWinnerTeam()
1784
+	{
1785
+		FastList<EventTeam> t = new FastList<EventTeam>();
1786
+
1787
+		for (EventTeam team : teams.values())
1788
+		{
1789
+			if (t.size() == 0)
1790
+			{
1791
+				t.add(team);
1792
+				continue;
1793
+			}
1794
+
1795
+			if (team.getScore() > t.getFirst().getScore())
1796
+			{
1797
+				t.clear();
1798
+				t.add(team);
1799
+				continue;
1800
+			}
1801
+			if (team.getScore() == t.getFirst().getScore())
1802
+				t.add(team);
1803
+
1804
+		}
1805
+
1806
+		if (t.size() > 1)
1807
+			return t.get(Rnd.get(t.size())).getId();
1808
+		else
1809
+			return t.getFirst().getId();
1810
+
1811
+	}
1812
+
1813
+	protected void giveReward(FastList<L2PcInstance> players, int id, int ammount)
1814
+	{
1815
+		for (L2PcInstance player : players)
1816
+		{
1817
+			if(player == null)
1818
+				continue;
1819
+
1820
+			player.addItem("Event", id, ammount, player, true);
1821
+			EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
1822
+		}
1823
+
1824
+	}
1825
+
1826
+	protected void giveReward(L2PcInstance player, int id, int ammount)
1827
+	{
1828
+		EventStats.getInstance().tempTable.get(player.getObjectId())[0] = 1;
1829
+
1830
+		player.addItem("Event", id, ammount, player, true);
1831
+	}
1832
+
1833
+	protected void increasePlayersScore(L2PcInstance player)
1834
+	{
1835
+		int old = getScore(player);
1836
+		setScore(player, old + 1);
1837
+		EventStats.getInstance().tempTable.get(player.getObjectId())[3] = EventStats.getInstance().tempTable.get(player.getObjectId())[3] + 1;
1838
+	}
1839
+
1840
+	protected void msgToAll(String text)
1841
+	{
1842
+		for (L2PcInstance player : players.keySet())
1843
+			player.sendMessage(text);
1844
+	}
1845
+
1846
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
1847
+	{
1848
+		EventStats.getInstance().tempTable.get(victim.getObjectId())[2] = EventStats.getInstance().tempTable.get(victim.getObjectId())[2] + 1;
1849
+		return;
1850
+	}
1851
+
1852
+	public void onHit(L2PcInstance actor, L2PcInstance target)
1853
+	{
1854
+	}
1855
+
1856
+	public void onKill(L2PcInstance victim, L2PcInstance killer)
1857
+	{
1858
+		EventStats.getInstance().tempTable.get(killer.getObjectId())[1] = EventStats.getInstance().tempTable.get(killer.getObjectId())[1] + 1;
1859
+		return;
1860
+	}
1861
+
1862
+	public void onLogout(L2PcInstance player)
1863
+	{
1864
+		if (players.containsKey(player))
1865
+			removePlayer(player);
1866
+		
1867
+		player.setXYZ(EventManager.getInstance().positions.get(player)[0], EventManager.getInstance().positions.get(player)[1], EventManager.getInstance().positions.get(player)[2]);
1868
+		player.setTitle(EventManager.getInstance().titles.get(player));
1869
+
1870
+		if (teams.size() == 1)
1871
+			if (getPlayerList().size() == 1)
1872
+			{
1873
+				endEvent();
1874
+				return;
1875
+			}
1876
+
1877
+		if (teams.size() > 1)
1878
+		{
1879
+			int t = players.head().getNext().getValue()[0];
1880
+			for (L2PcInstance p : getPlayerList())
1881
+				if (getTeam(p) != t)
1882
+					return;
1883
+
1884
+			endEvent();
1885
+			return;
1886
+
1887
+		}
1888
+	}
1889
+
1890
+	public void onSay(int type, L2PcInstance player, String text)
1891
+	{
1892
+		return;
1893
+	}
1894
+
1895
+	public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
1896
+	{
1897
+		return false;
1898
+	}
1899
+
1900
+	public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
1901
+	{
1902
+		if (EventManager.getInstance().getRestriction("item").contains(item.getItemId()) || getRestriction("item").contains(item.getItemId()))
1903
+			return false;
1904
+
1905
+		if (item.getItemType() == L2EtcItemType.POTION && !getBoolean("allowPotions"))
1906
+			return false;
1907
+
1908
+		if (item.getItemType() == L2EtcItemType.SCROLL)
1909
+			return false;
1910
+
1911
+		return true;
1912
+	}
1913
+
1914
+	public boolean onUseMagic(L2Skill skill)
1915
+	{
1916
+		if (EventManager.getInstance().getRestriction("skill").contains(skill.getId()) || getRestriction("skill").contains(skill.getId()))
1917
+			return false;
1918
+
1919
+		if (skill.getSkillType() == L2Skill.SkillType.RESURRECT)
1920
+			return false;
1921
+		
1922
+		if (skill.getSkillType() == L2Skill.SkillType.SUMMON_FRIEND) 
1923
+			return false; 
1924
+		
1925
+		if (skill.getSkillType() == L2Skill.SkillType.RECALL) 
1926
+			return false; 
1927
+
1928
+		if (skill.getSkillType() == L2Skill.SkillType.FAKE_DEATH)
1929
+			return false;
1930
+
1931
+		return true;
1932
+	}
1933
+
1934
+	protected void prepare(L2PcInstance player)
1935
+	{
1936
+		if (player.isCastingNow())
1937
+			player.abortCast();
1938
+		player.getAppearance().setVisible();
1939
+		
1940
+		if (player.getPet() != null)
1941
+		{
1942
+			L2Summon summon = player.getPet();
1943
+		    if (summon instanceof L2PetInstance)
1944
+			     summon.unSummon(player);
1945
+		}
1946
+		
1947
+		if(player.isMounted()) 
1948
+		{ 
1949
+			if(player.setMountType(0)) 
1950
+			{ 
1951
+				if(player.isFlying()) 
1952
+				{ 
1953
+					player.removeSkill(SkillTable.getInstance().getInfo(4289, 1)); 
1954
+				} 
1955
+				Ride dismount = new Ride(player.getObjectId(), Ride.ACTION_DISMOUNT, 0); 
1956
+				Broadcast.toSelfAndKnownPlayers(player, dismount); 
1957
+				player.setMountObjectID(0); 
1958
+				dismount = null; 
1959
+			}
1960
+		} 
1961
+		
1962
+		if (getBoolean("removeBuffs"))
1963
+		{
1964
+			player.stopAllEffects();
1965
+			if (player.getPet() != null)
1966
+			{
1967
+				L2Summon summon = player.getPet();
1968
+			    if (summon instanceof L2Summon)
1969
+				     summon.unSummon(player);
1970
+			}
1971
+		}
1972
+
1973
+		if (player.getParty() != null)
1974
+		{
1975
+			L2Party party = player.getParty();
1976
+			party.removePartyMember(player);
1977
+		}
1978
+		int[] nameColor = getPlayersTeam(player).getTeamColor();
1979
+		player.getAppearance().setNameColor(nameColor[0], nameColor[1], nameColor[2]);
1980
+		player.setTitle("<- 0 ->");
1981
+		
1982
+		if(EventManager.getInstance().getBoolean("eventBufferEnabled")) 
1983
+		 	EventBuffer.getInstance().buffPlayer(player);
1984
+		
1985
+		player.broadcastUserInfo();
1986
+	}
1987
+
1988
+	protected void preparePlayers()
1989
+	{
1990
+		for (L2PcInstance player : players.keySet())
1991
+			prepare(player);
1992
+	}
1993
+
1994
+	protected void removePlayer(L2PcInstance player)
1995
+	{
1996
+		players.remove(player);
1997
+	}
1998
+
1999
+	public void reset()
2000
+	{
2001
+		players.clear();
2002
+		tpm.purge();
2003
+		winnerTeam = 0;
2004
+
2005
+		for (EventTeam team : teams.values())
2006
+			team.setScore(0);
2007
+
2008
+		debug("Event reseted");
2009
+	}
2010
+
2011
+	protected abstract void schedule(int time);
2012
+
2013
+	protected void selectPlayers(int teamId, int playerCount)
2014
+	{
2015
+		for (int i = 0; i < playerCount; i++)
2016
+		{
2017
+			L2PcInstance player = EventManager.getInstance().players.get(Rnd.get(EventManager.getInstance().players.size()));
2018
+			players.put(player, new int[] { teamId, 0, 0 });
2019
+			EventManager.getInstance().players.remove(player);
2020
+		}
2021
+
2022
+	}
2023
+
2024
+	protected void setScore(L2PcInstance player, int score)
2025
+	{
2026
+		players.get(player)[2] = score;
2027
+		player.setTitle("<- " + score + " ->");
2028
+		player.broadcastUserInfo();
2029
+	}
2030
+
2031
+	protected void setStatus(L2PcInstance player, int status)
2032
+	{
2033
+		if (players.containsKey(player))
2034
+			players.get(player)[1] = status;
2035
+	}
2036
+
2037
+	protected void setTeam(L2PcInstance player, int team)
2038
+	{
2039
+		players.get(player)[0] = team;
2040
+	}
2041
+
2042
+	protected abstract void showHtml(L2PcInstance player, int obj);
2043
+
2044
+	protected L2Spawn spawnNPC(int xPos, int yPos, int zPos, int npcId)
2045
+	{
2046
+		final L2NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
2047
+		try
2048
+		{
2049
+			final L2Spawn spawn = new L2Spawn(template);
2050
+			spawn.setLocx(xPos);
2051
+			spawn.setLocy(yPos);
2052
+			spawn.setLocz(zPos);
2053
+			spawn.setAmount(1);
2054
+			spawn.setHeading(0);
2055
+			spawn.setRespawnDelay(1);
2056
+			SpawnTable.getInstance().addNewSpawn(spawn, false);
2057
+			spawn.init();
2058
+			return spawn;
2059
+		}
2060
+		catch (Exception e)
2061
+		{
2062
+			return null;
2063
+		}
2064
+	}
2065
+
2066
+	protected abstract void start();
2067
+
2068
+	protected void teleportPlayer(L2PcInstance player, int[] coordinates)
2069
+	{
2070
+		player.teleToLocation(coordinates[0] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[1] + (Rnd.get(coordinates[3] * 2) - coordinates[3]), coordinates[2]);
2071
+	}
2072
+
2073
+	protected void teleportToTeamPos()
2074
+	{
2075
+		for (L2PcInstance player : players.keySet())
2076
+		{
2077
+			teleportToTeamPos(player);
2078
+		}
2079
+
2080
+	}
2081
+
2082
+	protected void teleportToTeamPos(L2PcInstance player)
2083
+	{
2084
+		int[] pos = getPosition(teams.get(getTeam(player)).getName(), 0);
2085
+		teleportPlayer(player, pos);
2086
+	}
2087
+
2088
+	protected void unspawnNPC(L2Spawn npcSpawn)
2089
+	{
2090
+		if (npcSpawn == null)
2091
+			return;
2092
+
2093
+		npcSpawn.getLastSpawn().deleteMe();
2094
+		npcSpawn.stopRespawn();
2095
+		SpawnTable.getInstance().deleteSpawn(npcSpawn, true);
2096
+	}
2097
+	
2098
+	public int numberOfTeams() 
2099
+ 	{ 
2100
+ 		return teams.size(); 
2101
+ 	} 
2102
+ 	
2103
+ 	public void useCapture(L2PcInstance player, L2NpcInstance base){} 
2104
+ 	
2105
+	protected void polymorph(L2PcInstance player, int id)
2106
+	{
2107
+		player.getPoly().setPolyInfo("", String.valueOf(id));
2108
+		player.decayMe();
2109
+		player.spawnMe(player.getX(),player.getY(),player.getZ());
2110
+	}
2111
+	
2112
+	protected void unpolymorph(L2PcInstance player)
2113
+	{
2114
+		player.getPoly().setPolyInfo(null, "1");
2115
+		player.decayMe();
2116
+		player.spawnMe(player.getX(),player.getY(),player.getZ());
2117
+	}
2118
+}
2119
\ No newline at end of file
2120
Index: head-src/com/l2jfrozen/gameserver/event/EventBuffer.java
2121
===================================================================
2122
--- head-src/com/l2jfrozen/gameserver/event/EventBuffer.java	(revision 0)
2123
+++ head-src/com/l2jfrozen/gameserver/event/EventBuffer.java	(revision 0)
2124
@@ -0,0 +1,315 @@
2125
+/*
2126
+ * This program is free software: you can redistribute it and/or modify it under
2127
+ * the terms of the GNU General Public License as published by the Free Software
2128
+ * Foundation, either version 3 of the License, or (at your option) any later
2129
+ * version.
2130
+ *
2131
+ * This program is distributed in the hope that it will be useful, but WITHOUT
2132
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
2133
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
2134
+ * details.
2135
+ *
2136
+ * You should have received a copy of the GNU General Public License along with
2137
+ * this program. If not, see <http://www.gnu.org/licenses/>.
2138
+ */
2139
+package com.l2jfrozen.gameserver.event;
2140
+
2141
+import java.sql.Connection;
2142
+import java.sql.PreparedStatement;
2143
+import java.sql.ResultSet;
2144
+import java.util.Map;
2145
+import java.util.StringTokenizer;
2146
+
2147
+import javolution.text.TextBuilder;
2148
+import javolution.util.FastList;
2149
+import javolution.util.FastMap;
2150
+
2151
+import com.l2jfrozen.util.database.L2DatabaseFactory;
2152
+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
2153
+import com.l2jfrozen.gameserver.datatables.SkillTable;
2154
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
2155
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
2156
+
2157
+/**
2158
+ * @author Rizel
2159
+ *
2160
+ */
2161
+public class EventBuffer
2162
+{
2163
+	private static class SingletonHolder
2164
+	{
2165
+		protected static final EventBuffer _instance = new EventBuffer();
2166
+	}
2167
+	private class UpdateTask implements Runnable
2168
+	{
2169
+		public void run()
2170
+		{
2171
+			updateSQL();
2172
+		}
2173
+	}
2174
+	public static EventBuffer getInstance()
2175
+	{
2176
+		return SingletonHolder._instance;
2177
+	}
2178
+
2179
+	private FastMap<String, FastList<Integer>> buffTemplates;
2180
+
2181
+	private FastMap<String, Boolean> changes;
2182
+
2183
+	private UpdateTask updateTask;
2184
+
2185
+	public EventBuffer()
2186
+	{
2187
+		updateTask = new UpdateTask();
2188
+		changes = new FastMap<String, Boolean>();
2189
+		buffTemplates = new FastMap<String, FastList<Integer>>();
2190
+		loadSQL();
2191
+		ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(updateTask, 600000, 600000);
2192
+	}
2193
+
2194
+	protected void buffPlayer(L2PcInstance player)
2195
+	{
2196
+		boolean bss = player.checkBss();
2197
+		boolean sps = player.checkSps();
2198
+		boolean ss = player.checkSs();
2199
+		
2200
+		String playerId = "" + player.getObjectId() + player.getClassIndex();
2201
+
2202
+		if(!buffTemplates.containsKey(playerId))
2203
+			{
2204
+				EventManager.getInstance().debug("The player : "+player.getName()+" ("+playerId+") without template");
2205
+				return;
2206
+			}
2207
+			             
2208
+		for (int skillId : buffTemplates.get(playerId))
2209
+			SkillTable.getInstance().getInfo(skillId, SkillTable.getInstance().getMaxLevel(skillId,1)).getEffects(player, player, ss, sps, bss);
2210
+	}
2211
+
2212
+	public void changeList(L2PcInstance player, int buff, boolean action)
2213
+	{
2214
+		String playerId = "" + player.getObjectId() + player.getClassIndex();
2215
+
2216
+		if (!buffTemplates.containsKey(playerId))
2217
+		{
2218
+			buffTemplates.put(playerId, new FastList<Integer>());
2219
+			changes.put(playerId, true);
2220
+		}
2221
+		else
2222
+		{
2223
+			if (!changes.containsKey(playerId))
2224
+				changes.put(playerId, false);
2225
+
2226
+			if (action)
2227
+				buffTemplates.get(playerId).add(buff);
2228
+			else
2229
+				buffTemplates.get(playerId).remove(buffTemplates.get(playerId).indexOf(buff));
2230
+
2231
+		}
2232
+
2233
+	}
2234
+
2235
+	private void loadSQL()
2236
+	{
2237
+		if (!EventManager.getInstance().getBoolean("eventBufferEnabled"))
2238
+			return;
2239
+
2240
+		Connection con = null;
2241
+		PreparedStatement statement = null;
2242
+		try
2243
+		{
2244
+			con = L2DatabaseFactory.getInstance().getConnection();
2245
+			statement = con.prepareStatement("SELECT * FROM event_buffs");
2246
+			ResultSet rset = statement.executeQuery();
2247
+			int count = 0;
2248
+			while (rset.next())
2249
+			{
2250
+				count++;
2251
+
2252
+				buffTemplates.put(rset.getString("player"), new FastList<Integer>());
2253
+
2254
+				StringTokenizer st = new StringTokenizer(rset.getString("buffs"), ",");
2255
+
2256
+				FastList<Integer> templist = new FastList<Integer>();
2257
+
2258
+				while (st.hasMoreTokens())
2259
+					templist.add(Integer.parseInt(st.nextToken()));
2260
+
2261
+				buffTemplates.getEntry(rset.getString("player")).setValue(templist);
2262
+			}
2263
+			rset.close();
2264
+			statement.close();
2265
+
2266
+			EventManager.getInstance().debug("Buffer loaded: " + count + " players template.");
2267
+		}
2268
+		catch (Exception e)
2269
+		{
2270
+			System.out.println("EventBuffs SQL catch");
2271
+		}
2272
+		finally
2273
+		{
2274
+			try { con.close(); } catch (Exception e) {}
2275
+		}
2276
+	}
2277
+
2278
+	protected boolean playerHaveTemplate(L2PcInstance player)
2279
+	{
2280
+		String playerId = "" + player.getObjectId() + player.getClassIndex();
2281
+
2282
+		if (buffTemplates.containsKey(playerId))
2283
+			return true;
2284
+		else
2285
+			return false;
2286
+	}
2287
+
2288
+	public void showHtml(L2PcInstance player)
2289
+	{
2290
+		try{
2291
+		String playerId = "" + player.getObjectId() + player.getClassIndex();
2292
+
2293
+		if (!buffTemplates.containsKey(playerId))
2294
+		{
2295
+			buffTemplates.put(playerId, new FastList<Integer>());
2296
+			changes.put(playerId, true);
2297
+		}
2298
+
2299
+		StringTokenizer st = new StringTokenizer(EventManager.getInstance().getString("allowedBuffsList"), ",");
2300
+
2301
+		FastList<Integer> skillList = new FastList<Integer>();
2302
+
2303
+		while (st.hasMoreTokens())
2304
+			skillList.add(Integer.parseInt(st.nextToken()));
2305
+
2306
+		NpcHtmlMessage html = new NpcHtmlMessage(0);
2307
+		TextBuilder sb = new TextBuilder();
2308
+
2309
+		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>");
2310
+		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>");
2311
+		sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td>Added buffs:</td></tr></table><br>");
2312
+		sb.append("<center><table width=270>");
2313
+
2314
+		int c = 0;
2315
+		for (int skillId : buffTemplates.get(playerId))
2316
+		{
2317
+			c++;
2318
+			String skillStr = "0000";
2319
+			if (skillId < 100)
2320
+				skillStr = "00" + skillId;
2321
+			else if (skillId > 99 && skillId < 1000)
2322
+				skillStr = "0" + skillId;
2323
+			else if (skillId > 4698 && skillId < 4701)
2324
+				skillStr = "1331";
2325
+			else if (skillId > 4701 && skillId < 4704)
2326
+				skillStr = "1332";
2327
+			else
2328
+				skillStr = "" + skillId;
2329
+
2330
+			if (c % 2 == 1)
2331
+				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>");
2332
+			if (c % 2 == 0)
2333
+				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>");
2334
+		}
2335
+
2336
+		if (c % 2 == 1)
2337
+			sb.append("<td width=33></td><td width=100></td></tr>");
2338
+
2339
+		sb.append("</table><br>");
2340
+
2341
+		sb.append("<br><br><center><table width=270 bgcolor=5A5A5A><tr><td>Available buffs:</td></tr></table><br>");
2342
+		sb.append("<center><table width=270>");
2343
+
2344
+		c = 0;
2345
+		for (int skillId : skillList)
2346
+		{
2347
+			String skillStr = "0000";
2348
+			if (skillId < 100)
2349
+				skillStr = "00" + skillId;
2350
+			else if (skillId > 99 && skillId < 1000)
2351
+				skillStr = "0" + skillId;
2352
+			else if (skillId > 4698 && skillId < 4701)
2353
+				skillStr = "1331";
2354
+			else if (skillId > 4701 && skillId < 4704)
2355
+				skillStr = "1332";
2356
+			else
2357
+				skillStr = "" + skillId;
2358
+
2359
+			if (!buffTemplates.get(playerId).contains(skillId))
2360
+			{
2361
+				c++;
2362
+				if (c % 2 == 1)
2363
+					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>");
2364
+				if (c % 2 == 0)
2365
+					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>");
2366
+			}
2367
+		}
2368
+
2369
+		if (c % 2 == 1)
2370
+			sb.append("<td width=33></td><td width=100></td></tr>");
2371
+
2372
+		sb.append("</table>");
2373
+
2374
+		sb.append("</body></html>");
2375
+		html.setHtml(sb.toString());
2376
+		player.sendPacket(html);
2377
+		}
2378
+		catch(Throwable e)
2379
+		{
2380
+			e.printStackTrace();
2381
+		}
2382
+	}
2383
+
2384
+	public void updateSQL()
2385
+	{
2386
+		Connection con = null;
2387
+		PreparedStatement statement = null;
2388
+
2389
+		try
2390
+		{
2391
+			con = L2DatabaseFactory.getInstance().getConnection();
2392
+
2393
+			for (Map.Entry<String, Boolean> player : changes.entrySet())
2394
+			{
2395
+
2396
+				TextBuilder sb = new TextBuilder();
2397
+
2398
+				int c = 0;
2399
+				for (int buffid : buffTemplates.get(player.getKey()))
2400
+					if (c == 0)
2401
+					{
2402
+						sb.append(buffid);
2403
+						c++;
2404
+					}
2405
+					else
2406
+						sb.append("," + buffid);
2407
+
2408
+				if (player.getValue())
2409
+				{
2410
+					statement = con.prepareStatement("INSERT INTO event_buffs(player,buffs) VALUES (?,?)");
2411
+					statement.setString(1, player.getKey());
2412
+					statement.setString(2, sb.toString());
2413
+
2414
+					statement.executeUpdate();
2415
+					statement.close();
2416
+				}
2417
+				else
2418
+				{
2419
+					statement = con.prepareStatement("UPDATE event_buffs SET buffs=? WHERE player=?");
2420
+					statement.setString(1, sb.toString());
2421
+					statement.setString(2, player.getKey());
2422
+
2423
+					statement.executeUpdate();
2424
+					statement.close();
2425
+				}
2426
+			}
2427
+		}
2428
+		catch (Exception e)
2429
+		{
2430
+			System.out.println("EventBuffs SQL catch");
2431
+		}
2432
+		finally
2433
+		{
2434
+			try { con.close(); } catch (Exception e) {}
2435
+		}
2436
+
2437
+		changes.clear();
2438
+	}
2439
+}
2440
\ No newline at end of file
2441
Index: head-src/com/l2jfrozen/gameserver/event/VIPTvT.java
2442
===================================================================
2443
--- head-src/com/l2jfrozen/gameserver/event/VIPTvT.java	(revision 0)
2444
+++ head-src/com/l2jfrozen/gameserver/event/VIPTvT.java	(revision 0)
2445
@@ -0,0 +1,207 @@
2446
+package com.l2jfrozen.gameserver.event;
2447
+
2448
+import javolution.text.TextBuilder;
2449
+import javolution.util.FastMap;
2450
+
2451
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
2452
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
2453
+
2454
+public class VIPTvT extends Event
2455
+{
2456
+	private class Core implements Runnable
2457
+	{
2458
+		public void run()
2459
+		{
2460
+			try
2461
+			{
2462
+				switch (eventState)
2463
+				{
2464
+					case START:
2465
+						divideIntoTeams(2);
2466
+						preparePlayers();
2467
+						teleportToTeamPos();
2468
+						createPartyOfTeam(1);
2469
+						createPartyOfTeam(2);
2470
+						selectNewVipOfTeam(1);
2471
+						selectNewVipOfTeam(2);
2472
+						forceSitAll();
2473
+						setStatus(EventState.FIGHT);
2474
+						schedule(20000);
2475
+						break;
2476
+
2477
+					case FIGHT:
2478
+						forceStandAll();
2479
+						setStatus(EventState.END);
2480
+						clock.startClock(getInt("matchTime"));
2481
+						break;
2482
+
2483
+					case END:
2484
+						clock.setTime(0);
2485
+						if (winnerTeam == 0)
2486
+							winnerTeam = getWinnerTeam();
2487
+						
2488
+						giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
2489
+						setStatus(EventState.INACTIVE);
2490
+						EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " VIP kills!");
2491
+						break;
2492
+				}
2493
+			}
2494
+			catch (Throwable e)
2495
+			{
2496
+				e.printStackTrace();
2497
+				EventManager.getInstance().end("Error! Event ended.");
2498
+			}
2499
+
2500
+		}
2501
+	}
2502
+
2503
+	private enum EventState
2504
+	{
2505
+		START, FIGHT, END, TELEPORT, INACTIVE
2506
+	}
2507
+
2508
+	private EventState eventState;
2509
+
2510
+	private Core task;
2511
+
2512
+	private FastMap<Integer, L2PcInstance> vips;
2513
+
2514
+	public VIPTvT()
2515
+	{
2516
+		super();
2517
+		eventId = 8;
2518
+		createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
2519
+		createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
2520
+		task = new Core();
2521
+		vips = new FastMap<Integer, L2PcInstance>();
2522
+		winnerTeam = 0;
2523
+	}
2524
+
2525
+	@Override
2526
+	protected void endEvent()
2527
+	{
2528
+		winnerTeam = players.head().getNext().getValue()[0];
2529
+
2530
+		setStatus(EventState.END);
2531
+		clock.setTime(0);
2532
+
2533
+	}
2534
+
2535
+	@Override
2536
+	protected String getScorebar()
2537
+	{
2538
+		return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + "  " + teams.get(2).getName() + ": " + teams.get(2).getScore() + "  Time: " + clock.getTime();
2539
+	}
2540
+
2541
+	@Override
2542
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
2543
+	{
2544
+		super.onDie(victim, killer);
2545
+		if (vips.get(1) == victim)
2546
+		{
2547
+			teams.get(2).increaseScore();
2548
+			increasePlayersScore(killer);
2549
+			killer.addItem("Event", 6392, 3, killer, true);
2550
+			selectNewVipOfTeam(1);
2551
+		}
2552
+		if (vips.get(2) == victim)
2553
+		{
2554
+			teams.get(1).increaseScore();
2555
+			increasePlayersScore(killer);
2556
+			killer.addItem("Event", 6392, 3, killer, true);
2557
+			selectNewVipOfTeam(2);
2558
+		}
2559
+
2560
+		addToResurrector(victim);
2561
+	}
2562
+
2563
+	@Override
2564
+	protected void schedule(int time)
2565
+	{
2566
+		tpm.scheduleGeneral(task, time);
2567
+	}
2568
+
2569
+	private void selectNewVipOfTeam(int team)
2570
+	{
2571
+		if (vips.get(team) != null)
2572
+		{
2573
+			int[] nameColor = teams.get(getTeam(vips.get(team))).getTeamColor();
2574
+			vips.get(team).getAppearance().setNameColor(nameColor[0], nameColor[1], nameColor[2]);
2575
+		}
2576
+
2577
+		L2PcInstance newvip = getRandomPlayerFromTeam(team);
2578
+		vips.getEntry(team).setValue(newvip);
2579
+		if (team == 1)
2580
+		{
2581
+			int[] c = getColor("BlueVIP");
2582
+			newvip.getAppearance().setNameColor(c[0], c[1], c[2]);
2583
+		}
2584
+
2585
+		if (team == 2)
2586
+		{
2587
+			int[] c = getColor("RedVIP");
2588
+			newvip.getAppearance().setNameColor(c[0], c[1], c[2]);
2589
+		}
2590
+
2591
+		if (!newvip.isDead())
2592
+		{
2593
+			newvip.setCurrentCp(newvip.getMaxCp());
2594
+			newvip.setCurrentMp(newvip.getMaxMp());
2595
+			newvip.setCurrentHp(newvip.getMaxHp());
2596
+		}
2597
+
2598
+		newvip.broadcastUserInfo();
2599
+
2600
+	}
2601
+
2602
+	private void setStatus(EventState s)
2603
+	{
2604
+		eventState = s;
2605
+	}
2606
+
2607
+	@Override
2608
+	protected void showHtml(L2PcInstance player, int obj)
2609
+	{
2610
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
2611
+		TextBuilder sb = new TextBuilder();
2612
+
2613
+		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>");
2614
+		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>");
2615
+		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>");
2616
+		sb.append("<br><table width=270>");
2617
+		int i = 0;
2618
+		for (EventTeam team : teams.values())
2619
+		{
2620
+			i++;
2621
+			sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
2622
+			for (L2PcInstance p : getPlayersOfTeam(i))
2623
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
2624
+		}
2625
+
2626
+		sb.append("</table></body></html>");
2627
+		html.setHtml(sb.toString());
2628
+		player.sendPacket(html);
2629
+
2630
+	}
2631
+
2632
+	@Override
2633
+	protected void start()
2634
+	{
2635
+		vips.put(1, null);
2636
+		vips.put(2, null);
2637
+		setStatus(EventState.START);
2638
+		schedule(1);
2639
+	}
2640
+	
2641
+	@Override 
2642
+ 	public void onLogout(L2PcInstance player) 
2643
+ 	{ 
2644
+ 	super.onLogout(player); 
2645
+ 	
2646
+ 	if(vips.get(1) == player) 
2647
+ 		selectNewVipOfTeam(1); 
2648
+ 	if(vips.get(2) == player) 
2649
+ 		selectNewVipOfTeam(2); 
2650
+ 	       
2651
+ 	} 
2652
+}
2653
\ No newline at end of file
2654
Index: head-src/com/l2jfrozen/gameserver/event/EventTeam.java
2655
===================================================================
2656
--- head-src/com/l2jfrozen/gameserver/event/EventTeam.java	(revision 0)
2657
+++ head-src/com/l2jfrozen/gameserver/event/EventTeam.java	(revision 0)
2658
@@ -0,0 +1,109 @@
2659
+/*
2660
+ * This program is free software: you can redistribute it and/or modify it under
2661
+ * the terms of the GNU General Public License as published by the Free Software
2662
+ * Foundation, either version 3 of the License, or (at your option) any later
2663
+ * version.
2664
+ *
2665
+ * This program is distributed in the hope that it will be useful, but WITHOUT
2666
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
2667
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
2668
+ * details.
2669
+ *
2670
+ * You should have received a copy of the GNU General Public License along with
2671
+ * this program. If not, see <http://www.gnu.org/licenses/>.
2672
+ */
2673
+package com.l2jfrozen.gameserver.event;
2674
+
2675
+/**
2676
+ * @author Rizel
2677
+ *
2678
+ */
2679
+public class EventTeam implements Comparable<EventTeam>
2680
+{
2681
+	private int score;
2682
+
2683
+	private String name;
2684
+
2685
+	private int[] nameColor;
2686
+
2687
+	private int[] startPos;
2688
+
2689
+	private int id;
2690
+
2691
+	public EventTeam(int id, String name, int[] color, int[] startPos)
2692
+	{
2693
+		this.id = id;
2694
+		score = 0;
2695
+		this.name = name;
2696
+		nameColor = color;
2697
+		this.startPos = startPos;
2698
+	}
2699
+
2700
+	public int compareTo(EventTeam second)
2701
+	{
2702
+
2703
+		if (getScore() > second.getScore())
2704
+			return 1;
2705
+		if (getScore() < second.getScore())
2706
+			return -1;
2707
+		if (getScore() == second.getScore())
2708
+			return 0;
2709
+
2710
+		return 0;
2711
+
2712
+	}
2713
+
2714
+	protected String getHexaColor()
2715
+	{
2716
+		String hexa;
2717
+		Integer i1 = nameColor[0];
2718
+		Integer i2 = nameColor[1];
2719
+		Integer i3 = nameColor[2];
2720
+		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));
2721
+		return hexa;
2722
+	}
2723
+
2724
+	protected int getId()
2725
+	{
2726
+		return id;
2727
+	}
2728
+
2729
+	protected String getName()
2730
+	{
2731
+		return name;
2732
+	}
2733
+
2734
+	protected int getScore()
2735
+	{
2736
+		return score;
2737
+	}
2738
+
2739
+	protected int[] getTeamColor()
2740
+	{
2741
+		return nameColor;
2742
+	}
2743
+
2744
+	protected int[] getTeamPos()
2745
+	{
2746
+		return startPos;
2747
+	}
2748
+
2749
+	protected void increaseScore()
2750
+	{
2751
+		score++;
2752
+	}
2753
+
2754
+	/* (non-Javadoc)
2755
+	 * @see java.lang.Comparable#compareTo(java.lang.Object)
2756
+	 */
2757
+
2758
+	protected void increaseScore(int ammount)
2759
+	{
2760
+		score += ammount;
2761
+	}
2762
+
2763
+	protected void setScore(int ammount)
2764
+	{
2765
+		score = ammount;
2766
+	}
2767
+}
2768
\ No newline at end of file
2769
Index: head-src/com/l2jfrozen/gameserver/event/EventStats.java
2770
===================================================================
2771
--- head-src/com/l2jfrozen/gameserver/event/EventStats.java	(revision 0)
2772
+++ head-src/com/l2jfrozen/gameserver/event/EventStats.java	(revision 0)
2773
@@ -0,0 +1,383 @@
2774
+package com.l2jfrozen.gameserver.event;
2775
+
2776
+import java.sql.Connection;
2777
+import java.sql.PreparedStatement;
2778
+import java.sql.ResultSet;
2779
+import java.util.Map;
2780
+import java.util.Set;
2781
+
2782
+import javolution.text.TextBuilder;
2783
+import javolution.util.FastMap;
2784
+
2785
+import com.l2jfrozen.util.database.L2DatabaseFactory;
2786
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
2787
+import com.l2jfrozen.gameserver.network.serverpackets.ShowBoard;
2788
+
2789
+public class EventStats
2790
+{
2791
+
2792
+	private static class SingletonHolder
2793
+	{
2794
+		protected static final EventStats _instance = new EventStats();
2795
+	}
2796
+
2797
+	private class StatModell
2798
+	{
2799
+		protected int num;
2800
+		protected int wins;
2801
+		protected int losses;
2802
+		protected int kills;
2803
+		protected int deaths;
2804
+		protected int scores;
2805
+
2806
+		private StatModell(int num, int wins, int losses, int kills, int deaths, int scores)
2807
+		{
2808
+			this.num = num;
2809
+			this.wins = wins;
2810
+			this.losses = losses;
2811
+			this.kills = kills;
2812
+			this.deaths = deaths;
2813
+			this.scores = scores;
2814
+		}
2815
+
2816
+	}
2817
+
2818
+	public static EventStats getInstance()
2819
+	{
2820
+		return SingletonHolder._instance;
2821
+	}
2822
+
2823
+	private FastMap<Integer, FastMap<Integer, StatModell>> stats;
2824
+
2825
+	protected FastMap<Integer, int[]> tempTable;
2826
+
2827
+	private FastMap<Integer, ShowBoard> htmls;
2828
+
2829
+	private FastMap<Integer, int[]> statSums;
2830
+
2831
+	public EventStats()
2832
+	{
2833
+		stats = new FastMap<Integer, FastMap<Integer, StatModell>>();
2834
+		tempTable = new FastMap<Integer, int[]>();
2835
+		htmls = new FastMap<Integer, ShowBoard>();
2836
+		statSums = new FastMap<Integer, int[]>();
2837
+		loadSQL();
2838
+	}
2839
+
2840
+	protected void applyChanges()
2841
+	{
2842
+		if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
2843
+			return;
2844
+
2845
+		int eventId = EventManager.getInstance().getCurrentEvent().eventId;
2846
+		for (L2PcInstance player : EventManager.getInstance().getCurrentEvent().getPlayerList())
2847
+		{
2848
+			int playerId = player.getObjectId();
2849
+
2850
+			if (!stats.containsKey(playerId))
2851
+				stats.put(playerId, new FastMap<Integer, StatModell>());
2852
+
2853
+			if (!stats.get(playerId).containsKey(eventId))
2854
+				stats.get(playerId).put(eventId, new StatModell(0, 0, 0, 0, 0, 0));
2855
+
2856
+			if (tempTable.get(playerId)[0] == 1)
2857
+				stats.get(playerId).get(eventId).wins = stats.get(playerId).get(eventId).wins + 1;
2858
+			else
2859
+				stats.get(playerId).get(eventId).losses = stats.get(playerId).get(eventId).losses + 1;
2860
+
2861
+			stats.get(playerId).get(eventId).num = stats.get(playerId).get(eventId).num + 1;
2862
+			stats.get(playerId).get(eventId).kills = stats.get(playerId).get(eventId).kills + tempTable.get(playerId)[1];
2863
+			stats.get(playerId).get(eventId).deaths = stats.get(playerId).get(eventId).deaths + tempTable.get(playerId)[2];
2864
+			stats.get(playerId).get(eventId).scores = stats.get(playerId).get(eventId).scores + tempTable.get(playerId)[3];
2865
+		}
2866
+		EventManager.getInstance().debug("applyChanges finished");
2867
+	}
2868
+
2869
+	protected void createHtmls()
2870
+	{
2871
+		htmls.clear();
2872
+		TextBuilder sb = new TextBuilder();
2873
+		Connection con = null;
2874
+		PreparedStatement statement = null;
2875
+		try
2876
+		{
2877
+			con = L2DatabaseFactory.getInstance().getConnection();
2878
+			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");
2879
+			ResultSet rset = statement.executeQuery();
2880
+			rset.last();
2881
+			rset.beforeFirst();
2882
+			int count = 0;
2883
+			while (rset.next())
2884
+			{
2885
+				count++;
2886
+				if (count % 10 == 1)
2887
+					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>");
2888
+
2889
+				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>");
2890
+
2891
+				if (count % 10 == 0)
2892
+				{
2893
+					sb.append("</table></body></html>");
2894
+					htmls.put(count / 10, new ShowBoard(sb.toString(), "101"));
2895
+					sb.clear();
2896
+				}
2897
+			}
2898
+			if (count % 10 != 0 && !htmls.containsKey(count / 10 + 1))
2899
+			{
2900
+				sb.append("</table></body></html>");
2901
+				htmls.put((count / 10 + 1), new ShowBoard(sb.toString(), "101"));
2902
+				sb.clear();
2903
+			}
2904
+			rset.close();
2905
+			statement.close();
2906
+		}
2907
+		catch (Exception e)
2908
+		{
2909
+			System.out.println("create SQL exception.");
2910
+		}
2911
+		finally
2912
+		{
2913
+			try { con.close(); } catch (Exception e) {}
2914
+		}
2915
+		EventManager.getInstance().debug("createHtmls finished");
2916
+	}
2917
+
2918
+	private void loadSQL()
2919
+	{
2920
+		if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
2921
+			return;
2922
+
2923
+		Connection con = null;
2924
+		PreparedStatement statement = null;
2925
+		try
2926
+		{
2927
+			con = L2DatabaseFactory.getInstance().getConnection();
2928
+			statement = con.prepareStatement("SELECT * FROM event_stats");
2929
+			ResultSet rset = statement.executeQuery();
2930
+			int count = 0;
2931
+			while (rset.next())
2932
+			{
2933
+				count++;
2934
+				if (!stats.containsKey(rset.getInt("player")))
2935
+					stats.put(rset.getInt("player"), new FastMap<Integer, StatModell>());
2936
+
2937
+				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")));
2938
+			}
2939
+			rset.close();
2940
+			statement.close();
2941
+
2942
+			EventManager.getInstance().debug("Stats loaded: " + count + " records.");
2943
+		}
2944
+		catch (Exception e)
2945
+		{
2946
+			System.out.println("EventStats SQL catch");
2947
+		}
2948
+		finally
2949
+		{
2950
+			try { con.close(); } catch (Exception e) {}
2951
+		}
2952
+		createHtmls();
2953
+	}
2954
+
2955
+	public void showHtml(int id, L2PcInstance player)
2956
+	{
2957
+		if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
2958
+		{
2959
+			player.sendMessage("The stat tracking is disabled.");
2960
+			return;
2961
+		}
2962
+		player.sendPacket(htmls.get(id));
2963
+		player.sendPacket(new ShowBoard(null, "102"));
2964
+		player.sendPacket(new ShowBoard(null, "103"));
2965
+	}
2966
+
2967
+	public void showPlayerStats(int playerId, L2PcInstance player)
2968
+	{
2969
+		TextBuilder sb = new TextBuilder();
2970
+		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>");
2971
+
2972
+		if (stats.containsKey(playerId))
2973
+			for (Map.Entry<Integer, StatModell> event : stats.get(playerId).entrySet())
2974
+			{
2975
+				StatModell stats = event.getValue();
2976
+				
2977
+				if(EventManager.getInstance().events.containsKey(event.getKey()))
2978
+						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>");
2979
+			}
2980
+
2981
+		sb.append("</table></body></html>");
2982
+		player.sendPacket(new ShowBoard(sb.toString(), "101"));
2983
+		player.sendPacket(new ShowBoard(null, "102"));
2984
+		player.sendPacket(new ShowBoard(null, "103"));
2985
+	}
2986
+	
2987
+	public int getEventKills(int playerId)
2988
+	{
2989
+		int kills = 0;
2990
+
2991
+		if(!stats.containsKey(playerId))
2992
+			return 0;
2993
+		else
2994
+			for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
2995
+				kills += statmodell.getValue().kills;
2996
+
2997
+		return kills;
2998
+	}
2999
+	
3000
+	public int getEvents(int playerId)
3001
+	{
3002
+		int num = 0;
3003
+
3004
+		if(!stats.containsKey(playerId))
3005
+			return 0;
3006
+		else
3007
+			for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
3008
+				num += statmodell.getValue().num;
3009
+
3010
+		return num;
3011
+	}
3012
+	
3013
+	public int getEventWins(int playerId)
3014
+	{
3015
+		int wins = 0;
3016
+
3017
+		if(!stats.containsKey(playerId))
3018
+			return 0;
3019
+		else
3020
+			for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
3021
+				wins += statmodell.getValue().wins;
3022
+
3023
+		return wins;
3024
+	}
3025
+	
3026
+	// num | wins | losses | kills | deaths | fav_event_id
3027
+	protected void sumPlayerStats()
3028
+	{
3029
+		if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
3030
+			return;
3031
+
3032
+		statSums.clear();
3033
+
3034
+		for (int playerId : stats.keySet())
3035
+		{
3036
+
3037
+			int num = 0;
3038
+			int wins = 0;
3039
+			int losses = 0;
3040
+			int kills = 0;
3041
+			int deaths = 0;
3042
+			int faveventid = 0;
3043
+			int faveventamm = 0;
3044
+
3045
+			for (Map.Entry<Integer, StatModell> statmodell : stats.get(playerId).entrySet())
3046
+			{
3047
+				num += statmodell.getValue().num;
3048
+				wins += statmodell.getValue().wins;
3049
+				losses += statmodell.getValue().losses;
3050
+				kills += statmodell.getValue().kills;
3051
+				deaths += statmodell.getValue().deaths;
3052
+
3053
+				if (statmodell.getValue().num > faveventamm)
3054
+				{
3055
+					faveventamm = statmodell.getValue().num;
3056
+					faveventid = statmodell.getKey();
3057
+				}
3058
+			}
3059
+
3060
+			statSums.put(playerId, new int[] { num, wins, losses, kills, deaths, faveventid });
3061
+
3062
+		}
3063
+		EventManager.getInstance().debug("sumPlayerStats finished");
3064
+	}
3065
+
3066
+	protected void updateSQL(Set<L2PcInstance> players, int eventId)
3067
+	{
3068
+		if (!EventManager.getInstance().getBoolean("statTrackingEnabled"))
3069
+			return;
3070
+
3071
+		sumPlayerStats();
3072
+		Connection con = null;
3073
+		PreparedStatement statement = null;
3074
+		try
3075
+		{
3076
+			con = L2DatabaseFactory.getInstance().getConnection();
3077
+
3078
+			for (L2PcInstance player : players)
3079
+			{
3080
+				int id = player.getObjectId();
3081
+
3082
+				if (statSums.get(id)[0] != 1)
3083
+				{
3084
+					statement = con.prepareStatement("UPDATE event_stats_full SET num=?, winpercent=?, kdratio=?, wins=?, losses=?, kills=?, deaths=?, favevent=? WHERE player=?");
3085
+					statement.setInt(1, statSums.get(id)[0]);
3086
+					statement.setInt(2, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
3087
+					statement.setDouble(3, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
3088
+					statement.setInt(4, statSums.get(id)[1]);
3089
+					statement.setInt(5, statSums.get(id)[2]);
3090
+					statement.setInt(6, statSums.get(id)[3]);
3091
+					statement.setInt(7, statSums.get(id)[4]);
3092
+					statement.setInt(8, statSums.get(id)[5]);
3093
+					statement.setInt(9, id);
3094
+
3095
+					statement.executeUpdate();
3096
+					statement.close();
3097
+				}
3098
+				else
3099
+				{
3100
+					statement = con.prepareStatement("INSERT INTO event_stats_full(player,num,winpercent,kdratio,wins,losses,kills,deaths,favevent) VALUES (?,?,?,?,?,?,?,?,?)");
3101
+					statement.setInt(1, id);
3102
+					statement.setInt(2, statSums.get(id)[0]);
3103
+					statement.setInt(3, (statSums.get(id)[0] == 0 ? 1 : statSums.get(id)[1] / statSums.get(id)[0]) * 100);
3104
+					statement.setDouble(4, (statSums.get(id)[4] == 0 ? (double) statSums.get(id)[3] : (double) (statSums.get(id)[3] / statSums.get(id)[4])));
3105
+					statement.setInt(5, statSums.get(id)[1]);
3106
+					statement.setInt(6, statSums.get(id)[2]);
3107
+					statement.setInt(7, statSums.get(id)[3]);
3108
+					statement.setInt(8, statSums.get(id)[4]);
3109
+					statement.setInt(9, statSums.get(id)[5]);
3110
+					statement.executeUpdate();
3111
+					statement.close();
3112
+				}
3113
+
3114
+				if (stats.get(id).get(eventId).num != 1)
3115
+				{
3116
+					statement = con.prepareStatement("UPDATE event_stats SET num=?, wins=?, losses=?, kills=?, deaths=?, scores=? WHERE player=? AND event=?");
3117
+					statement.setInt(1, stats.get(id).get(eventId).num);
3118
+					statement.setInt(2, stats.get(id).get(eventId).wins);
3119
+					statement.setInt(3, stats.get(id).get(eventId).losses);
3120
+					statement.setInt(4, stats.get(id).get(eventId).kills);
3121
+					statement.setInt(5, stats.get(id).get(eventId).deaths);
3122
+					statement.setInt(6, stats.get(id).get(eventId).scores);
3123
+					statement.setInt(7, id);
3124
+					statement.setInt(8, eventId);
3125
+					statement.executeUpdate();
3126
+					statement.close();
3127
+				}
3128
+				else
3129
+				{
3130
+					statement = con.prepareStatement("INSERT INTO event_stats(player,event,num,wins,losses,kills,deaths,scores) VALUES (?,?,?,?,?,?,?,?)");
3131
+					statement.setInt(1, id);
3132
+					statement.setInt(2, eventId);
3133
+					statement.setInt(3, stats.get(id).get(eventId).num);
3134
+					statement.setInt(4, stats.get(id).get(eventId).wins);
3135
+					statement.setInt(5, stats.get(id).get(eventId).losses);
3136
+					statement.setInt(6, stats.get(id).get(eventId).kills);
3137
+					statement.setInt(7, stats.get(id).get(eventId).deaths);
3138
+					statement.setInt(8, stats.get(id).get(eventId).scores);
3139
+					statement.executeUpdate();
3140
+					statement.close();
3141
+				}
3142
+
3143
+			}
3144
+		}
3145
+		catch (Exception e)
3146
+		{
3147
+			System.out.println("EventStats SQL catch");
3148
+		}
3149
+		finally
3150
+		{
3151
+			try { con.close(); } catch (Exception e) {}
3152
+		}
3153
+		EventManager.getInstance().debug("updateSQL finished");
3154
+		createHtmls();
3155
+	}
3156
+}
3157
\ No newline at end of file
3158
Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/Die.java
3159
===================================================================
3160
--- head-src/com/l2jfrozen/gameserver/network/serverpackets/Die.java	(revision 936)
3161
+++ head-src/com/l2jfrozen/gameserver/network/serverpackets/Die.java	(working copy)
3162
@@ -18,6 +18,7 @@
3163
  */
3164
 package com.l2jfrozen.gameserver.network.serverpackets;
3165
 
3166
+import com.l2jfrozen.gameserver.event.EventManager;
3167
 import com.l2jfrozen.gameserver.datatables.AccessLevel;
3168
 import com.l2jfrozen.gameserver.datatables.sql.AccessLevels;
3169
 import com.l2jfrozen.gameserver.managers.CastleManager;
3170
@@ -46,6 +47,7 @@
3171
 	private boolean _sweepable;
3172
 	private boolean _canTeleport;
3173
 	private AccessLevel _access = AccessLevels.getInstance()._userAccessLevel;
3174
+	private boolean _event;
3175
 	private com.l2jfrozen.gameserver.model.L2Clan _clan;
3176
 	L2Character _activeChar;
3177
 
3178
@@ -60,6 +62,7 @@
3179
 			L2PcInstance player = (L2PcInstance) cha;
3180
 			_access = player.getAccessLevel();
3181
 			_clan = player.getClan();
3182
+			_event = EventManager.getInstance().isRegistered((L2PcInstance)cha);
3183
 			_canTeleport = !((TvT.is_started() && player._inEventTvT)
3184
 							|| (DM.is_started() && player._inEventDM)
3185
 							|| (CTF.is_started() && player._inEventCTF)
3186
@@ -91,45 +94,55 @@
3187
 		// 6d 03 00 00 00 - to siege HQ
3188
 		// sweepable
3189
 		// 6d 04 00 00 00 - FIXED
3190
-
3191
-		writeD(_canTeleport ? 0x01 : 0);   // 6d 00 00 00 00 - to nearest village
3192
-
3193
-		if(_canTeleport && _clan != null)
3194
-		{
3195
-			L2SiegeClan siegeClan = null;
3196
-			Boolean isInDefense = false;
3197
-			Castle castle = CastleManager.getInstance().getCastle(_activeChar);
3198
-			Fort fort = FortManager.getInstance().getFort(_activeChar);
3199
-
3200
-			if(castle != null && castle.getSiege().getIsInProgress())
3201
+		
3202
+        if(_event)
3203
+        {
3204
+        	writeD(0x00);  
3205
+        	writeD(0x00);                                               // 6d 01 00 00 00 - to hide away
3206
+            writeD(0x00);                                               // 6d 02 00 00 00 - to castle
3207
+            writeD(0x00); 
3208
+        }
3209
+        else
3210
+        {
3211
+			writeD(_canTeleport ? 0x01 : 0);   // 6d 00 00 00 00 - to nearest village
3212
+		
3213
+			if(_canTeleport && _clan != null)
3214
 			{
3215
-				//siege in progress
3216
-				siegeClan = castle.getSiege().getAttackerClan(_clan);
3217
-				if(siegeClan == null && castle.getSiege().checkIsDefender(_clan))
3218
+				L2SiegeClan siegeClan = null;
3219
+				Boolean isInDefense = false;
3220
+				Castle castle = CastleManager.getInstance().getCastle(_activeChar);
3221
+				Fort fort = FortManager.getInstance().getFort(_activeChar);
3222
+		
3223
+				if(castle != null && castle.getSiege().getIsInProgress())
3224
 				{
3225
-					isInDefense = true;
3226
+					//siege in progress
3227
+					siegeClan = castle.getSiege().getAttackerClan(_clan);
3228
+					if(siegeClan == null && castle.getSiege().checkIsDefender(_clan))
3229
+					{
3230
+						isInDefense = true;
3231
+					}
3232
 				}
3233
-			}
3234
-			else if(fort != null && fort.getSiege().getIsInProgress())
3235
-			{
3236
-				//siege in progress
3237
-				siegeClan = fort.getSiege().getAttackerClan(_clan);
3238
-				if(siegeClan == null && fort.getSiege().checkIsDefender(_clan))
3239
+				else if(fort != null && fort.getSiege().getIsInProgress())
3240
 				{
3241
-					isInDefense = true;
3242
+					//siege in progress
3243
+					siegeClan = fort.getSiege().getAttackerClan(_clan);
3244
+					if(siegeClan == null && fort.getSiege().checkIsDefender(_clan))
3245
+					{
3246
+						isInDefense = true;
3247
+					}
3248
 				}
3249
+		
3250
+				writeD(_clan.getHasHideout() > 0 ? 0x01 : 0x00); // 6d 01 00 00 00 - to hide away
3251
+				writeD(_clan.getHasCastle() > 0 || _clan.getHasFort() > 0 || isInDefense ? 0x01 : 0x00); // 6d 02 00 00 00 - to castle
3252
+				writeD(siegeClan != null && !isInDefense && siegeClan.getFlag().size() > 0 ? 0x01 : 0x00); // 6d 03 00 00 00 - to siege HQ
3253
 			}
3254
-
3255
-			writeD(_clan.getHasHideout() > 0 ? 0x01 : 0x00); // 6d 01 00 00 00 - to hide away
3256
-			writeD(_clan.getHasCastle() > 0 || _clan.getHasFort() > 0 || isInDefense ? 0x01 : 0x00); // 6d 02 00 00 00 - to castle
3257
-			writeD(siegeClan != null && !isInDefense && siegeClan.getFlag().size() > 0 ? 0x01 : 0x00); // 6d 03 00 00 00 - to siege HQ
3258
-		}
3259
-		else
3260
-		{
3261
-			writeD(0x00); // 6d 01 00 00 00 - to hide away
3262
-			writeD(0x00); // 6d 02 00 00 00 - to castle
3263
-			writeD(0x00); // 6d 03 00 00 00 - to siege HQ
3264
-		}
3265
+			else
3266
+			{
3267
+				writeD(0x00); // 6d 01 00 00 00 - to hide away
3268
+				writeD(0x00); // 6d 02 00 00 00 - to castle
3269
+				writeD(0x00); // 6d 03 00 00 00 - to siege HQ
3270
+			}
3271
+        }
3272
 
3273
 		writeD(_sweepable ? 0x01 : 0x00); // sweepable  (blue glow)
3274
 		writeD(_access.allowFixedRes() ? 0x01 : 0x00); // 6d 04 00 00 00 - to FIXED
3275
Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java
3276
===================================================================
3277
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java	(revision 936)
3278
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestBypassToServer.java	(working copy)
3279
@@ -18,12 +18,18 @@
3280
  */
3281
 package com.l2jfrozen.gameserver.network.clientpackets;
3282
 
3283
+import java.sql.Connection;
3284
+import java.sql.PreparedStatement;
3285
+import java.sql.ResultSet;
3286
 import java.util.logging.Level;
3287
 import java.util.logging.Logger;
3288
 
3289
 import com.l2jfrozen.Config;
3290
 import com.l2jfrozen.gameserver.ai.CtrlIntention;
3291
 import com.l2jfrozen.gameserver.communitybbs.CommunityBoard;
3292
+import com.l2jfrozen.gameserver.event.EventBuffer;
3293
+import com.l2jfrozen.gameserver.event.EventManager;
3294
+import com.l2jfrozen.gameserver.event.EventStats;
3295
 import com.l2jfrozen.gameserver.datatables.sql.AdminCommandAccessRights;
3296
 import com.l2jfrozen.gameserver.handler.AdminCommandHandler;
3297
 import com.l2jfrozen.gameserver.handler.IAdminCommandHandler;
3298
@@ -43,6 +49,7 @@
3299
 import com.l2jfrozen.gameserver.network.serverpackets.ActionFailed;
3300
 import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
3301
 import com.l2jfrozen.gameserver.util.GMAudit;
3302
+import com.l2jfrozen.util.database.L2DatabaseFactory;
3303
 
3304
 public final class RequestBypassToServer extends L2GameClientPacket
3305
 {
3306
@@ -116,6 +123,18 @@
3307
 
3308
 				ach.useAdminCommand(_command, activeChar);
3309
 			}
3310
+			else if(_command.startsWith("event_vote"))
3311
+			{
3312
+				EventManager.getInstance().addVote(activeChar, Integer.parseInt(_command.substring(11)));
3313
+			}
3314
+			else if(_command.equals("event_register"))
3315
+			{
3316
+				EventManager.getInstance().registerPlayer(activeChar);
3317
+			}
3318
+			else if(_command.equals("event_unregister"))
3319
+			{
3320
+				EventManager.getInstance().unregisterPlayer(activeChar);
3321
+			}
3322
 			else if(_command.equals("come_here") && activeChar.isGM())
3323
 			{
3324
 				comeHere(activeChar);
3325
@@ -307,7 +326,52 @@
3326
 					player.processQuestEvent(p.substring(0, idx), p.substring(idx).trim());
3327
 				}
3328
 			}
3329
-
3330
+			else if (_command.startsWith("eventvote ")) 
3331
+		 	{ 
3332
+		 	        EventManager.getInstance().addVote(activeChar, Integer.parseInt(_command.substring(10))); 
3333
+		 	} 
3334
+		 	else if (_command.startsWith("eventstats ")) 
3335
+		 	{
3336
+		 			Connection con = null;
3337
+		 			PreparedStatement statement = null;
3338
+		 			con = L2DatabaseFactory.getInstance().getConnection();
3339
+		 			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");
3340
+		 			ResultSet rset = statement.executeQuery();
3341
+		 			if (!rset.last())
3342
+		 			{
3343
+		 				rset.close();
3344
+		 				statement.close();
3345
+		 				con.close();
3346
+		 				this.getClient().activeChar.sendMessage("Currently there are no statistics to show.");
3347
+		 				return;
3348
+		 			}
3349
+		 			rset.close();
3350
+	 				statement.close();
3351
+	 				con.close();
3352
+		 	        EventStats.getInstance().showHtml(Integer.parseInt(_command.substring(11)),activeChar); 
3353
+		 	} 
3354
+		 	else if (_command.startsWith("eventstats_show ")) 
3355
+		 	{ 
3356
+		 	        EventStats.getInstance().showPlayerStats(Integer.parseInt(_command.substring(16)),activeChar); 
3357
+		 	} 
3358
+		 	else if (_command.equals("eventbuffershow")) 
3359
+		 	{ 
3360
+		 	        EventBuffer.getInstance().showHtml(activeChar); 
3361
+		 	} 
3362
+		 	else if (_command.startsWith("eventbuffer ")) 
3363
+		 	{ 
3364
+		 	        EventBuffer.getInstance().changeList(activeChar, Integer.parseInt(_command.substring(12,_command.length()-2)), (Integer.parseInt(_command.substring(_command.length()-1)) == 0 ? false : true)); 
3365
+		 	        EventBuffer.getInstance().showHtml(activeChar); 
3366
+		 	} 
3367
+			else if (_command.startsWith("eventinfo "))
3368
+			{
3369
+				int eventId = Integer.valueOf(_command.substring(10));
3370
+				
3371
+				NpcHtmlMessage html = new NpcHtmlMessage(0);
3372
+				html.setFile("data/html/eventinfo/"+eventId+".htm");
3373
+				activeChar.sendPacket(html);
3374
+				activeChar.sendPacket(ActionFailed.STATIC_PACKET);
3375
+			}
3376
 			// Jstar's Custom Bypass Caller!
3377
 			else if(_command.startsWith("custom_"))
3378
 			{
3379
Index: head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java
3380
===================================================================
3381
--- head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java	(revision 936)
3382
+++ head-src/com/l2jfrozen/gameserver/model/actor/instance/L2NpcInstance.java	(working copy)
3383
@@ -35,6 +35,7 @@
3384
 import com.l2jfrozen.gameserver.datatables.sql.HelperBuffTable;
3385
 import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
3386
 import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
3387
+import com.l2jfrozen.gameserver.event.EventManager;
3388
 import com.l2jfrozen.gameserver.idfactory.IdFactory;
3389
 import com.l2jfrozen.gameserver.managers.CastleManager;
3390
 import com.l2jfrozen.gameserver.managers.CustomNpcInstanceManager;
3391
@@ -2961,6 +2962,20 @@
3392
 				filename = getHtmlPath(npcId, val);
3393
 				break;
3394
 		}
3395
+		
3396
+        if(npcId == EventManager.getInstance().getInt("managerNpcId"))
3397
+    	{
3398
+    		EventManager.getInstance().showFirstHtml(player,getObjectId());
3399
+    		player.sendPacket( new ActionFailed() );
3400
+    			return;
3401
+    	}
3402
+    
3403
+        if(EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(player))	
3404
+        	if(EventManager.getInstance().getCurrentEvent().onTalkNpc(this,player)) 
3405
+	    	{
3406
+	    		player.sendPacket( new ActionFailed() );
3407
+	    		return;
3408
+	    	}
3409
 
3410
 		if(this instanceof L2CastleTeleporterInstance){
3411
 			((L2CastleTeleporterInstance)this).showChatWindow(player);
3412
Index: head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java
3413
===================================================================
3414
--- head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java	(revision 0)
3415
+++ head-src/com/l2jfrozen/gameserver/event/DoubleDomination.java	(revision 0)
3416
@@ -0,0 +1,280 @@
3417
+/*
3418
+ * This program is free software: you can redistribute it and/or modify it under
3419
+ * the terms of the GNU General Public License as published by the Free Software
3420
+ * Foundation, either version 3 of the License, or (at your option) any later
3421
+ * version.
3422
+ *
3423
+ * This program is distributed in the hope that it will be useful, but WITHOUT
3424
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
3425
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
3426
+ * details.
3427
+ *
3428
+ * You should have received a copy of the GNU General Public License along with
3429
+ * this program. If not, see <http://www.gnu.org/licenses/>.
3430
+ */
3431
+package com.l2jfrozen.gameserver.event;
3432
+
3433
+import javolution.text.TextBuilder;
3434
+import javolution.util.FastMap;
3435
+
3436
+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
3437
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
3438
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3439
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
3440
+
3441
+/**
3442
+ * @author Rizel
3443
+ *
3444
+ */
3445
+public class DoubleDomination extends Event
3446
+{
3447
+	private class Core implements Runnable
3448
+	{
3449
+		public void run()
3450
+		{
3451
+			try
3452
+			{
3453
+				switch (eventState)
3454
+				{
3455
+					case START:
3456
+						divideIntoTeams(2);
3457
+						preparePlayers();
3458
+						teleportToTeamPos();
3459
+						createPartyOfTeam(1);
3460
+						createPartyOfTeam(2);
3461
+						forceSitAll();
3462
+						setStatus(EventState.FIGHT);
3463
+						debug("The event started with " + players.size() + " players");
3464
+						schedule(20000);
3465
+						break;
3466
+
3467
+					case FIGHT:
3468
+						forceStandAll();
3469
+						setStatus(EventState.END);
3470
+						debug("The fight started");
3471
+						clock.startClock(getInt("matchTime"));
3472
+						break;
3473
+
3474
+					case END:
3475
+						clock.setTime(0);
3476
+						if (winnerTeam == 0)
3477
+							winnerTeam = getWinnerTeam();
3478
+
3479
+						giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
3480
+						unSpawnZones();
3481
+						setStatus(EventState.INACTIVE);
3482
+						debug("The event ended. Winner: " + winnerTeam);
3483
+						EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " Domination points!");
3484
+						break;
3485
+				}
3486
+			}
3487
+			catch (Throwable e)
3488
+			{
3489
+				e.printStackTrace();
3490
+				EventManager.getInstance().end("Error! Event ended.");
3491
+			}
3492
+		}
3493
+	}
3494
+
3495
+	private enum EventState
3496
+	{
3497
+		START, FIGHT, END, INACTIVE
3498
+	}
3499
+
3500
+	private EventState eventState;
3501
+
3502
+	private Core task;
3503
+
3504
+	private FastMap<L2Spawn, Integer> zones;
3505
+
3506
+	private int time;
3507
+
3508
+	private int holder;
3509
+
3510
+	public DoubleDomination()
3511
+	{
3512
+		super();
3513
+		eventId = 3;
3514
+		createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
3515
+		createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
3516
+		task = new Core();
3517
+		zones = new FastMap<L2Spawn, Integer>();
3518
+		winnerTeam = 0;
3519
+		time = 0;
3520
+		holder = 0;
3521
+	}
3522
+
3523
+	@Override
3524
+	protected void clockTick()
3525
+	{
3526
+		int team1 = 0;
3527
+		int team2 = 0;
3528
+
3529
+		for (L2Spawn zone : zones.keySet())
3530
+		{
3531
+			for (L2PcInstance player : getPlayerList())
3532
+				switch (getTeam(player))
3533
+				{
3534
+					case 1:
3535
+						if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn())) <= getInt("zoneRadius"))
3536
+							team1++;
3537
+						break;
3538
+
3539
+					case 2:
3540
+						if (Math.sqrt(player.getPlanDistanceSq(zone.getLastSpawn())) <= getInt("zoneRadius"))
3541
+							team2++;
3542
+						break;
3543
+				}
3544
+
3545
+			if (team1 > team2)
3546
+				zones.getEntry(zone).setValue(1);
3547
+
3548
+			if (team2 > team1)
3549
+				zones.getEntry(zone).setValue(2);
3550
+
3551
+			if (team1 == team2)
3552
+				zones.getEntry(zone).setValue(0);
3553
+
3554
+			team1 = 0;
3555
+			team2 = 0;
3556
+		}
3557
+
3558
+		if (zones.containsValue(1) && (!zones.containsValue(0) && !zones.containsValue(2)))
3559
+		{
3560
+			if (holder != 1)
3561
+			{
3562
+				announce(getPlayerList(), "The " + teams.get(1).getName() + " team captured both zones. Score in 10sec!");
3563
+				holder = 1;
3564
+				time = 0;
3565
+			}
3566
+
3567
+			if (time == getInt("timeToScore") - 1)
3568
+			{
3569
+				for (L2PcInstance player : getPlayersOfTeam(1))
3570
+					increasePlayersScore(player);
3571
+				teams.get(1).increaseScore();
3572
+				teleportToTeamPos();
3573
+				time = 0;
3574
+				announce(getPlayerList(), "The " + teams.get(1).getName() + " team scored!");
3575
+				holder = 0;
3576
+			}
3577
+			else
3578
+				time++;
3579
+
3580
+		}
3581
+		else if (zones.containsValue(2) && (!zones.containsValue(0) && !zones.containsValue(1)))
3582
+		{
3583
+			if (holder != 2)
3584
+			{
3585
+				announce(getPlayerList(), "The " + teams.get(2).getName() + " team captured both zones. Score in 10sec!");
3586
+				holder = 1;
3587
+				time = 0;
3588
+			}
3589
+
3590
+			if (time == getInt("timeToScore") - 1)
3591
+			{
3592
+				for (L2PcInstance player : getPlayersOfTeam(2))
3593
+					increasePlayersScore(player);
3594
+				teams.get(2).increaseScore();
3595
+				teleportToTeamPos();
3596
+				time = 0;
3597
+				announce(getPlayerList(), "The " + teams.get(2).getName() + " team scored!");
3598
+				holder = 0;
3599
+			}
3600
+			else
3601
+				time++;
3602
+		}
3603
+		else
3604
+		{
3605
+			if (holder != 0)
3606
+				announce(getPlayerList(), "Canceled!");
3607
+
3608
+			holder = 0;
3609
+			time = 0;
3610
+		}
3611
+
3612
+	}
3613
+
3614
+	/**
3615
+	 * @see net.sf.l2j.gameserver.event.Event#endEvent()
3616
+	 */
3617
+	@Override
3618
+	protected void endEvent()
3619
+	{
3620
+		setStatus(EventState.END);
3621
+		clock.setTime(0);
3622
+
3623
+	}
3624
+
3625
+	@Override
3626
+	protected String getScorebar()
3627
+	{
3628
+		return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + "  " + teams.get(2).getName() + ": " + teams.get(2).getScore() + "  Time: " + clock.getTime();
3629
+	}
3630
+
3631
+	@Override
3632
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
3633
+	{
3634
+		super.onDie(victim, killer);
3635
+		addToResurrector(victim);
3636
+	}
3637
+
3638
+	@Override
3639
+	protected void schedule(int time)
3640
+	{
3641
+		tpm.scheduleGeneral(task, time);
3642
+	}
3643
+
3644
+	private void setStatus(EventState s)
3645
+	{
3646
+		eventState = s;
3647
+	}
3648
+
3649
+	@Override
3650
+	protected void showHtml(L2PcInstance player, int obj)
3651
+	{
3652
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
3653
+		TextBuilder sb = new TextBuilder();
3654
+
3655
+		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>");
3656
+		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>");
3657
+		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>");
3658
+		sb.append("<br><table width=270>");
3659
+		int i = 0;
3660
+		for (EventTeam team : teams.values())
3661
+		{
3662
+			i++;
3663
+			sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
3664
+			for (L2PcInstance p : getPlayersOfTeam(i))
3665
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
3666
+		}
3667
+
3668
+		sb.append("</table></body></html>");
3669
+		html.setHtml(sb.toString());
3670
+		player.sendPacket(html);
3671
+
3672
+	}
3673
+
3674
+	@Override
3675
+	protected void start()
3676
+	{
3677
+		int[] z1pos = getPosition("Zone", 1);
3678
+		int[] z2pos = getPosition("Zone", 2);
3679
+		zones.put(spawnNPC(z1pos[0], z1pos[1], z1pos[2], getInt("zoneNpcId")), 0);
3680
+		zones.put(spawnNPC(z2pos[0], z2pos[1], z2pos[2], getInt("zoneNpcId")), 0);
3681
+		setStatus(EventState.START);
3682
+		schedule(1);
3683
+	}
3684
+
3685
+	private void unSpawnZones()
3686
+	{
3687
+		for (L2Spawn s : zones.keySet())
3688
+		{
3689
+			s.getLastSpawn().deleteMe();
3690
+			s.stopRespawn();
3691
+			SpawnTable.getInstance().deleteSpawn(s, true);
3692
+			zones.remove(s);
3693
+		}
3694
+	}
3695
+
3696
+}
3697
\ No newline at end of file
3698
Index: head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Capture.java
3699
===================================================================
3700
--- head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Capture.java	(revision 0)
3701
+++ head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Capture.java	(revision 0)
3702
@@ -0,0 +1,35 @@
3703
+package com.l2jfrozen.gameserver.handler.skillhandlers;
3704
+
3705
+import com.l2jfrozen.gameserver.handler.ISkillHandler;
3706
+import com.l2jfrozen.gameserver.model.L2Object;
3707
+import com.l2jfrozen.gameserver.model.L2Skill;
3708
+import com.l2jfrozen.gameserver.model.L2Character;
3709
+import com.l2jfrozen.gameserver.model.L2Skill.SkillType;
3710
+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
3711
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3712
+import com.l2jfrozen.gameserver.event.EventManager;
3713
+
3714
+public class Capture implements ISkillHandler
3715
+{
3716
+private static final SkillType[] SKILL_IDS =
3717
+{ SkillType.CAPTURE };
3718
+
3719
+public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
3720
+{
3721
+if (!(activeChar instanceof L2PcInstance))
3722
+return;
3723
+
3724
+if(!(targets[0] instanceof L2NpcInstance))
3725
+return;
3726
+
3727
+L2PcInstance player = (L2PcInstance) activeChar;
3728
+L2NpcInstance target = (L2NpcInstance) targets[0];
3729
+
3730
+EventManager.getInstance().getCurrentEvent().useCapture(player, target);
3731
+}
3732
+
3733
+public SkillType[] getSkillIds()
3734
+{
3735
+return SKILL_IDS;
3736
+}
3737
+}
3738
\ No newline at end of file
3739
Index: head-src/com/l2jfrozen/gameserver/model/L2Character.java
3740
===================================================================
3741
--- head-src/com/l2jfrozen/gameserver/model/L2Character.java	(revision 936)
3742
+++ head-src/com/l2jfrozen/gameserver/model/L2Character.java	(working copy)
3743
@@ -46,6 +46,7 @@
3744
 import com.l2jfrozen.gameserver.datatables.csv.MapRegionTable;
3745
 import com.l2jfrozen.gameserver.datatables.csv.MapRegionTable.TeleportWhereType;
3746
 import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
3747
+import com.l2jfrozen.gameserver.event.EventManager;
3748
 import com.l2jfrozen.gameserver.geo.GeoData;
3749
 import com.l2jfrozen.gameserver.geo.pathfinding.Node;
3750
 import com.l2jfrozen.gameserver.geo.pathfinding.PathFinding;
3751
@@ -1107,6 +1108,53 @@
3752
 	 */
3753
 	protected void doAttack(L2Character target)
3754
 	{
3755
+		if (this instanceof L2PcInstance)
3756
+			if (EventManager.getInstance().isRegistered((L2PcInstance) this))
3757
+			{
3758
+
3759
+				if (target instanceof L2PcInstance)
3760
+					if (EventManager.getInstance().areTeammates(
3761
+							(L2PcInstance) this, (L2PcInstance) target)
3762
+							&& !EventManager.getInstance().getBoolean(
3763
+									"friendlyFireEnabled"))
3764
+					{
3765
+						sendPacket(new ActionFailed());
3766
+						return;
3767
+					}
3768
+
3769
+				if (!EventManager.getInstance().getCurrentEvent()
3770
+						.canAttack((L2PcInstance) this, target))
3771
+				{
3772
+					sendPacket(new ActionFailed());
3773
+					return;
3774
+				}
3775
+			}
3776
+
3777
+		if (this instanceof L2Summon)
3778
+		{
3779
+			if (EventManager.getInstance().isRegistered(
3780
+					((L2Summon) this).getOwner()))
3781
+			{
3782
+				if (target instanceof L2PcInstance)
3783
+					if (EventManager.getInstance()
3784
+							.areTeammates(((L2Summon) this).getOwner(),
3785
+									(L2PcInstance) target)
3786
+							&& !EventManager.getInstance().getBoolean(
3787
+									"friendlyFireEnabled"))
3788
+					{
3789
+						sendPacket(new ActionFailed());
3790
+						return;
3791
+					}
3792
+
3793
+				if (!EventManager.getInstance().getCurrentEvent()
3794
+						.canAttack(((L2Summon) this).getOwner(), target))
3795
+				{
3796
+					sendPacket(new ActionFailed());
3797
+					return;
3798
+				}
3799
+			}
3800
+		}
3801
+			
3802
 		if(Config.DEBUG)
3803
 		{
3804
 			_log.fine(getName() + " doAttack: target=" + target);
3805
@@ -1437,6 +1485,10 @@
3806
 			{
3807
 				weaponInst.setChargedSoulshot(L2ItemInstance.CHARGED_NONE);
3808
 			}
3809
+			
3810
+            if(this instanceof L2PcInstance && target instanceof L2PcInstance) 
3811
+            	if(EventManager.getInstance().isRegistered((L2PcInstance)this)) 
3812
+        			EventManager.getInstance().getCurrentEvent().onHit((L2PcInstance)this,(L2PcInstance)target); 
3813
 
3814
 			if(player != null)
3815
 			{
3816
@@ -1819,6 +1871,75 @@
3817
 	 */
3818
 	public void doCast(L2Skill skill)
3819
 	{
3820
+		try{
3821
+		if(getTarget() != null)
3822
+		{
3823
+			if (this instanceof L2PcInstance)
3824
+			{
3825
+				if (EventManager.getInstance().isRegistered((L2PcInstance) this))
3826
+				{
3827
+					if (!EventManager.getInstance().getCurrentEvent()
3828
+							.canAttack((L2PcInstance) this, getTarget()))
3829
+						return;
3830
+		
3831
+					if (this.getTarget() instanceof L2PcInstance)
3832
+						if (EventManager.getInstance().areTeammates(
3833
+								(L2PcInstance) this,
3834
+								(L2PcInstance) this.getTarget())
3835
+								&& !EventManager.getInstance().getBoolean(
3836
+										"friendlyFireEnabled")
3837
+								&& skill.isOffensive())
3838
+						{
3839
+							getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
3840
+							return;
3841
+						}
3842
+		
3843
+					if (!EventManager.getInstance().getCurrentEvent()
3844
+							.canAttack((L2PcInstance) this, this.getTarget()))
3845
+					{
3846
+						getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
3847
+						return;
3848
+					}
3849
+				}
3850
+			}
3851
+		
3852
+			if (this instanceof L2Summon)
3853
+			{
3854
+				if(((L2Summon) this).getOwner() != null)
3855
+					if (EventManager.getInstance().isRegistered(
3856
+							((L2Summon) this).getOwner()))
3857
+					{
3858
+						if (!EventManager.getInstance().getCurrentEvent()
3859
+								.canAttack(((L2Summon) this).getOwner(), getTarget()))
3860
+							return;
3861
+			
3862
+						if (this.getTarget() instanceof L2PcInstance)
3863
+							if (EventManager.getInstance().areTeammates(
3864
+									((L2Summon) this).getOwner(),
3865
+									(L2PcInstance) this.getTarget())
3866
+									&& !EventManager.getInstance().getBoolean(
3867
+											"friendlyFireEnabled")
3868
+									&& skill.isOffensive())
3869
+							{
3870
+								getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
3871
+								return;
3872
+							}
3873
+			
3874
+						if (!EventManager
3875
+								.getInstance()
3876
+								.getCurrentEvent()
3877
+								.canAttack(((L2Summon) this).getOwner(),
3878
+										this.getTarget()))
3879
+						{
3880
+							getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
3881
+							return;
3882
+			
3883
+						}
3884
+					}
3885
+			}
3886
+		}
3887
+		}catch(ClassCastException e){}
3888
+		
3889
 		L2Character activeChar = this;
3890
 		
3891
 		if(skill == null)
3892
Index: head-src/com/l2jfrozen/gameserver/event/Zombie.java
3893
===================================================================
3894
--- head-src/com/l2jfrozen/gameserver/event/Zombie.java	(revision 0)
3895
+++ head-src/com/l2jfrozen/gameserver/event/Zombie.java	(revision 0)
3896
@@ -0,0 +1,212 @@
3897
+package com.l2jfrozen.gameserver.event;
3898
+
3899
+import javolution.text.TextBuilder;
3900
+
3901
+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
3902
+import com.l2jfrozen.gameserver.model.L2Object;
3903
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
3904
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
3905
+
3906
+/**
3907
+ * @author Rizel
3908
+ *
3909
+ */
3910
+public class Zombie extends Event
3911
+{
3912
+	private class Core implements Runnable
3913
+	{
3914
+		public void run()
3915
+		{
3916
+			try
3917
+			{
3918
+				switch (eventState)
3919
+				{
3920
+					case START:
3921
+						divideIntoTeams(1);
3922
+						preparePlayers();
3923
+						teleportToRandom();
3924
+						forceSitAll();
3925
+						unequip();
3926
+						setStatus(EventState.FIGHT);
3927
+						schedule(20000);
3928
+						break;
3929
+
3930
+					case FIGHT:
3931
+						forceStandAll();
3932
+						transform(getRandomPlayer());
3933
+						setStatus(EventState.END);
3934
+						clock.startClock(getInt("matchTime"));
3935
+						break;
3936
+
3937
+					case END:
3938
+						setStatus(EventState.INACTIVE);
3939
+						clock.setTime(0);
3940
+
3941
+						if (getPlayersWithStatus(0).size() != 1)
3942
+						{
3943
+							msgToAll("Tie!");
3944
+							EventManager.getInstance().end("The match has ended in a tie!");
3945
+						}
3946
+
3947
+						else
3948
+						{
3949
+							L2PcInstance winner = getWinner();
3950
+							giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
3951
+							EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event!");
3952
+						}
3953
+
3954
+						break;
3955
+				}
3956
+			}
3957
+			catch (Throwable e)
3958
+			{
3959
+				e.printStackTrace();
3960
+				EventManager.getInstance().end("Error! Event ended.");
3961
+			}
3962
+		}
3963
+	}
3964
+
3965
+	private enum EventState
3966
+	{
3967
+		START, FIGHT, END, INACTIVE
3968
+	}
3969
+
3970
+	private EventState eventState;
3971
+
3972
+	private Core task;
3973
+
3974
+	public Zombie()
3975
+	{
3976
+		super();
3977
+		eventId = 9;
3978
+		createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
3979
+		task = new Core();
3980
+	}
3981
+
3982
+	@Override
3983
+	public boolean canAttack(L2PcInstance player, L2Object target)
3984
+	{
3985
+		if (target instanceof L2PcInstance)
3986
+			if (getStatus(player) == 1 && getStatus((L2PcInstance) target) == 0)
3987
+				return true;
3988
+
3989
+		return false;
3990
+	}
3991
+
3992
+	@Override
3993
+	protected void endEvent()
3994
+	{
3995
+		setStatus(EventState.END);
3996
+		clock.setTime(0);
3997
+	}
3998
+
3999
+	@Override
4000
+	protected String getScorebar()
4001
+	{
4002
+		return "Humans: " + getPlayersWithStatus(0).size() + "  Time: " + clock.getTime();
4003
+	}
4004
+
4005
+	private L2PcInstance getWinner()
4006
+	{
4007
+		return getPlayersWithStatus(0).head().getNext().getValue();
4008
+	}
4009
+
4010
+	@Override
4011
+	public void onHit(L2PcInstance actor, L2PcInstance target)
4012
+	{
4013
+		if (eventState == EventState.END)
4014
+		{
4015
+			if (getStatus(actor) == 1 && getStatus(target) == 0)
4016
+			{
4017
+				transform(target);
4018
+				increasePlayersScore(actor);
4019
+				actor.addItem("Event", 6392, 2, actor, true);
4020
+			}
4021
+
4022
+			if (getPlayersWithStatus(0).size() == 1)
4023
+				schedule(1);
4024
+		}
4025
+
4026
+	}
4027
+
4028
+	@Override
4029
+	public void onLogout(L2PcInstance player)
4030
+	{
4031
+		if (getStatus(player) == 1 && getPlayersWithStatus(1).size() == 1)
4032
+		{
4033
+			super.onLogout(player);
4034
+			transform(getRandomPlayer());
4035
+		}
4036
+		else
4037
+		{
4038
+			super.onLogout(player);
4039
+		}
4040
+			
4041
+	}
4042
+
4043
+	@Override
4044
+	public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
4045
+	{
4046
+		return false;
4047
+	}
4048
+
4049
+	@Override
4050
+	protected void schedule(int time)
4051
+	{
4052
+		tpm.scheduleGeneral(task, time);
4053
+	}
4054
+
4055
+	private void setStatus(EventState s)
4056
+	{
4057
+		eventState = s;
4058
+	}
4059
+
4060
+	/* (non-Javadoc)
4061
+	 * @see net.sf.l2j.gameserver.event.Event#showHtml(net.sf.l2j.gameserver.model.actor.instance.L2PcInstance, int)
4062
+	 */
4063
+	@Override
4064
+	protected void showHtml(L2PcInstance player, int obj)
4065
+	{
4066
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
4067
+		TextBuilder sb = new TextBuilder();
4068
+
4069
+		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>");
4070
+		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>");
4071
+		sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
4072
+		sb.append("<br><table width=270>");
4073
+
4074
+		for (L2PcInstance p : getPlayersOfTeam(1))
4075
+			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>");
4076
+
4077
+		sb.append("</table></body></html>");
4078
+		html.setHtml(sb.toString());
4079
+		player.sendPacket(html);
4080
+
4081
+	}
4082
+
4083
+	@Override
4084
+	protected void start()
4085
+	{
4086
+		setStatus(EventState.START);
4087
+		schedule(1);
4088
+	}
4089
+
4090
+	private void teleportToRandom()
4091
+	{
4092
+		for (L2PcInstance player : players.keySet())
4093
+		{
4094
+			int[] loc = getPosition("All", 0);
4095
+			player.teleToLocation(loc[0], loc[1], loc[2]);
4096
+		}
4097
+	}
4098
+
4099
+	protected void transform(L2PcInstance player)
4100
+	{
4101
+		setStatus(player, 1);
4102
+		polymorph(player,25375);
4103
+		player.getAppearance().setNameColor(255, 0, 0);
4104
+		player.broadcastUserInfo();
4105
+		player.getInventory().unEquipItemInSlot(10);
4106
+		player.getInventory().unEquipItemInSlot(16);
4107
+	}
4108
+}
4109
\ No newline at end of file
4110
Index: head-src/com/l2jfrozen/gameserver/network/serverpackets/ExShowScreenMessage.java
4111
===================================================================
4112
--- head-src/com/l2jfrozen/gameserver/network/serverpackets/ExShowScreenMessage.java	(revision 936)
4113
+++ head-src/com/l2jfrozen/gameserver/network/serverpackets/ExShowScreenMessage.java	(working copy)
4114
@@ -15,45 +15,78 @@
4115
 package com.l2jfrozen.gameserver.network.serverpackets;
4116
 
4117
 /**
4118
- * @author Kerberos
4119
+ * @author glory to Setekh for IL opcode ;p
4120
  */
4121
 public class ExShowScreenMessage extends L2GameServerPacket
4122
 {
4123
-	private int _type;
4124
-	private int _sysMessageId;
4125
-	private int _unk1;
4126
-	private int _unk2;
4127
-	private int _unk3;
4128
-	private int _unk4;
4129
-	private int _size;
4130
-	private int _position;
4131
-	private boolean _effect;
4132
-	private String _text;
4133
-	private int _time;
4134
-
4135
+	public static enum SMPOS
4136
+	{
4137
+		DUMMY,
4138
+		TOP_LEFT,
4139
+		TOP_CENTER,
4140
+		TOP_RIGHT,
4141
+		MIDDLE_LEFT,
4142
+		MIDDLE_CENTER,
4143
+		MIDDLE_RIGHT,
4144
+		BOTTOM_CENTER,
4145
+		BOTTOM_RIGHT,
4146
+	}
4147
+	
4148
+	private final int _type;
4149
+	private final int _sysMessageId;
4150
+	private final boolean _hide;
4151
+	private final int _unk2;
4152
+	private final int _unk3;
4153
+	private final boolean _fade;
4154
+	private final int _size;
4155
+	private final int _position;
4156
+	private final boolean _effect;
4157
+	private final String _text;
4158
+	private final int _time;
4159
+	
4160
 	public ExShowScreenMessage(String text, int time)
4161
 	{
4162
 		_type = 1;
4163
 		_sysMessageId = -1;
4164
-		_unk1 = 0;
4165
+		_hide = false;
4166
 		_unk2 = 0;
4167
 		_unk3 = 0;
4168
-		_unk4 = 0;
4169
+		_fade = false;
4170
 		_position = 0x02;
4171
 		_text = text;
4172
 		_time = time;
4173
 		_size = 0;
4174
 		_effect = false;
4175
 	}
4176
-
4177
-	public ExShowScreenMessage(int type, int messageId, int position, int unk1, int size, int unk2, int unk3, boolean showEffect, int time, int unk4, String text)
4178
+	
4179
+	public ExShowScreenMessage(String text, int time, SMPOS pos, boolean effect)
4180
+	{
4181
+		this(text, time, pos.ordinal(), effect);
4182
+	}
4183
+	
4184
+	public ExShowScreenMessage(String text, int time, int pos, boolean effect)
4185
+	{
4186
+		_type = 1;
4187
+		_sysMessageId = -1;
4188
+		_hide = false;
4189
+		_unk2 = 0;
4190
+		_unk3 = 0;
4191
+		_fade = false;
4192
+		_position = pos;
4193
+		_text = text;
4194
+		_time = time;
4195
+		_size = 0;
4196
+		_effect = effect;
4197
+	}
4198
+	
4199
+	public ExShowScreenMessage(int type, int messageId, int position, boolean hide, int size, int unk2, int unk3, boolean showEffect, int time, boolean fade, String text)
4200
 	{
4201
 		_type = type;
4202
 		_sysMessageId = messageId;
4203
-		_unk1 = unk1;
4204
+		_hide = hide;
4205
 		_unk2 = unk2;
4206
 		_unk3 = unk3;
4207
-		_unk4 = unk4;
4208
+		_fade = fade;
4209
 		_position = position;
4210
 		_text = text;
4211
 		_time = time;
4212
@@ -62,26 +95,26 @@
4213
 	}
4214
 
4215
 	@Override
4216
-	public String getType()
4217
-	{
4218
-		return "[S]FE:39 ExShowScreenMessage";
4219
-	}
4220
-
4221
-	@Override
4222
 	protected void writeImpl()
4223
 	{
4224
 		writeC(0xfe);
4225
-		writeH(0x39);
4226
+		writeH(0x38);
4227
 		writeD(_type); // 0 - system messages, 1 - your defined text
4228
 		writeD(_sysMessageId); // system message id (_type must be 0 otherwise no effect)
4229
 		writeD(_position); // message position
4230
-		writeD(_unk1); // ?
4231
+		writeD(_hide == true ? 1 : 0); // hide
4232
 		writeD(_size); // font size 0 - normal, 1 - small
4233
 		writeD(_unk2); // ?
4234
-		writeD(_unk3); // ? 
4235
+		writeD(_unk3); // ?
4236
 		writeD(_effect == true ? 1 : 0); // upper effect (0 - disabled, 1 enabled) - _position must be 2 (center) otherwise no effect
4237
 		writeD(_time); // time
4238
-		writeD(_unk4); // ?
4239
+		writeD(_fade == true ? 1 : 0); // fade effect (0 - disabled, 1 enabled)
4240
 		writeS(_text); // your text (_type must be 1, otherwise no effect)
4241
 	}
4242
-}
4243
+
4244
+	@Override
4245
+	public String getType()
4246
+	{
4247
+		return "[S]FE:38 ExShowScreenMessage";
4248
+	}
4249
+}
4250
\ No newline at end of file
4251
Index: head-src/com/l2jfrozen/gameserver/Shutdown.java
4252
===================================================================
4253
--- head-src/com/l2jfrozen/gameserver/Shutdown.java	(revision 936)
4254
+++ head-src/com/l2jfrozen/gameserver/Shutdown.java	(working copy)
4255
@@ -22,6 +22,8 @@
4256
 import java.util.logging.Logger;
4257
 
4258
 import com.l2jfrozen.Config;
4259
+import com.l2jfrozen.gameserver.event.EventBuffer;
4260
+import com.l2jfrozen.gameserver.event.EventManager;
4261
 import com.l2jfrozen.gameserver.controllers.GameTimeController;
4262
 import com.l2jfrozen.gameserver.controllers.TradeController;
4263
 import com.l2jfrozen.gameserver.datatables.CharSchemesTable;
4264
@@ -678,6 +680,9 @@
4265
 
4266
 		CharSchemesTable.getInstance().onServerShutdown();
4267
 		
4268
+		if(EventManager.getInstance().getBoolean("eventBufferEnabled")) 
4269
+			EventBuffer.getInstance().updateSQL();
4270
+		
4271
 		//Save items on ground before closing
4272
 		if(Config.SAVE_DROPPED_ITEM)
4273
 		{
4274
Index: head-src/com/l2jfrozen/gameserver/event/Russian.java
4275
===================================================================
4276
--- head-src/com/l2jfrozen/gameserver/event/Russian.java	(revision 0)
4277
+++ head-src/com/l2jfrozen/gameserver/event/Russian.java	(revision 0)
4278
@@ -0,0 +1,289 @@
4279
+package com.l2jfrozen.gameserver.event;
4280
+
4281
+import java.util.Map;
4282
+
4283
+import javolution.text.TextBuilder;
4284
+import javolution.util.FastList;
4285
+import javolution.util.FastMap;
4286
+
4287
+import com.l2jfrozen.gameserver.model.L2Object;
4288
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
4289
+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
4290
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
4291
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
4292
+import com.l2jfrozen.util.random.Rnd;
4293
+
4294
+/**
4295
+ * @author Rizel
4296
+ *
4297
+ */
4298
+public class Russian extends Event
4299
+{
4300
+
4301
+	private class Core implements Runnable
4302
+	{
4303
+		public void run()
4304
+		{
4305
+			try
4306
+			{
4307
+				switch (eventState)
4308
+				{
4309
+					case START:
4310
+						divideIntoTeams(1);
4311
+						preparePlayers();
4312
+						teleportToTeamPos();
4313
+						forceSitAll();
4314
+						spawnRussians();
4315
+						setStatus(EventState.CHOOSE);
4316
+						debug("The event started with " + players.size() + " players");
4317
+						schedule(30000);
4318
+						break;
4319
+
4320
+					case CHOOSE:
4321
+						if (round == 0)
4322
+							forceStandAll();
4323
+
4324
+						round++;
4325
+						setStatus(EventState.CHECK);
4326
+						debug("Choose phase.");
4327
+						schedule(getInt("roundTime") * 1000);
4328
+						break;
4329
+
4330
+					case CHECK:
4331
+						debug("Check phase");
4332
+						removeAfkers();
4333
+						killRandomRussian();
4334
+
4335
+						if (countOfPositiveStatus() != 0)
4336
+						{
4337
+							if (russians.size() != 1)
4338
+							{
4339
+								for (L2PcInstance player : getPlayersWithStatus(1))
4340
+								{
4341
+									setStatus(player, 0);
4342
+									increasePlayersScore(player);
4343
+									player.getAppearance().setNameColor(255, 255, 255);
4344
+									player.broadcastUserInfo();
4345
+								}
4346
+
4347
+								for (FastList<L2PcInstance> chose : choses.values())
4348
+									chose.reset();
4349
+
4350
+								setStatus(EventState.CHOOSE);
4351
+								schedule(getInt("roundTime") * 1000);
4352
+							}
4353
+							else
4354
+							{
4355
+								for (L2PcInstance player : getPlayersWithStatus(1))
4356
+									giveReward(player, getInt("rewardId"), getInt("rewardAmmount"));
4357
+
4358
+								unspawnRussians();
4359
+								debug("Event ended. " + countOfPositiveStatus() + " players survived");
4360
+								EventManager.getInstance().end("Congratulation! " + countOfPositiveStatus() + " players survived the event!");
4361
+							}
4362
+
4363
+						}
4364
+						else
4365
+						{
4366
+							unspawnRussians();
4367
+							debug("Event ended. Noone survived");
4368
+							EventManager.getInstance().end("Unfortunatly no-one survived the event!");
4369
+						}
4370
+						break;
4371
+				}
4372
+			}
4373
+			catch (Throwable e)
4374
+			{
4375
+				e.printStackTrace();
4376
+				EventManager.getInstance().end("Error! Event ended.");
4377
+			}
4378
+
4379
+		}
4380
+	}
4381
+
4382
+	private enum EventState
4383
+	{
4384
+		START, CHOOSE, CHECK, INACTIVE
4385
+	}
4386
+
4387
+	private EventState eventState;
4388
+
4389
+	private Core task;
4390
+
4391
+	private int round;
4392
+
4393
+	private FastMap<Integer, L2Spawn> russians;
4394
+
4395
+	private FastMap<Integer, FastList<L2PcInstance>> choses;
4396
+
4397
+	public Russian()
4398
+	{
4399
+		super();
4400
+		eventId = 11;
4401
+		createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
4402
+		task = new Core();
4403
+		round = 0;
4404
+		russians = new FastMap<Integer, L2Spawn>();
4405
+		choses = new FastMap<Integer, FastList<L2PcInstance>>();
4406
+	}
4407
+
4408
+	@Override
4409
+	public boolean canAttack(L2PcInstance player, L2Object target)
4410
+	{
4411
+		return false;
4412
+	}
4413
+
4414
+	@Override
4415
+	protected void endEvent()
4416
+	{
4417
+		L2PcInstance winner = players.head().getNext().getKey();
4418
+		giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
4419
+
4420
+		unspawnRussians();
4421
+		debug("Event ended. 1 player survived");
4422
+		EventManager.getInstance().end("Congratulation! 1 player survived the event!");
4423
+
4424
+	}
4425
+
4426
+	@Override
4427
+	protected String getScorebar()
4428
+	{
4429
+		return "";
4430
+	}
4431
+
4432
+	private void killRandomRussian()
4433
+	{
4434
+		FastList<Integer> ids = new FastList<Integer>();
4435
+		for (int id : russians.keySet())
4436
+			ids.add(id);
4437
+		int russnum = ids.get(Rnd.get(ids.size()));
4438
+		L2Spawn russian = russians.get(russnum);
4439
+		unspawnNPC(russian);
4440
+		announce(getPlayerList(), "The #" + russnum + " russian died.");
4441
+
4442
+		for (L2PcInstance victim : choses.get(russnum))
4443
+		{
4444
+			setStatus(victim, -1);
4445
+			victim.stopAllEffects();
4446
+			victim.reduceCurrentHp(victim.getMaxHp() + victim.getMaxCp() + 1, victim);
4447
+			victim.sendMessage("Your russian died!");
4448
+			victim.getAppearance().setNameColor(255, 255, 255);
4449
+		}
4450
+		debug("Russian #" + russnum + " died");
4451
+		russians.remove(russnum);
4452
+	}
4453
+
4454
+	@Override
4455
+	public void onLogout(L2PcInstance player)
4456
+	{
4457
+		super.onLogout(player);
4458
+
4459
+		for (FastList<L2PcInstance> list : choses.values())
4460
+			if (list.contains(player))
4461
+				list.remove(player);
4462
+	}
4463
+
4464
+	@Override
4465
+	public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
4466
+	{
4467
+		if (npc.getNpcId() != getInt("russianNpcId"))
4468
+			return false;
4469
+
4470
+		if (getStatus(player) != 0)
4471
+			return true;
4472
+
4473
+		for (Map.Entry<Integer, L2Spawn> russian : russians.entrySet())
4474
+			if (russian.getValue().getLastSpawn().getObjectId() == npc.getObjectId())
4475
+			{
4476
+				choses.get(russian.getKey()).add(player);
4477
+				player.getAppearance().setNameColor(0, 255, 0);
4478
+				player.broadcastUserInfo();
4479
+				setStatus(player, 1);
4480
+			}
4481
+
4482
+		return true;
4483
+	}
4484
+
4485
+	private void removeAfkers()
4486
+	{
4487
+		int c = 0;
4488
+		for (L2PcInstance player : getPlayerList())
4489
+			if (getStatus(player) == 0)
4490
+			{
4491
+
4492
+				player.sendMessage("Timeout!");
4493
+				player.stopAllEffects();
4494
+				player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, player);
4495
+				setStatus(player, -1);
4496
+				c++;
4497
+			}
4498
+		debug(c + " afkers removed");
4499
+	}
4500
+
4501
+	@Override
4502
+	public void reset()
4503
+	{
4504
+		super.reset();
4505
+		round = 0;
4506
+		russians.clear();
4507
+		choses.clear();
4508
+	}
4509
+
4510
+	@Override
4511
+	protected void schedule(int time)
4512
+	{
4513
+		tpm.scheduleGeneral(task, time);
4514
+	}
4515
+
4516
+	private void setStatus(EventState s)
4517
+	{
4518
+		eventState = s;
4519
+	}
4520
+
4521
+	@Override
4522
+	protected void showHtml(L2PcInstance player, int obj)
4523
+	{
4524
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
4525
+		TextBuilder sb = new TextBuilder();
4526
+
4527
+		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>");
4528
+		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>");
4529
+		sb.append("<table width=270><tr><td><center>Russians left: " + russians.size() + "</td></tr></table>");
4530
+		sb.append("<br><table width=270>");
4531
+
4532
+		for (L2PcInstance p : getPlayersOfTeam(1))
4533
+			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>");
4534
+
4535
+		sb.append("</table></body></html>");
4536
+		html.setHtml(sb.toString());
4537
+		player.sendPacket(html);
4538
+
4539
+	}
4540
+
4541
+	private void spawnRussians()
4542
+	{
4543
+		for (int i = 1; i <= getInt("numberOfRussians"); i++)
4544
+		{
4545
+			int[] pos = getPosition("Russian", i);
4546
+			russians.put(i, spawnNPC(pos[0], pos[1], pos[2], getInt("russianNpcId")));
4547
+			choses.put(i, new FastList<L2PcInstance>());
4548
+			russians.get(i).getLastSpawn().setTitle("--" + i + "--");
4549
+		}
4550
+		debug("Russians spawned");
4551
+	}
4552
+
4553
+	@Override
4554
+	protected void start()
4555
+	{
4556
+		setStatus(EventState.START);
4557
+		schedule(1);
4558
+	}
4559
+
4560
+	private void unspawnRussians()
4561
+	{
4562
+		for (L2Spawn russian : russians.values())
4563
+			unspawnNPC(russian);
4564
+
4565
+		debug("Russians unspawned");
4566
+	}
4567
+}
4568
\ No newline at end of file
4569
Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/UseItem.java
4570
===================================================================
4571
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/UseItem.java	(revision 936)
4572
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/UseItem.java	(working copy)
4573
@@ -22,6 +22,7 @@
4574
 import java.util.logging.Logger;
4575
 
4576
 import com.l2jfrozen.Config;
4577
+import com.l2jfrozen.gameserver.event.EventManager;
4578
 import com.l2jfrozen.gameserver.ai.CtrlIntention;
4579
 import com.l2jfrozen.gameserver.datatables.SkillTable;
4580
 import com.l2jfrozen.gameserver.handler.IItemHandler;
4581
@@ -167,6 +168,10 @@
4582
 			return;
4583
 		}
4584
 		
4585
+		if(EventManager.getInstance().isRunning() && EventManager.getInstance().isRegistered(activeChar)) 
4586
+			if(!EventManager.getInstance().getCurrentEvent().onUseItem(activeChar,item)) 
4587
+				return;
4588
+		
4589
 		if(activeChar.isFishing() && (itemId < 6535 || itemId > 6540))
4590
 		{
4591
 			// You cannot do anything else while fishing
4592
Index: head-src/com/l2jfrozen/gameserver/handler/SkillHandler.java
4593
===================================================================
4594
--- head-src/com/l2jfrozen/gameserver/handler/SkillHandler.java	(revision 936)
4595
+++ head-src/com/l2jfrozen/gameserver/handler/SkillHandler.java	(working copy)
4596
@@ -26,6 +26,8 @@
4597
 import com.l2jfrozen.gameserver.handler.skillhandlers.BalanceLife;
4598
 import com.l2jfrozen.gameserver.handler.skillhandlers.BeastFeed;
4599
 import com.l2jfrozen.gameserver.handler.skillhandlers.Blow;
4600
+import com.l2jfrozen.gameserver.handler.skillhandlers.Bomb;
4601
+import com.l2jfrozen.gameserver.handler.skillhandlers.Capture;
4602
 import com.l2jfrozen.gameserver.handler.skillhandlers.Charge;
4603
 import com.l2jfrozen.gameserver.handler.skillhandlers.ClanGate;
4604
 import com.l2jfrozen.gameserver.handler.skillhandlers.CombatPointHeal;
4605
@@ -120,6 +122,8 @@
4606
 		registerSkillHandler(new GetPlayer());
4607
 		registerSkillHandler(new ZakenPlayer());
4608
 		registerSkillHandler(new ZakenSelf());
4609
+		registerSkillHandler(new Bomb());
4610
+		registerSkillHandler(new Capture());
4611
 		_log.config("SkillHandler: Loaded " + _datatable.size() + " handlers.");
4612
 
4613
 	}
4614
Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestJoinParty.java
4615
===================================================================
4616
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestJoinParty.java	(revision 936)
4617
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestJoinParty.java	(working copy)
4618
@@ -21,6 +21,8 @@
4619
 import java.util.logging.Logger;
4620
 
4621
 import com.l2jfrozen.Config;
4622
+import com.l2jfrozen.gameserver.event.EventManager;
4623
+import com.l2jfrozen.gameserver.event.LMS;
4624
 import com.l2jfrozen.gameserver.model.BlockList;
4625
 import com.l2jfrozen.gameserver.model.L2Party;
4626
 import com.l2jfrozen.gameserver.model.L2World;
4627
@@ -38,6 +40,7 @@
4628
 
4629
 	private String _name;
4630
 	private int _itemDistribution;
4631
+	private boolean _isInLMS;
4632
 
4633
 	@Override
4634
 	protected void readImpl()
4635
@@ -51,10 +54,17 @@
4636
 	{
4637
 		L2PcInstance requestor = getClient().getActiveChar();
4638
 		L2PcInstance target = L2World.getInstance().getPlayer(_name);
4639
+		_isInLMS = EventManager.getInstance().isRegistered(requestor) && EventManager.getInstance().getCurrentEvent() instanceof LMS;
4640
 		
4641
 		if(requestor == null)
4642
 			return;
4643
 		
4644
+		if(_isInLMS)
4645
+		{
4646
+			requestor.sendMessage("You cannot make party in LMS");
4647
+			return;
4648
+		}
4649
+		
4650
 		if (!getClient().getFloodProtectors().getPartyInvitation().tryPerformAction("PartyInvitation"))
4651
 		{
4652
 			requestor.sendMessage("You Cannot Invite into Party So Fast!");
4653
Index: head-src/com/l2jfrozen/gameserver/event/LMS.java
4654
===================================================================
4655
--- head-src/com/l2jfrozen/gameserver/event/LMS.java	(revision 0)
4656
+++ head-src/com/l2jfrozen/gameserver/event/LMS.java	(revision 0)
4657
@@ -0,0 +1,141 @@
4658
+package com.l2jfrozen.gameserver.event;
4659
+
4660
+import javolution.text.TextBuilder;
4661
+
4662
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
4663
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
4664
+import com.l2jfrozen.util.random.Rnd;
4665
+
4666
+/**
4667
+ * @author Rizel
4668
+ *
4669
+ */
4670
+public class LMS extends Event
4671
+{
4672
+	private class Core implements Runnable
4673
+	{
4674
+		public void run()
4675
+		{
4676
+			try
4677
+			{
4678
+				switch (eventState)
4679
+				{
4680
+					case START:
4681
+						divideIntoTeams(1);
4682
+						preparePlayers();
4683
+						teleportToTeamPos();
4684
+						forceSitAll();
4685
+						setStatus(EventState.FIGHT);
4686
+						debug("The event started with " + players.size() + " players.");
4687
+						schedule(20000);
4688
+						break;
4689
+
4690
+					case FIGHT:
4691
+						forceStandAll();
4692
+						setStatus(EventState.END);
4693
+						debug("The event started.");
4694
+						clock.startClock(getInt("matchTime"));
4695
+						break;
4696
+
4697
+					case END:
4698
+						clock.setTime(0);
4699
+						debug("The event ended.");
4700
+						L2PcInstance winner = getPlayersWithStatus(0).get(Rnd.get(getPlayersWithStatus(0).size()));
4701
+						giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
4702
+						setStatus(EventState.INACTIVE);
4703
+						EventManager.getInstance().end(winner.getName() + " is the Last Man Standing!");
4704
+						break;
4705
+				}
4706
+			}
4707
+			catch (Throwable e)
4708
+			{
4709
+				e.printStackTrace();
4710
+				EventManager.getInstance().end("Error! Event ended.");
4711
+			}
4712
+		}
4713
+	}
4714
+
4715
+	private enum EventState
4716
+	{
4717
+		START, FIGHT, END, INACTIVE
4718
+	}
4719
+
4720
+	private EventState eventState;
4721
+
4722
+	private Core task;
4723
+
4724
+	public LMS()
4725
+	{
4726
+		super();
4727
+		eventId = 4;
4728
+		createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
4729
+		task = new Core();
4730
+	}
4731
+
4732
+	@Override
4733
+	protected void endEvent()
4734
+	{
4735
+		setStatus(EventState.END);
4736
+		clock.setTime(0);
4737
+	}
4738
+
4739
+	@Override
4740
+	protected String getScorebar()
4741
+	{
4742
+		return "Players: " + getPlayersWithStatus(0).size() + "  Time: " + clock.getTime();
4743
+	}
4744
+
4745
+	@Override
4746
+	public void onKill(L2PcInstance victim, L2PcInstance killer)
4747
+	{
4748
+		super.onKill(victim, killer);
4749
+		increasePlayersScore(killer);
4750
+		setStatus(victim, 1);
4751
+		if (getPlayersWithStatus(0).size() == 1)
4752
+		{
4753
+			setStatus(EventState.END);
4754
+			clock.setTime(0);
4755
+		}
4756
+	}
4757
+
4758
+	@Override
4759
+	protected void schedule(int time)
4760
+	{
4761
+		tpm.scheduleGeneral(task, time);
4762
+	}
4763
+
4764
+	private void setStatus(EventState s)
4765
+	{
4766
+		eventState = s;
4767
+	}
4768
+
4769
+	/* (non-Javadoc)
4770
+	 * @see net.sf.l2j.gameserver.event.Event#showHtml(net.sf.l2j.gameserver.model.actor.instance.L2PcInstance, int)
4771
+	 */
4772
+	@Override
4773
+	protected void showHtml(L2PcInstance player, int obj)
4774
+	{
4775
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
4776
+		TextBuilder sb = new TextBuilder();
4777
+
4778
+		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>");
4779
+		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>");
4780
+		sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
4781
+		sb.append("<br><table width=270>");
4782
+
4783
+		for (L2PcInstance p : getPlayersOfTeam(1))
4784
+			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>");
4785
+
4786
+		sb.append("</table></body></html>");
4787
+		html.setHtml(sb.toString());
4788
+		player.sendPacket(html);
4789
+
4790
+	}
4791
+
4792
+	@Override
4793
+	protected void start()
4794
+	{
4795
+		setStatus(EventState.START);
4796
+		schedule(1);
4797
+	}
4798
+}
4799
\ No newline at end of file
4800
Index: head-src/com/l2jfrozen/gameserver/event/TvT.java
4801
===================================================================
4802
--- head-src/com/l2jfrozen/gameserver/event/TvT.java	(revision 0)
4803
+++ head-src/com/l2jfrozen/gameserver/event/TvT.java	(revision 0)
4804
@@ -0,0 +1,151 @@
4805
+package com.l2jfrozen.gameserver.event;
4806
+
4807
+import javolution.text.TextBuilder;
4808
+
4809
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
4810
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
4811
+
4812
+public class TvT extends Event
4813
+{
4814
+	private class Core implements Runnable
4815
+	{
4816
+		public void run()
4817
+		{
4818
+			try
4819
+			{
4820
+				switch (eventState)
4821
+				{
4822
+					case START:
4823
+						divideIntoTeams(2);
4824
+						preparePlayers();
4825
+						teleportToTeamPos();
4826
+						createPartyOfTeam(1);
4827
+						createPartyOfTeam(2);
4828
+						forceSitAll();
4829
+						setStatus(EventState.FIGHT);
4830
+						schedule(20000);
4831
+						break;
4832
+
4833
+					case FIGHT:
4834
+						forceStandAll();
4835
+						setStatus(EventState.END);
4836
+						clock.startClock(getInt("matchTime"));
4837
+						break;
4838
+
4839
+					case END:
4840
+						clock.setTime(0);
4841
+						if (winnerTeam == 0)
4842
+							winnerTeam = getWinnerTeam();
4843
+
4844
+						giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
4845
+						setStatus(EventState.INACTIVE);
4846
+						EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " kills!");
4847
+						break;
4848
+				}
4849
+			}
4850
+			catch (Throwable e)
4851
+			{
4852
+				e.printStackTrace();
4853
+				EventManager.getInstance().end("Error! Event ended.");
4854
+			}
4855
+		}
4856
+	}
4857
+
4858
+	private enum EventState
4859
+	{
4860
+		START, FIGHT, END, TELEPORT, INACTIVE
4861
+	}
4862
+
4863
+	private EventState eventState;
4864
+
4865
+	private Core task;
4866
+
4867
+	public TvT()
4868
+	{
4869
+		super();
4870
+		eventId = 7;
4871
+		createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
4872
+		createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
4873
+		task = new Core();
4874
+		winnerTeam = 0;
4875
+	}
4876
+
4877
+	@Override
4878
+	protected void endEvent()
4879
+	{
4880
+		winnerTeam = players.head().getNext().getValue()[0];
4881
+
4882
+		setStatus(EventState.END);
4883
+		clock.setTime(0);
4884
+
4885
+	}
4886
+
4887
+	@Override
4888
+	protected String getScorebar()
4889
+	{
4890
+		return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + "  " + teams.get(2).getName() + ": " + teams.get(2).getScore() + "  Time: " + clock.getTime();
4891
+	}
4892
+
4893
+	@Override
4894
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
4895
+	{
4896
+		super.onDie(victim, killer);
4897
+		addToResurrector(victim);
4898
+	}
4899
+
4900
+	@Override
4901
+	public void onKill(L2PcInstance victim, L2PcInstance killer)
4902
+	{
4903
+		super.onKill(victim, killer);
4904
+		if (getPlayersTeam(killer) != getPlayersTeam(victim))
4905
+		{
4906
+			getPlayersTeam(killer).increaseScore();
4907
+			killer.addItem("Event", 6392, 1, killer, true);
4908
+			increasePlayersScore(killer);
4909
+		}
4910
+
4911
+	}
4912
+
4913
+	@Override
4914
+	protected void schedule(int time)
4915
+	{
4916
+		tpm.scheduleGeneral(task, time);
4917
+	}
4918
+
4919
+	private void setStatus(EventState s)
4920
+	{
4921
+		eventState = s;
4922
+	}
4923
+
4924
+	@Override
4925
+	protected void showHtml(L2PcInstance player, int obj)
4926
+	{
4927
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
4928
+		TextBuilder sb = new TextBuilder();
4929
+
4930
+		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>");
4931
+		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>");
4932
+		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>");
4933
+		sb.append("<br><table width=270>");
4934
+		int i = 0;
4935
+		for (EventTeam team : teams.values())
4936
+		{
4937
+			i++;
4938
+			sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
4939
+			for (L2PcInstance p : getPlayersOfTeam(i))
4940
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
4941
+		}
4942
+
4943
+		sb.append("</table></body></html>");
4944
+		html.setHtml(sb.toString());
4945
+		player.sendPacket(html);
4946
+
4947
+	}
4948
+
4949
+	@Override
4950
+	protected void start()
4951
+	{
4952
+		setStatus(EventState.START);
4953
+		schedule(1);
4954
+	}
4955
+}
4956
\ No newline at end of file
4957
Index: head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Bomb.java
4958
===================================================================
4959
--- head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Bomb.java	(revision 0)
4960
+++ head-src/com/l2jfrozen/gameserver/handler/skillhandlers/Bomb.java	(revision 0)
4961
@@ -0,0 +1,30 @@
4962
+package com.l2jfrozen.gameserver.handler.skillhandlers;
4963
+
4964
+import com.l2jfrozen.gameserver.event.EventManager;
4965
+import com.l2jfrozen.gameserver.handler.ISkillHandler;
4966
+import com.l2jfrozen.gameserver.model.L2Character;
4967
+import com.l2jfrozen.gameserver.model.L2Object;
4968
+import com.l2jfrozen.gameserver.model.L2Skill;
4969
+import com.l2jfrozen.gameserver.model.L2Skill.SkillType;
4970
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
4971
+
4972
+public class Bomb implements ISkillHandler
4973
+{
4974
+private static final SkillType[] SKILL_IDS =
4975
+{ SkillType.BOMB };
4976
+
4977
+public void useSkill(L2Character activeChar, L2Skill skill,
4978
+L2Object[] targets)
4979
+{
4980
+
4981
+if (!(activeChar instanceof L2PcInstance))
4982
+return;
4983
+
4984
+EventManager.getInstance().getCurrentEvent().dropBomb((L2PcInstance)activeChar);
4985
+}
4986
+
4987
+public SkillType[] getSkillIds()
4988
+{
4989
+return SKILL_IDS;
4990
+}
4991
+}
4992
\ No newline at end of file
4993
Index: head-src/com/l2jfrozen/gameserver/event/Mutant.java
4994
===================================================================
4995
--- head-src/com/l2jfrozen/gameserver/event/Mutant.java	(revision 0)
4996
+++ head-src/com/l2jfrozen/gameserver/event/Mutant.java	(revision 0)
4997
@@ -0,0 +1,212 @@
4998
+/*
4999
+ * This program is free software: you can redistribute it and/or modify it under
5000
+ * the terms of the GNU General Public License as published by the Free Software
5001
+ * Foundation, either version 3 of the License, or (at your option) any later
5002
+ * version.
5003
+ *
5004
+ * This program is distributed in the hope that it will be useful, but WITHOUT
5005
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
5006
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
5007
+ * details.
5008
+ *
5009
+ * You should have received a copy of the GNU General Public License along with
5010
+ * this program. If not, see <http://www.gnu.org/licenses/>.
5011
+ */
5012
+package com.l2jfrozen.gameserver.event;
5013
+
5014
+import javolution.text.TextBuilder;
5015
+
5016
+import com.l2jfrozen.gameserver.datatables.SkillTable;
5017
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
5018
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
5019
+import com.l2jfrozen.gameserver.model.L2Object;
5020
+
5021
+/**
5022
+ * @author Rizel
5023
+ *
5024
+ */
5025
+public class Mutant extends Event
5026
+{
5027
+
5028
+	private class Core implements Runnable
5029
+	{
5030
+		public void run()
5031
+		{
5032
+			try
5033
+			{
5034
+				switch (eventState)
5035
+				{
5036
+					case START:
5037
+						divideIntoTeams(1);
5038
+						preparePlayers();
5039
+						teleportToTeamPos();
5040
+						forceSitAll();
5041
+						setStatus(EventState.FIGHT);
5042
+						schedule(20000);
5043
+						break;
5044
+
5045
+					case FIGHT:
5046
+						forceStandAll();
5047
+						transformMutant(getRandomPlayer());
5048
+						setStatus(EventState.END);
5049
+						clock.startClock(getInt("matchTime"));
5050
+						break;
5051
+
5052
+					case END:
5053
+						clock.setTime(0);
5054
+						untransformMutant();
5055
+						L2PcInstance winner = getPlayerWithMaxScore();
5056
+						giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
5057
+						setStatus(EventState.INACTIVE);
5058
+						EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " kills!");
5059
+						break;
5060
+				}
5061
+			}
5062
+			catch (Throwable e)
5063
+			{
5064
+				e.printStackTrace();
5065
+				EventManager.getInstance().end("Error! Event ended.");
5066
+			}
5067
+		}
5068
+	}
5069
+
5070
+	private enum EventState
5071
+	{
5072
+		START, FIGHT, END, INACTIVE
5073
+	}
5074
+
5075
+	private EventState eventState;
5076
+
5077
+	private Core task;
5078
+
5079
+	private L2PcInstance mutant;
5080
+
5081
+	public Mutant()
5082
+	{
5083
+		super();
5084
+		eventId = 13;
5085
+		createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
5086
+		task = new Core();
5087
+	}
5088
+
5089
+	/**
5090
+	 * @see net.sf.l2j.gameserver.event.Event#endEvent()
5091
+	 */
5092
+	@Override
5093
+	protected void endEvent()
5094
+	{
5095
+		setStatus(EventState.END);
5096
+		clock.setTime(0);
5097
+	}
5098
+
5099
+	@Override
5100
+	protected String getScorebar()
5101
+	{
5102
+		return "Max: " + getScore(getPlayerWithMaxScore()) + "  Time: " + clock.getTime() + "";
5103
+	}
5104
+
5105
+	@Override
5106
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
5107
+	{
5108
+		super.onDie(victim, killer);
5109
+		addToResurrector(victim);
5110
+	}
5111
+
5112
+	@Override
5113
+	public void onKill(L2PcInstance victim, L2PcInstance killer)
5114
+	{
5115
+		super.onKill(victim, killer);
5116
+		if (getStatus(killer) == 1)
5117
+			increasePlayersScore(killer);
5118
+		if (getStatus(killer) == 0 && getStatus(victim) == 1)
5119
+			transformMutant(killer);
5120
+	    	killer.addItem("Event", 6392, 1, killer, true);
5121
+	}
5122
+
5123
+	@Override
5124
+	public void onLogout(L2PcInstance player)
5125
+	{
5126
+		super.onLogout(player);
5127
+
5128
+		if (mutant == player)
5129
+			transformMutant(getRandomPlayer());
5130
+	}
5131
+
5132
+	@Override
5133
+	protected void schedule(int time)
5134
+	{
5135
+		tpm.scheduleGeneral(task, time);
5136
+	}
5137
+
5138
+	private void setStatus(EventState s)
5139
+	{
5140
+		eventState = s;
5141
+	}
5142
+
5143
+	@Override
5144
+	protected void showHtml(L2PcInstance player, int obj)
5145
+	{
5146
+		if (players.size() > 0)
5147
+		{
5148
+			NpcHtmlMessage html = new NpcHtmlMessage(obj);
5149
+			TextBuilder sb = new TextBuilder();
5150
+
5151
+			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>");
5152
+			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>");
5153
+			sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
5154
+			sb.append("<br><table width=270>");
5155
+
5156
+			for (L2PcInstance p : getPlayersOfTeam(1))
5157
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
5158
+
5159
+			sb.append("</table></body></html>");
5160
+			html.setHtml(sb.toString());
5161
+			player.sendPacket(html);
5162
+		}
5163
+
5164
+	}
5165
+
5166
+	@Override
5167
+	protected void start()
5168
+	{
5169
+		setStatus(EventState.START);
5170
+		schedule(1);
5171
+	}
5172
+
5173
+	private void transformMutant(L2PcInstance player)
5174
+	{
5175
+		player.addSkill(SkillTable.getInstance().getInfo(getInt("mutantBuffId"), 1), false);
5176
+		setStatus(player, 1);
5177
+		untransformMutant();
5178
+		polymorph(player,25286);
5179
+		player.getAppearance().setNameColor(255, 0, 0);
5180
+		player.broadcastUserInfo();
5181
+		mutant = player;
5182
+
5183
+	}
5184
+
5185
+	private void untransformMutant()
5186
+	{
5187
+		if (mutant != null)
5188
+		{
5189
+			mutant.getAppearance().setNameColor(getColor("All")[0], getColor("All")[1], getColor("All")[2]);
5190
+			mutant.removeSkill(SkillTable.getInstance().getInfo(getInt("mutantBuffId"), 1), false);
5191
+			setStatus(mutant, 0);
5192
+			unpolymorph(mutant);
5193
+			mutant.broadcastUserInfo();
5194
+			mutant = null;
5195
+		}
5196
+	}
5197
+	@Override
5198
+	public boolean canAttack(L2PcInstance player, L2Object target)
5199
+	{
5200
+		if (target instanceof L2PcInstance)
5201
+			if (getStatus(player) == 0 && getStatus((L2PcInstance) target) == 0)
5202
+				return false;
5203
+			else
5204
+				return true;
5205
+
5206
+		return false;
5207
+	}
5208
+
5209
+}
5210
\ No newline at end of file
5211
Index: head-src/com/l2jfrozen/gameserver/model/L2Skill.java
5212
===================================================================
5213
--- head-src/com/l2jfrozen/gameserver/model/L2Skill.java	(revision 936)
5214
+++ head-src/com/l2jfrozen/gameserver/model/L2Skill.java	(working copy)
5215
@@ -31,6 +31,7 @@
5216
 import com.l2jfrozen.gameserver.datatables.HeroSkillTable;
5217
 import com.l2jfrozen.gameserver.datatables.SkillTable;
5218
 import com.l2jfrozen.gameserver.datatables.sql.SkillTreeTable;
5219
+import com.l2jfrozen.gameserver.event.EventManager;
5220
 import com.l2jfrozen.gameserver.geo.GeoData;
5221
 import com.l2jfrozen.gameserver.managers.SiegeManager;
5222
 import com.l2jfrozen.gameserver.model.actor.instance.L2ArtefactInstance;
5223
@@ -263,6 +264,8 @@
5224
 		COREDONE,
5225
 		ZAKENPLAYER,
5226
 		ZAKENSELF,
5227
+	   	BOMB,
5228
+    	CAPTURE,
5229
 
5230
 		// unimplemented
5231
 		NOTDONE;
5232
@@ -1968,6 +1971,20 @@
5233
 								continue;
5234
 							}
5235
 						}
5236
+						
5237
+                        if(obj instanceof L2PcInstance && activeChar instanceof L2PcInstance)
5238
+	                        	if(EventManager.getInstance().getCurrentEvent().numberOfTeams() > 1 &&
5239
+	                        		 EventManager.getInstance().isRegistered((L2PcInstance)activeChar) &&
5240
+	                        		 EventManager.getInstance().isRegistered((L2PcInstance)obj) &&
5241
+	                        		 EventManager.getInstance().getCurrentEvent().getTeam((L2PcInstance)obj) == EventManager.getInstance().getCurrentEvent().getTeam((L2PcInstance)activeChar))
5242
+	                        			continue;
5243
+	                        	
5244
+	                    	if(obj instanceof L2Summon && activeChar instanceof L2PcInstance)
5245
+	                    		if(EventManager.getInstance().getCurrentEvent().numberOfTeams() > 1 &&
5246
+	                    				EventManager.getInstance().isRegistered((L2PcInstance)activeChar) &&
5247
+	                    				EventManager.getInstance().isRegistered(((L2Summon)obj).getOwner()) &&
5248
+	                    				EventManager.getInstance().getCurrentEvent().getTeam(((L2Summon)obj).getOwner()) == EventManager.getInstance().getCurrentEvent().getTeam((L2PcInstance)activeChar))
5249
+	                    					continue;
5250
 
5251
 						targetList.add((L2Character) obj);
5252
 					}
5253
Index: head-src/com/l2jfrozen/gameserver/event/Bomb.java
5254
===================================================================
5255
--- head-src/com/l2jfrozen/gameserver/event/Bomb.java	(revision 0)
5256
+++ head-src/com/l2jfrozen/gameserver/event/Bomb.java	(revision 0)
5257
@@ -0,0 +1,261 @@
5258
+package com.l2jfrozen.gameserver.event;
5259
+
5260
+import javolution.text.TextBuilder;
5261
+import javolution.util.FastList;
5262
+import javolution.util.FastMap;
5263
+
5264
+import com.l2jfrozen.gameserver.datatables.SkillTable;
5265
+import com.l2jfrozen.gameserver.model.L2Object;
5266
+import com.l2jfrozen.gameserver.model.L2Skill;
5267
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
5268
+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
5269
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
5270
+import com.l2jfrozen.gameserver.network.serverpackets.MagicSkillLaunched;
5271
+import com.l2jfrozen.gameserver.network.serverpackets.MagicSkillUser;
5272
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
5273
+import com.l2jfrozen.gameserver.network.serverpackets.NpcInfo;
5274
+import com.l2jfrozen.util.random.Rnd;
5275
+
5276
+public class Bomb extends Event
5277
+{
5278
+	private class Bomber implements Runnable
5279
+	{
5280
+		public void run()
5281
+		{
5282
+			explode(bombs.head().getNext().getKey());
5283
+			bombs.remove(bombs.head().getNext().getKey());
5284
+		}
5285
+	}
5286
+
5287
+	private class Core implements Runnable
5288
+	{
5289
+		public void run()
5290
+		{
5291
+			try
5292
+			{
5293
+				switch (eventState)
5294
+				{
5295
+					case START:
5296
+						divideIntoTeams(2);
5297
+						preparePlayers();
5298
+						teleportToTeamPos();
5299
+						createPartyOfTeam(1);
5300
+						createPartyOfTeam(2);
5301
+						forceSitAll();
5302
+						unequip();
5303
+						giveSkill();
5304
+						debug("The event initialized with " + players.size() + " players");
5305
+						setStatus(EventState.FIGHT);
5306
+						schedule(20000);
5307
+						break;
5308
+
5309
+					case FIGHT:
5310
+						forceStandAll();
5311
+						setStatus(EventState.END);
5312
+						debug("The fight started");
5313
+						clock.startClock(getInt("matchTime"));
5314
+						break;
5315
+
5316
+					case END:
5317
+						clock.setTime(0);
5318
+						if (winnerTeam == 0)
5319
+							winnerTeam = getWinnerTeam();
5320
+						
5321
+						removeSkill();
5322
+						giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
5323
+						debug("The event ended. Winner: " + winnerTeam);
5324
+						setStatus(EventState.INACTIVE);
5325
+						EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " kills!");
5326
+						break;
5327
+				}
5328
+			}
5329
+			catch (Throwable e)
5330
+			{
5331
+				e.printStackTrace();
5332
+				EventManager.getInstance().end("Error! Event ended.");
5333
+			}
5334
+		}
5335
+	}
5336
+
5337
+	private enum EventState
5338
+	{
5339
+		START, FIGHT, END, TELEPORT, INACTIVE
5340
+	}
5341
+
5342
+	private EventState eventState;
5343
+
5344
+	private Core task;
5345
+
5346
+	private FastMap<L2Spawn, L2PcInstance> bombs;
5347
+
5348
+	private Bomber bomber;
5349
+
5350
+	public Bomb()
5351
+	{
5352
+		super();
5353
+		eventId = 12;
5354
+		createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
5355
+		createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
5356
+		task = new Core();
5357
+		bomber = new Bomber();
5358
+		bombs = new FastMap<L2Spawn, L2PcInstance>();
5359
+		winnerTeam = 0;
5360
+	}
5361
+
5362
+	@Override
5363
+	public void dropBomb(L2PcInstance player)
5364
+	{
5365
+		bombs.put(spawnNPC(player.getX(), player.getY(), player.getZ(), getInt("bombNpcId")), player);
5366
+		bombs.tail().getPrevious().getKey().getLastSpawn().setTitle((getTeam(player) == 1 ? "Blue" : "Red"));
5367
+		bombs.tail().getPrevious().getKey().getLastSpawn().broadcastStatusUpdate();
5368
+		
5369
+		for(L2PcInstance p : getPlayerList())
5370
+			p.sendPacket(new NpcInfo(bombs.tail().getPrevious().getKey().getLastSpawn(), p));
5371
+		
5372
+		tpm.scheduleGeneral(bomber, 3000);
5373
+	}
5374
+
5375
+	@Override
5376
+	protected void endEvent()
5377
+	{
5378
+		winnerTeam = players.head().getNext().getValue()[0];
5379
+
5380
+		setStatus(EventState.END);
5381
+		clock.setTime(0);
5382
+
5383
+	}
5384
+
5385
+	private void explode(L2Spawn bomb)
5386
+	{
5387
+		FastList<L2Object> victims = new FastList<L2Object>();
5388
+
5389
+		for (L2PcInstance player : getPlayerList())
5390
+		{
5391
+			if(player == null)
5392
+				continue;
5393
+			
5394
+			if(player.isInvul())
5395
+				continue;
5396
+	
5397
+				if (getTeam(bombs.get(bomb)) != getTeam(player) && Math.sqrt(player.getPlanDistanceSq(bomb.getLastSpawn())) <= getInt("bombRadius"))
5398
+				{
5399
+					player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, bomb.getLastSpawn());
5400
+					increasePlayersScore(bombs.get(bomb));
5401
+					EventStats.getInstance().tempTable.get(player.getObjectId())[2] = EventStats.getInstance().tempTable.get(player.getObjectId())[2] + 1;
5402
+					addToResurrector(player);
5403
+					
5404
+					victims.add(player);
5405
+	
5406
+					if (getTeam(player) == 1)
5407
+						teams.get(2).increaseScore();
5408
+					if (getTeam(player) == 2)
5409
+						teams.get(1).increaseScore();
5410
+				}
5411
+			if (victims.size() != 0)
5412
+			{
5413
+				bomb.getLastSpawn().broadcastPacket(new MagicSkillUser(bomb.getLastSpawn(), (L2PcInstance) victims.head().getNext().getValue(), 18, 1, 0, 0));
5414
+				bomb.getLastSpawn().broadcastPacket(new MagicSkillLaunched(bomb.getLastSpawn(), 18, 1, victims.toArray(new L2Object[victims.size()])));
5415
+				victims.clear();
5416
+			}
5417
+		}
5418
+		unspawnNPC(bomb);
5419
+	}
5420
+
5421
+	@Override
5422
+	protected String getScorebar()
5423
+	{
5424
+		return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + "  " + teams.get(2).getName() + ": " + teams.get(2).getScore() + "  Time: " + clock.getTime();
5425
+	}
5426
+
5427
+	@Override
5428
+	protected int getWinnerTeam()
5429
+	{
5430
+		if (teams.get(1).getScore() > teams.get(2).getScore())
5431
+			return 1;
5432
+		if (teams.get(2).getScore() > teams.get(1).getScore())
5433
+			return 2;
5434
+		if (teams.get(1).getScore() == teams.get(2).getScore())
5435
+			if (Rnd.nextInt(1) == 1)
5436
+				return 1;
5437
+			else
5438
+				return 2;
5439
+
5440
+		return 1;
5441
+	}
5442
+
5443
+	private void giveSkill()
5444
+	{
5445
+		for (L2PcInstance player : getPlayerList())
5446
+			player.addSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
5447
+	}
5448
+
5449
+
5450
+	@Override
5451
+	public void onLogout(L2PcInstance player)
5452
+	{
5453
+		player.removeSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
5454
+	}
5455
+
5456
+	@Override
5457
+	public boolean onUseMagic(L2Skill skill)
5458
+	{
5459
+		if (skill.getId() == getInt("bombSkillId"))
5460
+			return true;
5461
+
5462
+		return false;
5463
+
5464
+	}
5465
+
5466
+	private void removeSkill()
5467
+	{
5468
+		for (L2PcInstance player : getPlayerList())
5469
+			player.removeSkill(SkillTable.getInstance().getInfo(getInt("bombSkillId"), 1), false);
5470
+	}
5471
+
5472
+	@Override
5473
+	protected void schedule(int time)
5474
+	{
5475
+		tpm.scheduleGeneral(task, time);
5476
+	}
5477
+
5478
+	private void setStatus(EventState s)
5479
+	{
5480
+		eventState = s;
5481
+	}
5482
+
5483
+	@Override
5484
+	protected void showHtml(L2PcInstance player, int obj)
5485
+	{
5486
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
5487
+		TextBuilder sb = new TextBuilder();
5488
+
5489
+		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>");
5490
+		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>");
5491
+		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>");
5492
+		sb.append("<br><table width=270>");
5493
+		int i = 0;
5494
+		for (EventTeam team : teams.values())
5495
+		{
5496
+			i++;
5497
+			sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
5498
+			for (L2PcInstance p : getPlayersOfTeam(i))
5499
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
5500
+		}
5501
+
5502
+		sb.append("</table></body></html>");
5503
+		html.setHtml(sb.toString());
5504
+		player.sendPacket(html);
5505
+
5506
+	}
5507
+
5508
+	@Override
5509
+	protected void start()
5510
+	{
5511
+		setStatus(EventState.START);
5512
+		schedule(1);
5513
+	}
5514
+	public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
5515
+	{
5516
+		return false;
5517
+	}
5518
+}
5519
\ No newline at end of file
5520
Index: head-src/com/l2jfrozen/gameserver/event/FormalLMS.java
5521
===================================================================
5522
--- head-src/com/l2jfrozen/gameserver/event/FormalLMS.java	(revision 0)
5523
+++ head-src/com/l2jfrozen/gameserver/event/FormalLMS.java	(revision 0)
5524
@@ -0,0 +1,54 @@
5525
+/*
5526
+ * This program is free software; you can redistribute it and/or modify
5527
+ * it under the terms of the GNU General Public License as published by
5528
+ * the Free Software Foundation; either version 2, or (at your option)
5529
+ * any later version.
5530
+ *
5531
+ * This program is distributed in the hope that it will be useful,
5532
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5533
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5534
+ * GNU General Public License for more details.
5535
+ *
5536
+ * You should have received a copy of the GNU General Public License
5537
+ * along with this program; if not, write to the Free Software
5538
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
5539
+ * 02111-1307, USA.
5540
+ *
5541
+ * http://www.gnu.org/copyleft/gpl.html
5542
+ */
5543
+package com.l2jfrozen.gameserver.event;
5544
+
5545
+
5546
+import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
5547
+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
5548
+
5549
+/**
5550
+ * 
5551
+ * 
5552
+ * @author Rizel
5553
+ */
5554
+public class FormalLMS
5555
+{
5556
+	private L2ItemInstance formalWear;
5557
+	
5558
+	@SuppressWarnings("synthetic-access")
5559
+	private static class SingletonHolder
5560
+	{
5561
+		protected static final FormalLMS _instance = new FormalLMS();
5562
+	}
5563
+
5564
+	public static FormalLMS getInstance()
5565
+	{
5566
+		return SingletonHolder._instance;
5567
+	}
5568
+	
5569
+	public FormalLMS()
5570
+	{
5571
+		formalWear = ItemTable.getInstance().createItem("", 6408, 1, null, null);
5572
+	}
5573
+	
5574
+	public int getOID()
5575
+	{
5576
+		return formalWear.getObjectId();
5577
+	}
5578
+}
5579
Index: head-src/com/l2jfrozen/gameserver/event/EventManager.java
5580
===================================================================
5581
--- head-src/com/l2jfrozen/gameserver/event/EventManager.java	(revision 0)
5582
+++ head-src/com/l2jfrozen/gameserver/event/EventManager.java	(revision 0)
5583
@@ -0,0 +1,727 @@
5584
+package com.l2jfrozen.gameserver.event;
5585
+
5586
+import java.io.FileWriter;
5587
+import java.io.IOException;
5588
+import java.text.SimpleDateFormat;
5589
+import java.util.Date;
5590
+import java.util.Map;
5591
+import java.util.Random;
5592
+
5593
+import javolution.text.TextBuilder;
5594
+import javolution.util.FastList;
5595
+import javolution.util.FastMap;
5596
+
5597
+import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
5598
+import com.l2jfrozen.gameserver.model.L2Character;
5599
+import com.l2jfrozen.gameserver.model.L2Party;
5600
+import com.l2jfrozen.gameserver.model.L2World;
5601
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
5602
+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
5603
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
5604
+import com.l2jfrozen.gameserver.util.Broadcast;
5605
+
5606
+public final class EventManager
5607
+{
5608
+	
5609
+	private class Countdown implements Runnable
5610
+	{
5611
+		protected String getTime()
5612
+		{
5613
+			String mins = "" + counter / 60;
5614
+			String secs = (counter % 60 < 10 ? "0" + counter % 60 : "" + counter % 60);
5615
+			return "" + mins + ":" + secs + "";
5616
+		}
5617
+
5618
+		@SuppressWarnings("synthetic-access")
5619
+		public void run()
5620
+		{
5621
+			if (status == State.REGISTERING)
5622
+
5623
+				switch (counter)
5624
+				{
5625
+					case 300:
5626
+					case 240:
5627
+					case 180:
5628
+					case 120:
5629
+					case 60:
5630
+					    announce("" + counter / 60 + " min(s) left to register, " + getCurrentEvent().getString("eventName"));
5631
+						break;
5632
+					case 30:
5633
+					case 10:
5634
+						announce("" + counter + " seconds left to register!");
5635
+						break;
5636
+				}
5637
+
5638
+			if (status == State.VOTING)
5639
+				if (counter == getInt("showVotePopupAt") && getBoolean("votePopupEnabled"))
5640
+				{
5641
+					NpcHtmlMessage html = new NpcHtmlMessage(0);
5642
+					TextBuilder sb = new TextBuilder();
5643
+					int count = 0;
5644
+					
5645
+					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>");
5646
+
5647
+					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>");
5648
+
5649
+					for (Map.Entry<Integer, Event> event : events.entrySet())
5650
+					{
5651
+						count++;
5652
+						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>");
5653
+						sb.append("<a action=\"bypass -h eventvote " + event.getKey() + "\">Vote</a>");
5654
+						sb.append("</td><td width=30><center>" + getVoteCount(event.getKey()) + "</td></tr></table>");
5655
+					}
5656
+
5657
+					sb.append("</body></html>");
5658
+					html.setHtml(sb.toString());
5659
+
5660
+					for (L2PcInstance player : L2World.getInstance().getAllPlayers())
5661
+					{
5662
+						if (votes.containsKey(player) || player.getLevel() < 40)
5663
+							continue;
5664
+
5665
+						player.sendPacket(html);
5666
+					}
5667
+				}
5668
+
5669
+			if (counter == 0)
5670
+				schedule(1);
5671
+			else
5672
+			{
5673
+				counter--;
5674
+				tpm.scheduleGeneral(cdtask, 1000);
5675
+			}
5676
+
5677
+		}
5678
+	}
5679
+
5680
+	private class Scheduler implements Runnable
5681
+	{
5682
+		@SuppressWarnings("synthetic-access")
5683
+		public void run()
5684
+		{
5685
+			switch (status)
5686
+			{
5687
+				case VOTING:
5688
+					if (votes.size() > 0)
5689
+						setCurrentEvent(getVoteWinner());
5690
+					else
5691
+						setCurrentEvent(eventIds.get(rnd.nextInt(eventIds.size())));
5692
+
5693
+					announce("The next event will be: " + getCurrentEvent().getString("eventName"));
5694
+					announce("Registering phase started! You have " + getInt("registerTime") / 60 + " mins to register!");
5695
+                    announce("Event joinable in giran.");
5696
+					setStatus(State.REGISTERING);
5697
+					debug("Registering phase started.");
5698
+					counter = getInt("registerTime") - 1;
5699
+					tpm.scheduleGeneral(cdtask, 1);
5700
+					break;
5701
+
5702
+				case REGISTERING:
5703
+					announce("Registering phase ended!");
5704
+					debug("Registering phase ended.");
5705
+					if (countOfRegistered() < getCurrentEvent().getInt("minPlayers"))
5706
+					{
5707
+						debug("Lack of participants.");
5708
+						announce("Theres not enough participants! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
5709
+						players.clear();
5710
+						colors.clear();
5711
+						positions.clear();
5712
+						setStatus(State.VOTING);
5713
+						counter = getInt("betweenEventsTime") - 1;
5714
+						tpm.scheduleGeneral(cdtask, 1);
5715
+					}
5716
+					else
5717
+					{
5718
+						debug("Event starts.");
5719
+						announce("Event started!");
5720
+						setStatus(State.RUNNING);
5721
+						msgToAll("You'll be teleported to the event in 10 secs");
5722
+						schedule(10000);
5723
+					}
5724
+					break;
5725
+
5726
+				case RUNNING:
5727
+					getCurrentEvent().start();
5728
+
5729
+					for (L2PcInstance player : players)
5730
+						EventStats.getInstance().tempTable.put(player.getObjectId(), new int[] { 0, 0, 0, 0 });
5731
+
5732
+					break;
5733
+
5734
+				case TELE_BACK:
5735
+					msgToAll("You'll be teleported back in 10 secs");
5736
+					setStatus(State.END);
5737
+					debug("Teleporting back.");
5738
+					schedule(10000);
5739
+					break;
5740
+
5741
+				case END:
5742
+					teleBackEveryone();
5743
+					if (getBoolean("statTrackingEnabled"))
5744
+					{
5745
+						EventStats.getInstance().applyChanges();
5746
+						EventStats.getInstance().tempTable.clear();
5747
+						EventStats.getInstance().updateSQL(getCurrentEvent().getPlayerList(), getCurrentEvent().eventId);
5748
+					}
5749
+					getCurrentEvent().reset();
5750
+					setCurrentEvent(0);
5751
+					players.clear();
5752
+					colors.clear();
5753
+					positions.clear();
5754
+					titles.clear();
5755
+					announce("Event ended! Next event in " + getInt("betweenEventsTime") / 60 + "mins!");
5756
+					setStatus(State.VOTING);
5757
+					counter = getInt("betweenEventsTime") - 1;
5758
+					debug("Event ended.");
5759
+					tpm.scheduleGeneral(cdtask, 1);
5760
+					break;
5761
+
5762
+			}
5763
+		}
5764
+	}
5765
+
5766
+	@SuppressWarnings("synthetic-access")
5767
+	private static class SingletonHolder
5768
+	{
5769
+		protected static final EventManager _instance = new EventManager();
5770
+	}
5771
+
5772
+	// Manager Statuses
5773
+	protected enum State
5774
+	{
5775
+		REGISTERING, VOTING, RUNNING, TELE_BACK, END
5776
+	}
5777
+
5778
+	public static EventManager getInstance()
5779
+	{
5780
+		return SingletonHolder._instance;
5781
+	}
5782
+
5783
+	private EventConfig config;
5784
+	// Event instances
5785
+	public FastMap<Integer, Event> events;
5786
+
5787
+	// The list of registered players
5788
+	public FastList<L2PcInstance> players;
5789
+
5790
+	// The current event
5791
+	private Event current;
5792
+
5793
+	// Original name colors
5794
+	private FastMap<L2PcInstance, Integer> colors;
5795
+
5796
+	//Original titles
5797
+	protected FastMap<L2PcInstance, String> titles;
5798
+
5799
+	//Original positions
5800
+	protected FastMap<L2PcInstance, int[]> positions;
5801
+
5802
+	// Votes for the events
5803
+	private FastMap<L2PcInstance, Integer> votes;
5804
+
5805
+	private State status;
5806
+
5807
+	private int counter;
5808
+
5809
+	private Countdown cdtask;
5810
+
5811
+	// NPC location
5812
+	public static int[] npcPos = { 82698, 148638, -3473 };
5813
+
5814
+	// Threadpoolmanager
5815
+	private ThreadPoolManager tpm;
5816
+
5817
+	// Scheduler
5818
+	private Scheduler task;
5819
+
5820
+	private Random rnd = new Random();
5821
+
5822
+	private FileWriter writer;
5823
+	
5824
+	private FastList<Integer> eventIds;
5825
+
5826
+	private static final SimpleDateFormat _formatter = new SimpleDateFormat("dd/MM/yyyy H:mm:ss");
5827
+
5828
+	public EventManager()
5829
+	{
5830
+		config = EventConfig.getInstance();
5831
+
5832
+		events = new FastMap<Integer, Event>();
5833
+		players = new FastList<L2PcInstance>();
5834
+		votes = new FastMap<L2PcInstance, Integer>();
5835
+		titles = new FastMap<L2PcInstance, String>();
5836
+		colors = new FastMap<L2PcInstance, Integer>();
5837
+		positions = new FastMap<L2PcInstance, int[]>();
5838
+		eventIds = new FastList<Integer>();
5839
+		status = State.VOTING;
5840
+		tpm = ThreadPoolManager.getInstance();
5841
+		task = new Scheduler();
5842
+		cdtask = new Countdown();
5843
+		counter = 0;
5844
+
5845
+		// Add the events to the list
5846
+		events.put(1, new dm());
5847
+		events.put(2, new Domination());
5848
+		events.put(3, new DoubleDomination());
5849
+		events.put(4, new LMS());
5850
+		events.put(5, new Lucky());
5851
+		events.put(6, new Simon());
5852
+		events.put(7, new TvT());
5853
+		events.put(8, new VIPTvT());
5854
+		events.put(9, new Zombie());
5855
+		events.put(10, new CTF());
5856
+		events.put(11, new Russian());
5857
+		events.put(12, new Bomb());
5858
+		events.put(13, new Mutant());
5859
+		events.put(14, new Battlefield());
5860
+
5861
+		for(int eventId : events.keySet())
5862
+			eventIds.add(eventId);
5863
+		
5864
+		debug(events.size() + " event imported.");
5865
+
5866
+		// Start the scheduler
5867
+		counter = getInt("firstAfterStartTime") - 1;
5868
+		tpm.scheduleGeneral(cdtask, 1);
5869
+
5870
+		System.out.println("Event Engine Started");
5871
+	}
5872
+
5873
+	public boolean addVote(L2PcInstance player, int eventId)
5874
+	{
5875
+		if (getStatus() != State.VOTING)
5876
+		{
5877
+			player.sendMessage("You cant vote now!");
5878
+			return false;
5879
+		}
5880
+		if (votes.containsKey(player))
5881
+		{
5882
+			player.sendMessage("You already voted for an event!");
5883
+			return false;
5884
+		}
5885
+		if (player.getLevel() < 40)
5886
+		{
5887
+			player.sendMessage("Your level is too low to vote for events!");
5888
+			return false;
5889
+		}
5890
+		else
5891
+		{
5892
+			player.sendMessage("You succesfully voted for the event");
5893
+			votes.put(player, eventId);
5894
+			return true;
5895
+		}
5896
+	}
5897
+
5898
+	private void announce(String text)
5899
+	{
5900
+		Broadcast.toAllOnlinePlayers(new CreatureSay(0, 18, "", "[Event] " + text));
5901
+	}
5902
+
5903
+	private boolean canRegister(L2PcInstance player)
5904
+	{
5905
+		if (players.contains(player))
5906
+		{
5907
+			player.sendMessage("You already registered to the event!");
5908
+			return false;
5909
+		}
5910
+
5911
+		if (player.isInJail())
5912
+		{
5913
+			player.sendMessage("You cant register from the jail.");
5914
+			return false;
5915
+		}
5916
+
5917
+		if (player.isInOlympiadMode())
5918
+		{
5919
+			player.sendMessage("You cant register while youre in the olympiad.");
5920
+			return false;
5921
+		}
5922
+
5923
+		if (player.getLevel() > getCurrentEvent().getInt("maxLvl"))
5924
+		{
5925
+			player.sendMessage("Youre greater than the max allowed lvl.");
5926
+			return false;
5927
+		}
5928
+
5929
+		if (player.getLevel() < getCurrentEvent().getInt("minLvl"))
5930
+		{
5931
+			player.sendMessage("Youre lower than the min allowed lvl.");
5932
+			return false;
5933
+		}
5934
+
5935
+		if (player.getKarma() > 0)
5936
+		{
5937
+			player.sendMessage("You cant register if you have karma.");
5938
+			return false;
5939
+		}
5940
+
5941
+		if (player.isCursedWeaponEquiped())
5942
+		{
5943
+			player.sendMessage("You cant register with a cursed weapon.");
5944
+			return false;
5945
+		}
5946
+
5947
+		if (player.isDead())
5948
+		{
5949
+			player.sendMessage("You cant register while youre dead.");
5950
+			return false;
5951
+		}
5952
+
5953
+		return true;
5954
+	} /*
5955
+		* If theres a running event and
5956
+		*/
5957
+
5958
+	public boolean canTargetPlayer(L2PcInstance target, L2PcInstance self)
5959
+	{
5960
+		if (getStatus() == State.RUNNING)
5961
+		{
5962
+			if ((isRegistered(target) && isRegistered(self)) || (!isRegistered(target) && !isRegistered(self)))
5963
+				return true;
5964
+			else
5965
+				return false;
5966
+		}
5967
+		else
5968
+			return true;
5969
+	}
5970
+
5971
+	protected int countOfRegistered()
5972
+	{
5973
+		return players.size();
5974
+	}
5975
+
5976
+	protected void debug(String message)
5977
+	{
5978
+		if (!getBoolean("debug"))
5979
+			return;
5980
+
5981
+		String today = _formatter.format(new Date());
5982
+
5983
+		try
5984
+		{
5985
+			writer = new FileWriter("log/EventEngine.log", true);
5986
+			writer.write(today + " - " + message + "\r\n");
5987
+		}
5988
+		catch (IOException e)
5989
+		{
5990
+
5991
+		}
5992
+		finally
5993
+		{
5994
+			try
5995
+			{
5996
+				writer.close();
5997
+			}
5998
+			catch (Exception e)
5999
+			{
6000
+			}
6001
+		}
6002
+	}
6003
+
6004
+	protected void end(String text)
6005
+	{
6006
+		announce(text);
6007
+		status = State.TELE_BACK;
6008
+		schedule(1);
6009
+	}
6010
+
6011
+	public boolean getBoolean(String propName)
6012
+	{
6013
+		return config.getBoolean(0, propName);
6014
+	}
6015
+
6016
+	public Event getCurrentEvent()
6017
+	{
6018
+		return current;
6019
+	}
6020
+
6021
+	public FastList<String> getEventNames()
6022
+	{
6023
+		FastList<String> map = new FastList<String>();
6024
+		for (Event event : events.values())
6025
+			map.add(event.getString("eventName"));
6026
+		return map;
6027
+	}
6028
+
6029
+	public int getInt(String propName)
6030
+	{
6031
+		return config.getInt(0, propName);
6032
+	}
6033
+
6034
+	protected int[] getPosition(String owner, int num)
6035
+	{
6036
+		return config.getPosition(0, owner, num);
6037
+	}
6038
+
6039
+	public FastList<Integer> getRestriction(String type)
6040
+	{
6041
+		return config.getRestriction(0, type);
6042
+	}
6043
+
6044
+	private State getStatus()
6045
+	{
6046
+		return status;
6047
+	}
6048
+
6049
+	protected String getString(String propName)
6050
+	{
6051
+		return config.getString(0, propName);
6052
+	}
6053
+
6054
+	private int getVoteCount(int event)
6055
+	{
6056
+		int count = 0;
6057
+		for (int e : votes.values())
6058
+			if (e == event)
6059
+				count++;
6060
+
6061
+		return count;
6062
+	}
6063
+
6064
+	private int getVoteWinner()
6065
+	{
6066
+		int old = 0;
6067
+		FastMap<Integer, Integer> temp = new FastMap<Integer, Integer>();
6068
+
6069
+		for (int vote : votes.values())
6070
+			if (!temp.containsKey(vote))
6071
+				temp.put(vote, 1);
6072
+			else
6073
+			{
6074
+				old = temp.get(vote);
6075
+				old++;
6076
+				temp.getEntry(vote).setValue(old);
6077
+			}
6078
+
6079
+		int max = temp.head().getNext().getValue();
6080
+		int result = temp.head().getNext().getKey();
6081
+
6082
+		for (Map.Entry<Integer, Integer> entry : temp.entrySet())
6083
+			if (entry.getValue() > max)
6084
+			{
6085
+				max = entry.getValue();
6086
+				result = entry.getKey();
6087
+			}
6088
+
6089
+		votes.clear();
6090
+		temp = null;
6091
+		return result;
6092
+
6093
+	}
6094
+
6095
+	public boolean isRegistered(L2PcInstance player)
6096
+	{
6097
+		if (getCurrentEvent() != null)
6098
+			return getCurrentEvent().players.containsKey(player);
6099
+		else
6100
+			return false;
6101
+	}
6102
+	
6103
+	public boolean isRegistered(L2Character player)
6104
+	{
6105
+		if (getCurrentEvent() != null)
6106
+			return getCurrentEvent().players.containsKey(player);
6107
+		else
6108
+			return false;
6109
+	}
6110
+	
6111
+	public boolean isRunning()
6112
+	{
6113
+		if (getStatus() == State.RUNNING)
6114
+			return true;
6115
+		else
6116
+			return false;
6117
+	}
6118
+
6119
+	private void msgToAll(String text)
6120
+	{
6121
+		for (L2PcInstance player : players)
6122
+			player.sendMessage(text);
6123
+	}
6124
+	
6125
+	public void onLogout(L2PcInstance player)
6126
+	{
6127
+		if (votes.containsKey(player))
6128
+			votes.remove(player);
6129
+		if (players.contains(player))
6130
+		{
6131
+			players.remove(player);
6132
+			colors.remove(player);
6133
+			titles.remove(player);
6134
+			positions.remove(player);
6135
+		}
6136
+	}
6137
+
6138
+	public boolean registerPlayer(L2PcInstance player)
6139
+	{
6140
+		if (getStatus() != State.REGISTERING)
6141
+		{
6142
+			player.sendMessage("You can't register now!");
6143
+			return false;
6144
+		}
6145
+
6146
+		if(getBoolean("eventBufferEnabled")) 
6147
+		 	if (!EventBuffer.getInstance().playerHaveTemplate(player)) 
6148
+		 	{ 
6149
+		 		player.sendMessage("You have to set a buff template first!"); 
6150
+		 		EventBuffer.getInstance().showHtml(player); 
6151
+		 		return false; 
6152
+		 	}
6153
+		
6154
+		if (canRegister(player))
6155
+		{
6156
+			player.sendMessage("You succesfully registered to the event!");
6157
+			players.add(player);
6158
+			titles.put(player, player.getTitle());
6159
+			colors.put(player, player.getAppearance().getNameColor());
6160
+			positions.put(player, new int[] { player.getX(), player.getY(), player.getZ() });
6161
+			return true;
6162
+		}
6163
+		else
6164
+		{
6165
+			player.sendMessage("You failed on registering to the event!");
6166
+			return false;
6167
+		}
6168
+	}
6169
+
6170
+	protected void schedule(int time)
6171
+	{
6172
+		tpm.scheduleGeneral(task, time);
6173
+	}
6174
+
6175
+	private void setCurrentEvent(int eventId)
6176
+	{
6177
+		if (eventId == 0)
6178
+			current = null;
6179
+		else
6180
+			current = events.get(eventId);
6181
+
6182
+		debug("Changed current event to: " + (current == null ? "null" : current.getString("eventName")));
6183
+	}
6184
+
6185
+	protected void setStatus(State s)
6186
+	{
6187
+		status = s;
6188
+	}
6189
+
6190
+	public void showFirstHtml(L2PcInstance player, int obj)
6191
+	{
6192
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
6193
+		TextBuilder sb = new TextBuilder();
6194
+		int count = 0;
6195
+
6196
+		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>");
6197
+
6198
+		if (getStatus() == State.VOTING)
6199
+		{
6200
+
6201
+			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>");
6202
+
6203
+			for (Map.Entry<Integer, Event> event : events.entrySet())
6204
+				{
6205
+					count++;
6206
+					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>*/);
6207
+	
6208
+					/*if (!votes.containsKey(player))
6209
+						sb.append("<a action=\"bypass -h npc_" + obj + "_" + event.getKey() + "\">Vote</a>");
6210
+					else
6211
+						sb.append("Vote");*/
6212
+	
6213
+					sb.append(/*</td><td width=30><center>" + getVoteCount(event.getKey()) + "</td>*/"</tr></table>");
6214
+				}
6215
+			sb.append("</body></html>");
6216
+			html.setHtml(sb.toString());
6217
+			player.sendPacket(html);
6218
+		}
6219
+
6220
+		if (getStatus() == State.REGISTERING)
6221
+		{
6222
+
6223
+			sb.append("<center><table width=270 bgcolor=5A5A5A><tr><td width=70>");
6224
+			if (players.contains(player))
6225
+				sb.append("<a action=\"bypass -h npc_" + obj + "_unreg\">Unregister</a>");
6226
+			else
6227
+				sb.append("<a action=\"bypass -h npc_" + obj + "_reg\">Register</a>");
6228
+			
6229
+			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>");
6230
+
6231
+			for (L2PcInstance p : EventManager.getInstance().players)
6232
+			{
6233
+				count++;
6234
+				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>");
6235
+			}
6236
+
6237
+			sb.append("</body></html>");
6238
+			html.setHtml(sb.toString());
6239
+			player.sendPacket(html);
6240
+		}
6241
+		if (getStatus() == State.RUNNING)
6242
+			getCurrentEvent().showHtml(player, obj);
6243
+
6244
+	}
6245
+
6246
+	private void teleBackEveryone()
6247
+	{
6248
+		for (L2PcInstance player : getCurrentEvent().getPlayerList())
6249
+		{
6250
+			if(player.getPoly().isMorphed())
6251
+			{
6252
+				player.getPoly().setPolyInfo(null, "1");
6253
+				player.decayMe();
6254
+				player.spawnMe(player.getX(),player.getY(),player.getZ());
6255
+			}
6256
+			player.teleToLocation(positions.get(player)[0], positions.get(player)[1], positions.get(player)[2]);
6257
+			player.getAppearance().setNameColor(colors.get(player));
6258
+			player.setTitle(titles.get(player));
6259
+			if (player.getParty() != null)
6260
+			{
6261
+				L2Party party = player.getParty();
6262
+				party.removePartyMember(player);
6263
+			}
6264
+			
6265
+			player.broadcastUserInfo();
6266
+			if (player.isDead())
6267
+				player.doRevive();
6268
+		}
6269
+
6270
+	}
6271
+
6272
+	public boolean unregisterPlayer(L2PcInstance player)
6273
+	{
6274
+		if (!players.contains(player))
6275
+		{
6276
+			player.sendMessage("You're not registered to the event!");
6277
+			return false;
6278
+		}
6279
+		if (getStatus() != State.REGISTERING)
6280
+		{
6281
+			player.sendMessage("You can't unregister now!");
6282
+			return false;
6283
+		}
6284
+		else
6285
+		{
6286
+			player.sendMessage("You succesfully unregistered from the event!");
6287
+			players.remove(player);
6288
+			colors.remove(player);
6289
+			positions.remove(player);
6290
+			return true;
6291
+		}
6292
+	}
6293
+	
6294
+	public boolean areTeammates(L2PcInstance player, L2PcInstance target) 
6295
+ 	{ 
6296
+ 		if(getCurrentEvent() == null) 
6297
+ 			return false; 
6298
+ 	
6299
+ 		if(getCurrentEvent().numberOfTeams() == 1) 
6300
+ 			return false; 
6301
+ 	
6302
+ 		if(getCurrentEvent().numberOfTeams() > 1) 
6303
+ 			if(getCurrentEvent().getTeam(player) == getCurrentEvent().getTeam(target)) 
6304
+ 				return true; 
6305
+ 			else 
6306
+ 				return false; 
6307
+ 	
6308
+ 		return false; 
6309
+ 	}
6310
+}
6311
\ No newline at end of file
6312
Index: config/Events.xml
6313
===================================================================
6314
--- config/Events.xml	(revision 0)
6315
+++ config/Events.xml	(revision 0)
6316
@@ -0,0 +1,350 @@
6317
+<?xml version="1.0" encoding="UTF-8"?>
6318
+<events>
6319
+	<!-- Core settings -->
6320
+	<event id="0">
6321
+		<property name="registerTime" value="300" />
6322
+		<property name="betweenEventsTime" value="10800" />
6323
+		<property name="firstAfterStartTime" value="1800" />
6324
+		<property name="managerNpcId" value="50001" />
6325
+		<property name="showVotePopupAt" value="600" />
6326
+		<property name="votePopupEnabled" value="false" />
6327
+		<property name="debug" value="false" />
6328
+		<property name="statTrackingEnabled" value="true" />
6329
+		<property name="eventBufferEnabled" value="false" />
6330
+		<property name="allowedBuffsList" value="1068,1085,1086,1087" />
6331
+		<property name="maxBuffNum" value="2" />
6332
+		<property name="friendlyFireEnabled" value="false" />
6333
+		<property name="restartAllowed" value="false" />
6334
+		<restriction type="item" ids="" />
6335
+		<restriction type="skill" ids="1374,1375,1376,395,396" />
6336
+	</event>
6337
+	
6338
+	<!-- DeathMatch -->
6339
+	<event id="1">
6340
+		<property name="minLvl" value="70" />
6341
+		<property name="maxLvl" value="80" />
6342
+		<property name="eventName" value="Deathmatch" />
6343
+		<property name="ids" value="1" />
6344
+		<property name="matchTime" value="240" />
6345
+		<property name="rewardId" value="6392" />
6346
+		<property name="rewardAmmount" value="20" />
6347
+		<property name="allowPotions" value="false" />
6348
+		<property name="allowUseMagic" value="true" />
6349
+		<property name="removeBuffs" value="false" />		
6350
+		<property name="minPlayers" value="8" />
6351
+		<color owner="All" r="255" g="255" b="255"/>
6352
+		<position owner="All" x="106037" y="114816" z="-1560" radius="700" />
6353
+		<restriction type="item" ids="" />
6354
+		<restriction type="skill" ids="" />
6355
+	</event>
6356
+	
6357
+	<!-- Domination -->
6358
+	<event id="2">
6359
+		<property name="minLvl" value="70" />
6360
+		<property name="maxLvl" value="80" />
6361
+		<property name="eventName" value="Domination" />
6362
+		<property name="ids" value="2" />
6363
+		<property name="matchTime" value="240" />
6364
+		<property name="rewardId" value="6392" />
6365
+		<property name="rewardAmmount" value="10" />
6366
+		<property name="allowPotions" value="false" />
6367
+		<property name="allowUseMagic" value="true" />
6368
+		<property name="removeBuffs" value="false" />		
6369
+		<property name="minPlayers" value="8" />
6370
+		<property name="zoneRadius" value="170" />
6371
+		<property name="zoneNpcId" value="9103" />
6372
+		<color owner="Blue" r="0" g="0" b="255"/>
6373
+		<color owner="Red" r="255" g="0" b="0"/>
6374
+		<position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
6375
+		<position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
6376
+		<position owner="Zone" x="106108" y="114969" z="-1587" radius="0" />
6377
+		<restriction type="item" ids="" />
6378
+		<restriction type="skill" ids="" />
6379
+	</event>
6380
+	
6381
+	<!-- Double Domination -->
6382
+	<event id="3">
6383
+		<property name="minLvl" value="70" />
6384
+		<property name="maxLvl" value="80" />
6385
+		<property name="eventName" value="Double Domination" />
6386
+		<property name="ids" value="3" />
6387
+		<property name="matchTime" value="240" />
6388
+		<property name="rewardId" value="6392" />
6389
+		<property name="rewardAmmount" value="10" />
6390
+		<property name="allowPotions" value="false" />
6391
+		<property name="allowUseMagic" value="true" />
6392
+		<property name="removeBuffs" value="false" />		
6393
+		<property name="minPlayers" value="8" />
6394
+		<property name="zoneRadius" value="170" />
6395
+		<property name="zoneNpcId" value="9103" />
6396
+		<property name="timeToScore" value="10" />
6397
+		<color owner="Blue" r="0" g="0" b="255"/>
6398
+		<color owner="Red" r="255" g="0" b="0"/>
6399
+    <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
6400
+    <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
6401
+		<position owner="Zone" x="106995" y="114556" z="-1587" radius="0" />
6402
+		<position owner="Zone" x="104823" y="115175" z="-1587" radius="0" />
6403
+		<restriction type="item" ids="" />
6404
+		<restriction type="skill" ids="" />
6405
+	</event>
6406
+	
6407
+	<!-- Last Man Standing -->
6408
+	<event id="4">
6409
+		<property name="minLvl" value="70" />
6410
+		<property name="maxLvl" value="80" />
6411
+		<property name="eventName" value="Last Man Standing" />
6412
+		<property name="ids" value="4" />
6413
+		<property name="matchTime" value="300" />
6414
+		<property name="rewardId" value="6392" />
6415
+		<property name="rewardAmmount" value="25" />
6416
+		<property name="allowPotions" value="false" />
6417
+		<property name="allowUseMagic" value="true" />
6418
+		<property name="removeBuffs" value="false" />		
6419
+		<property name="minPlayers" value="8" />
6420
+		<color owner="All" r="255" g="255" b="255"/>
6421
+    <position owner="All" x="106037" y="114816" z="-1560" radius="700" />
6422
+		<restriction type="item" ids="" />
6423
+		<restriction type="skill" ids="" />
6424
+	</event>
6425
+	
6426
+	<!-- Lucky Chests -->
6427
+	<event id="5">
6428
+		<property name="minLvl" value="40" />
6429
+		<property name="maxLvl" value="80" />
6430
+		<property name="eventName" value="Lucky Chests" />
6431
+		<property name="ids" value="5" />
6432
+		<property name="matchTime" value="180" />
6433
+		<property name="rewardId" value="6392" />
6434
+		<property name="rewardAmmount" value="20" />
6435
+		<property name="allowPotions" value="false" />
6436
+		<property name="allowUseMagic" value="false" />
6437
+		<property name="removeBuffs" value="true" />		
6438
+		<property name="minPlayers" value="8" />
6439
+		<property name="chestNpcId" value="9102" />
6440
+		<property name="numberOfChests" value="300" />
6441
+		<color owner="All" r="255" g="255" b="255"/>
6442
+    <position owner="All" x="106037" y="114816" z="-1560" radius="100" />
6443
+		<position owner="Chests" x="106037" y="114816" z="-1560" radius="700" />
6444
+		<restriction type="item" ids="" />
6445
+		<restriction type="skill" ids="" />
6446
+	</event>
6447
+	
6448
+	<!-- Simon Says -->
6449
+	<event id="6">
6450
+		<property name="minLvl" value="40" />
6451
+		<property name="maxLvl" value="80" />
6452
+		<property name="eventName" value="Simon Says" />
6453
+		<property name="ids" value="6" />
6454
+		<property name="roundTime" value="10" />
6455
+		<property name="rewardId" value="6392" />
6456
+		<property name="rewardAmmount" value="25" />
6457
+		<property name="allowPotions" value="false" />
6458
+		<property name="allowUseMagic" value="false" />
6459
+		<property name="removeBuffs" value="false" />		
6460
+		<property name="minPlayers" value="8" />
6461
+		<property name="simonNpcId" value="9101" />
6462
+		<property name="lengthOfFirstWord" value="3" />
6463
+		<property name="increasePerRound" value="1" />
6464
+		<color owner="All" r="255" g="255" b="255"/>
6465
+    <position owner="All" x="106037" y="114816" z="-1560" radius="100" />
6466
+		<position owner="Simon" x="106037" y="114816" z="-1560" radius="0" />
6467
+		<restriction type="item" ids="" />
6468
+		<restriction type="skill" ids="" />
6469
+	</event>
6470
+	
6471
+	<!-- Team vs Team -->
6472
+	<event id="7">
6473
+		<property name="minLvl" value="70" />
6474
+		<property name="maxLvl" value="80" />
6475
+		<property name="eventName" value="Team vs Team" />
6476
+		<property name="ids" value="7" />
6477
+		<property name="matchTime" value="300" />
6478
+		<property name="rewardId" value="6392" />
6479
+		<property name="rewardAmmount" value="10" />
6480
+		<property name="allowPotions" value="false" />
6481
+		<property name="allowUseMagic" value="true" />
6482
+		<property name="removeBuffs" value="true" />		
6483
+		<property name="minPlayers" value="8" />
6484
+		<color owner="Blue" r="0" g="0" b="255"/>
6485
+		<color owner="Red" r="255" g="0" b="0"/>
6486
+    <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
6487
+    <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
6488
+		<restriction type="item" ids="" />
6489
+		<restriction type="skill" ids="" />
6490
+	</event>
6491
+	
6492
+	<!-- VIP Team vs Team -->
6493
+	<event id="8">
6494
+		<property name="minLvl" value="70" />
6495
+		<property name="maxLvl" value="80" />
6496
+		<property name="eventName" value="VIP Team vs Team" />
6497
+		<property name="ids" value="8" />
6498
+		<property name="matchTime" value="300" />
6499
+		<property name="rewardId" value="6392" />
6500
+		<property name="rewardAmmount" value="10" />
6501
+		<property name="allowPotions" value="false" />
6502
+		<property name="allowUseMagic" value="true" />
6503
+		<property name="removeBuffs" value="true" />		
6504
+		<property name="minPlayers" value="8" />
6505
+		<color owner="Blue" r="0" g="0" b="255"/>
6506
+		<color owner="Red" r="255" g="0" b="0"/>
6507
+		<color owner="BlueVIP" r="0" g="255" b="255"/>
6508
+		<color owner="RedVIP" r="255" g="155" b="0"/>
6509
+    <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
6510
+    <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
6511
+		<restriction type="item" ids="" />
6512
+		<restriction type="skill" ids="" />
6513
+	</event>
6514
+	
6515
+	<!-- Zombie -->
6516
+	<event id="9">
6517
+		<property name="minLvl" value="40" />
6518
+		<property name="maxLvl" value="80" />
6519
+		<property name="eventName" value="Zombie" />
6520
+		<property name="ids" value="9" />
6521
+		<property name="matchTime" value="240" />
6522
+		<property name="rewardId" value="6392" />
6523
+		<property name="rewardAmmount" value="25" />
6524
+		<property name="allowPotions" value="false" />
6525
+		<property name="allowUseMagic" value="false" />
6526
+		<property name="removeBuffs" value="true" />		
6527
+		<property name="minPlayers" value="8" />
6528
+		<color owner="All" r="255" g="255" b="255"/>
6529
+		<color owner="Zombie" r="255" g="0" b="0"/>
6530
+    <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
6531
+    <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
6532
+    <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
6533
+    <position owner="All" x="106037" y="114816" z="-1560" radius="50" />
6534
+		<restriction type="item" ids="" />
6535
+		<restriction type="skill" ids="" />
6536
+	</event>
6537
+	
6538
+	<!-- Capture the Flag -->
6539
+	<event id="10">
6540
+		<property name="minLvl" value="70" />
6541
+		<property name="maxLvl" value="80" />
6542
+		<property name="eventName" value="Capture the Flag" />
6543
+		<property name="ids" value="10" />
6544
+		<property name="matchTime" value="300" />
6545
+		<property name="rewardId" value="6392" />
6546
+		<property name="rewardAmmount" value="10" />
6547
+		<property name="allowPotions" value="false" />
6548
+		<property name="allowUseMagic" value="true" />
6549
+		<property name="removeBuffs" value="true" />		
6550
+		<property name="minPlayers" value="8" />
6551
+		<property name="blueFlagId" value="9104" />
6552
+		<property name="redFlagId" value="9105" />
6553
+		<property name="blueFlagHolderId" value="9106" />
6554
+		<property name="redFlagHolderId" value="9107" />
6555
+		<color owner="Blue" r="0" g="0" b="255"/>
6556
+		<color owner="Red" r="255" g="0" b="0"/>
6557
+    <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
6558
+    <position owner="BlueFlag" x="106391" y="116331" z="-1587" radius="0" />
6559
+    <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
6560
+		<position owner="RedFlag" x="105696" y="113522" z="-1587" radius="0" />
6561
+		<restriction type="item" ids="" />
6562
+		<restriction type="skill" ids="" />
6563
+	</event>
6564
+	
6565
+	
6566
+	<!-- Russian Roulette -->
6567
+	<event id="11">
6568
+		<property name="minLvl" value="40" />
6569
+		<property name="maxLvl" value="80" />
6570
+		<property name="eventName" value="Russian Roulette" />
6571
+		<property name="ids" value="11" />
6572
+		<property name="matchTime" value="240" />
6573
+		<property name="rewardId" value="6392" />
6574
+		<property name="rewardAmmount" value="15" />
6575
+		<property name="allowPotions" value="false" />
6576
+		<property name="allowUseMagic" value="false" />
6577
+		<property name="removeBuffs" value="false" />		
6578
+		<property name="minPlayers" value="8" />
6579
+		<property name="russianNpcId" value="9108" />
6580
+		<property name="numberOfRussians" value="6" />
6581
+		<property name="roundTime" value="10" />
6582
+		<color owner="All" r="255" g="255" b="255"/>
6583
+    <position owner="All" x="106037" y="114816" z="-1560" radius="100" />
6584
+		<position owner="Russian" x="106109" y="114947" z="-1587" radius="0" />
6585
+		<position owner="Russian" x="106176" y="114792" z="-1587" radius="0" />
6586
+		<position owner="Russian" x="106138" y="114658" z="-1587" radius="0" />
6587
+		<position owner="Russian" x="106010" y="114607" z="-1587" radius="0" />
6588
+		<position owner="Russian" x="105859" y="114672" z="-1587" radius="0" />
6589
+		<position owner="Russian" x="105875" y="114837" z="-1587" radius="0" />
6590
+		<restriction type="item" ids="" />
6591
+		<restriction type="skill" ids="" />
6592
+	</event>
6593
+	
6594
+	<!-- Bomb Fight -->
6595
+	<event id="12">
6596
+		<property name="minLvl" value="40" />
6597
+		<property name="maxLvl" value="80" />
6598
+		<property name="eventName" value="Bomb Fight" />
6599
+		<property name="ids" value="12" />
6600
+		<property name="matchTime" value="300" />
6601
+		<property name="rewardId" value="6392" />
6602
+		<property name="rewardAmmount" value="10" />
6603
+		<property name="allowPotions" value="false" />
6604
+		<property name="allowUseMagic" value="true" />
6605
+		<property name="removeBuffs" value="true" />		
6606
+		<property name="minPlayers" value="8" />
6607
+		<property name="bombNpcId" value="9109" />
6608
+		<property name="bombRadius" value="100" />
6609
+		<property name="bombSkillId" value="5220" />
6610
+		<color owner="Blue" r="0" g="0" b="255"/>
6611
+		<color owner="Red" r="255" g="0" b="0"/>
6612
+    <position owner="Blue" x="11619" y="-49691" z="-3008" radius="50" />
6613
+    <position owner="Red" x="12720" y="-48594" z="-3035" radius="50" />
6614
+		<restriction type="item" ids="" />
6615
+		<restriction type="skill" ids="" />
6616
+	</event>
6617
+	
6618
+	<!-- Mutant -->
6619
+	<event id="13">
6620
+		<property name="minLvl" value="70" />
6621
+		<property name="maxLvl" value="80" />
6622
+		<property name="eventName" value="Mutant" />
6623
+		<property name="ids" value="13" />
6624
+		<property name="matchTime" value="240" />
6625
+		<property name="rewardId" value="6392" />
6626
+		<property name="rewardAmmount" value="25" />
6627
+		<property name="allowPotions" value="false" />
6628
+		<property name="allowUseMagic" value="true" />
6629
+		<property name="removeBuffs" value="true" />		
6630
+		<property name="minPlayers" value="8" />
6631
+		<property name="mutantBuffId" value="9007" />
6632
+		<color owner="All" r="255" g="255" b="255"/>
6633
+    <position owner="All" x="106037" y="114816" z="-1560" radius="700" />
6634
+		<restriction type="item" ids="" />
6635
+		<restriction type="skill" ids="" />
6636
+	</event>
6637
+	
6638
+	<!-- Battlefield -->
6639
+	<event id="14">
6640
+		<property name="minLvl" value="70" />
6641
+		<property name="maxLvl" value="80" />
6642
+		<property name="eventName" value="Battlefield" />
6643
+		<property name="ids" value="14" />
6644
+		<property name="matchTime" value="300" />
6645
+		<property name="rewardId" value="6392" />
6646
+		<property name="rewardAmmount" value="10" />
6647
+		<property name="allowPotions" value="false" />
6648
+		<property name="allowUseMagic" value="true" />
6649
+		<property name="removeBuffs" value="false" />		
6650
+		<property name="minPlayers" value="8" />
6651
+		<property name="numOfBases" value="5" />
6652
+		<property name="baseNpcId" value="9110" />
6653
+		<property name="captureSkillId" value="5219" />
6654
+		<color owner="Blue" r="0" g="0" b="255"/>
6655
+		<color owner="Red" r="255" g="0" b="0"/>
6656
+    <position owner="Blue" x="106679" y="116319" z="-1587" radius="50" />
6657
+    <position owner="Red" x="105914" y="113368" z="-1587" radius="50" />
6658
+		<position owner="Base" x="106037" y="114816" z="-1587" radius="0" />
6659
+		<position owner="Base" x="106995" y="114556" z="-1587" radius="0" />
6660
+		<position owner="Base" x="104823" y="115175" z="-1587" radius="0" />
6661
+		<position owner="Base" x="105752" y="116245" z="-1587" radius="0" />
6662
+		<position owner="Base" x="106907" y="113671" z="-1587" radius="0" />
6663
+		<restriction type="item" ids="" />
6664
+		<restriction type="skill" ids="" />
6665
+	</event>
6666
+</events>
6667
\ No newline at end of file
6668
Index: head-src/com/l2jfrozen/gameserver/event/Lucky.java
6669
===================================================================
6670
--- head-src/com/l2jfrozen/gameserver/event/Lucky.java	(revision 0)
6671
+++ head-src/com/l2jfrozen/gameserver/event/Lucky.java	(revision 0)
6672
@@ -0,0 +1,215 @@
6673
+/*
6674
+ * This program is free software: you can redistribute it and/or modify it under
6675
+ * the terms of the GNU General Public License as published by the Free Software
6676
+ * Foundation, either version 3 of the License, or (at your option) any later
6677
+ * version.
6678
+ *
6679
+ * This program is distributed in the hope that it will be useful, but WITHOUT
6680
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
6681
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
6682
+ * details.
6683
+ *
6684
+ * You should have received a copy of the GNU General Public License along with
6685
+ * this program. If not, see <http://www.gnu.org/licenses/>.
6686
+ */
6687
+package com.l2jfrozen.gameserver.event;
6688
+
6689
+import javolution.text.TextBuilder;
6690
+import javolution.util.FastList;
6691
+
6692
+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
6693
+import com.l2jfrozen.gameserver.model.L2Skill;
6694
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
6695
+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
6696
+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
6697
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
6698
+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
6699
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
6700
+import com.l2jfrozen.util.random.Rnd;
6701
+
6702
+/**
6703
+ * @author Rizel
6704
+ *
6705
+ */
6706
+public class Lucky extends Event
6707
+{
6708
+	private class Core implements Runnable
6709
+	{
6710
+		public void run()
6711
+		{
6712
+			try
6713
+			{
6714
+				switch (eventState)
6715
+				{
6716
+					case START:
6717
+						divideIntoTeams(1);
6718
+						preparePlayers();
6719
+						teleportToTeamPos();
6720
+						forceSitAll();
6721
+						unequip();
6722
+						setStatus(EventState.FIGHT);
6723
+						schedule(30000);
6724
+						break;
6725
+
6726
+					case FIGHT:
6727
+						forceStandAll();
6728
+						int[] coor = getPosition("Chests", 1);
6729
+						for (int i = 0; i < getInt("numberOfChests"); i++)
6730
+							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")));
6731
+						setStatus(EventState.END);
6732
+						clock.startClock(getInt("matchTime"));
6733
+						break;
6734
+
6735
+					case END:
6736
+						clock.setTime(0);
6737
+						unSpawnChests();
6738
+						L2PcInstance winner = getPlayerWithMaxScore();
6739
+						giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
6740
+						setStatus(EventState.INACTIVE);
6741
+						EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " opened chests!");
6742
+						break;
6743
+				}
6744
+			}
6745
+			catch (Throwable e)
6746
+			{
6747
+				e.printStackTrace();
6748
+				EventManager.getInstance().end("Error! Event ended.");
6749
+			}
6750
+		}
6751
+	}
6752
+
6753
+	private enum EventState
6754
+	{
6755
+		START, FIGHT, END, INACTIVE
6756
+	}
6757
+
6758
+	private EventState eventState;
6759
+
6760
+	private Core task;
6761
+
6762
+	private FastList<L2Spawn> chests;
6763
+
6764
+	public Lucky()
6765
+	{
6766
+		super();
6767
+		eventId = 5;
6768
+		createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
6769
+		task = new Core();
6770
+		chests = new FastList<L2Spawn>();
6771
+	}
6772
+
6773
+	/**
6774
+	 * @see net.sf.l2j.gameserver.event.Event#endEvent()
6775
+	 */
6776
+	@Override
6777
+	protected void endEvent()
6778
+	{
6779
+
6780
+		setStatus(EventState.END);
6781
+		clock.setTime(0);
6782
+
6783
+	}
6784
+
6785
+	@Override
6786
+	protected String getScorebar()
6787
+	{
6788
+		return "Max: " + getScore(getPlayerWithMaxScore()) + "  Time: " + clock.getTime() + "";
6789
+	}
6790
+
6791
+	@Override
6792
+	public boolean onTalkNpc(L2NpcInstance npc, L2PcInstance player)
6793
+	{
6794
+		if (npc.getNpcId() != getInt("chestNpcId"))
6795
+			return false;
6796
+
6797
+		if (Rnd.get(3) == 0)
6798
+		{
6799
+			player.sendPacket(new CreatureSay(npc.getObjectId(), 0, "Chest", "BoOoOoMm!"));
6800
+			player.stopAllEffects();
6801
+			player.reduceCurrentHp(player.getMaxHp() + player.getMaxCp() + 1, player);
6802
+			EventStats.getInstance().tempTable.get(player.getObjectId())[2] = EventStats.getInstance().tempTable.get(player.getObjectId())[2] + 1;
6803
+			addToResurrector(player);
6804
+		}
6805
+		else
6806
+		{
6807
+			npc.doDie(npc);
6808
+			player.addItem("Event", 6392, 1, player, true);
6809
+			increasePlayersScore(player);
6810
+		}
6811
+
6812
+		npc.deleteMe();
6813
+		npc.getSpawn().stopRespawn();
6814
+		SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), true);
6815
+		chests.remove(npc.getSpawn());
6816
+
6817
+		if (chests.size() == 0)
6818
+			clock.setTime(0);
6819
+
6820
+		return true;
6821
+	}
6822
+
6823
+	@Override
6824
+	protected void schedule(int time)
6825
+	{
6826
+		tpm.scheduleGeneral(task, time);
6827
+	}
6828
+
6829
+	private void setStatus(EventState s)
6830
+	{
6831
+		eventState = s;
6832
+	}
6833
+	public boolean onUseMagic(L2Skill skill)
6834
+	{
6835
+		return false;
6836
+	}
6837
+
6838
+	@Override
6839
+	protected void showHtml(L2PcInstance player, int obj)
6840
+	{
6841
+		if (players.size() > 0)
6842
+		{
6843
+			NpcHtmlMessage html = new NpcHtmlMessage(obj);
6844
+			TextBuilder sb = new TextBuilder();
6845
+
6846
+			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>");
6847
+			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>");
6848
+			sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
6849
+			sb.append("<br><table width=270>");
6850
+
6851
+			for (L2PcInstance p : getPlayersOfTeam(1))
6852
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
6853
+
6854
+			sb.append("</table></body></html>");
6855
+			html.setHtml(sb.toString());
6856
+			player.sendPacket(html);
6857
+
6858
+		}
6859
+
6860
+	}
6861
+
6862
+	/* (non-Javadoc)
6863
+	 * @see net.sf.l2j.gameserver.event.Event#start()
6864
+	 */
6865
+	@Override
6866
+	protected void start()
6867
+	{
6868
+		setStatus(EventState.START);
6869
+		schedule(1);
6870
+	}
6871
+
6872
+	private void unSpawnChests()
6873
+	{
6874
+		for (L2Spawn s : chests)
6875
+		{
6876
+			s.getLastSpawn().deleteMe();
6877
+			s.stopRespawn();
6878
+			SpawnTable.getInstance().deleteSpawn(s, true);
6879
+			chests.remove(s);
6880
+		}
6881
+	}
6882
+	public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
6883
+	{
6884
+		return false;
6885
+	}
6886
+
6887
+}
6888
\ No newline at end of file
6889
Index: head-src/com/l2jfrozen/gameserver/event/Simon.java
6890
===================================================================
6891
--- head-src/com/l2jfrozen/gameserver/event/Simon.java	(revision 0)
6892
+++ head-src/com/l2jfrozen/gameserver/event/Simon.java	(revision 0)
6893
@@ -0,0 +1,308 @@
6894
+package com.l2jfrozen.gameserver.event;
6895
+
6896
+import javolution.text.TextBuilder;
6897
+
6898
+import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
6899
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
6900
+import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
6901
+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
6902
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
6903
+import com.l2jfrozen.gameserver.network.serverpackets.CreatureSay;
6904
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
6905
+import com.l2jfrozen.util.random.Rnd;
6906
+
6907
+/**
6908
+ * @author Rizel
6909
+ *
6910
+ */
6911
+public class Simon extends Event
6912
+{
6913
+
6914
+	private class Core implements Runnable
6915
+	{
6916
+		public void run()
6917
+		{
6918
+			try
6919
+			{
6920
+				switch (eventState)
6921
+				{
6922
+					case START:
6923
+						divideIntoTeams(1);
6924
+						preparePlayers();
6925
+						teleportToTeamPos();
6926
+						forceSitAll();
6927
+						unequip();
6928
+						setStatus(EventState.SAY);
6929
+						schedule(30000);
6930
+						break;
6931
+
6932
+					case SAY:
6933
+						round++;
6934
+						say = createNewRandomString(getInt("lengthOfFirstWord") + getInt("increasePerRound") * round);
6935
+						sendToPlayers(say.toUpperCase());
6936
+						setStatus(EventState.CHECK);
6937
+						schedule(getInt("roundTime") * 1000);
6938
+						break;
6939
+
6940
+					case CHECK:
6941
+						if (removeAfkers())
6942
+						{
6943
+							setAllToFalse();
6944
+							setStatus(EventState.SAY);
6945
+							schedule(getInt("roundTime") * 1000);
6946
+						}
6947
+						break;
6948
+
6949
+					case END:
6950
+						setStatus(EventState.INACTIVE);
6951
+						forceStandAll();
6952
+
6953
+						if (winner != null)
6954
+						{
6955
+							giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
6956
+							EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event!");
6957
+						}
6958
+						else
6959
+							EventManager.getInstance().end("The match ended in a tie!");
6960
+						break;
6961
+				}
6962
+			}
6963
+			catch (Throwable e)
6964
+			{
6965
+				e.printStackTrace();
6966
+				EventManager.getInstance().end("Error! Event ended.");
6967
+			}
6968
+		}
6969
+	}
6970
+
6971
+	private enum EventState
6972
+	{
6973
+		START, SAY, CHECK, END, INACTIVE
6974
+	}
6975
+
6976
+	private EventState eventState;
6977
+
6978
+	private Core task;
6979
+
6980
+	private int round;
6981
+
6982
+	private String say;
6983
+
6984
+	private L2NpcInstance npc;
6985
+
6986
+	private L2Spawn spawn;
6987
+
6988
+	private CreatureSay message;
6989
+
6990
+	private L2PcInstance winner;
6991
+
6992
+	public Simon()
6993
+	{
6994
+		super();
6995
+		eventId = 6;
6996
+		createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
6997
+		task = new Core();
6998
+		round = 0;
6999
+		spawn = null;
7000
+		npc = null;
7001
+		winner = null;
7002
+	}
7003
+
7004
+	private String createNewRandomString(int size)
7005
+	{
7006
+		String str = "";
7007
+
7008
+		for (int i = 0; i < size; i++)
7009
+			str = str + (char) (Rnd.nextInt(26) + 97);
7010
+
7011
+		return str;
7012
+	}
7013
+
7014
+	@Override
7015
+	protected void endEvent()
7016
+	{
7017
+		winner = players.head().getNext().getKey();
7018
+		setStatus(EventState.END);
7019
+		schedule(1);
7020
+
7021
+	}
7022
+
7023
+	@Override
7024
+	protected String getScorebar()
7025
+	{
7026
+		return "";
7027
+	}
7028
+
7029
+	@Override
7030
+	public void onSay(int type, L2PcInstance player, String text)
7031
+	{
7032
+		if (eventState == EventState.CHECK && getStatus(player) != -1)
7033
+		{
7034
+			if (text.equalsIgnoreCase(say))
7035
+			{
7036
+				setStatus(player, 1);
7037
+				player.sendMessage("Correct!");
7038
+				increasePlayersScore(player);
7039
+				player.getAppearance().setNameColor(0, 255, 0);
7040
+				player.broadcastUserInfo();
7041
+			}
7042
+
7043
+			else
7044
+			{
7045
+				setStatus(player, -1);
7046
+				player.sendMessage("Wrong!");
7047
+				player.getAppearance().setNameColor(255, 0, 0);
7048
+				player.broadcastUserInfo();
7049
+			}
7050
+
7051
+			int falses = 0;
7052
+			L2PcInstance falsed = null;
7053
+			for (L2PcInstance p : getPlayerList())
7054
+				if (getStatus(p) == 0)
7055
+				{
7056
+					falses++;
7057
+					falsed = p;
7058
+				}
7059
+
7060
+			if (falses == 1)
7061
+			{
7062
+				int count = 0;
7063
+				for (L2PcInstance pla : getPlayerList())
7064
+					if (getStatus(pla) == 1)
7065
+						count++;
7066
+
7067
+				if (count >= 1)
7068
+				{
7069
+					falsed.sendMessage("Last one!");
7070
+					falsed.getAppearance().setNameColor(255, 0, 0);
7071
+					falsed.broadcastUserInfo();
7072
+					setStatus(falsed, -1);
7073
+				}
7074
+
7075
+				if (count == 0)
7076
+				{
7077
+					winner = getPlayersWithStatus(0).head().getNext().getValue();
7078
+					setStatus(EventState.END);
7079
+					schedule(1);
7080
+				}
7081
+
7082
+			}
7083
+
7084
+			if (countOfPositiveStatus() == 1)
7085
+			{
7086
+				winner = getPlayersWithStatus(1).head().getNext().getValue();
7087
+				setStatus(EventState.END);
7088
+				schedule(1);
7089
+			}
7090
+
7091
+		}
7092
+
7093
+	}
7094
+
7095
+	private boolean removeAfkers()
7096
+	{
7097
+
7098
+		for (L2PcInstance player : getPlayerList())
7099
+		{
7100
+			if (getStatus(player) == 0)
7101
+			{
7102
+
7103
+				player.sendMessage("Timeout!");
7104
+				player.getAppearance().setNameColor(255, 0, 0);
7105
+				player.broadcastUserInfo();
7106
+				setStatus(player, -1);
7107
+			}
7108
+
7109
+			if (countOfPositiveStatus() == 1)
7110
+			{
7111
+				if (getPlayersWithStatus(1).size() == 1)
7112
+					winner = getPlayersWithStatus(1).head().getNext().getValue();
7113
+				else
7114
+					winner = null;
7115
+
7116
+				setStatus(EventState.END);
7117
+				schedule(1);
7118
+				return false;
7119
+			}
7120
+		}
7121
+		return true;
7122
+	}
7123
+
7124
+	@Override
7125
+	public void reset()
7126
+	{
7127
+		super.reset();
7128
+		round = 0;
7129
+		players.clear();
7130
+		say = "";
7131
+		npc.deleteMe();
7132
+		spawn.stopRespawn();
7133
+		SpawnTable.getInstance().deleteSpawn(spawn, true);
7134
+		npc = null;
7135
+		spawn = null;
7136
+	}
7137
+
7138
+	@Override
7139
+	protected void schedule(int time)
7140
+	{
7141
+		tpm.scheduleGeneral(task, time);
7142
+	}
7143
+
7144
+	private void sendToPlayers(String text)
7145
+	{
7146
+		message = new CreatureSay(npc.getObjectId(), 1, "Simon", text);
7147
+		for (L2PcInstance player : getPlayerList())
7148
+			player.sendPacket(message);
7149
+	}
7150
+
7151
+	private void setAllToFalse()
7152
+	{
7153
+		for (L2PcInstance player : getPlayerList())
7154
+			if (getStatus(player) != -1)
7155
+			{
7156
+				setStatus(player, 0);
7157
+				player.getAppearance().setNameColor(255, 255, 255);
7158
+				player.broadcastUserInfo();
7159
+			}
7160
+	}
7161
+
7162
+	private void setStatus(EventState s)
7163
+	{
7164
+		eventState = s;
7165
+	}
7166
+
7167
+	@Override
7168
+	protected void showHtml(L2PcInstance player, int obj)
7169
+	{
7170
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
7171
+		TextBuilder sb = new TextBuilder();
7172
+
7173
+		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>");
7174
+		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>");
7175
+		sb.append("<table width=270><tr><td><center>Players left: " + getPlayersWithStatus(0).size() + "</td></tr></table>");
7176
+		sb.append("<br><table width=270>");
7177
+
7178
+		for (L2PcInstance p : getPlayersOfTeam(1))
7179
+			sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
7180
+
7181
+		sb.append("</table></body></html>");
7182
+		html.setHtml(sb.toString());
7183
+		player.sendPacket(html);
7184
+	}
7185
+
7186
+	@Override
7187
+	protected void start()
7188
+	{
7189
+		int[] npcpos = getPosition("Simon", 1);
7190
+		spawn = spawnNPC(npcpos[0], npcpos[1], npcpos[2], getInt("simonNpcId"));
7191
+		npc = spawn.getLastSpawn();
7192
+		setStatus(EventState.START);
7193
+		schedule(1);
7194
+	}
7195
+	
7196
+	@Override
7197
+	public boolean onUseItem(L2PcInstance player, L2ItemInstance item)
7198
+	{
7199
+		return false;
7200
+	}
7201
+}
7202
\ No newline at end of file
7203
Index: head-src/com/l2jfrozen/gameserver/model/entity/olympiad/Olympiad.java
7204
===================================================================
7205
--- head-src/com/l2jfrozen/gameserver/model/entity/olympiad/Olympiad.java	(revision 936)
7206
+++ head-src/com/l2jfrozen/gameserver/model/entity/olympiad/Olympiad.java	(working copy)
7207
@@ -47,6 +47,7 @@
7208
 import com.l2jfrozen.Config;
7209
 import com.l2jfrozen.crypt.nProtect;
7210
 import com.l2jfrozen.crypt.nProtect.RestrictionType;
7211
+import com.l2jfrozen.gameserver.event.EventManager;
7212
 import com.l2jfrozen.gameserver.managers.OlympiadStadiaManager;
7213
 import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
7214
 import com.l2jfrozen.gameserver.model.entity.Announcements;
7215
@@ -485,6 +486,12 @@
7216
 			return false;
7217
 		}
7218
 
7219
+        if(EventManager.getInstance().players.contains(noble)) 
7220
+     	{ 
7221
+     		noble.sendMessage("You can't join olympiad while participating on an Event."); 
7222
+     		return false; 
7223
+    	} 
7224
+		
7225
 		if(!noble.isNoble())
7226
 		{
7227
 			sm = new SystemMessage(SystemMessageId.ONLY_NOBLESS_CAN_PARTICIPATE_IN_THE_OLYMPIAD);
7228
@@ -1114,6 +1121,12 @@
7229
 			spectator.sendPacket(new SystemMessage(SystemMessageId.THE_OLYMPIAD_GAME_IS_NOT_CURRENTLY_IN_PROGRESS));
7230
 			return;
7231
 		}
7232
+		
7233
+	    if(EventManager.getInstance().players.contains(spectator)) 
7234
+     	{ 
7235
+     		spectator.sendMessage("You can not observe games while registered for an event!"); 
7236
+     		return; 
7237
+     	} 
7238
 
7239
 		L2PcInstance[] players = _manager.getOlympiadInstance(id).getPlayers();
7240
 
7241
Index: head-src/com/l2jfrozen/gameserver/event/Battlefield.java
7242
===================================================================
7243
--- head-src/com/l2jfrozen/gameserver/event/Battlefield.java	(revision 0)
7244
+++ head-src/com/l2jfrozen/gameserver/event/Battlefield.java	(revision 0)
7245
@@ -0,0 +1,238 @@
7246
+package com.l2jfrozen.gameserver.event;
7247
+
7248
+import java.util.Map;
7249
+
7250
+import javolution.text.TextBuilder;
7251
+import javolution.util.FastMap;
7252
+
7253
+import com.l2jfrozen.gameserver.datatables.SkillTable;
7254
+import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
7255
+import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
7256
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
7257
+import com.l2jfrozen.gameserver.network.serverpackets.NpcInfo;
7258
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
7259
+import com.l2jfrozen.util.random.Rnd;
7260
+
7261
+public class Battlefield extends Event
7262
+{
7263
+	private class Core implements Runnable
7264
+	{
7265
+
7266
+		public void run()
7267
+		{
7268
+			try{
7269
+			switch (eventState)
7270
+			{
7271
+				case START:
7272
+					divideIntoTeams(2);
7273
+					preparePlayers();
7274
+					teleportToTeamPos();
7275
+					createPartyOfTeam(1);
7276
+					createPartyOfTeam(2);
7277
+					forceSitAll();
7278
+					giveSkill();
7279
+					spawnBases();
7280
+					setStatus(EventState.FIGHT);
7281
+					schedule(20000);
7282
+					break;
7283
+
7284
+				case FIGHT:
7285
+					forceStandAll();
7286
+					setStatus(EventState.END);
7287
+					clock.startClock(getInt("matchTime"));
7288
+					break;
7289
+
7290
+				case END:
7291
+					clock.setTime(0);
7292
+					if (winnerTeam == 0)
7293
+						winnerTeam = getWinnerTeam();
7294
+
7295
+					giveReward(getPlayersOfTeam(winnerTeam), getInt("rewardId"), getInt("rewardAmmount"));
7296
+					unspawnBases();
7297
+					removeSkill();
7298
+					setStatus(EventState.INACTIVE);
7299
+					EventManager.getInstance().end("Congratulation! The " + teams.get(winnerTeam).getName() + " team won the event with " + teams.get(winnerTeam).getScore() + " points!");
7300
+					break;
7301
+			}
7302
+			}
7303
+			catch (Throwable e)
7304
+			{
7305
+				e.printStackTrace();
7306
+				EventManager.getInstance().end("Error! Event ended.");
7307
+			}
7308
+		}
7309
+	
7310
+	}
7311
+
7312
+	private enum EventState
7313
+	{
7314
+		START, FIGHT, END, TELEPORT, INACTIVE
7315
+	}
7316
+
7317
+	private EventState eventState;
7318
+
7319
+	private Core task;
7320
+
7321
+	private int winnerTeam;
7322
+	
7323
+	private FastMap<Integer,L2Spawn> bases;
7324
+	
7325
+	private FastMap<Integer,Integer> owners;
7326
+
7327
+	public Battlefield()
7328
+	{
7329
+		super();
7330
+		eventId = 14;
7331
+		createNewTeam(1, "Blue", getColor("Blue"), getPosition("Blue", 1));
7332
+		createNewTeam(2, "Red", getColor("Red"), getPosition("Red", 1));
7333
+		bases = new FastMap<Integer,L2Spawn>();
7334
+		owners = new FastMap<Integer,Integer>();
7335
+		task = new Core();
7336
+		winnerTeam = 0;
7337
+	}
7338
+
7339
+	@Override
7340
+	protected void endEvent()
7341
+	{
7342
+		winnerTeam = players.head().getNext().getValue()[0];
7343
+
7344
+		setStatus(EventState.END);
7345
+		schedule(1);
7346
+	}
7347
+
7348
+	@Override
7349
+	protected String getScorebar()
7350
+	{
7351
+		return "" + teams.get(1).getName() + ": " + teams.get(1).getScore() + "  " + teams.get(2).getName() + ": " + teams.get(2).getScore() + "  Time: " + clock.getTime();
7352
+	}
7353
+
7354
+	@Override
7355
+	protected int getWinnerTeam()
7356
+	{
7357
+		if (teams.get(1).getScore() > teams.get(2).getScore())
7358
+			return 1;
7359
+		if (teams.get(2).getScore() > teams.get(1).getScore())
7360
+			return 2;
7361
+		if (teams.get(1).getScore() == teams.get(2).getScore())
7362
+			if (Rnd.nextInt(1) == 1)
7363
+				return 1;
7364
+			else
7365
+				return 2;
7366
+
7367
+		return 1;
7368
+	}
7369
+
7370
+	@Override
7371
+	public void onDie(L2PcInstance victim, L2PcInstance killer)
7372
+	{
7373
+		super.onDie(victim, killer);
7374
+		addToResurrector(victim);
7375
+	}
7376
+
7377
+	@Override
7378
+	protected void schedule(int time)
7379
+	{
7380
+		tpm.scheduleGeneral(task, time);
7381
+	}
7382
+
7383
+	private void setStatus(EventState s)
7384
+	{
7385
+		eventState = s;
7386
+	}
7387
+
7388
+	@Override
7389
+	protected void showHtml(L2PcInstance player, int obj)
7390
+	{
7391
+		NpcHtmlMessage html = new NpcHtmlMessage(obj);
7392
+		TextBuilder sb = new TextBuilder();
7393
+		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>");
7394
+
7395
+		int i = 0;
7396
+		for (EventTeam team : teams.values())
7397
+		{
7398
+			i++;
7399
+			sb.append("<tr><td><font color=" + team.getHexaColor() + ">" + team.getName() + "</font> team</td><td></td><td></td><td></td></tr>");
7400
+			for (L2PcInstance p : getPlayersOfTeam(i))
7401
+				sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
7402
+		}
7403
+
7404
+		sb.append("</table><br></body></html>");
7405
+		html.setHtml(sb.toString());
7406
+		player.sendPacket(html);
7407
+
7408
+	}
7409
+
7410
+	@Override
7411
+	protected void start()
7412
+	{
7413
+		setStatus(EventState.START);
7414
+		schedule(1);
7415
+	}
7416
+	
7417
+	private void spawnBases()
7418
+	{
7419
+		for(int i = 1; i <= getInt("numOfBases"); i++)
7420
+		{
7421
+			bases.put(i, spawnNPC(getPosition("Base",i)[0],getPosition("Base",i)[1],getPosition("Base",i)[2],getInt("baseNpcId")));
7422
+			bases.get(i).getLastSpawn().setTitle("- Neutral -");
7423
+			owners.put(i, 0);
7424
+		}
7425
+	}
7426
+	
7427
+	private void unspawnBases()
7428
+	{
7429
+		for(L2Spawn base: bases.values())
7430
+			unspawnNPC(base);
7431
+	}
7432
+	
7433
+	@Override
7434
+	public void reset()
7435
+	{
7436
+		super.reset();
7437
+		bases.clear();
7438
+		owners.clear();
7439
+	}
7440
+	
7441
+	@Override
7442
+	protected void clockTick()
7443
+	{
7444
+		for(int owner : owners.values())
7445
+			if(owner != 0)
7446
+				teams.get(owner).increaseScore(1);
7447
+	}
7448
+	
7449
+	@Override
7450
+	public void useCapture(L2PcInstance player, L2NpcInstance base)
7451
+	{
7452
+		if(base.getNpcId() != getInt("baseNpcId"))
7453
+			return;
7454
+		
7455
+		for(Map.Entry<Integer, L2Spawn> baseSpawn: bases.entrySet())
7456
+			if(baseSpawn.getValue().getLastSpawn().getObjectId() == base.getObjectId())
7457
+				{
7458
+					if(owners.get(baseSpawn.getKey()) == getTeam(player))
7459
+						return;
7460
+					
7461
+					owners.getEntry(baseSpawn.getKey()).setValue(getTeam(player));
7462
+					baseSpawn.getValue().getLastSpawn().setTitle("- "+teams.get(getTeam(player)).getName()+" -");
7463
+					for(L2PcInstance p : getPlayerList())
7464
+						p.sendPacket(new NpcInfo(baseSpawn.getValue().getLastSpawn(), p));
7465
+					
7466
+					announce(getPlayerList(),"The "+teams.get(getTeam(player)).getName()+" team captured a base!");
7467
+					increasePlayersScore(player);
7468
+					player.addItem("Event", 6392, 2, player, true);
7469
+				}
7470
+	}
7471
+	
7472
+	private void removeSkill()
7473
+	{
7474
+		for (L2PcInstance player : getPlayerList())
7475
+			player.removeSkill(SkillTable.getInstance().getInfo(getInt("captureSkillId"), 1), false);
7476
+	}
7477
+	
7478
+	private void giveSkill()
7479
+	{
7480
+		for (L2PcInstance player : getPlayerList())
7481
+			player.addSkill(SkillTable.getInstance().getInfo(getInt("captureSkillId"), 1), false);
7482
+	}
7483
+}
7484
\ No newline at end of file
7485
Index: head-src/com/l2jfrozen/gameserver/event/dm.java
7486
===================================================================
7487
--- head-src/com/l2jfrozen/gameserver/event/dm.java	(revision 0)
7488
+++ head-src/com/l2jfrozen/gameserver/event/dm.java	(revision 0)
7489
@@ -0,0 +1,139 @@
7490
+package com.l2jfrozen.gameserver.event;
7491
+
7492
+import javolution.text.TextBuilder;
7493
+
7494
+import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
7495
+import com.l2jfrozen.gameserver.network.serverpackets.NpcHtmlMessage;
7496
+
7497
+public class dm extends Event
7498
+{
7499
+private class Core implements Runnable
7500
+{
7501
+public void run()
7502
+{
7503
+try
7504
+{
7505
+switch (eventState)
7506
+{
7507
+case START:
7508
+divideIntoTeams(1);
7509
+preparePlayers();
7510
+teleportToTeamPos();
7511
+forceSitAll();
7512
+setStatus(EventState.FIGHT);
7513
+debug("The event started with " + players.size() + " player");
7514
+schedule(20000);
7515
+break;
7516
+
7517
+case FIGHT:
7518
+forceStandAll();
7519
+setStatus(EventState.END);
7520
+debug("The fight started");
7521
+clock.startClock(getInt("matchTime"));
7522
+break;
7523
+
7524
+case END:
7525
+clock.setTime(0);
7526
+L2PcInstance winner = getPlayerWithMaxScore();
7527
+giveReward(winner, getInt("rewardId"), getInt("rewardAmmount"));
7528
+setStatus(EventState.INACTIVE);
7529
+debug("The event ended. Winner: " + winner.getName());
7530
+EventManager.getInstance().end("Congratulation! " + winner.getName() + " won the event with " + getScore(winner) + " kills!");
7531
+break;
7532
+}
7533
+}
7534
+catch (Throwable e)
7535
+{
7536
+e.printStackTrace();
7537
+EventManager.getInstance().end("Error! Event ended.");
7538
+}
7539
+}
7540
+}
7541
+
7542
+private enum EventState
7543
+{
7544
+START, FIGHT, END, INACTIVE
7545
+}
7546
+
7547
+private EventState eventState;
7548
+
7549
+private Core task;
7550
+
7551
+public dm()
7552
+{
7553
+super();
7554
+eventId = 1;
7555
+createNewTeam(1, "All", getColor("All"), getPosition("All", 1));
7556
+task = new Core();
7557
+}
7558
+
7559
+@Override
7560
+protected void endEvent()
7561
+{
7562
+setStatus(EventState.END);
7563
+clock.setTime(0);
7564
+
7565
+}
7566
+
7567
+@Override
7568
+protected String getScorebar()
7569
+{
7570
+return "Max: " + getScore(getPlayerWithMaxScore()) + "  Time: " + clock.getTime() + "";
7571
+}
7572
+
7573
+@Override
7574
+public void onDie(L2PcInstance victim, L2PcInstance killer)
7575
+{
7576
+super.onDie(victim, killer);
7577
+addToResurrector(victim);
7578
+}
7579
+
7580
+@Override
7581
+public void onKill(L2PcInstance victim, L2PcInstance killer)
7582
+{
7583
+super.onKill(victim, killer);
7584
+killer.addItem("Event", 6392, 1, killer, true);
7585
+increasePlayersScore(killer);
7586
+}
7587
+
7588
+@Override
7589
+protected void schedule(int time)
7590
+{
7591
+tpm.scheduleGeneral(task, time);
7592
+}
7593
+
7594
+private void setStatus(EventState s)
7595
+{
7596
+eventState = s;
7597
+}
7598
+
7599
+@Override
7600
+protected void showHtml(L2PcInstance player, int obj)
7601
+{
7602
+if (players.size() > 0)
7603
+{
7604
+NpcHtmlMessage html = new NpcHtmlMessage(obj);
7605
+TextBuilder sb = new TextBuilder();
7606
+
7607
+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>");
7608
+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>");
7609
+sb.append("<table width=270><tr><td><center>" + getPlayerWithMaxScore().getName() + " - " + getScore(getPlayerWithMaxScore()) + "</td></tr></table>");
7610
+sb.append("<br><table width=270>");
7611
+
7612
+for (L2PcInstance p : getPlayersOfTeam(1))
7613
+sb.append("<tr><td>" + p.getName() + "</td><td>lvl " + p.getLevel() + "</td><td>" + p.getTemplate().className + "</td><td>" + getScore(p) + "</td></tr>");
7614
+
7615
+sb.append("</table></body></html>");
7616
+html.setHtml(sb.toString());
7617
+player.sendPacket(html);
7618
+}
7619
+}
7620
+
7621
+@Override
7622
+protected void start()
7623
+{
7624
+setStatus(EventState.START);
7625
+schedule(1);
7626
+}
7627
+
7628
+}
7629
\ No newline at end of file