auto pack = Packet::Make<Packet::PlayerUpdate>(client_pack);
pack.WritePredictedState(prediction);
pack.WriteMovement(movement);
- pack.WritePitch(pitch);
- pack.WriteYaw(yaw);
pack.WriteActions(actions);
pack.WriteSlot(slot);
return conn.Send(client_pack, client_sock);
return conn.Send(client_pack, client_sock);
}
+uint16_t Client::SendMessage(
+ uint8_t type,
+ uint32_t ref,
+ const string &msg
+) {
+ auto pack = Packet::Make<Packet::Message>(client_pack);
+ pack.WriteType(type);
+ pack.WriteReferral(ref);
+ pack.WriteMessage(msg);
+ client_pack.len = sizeof(Packet::Header) + Packet::Message::GetSize(msg);
+ return conn.Send(client_pack, client_sock);
+}
NetworkedInput::NetworkedInput(World &world, Player &player, Client &client)
: PlayerController(world, player)
InventorySlot()
);
if (player_hist.size() < 16) {
- player_hist.emplace_back(state, dt, packet);
+ player_hist.emplace_back(state, GetPlayer().GetEntity().TargetVelocity(), dt * 0.001f, packet);
} else {
auto entry = player_hist.begin();
entry->state = state;
- entry->delta_t = dt;
+ entry->tgt_vel = GetPlayer().GetEntity().TargetVelocity();
+ entry->delta_t = dt * 0.001f;
entry->packet = packet;
player_hist.splice(player_hist.end(), player_hist, entry);
}
vector<WorldCollision> col;
while (entry != end) {
replay.Velocity(entry->state.velocity);
- replay.Update(entry->delta_t);
- if (GetWorld().Intersection(replay, col)) {
- GetWorld().Resolve(replay, col);
- col.clear();
- }
+ replay.TargetVelocity(entry->tgt_vel);
+ GetWorld().Update(replay, entry->delta_t);
entry->state.chunk_pos = replay.GetState().chunk_pos;
entry->state.block_pos = replay.GetState().block_pos;
++entry;