ивент раз в неделю

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

uter81

Знающий
Участник
Сообщения
295
Розыгрыши
0
Репутация
1
Реакции
11
Баллы
460
Хроники
  1. Fafurion
Исходники
Присутствуют
Сборка
l2jMobius
Добрый день, подскажите что исправить в скрипте, что бы ивент запускался раз в неделю например в субботу в 14:00
Код:
package custom.events.Elpies;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Calendar;
import java.util.concurrent.TimeUnit ;

import org.l2jmobius.Config;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.PartyDistributionType;
import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.CommandChannel;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.Party;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.Summon;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.quest.Event;
import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skill.CommonSkill;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.SkillCaster;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.ExPVPMatchCCRecord;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;

import java.util.concurrent.ScheduledFuture;

import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.data.SpawnTable;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.instance.EventMonster;
import org.l2jmobius.gameserver.model.quest.Event;
import org.l2jmobius.gameserver.util.Broadcast;

public class Elpies extends Event
{
    // NPC
    private static final int ELPY = 900100;
    // Amount of Elpies to spawn when the event starts
    private static final int ELPY_AMOUNT = 100;
    // Event duration in minutes
    private static final int EVENT_DURATION_MINUTES = 2;
    // @formatter:off
    private static final int[][] DROPLIST_CONSUMABLES =
    {
        // itemId, chance, min amount, max amount
        {  1538, 60,  5, 5 },    // Blessed Scroll of Escape
        {  3936, 40,  5, 5 },    // Blessed Scroll of Ressurection
        {  6387, 25,  5, 5 },    // Blessed Scroll of Ressurection Pets
        { 40056, 0,  1, 1 },    // Свиток Чудесного Ветра Артеи
        {  6622, 5,  1, 1 },    // Giant's Codex
        { 80612,  1,  1, 1 },    // Роза Фреи
        { 20004,  1,  1, 1 },    // Energy Ginseng
        { 10649,  1,  1, 1 }    // Благословенное Перо
    };
    
    private static final int[][] DROPLIST_CRYSTALS =
    {
        { 1462,  1, 10,  20 }    // Crystal S-Grade
    };
    // @formatter:on
    // Non-final variables
    private static boolean EVENT_ACTIVE = false;
    private static int CURRENT_ELPY_COUNT = 0;
    private ScheduledFuture<?> _eventTask = null;
    
    private Elpies()
    
    {
        addSpawnId(ELPY);
        addKillId(ELPY);

        final Calendar today = Calendar.getInstance();

        today.set(Calendar.HOUR_OF_DAY, 14);  //  начало отсчета текущего дня (часов), 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(5400, TimeUnit.SECONDS)); // период в секундах.

    }
    
    @Override
    public boolean eventBypass(Player player, String bypass)
    {
        return false;
    }
    
    @Override
    public boolean eventStart(Player eventMaker)
    {
        if (EVENT_ACTIVE)
        {
            return false;
        }
        
        // Check Custom Table - we use custom NPCs
        if (!Config.CUSTOM_NPC_DATA)
        {
            LOGGER.info(getName() + ": Event can't be started because custom NPC table is disabled!");
            eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!");
            return false;
        }
        
        EVENT_ACTIVE = true;
        
        final EventLocation randomLoc = getRandomEntry(EventLocation.values());
        CURRENT_ELPY_COUNT = 0;
        final long despawnDelay = EVENT_DURATION_MINUTES * 60000;
        for (int i = 0; i < ELPY_AMOUNT; i++)
        {
            addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay);
            CURRENT_ELPY_COUNT++;
        }
        
        Broadcast.toAllOnlinePlayers("*Скрип-Скрип*");
        Broadcast.toAllOnlinePlayers("Вторжение Эльпи в " + randomLoc.getName());
        Broadcast.toAllOnlinePlayers("Помогите нам уничтожить их!");
        Broadcast.toAllOnlinePlayers("У вас есть " + EVENT_DURATION_MINUTES + " минуты!");
        _eventTask = ThreadPool.schedule(() ->
        {
            Broadcast.toAllOnlinePlayers("Время вышло!");
            eventStop();
        }, despawnDelay);
        return true;
    }
    
    @Override
    public boolean eventStop()
    {
        if (!EVENT_ACTIVE)
        {
            return false;
        }
        
        EVENT_ACTIVE = false;
        if (_eventTask != null)
        {
            _eventTask.cancel(true);
            _eventTask = null;
        }
        
        for (Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY))
        {
            final Npc npc = spawn.getLastSpawn();
            if (npc != null)
            {
                npc.deleteMe();
            }
        }
        
        Broadcast.toAllOnlinePlayers("*Писк Писк*");
        Broadcast.toAllOnlinePlayers("Ивент завершен!");
        return true;
    }
    
    @Override
    public String onKill(Npc npc, Player killer, boolean isSummon)
    {
        if (EVENT_ACTIVE)
        {
            dropItem(npc, killer, DROPLIST_CONSUMABLES);
            dropItem(npc, killer, DROPLIST_CRYSTALS);
            CURRENT_ELPY_COUNT--;
            
            if (CURRENT_ELPY_COUNT <= 0)
            {
                Broadcast.toAllOnlinePlayers("Все Эльпи были убиты!");
                eventStop();
            }
        }
        return super.onKill(npc, killer, isSummon);
    }
    
    @Override
    public String onSpawn(Npc npc)
    {
        ((EventMonster) npc).eventSetDropOnGround(true);
        ((EventMonster) npc).eventSetBlockOffensiveSkills(true);
        return super.onSpawn(npc);
    }
    
    private enum EventLocation
    {
        ADEN("Аден", 146558, 148341, 26622, 28560, -2200),
        DION("Дион", 18564, 19200, 144377, 145782, -3081),
        GLUDIN("Глудин", -84040, -81420, 150257, 151175, -3125),
        HV("Деревня Охотников", 116094, 117141, 75776, 77072, -2700),
        OREN("Орен", 82048, 82940, 53240, 54126, -1490);
        
        private final String _name;
        private final int _minX;
        private final int _maxX;
        private final int _minY;
        private final int _maxY;
        private final int _z;
        
        EventLocation(String name, int minX, int maxX, int minY, int maxY, int z)
        {
            _name = name;
            _minX = minX;
            _maxX = maxX;
            _minY = minY;
            _maxY = maxY;
            _z = z;
        }
        
        public String getName()
        {
            return _name;
        }
        
        public int getRandomX()
        {
            return getRandom(_minX, _maxX);
        }
        
        public int getRandomY()
        {
            return getRandom(_minY, _maxY);
        }
        
        public int getZ()
        {
            return _z;
        }
    }
    
    private void dropItem(Npc mob, Player player, int[][] droplist)
    {
        final int chance = getRandom(100);
        for (int[] drop : droplist)
        {
            if (chance >= drop[1])
            {
                mob.dropItem(player, drop[0], getRandom(drop[2], drop[3]));
                break;
            }
        }
    }
    
    public static void main(String[] args)
    {
        new Elpies();
    }
}
 
как вариант в вычисление времени следующего запуска добавить
Java:
today.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
но вобще по уму время запуска подобных вещй по идее лучше делать через SchedulingPattern, или какой там есть аналог оного у мобиуса. ну и само собой сохранять/восстанавливать время следующего запуска/окончания в бд - чтобы все корректно работало даже если был рестарт в период активности. но это потребует основательно твой скрипт допиливать.
 
Последнее редактирование:
возможно ли как то тогда упростить скрипт, например респ мобов каждую субботу в 14-00, и пусть стоят пока их не убьют, без временных рамок на их убийство.
 
возможно ли как то тогда упростить скрипт, например респ мобов каждую субботу в 14-00, и пусть стоят пока их не убьют, без временных рамок на их убийство.
за
* достаточное колличетсво шекелей
* или если попросив очень великодушного человека
* или написав самому
можно все, вопрос времени.

Скрипт который у мобиуса валялся. Добавил он START_PATTERN и все :\
Java:
package custom.events.Elpies;

import java.util.concurrent.ScheduledFuture;

import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.time.SchedulingPattern;
import org.l2jmobius.gameserver.data.SpawnTable;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.instance.EventMonster;
import org.l2jmobius.gameserver.model.quest.Event;
import org.l2jmobius.gameserver.util.Broadcast;

public class Elpies extends Event
{

    // impl - https://crontab.guru/#0_14_*_*_SUN
    private final static SchedulingPattern START_PATTERN = new SchedulingPattern("0 14 * * SUN");

    // NPC
    private static final int ELPY = 900100;
    // Amount of Elpies to spawn when the event starts
    private static final int ELPY_AMOUNT = 100;
    // Event duration in minutes
    private static final int EVENT_DURATION_MINUTES = 2;
    // @formatter:off
    private static final int[][] DROPLIST_CONSUMABLES =
    {
        // itemId, chance, min amount, max amount
        {  1540, 80, 10, 15 },    // Quick Healing Potion
        {  1538, 60,  5, 10 },    // Blessed Scroll of Escape
        {  3936, 40,  5, 10 },    // Blessed Scroll of Ressurection
        {  6387, 25,  5, 10 },    // Blessed Scroll of Ressurection Pets
        { 22025, 15,  5, 10 },    // Powerful Healing Potion
        {  6622, 10,  1, 1 },    // Giant's Codex
        { 20034,  5,  1, 1 },    // Revita Pop
        { 20004,  1,  1, 1 },    // Energy Ginseng
        { 20004,  0,  1, 1 }    // Energy Ginseng
    };
    
    private static final int[][] DROPLIST_CRYSTALS =
    {
        { 1458, 80, 50, 100 },    // Crystal D-Grade
        { 1459, 60, 40,  80 },    // Crystal C-Grade
        { 1460, 40, 30,  60 },    // Crystal B-Grade
        { 1461, 20, 20,  30 },    // Crystal A-Grade
        { 1462,  0, 10,  20 }    // Crystal S-Grade
    };
    // @formatter:on
    // Non-final variables
    private static boolean EVENT_ACTIVE = false;
    private static int CURRENT_ELPY_COUNT = 0;
    private ScheduledFuture<?> _eventTask = null;
    
    private Elpies()
    {
        addSpawnId(ELPY);
        addKillId(ELPY);

        if (Config.CUSTOM_NPC_DATA)
        {
            _eventTask = ThreadPool.schedule(() -> eventStart(null), START_PATTERN.next(System.currentTimeMillis()) - System.currentTimeMillis());
        }
    }
    
    @Override
    public boolean eventBypass(Player player, String bypass)
    {
        return false;
    }
    
    @Override
    public boolean eventStart(Player eventMaker)
    {
        if (EVENT_ACTIVE)
        {
            return false;
        }
        
        // Check Custom Table - we use custom NPCs
        if (!Config.CUSTOM_NPC_DATA)
        {
            LOGGER.info(getName() + ": Event can't be started because custom NPC table is disabled!");
            eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!");
            return false;
        }
        
        EVENT_ACTIVE = true;
        
        final EventLocation randomLoc = getRandomEntry(EventLocation.values());
        CURRENT_ELPY_COUNT = 0;
        final long despawnDelay = EVENT_DURATION_MINUTES * 60000;
        for (int i = 0; i < ELPY_AMOUNT; i++)
        {
            addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay);
            CURRENT_ELPY_COUNT++;
        }
        
        Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
        Broadcast.toAllOnlinePlayers("Elpy invasion in " + randomLoc.getName());
        Broadcast.toAllOnlinePlayers("Help us exterminate them!");
        Broadcast.toAllOnlinePlayers("You have " + EVENT_DURATION_MINUTES + " minutes!");
//        _eventTask = ThreadPool.schedule(() ->
//        {
//            Broadcast.toAllOnlinePlayers("Time is up!");
//            eventStop();
//        }, despawnDelay);
        return true;
    }
    
    @Override
    public boolean eventStop()
    {
        if (!EVENT_ACTIVE)
        {
            return false;
        }
        
        EVENT_ACTIVE = false;
        if (_eventTask != null)
        {
            _eventTask.cancel(true);
            _eventTask = null;
        }
        _eventTask = ThreadPool.schedule(() -> eventStart(null), START_PATTERN.next(System.currentTimeMillis()) - System.currentTimeMillis());
        
        for (Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY))
        {
            final Npc npc = spawn.getLastSpawn();
            if (npc != null)
            {
                npc.deleteMe();
            }
        }
        
        Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
        Broadcast.toAllOnlinePlayers("Elpy Event finished!");
        return true;
    }
    
    @Override
    public String onKill(Npc npc, Player killer, boolean isSummon)
    {
        if (EVENT_ACTIVE)
        {
            dropItem(npc, killer, DROPLIST_CONSUMABLES);
            dropItem(npc, killer, DROPLIST_CRYSTALS);
            CURRENT_ELPY_COUNT--;
            
            if (CURRENT_ELPY_COUNT <= 0)
            {
                Broadcast.toAllOnlinePlayers("All elpies have been killed!");
                eventStop();
            }
        }
        return super.onKill(npc, killer, isSummon);
    }
    
    @Override
    public String onSpawn(Npc npc)
    {
        ((EventMonster) npc).eventSetDropOnGround(true);
        ((EventMonster) npc).eventSetBlockOffensiveSkills(true);
        return super.onSpawn(npc);
    }
    
    private enum EventLocation
    {
        ADEN("Aden", 146558, 148341, 26622, 28560, -2200),
        DION("Dion", 18564, 19200, 144377, 145782, -3081),
        GLUDIN("Gludin", -84040, -81420, 150257, 151175, -3125),
        HV("Hunters Village", 116094, 117141, 75776, 77072, -2700),
        OREN("Oren", 82048, 82940, 53240, 54126, -1490);
        
        private final String _name;
        private final int _minX;
        private final int _maxX;
        private final int _minY;
        private final int _maxY;
        private final int _z;
        
        EventLocation(String name, int minX, int maxX, int minY, int maxY, int z)
        {
            _name = name;
            _minX = minX;
            _maxX = maxX;
            _minY = minY;
            _maxY = maxY;
            _z = z;
        }
        
        public String getName()
        {
            return _name;
        }
        
        public int getRandomX()
        {
            return getRandom(_minX, _maxX);
        }
        
        public int getRandomY()
        {
            return getRandom(_minY, _maxY);
        }
        
        public int getZ()
        {
            return _z;
        }
    }
    
    private void dropItem(Npc mob, Player player, int[][] droplist)
    {
        final int chance = getRandom(100);
        for (int[] drop : droplist)
        {
            if (chance >= drop[1])
            {
                mob.dropItem(player, drop[0], getRandom(drop[2], drop[3]));
                break;
            }
        }
    }
    
    public static void main(String[] args)
    {
        new Elpies();
    }
}
 
за
* достаточное колличетсво шекелей
* или если попросив очень великодушного человека
* или написав самому
можно все, вопрос времени.

Скрипт который у мобиуса валялся. Добавил он START_PATTERN и все :\
Java:
package custom.events.Elpies;

import java.util.concurrent.ScheduledFuture;

import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.time.SchedulingPattern;
import org.l2jmobius.gameserver.data.SpawnTable;
import org.l2jmobius.gameserver.model.Spawn;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.instance.EventMonster;
import org.l2jmobius.gameserver.model.quest.Event;
import org.l2jmobius.gameserver.util.Broadcast;

public class Elpies extends Event
{

    // impl - https://crontab.guru/#0_14_*_*_SUN
    private final static SchedulingPattern START_PATTERN = new SchedulingPattern("0 14 * * SUN");

    // NPC
    private static final int ELPY = 900100;
    // Amount of Elpies to spawn when the event starts
    private static final int ELPY_AMOUNT = 100;
    // Event duration in minutes
    private static final int EVENT_DURATION_MINUTES = 2;
    // @formatter:off
    private static final int[][] DROPLIST_CONSUMABLES =
    {
        // itemId, chance, min amount, max amount
        {  1540, 80, 10, 15 },    // Quick Healing Potion
        {  1538, 60,  5, 10 },    // Blessed Scroll of Escape
        {  3936, 40,  5, 10 },    // Blessed Scroll of Ressurection
        {  6387, 25,  5, 10 },    // Blessed Scroll of Ressurection Pets
        { 22025, 15,  5, 10 },    // Powerful Healing Potion
        {  6622, 10,  1, 1 },    // Giant's Codex
        { 20034,  5,  1, 1 },    // Revita Pop
        { 20004,  1,  1, 1 },    // Energy Ginseng
        { 20004,  0,  1, 1 }    // Energy Ginseng
    };
  
    private static final int[][] DROPLIST_CRYSTALS =
    {
        { 1458, 80, 50, 100 },    // Crystal D-Grade
        { 1459, 60, 40,  80 },    // Crystal C-Grade
        { 1460, 40, 30,  60 },    // Crystal B-Grade
        { 1461, 20, 20,  30 },    // Crystal A-Grade
        { 1462,  0, 10,  20 }    // Crystal S-Grade
    };
    // @formatter:on
    // Non-final variables
    private static boolean EVENT_ACTIVE = false;
    private static int CURRENT_ELPY_COUNT = 0;
    private ScheduledFuture<?> _eventTask = null;
  
    private Elpies()
    {
        addSpawnId(ELPY);
        addKillId(ELPY);

        if (Config.CUSTOM_NPC_DATA)
        {
            _eventTask = ThreadPool.schedule(() -> eventStart(null), START_PATTERN.next(System.currentTimeMillis()) - System.currentTimeMillis());
        }
    }
  
    @Override
    public boolean eventBypass(Player player, String bypass)
    {
        return false;
    }
  
    @Override
    public boolean eventStart(Player eventMaker)
    {
        if (EVENT_ACTIVE)
        {
            return false;
        }
      
        // Check Custom Table - we use custom NPCs
        if (!Config.CUSTOM_NPC_DATA)
        {
            LOGGER.info(getName() + ": Event can't be started because custom NPC table is disabled!");
            eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!");
            return false;
        }
      
        EVENT_ACTIVE = true;
      
        final EventLocation randomLoc = getRandomEntry(EventLocation.values());
        CURRENT_ELPY_COUNT = 0;
        final long despawnDelay = EVENT_DURATION_MINUTES * 60000;
        for (int i = 0; i < ELPY_AMOUNT; i++)
        {
            addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay);
            CURRENT_ELPY_COUNT++;
        }
      
        Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
        Broadcast.toAllOnlinePlayers("Elpy invasion in " + randomLoc.getName());
        Broadcast.toAllOnlinePlayers("Help us exterminate them!");
        Broadcast.toAllOnlinePlayers("You have " + EVENT_DURATION_MINUTES + " minutes!");
//        _eventTask = ThreadPool.schedule(() ->
//        {
//            Broadcast.toAllOnlinePlayers("Time is up!");
//            eventStop();
//        }, despawnDelay);
        return true;
    }
  
    @Override
    public boolean eventStop()
    {
        if (!EVENT_ACTIVE)
        {
            return false;
        }
      
        EVENT_ACTIVE = false;
        if (_eventTask != null)
        {
            _eventTask.cancel(true);
            _eventTask = null;
        }
        _eventTask = ThreadPool.schedule(() -> eventStart(null), START_PATTERN.next(System.currentTimeMillis()) - System.currentTimeMillis());
      
        for (Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY))
        {
            final Npc npc = spawn.getLastSpawn();
            if (npc != null)
            {
                npc.deleteMe();
            }
        }
      
        Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
        Broadcast.toAllOnlinePlayers("Elpy Event finished!");
        return true;
    }
  
    @Override
    public String onKill(Npc npc, Player killer, boolean isSummon)
    {
        if (EVENT_ACTIVE)
        {
            dropItem(npc, killer, DROPLIST_CONSUMABLES);
            dropItem(npc, killer, DROPLIST_CRYSTALS);
            CURRENT_ELPY_COUNT--;
          
            if (CURRENT_ELPY_COUNT <= 0)
            {
                Broadcast.toAllOnlinePlayers("All elpies have been killed!");
                eventStop();
            }
        }
        return super.onKill(npc, killer, isSummon);
    }
  
    @Override
    public String onSpawn(Npc npc)
    {
        ((EventMonster) npc).eventSetDropOnGround(true);
        ((EventMonster) npc).eventSetBlockOffensiveSkills(true);
        return super.onSpawn(npc);
    }
  
    private enum EventLocation
    {
        ADEN("Aden", 146558, 148341, 26622, 28560, -2200),
        DION("Dion", 18564, 19200, 144377, 145782, -3081),
        GLUDIN("Gludin", -84040, -81420, 150257, 151175, -3125),
        HV("Hunters Village", 116094, 117141, 75776, 77072, -2700),
        OREN("Oren", 82048, 82940, 53240, 54126, -1490);
      
        private final String _name;
        private final int _minX;
        private final int _maxX;
        private final int _minY;
        private final int _maxY;
        private final int _z;
      
        EventLocation(String name, int minX, int maxX, int minY, int maxY, int z)
        {
            _name = name;
            _minX = minX;
            _maxX = maxX;
            _minY = minY;
            _maxY = maxY;
            _z = z;
        }
      
        public String getName()
        {
            return _name;
        }
      
        public int getRandomX()
        {
            return getRandom(_minX, _maxX);
        }
      
        public int getRandomY()
        {
            return getRandom(_minY, _maxY);
        }
      
        public int getZ()
        {
            return _z;
        }
    }
  
    private void dropItem(Npc mob, Player player, int[][] droplist)
    {
        final int chance = getRandom(100);
        for (int[] drop : droplist)
        {
            if (chance >= drop[1])
            {
                mob.dropItem(player, drop[0], getRandom(drop[2], drop[3]));
                break;
            }
        }
    }
  
    public static void main(String[] args)
    {
        new Elpies();
    }
}
Спасибо большое, буду дорабатывать под себя!

Попробовал поставить РБ в эти паки, бьет ошибку
Код:
Exception on onSpawn() in notifySpawn(): class org.l2jmobius.gameserver.model.actor.instance.GrandBoss cannot be cast to class org.l2jmobius.gameserver.model.actor.instance.EventMonster (org.l2jmobius.gameserver.model.actor.instance.GrandBoss and org.l2jmobius.gameserver.model.actor.instance.EventMonster are in unnamed module of loader 'app')
java.lang.ClassCastException: class org.l2jmobius.gameserver.model.actor.instance.GrandBoss cannot be cast to class org.l2jmobius.gameserver.model.actor.instance.EventMonster (org.l2jmobius.gameserver.model.actor.instance.GrandBoss and org.l2jmobius.gameserver.model.actor.instance.EventMonster are in unnamed module of loader 'app')
    at custom.events.Elpies.Elpies.onSpawn(Elpies.java:174)
    at org.l2jmobius.gameserver.model.quest.Quest.notifySpawn(Quest.java:573)
    at org.l2jmobius.gameserver.model.quest.Quest.lambda$addSpawnId$17(Quest.java:2034)
    at org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener.executeEvent(ConsumerEventListener.java:44)
    at org.l2jmobius.gameserver.model.events.EventDispatcher.notifyToListeners(EventDispatcher.java:289)
    at org.l2jmobius.gameserver.model.events.EventDispatcher.notifyEventToSingleContainer(EventDispatcher.java:182)
    at org.l2jmobius.gameserver.model.events.EventDispatcher.lambda$notifyEventAsync$0(EventDispatcher.java:144)
    at org.l2jmobius.commons.threads.RunnableWrapper.run(RunnableWrapper.java:35)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

добавил строки

private static final int BOSS = 26443;

addSpawnId(ELPY, BOSS);
 
Блин, в ошибке же ясно написана причина, что непонятного?
В коде при спавне идет попытка прикастовать тип GrandBoss к типу EventMonster, но понятное дело что GrandBoss не наследуется от EventMonster и потому получаем ошибку.
Или назначай только мобов с типом наследным от EventMonster, или же убирай места где прикастовывание идет. Хотя во втором случае еще скорее всего надо будет что-то делать с вызываемыми методами, специфичными типу EventMonster, ради которых и идет каст.

... ладно, чет я сомневаюсь что ты понял о чем я вобще...
 
Назад
Сверху Снизу