From 838691d924db496159a6603632f7267cb344aace Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 16 Aug 2016 17:55:56 +0200 Subject: [PATCH] Fixes Paintball Item Rendering (#48) * Added a way to register a custom ItemMeshDefinition for items, including registration of custom variants. * Moved color handling for paint balls into the paint ball class and implemented the correct model selection logic for displaying the items. --- src/main/java/appeng/client/ClientHelper.java | 33 ++---------- .../core/features/ItemFeatureHandler.java | 33 +++++++++++- src/main/java/appeng/items/AEBaseItem.java | 27 ++++++++-- .../java/appeng/items/misc/ItemPaintBall.java | 51 ++++++++++++++++--- 4 files changed, 101 insertions(+), 43 deletions(-) diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 3f01b476..78cefb34 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -31,7 +31,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.color.IBlockColor; -import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.client.renderer.color.ItemColors; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -131,7 +131,10 @@ public class ClientHelper extends ServerHelper } } - Minecraft.getMinecraft().getItemColors().registerItemColorHandler( new ItemPaintBallColor(), Api.INSTANCE.definitions().items().paintBall().maybeItem().get() ); + // Register color handling for paintball items + ItemColors itemColors = Minecraft.getMinecraft().getItemColors(); + Item paintballItem = Api.INSTANCE.definitions().items().paintBall().maybeItem().get(); + itemColors.registerItemColorHandler( ItemPaintBall::getColorFromItemstack, paintballItem ); } @Override @@ -466,30 +469,4 @@ public class ClientHelper extends ServerHelper } } - - public class ItemPaintBallColor implements IItemColor - { - - @Override - public int getColorFromItemstack( ItemStack stack, int tintIndex ) - { - final AEColor col = ( (ItemPaintBall) stack.getItem() ).getColor( stack ); - - final int colorValue = stack.getItemDamage() >= 20 ? col.mediumVariant : col.mediumVariant; - final int r = ( colorValue >> 16 ) & 0xff; - final int g = ( colorValue >> 8 ) & 0xff; - final int b = ( colorValue ) & 0xff; - - if( stack.getItemDamage() >= 20 ) - { - final float fail = 0.7f; - final int full = (int) ( 255 * 0.3 ); - return (int) ( full + r * fail ) << 16 | (int) ( full + g * fail ) << 8 | (int) ( full + b * fail ) | 0xff << 24; - } - else - { - return r << 16 | g << 8 | b | 0xff << 24; - } - } - } } \ No newline at end of file diff --git a/src/main/java/appeng/core/features/ItemFeatureHandler.java b/src/main/java/appeng/core/features/ItemFeatureHandler.java index e17f0fae..184eb704 100644 --- a/src/main/java/appeng/core/features/ItemFeatureHandler.java +++ b/src/main/java/appeng/core/features/ItemFeatureHandler.java @@ -24,6 +24,7 @@ import java.util.EnumSet; import com.google.common.base.Optional; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelBakery; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -37,6 +38,7 @@ import appeng.api.definitions.IItemDefinition; import appeng.core.AppEng; import appeng.core.CreativeTab; import appeng.core.CreativeTabFacade; +import appeng.items.AEBaseItem; import appeng.items.parts.ItemFacade; @@ -105,7 +107,18 @@ public final class ItemFeatureHandler implements IFeatureHandler if( side == Side.CLIENT ) { - ModelBakery.registerItemVariants( item, registryName ); + if( item instanceof AEBaseItem ) + { + AEBaseItem baseItem = (AEBaseItem) item; + + // Handle registration of item variants + ResourceLocation[] variants = baseItem.getItemVariants().toArray( new ResourceLocation[0] ); + ModelBakery.registerItemVariants( item, variants ); + } + else + { + ModelBakery.registerItemVariants( item, registryName ); + } } } } @@ -113,7 +126,23 @@ public final class ItemFeatureHandler implements IFeatureHandler @Override public void registerModel() { - Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( item, 0, new ModelResourceLocation( registryName, "inventory" ) ); + ItemMeshDefinition meshDefinition = null; + + // Register a custom item model handler if the item wants one + if( item instanceof AEBaseItem ) + { + AEBaseItem baseItem = (AEBaseItem) item; + meshDefinition = baseItem.getItemMeshDefinition(); + } + + if( meshDefinition != null ) + { + Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( item, meshDefinition ); + } + else + { + Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( item, 0, new ModelResourceLocation( registryName, "inventory" ) ); + } } @Override diff --git a/src/main/java/appeng/items/AEBaseItem.java b/src/main/java/appeng/items/AEBaseItem.java index fb46c5f6..d2996cd3 100644 --- a/src/main/java/appeng/items/AEBaseItem.java +++ b/src/main/java/appeng/items/AEBaseItem.java @@ -23,16 +23,17 @@ import java.util.EnumSet; import java.util.List; import com.google.common.base.Optional; +import com.google.common.collect.Lists; -import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import appeng.client.ClientHelper; import appeng.core.features.AEFeature; import appeng.core.features.FeatureNameExtractor; import appeng.core.features.IAEFeature; @@ -106,11 +107,27 @@ public abstract class AEBaseItem extends Item implements IAEFeature super.addInformation( stack, player, lines, displayMoreInfo ); } - @SideOnly( Side.CLIENT ) - public void registerCustomIcon( final TextureMap map ){} - protected void getCheckedSubItems( final Item sameItem, final CreativeTabs creativeTab, final List itemStacks ) { super.getSubItems( sameItem, creativeTab, itemStacks ); } + + /** + * During registration of the item in the registry, this method is used to determine which models need to be registered for the item to be + * rendered. If your item subclass requires more than just the default, override this method and add them to the list, or replace it entirely. + */ + @SideOnly( Side.CLIENT ) + public List getItemVariants() { + return Lists.newArrayList( getRegistryName() ); + } + + /** + * If this item requires special logic to select the model for rendering, this method can be overriden to return that selection logic. + * Return null to use the standard logic. + */ + @SideOnly( Side.CLIENT ) + public ItemMeshDefinition getItemMeshDefinition() { + return null; + } + } diff --git a/src/main/java/appeng/items/misc/ItemPaintBall.java b/src/main/java/appeng/items/misc/ItemPaintBall.java index 314ecf2a..4f0fffbc 100644 --- a/src/main/java/appeng/items/misc/ItemPaintBall.java +++ b/src/main/java/appeng/items/misc/ItemPaintBall.java @@ -22,26 +22,21 @@ package appeng.items.misc; import java.util.EnumSet; import java.util.List; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.Minecraft; +import com.google.common.collect.ImmutableList; + import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.client.renderer.color.IBlockColor; -import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.util.AEColor; -import appeng.client.ClientHelper; import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; -import appeng.util.Platform; public class ItemPaintBall extends AEBaseItem @@ -107,4 +102,44 @@ public class ItemPaintBall extends AEBaseItem final int dmg = is.getItemDamage(); return dmg >= DAMAGE_THRESHOLD; } + + public static int getColorFromItemstack( ItemStack stack, int tintIndex ) + { + final AEColor col = ( (ItemPaintBall) stack.getItem() ).getColor( stack ); + + final int colorValue = stack.getItemDamage() >= 20 ? col.mediumVariant : col.mediumVariant; + final int r = ( colorValue >> 16 ) & 0xff; + final int g = ( colorValue >> 8 ) & 0xff; + final int b = ( colorValue ) & 0xff; + + if( stack.getItemDamage() >= 20 ) + { + final float fail = 0.7f; + final int full = (int) ( 255 * 0.3 ); + return (int) ( full + r * fail ) << 16 | (int) ( full + g * fail ) << 8 | (int) ( full + b * fail ) | 0xff << 24; + } + else + { + return r << 16 | g << 8 | b | 0xff << 24; + } + } + + private static final ModelResourceLocation MODEL_NORMAL = new ModelResourceLocation( "appliedenergistics2:ItemPaintBall" ); + private static final ModelResourceLocation MODEL_SHIMMER = new ModelResourceLocation( "appliedenergistics2:ItemPaintBallShimmer" ); + + @Override + public List getItemVariants() + { + return ImmutableList.of( + MODEL_NORMAL, + MODEL_SHIMMER + ); + } + + @Override + @SideOnly( Side.CLIENT ) + public ItemMeshDefinition getItemMeshDefinition() + { + return is -> isLumen( is ) ? MODEL_SHIMMER : MODEL_NORMAL; + } }