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
  • 0
TonyS

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

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

Share this post


Link to post
Share on other sites

22 answers to this question

Recommended Posts

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

Share this post


Link to post
Share on other sites









  • 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 (это глобальный класс (так же формирующийся движком))

 

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

 

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

 

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


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

 

Share this post


Link to post
Share on other sites
  • 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() + " подключился"); // Отправим сообщение в глобальый чат о подключившемся игроке

	}

 

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

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

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 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 сообщения, но редко

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

 

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

 

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

 

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

Edited by AntonivkA (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

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

 

Share this post


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

 

Share this post


Link to post
Share on other sites
  • 0
12 часа назад, BorizzK сказал:

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

 

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

 

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

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

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

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

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

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

 

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

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

 

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

Edited by AntonivkA (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Share this post


Link to post
Share on other sites
  • 0
17 часов назад, BorizzK сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

 

 

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0
13 минут назад, sovcomrad сказал:

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

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

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0
17.02.2020 в 12:46, KamFace сказал:

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

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

Share this post


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

Share this post


Link to post
Share on other sites
  • 0
Posted (edited)
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());

 

Edited by BorizzK (see edit history)

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

×
×
  • 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.