From 7e13d17cc1fb4a7958f409a7b291ec8bc9cfadec Mon Sep 17 00:00:00 2001 From: Ijostrom Date: Sun, 10 May 2026 07:34:15 -0700 Subject: [PATCH] feat(Core/Config): Resurrection durability loss percentage (#25715) Co-authored-by: Ijostrom --- src/server/apps/worldserver/worldserver.conf.dist | 8 ++++++++ src/server/game/Handlers/NPCHandler.cpp | 4 +++- src/server/game/World/WorldConfig.cpp | 2 ++ src/server/game/World/WorldConfig.h | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index f0d4ff84b4..9fdd35910a 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -2606,6 +2606,14 @@ DurabilityLoss.InPvP = 0 DurabilityLoss.OnDeath = 10 +# +# DurabilityLoss.OnSpiritResurrect +# Description: Durability loss percentage on spirit healer resurrection. Does not effect PvP +# spirit healers. +# Default: 25 + +DurabilityLoss.OnSpiritResurrect = 25 + # # DurabilityLossChance.Damage # Description: Chance to lose durability on one equipped item from damage. diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 57d560807f..d2c0383cc9 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -262,7 +262,9 @@ void WorldSession::SendSpiritResurrect() { _player->ResurrectPlayer(0.5f, true); - _player->DurabilityLossAll(0.25f, true); + float durabilityLossOnSpiritResurrect = sWorld->getRate(RATE_DURABILITY_LOSS_ON_SPIRIT_RESURRECT) / 100.0f; + if (durabilityLossOnSpiritResurrect) + _player->DurabilityLossAll(durabilityLossOnSpiritResurrect, true); // get corpse nearest graveyard GraveyardStruct const* corpseGrave = nullptr; diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index b9a9fb473e..243e134992 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -138,6 +138,8 @@ void WorldConfig::BuildConfigCache() SetConfigValue(RATE_DURABILITY_LOSS_ON_DEATH, "DurabilityLoss.OnDeath", 10.0f, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0.0f && value <= 100.0f; }, ">= 0 && <= 100"); + SetConfigValue(RATE_DURABILITY_LOSS_ON_SPIRIT_RESURRECT, "DurabilityLoss.OnSpiritResurrect", 25.0f, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0.0f && value <= 100.0f; }, ">= 0 && <= 100"); + SetConfigValue(RATE_DURABILITY_LOSS_DAMAGE, "DurabilityLossChance.Damage", 0.5f, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0.0f; }, ">= 0"); SetConfigValue(RATE_DURABILITY_LOSS_ABSORB, "DurabilityLossChance.Absorb", 0.5f, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0.0f; }, ">= 0"); SetConfigValue(RATE_DURABILITY_LOSS_PARRY, "DurabilityLossChance.Parry", 0.05f, ConfigValueCache::Reloadable::Yes, [](float const& value) { return value >= 0.0f; }, ">= 0"); diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index 20c5fa6e81..8d95ed5cc0 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -480,6 +480,7 @@ enum ServerConfigs RATE_CORPSE_DECAY_LOOTED, RATE_INSTANCE_RESET_TIME, RATE_DURABILITY_LOSS_ON_DEATH, + RATE_DURABILITY_LOSS_ON_SPIRIT_RESURRECT, RATE_DURABILITY_LOSS_DAMAGE, RATE_DURABILITY_LOSS_PARRY, RATE_DURABILITY_LOSS_ABSORB,