This commit is contained in:
Bob 2025-04-07 23:09:09 +02:00
parent fb19e4d93f
commit 955a349793
11 changed files with 198 additions and 19 deletions

View File

@ -1962,7 +1962,7 @@ public class ModBlocks {
drone_crate_provider = new DroneDock().setBlockName("drone_crate_provider").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_provider");
drone_crate_requester = new DroneDock().setBlockName("drone_crate_requester").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_requester");
pneumatic_tube = new PneumoTube().setBlockName("pneumatic_tube").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_tube");
pneumatic_tube = new PneumoTube().setBlockName("pneumatic_tube").setStepSound(ModSoundTypes.pipe).setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_tube");
chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain");

View File

@ -119,7 +119,8 @@ public class PneumoTube extends BlockContainer implements IToolable, IFluidConne
if(rot == ForgeDirection.UNKNOWN) break; //unknown is always valid, simply disables this part
if(rot == oth) continue; //skip if both positions collide
TileEntity tile = Compat.getTileStandard(world, x + rot.offsetX, y + rot.offsetY, z + rot.offsetZ);
if(tile instanceof IInventory && !(tile instanceof TileEntityPneumoTube)) break; //valid if connected to an IInventory
if(tile instanceof TileEntityPneumoTube) continue;
if(tile instanceof IInventory) break; //valid if connected to an IInventory
}
if(player.isSneaking()) tube.ejectionDir = rot; else tube.insertionDir = rot;
@ -207,8 +208,13 @@ public class PneumoTube extends BlockContainer implements IToolable, IFluidConne
public boolean canConnectToAir(IBlockAccess world, int x, int y, int z, ForgeDirection dir) {
TileEntityPneumoTube tube = (TileEntityPneumoTube) world.getTileEntity(x, y, z);
if(tube != null && !tube.isCompressor()) return false;
return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.AIR) && !(world.getTileEntity(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) instanceof TileEntityPneumoTube);
if(tube != null) {
if(!tube.isCompressor()) return false;
if(tube.ejectionDir == dir || tube.insertionDir == dir) return false;
}
TileEntity tile = world.getTileEntity(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
if(tile instanceof TileEntityPneumoTube) return false;
return Library.canConnectFluid(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir, Fluids.AIR);
}
@Override
public boolean canConnect(FluidType type, IBlockAccess world, int x, int y, int z, ForgeDirection dir) {

View File

@ -49,9 +49,7 @@ public class FluidTank {
}
public FluidTank withPressure(int pressure) {
if(this.pressure != pressure) this.setFill(0);
this.pressure = pressure;
return this;
}

View File

@ -7,13 +7,17 @@ import org.lwjgl.opengl.GL11;
import com.hbm.inventory.container.ContainerPneumoTube;
import com.hbm.lib.RefStrings;
import com.hbm.module.ModulePatternMatcher;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toserver.NBTControlPacket;
import com.hbm.render.util.GaugeUtil;
import com.hbm.tileentity.network.TileEntityPneumoTube;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.ResourceLocation;
@ -35,6 +39,9 @@ public class GUIPneumoTube extends GuiInfoContainer {
super.drawScreen(x, y, interp);
tube.compair.renderTankInfo(this, x, y, guiLeft + 7, guiTop + 16, 18, 18);
this.drawCustomInfoStat(x, y, guiLeft + 7, guiTop + 52, 18, 18, x, y, (tube.redstone ? (EnumChatFormatting.GREEN + "ON ") : (EnumChatFormatting.RED + "OFF ")) + EnumChatFormatting.RESET + "with Redstone");
this.drawCustomInfoStat(x, y, guiLeft + 6, guiTop + 36, 20, 8, x, y, "Compressor: " + tube.compair.getPressure() + " PU");
if(this.mc.thePlayer.inventory.getItemStack() == null) {
for(int i = 0; i < 15; ++i) {
@ -46,12 +53,38 @@ public class GUIPneumoTube extends GuiInfoContainer {
}
}
}
@Override
protected void mouseClicked(int x, int y, int i) {
super.mouseClicked(x, y, i);
if(checkClick(x, y, 7, 52, 18, 18)) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
NBTTagCompound data = new NBTTagCompound();
data.setBoolean("redstone", true);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tube.xCoord, tube.yCoord, tube.zCoord));
}
if(checkClick(x, y, 6, 36, 20, 8)) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
NBTTagCompound data = new NBTTagCompound();
data.setBoolean("pressure", true);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tube.xCoord, tube.yCoord, tube.zCoord));
}
if(checkClick(x, y, 128, 30, 14, 26)) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
NBTTagCompound data = new NBTTagCompound();
data.setBoolean("whitelist", true);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, tube.xCoord, tube.yCoord, tube.zCoord));
}
}
@Override
protected void drawGuiContainerForegroundLayer(int i, int j) {
String name = this.tube.hasCustomInventoryName() ? this.tube.getInventoryName() : I18n.format(this.tube.getInventoryName());
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 4210752);
this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
}
@ -61,6 +94,14 @@ public class GUIPneumoTube extends GuiInfoContainer {
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
if(tube.redstone) drawTexturedModalRect(guiLeft + 7, guiTop + 52, 179, 0, 18, 18);
if(tube.whitelist) {
drawTexturedModalRect(guiLeft + 139, guiTop + 33, 176, 0, 3, 6);
} else {
drawTexturedModalRect(guiLeft + 139, guiTop + 47, 176, 0, 3, 6);
}
drawTexturedModalRect(guiLeft + 6 + 4 * (tube.compair.getPressure() - 1), guiTop + 36, 179, 18, 4, 8);
GaugeUtil.drawSmoothGauge(guiLeft + 16, guiTop + 25, this.zLevel, (double) tube.compair.getFill() / (double) tube.compair.getMaxFill(), 5, 2, 1, 0xCA6C43, 0xAB4223);
}

View File

@ -70,8 +70,10 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler {
double lower = 0.3125D;
double upper = 0.6875D;
boolean hasConnections = tile != null && (tile.isCompressor() || tile.isEndpoint());
//Straight along X
if(mask == 0b110000) {
if(mask == 0b110000 && !hasConnections) {
renderer.setRenderBounds(0.0D, lower, lower, 1.0D, upper, upper);
duct.renderSides[4] = false;
duct.renderSides[5] = false;
@ -80,7 +82,7 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler {
duct.resetRenderSides();
// Straight along Z
} else if(mask == 0b000011) {
} else if(mask == 0b000011 && !hasConnections) {
renderer.setRenderBounds(lower, lower, 0.0D, upper, upper, 1.0D);
duct.renderSides[2] = false;
duct.renderSides[3] = false;
@ -93,7 +95,7 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler {
renderer.uvRotateBottom = 0;
//Straight along Y
} else if(mask == 0b001100) {
} else if(mask == 0b001100 && !hasConnections) {
renderer.setRenderBounds(lower, 0.0D, lower, upper, 1.0D, upper);
duct.renderSides[0] = false;
duct.renderSides[1] = false;
@ -180,10 +182,10 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler {
if(dir == Library.NEG_Y) {
duct.renderSides[1] = false;
duct.renderSides[0] = false;
renderer.setRenderBounds(lower, upper, lower, upper, cUpper, upper);
renderer.setRenderBounds(lower, cLower, lower, upper, lower, upper);
renderer.renderStandardBlock(duct, x, y, z); duct.resetRenderSides();
duct.activeIcon = newIcon;
renderer.setRenderBounds(nLower, cUpper, nLower, nUpper, 1, nUpper);
renderer.setRenderBounds(nLower, 0, nLower, nUpper, nLower, nUpper);
renderer.renderStandardBlock(duct, x, y, z);
}
@ -199,10 +201,10 @@ public class RenderPneumoTube implements ISimpleBlockRenderingHandler {
if(dir == Library.NEG_Z) {
duct.renderSides[3] = false;
duct.renderSides[2] = false;
renderer.setRenderBounds(lower, lower, upper, upper, upper, cUpper);
renderer.setRenderBounds(lower, lower, cLower, upper, upper, lower);
renderer.renderStandardBlock(duct, x, y, z); duct.resetRenderSides();
duct.activeIcon = newIcon;
renderer.setRenderBounds(nLower, nLower, cUpper, nUpper, nUpper, 1);
renderer.setRenderBounds(nLower, nLower, 0, nUpper, nUpper, cLower);
renderer.renderStandardBlock(duct, x, y, z);
}

View File

@ -126,10 +126,12 @@ public class TileEntityCraneRouter extends TileEntityMachineBase implements IGUI
public boolean hasPermission(EntityPlayer player) {
return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 20;
}
@Override
public int[] getFilterSlots() {
return new int[]{0, slots.length};
}
@Override
public void receiveControl(NBTTagCompound data) {
if(data.hasKey("toggle")) {

View File

@ -1,13 +1,22 @@
package com.hbm.tileentity.network;
import com.hbm.inventory.container.ContainerPneumoTube;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.inventory.gui.GUIPneumoTube;
import com.hbm.lib.Library;
import com.hbm.module.ModulePatternMatcher;
import com.hbm.tileentity.IControlReceiverFilter;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.uninos.GenNode;
import com.hbm.uninos.UniNodespace;
import com.hbm.uninos.networkproviders.PneumaticNetworkProvider;
import com.hbm.util.Compat;
import com.hbm.util.EnumUtil;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.fluidmk2.IFluidStandardReceiverMK2;
import cpw.mods.fml.relauncher.Side;
@ -15,22 +24,30 @@ import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIProvider, IFluidStandardReceiverMK2 {
public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIProvider, IFluidStandardReceiverMK2, IControlReceiverFilter {
public ModulePatternMatcher pattern = new ModulePatternMatcher(15);
public ForgeDirection insertionDir = ForgeDirection.UNKNOWN;
public ForgeDirection ejectionDir = ForgeDirection.UNKNOWN;
public boolean whitelist = false;
public boolean redstone = false;
public FluidTank compair;
protected PneumaticNode node;
public TileEntityPneumoTube() {
super(17);
this.compair = new FluidTank(Fluids.AIR, 4_000).withPressure(1);
@ -46,25 +63,73 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP
if(!worldObj.isRemote) {
if(this.node == null || this.node.expired) {
this.node = (PneumaticNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER);
if(this.node == null || this.node.expired) {
this.node = (PneumaticNode) new PneumaticNode(new BlockPos(xCoord, yCoord, zCoord)).setConnections(
new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X),
new DirPos(xCoord - 1, yCoord, zCoord, Library.NEG_X),
new DirPos(xCoord, yCoord + 1, zCoord, Library.POS_Y),
new DirPos(xCoord, yCoord - 1, zCoord, Library.NEG_Y),
new DirPos(xCoord, yCoord, zCoord + 1, Library.POS_Z),
new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z)
);
UniNodespace.createNode(worldObj, this.node);
}
}
if(this.isCompressor()) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if(worldObj.getTotalWorldTime() % 10 == 0) for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if(dir != this.insertionDir && dir != this.ejectionDir) {
this.trySubscribe(compair.getTankType(), worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir);
}
}
if(worldObj.getTotalWorldTime() % 40 == 0 && this.compair.getFill() > 0) {
//this.compair.setFill(0);
//worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:weapon.reload.tubeFwoomp", 1.0F, 1.0F);
}
}
if(this.isEndpoint() && this.node != null && this.node.net != null && worldObj.getTotalWorldTime() % 10 == 0) {
TileEntity tile = Compat.getTileStandard(worldObj, xCoord + this.ejectionDir.offsetX, yCoord + this.ejectionDir.offsetY, zCoord + this.ejectionDir.offsetZ);
if(tile instanceof IInventory) this.node.net.addReceiver((IInventory) tile);
}
this.networkPackNT(15);
}
}
public boolean isCompressor() {
return this.insertionDir != ForgeDirection.UNKNOWN;
@Override
public long getReceiverSpeed(FluidType type, int pressure) {
return MathHelper.clamp_int((this.compair.getMaxFill() - this.compair.getFill()) / 25, 1, 100);
}
@Override
public boolean canConnect(FluidType type, ForgeDirection dir) {
return dir != this.insertionDir && dir != this.ejectionDir && type == Fluids.AIR;
}
@Override
public void invalidate() {
super.invalidate();
if(!worldObj.isRemote) {
if(this.node != null) {
UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, PneumaticNetworkProvider.THE_PROVIDER);
}
}
}
public boolean isCompressor() { return this.insertionDir != ForgeDirection.UNKNOWN; }
public boolean isEndpoint() { return this.ejectionDir != ForgeDirection.UNKNOWN; }
@Override
public void serialize(ByteBuf buf) {
super.serialize(buf);
buf.writeBoolean(redstone);
buf.writeBoolean(whitelist);
pattern.serialize(buf);
compair.serialize(buf);
}
@ -72,6 +137,8 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP
@Override
public void deserialize(ByteBuf buf) {
super.deserialize(buf);
this.redstone = buf.readBoolean();
this.whitelist = buf.readBoolean();
pattern.deserialize(buf);
compair.deserialize(buf);
}
@ -107,6 +174,9 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP
this.ejectionDir = EnumUtil.grabEnumSafely(ForgeDirection.class, nbt.getByte("ejectionDir"));
this.compair.readFromNBT(nbt, "tank");
this.pattern.readFromNBT(nbt);
this.whitelist = nbt.getBoolean("whitelist");
this.redstone = nbt.getBoolean("redstone");
}
@Override
@ -116,6 +186,9 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP
nbt.setByte("ejectionDir", (byte) ejectionDir.ordinal());
this.compair.writeToNBT(nbt, "tank");
this.pattern.writeToNBT(nbt);
nbt.setBoolean("whitelist", whitelist);
nbt.setBoolean("redstone", redstone);
}
@Override
@ -128,7 +201,34 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GUIPneumoTube(player.inventory, this);
}
@Override
public void receiveControl(NBTTagCompound data) {
if(data.hasKey("whitelist")) {
this.whitelist = !this.whitelist;
}
if(data.hasKey("redstone")) {
this.redstone = !this.redstone;
}
if(data.hasKey("pressure")) {
int pressure = this.compair.getPressure() + 1;
if(pressure > 5) pressure = 1;
this.compair.withPressure(pressure);
}
this.markDirty();
}
@Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); }
@Override public int[] getFilterSlots() { return new int[] {0, 15}; }
@Override public FluidTank[] getAllTanks() { return new FluidTank[] {compair}; }
@Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {compair}; }
public static class PneumaticNode extends GenNode {
public PneumaticNode(BlockPos... positions) {
super(PneumaticNetworkProvider.THE_PROVIDER, positions);
}
}
}

View File

@ -0,0 +1,11 @@
package com.hbm.uninos.networkproviders;
import com.hbm.tileentity.network.TileEntityPneumoTube.PneumaticNode;
import com.hbm.uninos.NodeNet;
import net.minecraft.inventory.IInventory;
public class PneumaticNetwork extends NodeNet<IInventory, IInventory, PneumaticNode> {
@Override public void update() { }
}

View File

@ -0,0 +1,13 @@
package com.hbm.uninos.networkproviders;
import com.hbm.uninos.INetworkProvider;
public class PneumaticNetworkProvider implements INetworkProvider<PneumaticNetwork>{
public static PneumaticNetworkProvider THE_PROVIDER = new PneumaticNetworkProvider();
@Override
public PneumaticNetwork provideNetwork() {
return new PneumaticNetwork();
}
}

View File

@ -410,6 +410,7 @@ container.paDipole=Dipol
container.paQuadrupole=Quad.
container.paSource=Teilchenquelle
container.plasmaHeater=Plasmaerhitzer
container.pneumoTube=Rohrpost
container.press=Befeuerte Presse
container.puf6_tank=PuF6 Tank
container.pumpjack=Pferdekopfpumpe
@ -702,6 +703,7 @@ hbm.key.toggleHUD=HUD umschalten
hbm.key.trainInv=Zug-Inventar
hbm.key.reload=Nachladen
hbmfluid.air=Druckluft
hbmfluid.amat=Antimaterie
hbmfluid.aromatics=Aromatische Kohlenwasserstoffe
hbmfluid.aschrab=Antischrabidium
@ -4755,6 +4757,7 @@ tile.plant_tall.weed.name=Hanf
tile.plasma.name=Plasma
tile.plasma_heater.name=Plasmaerhitzer
tile.plushie.name=%s Plüschfigur
tile.pneumatic_tube.name=Rohrpost
tile.pole_satellite_receiver.name=Satellitenschüssel
tile.pole_top.name=Antennenspitze
tile.press_preheater.name=Presse-Vorheizer

View File

@ -813,6 +813,7 @@ container.paDipole=Dipole
container.paQuadrupole=Quad.
container.paSource=Particle Source
container.plasmaHeater=Plasma Heater
container.pneumoTube=Pneumatic Tube
container.press=Burner Press
container.puf6_tank=PuF6 Tank
container.pumpjack=Pumpjack
@ -1410,6 +1411,7 @@ hbm.key.toggleHUD=Toggle HUD
hbm.key.trainInv=Train Inventory
hbm.key.reload=Reload
hbmfluid.air=Compressed Air
hbmfluid.alumina=Alumina
hbmfluid.amat=Antimatter
hbmfluid.aromatics=Aromatic Hydrocarbons
@ -5901,6 +5903,7 @@ tile.plant_tall.weed.name=Hemp
tile.plasma.name=Plasma
tile.plasma_heater.name=Plasma Heater
tile.plushie.name=%s Plushie
tile.pneumatic_tube.name=Pneumatic Tube
tile.pole_satellite_receiver.name=Satellite Dish
tile.pole_top.name=Antenna Top
tile.press_preheater.name=Burner Press Preheater