From 4fe79458abe8e545433fa0e8ad7dbbb6dba49e0e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 23 Jan 2024 01:44:16 +0300 Subject: [PATCH] fixed player spawn point --- src/files/WorldFiles.cpp | 19 +++++++++++++- src/objects/Player.cpp | 29 +++++++++++++++++++++ src/objects/Player.h | 56 ++++++++++++++++++++++------------------ 3 files changed, 78 insertions(+), 26 deletions(-) diff --git a/src/files/WorldFiles.cpp b/src/files/WorldFiles.cpp index f9db0c02..02690def 100644 --- a/src/files/WorldFiles.cpp +++ b/src/files/WorldFiles.cpp @@ -541,7 +541,13 @@ void WorldFiles::writePlayer(Player* player) { auto& rotarr = root.putList("rotation"); rotarr.put(player->cam.x); rotarr.put(player->cam.y); - + + auto& sparr = root.putList("spawnpoint"); + glm::vec3 spawnpoint = player->getSpawnPoint(); + sparr.put(spawnpoint.x); + sparr.put(spawnpoint.y); + sparr.put(spawnpoint.z); + root.put("flight", player->flight); root.put("noclip", player->noclip); root.put("chosen-slot", player->getChosenSlot()); @@ -569,6 +575,17 @@ bool WorldFiles::readPlayer(Player* player) { player->cam.x = rotarr->num(0); player->cam.y = rotarr->num(1); + if (root->has("spawnpoint")) { + auto sparr = root->list("spawnpoint"); + player->setSpawnPoint(glm::vec3( + sparr->num(0), + sparr->num(1), + sparr->num(2) + )); + } else { + player->setSpawnPoint(position); + } + root->flag("flight", player->flight); root->flag("noclip", player->noclip); player->setChosenSlot(root->getInt("chosen-slot", player->getChosenSlot())); diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 6e32a2fd..3fccf14b 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -117,12 +117,33 @@ void Player::update( input.noclip = false; input.flight = false; + + if (spawnpoint.y <= 0.1) { + attemptToFindSpawnpoint(level); + } } void Player::teleport(glm::vec3 position) { hitbox->position = position; } +void Player::attemptToFindSpawnpoint(Level* level) { + glm::vec3 ppos = hitbox->position; + glm::vec3 newpos {ppos.x + (rand() % 200 - 100), + rand() % 80 + 100, + ppos.z + (rand() % 200 - 100)}; + while (newpos.y > 0 && !level->chunks->isObstacleBlock(newpos.x, newpos.y-2, newpos.z)) { + newpos.y--; + } + + voxel* headvox = level->chunks->get(newpos.x, newpos.y+1, newpos.z); + if (level->chunks->isObstacleBlock(newpos.x, newpos.y, newpos.z) || + headvox == nullptr || headvox->id != 0) + return; + spawnpoint = newpos; + teleport(spawnpoint); +} + void Player::setChosenSlot(int index) { chosenSlot = index; } @@ -138,3 +159,11 @@ float Player::getSpeed() const { std::shared_ptr Player::getInventory() const { return inventory; } + +void Player::setSpawnPoint(glm::vec3 spawnpoint) { + this->spawnpoint = spawnpoint; +} + +glm::vec3 Player::getSpawnPoint() const { + return spawnpoint; +} diff --git a/src/objects/Player.h b/src/objects/Player.h index b58b2c4b..9c5e600f 100644 --- a/src/objects/Player.h +++ b/src/objects/Player.h @@ -15,47 +15,53 @@ class Chunks; class Level; struct PlayerInput { - bool zoom; - bool cameraMode; - bool moveForward; - bool moveBack; - bool moveRight; - bool moveLeft; - bool sprint; - bool shift; - bool cheat; - bool jump; - bool noclip; - bool flight; + bool zoom; + bool cameraMode; + bool moveForward; + bool moveBack; + bool moveRight; + bool moveLeft; + bool sprint; + bool shift; + bool cheat; + bool jump; + bool noclip; + bool flight; }; class Player { - float speed; + float speed; int chosenSlot; + glm::vec3 spawnpoint {}; public: - std::shared_ptr camera, spCamera, tpCamera; + std::shared_ptr camera, spCamera, tpCamera; std::shared_ptr currentCamera; - std::unique_ptr hitbox; + std::unique_ptr hitbox; std::shared_ptr inventory; - bool flight = false; - bool noclip = false; - bool debug = false; - voxel selectedVoxel {0, 0}; + bool flight = false; + bool noclip = false; + bool debug = false; + voxel selectedVoxel {0, 0}; - glm::vec2 cam = {}; + glm::vec2 cam = {}; - Player(glm::vec3 position, float speed); - ~Player(); + Player(glm::vec3 position, float speed); + ~Player(); - void teleport(glm::vec3 position); - void update(Level* level, PlayerInput& input, float delta); + void teleport(glm::vec3 position); + void update(Level* level, PlayerInput& input, float delta); + + void attemptToFindSpawnpoint(Level* level); void setChosenSlot(int index); int getChosenSlot() const; - float getSpeed() const; + float getSpeed() const; std::shared_ptr getInventory() const; + + void setSpawnPoint(glm::vec3 point); + glm::vec3 getSpawnPoint() const; }; #endif /* SRC_OBJECTS_PLAYER_H_ */