TeamVTeam

  • Автор темы Автор темы uter81
  • Дата начала Дата начала

uter81

Знающий
Участник
Сообщения
295
Розыгрыши
0
Репутация
1
Реакции
11
Баллы
460
Запрещено публиковать исходный код без BB-кода — CODE
Хроники
  1. Helios
Исходники
Присутствуют
Сборка
L2jmobius
Подскажите пожалуйста, как настроить ивент, что бы он запускался сам без нажатия кнопки в админ панели.
Что нужно исправить в файле java.
 
Последнее редактирование модератором:
о, импорты :0

Как я помню - мобиус вроде поудалял "красивые" приколы с евентов...
Можно конечно попробовать...
game/data/ - тут создаем папочку /events/ и вставляем в папочку файлик ниже...
 

Вложения

о, импорты :0

Как я помню - мобиус вроде поудалял "красивые" приколы с евентов...
Можно конечно попробовать...
game/data/ - тут создаем папочку /events/ и вставляем в папочку файлик ниже...
Не сработало...
 
Ну можно таймер сделать на старт эвента)
 
Должно работать.
Ну и импорты поставь. Тапочками не кидайтесь в меня, яву только только начинаю изучать....

Форматирование (BB-код):
  private TvT()

    {

        addTalkId(MANAGER);

        addFirstTalkId(MANAGER);

        addExitZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());

        addEnterZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());

    

        final Calendar today = Calendar.getInstance();

        today.set(Calendar.HOUR_OF_DAY, 20);  //  начало отсчета текущего дня (часов), p.s если вкл или релогаешь сервер после этого времени то эвент стартует вместе с сервером и так же до этого времени на след день не начнется.

        today.set(Calendar.MINUTE, 00);        //  начало отсчета текущего дня (минут)

        today.set(Calendar.SECOND, 0);        //  начало отсчета текущего дня (сек)



        Timer timer = new Timer();

        TimerTask task = new TimerTask() {

      @Override

            public void run() {

            eventStart(null);

            }

        };

        timer.schedule(task, today.getTime(), TimeUnit.MILLISECONDS.convert(86400, TimeUnit.SECONDS)); // период в секундах.

    }
 
Сделать например отдельный класс, который будет крутить по крону нужные эвенты - это достаточно элементарно.

Для примера у меня класс, гоняющий автоматически все PvP-эвенты.
ТСу правда не подойдет, т.к. под овер, да и вобще под свою реализацию для fun/pvp эвентов, но общие принципы будут понятны.
Java:
package events.base;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import events.base.data.EventHolder;
import events.base.instances.PvPEventInstance;
import events.base.instances.PvPEventInstance.EventStatus;
import l2p.commons.threading.RunnableImpl;
import l2p.commons.time.cron.SchedulingPattern;
import l2p.commons.util.Rnd;
import l2p.gameserver.ThreadPoolManager;
import l2p.gameserver.model.entity.events.EventType;
import l2p.gameserver.model.entity.olympiad.Olympiad;
import l2p.gameserver.scripts.ScriptFile;
import l2p.gameserver.utils.Util;

/**
 * @author Gaikotsu
 */
public class PvPEventManager implements ScriptFile
{
    private static final Logger _log = LoggerFactory.getLogger(PvPEventManager.class);

    // Список классов всех PvP-эвентов с их текущим статусом для проверок на то, не запущен ли в данный момент какой-то из них
    private static Map<String, EventStatus> _status = new HashMap<>();
    private static ScheduledFuture<?> _startEventTask = null;

    @Override
    public void onLoad()
    {
        scheduleNextStart();
    }

    @Override
    public void onShutdown()
    {
        stopTask();
    }

    /*
     *  Проверяет возможность запуска эвента в данный момент времени
     */
    public static boolean checkStartConditions()
    {
        if (_status.values().stream().anyMatch(s -> s != EventStatus.IDLE))
        {
            _log.info("PvPEventManager: Event not started, reason - other event is in progress.");
            return false;
        }

        if (EventHolder.getInstance().getParam("checkOlympiad", false) && Olympiad.inCompPeriod())
        {
            _log.info("PvPEventManager: Event not started, reason - olympiad is in progress.");
            return false;
        }

        return true;
    }

    public static void setStatus(String name, EventStatus status)
    {
        _status.put(name, status);
    }

    private static void stopTask()
    {
        if (_startEventTask != null)
        {
            _startEventTask.cancel(false);
            _startEventTask = null;
        }
    }

    /*
     * Возвращает время следующего запуска эвента
     */
    private static long getNextStartTime()
    {
        if (EventHolder.getInstance().getTimes().isEmpty())
            return 0;

        long time = Long.MAX_VALUE;

        for (String pattern : EventHolder.getInstance().getTimes())
            time = Math.min(time, new SchedulingPattern(pattern).next(System.currentTimeMillis()));

        if (time == Long.MAX_VALUE)
        {
            _log.warn("WTF? Next start time equals max long value.");
            return 0;
        }

        return time;
    }

    private static void scheduleNextStart()
    {
        long nextTime = getNextStartTime();

        if (nextTime > 0)
        {
            stopTask();
            _startEventTask = ThreadPoolManager.getInstance().schedule(new StartEventTask(), nextTime - System.currentTimeMillis());
            _log.info("PvPEventManager: Next event started on " + Util.formatDate(nextTime));
        }
    }

    private static class StartEventTask extends RunnableImpl
    {
        @Override
        public void runImpl()
        {
            ThreadPoolManager.getInstance().schedule(() -> {
                scheduleNextStart();
            }, 90000L);

            if (!Rnd.chance(EventHolder.getInstance().getParam("startChance", 0)))
            {
                _log.info("PvPEventManager: Event not started, reason - starting chance failed.");
                return;
            }

            List<PvPEventInstance> activeEvents = new ArrayList<>();
            EventHolder.getInstance().getEvents(EventType.PVP_EVENT).stream().filter(e -> e.getEvent().isActive()).forEach(e -> activeEvents.add((PvPEventInstance) e.getEvent()));

            if (activeEvents.isEmpty())
            {
                _log.info("PvPEventManager: Event not started, reason - no enabled events.");
                return;
            }

            if (!checkStartConditions())
                return;

            PvPEventInstance event = activeEvents.get(Rnd.get(activeEvents.size()));

            if (event.getConfig().isUseRounds())
                event.startRound(null, 1, 2, true);
            else
                event.startRound(null, 0, 0, true);

            _log.info("PvPEventManager: Event '" + event.getName(true) + "' started.");
        }
    }
}
Ну а само время у меня там из xml-ки со всеми настройками для pvp-эвентов берется и лежит там просто в виде строк с временем для Cron. Например это означает запуск с периодичностью в 2 часа.
XML:
    <start>
        <time pattern="0 */2 * * *" />
    </start>
 
Последнее редактирование:
  • Мне нравится
Реакции: Rolo
Подскажите пожалуйста, как настроить ивент, что бы он запускался сам без нажатия кнопки в админ панели.
Что нужно исправить в файле java.
может поможет
 
может поможет
о, импорты :0

Как я помню - мобиус вроде поудалял "красивые" приколы с евентов...
Можно конечно попробовать...
game/data/ - тут создаем папочку /events/ и вставляем в папочку файлик ниже...
 
Не получилось по вариантам которые предложили Вы, этот ивент лежит по пути: game\data\scripts\custom\events , может я что не так делаю. Может их перенести в по пути game\data\events что бы запускалось все автоматически не пойму просто логику
 
Не получилось по вариантам которые предложили Вы, этот ивент лежит по пути: game\data\scripts\custom\events , может я что не так делаю. Может их перенести в по пути game\data\events что бы запускалось все автоматически не пойму просто логику
А с моим вариантом что не получилось?
 
А с моим вариантом что не получилось?
Добавил и ошибки пошли множество -
ERROR: \game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 125, Column 9
code: compiler.err.cant.resolve.location
message: cannot find symbol
symbol: class TimerTask
location: class custom.events.TeamVsTeam.TvT
 
Добавил и ошибки пошли множество -
ERROR: \game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 125, Column 9
code: compiler.err.cant.resolve.location
message: cannot find symbol
symbol: class TimerTask
location: class custom.events.TeamVsTeam.TvT
Импорт не прописал. Установи eclipse, импортируй туда проект, и найди этот файл он подскажит какие импорты сделать. Там calendar, timer и timertask
 
Import java.util.Timer;
Import java.util.TimerTask;
Import java.util.Calendar;
Куда воткуть разберешься?
И коментарии в том коде прочитай и меняй под свои.
 
Запрещено публиковать исходный код без BB-кода — CODE
Import java.util.Timer;
Import java.util.TimerTask;
Import java.util.Calendar;
Куда воткуть разберешься?
И коментарии в том коде прочитай и меняй под свои.
спасибо, это в ява файлик добавил в твт, сейчас с ошибками кода разбираюсь

импорт прописал , выходит единственная ошибка
строка на которую ругается , не пойму что здесь не так
ThreadPool.scheduleAtFixedRate(() -> eventStart(null), calendar.getTimeInMillis() - System.currentTimeMillis(), 86400000); // 86400000 = 1 day


Код:
ERROR: C:\game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 128, Column 17
        code: compiler.err.cant.resolve.location
        message: cannot find symbol
  symbol:   variable ThreadPool
  location: class custom.events.TeamVsTeam.TvT

    at org.l2jmobius.gameserver.scripting.java.JavaExecutionContext.executeScripts(JavaExecutionContext.java:171)
    at org.l2jmobius.gameserver.scripting.ScriptEngineManager.executeScriptList(ScriptEngineManager.java:181)
    at org.l2jmobius.gameserver.GameServer.<init>(GameServer.java:379)
    at org.l2jmobius.gameserver.GameServer.main(GameServer.java:500)




вот так выглядит в яве фале этот кусок

Java:
private TvT()
    {
        addTalkId(MANAGER);
        addFirstTalkId(MANAGER);
        addExitZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());
        addEnterZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());
      
        // Daily task to start event at 20:00.
        final Calendar calendar = Calendar.getInstance();
        if ((calendar.get(Calendar.HOUR_OF_DAY) >= 20) && (calendar.get(Calendar.MINUTE) >= 0))
        {
        calendar.add(Calendar.DAY_OF_YEAR, 1);
         }
        calendar.set(Calendar.HOUR_OF_DAY, 20);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        ThreadPool.scheduleAtFixedRate(() -> eventStart(null), calendar.getTimeInMillis() - System.currentTimeMillis(), 86400000); // 86400000 = 1 day
    }
 
Последнее редактирование модератором:
импорт прописал , выходит единственная ошибка
строка на которую ругается , не пойму что здесь не так
ThreadPool.scheduleAtFixedRate(() -> eventStart(null), calendar.getTimeInMillis() - System.currentTimeMillis(), 86400000); // 86400000 = 1 day


ERROR: C:\game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 128, Column 17
code: compiler.err.cant.resolve.location
message: cannot find symbol
symbol: variable ThreadPool
location: class custom.events.TeamVsTeam.TvT

at org.l2jmobius.gameserver.scripting.java.JavaExecutionContext.executeScripts(JavaExecutionContext.java:171)
at org.l2jmobius.gameserver.scripting.ScriptEngineManager.executeScriptList(ScriptEngineManager.java:181)
at org.l2jmobius.gameserver.GameServer.<init>(GameServer.java:379)
at org.l2jmobius.gameserver.GameServer.main(GameServer.java:500)




вот так выглядит в яве фале этот кусок

private TvT()
{
addTalkId(MANAGER);
addFirstTalkId(MANAGER);
addExitZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());
addEnterZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());

// Daily task to start event at 20:00.
final Calendar calendar = Calendar.getInstance();
if ((calendar.get(Calendar.HOUR_OF_DAY) >= 20) && (calendar.get(Calendar.MINUTE) >= 0))
{
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
ThreadPool.scheduleAtFixedRate(() -> eventStart(null), calendar.getTimeInMillis() - System.currentTimeMillis(), 86400000); // 86400000 = 1 day
}
А мой кусок кода ты куда поставил?) замени на мой.
 
А мой кусок кода ты куда поставил?) замени на мой.
С твоим кодом 2 ошибки выдает
ошибка на эту строку
timer.schedule(task, today.getTime(), TimeUnit.MILLISECONDS.convert(86400, TimeUnit.SECONDS)); // период в секундах.


ERROR: C:\game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 140, Column 84
code: compiler.err.cant.resolve.location
message: cannot find symbol
symbol: variable TimeUnit
location: class custom.events.TeamVsTeam.TvT
ERROR: C:\game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 140, Column 55
code: compiler.err.doesnt.exist
message: package TimeUnit does not exist

at org.l2jmobius.gameserver.scripting.java.JavaExecutionContext.executeScripts(JavaExecutionContext.java:171)
at org.l2jmobius.gameserver.scripting.ScriptEngineManager.executeScriptList(ScriptEngineManager.java:181)
at org.l2jmobius.gameserver.GameServer.<init>(GameServer.java:379)
at org.l2jmobius.gameserver.GameServer.main(GameServer.java:500)

кусок кода твой вот в таком виде
Код:
private TvT()

    {

       
        addTalkId(MANAGER);
        addFirstTalkId(MANAGER);
        addExitZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());
        addEnterZoneId(BLUE_PEACE_ZONE.getId(), RED_PEACE_ZONE.getId());

        final Calendar today = Calendar.getInstance();

        today.set(Calendar.HOUR_OF_DAY, 20);  //  начало отсчета текущего дня (часов), p.s если вкл или релогаешь сервер после этого времени то эвент стартует вместе с сервером и так же до этого времени на след день не начнется.
        today.set(Calendar.MINUTE, 00);        //  начало отсчета текущего дня (минут)
        today.set(Calendar.SECOND, 0);        //  начало отсчета текущего дня (сек)

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {

      @Override

            public void run() {

            eventStart(null);

            }

        };

        timer.schedule(task, today.getTime(), TimeUnit.MILLISECONDS.convert(86400, TimeUnit.SECONDS)); // период в секундах.

    }
 
Иморт еще 1,
Import java.util.TimeUnit;

Установи среду разработки какая понравится eclipse, idea и т.д, notepad++ или обычный notepad это конечно сильная вещь)) но ошибки они не показывают.
 
Начал ругаться дополнительно на импорт который добавил
Форматирование (BB-код):
import java.util.TimeUnit;

ERROR: C:\game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 14, Column 17
        code: compiler.err.cant.resolve.location
        message: cannot find symbol
  symbol:   class TimeUnit
  location: package java.util
    ERROR: C:\Mobius_Helios_Test\game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 141, Column 84
        code: compiler.err.cant.resolve.location
        message: cannot find symbol
  symbol:   variable TimeUnit
  location: class custom.events.TeamVsTeam.TvT
    ERROR: C:\game\data\scripts\custom\events\TeamVsTeam\TvT.java, Line 141, Column 55
        code: compiler.err.doesnt.exist
        message: package TimeUnit does not exist

    at org.l2jmobius.gameserver.scripting.java.JavaExecutionContext.executeScripts(JavaExecutionContext.java:171)
    at org.l2jmobius.gameserver.scripting.ScriptEngineManager.executeScriptList(ScriptEngineManager.java:181)
    at org.l2jmobius.gameserver.GameServer.<init>(GameServer.java:379)
    at org.l2jmobius.gameserver.GameServer.main(GameServer.java:500)
 
Назад
Сверху Снизу