summaryrefslogtreecommitdiffstats
path: root/src/Entities/Pawn.h
blob: 32211835193f215565ace31dc74bbe8c8886c739 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138

#pragma once

#include "Entity.h"
#include "EntityEffect.h"

// fwd cMonster
class cMonster;





// tolua_begin
class cPawn : public cEntity
{
	// tolua_end
	using Super = cEntity;

  public:
	CLASS_PROTODEF(cPawn)

	cPawn(eEntityType a_EntityType, float a_Width, float a_Height);

	virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
	virtual void KilledBy(TakeDamageInfo & a_TDI) override;

	virtual bool IsFireproof(void) const override;
	virtual bool IsInvisible() const override;
	virtual void HandleAir(void) override;
	virtual void HandleFalling(void);
	virtual void OnRemoveFromWorld(cWorld & a_World) override;

	/** Handles farmland trampling when hitting the ground.
	Algorithm:
	fall height <= 0.6875 blocks: no trampling
	fall height > 0.6875 and <= 1.0625: 25% chance of trampling
	fall height > 1.0625 and <= 1.5625: 66% chance of trampling
	fall height > 1.5625: always trample
	The values may differ from vanilla, they were determined experimentally.
	Additionaly, mobs smaller than 0.512 cubic blocks won't trample.
	*/
	void HandleFarmlandTrampling(double a_FallHeight, BLOCKTYPE a_BlockAtFoot, BLOCKTYPE a_BlockBelow);

	/** Tells all pawns which are targeting us to stop targeting us. */
	void StopEveryoneFromTargetingMe();



	// tolua_begin

	/** Applies an entity effect.
	Checks with plugins if they allow the addition.
	a_EffectIntensity is the level of the effect (0 = Potion I, 1 = Potion II, etc).
	a_DistanceModifier is the scalar multiplied to the potion duration (only applies to splash potions).
	*/
	void AddEntityEffect(
		cEntityEffect::eType a_EffectType,
		int a_EffectDurationTicks,
		short a_EffectIntensity,
		double a_DistanceModifier = 1
	);

	/** Removes a currently applied entity effect. */
	void RemoveEntityEffect(cEntityEffect::eType a_EffectType);

	/** Returns true, if the entity effect is currently applied. */
	bool HasEntityEffect(cEntityEffect::eType a_EffectType) const;

	/** Removes all currently applied entity effects (used when drinking milk) */
	void ClearEntityEffects(void);

	// tolua_end

	/** Remove the monster from the list of monsters targeting this pawn. */
	void NoLongerTargetingMe(cMonster * a_Monster);

	/** Add the monster to the list of monsters targeting this pawn. (Does not check if already in list!) */
	void TargetingMe(cMonster * a_Monster);

	/** Returns all entity effects */
	std::map<cEntityEffect::eType, cEntityEffect *> GetEntityEffects() const;

	/** Returns the entity effect, if it is currently applied or nullptr if not. */
	cEntityEffect * GetEntityEffect(cEntityEffect::eType a_EffectType) const;

	// tolua_begin

	static bool FindTeleportDestination(
		cWorld & a_World,
		const int a_HeightRequired,
		const unsigned int a_NumTries,
		Vector3d & a_Destination,
		const Vector3i a_MinBoxCorner,
		const Vector3i a_MaxBoxCorner
	);

	static bool FindTeleportDestination(
		cWorld & a_World,
		const int a_HeightRequired,
		const unsigned int a_NumTries,
		Vector3d & a_Destination,
		const cBoundingBox a_BoundingBox
	);

	/** Used by enderman and chorus fruit.
	Checks for valid destinations in a cube of length 2 * a_HalfCubeWidth centred at a_Centre.
	Returns true and places destination in a_Destination if successful.
	Returns false if destination could be found after a_NumTries attempts.
	Details at: https://minecraft.wiki/w/Enderman#Teleportation. */
	static bool FindTeleportDestination(
		cWorld & a_World,
		const int a_HeightRequired,
		const unsigned int a_NumTries,
		Vector3d & a_Destination,
		Vector3i a_Centre,
		const int a_HalfCubeWidth
	);

	// tolua_end

  protected:
	typedef std::map<cEntityEffect::eType, std::unique_ptr<cEntityEffect>> tEffectMap;
	tEffectMap m_EntityEffects;

	double m_LastGroundHeight;
	bool m_bTouchGround;

	virtual void ResetPosition(Vector3d a_NewPosition) override;

  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