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

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

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

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

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

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

Большое спасибо, что выложили этот код и за ваши труды. Удалось все настроить. Чтобы скрипт заработал пришлось команды изменить с    /spawncar  на  $spawncar.   Если в начале команды стоит косая черта, то она не перехватывается по флагу    case ChatMessageEventTypeID: 

Как перехватить, пока не стал разбираться и просто изменил первый символ в каждой команде. 

Если кто знает, как перехватить чат команду с косой чертой, поделитесь пожалуйста информацией. 

 

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


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



Может кто подскажет.

Это еще актуально на последней версии?

 

При запуске сервреа в лог летит такое...

И сервер падает

 

 

SCRIPT       : Registered 220 temporary action enum(s), UAN==220
SCRIPT       : CreateGame()
SCRIPT       : ... Backlit Effects Enabled
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2168": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2218": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2606": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2731": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2759": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5018": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5020": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5021": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5233": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5269": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5301": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5351": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5403": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5422": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5440": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5492": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5557": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6063": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6093": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6515": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6561": No need to use 'Cast' for up-casting
SCRIPT    (E): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,8024": Too many instructions per function

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


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

Может кто подскажет.

Это еще актуально на последней версии?

 

При запуске сервреа в лог летит такое...

И сервер падает

 

 

SCRIPT       : Registered 220 temporary action enum(s), UAN==220
SCRIPT       : CreateGame()
SCRIPT       : ... Backlit Effects Enabled
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2168": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2218": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2606": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2731": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,2759": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5018": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5020": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5021": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5233": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5269": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5301": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5351": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5403": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5422": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5440": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5492": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,5557": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6063": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6093": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6515": No need to use 'Cast' for up-casting
SCRIPT    (W): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,6561": No need to use 'Cast' for up-casting
SCRIPT    (E): @"$CurrentDir://mpmissions//dayzOffline.chernarusplus//AdminMod_Class.c,8024": Too many instructions per function

 

После обновления тоже столкнулся с ошибкой  - Too many instructions per function.   Решил ее, закомментировав некоторые ненужные блоки кода.  

К примеру:

 

/*

case "$freeze":
                                {
              ......


                                }
*/                                

 

Думаю, что разработчик ограничил количество инструкций, которые можно применить в одной функции. Особо не вникал. У меня ошибка " No need to use 'Cast' for up-casting" на работоспособность не влияет.

 

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


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

 

После обновления тоже столкнулся с ошибкой  - Too many instructions per function.   Решил ее, закомментировав некоторые ненужные блоки кода.  

К примеру:

 

/*

case "$freeze":
                                {
              ......


                                }
*/                                

 

Думаю, что разработчик ограничил количество инструкций, которые можно применить в одной функции. Особо не вникал. У меня ошибка " No need to use 'Cast' for up-casting" на работоспособность не влияет.

 

Если я правильно понял, то ошибка ссылается на строку 8024, а в ней начинается вот такой интересный блок...

Скрытый текст

                            GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(GlobalChatClear, m_GChatClear_delay, false); //Clear Global Chat !!! Delay = 3ms !!!
                            if (player_msg && selectedPlayer)
                            {
                                Msgparam = new Param1<string>( player_msg );
                                GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(at_Send_Chat_Message, m_GChatClear_delay + 3, false, selectedPlayer, player_msg, 1); //Single player //Channel 1 //MY
                            }
                            else if (player_msg)
                            {
                                Msgparam = new Param1<string>( player_msg );
                                GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(at_Send_Chat_Message, m_GChatClear_delay + 3, false, NULL, player_msg, 0); //Global chat //Channel 0 //MY
                            }
                            adm_ChatRequestExec = false; // onEvent finish work!
                            Print("::: [AdminMod_Class] ::: ADMIN CHAT EVENT: finish processing command: " + cFullCommand + " ::: adm_ChatRequestExec = " + adm_ChatRequestExec.ToString());

Его и комментить?

Тоже думал это сделать, но уж больно он интересный )))

Можете скинуть свой рабочий файлик, пожалуйста?

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

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


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

В итоге закоментил.

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

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


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

Не пиши команды рядом с игроками

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


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

я совсем один на сервере был )))

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


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

Если я правильно понял, то ошибка ссылается на строку 8024, а в ней начинается вот такой интересный блок...

  Показать содержимое

                            GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(GlobalChatClear, m_GChatClear_delay, false); //Clear Global Chat !!! Delay = 3ms !!!
                            if (player_msg && selectedPlayer)
                            {
                                Msgparam = new Param1<string>( player_msg );
                                GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(at_Send_Chat_Message, m_GChatClear_delay + 3, false, selectedPlayer, player_msg, 1); //Single player //Channel 1 //MY
                            }
                            else if (player_msg)
                            {
                                Msgparam = new Param1<string>( player_msg );
                                GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(at_Send_Chat_Message, m_GChatClear_delay + 3, false, NULL, player_msg, 0); //Global chat //Channel 0 //MY
                            }
                            adm_ChatRequestExec = false; // onEvent finish work!
                            Print("::: [AdminMod_Class] ::: ADMIN CHAT EVENT: finish processing command: " + cFullCommand + " ::: adm_ChatRequestExec = " + adm_ChatRequestExec.ToString());

Его и комментить?

Тоже думал это сделать, но уж больно он интересный )))

Можете скинуть свой рабочий файлик, пожалуйста?

Нет, комментить не его. Ошибка указывает на последнюю строку, после которой добавление кода ведет к переполнению. Думаю так. Надо закомментить ненужный код. Я убрал неиспользованные мной команды.  Пример вводимой команды $spawncar     Не забудьте свой id добавить в конфиг файл со списком админов.   Если кто решит вопрос с косой чертой или с невыполнением команды, если рядом есть игрок, поделитесь инфой.

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

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

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


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

@korish  Спасибо 

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


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

Установил. Сервер запустился. Один на серве. Ввел админ логин. При наборе /spawncar или $spawncar ничего не происходит.

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


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

Подскажите знающие, почему после установки чатадминки перестали читаться настройки из файла cfggameplay.json (размещение построек, стамина...)?

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


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

Установил. Сервер запустился. Один на серве. Ввел админ логин. При наборе /spawncar или $spawncar ничего не происходит.

1. Админ логин вводить не нужно. id админа надо добавить в файл ADMINS_LIST.lst

2. Убедитесь, что в файле AdminMod_Class.c   строка    //LoadServerSettings();     закомментирована как я показал или удалите ее.  Тогда cfggameplay.json начнет читаться. 

static void Init()
	{
		Print("::: [AdminMod_Class] ::: Init() Begin :::");
		
		//LoadServerSettings();
		LoadAdminsList();
		LoadArbitratorsList();
		LoadCommandsSettings();
.....

3. Объясню в кратце как все это работает, чтобы вам проще было исправлять.

 

Инструкция по подключению в файле с кодом. 

1.1.	Add next code to your mission file like init.c (not in class!):

		#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\_AdminTools\\AdminMod_Class.c" //подключаем AdminTools //mod edition (w/static variables and functions)
		ref AdminMod_Class AdminMod = new AdminMod_Class();
		
1.2.	Add call AdminMod.Init() to OnInit function in your custom mission class in your mission file like init.c and add overrided function OnEvent to class

		class CustomMission : MissionServer
		{
			override void OnInit()
			{
				// Another code
				
				AdminMod.Init(); //Admin mod initialization see Init() function in AdminMod_Class.c
				
				// Another code
			}

			// Another code

			override void OnEvent(EventType eventTypeId, Param params) //Call from chat
			{
				switch(eventTypeId)
				{
					case ChatMessageEventTypeID:
					{
						ChatMessageEventParams chat_params = ChatMessageEventParams.Cast(params);
						if (chat_params.param1 == 0 && chat_params.param2 != "" && chat_params.param3 != "") //trigger only when channel is Global == 0, Player Name does not equal to null and entered command
						{
							AdminMod.OnAdminChatRequest(params); //Redirect call from chat to AdminMod
						}
					break;
					}
					default:
					{
						super.OnEvent(eventTypeId,params);
					break;
					}
				break;
				}
			}
			
			// Another code
		}

Файл init.c загружается, когда стартует сервер. В него нужно добавить в самый верх путь к файлу скрипта (строка #include ....) и инициализировать этот код (строка ref Admin ....). Это загружает на сервер код из файла и далее функции скрипта можно использовать.  Запуск кода скрипта происходит командой   

AdminMod.Init(); //Admin mod initialization see Init() function in AdminMod_Class.c

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

 

......
if (chat_params.param1 == 0 && chat_params.param2 != "" && chat_params.param3 != "") //trigger only when channel is Global == 0, Player Name does not equal to null and entered command
						{
							AdminMod.OnAdminChatRequest(params); //Redirect call from chat to AdminMod
						}
...

 

После того, как это сделаете, сервер при старте будет пытаться загрузить код скрипта из файла AdminMod_Class.c    Все ошибки при использование файла скрипта будут выводиться в логи сервера (к примеру     DayZServer\profiles\script_2022-04-21_21-53-28.log).  Для тестирования кода удобно дописывать в файл функцию печати    Print("12345");  и если код дойдет до этого места, то в лог запишется строка "12345". Так вы сможете понять где прерывается выполнение кода.  При вводе сообщения в чат, оно запускает функцию скрипта 

static void OnAdminChatRequest(Param request_params)
	{
		ChatMessageEventParams chat_params = ChatMessageEventParams.Cast( request_params );
		switch(chat_params.param1)
		{
			case 0:
			{
......

Т.к. у вас нет результата при вводе команд, то для начала можно попробовать понять, а перехватывается ли сообщение и запускается ли функция. OnAdminChatRequest .  Можно вставить в код Print посмотреть в логах появился ли текст - 12312123123123123.   Проверка на админов происходит далее по коду. 

static void OnAdminChatRequest(Param request_params)
	{
		ChatMessageEventParams chat_params = ChatMessageEventParams.Cast( request_params );
		Print("12312123123123123");
		switch(chat_params.param1)

 

 

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


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

@korish Спасибо что откликнулись. Кодеры, скриптеры (или как правильно) вы великолепны. Творить такое из буковок и циферок просто мое почтение.

По серверу, команды начали считываться после добавления ADMINS_LIST.lst (ранее создавал просто Admins.lst по незнанию и отсутствию какого либо опыта в скриптах). 

По вашей наводке проверил

 

static void Init()
    {
        Print("::: [AdminMod_Class] ::: Init() Begin :::");
        
        //LoadServerSettings();  Строка была закомментирована у меня, так как скачивал ваш файлик AdminMod_Class.zip от 1 марта. Удаление так же не помогло.
        LoadAdminsList();
        LoadArbitratorsList();
. . .

 

В script.log пишется про отсутствие OpenFile error: $CurrentDir:\mpmissions\dayzOffline.chernarusplus\ARBITRATORS_LIST.lst  Его нужно создавать или если считывает то оставить как есть? И кто это арбитраторсы вообще, кого туда вписывать?

 

json-ы из cfggameplay  и других серверных модов (@ObjectsSpawner, @CacheSpawner...)  по прежнему не "видятся" и перестали отображаться в скрипт логе,  но cfgeffectarea.json работает.

В  cfggameplay были изменены мной значения стамины  из 100 до 500. После установки чатадминки визуально стамина вернулась как по умолчанию. При исполнении  команды $fullstamina uid отображается надпись fullstamina enabled но по факту кол-во стамины не изменилось. 

 

 

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

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


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

@Balger  Когда команда введена и не важно админ ее ввел или простой смертный, то она перехватывается и запускается функция 

 

static void OnAdminChatRequest(Param request_params)
    {
        ChatMessageEventParams chat_params = ChatMessageEventParams.Cast( request_params );
        switch(chat_params.param1)
        {
            case 0:
....

которая в начале проверяет, является ли игрок админом/арбитром сравнивая id игрока и id из файлов ADMIN_LIST ....  Если это админ, то начинает обрабатывать команду.  Не вникал в отличие арбитров и админов. У меня файла с арбитрами тоже нет.   Если убрать эти проверки из функции, то команды смогут выполнять и обычные игроки.  Для не админов можно оставить только некоторые команды.  Я скрипт значительно переделал, поэтому могу помогать только советом, рабочего исходного варианта у меня нет.

 

Кстати не уверен, что надо закоментить строку   //LoadServerSettings();    

 

 

21.04.2022 в 12:33, Balger сказал:

Подскажите знающие, почему после установки чатадминки перестали читаться настройки из файла cfggameplay.json (размещение построек, стамина...)?

 

Сходу не увидел в коде что-то, что могло создать вам эту проблему.  Убедитесь , что в файле serverDZ.cfg   у  вас есть строка       enableCfgGameplayFile = 1;

Недавно сталкивался с похожей проблемой, мне помогло. 

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

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


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

Кстати не уверен, что надо закоментить строку   //LoadServerSettings(); 

Пробовал и так и так - безрезультатно. 

 

enableCfgGameplayFile = 1;  Строка была прописана так как все работало до чатадминки. Даже установку на чистую версию игры пробовал...

Придется выбирать либо юзать серверные моды от 123new или админка. Совместно не хотят 

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


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

Пробовал и так и так - безрезультатно. 

 

enableCfgGameplayFile = 1;  Строка была прописана так как все работало до чатадминки. Даже установку на чистую версию игры пробовал...

Придется выбирать либо юзать серверные моды от 123new или админка. Совместно не хотят 

в функции

override void OnInit()
			{
				super.OnInit();
				AdminMod.Init(); //Admin mod initialization see Init() function in AdminMod_Class.c
			}

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

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


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

@123new Дело мастера боится. Заработало. Спасибо 

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


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

Такс, комрады, пролему с RPC (к чёрту религию) можно решить на 1-2-3:

/*
	Где (класс переменная):
    	Man AdminPlayer;
    Изначальная строка:
		GetGame().RPCSingleParam(AdminPlayer, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, AdminIdentity.GetIdentity());
    
    Пояснение:
    	Теперь для отправки сообщения требуется передавать объект класса Man, а не PlayerBase как ето было ранее.
*/
GetGame().RPCSingleParam(AdminMan, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, AdminMan.GetIdentity());

Также для тех кто ловит ошибку формата: лишком много кода на функцию:

Объяснение: админка сделана для древней версии игры, по новым требованиям длинна кода должна быть урезана.

Варианты решенеия:

  1. Дождаться когда разраб возьмёт себя в руки и перепишет функцию: OnAdminChatRequest с функциональным подходом (выведет команды в отдельные функции, что снизит объём кода на функцию) и заставит всех радоваться
  2. Заняться самому ковырянием кода и материться от объёма тушенки на 1 строку кода.
  3. Удалить ненужные по вашему мнению функции админки (что снижает объём кода для функции OnAdminChatRequest и не заставляет вас материться от ошибки сервера.
  4. Отключить одминку и выкинуть комп/сервер в окно.

В общем, таким образом проблема решаема, выбирайте что вам больше нравится.

 

Разрабу настоятельно рекомендую подумать и предоставить обновлённый релиз, чтобы не выглядеть чрезмерно усталым.

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


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

Держите рабочий вариант.  От оригинала отличается начальным символом команд, вместо /  используется $ и отсутствием пары команд (закомментированы в коде). 
Также если не создать файл со списком id админов, то админка будет работать у любого игрока (сделано для облегчения первоначальной настройки). Проверил на 
ванильном сервере. Процесс установки:

 

1. В папке D:\@Modding\server\mpmissions\dayzOffline.chernarusplus     создаем папку  _CONF, в ней 
_AdminTools  , в нее кладем файл  AdminMod_Class.c

Путь к файлу такого вида - C:\server\mpmissions\dayzOffline.chernarusplus\_MOD\_AdminTools\AdminMod_Class.c

 

 

 

2. Открываем файл    ..\mpmissions\dayzOffline.chernarusplus\init.c  

 

2.1 Добавляем в самое начало файла:

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\_AdminTools\\AdminMod_Class.c" //подключаем AdminTools //mod edition (w/static variables and functions)
        ref AdminMod_Class AdminMod = new AdminMod_Class();


        
2.1 Добавляем после строки 

class CustomMission: MissionServer
{

этот код:

override void OnInit()
    {
        // Another code
        super.OnInit(); //!!! Native call. You must put this code here first!!!
        AdminMod.Init(); //Admin mod initialization see Init() function in AdminMod_Class.c
        
        // Another code
    }    

override void OnEvent(EventType eventTypeId, Param params) //Call from chat
    {
        switch(eventTypeId)
        {
            case ChatMessageEventTypeID:
            {
                ChatMessageEventParams chat_params = ChatMessageEventParams.Cast(params);
                if (chat_params.param1 == 0 && chat_params.param2 != "" && chat_params.param3 != "") //trigger only when channel is Global == 0, Player Name does not equal to null and entered command
                {
                    AdminMod.OnAdminChatRequest(params); //Redirect call from chat to AdminMod
                }
            break;
            }
            default:
            {
                super.OnEvent(eventTypeId,params);
            break;
            }
        break;
        }
    }    


    
2.2 Сохраняем.    
Пример файла прикрепляю. Можете попробовать использовать его. 

 

 

3. Запускаем , подключаемся и вводим в чат к примеру   $spawncar

 

 

п.с. Если нужно добавить только себя в админы , то создаем файл ..\mpmissions\dayzOffline.chernarusplus\_CONF\ADMINS_LIST.lst
и вставляем первой строкой свой стим айди 17 значный. 
Список команд см. в самом коде  AdminMod_Class.c
Если что-то не работает , то смотрим

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

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

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


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

Добрый день. Если на сервере игроки с одинаковым ником (Survivor) и кто-то пытается выполнить команду, то она выполняется у всех с таким же ником.   Сообщение из чата перехватывается таким образом, что не возможно понять, кто именно из одноименцев написал команду.  Хоть и в чате вы будете Survivor (5) , а перехватится сообщение от имени Survivor т.к. именно оно указано в параметрах запуска игры. 

Перехватываются сообщения кодом:

 

override void OnEvent(EventType eventTypeId, Param params) //Call from chat
    {
        switch(eventTypeId)
        {
            case ChatMessageEventTypeID:
            {
                Print("ChatMessageEventTypeID:");
                ChatMessageEventParams chat_params = ChatMessageEventParams.Cast(params);
                if (chat_params.param1 == 0 && chat_params.param2 != "" && chat_params.param3 != "") //trigger only when channel is Global == 0, Player Name does not equal to null and entered command
                {
                    AdminMod.OnAdminChatRequest(params); //Redirect call from chat to UserMod
                }
            break;
            }
            default:
            {
                super.OnEvent(eventTypeId,params);
            break;
            }
        break;
        }
    }

Далее класс админки берет имя из чата (params)  и ищет игрока с таким именем среди подключившихся:

for ( i = 0; i < players.Count(); ++i )

                    {

                        str_nmpl = players.Get(i).GetIdentity().GetName();

                        if (str_nmpl.IndexOfFrom( 0, chat_params.param2) == 0){ 

                            UserPlayer = PlayerBase.Cast(players.Get(i));

                            UserIdentity = UserPlayer.GetIdentity();

                            UserUID = UserIdentity.GetPlainId();

                        }

                    }

Видел, на других серверах чат-команды работают не взирая на то,  что на сервере много людей с одинаковыми никами.

 

Поделитесь информацией, как точно идентифицировать игрока, который написал сообщение в чат?

 

Пробовал изменять ник игрокам, если он повторяется, получилось, но только клиентским модом @Survivor name changer.  Также в данный момент сделал костыль, который просит игрока ввести последние цифры своего стимайди перед командой, но это не удобно людям. Менять свой Survivor народ тоже не горит желанием.  Копался в коде чата, но пока попытки не дали результат.  

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

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


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

if (str_nmpl.IndexOfFrom( 0, chat_params.param2) == 0){ 

выкинь это на(Слово удалено системой). и напиши нормально

if (str_nmpl == chat_params.param2) { 

 

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


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

Добрый день. Если на сервере игроки с одинаковым ником (Survivor) и кто-то пытается выполнить команду, то она выполняется у всех с таким же ником.   Сообщение из чата перехватывается таким образом, что не возможно понять, кто именно из одноименцев написал команду.  Хоть и в чате вы будете Survivor (5) , а перехватится сообщение от имени Survivor т.к. именно оно указано в параметрах запуска игры. 

Перехватываются сообщения кодом:

 

override void OnEvent(EventType eventTypeId, Param params) //Call from chat     {         switch(eventTypeId)         {             case ChatMessageEventTypeID:             {                 Print("ChatMessageEventTypeID:");                 ChatMessageEventParams chat_params = ChatMessageEventParams.Cast(params);                 if (chat_params.param1 == 0 && chat_params.param2 != "" && chat_params.param3 != "") //trigger only when channel is Global == 0, Player Name does not equal to null and entered command                 {                     AdminMod.OnAdminChatRequest(params); //Redirect call from chat to UserMod                 }             break;             }             default:             {                 super.OnEvent(eventTypeId,params);             break;             }         break;         }     }


override void OnEvent(EventType eventTypeId, Param params) //Call from chat
    {
        switch(eventTypeId)
        {
            case ChatMessageEventTypeID:
            {
                Print("ChatMessageEventTypeID:");
                ChatMessageEventParams chat_params = ChatMessageEventParams.Cast(params);
                if (chat_params.param1 == 0 && chat_params.param2 != "" && chat_params.param3 != "") //trigger only when channel is Global == 0, Player Name does not equal to null and entered command
                {
                    AdminMod.OnAdminChatRequest(params); //Redirect call from chat to UserMod
                }
            break;
            }
            default:
            {
                super.OnEvent(eventTypeId,params);
            break;
            }
        break;
        }
    }

Далее класс админки берет имя из чата (params)  и ищет игрока с таким именем среди подключившихся:

for ( i = 0; i < players.Count(); ++i )                     {                         str_nmpl = players.Get(i).GetIdentity().GetName();                         if (str_nmpl.IndexOfFrom( 0, chat_params.param2) == 0){                              UserPlayer = PlayerBase.Cast(players.Get(i));                             UserIdentity = UserPlayer.GetIdentity();                             UserUID = UserIdentity.GetPlainId();                         }                     }


for ( i = 0; i < players.Count(); ++i )

                    {

                        str_nmpl = players.Get(i).GetIdentity().GetName();

                        if (str_nmpl.IndexOfFrom( 0, chat_params.param2) == 0){ 

                            UserPlayer = PlayerBase.Cast(players.Get(i));

                            UserIdentity = UserPlayer.GetIdentity();

                            UserUID = UserIdentity.GetPlainId();

                        }

                    }

Видел, на других серверах чат-команды работают не взирая на то,  что на сервере много людей с одинаковыми никами.

 

Поделитесь информацией, как точно идентифицировать игрока, который написал сообщение в чат?

 

Пробовал изменять ник игрокам, если он повторяется, получилось, но только клиентским модом @Survivor name changer.  Также в данный момент сделал костыль, который просит игрока ввести последние цифры своего стимайди перед командой, но это не удобно людям. Менять свой Survivor народ тоже не горит желанием.  Копался в коде чата, но пока попытки не дали результат.  

Никаких нак.й имён! Нельзя так перехватывать вызов админки. Согласно точке зрения систем безопасности - необходимо перехватывать уникальный ключ, а не хрень в виде имени, напомню: ажминка имена с пробелами не читает, собственно: Survivor (HZ) и Survivor - для админки эдентичны. Перехват необходимо делать через SteamID, так как такой перехват будет максимально точным и SteamID не использует пробелы!

 

Имя игоока меняется через запуск игры с параметром -name=PianiyDebil или "-name=Pianiy Debian"

 

Читаем код админки функция OnChatRequest:

array<Man> players= new array<Man>;

GetGame().GetPlayers (players);

for (int i = 0; i < players.Count(); i++)

{

If (players.GetIdentity().GetName() == chat_params.param2 &&players.GetIdentity().GetName(). Length== chat_params.param2)

{

if (players.GetIdentity().GetPlainID() в списке дминов или орбитеров...)

{

Ты нашел игрока вызвовашего админкувот так просто.

Получаешь имя, сверяешь по имени, длинне имени и 

 

 

 

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


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

Дело в параметрах этого события:

ChatMessageEventParams

typedef Param4<intstringstringstring> ChatMessageEventParams

channel, from, text, color config class

 

Когда игрок вводит сообщение в чат, то  срабатывает это событие и к сожалению оно не имеет в своих параметрах SteamID игрока или хоть какого-то уникального идентификатора. Совсем печально то, что даже если имя игрока повторяется и в чате  система ему автоматом ставит дополнительный номер (1) (2) ... , то в параметрах этого события     (chat_params.param2) все равно будет не уникальное имя!!! Написал Survivor (2) а chat_params.param2 =   Survivor

Копаю дальше, надеюсь кто-то поможет сэкономить мне время.

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

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


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

Дело в параметрах этого события:

ChatMessageEventParams typedef Param4<int, string, string, string> ChatMessageEventParams channel, from, text, color config class


ChatMessageEventParams

typedef Param4<intstringstringstring> ChatMessageEventParams

channel, from, text, color config class

 

Когда игрок вводит сообщение в чат, то  срабатывает это событие и к сожалению оно не имеет в своих параметрах SteamID игрока или хоть какого-то уникального идентификатора. Совсем печально то, что даже если имя игрока повторяется и в чате  система ему автоматом ставит дополнительный номер (1) (2) ... , то в параметрах этого события     (chat_params.param2) все равно будет не уникальное имя!!! Написал Survivor (2) а chat_params.param2 =   Survivor

Копаю дальше, надеюсь кто-то поможет сэкономить мне время.

Так то да, тебе же указали метод и цикл как получить всех игроков и какие примерно проводить проверки что Выживальщик 1 это тот кто вызвал и имеет право на вызов.

 

Речь только об етом. Так то мне кажется, что игру писали 2 разные команды, где сейчас есть команда мододудиков (вместо о - у, вместо у - о), которая с головой не дружит вовсе. На кой ад кому либо нужно имя, если все noname = Survivor (X), это костыль разработки.

 

Но за что заплатили - то получили.

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


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

Так то да, тебе же указали метод и цикл как получить всех игроков и какие примерно проводить проверки что Выживальщик 1 это тот кто вызвал и имеет право на вызов.

 

Речь только об етом. Так то мне кажется, что игру писали 2 разные команды, где сейчас есть команда мододудиков (вместо о - у, вместо у - о), которая с головой не дружит вовсе. На кой ад кому либо нужно имя, если все noname = Survivor (X), это костыль разработки.

 

Но за что заплатили - то получили.

 

Не получается получением всех игроков понять от кого конкретно поступила команда, т.к. имею только  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.  

 

 

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