diff --git a/src/client/main.zig b/src/client/main.zig index a7a6716..d14c7f1 100644 --- a/src/client/main.zig +++ b/src/client/main.zig @@ -2,6 +2,7 @@ const std = @import("std"); const zm = @import("zmath"); const znet = @import("znet"); const rl = @import("raylib"); +const bufzilla = @import("bufzilla"); const shared = @import("shared"); @@ -100,12 +101,21 @@ pub fn main() !void { // std.log.info("{}", .{data.peer}); }, .disconnect => |data| { - // _ = data; - std.log.info("{}", .{data.peer}); + _ = data; + // std.log.info("{}", .{data.peer}); }, .receive => |data| { - std.log.info("{s}", .{data.packet.dataSlice()}); defer data.packet.deinit(); + + const slice = data.packet.dataSlice(); + + std.log.info("{s}", .{slice}); + + var reader = bufzilla.Reader(.{}).init(slice); + + const id = try reader.readPath("id"); + + std.log.info("{any}", .{id}); }, }; diff --git a/src/server/chunk.zig b/src/server/chunk.zig index 8e74cf9..643e177 100644 --- a/src/server/chunk.zig +++ b/src/server/chunk.zig @@ -22,24 +22,21 @@ pub fn spawn(chunk: *shared.chunk.Chunk(), comptime T: type, allocator: std.mem. } // serialize entity - const messaged = entity.to_message(); - var buffer: [64]u8 = undefined; + var buffer: [128]u8 = undefined; var fixed = std.io.Writer.fixed(&buffer); + + const msg = shared.protocol.makeSpawnMessage(T, entity); + var writer = bufzilla.Writer.init(&fixed); - try writer.writeAny(messaged); + try writer.writeAny(msg); const encoded = fixed.buffered(); - std.log.info("\nsending the boy ( {s} )\n", .{encoded}); - + const packet = try znet.Packet.init(encoded, 0, .reliable); var iterator = server.host.iterPeers(); - std.log.info("iterator length?? ({})", .{iterator.peers.len}); - while (iterator.next()) |peer| { if (peer.state() == .connected) { - std.log.info("peer?? ({})", .{peer}); - const packet = try znet.Packet.init(encoded, 0, .reliable); try peer.send(packet); } } diff --git a/src/shared/protocol.zig b/src/shared/protocol.zig index e63527b..b324405 100644 --- a/src/shared/protocol.zig +++ b/src/shared/protocol.zig @@ -6,47 +6,57 @@ const entity = @import("entity.zig"); pub const SERVER_PORT: u16 = 1337; -pub const MessageType = enum(u8) { - spawn_entity = 1, +pub const Message = union(enum) { + spawn_entity: SpawnEntity, // later: despawn_entity, update_entity, snapshot, etc. }; -pub const SpawnEntity = struct { - id: entity.entity_id, - kind: entity.EntityKind, - payload: []const u8, +pub const SpawnEntity = union(enum) { + elf_v1: Elf_v1, + monster_v1: Monster_v1, + projectile_v1: Projectile_v1, }; -pub fn write_message(writer: *std.Io.Writer, msg_type: MessageType, payload: []const u8) !void { - try writer.writeByte(@intFromEnum(msg_type)); - try writer.writeInt(u32, @intCast(payload.len), .little); - try writer.writeAll(payload); +pub fn makeSpawnMessage(comptime T: type, e: T) Message { + if (T == entity.Elf) { + return .{ .spawn_entity = .{ .elf_v1 = Elf_v1.init(e) } }; + } else if (T == entity.Monster) { + return .{ .spawn_entity = .{ .monster_v1 = Monster_v1.init(e) } }; + } else if (T == entity.Projectile) { + return .{ .spawn_entity = .{ .projectile_v1 = Projectile_v1.init(e) } }; + } } -pub fn read_message(reader: *std.Io.Reader, allocator: std.mem.Allocator) !struct { - msg_type: MessageType, - payload: []u8, -} { - const msg_type = try reader.readByte(); - const size = try reader.readInt(u32, .little); +// pub fn write_message(writer: *std.Io.Writer, msg_type: MessageType, payload: []const u8) !void { +// try writer.writeByte(@intFromEnum(msg_type)); +// try writer.writeInt(u32, @intCast(payload.len), .little); +// try writer.writeAll(payload); +// } - const payload = try allocator.alloc(u8, size); - errdefer allocator.free(payload); +// pub fn read_message(reader: *std.Io.Reader, allocator: std.mem.Allocator) !struct { +// msg_type: MessageType, +// payload: []u8, +// } { +// const msg_type = try reader.readByte(); +// const size = try reader.readInt(u32, .little); - try reader.readNoEof(payload); +// const payload = try allocator.alloc(u8, size); +// errdefer allocator.free(payload); - return .{ - .msg_type = @enumFromInt(msg_type), - .payload = payload, - }; -} +// try reader.readNoEof(payload); + +// return .{ +// .msg_type = @enumFromInt(msg_type), +// .payload = payload, +// }; +// } pub const Elf_v1 = struct { id: entity.id = entity.INVALID_ID, pos: zm.Vec, hp: i32, - pub fn init(elf: *entity.Elf) Elf_v1 { + pub fn init(elf: entity.Elf) Elf_v1 { return .{ .id = elf.id, .pos = elf.pos, @@ -54,17 +64,12 @@ pub const Elf_v1 = struct { }; } - pub fn encode(self: Elf_v1, w: bufzilla.Writer) !void { - try w.write(self.id, entity.id); - //try w.write(self.pos, zm.Vec); - try w.write(self.hp, i32); - } - - pub fn decode(r: *std.Io.Reader) !Elf_v1 { + pub fn decode(r: *bufzilla.Reader) !Elf_v1 { + _ = r; return .{ - .id = try r.readInt(u64, .little), - .pos = try readVec4(r), - .vel = try readVec4(r), + // .id = try r.readInt(u64, .little), + // .pos = try readVec4(r), + // .vel = try readVec4(r), }; } }; @@ -74,12 +79,20 @@ pub const Monster_v1 = struct { pos: zm.Vec, hp: i32, - pub fn encode(self: Monster_v1, w: *std.Io.Writer) !void { - try w.writeInt(u64, self.id, .little); - try writeVec4(w, self.pos); - try writeVec4(w, self.vel); + pub fn init(monster: entity.Monster) Monster_v1 { + return .{ + .id = monster.id, + .pos = monster.pos, + .hp = monster.hp, + }; } + // pub fn encode(self: Monster_v1, w: *std.Io.Writer) !void { + // try w.writeInt(u64, self.id, .little); + // try writeVec4(w, self.pos); + // try writeVec4(w, self.vel); + // } + pub fn decode(r: *std.Io.Reader) !Monster_v1 { return .{ .id = try r.readInt(u64, .little), @@ -94,12 +107,20 @@ pub const Projectile_v1 = struct { pos: zm.Vec, vel: zm.Vec, - pub fn encode(self: Projectile_v1, w: *std.Io.Writer) !void { - try w.writeInt(u64, self.id, .little); - try writeVec4(w, self.pos); - try writeVec4(w, self.vel); + pub fn init(projectile: entity.Projectile) Projectile_v1 { + return .{ + .id = projectile.id, + .pos = projectile.pos, + .vel = projectile.vel, + }; } + // pub fn encode(self: Projectile_v1, w: *std.Io.Writer) !void { + // try w.writeInt(u64, self.id, .little); + // try writeVec4(w, self.pos); + // try writeVec4(w, self.vel); + // } + pub fn decode(r: *std.Io.Reader) !Projectile_v1 { return .{ .id = try r.readInt(u64, .little),