remove default player from headless mode

This commit is contained in:
MihailRis
2024-12-11 00:31:08 +03:00
parent 3c2eb30a29
commit c67f158e62
8 changed files with 65 additions and 42 deletions
+4
View File
@@ -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));
}
+24 -15
View File
@@ -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<Level> levelPtr
)),
chunks(std::make_unique<ChunksController>(
*level, settings.chunks.padding.get()
)),
player(std::make_unique<PlayerController>(
settings, level.get(), blocks.get()
)) {
if (!engine->isHeadless()) {
player = std::make_unique<PlayerController>(
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() {
+18 -17
View File
@@ -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());
}
}
}
+14 -2
View File
@@ -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();
};