From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.Client/ServerLevel.h | 171 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 Minecraft.Client/ServerLevel.h (limited to 'Minecraft.Client/ServerLevel.h') diff --git a/Minecraft.Client/ServerLevel.h b/Minecraft.Client/ServerLevel.h new file mode 100644 index 00000000..644c15c0 --- /dev/null +++ b/Minecraft.Client/ServerLevel.h @@ -0,0 +1,171 @@ +#pragma once +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\JavaIntHash.h" +class ServerChunkCache; +class MinecraftServer; +class Node; +class EntityTracker; +class PlayerChunkMap; +using namespace std; + +class ServerLevel : public Level +{ +private: + static const int EMPTY_TIME_NO_TICK = SharedConstants::TICKS_PER_SECOND * 3; + + MinecraftServer *server; + EntityTracker *tracker; + PlayerChunkMap *chunkMap; + + CRITICAL_SECTION m_tickNextTickCS; // 4J added + set tickNextTickList; // 4J Was TreeSet + unordered_set tickNextTickSet; // 4J Was HashSet + + vector m_queuedSendTileUpdates; // 4J added + CRITICAL_SECTION m_csQueueSendTileUpdates; + +protected: + int saveInterval; + +public: + ServerChunkCache *cache; + bool canEditSpawn; + bool noSave; +private: + bool allPlayersSleeping; + int emptyTime; + bool m_bAtLeastOnePlayerSleeping; // 4J Added + static WeighedTreasureArray RANDOM_BONUS_ITEMS; // 4J - brought forward from 1.3.2 + + vector tileEvents[2]; + int activeTileEventsList; +public: + static void staticCtor(); + ServerLevel(MinecraftServer *server, shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings); + ~ServerLevel(); + void tick(); + Biome::MobSpawnerData *getRandomMobSpawnAt(MobCategory *mobCategory, int x, int y, int z); + void updateSleepingPlayerList(); +protected: + void awakenAllPlayers(); + +private: + void stopWeather(); + +public: + bool allPlayersAreSleeping(); + void validateSpawn(); + +protected: + void tickTiles(); + +public: + void addToTickNextTick(int x, int y, int z, int tileId, int tickDelay); + void forceAddTileTick(int x, int y, int z, int tileId, int tickDelay); + void tickEntities(); + bool tickPendingTicks(bool force); + vector *fetchTicksInChunk(LevelChunk *chunk, bool remove); + virtual void tick(shared_ptr e, bool actual); + void forceTick(shared_ptr e, bool actual); + bool AllPlayersAreSleeping() { return allPlayersSleeping;} // 4J added for a message to other players + bool isAtLeastOnePlayerSleeping() { return m_bAtLeastOnePlayerSleeping;} +protected: + ChunkSource *createChunkSource(); // 4J - was virtual, but was called from parent ctor +public: + vector > *getTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1); + virtual bool mayInteract(shared_ptr player, int xt, int yt, int zt, int id); +protected: + virtual void initializeLevel(LevelSettings *settings); + virtual void setInitialSpawn(LevelSettings *settings); + void generateBonusItemsNearSpawn(); // 4J - brought forward from 1.3.2 + +public: + Pos *getDimensionSpecificSpawn(); + + void Suspend(); // 4j Added for XboxOne PLM + + void save(bool force, ProgressListener *progressListener, bool bAutosave=false); + void saveToDisc(ProgressListener *progressListener, bool autosave); // 4J Added + +private: + void saveLevelData(); + + typedef unordered_map , IntKeyHash2, IntKeyEq> intEntityMap; + intEntityMap entitiesById; // 4J - was IntHashMap, using same hashing function as this uses +protected: + virtual void entityAdded(shared_ptr e); + virtual void entityRemoved(shared_ptr e); +public: + shared_ptr getEntity(int id); + virtual bool addGlobalEntity(shared_ptr e); + void broadcastEntityEvent(shared_ptr e, byte event); + virtual shared_ptr explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks); + virtual void tileEvent(int x, int y, int z, int tile, int b0, int b1); + +private: + void runTileEvents(); + bool doTileEvent(TileEventData *te); + +public: + void closeLevelStorage(); +protected: + virtual void tickWeather(); + +public: + MinecraftServer *getServer(); + EntityTracker *getTracker(); + void setTimeAndAdjustTileTicks(__int64 newTime); + PlayerChunkMap *getChunkMap(); + + void queueSendTileUpdate(int x, int y, int z); // 4J Added +private: + void runQueuedSendTileUpdates();// 4J Added + + // 4J - added for implementation of finite limit to number of item entities, tnt and falling block entities +public: + + static const int MAX_HANGING_ENTITIES = 400; + static const int MAX_ITEM_ENTITIES = 200; + static const int MAX_ARROW_ENTITIES = 200; + static const int MAX_EXPERIENCEORB_ENTITIES = 50; + static const int MAX_PRIMED_TNT = 20; + static const int MAX_FALLING_TILE = 20; + + int m_primedTntCount; + int m_fallingTileCount; + CRITICAL_SECTION m_limiterCS; + list< shared_ptr > m_itemEntities; + list< shared_ptr > m_hangingEntities; + list< shared_ptr > m_arrowEntities; + list< shared_ptr > m_experienceOrbEntities; + + virtual bool addEntity(shared_ptr e); + void entityAddedExtra(shared_ptr e); + void entityRemovedExtra(shared_ptr e); + + virtual bool newPrimedTntAllowed(); + virtual bool newFallingTileAllowed(); + + void flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFound); // 4J added + + // 4J added + static const int MAX_UPDATES = 256; + + // Each of these need to be duplicated for each level in the current game. As we currently only have 2 (over/nether), making this constant + static Level *m_level[3]; + static int m_updateChunkX[3][LEVEL_CHUNKS_TO_UPDATE_MAX]; + static int m_updateChunkZ[3][LEVEL_CHUNKS_TO_UPDATE_MAX]; + static int m_updateChunkCount[3]; + static int m_updateTileX[3][MAX_UPDATES]; + static int m_updateTileY[3][MAX_UPDATES]; + static int m_updateTileZ[3][MAX_UPDATES]; + static int m_updateTileCount[3]; + static int m_randValue[3]; + + static C4JThread::EventArray* m_updateTrigger; + static CRITICAL_SECTION m_updateCS[3]; + + static C4JThread* m_updateThread; + static int runUpdate(void* lpParam); + +}; -- cgit v1.2.3