
nik7
Members-
Posts
36 -
Joined
-
Last visited
Everything posted by nik7
-
The model is rendering fine! Thanks 😀
-
Hi, I'm trying to render a model with some transparent part, but this is the result: Item model is rendering fine. Here the source code of the block: https://github.com/nik7007/upgrade_craft/blob/master/src/main/java/com/nik7/upgradecraft/blocks/AbstractFluidTankBlock.java https://github.com/nik7007/upgrade_craft/blob/master/src/main/java/com/nik7/upgradecraft/blocks/WoodenFluidTankGlassedBlock.java Here the generation code: https://github.com/nik7007/upgrade_craft/blob/master/src/main/java/com/nik7/upgradecraft/datagenerators/BlockStateProviderUpgC.java#L48 Here the json stuff: https://github.com/nik7007/upgrade_craft/blob/master/src/main/resources/assets/upgradecraft/blockstates/wooden_fluid_tank_glassed_block.json https://github.com/nik7007/upgrade_craft/blob/master/src/main/resources/assets/upgradecraft/models/block/fluid_tank.json https://github.com/nik7007/upgrade_craft/blob/master/src/main/resources/assets/upgradecraft/models/block/wooden_fluid_tank_glassed.json Can anyone kindly help me out?
-
I changed it, but texture is still not visible.
-
This is the json file: https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/resources/assets/upgcraft/blockstates/BlockActiveLava.json
-
I changed the ResourceLocation in this way, but it didn't work. super("ActiveLava", new ResourceLocation(Reference.MOD_ID, "textures/blocks/ActiveLava_still"), new ResourceLocation(Reference.MOD_ID, "textures/blocks/ActiveLava_flow")); EDIT: I tried this to see if the ResourceLocation was correct, in this way the fluid in the bucket has a texture, but not the BlockFluid. @SubscribeEvent public void onRegisterTexture(TextureStitchEvent.Pre event){ event.getMap().registerSprite(new ResourceLocation(Reference.MOD_ID, "blocks/ActiveLava_still")); event.getMap().registerSprite(new ResourceLocation(Reference.MOD_ID, "blocks/ActiveLava_flow")); }
-
The texture of the fluids are the first two png.
-
Textures are present in the project. There are no errors in the console about the fluid
-
I think you need to convert your model in json and then register the item to the ItemModelMesher as usual.
-
I added a new fluid with its block and bucket and everything is present in minecraft, but the fluid and block has the pink/black missing texture. This is how I register the fluid: https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/java/com/nik7/upgcraft/init/ModFluids.java Fluid classes https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/java/com/nik7/upgcraft/fluid/FluidUpgC.java https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/java/com/nik7/upgcraft/fluid/FluidUpgCActiveLava.java Block classes https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/java/com/nik7/upgcraft/block/BlockFluidUpgC.java https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/java/com/nik7/upgcraft/block/BlockFluidUpgCActiveLava.java Render class https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/java/com/nik7/upgcraft/proxy/ClientProxy.java
-
I solved the problem! private void updateLight() { if (worldObj.isRemote) { IBlockState blockState = worldObj.getBlockState(pos); if (blockState != null) worldObj.notifyBlockUpdate(pos, blockState, blockState, 3); } worldObj.checkLightFor(EnumSkyBlock.BLOCK,pos); }
-
20 is a random number just to see if it works. The BlockUpgC class does nothing special... package com.nik7.upgcraft.block; import com.nik7.upgcraft.creativetab.CreativeTab; import com.nik7.upgcraft.reference.Reference; import com.nik7.upgcraft.util.StringHelper; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.util.Random; public abstract class BlockUpgC extends Block implements IBlockUpgC { protected final String name; public BlockUpgC(String name) { super(Material.rock); this.name = name; this.setUnlocalizedName(name); } public BlockUpgC(Material material, String name) { super(material); this.setCreativeTab(CreativeTab.UPGC_TAB); this.name = name; this.setUnlocalizedName(name); } @Override public String getName() { return name; } @SideOnly(Side.CLIENT) protected void spawnParticles(World worldIn, BlockPos pos, Random rand, EnumParticleTypes... particles) { float f = (float) pos.getX() + 0.5F; float f1 = (float) pos.getY() + rand.nextFloat(); float f2 = (float) pos.getZ() + 0.5F; float f3 = 0.52F; float f4 = rand.nextFloat() * 0.6F - 0.3F; for (EnumParticleTypes p : particles) { worldIn.spawnParticle(p, (double) (f - f3), (double) f1, (double) (f2 + f4), 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(p, (double) (f + f3), (double) f1, (double) (f2 + f4), 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(p, (double) (f + f4), (double) f1, (double) (f2 - f3), 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(p, (double) (f + f4), (double) f1, (double) (f2 + f3), 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(p, pos.getX() + 0.5D - rand.nextDouble(), (double) pos.getY() + 1, pos.getZ() + 0.5D - rand.nextDouble(), 0.0D, 0.0D, 0.0D); } } @Override public String getUnlocalizedName() { return String.format("tile.%s%s", Reference.RESOURCE_PREFIX, StringHelper.getUnwrappedUnlocalizedName(super.getUnlocalizedName())); } }
-
It doesn't work... I use the method in this way: BlockPos minPos = pos.add(-20, -20, -20); BlockPos maxPos = pos.add(20, 20, 20); worldObj.markBlockRangeForRenderUpdate(minPos, maxPos); It's correct?
-
I wrote a block with its tileentity for just testing the lighting and I get the same result as with tanks... Block code: package com.nik7.upgcraft.block; import com.nik7.upgcraft.tileentities.TestTE; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class TestBlock extends BlockUpgC implements ITileEntityProvider { public TestBlock() { super(Material.cake, "test"); } @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TestTE(); } @Override public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { TileEntity te = world.getTileEntity(pos); if (te instanceof TestTE) return ((TestTE) te).getLight(); return super.getLightValue(state, world, pos); } } TileEntity code: package com.nik7.upgcraft.tileentities; import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ITickable; public class TestTE extends TileEntity implements ITickable { private int l = 0; private int tick = 0; private boolean up = true; public int getLight() { worldObj.notifyLightSet(pos); return l; } @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setInteger("l", l); } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); l = compound.getInteger("l"); } @Override public Packet<?> getDescriptionPacket() { NBTTagCompound tag = new NBTTagCompound(); writeToNBT(tag); SPacketUpdateTileEntity buff = new SPacketUpdateTileEntity(pos, 0, tag); return buff; } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) { readFromNBT(packet.getNbtCompound()); IBlockState blockState = worldObj.getBlockState(pos); if (blockState != null) { worldObj.notifyBlockUpdate(pos, blockState, blockState, 3); } worldObj.notifyNeighborsOfStateChange(pos, blockType); worldObj.notifyBlockOfStateChange(pos, blockType); } @Override public void update() { if (tick == 0) { if (up) { if (l < 15) l++; else up = false; } else { if (l > 0) l--; else up = true; } IBlockState blockState = worldObj.getBlockState(pos); if (blockState != null) worldObj.notifyBlockUpdate(pos, blockState, blockState, 3); markDirty(); } tick++; tick %= 20 / 2; } }
-
The strange thing is that if I put another light source such as a torch, everything is fine, even when I take off the torch and let only my tank... Edit: After I do that, if i remove also the tank the light remains...
-
I have changed the function in this way: @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) { readFromNBT(packet.getNbtCompound()); IBlockState blockState = worldObj.getBlockState(pos); if (blockState != null) worldObj.notifyBlockUpdate(pos, blockState, blockState, 3); } But I have the same behavior as before...
-
All my tanks extend this class: package com.nik7.upgcraft.tileentities; import com.nik7.upgcraft.block.BlockUpgCFluidTank; import com.nik7.upgcraft.tank.UpgCFluidTank; import com.nik7.upgcraft.util.LogHelper; import com.nik7.upgcraft.util.WorldHelper; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.TileFluidHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.lang.reflect.InvocationTargetException; public abstract class UpgCtileentityFluidTank extends TileFluidHandler implements ITickable { private int meta = 0; private UpgCtileentityFluidTank otherTank; private boolean isTop; private boolean isDouble; private boolean canBeDouble; private int capacity; private int originalCapacity; private Class<? extends UpgCFluidTank> TankClass = null; private boolean isFirst = true; public UpgCtileentityFluidTank(int capacity, boolean canBeDouble, Class<? extends UpgCFluidTank> TankClass) { super(); this.TankClass = TankClass; this.capacity = this.originalCapacity = capacity; this.tank = createTank(capacity); this.isTop = false; this.isDouble = false; this.canBeDouble = canBeDouble; } public UpgCtileentityFluidTank(int capacity, boolean canBeDouble) { this(capacity, canBeDouble, null); } @SideOnly(Side.CLIENT) public void setBlockType(Block blockType) { if (this.blockType == null) this.blockType = blockType; } @SideOnly(Side.CLIENT) public int getBlockMetadataClient() { return this.meta; } @SideOnly(Side.CLIENT) public void setMetadata(int metadata) { this.meta = metadata; } @Override public void writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); tag.setBoolean("isDouble", this.isDouble); tag.setBoolean("isTop", this.isTop); } @Override public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); this.isDouble = tag.getBoolean("isDouble"); this.isTop = tag.getBoolean("isTop"); if (canBeDouble && isDouble) { capacity = 2 * originalCapacity; } else capacity = originalCapacity; this.tank.setCapacity(capacity); } @Override public Packet getDescriptionPacket() { NBTTagCompound tag = new NBTTagCompound(); writeToNBT(tag); return new SPacketUpdateTileEntity(pos, -1, tag); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) { readFromNBT(packet.getNbtCompound()); } @Override public void update() { if (isFirst) { isFirst = false; if (isDouble && canBeDouble) { UpgCtileentityFluidTank tank = null; TileEntity te; if (isTop) { te = worldObj.getTileEntity(pos.down()); } else te = worldObj.getTileEntity(pos.up()); if (te != null && te instanceof UpgCtileentityFluidTank) tank = (UpgCtileentityFluidTank) te; if (tank != null) merge(tank); } } reloadOriginalCapacity(); } /*@Override public void onLoad() { }*/ @Override public boolean canRenderBreaking() { return true; } @Override public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { FluidStack result; if (isDouble && isTop) { int realContent = this.tank.getFluidAmount() - originalCapacity; if (realContent < resource.amount) return null; else result = super.drain(from, resource, doDrain); } else result = super.drain(from, resource, doDrain); if (result != null) updateModBlock(); return result; } @Override public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { FluidStack result; if (isDouble && isTop) { int realContent = this.tank.getFluidAmount() - originalCapacity; if (realContent < maxDrain) return null; else result = super.drain(from, maxDrain, doDrain); } else result = super.drain(from, maxDrain, doDrain); if (result != null && doDrain) updateModBlock(); return result; } @Override public int fill(EnumFacing from, FluidStack resource, boolean doFill) { int result = super.fill(from, resource, doFill); if (result > 0 && doFill) updateModBlock(); return result; } private UpgCFluidTank createTank(int capacity) { if (TankClass != null) { UpgCFluidTank result = null; try { result = TankClass.asSubclass(UpgCFluidTank.class).getConstructor(int.class, TileEntity.class).newInstance(capacity, this); } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } return result; } else return new UpgCFluidTank(capacity, this); } public void separateTanks() { if (otherTank != null) otherTank.separateTank(); this.separateTank(); } public FluidStack getFluidFormSingleTank() { if (tank.getFluid() == null) return null; else if (!canBeDouble || !isDouble) { return tank.getFluid(); } else { FluidStack oldFluid = this.tank.getFluid(); int newFluidAmount; int oldFluidAmount = oldFluid.amount; if (isTop) { newFluidAmount = oldFluidAmount - originalCapacity; } else { newFluidAmount = oldFluidAmount > originalCapacity ? originalCapacity : oldFluidAmount; } if (newFluidAmount > 0) { return new FluidStack(oldFluid, newFluidAmount); } } return null; } private void separateTank() { if (isDouble) { isDouble = false; otherTank = null; if (capacity == 2 * originalCapacity) { capacity = originalCapacity; UpgCFluidTank newTank = createTank(capacity); FluidStack oldFluid = this.tank.getFluid(); int newFluidAmount; if (oldFluid != null) { int oldFluidAmount = oldFluid.amount; if (isTop) { newFluidAmount = oldFluidAmount - capacity; } else { newFluidAmount = oldFluidAmount > capacity ? capacity : oldFluidAmount; } if (newFluidAmount > 0) { FluidStack newFluid = new FluidStack(oldFluid, newFluidAmount); newTank.fill(newFluid, true); } } this.tank = newTank; } updateModBlock(); } isTop = isTop && isDouble; } public void findAdjTank() { if (!isDouble) { UpgCtileentityFluidTank otherTank = null; Block myBlock = this.getBlockType(); if (WorldHelper.getBlock(worldObj, pos.up()) == myBlock) { otherTank = (UpgCtileentityFluidTank) worldObj.getTileEntity(pos.up()); } else if (WorldHelper.getBlock(worldObj, pos.down()) == myBlock) otherTank = (UpgCtileentityFluidTank) worldObj.getTileEntity(pos.down()); if (otherTank != null) { otherTank.merge(this); this.merge(otherTank); } } } private boolean fluidAreCompatible(FluidStack otherFluid) { return otherFluid == null || this.tank.getFluid() == null || this.tank.getFluid().isFluidEqual(otherFluid); } private void merge(UpgCtileentityFluidTank otherTank) { if (canBeDouble && canMerge(otherTank) && fluidAreCompatible(otherTank.tank.getFluid())) { this.otherTank = otherTank; isTop = this.pos.getY() > otherTank.pos.getY(); if (capacity == originalCapacity) { capacity = 2 * originalCapacity; if (!isTop) { UpgCFluidTank doubleTank = createTank(capacity); FluidStack myFluid = this.tank.getFluid(); FluidStack otherFluid = otherTank.tank.getFluid(); doubleTank.fill(myFluid, true); doubleTank.fill(otherFluid, true); this.tank = doubleTank; otherTank.tank = doubleTank; } isDouble = true; } else if (capacity == 2 * originalCapacity) { if (!isTop) { otherTank.tank = this.tank; } } else { LogHelper.error("Impossible to merge! capacity = " + capacity); } isTop = isTop && isDouble; updateModBlock(); } } protected abstract boolean canMerge(TileEntity tileEntity); public boolean isTop() { return isTop; } public boolean isDouble() { return isDouble; } public int getFluidLight() { if (tank.getFluid() == null) return 0; return tank.getFluid().getFluid().getLuminosity(tank.getFluid()); } public int getAdjMetadata() { if (otherTank != null) return otherTank.getBlockMetadata(); return -1; } //To avoid infinite recursive calling of the "updateModBlock" method private boolean isNotAlreadyUpdating = true; protected void updateModBlock() { if (isNotAlreadyUpdating && worldObj != null) { isNotAlreadyUpdating = false; //worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this); //worldObj.markBlockForUpdate(pos); //this.worldObj.notifyBlockOfStateChange(pos, getBlockType()); IBlockState blockState = worldObj.getBlockState(pos); if (blockState != null) worldObj.notifyBlockUpdate(pos, blockState, blockState, 3); markDirty(); if (otherTank != null) { otherTank.updateModBlock(); } } isNotAlreadyUpdating = true; } public void reloadOriginalCapacity() { Block block; if ((block = WorldHelper.getBlock(worldObj, pos)) instanceof BlockUpgCFluidTank) { this.originalCapacity = ((BlockUpgCFluidTank) block).getCapacity(); if (this.capacity != this.originalCapacity && this.capacity != this.originalCapacity * 2) { if (isDouble) this.capacity = 2 * this.originalCapacity; else this.capacity = this.originalCapacity; updateModBlock(); } } } public FluidStack getFluid() { if (tank.getFluid() != null) return new FluidStack(tank.getFluid(), tank.getFluidAmount()); else return null; } public float getFillPercentage() { FluidStack fluidStack = tank.getFluid(); if (fluidStack == null) return 0; float result = (float) tank.getFluidAmount() / (float) capacity; if (result > 1) result = 1; return result; } public int getFluidAmount() { return tank.getFluidAmount(); } public int getCapacity() { return capacity; } } The github link https://github.com/nik7007/UpgradeCraft/blob/1.9/src/main/java/com/nik7/upgcraft/tileentities/UpgCtileentityFluidTank.java
-
World has no markBlockForUpdate method...
-
To cause a block update in the tileentity I call this: worldObj.notifyBlockUpdate(pos, blockState, blockState, 3); Is it correct?
-
I know...on 1.7.10 it works perfectly, and I think I do similar things...
-
Yes I cause a block update when there is a change in the fluid level.
-
With the debugger, on client thread and on server thread the return value is always the same, 15 in this case.
-
On the client side the function returns the same value of the server side.
-
I would like my tanks emit the same amount of light of the fluid inside, but this is the result: The code from the block: @Override public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { if (state.getValue(TYPE) == TankType.GLASSES) { TileEntity te = world.getTileEntity(pos); if (te instanceof UpgCtileentityFluidTank) return ((UpgCtileentityFluidTank) te).getFluidLight(); } return super.getLightValue(state, world, pos); } And from the tile entity: public int getFluidLight() { if (tank.getFluid() == null) return 0; return tank.getFluid().getFluid().getLuminosity(tank.getFluid()); } Can anyone help me please?
-
Ok thanks I will try to learn the new system.
-
But in this case I have a custom model to render which changes depending on the arrangement of two tanks, similar to the chest. Two tanks one above the other merge together. I think I better explain with an image, in this one there are all the tanks from my mod in 1.7.10: Can I do the same things without TESR?