cleanup World references

This commit is contained in:
MihailRis 2026-06-20 22:17:27 +03:00
parent ac00c561ee
commit c73b036099
18 changed files with 45 additions and 45 deletions

View file

@ -57,7 +57,7 @@ void ServerMainloop::run() {
} }
process->update(); process->update();
if (controller) { if (controller) {
controller->getLevel()->getWorld()->updateTimers(delta); controller->getLevel()->getWorld().updateTimers(delta);
controller->update(glm::min(delta, 0.2), false); controller->update(glm::min(delta, 0.2), false);
} }
engine.applicationTick(); engine.applicationTick();

View file

@ -254,7 +254,7 @@ std::shared_ptr<UINode> create_debug_panel(
} }
})); }));
panel->add(create_label(gui, [&]() { panel->add(create_label(gui, [&]() {
return L"seed: " + std::to_wstring(level.getWorld()->getSeed()); return L"seed: " + std::to_wstring(level.getWorld().getSeed());
})); }));
for (int ax = 0; ax < 3; ax++) { for (int ax = 0; ax < 3; ax++) {
@ -294,7 +294,7 @@ std::shared_ptr<UINode> create_debug_panel(
sub->add(box, glm::vec2(20, 0)); sub->add(box, glm::vec2(20, 0));
panel->add(sub); panel->add(sub);
} }
auto& worldInfo = level.getWorld()->getInfo(); auto& worldInfo = level.getWorld().getInfo();
panel->add(create_label(gui, [&]() { panel->add(create_label(gui, [&]() {
int hour, minute, second; int hour, minute, second;
timeutil::from_value(worldInfo.daytime, hour, minute, second); timeutil::from_value(worldInfo.daytime, hour, minute, second);

View file

@ -43,7 +43,7 @@ LevelScreen::LevelScreen(
Engine& engine, std::unique_ptr<Level> levelPtr, int64_t localPlayer Engine& engine, std::unique_ptr<Level> levelPtr, int64_t localPlayer
) )
: Screen(engine), : Screen(engine),
world(*levelPtr->getWorld()), world(levelPtr->getWorld()),
postProcessing(std::make_unique<PostProcessing>( postProcessing(std::make_unique<PostProcessing>(
levelPtr->content.getIndices(ResourceType::POST_EFFECT_SLOT).size() levelPtr->content.getIndices(ResourceType::POST_EFFECT_SLOT).size()
)), )),
@ -98,7 +98,7 @@ LevelScreen::LevelScreen(
return false; return false;
})); }));
controller->preQuitCallbacks.listen([this]() { controller->preQuitCallbacks.listen([this]() {
if (!controller->getLevel()->getWorld()->isNameless()) { if (!controller->getLevel()->getWorld().isNameless()) {
saveWorldPreview(); saveWorldPreview();
} }
}); });
@ -109,7 +109,7 @@ LevelScreen::LevelScreen(
} }
LevelScreen::~LevelScreen() { LevelScreen::~LevelScreen() {
if (!controller->getLevel()->getWorld()->isNameless()) { if (!controller->getLevel()->getWorld().isNameless()) {
saveDecorations(); saveDecorations();
} }
scripting::on_frontend_close(); scripting::on_frontend_close();

View file

@ -99,7 +99,7 @@ void Shadows::setup(Shader& shader, const Weather& weather) {
if (!shadows) { if (!shadows) {
return; return;
} }
const auto& worldInfo = level.getWorld()->getInfo(); const auto& worldInfo = level.getWorld().getInfo();
float cloudsIntensity = weather.clouds(); float cloudsIntensity = weather.clouds();
float shadowsOpacity = 1.0f - cloudsIntensity; float shadowsOpacity = 1.0f - cloudsIntensity;
shadowsOpacity *= glm::sqrt(glm::abs( shadowsOpacity *= glm::sqrt(glm::abs(
@ -158,8 +158,8 @@ void Shadows::generateShadowsMap(
float scale, float scale,
const std::function<void(Camera&)>& renderShadowPass const std::function<void(Camera&)>& renderShadowPass
) { ) {
auto world = level.getWorld(); const auto& world = level.getWorld();
const auto& worldInfo = world->getInfo(); const auto& worldInfo = world.getInfo();
int resolution = shadowMap.getResolution(); int resolution = shadowMap.getResolution();
float shadowMapScale = 0.32f / (1 << glm::max(0, quality)) * scale; float shadowMapScale = 0.32f / (1 << glm::max(0, quality)) * scale;

View file

@ -201,7 +201,7 @@ void WorldRenderer::setupWorldShader(
shader.uniform1f("u_fogCurve", settings.graphics.fogCurve.get()); shader.uniform1f("u_fogCurve", settings.graphics.fogCurve.get());
shader.uniform1i("u_debugLights", lightsDebug); shader.uniform1i("u_debugLights", lightsDebug);
shader.uniform1i("u_debugNormals", false); shader.uniform1i("u_debugNormals", false);
shader.uniform1f("u_dayTime", level.getWorld()->getInfo().daytime); shader.uniform1f("u_dayTime", level.getWorld().getInfo().daytime);
shader.uniform2f("u_lightDir", skybox->getLightDir()); shader.uniform2f("u_lightDir", skybox->getLightDir());
shader.uniform1i("u_skybox", advanced_pipeline::TARGET_SKYBOX); shader.uniform1i("u_skybox", advanced_pipeline::TARGET_SKYBOX);
@ -341,7 +341,7 @@ void WorldRenderer::renderFrameClassic(
bool hudVisible, bool hudVisible,
PostProcessing& postProcessing PostProcessing& postProcessing
) { ) {
const auto& worldInfo = level.getWorld()->getInfo(); const auto& worldInfo = level.getWorld().getInfo();
DrawContext ctx = pctx.sub(); DrawContext ctx = pctx.sub();
ctx.setDepthTest(true); ctx.setDepthTest(true);
@ -381,7 +381,7 @@ void WorldRenderer::renderFrameAdvanced(
PostProcessing& postProcessing PostProcessing& postProcessing
) { ) {
const auto& settings = engine.getSettings(); const auto& settings = engine.getSettings();
const auto& worldInfo = level.getWorld()->getInfo(); const auto& worldInfo = level.getWorld().getInfo();
float fogFactor = calcFogFactor(); float fogFactor = calcFogFactor();
shadowMapping->refresh(camera, pctx, [this, &camera](Camera& shadowCamera) { shadowMapping->refresh(camera, pctx, [this, &camera](Camera& shadowCamera) {
@ -401,8 +401,6 @@ void WorldRenderer::renderFrameAdvanced(
ctx.useTexture(advanced_pipeline::TARGET_COLOR, nullptr); ctx.useTexture(advanced_pipeline::TARGET_COLOR, nullptr);
postProcessing.bindDepthBuffer(); postProcessing.bindDepthBuffer();
// Background sky plane
skybox->draw( skybox->draw(
level.environment, ctx, camera, worldInfo.daytime, weather.clouds() level.environment, ctx, camera, worldInfo.daytime, weather.clouds()
); );
@ -441,7 +439,7 @@ void WorldRenderer::renderFrame(
dirtySettings = false; dirtySettings = false;
} }
const auto& worldInfo = level.getWorld()->getInfo(); const auto& worldInfo = level.getWorld().getInfo();
float clouds = weather.clouds(); float clouds = weather.clouds();
float random = rand() / static_cast<float>(RAND_MAX); float random = rand() / static_cast<float>(RAND_MAX);

View file

@ -12,7 +12,7 @@ Inventories::Inventories(Level& level) : level(level) {
Inventories::~Inventories() = default; Inventories::~Inventories() = default;
std::shared_ptr<Inventory> Inventories::create(size_t size) { std::shared_ptr<Inventory> Inventories::create(size_t size) {
int64_t id = level.getWorld()->getNextInventoryId(); int64_t id = level.getWorld().getNextInventoryId();
auto inv = std::make_shared<Inventory>(id, size); auto inv = std::make_shared<Inventory>(id, size);
store(inv); store(inv);
return inv; return inv;
@ -52,7 +52,7 @@ std::shared_ptr<Inventory> Inventories::clone(int64_t id) {
auto original = get(id); auto original = get(id);
if (original == nullptr) return nullptr; if (original == nullptr) return nullptr;
auto clone = std::make_shared<Inventory>(*original); auto clone = std::make_shared<Inventory>(*original);
clone->setId(level.getWorld()->getNextInventoryId()); clone->setId(level.getWorld().getNextInventoryId());
store(clone); store(clone);
return clone; return clone;
} }

View file

@ -27,7 +27,7 @@ ChunksController::ChunksController(Level& level)
generator(std::make_unique<WorldGenerator>( generator(std::make_unique<WorldGenerator>(
level.content.generators.require(level.environment.generator), level.content.generators.require(level.environment.generator),
level.content, level.content,
level.getWorld()->getSeed() level.getWorld().getSeed()
)) {} )) {}
ChunksController::~ChunksController() = default; ChunksController::~ChunksController() = default;

View file

@ -283,7 +283,7 @@ void EngineController::createWorld(
// generator-based environments must die in 1.0 // generator-based environments must die in 1.0
bool genBasedEnv = false; bool genBasedEnv = false;
if (auto genDef = generators.find(environment)) { if (generators.find(environment)) {
genBasedEnv = true; genBasedEnv = true;
} }
@ -314,8 +314,8 @@ void EngineController::setLocalPlayer(int64_t player) {
localPlayer = player; localPlayer = player;
} }
void EngineController::reopenWorld(World* world) { void EngineController::reopenWorld(World& world) {
std::string name = world->wfile->getFolder().name(); std::string name = world.wfile->getFolder().name();
engine.onWorldClosed(); engine.onWorldClosed();
openWorld(name, true); openWorld(name, true);
} }
@ -384,16 +384,16 @@ void EngineController::reconfigPacks(
} }
} else { } else {
auto level = controller->getLevel(); auto level = controller->getLevel();
auto world = level->getWorld(); auto& world = level->getWorld();
controller->processBeforeQuit(); controller->processBeforeQuit();
controller->saveWorld(); controller->saveWorld();
auto names = PacksManager::getNames(world->getPacks()); auto names = PacksManager::getNames(world.getPacks());
auto& manager = contentControl.scan(); auto& manager = contentControl.scan();
reconfig_packs_inside(manager, names, packsToAdd, packsToRemove); reconfig_packs_inside(manager, names, packsToAdd, packsToRemove);
const auto& settings = engine.getSettings(); const auto& settings = engine.getSettings();
auto& wfile = *world->wfile; auto& wfile = *world.wfile;
if (!settings.debug.generatorTestMode.get()) { if (!settings.debug.generatorTestMode.get()) {
wfile.removeIndices(packsToRemove); wfile.removeIndices(packsToRemove);
} }

View file

@ -41,5 +41,5 @@ public:
void setLocalPlayer(int64_t player); void setLocalPlayer(int64_t player);
void reopenWorld(World* world); void reopenWorld(World& world);
}; };

View file

@ -141,16 +141,16 @@ void LevelController::processBeforeQuit() {
} }
void LevelController::saveWorld() { void LevelController::saveWorld() {
auto world = level->getWorld(); auto& world = level->getWorld();
if (world->isNameless()) { if (world.isNameless()) {
logger.info() << "nameless world will not be saved"; logger.info() << "nameless world will not be saved";
return; return;
} }
logger.info() << "writing world '" << world->getName() << "'"; logger.info() << "writing world '" << world.getName() << "'";
world->wfile->createDirectories(); world.wfile->createDirectories();
scripting::on_world_save(); scripting::on_world_save();
level->onSave(); level->onSave();
level->getWorld()->write(*level); level->getWorld().write(*level);
} }
void LevelController::onWorldQuit() { void LevelController::onWorldQuit() {

View file

@ -33,7 +33,7 @@ static Level& require_level() {
} }
static WorldInfo& require_world_info() { static WorldInfo& require_world_info() {
return require_level().getWorld()->getInfo(); return require_level().getWorld().getInfo();
} }
static int l_is_open(lua::State* L) { static int l_is_open(lua::State* L) {
@ -136,7 +136,7 @@ static int l_get_chunk_data(lua::State* L) {
auto voxelData = std::make_unique<ubyte[]>(CHUNK_DATA_LEN); auto voxelData = std::make_unique<ubyte[]>(CHUNK_DATA_LEN);
std::vector<ubyte> chunkData; std::vector<ubyte> chunkData;
if (chunk == nullptr) { if (chunk == nullptr) {
auto& regions = level->getWorld()->wfile->getRegions(); auto& regions = level->getWorld().wfile->getRegions();
if (!regions.getVoxels(x, z, voxelData.get())) { if (!regions.getVoxels(x, z, voxelData.get())) {
return 0; return 0;
} }
@ -215,7 +215,7 @@ static int l_save_chunk_data(lua::State* L) {
reinterpret_cast<const ubyte*>(buffer.data()), reinterpret_cast<const ubyte*>(buffer.data()),
reinterpret_cast<const ubyte*>(buffer.data()) + buffer.size() reinterpret_cast<const ubyte*>(buffer.data()) + buffer.size()
), ),
level->getWorld()->wfile->getRegions() level->getWorld().wfile->getRegions()
); );
return 0; return 0;
} }

View file

@ -310,7 +310,7 @@ void scripting::on_world_load(LevelController* controller) {
for (auto& pack : content_control->getAllContentPacks()) { for (auto& pack : content_control->getAllContentPacks()) {
lua::emit_event(L, pack.id + ":.worldopen", [](auto L) { lua::emit_event(L, pack.id + ":.worldopen", [](auto L) {
return lua::pushboolean( return lua::pushboolean(
L, !scripting::level->getWorld()->getInfo().isLoaded L, !scripting::level->getWorld().getInfo().isLoaded
); );
}); });
} }

View file

@ -67,7 +67,7 @@ Player* Players::getNearest(const glm::vec3& position) const {
} }
Player* Players::create(int64_t id) { Player* Players::create(int64_t id) {
int64_t& nextPlayerID = level.getWorld()->getInfo().nextPlayerId; int64_t& nextPlayerID = level.getWorld().getInfo().nextPlayerId;
if (id == NONE) { if (id == NONE) {
id = nextPlayerID++; id = nextPlayerID++;
} else { } else {
@ -146,7 +146,7 @@ void Players::deserialize(const dv::value& src) {
auto& inventory = player->getInventory(); auto& inventory = player->getInventory();
// invalid inventory id pre 0.25 // invalid inventory id pre 0.25
if (inventory->getId() == 0) { if (inventory->getId() == 0) {
inventory->setId(level.getWorld()->getNextInventoryId()); inventory->setId(level.getWorld().getNextInventoryId());
} }
level.inventories->store(inventory); level.inventories->store(inventory);
} }

View file

@ -107,7 +107,7 @@ std::shared_ptr<Chunk> GlobalChunks::create(int x, int z, bool lighting) {
chunks_pool.create(x, z, lighting ? lightmaps_pool.create() : nullptr); chunks_pool.create(x, z, lighting ? lightmaps_pool.create() : nullptr);
chunksMap[keyfrom(x, z)] = chunk; chunksMap[keyfrom(x, z)] = chunk;
World& world = *level.getWorld(); World& world = level.getWorld();
auto& regions = world.wfile.get()->getRegions(); auto& regions = world.wfile.get()->getRegions();
if (regions.getVoxels(chunk->x, chunk->z, voxelDataBuffer.get())) { if (regions.getVoxels(chunk->x, chunk->z, voxelDataBuffer.get())) {
@ -197,7 +197,7 @@ void GlobalChunks::save(Chunk* chunk) {
if (!entities.empty()) { if (!entities.empty()) {
chunk->flags.entities = true; chunk->flags.entities = true;
} }
level.getWorld()->wfile->getRegions().put( level.getWorld().wfile->getRegions().put(
chunk, chunk,
chunk->flags.entities ? json::to_binary(root, true) chunk->flags.entities ? json::to_binary(root, true)
: std::vector<ubyte>() : std::vector<ubyte>()

View file

@ -71,12 +71,12 @@ Level::Level(
Level::~Level() = default; Level::~Level() = default;
World* Level::getWorld() { World& Level::getWorld() {
return world.get(); return *world;
} }
const World* Level::getWorld() const { const World& Level::getWorld() const {
return world.get(); return *world;
} }
void Level::onSave() { void Level::onSave() {

View file

@ -46,9 +46,9 @@ public:
); );
~Level(); ~Level();
World* getWorld(); World& getWorld();
const World* getWorld() const; const World& getWorld() const;
void onSave(); void onSave();

View file

@ -147,7 +147,7 @@ std::unique_ptr<Level> World::load(
if (!playerRoot["players"].empty()) { if (!playerRoot["players"].empty()) {
if (!playerRoot["players"][0].has("id")) { if (!playerRoot["players"][0].has("id")) {
level->getWorld()->getInfo().nextPlayerId++; level->getWorld().getInfo().nextPlayerId++;
} }
} }
} }

View file

@ -67,6 +67,8 @@ public:
const std::vector<ContentPack>& packs const std::vector<ContentPack>& packs
); );
World(const World&) = delete;
~World(); ~World();
/// @brief Update world day-time and total time /// @brief Update world day-time and total time