2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "System.h"
# include "net.minecraft.world.entity.player.h"
# include "com.mojang.nbt.h"
# include "LevelData.h"
# include "LevelType.h"
# include "LevelSettings.h"
LevelData : : LevelData ( )
{
}
LevelData : : LevelData ( CompoundTag * tag )
{
seed = tag - > getLong ( L " RandomSeed " ) ;
m_pGenerator = LevelType : : lvl_normal ;
2026-03-02 15:53:32 +07:00
if ( tag - > contains ( L " generatorName " ) )
2026-03-01 12:16:08 +08:00
{
wstring generatorName = tag - > getString ( L " generatorName " ) ;
m_pGenerator = LevelType : : getLevelType ( generatorName ) ;
2026-03-02 15:53:32 +07:00
if ( m_pGenerator = = NULL )
2026-03-01 12:16:08 +08:00
{
m_pGenerator = LevelType : : lvl_normal ;
2026-03-02 15:53:32 +07:00
}
else if ( m_pGenerator - > hasReplacement ( ) )
2026-03-01 12:16:08 +08:00
{
int generatorVersion = 0 ;
2026-03-02 15:53:32 +07:00
if ( tag - > contains ( L " generatorVersion " ) )
2026-03-01 12:16:08 +08:00
{
generatorVersion = tag - > getInt ( L " generatorVersion " ) ;
}
m_pGenerator = m_pGenerator - > getReplacementForVersion ( generatorVersion ) ;
}
}
gameType = GameType : : byId ( tag - > getInt ( L " GameType " ) ) ;
if ( tag - > contains ( L " MapFeatures " ) )
{
generateMapFeatures = tag - > getBoolean ( L " MapFeatures " ) ;
}
else
{
generateMapFeatures = true ;
}
spawnBonusChest = tag - > getBoolean ( L " spawnBonusChest " ) ;
xSpawn = tag - > getInt ( L " SpawnX " ) ;
ySpawn = tag - > getInt ( L " SpawnY " ) ;
zSpawn = tag - > getInt ( L " SpawnZ " ) ;
time = tag - > getLong ( L " Time " ) ;
lastPlayed = tag - > getLong ( L " LastPlayed " ) ;
sizeOnDisk = tag - > getLong ( L " SizeOnDisk " ) ;
levelName = tag - > getString ( L " LevelName " ) ;
version = tag - > getInt ( L " version " ) ;
rainTime = tag - > getInt ( L " rainTime " ) ;
raining = tag - > getBoolean ( L " raining " ) ;
thunderTime = tag - > getInt ( L " thunderTime " ) ;
thundering = tag - > getBoolean ( L " thundering " ) ;
hardcore = tag - > getBoolean ( L " hardcore " ) ;
if ( tag - > contains ( L " initialized " ) )
{
initialized = tag - > getBoolean ( L " initialized " ) ;
}
else
{
initialized = true ;
}
if ( tag - > contains ( L " allowCommands " ) )
{
allowCommands = tag - > getBoolean ( L " allowCommands " ) ;
}
else
{
allowCommands = gameType = = GameType : : CREATIVE ;
}
newSeaLevel = tag - > getBoolean ( L " newSeaLevel " ) ; // 4J added - only use new sea level for newly created maps. This read defaults to false. (sea level changes in 1.8.2)
hasBeenInCreative = tag - > getBoolean ( L " hasBeenInCreative " ) ; // 4J added so we can not award achievements to levels modified in creative
// 4J added - for stronghold position
2026-03-02 15:53:32 +07:00
bStronghold = tag - > getBoolean ( L " hasStronghold " ) ;
2026-03-01 12:16:08 +08:00
if ( bStronghold = = false )
{
// we need to generate the position
xStronghold = yStronghold = zStronghold = 0 ;
}
else
{
xStronghold = tag - > getInt ( L " StrongholdX " ) ;
yStronghold = tag - > getInt ( L " StrongholdY " ) ;
zStronghold = tag - > getInt ( L " StrongholdZ " ) ;
}
// 4J added - for stronghold end portal position
2026-03-02 15:53:32 +07:00
bStrongholdEndPortal = tag - > getBoolean ( L " hasStrongholdEndPortal " ) ;
2026-03-01 12:16:08 +08:00
if ( bStrongholdEndPortal = = false )
{
// we need to generate the position
xStrongholdEndPortal = zStrongholdEndPortal = 0 ;
}
else
{
xStrongholdEndPortal = tag - > getInt ( L " StrongholdEndPortalX " ) ;
zStrongholdEndPortal = tag - > getInt ( L " StrongholdEndPortalZ " ) ;
}
// 4J Added
m_xzSize = tag - > getInt ( L " XZSize " ) ;
m_hellScale = tag - > getInt ( L " HellScale " ) ;
2026-03-02 15:53:32 +07:00
2026-03-01 12:16:08 +08:00
m_xzSize = min ( m_xzSize , LEVEL_MAX_WIDTH ) ;
m_xzSize = max ( m_xzSize , LEVEL_MIN_WIDTH ) ;
m_hellScale = min ( m_hellScale , HELL_LEVEL_MAX_SCALE ) ;
m_hellScale = max ( m_hellScale , HELL_LEVEL_MIN_SCALE ) ;
int hellXZSize = m_xzSize / m_hellScale ;
while ( hellXZSize > HELL_LEVEL_MAX_WIDTH & & m_hellScale < HELL_LEVEL_MAX_SCALE )
{
+ + m_hellScale ;
hellXZSize = m_xzSize / m_hellScale ;
}
/* 4J - we don't store this anymore
2026-03-02 15:53:32 +07:00
if ( tag - > contains ( L " Player " ) )
2026-03-01 12:16:08 +08:00
{
loadedPlayerTag = tag - > getCompound ( L " Player " ) ;
dimension = loadedPlayerTag - > getInt ( L " Dimension " ) ;
}
else
2026-03-02 15:53:32 +07:00
{
2026-03-01 12:16:08 +08:00
this - > loadedPlayerTag = NULL ;
}
*/
dimension = 0 ;
}
2026-03-02 15:53:32 +07:00
LevelData : : LevelData ( LevelSettings * levelSettings , const wstring & levelName )
2026-03-01 12:16:08 +08:00
{
this - > seed = levelSettings - > getSeed ( ) ;
this - > gameType = levelSettings - > getGameType ( ) ;
this - > generateMapFeatures = levelSettings - > isGenerateMapFeatures ( ) ;
this - > spawnBonusChest = levelSettings - > hasStartingBonusItems ( ) ;
this - > levelName = levelName ;
this - > m_pGenerator = levelSettings - > getLevelType ( ) ;
this - > hardcore = levelSettings - > isHardcore ( ) ;
2026-03-02 15:53:32 +07:00
// 4J Stu - Default initers
2026-03-01 12:16:08 +08:00
this - > xSpawn = 0 ;
this - > ySpawn = 0 ;
this - > zSpawn = 0 ;
this - > time = - 1 ; // 4J-JEV: Edited: To know when this is uninitialized.
this - > lastPlayed = 0 ;
this - > sizeOnDisk = 0 ;
// this->loadedPlayerTag = NULL; // 4J - we don't store this anymore
this - > dimension = 0 ;
this - > version = 0 ;
this - > rainTime = 0 ;
this - > raining = false ;
this - > thunderTime = 0 ;
this - > thundering = false ;
this - > allowCommands = levelSettings - > getAllowCommands ( ) ;
this - > initialized = false ;
this - > newSeaLevel = levelSettings - > useNewSeaLevel ( ) ; // 4J added - only use new sea level for newly created maps (sea level changes in 1.8.2)
this - > hasBeenInCreative = levelSettings - > getGameType ( ) = = GameType : : CREATIVE ; // 4J added
// 4J-PB for the stronghold position
this - > bStronghold = false ;
this - > xStronghold = 0 ;
this - > yStronghold = 0 ;
this - > zStronghold = 0 ;
this - > xStrongholdEndPortal = 0 ;
this - > zStrongholdEndPortal = 0 ;
this - > bStrongholdEndPortal = false ;
m_xzSize = levelSettings - > getXZSize ( ) ;
m_hellScale = levelSettings - > getHellScale ( ) ;
2026-03-02 15:53:32 +07:00
2026-03-01 12:16:08 +08:00
m_xzSize = min ( m_xzSize , LEVEL_MAX_WIDTH ) ;
m_xzSize = max ( m_xzSize , LEVEL_MIN_WIDTH ) ;
m_hellScale = min ( m_hellScale , HELL_LEVEL_MAX_SCALE ) ;
m_hellScale = max ( m_hellScale , HELL_LEVEL_MIN_SCALE ) ;
int hellXZSize = m_xzSize / m_hellScale ;
while ( hellXZSize > HELL_LEVEL_MAX_WIDTH & & m_hellScale < HELL_LEVEL_MAX_SCALE )
{
+ + m_hellScale ;
hellXZSize = m_xzSize / m_hellScale ;
}
}
LevelData : : LevelData ( LevelData * copy )
{
this - > seed = copy - > seed ;
this - > m_pGenerator = copy - > m_pGenerator ;
this - > gameType = copy - > gameType ;
this - > generateMapFeatures = copy - > generateMapFeatures ;
this - > spawnBonusChest = copy - > spawnBonusChest ;
this - > xSpawn = copy - > xSpawn ;
this - > ySpawn = copy - > ySpawn ;
this - > zSpawn = copy - > zSpawn ;
this - > time = copy - > time ;
this - > lastPlayed = copy - > lastPlayed ;
this - > sizeOnDisk = copy - > sizeOnDisk ;
// this->loadedPlayerTag = copy->loadedPlayerTag; // 4J - we don't store this anymore
this - > dimension = copy - > dimension ;
this - > levelName = copy - > levelName ;
this - > version = copy - > version ;
this - > rainTime = copy - > rainTime ;
this - > raining = copy - > raining ;
this - > thunderTime = copy - > thunderTime ;
this - > thundering = copy - > thundering ;
this - > hardcore = copy - > hardcore ;
this - > allowCommands = copy - > allowCommands ;
this - > initialized = copy - > initialized ;
this - > newSeaLevel = copy - > newSeaLevel ;
this - > hasBeenInCreative = copy - > hasBeenInCreative ;
// 4J-PB for the stronghold position
this - > bStronghold = copy - > bStronghold ;
this - > xStronghold = copy - > xStronghold ;
this - > yStronghold = copy - > yStronghold ;
this - > zStronghold = copy - > zStronghold ;
this - > xStrongholdEndPortal = copy - > xStrongholdEndPortal ;
this - > zStrongholdEndPortal = copy - > zStrongholdEndPortal ;
this - > bStrongholdEndPortal = copy - > bStrongholdEndPortal ;
m_xzSize = copy - > m_xzSize ;
m_hellScale = copy - > m_hellScale ;
}
CompoundTag * LevelData : : createTag ( )
{
CompoundTag * tag = new CompoundTag ( ) ;
setTagData ( tag ) ;
return tag ;
}
2026-03-02 15:53:32 +07:00
CompoundTag * LevelData : : createTag ( vector < shared_ptr < Player > > * players )
2026-03-01 12:16:08 +08:00
{
// 4J - removed all code for storing tags for players
return createTag ( ) ;
}
2026-03-02 15:53:32 +07:00
void LevelData : : setTagData ( CompoundTag * tag )
2026-03-01 12:16:08 +08:00
{
tag - > putLong ( L " RandomSeed " , seed ) ;
tag - > putString ( L " generatorName " , m_pGenerator - > getGeneratorName ( ) ) ;
tag - > putInt ( L " generatorVersion " , m_pGenerator - > getVersion ( ) ) ;
tag - > putInt ( L " GameType " , gameType - > getId ( ) ) ;
tag - > putBoolean ( L " MapFeatures " , generateMapFeatures ) ;
tag - > putBoolean ( L " spawnBonusChest " , spawnBonusChest ) ;
tag - > putInt ( L " SpawnX " , xSpawn ) ;
tag - > putInt ( L " SpawnY " , ySpawn ) ;
tag - > putInt ( L " SpawnZ " , zSpawn ) ;
tag - > putLong ( L " Time " , time ) ;
tag - > putLong ( L " SizeOnDisk " , sizeOnDisk ) ;
tag - > putLong ( L " LastPlayed " , System : : currentTimeMillis ( ) ) ;
tag - > putString ( L " LevelName " , levelName ) ;
tag - > putInt ( L " version " , version ) ;
tag - > putInt ( L " rainTime " , rainTime ) ;
tag - > putBoolean ( L " raining " , raining ) ;
tag - > putInt ( L " thunderTime " , thunderTime ) ;
tag - > putBoolean ( L " thundering " , thundering ) ;
tag - > putBoolean ( L " hardcore " , hardcore ) ;
tag - > putBoolean ( L " allowCommands " , allowCommands ) ;
tag - > putBoolean ( L " initialized " , initialized ) ;
tag - > putBoolean ( L " newSeaLevel " , newSeaLevel ) ;
tag - > putBoolean ( L " hasBeenInCreative " , hasBeenInCreative ) ;
// store the stronghold position
tag - > putBoolean ( L " hasStronghold " , bStronghold ) ;
tag - > putInt ( L " StrongholdX " , xStronghold ) ;
tag - > putInt ( L " StrongholdY " , yStronghold ) ;
tag - > putInt ( L " StrongholdZ " , zStronghold ) ;
// store the stronghold end portal position
tag - > putBoolean ( L " hasStrongholdEndPortal " , bStrongholdEndPortal ) ;
tag - > putInt ( L " StrongholdEndPortalX " , xStrongholdEndPortal ) ;
tag - > putInt ( L " StrongholdEndPortalZ " , zStrongholdEndPortal ) ;
tag - > putInt ( L " XZSize " , m_xzSize ) ;
tag - > putInt ( L " HellScale " , m_hellScale ) ;
}
2026-03-02 15:53:32 +07:00
int64_t LevelData : : getSeed ( )
2026-03-01 12:16:08 +08:00
{
return seed ;
}
2026-03-02 15:53:32 +07:00
int LevelData : : getXSpawn ( )
2026-03-01 12:16:08 +08:00
{
return xSpawn ;
}
2026-03-02 15:53:32 +07:00
int LevelData : : getYSpawn ( )
2026-03-01 12:16:08 +08:00
{
return ySpawn ;
}
int LevelData : : getZSpawn ( )
{
return zSpawn ;
}
2026-03-02 15:53:32 +07:00
int LevelData : : getXStronghold ( )
2026-03-01 12:16:08 +08:00
{
return xStronghold ;
}
int LevelData : : getZStronghold ( )
{
return zStronghold ;
}
2026-03-02 15:53:32 +07:00
int LevelData : : getXStrongholdEndPortal ( )
2026-03-01 12:16:08 +08:00
{
return xStrongholdEndPortal ;
}
int LevelData : : getZStrongholdEndPortal ( )
{
return zStrongholdEndPortal ;
}
2026-03-02 15:53:32 +07:00
int64_t LevelData : : getTime ( )
2026-03-01 12:16:08 +08:00
{
return time ;
}
2026-03-02 15:53:32 +07:00
int64_t LevelData : : getSizeOnDisk ( )
2026-03-01 12:16:08 +08:00
{
return sizeOnDisk ;
}
CompoundTag * LevelData : : getLoadedPlayerTag ( )
{
return NULL ; // 4J - we don't store this anymore
}
// 4J Removed TU9 as it's never accurate due to the dimension never being set
//int LevelData::getDimension()
//{
// return dimension;
//}
2026-03-02 15:53:32 +07:00
void LevelData : : setSeed ( int64_t seed )
2026-03-01 12:16:08 +08:00
{
this - > seed = seed ;
}
void LevelData : : setXSpawn ( int xSpawn )
{
this - > xSpawn = xSpawn ;
}
2026-03-02 15:53:32 +07:00
void LevelData : : setYSpawn ( int ySpawn )
2026-03-01 12:16:08 +08:00
{
this - > ySpawn = ySpawn ;
}
void LevelData : : setZSpawn ( int zSpawn )
{
this - > zSpawn = zSpawn ;
}
void LevelData : : setHasStronghold ( )
{
this - > bStronghold = true ;
}
bool LevelData : : getHasStronghold ( )
{
return this - > bStronghold ;
}
void LevelData : : setXStronghold ( int xStronghold )
{
this - > xStronghold = xStronghold ;
}
void LevelData : : setZStronghold ( int zStronghold )
{
this - > zStronghold = zStronghold ;
}
void LevelData : : setHasStrongholdEndPortal ( )
{
this - > bStrongholdEndPortal = true ;
}
bool LevelData : : getHasStrongholdEndPortal ( )
{
return this - > bStrongholdEndPortal ;
}
void LevelData : : setXStrongholdEndPortal ( int xStrongholdEndPortal )
{
this - > xStrongholdEndPortal = xStrongholdEndPortal ;
}
void LevelData : : setZStrongholdEndPortal ( int zStrongholdEndPortal )
{
this - > zStrongholdEndPortal = zStrongholdEndPortal ;
}
2026-03-02 15:53:32 +07:00
void LevelData : : setTime ( int64_t time )
2026-03-01 12:16:08 +08:00
{
this - > time = time ;
}
2026-03-02 15:53:32 +07:00
void LevelData : : setSizeOnDisk ( int64_t sizeOnDisk )
2026-03-01 12:16:08 +08:00
{
this - > sizeOnDisk = sizeOnDisk ;
}
void LevelData : : setLoadedPlayerTag ( CompoundTag * loadedPlayerTag )
{
// 4J - we don't store this anymore
// this->loadedPlayerTag = loadedPlayerTag;
}
// 4J Remove TU9 as it's never used
2026-03-02 15:53:32 +07:00
//void LevelData::setDimension(int dimension)
2026-03-01 12:16:08 +08:00
//{
// this->dimension = dimension;
//}
void LevelData : : setSpawn ( int xSpawn , int ySpawn , int zSpawn )
{
this - > xSpawn = xSpawn ;
this - > ySpawn = ySpawn ;
this - > zSpawn = zSpawn ;
}
2026-03-02 15:53:32 +07:00
wstring LevelData : : getLevelName ( )
2026-03-01 12:16:08 +08:00
{
return levelName ;
}
void LevelData : : setLevelName ( const wstring & levelName )
{
this - > levelName = levelName ;
}
2026-03-02 15:53:32 +07:00
int LevelData : : getVersion ( )
2026-03-01 12:16:08 +08:00
{
return version ;
}
void LevelData : : setVersion ( int version )
{
this - > version = version ;
}
2026-03-02 15:53:32 +07:00
int64_t LevelData : : getLastPlayed ( )
2026-03-01 12:16:08 +08:00
{
return lastPlayed ;
}
bool LevelData : : isThundering ( )
{
return thundering ;
}
void LevelData : : setThundering ( bool thundering )
{
this - > thundering = thundering ;
}
int LevelData : : getThunderTime ( )
{
return thunderTime ;
}
void LevelData : : setThunderTime ( int thunderTime )
{
this - > thunderTime = thunderTime ;
}
2026-03-02 15:53:32 +07:00
bool LevelData : : isRaining ( )
2026-03-01 12:16:08 +08:00
{
return raining ;
}
void LevelData : : setRaining ( bool raining )
{
this - > raining = raining ;
}
int LevelData : : getRainTime ( )
{
return rainTime ;
}
void LevelData : : setRainTime ( int rainTime )
{
this - > rainTime = rainTime ;
}
GameType * LevelData : : getGameType ( )
{
return gameType ;
}
bool LevelData : : isGenerateMapFeatures ( )
{
return generateMapFeatures ;
}
bool LevelData : : getSpawnBonusChest ( )
{
return spawnBonusChest ;
}
void LevelData : : setGameType ( GameType * gameType )
{
this - > gameType = gameType ;
// 4J Added
hasBeenInCreative = hasBeenInCreative | | ( gameType = = GameType : : CREATIVE ) | | app . GetGameHostOption ( eGameHostOption_CheatsEnabled ) > 0 ;
}
bool LevelData : : useNewSeaLevel ( )
{
return newSeaLevel ;
}
bool LevelData : : getHasBeenInCreative ( )
{
return hasBeenInCreative ;
}
void LevelData : : setHasBeenInCreative ( bool value )
{
hasBeenInCreative = value ;
}
2026-03-02 15:53:32 +07:00
LevelType * LevelData : : getGenerator ( )
2026-03-01 12:16:08 +08:00
{
return m_pGenerator ;
}
2026-03-02 15:53:32 +07:00
void LevelData : : setGenerator ( LevelType * generator )
2026-03-01 12:16:08 +08:00
{
m_pGenerator = generator ;
}
bool LevelData : : isHardcore ( )
{
return hardcore ;
}
bool LevelData : : getAllowCommands ( )
{
return allowCommands ;
}
void LevelData : : setAllowCommands ( bool allowCommands )
{
this - > allowCommands = allowCommands ;
}
bool LevelData : : isInitialized ( )
{
return initialized ;
}
void LevelData : : setInitialized ( bool initialized )
{
this - > initialized = initialized ;
}
int LevelData : : getXZSize ( )
{
return m_xzSize ;
}
int LevelData : : getHellScale ( )
{
return m_hellScale ;
}