173 lines
5.4 KiB
C++
173 lines
5.4 KiB
C++
|
|
#pragma once
|
|
|
|
#include "Entity.h"
|
|
#include "Item.h"
|
|
|
|
|
|
|
|
|
|
|
|
// fwd:
|
|
class cPawn;
|
|
|
|
|
|
|
|
|
|
|
|
// tolua_begin
|
|
enum eDamageType
|
|
{
|
|
// Canonical names for the types (as documented in the plugin wiki):
|
|
dtAttack, // Being attacked by a mob
|
|
dtLightning, // Hit by a lightning strike
|
|
dtFalling, // Falling down; dealt when hitting the ground
|
|
dtDrowning, // Drowning in water / lava
|
|
dtSuffocating, // Suffocating inside a block
|
|
dtStarving, // Hunger
|
|
dtCactusContact, // Contact with a cactus block
|
|
dtLavaContact, // Contact with a lava block
|
|
dtPoisoning, // Having the poison effect
|
|
dtOnFire, // Being on fire
|
|
dtFireContact, // Standing inside a fire block
|
|
dtInVoid, // Falling into the Void (Y < 0)
|
|
dtPotionOfHarming,
|
|
|
|
// Some common synonyms:
|
|
dtPawnAttack = dtAttack,
|
|
dtEntityAttack = dtAttack,
|
|
dtMob = dtAttack,
|
|
dtMobAttack = dtAttack,
|
|
dtFall = dtFalling,
|
|
dtDrown = dtDrowning,
|
|
dtSuffocation = dtSuffocating,
|
|
dtStarvation = dtStarving,
|
|
dtHunger = dtStarving,
|
|
dtCactus = dtCactusContact,
|
|
dtCactuses = dtCactusContact,
|
|
dtCacti = dtCactusContact,
|
|
dtLava = dtLavaContact,
|
|
dtPoison = dtPoisoning,
|
|
dtBurning = dtOnFire,
|
|
dtInFire = dtFireContact,
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
struct TakeDamageInfo
|
|
{
|
|
eDamageType DamageType; // Where does the damage come from? Being hit / on fire / contact with cactus / ...
|
|
cPawn * Attacker; // The attacking pawn; valid only for dtAttack
|
|
int RawDamage; // What damage would the receiver get without any armor. Usually: attacker mob type + weapons
|
|
int FinalDamage; // What actual damage will be received. Usually: m_RawDamage minus armor
|
|
Vector3d Knockback; // The amount and direction of knockback received from the damage
|
|
// TODO: Effects - list of effects that the hit is causing. Unknown representation yet
|
|
} ;
|
|
// tolua_end
|
|
|
|
|
|
|
|
|
|
|
|
// tolua_begin
|
|
class cPawn :
|
|
public cEntity
|
|
{
|
|
// tolua_end
|
|
typedef cEntity super;
|
|
|
|
public:
|
|
CLASS_PROTODEF(cPawn);
|
|
|
|
cPawn(eEntityType a_EntityType);
|
|
|
|
virtual void Tick(float a_Dt, MTRand & a_TickRandom) override;
|
|
|
|
// tolua_begin
|
|
|
|
/// Teleports to the entity specified
|
|
virtual void TeleportToEntity(cEntity & a_Entity);
|
|
|
|
/// Teleports to the coordinates specified
|
|
virtual void TeleportTo(double a_PosX, double a_PosY, double a_PosZ);
|
|
|
|
/// Heals the specified amount of HPs
|
|
void Heal(int a_HitPoints);
|
|
|
|
/// Returns the health of this pawn
|
|
int GetHealth(void) const { return m_Health; }
|
|
|
|
/// Makes this pawn take damage from an attack by a_Attacker. Damage values are calculated automatically and DoTakeDamage() called
|
|
void TakeDamage(cPawn & a_Attacker);
|
|
|
|
/// Makes this pawn take the specified damage. The final damage is calculated using current armor, then DoTakeDamage() called
|
|
void TakeDamage(eDamageType a_DamageType, cPawn * a_Attacker, int a_RawDamage, double a_KnockbackAmount);
|
|
|
|
/// Makes this pawn take the specified damage. The values are packed into a TDI, knockback calculated, then sent through DoTakeDamage()
|
|
void TakeDamage(eDamageType a_DamageType, cPawn * a_Attacker, int a_RawDamage, int a_FinalDamage, double a_KnockbackAmount);
|
|
|
|
/// Makes this pawn take damage specified in the a_TDI. The TDI is sent through plugins first, then applied
|
|
virtual void DoTakeDamage(TakeDamageInfo & a_TDI);
|
|
|
|
/// Called when the health drops below zero. a_Killer may be NULL (environmental damage)
|
|
virtual void KilledBy(cPawn * a_Killer);
|
|
|
|
/// Returns the hitpoints that this pawn can deal to a_Receiver using its equipped items
|
|
virtual int GetRawDamageAgainst(const cPawn & a_Receiver);
|
|
|
|
/// Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover
|
|
virtual int GetArmorCoverAgainst(const cPawn * a_Attacker, eDamageType a_DamageType, int a_RawDamage);
|
|
|
|
/// Returns the knockback amount that the currently equipped items would cause to a_Receiver on a hit
|
|
virtual double GetKnockbackAmountAgainst(const cPawn & a_Receiver);
|
|
|
|
/// Returns the curently equipped weapon; empty item if none
|
|
virtual cItem GetEquippedWeapon(void) const { return cItem(); }
|
|
|
|
/// Returns the currently equipped helmet; empty item if nonte
|
|
virtual cItem GetEquippedHelmet(void) const { return cItem(); }
|
|
|
|
/// Returns the currently equipped chestplate; empty item if nonte
|
|
virtual cItem GetEquippedChestplate(void) const { return cItem(); }
|
|
|
|
/// Returns the currently equipped leggings; empty item if nonte
|
|
virtual cItem GetEquippedLeggings(void) const { return cItem(); }
|
|
|
|
/// Returns the currently equipped boots; empty item if nonte
|
|
virtual cItem GetEquippedBoots(void) const { return cItem(); }
|
|
|
|
// tolua_end
|
|
|
|
/// Returns the list of drops for this pawn when it is killed. May check a_Killer for special handling (sword of looting etc.). Called from KilledBy().
|
|
virtual void GetDrops(cItems & a_Drops, cPawn * a_Killer = NULL);
|
|
|
|
enum MetaData {NORMAL, BURNING, CROUCHED, RIDING, SPRINTING, EATING, BLOCKING};
|
|
|
|
virtual void SetMetaData(MetaData a_MetaData);
|
|
virtual MetaData GetMetaData(void) const { return m_MetaData; }
|
|
|
|
virtual void InStateBurning(float a_Dt);
|
|
|
|
virtual void CheckMetaDataBurn(void);
|
|
|
|
virtual void SetMaxHealth(short a_MaxHealth);
|
|
virtual short GetMaxHealth() { return m_MaxHealth; }
|
|
|
|
protected:
|
|
short m_Health;
|
|
short m_MaxHealth;
|
|
|
|
bool m_bBurnable;
|
|
|
|
MetaData m_MetaData;
|
|
|
|
double m_LastPosX, m_LastPosY, m_LastPosZ;
|
|
Int64 m_TimeLastTeleportPacket; // In ticks
|
|
}; // tolua_export
|
|
|
|
|
|
|
|
|