Skip to content

Commit c13d941

Browse files
authored
Add tool palette (#1494)
## Description This pull request adds a tool palette to allow using stable indexes for binary storage. ## Links Related to: #1290 Related to: #1478 Related to: #1473
1 parent 5a3a125 commit c13d941

File tree

5 files changed

+40
-14
lines changed

5 files changed

+40
-14
lines changed

src/assets.zig

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ pub const Palette = struct { // MARK: Palette
473473

474474
var loadedAssets: bool = false;
475475

476-
pub fn loadWorldAssets(assetFolder: []const u8, blockPalette: *Palette, itemPalette: *Palette, biomePalette: *Palette) !void { // MARK: loadWorldAssets()
476+
pub fn loadWorldAssets(assetFolder: []const u8, blockPalette: *Palette, itemPalette: *Palette, toolPalette: *Palette, biomePalette: *Palette) !void { // MARK: loadWorldAssets()
477477
if(loadedAssets) return; // The assets already got loaded by the server.
478478
loadedAssets = true;
479479

@@ -575,10 +575,17 @@ pub fn loadWorldAssets(assetFolder: []const u8, blockPalette: *Palette, itemPale
575575
try assignBlockItem(stringId);
576576
}
577577

578+
for(toolPalette.palette.items) |id| {
579+
registerTool(assetFolder, id, worldAssets.tools.get(id) orelse .null);
580+
}
581+
578582
// tools:
579583
iterator = worldAssets.tools.iterator();
580584
while(iterator.next()) |entry| {
581-
registerTool(assetFolder, entry.key_ptr.*, entry.value_ptr.*);
585+
const id = entry.key_ptr.*;
586+
if(items_zig.hasRegisteredTool(id)) continue;
587+
registerTool(assetFolder, id, entry.value_ptr.*);
588+
toolPalette.add(id);
582589
}
583590

584591
// block drops:

src/game.zig

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ pub const World = struct { // MARK: World
655655
connected: bool = true,
656656
blockPalette: *assets.Palette = undefined,
657657
itemPalette: *assets.Palette = undefined,
658+
toolPalette: *assets.Palette = undefined,
658659
biomePalette: *assets.Palette = undefined,
659660
itemDrops: ClientItemDropManager = undefined,
660661
playerBiome: Atomic(*const main.server.terrain.biomes.Biome) = undefined,
@@ -692,6 +693,7 @@ pub const World = struct { // MARK: World
692693
self.itemDrops.deinit();
693694
self.blockPalette.deinit();
694695
self.itemPalette.deinit();
696+
self.toolPalette.deinit();
695697
self.biomePalette.deinit();
696698
self.manager.deinit();
697699
main.server.stop();
@@ -713,9 +715,11 @@ pub const World = struct { // MARK: World
713715
errdefer self.biomePalette.deinit();
714716
self.itemPalette = try assets.Palette.init(main.globalAllocator, zon.getChild("itemPalette"), null);
715717
errdefer self.itemPalette.deinit();
718+
self.toolPalette = try assets.Palette.init(main.globalAllocator, zon.getChild("toolPalette"), null);
719+
errdefer self.toolPalette.deinit();
716720
self.spawn = zon.get(Vec3f, "spawn", .{0, 0, 0});
717721

718-
try assets.loadWorldAssets("serverAssets", self.blockPalette, self.itemPalette, self.biomePalette);
722+
try assets.loadWorldAssets("serverAssets", self.blockPalette, self.itemPalette, self.toolPalette, self.biomePalette);
719723
Player.id = zon.get(u32, "player_id", std.math.maxInt(u32));
720724
Player.inventory = Inventory.init(main.globalAllocator, 32, .normal, .{.playerInventory = Player.id});
721725
Player.loadFrom(zon.getChild("player"));

src/items.zig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,10 @@ pub fn hasRegistered(id: []const u8) bool {
828828
return reverseIndices.contains(id);
829829
}
830830

831+
pub fn hasRegisteredTool(id: []const u8) bool {
832+
return toolTypes.contains(id);
833+
}
834+
831835
pub fn toolTypeIterator() std.StringHashMap(ToolType).ValueIterator {
832836
return toolTypes.valueIterator();
833837
}

src/network.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,7 @@ pub const Protocols = struct {
686686
zonObject.put("spawn", main.server.world.?.spawn);
687687
zonObject.put("blockPalette", main.server.world.?.blockPalette.storeToZon(main.stackAllocator));
688688
zonObject.put("itemPalette", main.server.world.?.itemPalette.storeToZon(main.stackAllocator));
689+
zonObject.put("toolPalette", main.server.world.?.toolPalette.storeToZon(main.stackAllocator));
689690
zonObject.put("biomePalette", main.server.world.?.biomePalette.storeToZon(main.stackAllocator));
690691

691692
const outData = zonObject.toStringEfficient(main.stackAllocator, &[1]u8{stepServerData});

src/server/world.zig

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const Vec3i = vec.Vec3i;
1616
const Vec3d = vec.Vec3d;
1717
const Vec3f = vec.Vec3f;
1818
const terrain = server.terrain;
19+
const NeverFailingAllocator = main.heap.NeverFailingAllocator;
1920

2021
const server = @import("server.zig");
2122
const User = server.User;
@@ -419,6 +420,7 @@ pub const ServerWorld = struct { // MARK: ServerWorld
419420
itemDropManager: ItemDropManager = undefined,
420421
blockPalette: *main.assets.Palette = undefined,
421422
itemPalette: *main.assets.Palette = undefined,
423+
toolPalette: *main.assets.Palette = undefined,
422424
biomePalette: *main.assets.Palette = undefined,
423425
chunkManager: ChunkManager = undefined,
424426

@@ -515,29 +517,27 @@ pub const ServerWorld = struct { // MARK: ServerWorld
515517
self.wio = WorldIO.init(try files.openDir(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}", .{path})), self);
516518
errdefer self.wio.deinit();
517519

518-
const blockPaletteZon = files.readToZon(arenaAllocator, try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/palette.zig.zon", .{path})) catch .null;
519-
self.blockPalette = try main.assets.Palette.init(main.globalAllocator, blockPaletteZon, "cubyz:air");
520+
self.blockPalette = try loadPalette(arenaAllocator, path, "palette", "cubyz:air");
520521
errdefer self.blockPalette.deinit();
521-
std.log.info("Loaded save block palette with {} blocks.", .{self.blockPalette.size()});
522522

523-
const itemPaletteZon = files.readToZon(arenaAllocator, try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/item_palette.zig.zon", .{path})) catch .null;
524-
self.itemPalette = try main.assets.Palette.init(main.globalAllocator, itemPaletteZon, null);
523+
self.itemPalette = try loadPalette(arenaAllocator, path, "item_palette", null);
525524
errdefer self.itemPalette.deinit();
526-
std.log.info("Loaded save item palette with {} items.", .{self.itemPalette.size()});
527525

528-
const biomePaletteZon = files.readToZon(arenaAllocator, try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/biome_palette.zig.zon", .{path})) catch .null;
529-
self.biomePalette = try main.assets.Palette.init(main.globalAllocator, biomePaletteZon, null);
526+
self.toolPalette = try loadPalette(arenaAllocator, path, "tool_palette", null);
527+
errdefer self.toolPalette.deinit();
528+
529+
self.biomePalette = try loadPalette(arenaAllocator, path, "biome_palette", null);
530530
errdefer self.biomePalette.deinit();
531-
std.log.info("Loaded save biome palette with {} biomes.", .{self.biomePalette.size()});
532531

533532
errdefer main.assets.unloadAssets();
534533

535534
self.seed = try self.wio.loadWorldSeed();
536-
try main.assets.loadWorldAssets(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/assets/", .{path}), self.blockPalette, self.itemPalette, self.biomePalette);
535+
try main.assets.loadWorldAssets(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/assets/", .{path}), self.blockPalette, self.itemPalette, self.toolPalette, self.biomePalette);
537536
// Store the block palette now that everything is loaded.
538537
try files.writeZon(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/palette.zig.zon", .{path}), self.blockPalette.storeToZon(arenaAllocator));
539-
try files.writeZon(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/biome_palette.zig.zon", .{path}), self.biomePalette.storeToZon(arenaAllocator));
540538
try files.writeZon(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/item_palette.zig.zon", .{path}), self.itemPalette.storeToZon(arenaAllocator));
539+
try files.writeZon(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/tool_palette.zig.zon", .{path}), self.toolPalette.storeToZon(arenaAllocator));
540+
try files.writeZon(try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/biome_palette.zig.zon", .{path}), self.biomePalette.storeToZon(arenaAllocator));
541541

542542
var gamerules = files.readToZon(arenaAllocator, try std.fmt.allocPrint(arenaAllocator.allocator, "saves/{s}/gamerules.zig.zon", .{path})) catch ZonElement.initObject(arenaAllocator);
543543

@@ -549,6 +549,15 @@ pub const ServerWorld = struct { // MARK: ServerWorld
549549
return self;
550550
}
551551

552+
pub fn loadPalette(allocator: NeverFailingAllocator, worldName: []const u8, paletteName: []const u8, firstEntry: ?[]const u8) !*Palette {
553+
const path = try std.fmt.allocPrint(main.stackAllocator.allocator, "saves/{s}/{s}.zig.zon", .{worldName, paletteName});
554+
defer main.stackAllocator.allocator.free(path);
555+
const paletteZon = files.readToZon(allocator, path) catch .null;
556+
const palette = try main.assets.Palette.init(main.globalAllocator, paletteZon, firstEntry);
557+
std.log.info("Loaded {s} with {} entries.", .{paletteName, palette.size()});
558+
return palette;
559+
}
560+
552561
pub fn deinit(self: *ServerWorld) void {
553562
self.forceSave() catch |err| {
554563
std.log.err("Error while saving the world: {s}", .{@errorName(err)});
@@ -567,6 +576,7 @@ pub const ServerWorld = struct { // MARK: ServerWorld
567576
self.itemDropManager.deinit();
568577
self.blockPalette.deinit();
569578
self.itemPalette.deinit();
579+
self.toolPalette.deinit();
570580
self.biomePalette.deinit();
571581
self.wio.deinit();
572582
main.globalAllocator.free(self.path);

0 commit comments

Comments
 (0)