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
|
changyongGuo
|
||||||
Cocosushi6
|
Cocosushi6
|
||||||
derouinw
|
derouinw
|
||||||
|
dImrich (Damian Imrich)
|
||||||
Diusrex
|
Diusrex
|
||||||
Duralex
|
Duralex
|
||||||
Earboxer (Zach DeCook)
|
Earboxer (Zach DeCook)
|
||||||
|
@ -146,6 +146,8 @@ public:
|
|||||||
esFireworkExploding = 17,
|
esFireworkExploding = 17,
|
||||||
// Passive mob is in "love mode"
|
// Passive mob is in "love mode"
|
||||||
esMobInLove = 18,
|
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
|
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)
|
void cPawn::KilledBy(TakeDamageInfo & a_TDI)
|
||||||
{
|
{
|
||||||
ClearEntityEffects();
|
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);
|
Super::KilledBy(a_TDI);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,3 +504,38 @@ void cPawn::ResetPosition(Vector3d a_NewPosition)
|
|||||||
Super::ResetPosition(a_NewPosition);
|
Super::ResetPosition(a_NewPosition);
|
||||||
m_LastGroundHeight = GetPosY();
|
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;
|
cEntityEffect * GetEntityEffect(cEntityEffect::eType a_EffectType) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
typedef std::map<cEntityEffect::eType, std::unique_ptr<cEntityEffect>> tEffectMap;
|
typedef std::map<cEntityEffect::eType, std::unique_ptr<cEntityEffect>> tEffectMap;
|
||||||
tEffectMap m_EntityEffects;
|
tEffectMap m_EntityEffects;
|
||||||
|
|
||||||
@ -83,4 +84,8 @@ private:
|
|||||||
|
|
||||||
/** A list of all monsters that are targeting this pawn. */
|
/** A list of all monsters that are targeting this pawn. */
|
||||||
std::vector<cMonster*> m_TargetingMe;
|
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
|
} ; // tolua_export
|
||||||
|
Loading…
Reference in New Issue
Block a user