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

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

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

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

    Там вы можете продать или купить
    Всё что касается игровых серверов
123new

[DayZ 0.63] Сообщения о смертях игроков в чат

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

Автор скрипта: http://s-platoon.ru/profile/14721-borizzk/

Все благодарности за этот скрипт непосредственно автору скрипта, не мне!

 

И так, установка:

1. Первым делом нам необходим чистый стандартный сервер DayZ (без модов, поскольку моды могу приводить к неработоспособности частей гайда). Установить его можно по инструкции, например, так:

Замечу сразу, гайд сделан для версии игры 0.63.149525
2. Заходим в папку 'DTA' и распаковываем с 'PBO-MANAGER' архив 'scripts.pbo', получив папку 'scripts'.

3. Перемещаем папку 'scripts с' папки 'DTA' в корень папки сервера

4. Переходим по следующему пути:

scripts\4_World\Entities\ManBase\PlayerBase.c

и открываем файл.

В самом его начале после кода

class PlayerBase extends ManBase
{

добавляем код

	// BY BORIZZ.K, s-platoon.ru (ThX Mizev, NoNameUltima, 123New and DaOne)
	//MY ---
	//PLAYER DEATH with MESSAGES START //MY
	int killscore = 0; // usage p_killer.killscore = p_killer.killscore + 1; // for kills count in EEKilled function. //p_killer must be PlayerBase - use p_killer = PlayerBase.Cast(killer) //See EEKilled function
	int diescore = 0; // usage Player.diescore = Player.diescore + 1; // for death count in EEKilled function. //Player must be playerbase
	
	void Message_PlayerKilled(Object player_obj, Object killer)
	{
		//MY ---
		PlayerBase  p_Killer   = NULL; // Killer
		PlayerBase   Player     =  player_obj; // Killed player
		PlayerIdentity Player_Identity  = Player.GetIdentity(); //Killed player Identity
		string   Player_Name   = Player_Identity.GetName(); //Killed player name
		string    p_UID     =  Player_Identity.GetPlainId(); // Killed player UID
		bool    enableSaveKills  =  true; // enable/disable save kill count to profile/file by Killer UID
		bool    enableSaveDies  =  true; // enable/disable save death count to profile/file by Player UID
		if ( GetGame().ServerConfigGetInt("enableSaveKills") == 0 ) //place parameter enableSaveKills = 0; for disable SaveKills to server profile
		{	
			enableSaveKills  =  false;
		}
		
		if ( GetGame().ServerConfigGetInt("enableSaveDies") == 0 )//place parameter enableSaveDies = 0; for disable SaveDies to server profile
		{
			enableSaveDies  =  false;
		}
		string   deathMsg   = "";
		string   deathMsgDist  = "";
		string   deathMsgKillScore =  "";
		string    DebugMessage;
		Print("::: EEKilled: Debug: Input: killer " + killer.ToString() + " => Class: " + killer.GetType() + ", Player " + Player.ToString() + " => Class: " + Player.GetType()); //DEBUG
		//Phase #1
		if ( killer.IsMan() )
		{
			if ( killer.IsKindOf("SurvivorBase") )
			{ 
				p_Killer = PlayerBase.Cast(killer);
				DebugMessage = "killer.IsMan(): killer.IsKindOf('SurvivorBase'): killer " + p_Killer.ToString() + " kill player " + Player.ToString(); //DEBUG
			}
		}
		else
		{
			if ( killer.IsItemBase() )
			{
				ItemBase bitem = ItemBase.Cast(killer);
				p_Killer = PlayerBase.Cast(bitem.GetHierarchyRootPlayer());
				DebugMessage = "killer.IsItemBase(): killer " + p_Killer.ToString() + " => " + bitem.ToString() + " kill player " + Player.ToString(); //DEBUG
			}
			else
			{
				DebugMessage = "killer " + killer.ToString() + " kill player " + Player.ToString(); //DEBUG
			}
		} 
		Print("::: EEKilled Debug: " + DebugMessage); //DEBUG

		//Phase #2
		if (p_Killer)
		{
			if (Player == p_Killer)
			{
				deathMsg = Player_Name + " committed suicide.";
			}
			else
			{
				PlayerIdentity Killer_Identity = p_Killer.GetIdentity();
				string killer_name    = Killer_Identity.GetName();
				string k_UID      =  Killer_Identity.GetPlainId(); //Get killer UID
				vector position_killer   = p_Killer.GetPosition();
				vector position_player   =  Player.GetPosition();
				int dist      = vector.Distance(position_player, position_killer);      
				EntityAI itemInHands   = p_Killer.GetHumanInventory().GetEntityInHands();
				if (enableSaveKills)
				{
					string strkillscore;
					g_Game.GetProfileString("killscore"+k_UID,strkillscore);
					if (strkillscore)
					{
						Print("::: EEKilled Debug: LoadKills: Killer: " + killer_name + ", loaded killscore: " + strkillscore); //DEBUG
						p_Killer.killscore = strkillscore.ToInt();
					}
				}
				p_Killer.killscore = p_Killer.killscore + 1; //You must declare a variable: int KillScore = 0; in PlayerBase class
				if (enableSaveKills)
				{
					g_Game.SetProfileString("killscore"+k_UID,p_Killer.killscore.ToString());
					g_Game.SaveProfile();
					Print("::: EEKilled Debug: SaveKills: Killer: " + killer_name + ", killscore: " + diescore.ToString()); //DEBUG
				}

				if ( itemInHands.IsItemBase() )
				{
					ItemBase item  = ItemBase.Cast(itemInHands);
					string className = item.GetType();
					deathMsg   = killer_name + " kill: " + Player_Name;
					deathMsgDist        =   " from a distance: " + dist.ToString() + "m by " + className;
					deathMsgKillScore = killer_name + " kills: " + p_Killer.killscore.ToString();
				}
				else
				{
					deathMsg         = killer_name + " kill: " + Player_Name;
					deathMsgDist        = " from a distance: " + dist.ToString() + "m.";
					deathMsgKillScore = killer_name + " kills: " + p_Killer.killscore.ToString();			 
				}
			}
		}
		else
		{
			if ( killer.IsKindOf("AnimalBase") )
			{
				deathMsg = Player_Name + " killed by animal.";
			} 
			else 
			{
				if ( killer.IsKindOf("ZombieBase") )
				{
					deathMsg = Player_Name + " killed by zombie."; 
				}
				else
				{
					deathMsg = Player_Name + " died for an unknown reason.";
				}
			}
		}

		//Phase #3
		GetGame().ChatPlayer(5, deathMsg);
		Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsg); //DEBUG
		if (deathMsgDist)
		{
			GetGame().ChatPlayer(5, deathMsgDist);
			Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsgDist); //DEBUG
		}
		if (deathMsgKillScore)
		{
			GetGame().ChatPlayer(5, deathMsgKillScore);
			Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsgKillScore); //DEBUG
		}

		if (enableSaveDies)
		{
			string strdiescore;
			g_Game.GetProfileString("diescore"+p_UID,strdiescore);
			if (strdiescore)
			{
				Print("::: EEKilled Debug: Load Die's: Player: " + Player_Name + ", loaded diescore: " + strdiescore); //DEBUG
				Player.diescore = strdiescore.ToInt();
			}
		}
		Player.diescore = Player.diescore + 1;
		if (enableSaveDies)
		{
			g_Game.SetProfileString("diescore"+p_UID,Player.diescore.ToString());
			g_Game.SaveProfile();
			Print("::: EEKilled Debug: SaveDeath: Player: " + Player_Name + ", diescore: " + diescore.ToString()); //DEBUG
		}
		//MY ---
		
		if( GetHumanInventory().GetEntityInHands() )
		{
			if( CanDropEntity(player_obj) )
			{
				if( !IsRestrained() )
				{
					GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ServerDropEntity,1000,false,( GetHumanInventory().GetEntityInHands()));
				}
			}

		}
	}

 затем находим функцию

override void EEKilled( Object killer )
	{

и перед строкой

Print("EEKilled, you have died");

добавляем

Message_PlayerKilled(this, killer);

4. В параметры запуска сервера добавляем:

-FilePatching

5. В 'config-файл' сервера (тот файл где название сервера) добавляем:

enableSaveKills = 1; // Включение сохранения счетчика убийств по игрокам
enableSaveDies = 1; // Включение сохранения счетчика смертей по игрокам

где 1 - включено, 0 - выключено

 

6. Сохраняем, запускаем сервер и радуемся. Сообщения о смертях игроков будут у вас как в чате, так и в script.log.


Где хранятся счетчики убийств и смертей? Ответ:

Они хранятся в profile сервера игры. Т.е. после 1-го запуска создаются 2 файла (как у клиента игры в документах windows в папку dayz) в файлах с расширениями ".vars.DayZProfile" и ".DayZProfile". При удалении этих файлов счетчики сбросятся!

 

ВАЖНО:

Скажу сразу, добавить систему кастомного логирования вместо базового можно, но добавлять ее вам прийдется до иницилизации данного файла playerbase.c, поскольку уже в  playerbase.c вы будете вызывать функцию, которая должна быть заранее определена и известна серверу!

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

 

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

 

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

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


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


1 час назад, aspec7878 сказал:

123new яж писал в теме этой. не работает у меня. 

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

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


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

123new что может мешать?
Например папка script лежит в корне с сервером для бесконечно стамины.
Возможно что там мешает файл PlayersBase.c ?

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


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

aspec7878 возможно не подключен скрипт, возможно файл не читается сервером, возможно -filepatching, указанный в теме, отсутствует в параметрах запуска сервера

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


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

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

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

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


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

Alex39 Обычный шрифт. Делай свой, да подрубай.

Не обычный шрифт, он в картинке, с такими не работал, как исправить не знаю

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


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

Там вся папка fonts они скомпилили не верно, вот и прут крякозябры, надо все файлы переделывать

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


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

Alex39 Тебе придется найти утилиту что работает с редактированием этих файл и рисовать пикселями буквы, по примеру такого.
 

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

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


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

они скомпилили не верно

_) мда)

шрифты не компилят как бЭ)

Выше скинули утилиту. - Их именно что рисуют. - Как нарисовали, так и есть. Берешь в руки виндовую утилиту для создания системных шрифтов и вперед, если нужна кириллица и UTF8 - смотри как там(кириллицу никто не обязался вставлять в шрифт), и загоняешь ее в TGA

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


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

_) мда)

шрифты не компилят как бЭ)

Выше скинули утилиту. - Их именно что рисуют. - Как нарисовали, так и есть. Берешь в руки виндовую утилиту для создания системных шрифтов и вперед, если нужна кириллица и UTF8 - смотри как там(кириллицу никто не обязался вставлять в шрифт), и загоняешь ее в TGA

Скомпилен или нет, я в образе обмолвился, главное причина недуга надена

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


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

Скомпилен или нет, я в образе обмолвился, главное причина недуга надена

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

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


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

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

У меня с английским проблема, но попробовать можно

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


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

У меня с английским проблема, но попробовать можно

переводчик в помощь, понимают

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


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

переводчик в помощь, понимают

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

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


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

И в добавок, я сервер не держу, если кому и надо то буду делать отдельно, за шуршание в кормане

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


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

Alex39 Во 1. Это не проблема.) Им с большой колокольни до каких то языков акромя ENG. Во 2. Правки такого рода, - добавление UTF8, локализаций, и т.п. вносятся после релиза, на стабильной игре, + после процесса адаптации и оптимизации. А в игре релиз только "какбЭ" был. И думаю им не до расширения шрифтов. В 3. Возможно им такой шрифт нужен)

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

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


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

Alex39 Во 1. Это не проблема.) Им с большой колокольни до каких то языков акромя ENG. Во 2. Правки такого рода, - добавление UTF8, локализаций, и т.п. вносятся после релиза, на стабильной игре, + после процесса адаптации и оптимизации. А в игре релиз только "какбЭ" был. И думаю им не до расширения шрифтов. В 3. Возможно им такой шрифт нужен)

Вот и я такого мнения

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


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

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

вот пока все так думают, исправления точно не прийдут ;)

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

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

    • Автор: fedotovyasha
      Хочу немного изменить сообщения перед отправкой клиенту
    • Автор: 123new
      За основу взята наработка автора скрипта: http://s-platoon.ru/profile/14721-borizzk/
      И немного доработана по своим соображениям.
      Использование мода клиенту игры НЕ ТРЕБУЕТСЯ!!!
       
      И так, установка:
      1. Первым делом нам необходим чистый стандартный сервер DayZ (без модов, поскольку моды могу приводить к неработоспособности частей гайда). Установить его можно по инструкции, например, так:
      2. Добавляем в папку сервера игры мод из архива:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      3. Добавляем в параметры запуска сервера:
      -Filepatching "-servermod=@KillFeed_ServerMod" Если ваш сервер уже имеет серверные моды, просто добавьте папку с модом в список используемых сервером модов.
      ВАЖНО: не добавляйте данный мод в параметр запуска сервера -mod=, иначе это может стать проблемой заходи игроков с параметрами verifysignatures=2; equalmodrequired=1;
      4. В 'config-файле' сервера (там где названием сервера и прочие настройки) добавляем настройки для мода:
      //KillFeed_mod KillFeed_enableSaveKills = 1; // Включение сохранения счетчика убийств по игрокам KillFeed_enableSaveDies = 1; // Включение сохранения счетчика смертей по игрокам KillFeed_enableCustomTimeLog = 1; // Включение записи модом 'Кастомных' логов смертей игроков KillFeed_enableDefaultLog = 1; // Включение записи сервером стандартных логов сервера в scripts.log KillFeed_enableDebugLog = 1; // Включение записи сервером отладочных логов сервера в scripts.log (работает при KillFeed_enableDefaultLog = 1) KillFeed_enableMessages = 1; // Включение отправки сообщений в чат сервера о смертях игроков Пояснения к настройкам, как видите, имеются.
      Напомню, активный профиль сервера обозначается параметром '-profiles={имя папки или путь до папки}'
      Например, при указании:
      -profiles=Instance_1 папка профиля сервера будет выглядеть вот так:
      5. Запускаем сервер, умираем от зомби и радуемся. Сообщения о смертях игроков будут в чате у других игроков (если в настройках игры они не отключены), так и в script.log.

      Где хранятся счетчики убийств и смертей? Ответ:
      Они хранятся в profile сервера игры. Т.е. после 1-го запуска создаются 2 файла (как у клиента игры в документах windows в папку dayz) в файлах с расширениями ".vars.DayZProfile" и ".DayZProfile". При удалении этих файлов счетчики сбросятся!
       
      P.S. Чтобы увидеть сообщения в чате, нужно быть 2-м игрокам на сервере, и умереть одному из двух. тот, кто умирает, сообщения с чата не видит!!!
       
    • Автор: 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 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
×
×
  • Создать...