Jump to content

Recommended Posts

Вопрос к знатокам. Как вы и сами знаете,этот эвент  запускается только с админа. А как сделать сее чудо чтобы он запускался автоматом.Скажем через 2 часа или как то так.

Думаю что тут ничего такого сложного нету.Просто надо понимать механику(как говорят здесь на форуме)  Можно на этом примере показать что и как править?

Примерно на эту тему уже поднимался вопрос от Gloom----->

Найдутся ли желающие научить такому делу нас нубасов (способных), такому делу в результате которого получается набор ини файлов в папке конфиг гейм сервера, что бы мы могли брать чтото более менее и делать основу а не сверху за счёт исправления квестов по средствам хмл файликов.

   Найдутся нам учителя? Или пока Java не проглотим х...й нам а не счастье?

Думаю надо обратиться к IceWind .Может ролик выпустит на эту тему.

************************************************************************************************************************

C:\Server_GrandCrusade\game\data\events\

<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/events.xsd">
    <event name="Elpies" class="com.l2jmobius.gameserver.instancemanager.events.ElpiesManager">
        <scheduler>
            <!-- Schedule every day at 16:50 -->
            <schedule name="start" hour="16" minute="50">
                <event name="#startEvent" />
            </schedule>

            <!-- Attach condition to reset if server boots up after start and hasn't reset yet -->
            <conditionalSchedule>
                <run name="start" if="HASNT_RUN" />
            </conditionalSchedule>
        </scheduler>
    </event>
</list>

 

******************************************************************************************************************

C:\Server_GrandCrusade\game\data\scripts\custom\events\Elpies\

package custom.events.Elpies;

import java.util.concurrent.ScheduledFuture;

import com.l2jmobius.Config;
import com.l2jmobius.commons.concurrent.ThreadPool;
import com.l2jmobius.gameserver.datatables.SpawnTable;
import com.l2jmobius.gameserver.model.L2Spawn;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2EventMonsterInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.quest.Event;
import com.l2jmobius.gameserver.util.Broadcast;

public final 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
        {  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);
    }
    
    @Override
    public boolean eventBypass(L2PcInstance activeChar, String bypass)
    {
        return false;
    }
    
    @Override
    public boolean eventStart(L2PcInstance 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[] locations = EventLocation.values();
        final EventLocation randomLoc = locations[getRandom(locations.length)];
        
        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;
        }
        
        for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(ELPY))
        {
            final L2Npc npc = spawn.getLastSpawn();
            if (npc != null)
            {
                npc.deleteMe();
            }
        }
        
        Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
        Broadcast.toAllOnlinePlayers("Elpy Event finished!");
        return true;
    }
    
    @Override
    public String onKill(L2Npc npc, L2PcInstance 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(L2Npc npc)
    {
        ((L2EventMonsterInstance) npc).eventSetDropOnGround(true);
        ((L2EventMonsterInstance) 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 static void dropItem(L2Npc mob, L2PcInstance 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();
    }
}
 

 

 

 

Share this post


Link to post
Share on other sites

Это местная логическая переменная (private static boolean).  

В eventStart она EVENT_ACTIVE = true;

В eventStop она EVENT_ACTIVE = false;

 

Не понятно чего тебе надо вообще.

В 10.02.2020 в 08:28, Lafania сказал:

Скажем через 2 часа или как то так.

Через 2 часа после чего? От какой точки брать отсчет? 

Какой смысл тебе говорить сейчас как сделать, качать сборку и смотреть че там... Ведь ты после этого не придешь к чему-то, не станешь лучше. Думать сложно. Именно поэтому грузчиков больше, чем умных людей. Потому что когда начинаешь думать, сразу хочется как-то съехать с темы. Тема становится тошнотворной, неинтересной до невыносимости. Но стимулом для тебя может быть взять точку отсчета и начать преодолевать насильственно этот барьер. Чтобы доказать что ты можешь. А то завтра ты будешь таким, как сегодня. А послезавтра таким, как завтра. И так далее. 

Ты думаешь всем интересно кодить? Нет, до блевотины тошнотворно входить в эту движуху. Но аппетит появляется во время еды. Когда ты берешь на себя ответственность, когда от тебя что-то зависит. И появляется интерес. Возьми ответственность за себя для начала, за прожитый сегодня день и то, с чем ты пойдешь в завтра. Жизнь коротка. И сегодня ты бы уже свободно разбирался, если бы месяц назад взялся конкретно. Но так время проходит и ты стоишь на месте сегодня, завтра, послезавтра, через неделю и до самой смерти. Начни сравнивать себя во времени и почитай что такое альтернативные издержки. И во что вкладывать свои время и силы, чтобы получить в итоге лучший результат. 

 

Share this post


Link to post
Share on other sites

P.S. Интересы меняются. Через некоторое время ты поймешь, что движ со сборками тупиковый. И только хороший специалист по сетевым технологиям, криптографии смог бы разрулить нормальный, защищенный (до определенного уровня) сервак. Интернет - это среда ddos и других атак, где под тебя покопают просто ради интереса, просто ради развлечения покладут твой сервер. А что с ним сделают твои конкуренты, я уже молчу. Так или иначе есть некая целевая аудитория и все борются за охват, за время потребителя и его потребительский выбор. 

Я хочу затронуть также Лемона и посоветовать создать клан. Это бюджетный вариант заявить о себе. Можно прокатиться по ряду прочих ГФШ. А на собственном ГФШ тренироваться ходить на РБ, устраивать пвп пачку на пачку и так далее. Чтобы хорошо сыграться. Я думаю, что многие кланы не имеют вполне четких наборов тактик, адаптированных к определенным игровым местностям и игровым условиям. А это решает в пвп. Можно засветиться на стримах других и увести их аудиторию, создав более интересный контент. Можно собрать аудиторию, которую можно будет потом увлечь на свой сервер. Нужно лишь начать стримить на твиче и на ютубе, чтобы собрать игровую аудиторию. Это единственный бюджетный вариант. 

Но, так или иначе, программирование не заканчивается только на ковырянии дырявых сборок. Ты сможешь уйти в веб-дизайн или что-то подобное. Зачатки уже будут. Потому что программирование - это специфический диалог компьютера с человеком. Это как квантовая механика: электрон движется вокруг ядра по прямой. Как можно двигаться вокруг чего-либо по прямой? Это тоже логическая такая штука. Оказывается, что кроме скаляров есть еще и векторы, другие типы данных. Точно также, как бесконечно малая величина в интегральном, дифференциальном исчислениях. Эта величина обозначается dx. Это тоже определенный тип данных. 

Короче говоря хз, я не знаю что я еще могу сказать. Ищи мотивацию. Соперничество или самокопание... Кому что помогает... Каждому свое. Но факт, что есть самосознание. И узнать кто ты можно только сопоставляя себя с другими по определенным критериям. Кто-то может быть для тебя точкой отсчета, чтобы оценивать свои позиции в деле. Но не скатываясь в нарциссизм и диссоциальное расстройство личности. 

Share this post


Link to post
Share on other sites

Для клана нужно убивать время в игре, а у меня к примеру его нету. На разработку сервера часа 3-4 вечером выделяю.

Да и сейчас кланы продажные во основном, игроков очень мало, большинство кланов играют за финансовое вознаграждение.

По поводу ддос и прочего. Я сервер разрабатываю потому что мне это нравиться. Запускать сервер как бизнес проект дорого, хотя птс сборка стоит около 25 тыс рублей, аренда железа тоже не сильно много, защита от ддос тоже терпимо, а вот реклама уже ударит по карману. Хотя если собрать все, то не плохая сумма выходит, а гарантий нету что это дело окупится.

  • Thanks 1

Share this post


Link to post
Share on other sites
19 минут назад, VLemon сказал:

Для клана нужно убивать время в игре, а у меня к примеру его нету. На разработку сервера часа 3-4 вечером выделяю.

Да и сейчас кланы продажные во основном, игроков очень мало, большинство кланов играют за финансовое вознаграждение.

По поводу ддос и прочего. Я сервер разрабатываю потому что мне это нравиться. Запускать сервер как бизнес проект дорого, хотя птс сборка стоит около 25 тыс рублей, аренда железа тоже не сильно много, защита от ддос тоже терпимо, а вот реклама уже ударит по карману. Хотя если собрать все, то не плохая сумма выходит, а гарантий нету что это дело окупится.

Прагматическая сторона хорошая. Хорошо, когда нравится, это один из редких случаев. В большинстве случаев нравятся только деньги. 

Вообще говоря, это все, за исключением рекламы, можно и самому сделать. Если есть спортивный интерес. Попутно сборки продавать можно. А свой сервер - для теста. И многие так начинали. Нужно также учитывать, что на стримах можно неплохо накопить. В общем, таких компенсирующих затраты обратных связей в стратегии можно найти достаточно много, чтобы минимизировать издержки.  Только проблема в том, что игра теряет популярность. Люди убывают, как ты верно отметил. Об этом говорил также и BoHpts в одном из своих роликов. Сетуя, что люди забивают на игру. 

Вообще говоря, я мог бы сделать неплохую криптосистему и сеть для сервера. Недавно вот писал про гаммирование на википедии. Клод Шеннон доказал, что при определённых свойствах гаммы этот метод шифрования является абсолютно стойким (то есть не поддающимся взлому). Тогда как для большинства шифров существует некоторое время их жизни. И есть специальные мощные компьютеры с специально разработанными алгоритмами. 

EaCzhF_3uQr8JCvuOhLBsyfSEvUqUxfQNs48UpdX

Большинство гамма-шифров с нелинейной обратной связью являются закрытой темой для обширной публики, используясь в военной сфере.  Я это пишу не только чтобы отобразить некоторые свои изыскания на тему айти, информатики, вообще мой интерес в этой сфере, но и чтобы в общем комментарий был снабжен определенной дополнительной информативностью. Ведь люди заходят, интересуются, и неплохо было бы осветить некоторые вводящие в общий курс аспекты на мой взгляд. 

По subject, в принципе, я бы тоже не стал заморачиваться со сборками и проектировать системы. Я заходил на твой ГФШ и надо сказать, он мне начал нравится с момента появления эмблемы после двойного клика. Неплохо проработан чисто с интерфейсной точки зрения. Однако, на лестнице в деревне темных эльфов, как подниматься в храм, по левую сторону стоит ГК. И там в бортике этой лестницы по сторону ГК дыра в геодате. С первых же минут игры провалился через этот бортик. Местами ощущалось, что работает только PathFind, но нет геодаты. Постараюсь быть на открытии. 

Ну а автору темы советую просто тщательно изучить что такое блок-схемы. Чтобы внятно и четко формулировать и представлять то, что он хочет. Это упростит коммуникацию с разработчиками. А лучше самому стать одним из них. :classic_wink:

Share this post


Link to post
Share on other sites

За отзыв конечно спс 1nterrupt.  Может в академии так и надо говорить.Но мы на форуме среди простых людей. Мы тут не академики. Повторю еще раз.

Вопрос к знатокам.  Как вы и сами знаете,этот эвент  запускается только с админа. А как сделать сее чудо чтобы он запускался автоматом.Скажем через 2 часа или как то так.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...