package lumaceon.mods.clockworkphase2.client.model; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import lumaceon.mods.clockworkphase2.util.NBTHelper; import lumaceon.mods.clockworkphase2.util.NBTTags; import lumaceon.mods.clockworkphase2.proxy.ClientProxy; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.*; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.IPerspectiveAwareModel; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.common.model.IModelState; import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nullable; import javax.vecmath.Matrix4f; import java.util.Collection; import java.util.LinkedList; import java.util.List; public class ModelTemporalMultitool implements IModel { @Override public Collection<ResourceLocation> getDependencies() { return null; } @Override public Collection<ResourceLocation> getTextures() { return null; } @Override public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { IModel subComponent; try { subComponent = ModelLoaderRegistry.getModel(ClientProxy.MULTITOOL_MODEL); IBakedModel bakedModelCore = subComponent.bake(state, format, bakedTextureGetter); return new Baked(bakedModelCore); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public IModelState getDefaultState() { return null; } public static class Baked implements IPerspectiveAwareModel { public IBakedModel model; IBakedModel subModel; List<BakedQuad> quadList; public Baked(IBakedModel model) { this.model = model; } public Baked(IBakedModel model, IBakedModel subModel) { this.model = model; this.subModel = subModel; } @Override public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { List<BakedQuad> list = new LinkedList<BakedQuad>(); if(subModel != null) list.addAll(subModel.getQuads(state, side, rand)); quadList = list; return quadList; } @Override public boolean isAmbientOcclusion() { if(subModel != null) return subModel.isAmbientOcclusion(); return model.isAmbientOcclusion(); } @Override public boolean isGui3d() { if(subModel != null) return subModel.isGui3d(); return model.isGui3d(); } @Override public boolean isBuiltInRenderer() { return false; } @Override public TextureAtlasSprite getParticleTexture() { if(subModel != null) return subModel.getParticleTexture(); return model.getParticleTexture(); } @Override public ItemCameraTransforms getItemCameraTransforms() { if(subModel != null) return subModel.getItemCameraTransforms(); return model.getItemCameraTransforms(); } private final Overrides INSTANCE = new Overrides(ImmutableList.<ItemOverride>of()); @Override public ItemOverrideList getOverrides() { return INSTANCE; } @Override public Pair<? extends IBakedModel, Matrix4f> handlePerspective(ItemCameraTransforms.TransformType cameraTransformType) { if(subModel != null && subModel instanceof IPerspectiveAwareModel) return ((IPerspectiveAwareModel) subModel).handlePerspective(cameraTransformType); return ((IPerspectiveAwareModel) model).handlePerspective(cameraTransformType); } } public static class Overrides extends ItemOverrideList { IBakedModel baseModel; IBakedModel overrideModel; Item overrideItem; public Overrides(List<ItemOverride> overridesIn) { super(overridesIn); } @Override public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) { if(baseModel == null) baseModel = originalModel; if(NBTHelper.hasTag(stack, NBTTags.COMPONENT_INVENTORY)) { byte index = NBTHelper.BYTE.get(stack, "MT_index"); ItemStack[] items = NBTHelper.INVENTORY.get(stack, NBTTags.COMPONENT_INVENTORY); if(items.length > index) { ItemStack current = items[index]; if(current != null) { if(!current.getItem().equals(overrideItem)) { overrideModel = new Baked(baseModel, Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getItemModel(current)); overrideItem = current.getItem(); } } else if(overrideItem != null) { overrideModel = null; overrideItem = null; } } } else { overrideModel = null; overrideItem = null; } if(overrideModel != null) return overrideModel; return baseModel; /* byte index = NBTHelper.BYTE.get(stack, "MT_index"); if(index == previousIndex) return originalModel; else previousIndex = index; if(NBTHelper.hasTag(stack, NBTTags.COMPONENT_INVENTORY)) { ItemStack[] items = NBTHelper.INVENTORY.get(stack, NBTTags.COMPONENT_INVENTORY); if(items.length > index) { ItemStack current = items[index]; if(current != null) { if(!current.getItem().equals(previousItem)) { overrideModel = new Baked(baseModel, Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getItemModel(current)); previousItem = current.getItem(); } } else if(previousItem != null) { overrideModel = baseModel; previousItem = null; } } } if(overrideModel != null) return overrideModel; return baseModel;*/ } } }