From f717e1c10969223901ad2a67523fbd8d0ac0cd2d Mon Sep 17 00:00:00 2001 From: DanielProl1xy Date: Mon, 19 Feb 2024 11:43:53 +0300 Subject: [PATCH] spawning objects --- src/frontend/hud.cpp | 2 +- src/{objects => interfaces}/Object.h | 7 +------ src/logic/LevelController.cpp | 8 +++---- src/logic/PlayerController.cpp | 4 ++-- src/logic/PlayerController.h | 6 +++--- src/logic/scripting/lua/api_lua.cpp | 2 +- src/objects/Player.h | 2 +- src/world/Level.cpp | 31 +++++++++++++++------------- src/world/Level.h | 10 ++++++--- src/world/World.cpp | 10 +++------ 10 files changed, 40 insertions(+), 42 deletions(-) rename src/{objects => interfaces}/Object.h (70%) diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index cd94dd65..a4014bf7 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -630,5 +630,5 @@ void Hud::setPause(bool pause) { } Player* Hud::getPlayer() const { - return frontend->getLevel()->player; + return frontend->getLevel()->player.get(); } diff --git a/src/objects/Object.h b/src/interfaces/Object.h similarity index 70% rename from src/objects/Object.h rename to src/interfaces/Object.h index b0ff7e49..5f9aae83 100644 --- a/src/objects/Object.h +++ b/src/interfaces/Object.h @@ -8,10 +8,9 @@ class Level; class Object { private: - Level* level; public: - int64_t objectUID; + uint64_t objectUID; bool shouldUpdate = true; public: @@ -21,10 +20,6 @@ public: virtual void spawned() { } virtual void update(float delta) { } virtual void destroyed() { } - -public: - Level* getLevel() { return level; } - void setLevel(Level* lvl) { level = lvl; } }; #endif /* OBJECT_H */ \ No newline at end of file diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 63a56901..94a82062 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -6,7 +6,7 @@ #include "ChunksController.h" #include "scripting/scripting.h" -#include "../objects/Object.h" +#include "../interfaces/Object.h" LevelController::LevelController(EngineSettings& settings, Level* level) : settings(settings), level(level) { @@ -26,11 +26,11 @@ void LevelController::update(float delta, bool input, bool pause) { chunks->update(settings.chunks.loadSpeed); // erease null pointers - level->objects.remove_if([](Object* obj) { return obj == nullptr; }); - + level->objects.remove_if([](auto obj) { return obj == nullptr; }); + if (!pause) { // update all objects that needed - for(Object *obj : level->objects) + for(auto obj : level->objects) { if(obj) { if(obj->shouldUpdate) { diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index b9d822ab..ab44336e 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -31,7 +31,7 @@ const float C_ZOOM = 0.1f; const float CROUCH_SHIFT_Y = -0.2f; -CameraControl::CameraControl(Player* player, const CameraSettings& settings) +CameraControl::CameraControl(std::shared_ptr player, const CameraSettings& settings) : player(player), camera(player->camera), currentViewCamera(player->currentCamera), @@ -208,7 +208,7 @@ void PlayerController::updateControls(float delta){ void PlayerController::updateInteraction(){ auto indices = level->content->getIndices(); Chunks* chunks = level->chunks; - Player* player = level->player; + Player* player = level->player.get(); Lighting* lighting = level->lighting; Camera* camera = player->camera.get(); glm::vec3 end; diff --git a/src/logic/PlayerController.h b/src/logic/PlayerController.h index d9d002d6..a1479820 100644 --- a/src/logic/PlayerController.h +++ b/src/logic/PlayerController.h @@ -12,7 +12,7 @@ class Level; class BlocksController; class CameraControl { - Player* player; + std::shared_ptr player; std::shared_ptr camera, currentViewCamera; const CameraSettings& settings; glm::vec3 offset; @@ -20,7 +20,7 @@ class CameraControl { float shakeTimer = 0.0f; glm::vec3 interpVel {0.0f}; public: - CameraControl(Player* player, const CameraSettings& settings); + CameraControl(std::shared_ptr player, const CameraSettings& settings); void updateMouse(PlayerInput& input); void update(PlayerInput& input, float delta, Chunks* chunks); void refresh(); @@ -28,7 +28,7 @@ public: class PlayerController { Level* level; - Player* player; + std::shared_ptr player; PlayerInput input; CameraControl camControl; BlocksController* blocksController; diff --git a/src/logic/scripting/lua/api_lua.cpp b/src/logic/scripting/lua/api_lua.cpp index 88835056..ea738e85 100644 --- a/src/logic/scripting/lua/api_lua.cpp +++ b/src/logic/scripting/lua/api_lua.cpp @@ -191,7 +191,7 @@ int l_player_get_inv(lua_State* L) { int playerid = lua_tointeger(L, 1); if (playerid != 1) return 0; - Player* player = scripting::level->player; + auto player = scripting::level->player; lua_pushinteger(L, player->getInventory()->getId()); lua_pushinteger(L, player->getChosenSlot()); return 2; diff --git a/src/objects/Player.h b/src/objects/Player.h index 22b1d859..bea94c2b 100644 --- a/src/objects/Player.h +++ b/src/objects/Player.h @@ -8,7 +8,7 @@ #include "../voxels/voxel.h" #include "../settings.h" #include "../interfaces/Serializable.h" -#include "../objects/Object.h" +#include "../interfaces/Object.h" class Camera; class Hitbox; diff --git a/src/world/Level.cpp b/src/world/Level.cpp index 58ca2236..287607ed 100644 --- a/src/world/Level.cpp +++ b/src/world/Level.cpp @@ -8,7 +8,7 @@ #include "../voxels/ChunksStorage.h" #include "../physics/Hitbox.h" #include "../physics/PhysicsSolver.h" -#include "../objects/Object.h" +#include "../interfaces/Object.h" #include "../objects/Player.h" #include "../items/Inventory.h" #include "../items/Inventories.h" @@ -25,11 +25,10 @@ Level::Level(World* world, const Content* content, EngineSettings& settings) events(new LevelEvents()) , settings(settings) { + objCounter = 0; physics = new PhysicsSolver(glm::vec3(0, -22.6f, 0)); - - auto inv = std::make_shared(0, DEF_PLAYER_INVENTORY_SIZE); - player = spawnObjectOfClass(glm::vec3(0, DEF_PLAYER_Y, 0), DEF_PLAYER_SPEED, inv); - + auto inv = std::make_shared(world->getNextInventoryId(), DEF_PLAYER_INVENTORY_SIZE); + player = spawnObject(glm::vec3(0, DEF_PLAYER_Y, 0), DEF_PLAYER_SPEED, inv); uint matrixSize = (settings.chunks.loadDistance+ settings.chunks.padding) * 2; @@ -42,15 +41,20 @@ Level::Level(World* world, const Content* content, EngineSettings& settings) }); inventories = std::make_unique(*this); + inventories->store(player->getInventory()); } Level::~Level(){ delete chunks; delete events; delete physics; - delete player; delete lighting; delete chunksStorage; + + for(auto obj : objects) + { + obj.reset(); + } } void Level::update() { @@ -68,18 +72,17 @@ World* Level::getWorld() { return world.get(); } -// Spawns object of class T and returns pointer to it. -// @param T class that derives the Object class -// @param args pass arguments needed for T class constructor + template -T* Level::spawnObjectOfClass(Args&&... args) +std::shared_ptr Level::spawnObject(Args&&... args) { static_assert(std::is_base_of::value, "T must be a derived of Object class"); - T* tObj = new T(args...); - Object* obj = reinterpret_cast(tObj); + std::shared_ptr tObj = std::make_shared(args...); + + std::shared_ptr obj = std::dynamic_pointer_cast(tObj); objects.push_back(obj); - obj->objectUID = std::rand(); - obj->setLevel(this); + obj->objectUID = objCounter; obj->spawned(); + objCounter += 1; return tObj; } diff --git a/src/world/Level.h b/src/world/Level.h index 01b74b17..da7f4ce1 100644 --- a/src/world/Level.h +++ b/src/world/Level.h @@ -6,6 +6,8 @@ #include "../typedefs.h" #include "../settings.h" #include +#include +#include class Content; class World; @@ -20,11 +22,13 @@ class PhysicsSolver; class ChunksStorage; class Level { +private: + int objCounter; public: std::unique_ptr world; const Content* const content; - std::list objects; - Player* player; + std::list> objects; + std::shared_ptr player; Chunks* chunks; ChunksStorage* chunksStorage; std::unique_ptr inventories; @@ -45,7 +49,7 @@ public: World* getWorld(); template - T* spawnObjectOfClass(Args&&... args); + std::shared_ptr spawnObject(Args&&... args); }; #endif /* WORLD_LEVEL_H_ */ diff --git a/src/world/World.cpp b/src/world/World.cpp index 1df6283f..14985b39 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -61,20 +61,17 @@ void World::write(Level* level) { } wfile->write(this, content); - wfile->writePlayer(level->player); + wfile->writePlayer(level->player.get()); } - Level* World::create(std::string name, fs::path directory, uint64_t seed, EngineSettings& settings, const Content* content, const std::vector& packs) { - auto world = new World(name, directory, seed, settings, content, packs); auto level = new Level(world, content, settings); - level->inventories->store(level->player->getInventory()); return level; } @@ -91,9 +88,8 @@ Level* World::load(fs::path directory, throw world_load_error("could not to find world.json"); } - Level* level = new Level(world.get(), content, settings); - wfile->readPlayer(level->player); - level->inventories->store(level->player->getInventory()); + auto level = new Level(world.get(), content, settings); + wfile->readPlayer(level->player.get()); world.release(); return level; }