Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной

Рекомендованные сообщения

12 минут назад, korish сказал:

 

Не получается получением всех игроков понять от кого конкретно поступила команда, т.к. имею только  chat_params.param2 = Survivor   ,   кто из Survivor (1), Survivor (2), Survivor (3) ее написал?   

 

Захожу я значит на кое какой сервер, где есть чат-команды. Мой ник при этом становится Survivor (5), т.е. на серваке еще 4 таких NoName.  Ввожу команду информация о сервере /info и система понимает, кто ввел команду и предоставляет сообщение лично мне.  Система из пяти NoName определила, кому послать сообщение. Как она это сделала?  Думаю, что не благодаря  ChatMessageEventParams.   

 

Может я конечно ошибаюсь, но я выводил в лог значение параметра chat_params.param2 и писал от разных игроков Survivor (1) ...... Survivor (5) и этот параметр был всегда равен только Survivor.  

 

 

Объясняю:

Нонеймы имеют имена: Survivor, Survivor (1), ..., Survivor (XXX).

Событие OnChatMessage имеет аргументы: канал, Имя игрока отправившего и Текст сообщения.

 

Имя игоока передаётся целиком (так как событие обрабатывается игрой: клиентом на сервер, сервером - клиентам).

То есть если у тебя клиент Survivor (156) от правит текст, событие словит: 0, Survivor (156), dhejsjfjejwsj.

 

Всё огонь, в событии лучше не ковырять это, так что в ажминке OnAdminChat - ковыряй. Так же сжелай возврат значения типа bool, если админ запросил - true, не - false. Если сделать в событии - это повесит чат.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MagicByte MagicByte MagicByte
30 минут назад, griha41 сказал:

Объясняю:

Нонеймы имеют имена: Survivor, Survivor (1), ..., Survivor (XXX).

Событие OnChatMessage имеет аргументы: канал, Имя игрока отправившего и Текст сообщения.

 

Имя игоока передаётся целиком (так как событие обрабатывается игрой: клиентом на сервер, сервером - клиентам).

То есть если у тебя клиент Survivor (156) от правит текст, событие словит: 0, Survivor (156), dhejsjfjejwsj.

 

Всё огонь, в событии лучше не ковырять это, так что в ажминке OnAdminChat - ковыряй. Так же сжелай возврат значения типа bool, если админ запросил - true, не - false. Если сделать в событии - это повесит чат.

 

Возможно вы про событие ChatMessageEventParams а не про   OnChatMessage т.к. такого я пока не наблюдаю.

 

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

 

Если вы будете Survivor (156) и напишете текст, то событие словит   0, Survivor, dhejsjfjejwsj.  .  Если бы оно ловило Survivor (156) я бы этот вопрос тут не задавал))))

Изменено пользователем korish (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, korish сказал:

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

 

Если вы будете Survivor (156) и напишете текст, то событие словит   0, Survivor, dhejsjfjejwsj.  .  Если бы оно ловило Survivor (156) я бы этот вопрос тут не задавал))))

Ваш ход мысли верен, но не хватает знаний и анализа!

 

Проблема не в событии, проблема в админке, в обработке аргументов, о чём я Вам писал до этого: для ажминки: Survivor, Survivor (1), Survivor (156), Survivor GodDmnIt = Survivor (одно и тоже)!

 

Потому что, в OnAdminChat передаётся Param, разбирая Param берите аргумент2 и сверяйте с текущим списком (совпадения имени), обратите внимание на эквивалент строки, длинну строки, сделайте хеш из строки и сравните хеш (ужастно полезно, так как шанс найти различия увеличивается в 100500 раз), разберите dta.pbo, найдите EnString.c поишите hash функцию и эксперементируйте. У меня это всё фурычит без излишних проблем.

 

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

Изменено пользователем griha41
Доб. поясние. (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, korish сказал:

 

Не получается получением всех игроков понять от кого конкретно поступила команда, т.к. имею только  chat_params.param2 = Survivor   ,   кто из Survivor (1), Survivor (2), Survivor (3) ее написал?   

 

Захожу я значит на кое какой сервер, где есть чат-команды. Мой ник при этом становится Survivor (5), т.е. на серваке еще 4 таких NoName.  Ввожу команду информация о сервере /info и система понимает, кто ввел команду и предоставляет сообщение лично мне.  Система из пяти NoName определила, кому послать сообщение. Как она это сделала?  Думаю, что не благодаря  ChatMessageEventParams.   

 

Может я конечно ошибаюсь, но я выводил в лог значение параметра chat_params.param2 и писал от разных игроков Survivor (1) ...... Survivor (5) и этот параметр был всегда равен только Survivor.  

 

 

Потому как чат параметры только ник, канал и текст сообщения передают. И ник всегда без цифры.
Искать по этим параметрам - всеравно что иголку в стоге сена. Ошибка будет при двух одинаковых никах, потому как приписка через GetName() от идентифи не определяется.

Другое дело что возможно в другом где-то месте определять чат сообщения и парсить их, но методов не встретил. 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ХА-ХА

"Цену на газ возвращает"

)))
з.ы. Спасибо за Ваши работы, 123new 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, griha41 сказал:

ажминка имена с пробелами не читает

Да?
 

    override void OnEvent( EventType eventTypeId, Param params )
    {
        super.OnEvent( eventTypeId, params );

        ChatMessageEventParams v_ChatMessageEventParams    =    ChatMessageEventParams.Cast( params );
        if ( v_ChatMessageEventParams )
        {
            Print( string.Format( "Имя: ^%1^", v_ChatMessageEventParams.param2 ) );
        }
    }

 

SCRIPT       : Имя: ^NoNameUltima 012^

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 часов назад, NoNameUltima сказал:

Да?
 

override void OnEvent( EventType eventTypeId, Param params ) { super.OnEvent( eventTypeId, params ); ChatMessageEventParams v_ChatMessageEventParams = ChatMessageEventParams.Cast( params ); if ( v_ChatMessageEventParams ) { Print( string.Format( "Имя: ^%1^", v_ChatMessageEventParams.param2 ) ); } }


    override void OnEvent( EventType eventTypeId, Param params )
    {
        super.OnEvent( eventTypeId, params );

        ChatMessageEventParams v_ChatMessageEventParams    =    ChatMessageEventParams.Cast( params );
        if ( v_ChatMessageEventParams )
        {
            Print( string.Format( "Имя: ^%1^", v_ChatMessageEventParams.param2 ) );
        }
    }

 

SCRIPT : Имя: ^NoNameUltima 012^


SCRIPT       : Имя: ^NoNameUltima 012^

Да, комрад, да, см вызовы функции:


static void OnAdminChatRequest(Param request_params)
{
	ref array<string> chatCommand = ParseCommand(chat_params.param3); // Получает список строк, разделённых " "
      /* Проблема логики - Survivor (1) как аргкмент для функции /kill Survivor (1) вернёт 2 элемента: "Survivor", "(1)", и выполнение накроется...
      Не, если у Вас нет такой функции - ето отлично, но по сути - без карты метод, аргумент - это всё брихня и надо переписываться метод для парсинка не по имени,
      а как минимум по ID (позиция из списка игроков) или SteamID для отличия Survivor / Survivor (X)
      */
}

Прошу прощения за долгий ответ.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

import shutil
import time

def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    count = 0

    while True:
        #print('asdadad')

        try:
            doc_file = open("D:\@0101_Server_Dayz_v2.0\ServerProfiles\DayZServer_x64.ADM", "r")

        except OSError:
            print("Could not open/read file:")
            time.sleep(10)
            continue


        with doc_file as fp:
            lines = fp.readlines()

        # Если номер последней выведенной строки
        # больше числа строк открытого файла, то это новый файл и возвращаем счетчик
        if count > len(lines) + 1:
            count = 0
            f = open("D:\@0101_Server_Dayz_v2.0\ServerProfiles\DayZServer_x64.ADM2", "w")
            f.close()

        # если добавились строки то читаем строку
        while count < len(lines):

            try:
                messageServer = lines[count]
                print(messageServer)

                if len(messageServer) > 0 and messageServer != '\n':
                    index = messageServer.find("| Chat")
                    # Если строка от сервера с

                    if index > 0:
                        print(messageServer)
                        try:
                            f = open("D:\@0101_Server_Dayz_v2.0\ServerProfiles\DayZServer_x64.ADM2", "a")

                            f.write(messageServer)

                        except OSError:
                            print("Could not open/read file:")
                            time.sleep(10)
                            continue
                        f.close()

                    else:
                        count = count + 1
                        continue

                count = count + 1
            except Exception as e:
                print(e)
                count = count + 1

        doc_file.close()

        time.sleep(1)


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print('start')
    print_hi('PyCharm')
    input()

 

Ну и кусок кода из скрипта админки в качестве ориентира. 

void OnAdminChatRequest()

    {

        ref TStringArray        m_ListArray;

        string file_log = "$profile:\\DayZServer_x64.ADM2"

        m_ListArray = LoadFile(file_log);

        for (int n = strokaLogaOldRead; n < m_ListArray.Count(); n++ )

        {

            strokaLogaOldRead = strokaLogaOldRead+ 1;

            //Print("::: [PersistentDoors] ::: Load path village: " + m_AdminsListArray.Get(i));

            Print(m_ListArray.Get(n));

            string strChat = m_ListArray.Get(n);

           

           

           

            int ss = strChat.IndexOfFrom( 0, "(id=" );

           

            string uidLog = strChat.Substring(ss+4, 44);

            string commandText = strChat.Substring(ss+52, strChat.Length()-(ss+52));

            Print("Введена команда  "+ commandText);



            int ss1 = strChat.IndexOfFrom( 0, "Chat(" );

            string login = strChat.Substring(ss1+6, ss - (ss1+7));

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

Изменено пользователем korish (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Очень нравится эта админка! Супер решение для безмодового сервера (альтернатив не встречал, слышал про томату, но им не пользовался) Но встретил проблему - переполнение кодом. Не знаю как решать, очень хочу самостоятельно расширить и доработать админку, но это меня сильно ограничивает эта вещь. Плюс я не нашёл нигде про аирдроп, как его добавить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
22.09.2024 в 16:10, GancaProsecco сказал:

Очень нравится эта админка! Супер решение для безмодового сервера (альтернатив не встречал, слышал про томату, но им не пользовался) Но встретил проблему - переполнение кодом. Не знаю как решать, очень хочу самостоятельно расширить и доработать админку, но это меня сильно ограничивает эта вещь. Плюс я не нашёл нигде про аирдроп, как его добавить?

Переполнение - проверяй значения в функциях. Просто так этого не бывает.

AirDrop - надо раскоментить строки кода отвечающие за поддержку AirDrop, но проблема в том, что админка выполняется НА СТОРОНЕ КЛИЕНТА тк Сервер ещё с 1.10 не получает текстовых сообщений.
(клиент тк событие OnEvent в миссии выполняется на клиенсткой машине. И во-вторых, это тоже самое как засунуть в отдельный мод эту админку и выполнять на MissionServer).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@GancaProsecco У вас работает данная админка сейчас на 1.27?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
22.09.2024 в 16:10, GancaProsecco сказал:

Очень нравится эта админка! Супер решение для безмодового сервера (альтернатив не встречал, слышал про томату, но им не пользовался) Но встретил проблему - переполнение кодом. Не знаю как решать, очень хочу самостоятельно расширить и доработать админку, но это меня сильно ограничивает эта вещь. Плюс я не нашёл нигде про аирдроп, как его добавить?

Тут надо уточнить:

Случай 1: Переполнение кодА - ошибка: выход за пределы массива/списка, лечение: а) проверка массива на объявленность (не NULL); б) нсучиться считать от 0ля до n-1.

Случай 2: Переподненик кодОМ - начиная с 1.05 в DayZ длинна скриптовых файлов ограничена кажется 5тью тыс строк кода, по этому init.c и дерективы компилятора #include выполняют расширение скриптовой базы (в объёме). Лечение: Оптимизация кода, отказ от дублирующихся блоков кода выполняющие одно и тоже действие т.е. в фукнции 1 и 2 есть блок для получения имени пользователя - нафиг в отдельную функцию (будет под номером 3), а в функциях 1 и 2 - оставить вызов функции 3. Это поможет оптимизировать и минимизировать код.

 

К сожалению баггемия п*дерактив стала высококачественной игродельной конторой, так что вывести админку в Сервер Мод - не выйдет (условно реально, но реализация RPC в игре хромает с самого их появления, не всегда из события CurrentMission.OnEvent можно отправить RPC на сервермод MissionServer с сообщением. CF - не является решением, тк дурственно не работает RPC (для возможности отправки RPC клиент должен знать, что есть приёмник RPC, не важно какой)).

 

Так что приходится ломать голову. К стати, вывод админки в Сервер Мод - позволило начихать на ограничения CustomMission (не способность работы с классами/событиями из модов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: Sancezz063
      Привет, есть ли актуальная админка , которая работает без общей загрузки мода.
      Раньше была Dayz-Sa-Tomato которая не требовала чтобы все игроки загружали эту админку, но разработчик прекратил разработку этой админки.
      Есть ли аналоги ? 
    • Автор: Alex39
      Прописал скрипт, серверные сообщение, вроде как работают, но есть косяки, может кто подскажет в чем проблема,
      override void OnInit() { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(NumPlayersOnServer, 30000, true); // 30 seconds } void NumPlayersOnServer() { ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numPlayers = players.Count(); for( int i=0; i < players.Count(); ++i ) { Man player = players.Get(i); if( player ) { string messPlayers = "Players on the server: " + numPlayers.ToString(); Param1<string> m_MessageParam = new Param1<string>(messPlayers); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); } } }
       
      Проблема пропадание трейдера, админ тулз из за этого скрипта
       
      override void OnInit() { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(NumPlayersOnServer, 30000, true); // 30 seconds }  
    • Автор: 123new
      В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о количестве игроков.
       
      Нам понадобится:
      1. Сервер DayZ 1.0, сделанный по одному из гайдов:
      2. Notepad++
      3. Немножечко трезвого ума
       
      Приступим:
      1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c
      2. В самом начале файла добавляем:
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\PlayersMessagesCount.c" Находим функцию
      void main() и перед ее закрывающей скобкой "}"добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(SendPlayersCount, CountPlayers_TIME_InfoPlayers_Repeat, true); 3. Помещаем в папку файл
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Либо создаем вручную этот файл с именем "PlayersMessagesCount.c" и заполняем его следующим текстом:
      int CountPlayers_TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) string Message_Chat = "Online Players: "; void SendPlayersCount() { array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { foreach(Man player: players) { CountPlayers_SendPersonalMessage(Message_Chat + numbOfplayers.ToString(), player); } // GetGame().ChatPlayer(0,Message_Chat + numbOfplayers.ToString()); } } void CountPlayers_SendPersonalMessage(string message, Man player) { if(( player ) && (message != "")) { Param1<string> m_GlobalMessage = new Param1<string>(message); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_GlobalMessage, true, player.GetIdentity()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке
      int CountPlayers_TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) указываем время повтора вывода сообщений в чат (поумолчанию стоит 2 минуты)
      и текст сообщений в переменной
      string Message_Chat = "Online Players: ";  
      P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
    • Автор: 123new
      В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о количестве игроков.
       
      Нам понадобится:
      1. Сервер DayZ 0.63, сделанный по одному из гайдов:
      2. Notepad++
      3. Немножечко трезвого ума
       
      Приступим:
      1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c
      2. В самом начале файла добавляем:
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\PlayersMessagesCount.c" И после строки
      weather.SetWindFunctionParams(0, 0, 0); добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(SendPlayersCount, TIME_InfoPlayers_Repeat, true); Пример:

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

      3. Помещаем в папку файл Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Либо создаем вручную этот файл с именем "PlayersMessagesCount.c" и заполняем его следующим текстом:
      int TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) string Message_Chat = "Online Players: "; void SendPlayersCount() { array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { GetGame().ChatPlayer(0,Message_Chat + numbOfplayers.ToString()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке
      int TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) указываем время повтора вывода сообщений в чат (поумолчанию стоит 2 минуты)
      и текст сообщений в переменной
      string Message_Chat = "Online Players: ";  
      P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.