aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/LivingEntity.h
blob: ecc819df909fd595f827d457992d91d908e0b94a (plain)
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#pragma once
using namespace std;

#include "Entity.h"
#include "MobType.h"
#include "GoalSelector.h"
#include "SharedConstants.h"

class CombatTracker;
class AttributeInstance;
class AttributeModifier;
class MobEffectInstance;
class BaseAttributeMap;
class Team;
class Attribute;
class MobEffect;
class HitResult;
class Vec3;

class LivingEntity : public Entity
{
	friend class MobSpawner;
protected:
	// 4J - added for common ctor code
	void _init();
public:
	// 4J-PB - added to replace (e instanceof Type), avoiding dynamic casts
	eINSTANCEOF GetType()						{ return eTYPE_LIVINGENTITY;}
	static Entity *create(Level *level) { return nullptr; }

private:
	static AttributeModifier *SPEED_MODIFIER_SPRINTING;

public:
	static const int SLOT_WEAPON = 0;
	static const int SLOT_BOOTS = 1;
	static const int SLOT_LEGGINGS = 2;
	static const int SLOT_CHEST = 3;
	static const int SLOT_HELM = 4;

	static const int SWING_DURATION = 6;
	static const int PLAYER_HURT_EXPERIENCE_TIME = SharedConstants::TICKS_PER_SECOND * 5;

private:
	static const double MIN_MOVEMENT_DISTANCE;

public:
	static const int DATA_HEALTH_ID = 6;
	static const int DATA_EFFECT_COLOR_ID = 7;
	static const int DATA_EFFECT_AMBIENCE_ID = 8;
	static const int DATA_ARROW_COUNT_ID = 9;

private:
	BaseAttributeMap *attributes;
	CombatTracker *combatTracker;
	unordered_map<int, MobEffectInstance *> activeEffects;
	ItemInstanceArray lastEquipment;

public:
	bool swinging;
	int swingTime;
	int removeArrowTime;
	float lastHealth;

	int hurtTime;
	int hurtDuration;
	float hurtDir;
	int deathTime;
	int attackTime;
	float oAttackAnim, attackAnim;

	float walkAnimSpeedO;
	float walkAnimSpeed;
	float walkAnimPos;
	int invulnerableDuration;
	float oTilt, tilt;
	float timeOffs;
	float rotA;
	float yBodyRot, yBodyRotO;
	float yHeadRot, yHeadRotO;
	float flyingSpeed;

protected:
	shared_ptr<Player> lastHurtByPlayer;
	int lastHurtByPlayerTime;
	bool dead;
	int noActionTime;
	float oRun, run;
	float animStep, animStepO;
	float rotOffs;
	int deathScore;
	float lastHurt;
	bool jumping;

public:
	float xxa;
	float yya;

protected:
	float yRotA;
	int lSteps;
	double lx, ly, lz, lyr, lxr;

private:
	bool effectsDirty;

	shared_ptr<LivingEntity> lastHurtByMob;
	int lastHurtByMobTimestamp;
	shared_ptr<LivingEntity> lastHurtMob;
	int lastHurtMobTimestamp;

	float speed;

protected:
	int noJumpDelay;

private:
	float absorptionAmount;

public:
	LivingEntity(Level* level);
	virtual ~LivingEntity();

protected:
	virtual void defineSynchedData();
	virtual void registerAttributes();
	virtual void checkFallDamage(double ya, bool onGround);

public:
	virtual bool isWaterMob();
	virtual void baseTick();
	virtual bool isBaby();

protected:
	virtual void tickDeath();
	virtual int decreaseAirSupply(int currentSupply);
	virtual int getExperienceReward(shared_ptr<Player> killedBy);
	virtual bool isAlwaysExperienceDropper();

public:
	virtual Random *getRandom();
	virtual shared_ptr<LivingEntity> getLastHurtByMob();
	virtual int getLastHurtByMobTimestamp();
	virtual void setLastHurtByMob(shared_ptr<LivingEntity> hurtBy);
	virtual shared_ptr<LivingEntity> getLastHurtMob();
	virtual int getLastHurtMobTimestamp();
	virtual void setLastHurtMob(shared_ptr<Entity> target);
	virtual int getNoActionTime();
	virtual void addAdditonalSaveData(CompoundTag *entityTag);
	virtual void readAdditionalSaveData(CompoundTag *tag);

protected:
	virtual void tickEffects();

public:
	virtual void removeAllEffects();
	virtual vector<MobEffectInstance *> *getActiveEffects();
	virtual bool hasEffect(int id);
	virtual bool hasEffect(MobEffect *effect);
	virtual MobEffectInstance *getEffect(MobEffect *effect);
	virtual void addEffect(MobEffectInstance *newEffect);
	virtual void addEffectNoUpdate(MobEffectInstance *newEffect); // 4J added
	virtual bool canBeAffected(MobEffectInstance *newEffect);
	virtual bool isInvertedHealAndHarm();
	virtual  void removeEffectNoUpdate(int effectId);
	virtual void removeEffect(int effectId);

protected:
	virtual void onEffectAdded(MobEffectInstance *effect);
	virtual void onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes);
	virtual void onEffectRemoved(MobEffectInstance *effect);

public:
	virtual void heal(float heal);
	virtual float getHealth();
	virtual void setHealth(float health);
	virtual bool hurt(DamageSource *source, float dmg);
	virtual void breakItem(shared_ptr<ItemInstance> itemInstance);
	virtual void die(DamageSource *source);

protected:
	virtual void dropEquipment(bool byPlayer, int playerBonusLevel);

public:
	virtual void knockback(shared_ptr<Entity> source, float dmg, double xd, double zd);

protected:
	virtual int getHurtSound();
	virtual int getDeathSound();

protected:
	virtual void dropRareDeathLoot(int rareLootLevel);
	virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel);

public:
	virtual bool onLadder();
	virtual bool isShootable();
	virtual bool isAlive();
	virtual void causeFallDamage(float distance);
	virtual void animateHurt();
	virtual int getArmorValue();

protected:
	virtual void hurtArmor(float damage);
	virtual float getDamageAfterArmorAbsorb(DamageSource *damageSource, float damage);
	virtual float getDamageAfterMagicAbsorb(DamageSource *damageSource, float damage);
	virtual void actuallyHurt(DamageSource *source, float dmg);

public:
	virtual CombatTracker *getCombatTracker();
	virtual shared_ptr<LivingEntity> getKillCredit();
	virtual float getMaxHealth();
	virtual int getArrowCount();
	virtual void setArrowCount(int count);

private:
	int getCurrentSwingDuration();

public:
	virtual void swing();
	virtual void handleEntityEvent(byte id);

protected:
	virtual void outOfWorld();
	virtual void updateSwingTime();

public:
	virtual AttributeInstance *getAttribute(Attribute *attribute);
	virtual BaseAttributeMap *getAttributes();
	virtual MobType getMobType();

	virtual shared_ptr<ItemInstance> getCarriedItem() = 0;
	virtual shared_ptr<ItemInstance> getCarried(int slot) = 0;
	virtual shared_ptr<ItemInstance> getArmor(int pos) = 0;
	virtual void setEquippedSlot(int slot, shared_ptr<ItemInstance> item) = 0;
	virtual void setSprinting(bool value);

	virtual ItemInstanceArray getEquipmentSlots() = 0;

	virtual Icon *getItemInHandIcon(shared_ptr<ItemInstance> item, int layer);

protected:
	virtual float getSoundVolume();
	virtual float getVoicePitch();
	virtual bool isImmobile();

public:
	virtual void teleportTo(double x, double y, double z);

protected:
	virtual void findStandUpPosition(shared_ptr<Entity> vehicle);
	
public:
	virtual bool shouldShowName();

protected:
	virtual void jumpFromGround();

public:
	virtual void travel(float xa, float ya);

	virtual int getLightColor(float a);		// 4J - added

protected:
	virtual bool useNewAi();

public:
	virtual float getSpeed();
	virtual void setSpeed(float speed);
	virtual bool doHurtTarget(shared_ptr<Entity> target);
	virtual bool isSleeping();
	virtual void tick();

protected:
	virtual float tickHeadTurn(float yBodyRotT, float walkSpeed);

public:
	virtual void aiStep();

protected:
	virtual void newServerAiStep();
	virtual void pushEntities();
	virtual void doPush(shared_ptr<Entity> e);

public:
	virtual void rideTick();
	virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps);

protected:
	virtual void serverAiMobStep();
	virtual void serverAiStep();

public:
	virtual void setJumping(bool jump);
	virtual void take(shared_ptr<Entity> e, int orgCount);
	virtual bool canSee(shared_ptr<Entity> target);


public:
	virtual Vec3 *getLookAngle();
	virtual Vec3 *getViewVector(float a);
	virtual float getAttackAnim(float a);
	virtual Vec3 *getPos(float a);
	virtual HitResult *pick(double range, float a);
	virtual bool isEffectiveAi();

	virtual bool isPickable();
	virtual bool isPushable();
	virtual float getHeadHeight();

protected:
	virtual void markHurt();

public:
	virtual float getYHeadRot();
	virtual void setYHeadRot(float yHeadRot);

	virtual float getAbsorptionAmount();
	virtual void setAbsorptionAmount(float absorptionAmount);
	virtual Team *getTeam();
	virtual bool isAlliedTo(shared_ptr<LivingEntity> other);
	virtual bool isAlliedTo(Team *other);
};