summaryrefslogtreecommitdiffstats
path: root/src/Entities/ProjectileEntity.h
blob: c74fdd6afecbc4877d9cd2976ba989bbbffe29cb (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
139
140
141
142
143
144
145
146
147

// ProjectileEntity.h

// Declares the cProjectileEntity class representing the common base class for projectiles





#pragma once

#include "Entity.h"





// tolua_begin

class cProjectileEntity :
	public cEntity
{
	// tolua_end

	using super = cEntity;

	// tolua_begin


public:

	/** The kind of the projectile. The numbers correspond to the network type ID used for spawning them in the protocol. */
	enum eKind
	{
		pkArrow         = 60,
		pkSnowball      = 61,
		pkEgg           = 62,
		pkGhastFireball = 63,
		pkFireCharge    = 64,
		pkEnderPearl    = 65,
		pkExpBottle     = 75,
		pkSplashPotion  = 73,
		pkFirework      = 76,
		pkWitherSkull   = 66,
		pkFishingFloat  = 90,
	} ;

	// tolua_end

	CLASS_PROTODEF(cProjectileEntity)

	cProjectileEntity(eKind a_Kind, cEntity * a_Creator, Vector3d a_Pos, double a_Width, double a_Height);
	cProjectileEntity(eKind a_Kind, cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed, double a_Width, double a_Height);

	/** Creates a new instance of the specified projectile entity.
	a_Item is the item from which the projectile originated (such as firework or arrow). */
	static std::unique_ptr<cProjectileEntity> Create(
		eKind a_Kind,
		cEntity * a_Creator,
		Vector3d a_Pos,
		const cItem * a_Item,
		const Vector3d * a_Speed = nullptr
	);

	/** OBSOLETE, use the Vector3d-based overload instead.
	Creates a new instance of the specified projectile entity.
	a_Item is the item from which the projectile originated (such as firework or arrow). */
	static std::unique_ptr<cProjectileEntity> Create(
		eKind a_Kind,
		cEntity * a_Creator,
		double a_PosX, double a_PosY, double a_PosZ,
		const cItem * a_Item,
		const Vector3d * a_Speed = nullptr
	)
	{
		return Create(a_Kind, a_Creator, {a_PosX, a_PosY, a_PosZ}, a_Item, a_Speed);
	}

	/** Called by the physics blocktracer when the entity hits a solid block, the hit position and the face hit (BLOCK_FACE_) is given */
	virtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace);

	/** Called by the physics blocktracer when the entity hits another entity */
	virtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos);

	/** Called by Chunk when the projectile is eligible for player collection */
	virtual void CollectedBy(cPlayer & a_Dest);

	// tolua_begin

	/** Returns the kind of the projectile (fast class identification) */
	eKind GetProjectileKind(void) const { return m_ProjectileKind; }

	/** Returns the unique ID of the entity who created this projectile
	May return an ID <0
	*/
	UInt32 GetCreatorUniqueID(void) { return m_CreatorData.m_UniqueID; }

	/** Returns the name of the player that created the projectile
	Will be empty for non-player creators
	*/
	AString GetCreatorName(void) const { return m_CreatorData.m_Name; }

	/** Returns the string that is used as the entity type (class name) in MCA files */
	AString GetMCAClassName(void) const;

	/** Returns true if the projectile has hit the ground and is stuck there */
	bool IsInGround(void) const { return m_IsInGround; }

	// tolua_end

	/** Sets the internal InGround flag. To be used by MCA loader only! */
	void SetIsInGround(bool a_IsInGround) { m_IsInGround = a_IsInGround; }

protected:

	/** A structure that stores the Entity ID and Playername of the projectile's creator
	Used to migitate invalid pointers caused by the creator being destroyed. */
	struct CreatorData
	{
		CreatorData(UInt32 a_UniqueID, const AString & a_Name, const cEnchantments & a_Enchantments) :
			m_UniqueID(a_UniqueID),
			m_Name(a_Name),
			m_Enchantments(a_Enchantments)
		{
		}

		const UInt32 m_UniqueID;
		AString m_Name;
		cEnchantments m_Enchantments;
	};

	/** The type of projectile I am */
	eKind m_ProjectileKind;

	/** The structure for containing the entity ID and name who has created this projectile
	The ID and / or name may be nullptr (e.g. for dispensers / mobs). */
	CreatorData m_CreatorData;

	/** True if the projectile has hit the ground and is stuck there */
	bool m_IsInGround;

	// cEntity overrides:
	virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
	virtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
	virtual void SpawnOn(cClientHandle & a_Client) override;

} ;  // tolua_export