From 00c02e299203a60910b3d748d4b5c68b8fe50384 Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Wed, 1 Apr 2026 20:44:53 +0200 Subject: [PATCH 01/10] use kick inside manage player --- src/gui/windows/invite.zig | 1 - src/gui/windows/manage_players.zig | 68 +++++++++++++++++++++++------- src/gui/windows/pause.zig | 4 +- 3 files changed, 54 insertions(+), 19 deletions(-) diff --git a/src/gui/windows/invite.zig b/src/gui/windows/invite.zig index 1a6c478447..16b4dc8559 100644 --- a/src/gui/windows/invite.zig +++ b/src/gui/windows/invite.zig @@ -74,7 +74,6 @@ pub fn onOpen() void { ipAddressEntry.obfuscated = main.settings.streamerMode; list.add(ipAddressEntry); list.add(Button.initText(.{0, 0}, 100, "Invite", .init(invite))); - list.add(Button.initText(.{0, 0}, 100, "Manage Players", gui.openWindowCallback("manage_players"))); list.add(CheckBox.init(.{0, 0}, width, "Allow anyone to join (requires a publicly visible IP address+port which may need some configuration in your router)", main.server.connectionManager.allowNewConnections.load(.monotonic), &makePublic)); list.finish(.center); window.rootComponent = list.toComponent(); diff --git a/src/gui/windows/manage_players.zig b/src/gui/windows/manage_players.zig index b5635acf64..272b0e9093 100644 --- a/src/gui/windows/manage_players.zig +++ b/src/gui/windows/manage_players.zig @@ -21,14 +21,40 @@ pub var window = GuiWindow{ const padding: f32 = 8; var userList: []*main.server.User = &.{}; +var entityCount: u32 = 0; -fn kick(conn: *main.network.Connection) void { +fn kickPerConn(conn: *main.network.Connection) void { conn.disconnect(); } +fn kickPerIndex(playerIndex: usize) void { + const command = std.fmt.allocPrint(main.globalAllocator.allocator, "kick @{d}", .{playerIndex}) catch unreachable; + main.sync.ClientSide.executeCommand(.{.chatCommand = .{.message = command}}); +} + pub fn onOpen() void { const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); - { + if (main.server.world == null) blk: { + entityCount = main.client.entity_manager.entities.len; + if (entityCount == 0) { + list.add(Label.init(.{0, 0}, 200, "No players to manage", .left)); + break :blk; + } + + const old = main.settings.showIdWithName; + main.settings.showIdWithName = true; + defer main.settings.showIdWithName = old; + for (main.client.entity_manager.entities.items()) |ent| { + if (ent.name.len == 0) continue; + const row = HorizontalList.init(); + + const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{ent}) catch unreachable; + defer main.stackAllocator.free(string); + row.add(Label.init(.{0, 0}, 200, string, .left)); + row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithInt(kickPerIndex, ent.playerIndex))); + list.add(row); + } + } else { main.server.connectionManager.mutex.lock(); defer main.server.connectionManager.mutex.unlock(); std.debug.assert(userList.len == 0); @@ -38,16 +64,19 @@ pub fn onOpen() void { userList[i].increaseRefCount(); const row = HorizontalList.init(); if (connection.user.?.name.len != 0) { - row.add(Label.init(.{0, 0}, 200, connection.user.?.name, .left)); - row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithPtr(kick, connection))); + const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.user.?}) catch unreachable; + defer main.stackAllocator.free(string); + row.add(Label.init(.{0, 0}, 200, string, .left)); + row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithPtr(kickPerConn, connection))); } else { const ip = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.remoteAddress}) catch unreachable; defer main.stackAllocator.free(ip); row.add(Label.init(.{0, 0}, 200, ip, .left)); - row.add(Button.initText(.{0, 0}, 100, "Cancel", .initWithPtr(kick, connection))); + row.add(Button.initText(.{0, 0}, 100, "Cancel", .initWithPtr(kickPerConn, connection))); } list.add(row); } + list.add(Button.initText(.{0, 0}, 128, "Invite Player", gui.openWindowCallback("invite"))); } list.finish(.center); window.rootComponent = list.toComponent(); @@ -56,22 +85,31 @@ pub fn onOpen() void { } pub fn onClose() void { - for (userList) |user| { - user.decreaseRefCount(); + if (main.server.world != null) { + for (userList) |user| { + user.decreaseRefCount(); + } + main.globalAllocator.free(userList); + userList = &.{}; } - main.globalAllocator.free(userList); - userList = &.{}; if (window.rootComponent) |*comp| { comp.deinit(); } } pub fn update() void { - main.server.connectionManager.mutex.lock(); - const serverListLen = main.server.connectionManager.connections.items.len; - main.server.connectionManager.mutex.unlock(); - if (userList.len != serverListLen) { - onClose(); - onOpen(); + if (main.server.world == null) { + if (main.client.entity_manager.entities.len != entityCount) { + onClose(); + onOpen(); + } + } else { + main.server.connectionManager.mutex.lock(); + const serverListLen = main.server.connectionManager.connections.items.len; + main.server.connectionManager.mutex.unlock(); + if (userList.len != serverListLen) { + onClose(); + onOpen(); + } } } diff --git a/src/gui/windows/pause.zig b/src/gui/windows/pause.zig index d144df9e33..0099b251a1 100644 --- a/src/gui/windows/pause.zig +++ b/src/gui/windows/pause.zig @@ -21,9 +21,7 @@ fn reorderHudCallbackFunction() void { } pub fn onOpen() void { const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); - if (main.server.world != null) { - list.add(Button.initText(.{0, 0}, 128, "Invite Player", gui.openWindowCallback("invite"))); - } + list.add(Button.initText(.{0, 0}, 128, "Manage Players", gui.openWindowCallback("manage_players"))); list.add(Button.initText(.{0, 0}, 128, "Settings", gui.openWindowCallback("settings"))); list.add(Button.initText(.{0, 0}, 128, "Reorder HUD", .init(reorderHudCallbackFunction))); list.add(Button.initText(.{0, 0}, 128, "Exit World", .init(main.exitToMenu))); From 6c1e0ab4a3491e01053afc48276ad6435cdb8acc Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Wed, 8 Apr 2026 21:15:05 +0200 Subject: [PATCH 02/10] make playerIndex optinal and rename manage_players --- src/client/Entity.zig | 12 ++++++++---- src/gui/windows/{manage_players.zig => players.zig} | 0 2 files changed, 8 insertions(+), 4 deletions(-) rename src/gui/windows/{manage_players.zig => players.zig} (100%) diff --git a/src/client/Entity.zig b/src/client/Entity.zig index c35176ad11..7e24d046a1 100644 --- a/src/client/Entity.zig +++ b/src/client/Entity.zig @@ -30,7 +30,7 @@ rot: Vec3f = undefined, id: u32, name: []const u8, -playerIndex: usize, // TODO extract into own component #2760 +playerIndex: ?usize, // TODO extract into own component #2760 pub fn init(self: *@This(), zon: ZonElement, allocator: NeverFailingAllocator) void { self.* = @This(){ @@ -38,7 +38,7 @@ pub fn init(self: *@This(), zon: ZonElement, allocator: NeverFailingAllocator) v .width = zon.get(f64, "width", 1), .height = zon.get(f64, "height", 1), .name = allocator.dupe(u8, zon.get([]const u8, "name", "")), - .playerIndex = zon.get(usize, "playerIndex", std.math.maxInt(usize)), + .playerIndex = zon.get(?usize, "playerIndex", null), }; self._interpolationPos = [_]f64{ self.pos[0], @@ -75,9 +75,13 @@ pub fn update(self: *@This(), time: i16, lastTime: i16) void { } pub fn format(self: *const @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void { - if (main.settings.showIdWithName) { - try writer.print("{s}@{d}", .{self.name, self.playerIndex}); + if (main.settings.showIdWithName and self.playerIndex != null) { + try self.printWithIndex(writer); } else { try writer.print("{s}", .{self.name}); } } + +pub fn printWithIndex(self: *const @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void { + try writer.print("{s}@{d}", .{self.name, self.playerIndex}); +} diff --git a/src/gui/windows/manage_players.zig b/src/gui/windows/players.zig similarity index 100% rename from src/gui/windows/manage_players.zig rename to src/gui/windows/players.zig From a8e19d8617c7cfee7924a71ba49d2c28ad808b39 Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Wed, 8 Apr 2026 21:53:48 +0200 Subject: [PATCH 03/10] do what was asked --- src/client/Entity.zig | 7 +++-- src/gui/windows/_windowlist.zig | 2 +- src/gui/windows/pause.zig | 5 ++- src/gui/windows/players.zig | 56 +++++---------------------------- 4 files changed, 17 insertions(+), 53 deletions(-) diff --git a/src/client/Entity.zig b/src/client/Entity.zig index 7e24d046a1..f20e7f2dd9 100644 --- a/src/client/Entity.zig +++ b/src/client/Entity.zig @@ -76,12 +76,13 @@ pub fn update(self: *@This(), time: i16, lastTime: i16) void { pub fn format(self: *const @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void { if (main.settings.showIdWithName and self.playerIndex != null) { - try self.printWithIndex(writer); + try self.formatWithPlayerIndex(writer); } else { try writer.print("{s}", .{self.name}); } } -pub fn printWithIndex(self: *const @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void { - try writer.print("{s}@{d}", .{self.name, self.playerIndex}); +pub fn formatWithPlayerIndex(self: @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void { + std.debug.assert(self.playerIndex != null); + try writer.print("{s}@{d}", .{self.name, self.playerIndex.?}); } diff --git a/src/gui/windows/_windowlist.zig b/src/gui/windows/_windowlist.zig index b8b5d8efa6..b05a494ca3 100644 --- a/src/gui/windows/_windowlist.zig +++ b/src/gui/windows/_windowlist.zig @@ -21,7 +21,7 @@ pub const inventory = @import("inventory.zig"); pub const inventory_crafting = @import("inventory_crafting.zig"); pub const invite = @import("invite.zig"); pub const main = @import("main.zig"); -pub const manage_players = @import("manage_players.zig"); +pub const players = @import("players.zig"); pub const multiplayer = @import("multiplayer.zig"); pub const notification = @import("notification.zig"); pub const pause = @import("pause.zig"); diff --git a/src/gui/windows/pause.zig b/src/gui/windows/pause.zig index 0099b251a1..cb3fbde9bb 100644 --- a/src/gui/windows/pause.zig +++ b/src/gui/windows/pause.zig @@ -21,7 +21,10 @@ fn reorderHudCallbackFunction() void { } pub fn onOpen() void { const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); - list.add(Button.initText(.{0, 0}, 128, "Manage Players", gui.openWindowCallback("manage_players"))); + list.add(Button.initText(.{0, 0}, 128, "Players", gui.openWindowCallback("players"))); + if (main.server.world != null) { + list.add(Button.initText(.{0, 0}, 128, "Invite Player", gui.openWindowCallback("invite"))); + } list.add(Button.initText(.{0, 0}, 128, "Settings", gui.openWindowCallback("settings"))); list.add(Button.initText(.{0, 0}, 128, "Reorder HUD", .init(reorderHudCallbackFunction))); list.add(Button.initText(.{0, 0}, 128, "Exit World", .init(main.exitToMenu))); diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index 272b0e9093..71081bd559 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -34,10 +34,10 @@ fn kickPerIndex(playerIndex: usize) void { pub fn onOpen() void { const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); - if (main.server.world == null) blk: { + blk: { entityCount = main.client.entity_manager.entities.len; if (entityCount == 0) { - list.add(Label.init(.{0, 0}, 200, "No players to manage", .left)); + list.add(Label.init(.{0, 0}, 200, "No players", .left)); break :blk; } @@ -45,38 +45,15 @@ pub fn onOpen() void { main.settings.showIdWithName = true; defer main.settings.showIdWithName = old; for (main.client.entity_manager.entities.items()) |ent| { - if (ent.name.len == 0) continue; + if (ent.name.len == 0 or ent.playerIndex == null) continue; const row = HorizontalList.init(); - const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{ent}) catch unreachable; + const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{std.fmt.alt(ent, .formatWithPlayerIndex)}) catch unreachable; defer main.stackAllocator.free(string); row.add(Label.init(.{0, 0}, 200, string, .left)); - row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithInt(kickPerIndex, ent.playerIndex))); + row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithInt(kickPerIndex, ent.playerIndex.?))); list.add(row); } - } else { - main.server.connectionManager.mutex.lock(); - defer main.server.connectionManager.mutex.unlock(); - std.debug.assert(userList.len == 0); - userList = main.globalAllocator.alloc(*main.server.User, main.server.connectionManager.connections.items.len); - for (main.server.connectionManager.connections.items, 0..) |connection, i| { - userList[i] = connection.user.?; - userList[i].increaseRefCount(); - const row = HorizontalList.init(); - if (connection.user.?.name.len != 0) { - const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.user.?}) catch unreachable; - defer main.stackAllocator.free(string); - row.add(Label.init(.{0, 0}, 200, string, .left)); - row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithPtr(kickPerConn, connection))); - } else { - const ip = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.remoteAddress}) catch unreachable; - defer main.stackAllocator.free(ip); - row.add(Label.init(.{0, 0}, 200, ip, .left)); - row.add(Button.initText(.{0, 0}, 100, "Cancel", .initWithPtr(kickPerConn, connection))); - } - list.add(row); - } - list.add(Button.initText(.{0, 0}, 128, "Invite Player", gui.openWindowCallback("invite"))); } list.finish(.center); window.rootComponent = list.toComponent(); @@ -85,31 +62,14 @@ pub fn onOpen() void { } pub fn onClose() void { - if (main.server.world != null) { - for (userList) |user| { - user.decreaseRefCount(); - } - main.globalAllocator.free(userList); - userList = &.{}; - } if (window.rootComponent) |*comp| { comp.deinit(); } } pub fn update() void { - if (main.server.world == null) { - if (main.client.entity_manager.entities.len != entityCount) { - onClose(); - onOpen(); - } - } else { - main.server.connectionManager.mutex.lock(); - const serverListLen = main.server.connectionManager.connections.items.len; - main.server.connectionManager.mutex.unlock(); - if (userList.len != serverListLen) { - onClose(); - onOpen(); - } + if (main.client.entity_manager.entities.len != entityCount) { + onClose(); + onOpen(); } } From e7743e5cde0eb1e2feadbf3dc69b6418d2a6b5f4 Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Wed, 8 Apr 2026 21:59:37 +0200 Subject: [PATCH 04/10] wierd merge --- src/client/Entity.zig | 7 +------ src/gui/windows/players.zig | 3 --- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/client/Entity.zig b/src/client/Entity.zig index 61a2cf532e..a6305f0c49 100644 --- a/src/client/Entity.zig +++ b/src/client/Entity.zig @@ -75,13 +75,8 @@ pub fn update(self: *@This(), time: i16, lastTime: i16) void { } pub fn format(self: *const @This(), writer: *std.Io.Writer) std.Io.Writer.Error!void { -<<<<<<< switch-manage - if (main.settings.showIdWithName and self.playerIndex != null) { + if (main.settings.showPlayerIndexWithName and self.playerIndex != null) { try self.formatWithPlayerIndex(writer); -======= - if (main.settings.showPlayerIndexWithName) { - try writer.print("{s}@{d}", .{self.name, self.playerIndex}); ->>>>>>> master } else { try writer.print("{s}", .{self.name}); } diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index 71081bd559..2b07e8ace0 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -41,9 +41,6 @@ pub fn onOpen() void { break :blk; } - const old = main.settings.showIdWithName; - main.settings.showIdWithName = true; - defer main.settings.showIdWithName = old; for (main.client.entity_manager.entities.items()) |ent| { if (ent.name.len == 0 or ent.playerIndex == null) continue; const row = HorizontalList.init(); From f5c3ca0fcb168d48da20ad90d3b31ead9d473c30 Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Thu, 9 Apr 2026 07:32:33 +0200 Subject: [PATCH 05/10] Update src/gui/windows/players.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/gui/windows/players.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index 2b07e8ace0..76d57b69e0 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -37,7 +37,7 @@ pub fn onOpen() void { blk: { entityCount = main.client.entity_manager.entities.len; if (entityCount == 0) { - list.add(Label.init(.{0, 0}, 200, "No players", .left)); + list.add(Label.init(.{0, 0}, 200, "No other players", .left)); break :blk; } From 4a47048b401c9af96028354278c4adcbf991d0fa Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Thu, 9 Apr 2026 07:33:48 +0200 Subject: [PATCH 06/10] even with no name you get kicked --- src/gui/windows/players.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index 76d57b69e0..f005c20292 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -42,7 +42,7 @@ pub fn onOpen() void { } for (main.client.entity_manager.entities.items()) |ent| { - if (ent.name.len == 0 or ent.playerIndex == null) continue; + if (ent.playerIndex == null) continue; const row = HorizontalList.init(); const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{std.fmt.alt(ent, .formatWithPlayerIndex)}) catch unreachable; From c1c80cfa31b58d63571c802f1a5529c86a6cb4f5 Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:51:48 +0200 Subject: [PATCH 07/10] bring back client-server side implementation --- src/gui/windows/players.zig | 48 +++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index f005c20292..eb5d762f7a 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -34,7 +34,7 @@ fn kickPerIndex(playerIndex: usize) void { pub fn onOpen() void { const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); - blk: { + if (main.server.world == null) blk: { entityCount = main.client.entity_manager.entities.len; if (entityCount == 0) { list.add(Label.init(.{0, 0}, 200, "No other players", .left)); @@ -51,6 +51,29 @@ pub fn onOpen() void { row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithInt(kickPerIndex, ent.playerIndex.?))); list.add(row); } + } else { + main.server.connectionManager.mutex.lock(); + defer main.server.connectionManager.mutex.unlock(); + std.debug.assert(userList.len == 0); + userList = main.globalAllocator.alloc(*main.server.User, main.server.connectionManager.connections.items.len); + for (main.server.connectionManager.connections.items, 0..) |connection, i| { + userList[i] = connection.user.?; + userList[i].increaseRefCount(); + if (userList[i].id == main.game.Player.id) continue; + const row = HorizontalList.init(); + if (connection.user.?.name.len != 0) { + const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.user.?}) catch unreachable; + defer main.stackAllocator.free(string); + row.add(Label.init(.{0, 0}, 200, string, .left)); + row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithPtr(kickPerConn, connection))); + } else { + const ip = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.remoteAddress}) catch unreachable; + defer main.stackAllocator.free(ip); + row.add(Label.init(.{0, 0}, 200, ip, .left)); + row.add(Button.initText(.{0, 0}, 100, "Cancel", .initWithPtr(kickPerConn, connection))); + } + list.add(row); + } } list.finish(.center); window.rootComponent = list.toComponent(); @@ -59,14 +82,31 @@ pub fn onOpen() void { } pub fn onClose() void { + if (main.server.world != null) { + for (userList) |user| { + user.decreaseRefCount(); + } + main.globalAllocator.free(userList); + userList = &.{}; + } if (window.rootComponent) |*comp| { comp.deinit(); } } pub fn update() void { - if (main.client.entity_manager.entities.len != entityCount) { - onClose(); - onOpen(); + if (main.server.world == null) { + if (main.client.entity_manager.entities.len != entityCount) { + onClose(); + onOpen(); + } + } else { + main.server.connectionManager.mutex.lock(); + const serverListLen = main.server.connectionManager.connections.items.len; + main.server.connectionManager.mutex.unlock(); + if (userList.len != serverListLen) { + onClose(); + onOpen(); + } } } From 781ebd0b8b5f2cf7345966d34a664204e7eecde6 Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:30:47 +0200 Subject: [PATCH 08/10] skip self when using server-client implementation and display 0 length names --- src/gui/windows/players.zig | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index eb5d762f7a..fe6f69066e 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -59,9 +59,9 @@ pub fn onOpen() void { for (main.server.connectionManager.connections.items, 0..) |connection, i| { userList[i] = connection.user.?; userList[i].increaseRefCount(); - if (userList[i].id == main.game.Player.id) continue; + if (userList[i].id == main.game.Player.id and connection.isConnected()) continue; const row = HorizontalList.init(); - if (connection.user.?.name.len != 0) { + if (connection.isConnected()) { const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.user.?}) catch unreachable; defer main.stackAllocator.free(string); row.add(Label.init(.{0, 0}, 200, string, .left)); @@ -74,6 +74,9 @@ pub fn onOpen() void { } list.add(row); } + if (userList.len == 1) { + list.add(Label.init(.{0, 0}, 200, "No other players", .left)); + } } list.finish(.center); window.rootComponent = list.toComponent(); From 99b97a12c391b794cf05935114124bfba46fbf31 Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Sat, 11 Apr 2026 11:43:10 +0200 Subject: [PATCH 09/10] applied suggestions and use handshake state to know if player has already sent name --- src/gui/windows/players.zig | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index fe6f69066e..ea84efec2d 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -23,11 +23,11 @@ const padding: f32 = 8; var userList: []*main.server.User = &.{}; var entityCount: u32 = 0; -fn kickPerConn(conn: *main.network.Connection) void { +fn kickbyConnection(conn: *main.network.Connection) void { conn.disconnect(); } -fn kickPerIndex(playerIndex: usize) void { +fn kickByPlayerIndex(playerIndex: usize) void { const command = std.fmt.allocPrint(main.globalAllocator.allocator, "kick @{d}", .{playerIndex}) catch unreachable; main.sync.ClientSide.executeCommand(.{.chatCommand = .{.message = command}}); } @@ -48,7 +48,7 @@ pub fn onOpen() void { const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{std.fmt.alt(ent, .formatWithPlayerIndex)}) catch unreachable; defer main.stackAllocator.free(string); row.add(Label.init(.{0, 0}, 200, string, .left)); - row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithInt(kickPerIndex, ent.playerIndex.?))); + row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithInt(kickByPlayerIndex, ent.playerIndex.?))); list.add(row); } } else { @@ -61,16 +61,16 @@ pub fn onOpen() void { userList[i].increaseRefCount(); if (userList[i].id == main.game.Player.id and connection.isConnected()) continue; const row = HorizontalList.init(); - if (connection.isConnected()) { + if (@intFromEnum(connection.handShakeState.load(.monotonic)) >= @intFromEnum(main.network.Connection.HandShakeState.userData)) { const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.user.?}) catch unreachable; defer main.stackAllocator.free(string); row.add(Label.init(.{0, 0}, 200, string, .left)); - row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithPtr(kickPerConn, connection))); + row.add(Button.initText(.{0, 0}, 100, "Kick", .initWithPtr(kickbyConnection, connection))); } else { const ip = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.remoteAddress}) catch unreachable; defer main.stackAllocator.free(ip); row.add(Label.init(.{0, 0}, 200, ip, .left)); - row.add(Button.initText(.{0, 0}, 100, "Cancel", .initWithPtr(kickPerConn, connection))); + row.add(Button.initText(.{0, 0}, 100, "Cancel", .initWithPtr(kickbyConnection, connection))); } list.add(row); } From 52ffd89cf1e37e6cc2126a8999dea431ca48d07d Mon Sep 17 00:00:00 2001 From: Wunka <56411012+Wunka@users.noreply.github.com> Date: Sat, 11 Apr 2026 12:08:40 +0200 Subject: [PATCH 10/10] only on complete --- src/gui/windows/players.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/windows/players.zig b/src/gui/windows/players.zig index ea84efec2d..194bcbf4f4 100644 --- a/src/gui/windows/players.zig +++ b/src/gui/windows/players.zig @@ -61,7 +61,7 @@ pub fn onOpen() void { userList[i].increaseRefCount(); if (userList[i].id == main.game.Player.id and connection.isConnected()) continue; const row = HorizontalList.init(); - if (@intFromEnum(connection.handShakeState.load(.monotonic)) >= @intFromEnum(main.network.Connection.HandShakeState.userData)) { + if (connection.handShakeState.load(.monotonic) == .complete) { const string = std.fmt.allocPrint(main.stackAllocator.allocator, "{f}", .{connection.user.?}) catch unreachable; defer main.stackAllocator.free(string); row.add(Label.init(.{0, 0}, 200, string, .left));