Славик Класс PlayerBase это PlayerBase.c в scripts\4_World\Entities\ManBase
В общих чертах распишу
1 Для начала Вам надо понять что такое моддинг, скриптинг, как устроен язык enfusion, структуру и тп
Для этого читаем
и
https://community.bistudio.com/wiki/DayZ:Enforce_Script_Syntax
сопоставляем
можно еще вкратце прочитать про C#
Далее
открываем pbo-менеджером (скачать, уствновить) файл scripts.pbo из папки dta
его содержимое вытаскиваем в папку scripts в корне сервера
в параметр запуска сервера добавляем -filepatching
в конфиге сервера (по нему и параметрам запуска читаем отдельную тему (поиск рулит) на форуме и в вики богемии (и на их форуме forums.dayz.com)
отключаем проверку сигнатур (на время тестов - отладки и тп - что бы тестить было проще без постоянной перепаковки серверного мода)
и приступаем
хотим отмоддидь этот PlayerBase
копируем PlayerBase.c рядом в PlayerBase_mymod.c
открываем
видим
class PlayerBase extends ManBase
{
тут содержимое класса (тело) - его переменные функциии и тп
это класс игрока - когда подключается игрок для него создается экземпляр класса и все операции с игроком идут через него
часть функций вызывает движок при определенных событиях
часть функций вызывается из функций класса или из других классов и тп
}
конец тела класса
меняем - добавляем modded - движок (его компилятор при старте поймет что это мод и что оно перекроет/дополнит существующий класс)
modded class PlayerBase extends ManBase
{
все содержимое удаляем кроме функции
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos)
{
тут код функции
}
}
функцию EEHitBy движок вызывает для конкретного игрока всякий раз когда по нему прилетает от игрков, зомби, машин и тп - кроме прямого попадания в бошку
override это означает что функция перекрывает существующую в нативном классе функцию или функцию в родительском классе (если в ее нет в нативном))
ну и дальше
Однако - прямое попадание в бошку можно перехватить чуть ранее в DayZPlayerImplement.c - однако игрок всеравно будет мертвый - посему пофиг и туда не лезем
и вот берем мы эту функцию и видим
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos)
{
/*
Print("ProjectileDebugging | Damage Health: " + damageResult.GetDamage(dmgZone,"Health") + " | Zone: " + dmgZone);
Print("ProjectileDebugging | Damage Blood: " + damageResult.GetDamage(dmgZone,"Blood") + " | Zone: " + dmgZone);
Print("ProjectileDebugging | speedCoef: " + speedCoef);
Print("-----------------------------------------------");*/
if( m_AdminLog )
{
m_AdminLog.PlayerHitBy( damageResult, damageType, this, source, component, dmgZone, ammo );
}
super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos);
if( damageResult != null && damageResult.GetDamage(dmgZone, "Shock") > 0)
{
m_LastShockHitTime = GetGame().GetTime();
}
//! DT_EXPLOSION & FlashGrenade
if( damageType == DT_EXPLOSION && ammo == "FlashGrenade_Ammo" )
{
GetStaminaHandler().DepleteStamina(EStaminaModifiers.OVERALL_DRAIN);
}
//new bleeding computation
//---------------------------------------
if( damageResult != null && GetBleedingManagerServer() )
{
float dmg = damageResult.GetDamage(dmgZone, "Blood");
GetBleedingManagerServer().ProcessHit(dmg, source, component, dmgZone, ammo, modelPos);
}
//---------------------------------------
#ifdef DEVELOPER
if(DiagMenu.GetBool(DiagMenuIDs.DM_MELEE_DEBUG_ENABLE))
{
Print("EEHitBy() | Charater " + GetDisplayName() + " hit by " + source.GetDisplayName() + " to " + dmgZone);
}
PluginRemotePlayerDebugServer plugin_remote_server = PluginRemotePlayerDebugServer.Cast( GetPlugin(PluginRemotePlayerDebugServer) );
if(plugin_remote_server)
{
plugin_remote_server.OnDamageEvent(this, damageResult);
}
#endif
if( GetGame().IsDebugMonitor() )
m_DebugMonitorValues.SetLastDamage(source.GetDisplayName());
if( m_ActionManager )
m_ActionManager.Interrupt();
//analytics
GetGame().GetAnalyticsServer().OnEntityHit( source, this );
}
Видим мы что в функцию передаются различные параметры
Сам игрок по которому прилетело там не указан тк он тут везде по умолчанию - экземпляр класса же его и двигло свам его где надо подпихивает
ну или можно самому указать где надо - this - в этой переменной он и будет
Так вот
нас интерисует уСЧерб и от кого оно прилетело
по коду функции все в приниципе понятно
Продолжение следует