loading dock for drones

This commit is contained in:
Boblet 2023-09-21 15:30:32 +02:00
parent ac1d496bf6
commit b1dd140737
8 changed files with 514 additions and 23 deletions

View File

@ -7,9 +7,11 @@ import java.util.Random;
import com.hbm.blocks.ILookOverlay;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.tileentity.network.TileEntityDroneCrate;
import com.hbm.util.I18nUtil;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
@ -54,6 +56,18 @@ public class DroneCrate extends BlockContainer implements ILookOverlay, ITooltip
public IIcon getIcon(int side, int metadata) {
return side == 1 ? this.iconTop : (side == 0 ? this.iconBottom : this.blockIcon);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if(world.isRemote) {
return true;
} else if(!player.isSneaking()) {
FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z);
return true;
} else {
return false;
}
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int meta) {

View File

@ -1,14 +1,20 @@
package com.hbm.entity.item;
import com.hbm.inventory.FluidStack;
import com.hbm.inventory.fluid.Fluids;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public class EntityDeliveryDrone extends Entity {
public class EntityDeliveryDrone extends Entity implements IInventory {
protected int turnProgress;
protected double syncPosX;
@ -17,6 +23,9 @@ public class EntityDeliveryDrone extends Entity {
@SideOnly(Side.CLIENT) protected double velocityX;
@SideOnly(Side.CLIENT) protected double velocityY;
@SideOnly(Side.CLIENT) protected double velocityZ;
protected ItemStack[] slots = new ItemStack[this.getSizeInventory()];
public FluidStack fluid;
public double targetX = -1;
public double targetY = -1;
@ -60,7 +69,20 @@ public class EntityDeliveryDrone extends Entity {
@Override
protected void entityInit() {
this.dataWatcher.addObject(10, new Integer(0));
this.dataWatcher.addObject(10, new Byte((byte) 0));
}
/**
* 0: Empty<br>
* 1: Crate<br>
* 2: Barrel<br>
*/
public void setAppearance(int style) {
this.dataWatcher.updateObject(10, (byte) style);
}
public int getAppearance() {
return this.dataWatcher.getWatchableObjectByte(10);
}
@Override
@ -107,15 +129,57 @@ public class EntityDeliveryDrone extends Entity {
public double getSpeed() {
return 0.125D;
}
@Override
protected void readEntityFromNBT(NBTTagCompound p_70037_1_) {
protected void writeEntityToNBT(NBTTagCompound nbt) {
nbt.setDouble("tX", targetX);
nbt.setDouble("tY", targetY);
nbt.setDouble("tZ", targetZ);
NBTTagList nbttaglist = new NBTTagList();
for(int i = 0; i < this.slots.length; ++i) {
if(this.slots[i] != null) {
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound1.setByte("Slot", (byte) i);
this.slots[i].writeToNBT(nbttagcompound1);
nbttaglist.appendTag(nbttagcompound1);
}
}
nbt.setTag("Items", nbttaglist);
if(fluid != null) {
nbt.setString("fluidType", fluid.type.getUnlocalizedName());
nbt.setInteger("fluidAmount", fluid.fill);
}
}
@Override
protected void writeEntityToNBT(NBTTagCompound p_70014_1_) {
protected void readEntityFromNBT(NBTTagCompound nbt) {
if(nbt.hasKey("tY")) {
this.targetX = nbt.getDouble("tX");
this.targetY = nbt.getDouble("tY");
this.targetZ = nbt.getDouble("tZ");
}
NBTTagList nbttaglist = nbt.getTagList("Items", 10);
this.slots = new ItemStack[this.getSizeInventory()];
for(int i = 0; i < nbttaglist.tagCount(); ++i) {
NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
int j = nbttagcompound1.getByte("Slot") & 255;
if(j >= 0 && j < this.slots.length) {
this.slots[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
}
}
if(nbt.hasKey("fluidType")) {
this.fluid = new FluidStack(Fluids.fromName(nbt.getString("fluidType")), nbt.getInteger("fluidAmount"));
}
}
@SideOnly(Side.CLIENT)
@ -135,4 +199,63 @@ public class EntityDeliveryDrone extends Entity {
this.motionY = this.velocityY;
this.motionZ = this.velocityZ;
}
@Override
public ItemStack getStackInSlot(int slot) {
return slots[slot];
}
@Override
public ItemStack decrStackSize(int slot, int amount) {
if(this.slots[slot] != null) {
ItemStack itemstack;
if(this.slots[slot].stackSize <= amount) {
itemstack = this.slots[slot];
this.slots[slot] = null;
return itemstack;
} else {
itemstack = this.slots[slot].splitStack(amount);
if(this.slots[slot].stackSize == 0) {
this.slots[slot] = null;
}
return itemstack;
}
} else {
return null;
}
}
@Override
public ItemStack getStackInSlotOnClosing(int slot) {
if(this.slots[slot] != null) {
ItemStack itemstack = this.slots[slot];
this.slots[slot] = null;
return itemstack;
} else {
return null;
}
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
this.slots[slot] = stack;
if(stack != null && stack.stackSize > this.getInventoryStackLimit()) {
stack.stackSize = this.getInventoryStackLimit();
}
}
@Override public int getSizeInventory() { return 18; }
@Override public String getInventoryName() { return "container.drone"; }
@Override public int getInventoryStackLimit() { return 64; }
@Override public boolean hasCustomInventoryName() { return false; }
@Override public boolean isUseableByPlayer(EntityPlayer player) { return false; }
@Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return false; }
@Override public void markDirty() { }
@Override public void openInventory() { }
@Override public void closeInventory() { }
}

View File

@ -0,0 +1,79 @@
package com.hbm.inventory.container;
import com.hbm.items.machine.IItemFluidIdentifier;
import com.hbm.tileentity.network.TileEntityDroneCrate;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class ContainerDroneCrate extends Container {
protected TileEntityDroneCrate crate;
public ContainerDroneCrate(InventoryPlayer invPlayer, TileEntityDroneCrate inserter) {
this.crate = inserter;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 6; j++) {
this.addSlotToContainer(new Slot(inserter, j + i * 6, 8 + j * 18, 17 + i * 18));
}
}
this.addSlotToContainer(new Slot(inserter, 18, 125, 53));
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 9; j++) {
this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 103 + i * 18));
}
}
for(int i = 0; i < 9; i++) {
this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 161));
}
}
@Override
public ItemStack transferStackInSlot(EntityPlayer player, int slot) {
ItemStack var3 = null;
Slot var4 = (Slot) this.inventorySlots.get(slot);
if(var4 != null && var4.getHasStack()) {
ItemStack var5 = var4.getStack();
var3 = var5.copy();
if(slot <= crate.getSizeInventory() - 1) {
if(!this.mergeItemStack(var5, crate.getSizeInventory(), this.inventorySlots.size(), true)) {
return null;
}
} else {
if(var3.getItem() instanceof IItemFluidIdentifier) {
if(!this.mergeItemStack(var5, 18, 19, false))
return null;
} else if(!this.mergeItemStack(var5, 0, 18, false)) {
return null;
}
return null;
}
if(var5.stackSize == 0) {
var4.putStack((ItemStack) null);
} else {
var4.onSlotChanged();
}
var4.onPickupFromSlot(player, var5);
}
return var3;
}
@Override
public boolean canInteractWith(EntityPlayer player) {
return crate.isUseableByPlayer(player);
}
}

View File

@ -0,0 +1,75 @@
package com.hbm.inventory.gui;
import org.lwjgl.opengl.GL11;
import com.hbm.inventory.container.ContainerDroneCrate;
import com.hbm.lib.RefStrings;
import com.hbm.packet.NBTControlPacket;
import com.hbm.packet.PacketDispatcher;
import com.hbm.tileentity.network.TileEntityDroneCrate;
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.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
public class GUIDroneCrate extends GuiInfoContainer {
private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crate_drone.png");
private TileEntityDroneCrate crate;
public GUIDroneCrate(InventoryPlayer invPlayer, TileEntityDroneCrate crate) {
super(new ContainerDroneCrate(invPlayer, crate));
this.crate = crate;
this.xSize = 176;
this.ySize = 185;
}
@Override
public void drawScreen(int x, int y, float interp) {
super.drawScreen(x, y, interp);
crate.tank.renderTankInfo(this, x, y, guiLeft + 125, guiTop + 17, 16, 34);
}
@Override
protected void mouseClicked(int x, int y, int i) {
super.mouseClicked(x, y, i);
String op = null;
// Toggle type
if(guiLeft + 151 <= x && guiLeft + 151 + 18 > x && guiTop + 16 < y && guiTop + 16 + 18 >= y) op = "type";
// Toggle mode
if(guiLeft + 151 <= x && guiLeft + 151 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) op = "mode";
if(op != null) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
NBTTagCompound data = new NBTTagCompound();
data.setBoolean(op, true);
PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, crate.xCoord, crate.yCoord, crate.zCoord));
}
}
@Override
protected void drawGuiContainerForegroundLayer(int i, int j) {
String name = this.crate.hasCustomInventoryName() ? this.crate.getInventoryName() : I18n.format(this.crate.getInventoryName());
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
}
@Override
protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
drawTexturedModalRect(guiLeft + 151, guiTop + 16, 194, crate.itemType ? 0 : 18, 18, 18);
drawTexturedModalRect(guiLeft + 151, guiTop + 52, 176, crate.sendingMode ? 18 : 0, 18, 18);
crate.tank.renderTank(guiLeft + 125, guiTop + 51, this.zLevel, 16, 34);
}
}

View File

@ -1,7 +1,8 @@
package com.hbm.render.item;
package com.hbm.render.entity.item;
import org.lwjgl.opengl.GL11;
import com.hbm.entity.item.EntityDeliveryDrone;
import com.hbm.main.ResourceManager;
import net.minecraft.client.renderer.entity.Render;
@ -16,17 +17,25 @@ public class RenderDeliveryDrone extends Render {
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
GL11.glDisable(GL11.GL_CULL_FACE);
GL11.glShadeModel(GL11.GL_SMOOTH);
bindTexture(ResourceManager.delivery_drone_tex);
ResourceManager.delivery_drone.renderPart("Drone");
ResourceManager.delivery_drone.renderPart("Barrel");
EntityDeliveryDrone drone = (EntityDeliveryDrone) entity;
int style = drone.getAppearance();
if(style == 1) ResourceManager.delivery_drone.renderPart("Crate");
if(style == 2) ResourceManager.delivery_drone.renderPart("Barrel");
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glPopMatrix();
}
@Override
protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
return null;
protected ResourceLocation getEntityTexture(Entity drone) {
return ResourceManager.delivery_drone_tex;
}
}

View File

@ -3,29 +3,44 @@ package com.hbm.tileentity.network;
import java.util.List;
import com.hbm.entity.item.EntityDeliveryDrone;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.inventory.FluidStack;
import com.hbm.inventory.container.ContainerDroneCrate;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.inventory.gui.GUIDroneCrate;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.INBTPacketReceiver;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.fauxpointtwelve.BlockPos;
import api.hbm.fluid.IFluidStandardTransceiver;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIProvider, INBTPacketReceiver, IDroneLinkable {
public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIProvider, INBTPacketReceiver, IControlReceiver, IDroneLinkable, IFluidStandardTransceiver {
public FluidTank tank;
public int nextX = -1;
public int nextY = -1;
public int nextZ = -1;
public boolean sendingMode = false;
public boolean itemType = true;
public TileEntityDroneCrate() {
super(19);
this.tank = new FluidTank(Fluids.NONE, 64_000);
}
@Override
@ -38,22 +53,141 @@ public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIP
if(!worldObj.isRemote) {
this.tank.setType(18, slots);
if(sendingMode && !itemType && worldObj.getTotalWorldTime() % 20 == 0) {
this.subscribeToAllAround(tank.getTankType(), this);
}
if(!sendingMode && !itemType && worldObj.getTotalWorldTime() % 20 == 0) {
this.sendFluidToAll(tank, this);
}
if(nextY != -1) {
List<EntityDeliveryDrone> drones = worldObj.getEntitiesWithinAABB(EntityDeliveryDrone.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 2, zCoord + 1));
for(EntityDeliveryDrone drone : drones) {
if(Vec3.createVectorHelper(drone.motionX, drone.motionY, drone.motionZ).lengthVector() < 0.05) {
drone.setTarget(nextX + 0.5, nextY, nextZ + 0.5);
if(sendingMode && itemType) loadItems(drone);
if(!sendingMode && itemType) unloadItems(drone);
if(sendingMode && !itemType) loadFluid(drone);
if(!sendingMode && !itemType) unloadFluid(drone);
}
}
}
NBTTagCompound data = new NBTTagCompound();
data.setIntArray("pos", new int[] {nextX, nextY, nextZ});
data.setBoolean("mode", sendingMode);
data.setBoolean("type", itemType);
tank.writeToNBT(data, "t");
INBTPacketReceiver.networkPack(this, data, 25);
}
}
@Override
public void networkUnpack(NBTTagCompound nbt) {
int[] pos = nbt.getIntArray("pos");
this.nextX = pos[0];
this.nextY = pos[1];
this.nextZ = pos[2];
this.sendingMode = nbt.getBoolean("mode");
this.itemType = nbt.getBoolean("type");
tank.readFromNBT(nbt, "t");
}
protected void loadItems(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 0) return;
boolean loaded = false;
for(int i = 0; i < 18; i++) {
if(this.slots[i] != null) {
loaded = true;
drone.setInventorySlotContents(i, this.slots[i].copy());
this.slots[i] = null;
}
}
if(loaded) {
this.markDirty();
drone.setAppearance(1);
}
}
protected void unloadItems(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 1) return;
boolean emptied = true;
for(int i = 0; i < 18; i++) {
ItemStack droneSlot = drone.getStackInSlot(i);
if(this.slots[i] == null && droneSlot != null) {
this.slots[i] = droneSlot.copy();
drone.setInventorySlotContents(i, null);
} else if(this.slots[i] != null && droneSlot != null) {
emptied = false;
}
}
this.markDirty();
if(emptied) drone.setAppearance(0);
}
protected void loadFluid(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 0) return;
if(this.tank.getFill() > 0) {
drone.fluid = new FluidStack(tank.getTankType(), tank.getFill());
this.tank.setFill(0);
drone.setAppearance(2);
this.markDirty();
}
}
protected void unloadFluid(EntityDeliveryDrone drone) {
if(drone.getAppearance() != 2) return;
if(drone.fluid != null && drone.fluid.type == tank.getTankType()) {
if(drone.fluid.fill + tank.getFill() <= tank.getMaxFill()) {
tank.setFill(tank.getFill() + drone.fluid.fill);
drone.fluid = null;
drone.setAppearance(0);
} else {
int overshoot = drone.fluid.fill + tank.getFill() - tank.getMaxFill();
tank.setFill(tank.getMaxFill());
drone.fluid.fill = overshoot;
}
this.markDirty();
}
}
@Override
public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
return new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
return true;
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
return true;
}
@Override
public BlockPos getPoint() {
return new BlockPos(xCoord, yCoord + 1, zCoord);
@ -66,23 +200,72 @@ public class TileEntityDroneCrate extends TileEntityMachineBase implements IGUIP
this.nextZ = z;
this.markDirty();
}
@Override
public void networkUnpack(NBTTagCompound nbt) {
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
int[] pos = nbt.getIntArray("pos");
this.nextX = pos[0];
this.nextY = pos[1];
this.nextZ = pos[2];
this.sendingMode = nbt.getBoolean("mode");
this.itemType = nbt.getBoolean("type");
tank.readFromNBT(nbt, "t");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setIntArray("pos", new int[] {nextX, nextY, nextZ});
nbt.setBoolean("mode", sendingMode);
nbt.setBoolean("type", itemType);
tank.writeToNBT(nbt, "t");
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return null;
return new ContainerDroneCrate(player.inventory, this);
}
@Override
@SideOnly(Side.CLIENT)
public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return null;
return new GUIDroneCrate(player.inventory, this);
}
@Override
public boolean hasPermission(EntityPlayer player) {
return this.isUseableByPlayer(player);
}
@Override
public void receiveControl(NBTTagCompound data) {
if(data.hasKey("mode")) {
this.sendingMode = !this.sendingMode;
this.markChanged();
}
if(data.hasKey("type")) {
this.itemType = !this.itemType;
this.markChanged();
}
}
@Override
public FluidTank[] getAllTanks() {
return new FluidTank[] { tank };
}
@Override
public FluidTank[] getSendingTanks() {
return !sendingMode && !itemType ? new FluidTank[] { tank } : new FluidTank[0];
}
@Override
public FluidTank[] getReceivingTanks() {
return sendingMode && !itemType ? new FluidTank[] { tank } : new FluidTank[0];
}
}

View File

@ -47,15 +47,6 @@ public class TileEntityDroneWaypoint extends TileEntity implements INBTPacketRec
double z = zCoord + height * dir.offsetZ + 0.5;
worldObj.spawnParticle("reddust", x, y, z, 0, 0, 0);
/*Vec3 vec = Vec3.createVectorHelper(nextX + 0.5 - x, nextY + 0.5 - y, nextZ + 0.5 - z);
double speed = Math.min(vec.lengthVector(), 0.5);
double mX = vec.xCoord * speed;
double mY = vec.yCoord * speed;
double mZ = vec.zCoord * speed;
vec = vec.normalize();
worldObj.spawnParticle("crit", x, y, z, mX, mY, mZ);*/
}
}
}
@ -87,4 +78,21 @@ public class TileEntityDroneWaypoint extends TileEntity implements INBTPacketRec
height += h;
height = MathHelper.clamp_int(height, 1, 15);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
int[] pos = nbt.getIntArray("pos");
this.nextX = pos[0];
this.nextY = pos[1];
this.nextZ = pos[2];
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setIntArray("pos", new int[] {nextX, nextY, nextZ});
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B