]> git.localhorst.tv Git - blank.git/blobdiff - src/server/net.cpp
unified location handling
[blank.git] / src / server / net.cpp
index cd4f2003c359b1896adbf435430eae8b68fd3562..9eac33ece573ed35edb24b78893b855f75c0feb3 100644 (file)
@@ -3,6 +3,7 @@
 #include "Server.hpp"
 
 #include "../app/init.hpp"
+#include "../geometry/distance.hpp"
 #include "../io/WorldSave.hpp"
 #include "../model/Model.hpp"
 #include "../world/ChunkIndex.hpp"
@@ -384,9 +385,9 @@ struct QueueCompare {
 
 void ClientConnection::CheckChunkQueue() {
        if (PlayerChunks().Base() != old_base) {
-               Chunk::Pos begin = PlayerChunks().CoordsBegin();
-               Chunk::Pos end = PlayerChunks().CoordsEnd();
-               for (Chunk::Pos pos = begin; pos.z < end.z; ++pos.z) {
+               ExactLocation::Coarse begin = PlayerChunks().CoordsBegin();
+               ExactLocation::Coarse end = PlayerChunks().CoordsEnd();
+               for (ExactLocation::Coarse pos = begin; pos.z < end.z; ++pos.z) {
                        for (pos.y = begin.y; pos.y < end.y; ++pos.y) {
                                for (pos.x = begin.x; pos.x < end.x; ++pos.x) {
                                        if (manhattan_radius(pos - old_base) > PlayerChunks().Extent()) {
@@ -398,6 +399,11 @@ void ClientConnection::CheckChunkQueue() {
                old_base = PlayerChunks().Base();
                sort(chunk_queue.begin(), chunk_queue.end(), QueueCompare(old_base));
        }
+       // if we have packet skip enabled and just pushed an entity
+       // update, don't also send chunk data
+       if (NetStat().SuggestedPacketSkip() > 0 && entity_updates_skipped == 0) {
+               return;
+       }
        if (transmitter.Transmitting()) {
                transmitter.Transmit();
                return;
@@ -406,7 +412,7 @@ void ClientConnection::CheckChunkQueue() {
                int count = 0;
                constexpr int max = 64;
                while (count < max && !chunk_queue.empty()) {
-                       Chunk::Pos pos = chunk_queue.front();
+                       ExactLocation::Coarse pos = chunk_queue.front();
                        chunk_queue.pop_front();
                        if (PlayerChunks().InRange(pos)) {
                                Chunk *chunk = PlayerChunks().Get(pos);
@@ -428,9 +434,9 @@ void ClientConnection::AttachPlayer(Player &player) {
        PlayerEntity().Ref();
 
        old_base = PlayerChunks().Base();
-       Chunk::Pos begin = PlayerChunks().CoordsBegin();
-       Chunk::Pos end = PlayerChunks().CoordsEnd();
-       for (Chunk::Pos pos = begin; pos.z < end.z; ++pos.z) {
+       ExactLocation::Coarse begin = PlayerChunks().CoordsBegin();
+       ExactLocation::Coarse end = PlayerChunks().CoordsEnd();
+       for (ExactLocation::Coarse pos = begin; pos.z < end.z; ++pos.z) {
                for (pos.y = begin.y; pos.y < end.y; ++pos.y) {
                        for (pos.x = begin.x; pos.x < end.x; ++pos.x) {
                                chunk_queue.push_back(pos);