Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe

Recommended Posts

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

 

Share this post


Link to post
Share on other sites







Posted (edited)
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) я бы этот вопрос тут не задавал))))

Edited by korish (see edit history)

Share this post


Link to post
Share on other sites
Posted (edited)
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 ... - пользоваться админков вовсе. Из серии не знаком с косяками - нечего админить, на чужую голову.

Edited by griha41
Доб. поясние. (see edit history)

Share this post


Link to post
Share on other sites
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() в идентифи игрока, но она вместо данных полного ника (как я понимаю, именно оно должно быть) цену на газ в Европе возвращает, потому не вариант с нею. 

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

Share this post


Link to post
Share on other sites

ХА-ХА

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

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

Share this post


Link to post
Share on other sites
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^

 

Share this post


Link to post
Share on other sites
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)
      */
}

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Sancezz063
      Привет, есть ли актуальная админка , которая работает без общей загрузки мода.
      Раньше была Dayz-Sa-Tomato которая не требовала чтобы все игроки загружали эту админку, но разработчик прекратил разработку этой админки.
      Есть ли аналоги ? 
    • By 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 }  
    • By 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. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
    • By 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. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.