4jcraft/targets/minecraft/network/packet/RespawnPacket.cpp

96 lines
2.9 KiB
C++

#include "minecraft/util/Log.h"
#include "RespawnPacket.h"
#include <string>
#include "app/linux/LinuxGame.h"
#include "PacketListener.h"
#include "java/InputOutputStream/DataInputStream.h"
#include "java/InputOutputStream/DataOutputStream.h"
#include "minecraft/world/level/LevelSettings.h"
#include "minecraft/world/level/LevelType.h"
#include "minecraft/world/level/chunk/ChunkSource.h"
RespawnPacket::RespawnPacket() {
this->dimension = 0;
this->difficulty = 1;
this->mapSeed = 0;
this->mapHeight = 0;
this->playerGameType = nullptr;
this->m_newSeaLevel = false;
m_pLevelType = nullptr;
m_newEntityId = 0;
m_xzSize = LEVEL_MAX_WIDTH;
m_hellScale = HELL_LEVEL_MAX_SCALE;
}
RespawnPacket::RespawnPacket(char dimension, int64_t mapSeed, int mapHeight,
GameType* playerGameType, char difficulty,
LevelType* pLevelType, bool newSeaLevel,
int newEntityId, int xzSize, int hellScale) {
this->dimension = dimension;
this->mapSeed = mapSeed;
this->mapHeight = mapHeight;
this->playerGameType = playerGameType;
this->difficulty = difficulty;
this->m_newSeaLevel = newSeaLevel;
this->m_pLevelType = pLevelType;
this->m_newEntityId = newEntityId;
m_xzSize = xzSize;
m_hellScale = hellScale;
Log::info("RespawnPacket - Difficulty = %d\n", difficulty);
}
void RespawnPacket::handle(PacketListener* listener) {
listener->handleRespawn(shared_from_this());
}
void RespawnPacket::read(DataInputStream* dis) // throws IOException
{
dimension = dis->readByte();
playerGameType = GameType::byId(dis->readByte());
mapHeight = dis->readShort();
std::string typeName = readUtf(dis, 16);
m_pLevelType = LevelType::getLevelType(typeName);
if (m_pLevelType == nullptr) {
m_pLevelType = LevelType::lvl_normal;
}
mapSeed = dis->readLong();
difficulty = dis->readByte();
m_newSeaLevel = dis->readBoolean();
m_newEntityId = dis->readShort();
#ifdef _LARGE_WORLDS
m_xzSize = dis->readShort();
m_hellScale = dis->read();
#endif
Log::info("RespawnPacket::read - Difficulty = %d\n", difficulty);
}
void RespawnPacket::write(DataOutputStream* dos) // throws IOException
{
dos->writeByte(dimension);
dos->writeByte(playerGameType->getId());
dos->writeShort(mapHeight);
if (m_pLevelType == nullptr) {
writeUtf("", dos);
} else {
writeUtf(m_pLevelType->getGeneratorName(), dos);
}
dos->writeLong(mapSeed);
dos->writeByte(difficulty);
dos->writeBoolean(m_newSeaLevel);
dos->writeShort(m_newEntityId);
#ifdef _LARGE_WORLDS
dos->writeShort(m_xzSize);
dos->write(m_hellScale);
#endif
}
int RespawnPacket::getEstimatedSize() {
int length = 0;
if (m_pLevelType != nullptr) {
length = (int)m_pLevelType->getGeneratorName().length();
}
return 13 + length;
}