npc статус рб

Ginex1000

Свой человек
Участник
Сообщения
86
Розыгрыши
0
Репутация
-46
Реакции
6
Баллы
550
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
acis
Доброго вечерочка... Ищу нпса отображающего статус рб и примерную дату респа.
Если у кого плиз поделитесь ) Хроники интерлюда.
 
Код:
### 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

Думаю перепишите, а нпц может быть любой или просто сделайте это в кб.
 
Не смог разобраться в таком обилии кода. Мне тоже было интересно знать, жив РейдБосс или убили.
Нашел такое: SpawnTable.getInstance().getSpawns(25378).size() //25378 - Зверёк безумия.
Но это возвращает количество заспавненых. Тоесть, всё время 1. Хоть ты его убивай, хоть живой.

Нашел развитие:
for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(25378)) {
L2Npc Boss = spawn.getLastSpawn();
}
Но каким образом потом из переменной Boss получить статус - не придумал.
 
Omana, получать информацию нужно с RaidBossSpawnManager (все зависит от сборки). Внутри должна быть инфа о респавне каждого рб (обычно Unix время )
 
Реакции: Rolo
4ipolino, спасибо натолкнули на правильную мысль. Пытался добраться до рейдбоссов через таблицу спавна (что в примерах находил, то и пробовал). Пример от Maksim сложен тем, что сам по себе обширный, так и не понятно, куда вставлять public long getRespawntime(int id) так как стандартные скрипты (у меня сборка L2Jsetver) такую функцию не знают.

В общем, начал искать примеры с RaidBossSpawnManager и нашел. Как добраться до времени респавна не знаю. В MySQL это таблица `raidboss_spawnlist`, колонка `respawn_time`. Но чтобы посмотреть, жив РБ или нет, достаточно трех строк:
Java:
import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager;
import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager.StatusEnum;

if (RaidBossSpawnManager.getInstance().getRaidBossStatusId(25001) == StatusEnum.ALIVE) {htmltext = "OK";} else {htmltext = "dead";}
 
Omana, в вашем л2ж в рейдбоссспавнМенеджере есть мапка
protected static final Map<Integer, StatsSet> _storedInfo = new FastMap<>();
если не ошибаюсь то вся нужная инфа по респавну там
просто запрашиваете нужный ид и смотрите нужные вам параметры "respawnTime" и тд

поищите в коде использование метода getStoredInfo()
вполне возможно что уже похожее реализовали до вас
 
4ipolino, я всё-таки коротко отвечу. В мапках не разбирался и пока времени не найдется. Про таймер респа интересовался топикстартер. А решение того, что нужно было мне, я описал в предыдущем посте.

getStoredInfo() и RaidBossSpawnManager.java - это наверно из старых версий сервера. Последние годы они так всё переделали, что нет в файлах ни этой функции, ни самого файла. Он раньше был: