Merge pull request #671 from Dragon2488/1.9.4
Properly fluid rendering in dynamic cells. Temporary fix of recipes incapability…
This commit is contained in:
commit
31d1afa044
7 changed files with 416 additions and 68 deletions
211
src/main/java/techreborn/client/render/ModelDynamicCell.java
Normal file
211
src/main/java/techreborn/client/render/ModelDynamicCell.java
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
package techreborn.client.render;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Optional;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
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.client.resources.IResourceManager;
|
||||||
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
|
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.*;
|
||||||
|
import net.minecraftforge.common.model.IModelPart;
|
||||||
|
import net.minecraftforge.common.model.IModelState;
|
||||||
|
import net.minecraftforge.common.model.TRSRTransformation;
|
||||||
|
import net.minecraftforge.fluids.Fluid;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||||
|
import techreborn.init.ModItems;
|
||||||
|
import techreborn.items.DynamicCell;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public class ModelDynamicCell implements IModel {
|
||||||
|
|
||||||
|
public static final ModelDynamicCell MODEL = new ModelDynamicCell(
|
||||||
|
new ResourceLocation("techreborn:items/cell_cover"),
|
||||||
|
new ResourceLocation("techreborn:items/cell_empty")
|
||||||
|
);
|
||||||
|
|
||||||
|
public static final ModelResourceLocation MODEL_LOCATION = new ModelResourceLocation(new ResourceLocation("techreborn", "dynamic_cell"), "default");
|
||||||
|
|
||||||
|
private static final float NORTH_Z_FLUID = 7.6f / 16f;
|
||||||
|
private static final float SOUTH_Z_FLUID = 8.4f / 16f;
|
||||||
|
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
ModelLoader.setCustomMeshDefinition(ModItems.dynamicCell, stack -> MODEL_LOCATION);
|
||||||
|
ModelBakery.registerItemVariants(ModItems.dynamicCell, MODEL_LOCATION);
|
||||||
|
ModelLoaderRegistry.registerLoader(new DynamicCellLoader());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private final ResourceLocation baseTexture;
|
||||||
|
private final ResourceLocation emptyTexture;
|
||||||
|
private final Fluid fluid;
|
||||||
|
|
||||||
|
public ModelDynamicCell(ResourceLocation baseTexture, ResourceLocation emptyTexture) {
|
||||||
|
this(baseTexture, emptyTexture, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ModelDynamicCell(ResourceLocation baseTexture, ResourceLocation emptyTexture, Fluid fluid) {
|
||||||
|
this.baseTexture = baseTexture;
|
||||||
|
this.emptyTexture = emptyTexture;
|
||||||
|
this.fluid = fluid;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<ResourceLocation> getDependencies() {
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<ResourceLocation> getTextures() {
|
||||||
|
return ImmutableList.of(baseTexture, emptyTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
|
||||||
|
|
||||||
|
ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> transformMap = IPerspectiveAwareModel.MapWrapper.getTransforms(state);
|
||||||
|
TRSRTransformation transform = state.apply(Optional.<IModelPart>absent()).or(TRSRTransformation.identity());
|
||||||
|
|
||||||
|
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
|
||||||
|
builder.addAll(new ItemLayerModel(ImmutableList.of(baseTexture)).bake(transform, format, bakedTextureGetter).getQuads(null, null, 0L));
|
||||||
|
|
||||||
|
ResourceLocation sprite = fluid != null ? fluid.getStill() : emptyTexture;
|
||||||
|
int color = fluid != null ? fluid.getColor() : Color.WHITE.getRGB();
|
||||||
|
TextureAtlasSprite fluidSprite = bakedTextureGetter.apply(sprite);
|
||||||
|
if (fluidSprite != null) {
|
||||||
|
builder.add(ItemTextureQuadConverter.genQuad(format, transform, 5, 2, 11, 14, NORTH_Z_FLUID, fluidSprite, EnumFacing.NORTH, color));
|
||||||
|
builder.add(ItemTextureQuadConverter.genQuad(format, transform, 5, 2, 11, 14, SOUTH_Z_FLUID, fluidSprite, EnumFacing.SOUTH, color));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BakedDynamicCell(builder.build(), this, bakedTextureGetter.apply(baseTexture), format, transformMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IModelState getDefaultState() {
|
||||||
|
return TRSRTransformation.identity();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class DynamicCellLoader implements ICustomModelLoader {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean accepts(ResourceLocation modelLocation) {
|
||||||
|
return modelLocation.getResourceDomain().equals("techreborn") && modelLocation.getResourcePath().contains("dynamic_cell");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IModel loadModel(ResourceLocation modelLocation) throws Exception {
|
||||||
|
return MODEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResourceManagerReload(IResourceManager resourceManager) {}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class BakedDynamicCell implements IBakedModel{
|
||||||
|
|
||||||
|
private final List<BakedQuad> quads;
|
||||||
|
private final ModelDynamicCell parent;
|
||||||
|
private final TextureAtlasSprite particle;
|
||||||
|
private final VertexFormat format;
|
||||||
|
private final ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> transformMap;
|
||||||
|
|
||||||
|
public BakedDynamicCell(List<BakedQuad> quads, ModelDynamicCell parent, TextureAtlasSprite particle, VertexFormat format, ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> transformMap) {
|
||||||
|
this.transformMap = transformMap;
|
||||||
|
this.quads = quads;
|
||||||
|
this.parent = parent;
|
||||||
|
this.particle = particle;
|
||||||
|
this.format = format;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) {
|
||||||
|
return quads;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmbientOcclusion() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGui3d() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBuiltInRenderer() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextureAtlasSprite getParticleTexture() {
|
||||||
|
return particle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemCameraTransforms getItemCameraTransforms() {
|
||||||
|
return ModelHelper.DEFAULT_ITEM_TRANSFORMS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemOverrideList getOverrides() {
|
||||||
|
return OVERRIDES;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static final OverrideHandler OVERRIDES = new OverrideHandler();
|
||||||
|
|
||||||
|
public static class OverrideHandler extends ItemOverrideList {
|
||||||
|
|
||||||
|
private final HashMap<String, IBakedModel> modelCache = new HashMap<>();
|
||||||
|
|
||||||
|
private final Function<ResourceLocation, TextureAtlasSprite> textureGetter = location ->
|
||||||
|
Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(location.toString());
|
||||||
|
|
||||||
|
private OverrideHandler() {
|
||||||
|
super(ImmutableList.of());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) {
|
||||||
|
FluidStack fluidStack = DynamicCell.getFluidHandler(stack).getFluid();
|
||||||
|
if(fluidStack == null) {
|
||||||
|
//return default bucket
|
||||||
|
return originalModel;
|
||||||
|
}
|
||||||
|
String name = fluidStack.getFluid().getName();
|
||||||
|
if(!modelCache.containsKey(name)) {
|
||||||
|
BakedDynamicCell bakedCell = (BakedDynamicCell) originalModel;
|
||||||
|
ModelDynamicCell model = new ModelDynamicCell(bakedCell.parent.baseTexture, bakedCell.parent.emptyTexture, fluidStack.getFluid());
|
||||||
|
modelCache.put(name, model.bake(new SimpleModelState(bakedCell.transformMap), bakedCell.format, textureGetter));
|
||||||
|
}
|
||||||
|
return modelCache.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
46
src/main/java/techreborn/client/render/ModelHelper.java
Normal file
46
src/main/java/techreborn/client/render/ModelHelper.java
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
package techreborn.client.render;
|
||||||
|
|
||||||
|
import com.google.common.base.Charsets;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
|
||||||
|
import net.minecraft.client.renderer.block.model.ModelBlock;
|
||||||
|
import net.minecraft.client.resources.IResource;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||||
|
import techreborn.Core;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Credits to JsonDestroyer
|
||||||
|
*/
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public class ModelHelper {
|
||||||
|
|
||||||
|
public static final ItemCameraTransforms DEFAULT_ITEM_TRANSFORMS = loadTransformFromJson(new ResourceLocation("minecraft:models/item/generated"));
|
||||||
|
public static final ItemCameraTransforms HANDHELD_ITEM_TRANSFORMS = loadTransformFromJson(new ResourceLocation("minecraft:models/item/handheld"));
|
||||||
|
|
||||||
|
|
||||||
|
public static ItemCameraTransforms loadTransformFromJson(ResourceLocation location) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
return ModelBlock.deserialize(getReaderForResource(location)).getAllTransforms();
|
||||||
|
} catch (IOException exception) {
|
||||||
|
Core.logHelper.warn("Can't load resource " + location);
|
||||||
|
exception.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Reader getReaderForResource(ResourceLocation location) throws IOException {
|
||||||
|
ResourceLocation file = new ResourceLocation(location.getResourceDomain(), location.getResourcePath() + ".json");
|
||||||
|
IResource iresource = Minecraft.getMinecraft().getResourceManager().getResource(file);
|
||||||
|
return new BufferedReader(new InputStreamReader(iresource.getInputStream(), Charsets.UTF_8));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package techreborn.init;
|
||||||
import net.minecraft.init.Items;
|
import net.minecraft.init.Items;
|
||||||
import net.minecraft.inventory.EntityEquipmentSlot;
|
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
import net.minecraftforge.fluids.FluidContainerRegistry;
|
import net.minecraftforge.fluids.FluidContainerRegistry;
|
||||||
import net.minecraftforge.fluids.FluidRegistry;
|
import net.minecraftforge.fluids.FluidRegistry;
|
||||||
|
@ -294,12 +295,14 @@ public class ModItems
|
||||||
debug = new ItemDebugTool();
|
debug = new ItemDebugTool();
|
||||||
registerItem(debug, "debug");
|
registerItem(debug, "debug");
|
||||||
|
|
||||||
emptyCell = new EmptyCell();
|
|
||||||
registerItem(emptyCell, "emptyCell");
|
|
||||||
|
|
||||||
dynamicCell = new DynamicCell();
|
dynamicCell = new DynamicCell();
|
||||||
registerItem(dynamicCell, "dynamicCell");
|
registerItem(dynamicCell, "dynamicCell");
|
||||||
|
|
||||||
|
emptyCell = dynamicCell;
|
||||||
|
Item cell = new EmptyCell();
|
||||||
|
registerItem(cell, "emptyCell");
|
||||||
|
GameRegistry.addShapelessRecipe(new ItemStack(dynamicCell), cell);
|
||||||
|
|
||||||
MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE);
|
MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE);
|
||||||
|
|
||||||
Core.logHelper.info("TechReborns Items Loaded");
|
Core.logHelper.info("TechReborns Items Loaded");
|
||||||
|
|
|
@ -1,95 +1,182 @@
|
||||||
package techreborn.items;
|
package techreborn.items;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockStaticLiquid;
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.creativetab.CreativeTabs;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.util.ActionResult;
|
import net.minecraft.util.ActionResult;
|
||||||
import net.minecraft.util.EnumActionResult;
|
import net.minecraft.util.EnumActionResult;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
import net.minecraft.util.text.TextComponentString;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.event.entity.player.FillBucketEvent;
|
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||||
import net.minecraftforge.fluids.Fluid;
|
import net.minecraftforge.fluids.Fluid;
|
||||||
|
import net.minecraftforge.fluids.FluidRegistry;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.UniversalBucket;
|
import net.minecraftforge.fluids.IFluidBlock;
|
||||||
|
import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStack;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import techreborn.client.TechRebornCreativeTab;
|
import techreborn.client.TechRebornCreativeTab;
|
||||||
import techreborn.init.ModItems;
|
import techreborn.init.ModItems;
|
||||||
|
import techreborn.init.ModRecipes;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by modmuss50 on 17/05/2016.
|
* Created by modmuss50 on 17/05/2016.
|
||||||
*/
|
*/
|
||||||
public class DynamicCell extends UniversalBucket{
|
public class DynamicCell extends Item {
|
||||||
|
|
||||||
|
public static final int CAPACITY = Fluid.BUCKET_VOLUME;
|
||||||
|
|
||||||
public DynamicCell() {
|
public DynamicCell() {
|
||||||
super(1000, new ItemStack(ModItems.emptyCell), false);
|
super();
|
||||||
setCreativeTab(TechRebornCreativeTab.instance);
|
setCreativeTab(TechRebornCreativeTab.instance);
|
||||||
setUnlocalizedName("techreborn.cellFilled");
|
setUnlocalizedName("techreborn.cell");
|
||||||
setMaxStackSize(16);
|
setMaxStackSize(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ActionResult<ItemStack> onItemRightClick(ItemStack itemstack, World world, EntityPlayer player, EnumHand hand) {
|
public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) {
|
||||||
return ActionResult.newResult(EnumActionResult.FAIL, itemstack);
|
//Clearing tag because ItemUtils.isItemEqual doesn't handle tags ForgeCaps and display
|
||||||
|
//And breaks ability to use in recipes
|
||||||
|
//TODO: Property ItemUtils.isItemEquals tags equality handling?
|
||||||
|
if(stack.hasTagCompound()) {
|
||||||
|
NBTTagCompound tag = stack.getTagCompound();
|
||||||
|
if(tag.getSize() != 1 || tag.hasKey("Fluid")) {
|
||||||
|
NBTTagCompound clearTag = new NBTTagCompound();
|
||||||
|
clearTag.setTag("Fluid", tag.getCompoundTag("Fluid"));
|
||||||
|
stack.setTagCompound(clearTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFillBucket(FillBucketEvent event) {
|
public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World worldIn, EntityPlayer playerIn, EnumHand hand) {
|
||||||
return;
|
if(!worldIn.isRemote) {
|
||||||
|
RayTraceResult result = rayTrace(worldIn, playerIn, true);
|
||||||
|
|
||||||
|
if (result.typeOfHit == RayTraceResult.Type.BLOCK) {
|
||||||
|
BlockPos pos = result.getBlockPos();
|
||||||
|
IBlockState state = worldIn.getBlockState(pos);
|
||||||
|
Block block = state.getBlock();
|
||||||
|
|
||||||
|
if (block instanceof IFluidBlock) {
|
||||||
|
IFluidBlock fluidBlock = (IFluidBlock) block;
|
||||||
|
|
||||||
|
if (fluidBlock.canDrain(worldIn, pos)) {
|
||||||
|
FluidStack fluid = fluidBlock.drain(worldIn, pos, false);
|
||||||
|
|
||||||
|
if (fluid != null && fluid.amount == DynamicCell.CAPACITY) {
|
||||||
|
if(tryAddCellToInventory(playerIn, stack, fluid.getFluid())) {
|
||||||
|
fluidBlock.drain(worldIn, pos, true);
|
||||||
|
return ActionResult.newResult(EnumActionResult.SUCCESS, stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (block instanceof BlockStaticLiquid) {
|
||||||
|
Fluid fluid = block.getMaterial(state) == Material.LAVA ? FluidRegistry.LAVA : FluidRegistry.WATER;
|
||||||
|
|
||||||
|
if(tryAddCellToInventory(playerIn, stack, fluid)) {
|
||||||
|
if(fluid != FluidRegistry.WATER)
|
||||||
|
worldIn.setBlockToAir(pos);
|
||||||
|
return ActionResult.newResult(EnumActionResult.SUCCESS, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ActionResult.newResult(EnumActionResult.FAIL, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean tryAddCellToInventory(EntityPlayer player, ItemStack stack, Fluid fluid) {
|
||||||
|
if (player.inventory.addItemStackToInventory(DynamicCell.getCellWithFluid(fluid))) {
|
||||||
|
--stack.stackSize;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getItemStackDisplayName(ItemStack stack)
|
public void getSubItems(Item itemIn, CreativeTabs tab, List<ItemStack> subItems) {
|
||||||
{
|
subItems.add(getEmptyCell(1));
|
||||||
FluidStack fluidStack = getFluid(stack);
|
for(Fluid fluid : FluidRegistry.getRegisteredFluids().values()) {
|
||||||
|
subItems.add(getCellWithFluid(fluid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getItemStackDisplayName(ItemStack stack) {
|
||||||
|
FluidStack fluidStack = getFluidHandler(stack).getFluid();
|
||||||
if (fluidStack == null)
|
if (fluidStack == null)
|
||||||
{
|
|
||||||
if(getEmpty() != null)
|
|
||||||
{
|
|
||||||
return getEmpty().getDisplayName();
|
|
||||||
}
|
|
||||||
return super.getItemStackDisplayName(stack);
|
return super.getItemStackDisplayName(stack);
|
||||||
}
|
|
||||||
|
|
||||||
return fluidStack.getLocalizedName() + " Cell";
|
return fluidStack.getLocalizedName() + " Cell";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int fill(ItemStack container, FluidStack resource, boolean doFill)
|
public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) {
|
||||||
{
|
return getFluidHandler(stack);
|
||||||
// has to be exactly 1, must be handled from the caller
|
|
||||||
if (container.stackSize != 1)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// can only fill exact capacity
|
public static FluidHandler getFluidHandler(ItemStack stack) {
|
||||||
if (resource == null || resource.amount != getCapacity())
|
return new FluidHandler(stack, CAPACITY);
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// fill the container
|
|
||||||
if (doFill)
|
|
||||||
{
|
|
||||||
NBTTagCompound tag = container.getTagCompound();
|
|
||||||
if (tag == null)
|
|
||||||
{
|
|
||||||
tag = new NBTTagCompound();
|
|
||||||
}
|
|
||||||
resource.writeToNBT(tag);
|
|
||||||
container.setTagCompound(tag);
|
|
||||||
}
|
|
||||||
return getCapacity();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ItemStack getCellWithFluid(Fluid fluid, int stackSize){
|
public static ItemStack getCellWithFluid(Fluid fluid, int stackSize){
|
||||||
Validate.notNull(fluid);
|
Validate.notNull(fluid);
|
||||||
ItemStack stack = new ItemStack(ModItems.dynamicCell, stackSize);
|
ItemStack stack = new ItemStack(ModItems.dynamicCell);
|
||||||
ModItems.dynamicCell.fill(stack, new FluidStack(fluid, ModItems.dynamicCell.getCapacity()), true);
|
getFluidHandler(stack).fill(new FluidStack(fluid, CAPACITY), true);
|
||||||
|
stack.stackSize = stackSize;
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ItemStack getEmptyCell(int amount) {
|
||||||
|
return new ItemStack(ModItems.dynamicCell, amount);
|
||||||
|
}
|
||||||
|
|
||||||
public static ItemStack getCellWithFluid(Fluid fluid){
|
public static ItemStack getCellWithFluid(Fluid fluid){
|
||||||
return getCellWithFluid(fluid, 1);
|
return getCellWithFluid(fluid, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class FluidHandler extends FluidHandlerItemStack {
|
||||||
|
|
||||||
|
public FluidHandler(ItemStack container, int capacity) {
|
||||||
|
super(container, capacity);
|
||||||
|
|
||||||
|
//backwards compatibility
|
||||||
|
if(container.hasTagCompound() && container.getTagCompound().hasKey("FluidName")) {
|
||||||
|
FluidStack stack = FluidStack.loadFluidStackFromNBT(container.getTagCompound());
|
||||||
|
if(stack != null) {
|
||||||
|
container.setTagCompound(new NBTTagCompound());
|
||||||
|
fill(stack, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int fill(FluidStack resource, boolean doFill) {
|
||||||
|
if(resource.amount != capacity) return 0;
|
||||||
|
return super.fill(resource, doFill);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FluidStack drain(int maxDrain, boolean doDrain) {
|
||||||
|
if(maxDrain != capacity) return null;
|
||||||
|
return super.drain(maxDrain, doDrain);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,28 @@
|
||||||
package techreborn.items;
|
package techreborn.items;
|
||||||
|
|
||||||
import techreborn.client.TechRebornCreativeTab;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import techreborn.lib.ModInfo;
|
import techreborn.lib.ModInfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by modmuss50 on 17/05/2016.
|
* Created by modmuss50 on 17/05/2016.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class EmptyCell extends ItemTextureBase {
|
public class EmptyCell extends ItemTextureBase {
|
||||||
|
|
||||||
public EmptyCell()
|
public EmptyCell() {
|
||||||
{
|
|
||||||
super();
|
super();
|
||||||
setUnlocalizedName("techreborn.cell");
|
setUnlocalizedName("techreborn.cell");
|
||||||
setCreativeTab(TechRebornCreativeTab.instance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addInformation(ItemStack stack, EntityPlayer playerIn, List<String> tooltip, boolean advanced) {
|
||||||
|
tooltip.add("§cDeprecated");
|
||||||
|
tooltip.add("§7Place to workbench to get new item");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getTextureName(int damage) {
|
public String getTextureName(int damage) {
|
||||||
return ModInfo.MOD_ID + ":items/cell_base";
|
return ModInfo.MOD_ID + ":items/cell_base";
|
||||||
|
@ -23,4 +32,5 @@ public class EmptyCell extends ItemTextureBase {
|
||||||
public int getMaxMeta() {
|
public int getMaxMeta() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ import techreborn.client.RegisterItemJsons;
|
||||||
import techreborn.client.StackToolTipEvent;
|
import techreborn.client.StackToolTipEvent;
|
||||||
import techreborn.client.hud.ChargeHud;
|
import techreborn.client.hud.ChargeHud;
|
||||||
import techreborn.client.keybindings.KeyBindings;
|
import techreborn.client.keybindings.KeyBindings;
|
||||||
|
import techreborn.client.render.ModelDynamicCell;
|
||||||
import techreborn.client.render.entitys.RenderNukePrimed;
|
import techreborn.client.render.entitys.RenderNukePrimed;
|
||||||
import techreborn.entitys.EntityNukePrimed;
|
import techreborn.entitys.EntityNukePrimed;
|
||||||
import techreborn.init.ModBlocks;
|
import techreborn.init.ModBlocks;
|
||||||
|
@ -44,8 +45,6 @@ public class ClientProxy extends CommonProxy
|
||||||
|
|
||||||
public static MultiblockRenderEvent multiblockRenderEvent;
|
public static MultiblockRenderEvent multiblockRenderEvent;
|
||||||
|
|
||||||
public static final ModelResourceLocation MODEL_DYNAMIC_CELL = new ModelResourceLocation(new ResourceLocation("techreborn", "dyncell"), "inventory");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preInit(FMLPreInitializationEvent event)
|
public void preInit(FMLPreInitializationEvent event)
|
||||||
{
|
{
|
||||||
|
@ -70,15 +69,7 @@ public class ClientProxy extends CommonProxy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelLoader.setCustomMeshDefinition(ModItems.dynamicCell, new ItemMeshDefinition()
|
ModelDynamicCell.init();
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public ModelResourceLocation getModelLocation(ItemStack stack)
|
|
||||||
{
|
|
||||||
return MODEL_DYNAMIC_CELL;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
ModelBakery.registerItemVariants(ModItems.dynamicCell, MODEL_DYNAMIC_CELL);
|
|
||||||
RegisterItemJsons.registerModels();
|
RegisterItemJsons.registerModels();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 243 B |
Loading…
Add table
Add a link
Reference in a new issue