Oleksandr Volodymyrovych добавил(а) новый ресурс:
Аванпосты (PWSOFT) - Аванпосты
ВАЖНО! Реализация уже есть в сборке, которую я указал. Это просто файлы для отображения.
Скрипт забыл добавить)
Узнать больше об этом ресурсе...
Аванпосты (PWSOFT) - Аванпосты
ВАЖНО! Реализация уже есть в сборке, которую я указал. Это просто файлы для отображения.
Аванпосты под эту сборку PWSOFT...
Скрипт забыл добавить)
Java:
package ai;
import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javolution.util.FastMap;
import net.sf.l2j.gameserver.Announcements;
import net.sf.l2j.gameserver.GeoEngine;
import net.sf.l2j.gameserver.model.L2Clan;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.util.Location;
import net.sf.l2j.util.Rnd;
import net.sf.l2j.util.cron.SchedulingPattern;
import scripts.commands.IVoicedCommandHandler;
import scripts.commands.VoicedCommandHandler;
public class HolyDef implements IVoicedCommandHandler {
private static final long DELAY = TimeUnit.MINUTES.toMillis(2);
private static final int OFFSET_MIN = 100, OFFSET_MAX = 500;
private static final String[] CMDS = new String[]{"godef", "holydef"};
private static final Map<Integer, Long> DELAYS = new FastMap<>();
private Properties customSettings = new Properties();
private SchedulingPattern HOLY_CUSTOM_CRON;
private static HolyDef _instance = null;
public static HolyDef getInstance()
{
if (_instance == null)
_instance = new HolyDef();
return _instance;
}
public static void main(String[] args) {
HolyDef holyDef = new HolyDef();
try {
InputStream is = Files.newInputStream(new File("./config/custom.cfg").toPath());
holyDef.customSettings.load(is);
is.close();
VoicedCommandHandler.getInstance().registerVoicedCommandHandler(holyDef);
String customCron = holyDef.customSettings.getProperty("HolyCustomCron", "0 11,18 * * *");
holyDef.HOLY_CUSTOM_CRON = new SchedulingPattern(customCron);
holyDef.scheduleSiegeAnnouncementTask();
} catch (Exception var5) {
var5.printStackTrace();
}
}
private void scheduleSiegeAnnouncementTask() {
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(this::checkAndAnnounceSiege, 0, 1, TimeUnit.SECONDS);
}
private void checkAndAnnounceSiege() {
long now = System.currentTimeMillis();
long nextSiegeTime = HOLY_CUSTOM_CRON.next(TimeZone.getTimeZone(ZoneId.of("Europe/Moscow")), now);
long timeDiffMillis = nextSiegeTime - now;
long secondsUntilSiege = TimeUnit.MILLISECONDS.toSeconds(timeDiffMillis);
if (secondsUntilSiege <= 300) {
announceSiege(secondsUntilSiege);
}
}
private void announceSiege(long minutesUntilSiege) {
if (minutesUntilSiege == 300) {
Announcements.getInstance().announceToAll("Захват начнется через 5 минут! Готовьтесь к бою!");
}
if (minutesUntilSiege == 60) {
Announcements.getInstance().announceToAll("Захват начнется через 1 минуту! Врывайтесь!");
}
if (minutesUntilSiege == 0) {
Announcements.getInstance().announceToAll("Захват начался! В бой!");
}
}
@Override
public String[] getVoicedCommandList() {
return CMDS;
}
@Override
public boolean useVoicedCommand(String full, L2PcInstance player, String target) {
L2Clan clan = player.getClan();
if (clan != null) {
if (clan.CUSTOM_HOLY != null) {
if (checkDelay(player)) {
setDelay(player);
Location HOLY_LOC = clan.CUSTOM_HOLY.getLoc();
player.teleToLocation(findAroundPosition(HOLY_LOC.x, HOLY_LOC.y, HOLY_LOC.z, OFFSET_MIN, OFFSET_MAX));
}
} else {
player.sendCritMessage("У Вашего клана нет захваченного NPC!");
}
}
return false;
}
private void setDelay(L2PcInstance player) {
DELAYS.put(player.getObjectId(), System.currentTimeMillis());
}
private boolean checkDelay(L2PcInstance player) {
Long delay = DELAYS.getOrDefault(player.getObjectId(), null);
if (delay != null) {
long diff = System.currentTimeMillis() - delay;
if (diff >= DELAY) {
return true;
} else {
player.sendCritMessage("Откат: " + formatTime((int) ((DELAY - diff) / 1000L)));
return false;
}
} else
return true;
}
private Location findAroundPosition(int x, int y, int z, int radiusmin, int radiusmax) {
Location pos;
int tempz;
for (int i = 0; i < 100; i++) {
pos = coordsRandomize(x, y, z, 0, radiusmin, radiusmax);
tempz = GeoEngine.getInstance().getHeight(pos.x, pos.y, pos.z);
if (GeoEngine.getInstance().canMoveFromToTarget(x, y, z, pos.x, pos.y, tempz, 0)
&& GeoEngine.getInstance().canMoveFromToTarget(pos.x, pos.y, tempz, x, y, z, 0)) {
pos.z = tempz;
return pos;
}
}
return new Location(x, y, z);
}
private Location coordsRandomize(int x, int y, int z, int heading, int radiusmin, int radiusmax) {
if (radiusmax == 0 || radiusmax < radiusmin)
return new Location(x, y, z, heading);
int radius = Rnd.get(radiusmin, radiusmax);
double angle = Rnd.nextDouble() * 2 * Math.PI;
return new Location((int) (x + radius * Math.cos(angle)), (int) (y + radius * Math.sin(angle)), z, heading);
}
private String formatTime(int time) {
if (time == 0) {
return "now";
}
time = Math.abs(time);
String ret = "";
long numDays = time / 86400;
time -= numDays * 86400;
long numHours = time / 3600;
time -= numHours * 3600;
long numMins = time / 60;
time -= numMins * 60;
long numSeconds = time;
if (numDays > 0) {
ret += numDays + "д ";
}
if (numHours > 0) {
ret += numHours + "ч ";
}
if (numMins > 0) {
ret += numMins + "м ";
}
if (numSeconds > 0) {
ret += numSeconds + "сек";
}
return ret.trim();
}
}
Узнать больше об этом ресурсе...
Последнее редактирование: