View difference between Paste ID: 6yWLeNMR and hzvqu9S9
SHOW: | | - or go back to the newest paste.
1
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
2
index e682cc6..ab68e75 100644
3
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
4
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
5
@@ -56,6 +56,7 @@
6
 import net.sf.l2j.gameserver.data.xml.FishData;
7
 import net.sf.l2j.gameserver.data.xml.HennaData;
8
 import net.sf.l2j.gameserver.data.xml.HerbDropData;
9
+import net.sf.l2j.gameserver.data.xml.IconData;
10
 import net.sf.l2j.gameserver.data.xml.InstantTeleportData;
11
 import net.sf.l2j.gameserver.data.xml.ItemData;
12
 import net.sf.l2j.gameserver.data.xml.MapRegionData;
13
@@ -273,6 +274,9 @@
14
 		LOGGER.info("Loaded {} target handlers.", TargetHandler.getInstance().size());
15
 		LOGGER.info("Loaded {} user command handlers.", UserCommandHandler.getInstance().size());
16
 		
17
+		StringUtil.printSection("IconData");
18
+		IconData.getInstance();
19
+		
20
 		StringUtil.printSection("System");
21
 		Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
22
 		
23
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/GrandBossManager.java b/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/GrandBossManager.java
24
index 8055a66..6d9fc97 100644
25
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/GrandBossManager.java
26
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/GrandBossManager.java
27
@@ -27,6 +27,7 @@
28
 	private final Map<Integer, GrandBoss> _bosses = new HashMap<>();
29
 	private final Map<Integer, StatSet> _sets = new HashMap<>();
30
 	private final Map<Integer, Integer> _bossStatus = new HashMap<>();
31
+	private final Map<Integer, Long> _trigger = new HashMap<>();
32
 	
33
 	protected GrandBossManager()
34
 	{
35
@@ -98,6 +99,22 @@
36
 		return _bosses.get(bossId);
37
 	}
38
 	
39
+	public long getBossTrigger(int bossId)
40
+	{
41
+		if (_trigger.containsKey(bossId))
42
+			return _trigger.get(bossId);
43
+		return -1;
44
+	}
45
+	
46
+	/**
47
+	 * @param bossId : Set the Grandboss ID
48
+	 * @param time : Insert a value time of triggering.
49
+	 */
50
+	public void setBossTrigger(int bossId, long time)
51
+	{
52
+		_trigger.put(bossId, time);
53
+	}
54
+	
55
 	public StatSet getStatSet(int bossId)
56
 	{
57
 		return _sets.get(bossId);
58
@@ -201,6 +218,7 @@
59
 		_bosses.clear();
60
 		_sets.clear();
61
 		_bossStatus.clear();
62
+		_trigger.clear();
63
 	}
64
 	
65
 	public static GrandBossManager getInstance()
66
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/RaidBossManager.java b/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/RaidBossManager.java
67
index 421a8bf..3ca176c 100644
68
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/RaidBossManager.java
69
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/data/manager/RaidBossManager.java
70
@@ -32,6 +32,7 @@
71
 	private static final String SAVE_RAIDBOSS = "UPDATE raidboss_spawnlist SET currentHP = ?, currentMP = ? WHERE boss_id = ?";
72
 	
73
 	protected final Map<Integer, BossSpawn> _spawns = new HashMap<>();
74
+	public final static Map<Integer, Long> _rTime = new HashMap<>();
75
 	
76
 	public RaidBossManager()
77
 	{
78
@@ -79,6 +80,28 @@
79
 	}
80
 	
81
 	/**
82
+	 * @param id : Insert BossId to get infos about respawnTime.
83
+	 * @return returns -1 if BossID and/or respawnTime isn't mapping.
84
+	 */
85
+	public long getRespawntime(int id)
86
+	{
87
+		if (_rTime.containsKey(id))
88
+			return _rTime.get(id);
89
+		
90
+		return -1;
91
+	}
92
+	
93
+	/**
94
+	 * @param id : Set the ID of Boss.
95
+	 * @param time : Insert a value of long time.
96
+	 * @return If success inserting, the value of time inserts to map.
97
+	 */
98
+	public long setTime(int id, long time)
99
+	{
100
+		return _rTime.put(id, time);
101
+	}
102
+	
103
+	/**
104
 	 * @return a {@link Collection} holding all existing {@link BossSpawn}s.
105
 	 */
106
 	public Collection<BossSpawn> getBossSpawns()
107
@@ -159,6 +182,7 @@
108
 			bs.setCurrentHp(currentHP);
109
 			bs.setCurrentMp(currentMP);
110
 			bs.setRespawnTime(0);
111
+			_rTime.put(id, 0L);
112
 			
113
 			// Time passed by, or we force the database save ; save data on database.
114
 			if (time > respawnTime || forceSave)
115
@@ -192,6 +216,7 @@
116
 			bs.setCurrentHp(0);
117
 			bs.setCurrentMp(0);
118
 			bs.setRespawnTime(respawnTime);
119
+			_rTime.put(id, respawnTime);
120
 		}
121
 		
122
 		// Add the BossSpawn.
123
@@ -214,6 +239,9 @@
124
 		if (bs == null)
125
 			return;
126
 		
127
+		if (_rTime.containsKey(id))
128
+			_rTime.remove(id);
129
+		
130
 		// Make actions related to despawn.
131
 		bs.onDespawn();
132
 		
133
@@ -260,6 +288,7 @@
134
 		
135
 		// Delete spawns entries.
136
 		_spawns.clear();
137
+		_rTime.clear();
138
 	}
139
 	
140
 	public static RaidBossManager getInstance()
141
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/IconData.java b/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/IconData.java
142
new file mode 100644
143
index 0000000..f709bd8
144
--- /dev/null
145
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/IconData.java
146
@@ -0,0 +1,68 @@
147
+package net.sf.l2j.gameserver.data.xml;
148
+
149
+import java.nio.file.Path;
150
+import java.util.HashMap;
151
+import java.util.Map;
152
+
153
+import net.sf.l2j.commons.data.xml.IXmlReader;
154
+
155
+import org.w3c.dom.Document;
156
+
157
+/**
158
+ * @author BaggosPC
159
+ *
160
+ */
161
+public class IconData implements IXmlReader
162
+{
163
+	public static final Map<Integer, String> _iconItem = new HashMap<>();
164
+	
165
+	protected IconData()
166
+	{
167
+		load();
168
+	}
169
+	
170
+	@Override
171
+	public void load()
172
+	{
173
+		parseFile("./data/xml/iconItems.xml");
174
+		LOGGER.info("Loaded {} Icons on items.", _iconItem.size());
175
+	}
176
+	
177
+	@Override
178
+	public void parseDocument(Document doc, Path path)
179
+	{
180
+		try
181
+		{
182
+			forEach(doc, "list", listNode -> forEach(listNode, "icon", iconNode ->
183
+			{
184
+				var set = parseAttributes(iconNode);
185
+				_iconItem.put(set.getInteger("ItemID"), set.getString("Icon"));
186
+			}));
187
+		}
188
+		catch (Exception e)
189
+		{
190
+			LOGGER.info("Error while loading. Make sure your iconItems.xml its correct. The error may be after the "+ _iconItem.size() + " loaded icon(s).");
191
+		}
192
+	}
193
+	
194
+	public void reload()
195
+	{
196
+		_iconItem.clear();
197
+		load();
198
+	}
199
+	
200
+	public static String getIcon(int id)
201
+	{
202
+		return _iconItem.get(id);
203
+	}
204
+	
205
+	public static IconData getInstance()
206
+	{
207
+		return SingletonHolder.INSTANCE;
208
+	}
209
+	
210
+	private static class SingletonHolder
211
+	{
212
+		protected static final IconData INSTANCE = new IconData();
213
+	}
214
+}
215
\ No newline at end of file
216
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/spawn/BossSpawn.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/spawn/BossSpawn.java
217
index f30299a..712e6fd 100644
218
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/model/spawn/BossSpawn.java
219
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/spawn/BossSpawn.java
220
@@ -10,6 +10,7 @@
221
 import net.sf.l2j.commons.pool.ThreadPool;
222
 import net.sf.l2j.commons.random.Rnd;
223
 
224
+import net.sf.l2j.gameserver.data.manager.RaidBossManager;
225
 import net.sf.l2j.gameserver.enums.BossStatus;
226
 import net.sf.l2j.gameserver.model.actor.Npc;
227
 
228
@@ -32,6 +33,7 @@
229
 	private double _currentMp;
230
 	
231
 	private long _respawnTime;
232
+	private long _bossTime;
233
 	
234
 	@Override
235
 	public String toString()
236
@@ -49,6 +51,16 @@
237
 		_spawn = spawn;
238
 	}
239
 	
240
+	public long getBossTime()
241
+	{
242
+		return _bossTime;
243
+	}
244
+
245
+	public void setBossTime(long bossTime)
246
+	{
247
+		_bossTime = bossTime;
248
+	}
249
+	
250
 	public BossStatus getStatus()
251
 	{
252
 		return _status;
253
@@ -136,6 +148,7 @@
254
 		_currentHp = 0;
255
 		_currentMp = 0;
256
 		_respawnTime = respawnTime;
257
+		_bossTime = RaidBossManager.getInstance().setTime(_spawn.getNpcId(), respawnTime);
258
 		
259
 		// Cancel task, if running.
260
 		cancelTask();
261
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/zone/type/BossZone.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/zone/type/BossZone.java
262
index 5e5b7c0..dd6808b 100644
263
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/model/zone/type/BossZone.java
264
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/zone/type/BossZone.java
265
@@ -86,7 +86,7 @@
266
 			player.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true);
267
 			
268
 			// Skip other checks for GM or if no invade time is set.
269
-			if (player.isGM() || _invadeTime == 0)
270
+			if (player.isGM() || _invadeTime == 0 || player.isInObserverMode())
271
 				return;
272
 			
273
 			// Get player object id.
274
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
275
index d8adb02..deec387 100644
276
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
277
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
278
@@ -20,6 +20,7 @@
279
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
280
 import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
281
 import net.sf.l2j.gameserver.scripting.QuestState;
282
+import net.sf.l2j.gameserver.scripting.script.feature.RaidbossInfo;
283
 
284
 public final class RequestBypassToServer extends L2GameClientPacket
285
 {
286
@@ -98,6 +99,16 @@
287
 			html.disableValidation();
288
 			player.sendPacket(html);
289
 		}
290
+		else if (_command.startsWith("droplist"))
291
+		{
292
+			StringTokenizer st = new StringTokenizer(_command, " ");
293
+			st.nextToken();
294
+			
295
+			int npcId = Integer.parseInt(st.nextToken());
296
+			int page = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 1;
297
+
298
+			RaidbossInfo.sendDropInfos(player, npcId, page);
299
+		}
300
 		else if (_command.startsWith("npc_"))
301
 		{
302
 			if (!player.validateBypass(_command))
303
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Antharas.java b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Antharas.java
304
index ad33fc8..2d0a6e8 100644
305
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Antharas.java
306
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Antharas.java
307
@@ -12,6 +12,7 @@
308
 import net.sf.l2j.gameserver.data.manager.GrandBossManager;
309
 import net.sf.l2j.gameserver.data.manager.ZoneManager;
310
 import net.sf.l2j.gameserver.enums.ScriptEventType;
311
+import net.sf.l2j.gameserver.model.World;
312
 import net.sf.l2j.gameserver.model.actor.Creature;
313
 import net.sf.l2j.gameserver.model.actor.Npc;
314
 import net.sf.l2j.gameserver.model.actor.Playable;
315
@@ -143,6 +144,9 @@
316
 				// Drop tasks.
317
 				dropTimers(npc);
318
 				
319
+				// Stop triggering map
320
+				GrandBossManager.getInstance().setBossTrigger(ANTHARAS, 0L);
321
+				
322
 				// Delete current instance of Antharas.
323
 				npc.deleteMe();
324
 				return null;
325
@@ -171,6 +175,9 @@
326
 			// stores current time for inactivity task.
327
 			_timeTracker = System.currentTimeMillis();
328
 			
329
+			// Stop triggering map
330
+			GrandBossManager.getInstance().setBossTrigger(ANTHARAS, 0L);
331
+			World.announceToOnlinePlayers("Grand Monster Antharas is engaged in battle!", true);
332
 			GrandBossManager.getInstance().setBossStatus(ANTHARAS, FIGHTING);
333
 			npc.setInvul(false);
334
 			npc.forceRunStance();
335
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Baium.java b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Baium.java
336
index 0654270..bc54511 100644
337
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Baium.java
338
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Baium.java
339
@@ -14,6 +14,7 @@
340
 import net.sf.l2j.gameserver.data.manager.ZoneManager;
341
 import net.sf.l2j.gameserver.enums.ScriptEventType;
342
 import net.sf.l2j.gameserver.geoengine.GeoEngine;
343
+import net.sf.l2j.gameserver.model.World;
344
 import net.sf.l2j.gameserver.model.actor.Attackable;
345
 import net.sf.l2j.gameserver.model.actor.Creature;
346
 import net.sf.l2j.gameserver.model.actor.Npc;
347
@@ -112,6 +113,7 @@
348
 				_minions.add(angel);
349
 			}
350
 			
351
+			World.announceToOnlinePlayers("Grand Monster Baium is awake and fighting.", true);
352
 			startQuestTimerAtFixedRate("baium_despawn", baium, null, 60000);
353
 			startQuestTimerAtFixedRate("skill_range", baium, null, 2000);
354
 			startQuestTimerAtFixedRate("angels_aggro_reconsider", null, null, 5000);
355
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Valakas.java b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Valakas.java
356
index 03cd98e..7d65abe 100644
357
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Valakas.java
358
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/ai/boss/Valakas.java
359
@@ -8,6 +8,7 @@
360
 import net.sf.l2j.gameserver.data.manager.GrandBossManager;
361
 import net.sf.l2j.gameserver.data.manager.ZoneManager;
362
 import net.sf.l2j.gameserver.enums.ScriptEventType;
363
+import net.sf.l2j.gameserver.model.World;
364
 import net.sf.l2j.gameserver.model.actor.Creature;
365
 import net.sf.l2j.gameserver.model.actor.Npc;
366
 import net.sf.l2j.gameserver.model.actor.Playable;
367
@@ -173,6 +174,9 @@
368
 					cancelQuestTimers("regen_task", npc);
369
 					cancelQuestTimers("skill_task", npc);
370
 					
371
+					// Stop triggering map
372
+					GrandBossManager.getInstance().setBossTrigger(VALAKAS, 0L);
373
+					
374
 					// Delete current instance of Valakas.
375
 					npc.deleteMe();
376
 					
377
@@ -222,9 +226,12 @@
378
 			VALAKAS_LAIR.broadcastPacket(new SpecialCamera(npc.getObjectId(), 750, 170, -10, 3400, 4000, 10, -15, 1, 0));
379
 		else if (name.equalsIgnoreCase("spawn_10"))
380
 		{
381
+			// Stop triggering map
382
+			GrandBossManager.getInstance().setBossTrigger(VALAKAS, 0L);
383
+			
384
 			GrandBossManager.getInstance().setBossStatus(VALAKAS, FIGHTING);
385
 			npc.setInvul(false);
386
-			
387
+			World.announceToOnlinePlayers("Grand Monster Valakas is engaged in battle!", true);
388
 			startQuestTimerAtFixedRate("regen_task", npc, null, 60000);
389
 			startQuestTimerAtFixedRate("skill_task", npc, null, 2000);
390
 		}
391
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/feature/GrandbossInfo.java b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/feature/GrandbossInfo.java
392
new file mode 100644
393
index 0000000..63ee4aa
394
--- /dev/null
395
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/feature/GrandbossInfo.java
396
@@ -0,0 +1,195 @@
397
+package net.sf.l2j.gameserver.scripting.script.feature;
398
+
399
+import java.text.SimpleDateFormat;
400
+import java.util.StringTokenizer;
401
+
402
+import net.sf.l2j.commons.lang.StringUtil;
403
+import net.sf.l2j.commons.logging.CLogger;
404
+
405
+import net.sf.l2j.gameserver.data.manager.GrandBossManager;
406
+import net.sf.l2j.gameserver.data.xml.NpcData;
407
+import net.sf.l2j.gameserver.model.actor.Npc;
408
+import net.sf.l2j.gameserver.model.actor.Player;
409
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
410
+import net.sf.l2j.gameserver.scripting.Quest;
411
+
412
+/**
413
+ * @author BaggosPC
414
+ *
415
+ */
416
+public class GrandbossInfo extends Quest
417
+{
418
+	protected static final CLogger LOGGER = new CLogger(GrandbossInfo.class.getName());
419
+	
420
+	private static final int[] NPCs =
421
+	{
422
+		31729,
423
+		31730,
424
+		31731,
425
+		31732,
426
+		31733,
427
+		31734,
428
+		31735,
429
+		31736,
430
+		31737,
431
+		31738,
432
+		31775,
433
+		31776,
434
+		31777,
435
+		31778,
436
+		31779,
437
+		31780,
438
+		31781,
439
+		31782,
440
+		31783,
441
+		31784,
442
+		31785,
443
+		31786,
444
+		31787,
445
+		31788,
446
+		31789,
447
+		31790,
448
+		31791,
449
+		31792,
450
+		31793,
451
+		31794,
452
+		31795,
453
+		31796,
454
+		31797,
455
+		31798,
456
+		31799,
457
+		31800,
458
+		31801,
459
+		31802,
460
+		31803,
461
+		31804,
462
+		31805,
463
+		31806,
464
+		31807,
465
+		31808,
466
+		31809,
467
+		31810,
468
+		31811,
469
+		31812,
470
+		31813,
471
+		31814,
472
+		31815,
473
+		31816,
474
+		31817,
475
+		31818,
476
+		31819,
477
+		31820,
478
+		31821,
479
+		31822,
480
+		31823,
481
+		31824,
482
+		31825,
483
+		31826,
484
+		31827,
485
+		31828,
486
+		31829,
487
+		31830,
488
+		31831,
489
+		31832,
490
+		31833,
491
+		31834,
492
+		31835,
493
+		31836,
494
+		31837,
495
+		31838,
496
+		31839,
497
+		31840,
498
+		31841,
499
+	};
500
+	
501
+	public GrandbossInfo()
502
+	{
503
+		super(-1, "feature");
504
+		
505
+		addTalkId(NPCs);
506
+	}
507
+	
508
+	@Override
509
+	public String onAdvEvent(String event, Npc npc, Player cha)
510
+	{
511
+		// Location of Grandboss to Observe the battle.
512
+		if (event.equalsIgnoreCase("antharas"))
513
+			cha.enterObserverMode(178040, 115048, -7704);
514
+		else if (event.equalsIgnoreCase("valakas"))
515
+			cha.enterObserverMode(212808, -114152, -1632);
516
+		
517
+		if (!StringUtil.isDigit(event))
518
+			return event;
519
+
520
+		var filename = "data/html/script/feature/GrandbossInfo/" + npc.getNpcId() + ".htm";
521
+		var grandId = Integer.parseInt(event);
522
+		var BossStatus = GrandBossManager.getInstance().getBossStatus(grandId);
523
+		var npcData = NpcData.getInstance().getTemplate(grandId);
524
+		var trigger = GrandBossManager.getInstance().getBossTrigger(grandId);
525
+		
526
+		switch (BossStatus)
527
+		{
528
+			case 0:
529
+				var str = new StringTokenizer(event, " ");
530
+				str.nextToken();
531
+				var page = str.hasMoreTokens() ? Integer.parseInt(str.nextToken()) : 1;
532
+
533
+				RaidbossInfo.sendDropInfos(cha, grandId, page);
534
+		}
535
+		switch (npcData.getNpcId())
536
+		{
537
+			case 29006:
538
+			case 29014:
539
+			case 29001:
540
+			case 29022: // Case of Queen/Core/Orfen/Zaken
541
+				if (BossStatus == 1)
542
+					sendHTM(cha, npc, grandId);
543
+				break;
544
+			case 29020: // Case of Baium
545
+				if (BossStatus == 2)
546
+					sendHTM(cha, npc, grandId);
547
+				break;
548
+			case 29019:
549
+			case 29028: // Case of Antharas/Valakas
550
+				var htm = new NpcHtmlMessage(0);
551
+				switch (BossStatus)
552
+				{
553
+					case 1:
554
+						filename = "data/html/script/feature/GrandbossInfo/trigger.htm";
555
+						htm.setFile(filename);
556
+						htm.replace("%trigger%", "<font color=\"FF9900\">" + new SimpleDateFormat("HH:mm").format(trigger) + ".</font>");
557
+						cha.sendPacket(htm);
558
+						break;
559
+					case 2:
560
+						filename = "data/html/script/feature/GrandbossInfo/watch.htm";
561
+						htm.setFile(filename);
562
+						cha.sendPacket(htm);
563
+						break;
564
+					case 3:
565
+						sendHTM(cha, npc, grandId);
566
+						break;
567
+				}
568
+				break;
569
+		}
570
+		return null;
571
+	}
572
+	
573
+	private static void sendHTM(Player cha, Npc npc, int id)
574
+	{
575
+		var npcData = NpcData.getInstance().getTemplate(id);
576
+		var info = GrandBossManager.getInstance().getStatSet(id);
577
+		var temp = info.getLong("respawn_time");
578
+		var htm = new NpcHtmlMessage(0);
579
+		
580
+		htm.setFile("data/html/script/feature/GrandbossInfo/dead.htm");
581
+		htm.replace("%name%", npcData.getName());
582
+		htm.replace("%refresh%", "<font color=\"FF9900\">" + new SimpleDateFormat("dd-MM-yyyy HH:mm").format(temp) + ".</font>");
583
+		cha.sendPacket(htm);
584
+	}
585
+	
586
+	@Override
587
+	public String onTalk(Npc npc, Player player)
588
+	{
589
+		return "info.htm";
590
+	}
591
+}
592
\ No newline at end of file
593
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/feature/RaidbossInfo.java b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/feature/RaidbossInfo.java
594
index d960e08..b562fdf 100644
595
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/feature/RaidbossInfo.java
596
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/feature/RaidbossInfo.java
597
@@ -1,15 +1,27 @@
598
 package net.sf.l2j.gameserver.scripting.script.feature;
599
 
600
+import java.text.DecimalFormat;
601
+import java.text.SimpleDateFormat;
602
 import java.util.HashMap;
603
+import java.util.List;
604
 import java.util.Map;
605
+import java.util.StringTokenizer;
606
 
607
 import net.sf.l2j.commons.lang.StringUtil;
608
+import net.sf.l2j.commons.math.MathUtil;
609
 
610
+import net.sf.l2j.Config;
611
+import net.sf.l2j.gameserver.data.manager.RaidBossManager;
612
 import net.sf.l2j.gameserver.data.sql.SpawnTable;
613
+import net.sf.l2j.gameserver.data.xml.IconData;
614
+import net.sf.l2j.gameserver.data.xml.ItemData;
615
+import net.sf.l2j.gameserver.data.xml.NpcData;
616
 import net.sf.l2j.gameserver.model.actor.Npc;
617
 import net.sf.l2j.gameserver.model.actor.Player;
618
+import net.sf.l2j.gameserver.model.item.DropData;
619
 import net.sf.l2j.gameserver.model.location.Location;
620
 import net.sf.l2j.gameserver.model.spawn.Spawn;
621
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
622
 import net.sf.l2j.gameserver.scripting.Quest;
623
 
624
 public class RaidbossInfo extends Quest
625
@@ -119,13 +131,113 @@
626
 		if (!StringUtil.isDigit(event))
627
 			return event;
628
 		
629
-		final Location loc = RADARS.get(Integer.parseInt(event));
630
-		if (loc != null)
631
-			player.getRadarList().addMarker(loc);
632
+		var rbid = Integer.parseInt(event);
633
+		var filename = "data/html/script/feature/RaidbossInfo/" + npc.getNpcId() + ".htm";
634
+		var npcData = NpcData.getInstance().getTemplate(rbid);
635
+		var boss = RaidBossManager.getInstance().getBossSpawn(rbid);
636
+		var time = RaidBossManager.getInstance().getRespawntime(rbid);
637
+		var htm = new NpcHtmlMessage(0);
638
 		
639
+		// filename = ((boss.getStatus() == BossStatus.ALIVE) ? "data/html/scripts/custom/RaidbossInfo/alive.htm" : "data/html/scripts/custom/RaidbossInfo/dead.htm");
640
+		switch (boss.getStatus())
641
+		{
642
+			case ALIVE:
643
+				var loc = RADARS.get(Integer.parseInt(event));
644
+				if (loc != null)
645
+					player.getRadarList().addMarker(loc);
646
+
647
+
648
+				var str = new StringTokenizer(event, " ");
649
+				str.nextToken();
650
+				var page = str.hasMoreTokens() ? Integer.parseInt(str.nextToken()) : 1;
651
+				
652
+				sendDropInfos(player, rbid, page);
653
+				break;
654
+			case DEAD:
655
+				filename = "data/html/script/feature/RaidbossInfo/dead.htm";
656
+				htm.setFile(filename);
657
+				htm.replace("%name%", npcData.getName());
658
+				htm.replace("%refresh%", "<font color=\"FF9900\">" + new SimpleDateFormat("dd-MM-yyyy HH:mm").format(time) + ".</font>");
659
+				player.sendPacket(htm);
660
+				break;
661
+		}
662
 		return null;
663
 	}
664
 	
665
+	public static void sendDropInfos(Player player, int npcId, int page)
666
+	{
667
+		var npcData = NpcData.getInstance().getTemplate(npcId);
668
+		List<DropData> list = npcData.getAllDropData();
669
+		var PAGE_LIMIT = 7;
670
+		
671
+		if (list.isEmpty())
672
+		{
673
+			player.sendMessage("Boss " + npcData.getName() + " has no drop.");
674
+			return;
675
+		}
676
+		
677
+		var max = MathUtil.countPagesNumber(list.size(), PAGE_LIMIT);
678
+		if (page > max)
679
+			page = max;
680
+		
681
+		list = list.subList((page - 1) * PAGE_LIMIT, Math.min(page * PAGE_LIMIT, list.size()));
682
+		
683
+		var sb = new StringBuilder(2000);
684
+		StringUtil.append(sb, "<html><title>Boss ", npcData.getName(), "</title><body><center><font color=\"LEVEL\">Boss Monster ", npcData.getName(), " is alive!</font></center><br>");
685
+		
686
+		var row = 0;
687
+		for (DropData drop : list)
688
+		{
689
+			sb.append(((row % 2) == 0 ? "<table width=\"280\" bgcolor=\"000000\"><tr>" : "<table width=\"280\"><tr>"));
690
+			
691
+			var chance = Math.min(100, (((drop.getItemId() == 57) ? drop.getChance() * Config.RATE_DROP_ADENA : drop.getChance() * Config.RATE_DROP_ITEMS_BY_RAID) / 10000));
692
+			var item = ItemData.getInstance().getTemplate(drop.getItemId());
693
+			
694
+			String format;
695
+			if (chance <= 0.001 || chance <= 0.01)
696
+			{
697
+				var df = new DecimalFormat(chance <= 0.001 ? "#.####" : "#.###");
698
+				format = df.format(chance);
699
+			}
700
+			else
701
+			{
702
+				var df = new DecimalFormat("##.##");
703
+				format = df.format(chance);
704
+			}
705
+			
706
+			String name = item.getName();
707
+			if (name.length() >= 45)
708
+				name = name.substring(0, 42) + "...";
709
+			
710
+			StringUtil.append(sb, "<td width=44 height=41 align=center><table bgcolor=" + ("3BB9FF") + " cellpadding=6 cellspacing=\"-5\"><tr><td><button width=32 height=32 back=" + IconData.getIcon(drop.getItemId()) + " fore=" + IconData.getIcon(drop.getItemId()) + "></td></tr></table></td>");
711
+			StringUtil.append(sb, "<td width=246 height=34>", name, "<br1><font color=B09878>", "Drop", ": ", format, "% Min: ", drop.getMinDrop(), " Max: ", drop.getMaxDrop(), "</font></td>");
712
+			
713
+			sb.append("</tr></table><img src=\"L2UI.SquareGray\" width=277 height=1>");
714
+			row++;
715
+		}
716
+		
717
+		// Build page footer.
718
+		sb.append("<br><img src=\"L2UI.SquareGray\" width=277 height=1><table width=\"100%\" bgcolor=000000><tr>");
719
+		
720
+		if (page > 1)
721
+			StringUtil.append(sb, "<td align=left width=70><a action=\"bypass droplist ", npcId, " ", page - 1, "\">Previous</a></td>");
722
+		else
723
+			StringUtil.append(sb, "<td align=left width=70>Previous</td>");
724
+		
725
+		StringUtil.append(sb, "<td align=center width=100>Page ", page, "</td>");
726
+		
727
+		if (page < max)
728
+			StringUtil.append(sb, "<td align=right width=70><a action=\"bypass droplist ", npcId, " ", page + 1, "\">Next</a></td>");
729
+		else
730
+			StringUtil.append(sb, "<td align=right width=70>Next</td>");
731
+		
732
+		sb.append("</tr></table><img src=\"L2UI.SquareGray\" width=277 height=1>");
733
+		sb.append("</body></html>");
734
+		var html = new NpcHtmlMessage(0);
735
+		html.setHtml(sb.toString());
736
+		player.sendPacket(html);
737
+	}
738
+	
739
 	@Override
740
 	public String onTalk(Npc npc, Player player)
741
 	{
742
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java
743
index cee8e32..60f7da2 100644
744
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java
745
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/scripting/script/teleport/GrandBossTeleporter.java
746
@@ -161,6 +161,10 @@
747
 						
748
 						if (status == Antharas.DORMANT)
749
 						{
750
+							var trigger = Config.WAIT_TIME_ANTHARAS;
751
+							var Time = System.currentTimeMillis() + (trigger);
752
+							
753
+							GrandBossManager.getInstance().setBossTrigger(Antharas.ANTHARAS, Time);
754
 							GrandBossManager.getInstance().setBossStatus(Antharas.ANTHARAS, Antharas.WAITING);
755
 							ScriptData.getInstance().getQuest("Antharas").startQuestTimer("beginning", null, null, Config.WAIT_TIME_ANTHARAS);
756
 						}
757
@@ -191,6 +195,10 @@
758
 						
759
 						if (status == Valakas.DORMANT)
760
 						{
761
+							var trigger = Config.WAIT_TIME_ANTHARAS;
762
+							var Time = System.currentTimeMillis() + (trigger);
763
+							
764
+							GrandBossManager.getInstance().setBossTrigger(Valakas.VALAKAS, Time);
765
 							GrandBossManager.getInstance().setBossStatus(Valakas.VALAKAS, Valakas.WAITING);
766
 							ScriptData.getInstance().getQuest("Valakas").startQuestTimer("beginning", null, null, Config.WAIT_TIME_VALAKAS);
767
 						}
768
diff --git a/aCis_datapack/data/html/adventurer_guildsman/31805.htm b/aCis_datapack/data/html/adventurer_guildsman/31805.htm
769
index b3f851f..d997037 100644
770
--- a/aCis_datapack/data/html/adventurer_guildsman/31805.htm
771
+++ b/aCis_datapack/data/html/adventurer_guildsman/31805.htm
772
@@ -1,8 +1,11 @@
773
-<html><body>Adventure Guildsman:<br>
774
+<html>
775
+<title>Adventure Guildsman</title>
776
+<body>Adventure Guildsman:<br>
777
 The world is a dark and scary place, my friend! If everyone would only follow the teachings of Eve and Einhasad, this chaos would finally end!<br>
778
 What's needed is brave warrior like you stand up for the down-trodden, to restore peace and justice to the world! are you up to the task?<br>
779
 <a action="bypass -h npc_%objectId%_questlist">Quest Information</a><br>
780
-<a action="bypass -h npc_%objectId%_Quest RaidbossInfo">Raid Monster Information</a><br>
781
+<a action="bypass -h npc_%objectId%_Quest RaidbossInfo">Boss Monster Information</a><br>
782
+<a action="bypass -h npc_%objectId%_Quest GrandbossInfo">Grand Monster Information</a><br>
783
 <a action="bypass -h npc_%objectId%_Chat 1">Use Life Crystals</a><br>
784
 <a action="bypass -h npc_%objectId%_Quest">Quest</a>
785
 </body></html>
786
diff --git a/aCis_datapack/data/html/script/feature/GrandbossInfo/dead.htm b/aCis_datapack/data/html/script/feature/GrandbossInfo/dead.htm
787
new file mode 100644
788
index 0000000..66306e2
789
--- /dev/null
790
+++ b/aCis_datapack/data/html/script/feature/GrandbossInfo/dead.htm
791
@@ -0,0 +1,6 @@
792
+<html>
793
+<title>Boss Manager</title>
794
+<body>
795
+Hello Traveler,<br>
796
+Raidboss %name% is dead! Next respawn at: %refresh%<br>
797
+</body></html>
798
\ No newline at end of file
799
diff --git a/aCis_datapack/data/html/script/feature/GrandbossInfo/info.htm b/aCis_datapack/data/html/script/feature/GrandbossInfo/info.htm
800
new file mode 100644
801
index 0000000..2837e67
802
--- /dev/null
803
+++ b/aCis_datapack/data/html/script/feature/GrandbossInfo/info.htm
804
@@ -0,0 +1,12 @@
805
+<html>
806
+<title>Boss Manager</title>
807
+<body>Grandbosses Information:<br>
808
+<a action="bypass -h Quest GrandbossInfo 29001">Queent Ant (lv40)</a><br>
809
+<a action="bypass -h Quest GrandbossInfo 29006">Core (lv50)</a><br>
810
+<a action="bypass -h Quest GrandbossInfo 29014">Orfen (lv50)</a><br>
811
+<a action="bypass -h Quest GrandbossInfo 29022">Zaken (lv60)</a><br>
812
+<a action="bypass -h Quest GrandbossInfo 29020">Baium (lv78)</a><br>
813
+<a action="bypass -h Quest GrandbossInfo 29019">Antharas (lv79)</a><br>
814
+<a action="bypass -h Quest GrandbossInfo 29047">Scarlet van Halisha (lv80)</a><br>
815
+<a action="bypass -h Quest GrandbossInfo 29028">Valakas (lv85)</a><br>
816
+</body></html>
817
diff --git a/aCis_datapack/data/html/script/feature/GrandbossInfo/trigger.htm b/aCis_datapack/data/html/script/feature/GrandbossInfo/trigger.htm
818
new file mode 100644
819
index 0000000..5fdcb84
820
--- /dev/null
821
+++ b/aCis_datapack/data/html/script/feature/GrandbossInfo/trigger.htm
822
@@ -0,0 +1,8 @@
823
+<html>
824
+<title>Boss Manager</title>
825
+<body>
826
+Hello Traveler, you came at the right time!<br>
827
+Someone has entered, Grandboss its about to spawn soon!<br>
828
+Entry closes at %trigger% 
829
+<br>When the battle begin, you will be able to watch the players killing the Grandboss.
830
+</body></html>
831
\ No newline at end of file
832
diff --git a/aCis_datapack/data/html/script/feature/GrandbossInfo/watch.htm b/aCis_datapack/data/html/script/feature/GrandbossInfo/watch.htm
833
new file mode 100644
834
index 0000000..71c0af2
835
--- /dev/null
836
+++ b/aCis_datapack/data/html/script/feature/GrandbossInfo/watch.htm
837
@@ -0,0 +1,7 @@
838
+<html>
839
+<title>Boss Manager</title>
840
+<body>
841
+Hello Traveler,<br>
842
+The Grandboss is engaged in battle! You can now watch other players killing it.<br>
843
+<a action="bypass -h Quest GrandbossInfo antharas">Watch the battle.</a><br>
844
+</body></html>
845
\ No newline at end of file
846
diff --git a/aCis_datapack/data/html/script/feature/RaidbossInfo/dead.htm b/aCis_datapack/data/html/script/feature/RaidbossInfo/dead.htm
847
new file mode 100644
848
index 0000000..66306e2
849
--- /dev/null
850
+++ b/aCis_datapack/data/html/script/feature/RaidbossInfo/dead.htm
851
@@ -0,0 +1,6 @@
852
+<html>
853
+<title>Boss Manager</title>
854
+<body>
855
+Hello Traveler,<br>
856
+Raidboss %name% is dead! Next respawn at: %refresh%<br>
857
+</body></html>
858
\ No newline at end of file
859
diff --git a/aCis_datapack/data/html/script/feature/RaidbossInfo/info.htm b/aCis_datapack/data/html/script/feature/RaidbossInfo/info.htm
860
index d923869..f785131 100644
861
--- a/aCis_datapack/data/html/script/feature/RaidbossInfo/info.htm
862
+++ b/aCis_datapack/data/html/script/feature/RaidbossInfo/info.htm
863
@@ -1,9 +1,11 @@
864
-<html><body>Raid Monster Information:<br>
865
+<html>
866
+<title>Boss Manager</title>
867
+<body>Raid Monster Information:<br>
868
 <a action="bypass -h Quest RaidbossInfo level20.htm">Level 20 Raid Monsters</a><br>
869
 <a action="bypass -h Quest RaidbossInfo level30.htm">Level 30 Raid Monsters</a><br>
870
 <a action="bypass -h Quest RaidbossInfo level40.htm">Level 40 Raid Monsters</a><br>
871
 <a action="bypass -h Quest RaidbossInfo level50.htm">Level 50 Raid Monsters</a><br>
872
 <a action="bypass -h Quest RaidbossInfo level60.htm">Level 60 Raid Monsters</a><br>
873
 <a action="bypass -h Quest RaidbossInfo level70.htm">Level 70 Raid Monsters</a><br>
874
-<a action="bypass -h Quest RaidbossInfo level80.htm">Level 80 Raid Monsters</a>
875
+<a action="bypass -h Quest RaidbossInfo level80.htm">Level 80 Raid Monsters</a><br>
876
 </body></html>
877
\ No newline at end of file
878
diff --git a/aCis_datapack/data/xml/scripts.xml b/aCis_datapack/data/xml/scripts.xml
879
index 3e38b21..a24ef1a 100644
880
--- a/aCis_datapack/data/xml/scripts.xml
881
+++ b/aCis_datapack/data/xml/scripts.xml
882
@@ -402,6 +402,7 @@
883
 	<script path="script.feature.Clan"/>
884
 	<script path="script.feature.EchoCrystal"/>
885
 	<script path="script.feature.FirstClassChange"/>
886
+	<script path="script.feature.GrandbossInfo"/>
887
 	<script path="script.feature.HeroCirclet"/>
888
 	<script path="script.feature.HeroWeapon"/>
889
 	<script path="script.feature.KetraOrcSupport"/>
890