]> git.localhorst.tv Git - blank.git/blobdiff - src/server/net.cpp
chat state
[blank.git] / src / server / net.cpp
index 1e60ff6ead06d3dfd7905946866d4d4920ead0fd..bb42979aed1d39f65d533c0cbdc20fab05b86cfa 100644 (file)
@@ -4,11 +4,12 @@
 
 #include "../app/init.hpp"
 #include "../io/WorldSave.hpp"
-#include "../model/CompositeModel.hpp"
+#include "../model/Model.hpp"
 #include "../world/ChunkIndex.hpp"
 #include "../world/Entity.hpp"
 #include "../world/World.hpp"
 
+#include <algorithm>
 #include <iostream>
 #include <zlib.h>
 #include <glm/gtx/io.hpp>
@@ -352,6 +353,23 @@ void ClientConnection::CheckPlayerFix() {
        }
 }
 
+namespace {
+
+struct QueueCompare {
+       explicit QueueCompare(const glm::ivec3 &base)
+       : base(base) { }
+       bool operator ()(const glm::ivec3 &left, const glm::ivec3 &right) const noexcept {
+               const glm::ivec3 ld(left - base);
+               const glm::ivec3 rd(right - base);
+               return
+                       ld.x * ld.x + ld.y * ld.y + ld.z * ld.z <
+                       rd.x * rd.x + rd.y * rd.y + rd.z * rd.z;
+       }
+       const glm::ivec3 &base;
+};
+
+}
+
 void ClientConnection::CheckChunkQueue() {
        if (PlayerChunks().Base() != old_base) {
                Chunk::Pos begin = PlayerChunks().CoordsBegin();
@@ -366,6 +384,7 @@ void ClientConnection::CheckChunkQueue() {
                        }
                }
                old_base = PlayerChunks().Base();
+               sort(chunk_queue.begin(), chunk_queue.end(), QueueCompare(old_base));
        }
        if (transmitter.Transmitting()) {
                transmitter.Transmit();
@@ -406,6 +425,7 @@ void ClientConnection::AttachPlayer(Player &player) {
                        }
                }
        }
+       sort(chunk_queue.begin(), chunk_queue.end(), QueueCompare(old_base));
        // TODO: should the server do this?
        if (HasPlayerModel()) {
                GetPlayerModel().Instantiate(PlayerEntity().GetModel());
@@ -426,7 +446,7 @@ void ClientConnection::DetachPlayer() {
        old_actions = 0;
 }
 
-void ClientConnection::SetPlayerModel(const CompositeModel &m) noexcept {
+void ClientConnection::SetPlayerModel(const Model &m) noexcept {
        player_model = &m;
        if (HasPlayer()) {
                m.Instantiate(PlayerEntity().GetModel());
@@ -437,7 +457,7 @@ bool ClientConnection::HasPlayerModel() const noexcept {
        return player_model;
 }
 
-const CompositeModel &ClientConnection::GetPlayerModel() const noexcept {
+const Model &ClientConnection::GetPlayerModel() const noexcept {
        return *player_model;
 }
 
@@ -642,7 +662,7 @@ void Server::Update(int dt) {
        }
 }
 
-void Server::SetPlayerModel(const CompositeModel &m) noexcept {
+void Server::SetPlayerModel(const Model &m) noexcept {
        player_model = &m;
        for (ClientConnection &client : clients) {
                client.SetPlayerModel(m);
@@ -653,7 +673,7 @@ bool Server::HasPlayerModel() const noexcept {
        return player_model;
 }
 
-const CompositeModel &Server::GetPlayerModel() const noexcept {
+const Model &Server::GetPlayerModel() const noexcept {
        return *player_model;
 }