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.
This commit is contained in:
parent
115f73de2e
commit
838691d924
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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<ItemStack> 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<ResourceLocation> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<ResourceLocation> getItemVariants()
|
||||
{
|
||||
return ImmutableList.of(
|
||||
MODEL_NORMAL,
|
||||
MODEL_SHIMMER
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly( Side.CLIENT )
|
||||
public ItemMeshDefinition getItemMeshDefinition()
|
||||
{
|
||||
return is -> isLumen( is ) ? MODEL_SHIMMER : MODEL_NORMAL;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue