diff --git a/src/main/java/net/Chipperfluff/chipi/ChipiMod.java b/src/main/java/net/Chipperfluff/chipi/ChipiMod.java index ed472b3..3c11c21 100644 --- a/src/main/java/net/Chipperfluff/chipi/ChipiMod.java +++ b/src/main/java/net/Chipperfluff/chipi/ChipiMod.java @@ -5,30 +5,78 @@ import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.GameRules; +import net.minecraft.structure.StructurePlacementData; +import net.minecraft.structure.StructureTemplate; import net.Chipperfluff.chipi.command.ChipperCommand; +import net.Chipperfluff.chipi.block.ModBlocks; +import net.Chipperfluff.chipi.item.ModItems; public class ChipiMod implements ModInitializer { + public static final String MOD_ID = "chipi"; + private static final Identifier CHIPI_DIM = new Identifier("chipi", "chipi_dimension"); + private static final Identifier SPAWN_STRUCTURE = + new Identifier("chipi", "spawn"); + @Override public void onInitialize() { ServerTickEvents.END_WORLD_TICK.register((ServerWorld world) -> { + if (!world.getRegistryKey().getValue().equals(CHIPI_DIM)) return; - if (!world.getRegistryKey().getValue().equals(CHIPI_DIM)) { - return; - } - + // 🌙 Lock time world.setTimeOfDay(18000); - world.getGameRules() .get(GameRules.DO_DAYLIGHT_CYCLE) .set(false, world.getServer()); + + // 🧠 persistent spawn state + SpawnPlacedState state = world.getPersistentStateManager() + .getOrCreate( + SpawnPlacedState::fromNbt, + SpawnPlacedState::new, + "chipi_spawn" + ); + + if (state.placed) return; + + var optional = world.getStructureTemplateManager() + .getTemplate(SPAWN_STRUCTURE); + + if (optional.isEmpty()) { + System.err.println("[CHIPI] spawn.nbt not found!"); + return; + } + + StructureTemplate template = optional.get(); + + BlockPos origin = new BlockPos(0, 80, 0); + + template.place( + world, + origin, + origin, + new StructurePlacementData(), + world.getRandom(), + 2 + ); + + world.setSpawnPos(origin.up(), 0.0f); + + state.placed = true; + state.markDirty(); + + System.out.println("[CHIPI] Spawn structure placed"); }); + ModBlocks.register(); + ModItems.register(); + CommandRegistrationCallback.EVENT.register( (dispatcher, registryAccess, environment) -> ChipperCommand.register(dispatcher) diff --git a/src/main/java/net/Chipperfluff/chipi/SpawnPlacedState.java b/src/main/java/net/Chipperfluff/chipi/SpawnPlacedState.java new file mode 100644 index 0000000..3e6c802 --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/SpawnPlacedState.java @@ -0,0 +1,21 @@ +package net.Chipperfluff.chipi; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.world.PersistentState; + +public class SpawnPlacedState extends PersistentState { + + public boolean placed = false; + + public static SpawnPlacedState fromNbt(NbtCompound nbt) { + SpawnPlacedState state = new SpawnPlacedState(); + state.placed = nbt.getBoolean("placed"); + return state; + } + + @Override + public NbtCompound writeNbt(NbtCompound nbt) { + nbt.putBoolean("placed", placed); + return nbt; + } +} diff --git a/src/main/java/net/Chipperfluff/chipi/block/ModBlocks.java b/src/main/java/net/Chipperfluff/chipi/block/ModBlocks.java new file mode 100644 index 0000000..16c88ee --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/block/ModBlocks.java @@ -0,0 +1,28 @@ +package net.Chipperfluff.chipi.block; + +import net.minecraft.block.Block; +import net.minecraft.block.AbstractBlock; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; +import net.Chipperfluff.chipi.ChipiMod; + +public class ModBlocks { + + public static final Block VOID_BLOCK = register( + "void_block", + new Block(AbstractBlock.Settings.create() + .strength(1.5f, 6.0f) + ) + ); + + private static Block register(String name, Block block) { + return Registry.register( + Registries.BLOCK, + new Identifier(ChipiMod.MOD_ID, name), + block + ); + } + + public static void register() {} +} diff --git a/src/main/java/net/Chipperfluff/chipi/item/ModItems.java b/src/main/java/net/Chipperfluff/chipi/item/ModItems.java new file mode 100644 index 0000000..864047f --- /dev/null +++ b/src/main/java/net/Chipperfluff/chipi/item/ModItems.java @@ -0,0 +1,27 @@ +package net.Chipperfluff.chipi.item; + +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; +import net.Chipperfluff.chipi.ChipiMod; +import net.Chipperfluff.chipi.block.ModBlocks; + +public class ModItems { + + public static final Item VOID_BLOCK = register( + "void_block", + new BlockItem(ModBlocks.VOID_BLOCK, new Item.Settings()) + ); + + private static Item register(String name, Item item) { + return Registry.register( + Registries.ITEM, + new Identifier(ChipiMod.MOD_ID, name), + item + ); + } + + public static void register() {} +} diff --git a/src/main/resources/assets/chipi/blockstates/void_block.json b/src/main/resources/assets/chipi/blockstates/void_block.json new file mode 100644 index 0000000..4b9d15f --- /dev/null +++ b/src/main/resources/assets/chipi/blockstates/void_block.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "chipi:block/void_block" } + } +} diff --git a/src/main/resources/assets/chipi/models/block/void_block.json b/src/main/resources/assets/chipi/models/block/void_block.json new file mode 100644 index 0000000..f4e3df6 --- /dev/null +++ b/src/main/resources/assets/chipi/models/block/void_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "chipi:block/void_block" + } +} diff --git a/src/main/resources/assets/chipi/models/item/void_block.json b/src/main/resources/assets/chipi/models/item/void_block.json new file mode 100644 index 0000000..bd3c4aa --- /dev/null +++ b/src/main/resources/assets/chipi/models/item/void_block.json @@ -0,0 +1,3 @@ +{ + "parent": "chipi:block/void_block" +} diff --git a/src/main/resources/assets/chipi/textures/block/void_block.png b/src/main/resources/assets/chipi/textures/block/void_block.png new file mode 100644 index 0000000..63fcdde Binary files /dev/null and b/src/main/resources/assets/chipi/textures/block/void_block.png differ diff --git a/src/main/resources/assets/chipi/textures/item/void_block.png b/src/main/resources/assets/chipi/textures/item/void_block.png new file mode 100644 index 0000000..63fcdde Binary files /dev/null and b/src/main/resources/assets/chipi/textures/item/void_block.png differ diff --git a/src/main/resources/data/chipi/structures/spawn.nbt b/src/main/resources/data/chipi/structures/spawn.nbt new file mode 100644 index 0000000..36c1d84 Binary files /dev/null and b/src/main/resources/data/chipi/structures/spawn.nbt differ