diff --git a/src/network.zig b/src/network.zig index bd7eebd9..6ffb8405 100644 --- a/src/network.zig +++ b/src/network.zig @@ -508,6 +508,7 @@ pub const ConnectionManager = struct { } pub fn finishCurrentReceive(self: *ConnectionManager) void { + std.debug.assert(self.threadId != std.Thread.getCurrentId()); // WOuld cause deadlock, since we are in a receive. self.mutex.lock(); defer self.mutex.unlock(); self.waitingToFinishReceive.wait(&self.mutex); @@ -1285,6 +1286,7 @@ pub const Connection = struct { pub fn init(manager: *ConnectionManager, ipPort: []const u8, user: ?*main.server.User) !*Connection { const result: *Connection = main.globalAllocator.create(Connection); + errdefer main.globalAllocator.destroy(result); result.* = Connection { .manager = manager, .user = user, @@ -1295,14 +1297,19 @@ pub const Connection = struct { .congestionControl_lastSendTime = @truncate(std.time.nanoTimestamp()), .congestionControl_sendTimeLimit = @as(i64, @truncate(std.time.nanoTimestamp())) +% timeUnit*21/20, }; + errdefer main.globalAllocator.free(result.packetMemory); result.unconfirmedPackets = main.List(UnconfirmedPacket).init(main.globalAllocator); + errdefer result.unconfirmedPackets.deinit(); result.packetQueue = main.utils.CircularBufferQueue(UnconfirmedPacket).init(main.globalAllocator, 1024); + errdefer result.packetQueue.deinit(); result.receivedPackets = [3]main.List(u32){ main.List(u32).init(main.globalAllocator), main.List(u32).init(main.globalAllocator), main.List(u32).init(main.globalAllocator), }; - errdefer result.deinit(); + errdefer for(&result.receivedPackets) |*list| { + list.deinit(); + }; var splitter = std.mem.split(u8, ipPort, ":"); const ip = splitter.first(); result.remoteAddress.ip = try Socket.resolveIP(ip); diff --git a/src/server/command/_list.zig b/src/server/command/_list.zig index 34e2cb12..eb240428 100644 --- a/src/server/command/_list.zig +++ b/src/server/command/_list.zig @@ -1,5 +1,6 @@ pub const help = @import("help.zig"); +pub const invite = @import("invite.zig"); pub const time = @import("time.zig"); pub const tp = @import("tp.zig"); \ No newline at end of file diff --git a/src/server/command/invite.zig b/src/server/command/invite.zig new file mode 100644 index 00000000..506a43dd --- /dev/null +++ b/src/server/command/invite.zig @@ -0,0 +1,27 @@ +const std = @import("std"); + +const main = @import("root"); +const User = main.server.User; + +pub const description = "Invite a player"; +pub const usage = "/invite "; + +pub fn execute(args: []const u8, source: *User) void { + var split = std.mem.splitScalar(u8, args, ' '); + if(split.next()) |arg| blk: { + if(arg.len == 0) break :blk; + if(split.next() != null) { + source.sendMessage("#ff0000Too many arguments for command /invite"); + } + const user = main.server.User.initAndIncreaseRefCount(main.server.connectionManager, arg) catch |err| { + const msg = std.fmt.allocPrint(main.stackAllocator.allocator, "#ff0000Error while trying to connect: {s}", .{@errorName(err)}) catch unreachable; + defer main.stackAllocator.free(msg); + std.log.err("{s}", .{msg[7..]}); + source.sendMessage(msg); + return; + }; + user.decreaseRefCount(); + return; + } + source.sendMessage("#ff0000Too few arguments for command /tp"); +} \ No newline at end of file diff --git a/src/server/command/time.zig b/src/server/command/time.zig index bed90d19..d2311088 100644 --- a/src/server/command/time.zig +++ b/src/server/command/time.zig @@ -4,7 +4,7 @@ const main = @import("root"); const User = main.server.User; pub const description = "Get or set the server time."; -pub const usage = "/time\n/time \n/time