Files
minecraft-pe-0.6.1/src/world/level/Level.h
2026-03-02 22:04:18 +03:00

344 lines
11 KiB
C++
Executable File

#ifndef NET_MINECRAFT_WORLD_LEVEL__Level_H__
#define NET_MINECRAFT_WORLD_LEVEL__Level_H__
//package net.minecraft.world.level;
#include <set>
#include <string>
//#include "world/Difficulty.h"
#include "LevelSettings.h"
#include "LevelConstants.h"
#include "ChunkPos.h"
#include "TickNextTickData.h"
#include "storage/LevelData.h"
#include "LightUpdate.h"
#include "LevelSource.h"
#include "../Pos.h"
#include "../../SharedConstants.h"
#include "biome/Biome.h"
class BiomeSource;
class Dimension;
class ChunkSource;
class LevelStorage;
class LightLayer;
class Path;
class TripodCamera;
class Player;
class PathFinder;
class LevelListener;
class IRakNetInstance;
class Zombie;
class TileEntity;
typedef std::vector<Entity*> EntityList;
typedef std::map<int, Entity*> EntityMap;
typedef std::vector<TileEntity*> TileEntityList;
typedef std::vector<Player*> PlayerList;
typedef std::vector<LevelListener*> ListenerList;
typedef std::set<ChunkPos> ChunkPosSet;
typedef std::set<TickNextTickData> TickDataSet;
typedef std::vector<LightUpdate> LightUpdateList;
typedef struct PRInfo {
PRInfo(Entity* e, int ticks): e(e), ticks(ticks) {}
Entity* e;
int ticks;
} PRInfo;
typedef std::vector<PRInfo> PendingList;
typedef struct AdventureSettings {
AdventureSettings();
bool doTickTime;
bool noPvP;
bool noPvM;
bool noMvP;
bool immutableWorld;
bool showNameTags;
} AdventureSettings;
class Level: public LevelSource
{
static const int MAX_TICK_TILES_PER_TICK = 100; // was 1000
public:
static const int MAX_LEVEL_SIZE = 32000000;
static const short DEPTH = LEVEL_HEIGHT;
static const short SEA_LEVEL = DEPTH / 2 - 1;
static const int MAX_BRIGHTNESS = 15;
static const int TICKS_PER_DAY = SharedConstants::TicksPerSecond * 60 * 16;// SharedConstants::TicksPerSecond * 60 * 12; // ORG:20*60*20
static const int MIDDLE_OF_NIGHT_TIME = 12000;
static const int genDepthBits = 7;
static const int genDepthBitsPlusFour = genDepthBits + 4;
static const int genDepth = 1 << genDepthBits;
static const int genDepthMinusOne = genDepth - 1;
Level(LevelStorage* levelStorage, const std::string& levelName, const LevelSettings& settings, int generatorVersion, Dimension* fixedDimension = NULL);
virtual ~Level();
void _init(const std::string& levelName, const LevelSettings& settings, int levelVersion, Dimension* fixedDimension);
void validateSpawn();
int getTopTile(int x, int z);
int getTopTileY(int x, int z);
int getTopSolidBlock(int x, int z);
bool isEmptyTile(int x, int y, int z);
bool isSolidRenderTile(int x, int y, int z);
bool isSolidBlockingTile(int x, int y, int z);
int getTile(int x, int y, int z);
bool setTile(int x, int y, int z, int tile);
bool hasChunkAt(int x, int y, int z);
bool hasChunksAt(int x, int y, int z, int r);
bool hasChunksAt(int x0, int y0, int z0, int x1, int y1, int z1);
bool hasChunk(int x, int z);
LevelChunk* getChunkAt(int x, int z);
LevelChunk* getChunk(int x, int z);
bool setTileAndDataNoUpdate(int x, int y, int z, int tile, int data);
bool setTileNoUpdate(int x, int y, int z, int tile);
int getData(int x, int y, int z);
void setData(int x, int y, int z, int data);
bool setDataNoUpdate(int x, int y, int z, int data);
bool setTileAndData(int x, int y, int z, int tile, int data);
void sendTileUpdated(int x, int y, int z);
void lightColumnChanged(int x, int z, int y0, int y1);
void setTileDirty(int x, int y, int z);
void setTilesDirty(int x0, int y0, int z0, int x1, int y1, int z1);
const Material* getMaterial(int x, int y, int z);
void loadPlayer(Player* player, bool doAddPlayer);
void swap(int x1, int y1, int z1, int x2, int y2, int z2);
void updateNeighborsAt(int x, int y, int z, int tile);
int getHeightmap(int x, int z);
BiomeSource* getBiomeSource();
Biome* getBiome(int x, int z);
int getRawBrightness(int x, int y, int z);
int getRawBrightness(int x, int y, int z, bool propagate);
float getBrightness(int x, int y, int z);
int getBrightness(const LightLayer& layer, int x, int y, int z);
void setBrightness(const LightLayer& layer, int x, int y, int z, int brightness);
void updateLightIfOtherThan(const LightLayer& layer, int x, int y, int z, int expected);
int getLightsToUpdate();
bool updateLights();
void setUpdateLights(bool doUpdate);
void updateLight(const LightLayer& layer, int x0, int y0, int z0, int x1, int y1, int z1);
void updateLight(const LightLayer& layer, int x0, int y0, int z0, int x1, int y1, int z1, bool join);
//HitResult clip(const Vec3& a, const Vec3& b);
HitResult clip(const Vec3& a, const Vec3& b, bool liquid = false, bool solidOnly = false);
bool addEntity(Entity* e);
void removeEntity(Entity* e);
void removePlayer( Player* player );
//void removeEntityImmediately(Entity* e);
//void removeAllPendingEntityRemovals();
Entity* getEntity(int entityId);
Mob* getMob(int entityId);
Biome::MobSpawnerData getRandomMobSpawnAt(const MobCategory& mobCategory, int x, int y, int z);
void addListener(LevelListener* listener);
void removeListener(LevelListener* listener);
void dispatchEntityData(Entity* e);
std::vector<AABB> boxes;
std::vector<AABB>& getCubes(const Entity* source, const AABB& box);
bool isDay();
float getTimeOfDay(float a);
float getSunAngle(float a);
int getSkyDarken(float a);
Vec3 getFogColor(float a);
Vec3 getCloudColor(float a);
Vec3 getSkyColor(Entity* source, float a);
bool canSeeSky(int x, int y, int z);
int getLightDepth(int x, int z);
float getStarBrightness(float a);
bool updateSkyBrightness();
bool isSkyLit(int x, int y, int z);
void tickEntities();
virtual void tick();
void tick(Entity* e);
void tick(Entity* e, bool actual);
bool tickPendingTicks(bool force);
void animateTick(int xt, int yt, int zt);
void addToTickNextTick(int x, int y, int z, int tileId, int tickDelay);
bool isUnobstructed(const AABB& aabb);
float getSeenPercent(const Vec3& center, const AABB& bb);
void explode(Entity* source, float x, float y, float z, float r);
void explode(Entity* source, float x, float y, float z, float r, bool fire);
bool containsAnyLiquid(const AABB& box);
bool containsFireTile(const AABB& box);
bool containsMaterial(const AABB& box, const Material* material);
bool containsLiquid(const AABB& box, const Material* material);
bool checkAndHandleWater(const AABB& box, const Material* material, Entity* e);
void extinguishFire(int x, int y, int z, int face);
//void addEntities(const EntityList& list);
//void removeEntities(const EntityList& list);
//void ensureAdded(Entity* entity);
EntityList& getEntities(Entity* except, const AABB& bb);
const EntityList& getAllEntities();
TileEntity* getTileEntity(int x, int y, int z);
void setTileEntity(int x, int y, int z, TileEntity* tileEntity);
void removeTileEntity(int x, int y, int z);
void tileEntityChanged(int x, int y, int z, TileEntity* te);
void prepare();
bool isNew() { return _isNew; }
int getSeaLevel();
bool mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, unsigned char face);
bool mayInteract(Player* player, int xt, int yt, int zt);
bool findPath(Path* path, Entity* from, Entity* to, float maxDist, bool canOpenDoors, bool avoidWater);
bool findPath(Path* path, Entity* from, int xBest, int yBest, int zBest, float maxDist, bool canOpenDoors, bool avoidWater);
bool getDirectSignal(int x, int y, int z, int dir);
bool hasDirectSignal(int x, int y, int z);
bool getSignal(int x, int y, int z, int dir);
bool hasNeighborSignal(int x, int y, int z);
Player* getNearestPlayer(Entity* source, float maxDist);
Player* getNearestPlayer(float x, float y, float z, float maxDist);
int getEntitiesOfType(int entityType, const AABB& bb, EntityList& list);
int getEntitiesOfClass(int type, const AABB& bb, EntityList& list);
int countInstanceOfType(int typeId);
int countInstanceOfBaseType(int baseTypeId);
// Not currently used in MC either but will perhaps be used later.
virtual void updateSleepingPlayerList() {}
long getTime();
void setTime(long time);
long getSeed();
Pos getSharedSpawnPos();
void setSpawnPos(Pos spawnPos);
void setSpawnSettings(bool spawnEnemies, bool spawnFriendlies);
ChunkSource* getChunkSource();
LevelStorage* getLevelStorage();
LevelData* getLevelData();
void saveLevelData();
//void savePlayerData();
void saveGame();
void loadEntities();
void addParticle(const std::string& id, float x, float y, float z, float xd, float yd, float zd, int data = 0);
void addParticle(ParticleType::Id id, float x, float y, float z, float xd, float yd, float zd, int data = 0);
void playSound(Entity* entity, const std::string& name, float volume, float pitch);
void playSound(float x, float y, float z, const std::string& name, float volume, float pitch);
void levelEvent(Player* source, int type, int x, int y, int z, int data);
void tileEvent(int x, int y, int z, int b0, int b1);
void broadcastEntityEvent(Entity* e, char eventId);
void awakenAllPlayers();
void takePicture( TripodCamera* cam, Entity* e );
/**
* Sets the initial spawn, created this method so we could do a special
* location for the demo version.
*/
/*virtual*/ void setInitialSpawn();
bool inRange(int x, int y, int z);
protected:
void setZombieAi(std::vector<Zombie*>& zombies);
/*virtual*/ void entityAdded(Entity* e);
/*virtual*/ void entityRemoved(Entity* e);
/*virtual*/ void tileUpdated(int x, int y, int z, int tile);
void updateSkyDarken();
virtual ChunkSource* createChunkSource();
private:
void neighborChanged(int x, int y, int z, int type);
//void saveAllChunks();
void tickTiles();
public:
bool instaTick;
bool isClientSide;
bool isGeneratingTerrain;
int difficulty;
AdventureSettings adventureSettings;
int isNightMode();
void setNightMode(bool isNightMode);
EntityList entities;
EntityMap entityIdLookup;
TileEntityList tileEntities;
TileEntityList pendingTileEntities;
bool updatingTileEntities;
PlayerList players;
int skyDarken;
bool noNeighborUpdate;
Dimension* dimension;
IRakNetInstance* raknetInstance;
Random random;
protected:
bool isFindingSpawn;
ListenerList _listeners;
ChunkSource* _chunkSource;
LevelStorage* const levelStorage;
LevelData levelData;
bool allPlayersAreSleeping;
bool _spawnFriendlies;
bool _spawnEnemies;
int _randValue;
int _addend;
private:
EntityList _es;
//EntityList _entitiesToRemove;
TickDataSet _tickNextTickSet;
ChunkPosSet _chunksToPoll;
LightUpdateList _lightUpdates;
EntityMap _pendingEntityData;
bool _updateLights;
int _maxRecurse;
bool _isNew;
bool _nightMode;
PathFinder* _pathFinder;
float _lastSavedPlayerTime;
PendingList _pendingPlayerRemovals;
};
#endif /*NET_MINECRAFT_WORLD_LEVEL__Level_H__*/