diff options
Diffstat (limited to 'src/Entities/Pawn.cpp')
-rw-r--r-- | src/Entities/Pawn.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/Entities/Pawn.cpp b/src/Entities/Pawn.cpp index 35efe05ce..6f33a5eca 100644 --- a/src/Entities/Pawn.cpp +++ b/src/Entities/Pawn.cpp @@ -111,6 +111,20 @@ void cPawn::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) void cPawn::KilledBy(TakeDamageInfo & a_TDI) { ClearEntityEffects(); + + // Is death eligible for totem reanimation? + if (DeductTotem(a_TDI.DamageType)) + { + m_World->BroadcastEntityStatus(*this, esTotemOfUndying); + + AddEntityEffect(cEntityEffect::effAbsorption, 100, 1); + AddEntityEffect(cEntityEffect::effRegeneration, 900, 1); + AddEntityEffect(cEntityEffect::effFireResistance, 800, 0); + + m_Health = 1; + return; + } + Super::KilledBy(a_TDI); } @@ -490,3 +504,38 @@ void cPawn::ResetPosition(Vector3d a_NewPosition) Super::ResetPosition(a_NewPosition); m_LastGroundHeight = GetPosY(); } + + + + + +bool cPawn::DeductTotem(const eDamageType a_DamageType) +{ + if ((a_DamageType == dtAdmin) || (a_DamageType == dtInVoid)) + { + // Beyond saving: + return false; + } + + if (!IsPlayer()) + { + // TODO: implement when mobs will be able to pick up items based on CanPickUpLoot attribute: + return false; + } + + // If the player is holding a totem of undying in their off-hand or + // main-hand slot and receives otherwise fatal damage, the totem saves the player from death. + + auto & inv = static_cast<cPlayer *>(this)->GetInventory(); + if (inv.GetEquippedItem().m_ItemType == E_ITEM_TOTEM_OF_UNDYING) + { + inv.SetEquippedItem({}); + return true; + } + if (inv.GetShieldSlot().m_ItemType == E_ITEM_TOTEM_OF_UNDYING) + { + inv.SetShieldSlot({}); + return true; + } + return false; +} |