public class IvoryTowerTeleportZones extends AbstractNpcAI {
private static final int HOURS_24 = 86400000;
private static final String[] ZONE_NAMES = {
"hellbound_tp_1",
"hellbound_tp_2",
"hellbound_tp_3",
"hellbound_tp_4"
};
private IvoryTowerTeleportZones() {
final Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// Current day check.
if ((calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) &&
(calendar.get(Calendar.HOUR_OF_DAY) >= 10) &&
(calendar.get(Calendar.HOUR_OF_DAY) < 22)) {
enableZones();
calendar.add(Calendar.DAY_OF_WEEK, 7);
calendar.set(Calendar.HOUR_OF_DAY, 10);
closeZones();
} else {
disableZones();
calendar.add(Calendar.DAY_OF_WEEK, Calendar.SATURDAY - calendar.get(Calendar.DAY_OF_WEEK));
calendar.set(Calendar.HOUR_OF_DAY, 10);
}
// Безопасное вычисление задержки
long delay = Math.max(0, calendar.getTimeInMillis() - System.currentTimeMillis());
// Schedule task to check if it is Saturday.
ThreadPool.scheduleAtFixedRate(this::checkCondition, delay, HOURS_24 * 7); // Check every week.
}
private void checkCondition() {
final Calendar calendar = Calendar.getInstance();
if ((calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) &&
(calendar.get(Calendar.HOUR_OF_DAY) >= 10) &&
(calendar.get(Calendar.HOUR_OF_DAY) < 22)) {
enableZones();
closeZones();
}
}
private void closeZones() {
final Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 22);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long delay = Math.max(0, calendar.getTimeInMillis() - System.currentTimeMillis());
ThreadPool.schedule(this::disableZones, delay);
}
private void enableZones() {
for (String name : ZONE_NAMES) {
final ZoneType zone = ZoneManager.getInstance().getZoneByName(name);
if (zone != null) {
zone.setEnabled(true);
}
}
}
private void disableZones() {
for (String name : ZONE_NAMES) {
final ZoneType zone = ZoneManager.getInstance().getZoneByName(name);
if (zone != null) {
zone.setEnabled(false);
}
}
}
public static void main(String[] args) {
new IvoryTowerTeleportZones();
}
}