From cfc9e2ad0d44ebfb7928f3e57f501989bd77ac1d Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 19 Dec 2021 13:04:19 +0000 Subject: [PATCH] Fix some problems with pocket computer model properties - We were setting state twice, rather than state and coloured. - Fabric forces us to use the clamped item property getter, which doesn't work with our computer state, as it takes a value [0, 2]. Solves half of #26, but will require some texture fixups too. --- .../proxy/ComputerCraftProxyClient.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java index 11dd8f378..63a627b53 100644 --- a/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java +++ b/src/main/java/dan200/computercraft/client/proxy/ComputerCraftProxyClient.java @@ -39,11 +39,16 @@ import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.item.ClampedItemPropertyFunction; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; @@ -99,7 +104,7 @@ public final class ComputerCraftProxyClient implements ClientModInitializer .ordinal(), () -> ComputerCraftRegistry.ModItems.POCKET_COMPUTER_NORMAL, () -> ComputerCraftRegistry.ModItems.POCKET_COMPUTER_ADVANCED ); - registerItemProperty( "state", + registerItemProperty( "coloured", ( stack, world, player, integer ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0, () -> ComputerCraftRegistry.ModItems.POCKET_COMPUTER_NORMAL, () -> ComputerCraftRegistry.ModItems.POCKET_COMPUTER_ADVANCED ); @@ -130,9 +135,25 @@ public final class ComputerCraftProxyClient implements ClientModInitializer private static void registerItemProperty( String name, ClampedItemPropertyFunction getter, Supplier... items ) { ResourceLocation id = new ResourceLocation( ComputerCraft.MOD_ID, name ); + // Terrible hack, but some of our properties return values greater than 1, so we don't want to clamp. + var unclampedGetter = new ClampedItemPropertyFunction() + { + @Override + @Deprecated + public float call( @NotNull ItemStack itemStack, @Nullable ClientLevel clientLevel, @Nullable LivingEntity livingEntity, int i ) + { + return getter.unclampedCall( itemStack, clientLevel, livingEntity, i ); + } + + @Override + public float unclampedCall( ItemStack itemStack, @Nullable ClientLevel clientLevel, @Nullable LivingEntity livingEntity, int i ) + { + return getter.unclampedCall( itemStack, clientLevel, livingEntity, i ); + } + }; for( Supplier item : items ) { - FabricModelPredicateProviderRegistry.register( item.get(), id, getter ); + FabricModelPredicateProviderRegistry.register( item.get(), id, unclampedGetter ); } } }