forked from Kolyah35/minecraft-pe-0.6.1
378 lines
8.1 KiB
C++
Executable File
378 lines
8.1 KiB
C++
Executable File
#include "LevelData.h"
|
|
|
|
LevelData::LevelData()
|
|
: xSpawn(128),
|
|
ySpawn(64),
|
|
zSpawn(128),
|
|
|
|
seed(0),
|
|
lastPlayed(0),
|
|
generatorVersion(SharedConstants::GeneratorVersion),
|
|
time(0),
|
|
dimension(Dimension::NORMAL),
|
|
playerDataVersion(-1),
|
|
storageVersion(0),
|
|
gameType(GameType::Default), spawnMobs(false),
|
|
allowCheats(false), loadedPlayerTag(NULL)
|
|
{
|
|
//LOGI("ctor 1: %p\n", this);
|
|
spawnMobs = (gameType == GameType::Survival);
|
|
}
|
|
|
|
LevelData::LevelData( const LevelSettings& settings, const std::string& levelName, int generatorVersion /*= -1*/ )
|
|
: seed(settings.getSeed()),
|
|
gameType(settings.getGameType()), allowCheats(settings.getAllowCheats()), levelName(levelName),
|
|
xSpawn(128),
|
|
ySpawn(64),
|
|
zSpawn(128),
|
|
lastPlayed(0),
|
|
time(0),
|
|
dimension(Dimension::NORMAL),
|
|
playerDataVersion(-1),
|
|
loadedPlayerTag(NULL)
|
|
{
|
|
//LOGI("ctor 2: %p\n", this);
|
|
|
|
if (generatorVersion < 0)
|
|
generatorVersion = SharedConstants::GeneratorVersion;
|
|
|
|
this->generatorVersion = generatorVersion;
|
|
spawnMobs = (gameType == GameType::Survival);
|
|
}
|
|
|
|
LevelData::LevelData( CompoundTag* tag )
|
|
: loadedPlayerTag(NULL)
|
|
{
|
|
//LOGI("ctor 3: %p (%p)\n", this, tag);
|
|
getTagData(tag);
|
|
}
|
|
|
|
LevelData::LevelData( const LevelData& rhs )
|
|
: seed(rhs.seed),
|
|
gameType(rhs.gameType),
|
|
levelName(rhs.levelName),
|
|
xSpawn(rhs.xSpawn),
|
|
ySpawn(rhs.ySpawn),
|
|
zSpawn(rhs.zSpawn),
|
|
lastPlayed(rhs.lastPlayed),
|
|
time(rhs.time),
|
|
dimension(rhs.dimension),
|
|
storageVersion(rhs.storageVersion),
|
|
playerDataVersion(rhs.playerDataVersion),
|
|
generatorVersion(rhs.generatorVersion),
|
|
spawnMobs(rhs.spawnMobs),
|
|
allowCheats(rhs.allowCheats),
|
|
loadedPlayerTag(NULL),
|
|
playerData(rhs.playerData)
|
|
{
|
|
//LOGI("c-ctor: %p (%p)\n", this, &rhs);
|
|
setPlayerTag(rhs.loadedPlayerTag);
|
|
//PlayerData playerData;
|
|
}
|
|
|
|
LevelData& LevelData::operator=( const LevelData& rhs )
|
|
{
|
|
//LOGI("as-op: %p (%p)\n", this, &rhs);
|
|
if (this != &rhs) {
|
|
seed = rhs.seed;
|
|
gameType = rhs.gameType;
|
|
levelName = rhs.levelName;
|
|
xSpawn = rhs.xSpawn;
|
|
ySpawn = rhs.ySpawn;
|
|
zSpawn = rhs.zSpawn;
|
|
lastPlayed = rhs.lastPlayed;
|
|
time = rhs.time;
|
|
dimension = rhs.dimension;
|
|
spawnMobs = rhs.spawnMobs;
|
|
allowCheats = rhs.allowCheats;
|
|
playerData = rhs.playerData;
|
|
playerDataVersion = rhs.playerDataVersion;
|
|
generatorVersion = rhs.generatorVersion;
|
|
storageVersion = rhs.storageVersion;
|
|
setPlayerTag(rhs.loadedPlayerTag);
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
LevelData::~LevelData()
|
|
{
|
|
//LOGI("dtor: %p\n", this);
|
|
setPlayerTag(NULL);
|
|
}
|
|
|
|
void LevelData::v1_write( RakNet::BitStream& bitStream )
|
|
{
|
|
bitStream.Write(seed);
|
|
bitStream.Write(xSpawn);
|
|
bitStream.Write(ySpawn);
|
|
bitStream.Write(zSpawn);
|
|
bitStream.Write(time);
|
|
bitStream.Write(sizeOnDisk);
|
|
bitStream.Write(getEpochTimeS());
|
|
RakNet::RakString rakName = levelName.c_str();
|
|
bitStream.Write(rakName);
|
|
//LOGI("WBS: %d, %d, %d, %d, %d, %d\n", seed, xSpawn, ySpawn, zSpawn, time, sizeOnDisk);
|
|
}
|
|
|
|
void LevelData::v1_read( RakNet::BitStream& bitStream, int storageVersion )
|
|
{
|
|
this->storageVersion = storageVersion;
|
|
bitStream.Read(seed);
|
|
bitStream.Read(xSpawn);
|
|
bitStream.Read(ySpawn);
|
|
bitStream.Read(zSpawn);
|
|
bitStream.Read(time);
|
|
bitStream.Read(sizeOnDisk);
|
|
bitStream.Read(lastPlayed);
|
|
RakNet::RakString rakName;
|
|
bitStream.Read(rakName);
|
|
levelName = rakName.C_String();
|
|
//LOGI("RBS: %d, %d, %d, %d, %d, %d\n", seed, xSpawn, ySpawn, zSpawn, time, sizeOnDisk);
|
|
}
|
|
|
|
// Caller's responsibility to destroy this Tag
|
|
CompoundTag* LevelData::createTag()
|
|
{
|
|
CompoundTag* tag = new CompoundTag();
|
|
CompoundTag* player = loadedPlayerTag? (CompoundTag*)loadedPlayerTag->copy() : NULL;
|
|
setTagData(tag, player);
|
|
return tag;
|
|
}
|
|
|
|
CompoundTag* LevelData::createTag( const std::vector<Player*>& players )
|
|
{
|
|
CompoundTag* tag = new CompoundTag();
|
|
|
|
Player* player = NULL;
|
|
CompoundTag* playerTag = NULL;
|
|
|
|
if (!players.empty()) player = players[0];
|
|
if (player != NULL) {
|
|
playerTag = new CompoundTag();
|
|
player->saveWithoutId(playerTag);
|
|
}
|
|
setTagData(tag, playerTag);
|
|
|
|
return tag;
|
|
}
|
|
|
|
void LevelData::setTagData( CompoundTag* tag, CompoundTag* playerTag )
|
|
{
|
|
if (!tag) return;
|
|
tag->putLong("RandomSeed", seed);
|
|
tag->putInt("GameType", gameType);
|
|
tag->putBoolean("AllowCommands", allowCheats);
|
|
tag->putInt("SpawnX", xSpawn);
|
|
tag->putInt("SpawnY", ySpawn);
|
|
tag->putInt("SpawnZ", zSpawn);
|
|
tag->putLong("Time", time);
|
|
tag->putLong("SizeOnDisk", sizeOnDisk);
|
|
tag->putLong("LastPlayed", getEpochTimeS());
|
|
tag->putString("LevelName", levelName);
|
|
tag->putInt("StorageVersion", storageVersion);
|
|
tag->putInt("Platform", 2);
|
|
|
|
if (playerTag != NULL) {
|
|
tag->putCompound("Player", playerTag);
|
|
}
|
|
}
|
|
|
|
void LevelData::getTagData( const CompoundTag* tag )
|
|
{
|
|
if (!tag) return;
|
|
seed = (long)tag->getLong("RandomSeed");
|
|
gameType = tag->getInt("GameType");
|
|
allowCheats = tag->getBoolean("AllowCommands");
|
|
xSpawn = tag->getInt("SpawnX");
|
|
ySpawn = tag->getInt("SpawnY");
|
|
zSpawn = tag->getInt("SpawnZ");
|
|
time = (long)tag->getLong("Time");
|
|
lastPlayed = (int)tag->getLong("LastPlayed");
|
|
sizeOnDisk = (int)tag->getLong("SizeOnDisk");
|
|
levelName = tag->getString("LevelName");
|
|
storageVersion = tag->getInt("StorageVersion");
|
|
|
|
spawnMobs = (gameType == GameType::Survival);
|
|
|
|
if (tag->contains("Player", Tag::TAG_Compound)) {
|
|
setPlayerTag(tag->getCompound("Player"));
|
|
|
|
//dimension = loadedPlayerTag.getInt("Dimension");
|
|
}
|
|
}
|
|
|
|
void LevelData::setPlayerTag( CompoundTag* tag )
|
|
{
|
|
if (loadedPlayerTag) {
|
|
loadedPlayerTag->deleteChildren();
|
|
delete loadedPlayerTag;
|
|
loadedPlayerTag = NULL;
|
|
}
|
|
if (tag)
|
|
loadedPlayerTag = (CompoundTag*)tag->copy();
|
|
}
|
|
|
|
long LevelData::getSeed() const
|
|
{
|
|
return seed;
|
|
}
|
|
|
|
int LevelData::getXSpawn() const
|
|
{
|
|
return xSpawn;
|
|
}
|
|
|
|
int LevelData::getYSpawn() const
|
|
{
|
|
return ySpawn;
|
|
}
|
|
|
|
int LevelData::getZSpawn() const
|
|
{
|
|
return zSpawn;
|
|
}
|
|
|
|
long LevelData::getTime() const
|
|
{
|
|
return time;
|
|
}
|
|
|
|
long LevelData::getSizeOnDisk() const
|
|
{
|
|
return sizeOnDisk;
|
|
}
|
|
|
|
CompoundTag* LevelData::getLoadedPlayerTag()
|
|
{
|
|
return loadedPlayerTag;
|
|
}
|
|
|
|
void LevelData::setLoadedPlayerTo( Player* p )
|
|
{
|
|
if (playerDataVersion == 1)
|
|
playerData.loadPlayer(p);
|
|
}
|
|
|
|
int LevelData::getDimension()
|
|
{
|
|
return dimension;
|
|
}
|
|
|
|
void LevelData::setSeed( long seed )
|
|
{
|
|
this->seed = seed;
|
|
}
|
|
|
|
void LevelData::setXSpawn( int xSpawn )
|
|
{
|
|
this->xSpawn = xSpawn;
|
|
}
|
|
|
|
void LevelData::setYSpawn( int ySpawn )
|
|
{
|
|
this->ySpawn = ySpawn;
|
|
}
|
|
|
|
void LevelData::setZSpawn( int zSpawn )
|
|
{
|
|
this->zSpawn = zSpawn;
|
|
}
|
|
|
|
void LevelData::setTime( long time )
|
|
{
|
|
this->time = time;
|
|
}
|
|
|
|
void LevelData::setSizeOnDisk( long sizeOnDisk )
|
|
{
|
|
this->sizeOnDisk = sizeOnDisk;
|
|
}
|
|
|
|
void LevelData::setLoadedPlayerTag( CompoundTag* playerTag )
|
|
{
|
|
LOGI("set-p: %p (%p <- %p)\n", this, loadedPlayerTag, playerTag);
|
|
if (loadedPlayerTag) {
|
|
loadedPlayerTag->deleteChildren();
|
|
delete loadedPlayerTag;
|
|
}
|
|
loadedPlayerTag = playerTag;
|
|
}
|
|
|
|
void LevelData::setDimension( int dimension )
|
|
{
|
|
this->dimension = dimension;
|
|
}
|
|
|
|
void LevelData::setSpawn( int xSpawn, int ySpawn, int zSpawn )
|
|
{
|
|
this->xSpawn = xSpawn;
|
|
this->ySpawn = ySpawn;
|
|
this->zSpawn = zSpawn;
|
|
}
|
|
|
|
std::string LevelData::getLevelName()
|
|
{
|
|
return levelName;
|
|
}
|
|
|
|
void LevelData::setLevelName( const std::string& levelName )
|
|
{
|
|
this->levelName = levelName;
|
|
}
|
|
|
|
int LevelData::getGeneratorVersion() const
|
|
{
|
|
return generatorVersion;
|
|
}
|
|
|
|
void LevelData::setGeneratorVersion( int version )
|
|
{
|
|
this->generatorVersion = version;
|
|
}
|
|
|
|
long LevelData::getLastPlayed() const
|
|
{
|
|
return lastPlayed;
|
|
}
|
|
|
|
int LevelData::getStorageVersion() const
|
|
{
|
|
return storageVersion;
|
|
}
|
|
|
|
void LevelData::setStorageVersion( int version )
|
|
{
|
|
storageVersion = version;
|
|
}
|
|
|
|
int LevelData::getGameType() const
|
|
{
|
|
return gameType;
|
|
}
|
|
|
|
void LevelData::setGameType( int type )
|
|
{
|
|
gameType = type;
|
|
}
|
|
|
|
bool LevelData::getSpawnMobs() const
|
|
{
|
|
return spawnMobs;
|
|
}
|
|
|
|
void LevelData::setSpawnMobs( bool doSpawn )
|
|
{
|
|
spawnMobs = doSpawn;
|
|
}
|
|
|
|
bool LevelData::getAllowCheats() const
|
|
{
|
|
return allowCheats;
|
|
}
|
|
|
|
void LevelData::setAllowCheats( bool allow )
|
|
{
|
|
allowCheats = allow;
|
|
}
|