mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
119 lines
4.9 KiB
Java
119 lines
4.9 KiB
Java
package com.hbm.tileentity.machine;
|
|
|
|
import com.hbm.blocks.ModBlocks;
|
|
import com.hbm.blocks.generic.BlockDynamicSlag.TileEntitySlag;
|
|
import com.hbm.inventory.material.Mats.MaterialStack;
|
|
import com.hbm.packet.AuxParticlePacketNT;
|
|
import com.hbm.packet.PacketDispatcher;
|
|
import com.hbm.util.Compat;
|
|
|
|
import api.hbm.block.ICrucibleAcceptor;
|
|
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.util.MovingObjectPosition;
|
|
import net.minecraft.util.Vec3;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
|
|
public class TileEntityFoundrySlagtap extends TileEntityFoundryOutlet implements ICrucibleAcceptor {
|
|
|
|
@Override
|
|
public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) {
|
|
if(filter != null && (filter != stack.material ^ invertFilter)) return false;
|
|
if(isClosed()) return false;
|
|
if(side != ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite()) return false;
|
|
|
|
Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5);
|
|
Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 15, z + 0.5);
|
|
|
|
MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true);
|
|
|
|
if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) {
|
|
|
|
if(stack == null || stack.material == null || stack.amount <= 0) {
|
|
return null;
|
|
}
|
|
|
|
Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5);
|
|
Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 15, z + 0.5);
|
|
|
|
MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true);
|
|
|
|
if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) {
|
|
return null;
|
|
}
|
|
|
|
Block hit = world.getBlock(mop.blockX, mop.blockY, mop.blockZ);
|
|
Block above = world.getBlock(mop.blockX, mop.blockY + 1, mop.blockZ);
|
|
|
|
boolean didFlow = false;
|
|
|
|
if(hit == ModBlocks.slag) {
|
|
TileEntitySlag tile = (TileEntitySlag) Compat.getTileStandard(world, mop.blockX, mop.blockY, mop.blockZ);
|
|
if(tile.mat == stack.material) {
|
|
int transfer = Math.min(tile.maxAmount - tile.amount, stack.amount);
|
|
tile.amount += transfer;
|
|
stack.amount -= transfer;
|
|
didFlow = didFlow || transfer > 0;
|
|
world.markBlockForUpdate(mop.blockX, mop.blockY, mop.blockZ);
|
|
world.scheduleBlockUpdate(mop.blockX, mop.blockY, mop.blockZ, ModBlocks.slag, 1);
|
|
}
|
|
} else if(hit.isReplaceable(world, mop.blockX, mop.blockY, mop.blockZ)) {
|
|
world.setBlock(mop.blockX, mop.blockY, mop.blockZ, ModBlocks.slag);
|
|
TileEntitySlag tile = (TileEntitySlag) Compat.getTileStandard(world, mop.blockX, mop.blockY, mop.blockZ);
|
|
tile.mat = stack.material;
|
|
int transfer = Math.min(tile.maxAmount, stack.amount);
|
|
tile.amount += transfer;
|
|
stack.amount -= transfer;
|
|
didFlow = didFlow || transfer > 0;
|
|
world.markBlockForUpdate(mop.blockX, mop.blockY, mop.blockZ);
|
|
world.scheduleBlockUpdate(mop.blockX, mop.blockY, mop.blockZ, ModBlocks.slag, 1);
|
|
}
|
|
|
|
if(stack.amount > 0 && above.isReplaceable(world, mop.blockX, mop.blockY + 1, mop.blockZ)) {
|
|
world.setBlock(mop.blockX, mop.blockY + 1, mop.blockZ, ModBlocks.slag);
|
|
TileEntitySlag tile = (TileEntitySlag) Compat.getTileStandard(world, mop.blockX, mop.blockY + 1, mop.blockZ);
|
|
tile.mat = stack.material;
|
|
int transfer = Math.min(tile.maxAmount, stack.amount);
|
|
tile.amount += transfer;
|
|
stack.amount -= transfer;
|
|
didFlow = didFlow || transfer > 0;
|
|
world.markBlockForUpdate(mop.blockX, mop.blockY + 1, mop.blockZ);
|
|
world.scheduleBlockUpdate(mop.blockX, mop.blockY + 1, mop.blockZ, ModBlocks.slag, 1);
|
|
}
|
|
|
|
if(didFlow) {
|
|
ForgeDirection dir = side.getOpposite();
|
|
double hitY = mop.blockY;
|
|
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
data.setString("type", "foundry");
|
|
data.setInteger("color", stack.material.moltenColor);
|
|
data.setByte("dir", (byte) dir.ordinal());
|
|
data.setFloat("off", 0.375F);
|
|
data.setFloat("base", 0F);
|
|
data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(hitY))));
|
|
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D - dir.offsetX * 0.125, yCoord + 0.125, zCoord + 0.5D - dir.offsetZ * 0.125), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord, zCoord + 0.5, 50));
|
|
}
|
|
|
|
if(stack.amount <= 0) {
|
|
stack = null;
|
|
}
|
|
|
|
return stack;
|
|
}
|
|
|
|
@Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; }
|
|
@Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; }
|
|
}
|