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

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

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

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

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

Вывод сообщений о подключении и отключении игроков на серверe Dayz 1.0

Приветствую, а есть возможность о выводе сообщений о подключении и отключении игрока на сервер, по типу вывода объявлений в чат или о количестве игроков. видел на 0.63 версию, но не уверен работает или нет тот скрипт. Был бы благодарен в помощи)

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


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

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

  • 0

объединил часть простых вариантов с темы обсуждения:
 

modded class CustomMission
{
	override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		super.InvokeOnConnect(player, identity);
		GetGame().ChatPlayer("Игрок " + identity.GetName() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке
	}
	
	override void InvokeOnDisconnect( PlayerBase player )
	{
		private PlayerIdentity identity = NULL;
		identity = player.GetIdentity();
		if (player && identity)
		{
			GetGame().ChatPlayer("Игрок " + identity.GetName() + " отключился");
		}
		super.InvokeOnDisconnect( player );
	}
	
/*	override void PlayerDisconnected(PlayerBase player, PlayerIdentity identity, string uid)
	{
		PlayerDisconnectedMessage(identity,player);
		super.PlayerDisconnected(player, identity, uid);
	}
	
	void PlayerDisconnectedMessage(PlayerIdentity identity,PlayerBase player)
	{
		if (!player)
		{
			if (identity)
			{
				GetGame().ChatPlayer("Игрок " + identity.GetName() + " отключился");
			}
		}
	}*/
}

создаем любой файл .c в миссии (например 'My_connect_disconnect_messages_scripts.c'), в начале инита подцепляем его с include, например

#include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\My_connect_disconnect_messages_scripts.c"

и все должно работать, при этом в родном ините ничего не надо больше менять.
P.S. Не проверял, но как мне кажется - править так удобнее.

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


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





  • 0

AntonZavodskih Значица так

Все более чем просто

 

Зайду из далека что бы понятней было и в последствии было проще разбираться самому

 

папочка mpmissions\dayzOffline.chernarusplus - это папочка миссии (на нее указывает параметр в конфиге сервера и название можно менять)

 

внутри init.c - файл который читает сервер при инициализации - для чего? суть ниже

 

В нем класс миссии

class CustomMission: MissionServer

 

class CustomMission: MissionServer
{

 //Тут функции класса

}

Этот класс является расширением нативного класса MissionServer (файлы .c с ним запакованы в scripts.pbo в папке dta и сервер его читает оттуда),

Функции из MissionServer вызываются движком во время

 

Например при инициализации (запуска) сервера движком вызывается функция OnInit() из класса MissionServer

А тк CustomMission расширение класса, мы можем эту функцию переопределить

override void OnInit()

B теперь вместо функции из класса будет выполняться наша функция из класса миссии

 

небольшое отступление:

если нам же нужно вызвать нативный OnInit() из класса MissionServer то внутри нашего OnInit() мы расположим вызов нативной функции

super.OnInit();

 

При создании персонажа для вновь подключившегося игрока вызывается функция CreateCharacter которая возвращает движку персонажа созданного для

нового игрока

в классе миссии мы ее так же переопределяем и делам там все что нужно нам (нативная функция из MissionServer соответственно выполняться не будет)

override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)

 

В классе MissionServer есть и другие функции которые выполняются по событиям и тд итп - их все можно переопределять в классе миссии и использовать по своему усмотрению. Можем так же добавлять свои и вызывать их из переопределенных...

 

Что нам нужно для отправки сообщения о подключении

 

А надо нам найти функцию которая обрабатывает именно подключение (любого игрока, а не только нового)

Такая функция в классе MissionServer называется InvokeOnConnect

 

мы ее переопределяем в классе миссии (методом добавления кода конечно же)

 

	override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		super.InvokeOnConnect(player, identity); //Тут мы вызовем нативную функцию что бы не тащить ее код сюда
		
		GetGame().ChatPlayer("Игрок " + identity.GetName() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке
	}

Теперь вместо просто нативной функции при подключении игрока движек вызовет нашу переопределенную функцию

 

внутри которой

1 Сначала мы вызовем нативную функцию

2 затем отправим сообщение в глобальный чат с помощью функции ChatPlayer из клсса CGame (это глобальный класс (так же формирующийся движком))

 

теперь при подключении игрока всем будет прилетать сообщение в чат

 

Про отключение игроков поговорим чуть позже

 

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


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

BorizzK , издеваешься?!:joy: Теперь ещё и это понять?.. А придётся - вещь пользительная... (Где смайл ОЧЕНЬ тяжёлого и печального вздоха?)

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


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

BorizzK Вайтлисту не помешает?

override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		super.InvokeOnConnect(player, identity);
		GetGame().ChatPlayer("Игрок " + identity.GetName() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке

		//Если игрок в черном списке или игрока нет в белом списке будет кик и функция вернет false
		if (!Server_WhiteList.CheckWBListConnectAllow(player, identity))
		{
			return; //IF KICK
		}
	}

 

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


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

AntonZavodskih А логически поразмылить???

 

добавляете сообщение в чат в имеющуюся функцию

 

получается так

override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		super.InvokeOnConnect(player, identity);
		
		//Если игрок в черном списке или игрока нет в белом списке будет кик и функция вернет false
		if (!Server_WhiteList.CheckWBListConnectAllow(player, identity))
		{
			return; //IF KICK
		}
		
		//ИГРОКА НЕ КИКНУЛО И ОН ПОДКЛЮЧИЛСЯ !!!
		GetGame().ChatPlayer("Игрок " + identity.GetName() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке

	}

 

С чего бы должно помешать?

Разместите сообщение в чат ПОСЛЕ проверки вайтлистом ибо если кикнет зачем писать про подключение игрока в чат?

 

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

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


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

BorizzK ок, осталось об отключении

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


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

AntonZavodskih С отключением немного сложнее

Ибо отключение бывают несколько видов

1 Игрок нажал отключиться и ждет 15 сек

2 Игрок нажал отключиться и не ждет а жмакает отключиться

3 Игрок отключился тк крашнулся клиент

4 Игрок отключился тк произошел разрыв связи, баттлай его кикнул (тут баттла сама в чат всем напишет)

 

вобщем есть решение, но оно иногда может написать 2 раза в чат

 

Берем нативную функцию обработки отключения InvokeOnDisconnect и делаем отправку сообщения в чат там

Ну и вставляем в тот же класс мисcии под InvokeOnConnect

 

	override void InvokeOnDisconnect( PlayerBase player )
	{
		if (player && player.GetIdentity())
		{
			GetGame().ChatPlayer("Игрок " + player.GetIdentity().GetName() + " отключился");
		}
		super.InvokeOnDisconnect( player );
	}

Но иногда Identity для перса уже NULL и сообщение не отправляется... Вот в чем засада
А отправлять сообщение без имени не комильфо.

 

Потому решал сделать еще и так:

	override void OnClientDisconnectedEvent(PlayerIdentity identity, PlayerBase player, int logoutTime, bool authFailed)
	{
		if (player.GetIdentity()) 
		{
			string playerNAME = player.GetIdentity().GetName(); // Помещаем в переменную имя игрока заранее
		}

		//Код из штатной функции весь тут тк мы вносим изменения и в него то же, а не просто дополняем, поэтому вызова нативной функции через super тут не будет
		bool disconnectNow = true;
		Message = "Игрок " + playerNAME + " отключился";
		msgSended = false;
	
		// TODO: get out of vehicle
		// using database and no saving if authorization failed
		// TODO: get out of vehicle
		// using database and no saving if authorization failed
		if (GetHive() && !authFailed)
		{			
			if (player.IsAlive())
			{	
				if (!m_LogoutPlayers.Contains(player))
				{
					Print("[Logout]: New player " + identity.GetId() + " with logout time " + logoutTime.ToString());
					
					// inform client about logout time
					GetGame().SendLogoutTime(player, logoutTime);
			
					// wait for some time before logout and save
					LogoutInfo params = new LogoutInfo(GetGame().GetTime() + logoutTime * 1000, identity.GetId());
					m_LogoutPlayers.Insert(player, params);
					
					// allow reconnecting to old char
					GetGame().AddToReconnectCache(identity);
					
					// wait until logout timer runs out
					disconnectNow = false;		
				}
				return;
			}		
		}
		//Код из штатной функции 

		//Код из штатной функции 
		if (disconnectNow) //условие выполнится если клиент долждался обратного отчета или нажал кнопку отключения не ожидая таймаута
		{
			Print("[Logout]: New player " + identity.GetId() + " with instant logout");
			
			// inform client about instant logout
			GetGame().SendLogoutTime(player, 1);
			
			PlayerDisconnected(player, identity, identity.GetId());

			//После PlayerDisconnected identity уже всегда NULL и имя игрока, но мы заранее поместили в переменную playerNAME имя отключающегося игрока.
			//Проверяем получено имя игрока в начале.
			if (playerNAME)
			{
				GetGame().ChatPlayer(message);
				msgSended = true;
			}
		}
		//Код из штатной функции
		
		//Можно конечтно и тут организовать доп проверку (а вдруг disconnectNow = false, а игрок все же отключился - такое бывало много раз)
		if (!identity && playerNAME && !msgSended) //Если identity = NULL (клиент отключился), получено имя игрока в начале и сообщение не отсылалось в предыдущем условии
		{
			GetGame().ChatPlayer(message);
		}
	}

Откорректировал штатную функцию и переопределил ее ниже под переопределенной InvokeOnConnect

 

Правда бывает (редко) прилетает 2 сообщения, но редко

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


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

С отключением игроков можно конечно заморочиться с функцией из класса PlayerBase - OnDisconnect, но тогда надо

Либо делать мод

Либо распаковывать scripts и моддить PlayerBase.c

По мне, так надо минимизировать вмешательство в scripts и прикручивание модов и выжимать максимум из класса миссии.

 

P.S. И поменьше использовать CallLater. ))))

 

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


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

еще можно оповещение сделать:

1. через rcon протокол

2. читать .adm файл и выводить данные через тот же rcon протокол

3. читать .adm файл и выводить данные через скрипт на стороне сервера

 

хотя первый вариант я считаю идеальным. собственно им и пользуюсь.

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

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


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

AntonivkA У меня на сервере гибкая система оповещений

О подключении и отключении сообщения идут только подключенным к игровому процессу админам и арбитрам (арбитры люди которые могут пользоваться админкой ограниченно)
Сообщения об убийствах так же гибко настраиваются

Есть так же оповещения

О поедании человечины

Разделке трупов

 

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


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

Работает отлично, видно кто входит и выходит, но я именно этот отрезок взял

 

override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		super.InvokeOnConnect(player, identity);
		GetGame().ChatPlayer("Игрок " + identity.GetName() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке
	}
	
	override void InvokeOnDisconnect( PlayerBase player )
	{
		private PlayerIdentity identity = NULL;
		identity = player.GetIdentity();
		if (player && identity)
		{
			GetGame().ChatPlayer("Игрок " + identity.GetName() + " отключился");
		}
		super.InvokeOnDisconnect( player );
	}

 

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


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

О подключении и отключении сообщения идут только подключенным к игровому процессу админам и арбитрам (арбитры люди которые могут пользоваться админкой ограниченно)

 

у нас, с бородатых времен ультимы, арбитров принято называть ГМ (ГеймМастер) =))

 

12 часа назад, BorizzK сказал:

AntonivkA У меня на сервере гибкая система оповещений

Сообщения об убийствах

Есть так же оповещения

О поедании человечины

Разделке трупов

 

никто не спорит) я о том, что систему оповещений можно сделать множеством способов.

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

 

ЗЫ: хотя я не уверен, что на каждую запись создается отдельный таймер, возможно разрабы молодцы и используют один глобал таймер, но у меня сомнения.

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

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


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

AntonivkA таймер только на колво игроков и 2 таймера на зоны

Подкл и откл и убийства и пожиралово это не таймеры это расширение нативных функций

У сервера и так ок сотни нативных таймеров в шелулере

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


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

AntonivkA таймер только на колво игроков и 2 таймера на зоны

Подкл и откл и убийства и пожиралово это не таймеры это расширение нативных функций

У сервера и так ок сотни нативных таймеров в шелулере

я не о подкл и откл, а о шедулере.

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

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


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

AntonivkA там 3 очереди шедулера

они работают глобально

 

 

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


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

Товарищи, а подскажите скрипт если в инит class CustomMission пустой, ну то есть у нас свой мод который занимается спавном персонажа. Можно ли брать данные об отклбчении и подключении игрока из ркон? МОжет есть у кого скрипт 

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


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

Товарищи, а подскажите скрипт если в инит class CustomMission пустой, ну то есть у нас свой мод который занимается спавном персонажа. Можно ли брать данные об отклбчении и подключении игрока из ркон? МОжет есть у кого скрипт 

из Rcon можно в любом случае брать данные, скрипт игры не влияет на эти вещи ниак

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


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

Подскажите актуально для версии 1.07 ?  вставляю код в unit.c у меня не работает.

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
17.02.2020 в 12:46, KamFace сказал:

Подскажите актуально для версии 1.07 ?  вставляю код в unit.c у меня не работает.

Да, работает.

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


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

Дамы и госпада ставим и не паремся Тут смотрю у всех все работает )))

https://steamcommunity.com/sharedfiles/filedetails/?id=2011206996

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


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

Всем привет, актуально для новой версии?

Смотрю мод не обновлялся 20го числа https://steamcommunity.com/sharedfiles/filedetails/?id=2011206996.

Пробовал и  init прописывать и отдельным скриптом выводить...сообщения не выводит

 

 

override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
    {
        super.InvokeOnConnect(player, identity);
        GetGame().ChatPlayer("Игрок " + identity.GetName() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке
    }
    
    override void InvokeOnDisconnect( PlayerBase player )
    {
        private PlayerIdentity identity = NULL;
        identity = player.GetIdentity();
        if (player && identity)
        {
            GetGame().ChatPlayer("Игрок " + identity.GetName() + " отключился");
        }
        super.InvokeOnDisconnect( player );
    }
 

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


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

Всем привет, актуально для новой версии?

Смотрю мод не обновлялся 20го числа https://steamcommunity.com/sharedfiles/filedetails/?id=2011206996.

Пробовал и  init прописывать и отдельным скриптом выводить...сообщения не выводит

 

 

override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
    {
        super.InvokeOnConnect(player, identity);
        GetGame().ChatPlayer("Игрок " + identity.GetName() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке
    }
    
    override void InvokeOnDisconnect( PlayerBase player )
    {
        private PlayerIdentity identity = NULL;
        identity = player.GetIdentity();
        if (player && identity)
        {
            GetGame().ChatPlayer("Игрок " + identity.GetName() + " отключился");
        }
        super.InvokeOnDisconnect( player );
    }
 

нет

GetGame().ChatPlayer давно не работает

Давно все используют RPCSingleParam
 


string Message  = "Hello world!"
Param1<string> Msgparam = new Param1<string>( Message );
GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, player.GetIdentity());

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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