]> git.localhorst.tv Git - blank.git/commitdiff
move spawn index out of world
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 2 Oct 2015 14:54:52 +0000 (16:54 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 2 Oct 2015 14:54:52 +0000 (16:54 +0200)
client doesn't need those

doc/todo
src/server/ServerState.cpp
src/server/ServerState.hpp
src/server/net.cpp
src/standalone/MasterState.cpp
src/standalone/MasterState.hpp
src/world/World.hpp
src/world/world.cpp

index d5a961c8ae2817cafbed55644f0e48aa3e9c1c80..1cf7ed0a738932b89d25d8830663b557556a35b1 100644 (file)
--- a/doc/todo
+++ b/doc/todo
@@ -99,5 +99,19 @@ entity/world collision
 
        first draft of entity/world collision is implemented
        it jitters and has some surprising behaviour
-       finding a spawn point which doesn't put entities in solids is
-       now a little more crucial. press N if you're in trouble
+
+spawning
+
+       need a way to find a suitable location to spawn new players in
+       I imagine a "random block" function of ChunkIndex could be nice
+       (also for use with the AI spawner)
+       also, finding a spawn position for a player must no fail. after a
+       certain number of tries, the world must change to safely accomodate
+       the player.
+       chunk generation could be adjusted to make a little more room near the
+       origin (since that's where the usual spawn point will be), but that's
+       not strictly necessary and might overcomplicate the generation
+       if all fails, the spawner has to modify the world
+       how much space has to be cleared and how to make sure the spawning
+       space connects to "open space" I don't know yet, it's all a little
+       fuzzy anyway
index cedae4ee9a8b4b4376e77f480645d45c64141217..9020aa09473bdd3ec9f094e8fcab1578de4d9168 100644 (file)
@@ -20,6 +20,7 @@ ServerState::ServerState(
 : env(env)
 , block_types()
 , world(block_types, wc)
+, spawn_index(world.Chunks().MakeIndex(wc.spawn, 3))
 , generator(gc)
 , chunk_loader(world.Chunks(), generator, ws)
 , skeletons()
@@ -37,6 +38,10 @@ ServerState::ServerState(
        std::cout << "listening on UDP port " << config.net.port << std::endl;
 }
 
+ServerState::~ServerState() {
+       world.Chunks().UnregisterIndex(spawn_index);
+}
+
 
 void ServerState::Handle(const SDL_Event &event) {
        if (event.type == SDL_QUIT) {
index 31ad5217535567d4bf1fd63490ae72f06f6c9b08..e22f9b1e3c3f58a3825fa48a973f21e6f764fc58 100644 (file)
@@ -7,6 +7,7 @@
 #include "../app/State.hpp"
 #include "../model/Skeletons.hpp"
 #include "../world/BlockTypeRegistry.hpp"
+#include "../world/ChunkIndex.hpp"
 #include "../world/ChunkLoader.hpp"
 #include "../world/Generator.hpp"
 #include "../world/World.hpp"
@@ -31,6 +32,7 @@ public:
                const WorldSave &,
                const Config &
        );
+       ~ServerState();
 
        void Handle(const SDL_Event &) override;
        void Update(int dt) override;
@@ -40,6 +42,7 @@ private:
        HeadlessEnvironment &env;
        BlockTypeRegistry block_types;
        World world;
+       ChunkIndex &spawn_index;
        Generator generator;
        ChunkLoader chunk_loader;
        Skeletons skeletons;
index 7cb07cdf02b9ae1e6f026493f20e0dd5aed65707..16aa1cb004733865337976e72c51c78da6382e87 100644 (file)
@@ -397,6 +397,8 @@ void ClientConnection::AttachPlayer(Player &player) {
        PlayerEntity().Ref();
        if (server.GetWorldSave().Exists(player)) {
                server.GetWorldSave().Read(player);
+       } else {
+               // TODO: spawn
        }
 
        old_base = PlayerChunks().Base();
index 98d3c839d8689dfc0950ba8ff9cb309d5c14eadf..dccc0f958410764b1416c89ff6ac2dce6dbcd59c 100644 (file)
@@ -24,6 +24,7 @@ MasterState::MasterState(
 , block_types()
 , save(save)
 , world(block_types, wc)
+, spawn_index(world.Chunks().MakeIndex(wc.spawn, 3))
 , player(*world.AddPlayer(config.player.name))
 , hud(env, config, player)
 , manip(env, player.GetEntity())
@@ -46,9 +47,15 @@ MasterState::MasterState(
        spawner.LimitSkeletons(0, skeletons.Size());
        if (save.Exists(player)) {
                save.Read(player);
+       } else {
+               // TODO: spawn
        }
 }
 
+MasterState::~MasterState() {
+       world.Chunks().UnregisterIndex(spawn_index);
+}
+
 
 void MasterState::OnEnter() {
        env.state.Push(&preload);
index 823e7f3a67ed781f1c274e5f598c004839bb8966..84c331523e43a4602a52a07d4eed6cdd7bbd22a1 100644 (file)
@@ -14,6 +14,7 @@
 #include "../ui/InteractiveManipulator.hpp"
 #include "../ui/Interface.hpp"
 #include "../world/BlockTypeRegistry.hpp"
+#include "../world/ChunkIndex.hpp"
 #include "../world/ChunkLoader.hpp"
 #include "../world/ChunkRenderer.hpp"
 #include "../world/Generator.hpp"
@@ -40,6 +41,7 @@ public:
                const World::Config &,
                const WorldSave &
        );
+       ~MasterState();
 
        void OnEnter() override;
 
@@ -62,6 +64,7 @@ private:
        BlockTypeRegistry block_types;
        const WorldSave &save;
        World world;
+       ChunkIndex &spawn_index;
        Player &player;
        HUD hud;
        InteractiveManipulator manip;
index d58ad6f0d644be82ba3547a95f3dddce54c28056..848f801e24ffd30bfb5d95cbe50c46f18278c159 100644 (file)
@@ -25,8 +25,8 @@ class World {
 public:
        struct Config {
                std::string name = "default";
-               // initial player position
-               glm::vec3 spawn = { 0.0f, 0.0f, 0.0f };
+               // chunk base where new players are spawned
+               glm::ivec3 spawn = { 0, 0, 0 };
                // direction facing towards(!) the light
                glm::vec3 light_direction = { -1.0f, -3.0f, -2.0f };
                // fade out reaches 1/e (0.3679) at 1/fog_density,
@@ -100,7 +100,6 @@ private:
        const BlockTypeRegistry &block_type;
 
        ChunkStore chunks;
-       ChunkIndex &spawn_index;
 
        std::list<Player> players;
        std::list<Entity> entities;
index f648baad45c082da5139066bf7fed8f68e6a1334..8ea99fec247734e6b592c6e65fc231f9350a49c7 100644 (file)
@@ -145,8 +145,6 @@ World::World(const BlockTypeRegistry &types, const Config &config)
 : config(config)
 , block_type(types)
 , chunks(types)
-// TODO: set spawn base and extent from config
-, spawn_index(chunks.MakeIndex(Chunk::Pos(0, 0, 0), 3))
 , players()
 , entities()
 , light_direction(config.light_direction)
@@ -155,7 +153,7 @@ World::World(const BlockTypeRegistry &types, const Config &config)
 }
 
 World::~World() {
-       chunks.UnregisterIndex(spawn_index);
+
 }
 
 
@@ -169,7 +167,6 @@ Player *World::AddPlayer(const std::string &name) {
        entity.Name(name);
        entity.Bounds({ { -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f } });
        entity.WorldCollidable(true);
-       entity.Position(config.spawn);
        ChunkIndex &index = chunks.MakeIndex(entity.ChunkCoords(), 6);
        players.emplace_back(entity, index);
        return &players.back();
@@ -188,7 +185,6 @@ Player *World::AddPlayer(const std::string &name, std::uint32_t id) {
        entity->Name(name);
        entity->Bounds({ { -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f } });
        entity->WorldCollidable(true);
-       entity->Position(config.spawn);
        ChunkIndex &index = chunks.MakeIndex(entity->ChunkCoords(), 6);
        players.emplace_back(*entity, index);
        return &players.back();