From 4f333f7ec780ce990722870d08f2e278af2a9f44 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Tue, 23 Feb 2021 00:56:50 +0800 Subject: [PATCH] Add test mod and fix game rules on forge --- .../{mixin => hooks}/forge/TagHooksImpl.java | 2 +- .../mixin/forge/GameRulesAccessor.java | 46 +++++++++++++++++++ .../registry/forge/GameRuleFactoryImpl.java | 17 +++---- .../resources/META-INF/accesstransformer.cfg | 4 -- .../main/resources/architectury.mixins.json | 2 +- .../shedaniel/architectury/test/TestMod.java | 2 + .../architectury/test/tags/TestTags.java | 28 +++++++++++ .../tags/blocks/heart_particles2.json | 6 +++ 8 files changed, 93 insertions(+), 14 deletions(-) rename forge/src/main/java/me/shedaniel/architectury/{mixin => hooks}/forge/TagHooksImpl.java (97%) create mode 100644 forge/src/main/java/me/shedaniel/architectury/mixin/forge/GameRulesAccessor.java create mode 100644 testmod-common/src/main/java/me/shedaniel/architectury/test/tags/TestTags.java create mode 100644 testmod-common/src/main/resources/data/architectury-test/tags/blocks/heart_particles2.json diff --git a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/TagHooksImpl.java b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/TagHooksImpl.java similarity index 97% rename from forge/src/main/java/me/shedaniel/architectury/mixin/forge/TagHooksImpl.java rename to forge/src/main/java/me/shedaniel/architectury/hooks/forge/TagHooksImpl.java index 78da2d03..a1618276 100644 --- a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/TagHooksImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/TagHooksImpl.java @@ -17,7 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package me.shedaniel.architectury.mixin.forge; +package me.shedaniel.architectury.hooks.forge; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.Tag; diff --git a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/GameRulesAccessor.java b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/GameRulesAccessor.java new file mode 100644 index 00000000..30e6f6de --- /dev/null +++ b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/GameRulesAccessor.java @@ -0,0 +1,46 @@ +package me.shedaniel.architectury.mixin.forge; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.GameRules; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.function.BiConsumer; + +@Mixin(GameRules.class) +public interface GameRulesAccessor { + /** + * Spliting simple classes because mixin can't handle refmap using the same name + */ + @Mixin(GameRules.BooleanValue.class) + interface BooleanValue { + @Invoker("create") + static GameRules.Type invokeCreateArchitectury(boolean value, BiConsumer biConsumer) { + throw new AssertionError(); + } + } + + @Mixin(GameRules.BooleanValue.class) + interface BooleanValueSimple { + @Invoker("create") + static GameRules.Type invokeCreateArchitectury(boolean value) { + throw new AssertionError(); + } + } + + @Mixin(GameRules.IntegerValue.class) + interface IntegerValue { + @Invoker("create") + static GameRules.Type invokeCreateArchitectury(int value, BiConsumer biConsumer) { + throw new AssertionError(); + } + } + + @Mixin(GameRules.IntegerValue.class) + interface IntegerValueSimple { + @Invoker("create") + static GameRules.Type invokeCreateArchitectury(int value) { + throw new AssertionError(); + } + } +} diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/GameRuleFactoryImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/GameRuleFactoryImpl.java index c925bf5f..bec7c989 100644 --- a/forge/src/main/java/me/shedaniel/architectury/registry/forge/GameRuleFactoryImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/GameRuleFactoryImpl.java @@ -19,6 +19,7 @@ package me.shedaniel.architectury.registry.forge; +import me.shedaniel.architectury.mixin.forge.GameRulesAccessor; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.GameRules; @@ -26,20 +27,20 @@ import java.util.function.BiConsumer; public class GameRuleFactoryImpl { private GameRuleFactoryImpl() {} - + public static GameRules.Type createBooleanRule(boolean defaultValue) { - return GameRules.BooleanValue.create(defaultValue); + return GameRulesAccessor.BooleanValueSimple.invokeCreateArchitectury(defaultValue); } - + public static GameRules.Type createBooleanRule(boolean defaultValue, BiConsumer changedCallback) { - return GameRules.BooleanValue.create(defaultValue, changedCallback); + return GameRulesAccessor.BooleanValue.invokeCreateArchitectury(defaultValue, changedCallback); } - + public static GameRules.Type createIntRule(int defaultValue) { - return GameRules.IntegerValue.create(defaultValue); + return GameRulesAccessor.IntegerValueSimple.invokeCreateArchitectury(defaultValue); } - + public static GameRules.Type createIntRule(int defaultValue, BiConsumer changedCallback) { - return GameRules.IntegerValue.create(defaultValue, changedCallback); + return GameRulesAccessor.IntegerValue.invokeCreateArchitectury(defaultValue, changedCallback); } } diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg index 523978ec..b4afaea4 100644 --- a/forge/src/main/resources/META-INF/accesstransformer.cfg +++ b/forge/src/main/resources/META-INF/accesstransformer.cfg @@ -33,7 +33,3 @@ public-f net.minecraft.world.biome.BiomeAmbience field_242524_f # foliageColor public-f net.minecraft.world.biome.BiomeAmbience field_242525_g # grassColor public-f net.minecraft.world.biome.BiomeAmbience field_242526_h # grassColorModifier public net.minecraft.world.storage.FolderName (Ljava/lang/String;)V -public net.minecraft.world.GameRules$BooleanValue func_223567_b(ZLjava/util/function/BiConsumer;)Lnet/minecraft/world/GameRules$RuleType; # create -public net.minecraft.world.GameRules$BooleanValue func_223568_b(Z)Lnet/minecraft/world/GameRules$RuleType; # create -public net.minecraft.world.GameRules$IntegerValue func_223564_a(ILjava/util/function/BiConsumer;)Lnet/minecraft/world/GameRules$RuleType; # create -public net.minecraft.world.GameRules$IntegerValue func_223559_b(I)Lnet/minecraft/world/GameRules$RuleType; # create diff --git a/forge/src/main/resources/architectury.mixins.json b/forge/src/main/resources/architectury.mixins.json index af3e3799..383b59e3 100644 --- a/forge/src/main/resources/architectury.mixins.json +++ b/forge/src/main/resources/architectury.mixins.json @@ -8,7 +8,7 @@ ], "mixins": [ "BiomeGenerationSettingsBuilderAccessor", "MixinRegistryEntry", "MixinBlockEntity", "MixinBlockEntityExtension", - "MobSpawnSettingsBuilderAccessor" + "MobSpawnSettingsBuilderAccessor", "GameRulesAccessor", "GameRulesAccessor$BooleanValue", "GameRulesAccessor$BooleanValueSimple", "GameRulesAccessor$IntegerValue", "GameRulesAccessor$IntegerValueSimple" ], "injectors": { "defaultRequire": 1 diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java index 7a53cd3c..fe9fcce0 100644 --- a/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java @@ -27,6 +27,7 @@ import me.shedaniel.architectury.test.debug.client.ClientOverlayMessageSink; import me.shedaniel.architectury.test.gamerule.TestGameRules; import me.shedaniel.architectury.test.registry.TestRegistries; import me.shedaniel.architectury.test.registry.client.TestKeybinds; +import me.shedaniel.architectury.test.tags.TestTags; import me.shedaniel.architectury.utils.Env; import me.shedaniel.architectury.utils.EnvExecutor; @@ -38,6 +39,7 @@ public class TestMod { DebugEvents.initialize(); TestRegistries.initialize(); TestGameRules.init(); + TestTags.initialize(); if (Platform.getEnvironment() == Env.CLIENT) TestKeybinds.initialize(); } diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/tags/TestTags.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/tags/TestTags.java new file mode 100644 index 00000000..dbbd9b10 --- /dev/null +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/tags/TestTags.java @@ -0,0 +1,28 @@ +package me.shedaniel.architectury.test.tags; + +import me.shedaniel.architectury.event.events.BlockEvent; +import me.shedaniel.architectury.hooks.TagHooks; +import me.shedaniel.architectury.test.TestMod; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.Tag; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.level.block.Block; + +public class TestTags { + public static void initialize() { + // This will not be present, but it should return an empty tag + Tag.Named heartParticles = TagHooks.getBlockOptional(new ResourceLocation(TestMod.MOD_ID, "heart_particles")); + // This will act like a normal tag, we have emerald block here + Tag.Named heartParticles2 = TagHooks.getBlockOptional(new ResourceLocation(TestMod.MOD_ID, "heart_particles2")); + + BlockEvent.BREAK.register((world, pos, state, player, xp) -> { + if (player != null && !world.isClientSide() && (state.is(heartParticles) || state.is(heartParticles2))) { + ((ServerLevel) world).sendParticles(player, ParticleTypes.HEART, false, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.0, 0.0, 0.0, 0.0); + } + + return InteractionResult.PASS; + }); + } +} diff --git a/testmod-common/src/main/resources/data/architectury-test/tags/blocks/heart_particles2.json b/testmod-common/src/main/resources/data/architectury-test/tags/blocks/heart_particles2.json new file mode 100644 index 00000000..434965a2 --- /dev/null +++ b/testmod-common/src/main/resources/data/architectury-test/tags/blocks/heart_particles2.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:emerald_block" + ] +}