### Eclipse Workspace Patch 1.0
#P aCis_datapack
Index: data/xml/npcs/50000-50999.xml
===================================================================
--- data/xml/npcs/50000-50999.xml (revision 6)
+++ data/xml/npcs/50000-50999.xml (working copy)
@@ -1,5 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<list>
+ <npc id="50001" idTemplate="25449" name="BOSS STATUS" title="L2EURO">
+ <set name="level" val="80"/>
+ <set name="radius" val="15"/>
+ <set name="height" val="28"/>
+ <set name="rHand" val="0"/>
+ <set name="lHand" val="0"/>
+ <set name="type" val="L2RaidBossStatus"/>
+ <set name="exp" val="0"/>
+ <set name="sp" val="0"/>
+ <set name="hp" val="5000"/>
+ <set name="mp" val="2500"/>
+ <set name="hpRegen" val="8"/>
+ <set name="mpRegen" val="8"/>
+ <set name="pAtk" val="100"/>
+ <set name="pDef" val="100"/>
+ <set name="mAtk" val="100"/>
+ <set name="mDef" val="100"/>
+ <set name="crit" val="4"/>
+ <set name="atkSpd" val="253"/>
+ <set name="str" val="40"/>
+ <set name="int" val="21"/>
+ <set name="dex" val="30"/>
+ <set name="wit" val="20"/>
+ <set name="con" val="43"/>
+ <set name="men" val="20"/>
+ <set name="corpseTime" val="7"/>
+ <set name="walkSpd" val="50"/>
+ <set name="runSpd" val="120"/>
+ <set name="dropHerbGroup" val="0"/>
+ <set name="attackRange" val="40"/>
+ <ai type="default" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" canMove="false" seedable="false"/>
+ </npc>
+
<npc id="50006" idTemplate="31228" name="Roy the Cat" title="Class Manager">
<set name="level" val="70"/>
<set name="radius" val="9"/>
Index: data/html/mods/RaidBossStatus/50001.htm
===================================================================
--- data/html/mods/RaidBossStatus/50001.htm (revision 0)
+++ data/html/mods/RaidBossStatus/50001.htm (working copy)
@@ -0,0 +1,21 @@
+<html><title>BOSS STATUS</title><body>
+<br><table width=300><tr><td align=center>
+<img src="L2UI_CH3.herotower_deco" width=256 height=32>
+
+<br><br><br><br>
+<font color=a2a0a2>ancient scrolls reveals truth of their return
+<br1>defeat was merely delay ...</font>
+</td></tr></table>
+
+<br>
+<img src=L2UI.SquareGray width=300 height=1>
+<table width=300 height=27 bgcolor="000000">
+ <tr>
+ <td align=center width=300>%mboss%</td>
+ </tr>
+</table>
+<img src=L2UI.SquareGray width=300 height=1>
+
+<br>
+<center>%bosslist%</center>
+</body></html>
\ No newline at end of file
#P aCis_gameserver
Index: java/net/sf/l2j/gameserver/instancemanager/RaidBossSpawnManager.java
===================================================================
--- java/net/sf/l2j/gameserver/instancemanager/RaidBossSpawnManager.java (revision 9)
+++ java/net/sf/l2j/gameserver/instancemanager/RaidBossSpawnManager.java (working copy)
@@ -45,6 +45,7 @@
protected final static Map<Integer, L2RaidBossInstance> _bosses = new HashMap<>();
protected final static Map<Integer, L2Spawn> _spawns = new HashMap<>();
+ protected final static Map<Integer, Long> _respawns = new HashMap<>();
protected final static Map<Integer, StatsSet> _storedInfo = new HashMap<>();
protected final static Map<Integer, ScheduledFuture<?>> _schedules = new HashMap<>();
@@ -142,6 +143,7 @@
_log.info("RaidBoss: " + raidboss.getName() + " has spawned.");
_bosses.put(bossId, raidboss);
+ _respawns.put(bossId,0L);
}
_schedules.remove(bossId);
@@ -148,6 +150,14 @@
}
}
+ public long getRespawntime(int id)
+ {
+ if(_respawns.containsKey(id))
+ return _respawns.get(id);
+
+ return -1;
+ }
+
public void updateStatus(L2RaidBossInstance boss, boolean isBossDead)
{
if (!_storedInfo.containsKey(boss.getNpcId()))
@@ -171,6 +181,7 @@
{
_log.info("RaidBoss: " + boss.getName() + " - " + StringUtil.DATE_MM.format(respawnTime) + " (" + respawnDelay + "h).");
+ _respawns.put(boss.getNpcId(), Calendar.getInstance().getTimeInMillis() + (respawnDelay * 3600000L));
_schedules.put(boss.getNpcId(), ThreadPoolManager.getInstance().scheduleGeneral(new spawnSchedule(boss.getNpcId()), respawnDelay * 3600000));
updateDb();
}
@@ -179,6 +190,8 @@
{
boss.setRaidStatus(StatusEnum.ALIVE);
+ _respawns.put(boss.getNpcId(), 0L);
+
info.set("currentHP", boss.getCurrentHp());
info.set("currentMP", boss.getCurrentMp());
info.set("respawnTime", 0L);
@@ -226,11 +239,13 @@
info.set("respawnTime", 0L);
_storedInfo.put(bossId, info);
+ _respawns.put(bossId, 0L);
}
}
else
{
long spawnTime = respawnTime - Calendar.getInstance().getTimeInMillis();
+ _respawns.put(bossId,respawnTime);
_schedules.put(bossId, ThreadPoolManager.getInstance().scheduleGeneral(new spawnSchedule(bossId), spawnTime));
}
@@ -272,6 +287,9 @@
SpawnTable.getInstance().deleteSpawn(spawnDat, false);
_spawns.remove(bossId);
+ if (_respawns.containsKey(bossId))
+ _respawns.remove(bossId);
+
if (_bosses.containsKey(bossId))
_bosses.remove(bossId);
@@ -412,6 +430,7 @@
_schedules.clear();
}
+ _respawns.clear();
_storedInfo.clear();
_spawns.clear();
}
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossStatusInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossStatusInstance.java (revision 0)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2RaidBossStatusInstance.java (working copy)
@@ -0,0 +1,126 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+package net.sf.l2j.gameserver.model.actor.instance;
+
+import java.util.Calendar;
+import net.sf.l2j.gameserver.cache.HtmCache;
+import net.sf.l2j.gameserver.datatables.NpcTable;
+import net.sf.l2j.gameserver.instancemanager.RaidBossSpawnManager;
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
+
+public class L2RaidBossStatusInstance extends L2NpcInstance
+{
+ private static final int[] RBOSSES = {25418,25434,25126};
+ private static int MBOSS = 25126;
+
+ public L2RaidBossStatusInstance(int objectId, NpcTemplate template)
+ {
+ super(objectId, template);
+ }
+
+ @Override
+ public void showChatWindow(L2PcInstance player)
+ {
+ generateFirstWindow(player);
+ }
+
+ private void generateFirstWindow(L2PcInstance activeChar)
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ for(int rboss : RBOSSES)
+ {
+
+ long delay = RaidBossSpawnManager.getInstance().getRespawntime(rboss);
+ String name = NpcTable.getInstance().getTemplate(rboss).getName().toUpperCase();
+
+ if (delay==0)
+ {
+ sb.append("<font color=\"b09979\">"+name +" IS ALIVE!</font><br1>");
+ }
+ else if (delay<0)
+ {
+ sb.append("<font color=\"FF0000\"> "+name +" IS DEAD.</font><br1>");
+ }
+ else
+ {
+ delay = RaidBossSpawnManager.getInstance().getRespawntime(rboss) - Calendar.getInstance().getTimeInMillis();
+ sb.append("<font color=\"b09979\">"+name+"</font> "+ConverTime(delay)+" <font color=\"b09979\">TO RESPAWN.</font><br1>");
+ }
+ }
+
+ long m_delay = RaidBossSpawnManager.getInstance().getRespawntime(MBOSS);
+ String m_name = NpcTable.getInstance().getTemplate(MBOSS).getName().toUpperCase();
+
+ String mainBossInfo ="";
+
+ if (m_delay==0)
+ {
+ mainBossInfo = "WE SHOULD HAVE ACTED<br1><font color=\"b09979\">"+m_name+" IS ALIVE!</font><br1>";
+ }
+ else if (m_delay<0)
+ {
+ mainBossInfo = "IT'S ALL OVER<br1><font color=\"FF0000\"> "+m_name+" IS DEAD.</font><br1>";
+ }
+ else
+ {
+ m_delay = m_delay - Calendar.getInstance().getTimeInMillis();
+ mainBossInfo = "<font color=\"b09979\">"+ConverTime(m_delay)+"</font><br1>UNTIL OBLIVION OPEN!";
+ }
+
+ NpcHtmlMessage html = new NpcHtmlMessage(1);
+ html.setFile(getHtmlPath(getNpcId(), 0));
+ html.replace("%objectId%", getObjectId());
+ html.replace("%bosslist%", sb.toString());
+ html.replace("%mboss%", mainBossInfo);
+ activeChar.sendPacket(html);
+ }
+
+ private static String ConverTime(long mseconds)
+ {
+ long remainder = mseconds;
+
+ long hours = (long)Math.ceil((mseconds/(60*60*1000)));
+ remainder = mseconds - (hours*60*60*1000);
+
+ long minutes = (long)Math.ceil((remainder / (60*1000)));
+ remainder = remainder -(minutes *(60*1000));
+
+ long seconds = (long)Math.ceil((remainder / 1000));
+
+ return hours+":"+minutes+":"+seconds;
+ }
+
+ @Override
+ public String getHtmlPath(int npcId, int val)
+ {
+ String filename;
+
+ if (val == 0)
+ filename = "data/html/mods/RaidBossStatus/" + npcId + ".htm";
+ else
+ filename = "data/html/mods/RaidBossStatus/" + npcId + "-" + val + ".htm";
+
+ if (HtmCache.getInstance().isLoadable(filename))
+ return filename;
+
+ return "data/html/mods/RaidBossStatus/" + npcId + ".htm";
+ }
+}
\ No newline at end of file