X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fserver%2Fnet.cpp;h=7cb07cdf02b9ae1e6f026493f20e0dd5aed65707;hb=a50aa0f2a2fea14f5f8c56209e2ecde3088ef913;hp=ea5b4d995f19d38262891b0919f1fb2360ed05b3;hpb=c1da86ebab41895bf49ed747c75ecf722e8c5586;p=blank.git diff --git a/src/server/net.cpp b/src/server/net.cpp index ea5b4d9..7cb07cd 100644 --- a/src/server/net.cpp +++ b/src/server/net.cpp @@ -3,6 +3,7 @@ #include "Server.hpp" #include "../app/init.hpp" +#include "../io/WorldSave.hpp" #include "../model/CompositeModel.hpp" #include "../world/ChunkIndex.hpp" #include "../world/Entity.hpp" @@ -283,7 +284,7 @@ uint16_t ClientConnection::Send() { } uint16_t ClientConnection::Send(size_t len) { - server.GetPacket().len = len; + server.GetPacket().len = sizeof(Packet::Header) + len; return Send(); } @@ -394,6 +395,9 @@ void ClientConnection::AttachPlayer(Player &player) { DetachPlayer(); input.reset(new DirectInput(server.GetWorld(), player, server)); PlayerEntity().Ref(); + if (server.GetWorldSave().Exists(player)) { + server.GetWorldSave().Read(player); + } old_base = PlayerChunks().Base(); Chunk::Pos begin = PlayerChunks().CoordsBegin(); @@ -415,6 +419,7 @@ void ClientConnection::AttachPlayer(Player &player) { void ClientConnection::DetachPlayer() { if (!HasPlayer()) return; cout << "player \"" << input->GetPlayer().Name() << "\" left" << endl; + server.GetWorldSave().Write(input->GetPlayer()); PlayerEntity().Kill(); PlayerEntity().UnRef(); input.reset(); @@ -555,12 +560,17 @@ void ClientConnection::On(const Packet::PlayerUpdate &pack) { old_actions = new_actions; } +bool ClientConnection::ChunkInRange(const glm::ivec3 &pos) const noexcept { + return HasPlayer() && PlayerChunks().InRange(pos); +} + -Server::Server(const Config::Network &conf, World &world) +Server::Server(const Config::Network &conf, World &world, const WorldSave &save) : serv_sock(nullptr) , serv_pack{ -1, nullptr, 0 } , clients() , world(world) +, save(save) , player_model(nullptr) { serv_sock = SDLNet_UDP_Open(conf.port); if (!serv_sock) { @@ -645,8 +655,18 @@ const CompositeModel &Server::GetPlayerModel() const noexcept { void Server::SetBlock(Chunk &chunk, int index, const Block &block) { chunk.SetBlock(index, block); - // TODO: send to clients - // also TODO: batch chunk changes + // TODO: batch chunk changes + auto pack = Packet::Make(GetPacket()); + pack.WriteChunkCoords(chunk.Position()); + pack.WriteBlockCount(uint32_t(1)); + pack.WriteIndex(index, 0); + pack.WriteBlock(chunk.BlockAt(index), 0); + GetPacket().len = sizeof(Packet::Header) + Packet::BlockUpdate::GetSize(1); + for (ClientConnection &client : clients) { + if (client.ChunkInRange(chunk.Position())) { + client.Send(); + } + } } }