diff --git a/AUTHORS b/AUTHORS index dea7b1bc8..0cfad492f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,6 +13,7 @@ veteran29 # CONTRIBUTORS AkiKay Badger 2-3 +fedoraman12 Glowbal gnif Jonpas @@ -25,4 +26,3 @@ Skamdrept Smith TraceSnowOwl Zelik - diff --git a/addons/core/scripts/Game/ACE_Core/ArmaReforgerScripted.c b/addons/core/scripts/Game/ACE_Core/ArmaReforgerScripted.c index bcabdba5f..56748b608 100755 --- a/addons/core/scripts/Game/ACE_Core/ArmaReforgerScripted.c +++ b/addons/core/scripts/Game/ACE_Core/ArmaReforgerScripted.c @@ -20,7 +20,7 @@ modded class ArmaReforgerScripted : ChimeraGame SCR_MissionHeader missionHeader = SCR_MissionHeader.Cast(GetGame().GetMissionHeader()); if (missionHeader) missionHeader.ACE_ApplyToSettingsConfig(m_ACE_SettingsConfig); - }; + } return super.OnGameStart(); } diff --git a/addons/core/scripts/Game/ACE_Core/Diag/ArmaReforgerScripted.c b/addons/core/scripts/Game/ACE_Core/Diag/ArmaReforgerScripted.c new file mode 100644 index 000000000..09d197ba8 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Diag/ArmaReforgerScripted.c @@ -0,0 +1,12 @@ +#ifdef ENABLE_DIAG +//------------------------------------------------------------------------------------------------ +modded class ArmaReforgerScripted : ChimeraGame +{ + //------------------------------------------------------------------------------------------------ + override bool OnGameStart() + { + DiagMenu.RegisterMenu(SCR_DebugMenuID.ACE_DEBUGUI_MENU, "ACE", ""); + return super.OnGameStart(); + } +} +#endif diff --git a/addons/core/scripts/Game/ACE_Core/Diag/SCR_DebugMenuID.c b/addons/core/scripts/Game/ACE_Core/Diag/SCR_DebugMenuID.c new file mode 100644 index 000000000..2d57ddebb --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Diag/SCR_DebugMenuID.c @@ -0,0 +1,7 @@ +#ifdef ENABLE_DIAG +//------------------------------------------------------------------------------------------------ +modded enum SCR_DebugMenuID +{ + ACE_DEBUGUI_MENU, +} +#endif \ No newline at end of file diff --git a/addons/core/scripts/Game/ACE_Core/Global/ACE_DiagTools.c b/addons/core/scripts/Game/ACE_Core/Global/ACE_DiagTools.c new file mode 100644 index 000000000..7d4b17cff --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Global/ACE_DiagTools.c @@ -0,0 +1,31 @@ +#ifdef ENABLE_DIAG +//------------------------------------------------------------------------------------------------ +class ACE_DiagTools +{ + //------------------------------------------------------------------------------------------------ + //! Get target for diag menu and string for printing which target it is + //! Return true if a target was found + static bool GetDiagTargetCharacter(out IEntity target, out string targetType) + { + CameraBase camera = GetGame().GetCameraManager().CurrentCamera(); + if (!camera) + return false; + + target = SCR_ChimeraCharacter.Cast(camera.GetCursorTarget()); + if (target) + { + targetType = "Target"; + return true; + } + + target = SCR_ChimeraCharacter.Cast(SCR_PlayerController.GetLocalControlledEntity()); + if (target) + { + targetType = "Self"; + return true; + } + + return false; + } +} +#endif diff --git a/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds b/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds deleted file mode 100755 index a6c608f2d..000000000 Binary files a/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds and /dev/null differ diff --git a/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat b/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat deleted file mode 100755 index 9ad530983..000000000 --- a/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat +++ /dev/null @@ -1,9 +0,0 @@ -MatPBRBasic { - SpecularIBL 0.479 0.479 0.479 1 - Specular 0.913 0.879 0.865 1 - SpecularMul 0.821 - RoughnessScale 0.5 - MetalnessScale 0 - DielectricReflectance 0.16 - BCRMap "{54CC811718DE59FC}Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds" -} \ No newline at end of file diff --git a/addons/medical/Configs/EntityCatalog/FFA/FFA_InventoryItems.conf b/addons/medical/Configs/EntityCatalog/FFA/FFA_InventoryItems.conf deleted file mode 100644 index a75e1e05c..000000000 --- a/addons/medical/Configs/EntityCatalog/FFA/FFA_InventoryItems.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5EACB04FE72A6C06}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{60F64E56CBCBBC95}" { - m_sEntityPrefab "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - m_aEntityDataList { - SCR_ArsenalItem "{5E110E1D8B6C3689}" { - m_eItemType HEAL - m_eItemMode CONSUMABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Configs/EntityCatalog/RHS_MSV/MSV_InventoryItems.conf b/addons/medical/Configs/EntityCatalog/RHS_MSV/MSV_InventoryItems.conf deleted file mode 100644 index c074f2f20..000000000 --- a/addons/medical/Configs/EntityCatalog/RHS_MSV/MSV_InventoryItems.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5D4A87E86D216247}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{60F64E565D83A393}" { - m_sEntityPrefab "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - m_aEntityDataList { - SCR_ArsenalItem "{5E110E1D8B6C3689}" { - m_eItemType HEAL - m_eItemMode CONSUMABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Configs/EntityCatalog/USMC/USMC_InventoryItems.conf b/addons/medical/Configs/EntityCatalog/USMC/USMC_InventoryItems.conf deleted file mode 100644 index d6981d919..000000000 --- a/addons/medical/Configs/EntityCatalog/USMC/USMC_InventoryItems.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5D4A8E6F2C974413}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{60F64E562705C962}" { - m_sEntityPrefab "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - m_aEntityDataList { - SCR_ArsenalItem "{5E110E1D8B6C3689}" { - m_eItemType HEAL - m_eItemMode CONSUMABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Configs/EntityCatalog/USMC/USMC_InventoryItems.conf.meta b/addons/medical/Configs/EntityCatalog/USMC/USMC_InventoryItems.conf.meta deleted file mode 100644 index cbdc96a47..000000000 --- a/addons/medical/Configs/EntityCatalog/USMC/USMC_InventoryItems.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{3BFC57A750823093}Configs/EntityCatalog/USMC/USMC_InventoryItems.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta b/addons/medical/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta deleted file mode 100755 index 5c78cfc31..000000000 --- a/addons/medical/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{C53421647C3D0D2E}Configs/EntityCatalog/USSR/USSR_InventoryItems.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass HEADLESS : PC { - } - CONFResourceClass PS5 : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.en_us.conf.meta b/addons/medical/Language/ACE_Medical_localization.en_us.conf.meta deleted file mode 100755 index ca95aa06c..000000000 --- a/addons/medical/Language/ACE_Medical_localization.en_us.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{8D8E1D4E72F479A8}Language/ACE_Medical_localization.en_us.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.es_es.conf.meta b/addons/medical/Language/ACE_Medical_localization.es_es.conf.meta deleted file mode 100755 index a24cd500d..000000000 --- a/addons/medical/Language/ACE_Medical_localization.es_es.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{48C250C79CF612B7}Language/ACE_Medical_localization.es_es.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.fr_fr.conf.meta b/addons/medical/Language/ACE_Medical_localization.fr_fr.conf.meta deleted file mode 100755 index 327110a7c..000000000 --- a/addons/medical/Language/ACE_Medical_localization.fr_fr.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{F36AA5F07A75F1B5}Language/ACE_Medical_localization.fr_fr.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.it_it.conf.meta b/addons/medical/Language/ACE_Medical_localization.it_it.conf.meta deleted file mode 100755 index 3e9b19b7d..000000000 --- a/addons/medical/Language/ACE_Medical_localization.it_it.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{73762AC4D757724C}Language/ACE_Medical_localization.it_it.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.ja_jp.conf.meta b/addons/medical/Language/ACE_Medical_localization.ja_jp.conf.meta deleted file mode 100755 index e5f3fe30a..000000000 --- a/addons/medical/Language/ACE_Medical_localization.ja_jp.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{636D9756E92642E7}Language/ACE_Medical_localization.ja_jp.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.ko_kr.conf b/addons/medical/Language/ACE_Medical_localization.ko_kr.conf deleted file mode 100755 index 10f235847..000000000 --- a/addons/medical/Language/ACE_Medical_localization.ko_kr.conf +++ /dev/null @@ -1,30 +0,0 @@ -StringTableRuntime { - Ids { - "ACE_Medical-EpinephrineInjectionAction" - "ACE_Medical-FailReason_NoPain" - "ACE_Medical-FailReason_NotUnconscious" - "ACE_Medical-FailReason_TooInjured" - "ACE_Medical-InfoWidget_Epinephrine" - "ACE_Medical-InfoWidget_Morphine" - "ACE_Medical-Item_Epinephrine_Description" - "ACE_Medical-Item_Epinephrine_Name" - "ACE_Medical-Item_Morphine_Description" - "ACE_Medical-UserAction_BackPosition" - "ACE_Medical-UserAction_LeftRecoveryPosition" - "ACE_Medical-UserAction_RightRecoveryPosition" - } - Texts { - "Inject epinephrine" - "Not in pain" - "Not unconscious" - "Too injured" - "Increases wake-up chance" - "Alleviates severe pain" - "Administered to unconscious patients." - "Epinephrine" - "Administered to patients in severe pain." - "Put on back" - "Put in left recovery position" - "Put in right recovery position" - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.ko_kr.conf.meta b/addons/medical/Language/ACE_Medical_localization.ko_kr.conf.meta deleted file mode 100755 index 3d1ca2c6e..000000000 --- a/addons/medical/Language/ACE_Medical_localization.ko_kr.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{C3D3BFFA7A0B41D8}Language/ACE_Medical_localization.ko_kr.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.pl_pl.conf b/addons/medical/Language/ACE_Medical_localization.pl_pl.conf deleted file mode 100755 index 10f235847..000000000 --- a/addons/medical/Language/ACE_Medical_localization.pl_pl.conf +++ /dev/null @@ -1,30 +0,0 @@ -StringTableRuntime { - Ids { - "ACE_Medical-EpinephrineInjectionAction" - "ACE_Medical-FailReason_NoPain" - "ACE_Medical-FailReason_NotUnconscious" - "ACE_Medical-FailReason_TooInjured" - "ACE_Medical-InfoWidget_Epinephrine" - "ACE_Medical-InfoWidget_Morphine" - "ACE_Medical-Item_Epinephrine_Description" - "ACE_Medical-Item_Epinephrine_Name" - "ACE_Medical-Item_Morphine_Description" - "ACE_Medical-UserAction_BackPosition" - "ACE_Medical-UserAction_LeftRecoveryPosition" - "ACE_Medical-UserAction_RightRecoveryPosition" - } - Texts { - "Inject epinephrine" - "Not in pain" - "Not unconscious" - "Too injured" - "Increases wake-up chance" - "Alleviates severe pain" - "Administered to unconscious patients." - "Epinephrine" - "Administered to patients in severe pain." - "Put on back" - "Put in left recovery position" - "Put in right recovery position" - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.pl_pl.conf.meta b/addons/medical/Language/ACE_Medical_localization.pl_pl.conf.meta deleted file mode 100755 index 256872f61..000000000 --- a/addons/medical/Language/ACE_Medical_localization.pl_pl.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{9FA21900C4E4DDA4}Language/ACE_Medical_localization.pl_pl.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.pt_br.conf b/addons/medical/Language/ACE_Medical_localization.pt_br.conf deleted file mode 100755 index 10f235847..000000000 --- a/addons/medical/Language/ACE_Medical_localization.pt_br.conf +++ /dev/null @@ -1,30 +0,0 @@ -StringTableRuntime { - Ids { - "ACE_Medical-EpinephrineInjectionAction" - "ACE_Medical-FailReason_NoPain" - "ACE_Medical-FailReason_NotUnconscious" - "ACE_Medical-FailReason_TooInjured" - "ACE_Medical-InfoWidget_Epinephrine" - "ACE_Medical-InfoWidget_Morphine" - "ACE_Medical-Item_Epinephrine_Description" - "ACE_Medical-Item_Epinephrine_Name" - "ACE_Medical-Item_Morphine_Description" - "ACE_Medical-UserAction_BackPosition" - "ACE_Medical-UserAction_LeftRecoveryPosition" - "ACE_Medical-UserAction_RightRecoveryPosition" - } - Texts { - "Inject epinephrine" - "Not in pain" - "Not unconscious" - "Too injured" - "Increases wake-up chance" - "Alleviates severe pain" - "Administered to unconscious patients." - "Epinephrine" - "Administered to patients in severe pain." - "Put on back" - "Put in left recovery position" - "Put in right recovery position" - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.pt_br.conf.meta b/addons/medical/Language/ACE_Medical_localization.pt_br.conf.meta deleted file mode 100755 index eee244ce1..000000000 --- a/addons/medical/Language/ACE_Medical_localization.pt_br.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{4AD583CCFF1A171E}Language/ACE_Medical_localization.pt_br.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.ru_ru.conf.meta b/addons/medical/Language/ACE_Medical_localization.ru_ru.conf.meta deleted file mode 100755 index b96ec4444..000000000 --- a/addons/medical/Language/ACE_Medical_localization.ru_ru.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{1F94976462637268}Language/ACE_Medical_localization.ru_ru.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.uk_ua.conf.meta b/addons/medical/Language/ACE_Medical_localization.uk_ua.conf.meta deleted file mode 100755 index 79cff39d7..000000000 --- a/addons/medical/Language/ACE_Medical_localization.uk_ua.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{95CCC2920E4DCC3D}Language/ACE_Medical_localization.uk_ua.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.zh_cn.conf b/addons/medical/Language/ACE_Medical_localization.zh_cn.conf deleted file mode 100755 index 10f235847..000000000 --- a/addons/medical/Language/ACE_Medical_localization.zh_cn.conf +++ /dev/null @@ -1,30 +0,0 @@ -StringTableRuntime { - Ids { - "ACE_Medical-EpinephrineInjectionAction" - "ACE_Medical-FailReason_NoPain" - "ACE_Medical-FailReason_NotUnconscious" - "ACE_Medical-FailReason_TooInjured" - "ACE_Medical-InfoWidget_Epinephrine" - "ACE_Medical-InfoWidget_Morphine" - "ACE_Medical-Item_Epinephrine_Description" - "ACE_Medical-Item_Epinephrine_Name" - "ACE_Medical-Item_Morphine_Description" - "ACE_Medical-UserAction_BackPosition" - "ACE_Medical-UserAction_LeftRecoveryPosition" - "ACE_Medical-UserAction_RightRecoveryPosition" - } - Texts { - "Inject epinephrine" - "Not in pain" - "Not unconscious" - "Too injured" - "Increases wake-up chance" - "Alleviates severe pain" - "Administered to unconscious patients." - "Epinephrine" - "Administered to patients in severe pain." - "Put on back" - "Put in left recovery position" - "Put in right recovery position" - } -} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.zh_cn.conf.meta b/addons/medical/Language/ACE_Medical_localization.zh_cn.conf.meta deleted file mode 100755 index 577466f03..000000000 --- a/addons/medical/Language/ACE_Medical_localization.zh_cn.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{4F7CACAF37ED1C20}Language/ACE_Medical_localization.zh_cn.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Core/DamageManager_Character_Base.ct b/addons/medical/Prefabs/Characters/Core/DamageManager_Character_Base.ct deleted file mode 100755 index cdde01fdf..000000000 --- a/addons/medical/Prefabs/Characters/Core/DamageManager_Character_Base.ct +++ /dev/null @@ -1,168 +0,0 @@ -SCR_CharacterDamageManagerComponent { - "Additional hit zones" { - SCR_CharacterHeadHitZone Head { - ParentHZs { - ParentHitZone "{5E101C436E0C9E93}" { - Parent "ACE_Medical_Pain" - DamageMultiplier 1 - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone Chest { - ParentHZs { - ParentHitZone "{5E101C4290FDDB0F}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone Abdomen { - ParentHZs { - ParentHitZone "{5E101C42B648BEB4}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone Hips { - ParentHZs { - ParentHitZone "{5E101C42B135C747}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone RArm { - ParentHZs { - ParentHitZone "{5E101C42C30DF702}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone LArm { - ParentHZs { - ParentHitZone "{5E101C42C8D3C3CA}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone RForearm { - ParentHZs { - ParentHitZone "{5E101C42D294D437}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone LForearm { - ParentHZs { - ParentHitZone "{5E101C42DD9CDBDB}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone RHand { - ParentHZs { - ParentHitZone "{5E101C42E52F619E}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone LHand { - ParentHZs { - ParentHitZone "{5E101C42EEBB8670}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone RThigh { - ParentHZs { - ParentHitZone "{5E101C42EB690A32}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone LThigh { - ParentHZs { - ParentHitZone "{5E101C42F1357632}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone RCalf { - ParentHZs { - ParentHitZone "{5E101C42FAB5D8D2}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone LCalf { - ParentHZs { - ParentHitZone "{5E101C420414E7EB}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone RFoot { - ParentHZs { - ParentHitZone "{5E101C42011283CE}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone LFoot { - ParentHZs { - ParentHitZone "{5E101C4209A3FC06}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - SCR_CharacterHitZone Neck { - ParentHZs { - ParentHitZone "{5E101C4227DFC5D3}" { - Parent "ACE_Medical_Pain" - HealingMultiplier 0 - Overkill 1 - } - } - } - ACE_Medical_PainHitZone ACE_Medical_Pain { - IgnoreExplosions 1 - BaseDamageMultiplier 0.5 - MaxHealth 100 - "DamageState threshold" { - 0.8 - 0.333 - } - m_fFullRegenerationTime 900 - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Core/DefaultPlayerController.et b/addons/medical/Prefabs/Characters/Core/DefaultPlayerController.et deleted file mode 100755 index 2509afd73..000000000 --- a/addons/medical/Prefabs/Characters/Core/DefaultPlayerController.et +++ /dev/null @@ -1,22 +0,0 @@ -SCR_PlayerController { - ID "1A9BA6BEFA06E3B1" - components { - SCR_HUDManagerComponent "{2FDC275D9EBCDB8B}" { - InfoDisplays { - SCR_ScreenEffectsManager "{5AF2CE6B10209B7D}" { - InfoDisplays { - ACE_Medical_PainScreenEffect "{5E101C4E0A1569CB}" { - m_LayoutPath "{BFBCF7C2CF2E36EE}UI/layouts/HUD/ScreenEffects/ScreenEffects.layout" - m_eLayer BACKGROUND - } - } - m_aHandlers { - SCR_InfoDisplayLayerHandler "{5E101C4E2CAED6E8}" { - m_sLayerName "Slot_ScreenEffects" - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_Medic.et b/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_Medic.et deleted file mode 100644 index 8502f1aff..000000000 --- a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_Medic.et +++ /dev/null @@ -1,14 +0,0 @@ -SCR_ChimeraCharacter : "{3967948B72443B25}Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_BaseLoadout.et" { - ID "520EC961A090BBD5" - components { - SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { - InitialInventoryItems { - ItemsInitConfigurationItem "{60CC201C8E262AD3}" { - PrefabsToSpawn + { - "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_Medic.et.meta b/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_Medic.et.meta deleted file mode 100644 index 739666bba..000000000 --- a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_Medic.et.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{0C1639553F575AD3}Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF/Character_RHS_USAF_USMC_Medic.et" - Configurations { - EntityTemplateResourceClass PC { - } - EntityTemplateResourceClass XBOX_ONE : PC { - } - EntityTemplateResourceClass XBOX_SERIES : PC { - } - EntityTemplateResourceClass PS4 : PC { - } - EntityTemplateResourceClass PS5 : PC { - } - EntityTemplateResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_Medic.et b/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_Medic.et deleted file mode 100644 index b77990d4e..000000000 --- a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_Medic.et +++ /dev/null @@ -1,14 +0,0 @@ -SCR_ChimeraCharacter : "{313361C0EF9E114B}Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_BaseLoadout.et" { - ID "520EC961A090BBD5" - components { - SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { - InitialInventoryItems { - ItemsInitConfigurationItem "{60CC201C8E262AD3}" { - PrefabsToSpawn + { - "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_Medic.et.meta b/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_Medic.et.meta deleted file mode 100644 index cb47dcb37..000000000 --- a/addons/medical/Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_Medic.et.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{FE4D2AC5D50E2125}Prefabs/Characters/Factions/BLUFOR/RHS_USAF/RHS_USAF_USMC_MEF_D/Character_RHS_USAF_USMC_D_Medic.et" - Configurations { - EntityTemplateResourceClass PC { - } - EntityTemplateResourceClass XBOX_ONE : PC { - } - EntityTemplateResourceClass XBOX_SERIES : PC { - } - EntityTemplateResourceClass PS4 : PC { - } - EntityTemplateResourceClass PS5 : PC { - } - EntityTemplateResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_Medic.et b/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_Medic.et deleted file mode 100644 index c1ce28078..000000000 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_Medic.et +++ /dev/null @@ -1,14 +0,0 @@ -SCR_ChimeraCharacter : "{2F8F4C139A8B4941}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_BaseLoadout.et" { - ID "520EC961A090B1EE" - components { - SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { - InitialInventoryItems { - ItemsInitConfigurationItem "{607C14DECF91E312}" { - PrefabsToSpawn + { - "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_Medic.et b/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_Medic.et deleted file mode 100644 index c0e7f8590..000000000 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_Medic.et +++ /dev/null @@ -1,14 +0,0 @@ -SCR_ChimeraCharacter : "{4CD88E5A61AE773D}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_BaseLoadout.et" { - ID "520EC961A090B1EE" - components { - SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { - InitialInventoryItems { - ItemsInitConfigurationItem "{607C14E3E8686452}" { - PrefabsToSpawn + { - "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_Medic.et.meta b/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_Medic.et.meta deleted file mode 100644 index 20e7edec6..000000000 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_Medic.et.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{7E590EDD929739E4}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Demiseason/Character_RHS_RF_MSV_VKPO_DS_Medic.et" - Configurations { - EntityTemplateResourceClass PC { - } - EntityTemplateResourceClass XBOX_ONE : PC { - } - EntityTemplateResourceClass XBOX_SERIES : PC { - } - EntityTemplateResourceClass PS4 : PC { - } - EntityTemplateResourceClass PS5 : PC { - } - EntityTemplateResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_Medic.et b/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_Medic.et deleted file mode 100644 index 61f08c75a..000000000 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_Medic.et +++ /dev/null @@ -1,14 +0,0 @@ -SCR_ChimeraCharacter : "{45A8C75A9E23BDEF}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_BaseLoadout.et" { - ID "520EC961A090B1EE" - components { - SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { - InitialInventoryItems { - ItemsInitConfigurationItem "{607C14E3E8686452}" { - PrefabsToSpawn + { - "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_Medic.et.meta b/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_Medic.et.meta deleted file mode 100644 index a4f76047d..000000000 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_Medic.et.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{816A594FAD3F711A}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VKPO_Summer/Character_RHS_RF_MSV_VKPO_S_Medic.et" - Configurations { - EntityTemplateResourceClass PC { - } - EntityTemplateResourceClass XBOX_ONE : PC { - } - EntityTemplateResourceClass XBOX_SERIES : PC { - } - EntityTemplateResourceClass PS4 : PC { - } - EntityTemplateResourceClass PS5 : PC { - } - EntityTemplateResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical/addon.gproj b/addons/medical/addon.gproj deleted file mode 100755 index 6fb9a4cd5..000000000 --- a/addons/medical/addon.gproj +++ /dev/null @@ -1,83 +0,0 @@ -GameProject { - ID "ACE_Medical" - GUID "60C4C12DAE90727B" - TITLE "ACE Medical" - Dependencies { - "58D0FB3206B6F859" "60C4CE4888FF4621" - } - Configurations { - GameProjectConfig PC { - WidgetManagerSettings WidgetManagerSettings "{AC4BE58770485E02}" { - StringTables { - StringTableDefinition "{60F615066E423D4C}" { - StringTableSource "{7667329AA15A6069}Language/ACE_Medical_localization.st" - Languages { - LanguageDefinition "{60F615066CFE70C7}" { - Code "cs_cz" - StringTableRuntime "{06008D360BA46D89}Language/ACE_Medical_localization.cs_cz.conf" - } - LanguageDefinition "{60F615066CFE707D}" { - Code "de_de" - StringTableRuntime "{D37E970518077CA9}Language/ACE_Medical_localization.de_de.conf" - } - LanguageDefinition "{60F615066CFE705B}" { - Code "en_us" - StringTableRuntime "{8D8E1D4E72F479A8}Language/ACE_Medical_localization.en_us.conf" - } - LanguageDefinition "{60F615066CFE7FB2}" { - Code "es_es" - StringTableRuntime "{48C250C79CF612B7}Language/ACE_Medical_localization.es_es.conf" - } - LanguageDefinition "{60F615066CFE7FAE}" { - Code "fr_fr" - StringTableRuntime "{F36AA5F07A75F1B5}Language/ACE_Medical_localization.fr_fr.conf" - } - LanguageDefinition "{60F615066CFE7F86}" { - Code "it_it" - StringTableRuntime "{73762AC4D757724C}Language/ACE_Medical_localization.it_it.conf" - } - LanguageDefinition "{60F615066CFE7FFF}" { - Code "ja_jp" - StringTableRuntime "{636D9756E92642E7}Language/ACE_Medical_localization.ja_jp.conf" - } - LanguageDefinition "{60F615066CFE7FD7}" { - Code "ko_kr" - StringTableRuntime "{C3D3BFFA7A0B41D8}Language/ACE_Medical_localization.ko_kr.conf" - } - LanguageDefinition "{60F615066CFE7FCF}" { - Code "pl_pl" - StringTableRuntime "{9FA21900C4E4DDA4}Language/ACE_Medical_localization.pl_pl.conf" - } - LanguageDefinition "{60F615066CFE7F23}" { - Code "pt_br" - StringTableRuntime "{4AD583CCFF1A171E}Language/ACE_Medical_localization.pt_br.conf" - } - LanguageDefinition "{60F615066CFE7EC3}" { - Code "ru_ru" - StringTableRuntime "{1F94976462637268}Language/ACE_Medical_localization.ru_ru.conf" - } - LanguageDefinition "{60F615066CFE7E38}" { - Code "uk_ua" - StringTableRuntime "{95CCC2920E4DCC3D}Language/ACE_Medical_localization.uk_ua.conf" - } - LanguageDefinition "{60F615066CFE7E2F}" { - Code "zh_cn" - StringTableRuntime "{4F7CACAF37ED1C20}Language/ACE_Medical_localization.zh_cn.conf" - } - } - } - } - } - } - GameProjectConfig XBOX_ONE { - } - GameProjectConfig XBOX_SERIES { - } - GameProjectConfig PS4 { - } - GameProjectConfig PS5 { - } - GameProjectConfig HEADLESS { - } - } -} \ No newline at end of file diff --git a/addons/medical/scripts/Game/ACE_Medical/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical/scripts/Game/ACE_Medical/Components/Damage/SCR_CharacterDamageManagerComponent.c deleted file mode 100644 index c4846baee..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/Components/Damage/SCR_CharacterDamageManagerComponent.c +++ /dev/null @@ -1,188 +0,0 @@ -//------------------------------------------------------------------------------------------------ -//! Introduce a second chance, which gets triggered when the character would have died without -//! falling unconscious. -//! Add methods for interacting with pain hit zone. -modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent -{ - [RplProp(), Attribute(defvalue: "0", desc: "Resilience regeneration scale when second chance was triggered. The default regeneration rate will be multiplied by this factor.", category: "ACE Medical")] - protected float m_fACE_Medical_SecondChanceRegenScale; - - protected HitZone m_pACE_Medical_HealthHitZone; - protected float m_fACE_Medical_CriticalHealth; - protected ref array m_aACE_Medical_PhysicalHitZones = {}; - - protected ACE_Medical_PainHitZone m_pACE_Medical_PainHitZone; - protected float m_fACE_Medical_ModeratePainThreshold; - protected float m_fACE_Medical_SeriousPainThreshold; - - // We only notify the replication system about changes of these members on initialization - // After init, each proxy is itself responsible for updating these members - // Having them as RplProp also ensures that JIPs receive the current state from the server - [RplProp()] - protected bool m_bACE_Medical_Initialized = false; - [RplProp()] - protected bool m_bACE_Medical_HasSecondChance = false; - [RplProp()] - protected bool m_bACE_Medical_SecondChanceOnHeadEnabled = false; - [RplProp()] - protected bool m_bACE_Medical_SecondChanceTriggered = false; - - //----------------------------------------------------------------------------------------------------------- - //! Initialize member variables - override void OnPostInit(IEntity owner) - { - super.OnPostInit(owner); - - m_pACE_Medical_HealthHitZone = GetHitZoneByName("Health"); - if (!m_pACE_Medical_HealthHitZone) - return; - - m_fACE_Medical_CriticalHealth = m_pACE_Medical_HealthHitZone.GetDamageStateThreshold(ECharacterHealthState.CRITICAL); - GetPhysicalHitZones(m_aACE_Medical_PhysicalHitZones); - } - - //----------------------------------------------------------------------------------------------------------- - //! Initialize ACE medical on a character damage manager (Called on the server) - void ACE_Medical_Initialize() - { - if (m_bACE_Medical_Initialized) - return; - - ACE_Medical_Settings settings = ACE_SettingsHelperT.GetModSettings(); - if (settings) - { - m_bACE_Medical_SecondChanceOnHeadEnabled = settings.m_bSecondChanceOnHeadEnabled; - m_fACE_Medical_SecondChanceRegenScale = settings.m_fSecondChanceRegenScale; - } - - ACE_Medical_EnableSecondChance(true); - // Damage calculations are done on all machines, so we have to broadcast the init - m_bACE_Medical_Initialized = true; - Replication.BumpMe(); - } - - //------------------------------------------------------------------------------------------------ - // Reduce regeneration rate when second chance was triggered - override float GetResilienceRegenScale() - { - float scale = super.GetResilienceRegenScale(); - if (m_bACE_Medical_SecondChanceTriggered && scale > 0) - { - return m_fACE_Medical_SecondChanceRegenScale; - } - else - { - return scale; - } - } - - //------------------------------------------------------------------------------------------------ - //! Returns true if health hit zone has critical health - bool ACE_Medical_HasCriticalHealth() - { - return m_pACE_Medical_HealthHitZone.GetHealthScaled() <= m_fACE_Medical_CriticalHealth; - } - - //------------------------------------------------------------------------------------------------ - //! Returns true if at least one physical hit zone is injured - bool ACE_Medical_CanBeHealed() - { - foreach (HitZone hitZone : m_aACE_Medical_PhysicalHitZones) - { - if (hitZone.GetHealthScaled() < 0.999) - return true; - } - - return false; - } - - //----------------------------------------------------------------------------------------------------------- - //! Called by ACE_Medical_PainHitZone.OnInit to initialize the hit zone - void ACE_Medical_SetPainHitZone(HitZone hitzone) - { - m_pACE_Medical_PainHitZone = ACE_Medical_PainHitZone.Cast(hitzone); - m_fACE_Medical_ModeratePainThreshold = m_pACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.MODERATE); - m_fACE_Medical_SeriousPainThreshold = m_pACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.SERIOUS); - } - - //----------------------------------------------------------------------------------------------------------- - //! Return the pain hit zone - ACE_Medical_PainHitZone ACE_Medical_GetPainHitZone() - { - return m_pACE_Medical_PainHitZone; - } - - //----------------------------------------------------------------------------------------------------------- - //! Returns true if pain hit zone is at least moderately damaged - bool ACE_Medical_IsInPain() - { - return m_pACE_Medical_PainHitZone.GetHealthScaled() <= m_fACE_Medical_ModeratePainThreshold; - } - - //----------------------------------------------------------------------------------------------------------- - //! Returns intensity of pain used for ACE_Medical_PainScreenEffect - float ACE_Medical_GetPainIntensity() - { - // Clamp between serious damage and full health - float scaledHealth = Math.Clamp(m_pACE_Medical_PainHitZone.GetHealthScaled(), m_fACE_Medical_SeriousPainThreshold, 1); - - if (scaledHealth > m_fACE_Medical_ModeratePainThreshold) - { - // No effect when less than moderate damage - return 0; - } - else - { - // Linear response from full health -> 0 to serious damage -> 1 - return Math.InverseLerp(1, m_fACE_Medical_SeriousPainThreshold, scaledHealth); - } - } - - //------------------------------------------------------------------------------------------------ - //! Returns true if ACE Medical has been initialized - bool ACE_Medical_IsInitialized() - { - return m_bACE_Medical_Initialized; - } - - //------------------------------------------------------------------------------------------------ - //! Enable/disable second chance - void ACE_Medical_EnableSecondChance(bool enable) - { - m_bACE_Medical_HasSecondChance = enable; - } - - //------------------------------------------------------------------------------------------------ - //! Check if second chance is enabled - bool ACE_Medical_HasSecondChance() - { - return m_bACE_Medical_HasSecondChance; - } - - //----------------------------------------------------------------------------------------------------------- - //! Returns true if second chance is enabled for the given hit zone - bool ACE_Medical_HasSecondChanceOnHitZone(HitZone hitZone) - { - if (!m_bACE_Medical_HasSecondChance) - return false; - - if (m_bACE_Medical_SecondChanceOnHeadEnabled) - return true; - - return (hitZone != m_pHeadHitZone); - } - - //------------------------------------------------------------------------------------------------ - //! To be set true when second chance was used - void ACE_Medical_SetSecondChanceTrigged(bool isTriggered) - { - m_bACE_Medical_SecondChanceTriggered = isTriggered; - } - - //------------------------------------------------------------------------------------------------ - //! Check if second chance was used - bool ACE_Medical_WasSecondChanceTrigged() - { - return m_bACE_Medical_SecondChanceTriggered; - } -} diff --git a/addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/ACE_Medical_ConsumableEpinephrine.c b/addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/ACE_Medical_ConsumableEpinephrine.c deleted file mode 100755 index 191561ef6..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/ACE_Medical_ConsumableEpinephrine.c +++ /dev/null @@ -1,65 +0,0 @@ -//! Epinephrine effect: Heals resilience hit zone -[BaseContainerProps()] -class ACE_Medical_ConsumableEpinephrine : SCR_ConsumableEffectHealthItems -{ - //------------------------------------------------------------------------------------------------ - //! Can be applied when patient is unconscious and no epinephrine is in the system - override bool CanApplyEffect(notnull IEntity target, notnull IEntity user, out SCR_EConsumableFailReason failReason) - { - ChimeraCharacter char = ChimeraCharacter.Cast(target); - if (!char) - return false; - - SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(char.GetDamageManager()); - if (!damageManager) - return false; - - SCR_HitZone resilienceHZ = SCR_HitZone.Cast(damageManager.GetResilienceHitZone()); - if (!resilienceHZ) - return false; - - // Check if epinephrine is in the system already - array effects = damageManager.GetAllPersistentEffectsOfType(ACE_Medical_EpinephrineDamageEffect); - if (!effects.IsEmpty()) - { - failReason = SCR_EConsumableFailReason.ALREADY_APPLIED; - return false; - } - - // Cannot be applied while bleeding - if (damageManager.IsBleeding()) - { - failReason = SCR_EConsumableFailReason.IS_BLEEDING; - return false; - } - - // Cannot be applied if critically injured - // We also have to check if the character is still healable - if (damageManager.ACE_Medical_HasCriticalHealth() && damageManager.ACE_Medical_CanBeHealed()) - { - failReason = SCR_EConsumableFailReason.ACE_MEDICAL_TOO_DAMAGED; - return false; - } - - SCR_CharacterControllerComponent charCtrl = SCR_CharacterControllerComponent.Cast(char.GetCharacterController()); - if (charCtrl.GetLifeState() == ECharacterLifeState.INCAPACITATED) - return true; - - failReason = SCR_EConsumableFailReason.ACE_MEDICAL_NOT_INCAPACITATED; - return false; - } - - //------------------------------------------------------------------------------------------------ - //! Can be applied to hit zones under same conditions as CanApplyEffect - override bool CanApplyEffectToHZ(notnull IEntity target, notnull IEntity user, ECharacterHitZoneGroup group, out SCR_EConsumableFailReason failReason = SCR_EConsumableFailReason.NONE) - { - return CanApplyEffect(target, user, failReason); - } - - //------------------------------------------------------------------------------------------------ - //! Set consumable type in ctor - void ACE_Medical_ConsumableEpinephrine() - { - m_eConsumableType = SCR_EConsumableType.ACE_MEDICAL_EPINEPHRINE; - } -} diff --git a/addons/medical/scripts/Game/ACE_Medical/Components/SupportStation/SCR_HealSupportStationComponent.c b/addons/medical/scripts/Game/ACE_Medical/Components/SupportStation/SCR_HealSupportStationComponent.c deleted file mode 100644 index 3788ddebe..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/Components/SupportStation/SCR_HealSupportStationComponent.c +++ /dev/null @@ -1,34 +0,0 @@ -//------------------------------------------------------------------------------------------------ -modded class SCR_HealSupportStationComponent : SCR_BaseDamageHealSupportStationComponent -{ - //------------------------------------------------------------------------------------------------ - //! Apply settings - override protected void DelayedInit(IEntity owner) - { - super.DelayedInit(owner); - - ACE_Medical_Settings settings = ACE_SettingsHelperT.GetModSettings(); - if (!settings) - return; - - SCR_ResourceComponent resource = SCR_ResourceComponent.Cast(GetOwner().FindComponent(SCR_ResourceComponent)); - if (!resource) - return; - - resource.SetResourceTypeEnabled(settings.m_bHealSupplyUsageEnabled); - - // Set how much medical kits can heal - if (owner && InventoryItemComponent.Cast(owner.FindComponent(InventoryItemComponent)) && m_fMaxHealScaled != settings.m_fMedicalKitMaxHealScaled) - { - m_fMaxHealScaled = settings.m_fMedicalKitMaxHealScaled; - Rpc(RpcDo_ACE_Medical_SetMaxHealScaledBroadcast, settings.m_fMedicalKitMaxHealScaled); - } - } - - //------------------------------------------------------------------------------------------------ - [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)] - void RpcDo_ACE_Medical_SetMaxHealScaledBroadcast(float maxHealScaled) - { - m_fMaxHealScaled = maxHealScaled; - } -} diff --git a/addons/medical/scripts/Game/ACE_Medical/HitZone/ACE_Medical_PainHitZone.c b/addons/medical/scripts/Game/ACE_Medical/HitZone/ACE_Medical_PainHitZone.c deleted file mode 100755 index 8764e971e..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/HitZone/ACE_Medical_PainHitZone.c +++ /dev/null @@ -1,25 +0,0 @@ -//----------------------------------------------------------------------------------------------------------- -//! Pain - does not receive damage directly, only via scripted events. -class ACE_Medical_PainHitZone : SCR_RegeneratingHitZone -{ - //----------------------------------------------------------------------------------------------------------- - //! Store instance on SCR_CharacterDamageManagerComponent on init - override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) - { - super.OnInit(pOwnerEntity, pManagerComponent); - SCR_CharacterDamageManagerComponent characterDamageManager = SCR_CharacterDamageManagerComponent.Cast(pManagerComponent); - if (characterDamageManager) - characterDamageManager.ACE_Medical_SetPainHitZone(this); - } - - //----------------------------------------------------------------------------------------------------------- - //! Suppress passive regeneration while bleeding - override float CalculatePassiveRegenDPS(bool considerRegenScale = true) - { - SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); - if (damageManager && damageManager.IsBleeding()) - return 0; - - return super.CalculatePassiveRegenDPS(considerRegenScale); - } -} diff --git a/addons/medical/scripts/Game/ACE_Medical/HitZone/SCR_CharacterHealthHitZone.c b/addons/medical/scripts/Game/ACE_Medical/HitZone/SCR_CharacterHealthHitZone.c deleted file mode 100644 index ead8465a2..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/HitZone/SCR_CharacterHealthHitZone.c +++ /dev/null @@ -1,49 +0,0 @@ -//----------------------------------------------------------------------------------------------------------- -//! health hitzone - Receives damage from physical hitzones -modded class SCR_CharacterHealthHitZone : SCR_HitZone -{ - protected SCR_CharacterDamageManagerComponent m_pACE_Medical_DamageManager; - protected bool m_bACE_Medical_HasSecondChanceOnHead; - protected float ACE_MEDICAL_SECOND_CHANCE_MIN_HEALTH = 1; - - //----------------------------------------------------------------------------------------------------------- - //! Initialize variables on init - override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) - { - super.OnInit(pOwnerEntity, pManagerComponent); - m_pACE_Medical_DamageManager = SCR_CharacterDamageManagerComponent.Cast(pManagerComponent); - } - - //----------------------------------------------------------------------------------------------------------- - //! Calculates the amount of damage the health hit zone will receive - //! Change damage calculation while second chance is enabled - //! Executed on all server and all clients - override float ComputeEffectiveDamage(notnull BaseDamageContext damageContext, bool isDOT) - { - if (m_pACE_Medical_DamageManager.ACE_Medical_HasSecondChanceOnHitZone(damageContext.struckHitZone)) - return ACE_Medical_ComputeSecondChanceEffectiveDamage(damageContext, isDOT); - - return super.ComputeEffectiveDamage(damageContext, isDOT); - } - - //----------------------------------------------------------------------------------------------------------- - //! Computes the damage the health hit zone receives while the character has second chance enabled - //! Ensures that the hit zone health can never drop below ACE_MEDICAL_SECOND_CHANCE_MIN_HEALTH - //! Triggers second chance if damage had to be rescaled - protected float ACE_Medical_ComputeSecondChanceEffectiveDamage(notnull BaseDamageContext damageContext, bool isDOT) - { - float effectiveDamage = super.ComputeEffectiveDamage(damageContext, isDOT); - if (GetHealth() - effectiveDamage >= ACE_MEDICAL_SECOND_CHANCE_MIN_HEALTH) - return effectiveDamage; - - SCR_CharacterHitZone hitZone = SCR_CharacterHitZone.Cast(damageContext.struckHitZone); - if (hitZone && !m_pACE_Medical_DamageManager.ACE_Medical_WasSecondChanceTrigged()) - { - m_pACE_Medical_DamageManager.ACE_Medical_SetSecondChanceTrigged(true); - // Add bleeding to the hit zone that triggered second chance - m_pACE_Medical_DamageManager.AddBleedingEffectOnHitZone(hitZone, damageContext.colliderID); - } - - return GetHealth() - ACE_MEDICAL_SECOND_CHANCE_MIN_HEALTH; - } -} diff --git a/addons/medical/scripts/Game/ACE_Medical/HitZone/SCR_CharacterResilienceHitZone.c b/addons/medical/scripts/Game/ACE_Medical/HitZone/SCR_CharacterResilienceHitZone.c deleted file mode 100644 index 2996c8aee..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/HitZone/SCR_CharacterResilienceHitZone.c +++ /dev/null @@ -1,16 +0,0 @@ -//------------------------------------------------------------------------------------------------ -modded class SCR_CharacterResilienceHitZone : SCR_RegeneratingHitZone -{ - //------------------------------------------------------------------------------------------------ - //! Multiply regen DPS by the regen scale - override float CalculatePassiveRegenDPS(bool considerRegenScale = true) - { - float regenDPS = super.CalculatePassiveRegenDPS(considerRegenScale); - - SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); - if (damageManager) - regenDPS *= damageManager.GetResilienceRegenScale(); - - return regenDPS; - } -} diff --git a/addons/medical/scripts/Game/ACE_Medical/Player/SCR_PlayerController.c b/addons/medical/scripts/Game/ACE_Medical/Player/SCR_PlayerController.c deleted file mode 100644 index 00ef8ee7c..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/Player/SCR_PlayerController.c +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------------------------ -modded class SCR_PlayerController : PlayerController -{ - //------------------------------------------------------------------------------------------------ - //! Initialize ACE Medical on player controlled characters - override void OnControlledEntityChanged(IEntity from, IEntity to) - { - super.OnControlledEntityChanged(from, to); - - // OnControlledEntityChanged runs on owner too, but we only want to call the init on the server - if (Replication.IsRunning() && !Replication.IsServer()) - return; - - //! Do not initialize for GM controlled AI - if (!to || IsPossessing()) - return; - - SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(to.FindComponent(SCR_CharacterDamageManagerComponent)); - if (damageManager) - damageManager.ACE_Medical_Initialize(); - } -} diff --git a/addons/medical/scripts/Game/ACE_Medical/Settings/ACE_Medical_SettingsConfig.c b/addons/medical/scripts/Game/ACE_Medical/Settings/ACE_Medical_SettingsConfig.c deleted file mode 100755 index 9d00ab62d..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/Settings/ACE_Medical_SettingsConfig.c +++ /dev/null @@ -1,17 +0,0 @@ -//------------------------------------------------------------------------------------------------ -//! Settings for a mod -[BaseContainerProps()] -class ACE_Medical_Settings : ACE_ModSettings -{ - [Attribute(defvalue: "0", desc: "Resilience regeneration scale when second chance was triggered. The default regeneration rate will be multiplied by this factor.", category: "ACE Medical")] - float m_fSecondChanceRegenScale; - - [Attribute(defvalue: "false", desc: "Enables second chance on headshots")] - bool m_bSecondChanceOnHeadEnabled; - - [Attribute(defvalue: "1", desc: "Healing consumes supplies when enabled. Ignored when global supply usage is disabled.")] - bool m_bHealSupplyUsageEnabled; - - [Attribute(defvalue: "0.5", desc: "Maximum scaled health (from 0 to 1) that a medical kit can heal to outside of medical facilities")] - float m_fMedicalKitMaxHealScaled; -} diff --git a/addons/medical/scripts/Game/ACE_Medical/UI/ScreenEffects/ACE_Medical_PainScreenEffect.c b/addons/medical/scripts/Game/ACE_Medical/UI/ScreenEffects/ACE_Medical_PainScreenEffect.c deleted file mode 100755 index c701817ad..000000000 --- a/addons/medical/scripts/Game/ACE_Medical/UI/ScreenEffects/ACE_Medical_PainScreenEffect.c +++ /dev/null @@ -1,158 +0,0 @@ -//------------------------------------------------------------------------------------------------ -//! Pain screen effect; Code is based on SCR_BleedingScreenEffect -class ACE_Medical_PainScreenEffect : SCR_BaseScreenEffect -{ - // Play Animation of CreateEffectOverTime() - protected const int PAIN_REPEAT_DELAY = 1000; - protected const float PAINEFFECT_OPACITY_FADEOUT_1_DURATION = 0.2; - protected const float PAINEFFECT_PROGRESSION_FADEOUT_1_DURATION = 0.2; - protected const float PAINEFFECT_OPACITY_FADEOUT_2_DURATION = 0.3; - protected const float PAINEFFECT_PROGRESSION_FADEOUT_2_DURATION = 3; - protected const float PAINEFFECT_OPACITY_FADEIN_1_DURATION = 1; - protected const float PAINEFFECT_PROGRESSION_FADEIN_1_DURATION = 4.5; - - // Play Animation of BlackoutEffect() - protected const float BLACKOUT_OPACITY_MULTIPLIER = 0.20; - - //Saturation - private static float s_fSaturation; - - // Widgets - protected ImageWidget m_wWhiteFlash; - - // Character - protected SCR_CharacterDamageManagerComponent m_pDamageManager; - protected SCR_CharacterControllerComponent m_pCharacterCtrl; - protected ACE_Medical_PainHitZone m_pPainHZ; - protected ChimeraCharacter m_pCharacterEntity; - - protected bool m_bHasPainEffect; - protected bool m_bIsInPain; - - - //------------------------------------------------------------------------------------------------ - //! Get effects wiget when starting to draw - override void DisplayStartDraw(IEntity owner) - { - m_wWhiteFlash = ImageWidget.Cast(m_wRoot.FindAnyWidget("ACE_Medical_WhiteFlash")); - } - - //------------------------------------------------------------------------------------------------ - //! Clear effect and reassign event handlers when controlled entity was changed - override void DisplayControlledEntityChanged(IEntity from, IEntity to) - { - ClearEffects(); - - m_pCharacterEntity = ChimeraCharacter.Cast(to); - if (!m_pCharacterEntity) - return; - - m_pDamageManager = SCR_CharacterDamageManagerComponent.Cast(m_pCharacterEntity.GetDamageManager()); - if (!m_pDamageManager) - return; - - m_pCharacterCtrl = SCR_CharacterControllerComponent.Cast(m_pCharacterEntity.FindComponent(SCR_CharacterControllerComponent)); - if (!m_pCharacterCtrl) - return; - - // define hitzones for later getting - m_pPainHZ = m_pDamageManager.ACE_Medical_GetPainHitZone(); - - // Keep track of changes in pain - m_pPainHZ.GetOnDamageStateChanged().Insert(OnPainStateChanged); - - // In case player started PAIN before invokers were established, check if already in PAIN - if (m_pDamageManager.ACE_Medical_IsInPain()) - OnPainStateChanged(m_pPainHZ); - } - - //------------------------------------------------------------------------------------------------ - //! Add/Remove effect when pain state has changed - protected void OnPainStateChanged(SCR_HitZone hitZone) - { - m_bIsInPain = m_pDamageManager.ACE_Medical_IsInPain(); - if (m_bHasPainEffect) - { - if (!m_bIsInPain || m_pDamageManager.GetState() == EDamageState.DESTROYED) - { - ClearEffectOverTime(); - GetGame().GetCallqueue().Remove(CreateEffectOverTime); - GetGame().GetCallqueue().Remove(ClearEffectOverTime); - m_bHasPainEffect = false; - }; - } - else - { - if (m_bIsInPain && m_pDamageManager.GetState() != EDamageState.DESTROYED) - { - CreateEffectOverTime(); - m_bHasPainEffect = m_bIsInPain; - }; - }; - } - - //------------------------------------------------------------------------------------------------ - //! Fade in (isFadeIn is true) or out of white flash effects - //! Alternates with ClearEffectOverTime - protected void CreateEffectOverTime(bool isFadeIn = true) - { - if (!m_wWhiteFlash || !m_pPainHZ) - return; - - float effectStrength = 0; - - // Pain can only be felt when conscious - if (!m_pCharacterCtrl.IsUnconscious()) - effectStrength = m_pDamageManager.ACE_Medical_GetPainIntensity(); - - m_wWhiteFlash.SetSaturation(1); - - if (isFadeIn) - { - AnimateWidget.Opacity(m_wWhiteFlash, effectStrength, PAINEFFECT_OPACITY_FADEIN_1_DURATION); - AnimateWidget.AlphaMask(m_wWhiteFlash, effectStrength * 0.5, PAINEFFECT_PROGRESSION_FADEIN_1_DURATION); - } - else - { - AnimateWidget.Opacity(m_wWhiteFlash, 0, PAINEFFECT_OPACITY_FADEOUT_2_DURATION); - AnimateWidget.AlphaMask(m_wWhiteFlash, 0, PAINEFFECT_PROGRESSION_FADEOUT_2_DURATION); - } - - GetGame().GetCallqueue().CallLater(ClearEffectOverTime, 1000, false, true, isFadeIn); - } - - //------------------------------------------------------------------------------------------------ - //! Fade out pain effect. - //! Ends white flash effect if repeat is false - //! If repeat is true, then alternates with CreateEffectOverTime and toggles isFadeIn - protected void ClearEffectOverTime(bool repeat = false, bool isFadeIn = false) - { - AnimateWidget.Opacity(m_wWhiteFlash, 0, PAINEFFECT_PROGRESSION_FADEOUT_1_DURATION); - AnimateWidget.AlphaMask(m_wWhiteFlash, 0, PAINEFFECT_OPACITY_FADEOUT_1_DURATION); - - if (repeat && m_bHasPainEffect) - GetGame().GetCallqueue().CallLater(CreateEffectOverTime, PAIN_REPEAT_DELAY, false, !isFadeIn); - } - - //------------------------------------------------------------------------------------------------ - //! Clear pain effect over time - override void ClearEffects() - { - m_bHasPainEffect = false; - - if (m_wWhiteFlash) - { - AnimateWidget.StopAllAnimations(m_wWhiteFlash); - m_wWhiteFlash.SetOpacity(0); - m_wWhiteFlash.SetMaskProgress(0); - }; - - GetGame().GetCallqueue().Remove(CreateEffectOverTime); - GetGame().GetCallqueue().Remove(ClearEffectOverTime); - - if (!m_pDamageManager) - return; - - m_pPainHZ.GetOnDamageStateChanged().Remove(OnPainStateChanged); - } -} diff --git a/addons/medical/scripts/Game/UserActions/SCR_BandageUserAction.c b/addons/medical/scripts/Game/UserActions/SCR_BandageUserAction.c deleted file mode 100644 index dd05b85d9..000000000 --- a/addons/medical/scripts/Game/UserActions/SCR_BandageUserAction.c +++ /dev/null @@ -1,60 +0,0 @@ -//------------------------------------------------------------------------------------------------ -//! Hard-override of SCR_BandageUserAction -class SCR_BandageUserAction : SCR_HealingUserAction -{ - //------------------------------------------------------------------------------------------------ - //! Copy of vanilla method - override void OnActionCanceled(IEntity pOwnerEntity, IEntity pUserEntity) - { - ChimeraCharacter character = ChimeraCharacter.Cast(pUserEntity); - if (!character) - return; - - CharacterControllerComponent controller = character.GetCharacterController(); - if (!controller) - return; - - if (controller.GetLifeState() != ECharacterLifeState.ALIVE) - return; - - SCR_ConsumableItemComponent consumableComponent = GetConsumableComponent(character); - if (consumableComponent) - consumableComponent.SetAlternativeModel(false); - } - - //------------------------------------------------------------------------------------------------ - //! We move the handling from CanBeShownScript to CanBePerformedScript - //! We check the bleeding via the array of all bleeding hit zones, which should be more reliable - //! than the vanilla implementation - override bool CanBePerformedScript(IEntity user) - { - if (!super.CanBePerformedScript(user)) - return false; - - // Target character - ChimeraCharacter char = ChimeraCharacter.Cast(GetOwner()); - if (!char) - return false; - - SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(char.GetDamageManager()); - if (!damageManager) - return false; - - array hitZones = damageManager.GetBleedingHitZones(); - if (hitZones) - { - foreach (HitZone hitZone : hitZones) - { - SCR_CharacterHitZone charHitZone = SCR_CharacterHitZone.Cast(hitZone); - if (!charHitZone) - continue; - - if (charHitZone.GetHitZoneGroup() == m_eHitZoneGroup) - return true; - } - } - - SetCannotPerformReason(m_sNotBleeding); - return false; - } -} diff --git a/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds b/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds new file mode 100644 index 000000000..419f57495 Binary files /dev/null and b/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds differ diff --git a/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds.meta b/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds.meta rename to addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds.meta diff --git a/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat b/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat new file mode 100644 index 000000000..d7e84079f --- /dev/null +++ b/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat @@ -0,0 +1,3 @@ +MatPBRBasic : "{7C3C75B2A6B5658A}Assets/Items/Medicine/MorphineInjection_01/Data/MorphineInjection_01.emat" { + BCRMap "{54CC811718DE59FC}Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.edds" +} \ No newline at end of file diff --git a/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat.meta b/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat.meta rename to addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.emat.meta diff --git a/addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.png b/addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.png old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.png rename to addons/medical_core/Assets/Items/Medicine/EpinephrineInjection/Data/ACE_Medical_EpinephrineInjection.png diff --git a/addons/medical/Configs/ACE/Settings.conf b/addons/medical_core/Configs/ACE/Settings.conf old mode 100755 new mode 100644 similarity index 51% rename from addons/medical/Configs/ACE/Settings.conf rename to addons/medical_core/Configs/ACE/Settings.conf index 47946ca0d..cdf667b40 --- a/addons/medical/Configs/ACE/Settings.conf +++ b/addons/medical_core/Configs/ACE/Settings.conf @@ -1,6 +1,6 @@ ACE_SettingsConfig { m_aInitialModSettings { - ACE_Medical_Settings "{60FD72EFA3DB8236}" { + ACE_Medical_Core_Settings "{60FD72EFA3DB8236}" { } } } \ No newline at end of file diff --git a/addons/medical/Configs/ACE/Settings.conf.meta b/addons/medical_core/Configs/ACE/Settings.conf.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Configs/ACE/Settings.conf.meta rename to addons/medical_core/Configs/ACE/Settings.conf.meta diff --git a/addons/medical_core/Configs/Editor/Tooltips/EntityTooltips.conf b/addons/medical_core/Configs/Editor/Tooltips/EntityTooltips.conf new file mode 100644 index 000000000..076f74844 --- /dev/null +++ b/addons/medical_core/Configs/Editor/Tooltips/EntityTooltips.conf @@ -0,0 +1,19 @@ +SCR_EntityTooltipConfig { + m_aDetailTypes { + SCR_EntityTooltipDetailType "{546674DF20D07CF0}" { + m_aDetails { + ACE_Medical_HealthTooltipDetail "{5466ECE2AF3E1074}" { + } + SCR_IdentityDividerTooltipDetail "{660F338C6817F401}" { + m_sDisplayName "!Divider" + m_Layout "{9E2B6474983BC69B}UI/layouts/Editor/Tooltips/TooltipPrefabs/TooltipPrefab_Divider.layout" + m_bShowLabel 0 + } + ACE_Medical_ResilienceTooltipDetail "{660F338DA910E0CA}" { + m_sDisplayName "#ACE_Medical-Editor_TooltipDetail_Resilience_Name" + m_Layout "{771F6010E0CA2F0B}UI/layouts/Editor/Tooltips/TooltipPrefabs/TooltipPrefab_ProgressBar.layout" + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.de_de.conf.meta b/addons/medical_core/Configs/Editor/Tooltips/EntityTooltips.conf.meta old mode 100755 new mode 100644 similarity index 78% rename from addons/medical/Language/ACE_Medical_localization.de_de.conf.meta rename to addons/medical_core/Configs/Editor/Tooltips/EntityTooltips.conf.meta index 2f1410440..725e4888f --- a/addons/medical/Language/ACE_Medical_localization.de_de.conf.meta +++ b/addons/medical_core/Configs/Editor/Tooltips/EntityTooltips.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{D37E970518077CA9}Language/ACE_Medical_localization.de_de.conf" + Name "{96EFE81470EF9AA5}Configs/Editor/Tooltips/EntityTooltips.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/medical/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf b/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf rename to addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf diff --git a/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta b/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta new file mode 100644 index 000000000..49381bb91 --- /dev/null +++ b/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{E908001749419691}Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass HEADLESS : PC { + } + CONFResourceClass PS5 : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/Configs/EntityCatalog/US/US_InventoryItems.conf b/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Configs/EntityCatalog/US/US_InventoryItems.conf rename to addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf diff --git a/addons/medical/Configs/EntityCatalog/RHS_MSV/MSV_InventoryItems.conf.meta b/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta similarity index 74% rename from addons/medical/Configs/EntityCatalog/RHS_MSV/MSV_InventoryItems.conf.meta rename to addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta index 67b36599d..e60da21c0 100644 --- a/addons/medical/Configs/EntityCatalog/RHS_MSV/MSV_InventoryItems.conf.meta +++ b/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{4AB9A3D2B81A7855}Configs/EntityCatalog/RHS_MSV/MSV_InventoryItems.conf" + Name "{5F7EC52FC40A03E2}Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf" Configurations { CONFResourceClass PC { } @@ -9,9 +9,9 @@ MetaFileClass { } CONFResourceClass PS4 : PC { } - CONFResourceClass PS5 : PC { - } CONFResourceClass HEADLESS : PC { } + CONFResourceClass PS5 : PC { + } } } \ No newline at end of file diff --git a/addons/medical/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf b/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf rename to addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf diff --git a/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta b/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta new file mode 100644 index 000000000..ec038fee9 --- /dev/null +++ b/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{C53421647C3D0D2E}Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass HEADLESS : PC { + } + CONFResourceClass PS5 : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Configs/Systems/ChimeraSystemsConfig.conf b/addons/medical_core/Configs/Systems/ChimeraSystemsConfig.conf new file mode 100644 index 000000000..5d022d579 --- /dev/null +++ b/addons/medical_core/Configs/Systems/ChimeraSystemsConfig.conf @@ -0,0 +1,8 @@ +SystemSettings : "{45C53F06BA17238D}configs/Systems/SystemsConfig.conf" { + Systems { + ACE_Medical_SecondChanceSystem "{658D0E49B8A49251}" { + SystemLocation Server + SystemPoints 4 + } + } +} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.cs_cz.conf.meta b/addons/medical_core/Configs/Systems/ChimeraSystemsConfig.conf.meta old mode 100755 new mode 100644 similarity index 78% rename from addons/medical/Language/ACE_Medical_localization.cs_cz.conf.meta rename to addons/medical_core/Configs/Systems/ChimeraSystemsConfig.conf.meta index daf2de23f..06c5eb99e --- a/addons/medical/Language/ACE_Medical_localization.cs_cz.conf.meta +++ b/addons/medical_core/Configs/Systems/ChimeraSystemsConfig.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{06008D360BA46D89}Language/ACE_Medical_localization.cs_cz.conf" + Name "{86E953538A28A98D}Configs/Systems/ChimeraSystemsConfig.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/medical/Language/ACE_Medical_localization.cs_cz.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.cs_cz.conf old mode 100755 new mode 100644 similarity index 92% rename from addons/medical/Language/ACE_Medical_localization.cs_cz.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.cs_cz.conf index a5017701e..39e5f77fb --- a/addons/medical/Language/ACE_Medical_localization.cs_cz.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.cs_cz.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Aplikovat epinefrin" "Bez bolestí" "Při vědomí" diff --git a/addons/medical/Configs/EntityCatalog/FFA/FFA_InventoryItems.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.cs_cz.conf.meta similarity index 77% rename from addons/medical/Configs/EntityCatalog/FFA/FFA_InventoryItems.conf.meta rename to addons/medical_core/Language/ACE_Medical_Core_localization.cs_cz.conf.meta index 85d397bec..d8875bb03 100644 --- a/addons/medical/Configs/EntityCatalog/FFA/FFA_InventoryItems.conf.meta +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.cs_cz.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{1FFB8A9964E1F4E4}Configs/EntityCatalog/FFA/FFA_InventoryItems.conf" + Name "{EE777A352C84A41A}Language/ACE_Medical_Core_localization.cs_cz.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/medical/Language/ACE_Medical_localization.de_de.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.de_de.conf old mode 100755 new mode 100644 similarity index 93% rename from addons/medical/Language/ACE_Medical_localization.de_de.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.de_de.conf index 0631e4237..ff053c49a --- a/addons/medical/Language/ACE_Medical_localization.de_de.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.de_de.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilienz" "Epinephrin injizieren" "Kein Schmerz" "Nicht bewusstlos" diff --git a/addons/medical/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.de_de.conf.meta old mode 100755 new mode 100644 similarity index 77% rename from addons/medical/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta rename to addons/medical_core/Language/ACE_Medical_Core_localization.de_de.conf.meta index 11f600e6f..61762b0dc --- a/addons/medical/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.de_de.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{E908001749419691}Configs/EntityCatalog/FIA/FIA_InventoryItems.conf" + Name "{3B0960063F27B53A}Language/ACE_Medical_Core_localization.de_de.conf" Configurations { CONFResourceClass PC { } @@ -9,9 +9,9 @@ MetaFileClass { } CONFResourceClass PS4 : PC { } - CONFResourceClass HEADLESS : PC { - } CONFResourceClass PS5 : PC { } + CONFResourceClass HEADLESS : PC { + } } } \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.it_it.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.en_us.conf old mode 100755 new mode 100644 similarity index 92% rename from addons/medical/Language/ACE_Medical_localization.it_it.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.en_us.conf index 10f235847..1de6197ec --- a/addons/medical/Language/ACE_Medical_localization.it_it.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.en_us.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Inject epinephrine" "Not in pain" "Not unconscious" diff --git a/addons/medical/Configs/EntityCatalog/US/US_InventoryItems.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.en_us.conf.meta old mode 100755 new mode 100644 similarity index 77% rename from addons/medical/Configs/EntityCatalog/US/US_InventoryItems.conf.meta rename to addons/medical_core/Language/ACE_Medical_Core_localization.en_us.conf.meta index 6f10d253a..9b8b7d4c6 --- a/addons/medical/Configs/EntityCatalog/US/US_InventoryItems.conf.meta +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.en_us.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{5F7EC52FC40A03E2}Configs/EntityCatalog/US/US_InventoryItems.conf" + Name "{65F9EA4D55D4B03B}Language/ACE_Medical_Core_localization.en_us.conf" Configurations { CONFResourceClass PC { } @@ -9,9 +9,9 @@ MetaFileClass { } CONFResourceClass PS4 : PC { } - CONFResourceClass HEADLESS : PC { - } CONFResourceClass PS5 : PC { } + CONFResourceClass HEADLESS : PC { + } } } \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.en_us.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.es_es.conf old mode 100755 new mode 100644 similarity index 92% rename from addons/medical/Language/ACE_Medical_localization.en_us.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.es_es.conf index 10f235847..1de6197ec --- a/addons/medical/Language/ACE_Medical_localization.en_us.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.es_es.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Inject epinephrine" "Not in pain" "Not unconscious" diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.es_es.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.es_es.conf.meta new file mode 100644 index 000000000..a88a0b449 --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.es_es.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A0B5A7C4BBD6DB24}Language/ACE_Medical_Core_localization.es_es.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.fr_fr.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.fr_fr.conf old mode 100755 new mode 100644 similarity index 93% rename from addons/medical/Language/ACE_Medical_localization.fr_fr.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.fr_fr.conf index 13b986f2f..e8c31ddb3 --- a/addons/medical/Language/ACE_Medical_localization.fr_fr.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.fr_fr.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Injecter de l'adrénaline" "Ne ressent pas de douleur" "Pas inconscient" diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.fr_fr.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.fr_fr.conf.meta new file mode 100644 index 000000000..7b5997f9a --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.fr_fr.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{1B1D52F35D553826}Language/ACE_Medical_Core_localization.fr_fr.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.ja_jp.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.it_it.conf old mode 100755 new mode 100644 similarity index 92% rename from addons/medical/Language/ACE_Medical_localization.ja_jp.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.it_it.conf index 10f235847..1de6197ec --- a/addons/medical/Language/ACE_Medical_localization.ja_jp.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.it_it.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Inject epinephrine" "Not in pain" "Not unconscious" diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.it_it.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.it_it.conf.meta new file mode 100644 index 000000000..72860a7a1 --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.it_it.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{9B01DDC7F077BBDF}Language/ACE_Medical_Core_localization.it_it.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.es_es.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.ja_jp.conf old mode 100755 new mode 100644 similarity index 92% rename from addons/medical/Language/ACE_Medical_localization.es_es.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.ja_jp.conf index 10f235847..1de6197ec --- a/addons/medical/Language/ACE_Medical_localization.es_es.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.ja_jp.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Inject epinephrine" "Not in pain" "Not unconscious" diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.ja_jp.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.ja_jp.conf.meta new file mode 100644 index 000000000..ff76483f4 --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.ja_jp.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{8B1A6055CE068B74}Language/ACE_Medical_Core_localization.ja_jp.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.ko_kr.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.ko_kr.conf new file mode 100644 index 000000000..1de6197ec --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.ko_kr.conf @@ -0,0 +1,32 @@ +StringTableRuntime { + Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" + "ACE_Medical-EpinephrineInjectionAction" + "ACE_Medical-FailReason_NoPain" + "ACE_Medical-FailReason_NotUnconscious" + "ACE_Medical-FailReason_TooInjured" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Morphine" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Morphine_Description" + "ACE_Medical-UserAction_BackPosition" + "ACE_Medical-UserAction_LeftRecoveryPosition" + "ACE_Medical-UserAction_RightRecoveryPosition" + } + Texts { + "Resilience" + "Inject epinephrine" + "Not in pain" + "Not unconscious" + "Too injured" + "Increases wake-up chance" + "Alleviates severe pain" + "Administered to unconscious patients." + "Epinephrine" + "Administered to patients in severe pain." + "Put on back" + "Put in left recovery position" + "Put in right recovery position" + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.ko_kr.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.ko_kr.conf.meta new file mode 100644 index 000000000..bea4a7224 --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.ko_kr.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{2BA448F95D2B884B}Language/ACE_Medical_Core_localization.ko_kr.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.pl_pl.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.pl_pl.conf new file mode 100644 index 000000000..1de6197ec --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.pl_pl.conf @@ -0,0 +1,32 @@ +StringTableRuntime { + Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" + "ACE_Medical-EpinephrineInjectionAction" + "ACE_Medical-FailReason_NoPain" + "ACE_Medical-FailReason_NotUnconscious" + "ACE_Medical-FailReason_TooInjured" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Morphine" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Morphine_Description" + "ACE_Medical-UserAction_BackPosition" + "ACE_Medical-UserAction_LeftRecoveryPosition" + "ACE_Medical-UserAction_RightRecoveryPosition" + } + Texts { + "Resilience" + "Inject epinephrine" + "Not in pain" + "Not unconscious" + "Too injured" + "Increases wake-up chance" + "Alleviates severe pain" + "Administered to unconscious patients." + "Epinephrine" + "Administered to patients in severe pain." + "Put on back" + "Put in left recovery position" + "Put in right recovery position" + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.pl_pl.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.pl_pl.conf.meta new file mode 100644 index 000000000..526cd2acf --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.pl_pl.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{77D5EE03E3C41437}Language/ACE_Medical_Core_localization.pl_pl.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.pt_br.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.pt_br.conf new file mode 100644 index 000000000..1de6197ec --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.pt_br.conf @@ -0,0 +1,32 @@ +StringTableRuntime { + Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" + "ACE_Medical-EpinephrineInjectionAction" + "ACE_Medical-FailReason_NoPain" + "ACE_Medical-FailReason_NotUnconscious" + "ACE_Medical-FailReason_TooInjured" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Morphine" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Morphine_Description" + "ACE_Medical-UserAction_BackPosition" + "ACE_Medical-UserAction_LeftRecoveryPosition" + "ACE_Medical-UserAction_RightRecoveryPosition" + } + Texts { + "Resilience" + "Inject epinephrine" + "Not in pain" + "Not unconscious" + "Too injured" + "Increases wake-up chance" + "Alleviates severe pain" + "Administered to unconscious patients." + "Epinephrine" + "Administered to patients in severe pain." + "Put on back" + "Put in left recovery position" + "Put in right recovery position" + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.pt_br.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.pt_br.conf.meta new file mode 100644 index 000000000..ecc2bd9aa --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.pt_br.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A2A274CFD83ADE8D}Language/ACE_Medical_Core_localization.pt_br.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.ru_ru.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf old mode 100755 new mode 100644 similarity index 93% rename from addons/medical/Language/ACE_Medical_localization.ru_ru.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf index 110e934ca..b1dfea7fc --- a/addons/medical/Language/ACE_Medical_localization.ru_ru.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Вколоть адреналин" "Не чувствует боли" "В сознании" diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf.meta new file mode 100644 index 000000000..2ccd4f633 --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{F7E360674543BBFB}Language/ACE_Medical_Core_localization.ru_ru.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/Language/ACE_Medical_localization.st b/addons/medical_core/Language/ACE_Medical_Core_localization.st old mode 100755 new mode 100644 similarity index 95% rename from addons/medical/Language/ACE_Medical_localization.st rename to addons/medical_core/Language/ACE_Medical_Core_localization.st index 548577ed8..7b102a581 --- a/addons/medical/Language/ACE_Medical_localization.st +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.st @@ -1,6 +1,14 @@ StringTable { ItemClassName "CustomStringTableItem" Items { + CustomStringTableItem "{660F338D19E8B527}" { + Id "ACE_Medical-Editor_TooltipDetail_Resilience_Name" + Target_en_us "Resilience" + Target_de_de "Resilienz" + Modified 1712273696 + Author "Kexanone" + LastChanged "Kexanone" + } CustomStringTableItem "{60CF45A3ED3C6951}" { Id "ACE_Medical-EpinephrineInjectionAction" Target_en_us "Inject epinephrine" diff --git a/addons/medical/Language/ACE_Medical_localization.st.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.st.meta old mode 100755 new mode 100644 similarity index 81% rename from addons/medical/Language/ACE_Medical_localization.st.meta rename to addons/medical_core/Language/ACE_Medical_Core_localization.st.meta index 4f9bf8dda..2b97672d4 --- a/addons/medical/Language/ACE_Medical_localization.st.meta +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.st.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{7667329AA15A6069}Language/ACE_Medical_localization.st" + Name "{D393C26C894B1404}Language/ACE_Medical_Core_localization.st" Configurations { StringTableResourceClass PC { } diff --git a/addons/medical/Language/ACE_Medical_localization.uk_ua.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.uk_ua.conf old mode 100755 new mode 100644 similarity index 93% rename from addons/medical/Language/ACE_Medical_localization.uk_ua.conf rename to addons/medical_core/Language/ACE_Medical_Core_localization.uk_ua.conf index f30bded98..bd2d4fee0 --- a/addons/medical/Language/ACE_Medical_localization.uk_ua.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.uk_ua.conf @@ -1,5 +1,6 @@ StringTableRuntime { Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" "ACE_Medical-EpinephrineInjectionAction" "ACE_Medical-FailReason_NoPain" "ACE_Medical-FailReason_NotUnconscious" @@ -14,6 +15,7 @@ StringTableRuntime { "ACE_Medical-UserAction_RightRecoveryPosition" } Texts { + "Resilience" "Вколоти адреналін" "Не відчуває болю" "У свідомості" diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.uk_ua.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.uk_ua.conf.meta new file mode 100644 index 000000000..5fb7235c0 --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.uk_ua.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{7DBB3591296D05AE}Language/ACE_Medical_Core_localization.uk_ua.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.zh_cn.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.zh_cn.conf new file mode 100644 index 000000000..1de6197ec --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.zh_cn.conf @@ -0,0 +1,32 @@ +StringTableRuntime { + Ids { + "ACE_Medical-Editor_TooltipDetail_Resilience_Name" + "ACE_Medical-EpinephrineInjectionAction" + "ACE_Medical-FailReason_NoPain" + "ACE_Medical-FailReason_NotUnconscious" + "ACE_Medical-FailReason_TooInjured" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Morphine" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Morphine_Description" + "ACE_Medical-UserAction_BackPosition" + "ACE_Medical-UserAction_LeftRecoveryPosition" + "ACE_Medical-UserAction_RightRecoveryPosition" + } + Texts { + "Resilience" + "Inject epinephrine" + "Not in pain" + "Not unconscious" + "Too injured" + "Increases wake-up chance" + "Alleviates severe pain" + "Administered to unconscious patients." + "Epinephrine" + "Administered to patients in severe pain." + "Put on back" + "Put in left recovery position" + "Put in right recovery position" + } +} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.zh_cn.conf.meta b/addons/medical_core/Language/ACE_Medical_Core_localization.zh_cn.conf.meta new file mode 100644 index 000000000..fd7c00d27 --- /dev/null +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.zh_cn.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A70B5BAC10CDD5B3}Language/ACE_Medical_Core_localization.zh_cn.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Core/Character_Base.et b/addons/medical_core/Prefabs/Characters/Core/Character_Base.et old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Core/Character_Base.et rename to addons/medical_core/Prefabs/Characters/Core/Character_Base.et diff --git a/addons/medical/Prefabs/Characters/Core/Character_Base.et.meta b/addons/medical_core/Prefabs/Characters/Core/Character_Base.et.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Core/Character_Base.et.meta rename to addons/medical_core/Prefabs/Characters/Core/Character_Base.et.meta diff --git a/addons/medical_core/Prefabs/Characters/Core/Configs/HitZones/CharacterHitZone.conf b/addons/medical_core/Prefabs/Characters/Core/Configs/HitZones/CharacterHitZone.conf new file mode 100644 index 000000000..90b37cea6 --- /dev/null +++ b/addons/medical_core/Prefabs/Characters/Core/Configs/HitZones/CharacterHitZone.conf @@ -0,0 +1,9 @@ +SCR_CharacterHitZone { + ParentHZs { + ParentHitZone "{65E22BBB85F9E812}" { + Parent "ACE_Medical_Pain" + HealingMultiplier 0 + Overkill 1 + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Prefabs/Characters/Core/Configs/HitZones/CharacterHitZone.conf.meta b/addons/medical_core/Prefabs/Characters/Core/Configs/HitZones/CharacterHitZone.conf.meta new file mode 100644 index 000000000..2ca4d4b4a --- /dev/null +++ b/addons/medical_core/Prefabs/Characters/Core/Configs/HitZones/CharacterHitZone.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{1172EE61292B1475}Prefabs/Characters/Core/Configs/HitZones/CharacterHitZone.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Prefabs/Characters/Core/DamageManager_Character_Base.ct b/addons/medical_core/Prefabs/Characters/Core/DamageManager_Character_Base.ct new file mode 100644 index 000000000..513337a0b --- /dev/null +++ b/addons/medical_core/Prefabs/Characters/Core/DamageManager_Character_Base.ct @@ -0,0 +1,29 @@ +SCR_CharacterDamageManagerComponent { + "Additional hit zones" { + SCR_CharacterHealthHitZone Health { + HZDefault 0 + } + SCR_CharacterHeadHitZone Head { + m_fACE_Medical_SecondChance 0 + } + ACE_Medical_CharacterChestHitZone Chest { + } + ACE_Medical_CharacterAbdomenHitZone Abdomen { + } + ACE_Medical_PainHitZone ACE_Medical_Pain { + IgnoreExplosions 1 + BaseDamageMultiplier 0.5 + MaxHealth 100 + "DamageState threshold" { + 0.8 + 0.333 + } + m_fFullRegenerationTime 900 + } + SCR_HitZone ACE_Medical_Default { + HZDefault 1 + IgnoreExplosions 1 + MaxHealth 100 + } + } +} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Core/DamageManager_Character_Base.ct.meta b/addons/medical_core/Prefabs/Characters/Core/DamageManager_Character_Base.ct.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Core/DamageManager_Character_Base.ct.meta rename to addons/medical_core/Prefabs/Characters/Core/DamageManager_Character_Base.ct.meta diff --git a/addons/medical_core/Prefabs/Characters/Core/DefaultPlayerController.et b/addons/medical_core/Prefabs/Characters/Core/DefaultPlayerController.et new file mode 100644 index 000000000..2b9455afc --- /dev/null +++ b/addons/medical_core/Prefabs/Characters/Core/DefaultPlayerController.et @@ -0,0 +1,40 @@ +SCR_PlayerController { + ID "1A9BA6BEFA06E3B1" + components { + SCR_HUDManagerComponent "{2FDC275D9EBCDB8B}" { + InfoDisplays { + SCR_ScreenEffectsManager "{5AF2CE6B10209B7D}" { + InfoDisplays { + ACE_Medical_PainScreenEffect "{6588D54E6078F4C9}" { + m_eLayer BACKGROUND + m_eShow 47 + m_aModes { + ACE_Medical_ImageWidgetPainScreenEffectMode "{658EA873CFB67107}" { + m_eEffectType WHITE_FLASH + m_sImageWidgetName "ACE_Medical_WhiteFlash" + } + ACE_Medical_ImageWidgetPainScreenEffectMode "{658F01688F515CDC}" { + m_eEffectType GREY_FLASH + m_sImageWidgetName "ACE_Medical_WhiteFlash" + m_cColor 0.015 0.015 0.015 1 + } + ACE_Medical_PostProcessPainScreenEffectMode "{658A0E42D7AA79C0}" { + m_eEffectType GREY_FLASH + m_fStrengthScale 0.02 + m_ePPType ChromAber + m_sMaterialName "{0982CBB142B4BF80}UI/Materials/Editor/ACE_Medical_ChromAber.emat" + } + ACE_Medical_PostProcessPainScreenEffectMode "{658A0E42D700DAF6}" { + m_eEffectType CHROMATIC_ABERRATION + m_fStrengthScale 0.1 + m_ePPType RadialBlur + m_sMaterialName "{717A9BCDB6CCB0B9}UI/Materials/Editor/ACE_Medical_RadialBlur.emat" + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Core/DefaultPlayerController.et.meta b/addons/medical_core/Prefabs/Characters/Core/DefaultPlayerController.et.meta old mode 100755 new mode 100644 similarity index 88% rename from addons/medical/Prefabs/Characters/Core/DefaultPlayerController.et.meta rename to addons/medical_core/Prefabs/Characters/Core/DefaultPlayerController.et.meta index 8f52e4e7e..4cc4d98de --- a/addons/medical/Prefabs/Characters/Core/DefaultPlayerController.et.meta +++ b/addons/medical_core/Prefabs/Characters/Core/DefaultPlayerController.et.meta @@ -9,6 +9,8 @@ MetaFileClass { } EntityTemplateResourceClass PS4 : PC { } + EntityTemplateResourceClass PS5 : PC { + } EntityTemplateResourceClass HEADLESS : PC { } } diff --git a/addons/medical/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et b/addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et rename to addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et diff --git a/addons/medical/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et.meta b/addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et.meta rename to addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Medic.et.meta diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_Medic.et b/addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_Medic.et similarity index 80% rename from addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_Medic.et rename to addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_Medic.et index 4db931e46..7528e4360 100644 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_Medic.et +++ b/addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_Medic.et @@ -1,9 +1,9 @@ -SCR_ChimeraCharacter : "{578A9679C9CBA787}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_TacticaBase.et" { +SCR_ChimeraCharacter : "{894628A45793E7A0}Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_BaseLoadout.et" { ID "520EC961A090B1EE" components { SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { InitialInventoryItems { - ItemsInitConfigurationItem "{60D523CD3730B86B}" { + ItemsInitConfigurationItem "{60DAD6A4B334A247}" { PrefabsToSpawn + { "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" } diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_Medic.et.meta b/addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_Medic.et.meta similarity index 74% rename from addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_Medic.et.meta rename to addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_Medic.et.meta index 3ec99f51f..4656c2368 100644 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_Medic.et.meta +++ b/addons/medical_core/Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_Medic.et.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{F570BCD98B0BCED0}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_Medic.et" + Name "{9A234C5857D92187}Prefabs/Characters/Factions/BLUFOR/US_Army/GreenBerets/Character_US_SF_Medic.et" Configurations { EntityTemplateResourceClass PC { } diff --git a/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_AC_Medic.et b/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_AC_Medic.et new file mode 100644 index 000000000..88cc60621 --- /dev/null +++ b/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_AC_Medic.et @@ -0,0 +1,14 @@ +SCR_ChimeraCharacter : "{DE3786C0C6C978D4}Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_BaseLoadout.et" { + ID "520EC961A090B1EE" + components { + SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { + InitialInventoryItems { + ItemsInitConfigurationItem "{5DF8B4EAF98C1278}" { + PrefabsToSpawn + { + "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_Medic.et.meta b/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_AC_Medic.et.meta similarity index 74% rename from addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_Medic.et.meta rename to addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_AC_Medic.et.meta index 18b6afe86..7bc0f9152 100644 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_Medic.et.meta +++ b/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_AC_Medic.et.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{A6C8A0545DBD8260}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/VV/RG/Atacs/Character_RHS_RF_SOF_Medic.et" + Name "{4E29194BA809DF32}Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_AC_Medic.et" Configurations { EntityTemplateResourceClass PC { } diff --git a/addons/medical/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et b/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et old mode 100755 new mode 100644 similarity index 76% rename from addons/medical/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et rename to addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et index c519b7556..79c5b2255 --- a/addons/medical/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et +++ b/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et @@ -5,7 +5,7 @@ SCR_ChimeraCharacter : "{DE3786C0C6C978D4}Prefabs/Characters/Factions/INDFOR/FIA InitialInventoryItems { ItemsInitConfigurationItem "{5570901746070FD4}" { PrefabsToSpawn + { - "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" + "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" } } } diff --git a/addons/medical/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et.meta b/addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et.meta rename to addons/medical_core/Prefabs/Characters/Factions/INDFOR/FIA/Character_FIA_Medic.et.meta diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et b/addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et rename to addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et.meta b/addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et.meta rename to addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_Medic.et.meta diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_Medic.et b/addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_Medic.et similarity index 80% rename from addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_Medic.et rename to addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_Medic.et index 0dfd66fbe..6e4718a20 100644 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_Medic.et +++ b/addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_Medic.et @@ -1,9 +1,9 @@ -SCR_ChimeraCharacter : "{CF305EE842BBA3E4}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/VSR/Character_RHS_RF_MSV_VSR_BaseLoadout.et" { +SCR_ChimeraCharacter : "{B6F05D4557B61C4E}Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_BaseLoadout.et" { ID "520EC961A090B1EE" components { SCR_InventoryStorageManagerComponent "{520EA1D2DB118DE5}" { InitialInventoryItems { - ItemsInitConfigurationItem "{607C14DECF91E312}" { + ItemsInitConfigurationItem "{60DADDE870A5053F}" { PrefabsToSpawn + { "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" } diff --git a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_Medic.et.meta b/addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_Medic.et.meta similarity index 73% rename from addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_Medic.et.meta rename to addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_Medic.et.meta index 0b0a19466..c1bd134af 100644 --- a/addons/medical/Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_Medic.et.meta +++ b/addons/medical_core/Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_Medic.et.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{D9AF475A4E5DC52C}Prefabs/Characters/Factions/OPFOR/RHS_AFRF/MSV/Flora/Character_RHS_RF_MSV_Flora_Medic.et" + Name "{8CA70597606992EC}Prefabs/Characters/Factions/OPFOR/USSR_Army/Spetsnaz/Character_USSR_SF_Medic.et" Configurations { EntityTemplateResourceClass PC { } diff --git a/addons/medical/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et b/addons/medical_core/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et old mode 100755 new mode 100644 similarity index 83% rename from addons/medical/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et rename to addons/medical_core/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et index 46354c363..5a98a3ac4 --- a/addons/medical/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et +++ b/addons/medical_core/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et @@ -12,14 +12,6 @@ GenericEntity : "{3238FC0BDB67AA78}Prefabs/Items/Medicine/MorphineInjection_01/M } } } - CustomAttributes { - PreviewRenderAttributes "{5A5AEE4B8FF125F0}" { - CameraDistanceToItem 0.5 - } - SCR_SelectionMenuPreviewAttributes "{5EC2E10565C06A53}" { - m_fIconSizeXMultiplier 0.5 - } - } } } MeshObject "{59CE87DB17B6B1C5}" { @@ -41,5 +33,4 @@ GenericEntity : "{3238FC0BDB67AA78}Prefabs/Items/Medicine/MorphineInjection_01/M } } } - coords 0 0 -0.055 } \ No newline at end of file diff --git a/addons/medical/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et.meta b/addons/medical_core/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et.meta rename to addons/medical_core/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et.meta diff --git a/addons/medical/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et b/addons/medical_core/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et rename to addons/medical_core/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et diff --git a/addons/medical/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et.meta b/addons/medical_core/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et.meta old mode 100755 new mode 100644 similarity index 100% rename from addons/medical/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et.meta rename to addons/medical_core/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et.meta diff --git a/addons/medical_core/UI/Materials/Editor/ACE_Medical_ChromAber.emat b/addons/medical_core/UI/Materials/Editor/ACE_Medical_ChromAber.emat new file mode 100644 index 000000000..fec78c0e2 --- /dev/null +++ b/addons/medical_core/UI/Materials/Editor/ACE_Medical_ChromAber.emat @@ -0,0 +1,5 @@ +ChromAberEffect { + Enabled 0 + PowerX 0 + PowerY 0 +} \ No newline at end of file diff --git a/addons/medical_core/UI/Materials/Editor/ACE_Medical_ChromAber.emat.meta b/addons/medical_core/UI/Materials/Editor/ACE_Medical_ChromAber.emat.meta new file mode 100644 index 000000000..5554a7eeb --- /dev/null +++ b/addons/medical_core/UI/Materials/Editor/ACE_Medical_ChromAber.emat.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0982CBB142B4BF80}UI/Materials/Editor/ACE_Medical_ChromAber.emat" + Configurations { + EMATResourceClass PC { + } + EMATResourceClass XBOX_ONE : PC { + } + EMATResourceClass XBOX_SERIES : PC { + } + EMATResourceClass PS4 : PC { + } + EMATResourceClass PS5 : PC { + } + EMATResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/UI/Materials/Editor/ACE_Medical_RadialBlur.emat b/addons/medical_core/UI/Materials/Editor/ACE_Medical_RadialBlur.emat new file mode 100644 index 000000000..b07c9c644 --- /dev/null +++ b/addons/medical_core/UI/Materials/Editor/ACE_Medical_RadialBlur.emat @@ -0,0 +1,7 @@ +RadialBlurEffect { + Enabled 0 + PowerX 0 + PowerY 0 + SizeX 0.01 + SizeY 0.01 +} \ No newline at end of file diff --git a/addons/medical_core/UI/Materials/Editor/ACE_Medical_RadialBlur.emat.meta b/addons/medical_core/UI/Materials/Editor/ACE_Medical_RadialBlur.emat.meta new file mode 100644 index 000000000..e8ae364e1 --- /dev/null +++ b/addons/medical_core/UI/Materials/Editor/ACE_Medical_RadialBlur.emat.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{717A9BCDB6CCB0B9}UI/Materials/Editor/ACE_Medical_RadialBlur.emat" + Configurations { + EMATResourceClass PC { + } + EMATResourceClass XBOX_ONE : PC { + } + EMATResourceClass XBOX_SERIES : PC { + } + EMATResourceClass PS4 : PC { + } + EMATResourceClass PS5 : PC { + } + EMATResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout b/addons/medical_core/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout old mode 100755 new mode 100644 similarity index 92% rename from addons/medical/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout rename to addons/medical_core/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout index 7c183b15f..cf96b7ce4 --- a/addons/medical/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout +++ b/addons/medical_core/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout @@ -5,14 +5,14 @@ FrameWidgetClass { Slot FrameWidgetSlot "{5E101C4F4DF0512B}" { Anchor 0 0 1 1 PositionX 0 - OffsetLeft 0 PositionY 0 - OffsetTop 0 SizeX -1820 OffsetRight 0 SizeY -1050 OffsetBottom 0 } + "Is Enabled" 0 + "Is Visible" 0 Opacity 0 Size 1920 1080 Mask "{CA1F7652B536AA21}UI/Textures/ScreenEffects/Suppression/supressionVignette4.edds" diff --git a/addons/medical/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout.meta b/addons/medical_core/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout.meta old mode 100755 new mode 100644 similarity index 89% rename from addons/medical/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout.meta rename to addons/medical_core/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout.meta index 77d9daf03..c29ec81d3 --- a/addons/medical/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout.meta +++ b/addons/medical_core/UI/layouts/HUD/ScreenEffects/ScreenEffects.layout.meta @@ -11,5 +11,7 @@ MetaFileClass { } LayoutResourceClass HEADLESS : PC { } + LayoutResourceClass PS5 : PC { + } } } \ No newline at end of file diff --git a/addons/medical_core/addon.gproj b/addons/medical_core/addon.gproj new file mode 100644 index 000000000..b8822627b --- /dev/null +++ b/addons/medical_core/addon.gproj @@ -0,0 +1,83 @@ +GameProject { + ID "ACE_Medical_Core" + GUID "60C4C12DAE90727B" + TITLE "ACE Medical Core" + Dependencies { + "58D0FB3206B6F859" "60C4CE4888FF4621" + } + Configurations { + GameProjectConfig PC { + WidgetManagerSettings WidgetManagerSettings "{AC4BE58770485E02}" { + StringTables { + StringTableDefinition "{65876578934DDB12}" { + StringTableSource "{D393C26C894B1404}Language/ACE_Medical_Core_localization.st" + Languages { + LanguageDefinition "{658765789114E9AD}" { + Code "cs_cz" + StringTableRuntime "{EE777A352C84A41A}Language/ACE_Medical_Core_localization.cs_cz.conf" + } + LanguageDefinition "{658765789114E9D9}" { + Code "de_de" + StringTableRuntime "{3B0960063F27B53A}Language/ACE_Medical_Core_localization.de_de.conf" + } + LanguageDefinition "{658765789114E9CF}" { + Code "en_us" + StringTableRuntime "{65F9EA4D55D4B03B}Language/ACE_Medical_Core_localization.en_us.conf" + } + LanguageDefinition "{658765789114E93F}" { + Code "es_es" + StringTableRuntime "{A0B5A7C4BBD6DB24}Language/ACE_Medical_Core_localization.es_es.conf" + } + LanguageDefinition "{658765789114E92A}" { + Code "fr_fr" + StringTableRuntime "{1B1D52F35D553826}Language/ACE_Medical_Core_localization.fr_fr.conf" + } + LanguageDefinition "{658765789114E91F}" { + Code "it_it" + StringTableRuntime "{9B01DDC7F077BBDF}Language/ACE_Medical_Core_localization.it_it.conf" + } + LanguageDefinition "{658765789114E90A}" { + Code "ja_jp" + StringTableRuntime "{8B1A6055CE068B74}Language/ACE_Medical_Core_localization.ja_jp.conf" + } + LanguageDefinition "{658765789114E977}" { + Code "ko_kr" + StringTableRuntime "{2BA448F95D2B884B}Language/ACE_Medical_Core_localization.ko_kr.conf" + } + LanguageDefinition "{658765789114E97C}" { + Code "pl_pl" + StringTableRuntime "{77D5EE03E3C41437}Language/ACE_Medical_Core_localization.pl_pl.conf" + } + LanguageDefinition "{658765789114E969}" { + Code "pt_br" + StringTableRuntime "{A2A274CFD83ADE8D}Language/ACE_Medical_Core_localization.pt_br.conf" + } + LanguageDefinition "{658765789114E825}" { + Code "ru_ru" + StringTableRuntime "{F7E360674543BBFB}Language/ACE_Medical_Core_localization.ru_ru.conf" + } + LanguageDefinition "{658765789114E819}" { + Code "uk_ua" + StringTableRuntime "{7DBB3591296D05AE}Language/ACE_Medical_Core_localization.uk_ua.conf" + } + LanguageDefinition "{658765789114E805}" { + Code "zh_cn" + StringTableRuntime "{A70B5BAC10CDD5B3}Language/ACE_Medical_Core_localization.zh_cn.conf" + } + } + } + } + } + } + GameProjectConfig XBOX_ONE { + } + GameProjectConfig XBOX_SERIES { + } + GameProjectConfig PS4 { + } + GameProjectConfig PS5 { + } + GameProjectConfig HEADLESS { + } + } +} \ No newline at end of file diff --git a/addons/medical/anims/workspaces/player/Unconscious.agf b/addons/medical_core/anims/workspaces/player/Unconscious.agf similarity index 100% rename from addons/medical/anims/workspaces/player/Unconscious.agf rename to addons/medical_core/anims/workspaces/player/Unconscious.agf diff --git a/addons/medical/anims/workspaces/player/Unconscious.agf.meta b/addons/medical_core/anims/workspaces/player/Unconscious.agf.meta similarity index 100% rename from addons/medical/anims/workspaces/player/Unconscious.agf.meta rename to addons/medical_core/anims/workspaces/player/Unconscious.agf.meta diff --git a/addons/medical/license.txt b/addons/medical_core/license.txt similarity index 100% rename from addons/medical/license.txt rename to addons/medical_core/license.txt diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/ACE_BaseComponent.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/ACE_BaseComponent.c new file mode 100644 index 000000000..b8a87754d --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/ACE_BaseComponent.c @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------------------------ +class ACE_BaseComponentClass : ScriptComponentClass +{ +} + +//------------------------------------------------------------------------------------------------ +class ACE_BaseComponent : ScriptComponent +{ + //------------------------------------------------------------------------------------------------ + //! Returns the type of the system that updates this component + //! Derived classes should always override this! + typename GetAssociatedSystemType() + { + return ACE_BaseSystem; + } + + //------------------------------------------------------------------------------------------------ + //! Should register at the associated system during EOnInit + protected bool ShouldRegisterAtSystemOnInit() + { + return true; + } + + //------------------------------------------------------------------------------------------------ + override protected void OnPostInit(IEntity owner) + { + super.OnPostInit(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + SetEventMask(owner, EntityEvent.INIT); + } + + //------------------------------------------------------------------------------------------------ + //! Register to system on init + override protected void EOnInit(IEntity owner) + { + super.EOnInit(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + ACE_BaseSystem system = ACE_BaseSystem.GetInstance(GetAssociatedSystemType()); + if (system && ShouldRegisterAtSystemOnInit()) + system.Register(owner); + + SCR_DamageManagerComponent damageManager = SCR_DamageManagerComponent.Cast(owner.FindComponent(SCR_DamageManagerComponent)); + if (damageManager) + damageManager.GetOnDamageStateChanged().Insert(OnDamageStateChanged); + } + + //------------------------------------------------------------------------------------------------ + //! Unregister from system when entity is destroyed + protected void OnDamageStateChanged(EDamageState state) + { + if (state != EDamageState.DESTROYED) + return; + + ACE_BaseSystem system = ACE_BaseSystem.GetInstance(GetAssociatedSystemType()); + if (system) + system.Unregister(GetOwner()); + } + + //------------------------------------------------------------------------------------------------ + //! Unregister from system when deleted + override protected void OnDelete(IEntity owner) + { + super.OnDelete(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + ACE_BaseSystem system = ACE_BaseSystem.GetInstance(GetAssociatedSystemType()); + if (system) + system.Unregister(owner); + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Damage/SCR_CharacterDamageManagerComponent.c new file mode 100644 index 000000000..089bdefad --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Damage/SCR_CharacterDamageManagerComponent.c @@ -0,0 +1,129 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent +{ + protected static ACE_Medical_Core_Settings s_pACE_Medical_Core_Settings; + protected SCR_CharacterHitZone m_pACE_Medical_LastStruckPhysicalHitZone; + protected SCR_CharacterHealthHitZone m_pACE_Medical_HealthHitZone; + protected float m_fACE_Medical_ResilienceRegenScale = 1; + + [RplProp()] + protected float m_fACE_Medical_MinHealthScaledForEpinephrine = 0.33; + + //----------------------------------------------------------------------------------------------------------- + //! Initialize members + override void OnPostInit(IEntity owner) + { + super.OnPostInit(owner); + + if (!GetGame().InPlayMode()) + return; + + m_pACE_Medical_HealthHitZone = SCR_CharacterHealthHitZone.Cast(GetHitZoneByName("Health")); + + if (!s_pACE_Medical_Core_Settings) + s_pACE_Medical_Core_Settings = ACE_SettingsHelperT.GetModSettings(); + + if (s_pACE_Medical_Core_Settings) + { + m_fACE_Medical_ResilienceRegenScale = s_pACE_Medical_Core_Settings.m_fDefaultResilienceRegenScale; + m_fACE_Medical_MinHealthScaledForEpinephrine = s_pACE_Medical_Core_Settings.m_fMinHealthScaledForEpinephrine; + Replication.BumpMe(); + } + } + + //----------------------------------------------------------------------------------------------------------- + //! Update last struck physical hit zone + override void OnDamage(notnull BaseDamageContext damageContext) + { + super.OnDamage(damageContext); + + if (!Replication.IsServer()) + return; + + SCR_CharacterHitZone struckPhysicalHitZone = SCR_CharacterHitZone.Cast(damageContext.struckHitZone); + if (struckPhysicalHitZone) + m_pACE_Medical_LastStruckPhysicalHitZone = struckPhysicalHitZone; + } + + //----------------------------------------------------------------------------------------------------------- + protected override void OnDamageStateChanged(EDamageState state) + { + super.OnDamageStateChanged(state); + + if (Replication.IsServer() && (state == EDamageState.DESTROYED)) + ACE_Medical_OnKilled(); + } + + //----------------------------------------------------------------------------------------------------------- + protected void ACE_Medical_OnKilled(); + + //----------------------------------------------------------------------------------------------------------- + //! Returns last stuck physical hit zone + SCR_CharacterHitZone ACE_Medical_GetLastStruckPhysicalHitZone() + { + return m_pACE_Medical_LastStruckPhysicalHitZone; + } + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_UpdateResilienceRegenScale() + { + if (m_pBloodHitZone.GetDamageState() == ECharacterBloodState.UNCONSCIOUS) + m_fACE_Medical_ResilienceRegenScale = 0; + else + m_fACE_Medical_ResilienceRegenScale = s_pACE_Medical_Core_Settings.m_fDefaultResilienceRegenScale; + } + + //------------------------------------------------------------------------------------------------ + float ACE_Medical_GetResilienceRegenScale() + { + return m_fACE_Medical_ResilienceRegenScale; + } + + //------------------------------------------------------------------------------------------------ + //! Check if epinephrine can be applied to this character + bool ACE_Medical_CanApplyEpinephrine(out SCR_EConsumableFailReason failReason) + { + SCR_ChimeraCharacter ownerChar = SCR_ChimeraCharacter.Cast(GetOwner()); + if (!ownerChar) + return false; + + SCR_CharacterControllerComponent charController = SCR_CharacterControllerComponent.Cast(ownerChar.GetCharacterController()); + if (charController.GetLifeState() != ECharacterLifeState.INCAPACITATED) + { + failReason = SCR_EConsumableFailReason.ACE_MEDICAL_NOT_INCAPACITATED; + return false; + } + + // Check if epinephrine is in the system already + array effects = GetAllPersistentEffectsOfType(ACE_Medical_EpinephrineDamageEffect); + if (!effects.IsEmpty()) + { + failReason = SCR_EConsumableFailReason.ALREADY_APPLIED; + return false; + } + + // Cannot be applied while bleeding + if (IsBleeding()) + { + failReason = SCR_EConsumableFailReason.IS_BLEEDING; + return false; + } + + // Check if too injured + if (m_pACE_Medical_HealthHitZone.GetHealthScaled() < m_fACE_Medical_MinHealthScaledForEpinephrine) + { + failReason = SCR_EConsumableFailReason.ACE_MEDICAL_TOO_DAMAGED; + return false; + } + + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Returns overall scaled health of the character + //! Should be used instead of GetHealthScaled + float ACE_Medical_GetHealthScaled() + { + return m_pACE_Medical_HealthHitZone.GetHealthScaled(); + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/ACE_Medical_ConsumableEpinephrine.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/ACE_Medical_ConsumableEpinephrine.c new file mode 100644 index 000000000..54b4ed76a --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/ACE_Medical_ConsumableEpinephrine.c @@ -0,0 +1,34 @@ +//------------------------------------------------------------------------------------------------ +//! Epinephrine effect: Heals resilience hit zone +[BaseContainerProps()] +class ACE_Medical_ConsumableEpinephrine : SCR_ConsumableEffectHealthItems +{ + //------------------------------------------------------------------------------------------------ + //! Can be applied when patient is unconscious and no epinephrine is in the system + override bool CanApplyEffect(notnull IEntity target, notnull IEntity user, out SCR_EConsumableFailReason failReason) + { + SCR_ChimeraCharacter targetChar = SCR_ChimeraCharacter.Cast(target); + if (!targetChar) + return false; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(targetChar.GetDamageManager()); + if (!damageManager) + return false; + + return damageManager.ACE_Medical_CanApplyEpinephrine(failReason); + } + + //------------------------------------------------------------------------------------------------ + //! Can be applied to hit zones under same conditions as CanApplyEffect + override bool CanApplyEffectToHZ(notnull IEntity target, notnull IEntity user, ECharacterHitZoneGroup group, out SCR_EConsumableFailReason failReason = SCR_EConsumableFailReason.NONE) + { + return CanApplyEffect(target, user, failReason); + } + + //------------------------------------------------------------------------------------------------ + //! Set consumable type in ctor + void ACE_Medical_ConsumableEpinephrine() + { + m_eConsumableType = SCR_EConsumableType.ACE_MEDICAL_EPINEPHRINE; + } +} diff --git a/addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/SCR_ConsumableEffectBase.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/SCR_EConsumableFailReason.c old mode 100755 new mode 100644 similarity index 55% rename from addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/SCR_ConsumableEffectBase.c rename to addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/SCR_EConsumableFailReason.c index fc1593e8f..4959d8f01 --- a/addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/SCR_ConsumableEffectBase.c +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/SCR_EConsumableFailReason.c @@ -1,10 +1,3 @@ -//------------------------------------------------------------------------------------------------ -//! Type of consumable gadget -modded enum SCR_EConsumableType -{ - ACE_MEDICAL_EPINEPHRINE -}; - //------------------------------------------------------------------------------------------------ //! Reason why consumable cannot be applied modded enum SCR_EConsumableFailReason diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/SCR_EConsumableType.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/SCR_EConsumableType.c new file mode 100644 index 000000000..024f8ea98 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Components/Gadgets/SCR_EConsumableType.c @@ -0,0 +1,6 @@ +//------------------------------------------------------------------------------------------------ +//! Type of consumable gadget +modded enum SCR_EConsumableType +{ + ACE_MEDICAL_EPINEPHRINE +} diff --git a/addons/medical/scripts/Game/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_EpinephrineDamageEffect.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_EpinephrineDamageEffect.c similarity index 100% rename from addons/medical/scripts/Game/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_EpinephrineDamageEffect.c rename to addons/medical_core/scripts/Game/@ACE_Medical_Core/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_EpinephrineDamageEffect.c diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Diag/ArmaReforgerScripted.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Diag/ArmaReforgerScripted.c new file mode 100644 index 000000000..d5083f0b5 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Diag/ArmaReforgerScripted.c @@ -0,0 +1,12 @@ +#ifdef ENABLE_DIAG +//------------------------------------------------------------------------------------------------ +modded class ArmaReforgerScripted : ChimeraGame +{ + //------------------------------------------------------------------------------------------------ + override bool OnGameStart() + { + DiagMenu.RegisterMenu(SCR_DebugMenuID.ACE_MEDICAL_DEBUGUI_MENU, "ACE Medical", "ACE"); + return super.OnGameStart(); + } +} +#endif diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Diag/SCR_DebugMenuID.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Diag/SCR_DebugMenuID.c new file mode 100644 index 000000000..b2ca02a90 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Diag/SCR_DebugMenuID.c @@ -0,0 +1,7 @@ +#ifdef ENABLE_DIAG +//------------------------------------------------------------------------------------------------ +modded enum SCR_DebugMenuID +{ + ACE_MEDICAL_DEBUGUI_MENU +} +#endif diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_HealthTooltipDetail.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_HealthTooltipDetail.c new file mode 100644 index 000000000..cb54ae6f5 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_HealthTooltipDetail.c @@ -0,0 +1,13 @@ +[BaseContainerProps(), BaseContainerCustomTitleField("m_sDisplayName")] +class ACE_Medical_HealthTooltipDetail : SCR_HealthTooltipDetail +{ + //------------------------------------------------------------------------------------------------ + override void UpdateDetail(SCR_EditableEntityComponent entity) + { + super.UpdateDetail(entity); + + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(m_DamageManager); + if (charDamageManager) + SetBarAndPercentageValue(charDamageManager.ACE_Medical_GetHealthScaled()); + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_ResilienceTooltipDetail.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_ResilienceTooltipDetail.c new file mode 100644 index 000000000..49f5252bc --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_ResilienceTooltipDetail.c @@ -0,0 +1,28 @@ +[BaseContainerProps(), BaseContainerCustomTitleField("m_sDisplayName")] +class ACE_Medical_ResilienceTooltipDetail : SCR_DpsConditionBarBaseTooltipDetail +{ + protected SCR_CharacterResilienceHitZone m_pResilienceHitZone; + + //------------------------------------------------------------------------------------------------ + override void UpdateDetail(SCR_EditableEntityComponent entity) + { + super.UpdateDetail(entity); + + if (m_pResilienceHitZone) + SetBarAndPercentageValue(m_pResilienceHitZone.GetHealthScaled()); + } + + //------------------------------------------------------------------------------------------------ + override bool InitDetail(SCR_EditableEntityComponent entity, Widget widget) + { + if (!super.InitDetail(entity, widget)) + return false; + + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(m_DamageManager); + if (!charDamageManager || charDamageManager.GetState() == EDamageState.DESTROYED || !charDamageManager.IsDamageHandlingEnabled()) + return false; + + m_pResilienceHitZone = charDamageManager.GetResilienceHitZone(); + return true; + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Global/SCR_ParamEnumArray.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Global/SCR_ParamEnumArray.c new file mode 100644 index 000000000..13194fe98 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Global/SCR_ParamEnumArray.c @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_ParamEnumArray : ParamEnumArray +{ + //------------------------------------------------------------------------------------------------ + static ParamEnumArray ACE_Medical_FromCharacterBaseHitZones() + { + IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(Resource.Load("{37578B1666981FCE}Prefabs/Characters/Core/Character_Base.et"), SCR_DamageManagerComponent); + if (!componentSource) + return null; + + BaseContainerList list = componentSource.GetObjectArray("Additional hit zones"); + + ParamEnumArray params = new ParamEnumArray(); + int cnt = list.Count(); + + for (int i = 0; i < cnt; ++i) + { + string hitZoneName = list.Get(i).GetName(); + params.Insert(new ParamEnum(hitZoneName, hitZoneName)); + } + + return params; + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/HitZone/SCR_CharacterBloodHitZone.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/HitZone/SCR_CharacterBloodHitZone.c new file mode 100644 index 000000000..ed03007e8 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/HitZone/SCR_CharacterBloodHitZone.c @@ -0,0 +1,22 @@ +//----------------------------------------------------------------------------------------------------------- +modded class SCR_CharacterBloodHitZone : SCR_RegeneratingHitZone +{ + //----------------------------------------------------------------------------------------------------------- + //! Update resilience recovery scale when transitioning from and to unconscious state + override protected void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP) + { + super.OnDamageStateChanged(newState, previousDamageState, isJIP); + + if (!Replication.IsServer()) + return; + + if (newState != ECharacterBloodState.UNCONSCIOUS && previousDamageState != ECharacterBloodState.UNCONSCIOUS) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); + if (!damageManager) + return; + + damageManager.ACE_Medical_UpdateResilienceRegenScale(); + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/HitZone/SCR_CharacterResilienceHitZone.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/HitZone/SCR_CharacterResilienceHitZone.c new file mode 100644 index 000000000..15335b0f1 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/HitZone/SCR_CharacterResilienceHitZone.c @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterResilienceHitZone : SCR_RegeneratingHitZone +{ + //------------------------------------------------------------------------------------------------ + //! Multiply regen by the regen scale + override float ComputeEffectiveDamage(notnull BaseDamageContext damageContext, bool isDOT) + { + float damage = super.ComputeEffectiveDamage(damageContext, isDOT); + + if (!Replication.IsServer() || damageContext.damageType != EDamageType.REGENERATION) + return damage; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); + if (!damageManager) + return damage; + + return damage * damageManager.ACE_Medical_GetResilienceRegenScale(); + } +} diff --git a/addons/medical/scripts/Game/ACE_Medical/Mission/ACE_MissionHeaderSettings.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Mission/ACE_MissionHeaderSettings.c old mode 100755 new mode 100644 similarity index 77% rename from addons/medical/scripts/Game/ACE_Medical/Mission/ACE_MissionHeaderSettings.c rename to addons/medical_core/scripts/Game/@ACE_Medical_Core/Mission/ACE_MissionHeaderSettings.c index a616f57e0..116b8a76d --- a/addons/medical/scripts/Game/ACE_Medical/Mission/ACE_MissionHeaderSettings.c +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Mission/ACE_MissionHeaderSettings.c @@ -4,7 +4,7 @@ modded class ACE_MissionHeaderSettings { [Attribute()] - protected ref ACE_Medical_Settings m_ACE_Medical_Settings; + protected ref ACE_Medical_Core_Settings m_ACE_Medical_Core; //------------------------------------------------------------------------------------------------ //! Applies settings from mission header to config @@ -12,7 +12,7 @@ modded class ACE_MissionHeaderSettings { super.ApplyToSettingsConfig(config); - if (m_ACE_Medical_Settings) - config.SetModSettings(m_ACE_Medical_Settings); + if (m_ACE_Medical_Core) + config.SetModSettings(m_ACE_Medical_Core); } } diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Settings/ACE_Medical_Core_Settings.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Settings/ACE_Medical_Core_Settings.c new file mode 100644 index 000000000..2d3a3520f --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Settings/ACE_Medical_Core_Settings.c @@ -0,0 +1,10 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +class ACE_Medical_Core_Settings : ACE_ModSettings +{ + [Attribute(defvalue: "0.3", desc: "Default resilience regeneration scale. The default regeneration rate (5 HP/s) will be multiplied by this factor.", params: "0 inf")] + float m_fDefaultResilienceRegenScale; + + [Attribute(defvalue: "0.33", desc: "Can only apply epinephrine when patient has at least this health (ignored in advanced medication).", uiwidget: UIWidgets.Slider, params: "0 1")] + float m_fMinHealthScaledForEpinephrine; +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/ACE_BaseSystem.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/ACE_BaseSystem.c new file mode 100644 index 000000000..80fc683d2 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/ACE_BaseSystem.c @@ -0,0 +1,169 @@ +//------------------------------------------------------------------------------------------------ +class ACE_BaseSystem : GameSystem +{ + [Attribute(defvalue: "1000", desc: "Approximate update timeout for a particular entity [s]")] + protected int m_fEntityUpdateTimeoutMS; + + [Attribute(defvalue: "10", desc: "Maximum number of entities to be updated per frame")] + protected int m_iMaxIterationsPerFrame; + + protected ACE_BaseSystem_EState m_eCurrentState = ACE_BaseSystem_EState.QUEUE_UPDATE; + protected ref array m_aEntityQueue = {}; + protected ref array m_aEntitiesToRegister = {}; + protected ref array m_aEntitiesToUnregister = {}; + protected float m_fNextUpdateStartTime = 0; + protected int m_iCurrentEntityIdx = 0; + protected int m_iNumEntities = 0; + + //------------------------------------------------------------------------------------------------ + static ACE_BaseSystem GetInstance(typename type) + { + ChimeraWorld world = GetGame().GetWorld(); + return ACE_BaseSystem.Cast(world.FindSystem(type)); + } + + //------------------------------------------------------------------------------------------------ + override static void InitInfo(WorldSystemInfo outInfo) + { + super.InitInfo(outInfo); + outInfo.SetAbstract(true) + .SetUnique(false) + .SetLocation(ESystemLocation.Server) + .AddPoint(ESystemPoint.Frame); + } + + //------------------------------------------------------------------------------------------------ + //! Do not run when game is paused + override bool ShouldBePaused() + { + return true; + } + + //------------------------------------------------------------------------------------------------ + void OnRegistered(ACE_BaseSystem_EntityContext context); + + //------------------------------------------------------------------------------------------------ + //! Make sure to handle the case where entity is null, as it can already be deleted by the time + //! the queue update takes place that calls onUnregistered + void OnUnregistered(ACE_BaseSystem_EntityContext context); + + //------------------------------------------------------------------------------------------------ + //! Three states: QUEUE_UPDATE -> ENTITY_UPDATE -> TIMEOUT + override protected void OnUpdate(ESystemPoint point) + { + super.OnUpdate(point); + float currentTime = GetWorld().GetWorldTime(); + + switch (m_eCurrentState) + { + case ACE_BaseSystem_EState.TIMEOUT: + { + if (currentTime >= m_fNextUpdateStartTime) + { + m_eCurrentState = ACE_BaseSystem_EState.QUEUE_UPDATE; + m_fNextUpdateStartTime = currentTime + m_fEntityUpdateTimeoutMS; + } + + return; + } + + case ACE_BaseSystem_EState.ENTITY_UPDATE: + { + for (int i = 0; i < m_iMaxIterationsPerFrame; ++i) + { + ACE_BaseSystem_EntityContext context = m_aEntityQueue[m_iCurrentEntityIdx]; + UpdateEntity(context, (currentTime - context.m_fLastUpdateTime) / 1000); + context.m_fLastUpdateTime = currentTime; + ++m_iCurrentEntityIdx; + + if (m_iCurrentEntityIdx >= m_iNumEntities) + break; + } + + if (m_iCurrentEntityIdx >= m_iNumEntities) + m_eCurrentState = ACE_BaseSystem_EState.TIMEOUT; + + return; + } + + case ACE_BaseSystem_EState.QUEUE_UPDATE: + { + m_aEntityQueue.Reserve(m_aEntityQueue.Count() + m_aEntitiesToRegister.Count()); + + foreach (IEntity entity : m_aEntitiesToRegister) + { + Register(entity); + } + + foreach (IEntity entity : m_aEntitiesToUnregister) + { + Unregister(entity); + } + + m_aEntitiesToRegister.Clear(); + m_aEntitiesToUnregister.Clear(); + m_eCurrentState = ACE_BaseSystem_EState.ENTITY_UPDATE; + m_iCurrentEntityIdx = 0; + m_iNumEntities = m_aEntityQueue.Count(); + Enable(m_iNumEntities > 0); + return; + } + } + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateEntity(ACE_BaseSystem_EntityContext context, float timeSlice); + + //------------------------------------------------------------------------------------------------ + void Register(notnull IEntity entity) + { + // Only directly push back to queue when entities are not getting updated + if (m_eCurrentState == ACE_BaseSystem_EState.ENTITY_UPDATE) + { + m_aEntitiesToRegister.Insert(entity); + m_aEntitiesToUnregister.RemoveItem(entity); + + if (!IsEnabled()) + { + m_eCurrentState = ACE_BaseSystem_EState.QUEUE_UPDATE; + Enable(true); + } + } + else + { + ACE_BaseSystem_EntityContext context = CreateEntityContext(entity); + m_aEntityQueue.Insert(context); + OnRegistered(context); + } + } + + //------------------------------------------------------------------------------------------------ + void Unregister(IEntity entity) + { + // Only directly remove from queue when entities are not getting updated + if (m_eCurrentState == ACE_BaseSystem_EState.ENTITY_UPDATE) + { + m_aEntitiesToUnregister.Insert(entity); + m_aEntitiesToRegister.RemoveItem(entity); + } + else + { + foreach (int i, ACE_BaseSystem_EntityContext context : m_aEntityQueue) + { + if (context.m_pEntity != entity) + continue; + + OnUnregistered(context); + m_aEntityQueue.Remove(i); + break; + } + } + } + + //------------------------------------------------------------------------------------------------ + //! Factory method for entity contexts + protected ACE_BaseSystem_EntityContext CreateEntityContext(IEntity entity) + { + return new ACE_BaseSystem_EntityContext(entity); + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/Contexts/ACE_BaseSystem_EntityContext.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/Contexts/ACE_BaseSystem_EntityContext.c new file mode 100644 index 000000000..66b4e43ad --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/Contexts/ACE_BaseSystem_EntityContext.c @@ -0,0 +1,14 @@ +//------------------------------------------------------------------------------------------------ +class ACE_BaseSystem_EntityContext : Managed +{ + IEntity m_pEntity; + float m_fLastUpdateTime; + + //------------------------------------------------------------------------------------------------ + void ACE_BaseSystem_EntityContext(IEntity entity) + { + m_pEntity = entity; + m_fLastUpdateTime = GetGame().GetWorld().GetWorldTime(); + } +} + diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/Contexts/ACE_Medical_BaseSystem_EntityContext.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/Contexts/ACE_Medical_BaseSystem_EntityContext.c new file mode 100644 index 000000000..6d1dfc04f --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/Contexts/ACE_Medical_BaseSystem_EntityContext.c @@ -0,0 +1,17 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_BaseSystem_EntityContext : ACE_BaseSystem_EntityContext +{ + SCR_CharacterDamageManagerComponent m_pDamageManagerComponent; + SCR_CharacterBloodHitZone m_pBloodHitZone; + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_CardiovascularSystem_EntityContext(IEntity entity) + { + SCR_ChimeraCharacter char = SCR_ChimeraCharacter.Cast(entity); + if (!char) + return; + + m_pDamageManagerComponent = SCR_CharacterDamageManagerComponent.Cast(char.GetDamageManager()); + m_pBloodHitZone = m_pDamageManagerComponent.GetBloodHitZone(); + } +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/States/ACE_BaseSystem_EState.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/States/ACE_BaseSystem_EState.c new file mode 100644 index 000000000..9ddd07602 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/Systems/States/ACE_BaseSystem_EState.c @@ -0,0 +1,7 @@ +//------------------------------------------------------------------------------------------------ +enum ACE_BaseSystem_EState +{ + ENTITY_UPDATE, + TIMEOUT, + QUEUE_UPDATE +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/ScreenEffects/SCR_InspectCasualtyWidget.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/ScreenEffects/SCR_InspectCasualtyWidget.c new file mode 100644 index 000000000..bfad60a33 --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/ScreenEffects/SCR_InspectCasualtyWidget.c @@ -0,0 +1,28 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_InspectCasualtyWidget : SCR_InfoDisplayExtended +{ + override protected void GetDamageInfo(SCR_InventoryHitZonePointUI hitZonePointUI, IEntity targetEntity, inout float bleedingRate, inout array hZGroupsBleeding, inout int damageIntensity, inout bool regenerating, inout bool isTourniquetted, inout bool isSalineBagged, inout bool isMorphined) + { + super.GetDamageInfo(hitZonePointUI, targetEntity, bleedingRate, hZGroupsBleeding, damageIntensity, regenerating, isTourniquetted, isSalineBagged, isMorphined); + + ChimeraCharacter character = ChimeraCharacter.Cast(targetEntity); + if (!character) + return; + + SCR_CharacterDamageManagerComponent damageMan = SCR_CharacterDamageManagerComponent.Cast(character.GetDamageManager()); + if (!damageMan) + return; + + float health = damageMan.ACE_Medical_GetHealthScaled(); + if (health == 1) + damageIntensity = 0; + else if (health < hitZonePointUI.m_fLowDamageThreshold) + damageIntensity = 4; + else if (health < hitZonePointUI.m_fMediumDamageThreshold) + damageIntensity = 3; + else if (health < hitZonePointUI.m_fHighDamageThreshold) + damageIntensity = 2; + else + damageIntensity = 1; + } +} diff --git a/addons/medical/scripts/Game/ACE_Medical/UserActions/ACE_Medical_EpinephrineUserAction.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UserActions/ACE_Medical_EpinephrineUserAction.c old mode 100755 new mode 100644 similarity index 97% rename from addons/medical/scripts/Game/ACE_Medical/UserActions/ACE_Medical_EpinephrineUserAction.c rename to addons/medical_core/scripts/Game/@ACE_Medical_Core/UserActions/ACE_Medical_EpinephrineUserAction.c index 7e1f4e122..e36a02442 --- a/addons/medical/scripts/Game/ACE_Medical/UserActions/ACE_Medical_EpinephrineUserAction.c +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UserActions/ACE_Medical_EpinephrineUserAction.c @@ -27,7 +27,7 @@ class ACE_Medical_EpinephrineUserAction : SCR_MorphineUserAction if (!consumableComponent.GetConsumableEffect().CanApplyEffect(GetOwner(), userCharacter, reason)) { if (reason == SCR_EConsumableFailReason.ACE_MEDICAL_NOT_INCAPACITATED) - SetCannotPerformReason(m_sNotIncapacitated); + SetCannotPerformReason(m_sNotIncapacitated); else if (reason == SCR_EConsumableFailReason.ALREADY_APPLIED) SetCannotPerformReason(m_sAlreadyApplied); else if (reason == SCR_EConsumableFailReason.IS_BLEEDING) diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Components/Damage/SCR_CharacterDamageManagerComponent.c new file mode 100644 index 000000000..6875da18c --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Components/Damage/SCR_CharacterDamageManagerComponent.c @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent +{ + //----------------------------------------------------------------------------------------------------------- + //! Refactored bleed out handling to SCR_CharacterBloodHitZone::OnDamageStateChanged + override void UpdateConsciousness() + { + ChimeraCharacter character = ChimeraCharacter.Cast(GetOwner()); + if (!character) + return; + + CharacterControllerComponent controller = character.GetCharacterController(); + if (!controller) + return; + + controller.SetUnconscious(ShouldBeUnconscious()); + } + + //------------------------------------------------------------------------------------------------ + override void SetTourniquettedGroup(ECharacterHitZoneGroup hitZoneGroup, bool setTourniquetted) + { + super.SetTourniquettedGroup(hitZoneGroup, setTourniquetted); + m_pBloodHitZone.ACE_Medical_UpdateTotalBleedingAmount(); + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_BloodLossDamageEffect.c b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_BloodLossDamageEffect.c new file mode 100644 index 000000000..16a921996 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_BloodLossDamageEffect.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------------------------ +//! Central effect responsible for applying all blood loss to SCR_CharacterBloodHitZone +class ACE_Medical_BloodLossDamageEffect : SCR_DotDamageEffect +{ + protected ref array m_aDamageEffects = {}; + + //------------------------------------------------------------------------------------------------ + override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager) + { + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + if (charDamageManager) + SetAffectedHitZone(charDamageManager.GetBloodHitZone()); + + return false; + } + + //------------------------------------------------------------------------------------------------ + protected override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager) + { + DotDamageEffectTimerToken token = UpdateTimer(timeSlice, dmgManager); + DealCustomDot(GetAffectedHitZone(), ComputeEffectiveTotalBloodLoss(timeSlice, dmgManager), token, dmgManager); + } + + //------------------------------------------------------------------------------------------------ + protected float ComputeEffectiveTotalBloodLoss(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager) + { + SCR_CharacterBloodHitZone bloodHitZone = SCR_CharacterBloodHitZone.Cast(GetAffectedHitZone()); + if (!bloodHitZone) + return 0; + + return bloodHitZone.GetTotalBleedingAmount() * timeSlice; + } + + //------------------------------------------------------------------------------------------------ + override EDamageType GetDefaultDamageType() + { + return EDamageType.BLEEDING; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Damage/DamageEffects/CharacterDamageEffects/SCR_BleedingDamageEffect.c b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Damage/DamageEffects/CharacterDamageEffects/SCR_BleedingDamageEffect.c new file mode 100644 index 000000000..8a3253153 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Damage/DamageEffects/CharacterDamageEffects/SCR_BleedingDamageEffect.c @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------------------------ +//! Move damage over time handling to ACE_Medical_BloodLossDamageEffect +modded class SCR_BleedingDamageEffect : SCR_DotDamageEffect +{ + //------------------------------------------------------------------------------------------------ + //! Start ACE_Medical_BloodLossDamageEffect if none is present + override void OnEffectAdded(SCR_ExtendedDamageManagerComponent dmgManager) + { + SetDPS(CalculateBleedingRate()); + super.OnEffectAdded(dmgManager); + + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + if (charDamageManager) + charDamageManager.GetBloodHitZone().ACE_Medical_UpdateTotalBleedingAmount(); + + if (dmgManager.FindDamageEffectOfType(ACE_Medical_BloodLossDamageEffect)) + return; + + ACE_Medical_BloodLossDamageEffect bloodLossDamageEffect = new ACE_Medical_BloodLossDamageEffect(); + bloodLossDamageEffect.SetMaxDuration(0); + bloodLossDamageEffect.SetInstigator(GetInstigator()); + dmgManager.AddDamageEffect(bloodLossDamageEffect); + } + + //------------------------------------------------------------------------------------------------ + //! Terminate ACE_Medical_BloodLossDamageEffect if no bleedings are left + override void OnEffectRemoved(SCR_ExtendedDamageManagerComponent dmgManager) + { + super.OnEffectRemoved(dmgManager); + + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + if (charDamageManager) + charDamageManager.GetBloodHitZone().ACE_Medical_UpdateTotalBleedingAmount(); + + if (!dmgManager.FindDamageEffectOfType(SCR_BleedingDamageEffect)) + dmgManager.TerminateDamageEffectsOfType(ACE_Medical_BloodLossDamageEffect); + } + + //------------------------------------------------------------------------------------------------ + //! Disable damage over time, as ACE_Medical_BloodLossDamageEffect is responsible for it + protected override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager) + { + } + + //------------------------------------------------------------------------------------------------ + //! We update bleeding amount here as well, since when the hit zone already has a bleeding effect, + //! adding another one gets hijacked and the DPS gets updated instead. + override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager) + { + if (!super.HijackDamageEffect(dmgManager)) + return false; + + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + if (charDamageManager) + charDamageManager.GetBloodHitZone().ACE_Medical_UpdateTotalBleedingAmount(); + + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Refactored calculation to SCR_CharacterHitZone::CalculateBleedingRate + override float CalculateBleedingRate() + { + SCR_CharacterHitZone affectedHitZone = SCR_CharacterHitZone.Cast(GetAffectedHitZone()); + if (!affectedHitZone) + { + Print("SCR_BleedingDamageEffect instance without hitZone exists", LogLevel.ERROR); + return 0; + } + + return affectedHitZone.ACE_Medical_CalculateBleedingRate(); + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/GameMode/Misc/SCR_GameModeHealthSettings.c b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/GameMode/Misc/SCR_GameModeHealthSettings.c new file mode 100644 index 000000000..c8bb86697 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/GameMode/Misc/SCR_GameModeHealthSettings.c @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_GameModeHealthSettings : ScriptComponent +{ + //------------------------------------------------------------------------------------------------ + override void OnPostInit(IEntity owner) + { + super.OnPostInit(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (!settings) + return; + + m_fDOTScale = settings.m_fBleedingRateScale; + m_fRegenScale = settings.m_fBloodRegenScale; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/HitZone/SCR_CharacterBloodHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/HitZone/SCR_CharacterBloodHitZone.c new file mode 100644 index 000000000..7ebf20696 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/HitZone/SCR_CharacterBloodHitZone.c @@ -0,0 +1,77 @@ +//----------------------------------------------------------------------------------------------------------- +modded class SCR_CharacterBloodHitZone : SCR_RegeneratingHitZone +{ + protected float m_fACE_Medical_TotalBleedingAmount; + + //----------------------------------------------------------------------------------------------------------- + //! Refactored bleed out handling from SCR_CharacterDamageManagerComponent::UpdateConsciousness + override void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP) + { + super.OnDamageStateChanged(newState, previousDamageState, isJIP); + + if (!Replication.IsServer() || newState != EDamageState.DESTROYED) + return; + + if (!ACE_Medical_CanBleedOut()) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); + if (damageManager) + damageManager.Kill(damageManager.GetInstigator()); + } + + //----------------------------------------------------------------------------------------------------------- + //! Whether the character can bleed out + protected bool ACE_Medical_CanBleedOut() + { + if (!EntityUtils.IsPlayer(GetOwner())) + return true; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (!settings) + return true; + + return settings.m_bBleedOutForPlayersEnabled; + } + + //----------------------------------------------------------------------------------------------------------- + //! Should be called whenever the total bleeding rate should be recalculated + void ACE_Medical_UpdateTotalBleedingAmount() + { + m_fACE_Medical_TotalBleedingAmount = 0; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); + if (!damageManager) + return; + + array effects = {}; + damageManager.FindAllDamageEffectsOfType(SCR_BleedingDamageEffect, effects); + + foreach (SCR_PersistentDamageEffect effect : effects) + { + m_fACE_Medical_TotalBleedingAmount += ACE_Medical_ComputeBleedingRateForDamageEffect(damageManager, SCR_BleedingDamageEffect.Cast(effect)); + } + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (settings && settings.m_fMaxTotalBleedingRate >= 0 && m_fACE_Medical_TotalBleedingAmount > settings.m_fMaxTotalBleedingRate) + m_fACE_Medical_TotalBleedingAmount = settings.m_fMaxTotalBleedingRate; + } + + //----------------------------------------------------------------------------------------------------------- + protected float ACE_Medical_ComputeBleedingRateForDamageEffect(SCR_CharacterDamageManagerComponent damageManager, SCR_BleedingDamageEffect bleedingEffect) + { + float rate = bleedingEffect.GetDPS(); + + SCR_CharacterHitZone affectedHitZone = SCR_CharacterHitZone.Cast(bleedingEffect.GetAffectedHitZone()); + if (affectedHitZone && damageManager.GetGroupTourniquetted(affectedHitZone.GetHitZoneGroup())) + rate *= damageManager.GetTourniquetStrengthMultiplier(); + + return rate; + } + + //----------------------------------------------------------------------------------------------------------- + override float GetTotalBleedingAmount() + { + return m_fACE_Medical_TotalBleedingAmount; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/HitZone/SCR_CharacterHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/HitZone/SCR_CharacterHitZone.c new file mode 100644 index 000000000..18dcf9c4c --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/HitZone/SCR_CharacterHitZone.c @@ -0,0 +1,10 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterHitZone : SCR_RegeneratingHitZone +{ + //----------------------------------------------------------------------------------------------------------- + //! Refactored calculation from SCR_BleedingDamageEffect::CalculateBleedingRate + float ACE_Medical_CalculateBleedingRate() + { + return (1 - GetHealthScaled()) * GetMaxBleedingRate(); + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Settings/ACE_Medical_Core_Settings.c b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Settings/ACE_Medical_Core_Settings.c new file mode 100644 index 000000000..ebde2ee07 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Bleeding/Settings/ACE_Medical_Core_Settings.c @@ -0,0 +1,16 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +modded class ACE_Medical_Core_Settings : ACE_ModSettings +{ + [Attribute(defvalue: "true", desc: "Whether players can bleed out")] + bool m_bBleedOutForPlayersEnabled; + + [Attribute(defvalue: "1", desc: "Character bleeding rate multiplier", params: "0 inf")] + float m_fBleedingRateScale; + + [Attribute(defvalue: "-1", desc: "Maximum possibe bleeding rate in ml/s (Negative value means unlimited)", params: "-1 inf")] + float m_fMaxTotalBleedingRate; + + [Attribute(defvalue: "1", desc: "Character blood regeneration rate multiplier", params: "0 inf")] + float m_fBloodRegenScale; +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_MedicalKit/Components/SupportStation/SCR_HealSupportStationComponent.c b/addons/medical_core/scripts/Game/ACE_Medical_MedicalKit/Components/SupportStation/SCR_HealSupportStationComponent.c new file mode 100644 index 000000000..3eeefb434 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_MedicalKit/Components/SupportStation/SCR_HealSupportStationComponent.c @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------------------------ +//! Apply settings to medical kit +modded class SCR_HealSupportStationComponent : SCR_BaseDamageHealSupportStationComponent +{ + [RplProp(onRplName: "ACE_Medical_OnMedicalKitMaxHealScaledChanged")] + protected float m_fACE_Medical_MedicalKitMaxHealScaled = 0.5; + + //------------------------------------------------------------------------------------------------ + override protected void DelayedInit(IEntity owner) + { + super.DelayedInit(owner); + + if (!Replication.IsServer()) + return; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (!settings) + return; + + SCR_ResourceComponent resource = SCR_ResourceComponent.Cast(owner.FindComponent(SCR_ResourceComponent)); + if (resource) + resource.SetResourceTypeEnabled(settings.m_bHealSupplyUsageEnabled); + + // Set how much medical kits can heal + if (InventoryItemComponent.Cast(owner.FindComponent(InventoryItemComponent))) + { + m_fACE_Medical_MedicalKitMaxHealScaled = settings.m_fMedicalKitMaxHealScaled; + ACE_Medical_OnMedicalKitMaxHealScaledChanged(); + Replication.BumpMe(); + } + } + + //------------------------------------------------------------------------------------------------ + protected void ACE_Medical_OnMedicalKitMaxHealScaledChanged() + { + m_fMaxHealScaled = m_fACE_Medical_MedicalKitMaxHealScaled; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_MedicalKit/Settings/ACE_Medical_Core_Settings.c b/addons/medical_core/scripts/Game/ACE_Medical_MedicalKit/Settings/ACE_Medical_Core_Settings.c new file mode 100644 index 000000000..8d26bd7b2 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_MedicalKit/Settings/ACE_Medical_Core_Settings.c @@ -0,0 +1,10 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +modded class ACE_Medical_Core_Settings : ACE_ModSettings +{ + [Attribute(defvalue: "true", desc: "Healing consumes supplies when enabled. Ignored when global supply usage is disabled.")] + bool m_bHealSupplyUsageEnabled; + + [Attribute(defvalue: "0.5", desc: "Maximum scaled health (from 0 to 1) that a medical kit can heal to outside of medical facilities", uiwidget: UIWidgets.Slider, params: "0 1")] + float m_fMedicalKitMaxHealScaled; +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Damage/SCR_CharacterDamageManagerComponent.c new file mode 100644 index 000000000..2798105a4 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Damage/SCR_CharacterDamageManagerComponent.c @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent +{ + protected ACE_Medical_PainHitZone m_pACE_Medical_PainHitZone; + + [RplProp(condition: RplCondition.OwnerOnly)] + protected float m_fACE_Medical_PainSuppression = 0; + + [Attribute(defvalue: "0.25", uiwidget: UIWidgets.Slider, desc: "Percentage of armor damage that gets converted to pain", params: "0 1 0.01",)] + protected float m_fACE_Medical_ArmorPainMultiplier; + + [Attribute(defvalue: "10", uiwidget: UIWidgets.Slider, desc: "Minimum armor damage required to cause pain", params: "0 50 1")] + protected float m_fACE_Medical_ArmorPainThreshold; + + //----------------------------------------------------------------------------------------------------------- + //! Called by ACE_Medical_PainHitZone.OnInit to initialize the hit zone + void ACE_Medical_SetPainHitZone(HitZone hitzone) + { + m_pACE_Medical_PainHitZone = ACE_Medical_PainHitZone.Cast(hitzone); + } + + //----------------------------------------------------------------------------------------------------------- + //! Return the pain hit zone + ACE_Medical_PainHitZone ACE_Medical_GetPainHitZone() + { + return m_pACE_Medical_PainHitZone; + } + + //----------------------------------------------------------------------------------------------------------- + bool ACE_Medical_IsInPain() + { + return m_pACE_Medical_PainHitZone.GetHealthScaled() + m_fACE_Medical_PainSuppression <= m_pACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.MODERATE); + } + + //----------------------------------------------------------------------------------------------------------- + //! Returns intensity of pain used for ACE_Medical_PainScreenEffect + //! - 0 when less than moderate damage + //! - Linear response from full health -> 0 to serious damage -> 1 + float ACE_Medical_GetPainIntensity() + { + // Account for analgesic effects + float health = m_pACE_Medical_PainHitZone.GetHealthScaled() + m_fACE_Medical_PainSuppression; + + if (health > m_pACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.MODERATE)) + return 0; + + if (health <= m_pACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.SERIOUS)) + return 1; + + return Math.InverseLerp(1, m_pACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.SERIOUS), health); + } + + //----------------------------------------------------------------------------------------------------------- + void ACE_Medical_SetPainSuppression(float percentage) + { + m_fACE_Medical_PainSuppression = percentage; + Replication.BumpMe(); + } + + //----------------------------------------------------------------------------------------------------------- + float ACE_Medical_GetPainSuppression() + { + return m_fACE_Medical_PainSuppression; + } + + //------------------------------------------------------------------------------------------------ + //! Add pain when armor blocks damage + //! Behavior: + //! - Small impacts below threshold are ignored + //! - First significant impact sets character to moderate pain state + //! - Subsequent hits while already in pain can worsen the condition based on the multiplier + override void ArmorHitEventDamage(EDamageType type, float damage, IEntity instigator) + { + super.ArmorHitEventDamage(type, damage, instigator); + + if (!m_pACE_Medical_PainHitZone) + return; + + if (damage < m_fACE_Medical_ArmorPainThreshold) + return; + + if (!ACE_Medical_IsInPain()) + { + float painDamage = damage * m_fACE_Medical_ArmorPainMultiplier; + + float moderateThreshold = m_pACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.MODERATE); + float currentHealth = m_pACE_Medical_PainHitZone.GetHealthScaled(); + float minDamageForPain = (currentHealth - moderateThreshold) * m_pACE_Medical_PainHitZone.GetMaxHealth(); + + painDamage = Math.Max(painDamage, minDamageForPain); + m_pACE_Medical_PainHitZone.HandleDamage(painDamage, EDamageType.TRUE, instigator); + } + else + { + // Already in pain - add more based on multiplier + float painDamage = damage * m_fACE_Medical_ArmorPainMultiplier; + if (painDamage > 0) + { + m_pACE_Medical_PainHitZone.HandleDamage(painDamage, EDamageType.TRUE, instigator); + } + } + } +} diff --git a/addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/ACE_Medical_ConsumableMorphine.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Gadgets/ACE_Medical_ConsumableMorphine.c old mode 100755 new mode 100644 similarity index 72% rename from addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/ACE_Medical_ConsumableMorphine.c rename to addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Gadgets/ACE_Medical_ConsumableMorphine.c index 90fa1a964..c5a50d873 --- a/addons/medical/scripts/Game/ACE_Medical/Components/Gadgets/ACE_Medical_ConsumableMorphine.c +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Gadgets/ACE_Medical_ConsumableMorphine.c @@ -8,31 +8,29 @@ class ACE_Medical_ConsumableMorphine : SCR_ConsumableEffectHealthItems //! Can be applied when patient is in pain and no morphine is in the system override bool CanApplyEffect(notnull IEntity target, notnull IEntity user, out SCR_EConsumableFailReason failReason) { - ChimeraCharacter char = ChimeraCharacter.Cast(target); - if (!char) + ChimeraCharacter targetChar = ChimeraCharacter.Cast(target); + if (!targetChar) return false; - SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(char.GetDamageManager()); - if (!damageManager) - return false; - - ACE_Medical_PainHitZone painHZ = damageManager.ACE_Medical_GetPainHitZone(); - if (!painHZ) + SCR_CharacterDamageManagerComponent targetDamageManager = SCR_CharacterDamageManagerComponent.Cast(targetChar.GetDamageManager()); + if (!targetDamageManager) return false; // Check if morphine is in the system already - array effects = damageManager.GetAllPersistentEffectsOfType(ACE_Medical_MorphineDamageEffect); + array effects = targetDamageManager.GetAllPersistentEffectsOfType(ACE_Medical_MorphineDamageEffect); if (!effects.IsEmpty()) { failReason = SCR_EConsumableFailReason.ALREADY_APPLIED; return false; - }; + } - if (damageManager.ACE_Medical_IsInPain()) - return true; + if (!targetDamageManager.ACE_Medical_IsInPain()) + { + failReason = SCR_EConsumableFailReason.UNDAMAGED; + return false; + } - failReason = SCR_EConsumableFailReason.UNDAMAGED; - return false; + return true; } //------------------------------------------------------------------------------------------------ diff --git a/addons/medical/scripts/Game/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_MorphineDamageEffect.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_MorphineDamageEffect.c similarity index 100% rename from addons/medical/scripts/Game/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_MorphineDamageEffect.c rename to addons/medical_core/scripts/Game/ACE_Medical_Pain/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_MorphineDamageEffect.c diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/HitZone/ACE_Medical_PainHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/HitZone/ACE_Medical_PainHitZone.c new file mode 100644 index 000000000..455bd73ab --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/HitZone/ACE_Medical_PainHitZone.c @@ -0,0 +1,14 @@ +//----------------------------------------------------------------------------------------------------------- +//! Pain - does not receive damage directly, only via scripted events. +class ACE_Medical_PainHitZone : SCR_RegeneratingHitZone +{ + //----------------------------------------------------------------------------------------------------------- + //! Store instance on SCR_CharacterDamageManagerComponent on init + override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) + { + super.OnInit(pOwnerEntity, pManagerComponent); + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(pManagerComponent); + if (damageManager) + damageManager.ACE_Medical_SetPainHitZone(this); + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/Player/SCR_PlayerController.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Player/SCR_PlayerController.c new file mode 100644 index 000000000..afa42b7d4 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Player/SCR_PlayerController.c @@ -0,0 +1,59 @@ +//------------------------------------------------------------------------------------------------ +//! Apply setting of pain HUD effect +//! Note that SCR_HUDManagerComponent does not support RplProp, so we do it here! +modded class SCR_PlayerController : PlayerController +{ + [RplProp(condition: RplCondition.OwnerOnly, onRplName: "ACE_Medical_OnPainEffectTypeChanged")] + protected ACE_Medical_EPainEffectType m_fACE_Medical_PainEffectType; + + //------------------------------------------------------------------------------------------------ + protected override void OnInit(IEntity owner) + { + super.OnInit(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (settings) + { + m_fACE_Medical_PainEffectType = settings.m_ePainScreenEffectType; + ACE_Medical_OnPainEffectTypeChanged(); + Replication.BumpMe(); + } + } + + //------------------------------------------------------------------------------------------------ + protected void ACE_Medical_OnPainEffectTypeChanged() + { + SCR_HUDManagerComponent hudManager = SCR_HUDManagerComponent.Cast(FindComponent(SCR_HUDManagerComponent)); + if (!hudManager) + return; + + array displays = {}; + hudManager.GetInfoDisplays(displays); + + SCR_ScreenEffectsManager effectsManager; + foreach (BaseInfoDisplay display : displays) + { + effectsManager = SCR_ScreenEffectsManager.Cast(display); + if (effectsManager) + break; + } + + if (!effectsManager) + return; + + array effects = {}; + effectsManager.GetInfoDisplays(effects); + foreach (BaseInfoDisplay effect : effects) + { + ACE_Medical_PainScreenEffect painEffect = ACE_Medical_PainScreenEffect.Cast(effect); + if (!painEffect) + continue; + + painEffect.SetPainEffectType(m_fACE_Medical_PainEffectType); + break; + } + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/Settings/ACE_Medical_Core_Settings.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Settings/ACE_Medical_Core_Settings.c new file mode 100644 index 000000000..492f69271 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Settings/ACE_Medical_Core_Settings.c @@ -0,0 +1,8 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +modded class ACE_Medical_Core_Settings : ACE_ModSettings +{ + + [Attribute(defvalue: "WHITE_FLASH", desc: "What kind of pain screen effect is used", uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(ACE_Medical_EPainEffectType))] + ACE_Medical_EPainEffectType m_ePainScreenEffectType; +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_BasePainScreenEffectMode.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_BasePainScreenEffectMode.c new file mode 100644 index 000000000..322cde98e --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_BasePainScreenEffectMode.c @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps(), SCR_BaseContainerCustomTitleEnum(ACE_Medical_EPainEffectType, "m_eEffectType")] +class ACE_Medical_BasePainScreenEffectMode +{ + [Attribute(uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(ACE_Medical_EPainEffectType))] + protected ACE_Medical_EPainEffectType m_eEffectType; + + [Attribute(defvalue: "1")] + protected float m_fStrengthScale; + + [Attribute(defvalue: "0.5", desc: "Frequency of the effect")] + protected float m_fFrequency; + + protected bool m_bEnabled; + protected float m_fTimer = 0; + protected float m_fPeriod; + protected bool m_bIsTerminating; + protected float m_fMaxStrength; + protected SCR_CharacterDamageManagerComponent m_pDamageManager; + + //------------------------------------------------------------------------------------------------ + void InitEffect(SCR_ChimeraCharacter char, Widget root) + { + m_fPeriod = 1 / m_fFrequency; + m_pDamageManager = SCR_CharacterDamageManagerComponent.Cast(char.GetDamageManager()); + } + + //------------------------------------------------------------------------------------------------ + void EnableEffect(bool enable) + { + // Cancel terminations + if (m_bIsTerminating) + m_bIsTerminating = false; + + if (m_bEnabled == enable) + return; + + m_bEnabled = enable; + + if (!enable) + return; + + m_fTimer = 0; + m_fMaxStrength = m_pDamageManager.ACE_Medical_GetPainIntensity(); + } + + //------------------------------------------------------------------------------------------------ + void UpdateEffect(float timeSlice) + { + m_fTimer += timeSlice; + if (m_fTimer <= m_fPeriod) + return; + + m_fTimer = 0; + m_fMaxStrength = m_pDamageManager.ACE_Medical_GetPainIntensity(); + + if (m_bIsTerminating) + EnableEffect(false); + } + + //------------------------------------------------------------------------------------------------ + void TerminateEffect() + { + m_bIsTerminating = true; + } + + //------------------------------------------------------------------------------------------------ + bool ShouldGetUpdated() + { + return m_bEnabled || m_bIsTerminating; + } + + //------------------------------------------------------------------------------------------------ + ACE_Medical_EPainEffectType GetEffectType() + { + return m_eEffectType; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_EPainEffectType.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_EPainEffectType.c new file mode 100644 index 000000000..28a58c4fc --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_EPainEffectType.c @@ -0,0 +1,10 @@ +//------------------------------------------------------------------------------------------------ +[EnumLinear()] +enum ACE_Medical_EPainEffectType +{ + NONE, + WHITE_FLASH, + GREY_FLASH, + CHROMATIC_ABERRATION, + RADIAL_BLUR +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_ImageWidgetPainScreenEffectMode.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_ImageWidgetPainScreenEffectMode.c new file mode 100644 index 000000000..6e775bd88 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_ImageWidgetPainScreenEffectMode.c @@ -0,0 +1,59 @@ +//------------------------------------------------------------------------------------------------ +//! Class for white and grey flash effects +[BaseContainerProps(), SCR_BaseContainerCustomTitleEnum(ACE_Medical_EPainEffectType, "m_eEffectType")] +class ACE_Medical_ImageWidgetPainScreenEffectMode : ACE_Medical_BasePainScreenEffectMode +{ + [Attribute(desc: "Name of the animated image widget")] + protected string m_sImageWidgetName; + + [Attribute(defvalue: "1 1 1 1", desc: "Color of the effect")] + protected ref Color m_cColor; + + protected ImageWidget m_wImageWidget; + protected static const float OPACITY_FADEIN_SPEED = 2; + protected static const float PROGRESSION_FADEIN_SPEED = 4.5; + protected static const float OPACITY_FADEOUT_SPEED = 0.6; + protected static const float PROGRESSION_FADEOUT_SPEED = 3; + + //------------------------------------------------------------------------------------------------ + override void InitEffect(SCR_ChimeraCharacter char, Widget root) + { + super.InitEffect(char, root); + m_wImageWidget = ImageWidget.Cast(root.FindAnyWidget(m_sImageWidgetName)); + m_wImageWidget.SetColor(m_cColor); + } + + //------------------------------------------------------------------------------------------------ + override void EnableEffect(bool enable) + { + super.EnableEffect(enable); + + if (!m_wImageWidget) + return; + + m_wImageWidget.SetEnabled(enable); + m_wImageWidget.SetVisible(enable); + } + + //------------------------------------------------------------------------------------------------ + override void UpdateEffect(float timeSlice) + { + super.UpdateEffect(timeSlice); + float progress = m_fTimer / m_fPeriod; + + float opacity, maskProgress; + if (progress < 0.5) + { + opacity = Math.Min(m_fMaxStrength, OPACITY_FADEIN_SPEED * progress); + maskProgress = Math.Min(m_fMaxStrength / 2, PROGRESSION_FADEIN_SPEED * progress); + } + else + { + opacity = Math.Max(0, m_fMaxStrength - OPACITY_FADEOUT_SPEED * (progress - 0.5)); + maskProgress = Math.Max(0, m_fMaxStrength / 2 - PROGRESSION_FADEOUT_SPEED * (progress - 0.5)); + } + + m_wImageWidget.SetOpacity(opacity * m_fStrengthScale); + m_wImageWidget.SetMaskProgress(maskProgress * m_fStrengthScale); + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_PainScreenEffect.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_PainScreenEffect.c new file mode 100644 index 000000000..bf0658b5c --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_PainScreenEffect.c @@ -0,0 +1,116 @@ +//------------------------------------------------------------------------------------------------ +//! Pain screen effect; Code is based on SCR_BleedingScreenEffect +class ACE_Medical_PainScreenEffect : SCR_BaseScreenEffect +{ + [Attribute()] + protected ref array m_aModes; + + protected ACE_Medical_BasePainScreenEffectMode m_pSelectedMode; + protected SCR_CharacterControllerComponent m_pCharController; + protected SCR_CharacterDamageManagerComponent m_pDamageManager; + protected ACE_Medical_PainHitZone m_pPainHitZone; + + //------------------------------------------------------------------------------------------------ + override void DisplayControlledEntityChanged(IEntity from, IEntity to) + { + if (!m_pSelectedMode) + return; + + ClearEffects(); + + SCR_ChimeraCharacter char = SCR_ChimeraCharacter.Cast(to); + if (!char) + return; + + m_pSelectedMode.InitEffect(char, m_wRoot); + + m_pCharController = SCR_CharacterControllerComponent.Cast(char.GetCharacterController()); + if (!m_pCharController) + return; + + m_pDamageManager = SCR_CharacterDamageManagerComponent.Cast(char.GetDamageManager()); + if (!m_pDamageManager) + return; + + m_pPainHitZone = m_pDamageManager.ACE_Medical_GetPainHitZone(); + if (!m_pPainHitZone) + return; + + UpdateEnablePainEffect(); + m_pPainHitZone.GetOnDamageStateChanged().Insert(OnPainStateChanged); + } + + //------------------------------------------------------------------------------------------------ + override protected void DisplayConsciousnessChanged(bool conscious, bool init = false) + { + if (init) + return; + + UpdateEnablePainEffect(); + } + + //------------------------------------------------------------------------------------------------ + protected void OnPainStateChanged(SCR_HitZone hitZone) + { + UpdateEnablePainEffect(); + } + + //------------------------------------------------------------------------------------------------ + override void UpdateEffect(float timeSlice) + { + if (!m_pSelectedMode) + return; + + if (m_pSelectedMode.ShouldGetUpdated()) + m_pSelectedMode.UpdateEffect(timeSlice); + } + + //------------------------------------------------------------------------------------------------ + //! Clear pain effect over time + override void ClearEffects() + { + if (m_pSelectedMode) + m_pSelectedMode.EnableEffect(false); + + if (m_pPainHitZone) + m_pPainHitZone.GetOnDamageStateChanged().Remove(OnPainStateChanged); + } + + //------------------------------------------------------------------------------------------------ + protected override void DisplayOnSuspended() + { + if (m_pSelectedMode) + m_pSelectedMode.EnableEffect(false); + } + + //------------------------------------------------------------------------------------------------ + protected override void DisplayOnResumed() + { + UpdateEnablePainEffect(); + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateEnablePainEffect() + { + if (!m_pSelectedMode) + return; + + if (m_pDamageManager.ACE_Medical_IsInPain() && m_pCharController.GetLifeState() == ECharacterLifeState.ALIVE) + m_pSelectedMode.EnableEffect(true); + else + m_pSelectedMode.TerminateEffect(); + } + + //------------------------------------------------------------------------------------------------ + void SetPainEffectType(ACE_Medical_EPainEffectType type) + { + foreach (ACE_Medical_BasePainScreenEffectMode mode : m_aModes) + { + if (mode.GetEffectType() != type) + continue; + + m_pSelectedMode = mode; + return; + } + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_PostProcessPainScreenEffectMode.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_PostProcessPainScreenEffectMode.c new file mode 100644 index 000000000..00f06fae9 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/UI/ScreenEffects/Pain/ACE_Medical_PostProcessPainScreenEffectMode.c @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------------------------ +//! Class for chromatic aberration and radial blur effects +[BaseContainerProps(), SCR_BaseContainerCustomTitleEnum(ACE_Medical_EPainEffectType, "m_eEffectType")] +class ACE_Medical_PostProcessPainScreenEffectMode : ACE_Medical_BasePainScreenEffectMode +{ + [Attribute(uiwidget: UIWidgets.ComboBox, enums: ParamEnumArray.FromEnum(PostProcessEffectType))] + protected PostProcessEffectType m_ePPType; + + [Attribute(params: "emat")] + protected ResourceName m_sMaterialName; + + protected ref Material m_pEffectMaterial; + protected static const int POST_PROCESS_EFFECT_PRIORITY = 7; + protected static const float POWER_FADEIN_SPEED = 2; + protected static const float POWER_FADEOUT_SPEED = 6; + + //------------------------------------------------------------------------------------------------ + override void InitEffect(SCR_ChimeraCharacter char, Widget root) + { + super.InitEffect(char, root); + char.GetWorld().SetCameraPostProcessEffect(char.GetWorld().GetCurrentCameraId(), POST_PROCESS_EFFECT_PRIORITY, m_ePPType, m_sMaterialName); + m_pEffectMaterial = Material.GetMaterial(m_sMaterialName); + } + + //------------------------------------------------------------------------------------------------ + override void EnableEffect(bool enable) + { + super.EnableEffect(enable); + + if (m_pEffectMaterial) + m_pEffectMaterial.SetParam("Enabled", enable); + } + + //------------------------------------------------------------------------------------------------ + override void UpdateEffect(float timeSlice) + { + super.UpdateEffect(timeSlice); + float progress = m_fTimer / m_fPeriod; + + float strength; + if (progress < 0.5) + strength = Math.Min(m_fMaxStrength, POWER_FADEIN_SPEED * progress); + else + strength = Math.Max(0, m_fMaxStrength - POWER_FADEOUT_SPEED * (progress - 0.5)); + + strength *= m_fStrengthScale; + m_pEffectMaterial.SetParam("PowerX", strength); + m_pEffectMaterial.SetParam("PowerY", strength); + } +} diff --git a/addons/medical/scripts/Game/ACE_Medical/Character/ACE_Medical_EUnconsciousPose.c b/addons/medical_core/scripts/Game/ACE_Medical_Reposition/Character/ACE_Medical_EUnconsciousPose.c similarity index 100% rename from addons/medical/scripts/Game/ACE_Medical/Character/ACE_Medical_EUnconsciousPose.c rename to addons/medical_core/scripts/Game/ACE_Medical_Reposition/Character/ACE_Medical_EUnconsciousPose.c diff --git a/addons/medical/scripts/Game/ACE_Medical/Character/SCR_CharacterControllerComponent.c b/addons/medical_core/scripts/Game/ACE_Medical_Reposition/Character/SCR_CharacterControllerComponent.c similarity index 51% rename from addons/medical/scripts/Game/ACE_Medical/Character/SCR_CharacterControllerComponent.c rename to addons/medical_core/scripts/Game/ACE_Medical_Reposition/Character/SCR_CharacterControllerComponent.c index 1c8de05b0..a645514c8 100644 --- a/addons/medical/scripts/Game/ACE_Medical/Character/SCR_CharacterControllerComponent.c +++ b/addons/medical_core/scripts/Game/ACE_Medical_Reposition/Character/SCR_CharacterControllerComponent.c @@ -1,67 +1,12 @@ //------------------------------------------------------------------------------------------------ -//! Introduce a second chance, which gets triggered when the character would have died without -//! falling unconscious. modded class SCR_CharacterControllerComponent : CharacterControllerComponent { - protected SCR_CharacterDamageManagerComponent m_pACE_Medical_DamageManager; - protected const float ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS = 1000; - [RplProp(onRplName: "ACE_Medical_OnUnconsciousPoseChanged")] protected ACE_Medical_EUnconsciousPose m_eACE_Medical_UnconsciousPose; - //------------------------------------------------------------------------------------------------ - //! Initialize member variables - override void OnInit(IEntity owner) - { - super.OnInit(owner); - m_pACE_Medical_DamageManager = SCR_CharacterDamageManagerComponent.Cast(owner.FindComponent(SCR_CharacterDamageManagerComponent)); - } - - //------------------------------------------------------------------------------------------------ - //! Add/remove second chance when life state changes - override void OnLifeStateChanged(ECharacterLifeState previousLifeState, ECharacterLifeState newLifeState) - { - super.OnLifeStateChanged(previousLifeState, newLifeState); - - // Only run if ACE Medical has been initialized for this character - if (!m_pACE_Medical_DamageManager.ACE_Medical_IsInitialized()) - return; - - // OnLifeStateChanged sometimes gets triggered without a change in state - if (previousLifeState == newLifeState) - return; - - switch (newLifeState) - { - // Add second chance when revived - case ECharacterLifeState.ALIVE: - { - GetGame().GetCallqueue().Remove(m_pACE_Medical_DamageManager.ACE_Medical_EnableSecondChance); - m_pACE_Medical_DamageManager.ACE_Medical_EnableSecondChance(true); - m_pACE_Medical_DamageManager.ACE_Medical_SetSecondChanceTrigged(false); - break; - } - - // Schedule removal of second chance when falling unconscious - case ECharacterLifeState.INCAPACITATED: - { - GetGame().GetCallqueue().CallLater(m_pACE_Medical_DamageManager.ACE_Medical_EnableSecondChance, ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS, false, false); - break; - } - - // Remove second chance when dead - case ECharacterLifeState.DEAD: - { - GetGame().GetCallqueue().Remove(m_pACE_Medical_DamageManager.ACE_Medical_EnableSecondChance); - m_pACE_Medical_DamageManager.ACE_Medical_EnableSecondChance(false); - break; - } - } - } - //------------------------------------------------------------------------------------------------ protected void ACE_Medical_OnUnconsciousPoseChanged() - { + { SCR_ChimeraCharacter char = SCR_ChimeraCharacter.Cast(GetOwner()); if (!char) return; @@ -79,7 +24,7 @@ modded class SCR_CharacterControllerComponent : CharacterControllerComponent } //------------------------------------------------------------------------------------------------ - //! Register unconscious pose changes in the animation graph + //! Listen to unconscious pose changes in the animation graph protected override void OnAnimationEvent(AnimationEventID animEventType, AnimationEventID animUserString, int intParam, float timeFromStart, float timeToEnd) { super.OnAnimationEvent(animEventType, animUserString, intParam, timeFromStart, timeToEnd); diff --git a/addons/medical/scripts/Game/UserActions/ACE_Medical_RepositionUserAction.c b/addons/medical_core/scripts/Game/ACE_Medical_Reposition/UserActions/ACE_Medical_RepositionUserAction.c similarity index 100% rename from addons/medical/scripts/Game/UserActions/ACE_Medical_RepositionUserAction.c rename to addons/medical_core/scripts/Game/ACE_Medical_Reposition/UserActions/ACE_Medical_RepositionUserAction.c diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Character/SCR_CharacterControllerComponent.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Character/SCR_CharacterControllerComponent.c new file mode 100644 index 000000000..8f2cf3fdc --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Character/SCR_CharacterControllerComponent.c @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterControllerComponent : CharacterControllerComponent +{ + //----------------------------------------------------------------------------------------------------------- + override void OnLifeStateChanged(ECharacterLifeState previousLifeState, ECharacterLifeState newLifeState) + { + super.OnLifeStateChanged(previousLifeState, newLifeState); + + // OnLifeStateChanged sometimes gets triggered without a change in state + if (!Replication.IsServer() || previousLifeState == newLifeState) + return; + + SCR_ChimeraCharacter ownerChar = SCR_ChimeraCharacter.Cast(GetOwner()); + if (!ownerChar) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(ownerChar.GetDamageManager()); + if (!damageManager) + return; + + switch (newLifeState) + { + case ECharacterLifeState.INCAPACITATED: + { + damageManager.ACE_Medical_ScheduleSecondChanceDeactivation(); + break; + } + + case ECharacterLifeState.ALIVE: + { + damageManager.ACE_Medical_ClearSecondChanceHistory(); + break; + } + } + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Components/Damage/SCR_CharacterDamageManagerComponent.c new file mode 100644 index 000000000..f29c992dd --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Components/Damage/SCR_CharacterDamageManagerComponent.c @@ -0,0 +1,123 @@ +//------------------------------------------------------------------------------------------------ +//! Add second chance data +modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent +{ + protected float m_bACE_Medical_WasSecondChanceGranted = false; + protected float m_fACE_Medical_SecondChanceDeactivationTimeMS = -float.INFINITY; + protected float m_fACE_Medical_LastFallDamageTimeMS = -float.INFINITY; + + protected static const float ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS = 1000; + + //----------------------------------------------------------------------------------------------------------- + //! Friend method for SCR_CharacterHitZone and SCR_CharacterHealthHitZone + void ACE_Medical_OnSecondChanceGranted() + { + // Only handle first second chance + if (m_bACE_Medical_WasSecondChanceGranted) + return; + + ACE_Medical_SetWasSecondChanceGranted(true); + m_pResilienceHitZone.SetHealthScaled(0); + } + + //----------------------------------------------------------------------------------------------------------- + //! Second chance will be deactivated after ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS + void ACE_Medical_ScheduleSecondChanceDeactivation() + { + m_fACE_Medical_SecondChanceDeactivationTimeMS = GetOwner().GetWorld().GetWorldTime() + ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS; + } + + //----------------------------------------------------------------------------------------------------------- + bool ACE_Medical_ShouldDeactivateSecondChance() + { + if (m_fACE_Medical_SecondChanceDeactivationTimeMS < 0) + return false; + + // Check if second chance has expired + return GetOwner().GetWorld().GetWorldTime() >= m_fACE_Medical_SecondChanceDeactivationTimeMS; + } + + //----------------------------------------------------------------------------------------------------------- + bool ACE_Medical_IsSecondChanceEnabled() + { + // Check for AI + if (!s_pACE_Medical_Core_Settings.m_bSecondChanceForAIEnabled && !EntityUtils.IsPlayer(GetOwner())) + return false; + + // Check for fall damage + if (s_pACE_Medical_Core_Settings.m_bSecondChanceForFallDamageEnabled || m_fACE_Medical_SecondChanceDeactivationTimeMS < 0) + return true; + + if (m_fACE_Medical_SecondChanceDeactivationTimeMS - m_fACE_Medical_LastFallDamageTimeMS <= ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS) + return false; + + return true; + } + + //----------------------------------------------------------------------------------------------------------- + protected void ACE_Medical_SetWasSecondChanceGranted(bool wasGranted) + { + m_bACE_Medical_WasSecondChanceGranted = wasGranted; + ACE_Medical_UpdateResilienceRegenScale(); + } + + //----------------------------------------------------------------------------------------------------------- + //! Whether second chance was granted at least one time + //! Gets reset when character wakes up + bool ACE_Medical_WasSecondChanceGranted() + { + return m_bACE_Medical_WasSecondChanceGranted; + } + + //----------------------------------------------------------------------------------------------------------- + //! Unsets previously granted second chance + void ACE_Medical_ClearSecondChanceHistory() + { + ACE_Medical_SetWasSecondChanceGranted(false); + ACE_Medical_UpdateResilienceRegenScale(); + m_fACE_Medical_SecondChanceDeactivationTimeMS = -float.INFINITY; + + array hitZones = {}; + GetPhysicalHitZones(hitZones); + foreach (HitZone hitZone : hitZones) + { + SCR_CharacterHitZone physicalHitZone = SCR_CharacterHitZone.Cast(hitZone); + if (physicalHitZone) + physicalHitZone.ACE_Medical_ClearSecondChanceHistory(); + } + } + + //------------------------------------------------------------------------------------------------ + //! Override recovery scale when second chance was granted and its scale is smaller than the current + override void ACE_Medical_UpdateResilienceRegenScale() + { + super.ACE_Medical_UpdateResilienceRegenScale(); + + if (m_bACE_Medical_WasSecondChanceGranted) + m_fACE_Medical_ResilienceRegenScale = Math.Min(m_fACE_Medical_ResilienceRegenScale, s_pACE_Medical_Core_Settings.m_fSecondChanceResilienceRegenScale); + } + + //----------------------------------------------------------------------------------------------------------- + //! Store the time of the latest fall damage + override void HandleAnimatedFallDamage(float damage) + { + super.HandleAnimatedFallDamage(damage); + + if (!Replication.IsServer()) + return; + + m_fACE_Medical_LastFallDamageTimeMS = GetOwner().GetWorld().GetWorldTime(); + } + + //------------------------------------------------------------------------------------------------ + //! Store the time of the latest fall damage + override void HandleRagdollFallDamage(notnull HitZone contactingHitZone, float damage) + { + super.HandleRagdollFallDamage(contactingHitZone, damage); + + if (!Replication.IsServer()) + return; + + m_fACE_Medical_LastFallDamageTimeMS = GetOwner().GetWorld().GetWorldTime(); + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/ACE_Medical_CharacterAbdomenHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/ACE_Medical_CharacterAbdomenHitZone.c new file mode 100644 index 000000000..910c3ee8f --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/ACE_Medical_CharacterAbdomenHitZone.c @@ -0,0 +1,17 @@ +//----------------------------------------------------------------------------------------------------------- +class ACE_Medical_CharacterAbdomenHitZone : SCR_CharacterHitZone +{ + //----------------------------------------------------------------------------------------------------------- + //! Apply second chance setting + override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) + { + super.OnInit(pOwnerEntity, pManagerComponent); + + if (!Replication.IsServer()) + return; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (settings) + m_fACE_Medical_SecondChance = settings.m_fSecondChanceOnAbdomen; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/ACE_Medical_CharacterChestHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/ACE_Medical_CharacterChestHitZone.c new file mode 100644 index 000000000..e814b0422 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/ACE_Medical_CharacterChestHitZone.c @@ -0,0 +1,17 @@ +//----------------------------------------------------------------------------------------------------------- +class ACE_Medical_CharacterChestHitZone : SCR_CharacterHitZone +{ + //----------------------------------------------------------------------------------------------------------- + //! Apply second chance setting + override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) + { + super.OnInit(pOwnerEntity, pManagerComponent); + + if (!Replication.IsServer()) + return; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (settings) + m_fACE_Medical_SecondChance = settings.m_fSecondChanceOnChest; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHeadHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHeadHitZone.c new file mode 100644 index 000000000..75b268b1f --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHeadHitZone.c @@ -0,0 +1,17 @@ +//----------------------------------------------------------------------------------------------------------- +modded class SCR_CharacterHeadHitZone : SCR_CharacterHitZone +{ + //----------------------------------------------------------------------------------------------------------- + //! Apply second chance setting + override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) + { + super.OnInit(pOwnerEntity, pManagerComponent); + + if (!Replication.IsServer()) + return; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (settings) + m_fACE_Medical_SecondChance = settings.m_fSecondChanceOnHead; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHealthHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHealthHitZone.c new file mode 100644 index 000000000..461a05f45 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHealthHitZone.c @@ -0,0 +1,34 @@ +//----------------------------------------------------------------------------------------------------------- +//! health hitzone - Receives damage from physical hitzones +modded class SCR_CharacterHealthHitZone : SCR_HitZone +{ + //----------------------------------------------------------------------------------------------------------- + //! Register at ACE_Medical_SecondChanceSystem when destroyed + override void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP) + { + super.OnDamageStateChanged(newState, previousDamageState, isJIP); + + if (!Replication.IsServer()) + return; + + if (newState != EDamageState.DESTROYED) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); + if (!damageManager) + return; + + ACE_Medical_SecondChanceSystem system = ACE_Medical_SecondChanceSystem.GetInstance(); + if (system) + { + SCR_CharacterHitZone struckHitZone = damageManager.ACE_Medical_GetLastStruckPhysicalHitZone(); + damageManager.AddBleedingEffectOnHitZone(struckHitZone); + system.Register(damageManager, struckHitZone); + } + else + { + // Put kill on callqueue to avoid potential crash (e.g. when called from HitZone::OnDamageStateChanged) + GetGame().GetCallqueue().Call(damageManager.Kill, damageManager.GetInstigator()); + } + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHitZone.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHitZone.c new file mode 100644 index 000000000..ec5199ae7 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/HitZone/SCR_CharacterHitZone.c @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterHitZone : SCR_RegeneratingHitZone +{ + [Attribute(defvalue: "1", desc: "Probability for second chance for this hit zone", uiwidget: UIWidgets.Slider, params: "0 1")] + protected float m_fACE_Medical_SecondChance; + + protected bool m_bACE_Medical_WasSecondChanceGranted = false; + + //----------------------------------------------------------------------------------------------------------- + //! Apply second chance setting + override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) + { + super.OnInit(pOwnerEntity, pManagerComponent); + + if (!Replication.IsServer()) + return; + + ACE_Medical_Core_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (settings) + m_fACE_Medical_SecondChance = settings.m_fDefaultSecondChance; + } + + //----------------------------------------------------------------------------------------------------------- + //! Returns true when second chance is granted by this hit zone + bool ACE_Medical_ShouldGrantSecondChance() + { + //! Always regrant when previously granted + if (m_bACE_Medical_WasSecondChanceGranted) + return true; + + if (m_fACE_Medical_SecondChance < 1 && m_fACE_Medical_SecondChance <= Math.RandomFloat(0, 1)) + return false; + + m_bACE_Medical_WasSecondChanceGranted = true; + return true; + } + + //----------------------------------------------------------------------------------------------------------- + //! Unsets previously granted second chance + void ACE_Medical_ClearSecondChanceHistory() + { + m_bACE_Medical_WasSecondChanceGranted = false; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Settings/ACE_Medical_Core_Settings.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Settings/ACE_Medical_Core_Settings.c new file mode 100644 index 000000000..db304e737 --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Settings/ACE_Medical_Core_Settings.c @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +modded class ACE_Medical_Core_Settings : ACE_ModSettings +{ + [Attribute(defvalue: "0", desc: "Resilience regeneration scale when second chance was triggered. The default regeneration rate will be multiplied by this factor.", params: "0 inf")] + float m_fSecondChanceResilienceRegenScale; + + [Attribute(defvalue: "1", desc: "Default probability for second chance for killing blows", uiwidget: UIWidgets.Slider, params: "0 1")] + float m_fDefaultSecondChance; + + [Attribute(defvalue: "0", desc: "Probability for second chance for killing blows to the head", uiwidget: UIWidgets.Slider, params: "0 1")] + float m_fSecondChanceOnHead; + + [Attribute(defvalue: "1", desc: "Probability for second chance for killing blows to the chest", uiwidget: UIWidgets.Slider, params: "0 1")] + float m_fSecondChanceOnChest; + + [Attribute(defvalue: "1", desc: "Probability for second chance for killing blows to the abdomen", uiwidget: UIWidgets.Slider, params: "0 1")] + float m_fSecondChanceOnAbdomen; + + [Attribute(defvalue: "false", desc: "Whether second chance can be triggered when falling from great heights")] + bool m_bSecondChanceForFallDamageEnabled; + + [Attribute(defvalue: "false", desc: "Whether AI can have second chance")] + bool m_bSecondChanceForAIEnabled; +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Systems/ACE_Medical_SecondChanceSystem.c b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Systems/ACE_Medical_SecondChanceSystem.c new file mode 100644 index 000000000..ff1f5901a --- /dev/null +++ b/addons/medical_core/scripts/Game/ACE_Medical_SecondChance/Systems/ACE_Medical_SecondChanceSystem.c @@ -0,0 +1,197 @@ +//----------------------------------------------------------------------------------------------------------- +//! Second Chance System +//! -------------------- +//! A character's damage manager gets registered when a killing blow is dealt to it. +//! If second chance is granted, the character survives, but gets knocked out. +//! The character will stay alive for ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS. +//! After that all destroyed physical hit zones get checked if they grant second chance. +//! If they grant it, they'll heal by SECOND_CHANCE_SCALED_RECOVERED_HEALTH. +//! If they don't grant it, the character gets killed. +//! Finally, the character's damage manager gets unregistered. +//! After ACE_MEDICAL_SECOND_CHANCE_DEACTIVATION_TIMEOUT_MS has passed, no more second chances are granted +//! until the character wakes up. +class ACE_Medical_SecondChanceSystem : GameSystem +{ + protected ref array m_aDamageManagers = {}; + protected ref array m_aDamageManagersToRegister = {}; + protected ref array m_aDamageManagersToUnregister = {}; + protected bool m_bIsUpdating = false; + protected bool m_bScheduledQueueUpdate = false; + + protected static const float SECOND_CHANCE_SCALED_RECOVERED_HEALTH = 0.01; + + //------------------------------------------------------------------------------------------------ + static ACE_Medical_SecondChanceSystem GetInstance() + { + ChimeraWorld world = GetGame().GetWorld(); + return ACE_Medical_SecondChanceSystem.Cast(world.FindSystem(ACE_Medical_SecondChanceSystem)); + } + + //------------------------------------------------------------------------------------------------ + override static void InitInfo(WorldSystemInfo outInfo) + { + super.InitInfo(outInfo); + outInfo.SetLocation(ESystemLocation.Server); + outInfo.AddPoint(ESystemPoint.Frame); + } + + //------------------------------------------------------------------------------------------------ + //! Should be paused when simulation is paused + override bool ShouldBePaused() + { + return true; + } + + //------------------------------------------------------------------------------------------------ + override protected void OnInit() + { + super.OnInit(); + + if (m_aDamageManagers.IsEmpty()) + Enable(false); + } + + //------------------------------------------------------------------------------------------------ + override protected void OnUpdate(ESystemPoint point) + { + // Set updating lock such that m_aQueue is left untouched by Register/Unregister + m_bIsUpdating = true; + + // Deactivate second chance for managers for which it has expired + foreach (SCR_CharacterDamageManagerComponent damageManager : m_aDamageManagers) + { + if (!damageManager || damageManager.IsDestroyed()) + Unregister(damageManager); + else if (damageManager.ACE_Medical_ShouldDeactivateSecondChance()) + HandleSecondChanceDeactivation(damageManager); + } + + // Unset updating lock + m_bIsUpdating = false; + + // Process entities scheduled for registering/unregistering from the queue + if (m_bScheduledQueueUpdate) + { + foreach (SCR_CharacterDamageManagerComponent damageManager : m_aDamageManagersToRegister) + { + Register(damageManager); + } + + foreach (SCR_CharacterDamageManagerComponent damageManager : m_aDamageManagersToUnregister) + { + Unregister(damageManager); + } + + m_aDamageManagersToRegister.Clear(); + m_aDamageManagersToUnregister.Clear(); + m_bScheduledQueueUpdate = false; + } + } + + //------------------------------------------------------------------------------------------------ + //! Check each destroyed hit zone if it grants second chance + //! If not, kill the character + protected void HandleSecondChanceDeactivation(SCR_CharacterDamageManagerComponent damageManager) + { + Unregister(damageManager); + + if (!damageManager.ACE_Medical_IsSecondChanceEnabled()) + return damageManager.Kill(damageManager.GetInstigator()); + + array hitZones = {}; + damageManager.GetPhysicalHitZones(hitZones); + foreach (HitZone hitZone : hitZones) + { + SCR_CharacterHitZone charHitZone = SCR_CharacterHitZone.Cast(hitZone); + if (!charHitZone) + continue; + + if (charHitZone.GetDamageState() != EDamageState.DESTROYED) + continue; + + if (!charHitZone.ACE_Medical_ShouldGrantSecondChance()) + { + damageManager.Kill(damageManager.GetInstigator()); + break; + } + + ApplySecondChanceRegenToHitZone(damageManager, charHitZone); + } + } + + //----------------------------------------------------------------------------------------------------------- + //! Heals the hit zone by SECOND_CHANCE_SCALED_RECOVERED_HEALTH + protected void ApplySecondChanceRegenToHitZone(SCR_CharacterDamageManagerComponent damageManager, SCR_HitZone hitZone) + { + if (!hitZone) + return; + + vector hitPosDirNorm[3]; + SCR_DamageContext regenContext = new SCR_DamageContext( + EDamageType.REGENERATION, + -hitZone.GetMaxHealth() * SECOND_CHANCE_SCALED_RECOVERED_HEALTH, + hitPosDirNorm, + damageManager.GetOwner(), + hitZone, + damageManager.GetInstigator(), // We have to use the last instigator, as otherwise bleedouts would count as suicide + null, -1, -1 + ); + regenContext.damageEffect = new InstantDamageEffect(); + damageManager.HandleDamage(regenContext); + } + + //------------------------------------------------------------------------------------------------ + //! struckHitZone is the hit zone that caused the registration and is evaluated for second chance + void Register(notnull SCR_CharacterDamageManagerComponent damageManager, SCR_CharacterHitZone struckHitZone) + { + // Refuse registration and kill character if second chance is not granted + if (!struckHitZone || !damageManager.ACE_Medical_IsSecondChanceEnabled() || damageManager.ACE_Medical_ShouldDeactivateSecondChance() || !struckHitZone.ACE_Medical_ShouldGrantSecondChance()) + { + // Put kill on callqueue to avoid potential crash (e.g. when called from HitZone::OnDamageStateChanged) + GetGame().GetCallqueue().Call(damageManager.Kill, damageManager.GetInstigator()); + return; + } + + damageManager.ACE_Medical_OnSecondChanceGranted(); + Register(damageManager); + } + + //------------------------------------------------------------------------------------------------ + protected void Register(SCR_CharacterDamageManagerComponent damageManager) + { + // Only directly touch queue while no updating is going on + if (m_bIsUpdating) + { + m_aDamageManagersToRegister.Insert(damageManager); + m_aDamageManagersToUnregister.RemoveItem(damageManager); + m_bScheduledQueueUpdate = true; + } + else + { + if (!m_aDamageManagers.Contains(damageManager)) + m_aDamageManagers.Insert(damageManager); + + if (!IsEnabled()) + Enable(true); + } + } + + //------------------------------------------------------------------------------------------------ + void Unregister(SCR_CharacterDamageManagerComponent damageManager) + { + // Only directly touch queue while no updating is going on + if (m_bIsUpdating) + { + m_aDamageManagersToUnregister.Insert(damageManager); + m_aDamageManagersToRegister.RemoveItem(damageManager); + m_bScheduledQueueUpdate = true; + } + else + { + m_aDamageManagers.RemoveItem(damageManager); + + if (m_aDamageManagers.IsEmpty()) + Enable(false); + } + } +} diff --git a/addons/medical/thumbnail.png b/addons/medical_core/thumbnail.png similarity index 100% rename from addons/medical/thumbnail.png rename to addons/medical_core/thumbnail.png