From c6c640ac6be794be63e74e57c1e15834fa6faa44 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 2 Aug 2026 13:32:08 -0700 Subject: [PATCH 1/3] added this new functionality --- assets/cubyz/blocks/respawn_anchor.zig.zon | 13 +++++ .../cubyz/blocks/textures/respawn_anchor.png | Bin 0 -> 342 bytes src/callbacks/block/client/_list.zig | 1 + src/callbacks/block/client/set_spawn.zig | 22 ++++++++ src/sync.zig | 53 ++++++++++++++++++ 5 files changed, 89 insertions(+) create mode 100644 assets/cubyz/blocks/respawn_anchor.zig.zon create mode 100644 assets/cubyz/blocks/textures/respawn_anchor.png create mode 100644 src/callbacks/block/client/set_spawn.zig diff --git a/assets/cubyz/blocks/respawn_anchor.zig.zon b/assets/cubyz/blocks/respawn_anchor.zig.zon new file mode 100644 index 0000000000..f06c8b50af --- /dev/null +++ b/assets/cubyz/blocks/respawn_anchor.zig.zon @@ -0,0 +1,13 @@ +.{ + .tags = .{.mineable}, + .blockHealth = 10, + .drops = .{ + .{.items = .{.auto}}, + }, + .model = "cubyz:cube", + .rotation = "cubyz:stairs", + .texture = "cubyz:respawn_anchor", + .onInteract = .{ + .type = .set_spawn, + }, +} diff --git a/assets/cubyz/blocks/textures/respawn_anchor.png b/assets/cubyz/blocks/textures/respawn_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..5af84bea5568957d2fb28d3f51a45edbf0eb4106 GIT binary patch literal 342 zcmV-c0jd6pP)pwI(3gP*qzNSX2U>iq zc<>fCNDbHP%~tKMEo&X4PxqPwNg7l!Zh8Zawr=#_2H}lvz)6@3XVMUa#y^e%{Hb2# z`!pm9$Paf*xtwm6;sc|A)^_f9Z~OLf5&hgz057F1q`I6&W=;s{OCjWUHZec|7@^Vp zXDq-Q-9Q_JK!}XY+WQ*zyYt6C3MTLd^_-5kxB(A9f=?9pF07*qoM6N<$f^h(f00000 literal 0 HcmV?d00001 diff --git a/src/callbacks/block/client/_list.zig b/src/callbacks/block/client/_list.zig index 9a77fb7eb6..f2bd47dd73 100644 --- a/src/callbacks/block/client/_list.zig +++ b/src/callbacks/block/client/_list.zig @@ -1,3 +1,4 @@ pub const edit_sign = @import("edit_sign.zig"); pub const open_chest = @import("open_chest.zig"); pub const open_window = @import("open_window.zig"); +pub const set_spawn = @import("set_spawn.zig"); diff --git a/src/callbacks/block/client/set_spawn.zig b/src/callbacks/block/client/set_spawn.zig new file mode 100644 index 0000000000..1424865ce4 --- /dev/null +++ b/src/callbacks/block/client/set_spawn.zig @@ -0,0 +1,22 @@ +const std = @import("std"); + +const main = @import("main"); +const Block = main.blocks.Block; +const vec = main.vec; +const Vec3i = vec.Vec3i; +const ZonElement = main.ZonElement; + +respawnEffeciency: f32, + +pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*anyopaque { + const result = main.worldArena.create(@This()); + result.* = .{ + .respawnEffeciency = zon.get(f32, "respawnEffecincy") orelse 1.0, + }; + return result; +} + +pub fn run(self: *@This(), params: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { + main.sync.setSpawn(params.blockPos, self.respawnEffeciency, .client, main.game.Player.id); + return .handled; +} diff --git a/src/sync.zig b/src/sync.zig index 6ec9a7e7c2..2c462f62d4 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -214,6 +214,15 @@ pub fn addHealth(health: f32, cause: main.game.DamageType, side: Side, entity: m } } +pub fn setSpawn(position: Vec3i, respawnEffeciency: f32, side: Side, entity: main.entity.Entity) void { + threadContext.assertCorrectContext(side); + if (side == .client) { + client.executeCommand(.{.setSpawn = .{.target = entity, .position = position, .respawnEffeciency = respawnEffeciency}}); + } else { + server.executeCommand(.{.setSpawn = .{.target = entity, .position = position, .respawnEffeciency = respawnEffeciency}}, null); + } +} + pub fn setGamemode(user: ?*main.server.User, gamemode: Gamemode) void { if (user == null) { client.setGamemode(gamemode); @@ -241,6 +250,7 @@ pub const Command = struct { // MARK: Command updateBlock = 9, addHealth = 10, chatCommand = 12, + setSpawn = 18, }; pub const Payload = union(PayloadType) { open: Open, @@ -261,6 +271,7 @@ pub const Command = struct { // MARK: Command updateBlock: UpdateBlock, addHealth: AddHealth, chatCommand: ChatCommand, + setSpawn: SetSpawn, }; const BaseOperationType = enum(u8) { @@ -1761,6 +1772,48 @@ pub const Command = struct { // MARK: Command }; } }; + + const SetSpawn = struct { // MARK: SetSpawn + target: main.entity.Entity, + position: Vec3i, + respawnEffeciency: f32, + + pub fn run(self: SetSpawn, ctx: Context) error{serverFailure}!void { + var target: ?*main.server.User = null; + + if (ctx.side == .server) { + const userList = main.server.getUserList(main.stackAllocator); + defer main.stackAllocator.free(userList); + for (userList) |user| { + if (user.id == self.target) { + target = user; + break; + } + } + + if (target == null) return error.serverFailure; + + target.?.spawnPos = @floatFromInt(self.position); + target.?.sendRawMessage("Set New SpawnPoint"); + } + } + + fn serialize(self: SetSpawn, writer: *BinaryWriter) void { + writer.writeEnum(main.entity.Entity, self.target); + writer.writeVec(Vec3i, self.position); + writer.writeFloat(f32, self.respawnEffeciency); + } + + fn deserialize(reader: *BinaryReader, _: Side, user: ?*main.server.User) !SetSpawn { + const result: SetSpawn = .{ + .target = try reader.readEnum(main.entity.Entity), + .position = try reader.readVec(Vec3i), + .respawnEffeciency = try reader.readFloat(f32), + }; + if (user.?.id != result.target) return error.Invalid; + return result; + } + }; }; pub threadlocal var threadContext: ThreadContext = .other; From 6d9c58364410741bbd00fff675c0377a6cc2b778 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 2 Aug 2026 20:44:38 -0700 Subject: [PATCH 2/3] respawning now is affected by effeciency and if it has broken --- .../cubyz/blocks/bad_respawn_anchor.zig.zon | 15 +++++++++++ assets/cubyz/blocks/respawn_anchor.zig.zon | 1 + .../blocks/textures/bad_respawn_anchor.png | Bin 0 -> 344 bytes src/block_entity.zig | 22 +++++++++++++++ src/callbacks/block/client/set_spawn.zig | 2 +- src/game.zig | 4 +-- src/server/server.zig | 25 +++++++++++++++++- src/server/world.zig | 3 +++ src/sync.zig | 7 ++++- 9 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 assets/cubyz/blocks/bad_respawn_anchor.zig.zon create mode 100644 assets/cubyz/blocks/textures/bad_respawn_anchor.png diff --git a/assets/cubyz/blocks/bad_respawn_anchor.zig.zon b/assets/cubyz/blocks/bad_respawn_anchor.zig.zon new file mode 100644 index 0000000000..94add7e53a --- /dev/null +++ b/assets/cubyz/blocks/bad_respawn_anchor.zig.zon @@ -0,0 +1,15 @@ +.{ + .tags = .{.mineable}, + .blockHealth = 10, + .drops = .{ + .{.items = .{.auto}}, + }, + .model = "cubyz:cube", + .rotation = "cubyz:stairs", + .texture = "cubyz:bad_respawn_anchor", + .blockEntity = "cubyz:respawn_anchor", + .onInteract = .{ + .type = .set_spawn, + .respawnEffeciency = 0.1, + }, +} diff --git a/assets/cubyz/blocks/respawn_anchor.zig.zon b/assets/cubyz/blocks/respawn_anchor.zig.zon index f06c8b50af..9c6ab09bea 100644 --- a/assets/cubyz/blocks/respawn_anchor.zig.zon +++ b/assets/cubyz/blocks/respawn_anchor.zig.zon @@ -7,6 +7,7 @@ .model = "cubyz:cube", .rotation = "cubyz:stairs", .texture = "cubyz:respawn_anchor", + .blockEntity = "cubyz:respawn_anchor", .onInteract = .{ .type = .set_spawn, }, diff --git a/assets/cubyz/blocks/textures/bad_respawn_anchor.png b/assets/cubyz/blocks/textures/bad_respawn_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..4e28181bfe1656f5da3a2b81109416d54616fbb0 GIT binary patch literal 344 zcmV-e0jK_nP)JjTMWbX0`T0Gd+i%YeQJG$2hN$v@EI zQ^kWfzd>p^pD)&!@2xtT7=60e97xijim|mkXta8^co~E@x&bF)&Yej^5E}nD3h<|T zk?+%xDB!f(TFP~^vlJf~1x!0NzkAuw2HoiAjskcoMIqyMGct2RNM8ye!~e1Y0>B7= zl^@0&ywMG`K?sD%$gI7uVY@!Q{i9$4Z&1(ac=H?Z03>)<(SY{P0FnetA(3XPbX4|t q00030|30=_i~s-t21!IgR09AlXt|LP@h~<30000 |kill| { - main.game.Player.kill(kill.spawnPoint); + main.game.Player.kill(kill.spawnPoint, kill.respawnEffeciency); }, .energy => |energy| { main.game.Player.super.energy = std.math.clamp(main.game.Player.super.energy + energy.energy, 0, main.game.Player.super.maxEnergy); @@ -483,6 +484,7 @@ pub const Command = struct { // MARK: Command return .{.kill = .{ .target = null, .spawnPoint = try reader.readVec(Vec3d), + .respawnEffeciency = try reader.readFloat(f32), }}; }, .energy => { @@ -518,6 +520,7 @@ pub const Command = struct { // MARK: Command }, .kill => |kill| { writer.writeVec(Vec3d, kill.spawnPoint); + writer.writeFloat(f32, kill.respawnEffeciency); }, .energy => |energy| { writer.writeFloat(f32, energy.energy); @@ -799,6 +802,7 @@ pub const Command = struct { // MARK: Command self.syncOperations.append(allocator, .{.kill = .{ .target = info.target.?, .spawnPoint = info.target.?.getSpawnPos(), + .respawnEffeciency = info.target.?.getRespawnEffeciency(), }}); } else { self.syncOperations.append(allocator, .{.health = .{ @@ -1794,6 +1798,7 @@ pub const Command = struct { // MARK: Command if (target == null) return error.serverFailure; target.?.spawnPos = @floatFromInt(self.position); + target.?.respawnEffeciency = self.respawnEffeciency; target.?.sendRawMessage("Set New SpawnPoint"); } } From f18f9ce3b77622404867d65cc2320e8d32694a81 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Mon, 3 Aug 2026 11:52:36 -0700 Subject: [PATCH 3/3] formatting --- src/game.zig | 2 +- src/server/server.zig | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game.zig b/src/game.zig index c1479f659e..a7ad70c68c 100644 --- a/src/game.zig +++ b/src/game.zig @@ -204,7 +204,7 @@ pub const Player = struct { // MARK: Player Player.super.pos = spawnPos; Player.super.vel = .{0, 0, 0}; - Player.super.health = std.math.clamp(Player.super.maxHealth * respawnEffeciency, 0, Player.super.maxHealth); + Player.super.health = std.math.clamp(Player.super.maxHealth*respawnEffeciency, 0, Player.super.maxHealth); Player.super.energy = Player.super.maxEnergy; Player.eye = .{}; diff --git a/src/server/server.zig b/src/server/server.zig index 9bdc064852..723a0fd100 100644 --- a/src/server/server.zig +++ b/src/server/server.zig @@ -549,7 +549,7 @@ pub const User = struct { // MARK: User if (user.spawnPos == null) user.spawnPos = @floatFromInt(main.server.world.?.spawn); const userSpawn = @as(Vec3i, @intFromFloat(user.spawnPos orelse defaultSpawn)); const targetBlock = main.game.getBlockWithSide(main.sync.Side.server, userSpawn[0], userSpawn[1], userSpawn[2]) orelse return defaultSpawn; - + if (targetBlock.blockEntity() == null) { user.sendRawMessage("Could Not Find Spawnpoint, Teleporting back to world spawn"); return defaultSpawn; @@ -564,7 +564,7 @@ pub const User = struct { // MARK: User if (user.spawnPos == null) user.spawnPos = @floatFromInt(main.server.world.?.spawn); const userSpawn = @as(Vec3i, @intFromFloat(user.spawnPos orelse defaultSpawn)); const targetBlock = main.game.getBlockWithSide(main.sync.Side.server, userSpawn[0], userSpawn[1], userSpawn[2]) orelse return defaultRespawnEffeciency; - + if (targetBlock.blockEntity() == null) return defaultRespawnEffeciency; if (!std.mem.eql(u8, targetBlock.blockEntity().?.id, "cubyz:respawn_anchor")) user.respawnEffeciency = defaultRespawnEffeciency; return user.respawnEffeciency orelse defaultRespawnEffeciency;