diff --git a/src/entity.zig b/src/entity.zig index d8e8fc3e..9da9e58f 100644 --- a/src/entity.zig +++ b/src/entity.zig @@ -16,6 +16,8 @@ const Vec3f = vec.Vec3f; const Vec4f = vec.Vec4f; const NeverFailingAllocator = main.utils.NeverFailingAllocator; +const BinaryReader = main.utils.BinaryReader; + pub const ClientEntity = struct { interpolatedValues: utils.GenericInterpolation(6) = undefined, _interpolationPos: [6]f64 = undefined, @@ -226,33 +228,29 @@ pub const ClientEntityManager = struct { } } - pub fn serverUpdate(time: i16, data: []const u8) void { + pub fn serverUpdate(time: i16, reader: *BinaryReader) !void { mutex.lock(); defer mutex.unlock(); timeDifference.addDataPoint(time); - std.debug.assert(data.len%(4 + 24 + 12 + 24) == 0); - var remaining = data; - while(remaining.len != 0) { - const id = std.mem.readInt(u32, remaining[0..4], .big); - remaining = remaining[4..]; + + while(reader.remaining.len != 0) { + const id = try reader.readInt(u32); const pos = [_]f64{ - @bitCast(std.mem.readInt(u64, remaining[0..8], .big)), - @bitCast(std.mem.readInt(u64, remaining[8..16], .big)), - @bitCast(std.mem.readInt(u64, remaining[16..24], .big)), - @floatCast(@as(f32, @bitCast(std.mem.readInt(u32, remaining[24..28], .big)))), - @floatCast(@as(f32, @bitCast(std.mem.readInt(u32, remaining[28..32], .big)))), - @floatCast(@as(f32, @bitCast(std.mem.readInt(u32, remaining[32..36], .big)))), + try reader.readFloat(f64), + try reader.readFloat(f64), + try reader.readFloat(f64), + @floatCast(try reader.readFloat(f32)), + @floatCast(try reader.readFloat(f32)), + @floatCast(try reader.readFloat(f32)), }; - remaining = remaining[36..]; const vel = [_]f64{ - @bitCast(std.mem.readInt(u64, remaining[0..8], .big)), - @bitCast(std.mem.readInt(u64, remaining[8..16], .big)), - @bitCast(std.mem.readInt(u64, remaining[16..24], .big)), + try reader.readFloat(f64), + try reader.readFloat(f64), + try reader.readFloat(f64), 0, 0, 0, }; - remaining = remaining[24..]; for(entities.items()) |*ent| { if(ent.id == id) { ent.updatePosition(&pos, &vel, time); diff --git a/src/network.zig b/src/network.zig index c399d12d..e80e71c3 100644 --- a/src/network.zig +++ b/src/network.zig @@ -881,7 +881,7 @@ pub const Protocols = struct { const typ = try reader.readInt(u8); const time = try reader.readInt(i16); if(typ == type_entity) { - main.entity.ClientEntityManager.serverUpdate(time, reader.remaining); + try main.entity.ClientEntityManager.serverUpdate(time, reader); } else if(typ == type_item) { world.itemDrops.readPosition(reader.remaining, time); } diff --git a/src/utils.zig b/src/utils.zig index ca4f481c..e05abbce 100644 --- a/src/utils.zig +++ b/src/utils.zig @@ -1919,6 +1919,11 @@ pub const BinaryReader = struct { return std.mem.readInt(T, self.remaining[0..bufSize], self.endian); } + pub fn readFloat(self: *BinaryReader, T: type) error{OutOfBounds, IntOutOfBounds}!T { + const IntT = std.meta.Int(.unsigned, @typeInfo(T).float.bits); + return @as(T, @bitCast(try self.readInt(IntT))); + } + pub fn readEnum(self: *BinaryReader, T: type) error{OutOfBounds, IntOutOfBounds, InvalidEnumTag}!T { const int = try self.readInt(@typeInfo(T).@"enum".tag_type); return std.meta.intToEnum(T, int); @@ -1963,6 +1968,11 @@ pub const BinaryWriter = struct { std.mem.writeInt(T, self.data.addMany(bufSize)[0..bufSize], value, self.endian); } + pub fn writeFloat(self: *BinaryWriter, T: type, value: T) T { + const IntT = std.meta.Int(.unsigned, @typeInfo(T).float.bits); + self.writeInt(IntT, @bitCast(value)); + } + pub fn writeEnum(self: *BinaryWriter, T: type, value: T) void { self.writeInt(@typeInfo(T).@"enum".tag_type, @intFromEnum(value)); }