#Saving my HdvManager nbt data

11 messages · Page 1 of 1 (latest)

plush drift
#

Hello i have a class


public class HdvManager extends PersistentState {

    public static final String KEY = PostmanMod.MOD_ID + "_hdv";
    private final MinecraftServer server;

    private final List<HdvTradeOffer> trades = new ArrayList<>();

    private HdvManager(MinecraftServer server) {
        this.server = server;
    }

    public static HdvManager get(MinecraftServer server) {
        var type = new PersistentState.Type<>(
                () -> new HdvManager(server),
                (nbt, registries) -> HdvManager.readNbt(server, nbt, registries),
                null
        );

        return server.getOverworld().getPersistentStateManager().getOrCreate(
                type,
                KEY
        );
    }

    public void addTrade(HdvTradeOffer hdvTradeOffer) {
        this.trades.add(hdvTradeOffer);
    }

    public HdvTradeOfferList getTrades() {
        return new HdvTradeOfferList(trades);
    }

    public void tick() {

    }

    @Override
    public NbtCompound writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registries) {
        NbtList trades = new NbtList();
        for (HdvTradeOffer entry : this.trades) {
            String key = String.valueOf(trades.indexOf(entry));
            trades.add(entry.serialize(new NbtCompound(), registries));
        }
        nbt.put("trades", trades);
        return nbt;
    }



    private static HdvManager readNbt(MinecraftServer server, NbtCompound nbt, RegistryWrapper.WrapperLookup registries) {
        var manager = new HdvManager(server);

        NbtList trades = nbt.getList("trades", NbtElement.COMPOUND_TYPE);
        for (int i = 0; i < trades.size(); i++) {
            var trade = trades.getCompound(i);
            manager.trades.add(HdvTradeOffer.deserialize(registries, trade));
        }

        return manager;
    }
}

How does i save nbtdata in the server ? i can read but how can i write ?

lone creek
plush drift
#

I have this in onInitialize

public void onInitialize() {
        ModItems.initialize();
        LOGGER.info("Hello Fabric world!");

        Registry.register(Registries.SCREEN_HANDLER, id("hdv"), HDV_SCREEN_HANDLER);

        ServerTickEvents.START_SERVER_TICK.register(server -> {
            HdvManager.get(server).tick();
        });

lone creek
#

That probably works

#

Whenever it's modified, call markDirty

plush drift
#

only for reading

#

where is markDirty ?

lone creek
#

HdvManager.get(server).markDirty()

plush drift
#

i can markDirty when the server is shutting down or when i apply a change in the persistent state ?

lone creek
#

Whenever you make a change

#

That way it'll be included in autosaves and emergency saves (like when it's crashing) too