PTS + Mono ext. New AI ScriptEngine

gattsu

Выдающийся
Проверенный
Победитель в номинации 2018
Победитель в номинации 2017
За веру и верность форуму
За заслуги перед форумом
Преподаватель
Сообщения
165
Розыгрыши
0
Репутация
1 457
Реакции
293
Баллы
1 393
Веду разработку нового ai движка.
Еxt который подключает к стандартному серверу L2NPC .
Что позволяет вести разработку AI на C# и компилировать в CLI dll.


Пример кода:
Код:
using System;

public class SpecialBossSpawn : MakerScript
{
    public override void onStart(MakerEvent e)
    {
        NpcMakerEx ex = e.myself;
        e.gg.SendMakerScriptEvent(ex, 1, 2, 3);
        for (int i = 0; i < ex.def_count; i++)
        {
            NpcSpawnDefineEx def = ex.GetSpawnDefine(i);
            Logger.Info($"def {def.name} {def.dbname}");
            if(def.has_dbname != 0)
                def.LoadDBNpcInfo(1010);
        }
    }

    public override void onDBNpcInfo(MakerEvent e)
    {
        Logger.Info($"Time {e.loaded_def.dbname} {e.loaded_def.respawn_rand} {e.loaded_def.respawn_time}");
        DBNpcInfo info = e.record0;
        if (info.is_alive == 0)
        {
            Logger.Info($"onDBNpcInfo dead {info.death_time}");
        }
        else
            e.loaded_def.SpawnEx(1, 0, info.x, info.y, info.z, 0, info.hp, info.mp, info.db_value);
    }

    public override void onNpcCreated(MakerEvent e)
    {
        e.gg.Announce($"onNpcCreated {e.created_def.dbname}");
    }

    public override void onNpcDeleted(MakerEvent e)
    {
        Logger.Info("onNpcDeleted ");
    }

    public override void onScriptEvent(MakerEvent e)
    {
        Logger.Info($"SciptEvent {e.script_event_arg1} {e.script_event_arg2} {e.script_event_arg3}");
    }
}
Результат
На данный момент позволяет одновременно использовать старый ai и новый.

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

Профит:
- Дает возможность использовать библиотеку .Net платформы. Возможен выбор из множества языков поддерживающих mono платформу.
- Простота разработки нового аи.
- Легкое расширение нового функционала.
-- Добавление полей и новых методов.
-- Добавление кастомных событий
- Быстродействие. Mono имеет JIT компилятор, что должно значительно увеличить производительность.

Планирую продажи данного чуда. Выслушаю любые предложение и пожелания
На данный момент пока веду обкатку технологии на PTS C4(int ext). После сделаю реализацию для GF.

Есть еще в планах подключение к L2Server.(Mono)
 

Сильная вещица, но не все знают языки программирования, у меня есть пару знакомых скриптеров лучших на рынке и они попросту не знают ни C#, в месте с продажей такой вещице нужно давать хорошую документацию и многочисленные примеры.
 
Сильная вещица, но не все знают языки программирования, у меня есть пару знакомых скриптеров лучших на рынке и они попросту не знают ни C#, в месте с продажей такой вещице нужно давать хорошую документацию и многочисленные примеры.
А жаль, ибо этот экст делает скриптописание значительно гибче. Единственный, пожалуй, минус - то, что из любого скрипта можно влезть в реестр (хотя не факт, не уверен, что такой функционал есть в моно).
 

 
Последнее редактирование:
Будет не заменимым инструментом для любителей писать модификации =)
 
Есть уже вполне рабочий и самодостаточный NASC - язык программирования АИ с Си-подобным синтаксисом. Синтаксис прост и интуитивно понятен. Изучать что-то типа питона, руби, сишарпа и тп совершенно не обязательно.
Работа любого ПТС-АИ-"компилятора" заключается исключительно в трансляции языка "высокого уровня" в некий пи-код АИ-исполнителя, реализованного в л2нпц-модуле.
Вы или подстраиваетесь под исполнитель, или полностью его заменяете (в таком случае вам проще со смели договориться)
А вот сам АИ-исполнитель не сможет прыгнуть "выше себя".
И потому ему ваши "Легкое расширение нового функционала. Добавление полей и новых методов. Добавление кастомных событий. Быстродействие" - как мертвому припарки. Без глубокой модификации гейм-модуля нет смысла заниматься расширением функционала АИ. Ну если тока сахарку подсыпать, который за много лет так никому и не понадобился.
Ваша идея состоятельна ровно до тех пор, пока кто либо из ваших клиентов не испытает ее в боевом применении и не напишет объективный отзыв.
Во всем остальном, желаю вам обретения опыта, который вы, уверен, направите в более перспективное русло :)
 
Как бы там ни было, а всегда ценится сама Идея, если угадать, если совпадёт с желанием даже не большинства, то она будет работать.
 
Пример:
Фиксированный спавн боссов. Боссы спавнятся после смерти через заданное количество суток и в указанном промежутке времени с анонсами.
Настройка через стандартный npcpos
Код:
using System;

public class SpecialBossSpawn : MakerScript
{
    public int respawn_hour = 0;

    public override void onStart(MakerEvent e)
    {
        respawn_hour = GetInt("respawn_hour");
        NpcMakerEx ex = e.myself;
        e.gg.SendMakerScriptEvent(ex, 1, 2, 3);
        for (int i = 0; i < ex.def_count; i++)
        {
            NpcSpawnDefineEx def = ex.GetSpawnDefine(i);
            if (def.has_dbname != 0)
                def.LoadDBNpcInfo(1010);
        }
    }

    public override void onDBNpcInfo(MakerEvent e)
    {
        DBNpcInfo info = e.record0;
        if (info.is_alive == 0)
        {
            int time = e.gg.GetTimeOfDay();
            int delay = RespawnDelay(GetDate(info.death_time), e.loaded_def);
            if (delay <= time) {
                int maxdelay = (delay + e.loaded_def.respawn_rand);
                if (maxdelay > time)
                {
                    e.gg.Announce($"Босс {e.loaded_def.dbname} скоро появится");
                    e.loaded_def.Spawn(1, e.gg.Rand(maxdelay - time));
                }
                else
                    e.loaded_def.Spawn(1, 0);

            } else {
                e.myself.AddTimerEx(1000, (delay - time) * 1000);
            }
        }
        else
            e.loaded_def.SpawnEx(1, 0, info.x, info.y, info.z, 0, info.hp, info.mp, info.db_value);
    }

    public override void onNpcCreated(MakerEvent e)
    {
        e.gg.Announce($"Появился босс {e.created_def.dbname}");
    }

    public override void onTimerEx(MakerEvent e)
    {
        NpcSpawnDefineEx def = e.myself.GetSpawnDefine(0);
        e.gg.Announce($"Босс {def.dbname} скоро появится");
        def.Spawn(1, e.gg.Rand((Normal(GetDate()) + def.respawn_rand) - e.gg.GetTimeOfDay()));
    }

    public override void onNpcDeleted(MakerEvent e)
    {
        Date time = GetDate();
        e.myself.AddTimerEx(1000, (RespawnDelay(time, e.deleted_def) - time.time) * 1000);
    }

    private int Normal(Date date)
    {
        return (date.time + (respawn_hour - date.hour) * 3600 - date.min * 60 - date.sec);
    }

    private int RespawnDelay(Date time, NpcSpawnDefineEx def)
    {
        return Normal(time) + def.respawn_time;
    }
}
 
Последнее редактирование:
  • Мне нравится
Реакции: risi
И потому ему ваши "Легкое расширение нового функционала. Добавление полей и новых методов. Добавление кастомных событий. Быстродействие" - как мертвому припарки. Без глубокой модификации гейм-модуля нет смысла заниматься расширением функционала АИ. Ну если тока сахарку подсыпать, который за много лет так никому и не понадобился.
Нужно с чего то да начинать и пускай сейчас это просто модуль для написания АИ скриптов на CLR совместимых языках.

А в остальном для популяризации данного продуката наверное прийдется:
Предоставить возможность кастомерам конвертировать свой код АИ в С#. (Как полного ai.obj так и частично)
Добавить поддержку кастомных АИ(AdvExt) и избегать конфликтов с другими экстами. (Так как защита AdvExt может вполне вышвернуть ваш модуль с рантайма)
Для выхода продукта на рынок без экстов к CacheD и L2Server с дополнениями по протоколам и прочих вкусных штук наверное будет сложно.

А так ждем новостей о развитии данного экста :Happy:

Код:
        for (int i = 0; i < ex.def_count; i+:-)

Позитивная строчка :)
 
Последнее редактирование модератором:
Как продвигается работа?
 
Отличная идея. Стало очень интересно про разработку.
Только вот Mono отталкивает. Никогда не работал и не собирался. Но C# вроде бы везде C#. ;)
 
Назад
Сверху Снизу