From 71d1420749127a3abf2e1c519798babd8451c83c Mon Sep 17 00:00:00 2001 From: Prpr Date: Mon, 29 Jun 2026 15:50:12 -0600 Subject: [PATCH 1/7] add support for neoforge/fabric 1.21.1 --- versions/1.20.4-fabric/gradle.properties | 9 +++++ versions/1.21.1-fabric/gradle.properties | 9 +++++ versions/1.21.1-neoforge/gradle.properties | 9 +++++ .../clicksigns/blockstates/road_sign.json | 7 ++++ .../clicksigns/models/block/road_sign.json | 6 ++++ .../clicksigns/models/item/road_sign.json | 6 ++++ .../recipes/decorations/road_sign.json | 35 +++++++++++++++++++ .../loot_tables/blocks/road_sign.json | 20 +++++++++++ .../data/clicksigns/recipes/road_sign.json | 22 ++++++++++++ .../tags/blocks/mineable/pickaxe.json | 6 ++++ .../clicksigns/blockstates/road_sign.json | 7 ++++ .../clicksigns/models/block/road_sign.json | 6 ++++ .../clicksigns/models/item/road_sign.json | 6 ++++ .../recipes/decorations/road_sign.json | 35 +++++++++++++++++++ .../loot_tables/blocks/road_sign.json | 20 +++++++++++ .../data/clicksigns/recipes/road_sign.json | 22 ++++++++++++ .../tags/blocks/mineable/pickaxe.json | 6 ++++ 17 files changed, 231 insertions(+) create mode 100644 versions/1.20.4-fabric/gradle.properties create mode 100644 versions/1.21.1-fabric/gradle.properties create mode 100644 versions/1.21.1-neoforge/gradle.properties create mode 100644 versions/datagen/1.20.4/src/main/generated/assets/clicksigns/blockstates/road_sign.json create mode 100644 versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/block/road_sign.json create mode 100644 versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/item/road_sign.json create mode 100644 versions/datagen/1.20.4/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json create mode 100644 versions/datagen/1.20.4/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json create mode 100644 versions/datagen/1.20.4/src/main/generated/data/clicksigns/recipes/road_sign.json create mode 100644 versions/datagen/1.20.4/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json create mode 100644 versions/datagen/1.21.1/src/main/generated/assets/clicksigns/blockstates/road_sign.json create mode 100644 versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/block/road_sign.json create mode 100644 versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/item/road_sign.json create mode 100644 versions/datagen/1.21.1/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json create mode 100644 versions/datagen/1.21.1/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json create mode 100644 versions/datagen/1.21.1/src/main/generated/data/clicksigns/recipes/road_sign.json create mode 100644 versions/datagen/1.21.1/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json diff --git a/versions/1.20.4-fabric/gradle.properties b/versions/1.20.4-fabric/gradle.properties new file mode 100644 index 0000000..a742b1a --- /dev/null +++ b/versions/1.20.4-fabric/gradle.properties @@ -0,0 +1,9 @@ +# Mod Properties +mod.minecraft_version=1.20.4 +# Comma separated list of target versions +mod.publishing_target_minecraft_versions=1.20.4 + +# Dependencies +deps.fabric_loader=0.19.3 +deps.fabric_api=0.97.3+1.20.4 +deps.fabric_kotlin=1.13.10+kotlin.2.3.20 \ No newline at end of file diff --git a/versions/1.21.1-fabric/gradle.properties b/versions/1.21.1-fabric/gradle.properties new file mode 100644 index 0000000..142a058 --- /dev/null +++ b/versions/1.21.1-fabric/gradle.properties @@ -0,0 +1,9 @@ +# Mod Properties +mod.minecraft_version=1.21.1 +# Comma separated list of target versions +mod.publishing_target_minecraft_versions=1.21.1 + +# Dependencies +deps.fabric_loader=0.18.0 +deps.fabric_api=0.116.9+1.21.1 +deps.fabric_kotlin=1.13.10+kotlin.2.3.20 \ No newline at end of file diff --git a/versions/1.21.1-neoforge/gradle.properties b/versions/1.21.1-neoforge/gradle.properties new file mode 100644 index 0000000..0f63788 --- /dev/null +++ b/versions/1.21.1-neoforge/gradle.properties @@ -0,0 +1,9 @@ +# Mod Properties +mod.minecraft_version=1.21.1 +# Comma separated list of target versions +mod.publishing_target_minecraft_versions=1.21.1 + +# Dependencies +deps.neoforge=21.1.234 +# 5.3.0 >= 1.20.6 +deps.forge_kotlin=5.3.0 \ No newline at end of file diff --git a/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/blockstates/road_sign.json b/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/blockstates/road_sign.json new file mode 100644 index 0000000..b3f8806 --- /dev/null +++ b/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/blockstates/road_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "clicksigns:block/road_sign" + } + } +} \ No newline at end of file diff --git a/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/block/road_sign.json b/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/block/road_sign.json new file mode 100644 index 0000000..63c15f7 --- /dev/null +++ b/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/block/road_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "clicksigns:block/road_sign" + } +} \ No newline at end of file diff --git a/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/item/road_sign.json b/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/item/road_sign.json new file mode 100644 index 0000000..4eea700 --- /dev/null +++ b/versions/datagen/1.20.4/src/main/generated/assets/clicksigns/models/item/road_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "clicksigns:item/road_sign" + } +} \ No newline at end of file diff --git a/versions/datagen/1.20.4/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json b/versions/datagen/1.20.4/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json new file mode 100644 index 0000000..bdb1727 --- /dev/null +++ b/versions/datagen/1.20.4/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_iron_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:iron_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "clicksigns:road_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_iron_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "clicksigns:road_sign" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/versions/datagen/1.20.4/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json b/versions/datagen/1.20.4/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json new file mode 100644 index 0000000..69b639e --- /dev/null +++ b/versions/datagen/1.20.4/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "clicksigns:road_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/versions/datagen/1.20.4/src/main/generated/data/clicksigns/recipes/road_sign.json b/versions/datagen/1.20.4/src/main/generated/data/clicksigns/recipes/road_sign.json new file mode 100644 index 0000000..163eaba --- /dev/null +++ b/versions/datagen/1.20.4/src/main/generated/data/clicksigns/recipes/road_sign.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "minecraft:iron_ingot" + }, + "*": { + "tag": "minecraft:signs" + } + }, + "pattern": [ + "###", + "#*#", + "###" + ], + "result": { + "count": 4, + "item": "clicksigns:road_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/versions/datagen/1.20.4/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json b/versions/datagen/1.20.4/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 0000000..902b1cf --- /dev/null +++ b/versions/datagen/1.20.4/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "clicksigns:road_sign" + ] +} \ No newline at end of file diff --git a/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/blockstates/road_sign.json b/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/blockstates/road_sign.json new file mode 100644 index 0000000..b3f8806 --- /dev/null +++ b/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/blockstates/road_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "clicksigns:block/road_sign" + } + } +} \ No newline at end of file diff --git a/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/block/road_sign.json b/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/block/road_sign.json new file mode 100644 index 0000000..63c15f7 --- /dev/null +++ b/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/block/road_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "clicksigns:block/road_sign" + } +} \ No newline at end of file diff --git a/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/item/road_sign.json b/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/item/road_sign.json new file mode 100644 index 0000000..4eea700 --- /dev/null +++ b/versions/datagen/1.21.1/src/main/generated/assets/clicksigns/models/item/road_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "clicksigns:item/road_sign" + } +} \ No newline at end of file diff --git a/versions/datagen/1.21.1/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json b/versions/datagen/1.21.1/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json new file mode 100644 index 0000000..bdb1727 --- /dev/null +++ b/versions/datagen/1.21.1/src/main/generated/data/clicksigns/advancements/recipes/decorations/road_sign.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_iron_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:iron_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "clicksigns:road_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_iron_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "clicksigns:road_sign" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/versions/datagen/1.21.1/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json b/versions/datagen/1.21.1/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json new file mode 100644 index 0000000..69b639e --- /dev/null +++ b/versions/datagen/1.21.1/src/main/generated/data/clicksigns/loot_tables/blocks/road_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "clicksigns:road_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/versions/datagen/1.21.1/src/main/generated/data/clicksigns/recipes/road_sign.json b/versions/datagen/1.21.1/src/main/generated/data/clicksigns/recipes/road_sign.json new file mode 100644 index 0000000..163eaba --- /dev/null +++ b/versions/datagen/1.21.1/src/main/generated/data/clicksigns/recipes/road_sign.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "minecraft:iron_ingot" + }, + "*": { + "tag": "minecraft:signs" + } + }, + "pattern": [ + "###", + "#*#", + "###" + ], + "result": { + "count": 4, + "item": "clicksigns:road_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/versions/datagen/1.21.1/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json b/versions/datagen/1.21.1/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 0000000..902b1cf --- /dev/null +++ b/versions/datagen/1.21.1/src/main/generated/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "clicksigns:road_sign" + ] +} \ No newline at end of file From 04d7dbc5ebe5ee040573298d5b5cc45bf41be128 Mon Sep 17 00:00:00 2001 From: Prpr Date: Mon, 29 Jun 2026 15:54:09 -0600 Subject: [PATCH 2/7] ACTUALLY add support for neoforge/fabric 1.21.1 --- build.fabric.gradle.kts | 6 +- build.neoforge.gradle.kts | 13 ++-- settings.gradle.kts | 4 +- .../de/clickism/clicksigns/ClickSigns.java | 2 +- .../clickism/clicksigns/ClickSignsBlocks.java | 5 +- .../clicksigns/block/RoadSignBlock.java | 23 ++++++- .../entity/RoadSignBlockEntity.java | 41 ++++++++++-- .../clicksigns/gui/screen/BaseScreen.java | 10 ++- .../gui/util/VerticalScrollContainer.java | 3 +- .../gui/widget/AbstractTextBox.java | 16 ++++- .../network/RoadSignUpdatePacket.java | 40 +++++++++-- .../clicksigns/platform/Platform.java | 4 +- .../platform/fabric/FabricNetwork.java | 44 ++++++++++++- .../fabric/datagen/ModLootTableProvider.java | 17 ++++- .../fabric/datagen/ModRecipeProvider.java | 31 +++++++-- .../clicksigns/platform/network/Network.java | 33 ++++++++-- .../clicksigns/platform/network/Packet.java | 19 +++++- .../platform/network/PacketType.java | 18 ++++- .../clicksigns/render/TextureRenderer.java | 12 +++- .../de/clickism/clicksigns/sign/RoadSign.java | 29 ++++++-- .../clicksigns/sign/element/SignElement.java | 66 +++++++++++++++++-- .../sign/reload/SignReloadListener.java | 10 ++- .../sign/texture/source/TextureSource.java | 61 +++++++++++++++-- stonecutter.gradle.kts | 2 +- 24 files changed, 439 insertions(+), 70 deletions(-) diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts index 2c9fd43..3a376dd 100644 --- a/build.fabric.gradle.kts +++ b/build.fabric.gradle.kts @@ -27,9 +27,9 @@ sourceSets { } java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } base { diff --git a/build.neoforge.gradle.kts b/build.neoforge.gradle.kts index 128e333..93a2158 100644 --- a/build.neoforge.gradle.kts +++ b/build.neoforge.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("net.neoforged.moddev") version "2.0.137" + id("net.neoforged.moddev") version "2.0.141" id("java") } val modVersion = property("mod.version").toString() @@ -45,13 +45,18 @@ sourceSets { resources.srcDir( "${rootDir}/versions/datagen/${sc.current.version.substringBeforeLast("-")}/src/main/generated" ) + java { + val platform = "de/clickism/clicksigns/platform" + exclude("$platform/fabric/**") + exclude("$platform/forge/**") + } } } java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } base { diff --git a/settings.gradle.kts b/settings.gradle.kts index 9b25324..bfda808 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,6 +22,8 @@ stonecutter { } } version("1.20.1", "fabric", "forge") - vcsVersion = "1.20.1-fabric" + version("1.20.4", "fabric") + version("1.21.1", "fabric", "neoforge") + vcsVersion = "1.21.1-fabric" } } \ No newline at end of file diff --git a/src/main/java/de/clickism/clicksigns/ClickSigns.java b/src/main/java/de/clickism/clicksigns/ClickSigns.java index 3ce6d73..bb37236 100644 --- a/src/main/java/de/clickism/clicksigns/ClickSigns.java +++ b/src/main/java/de/clickism/clicksigns/ClickSigns.java @@ -31,7 +31,7 @@ public class ClickSigns { public static void initialize() { ClickSignsBlocks.initialize(); ClickSignsBlockEntityTypes.initialize(); - PacketRegistry.register(RoadSignUpdatePacket.TYPE); + PacketRegistry.register(RoadSignUpdatePacket.SUBTYPE); Platform.network().register(); // Register network // Add reload listener Platform.get().addReloadListener(new TileSetListener()); diff --git a/src/main/java/de/clickism/clicksigns/ClickSignsBlocks.java b/src/main/java/de/clickism/clicksigns/ClickSignsBlocks.java index ca35a71..73d85be 100644 --- a/src/main/java/de/clickism/clicksigns/ClickSignsBlocks.java +++ b/src/main/java/de/clickism/clicksigns/ClickSignsBlocks.java @@ -18,7 +18,10 @@ public class ClickSignsBlocks { */ public static final Supplier ROAD_SIGN = Platform.get().registerBlockWithItem( "road_sign", - BlockBehaviour.Properties.copy(Blocks.STONE), + //?if < 1.20.4 + /*BlockBehaviour.Properties.copy(Blocks.STONE),*/ + //? if >= 1.20.4 + BlockBehaviour.Properties.ofFullCopy(Blocks.STONE), RoadSignBlock::new ); diff --git a/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java b/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java index 415ebbc..3c3295e 100644 --- a/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java +++ b/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java @@ -1,5 +1,6 @@ package de.clickism.clicksigns.block; +import com.mojang.serialization.MapCodec; import de.clickism.clicksigns.entity.RoadSignBlockEntity; import de.clickism.clicksigns.gui.GuiUtils; import de.clickism.clicksigns.gui.screen.overview.SignOverviewScreen; @@ -9,8 +10,10 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; @@ -27,6 +30,8 @@ public class RoadSignBlock extends HorizontalFacingBlockWithEntity { // Shapes for each facing direction + //? if >= 1.20.4 + public static final MapCodec CODEC = simpleCodec(RoadSignBlock::new); private static final double THICKNESS = 0.03; private static final VoxelShape NORTH_SHAPE = Shapes.box(0, 0, 0, 1, 1, THICKNESS); private static final VoxelShape SOUTH_SHAPE = NORTH_SHAPE.move(0, 0, 1 - THICKNESS); @@ -37,6 +42,12 @@ public RoadSignBlock(Properties properties) { super(properties); } + //? if >= 1.20.4 { + @Override + protected MapCodec codec() { + return null; + }//? } + @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new RoadSignBlockEntity(pos, state); @@ -62,12 +73,17 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { } @Override - public @NotNull InteractionResult use( + //? if < 1.21.1 + /*public*/ + //? if >= 1.21.1 + protected + @NotNull InteractionResult /*? if < 1.21.1 {*/ /*use*/ /*?} elif >= 1.21.1 {*/ useWithoutItem /*?}*/( @NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull Player player, - @NotNull InteractionHand hand, + //? if < 1.21.1 + /*@NotNull InteractionHand hand,*/ @NotNull BlockHitResult hit ) { if (!level.isClientSide) return InteractionResult.SUCCESS; @@ -101,4 +117,7 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { public @NotNull RenderShape getRenderShape(@NotNull BlockState state) { return RenderShape.INVISIBLE; } + //? if >= 1.21.1 { + + //? } } \ No newline at end of file diff --git a/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java b/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java index 376d815..2c1bc51 100644 --- a/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java +++ b/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java @@ -5,6 +5,7 @@ import de.clickism.clicksigns.sign.RoadSign; import de.clickism.clicksigns.util.nbt.NbtReaderWriterImpl; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -62,22 +63,39 @@ public void setChanged() { return ClientboundBlockEntityDataPacket.create(this); } + //Inverse comma syntax is pain @Override - public @NotNull CompoundTag getUpdateTag() { + public @NotNull CompoundTag getUpdateTag( + //? if >= 1.21.1 + HolderLookup.Provider provider + ) { var tag = new CompoundTag(); - this.saveAdditional(tag); + this.saveAdditional( + tag + //? if >= 1.21.1 + , provider + ); return tag; } @Override - protected void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional( + CompoundTag tag + //? if >= 1.21.1 + , HolderLookup.Provider provider + ) { + super.saveAdditional( + tag + //? if >= 1.21.1 + , provider + ); if (this.roadSign == null) return; var writer = new NbtReaderWriterImpl(tag); RoadSign.NBT_WRITER.write(writer, this.roadSign); } - @Override + //? if < 1.21.1 { + /*@Override public void load(CompoundTag tag) { super.load(tag); var reader = new NbtReaderWriterImpl(tag); @@ -87,4 +105,17 @@ public void load(CompoundTag tag) { ClickSigns.LOGGER.error("Failed to read road sign from block entity at {}", worldPosition, e); } } + *///? } + //? if >= 1.21.1 { + @Override + public void loadAdditional(CompoundTag tag, HolderLookup.Provider provider) { + super.loadAdditional(tag, provider); + var reader = new NbtReaderWriterImpl(tag); + try { + this.roadSign = RoadSign.NBT_READER.read(reader); + } catch (Exception e) { + ClickSigns.LOGGER.error("Failed to read road sign from block entity at {}", worldPosition, e); + } + } + //? } } diff --git a/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java b/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java index 8524e92..6b54bcb 100644 --- a/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java +++ b/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java @@ -55,11 +55,19 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTi super.render(graphics, mouseX, mouseY, partialTick); } - @Override + //? if < 1.20.4 + /*@Override*/ public void renderBackground(GuiGraphics graphics) { graphics.fillGradient(0, 0, this.width, this.height, -0x4FEFEFF0, -0x3FEFEFF0); } + //? if >= 1.20.4 { + @Override + public void renderBackground(GuiGraphics graphics, int i, int j, float f) { + renderBackground(graphics); + } + //? } + @Override public void onClose() { GuiUtils.openScreen(parent); diff --git a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java index 2ebdc93..525201e 100644 --- a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java +++ b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java @@ -107,7 +107,8 @@ private void renderScrollbar(GuiGraphics guiGraphics) { guiGraphics.fill(scrollbarX, scrollbarEndY, scrollbarEndX - 1, scrollbarEndY - 1, SCROLLBAR_SHADOW_COLOR); } - @Override + //? if < 1.20.4 + /*@Override*/ public boolean mouseScrolled(double d, double e, double f) { if (!this.visible) return false; this.scroll(this.scrollAmount - f * SCROLL_RATE); diff --git a/src/main/java/de/clickism/clicksigns/gui/widget/AbstractTextBox.java b/src/main/java/de/clickism/clicksigns/gui/widget/AbstractTextBox.java index ae4b76e..f676e31 100644 --- a/src/main/java/de/clickism/clicksigns/gui/widget/AbstractTextBox.java +++ b/src/main/java/de/clickism/clicksigns/gui/widget/AbstractTextBox.java @@ -1,6 +1,9 @@ package de.clickism.clicksigns.gui.widget; -import net.minecraft.SharedConstants; +//? if < 1.21.1 +/*import net.minecraft.SharedConstants;*/ +//? if >= 1.21.1 +import net.minecraft.util.StringUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -275,8 +278,12 @@ public boolean listening() { * @param input the input string to filter * @return the filtered string */ + protected String filterInput(String input) { - return SharedConstants.filterText(input); + //? if < 1.21.1 + /*return SharedConstants.filterText(input);*/ + //? if >= 1.21.1 + return StringUtil.filterText(input); } @Override @@ -354,7 +361,10 @@ protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, flo @Override public boolean charTyped(char c, int modifiers) { if (!listening()) return false; - if (!SharedConstants.isAllowedChatCharacter(c)) return false; + //? if < 1.21.1 + /*if (!SharedConstants.isAllowedChatCharacter(c)) return false;*/ + //? if >= 1.21.1 + if (!StringUtil.isAllowedChatCharacter(c)) return false; insertText(Character.toString(c)); return true; } diff --git a/src/main/java/de/clickism/clicksigns/network/RoadSignUpdatePacket.java b/src/main/java/de/clickism/clicksigns/network/RoadSignUpdatePacket.java index b0a3226..484225e 100644 --- a/src/main/java/de/clickism/clicksigns/network/RoadSignUpdatePacket.java +++ b/src/main/java/de/clickism/clicksigns/network/RoadSignUpdatePacket.java @@ -8,6 +8,13 @@ import de.clickism.clicksigns.sign.RoadSign; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +//? if >= 1.21.1 { +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.codec.StreamDecoder; +import net.minecraft.network.codec.StreamMemberEncoder; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +//? } /** * Packet for updating a road sign @@ -19,10 +26,10 @@ public record RoadSignUpdatePacket( BlockPos pos, RoadSign roadSign ) implements Packet { - - public static final PacketType TYPE = new PacketType<>( + public static final PacketType SUBTYPE = new PacketType<>( ClickSigns.identifier("road_sign_update"), - // Writer + //? if < 1.21.1 { + /*// Writer (buf, packet) -> { buf.writeBlockPos(packet.pos()); RoadSign.PACKET_WRITER.accept(buf, packet.roadSign()); @@ -32,7 +39,20 @@ public record RoadSignUpdatePacket( BlockPos pos = buf.readBlockPos(); RoadSign roadSign = RoadSign.PACKET_READER.apply(buf); return new RoadSignUpdatePacket(pos, roadSign); - }, + },*///? } + //? if >= 1.21.1 { + StreamCodec.of( + (buf, packet) -> { + buf.writeBlockPos(packet.pos()); + RoadSign.PACKET.encode(buf, packet.roadSign()); + }, + (buf) -> { + BlockPos pos = buf.readBlockPos(); + RoadSign roadSign = RoadSign.PACKET.decode(buf); + return new RoadSignUpdatePacket(pos, roadSign); + } + ), + //? } // Server Handler (packet, player) -> { var level = player.serverLevel(); @@ -54,8 +74,20 @@ public record RoadSignUpdatePacket( } ); + @Override + public PacketType subtype() { + return SUBTYPE; + } + //? if < 1.21.1 { + /*public static final PacketType TYPE = SUBTYPE; @Override public PacketType type() { return TYPE; } + *///? } elif >= 1.21.1 { + public static final Type TYPE = new CustomPacketPayload.Type(SUBTYPE.id()); + public Type type() { + return TYPE; + }; + //? } } diff --git a/src/main/java/de/clickism/clicksigns/platform/Platform.java b/src/main/java/de/clickism/clicksigns/platform/Platform.java index 85234ef..48b5bf6 100644 --- a/src/main/java/de/clickism/clicksigns/platform/Platform.java +++ b/src/main/java/de/clickism/clicksigns/platform/Platform.java @@ -29,7 +29,9 @@ static Platform get() { return de.clickism.clicksigns.platform.fabric.FabricPlatform.INSTANCE; //? } elif forge { /*return de.clickism.clicksigns.platform.forge.ForgePlatform.INSTANCE; - *///? } else { + *///? } elif neoforge { + /*return de.clickism.clicksigns.platform.neoforge.NeoForgePlatform.INSTANCE; + *///? } else { /*throw new UnsupportedOperationException("No platform implementation found"); *///? } } diff --git a/src/main/java/de/clickism/clicksigns/platform/fabric/FabricNetwork.java b/src/main/java/de/clickism/clicksigns/platform/fabric/FabricNetwork.java index d41a113..6d2aee3 100644 --- a/src/main/java/de/clickism/clicksigns/platform/fabric/FabricNetwork.java +++ b/src/main/java/de/clickism/clicksigns/platform/fabric/FabricNetwork.java @@ -4,6 +4,11 @@ import de.clickism.clicksigns.platform.network.Network; import de.clickism.clicksigns.platform.network.Packet; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +//? if >= 1.21.1 { +import de.clickism.clicksigns.network.RoadSignUpdatePacket; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +//? } import net.fabricmc.fabric.api.networking.v1.PlayerLookup; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.resources.ResourceLocation; @@ -24,10 +29,31 @@ public class FabricNetwork extends Network { private FabricNetwork() { // Singleton class } - @Override public void register() { + //? if >= 1.21.1 { + PayloadTypeRegistry.playS2C().register( + RoadSignUpdatePacket.TYPE, + RoadSignUpdatePacket.SUBTYPE.packet() + ); + PayloadTypeRegistry.playC2S().register( + RoadSignUpdatePacket.TYPE, + RoadSignUpdatePacket.SUBTYPE.packet() + ); ServerPlayNetworking.registerGlobalReceiver( + RoadSignUpdatePacket.TYPE, + (payload, context) -> { + handleServer(payload, context.server(), context.player()); + } + ); + ClientPlayNetworking.registerGlobalReceiver( + RoadSignUpdatePacket.TYPE, + (payload, context) -> { + handleClient(payload); + } + ); + //? } elif < 1.21.1 { + /*ServerPlayNetworking.registerGlobalReceiver( CHANNEL, (server, player, handler, buf, responseSender) -> { handleServer(readPacket(buf), server, player); @@ -39,16 +65,28 @@ public void register() { handleClient(readPacket(buf)); } ); + *///?} } @Override public void sendToServer(Packet packet) { - ClientPlayNetworking.send(CHANNEL, writePacket(packet)); + ClientPlayNetworking.send( + //? if < 1.21.1 + /*CHANNEL, writePacket(packet)*/ + //? if >= 1.21.1 + packet + ); } @Override public void sendToPlayer(ServerPlayer player, Packet packet) { - ServerPlayNetworking.send(player, CHANNEL, writePacket(packet)); + ServerPlayNetworking.send( + player, + //? if < 1.21.1 + /*CHANNEL, writePacket(packet)*/ + //? if >= 1.21.1 + packet + ); } @Override diff --git a/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModLootTableProvider.java b/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModLootTableProvider.java index 8f000aa..7e0e1a9 100644 --- a/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModLootTableProvider.java +++ b/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModLootTableProvider.java @@ -3,14 +3,25 @@ import de.clickism.clicksigns.ClickSignsBlocks; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider; - +//? if >= 1.21.1 { +import net.minecraft.core.HolderLookup; +import java.util.concurrent.CompletableFuture; +//? } /** * Loot table generator */ class ModLootTableProvider extends FabricBlockLootTableProvider { - public ModLootTableProvider(FabricDataOutput output) { - super(output); + public ModLootTableProvider( + FabricDataOutput output + //? if >= 1.21.1 + ,CompletableFuture registryLookup + ) { + super( + output + //? if >= 1.21.1 + ,registryLookup + ); } @Override diff --git a/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModRecipeProvider.java b/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModRecipeProvider.java index 08b8028..14af58e 100644 --- a/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModRecipeProvider.java +++ b/src/main/java/de/clickism/clicksigns/platform/fabric/datagen/ModRecipeProvider.java @@ -4,26 +4,45 @@ import de.clickism.clicksigns.ClickSignsBlocks; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; -import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; - +//? if < 1.20.4 +/*import net.minecraft.data.recipes.FinishedRecipe;*/ +//? if >= 1.20.4 +import net.minecraft.data.recipes.RecipeOutput; import java.util.function.Consumer; - +//? if >= 1.21.1 { +import java.util.concurrent.CompletableFuture; +import net.minecraft.core.HolderLookup; +//? } /** * Recipe generator for the mod. */ class ModRecipeProvider extends FabricRecipeProvider { - public ModRecipeProvider(FabricDataOutput output) { - super(output); + public ModRecipeProvider( + FabricDataOutput output + //? if >= 1.21.1 + ,CompletableFuture registriesFuture + ) { + super( + output + //? if >= 1.21.1 + ,registriesFuture + ); } + @Override - public void buildRecipes(Consumer exporter) { + public void buildRecipes( + //? if < 1.20.4 + /*Consumer exporter*/ + //? if >= 1.20.4 + RecipeOutput exporter + ) { // Generate road sign recipe ShapedRecipeBuilder .shaped(RecipeCategory.DECORATIONS, ClickSignsBlocks.ROAD_SIGN.get(), 4) diff --git a/src/main/java/de/clickism/clicksigns/platform/network/Network.java b/src/main/java/de/clickism/clicksigns/platform/network/Network.java index 17a1f82..3385e6e 100644 --- a/src/main/java/de/clickism/clicksigns/platform/network/Network.java +++ b/src/main/java/de/clickism/clicksigns/platform/network/Network.java @@ -1,5 +1,6 @@ package de.clickism.clicksigns.platform.network; +import de.clickism.clicksigns.ClickSigns; import io.netty.buffer.Unpooled; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.MinecraftServer; @@ -48,8 +49,14 @@ public abstract class Network { */ @SuppressWarnings("unchecked") protected void handleServer(T packet, MinecraftServer server, ServerPlayer player) { - var type = (PacketType) packet.type(); + var type = (PacketType) packet + //? if < 1.21.1 + /* .type();*/ + //? if >= 1.21.1 + .subtype(); + server.execute(() -> type.serverHandler().handle(packet, player)); + ClickSigns.LOGGER.info("Succeeded at handling server"); } /** @@ -60,8 +67,14 @@ protected void handleServer(T packet, MinecraftServer server, */ @SuppressWarnings("unchecked") protected static void handleClient(T packet) { - PacketType type = (PacketType) packet.type(); + + PacketType type = (PacketType) packet + //? if < 1.21.1 + /* .type(); */ + //? if >= 1.21.1 + .subtype(); type.clientHandler().handle(packet); + ClickSigns.LOGGER.info("Succeeded at handling client"); } /** @@ -75,10 +88,17 @@ protected static void handleClient(T packet) { protected static FriendlyByteBuf writePacket(T packet) { var buf = new FriendlyByteBuf(Unpooled.buffer()); // Write packet id - var type = (PacketType) packet.type(); + var type = (PacketType) packet + //? if < 1.21.1 + /*.type(); */ + //? if >= 1.21.1 + .subtype(); buf.writeResourceLocation(type.id()); // Write packet data - type.writer().accept(buf, packet); + //? if < 1.21.1 + /*type.writer().accept(buf, packet);*/ + //? if >= 1.21.1 + type.packet().encode(buf, packet); return buf; } @@ -96,6 +116,9 @@ protected static Packet readPacket(FriendlyByteBuf buf) { throw new IllegalStateException("Received packet with unknown id: " + id); } // Read packet data - return type.reader().apply(buf); + //? if < 1.21.1 + /*return type.reader().apply(buf);*/ + //? if >= 1.21.1 + return type.packet().decode(buf); } } diff --git a/src/main/java/de/clickism/clicksigns/platform/network/Packet.java b/src/main/java/de/clickism/clicksigns/platform/network/Packet.java index 61a1732..e0c0c82 100644 --- a/src/main/java/de/clickism/clicksigns/platform/network/Packet.java +++ b/src/main/java/de/clickism/clicksigns/platform/network/Packet.java @@ -1,13 +1,26 @@ package de.clickism.clicksigns.platform.network; +//? if >= 1.21.1 { +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.codec.StreamDecoder; +import net.minecraft.network.codec.StreamMemberEncoder; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +//? } /** * Packet interface representing a network packet. */ -public interface Packet { +public interface Packet /*?if >= 1.21.1 {*/ extends CustomPacketPayload /*?} */ { /** - * The packet type of this packet + * The packet type of this packet. + * Implemented this way to support the new CustomPacketPayload API * * @return the packet type of this packet */ - PacketType type(); + PacketType subtype(); + //? if < 1.21.1 { + /*PacketType type(); + *///? } elif >= 1.21.1 { + Type type(); + //?} } diff --git a/src/main/java/de/clickism/clicksigns/platform/network/PacketType.java b/src/main/java/de/clickism/clicksigns/platform/network/PacketType.java index 6739c68..840fcf4 100644 --- a/src/main/java/de/clickism/clicksigns/platform/network/PacketType.java +++ b/src/main/java/de/clickism/clicksigns/platform/network/PacketType.java @@ -1,6 +1,10 @@ package de.clickism.clicksigns.platform.network; import net.minecraft.network.FriendlyByteBuf; +//? if >= 1.21.1 { +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +//?} import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -8,16 +12,24 @@ * Represents a type of packet, containing the logic to encode, decode and handle the packet. * * @param id the unique id of the packet type - * @param writer the function to write the packet data to a buffer - * @param reader the function to read the packet data from a buffer +//? if < 1.21.1 +//* @param writer the function to write the packet data to a buffer +//? if < 1.21.1 +//* @param reader the function to read the packet data from a buffer +//? if >= 1.21.1 + * @param packet the codec to write/read the packet data to/from a buffer * @param serverHandler the function to handle the packet on the server side * @param clientHandler the function to handle the packet on the client side * @param the type of payload of the packet */ public record PacketType( ResourceLocation id, - FriendlyByteBuf.Writer writer, + //? if < 1.21.1 { + /*FriendlyByteBuf.Writer writer, FriendlyByteBuf.Reader reader, + *///? } + //? if >= 1.21.1 + StreamCodec packet, ServerHandler serverHandler, ClientHandler clientHandler ) { diff --git a/src/main/java/de/clickism/clicksigns/render/TextureRenderer.java b/src/main/java/de/clickism/clicksigns/render/TextureRenderer.java index 68a4241..7b3a4c2 100644 --- a/src/main/java/de/clickism/clicksigns/render/TextureRenderer.java +++ b/src/main/java/de/clickism/clicksigns/render/TextureRenderer.java @@ -111,12 +111,22 @@ private void quad(VertexConsumer buffer, PoseStack.Pose pose, float x1, float y1 */ private void vertex(VertexConsumer buffer, PoseStack.Pose pose, float x, float y, float u, float v, int color) { var isXAxis = renderDirection.getAxis() == Direction.Axis.X; - buffer.vertex(pose.pose(), x, y, 0) + //? if < 1.21.1 { + /*buffer.vertex(pose.pose(), x, y, 0) .color(color) .uv(u, v) .overlayCoords(OverlayTexture.NO_OVERLAY) .uv2(light) .normal(pose.normal(), isXAxis ? 1 : 0, 0, isXAxis ? 0 : 1) .endVertex(); + *///? } + //? if >= 1.21.1 { + buffer.addVertex(pose.pose(), x, y, 0) + .setColor(color) + .setUv(u, v) + .setOverlay(OverlayTexture.NO_OVERLAY) + .setLight(light) + .setNormal(pose, isXAxis ? 1 : 0, 0, isXAxis ? 0 : 1); + //? } } } diff --git a/src/main/java/de/clickism/clicksigns/sign/RoadSign.java b/src/main/java/de/clickism/clicksigns/sign/RoadSign.java index b497a6c..7faf2d5 100644 --- a/src/main/java/de/clickism/clicksigns/sign/RoadSign.java +++ b/src/main/java/de/clickism/clicksigns/sign/RoadSign.java @@ -12,6 +12,8 @@ import de.clickism.clicksigns.util.nbt.NbtReader; import de.clickism.clicksigns.util.nbt.NbtWriter; import net.minecraft.network.FriendlyByteBuf; +//? if >= 1.21.1 +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; @@ -202,8 +204,29 @@ public boolean isWithinBounds(SignElement element) { } /** - * Writer for packets + * Codec replaces read/write functions past 1.21.1 */ + //? if >= 1.21.1 { + public static final StreamCodec PACKET = StreamCodec.of( + (buf, sign) -> { + TextureSource.PACKET.encode(buf, sign.frontSource()); + TextureSource.PACKET.encode(buf, sign.backSource()); + buf.writeCollection(sign.elements(), SignElement.PACKET); + buf.writeInt(sign.alignment().ordinal()); + buf.writeNullable(sign.templateId(), FriendlyByteBuf::writeResourceLocation); + }, + (buf) -> { + var front = TextureSource.PACKET.decode(buf); + var back = TextureSource.PACKET.decode(buf); + var elements = buf.readList(SignElement.PACKET); + var alignment = Alignment.values()[buf.readInt()]; + var templateId = buf.readNullable(FriendlyByteBuf::readResourceLocation); + return new RoadSign(front, back, elements, alignment, templateId); + } + ); + //? } + //? if < 1.21.1 { + /* public static final FriendlyByteBuf.Writer PACKET_WRITER = (buf, sign) -> { TextureSource.PACKET_WRITER.accept(buf, sign.frontSource()); TextureSource.PACKET_WRITER.accept(buf, sign.backSource()); @@ -212,9 +235,6 @@ public boolean isWithinBounds(SignElement element) { buf.writeNullable(sign.templateId(), FriendlyByteBuf::writeResourceLocation); }; - /** - * Reader for packets - */ public static final FriendlyByteBuf.Reader PACKET_READER = (buf) -> { var front = TextureSource.PACKET_READER.apply(buf); var back = TextureSource.PACKET_READER.apply(buf); @@ -223,6 +243,7 @@ public boolean isWithinBounds(SignElement element) { var templateId = buf.readNullable(FriendlyByteBuf::readResourceLocation); return new RoadSign(front, back, elements, alignment, templateId); }; + *///? } /** * Writer for NBT diff --git a/src/main/java/de/clickism/clicksigns/sign/element/SignElement.java b/src/main/java/de/clickism/clicksigns/sign/element/SignElement.java index 94f2099..9d018fa 100644 --- a/src/main/java/de/clickism/clicksigns/sign/element/SignElement.java +++ b/src/main/java/de/clickism/clicksigns/sign/element/SignElement.java @@ -7,6 +7,8 @@ import de.clickism.clicksigns.util.nbt.NbtWriter; import de.clickism.clicksigns.util.nbt.TypeKeyed; import net.minecraft.network.FriendlyByteBuf; +//? if >= 1.21.1 +import net.minecraft.network.codec.StreamCodec; /** * An element that can be placed on a road sign. @@ -57,9 +59,62 @@ default int guiHeight(float guiScale) { */ SignElement withPosition(int localX, int localY); - /** - * Writer for packets - */ + //? if >= 1.21.1 { + StreamCodec PACKET = StreamCodec.of( + (buf, element) -> { + var type = element.typeKey(); + buf.writeUtf(type); + buf.writeInt(element.localX()); + buf.writeInt(element.localY()); + buf.writeInt(element.alignment().ordinal()); + if (element instanceof TextElement text) { + buf.writeFloat(text.scale()); + buf.writeUtf(text.color()); + var backgroundColor = text.backgroundColor() != null ? text.backgroundColor() : ""; + buf.writeUtf(backgroundColor); + buf.writeUtf(text.text()); + } else if (element instanceof SymbolElement symbol) { + buf.writeResourceLocation(symbol.symbol().identifier()); + TextureSource.PACKET.encode(buf, symbol.symbol().texture()); + } else if (element instanceof PlateElement plate) { + TextureSource.PACKET.encode(buf, plate.front()); + TextureSource.PACKET.encode(buf, plate.back()); + } + }, + (buf) -> { + var type = buf.readUtf(); + int localX = buf.readInt(); + int localY = buf.readInt(); + Alignment alignment = Alignment.values()[buf.readInt()]; + return switch (type) { + case TextElement.TYPE -> { + var scale = buf.readFloat(); + var color = buf.readUtf(); + var backgroundColor = buf.readUtf(); + if (backgroundColor.isEmpty()) { + backgroundColor = null; + } + var text = buf.readUtf(); + yield new TextElement(localX, localY, alignment, text, scale, color, backgroundColor); + } + case SymbolElement.TYPE -> { + var id = buf.readResourceLocation(); + var source = TextureSource.PACKET.decode(buf); + var symbol = SignRegistries.SYMBOLS.get(id).withTexture(source); + yield new SymbolElement(localX, localY, alignment, symbol); + } + case PlateElement.TYPE -> { + var front = TextureSource.PACKET.decode(buf); + var back = TextureSource.PACKET.decode(buf); + yield new PlateElement(localX, localY, alignment, front, back); + } + default -> throw new IllegalArgumentException("Unknown element type: " + type); + }; + } + ); + //? } + //? if < 1.21.1 { + /*//Writer for packets FriendlyByteBuf.Writer PACKET_WRITER = (buf, element) -> { var type = element.typeKey(); buf.writeUtf(type); @@ -81,9 +136,7 @@ default int guiHeight(float guiScale) { } }; - /** - * Reader for packets - */ + //Reader for packets FriendlyByteBuf.Reader PACKET_READER = (buf) -> { var type = buf.readUtf(); int localX = buf.readInt(); @@ -114,6 +167,7 @@ default int guiHeight(float guiScale) { default -> throw new IllegalArgumentException("Unknown element type: " + type); }; }; + *///? } /** * Nbt writer diff --git a/src/main/java/de/clickism/clicksigns/sign/reload/SignReloadListener.java b/src/main/java/de/clickism/clicksigns/sign/reload/SignReloadListener.java index 7b45eeb..ee6bb56 100644 --- a/src/main/java/de/clickism/clicksigns/sign/reload/SignReloadListener.java +++ b/src/main/java/de/clickism/clicksigns/sign/reload/SignReloadListener.java @@ -108,7 +108,10 @@ default String stripExtension(String path, String extension) { */ default ResourceLocation stripExtension(ResourceLocation location, String extension) { var path = stripExtension(location.getPath(), extension); - return new ResourceLocation(location.getNamespace(), path); + //? if < 1.21.1 + /*return new ResourceLocation(location.getNamespace(), path);*/ + //? if >= 1.21.1 + return ResourceLocation.fromNamespaceAndPath(location.getNamespace(), path); } /** @@ -124,7 +127,10 @@ default ResourceLocation replaceExtension(ResourceLocation location, String oldE if (path.endsWith(oldExtension)) { path = path.substring(0, path.length() - oldExtension.length()) + newExtension; } - return new ResourceLocation(location.getNamespace(), path); + //? if < 1.21.1 + /*return new ResourceLocation(location.getNamespace(), path);*/ + //? if >= 1.21.1 + return ResourceLocation.fromNamespaceAndPath(location.getNamespace(), path); } /** diff --git a/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java b/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java index 2d854c1..ad77507 100644 --- a/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java +++ b/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java @@ -8,6 +8,8 @@ import de.clickism.clicksigns.util.nbt.NbtWriter; import de.clickism.clicksigns.util.nbt.TypeKeyed; import net.minecraft.network.FriendlyByteBuf; +//? if >= 1.21.1 +import net.minecraft.network.codec.StreamCodec; /** * Represents a source for a texture, which can be resolved to obtain the actual texture. @@ -59,9 +61,55 @@ default TextureSource resizeToFit(PixelSized sized) { return resize(sized.width(), sized.height()); } - /** - * Writer for packets - */ + //? if >= 1.21.1 { + StreamCodec PACKET = StreamCodec.of( + (buf, texture) -> { + var type = texture.typeKey(); + buf.writeUtf(type); + if (texture instanceof TiledTextureSource tiled) { + // Tiled texture + buf.writeResourceLocation(tiled.tileSetId()); + buf.writeInt(tiled.width()); + buf.writeInt(tiled.height()); + } else if (texture instanceof StaticTextureSource staticTextureSource) { + // Static texture + buf.writeResourceLocation(staticTextureSource.location()); + } else if (texture instanceof ColorizedTextureSource colorized) { + // Colorized texture + buf.writeResourceLocation(colorized.baseTexture()); + buf.writeNullable(colorized.fromColor(), FriendlyByteBuf::writeUtf); + buf.writeUtf(colorized.toColor()); + } else { + throw new IllegalArgumentException("Unknown texture source type: " + texture.getClass()); + } + }, + (buf) -> { + var type = buf.readUtf(); + return switch (type) { + case TiledTextureSource.TYPE -> { + var tileSetId = buf.readResourceLocation(); + var pixelWidth = buf.readInt(); + var pixelHeight = buf.readInt(); + yield new TiledTextureSource(tileSetId, pixelWidth, pixelHeight); + } + case ColorizedTextureSource.TYPE -> { + var baseTexture = buf.readResourceLocation(); + var fromColor = buf.readNullable(FriendlyByteBuf::readUtf); + var toColor = buf.readUtf(); + yield new ColorizedTextureSource(baseTexture, fromColor, toColor); + } + case StaticTextureSource.TYPE -> { + var location = buf.readResourceLocation(); + yield new StaticTextureSource(location); + } + default -> throw new IllegalArgumentException("Unknown texture source type: " + type); + }; + } + ); + //? } + //? if < 1.21.1 { + /*// Writer for packets + FriendlyByteBuf.Writer PACKET_WRITER = (buf, texture) -> { var type = texture.typeKey(); buf.writeUtf(type); @@ -83,9 +131,9 @@ default TextureSource resizeToFit(PixelSized sized) { } }; - /** - * Reader for packets - */ + + //Reader for packets + FriendlyByteBuf.Reader PACKET_READER = (buf) -> { var type = buf.readUtf(); return switch (type) { @@ -108,6 +156,7 @@ default TextureSource resizeToFit(PixelSized sized) { default -> throw new IllegalArgumentException("Unknown texture source type: " + type); }; }; + *///? } /** * Writer for NBT diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index 2c483ba..c22be3a 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -1,7 +1,7 @@ plugins { id("dev.kikugie.stonecutter") } -stonecutter active "1.20.1-fabric" +stonecutter active "1.21.1-fabric" stonecutter parameters { constants.match( From 5aaf1ebf7cc38b5f875e616b82a47c634302fcc4 Mon Sep 17 00:00:00 2001 From: Prpr Date: Tue, 30 Jun 2026 04:24:24 -0600 Subject: [PATCH 3/7] Fix menus not being scrollable on 1.21.1 --- .../clicksigns/gui/util/VerticalScrollContainer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java index 525201e..6a8a67a 100644 --- a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java +++ b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java @@ -107,14 +107,14 @@ private void renderScrollbar(GuiGraphics guiGraphics) { guiGraphics.fill(scrollbarX, scrollbarEndY, scrollbarEndX - 1, scrollbarEndY - 1, SCROLLBAR_SHADOW_COLOR); } - //? if < 1.20.4 - /*@Override*/ - public boolean mouseScrolled(double d, double e, double f) { + @Override + public boolean mouseScrolled(double d, double e, double f/*? if >= 1.20.4 {*/, double g /*? }*/) { if (!this.visible) return false; this.scroll(this.scrollAmount - f * SCROLL_RATE); return true; } + /** * Set the scroll amount and clamp it. * From 1b83747300b5fb168d7a5dbe9a0924948fffb00d Mon Sep 17 00:00:00 2001 From: Prpr Date: Tue, 30 Jun 2026 04:55:57 -0600 Subject: [PATCH 4/7] Fix menus not being draggable on 1.21.1 --- .../clickism/clicksigns/gui/screen/BaseScreen.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java b/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java index 6b54bcb..7df077a 100644 --- a/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java +++ b/src/main/java/de/clickism/clicksigns/gui/screen/BaseScreen.java @@ -50,23 +50,19 @@ protected BaseScreen(Component title, @Nullable Screen parent) { @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { - this.renderBackground(graphics); + this.actualRenderBackground(graphics); hoveredWidget = GuiUtils.findFirstHoveredWidget(this, mouseX, mouseY); super.render(graphics, mouseX, mouseY, partialTick); } - //? if < 1.20.4 - /*@Override*/ - public void renderBackground(GuiGraphics graphics) { + public void actualRenderBackground(GuiGraphics graphics) { graphics.fillGradient(0, 0, this.width, this.height, -0x4FEFEFF0, -0x3FEFEFF0); } - //? if >= 1.20.4 { @Override - public void renderBackground(GuiGraphics graphics, int i, int j, float f) { - renderBackground(graphics); + public void renderBackground(GuiGraphics graphics /*? if >= 1.21.1 {*/, int i, int j, float f /*? }*/) { + actualRenderBackground(graphics); } - //? } @Override public void onClose() { From 278c3ee5e4eb207d1bed14c2577675ba9d881b3c Mon Sep 17 00:00:00 2001 From: Prpr Date: Wed, 1 Jul 2026 17:35:56 -0600 Subject: [PATCH 5/7] Fix scrolling in 1.21.1 --- .../clicksigns/gui/util/VerticalScrollContainer.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java index 6a8a67a..55d9dfa 100644 --- a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java +++ b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java @@ -1,5 +1,6 @@ package de.clickism.clicksigns.gui.util; +import de.clickism.clicksigns.ClickSigns; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -108,9 +109,15 @@ private void renderScrollbar(GuiGraphics guiGraphics) { } @Override - public boolean mouseScrolled(double d, double e, double f/*? if >= 1.20.4 {*/, double g /*? }*/) { + public boolean mouseScrolled( + double mouseX, + double mouseY, + //? if >= 1.20.1 + double horizontalAmount, + double verticalAmount) { + ClickSigns.LOGGER.info("layout attempted scroll via mouse"); if (!this.visible) return false; - this.scroll(this.scrollAmount - f * SCROLL_RATE); + this.scroll(this.scrollAmount - verticalAmount * SCROLL_RATE); return true; } From 09c35ffa8395ac15e631a74de44a5f995c927116 Mon Sep 17 00:00:00 2001 From: Prpr Date: Tue, 4 Aug 2026 18:14:20 -0600 Subject: [PATCH 6/7] i love conflicts --- build.fabric-modern.gradle.kts | 76 +++++++++ build.fabric.gradle.kts | 1 + gradle/wrapper/gradle-wrapper.properties | 5 + settings.gradle.kts | 10 +- .../clicksigns/block/RoadSignBlock.java | 11 +- .../entity/RoadSignBlockEntity.java | 52 ++++-- .../gui/util/VerticalScrollContainer.java | 2 +- .../platform/neoforge/NeoForgeEntrypoint.java | 42 +++++ .../platform/neoforge/NeoForgeNetwork.java | 72 +++++++++ .../platform/neoforge/NeoForgePlatform.java | 151 ++++++++++++++++++ versions/1.21.1-fabric/gradle.properties | 7 +- versions/1.21.1-neoforge/gradle.properties | 4 +- versions/26.1-fabric/gradle.properties | 9 ++ versions/26.1.1-fabric/gradle.properties | 9 ++ 14 files changed, 430 insertions(+), 21 deletions(-) create mode 100644 build.fabric-modern.gradle.kts create mode 100644 src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeEntrypoint.java create mode 100644 src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeNetwork.java create mode 100644 src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgePlatform.java create mode 100644 versions/26.1-fabric/gradle.properties create mode 100644 versions/26.1.1-fabric/gradle.properties diff --git a/build.fabric-modern.gradle.kts b/build.fabric-modern.gradle.kts new file mode 100644 index 0000000..2689ee3 --- /dev/null +++ b/build.fabric-modern.gradle.kts @@ -0,0 +1,76 @@ +plugins { + id("java") + id("net.fabricmc.fabric-loom") version "1.17-SNAPSHOT" +} +val modVersion = property("mod.version").toString() +val minecraftVersion = property("mod.minecraft_version").toString() +val loader = stonecutter.current.project.substringAfterLast('-') + +group = project.property("maven_group").toString() +version = "$modVersion+$minecraftVersion-$loader" + +repositories { + mavenCentral() +} + +sourceSets { + main { + resources.srcDir( + "${rootDir}/versions/datagen/${sc.current.version.substringBeforeLast("-")}/src/main/generated" + ) + java { + val platform = "de/clickism/clicksigns/platform" + exclude("$platform/forge/**") + exclude("$platform/neoforge/**") + } + } +} + +java { + + toolchain.languageVersion.set(JavaLanguageVersion.of(25)) + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 +} + +base { + archivesName.set(property("archives_base_name").toString()) +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraftVersion") + implementation("net.fabricmc:fabric-loader:${property("deps.fabric_loader")}") + implementation("net.fabricmc.fabric-api:fabric-api:${property("deps.fabric_api")}") +} + +tasks.processResources { + dependsOn(tasks.named("stonecutterGenerate")) + val properties = mapOf( + "mod_version" to modVersion, + "minecraft_version" to minecraftVersion, + "fabric_loader_version" to project.property("deps.fabric_loader") + ) + + filesMatching(listOf("fabric.mod.json")) { + expand(properties) + } + inputs.properties(properties) +} + +fabricApi { + configureDataGeneration { + val currentVersion = sc.current.version.substringBeforeLast("-") + outputDirectory = rootProject.file("versions/datagen/$currentVersion/src/main/generated") + client = true + } +} + +loom { + runConfigs.all { + ideConfigGenerated(true) + runDir = "../../runs/fabric" + if (environment == "client") { + programArgs("--username=ClickToPlay") + } + } +} \ No newline at end of file diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts index dc3b057..b0b8221 100644 --- a/build.fabric.gradle.kts +++ b/build.fabric.gradle.kts @@ -27,6 +27,7 @@ sourceSets { } java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1adfd2e..b3af811 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,12 @@ +#Wed Jul 01 17:46:24 CST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +<<<<<<< Updated upstream distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-all.zip networkTimeout=10000 validateDistributionUrl=true +======= +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip +>>>>>>> Stashed changes zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index bfda808..4f8e8f6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,12 +17,16 @@ stonecutter { create(rootProject) { fun version(version: String, vararg loaders: String) { loaders.forEach { - this.version("$version-$it", version) - .buildscript = "build.$it.gradle.kts" + if (stonecutter.eval(version, "<=1.21.1")) { + this.version("$version-$it", version) + .buildscript = "build.$it.gradle.kts" + } else { + this.version("$version-$it", version) + .buildscript = "build.$it-modern.gradle.kts" + } } } version("1.20.1", "fabric", "forge") - version("1.20.4", "fabric") version("1.21.1", "fabric", "neoforge") vcsVersion = "1.21.1-fabric" } diff --git a/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java b/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java index 3c3295e..71629fc 100644 --- a/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java +++ b/src/main/java/de/clickism/clicksigns/block/RoadSignBlock.java @@ -65,9 +65,11 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { @Override public @NotNull VoxelShape getOcclusionShape( - @NotNull BlockState state, - @NotNull BlockGetter level, + @NotNull BlockState state + //? if < 26.1 { + ,@NotNull BlockGetter level, @NotNull BlockPos pos + //?} ) { return Shapes.empty(); } @@ -86,7 +88,10 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { /*@NotNull InteractionHand hand,*/ @NotNull BlockHitResult hit ) { - if (!level.isClientSide) return InteractionResult.SUCCESS; + if (!level.isClientSide/*? if >= 26.1 {*/()/*?}*/) { + return InteractionResult.SUCCESS; + } + if (player.isShiftKeyDown()) return InteractionResult.PASS; var blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof RoadSignBlockEntity roadSignEntity) { diff --git a/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java b/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java index 2c1bc51..4070237 100644 --- a/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java +++ b/src/main/java/de/clickism/clicksigns/entity/RoadSignBlockEntity.java @@ -14,6 +14,13 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +//? if >= 26.1 { +/* +import net.minecraft.world.level.storage.ValueOutput; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.TagValueOutput; +import net.minecraft.world.level.storage.TagValueInput; +*///?} /** * Road sign block entity @@ -63,7 +70,23 @@ public void setChanged() { return ClientboundBlockEntityDataPacket.create(this); } - //Inverse comma syntax is pain + //? if < 26.1 { + @Override + protected void saveAdditional( + CompoundTag tag + //? if >= 1.21.1 + , HolderLookup.Provider provider + ) { + super.saveAdditional( + tag + //? if >= 1.21.1 + , provider + ); + if (this.roadSign == null) return; + var writer = new NbtReaderWriterImpl(tag); + RoadSign.NBT_WRITER.write(writer, this.roadSign); + } + @Override public @NotNull CompoundTag getUpdateTag( //? if >= 1.21.1 @@ -77,24 +100,35 @@ public void setChanged() { ); return tag; } - - @Override - protected void saveAdditional( - CompoundTag tag + //? } elif >= 26.1 { + /*@Override + public @NotNull CompoundTag getUpdateTag( //? if >= 1.21.1 - , HolderLookup.Provider provider + HolderLookup.Provider provider ) { - super.saveAdditional( + var tag = new CompoundTag(); + this.saveAdditional( tag //? if >= 1.21.1 , provider ); + return tag; + } + + @Override + protected void saveAdditional( + final ValueOutput output + ) { + super.saveAdditional( + output + ); if (this.roadSign == null) return; - var writer = new NbtReaderWriterImpl(tag); + var writer = new NbtReaderWriterImpl(output); RoadSign.NBT_WRITER.write(writer, this.roadSign); } + *///?} - //? if < 1.21.1 { + //? if < 1.21 { /*@Override public void load(CompoundTag tag) { super.load(tag); diff --git a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java index 55d9dfa..f10dcdd 100644 --- a/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java +++ b/src/main/java/de/clickism/clicksigns/gui/util/VerticalScrollContainer.java @@ -112,7 +112,7 @@ private void renderScrollbar(GuiGraphics guiGraphics) { public boolean mouseScrolled( double mouseX, double mouseY, - //? if >= 1.20.1 + //? if >= 1.21.1 double horizontalAmount, double verticalAmount) { ClickSigns.LOGGER.info("layout attempted scroll via mouse"); diff --git a/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeEntrypoint.java b/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeEntrypoint.java new file mode 100644 index 0000000..3d103b3 --- /dev/null +++ b/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeEntrypoint.java @@ -0,0 +1,42 @@ +package de.clickism.clicksigns.platform.neoforge; + +import de.clickism.clicksigns.ClickSigns; +import de.clickism.clicksigns.ClickSignsBlockEntityTypes; +import de.clickism.clicksigns.entity.RoadSignBlockEntityRenderer; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +import static net.neoforged.api.distmarker.Dist.CLIENT; + +@Mod(ClickSigns.MOD_ID) +@EventBusSubscriber(modid = ClickSigns.MOD_ID, value = CLIENT) +public class NeoForgeEntrypoint { + public NeoForgeEntrypoint(IEventBus eventBus) { + ClickSigns.initialize(); + // Initialize forge platform with event bus + NeoForgePlatform.INSTANCE.initialize(eventBus); + } + + @SubscribeEvent + public static void onRegisterRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerBlockEntityRenderer(ClickSignsBlockEntityTypes.ROAD_SIGN.get(), RoadSignBlockEntityRenderer::new); + } + + @SubscribeEvent + public static void onClientSetup(FMLClientSetupEvent event) { + + } + + @SubscribeEvent + public static void register(final RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar("0"); + + NeoForgeNetwork.INSTANCE.register(registrar); + } +} diff --git a/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeNetwork.java b/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeNetwork.java new file mode 100644 index 0000000..9117f60 --- /dev/null +++ b/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgeNetwork.java @@ -0,0 +1,72 @@ +package de.clickism.clicksigns.platform.neoforge; + +import de.clickism.clicksigns.network.RoadSignUpdatePacket; +import de.clickism.clicksigns.platform.network.Network; +import de.clickism.clicksigns.platform.network.Packet; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.handling.DirectionalPayloadHandler; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +/** + * Forge implementation of the network system. + */ +public class NeoForgeNetwork extends Network { + /** + * The fabric network instance + */ + public static final NeoForgeNetwork INSTANCE = new NeoForgeNetwork(); + + private NeoForgeNetwork() { + // Singleton class + } + + @Override public void register() { + + } + + public void register(PayloadRegistrar registrar) { + registrar.playBidirectional( + RoadSignUpdatePacket.TYPE, + RoadSignUpdatePacket.SUBTYPE.packet(), + new DirectionalPayloadHandler<>( + (packet, context) -> { + handleClient(packet); + }, + (packet, context) -> { + handleServer( + packet, + context.player().getServer(), + context.player().getServer().getPlayerList().getPlayer(context.player().getUUID()) + ); + } + ) + ); + } + + @Override + public void sendToServer(Packet packet) { + PacketDistributor.sendToServer(packet); + } + + @Override + public void sendToPlayer(ServerPlayer player, Packet packet) { + PacketDistributor.sendToPlayer(player, packet); + } + + @Override + public void sendToAllInLevel(ServerLevel level, Packet packet) { + level.getServer().execute(() -> { + level.players().forEach(player -> sendToPlayer(player, packet)); + }); + } + + /** + * Wrapper for packets to be sent through the Forge networking API. + * For some reason, subclasses give an error, so we need to use a wrapper. + * + * @param packet The packet to be sent + */ + private record ForgePacket(Packet packet) {} +} diff --git a/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgePlatform.java b/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgePlatform.java new file mode 100644 index 0000000..de65fa9 --- /dev/null +++ b/src/main/java/de/clickism/clicksigns/platform/neoforge/NeoForgePlatform.java @@ -0,0 +1,151 @@ +package de.clickism.clicksigns.platform.neoforge; + +import de.clickism.clicksigns.ClickSigns; +import de.clickism.clicksigns.platform.Platform; +import de.clickism.clicksigns.platform.ReloadListener; +import de.clickism.clicksigns.platform.network.Network; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.packs.resources.ResourceManagerReloadListener; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.neoforged.neoforge.client.event.RegisterClientReloadListenersEvent; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +/** + * Forge platform implementation + */ +public class NeoForgePlatform implements Platform { + /** + * The fabric platform instance + */ + public static final NeoForgePlatform INSTANCE = new NeoForgePlatform(); + + private static final DeferredRegister ITEMS_REGISTRY = + DeferredRegister.create(BuiltInRegistries.ITEM, ClickSigns.MOD_ID); + + private static final DeferredRegister BLOCKS_REGISTRY = + DeferredRegister.create(BuiltInRegistries.BLOCK, ClickSigns.MOD_ID); + + private static final DeferredRegister> BLOCK_ENTITY_TYPE_REGISTRY = + DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, ClickSigns.MOD_ID); + + private final List tabEntries = new ArrayList<>(); + private final List reloadListeners = new ArrayList<>(); + + private NeoForgePlatform() { + // Singleton class + } + + /** + * Initializes the forge platform + * + * @param bus event bus + */ + public void initialize(IEventBus bus) { + ITEMS_REGISTRY.register(bus); + BLOCKS_REGISTRY.register(bus); + BLOCK_ENTITY_TYPE_REGISTRY.register(bus); + bus.register(this); // Register events + } + + @Override + public Network getNetwork() { + return NeoForgeNetwork.INSTANCE; + } + + @Override + public Supplier registerItem( + String name, + Item.Properties settings, + ItemFactory itemSupplier + ) { + var holder = ITEMS_REGISTRY.register(name, () -> itemSupplier.create(settings)); + return () -> holder.get(); + } + + @Override + public Supplier registerBlock( + String name, + BlockBehaviour.Properties settings, + BlockFactory blockSupplier + ) { + var holder = BLOCKS_REGISTRY.register(name, () -> blockSupplier.create(settings)); + return () -> holder.get(); + } + + @Override + public Supplier registerBlockWithItem( + String name, + BlockBehaviour.Properties settings, + BlockFactory blockSupplier + ) { + var block = registerBlock(name, settings, blockSupplier); + + ITEMS_REGISTRY.register(name, () -> + new BlockItem( + block.get(), + new Item.Properties() + ) + ); + + return block; + } + + @Override + public Supplier> registerBlockEntityType( + String name, + BlockEntityFactory factory, + Supplier block + ) { + return BLOCK_ENTITY_TYPE_REGISTRY.register( + name, + () -> BlockEntityType.Builder.of(factory::create, block.get()).build(null) + ); + } + + @Override + public void addItemToCreativeTab(ResourceKey tab, Supplier item) { + tabEntries.add(new TabEntry(tab, item)); + } + + @Override + public void addReloadListener(ReloadListener listener) { + reloadListeners.add(listener); + } + + @SubscribeEvent + public void onReload(RegisterClientReloadListenersEvent event) { + event.registerReloadListener((ResourceManagerReloadListener) manager -> { + reloadListeners.forEach(listener -> listener.onReload(manager)); + }); + } + + @SubscribeEvent + public void onBuildCreativeTabs(BuildCreativeModeTabContentsEvent event) { + var tab = event.getTabKey(); + tabEntries.stream() + .filter(entry -> entry.tab.equals(tab)) + .forEach(entry -> event.accept(entry.item.get())); + } + + /** + * A creative tab entry + * + * @param tab the creative tab + * @param item the item to add + */ + private record TabEntry(ResourceKey tab, Supplier item) {} +} \ No newline at end of file diff --git a/versions/1.21.1-fabric/gradle.properties b/versions/1.21.1-fabric/gradle.properties index 142a058..4b60bb1 100644 --- a/versions/1.21.1-fabric/gradle.properties +++ b/versions/1.21.1-fabric/gradle.properties @@ -1,9 +1,10 @@ # Mod Properties -mod.minecraft_version=1.21.1 +mod.minecraft_version=1.21 # Comma separated list of target versions -mod.publishing_target_minecraft_versions=1.21.1 +mod.publishing_target_minecraft_versions=1.21,1.21.1 # Dependencies deps.fabric_loader=0.18.0 -deps.fabric_api=0.116.9+1.21.1 +# Compile for 1.21 since 1.21 and 1.21.1 are virtually compatible with eachother +deps.fabric_api=0.102.0+1.21 deps.fabric_kotlin=1.13.10+kotlin.2.3.20 \ No newline at end of file diff --git a/versions/1.21.1-neoforge/gradle.properties b/versions/1.21.1-neoforge/gradle.properties index 0f63788..2a4acb1 100644 --- a/versions/1.21.1-neoforge/gradle.properties +++ b/versions/1.21.1-neoforge/gradle.properties @@ -1,7 +1,7 @@ # Mod Properties -mod.minecraft_version=1.21.1 +mod.minecraft_version=1.21 # Comma separated list of target versions -mod.publishing_target_minecraft_versions=1.21.1 +mod.publishing_target_minecraft_versions=1.21,1.21.1 # Dependencies deps.neoforge=21.1.234 diff --git a/versions/26.1-fabric/gradle.properties b/versions/26.1-fabric/gradle.properties new file mode 100644 index 0000000..0d2021b --- /dev/null +++ b/versions/26.1-fabric/gradle.properties @@ -0,0 +1,9 @@ +# Mod Properties +mod.minecraft_version=26.1 +# Comma separated list of target versions +mod.publishing_target_minecraft_versions=26.1 + +# Dependencies +deps.fabric_loader=0.19.3 +deps.fabric_api=0.145.1+26.1 +deps.fabric_kotlin=1.13.10+kotlin.2.3.20 \ No newline at end of file diff --git a/versions/26.1.1-fabric/gradle.properties b/versions/26.1.1-fabric/gradle.properties new file mode 100644 index 0000000..c9a56c0 --- /dev/null +++ b/versions/26.1.1-fabric/gradle.properties @@ -0,0 +1,9 @@ +# Mod Properties +mod.minecraft_version=26.1.1 +# Comma separated list of target versions +mod.publishing_target_minecraft_versions=26.1.1,26.1.2 + +# Dependencies +deps.fabric_loader=0.19.3 +deps.fabric_api=0.145.4+26.1.1 +deps.fabric_kotlin=1.13.10+kotlin.2.3.20 \ No newline at end of file From 315e05b001c07b2a7f1e2e6cde16891fcc734c72 Mon Sep 17 00:00:00 2001 From: Prpr Date: Tue, 4 Aug 2026 18:35:12 -0600 Subject: [PATCH 7/7] templates --- .../sign/texture/source/TextureSource.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java b/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java index ad77507..6a88951 100644 --- a/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java +++ b/src/main/java/de/clickism/clicksigns/sign/texture/source/TextureSource.java @@ -1,6 +1,7 @@ package de.clickism.clicksigns.sign.texture.source; import de.clickism.clicksigns.ClickSigns; +import de.clickism.clicksigns.registry.SignRegistries; import de.clickism.clicksigns.sign.ColorResolver; import de.clickism.clicksigns.sign.texture.Texture; import de.clickism.clicksigns.util.PixelSized; @@ -8,6 +9,7 @@ import de.clickism.clicksigns.util.nbt.NbtWriter; import de.clickism.clicksigns.util.nbt.TypeKeyed; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; //? if >= 1.21.1 import net.minecraft.network.codec.StreamCodec; @@ -61,6 +63,42 @@ default TextureSource resizeToFit(PixelSized sized) { return resize(sized.width(), sized.height()); } + /** + * Parses the given texture identifier as tileset or static texture. + *

+ * Only support static or tiled textures for templates! + * + * @param location the texture identifier to parse + * @param width the width of the texture in pixels + * @param height the height of the texture in pixels + * @return texture source + */ + static TextureSource parse(ResourceLocation location, int width, int height) { + if (SignRegistries.TILE_SETS.has(location)) { + return new TiledTextureSource(location, width, height); + } + return new StaticTextureSource(location); + } + + /** + * Gets the texture location of the given texture source. + *

+ * Only support static or tiled textures for templates! + * + * @param source the texture source to get the location of + * @return the texture location of the source + */ + static ResourceLocation textureLocationOf(TextureSource source) { + if (source instanceof StaticTextureSource staticSource) { + return staticSource.location(); + } + if (source instanceof TiledTextureSource tiledSource) { + return tiledSource.tileSetId(); + } + throw new IllegalArgumentException("Unsupported texture source type: " + source.getClass().getName()); + } + + //? if >= 1.21.1 { StreamCodec PACKET = StreamCodec.of( (buf, texture) -> { @@ -209,4 +247,4 @@ default TextureSource resizeToFit(PixelSized sized) { default -> throw new IllegalArgumentException("Unknown texture source type: " + type); }; }; -} +} \ No newline at end of file