diff --git a/Minecraft.World/Network/Packets/LoginPacket.cpp b/Minecraft.World/Network/Packets/LoginPacket.cpp index e13d26ab9..83b04924a 100644 --- a/Minecraft.World/Network/Packets/LoginPacket.cpp +++ b/Minecraft.World/Network/Packets/LoginPacket.cpp @@ -1,4 +1,5 @@ #include "../../Platform/stdafx.h" +#include #include #include "../../IO/Streams/InputOutputStream.h" #include "../../Headers/net.minecraft.world.entity.player.h" @@ -36,7 +37,7 @@ LoginPacket::LoginPacket() } // Client -> Server -LoginPacket::LoginPacket(const std::wstring& userName, int clientVersion, PlayerUID offlineXuid, PlayerUID onlineXuid, bool friendsOnlyUGC, DWORD ugcPlayersVersion, DWORD skinId, DWORD capeId, bool isGuest) +LoginPacket::LoginPacket(const std::wstring& userName, int clientVersion, PlayerUID offlineXuid, PlayerUID onlineXuid, bool friendsOnlyUGC, std::uint32_t ugcPlayersVersion, std::uint32_t skinId, std::uint32_t capeId, bool isGuest) { this->userName = userName; this->clientVersion = clientVersion; @@ -65,7 +66,7 @@ LoginPacket::LoginPacket(const std::wstring& userName, int clientVersion, Player } // Server -> Client -LoginPacket::LoginPacket(const std::wstring& userName, int clientVersion, LevelType *pLevelType, __int64 seed, int gameType, char dimension, BYTE mapHeight, BYTE maxPlayers, char difficulty, INT multiplayerInstanceId, BYTE playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale) +LoginPacket::LoginPacket(const std::wstring& userName, int clientVersion, LevelType *pLevelType, __int64 seed, int gameType, char dimension, std::uint8_t mapHeight, std::uint8_t maxPlayers, char difficulty, int multiplayerInstanceId, std::uint8_t playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale) { this->userName = userName; this->clientVersion = clientVersion; @@ -106,19 +107,20 @@ void LoginPacket::read(DataInputStream *dis) //throws IOException seed = dis->readLong(); gameType = dis->readInt(); dimension = (int)dis->readByte(); - mapHeight = (int)dis->readByte(); - maxPlayers = (int)dis->readByte(); + mapHeight = static_cast(dis->readByte()); + maxPlayers = static_cast(dis->readByte()); m_offlineXuid = dis->readPlayerUID(); m_onlineXuid = dis->readPlayerUID(); m_friendsOnlyUGC = dis->readBoolean(); - m_ugcPlayersVersion = dis->readInt(); + int ugcPlayersVersion = dis->readInt(); + std::memcpy(&m_ugcPlayersVersion, &ugcPlayersVersion, sizeof(m_ugcPlayersVersion)); difficulty = (int)dis->readByte(); m_multiplayerInstanceId = dis->readInt(); - m_playerIndex = (int)dis->readByte(); - INT skinId = dis->readInt(); - m_playerSkinId = *(DWORD *)&skinId; - INT capeId = dis->readInt(); - m_playerCapeId = *(DWORD *)&capeId; + m_playerIndex = static_cast(dis->readByte()); + int skinId = dis->readInt(); + std::memcpy(&m_playerSkinId, &skinId, sizeof(m_playerSkinId)); + int capeId = dis->readInt(); + std::memcpy(&m_playerCapeId, &capeId, sizeof(m_playerCapeId)); m_isGuest = dis->readBoolean(); m_newSeaLevel = dis->readBoolean(); m_uiGamePrivileges = dis->readInt(); @@ -150,12 +152,18 @@ void LoginPacket::write(DataOutputStream *dos) //throws IOException dos->writePlayerUID(m_offlineXuid); dos->writePlayerUID(m_onlineXuid); dos->writeBoolean(m_friendsOnlyUGC); - dos->writeInt(m_ugcPlayersVersion); + int ugcPlayersVersion = 0; + std::memcpy(&ugcPlayersVersion, &m_ugcPlayersVersion, sizeof(m_ugcPlayersVersion)); + dos->writeInt(ugcPlayersVersion); dos->writeByte((uint8_t)difficulty); dos->writeInt(m_multiplayerInstanceId); dos->writeByte((uint8_t)m_playerIndex); - dos->writeInt(m_playerSkinId); - dos->writeInt(m_playerCapeId); + int skinId = 0; + std::memcpy(&skinId, &m_playerSkinId, sizeof(m_playerSkinId)); + dos->writeInt(skinId); + int capeId = 0; + std::memcpy(&capeId, &m_playerCapeId, sizeof(m_playerCapeId)); + dos->writeInt(capeId); dos->writeBoolean(m_isGuest); dos->writeBoolean(m_newSeaLevel); dos->writeInt(m_uiGamePrivileges); @@ -178,5 +186,5 @@ int LoginPacket::getEstimatedSize() length = (int)m_pLevelType->getGeneratorName().length(); } - return (int)(sizeof(int) + userName.length() + 4 + 6 + sizeof(__int64) + sizeof(char) + sizeof(int) + (2*sizeof(PlayerUID)) +1 + sizeof(char) + sizeof(BYTE) + sizeof(bool) + sizeof(bool) + length + sizeof(unsigned int)); + return (int)(sizeof(int) + userName.length() + 4 + 6 + sizeof(__int64) + sizeof(char) + sizeof(int) + (2*sizeof(PlayerUID)) + 1 + sizeof(char) + sizeof(std::uint8_t) + sizeof(bool) + sizeof(bool) + length + sizeof(unsigned int)); } diff --git a/Minecraft.World/Network/Packets/LoginPacket.h b/Minecraft.World/Network/Packets/LoginPacket.h index d0bfb030a..b6f14816a 100644 --- a/Minecraft.World/Network/Packets/LoginPacket.h +++ b/Minecraft.World/Network/Packets/LoginPacket.h @@ -1,5 +1,6 @@ #pragma once +#include #include "Packet.h" class LevelType; @@ -14,10 +15,10 @@ public: PlayerUID m_offlineXuid, m_onlineXuid; // 4J Added char difficulty; // 4J Added bool m_friendsOnlyUGC; // 4J Added - DWORD m_ugcPlayersVersion; // 4J Added - INT m_multiplayerInstanceId; //4J Added for sentient - BYTE m_playerIndex; // 4J Added - DWORD m_playerSkinId, m_playerCapeId; // 4J Added + std::uint32_t m_ugcPlayersVersion; // 4J Added + int m_multiplayerInstanceId; //4J Added for sentient + std::uint8_t m_playerIndex; // 4J Added + std::uint32_t m_playerSkinId, m_playerCapeId; // 4J Added bool m_isGuest; // 4J Added bool m_newSeaLevel; // 4J Added LevelType *m_pLevelType; @@ -27,12 +28,12 @@ public: // 1.8.2 int gameType; - BYTE mapHeight; - BYTE maxPlayers; + std::uint8_t mapHeight; + std::uint8_t maxPlayers; LoginPacket(); - LoginPacket(const std::wstring& userName, int clientVersion, LevelType *pLevelType, __int64 seed, int gameType, char dimension, BYTE mapHeight, BYTE maxPlayers, char difficulty, INT m_multiplayerInstanceId, BYTE playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale); // Server -> Client - LoginPacket(const std::wstring& userName, int clientVersion, PlayerUID offlineXuid, PlayerUID onlineXuid, bool friendsOnlyUGC, DWORD ugcPlayersVersion, DWORD skinId, DWORD capeId, bool isGuest); // Client -> Server + LoginPacket(const std::wstring& userName, int clientVersion, LevelType *pLevelType, __int64 seed, int gameType, char dimension, std::uint8_t mapHeight, std::uint8_t maxPlayers, char difficulty, int m_multiplayerInstanceId, std::uint8_t playerIndex, bool newSeaLevel, unsigned int uiGamePrivileges, int xzSize, int hellScale); // Server -> Client + LoginPacket(const std::wstring& userName, int clientVersion, PlayerUID offlineXuid, PlayerUID onlineXuid, bool friendsOnlyUGC, std::uint32_t ugcPlayersVersion, std::uint32_t skinId, std::uint32_t capeId, bool isGuest); // Client -> Server virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos);