, Гильдия «Черамор»

CustomChatEvent

» опубликован
» Способ реализации: Zinc
» Тип: Наработка

Система обработки комманд чата

MUI: да
Импорт: нет
Утечки: нет
Требования: JNGP

Скриншоты

Установка

  • Скопировать триггер CustomChatEvent

Примеры

» -name Смена имени игрока
//! zinc
library PlayerName requires CustomChatEvent {
    string Color[]; // Цвета игроков
    
    // Объявим функциию сообщения, чтоб не копипастить
    function msg(string str){
        DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, str);
    }
    
    // Функция изменения имени
    function setName(){
        player p = CCE.chatPlayer; // Игрок, написавший сообщение
        string color = Color[GetPlayerId(p)]; // Цвет игрока
        string oldname = GetPlayerName(p); // Имя игрока, напившего сообщение
        string name = CCE.chatString; // Строка сообщения
        
        // Зпретим короткие имена
        if (StringLength(name) < 2){
            if (GetLocalPlayer() == p){
                msg("|cffff0000Имя должно быть не короче двух знаков!");
            }
            return;
        }
        
        // Сменим имя игроку
        SetPlayerName(p, name); 
        
        // Сообщим всем об этом
        msg(color+oldname + "|r теперь зовут "+color + name+"|r");
    }
    
    function onInit(){
        msg("Чтобы изменить имя напечатайте |cffffff00-name |cff909090Ваше новое имя");
    
        // Задаём цвета для игрока
        Color[0] = "|cffff0000"; // red
        Color[1] = "|cff0000ff"; // blue
        Color[2] = "|cff00f5ff"; // teal
        Color[3] = "|cff551A8B"; // purple
        Color[4] = "|cffffff00"; // yellow
        Color[5] = "|cffEE9A00"; // orange
        Color[6] = "|cff00CD00"; // green
        Color[7] = "|cffFF69B4"; // pink
        Color[8] = "|cffC0C0C0"; // gray
        Color[9] = "|cffB0E2FF"; // lightblue
        Color[10] = "|cff006400"; // darkgreen
        Color[11] = "|cff8B4513"; // brown
        
        CustomChatEvent
            .create("name") // ловим -name
            .addSynonym("имя")  // ловим -имя
            .addSynonym("тфьу")  // не забываем тех, кто перепутал раскладку
            .onSuccess(function setName) // указываем функцию, которая сработает при удачном отлове
        ;
    
    }
}
//! endzinc
» -zoom Установка дальности камеры
//! zinc
library Zoom requires CustomChatEvent {
    real ChangeTime = 0.6; // Время смены камеры
    real Default = 1650; // Стандартное расстояние
    real Min = 500; // Минимальное расстояние
    real Max = 4000; // Максимальное расстояние
    
    // Объявим функциию сообщения, чтоб не копипастить
    function msg(string str){
        DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, str);
    }
  
    // Функция смены камеры
    function setZoom() {
        real zoom = S2R(CCE.chatString);
        
        // При неверных или отсутствующих параметрах установим значение по умолчанию
        if (zoom < Min || zoom > Max){
            zoom = Default;
        }
        
        // Установим камеру
        if (GetLocalPlayer() == CCE.chatPlayer && zoom >= Min && zoom <= Max){
            SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, zoom, 4);
            msg("Дальность камеры: |cffffff00" + I2S(R2I(zoom)) + "|r");
        }
    }

    function onInit(){
        msg("Чтобы изменить имя напечатайте |cffffff00-zoom |cff909090" + I2S(R2I(Min)) + "<>" + I2S(R2I(Max)));
        
        CustomChatEvent
            .create("zoom") // ловим -zoom
            .addSynonym("зум") // ловим -зум
            .addSynonym("ящщь") // не забываем тех, кто перепутал раскладку
            .onSuccess(function setZoom) // указываем функцию, которая сработает при удачном отлове
        ;
    }
}
//! endzinc
» -mode Выбор модов для игры
//! zinc
library Mode {
    integer Current = 0; // Текущий режим игры: 0 - не выбран;
    string Help[];
    player HostPlayer; // Игрок, ответственный за выбор модов;
    
    // Объявим функциию сообщения, чтоб не копипастить
    function msg(string str){
        DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, str);
    }
    
    // Показываем список всех модов
    function showHelp(){
        // Перебираем массив, пока в нём есть элементы.
        integer i = 1;
        while(true){
            if (Help[i] == null){
                return;
            }
            msg(Help[i]);
            i = i+1;
        }
    }
    
    // Назначаем игрока, ответственного за выбор модов
    function getHost() -> player {
        integer i;
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            if (
                GetPlayerController(Player(i)) == MAP_CONTROL_USER
                &&
                GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING 
            ){
                if (Player(i) == GetLocalPlayer()){
                    msg("Чтобы посмотреть список режимов напечатайте |cffffff00-mode");
                }
                return Player(i);
            }
         }
         return Player(0); // Вернм первого игрока, чтоб парсер не ругался.
    }
    
    // Устанавливаем мод
    function setMode(){
        if (GetLocalPlayer() != HostPlayer) {
            return;
        }
    
        if (CCE.chatCommand == "mode"){
            if (Current == 0){
                showHelp();
            } else {
                msg("Текущий режим игры: " + Help[Current]);
            }
            return;
        }

        if (Current > 0){ return; }
        
        if (CCE.chatCommand == "allpick" || CCE.chatCommand == "ap"){
            // Действия для -allpick
            Current = 1;
        } else if (CCE.chatCommand == "allrandom" || CCE.chatCommand == "ar"){
            // Действия для -allrandom
            Current = 2;
        } else if (CCE.chatCommand == "singledraft" || CCE.chatCommand == "sd"){
            // Действия для -singledraft
            Current = 3;
        }
        
        msg("Выбран режим игры: " + Help[Current]);
    }
    
    function onInit(){
        // Назначаем игрока, ответственного за выбор модов
        HostPlayer = getHost();
    
        // Заполняем подсказки
        Help[1] = "|cffffff00-allpick|r / |cffffff00-ap|r, игроки могут выбирать любых героев из таверн.";
        Help[2] = "|cffffff00-allrandom|r / |cffffff00-ar|r, каждому игроку достается совершенно случайный герой.";
        Help[3] = "|cffffff00-singledraft|r / |cffffff00-sd|r, игроку дается на выбор 3 случайных героя.";
        
        // Настраиваем события
        CustomChatEvent
            .create("mode") // ловим -mode
            .addSynonym("allpick")  // ловим -allpick
            .addSynonym("ap") // ловим -ap
            .addSynonym("allrandom") // ловим -allrandom
            .addSynonym("ar") // ловим -ar
            .addSynonym("singledraft") // ловим -singledraft
            .addSynonym("sd") // ловим -sd
            .onSuccess(function setMode) // указываем функцию, которая сработает при удачном отлове
        ;
    }
}
//! endzinc
» -unit Создание юнитов
//! zinc
library Unit requires CustomChatEvent {
    real X, Y; // Координаты появления юнитов
    
    
    function addUnit(){
        integer i;
        player p;
        
        if (CCE.chatParamCount >= 2){
            i = S2I(CCE.chatParam[0]);
            if (i < 1 || i >= bj_MAX_PLAYER_SLOTS){
                return;
            }
            p = Player(i-1);
            
            for (1 <= i < CCE.chatParamCount){
                CreateUnitByName(p, CCE.chatParam[i], X, Y, GetRandomReal(0, 360));
            }
        }
    }
    
    function onInit(){
        // Задаём координаты
        X = GetRectCenterX(gg_rct_AddUnit);
        Y = GetRectCenterY(gg_rct_AddUnit);
    
        // 
        CustomChatEvent
            .create("unit") // ловим -unit
            .addSynonym("юнит")  // ловим -юнит
            .addSynonym("гтше") // не забываем тех, кто перепутал раскладку
            .onSuccess(function addUnit) // указываем функцию, которая сработает при удачном отлове
        ;
    }
}
//! endzinc

Техничеcкие подробности

» Порядок вызова
// Создаём функцию обработчик
function addUnit(){
	// Здесь доступна структура CCE
}

// Создаём экземпляр
CustomChatEvent
            .create("unit") // ловим -unit
            .addSynonym("юнит")  // ловим -юнит
            .addSynonym("гтше") // не забываем тех, кто перепутал раскладку
            .onSuccess(function addUnit) // указываем функцию, которая сработает при удачном отлове
;
» Описание ССE
struct CCE {
	static player chatPlayer; // Игрок, вызвавший комманду
	static string chatCommand = ""; // Комманда без префикса
	static string chatString = ""; // Строка параметров
	static string chatParam[64]; // Массив параметров разбитых по пробелу из строки
	static integer chatParamCount = 0; // Колличество полученных параметров
}
» Код наработки
//! zinc
library CustomChatEvent {

    CustomChatEvent Struct[];
    integer StructI = -1;
    string Prefix = "-";
    string Delimiter = " ";
    
    function trim(string str) -> string {
        integer i, len = StringLength(str);
        integer s= 0, e = len;
        string c;
        
        for(0 <= i < len){
            c = SubString(str, i, i+1);
            if (c == " "){ s = s+1;}
            else { break; }
        }
        for (len > i >= 0){
            c = SubString(str, i, i+1);
            if (c == " "){ e = e-1; }
            else { break; }
        }
        return SubString(str, s, e);
    }
    
    public {
        struct CCE {
            static player chatPlayer;
            static string chatCommand = "";
            static string chatString = "";
            static string chatParam[64];
            static integer chatParamCount = 0;
        }
    
        struct CustomChatEvent {
            string CommandString[1024];
            integer CommandStringI = -1;
            conditionfunc CommandFunc;
            
            method addCommandString(string s){
                CommandStringI = CommandStringI + 1;
                CommandString[CommandStringI] = s;
            }
                    
            static method create(string s) -> CustomChatEvent {
                CustomChatEvent this = CustomChatEvent.allocate();
                this.addCommandString(s);
                
                StructI = StructI + 1;
                Struct[StructI] = this;
                
                return this;
            }
            
            method getInteger() -> CustomChatEvent {
                return this;
            }
            
            method addSynonym(string s) -> CustomChatEvent {
                this.addCommandString(s);
                return this;
            }
            
            method onSuccess(code func){
                this.CommandFunc = Condition(func);
            }
            
            method check(player p, string command, string param) {
                boolean isFind = false;
                integer i, length = StringLength(param);
                trigger t;
                string str, char;
                
                for (0 <= i <= this.CommandStringI){
                    if (this.CommandString[i] == command){
                        isFind = true;
                    }
                }
                if (isFind){
                    CCE.chatPlayer = p;
                    CCE.chatCommand = command;
                    CCE.chatString = param;
                    CCE.chatParamCount = 0;
                    
                    str = "";
                    for(0 <= i <= length){
                        if (i == length){ char = Delimiter; }
                        else { char = SubString(param, i, i+1); }
                        if (char == Delimiter){
                            if (str != ""){
                                CCE.chatParam[CCE.chatParamCount] = str;
                                CCE.chatParamCount = CCE.chatParamCount + 1;
                            }
                            str = "";
                        } else {
                            str = str + char;
                        }
                    }
                    
                    t = CreateTrigger();
                    TriggerAddCondition(t, this.CommandFunc);
                    TriggerEvaluate(t);
                    TriggerClearConditions(t);
                    DestroyTrigger(t);
                }
                
                t = null;
            }
        }
    }
    
    function onInit(){
        integer i;
        trigger t = CreateTrigger();
        
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            if (
                GetPlayerController(Player(i)) == MAP_CONTROL_USER
                &&
                GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING 
            ) {
                TriggerRegisterPlayerChatEvent(t, Player(i), Prefix, false );
            }
        }
        
        TriggerAddAction(t, function (){
            string input = GetEventPlayerChatString();
            integer i, k, length = StringLength(input);
            string char, command = "", param = "";
            boolean isCommandTyped = false;
            
            if (SubString(input, 0, 1) != Prefix) { return; }
            
            for(0 <= i <= length){
                if (i == length){ char = Prefix; }
                else { char = SubString(input, i, i+1); }
                
                if (char == Prefix){
                    if (command != ""){
                        for(0 <= k <= StructI){
                            Struct[k].check(GetTriggerPlayer(), command, trim(param));
                        }
                    }
                    isCommandTyped = true;
                    command = "";
                    param = "";
                }
                if (char == Delimiter){
                    isCommandTyped = false;
                }
                
                if (isCommandTyped) {
                    if (char != Prefix){
                        command = command + char;
                    }
                } else {
                    param = param + char;
                }
                
            }
        });
    
        t = null;
    }
}
//! endzinc


Просмотров: 661

» Лучшие комментарии


8gabriel8 #1 - 9 месяцев назад 0
Описывай, что это и зачем?
NazarPunk #2 - 9 месяцев назад (отредактировано ) 0
8gabriel8:
Описывай, что это и зачем?
Простенькая библиотека, которая может разобрать строку чата, например -name My new name -zoom 2500 -ar -givegold 2 3000 -deposit 400 на комманды с параметрами и повесить на на них обработчики.
Rockmaf #3 - 8 месяцев назад 3
Ну, неплохо,теперь буду использовать для карты.
Bergi_Bear #4 - 8 месяцев назад (отредактировано ) 0
NazarPunk, А сделай тогда наработку эту более серьёзной как например создание юнита по равкоду, добавление предметов и способностей например такие команды:
createunit Hpal - создаст юнита это гарвкода
createitem Iaif - создаст предмет если такое есть, иначе ошибка
addability A000 - добавит способность для выбранного юнита
removeability Acid - удалит способность у выбранного юнита
Ну и доп параметры на количество юнитов, на координаты предмета, на уровень способности и т.д.
А CreateUnitByName, это сдандартная функция чтоли? никогда не раскрывал её внутренности
PT153 #5 - 8 месяцев назад (отредактировано ) 0
А CreateUnitByName, это сдандартная функция чтоли? никогда не раскрывал её внутренности
Да, это нативка, работает только на стандартных воинов на английском языке.
Сам я не тестировал, но как я понял, если передать в неё Footman, то создастся пехотинец, даже если у него уже другое имя.
NazarPunk #6 - 8 месяцев назад 0
Ну и доп параметры на количество юнитов, на координаты предмета, на уровень способности и т.д.
Задача наработки разобрать строку и повесить обработчики. Остальное зависит от фантазии разработчиков.
Bergi_Bear:
createunit Hpal - создаст юнита это гарвкода
createitem Iaif - создаст предмет если такое есть, иначе ошибка
addability A000 - добавит способность для выбранного юнита
removeability Acid - удалит способность у выбранного юнита
Если кто напишет обратный алгоритм к Rawcode To String, добавлю в примеры.
А CreateUnitByName, это сдандартная функция чтоли? никогда не раскрывал её внутренности
native CreateUnitByName takes player whichPlayer, string unitname, real x, real y, real face returns unit
С рускими именами не работает.
Bergi_Bear #7 - 8 месяцев назад 0
Если кто напишет обратный алгоритм к Rawcode To String, добавлю в примеры.
так вот и напиши =)
Это сообщение удалено
pro100master #9 - 8 месяцев назад 0
а что в ней сложного?
NazarPunk #10 - 8 месяцев назад 0
так вот и напиши =)
Как лень победю, так и напишу)
Bergi_Bear #11 - 8 месяцев назад 0
NazarPunk, не лень было делать то что уже есть, и красиво оформлять, но лень делать реально полезную и универсальную вещь, странно....
NazarPunk #12 - 8 месяцев назад 0
не лень было делать то что уже есть, и красиво оформлять, но лень делать реально полезную и универсальную вещь, странно....
Такой вот я странный зверёк))

А честно, если мне позволят опубликовать вещи из примеров с зависимостью от этой библиотеки, то я вам не только это сделаю
Bergi_Bear:
createunit Hpal - создаст юнита это гарвкода
createitem Iaif - создаст предмет если такое есть, иначе ошибка
addability A000 - добавит способность для выбранного юнита
removeability Acid - удалит способность у выбранного юнита
В планах, вот эту штуку переписать))
NazarPunk #13 - 8 месяцев назад 0
так вот и напиши =)