Implementation of totem of undying behaviour (#5111)
* notchian totem of undying * ... * .... * Update src/Entities/Pawn.cpp Co-authored-by: Alexander Harkness <me@bearbin.net> * DeductTotem func * fixed build errors * Added myself to CONTRIBUTORS * Small changes Co-authored-by: Peter <peter@cassoviacode.com> Co-authored-by: Alexander Harkness <me@bearbin.net> Co-authored-by: Tiger Wang <ziwei.tiger@outlook.com>
This commit is contained in:
parent
49ef21d650
commit
59e906ec6c
@ -17,6 +17,7 @@ Bond_009
|
||||
changyongGuo
|
||||
Cocosushi6
|
||||
derouinw
|
||||
dImrich (Damian Imrich)
|
||||
Diusrex
|
||||
Duralex
|
||||
Earboxer (Zach DeCook)
|
||||
|
@ -146,6 +146,8 @@ public:
|
||||
esFireworkExploding = 17,
|
||||
// Passive mob is in "love mode"
|
||||
esMobInLove = 18,
|
||||
// Plays totem of undying animation and sound
|
||||
esTotemOfUndying = 35,
|
||||
} ;
|
||||
|
||||
static const int FIRE_TICKS_PER_DAMAGE = 10; ///< Ticks to wait between damaging an entity when it stands in fire
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -71,6 +71,7 @@ public:
|
||||
cEntityEffect * GetEntityEffect(cEntityEffect::eType a_EffectType) const;
|
||||
|
||||
protected:
|
||||
|
||||
typedef std::map<cEntityEffect::eType, std::unique_ptr<cEntityEffect>> tEffectMap;
|
||||
tEffectMap m_EntityEffects;
|
||||
|
||||
@ -83,4 +84,8 @@ private:
|
||||
|
||||
/** A list of all monsters that are targeting this pawn. */
|
||||
std::vector<cMonster*> m_TargetingMe;
|
||||
|
||||
/** Attempt to activate a Totem of Undying.
|
||||
If activation for the given type of damage was successful, consumes the totem and returns true. */
|
||||
bool DeductTotem(eDamageType a_DamageType);
|
||||
} ; // tolua_export
|
||||
|
Loading…
Reference in New Issue
Block a user