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
|
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
#ifndef GAME_SERVER_ENTITIES_CHARACTER_H
#define GAME_SERVER_ENTITIES_CHARACTER_H
#include <game/server/entity.h>
#include <game/generated/server_data.h>
#include <game/generated/protocol.h>
#include <game/gamecore.h>
enum
{
WEAPON_GAME = -3, // team switching etc
WEAPON_SELF = -2, // console kill command
WEAPON_WORLD = -1, // death tiles etc
};
class CCharacter : public CEntity
{
MACRO_ALLOC_POOL_ID()
public:
//character's size
static const int ms_PhysSize = 28;
CCharacter(CGameWorld *pWorld);
~CCharacter();
virtual void Reset();
virtual void Destroy();
virtual void Tick();
virtual void TickDefered();
virtual void TickPaused();
virtual void Snap(int SnappingClient);
bool IsGrounded();
void SetWeapon(int W);
void HandleWeaponSwitch();
void DoWeaponSwitch();
void HandleWeapons();
void HandleNinja();
void OnPredictedInput(CNetObj_PlayerInput *pNewInput);
void OnDirectInput(CNetObj_PlayerInput *pNewInput);
void ResetInput();
void FireWeapon();
void Die(int Killer, int Weapon);
bool TakeDamage(vec2 Force, int Dmg, int From, int Weapon);
bool Spawn(class CPlayer *pPlayer, vec2 Pos);
bool Remove();
bool IncreaseHealth(int Amount);
bool IncreaseArmor(int Amount);
bool GiveWeapon(int Weapon, int Ammo);
void GiveNinja();
void GiveAmmo(int Weapon, int Ammo);
void SetEmote(int Emote, int Tick);
bool IsAlive() const { return m_Alive; }
class CPlayer *GetPlayer() { return m_pPlayer; }
void Freeze(int Tick);
int m_FreezeTicks;
// bot detection
bool HasBeenThereRecently(vec2 v, const vec2 *&pos, int firstTick, int lastTick) const;
bool AimedAtCharRecently(vec2 v, const CCharacter *c, const vec2 *&pos, const vec2 *&posVictim, int firstTick);
float HowCloseToXRecently(vec2 x, const vec2 *&pos, int firstTick);
private:
// player controlling this character
class CPlayer *m_pPlayer;
bool m_Alive;
// weapon info
CEntity *m_apHitObjects[10];
int m_NumObjectsHit;
struct WeaponStat
{
int m_AmmoRegenStart;
int m_Ammo;
int m_Ammocost;
bool m_Got;
} m_aWeapons[NUM_WEAPONS];
int m_ActiveWeapon;
int m_LastWeapon;
int m_QueuedWeapon;
int m_ReloadTimer;
int m_AttackTick;
int m_DamageTaken;
int m_EmoteType;
int m_EmoteStop;
// last tick that the player took any action ie some input
int m_LastAction;
int m_LastNoAmmoSound;
// these are non-heldback inputs
CNetObj_PlayerInput m_LatestPrevInput;
CNetObj_PlayerInput m_LatestInput;
// input
CNetObj_PlayerInput m_PrevInput;
CNetObj_PlayerInput m_Input;
int m_NumInputs;
int m_Jumped;
int m_DamageTakenTick;
int m_Health;
int m_Armor;
// ninja
struct
{
vec2 m_ActivationDir;
int m_ActivationTick;
int m_CurrentMoveTime;
int m_OldVelAmount;
} m_Ninja;
// the player core for the physics
CCharacterCore m_Core;
// info for dead reckoning
int m_ReckoningTick; // tick that we are performing dead reckoning From
CCharacterCore m_SendCore; // core that we should send
CCharacterCore m_ReckoningCore; // the dead reckoning core
// bot detection
vec2 *m_LastPositions;
int m_LastPositionsSize;
};
#endif
|