Автор:
123new
Автор скрипта: 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. Данная тема является копией утраченной темы на нашем форуме, восстановлена по просьбам 'трудящихся'. Надеюсь, она вам поможет.