#pragma once #include #include "../Input/ConsoleInputSource.h" #include "../../Minecraft.World/Network/Packets/PacketListener.h" #include "../../Minecraft.World/Util/JavaIntHash.h" class MinecraftServer; class Connection; class ServerPlayer; class INetworkPlayer; class PlayerConnection : public PacketListener, public ConsoleInputSource { // public static Logger logger = Logger.getLogger("Minecraft"); public: Connection* connection; bool done; std::mutex done_cs; // 4J Stu - Added this so that we can manage UGC privileges PlayerUID m_offlineXUID, m_onlineXUID; bool m_friendsOnlyUGC; private: MinecraftServer* server; std::shared_ptr 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; public: PlayerConnection(MinecraftServer* server, Connection* connection, std::shared_ptr player); ~PlayerConnection(); void tick(); void disconnect(DisconnectPacket::eDisconnectReason reason); private: double xLastOk, yLastOk, zLastOk; bool synched; public: virtual void handlePlayerInput(std::shared_ptr packet); virtual void handleMovePlayer(std::shared_ptr packet); void teleport(double x, double y, double z, float yRot, float xRot, bool sendPacket = true); // 4J Added sendPacket param virtual void handlePlayerAction(std::shared_ptr packet); virtual void handleUseItem(std::shared_ptr packet); virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void* reasonObjects); virtual void onUnhandledPacket(std::shared_ptr packet); void send(std::shared_ptr packet); void queueSend(std::shared_ptr packet); // 4J Added virtual void handleSetCarriedItem( std::shared_ptr packet); virtual void handleChat(std::shared_ptr packet); private: void handleCommand(const std::wstring& message); public: virtual void handleAnimate(std::shared_ptr packet); virtual void handlePlayerCommand( std::shared_ptr packet); virtual void handleDisconnect(std::shared_ptr packet); int countDelayedPackets(); virtual void info(const std::wstring& string); virtual void warn(const std::wstring& string); virtual std::wstring getConsoleName(); virtual void handleInteract(std::shared_ptr packet); bool canHandleAsyncPackets(); virtual void handleClientCommand( std::shared_ptr packet); virtual void handleRespawn(std::shared_ptr packet); virtual void handleContainerClose( std::shared_ptr packet); private: std::unordered_map expectedAcks; public: // 4J Stu - Handlers only valid in debug mode #ifndef _CONTENT_PACKAGE virtual void handleContainerSetSlot( std::shared_ptr packet); #endif virtual void handleContainerClick( std::shared_ptr packet); virtual void handleContainerButtonClick( std::shared_ptr packet); virtual void handleSetCreativeModeSlot( std::shared_ptr packet); virtual void handleContainerAck(std::shared_ptr packet); virtual void handleSignUpdate(std::shared_ptr packet); virtual void handleKeepAlive(std::shared_ptr packet); virtual void handlePlayerInfo( std::shared_ptr packet); // 4J Added virtual bool isServerPacketListener(); virtual void handlePlayerAbilities( std::shared_ptr playerAbilitiesPacket); virtual void handleCustomPayload( std::shared_ptr customPayloadPacket); virtual bool isDisconnected(); // 4J Added virtual void handleCraftItem(std::shared_ptr packet); virtual void handleTradeItem(std::shared_ptr packet); virtual void handleDebugOptions(std::shared_ptr packet); virtual void handleTexture(std::shared_ptr packet); virtual void handleTextureAndGeometry( std::shared_ptr packet); virtual void handleTextureChange( std::shared_ptr packet); virtual void handleTextureAndGeometryChange( std::shared_ptr packet); virtual void handleServerSettingsChanged( std::shared_ptr packet); virtual void handleKickPlayer(std::shared_ptr packet); virtual void handleGameCommand(std::shared_ptr packet); INetworkPlayer* getNetworkPlayer(); bool isLocal(); bool isGuest(); // 4J Added as we need to set this from outside sometimes void setPlayer(std::shared_ptr player) { this->player = player; } std::shared_ptr 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 std::wstring& textureName); void handleTextureAndGeometryReceived(const std::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; std::vector m_texturesRequested; bool m_bWasKicked; };