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

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

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

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

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

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

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. Если сделать в событии - это повесит чат.

 

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


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





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 (история изменений)

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 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, в противном случае мы будем считать, что вы согласны с этим.