@@ -16,6 +16,7 @@ const Vec3i = vec.Vec3i;
16
16
const Vec3d = vec .Vec3d ;
17
17
const Vec3f = vec .Vec3f ;
18
18
const terrain = server .terrain ;
19
+ const NeverFailingAllocator = main .heap .NeverFailingAllocator ;
19
20
20
21
const server = @import ("server.zig" );
21
22
const User = server .User ;
@@ -419,6 +420,7 @@ pub const ServerWorld = struct { // MARK: ServerWorld
419
420
itemDropManager : ItemDropManager = undefined ,
420
421
blockPalette : * main.assets.Palette = undefined ,
421
422
itemPalette : * main.assets.Palette = undefined ,
423
+ toolPalette : * main.assets.Palette = undefined ,
422
424
biomePalette : * main.assets.Palette = undefined ,
423
425
chunkManager : ChunkManager = undefined ,
424
426
@@ -515,29 +517,27 @@ pub const ServerWorld = struct { // MARK: ServerWorld
515
517
self .wio = WorldIO .init (try files .openDir (try std .fmt .allocPrint (arenaAllocator .allocator , "saves/{s}" , .{path })), self );
516
518
errdefer self .wio .deinit ();
517
519
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" );
520
521
errdefer self .blockPalette .deinit ();
521
- std .log .info ("Loaded save block palette with {} blocks." , .{self .blockPalette .size ()});
522
522
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 );
525
524
errdefer self .itemPalette .deinit ();
526
- std .log .info ("Loaded save item palette with {} items." , .{self .itemPalette .size ()});
527
525
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 );
530
530
errdefer self .biomePalette .deinit ();
531
- std .log .info ("Loaded save biome palette with {} biomes." , .{self .biomePalette .size ()});
532
531
533
532
errdefer main .assets .unloadAssets ();
534
533
535
534
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 );
537
536
// Store the block palette now that everything is loaded.
538
537
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 ));
540
538
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 ));
541
541
542
542
var gamerules = files .readToZon (arenaAllocator , try std .fmt .allocPrint (arenaAllocator .allocator , "saves/{s}/gamerules.zig.zon" , .{path })) catch ZonElement .initObject (arenaAllocator );
543
543
@@ -549,6 +549,15 @@ pub const ServerWorld = struct { // MARK: ServerWorld
549
549
return self ;
550
550
}
551
551
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
+
552
561
pub fn deinit (self : * ServerWorld ) void {
553
562
self .forceSave () catch | err | {
554
563
std .log .err ("Error while saving the world: {s}" , .{@errorName (err )});
@@ -567,6 +576,7 @@ pub const ServerWorld = struct { // MARK: ServerWorld
567
576
self .itemDropManager .deinit ();
568
577
self .blockPalette .deinit ();
569
578
self .itemPalette .deinit ();
579
+ self .toolPalette .deinit ();
570
580
self .biomePalette .deinit ();
571
581
self .wio .deinit ();
572
582
main .globalAllocator .free (self .path );
0 commit comments