Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Raidboss Respawn Check

Iniciado por Zealar, Ago 03, 2025, 01:21 AM

Tema anterior - Siguiente tema

Zealar

package custom.BossRespawn;

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;

import com.l2jserver.commons.database.pool.impl.ConnectionFactory;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.instancemanager.GrandBossManager;
import com.l2jserver.gameserver.model.StatsSet;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;

public class BossRespawn extends Quest
{
    private static final int NPC_ID = 50008;
    private static final boolean GM_ONLY = true;
    private static final boolean DEBUG = false;
    @SuppressWarnings("unused")
    static List<Grandboss> GRAND_BOSSES = new ArrayList<Grandboss>();
    @SuppressWarnings("unused")
    static List<Raidboss> RAID_BOSSES = new ArrayList<Raidboss>();
    private static final long refreshTime = 5 * 60 * 1000;
    private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    
    @SuppressWarnings("synthetic-access")
    public BossRespawn(int questid, String name, String descr)
    {
        super(questid, name, descr);
        addFirstTalkId(NPC_ID);
        addTalkId(NPC_ID);
        addStartNpc(NPC_ID);
        
        ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new reloadBosses(), 1000, refreshTime);
    }
    
    @Override
    public String onFirstTalk(L2Npc npc, L2PcInstance player)
    {
        return "home.htm";
    }
    
    @Override
    public String onTalk(L2Npc npc, L2PcInstance player)
    {
        return "main.htm";
    }
    
    @Override
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        if (event.equalsIgnoreCase("grandbosses"))
        {
            sendGrandBosses(player);
        }
        else if (event.equalsIgnoreCase("raidbosses"))
        {
            return "raidbosses.htm";
        }
        else if (event.startsWith("raidboss_"))
        {
            try
            {
                int level = Integer.parseInt(event.substring(9));
                sendRaidBosses(player, level);
            }
            catch (NumberFormatException nfe)
            {
            }
        }
        
        return null;
    }
    
    private void sendRaidBosses(L2PcInstance player, int bosslevel)
    {
        StringBuilder tb = new StringBuilder();
        tb.append("<html><title>레이드 보스 정보</title><body><br><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><table width=260>");
        
        for (Raidboss rb : RAID_BOSSES)
        {
            String name = rb.getName();
            int level = rb.getLevel();
            int min = bosslevel;
            int max = min + 9;
            if ((level >= min) && (level <= max))
            {
                long delay = rb.getRespawn();
                long currentTime = System.currentTimeMillis();
                
                if (delay <= currentTime)
                {
                    tb.append("<tr><td><font color=\"00C3FF\">" + name + " (" + level + ")</color>:</td><td><font color=\"32C332\">생존</color></td></tr>");
                }
                else
                {
                    tb.append("<tr><td><font color=\"00C3FF\">" + name + " (" + level + ")</color>:</td><td><font color=\"9CC300\">" + (player.isGM() && GM_ONLY ? sdf.format(new Date(delay)) : "사망") + "</color></td></tr>");
                }
            }
        }
        
        tb.append("</table><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br></center></body></html>");
        
        NpcHtmlMessage msg = new NpcHtmlMessage(NPC_ID);
        msg.setHtml(tb.toString());
        player.sendPacket(msg);
    }
    
    private void sendGrandBosses(L2PcInstance player)
    {
        StringBuilder tb = new StringBuilder();
        tb.append("<html><title>그랜드 보스 정보</title><body><br><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><table width=260>");
        
        for (Grandboss boss : GRAND_BOSSES)
        {
            String name = boss.getName();
            StatsSet stats = GrandBossManager.getInstance().getStatsSet(boss.getId());
            if (stats == null)
            {
                player.sendMessage("그랜드 보스 " + boss.getId() + " 에 대한 리스폰 정보가 없습니다!");
                continue;
            }
            
            long delay = stats.getLong("respawn_time");
            long currentTime = System.currentTimeMillis();
            
            if (delay <= currentTime)
            {
                tb.append("<tr><td><font color=\"00C3FF\">" + name + "</color>:</td><td><font color=\"32C332\">생존</color></td></tr>");
            }
            else
            {
                tb.append("<tr><td><font color=\"00C3FF\">" + name + "</color>:</td><td><font color=\"9CC300\">" + (player.isGM() && GM_ONLY ? sdf.format(new Date(delay)) : "사망") + "</color></td></tr>");
            }
        }
        
        tb.append("</table><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br></center></body></html>");
        
        NpcHtmlMessage msg = new NpcHtmlMessage(NPC_ID);
        msg.setHtml(tb.toString());
        player.sendPacket(msg);
    }
    
    private class reloadBosses implements Runnable
    {
        @Override
        public void run()
        {
            
            RAID_BOSSES.clear();
            GRAND_BOSSES.clear();
            
            try (Connection con = ConnectionFactory.getInstance().getConnection();
                ResultSet rset = con.createStatement().executeQuery("SELECT `n`.`name`, `g`.`boss_id` FROM `npc` as `n` CROSS JOIN `grandboss_data` AS `g` ON `n`.`id` = `g`.`boss_id` GROUP BY `n`.`name` ORDER BY `g`.`respawn_time` DESC"))
            {
                while (rset.next())
                {
                    Grandboss boss = new Grandboss();
                    boss.setGrandboss(rset.getInt("boss_id"), rset.getString("name"));
                    GRAND_BOSSES.add(boss);
                }
            }
            catch (Exception e)
            {
                _log.log(Level.WARNING, "Could not restore grand bosses: " + e.getMessage(), e);
            }
            
            try (Connection con = ConnectionFactory.getInstance().getConnection();
                ResultSet rset = con.createStatement().executeQuery("SELECT `n`.`level`, `n`.`name`, `r`.`respawn_time` FROM `npc` as `n` CROSS JOIN `raidboss_spawnlist` AS `r` ON `n`.`id` = `r`.`boss_id` ORDER BY `n`.`level`"))
            {
                while (rset.next())
                {
                    Raidboss rb = new Raidboss();
                    rb.setRaidboss(rset.getString("name"), rset.getInt("level"), rset.getLong("respawn_time"));
                    RAID_BOSSES.add(rb);
                }
            }
            catch (Exception e)
            {
                _log.log(Level.WARNING, "Could not restore raid bosses: " + e.getMessage(), e);
            }
            if (DEBUG)
            {
                _log.info("Boss Respawn last update: " + sdf.format(new Date(System.currentTimeMillis())));
                _log.info("Boss Respawn Loaded: " + GRAND_BOSSES.size() + " Grand Bosses");
                _log.info("Boss Respawn Loaded: " + RAID_BOSSES.size() + " Raid Bosses");
                _log.info("Boss Respawn next update: " + sdf.format(new Date(System.currentTimeMillis() + refreshTime)));
            }
        }
    }
    
    private class Raidboss
    {
        private String bossName = null;
        private long bossRespawn = 0;
        private int bossLevel = 0;
        
        /**
         * 
         */
        public Raidboss()
        {
            // TODO Auto-generated constructor stub
        }
        
        void setRaidboss(String name, int level, long respawn)
        {
            bossName = name;
            bossLevel = level;
            bossRespawn = respawn;
        }
        
        String getName()
        {
            return bossName;
        }
        
        int getLevel()
        {
            return bossLevel;
        }
        
        long getRespawn()
        {
            return bossRespawn;
        }
    }
    
    private class Grandboss
    {
        private int bossId = 0;
        private String bossName = null;
        
        /**
         * 
         */
        public Grandboss()
        {
            // TODO Auto-generated constructor stub
        }
        
        void setGrandboss(int id, String name)
        {
            bossId = id;
            bossName = name;
        }
        
        int getId()
        {
            return bossId;
        }
        
        String getName()
        {
            return bossName;
        }
    }
    
    public static void main(String[] args)
    {
        new BossRespawn(-1, "BossRespawn", "custom");
    }
}

By Zealar