From cc8959ee1dcf4a19f9f8652beeb4ca4e4cc3106c Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Thu, 16 Nov 2023 16:51:07 +0100 Subject: [PATCH] feat: implement recovery compass --- .../wildbackport/WildBackport.java | 24 ++++------- .../wildbackport/client/ClientSetup.java | 42 +++++++++++++++++-- .../common/items/RecoveryCompassTarget.java | 21 ++++++++++ .../main/resources/wildbackport.accesswidener | 1 - .../main/resources/wildbackport.mixins.json | 6 +-- 5 files changed, 70 insertions(+), 24 deletions(-) create mode 100644 common/src/main/java/com/cursedcauldron/wildbackport/common/items/RecoveryCompassTarget.java diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java b/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java index 3c7ee52..3ac7d2c 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/WildBackport.java @@ -1,11 +1,15 @@ package com.cursedcauldron.wildbackport; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; + import org.slf4j.Logger; import com.cursedcauldron.wildbackport.client.registry.WBParticleTypes; import com.cursedcauldron.wildbackport.client.registry.WBSoundEvents; import com.cursedcauldron.wildbackport.common.entities.access.Recovery; import com.cursedcauldron.wildbackport.common.items.CompassItemPropertyFunction; +import com.cursedcauldron.wildbackport.common.items.RecoveryCompassTarget; import com.cursedcauldron.wildbackport.common.registry.Instruments; import com.cursedcauldron.wildbackport.common.registry.WBBiomes; import com.cursedcauldron.wildbackport.common.registry.WBBlockEntities; @@ -35,12 +39,12 @@ import com.cursedcauldron.wildbackport.common.tag.WBGameEventTags; import com.cursedcauldron.wildbackport.common.tag.WBItemTags; import com.mojang.logging.LogUtils; +import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.core.BlockPos; -import net.minecraft.core.GlobalPos; +import net.minecraft.client.renderer.item.ItemPropertyFunction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; +import net.minecraft.world.item.Item; //<> @@ -87,19 +91,5 @@ public class WildBackport { WBGameEventTags.TAGS.bootstrap(); WBItemTags.TAGS.bootstrap(); InstrumentTags.TAGS.bootstrap(); - - ItemProperties.register( - WBItems.RECOVERY_COMPASS.get(), - new ResourceLocation("angle"), - new CompassItemPropertyFunction((level, stack, entity) -> { - //if (entity instanceof Player player) - // System.out.println( - // "ALEC: " + Recovery.of(player).getLastDeathLocation() - // ); - return entity instanceof Player player - ? Recovery.of(player).getLastDeathLocation().orElse(null) - : null; - }) - ); } } diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/client/ClientSetup.java b/common/src/main/java/com/cursedcauldron/wildbackport/client/ClientSetup.java index b59f728..d4f85e8 100644 --- a/common/src/main/java/com/cursedcauldron/wildbackport/client/ClientSetup.java +++ b/common/src/main/java/com/cursedcauldron/wildbackport/client/ClientSetup.java @@ -1,5 +1,8 @@ package com.cursedcauldron.wildbackport.client; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; + import com.cursedcauldron.wildbackport.client.particle.SculkChargeParticle; import com.cursedcauldron.wildbackport.client.particle.SculkChargePopParticle; import com.cursedcauldron.wildbackport.client.particle.SculkSoulParticle; @@ -16,22 +19,25 @@ import com.cursedcauldron.wildbackport.client.render.model.ChestBoatModel; import com.cursedcauldron.wildbackport.client.render.model.FrogModel; import com.cursedcauldron.wildbackport.client.render.model.TadpoleModel; import com.cursedcauldron.wildbackport.client.render.model.WardenModel; -import com.cursedcauldron.wildbackport.common.entities.access.Recovery; import com.cursedcauldron.wildbackport.common.items.CompassItemPropertyFunction; +import com.cursedcauldron.wildbackport.common.items.RecoveryCompassTarget; import com.cursedcauldron.wildbackport.common.registry.WBBlocks; import com.cursedcauldron.wildbackport.common.registry.WBItems; import com.cursedcauldron.wildbackport.common.registry.entity.WBEntityTypes; import com.cursedcauldron.wildbackport.core.api.ColorRegistry; import com.cursedcauldron.wildbackport.core.api.ParticleRegistry; import com.cursedcauldron.wildbackport.core.api.RenderRegistry; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.renderer.BiomeColors; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.client.renderer.item.ItemPropertyFunction; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; import net.minecraft.world.level.FoliageColor; @Environment(EnvType.CLIENT) @@ -110,5 +116,35 @@ public class ClientSetup { WBBlocks.MANGROVE_PROPAGULE.get(), WBBlocks.POTTED_MANGROVE_PROPAGULE.get() ); + + var isForge = false; + try { + // TODO: wonk + Class.forName("net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext"); + isForge = true; + } catch (ClassNotFoundException alec) {} + + try { + var registerItemPropertyFunc = ItemProperties.class.getDeclaredMethod( + isForge ? "register" : "method_27879", + Item.class, + ResourceLocation.class, + // Thanks for patching, forge! + isForge ? ItemPropertyFunction.class : ClampedItemPropertyFunction.class + ); + + registerItemPropertyFunc.setAccessible(true); + + registerItemPropertyFunc.invoke( + null, + WBItems.RECOVERY_COMPASS.get(), + new ResourceLocation("angle"), + new CompassItemPropertyFunction(RecoveryCompassTarget.INSTANCE) + ); + } catch ( + InvocationTargetException | IllegalAccessException | NoSuchMethodException e + ) { + throw new RuntimeException(e); + } } -} \ No newline at end of file +} diff --git a/common/src/main/java/com/cursedcauldron/wildbackport/common/items/RecoveryCompassTarget.java b/common/src/main/java/com/cursedcauldron/wildbackport/common/items/RecoveryCompassTarget.java new file mode 100644 index 0000000..1d4ea99 --- /dev/null +++ b/common/src/main/java/com/cursedcauldron/wildbackport/common/items/RecoveryCompassTarget.java @@ -0,0 +1,21 @@ +package com.cursedcauldron.wildbackport.common.items; + +import com.cursedcauldron.wildbackport.common.entities.access.Recovery; +import com.cursedcauldron.wildbackport.common.items.CompassItemPropertyFunction.CompassTarget; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.GlobalPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +public class RecoveryCompassTarget implements CompassTarget { + public static final RecoveryCompassTarget INSTANCE = new RecoveryCompassTarget(); + + @Override + public GlobalPos getPos(ClientLevel level, ItemStack stack, Entity entity) { + return entity instanceof Player player + ? Recovery.of(player).getLastDeathLocation().orElse(null) + : null; + } +} diff --git a/common/src/main/resources/wildbackport.accesswidener b/common/src/main/resources/wildbackport.accesswidener index d7e9af2..6efd9fd 100644 --- a/common/src/main/resources/wildbackport.accesswidener +++ b/common/src/main/resources/wildbackport.accesswidener @@ -25,4 +25,3 @@ transitive-accessible method net/minecraft/client/particle/HugeExplosionParticle transitive-accessible method net/minecraft/world/level/block/MultifaceBlock hasFace (Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;)Z transitive-accessible method net/minecraft/core/Registry registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/Registry$RegistryBootstrap;)Lnet/minecraft/core/Registry; -transitive-accessible method net/minecraft/client/renderer/item/ItemProperties register (Lnet/minecraft/world/item/Item;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/renderer/item/ClampedItemPropertyFunction;)V diff --git a/fabric/src/main/resources/wildbackport.mixins.json b/fabric/src/main/resources/wildbackport.mixins.json index b20230b..822e0a6 100644 --- a/fabric/src/main/resources/wildbackport.mixins.json +++ b/fabric/src/main/resources/wildbackport.mixins.json @@ -4,12 +4,12 @@ "package": "com.cursedcauldron.wildbackport.core.mixin.fabric", "compatibilityLevel": "JAVA_17", "mixins": [ - "access.BiomeAccessor" + "access.BiomeAccessor", + "common.BeardifierMixin" ], "client": [ "client.FogRendererMixin", - "client.SheetsMixin", - "common.BeardifierMixin" + "client.SheetsMixin" ], "injectors": { "defaultRequire": 1