void ClientConnection::CheckPlayerFix() {
// player_update_state's position holds the client's most recent prediction
glm::vec3 diff = player_update_state.Diff(PlayerEntity().GetState());
- float dist_squared = dot(diff, diff);
+ float dist_squared = glm::length2(diff);
// if client's prediction is off by more than 1cm, send
// our (authoritative) state back so it can fix it
}
old_base = PlayerChunks().Base();
sort(chunk_queue.begin(), chunk_queue.end(), QueueCompare(old_base));
+ chunk_queue.erase(unique(chunk_queue.begin(), chunk_queue.end()), chunk_queue.end());
}
// don't push entity updates and chunk data in the same tick
if (chunk_blocks_skipped >= NetStat().SuggestedPacketHold() && !SendingUpdates()) {
input.reset(new DirectInput(server.GetWorld(), player, server));
PlayerEntity().Ref();
+ cli_ctx.reset(new NetworkCLIFeedback(player, *this));
+
old_base = PlayerChunks().Base();
ExactLocation::Coarse begin = PlayerChunks().CoordsBegin();
ExactLocation::Coarse end = PlayerChunks().CoordsEnd();
server.GetWorldSave().Write(input->GetPlayer());
PlayerEntity().Kill();
PlayerEntity().UnRef();
+ cli_ctx.reset();
input.reset();
transmitter.Abort();
chunk_queue.clear();
return HasPlayer() && PlayerChunks().InRange(pos);
}
+void ClientConnection::On(const Packet::ChunkBegin &pack) {
+ glm::ivec3 pos;
+ pack.ReadChunkCoords(pos);
+ if (ChunkInRange(pos)) {
+ chunk_queue.push_front(pos);
+ }
+}
+
void ClientConnection::On(const Packet::Message &pack) {
uint8_t type;
uint32_t ref;
pack.ReadReferral(ref);
pack.ReadMessage(msg);
- if (type == 1 && HasPlayer()) {
- server.DispatchMessage(input->GetPlayer(), msg);
+ if (type == 1 && cli_ctx) {
+ server.DispatchMessage(*cli_ctx, msg);
}
}
+uint16_t ClientConnection::SendMessage(uint8_t type, uint32_t from, const string &msg) {
+ auto pack = Prepare<Packet::Message>();
+ pack.WriteType(type);
+ pack.WriteReferral(from);
+ pack.WriteMessage(msg);
+ return Send(Packet::Message::GetSize(msg));
+}
+
+
+NetworkCLIFeedback::NetworkCLIFeedback(Player &p, ClientConnection &c)
+: CLIContext(p)
+, conn(c) {
+
+}
+
+void NetworkCLIFeedback::Error(const string &msg) {
+ conn.SendMessage(0, 0, msg);
+}
+
+void NetworkCLIFeedback::Message(const string &msg) {
+ conn.SendMessage(0, 0, msg);
+}
+
+void NetworkCLIFeedback::Broadcast(const string &msg) {
+ conn.GetServer().DistributeMessage(0, GetPlayer().GetEntity().ID(), msg);
+}
+
Server::Server(
const Config::Network &conf,
}
}
-void Server::DispatchMessage(Player &player, const string &msg) {
+void Server::DispatchMessage(CLIContext &ctx, const string &msg) {
if (msg.empty()) {
return;
}
if (msg[0] == '/' && msg.size() > 1 && msg[1] != '/') {
- cli.Execute(player, msg.substr(1));
+ cli.Execute(ctx, msg.substr(1));
} else {
- DistributeMessage(1, player.GetEntity().ID(), msg);
+ DistributeMessage(1, ctx.GetPlayer().GetEntity().ID(), msg);
}
}