]> git.localhorst.tv Git - blank.git/blobdiff - src/client/net.cpp
glm backwards compatibility
[blank.git] / src / client / net.cpp
index 1c13f9e2912c7c79971a5042806079194bf0ab5e..551087210e2b99b76d98f17433345dd8fecbdb0d 100644 (file)
@@ -23,8 +23,9 @@ namespace blank {
 namespace client {
 
 
-ChunkReceiver::ChunkReceiver(ChunkStore &store, const WorldSave &save)
-: store(store)
+ChunkReceiver::ChunkReceiver(Client &client, ChunkStore &store, const WorldSave &save)
+: client(client)
+, store(store)
 , save(save)
 , transmissions()
 , timer(5000) {
@@ -40,7 +41,14 @@ void ChunkReceiver::Update(int dt) {
        for (ChunkTransmission &trans : transmissions) {
                if (trans.active && (timer.Elapsed() - trans.last_update) > timer.Interval()) {
                        cout << "timeout for transmission of chunk " << trans.coords << endl;
-                       trans.Clear();
+                       if (trans.header_received) {
+                               client.SendChunkRequest(trans.coords);
+                               trans.Reset();
+                               trans.last_update = timer.Elapsed();
+                       } else {
+                               // well shit
+                               trans.Clear();
+                       }
                }
        }
        if (transmissions.size() > 3) {
@@ -62,7 +70,7 @@ int ChunkReceiver::ToLoad() const noexcept {
 void ChunkReceiver::LoadOne() {
        if (!store.HasMissing()) return;
 
-       Chunk::Pos pos = store.NextMissing();
+       ExactLocation::Coarse pos = store.NextMissing();
        Chunk *chunk = store.Allocate(pos);
        if (!chunk) {
                // chunk store corrupted?
@@ -152,7 +160,7 @@ void ChunkReceiver::Commit(ChunkTransmission &trans) {
 
        Chunk *chunk = store.Allocate(trans.coords);
        if (!chunk) {
-               // chunk no longer of interes, just drop the data
+               // chunk no longer of interest, just drop the data
                // it should probably be cached to disk, but not now :P
                trans.Clear();
                return;
@@ -167,10 +175,17 @@ void ChunkReceiver::Commit(ChunkTransmission &trans) {
                if (uncompress(dst, &dst_len, src, src_len) != Z_OK) {
                        // omg, now what?
                        cout << "got corruped chunk data for " << trans.coords << endl;
+                       client.SendChunkRequest(trans.coords);
+                       trans.Reset();
+                       // chunk data can, and probably will, contain invalid block IDs, so
+                       // zero it to be safe
+                       memset(dst, 0, dst_len);
+                       return;
                }
        } else {
                memcpy(dst, src, min(src_len, dst_len));
        }
+       chunk->ScanActive();
        chunk->Invalidate();
        trans.Clear();
 }
@@ -188,11 +203,15 @@ ChunkTransmission::ChunkTransmission()
 
 }
 
-void ChunkTransmission::Clear() noexcept {
+void ChunkTransmission::Reset() noexcept {
        data_size = 0;
        data_received = 0;
        last_update = 0;
        header_received = false;
+}
+
+void ChunkTransmission::Clear() noexcept {
+       Reset();
        active = false;
 }
 
@@ -305,6 +324,14 @@ uint16_t Client::SendPart() {
        return conn.Send(client_pack, client_sock);
 }
 
+uint16_t Client::SendChunkRequest(
+       const glm::ivec3 &coords
+) {
+       auto pack = Packet::Make<Packet::ChunkBegin>(client_pack);
+       pack.WriteChunkCoords(coords);
+       return conn.Send(client_pack, client_sock);
+}
+
 uint16_t Client::SendMessage(
        uint8_t type,
        uint32_t ref,
@@ -392,22 +419,20 @@ void NetworkedInput::MergePlayerCorrection(uint16_t seq, const EntityState &corr
        replay.SetState(corrected_state);
 
        if (entry != end) {
-               entry->state.chunk_pos = replay.GetState().chunk_pos;
-               entry->state.block_pos = replay.GetState().block_pos;
+               entry->state.pos = replay.GetState().pos;
                ++entry;
        }
 
        vector<WorldCollision> col;
        while (entry != end) {
                SetMovement(entry->movement);
-               GetWorld().Update(replay, entry->delta_t);
-               entry->state.chunk_pos = replay.GetState().chunk_pos;
-               entry->state.block_pos = replay.GetState().block_pos;
+               replay.Update(GetWorld(), entry->delta_t);
+               entry->state.pos = replay.GetState().pos;
                ++entry;
        }
 
        glm::vec3 displacement(replay.GetState().Diff(player_state));
-       const float disp_squared = dot(displacement, displacement);
+       const float disp_squared = glm::dot(displacement, displacement);
 
        if (disp_squared < 16.0f * numeric_limits<float>::epsilon()) {
                SetMovement(restore_movement);
@@ -421,13 +446,12 @@ void NetworkedInput::MergePlayerCorrection(uint16_t seq, const EntityState &corr
        constexpr float max_disp = 0.0001f; // (1/100)^2
 
        if (disp_squared > warp_thresh) {
-               player_state.chunk_pos = replay.GetState().chunk_pos;
-               player_state.block_pos = replay.GetState().block_pos;
+               player_state.pos = replay.GetState().pos;
        } else if (disp_squared < max_disp) {
-               player_state.block_pos += displacement;
+               player_state.pos.block += displacement;
        } else {
                displacement *= 0.01f / sqrt(disp_squared);
-               player_state.block_pos += displacement;
+               player_state.pos.block += displacement;
        }
        GetPlayer().GetEntity().SetState(player_state);
        SetMovement(restore_movement);