Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Raidboss Respawn Check

Iniciado por Swarlog, Sep 01, 2022, 12:45 AM

Tema anterior - Siguiente tema

Swarlog

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