aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/PlayerConnection.h
blob: 0284bc6a2f8c5a56f4a89535b0e94312d54e284d (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
#include "ConsoleInputSource.h"
#include "..\Minecraft.World\PacketListener.h"
#include "..\Minecraft.World\JavaIntHash.h"

class MinecraftServer;
class Connection;
class ServerPlayer;
class INetworkPlayer;

using namespace std;

class PlayerConnection : public PacketListener, public ConsoleInputSource
{
//    public static Logger logger = Logger.getLogger("Minecraft");

public:
	Connection *connection;
    bool done;
	CRITICAL_SECTION done_cs;

	// 4J Stu - Added this so that we can manage UGC privileges
	PlayerUID m_offlineXUID, m_onlineXUID;
	bool m_friendsOnlyUGC;

private:
	MinecraftServer *server;
    shared_ptr<ServerPlayer> player;
    int tickCount;
    int aboveGroundTickCount;

    bool didTick;
	int lastKeepAliveId;
	int64_t lastKeepAliveTime;
	static Random random;
	int64_t lastKeepAliveTick;
	int chatSpamTickCount;
	int dropSpamTickCount;

	bool m_bHasClientTickedOnce;
	unsigned char m_logSmallId;

public:
	PlayerConnection(MinecraftServer *server, Connection *connection, shared_ptr<ServerPlayer> player);
	~PlayerConnection();
    void tick();
    void disconnect(DisconnectPacket::eDisconnectReason reason);

private:
	/**
	 * Returns the stable network smallId used by dedicated-server logging and refreshes it from the live socket when possible
	 */
	unsigned char getLogSmallId();
	double xLastOk, yLastOk, zLastOk;
    bool synched;

public:
	virtual void handlePlayerInput(shared_ptr<PlayerInputPacket> packet);
    virtual void handleMovePlayer(shared_ptr<MovePlayerPacket> packet);
    void teleport(double x, double y, double z, float yRot, float xRot, bool sendPacket = true); // 4J Added sendPacket param
    virtual void handlePlayerAction(shared_ptr<PlayerActionPacket> packet);
    virtual void handleUseItem(shared_ptr<UseItemPacket> packet);
    virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects);
    virtual void onUnhandledPacket(shared_ptr<Packet> packet);
    void send(shared_ptr<Packet> packet);
	void queueSend(shared_ptr<Packet> packet); // 4J Added
    virtual void handleSetCarriedItem(shared_ptr<SetCarriedItemPacket> packet);
    virtual void handleChat(shared_ptr<ChatPacket> packet);
private:
	void handleCommand(const wstring& message);
public:
	virtual void handleAnimate(shared_ptr<AnimatePacket> packet);
    virtual void handlePlayerCommand(shared_ptr<PlayerCommandPacket> packet);
    virtual void handleDisconnect(shared_ptr<DisconnectPacket> packet);
    int countDelayedPackets();
    virtual void info(const wstring& string);
    virtual void warn(const wstring& string);
    virtual wstring getConsoleName();
    virtual void handleInteract(shared_ptr<InteractPacket> packet);
	bool canHandleAsyncPackets();
	virtual void handleClientCommand(shared_ptr<ClientCommandPacket> packet);
    virtual void handleRespawn(shared_ptr<RespawnPacket> packet);
    virtual void handleContainerClose(shared_ptr<ContainerClosePacket> packet);

private:
	unordered_map<int, short, IntKeyHash, IntKeyEq> expectedAcks;

public:
	// 4J Stu - Handlers only valid in debug mode
#ifndef _CONTENT_PACKAGE
    virtual void handleContainerSetSlot(shared_ptr<ContainerSetSlotPacket> packet);
#endif
	virtual void handleContainerClick(shared_ptr<ContainerClickPacket> packet);
	virtual void handleContainerButtonClick(shared_ptr<ContainerButtonClickPacket> packet);
	virtual void handleSetCreativeModeSlot(shared_ptr<SetCreativeModeSlotPacket> packet);
    virtual void handleContainerAck(shared_ptr<ContainerAckPacket> packet);
    virtual void handleSignUpdate(shared_ptr<SignUpdatePacket> packet);
	virtual void handleKeepAlive(shared_ptr<KeepAlivePacket> packet);
	virtual void handlePlayerInfo(shared_ptr<PlayerInfoPacket> packet); // 4J Added
    virtual bool isServerPacketListener();
	virtual void handlePlayerAbilities(shared_ptr<PlayerAbilitiesPacket> playerAbilitiesPacket);
	virtual void handleCustomPayload(shared_ptr<CustomPayloadPacket> customPayloadPacket);
	virtual bool isDisconnected();

	// 4J Added
	virtual void handleCraftItem(shared_ptr<CraftItemPacket> packet);
	virtual void handleTradeItem(shared_ptr<TradeItemPacket> packet);
	virtual void handleDebugOptions(shared_ptr<DebugOptionsPacket> packet);
	virtual void handleTexture(shared_ptr<TexturePacket> packet);
	virtual void handleTextureAndGeometry(shared_ptr<TextureAndGeometryPacket> packet);
	virtual void handleTextureChange(shared_ptr<TextureChangePacket> packet);
	virtual void handleTextureAndGeometryChange(shared_ptr<TextureAndGeometryChangePacket> packet);
	virtual void handleServerSettingsChanged(shared_ptr<ServerSettingsChangedPacket> packet);
	virtual void handleKickPlayer(shared_ptr<KickPlayerPacket> packet);
	virtual void handleGameCommand(shared_ptr<GameCommandPacket> packet);

	INetworkPlayer *getNetworkPlayer();
	bool isLocal();
	bool isGuest();

	// 4J Added as we need to set this from outside sometimes
	void setPlayer(shared_ptr<ServerPlayer> player) { this->player = player; }
	shared_ptr<ServerPlayer> getPlayer() { return player; }

	// 4J Added to signal a disconnect from another thread
	void closeOnTick() { m_bCloseOnTick = true; }

	// 4J Added so that we can send on textures that get received after this connection requested them
	void handleTextureReceived(const wstring &textureName);
	void handleTextureAndGeometryReceived(const wstring &textureName);

	void setShowOnMaps(bool bVal);

	void setWasKicked() { m_bWasKicked = true; }
	bool getWasKicked() { return m_bWasKicked; }

	// 4J Added
	bool hasClientTickedOnce() { return m_bHasClientTickedOnce; }

private:
	bool m_bCloseOnTick;
	vector<wstring> m_texturesRequested;

	bool m_bWasKicked;
};