summaryrefslogtreecommitdiffstats
path: root/source/cClientHandle.h
blob: 56b9382e81c797b73596d0cce2250a7d2fc01cdd (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
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

// cClientHandle.h

// Interfaces to the cClientHandle class representing a client connected to this server. The client need not be a player yet





#pragma once
#ifndef CCLIENTHANDLE_H_INCLUDED
#define CCLIENTHANDLE_H_INCLUDED

#include "packets/cPacket.h"
#include "Vector3d.h"

#include "packets/cPacket_KeepAlive.h"
#include "packets/cPacket_PlayerPosition.h"
#include "packets/cPacket_Respawn.h"
#include "packets/cPacket_RelativeEntityMoveLook.h"
#include "packets/cPacket_Chat.h"
#include "packets/cPacket_Login.h"
#include "packets/cPacket_WindowClick.h"
#include "packets/cPacket_PlayerMoveLook.h"
#include "packets/cPacket_TimeUpdate.h"
#include "packets/cPacket_BlockDig.h"
#include "packets/cPacket_Handshake.h"
#include "packets/cPacket_PlayerLook.h"
#include "packets/cPacket_ArmAnim.h"
#include "packets/cPacket_BlockPlace.h"
#include "packets/cPacket_Flying.h"
#include "packets/cPacket_Disconnect.h"
#include "packets/cPacket_PickupSpawn.h"
#include "packets/cPacket_ItemSwitch.h"
#include "packets/cPacket_EntityEquipment.h"
#include "packets/cPacket_CreativeInventoryAction.h"
#include "packets/cPacket_NewInvalidState.h"
#include "packets/cPacket_UseEntity.h"
#include "packets/cPacket_WindowClose.h"
#include "packets/cPacket_UpdateSign.h"
#include "packets/cPacket_Ping.h"
#include "packets/cPacket_PlayerListItem.h"





// class Game;
class cChunk;
class cPlayer;
class cRedstone;





class cClientHandle							// tolua_export
{											// tolua_export
public:
	enum ENUM_PRIORITY
	{
		E_PRIORITY_LOW,
		E_PRIORITY_NORMAL
	};

	static const int MAXBLOCKCHANGEINTERACTIONS = 10; // 5 didn't help, 10 seems to have done the trick

	cClientHandle(const cSocket & a_Socket);
	~cClientHandle();

	static const int VIEWDISTANCE = 17; // MUST be odd number or CRASH!
	static const int GENERATEDISTANCE = 2; // Server generates this many chunks AHEAD of player sight.

	const cSocket & GetSocket();
	cPlayer* GetPlayer() { return m_Player; }	// tolua_export

	void Kick(const AString & a_Reason); //tolua_export
	void Authenticate(void);  // Called by cAuthenticator when the user passes authentication

	void AddPacket( cPacket * a_Packet );
	void HandlePendingPackets();

	void StreamChunks();
	void StreamChunksSmart( cChunk** a_Chunks, unsigned int a_NumChunks );
	void RemoveFromAllChunks();

	inline void SetLoggedIn( bool a_bLoggedIn ) { m_bLoggedIn = a_bLoggedIn; }
	inline bool IsLoggedIn() { return m_bLoggedIn; }

	void Tick(float a_Dt);

	bool IsDestroyed() { return m_bDestroyed; }
	void Destroy();

	cChunk* m_LoadedChunks[VIEWDISTANCE*VIEWDISTANCE];

	void Send( const cPacket & a_Packet, ENUM_PRIORITY a_Priority = E_PRIORITY_NORMAL );

	static void SendThread( void *lpParam );
	static void ReceiveThread( void *lpParam );

	const AString & GetUsername(void) const;
	
	inline short GetPing() { return m_Ping; }

private:

	int m_ProtocolVersion;
	AString m_Username;
	AString m_Password;

	PacketList m_PendingParsePackets;
	PacketList m_PendingNrmSendPackets;
	PacketList m_PendingLowSendPackets;

	cThread * m_pReceiveThread;
	cThread * m_pSendThread;

	cSocket m_Socket;

	cCriticalSection m_CriticalSection;
	cCriticalSection m_SendCriticalSection;
	cCriticalSection m_SocketCriticalSection;
	cSemaphore       m_Semaphore;

	Vector3d m_ConfirmPosition;

	cPacket * m_PacketMap[256];

	bool      m_bDestroyed;
	cPlayer * m_Player;
	bool      m_bKicking;

	float m_TimeLastPacket;

	short m_Ping;
	int   m_PingID;
	long long m_PingStartTime;
	long long m_LastPingTime;
	static const unsigned short PING_TIME_MS = 1000; //minecraft sends 1 per 20 ticks (1 second or every 1000 ms)

	bool m_bLoggedIn;
	bool m_bPositionConfirmed;
	bool m_bSendLoginResponse;

	bool m_bKeepThreadGoing;

	void HandlePacket(cPacket * a_Packet);
	
	// Packets handled while !m_bLoggedIn:
	void HandlePing         (void);
	void HandleHandshake    (cPacket_Handshake *      a_Packet);
	void HandleLogin        (cPacket_Login *          a_Packet);
	void HandleMoveLookLogin(cPacket_PlayerMoveLook * a_Packet);  // While !m_bLoggedIn
	void HandleDefaultLogin (cPacket *                a_Packet);  // the default case
	
	// Packets handled while !m_bPositionConfirmed:
	void HandleMoveLookConfirm(cPacket_PlayerMoveLook * a_Packet);  // While !m_bPositionConfirmed
	
	// Packets handled while m_bPositionConfirmed (normal gameplay):
	void HandleCreativeInventory(cPacket_CreativeInventoryAction * a_Packet);
	void HandlePlayerPos        (cPacket_PlayerPosition *          a_Packet);
	void HandleBlockDig         (cPacket_BlockDig *                a_Packet);
	void HandleBlockPlace       (cPacket_BlockPlace *              a_Packet);
	void HandlePickupSpawn      (cPacket_PickupSpawn *             a_Packet);
	void HandleChat             (cPacket_Chat *                    a_Packet);
	void HandlePlayerLook       (cPacket_PlayerLook *              a_Packet);
	void HandlePlayerMoveLook   (cPacket_PlayerMoveLook *          a_Packet);  // While m_bPositionConfirmed (normal gameplay)
	void HandleAnimation        (cPacket_ArmAnim *                 a_Packet);
	void HandleItemSwitch       (cPacket_ItemSwitch *              a_Packet);
	void HandleWindowClose      (cPacket_WindowClose *             a_Packet);
	void HandleWindowClick      (cPacket_WindowClick *             a_Packet);
	void HandleUpdateSign       (cPacket_UpdateSign *              a_Packet);
	void HandleUseEntity        (cPacket_UseEntity *               a_Packet);
	void HandleRespawn          (void);
	void HandleDisconnect       (cPacket_Disconnect *              a_Packet);
	void HandleKeepAlive        (cPacket_KeepAlive *               a_Packet);

	/// Returns true if the rate block interactions is within a reasonable limit (bot protection)
	bool CheckBlockInteractionsRate(void);
	
	void SendLoginResponse();
};										// tolua_export




#endif  // CCLIENTHANDLE_H_INCLUDED