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

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

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

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

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

Оповещение и логи входа и выхода игрока

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

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

 

Нам понадобится:

1. Сервер DayZ 1.0, сделанный по одному из гайдов:

2. Notepad++

3. Немножечко трезвого ума

 

Приступим:

1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c
2. В самом начале файла добавляем:

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

Обратите внимание, имя папки с активной mpmissions сервера у вас может отличаться от стандартного названия  dayzOffline.chernarusplus - в таком случае в ссылке выше имя этой папки также надо заменить (это актуально в основном для серверов аренды)

3. Помещаем в папку файл

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

Либо создаем вручную этот файл с именем "

"ConnectDisconnectMessagesInChat.c" и заполняем его следующим текстом:

modded class CustomMission
{
	void SendGlobalChatMessage(string message)
	{
		private array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		int numbOfplayers = players.Count();
		
		if( numbOfplayers > 0 )
		{
			foreach(Man player: players)
			{
				SendPersonalMessage(message, player);
			}
			//GetGame().ChatPlayer(message);
		}
	}
	void 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()); 
		}
	}

	override void InvokeOnDisconnect( PlayerBase player )
	{
		private PlayerIdentity identity = NULL;
		identity = player.GetIdentity();
		if (player && identity)
		{
			private string Name_P = identity.GetName();
			private string UID_P = identity.GetPlainId();
			private string message = "[Информация] Игрок " + Name_P + " отключился от сервера.";
			private string log_message = "[Disconnect] Player " + Name_P + " with Steam64ID: " + UID_P + " disconnected from server.";
			//GetGame().ChatPlayer(message);
			SendGlobalChatMessage(message);
			Print(log_message);
		}
		super.InvokeOnDisconnect( player );
	}	
	override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		super.InvokeOnConnect(player, identity);
		private string Name_P = identity.GetName();
		private string UID_P = identity.GetPlainId();
		private string message = "[Информация] Игрок " + Name_P + " Зашёл на сервер.";
		private string log_message = "[Connect] Player " + Name_P + " with Steam64ID: " + UID_P + "connected to server.";
		//GetGame().ChatPlayer(message);
		SendGlobalChatMessage(message);
		Print(log_message);
	}
}

4. Настраиваем текст как нам нужно. Т.е. в строках для чата

private string message = "[Информация] Игрок " + Name_P + " отключился от сервера.";

и

private string message = "[Информация] Игрок " + Name_P + " Зашёл на сервер.";

а также для логов

private string log_message = "[Disconnect] Player " + Name_P + " with Steam64ID: " + UID_P + " disconnected from server.";

и

private string log_message = "[Connect] Player " + Name_P + " with Steam64ID: " + UID_P + "connected to server.";

P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!

 

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

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


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





а можно версию чисто для логов что бы писало координаты где он отключился или зашел в игру? а то по дефолу в логах не пишет при коннекте/дисконнекте координаты игрока (помогло бы с релогерами которые багом в чужие базы лезут)

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


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

dosserua а самим посоображать чуток? Все ж просто как 2 капли

modded class CustomMission
{
	void SendGlobalChatMessage(string message)
	{
		private array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		int numbOfplayers = players.Count();
		
		if( numbOfplayers > 0 )
		{
			foreach(Man player: players)
			{
				SendPersonalMessage(message, player);
			}
			//GetGame().ChatPlayer(message);
		}
	}
	void 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()); 
		}
	}

	override void InvokeOnDisconnect( PlayerBase player )
	{
		private PlayerIdentity identity = NULL;
		identity = player.GetIdentity();
		if (player && identity)
		{
			private string Name_P = identity.GetName();
			private string UID_P = identity.GetPlainId();
			private string posit_P = player.GetPosition().ToString();
			private string message = "[Информация] Игрок " + Name_P + " отключился от сервера.";
			private string log_message = "[Disconnect] Player " + Name_P + " with Uid: " + UID_P + " Pos=" + posit_P + " disconnected from server.";
			//GetGame().ChatPlayer(message);
			//SendGlobalChatMessage(message);
			Print(log_message);
		}
		super.InvokeOnDisconnect( player );
	}	
	override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity)
	{
		super.InvokeOnConnect(player, identity);
		private string Name_P = identity.GetName();
		private string UID_P = identity.GetPlainId();
		private string posit_P = player.GetPosition().ToString();
		private string message = "[Информация] Игрок " + Name_P + " Зашёл на сервер.";
		private string log_message = "[Connect] Player " + Name_P + " with Uid: " + UID_P + " Pos=" + posit_P + " connected to server.";
		//GetGame().ChatPlayer(message);
		//SendGlobalChatMessage(message);
		Print(log_message);
	}
}

 

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


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

Кстати, а куда логит пишутся, если пишутся?

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


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

123new я в скриптинге минимально шарю, больше по моделькам для модов и т.д, но спасибо!

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

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


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

123newНу дабы всё было в одном месте 

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


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

123newНу дабы всё было в одном месте 

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

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


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

123new почему то после возрождения опять пишет что игрок зашёл на сервер 

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


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

ZigoFrend потому как игра так обрабатывает коннект игрока

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


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

Ребят, что не так сделал? На сервер не пускает

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

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


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

@Nikanвыше void main() нужно прописать

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

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


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

irkutsk38 

void main()
{
    #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\ConnectDisconnectMessagesInChat.c"
    //INIT WEATHER BEFORE ECONOMY INIT------------------------
 

так ?

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


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

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

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


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

irkutsk38 

void main()
{
    #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\ConnectDisconnectMessagesInChat.c"
    //INIT WEATHER BEFORE ECONOMY INIT------------------------
 

так ?

нет, вот так:
 #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\ConnectDisconnectMessagesInChat.c"
void main()
{
    //INIT WEATHER BEFORE ECONOMY INIT------------------------
 

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


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

AllexDi 

у меня было вот и все равно не работало, или я что то не пойму и не вижу

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


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

@Nikanгайд внимательно перечитай и для начало на чистом сервере без модов попробуй запустить.

 

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


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

ConnectDisconnectMessagesInChat.c в миссию кинул?

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


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

@Nikanгайд внимательно перечитай и для начало на чистом сервере без модов попробуй запустить.

 

Ну я с модами поставил и работает отлично

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


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

@AllexDiответ дан не тебе а @Nikan

У него может что то стоит криво что запустить не может сервер.

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

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


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

@123new привет, а как сделать, чтобы приходили сообщения о том , что игрок вышел с помощью ALT+F4 и вышел раньше 15 секунд-досрочно?

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


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

@123new привет, а как сделать, чтобы приходили сообщения о том , что игрок вышел с помощью ALT+F4 и вышел раньше 15 секунд-досрочно?

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: BorizzK
      Пишу мод для стримеров и сериальщиков (наши оч попросили и пара ютьюберов)
      Управление камерой с регулированием fov и тп включая углы итп
      Все почти отлично
      Столкнулись с проблемой
      С фрикамеры когда крупным планом беседу снимаешь не видно (нет анимации) движения губ. Жестикуляция и голос есть, а движения губ нет, только если перса оператора прям рядом поставить, тогда есть, но он в кадр в некоторых моментах попадает, а этого не нужно. Если удалить обьект перса оператора, то норм, но иногда сервак с ума сходит.
      А когда операторов 2 - 3, то ваще фигня иногда начинается вплоть до краша...
       
      Может кто в курсе, где расстояние, радиус синхры настроить можно?
       
       
    • Автор: BorizzK
      Есть игрок
      Есть его координаты X и Y
      Нужно получить координаты точки X1 и X2 на расстоянии 2м слева от игрока
       
      ...
      Угол (из GetOrientation()) мы знаем
       
      Те банально надо получить координаты точки на окружности зная угол, радиус и координаты центра окружности
       
      мне видится следующее решение
       
      float dist = 2;
      float A = player.GetOrientation()[0] - 45;
      float x1 = dist * Math.Cos(A);
      float y1 = dist * Math.Sin(A);
       
      vector finpos = Vector(player.GetPosition()[0] + x1, player.GetPosition()[1], player.GetPosition()[2] + y1);
       
      или я не прав?
       
      может в Math enscript'а есть готовая функция?
       
       
      Спасибо!
       
       
       
    • Автор: 123new
      Нам понадобится:
      1. Сервер DayZ Standalone (см. тему вот эту)
      2. Notepad++: бесплатно на оф. сайте
      3. Немного времени и настойчивости (обычно бывает в комплекте и так)
       
      И так, начинаем:
      1. Открываем блокнотом mpmissions\dayzOffline.chernarusplus\init.c
      P.S. Имя папки dayzOffline.chernarusplus у вас может отличаться, будьте внимательны
      2. В начале файла добавляем:
      static int time_repeat_info_players = 10; //in seconds static string file_name_info_players = "$profile:PlayersLogFile.txt"; static void WriteFile(string file_name, string text) { private FileHandle fhandle; if ( !FileExist(file_name) ) { fhandle = OpenFile(file_name, FileMode.WRITE); } else { fhandle = OpenFile(file_name, FileMode.APPEND); } if ( fhandle == 0 ) { Print("[#Запись_в_файл]: Не удалось открыть файл для записи: " + file_name); Print("[#Запись_в_файл]: [Запись]: " + text); return; } FPrintln(fhandle, text); CloseFile(fhandle); } static void WritePlayersInfo() { array<Man> players = new array<Man>; Man player; Man player_test; GetGame().GetPlayers( players ); if (players.Count() > 0) { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } for ( int i = 0; i < players.Count(); ++i ) { player_test = players.Get(i); if( player_test ) { PlayerIdentity p_identity = player_test.GetIdentity(); private string coord_pl = player_test.GetPosition().ToString(); private string Name_P = p_identity.GetName(); private string UID_P = p_identity.GetPlainId(); WriteFile(file_name_info_players, "User name: " + Name_P + " UID: " + UID_P + " Coords: " + coord_pl); } } } else { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } } } Где 'PlayersLogFile.txt' меняем на нужное вам имя файла, а в 'time_repeat_info_players' настраиваем время повтора проверки списка игроков для перезаписи файла
      3. Находим в файле блок 'void main()' и в его конце перед закрывающей '}', поумолчанию это строка
      weather.SetWindFunctionParams(0.1, 0.3, 50); добавляем ниже строку:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(WritePlayersInfo, (time_repeat_info_players * 1000), true); 4. Готово, если не допустили ошибок, при наличии хотя бы 1 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
    • Автор: BorizzK
      Нашел где и как она задается
       
      Файл MissionServer.c
       
      Функция
      void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime)
       
      Вызывается по эвенту PreloadEventTypeID: - при подключении игрока и постановке его в очередь
       
      Она возвращает queueTime в которой и будут те самые 15 сек
      Тк он возвращается пустой, сервер использует значение по умолчанию
      Если внутри функции изменить значение
      queueTime = 5;
      то будет нужное Вам время
       
      Соответственно переопределяем эту функцию в init.c или Вашем файле миссии в моде (или нет)
       
      override void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime) { if (GetHive()) { // Preload data on client by character from database useDB = true; queueTime = 1; //Делаем 1 сек } else { // Preload data on client without database //Вот это я не понял зачем useDB = false; pos = "1189.3 0.0 5392.48"; yaw = 0; queueTime = 1; //Делаем 1 сек } } Делаем 1 сек
       
      Вуаля...
       
  • Наш выбор

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

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

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