diff --git a/dev/tests/example.lua b/dev/tests/example.lua index beb9fc0e..4c4c2e5d 100644 --- a/dev/tests/example.lua +++ b/dev/tests/example.lua @@ -1,4 +1,3 @@ -test.reconfig_packs({"base"}, {}) test.new_world("demo", "2019", "core:default") assert(world.get_generator() == "core:default") coroutine.yield() diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp index 27e254f3..8c649e8a 100644 --- a/src/logic/EngineController.cpp +++ b/src/logic/EngineController.cpp @@ -16,6 +16,7 @@ #include "frontend/screens/MenuScreen.hpp" #include "graphics/ui/elements/Menu.hpp" #include "graphics/ui/gui_util.hpp" +#include "objects/Players.hpp" #include "interfaces/Task.hpp" #include "util/stringutil.hpp" #include "world/Level.hpp" @@ -245,6 +246,9 @@ void EngineController::createWorld( engine->getContent(), engine->getContentPacks() ); + if (!engine->isHeadless()) { + level->players->create(); + } engine->onWorldOpen(std::move(level)); } diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 5b24bbbb..87c2b6ad 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -6,6 +6,7 @@ #include "engine.hpp" #include "files/WorldFiles.hpp" #include "objects/Entities.hpp" +#include "objects/Players.hpp" #include "physics/Hitbox.hpp" #include "settings.hpp" #include "world/Level.hpp" @@ -23,34 +24,42 @@ LevelController::LevelController(Engine* engine, std::unique_ptr levelPtr )), chunks(std::make_unique( *level, settings.chunks.padding.get() - )), - player(std::make_unique( - settings, level.get(), blocks.get() )) { + if (!engine->isHeadless()) { + player = std::make_unique( + settings, level.get(), level->players->get(0), blocks.get() + ); + } scripting::on_world_load(this); } void LevelController::update(float delta, bool input, bool pause) { - glm::vec3 position = player->getPlayer()->getPosition(); - level->loadMatrix( - position.x, - position.z, - settings.chunks.loadDistance.get() + settings.chunks.padding.get() * 2 - ); - chunks->update( - settings.chunks.loadSpeed.get(), settings.chunks.loadDistance.get(), - floordiv(position.x, CHUNK_W), floordiv(position.z, CHUNK_D) - ); + if (player) { + glm::vec3 position = player->getPlayer()->getPosition(); + level->loadMatrix( + position.x, + position.z, + settings.chunks.loadDistance.get() + settings.chunks.padding.get() * 2 + ); + chunks->update( + settings.chunks.loadSpeed.get(), settings.chunks.loadDistance.get(), + floordiv(position.x, CHUNK_W), floordiv(position.z, CHUNK_D) + ); + } if (!pause) { // update all objects that needed blocks->update(delta); - player->update(delta, input, pause); + if (player) { + player->update(delta, input); + } level->entities->updatePhysics(delta); level->entities->update(delta); } level->entities->clean(); - player->postUpdate(delta, input, pause); + if (player) { + player->postUpdate(delta, input, pause); + } } void LevelController::saveWorld() { diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 6f701346..9a2c02d8 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -190,11 +190,14 @@ void CameraControl::update(PlayerInput input, float delta, Chunks* chunks) { } PlayerController::PlayerController( - const EngineSettings& settings, Level* level, + const EngineSettings& settings, + Level* level, + Player* player, BlocksController* blocksController ) - : settings(settings), level(level), - player(level->players->get(0)), + : settings(settings), + level(level), + player(player), camControl(player, settings.camera), blocksController(blocksController), playerTickClock(20, 3) { @@ -242,21 +245,19 @@ void PlayerController::updateFootsteps(float delta) { } } -void PlayerController::update(float delta, bool input, bool pause) { - if (!pause) { - if (input) { - updateKeyboard(); - player->updateSelectedEntity(); - } else { - resetKeyboard(); - } - updatePlayer(delta); +void PlayerController::update(float delta, bool input) { + if (input) { + updateKeyboard(); + player->updateSelectedEntity(); + } else { + resetKeyboard(); + } + updatePlayer(delta); - if (playerTickClock.update(delta)) { - if (player->getId() % playerTickClock.getParts() == - playerTickClock.getPart()) { - scripting::on_player_tick(player, playerTickClock.getTickRate()); - } + if (playerTickClock.update(delta)) { + if (player->getId() % playerTickClock.getParts() == + playerTickClock.getPart()) { + scripting::on_player_tick(player, playerTickClock.getTickRate()); } } } diff --git a/src/logic/PlayerController.hpp b/src/logic/PlayerController.hpp index 8d82a3f9..9ae8d727 100644 --- a/src/logic/PlayerController.hpp +++ b/src/logic/PlayerController.hpp @@ -71,9 +71,21 @@ class PlayerController { voxel* updateSelection(float maxDistance); public: PlayerController( - const EngineSettings& settings, Level* level, BlocksController* blocksController + const EngineSettings& settings, + Level* level, + Player* player, + BlocksController* blocksController ); - void update(float delta, bool input, bool pause); + + /// @brief Called after blocks update if not paused + /// @param delta delta time + /// @param input process user input + void update(float delta, bool input); + + /// @brief Called after whole level update + /// @param delta delta time + /// @param input process user input + /// @param pause is game paused void postUpdate(float delta, bool input, bool pause); Player* getPlayer(); }; diff --git a/src/objects/Players.cpp b/src/objects/Players.cpp index 90031991..b174d08a 100644 --- a/src/objects/Players.cpp +++ b/src/objects/Players.cpp @@ -7,7 +7,7 @@ Players::Players(Level* level) : level(level) {} -void Players::addPlayer(std::unique_ptr player) { +void Players::add(std::unique_ptr player) { players[player->getId()] = std::move(player); } @@ -30,7 +30,7 @@ Player* Players::create() { 0 ); auto player = playerPtr.get(); - addPlayer(std::move(playerPtr)); + add(std::move(playerPtr)); level->inventories->store(player->getInventory()); return player; @@ -62,7 +62,7 @@ void Players::deserialize(const dv::value& src) { ); auto player = playerPtr.get(); player->deserialize(playerMap); - addPlayer(std::move(playerPtr)); + add(std::move(playerPtr)); auto& inventory = player->getInventory(); // invalid inventory id pre 0.25 if (inventory->getId() == 0) { diff --git a/src/objects/Players.hpp b/src/objects/Players.hpp index f66d181f..a7bda524 100644 --- a/src/objects/Players.hpp +++ b/src/objects/Players.hpp @@ -17,7 +17,7 @@ class Players : public Serializable { Level* level; std::unordered_map> players; - void addPlayer(std::unique_ptr player); + void add(std::unique_ptr player); public: Players(Level* level); diff --git a/src/world/World.cpp b/src/world/World.cpp index cde3b3ce..bec61d3a 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -97,9 +97,7 @@ std::unique_ptr World::create( ); logger.info() << "created world '" << name << "' (" << directory.u8string() << ")"; logger.info() << "world seed: " << seed << " generator: " << generator; - auto level = std::make_unique(std::move(world), content, settings); - level->players->create(); - return level; + return std::make_unique(std::move(world), content, settings); } std::unique_ptr World::load(