• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Аванпосты (PWSOFT)

Аванпосты (PWSOFT) 1

Нет прав для скачивания

Oleksandr Volodymyrovych

Веб-разработчик
УБИЙЦА ДРАКОНОВ
Куратор Данных
Стальной Визионер
Старожил I степени
Сообщения
346
Розыгрыши
0
Репутация
237
Реакции
432
Баллы
1 483
Oleksandr Volodymyrovych добавил(а) новый ресурс:

Аванпосты (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();
    }
}

Узнать больше об этом ресурсе...
 
Последнее редактирование:

посмотреть
 
Посмотреть
 
Посмотреть
 
глянуть
 
глянуть 1 глазом
 
юридический
 
глянуть
 
Посмотрим что за зверь
 
глянуть
 
Вы должны ответить и нажать "Мне нравится" для возможности просмотра скрытого содержимого.
В файлах тупо конфиг и больше ничего нету... смысл?
 
Последнее редактирование:
ответы за пв софт это легенда еще и за сранный конфиг, который никому ничего не даст)) лайк убираем.
 
Назад
Сверху