- Хроники
- Interlude
- Сборка
- Pain team
Добрый вечер народ, есть небольшое не понимание того как работает скрипт, а точнее при убийстве заданного в скрипте рейд босса и при соблюдении условий, добившему человеку/пати дается нублес.
Хоть убейте нечего в скрипте не вижу связанного с нублом)
Хоть убейте нечего в скрипте не вижу связанного с нублом)
Код:
package services;
import java.util.Calendar;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import l2p.commons.util.Rnd;
import l2p.gameserver.Announcements;
import l2p.gameserver.ThreadPoolManager;
import l2p.gameserver.instancemanager.ServerVariables;
import l2p.gameserver.listener.actor.OnDeathListener;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.instances.L2MonsterInstance;
import l2p.gameserver.scripts.Functions;
import l2p.gameserver.scripts.ScriptFile;
import l2p.gameserver.tables.NpcTable;
import l2p.gameserver.templates.L2NpcTemplate;
import l2p.gameserver.utils.Location;
import l2p.gameserver.utils.TimeUtils;
import l2p.gameserver.utils.Util;
public class RaidRespawnAnnounce extends Functions implements ScriptFile
{
// ид босса
private final static int BOSS_ID = 90064;
// время спавна
private final static String TIME = "22:30";
// разброс в минутах
private final static int RANDOM_RESP = 29;
// количество дней до возрождения
private final static int DAYS = 1;
// координаты
private final static String LOCATION = "85576,256968,-11664";
// за сколько минут до появления анонсировать
private static final int ANN_MINS = 30;
// отправлять анонс о убийстве босса
private static final boolean WMSG = true;
private static ScheduledFuture<?> spTask;
private static final long ANN_DELAY = ANN_MINS * 60000L;
private static RespawnPoint RESPAWN_POINT;
public static class RespawnPoint
{
public int hour;
public int minute;
public Location loc;
public RespawnPoint(int hour, int minute, Location loc)
{
this.hour = hour;
this.minute = minute;
this.loc = loc;
}
}
private static void calcNextRespawn(boolean first)
{
long next = 0;
if(first)
{
long resp = ServerVariables.getLong("Respawn_"+BOSS_ID, 0);
if(resp < System.currentTimeMillis())
next = 1000;
else
next = resp - System.currentTimeMillis();
}
else
{
int time = (int) getNextRespawn(RESPAWN_POINT.hour, RESPAWN_POINT.minute);
int minus = (int) TimeUnit.MINUTES.toSeconds(RANDOM_RESP);
int plus = (int) TimeUnit.MINUTES.toSeconds(RANDOM_RESP);
next = TimeUnit.SECONDS.toMillis(Rnd.get(time - minus, time + plus));
}
try
{
if(spTask != null)
spTask.cancel(false);
}
catch(Exception e)
{}
spTask = ThreadPoolManager.getInstance().schedule(new SpawnTask(), next);
_log.info("RaidRespawnAnnounce ["+BOSS_ID+"]: " + TimeUtils.toSimpleFormat(System.currentTimeMillis() + next));
if(ANN_MINS > 0 && (next - ANN_DELAY) > 0)
ThreadPoolManager.getInstance().schedule(new Runnable()
{
@Override
public void run()
{
L2NpcTemplate template = NpcTable.getTemplate(BOSS_ID);
if(template == null)
return;
Announcements.getInstance().announceToAll("Через "+ANN_MINS+" "+Util.minuteFormat(true, String.valueOf(ANN_MINS))+" Босс "+template.name+" появится в мире Аден");
}
}, next - ANN_DELAY);
if(!first)
ServerVariables.set("Respawn_"+BOSS_ID, System.currentTimeMillis() + next);
}
private static long getNextRespawn(int hour, int minute)
{
Calendar result = Calendar.getInstance();
result.add(Calendar.DAY_OF_YEAR, DAYS);
result.set(Calendar.HOUR_OF_DAY, hour);
result.set(Calendar.MINUTE, minute);
result.set(Calendar.SECOND, 1);
long next_respawn = result.getTimeInMillis() - System.currentTimeMillis();
if(next_respawn < 0)
next_respawn += TimeUnit.DAYS.toMillis(1);
return TimeUnit.MILLISECONDS.toSeconds(next_respawn);
}
public static class SpawnTask implements Runnable
{
@Override
public void run()
{
try
{
L2MonsterInstance npc = (L2MonsterInstance) NpcTable.getTemplate(BOSS_ID).getNewInstance();
npc.addListener(_listener);
npc.setHeading(Rnd.get(0xFFFF));
npc.setSpawnedLoc(RESPAWN_POINT.loc);
npc.onSpawn();
npc.spawnMe(npc.getSpawnedLoc());
}
catch(Exception e)
{
_log.error("RaidRespawnAnnounce: can't spawn boss: "+BOSS_ID, e);
}
}
}
private static final OnDeathListener _listener = new ListenerImpl();
private static final class ListenerImpl implements OnDeathListener
{
@Override
public void onDeath(L2Character actor, L2Character killer)
{
calcNextRespawn(false);
if(WMSG)
{
if(killer != null)
{
L2Player player = killer.getPlayer();
if(player != null)
{
Announcements.getInstance().announceToAll("Игрок " + player.getName() + " нанес последний удар по " + actor.getName() + "!");
return;
}
}
Announcements.getInstance().announceToAll(actor.getName() + " повержен!");
}
}
}
@Override
public void onLoad()
{
String[] time = TIME.split(":");
String[] loc = LOCATION.split(",");
RESPAWN_POINT = new RespawnPoint(Integer.parseInt(time[0]), Integer.parseInt(time[1]), new Location(Integer.parseInt(loc[0]), Integer.parseInt(loc[1]), Integer.parseInt(loc[2])));
calcNextRespawn(true);
}
@Override
public void onReload()
{}
@Override
public void onShutdown()
{}
}