From 3b5dc79af24c5e6c628702b791ad6c06a43998fb Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Thu, 18 May 2023 22:41:38 +0200 Subject: [PATCH] feat: implement arcane bore --- .../net/anvilcraft/thaummach/ClientProxy.java | 17 ++ .../net/anvilcraft/thaummach/CommonProxy.java | 26 ++- .../java/net/anvilcraft/thaummach/GuiID.java | 13 ++ .../net/anvilcraft/thaummach/ITileGui.java | 5 + .../anvilcraft/thaummach/SlotInventory.java | 16 ++ .../thaummach/ThaumicMachinery.java | 5 + .../thaummach/blocks/BlockApparatus.java | 40 +++-- .../thaummach/container/ContainerBore.java | 77 +++++++++ .../thaummach/entities/EntitySingularity.java | 3 - .../net/anvilcraft/thaummach/gui/GuiBore.java | 39 +++++ .../thaummach/packets/PacketFXWisp.java | 49 +++++- .../render/tile/TileBoreRenderer.java | 76 +++++---- .../anvilcraft/thaummach/tiles/TileBore.java | 148 +++++++++--------- .../assets/thaummach/textures/guis/bore.png | Bin 0 -> 4315 bytes 14 files changed, 380 insertions(+), 134 deletions(-) create mode 100644 src/main/java/net/anvilcraft/thaummach/GuiID.java create mode 100644 src/main/java/net/anvilcraft/thaummach/ITileGui.java create mode 100644 src/main/java/net/anvilcraft/thaummach/SlotInventory.java create mode 100644 src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java create mode 100644 src/main/java/net/anvilcraft/thaummach/gui/GuiBore.java create mode 100644 src/main/resources/assets/thaummach/textures/guis/bore.png diff --git a/src/main/java/net/anvilcraft/thaummach/ClientProxy.java b/src/main/java/net/anvilcraft/thaummach/ClientProxy.java index af5ee26..24de908 100644 --- a/src/main/java/net/anvilcraft/thaummach/ClientProxy.java +++ b/src/main/java/net/anvilcraft/thaummach/ClientProxy.java @@ -5,6 +5,7 @@ import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.registry.GameRegistry; import net.anvilcraft.thaummach.entities.EntitySingularity; +import net.anvilcraft.thaummach.gui.GuiBore; import net.anvilcraft.thaummach.render.BlockApparatusRenderer; import net.anvilcraft.thaummach.render.TileSealRenderer; import net.anvilcraft.thaummach.render.entity.EntitySingularityRenderer; @@ -27,6 +28,9 @@ import net.anvilcraft.thaummach.tiles.TileSeal; import net.anvilcraft.thaummach.tiles.TileSoulBrazier; import net.anvilcraft.thaummach.tiles.TileVoidChest; import net.anvilcraft.thaummach.tiles.TileVoidInterface; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; public class ClientProxy extends CommonProxy { @Override @@ -74,4 +78,17 @@ public class ClientProxy extends CommonProxy { TileVoidInterface.class, "voidInterface", new TileVoidInterfaceRenderer() ); } + + @Override + public Object + getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + switch (GuiID.get(id)) { + case BORE: + return new GuiBore(player.inventory, (TileBore) te); + + default: + throw new IllegalArgumentException("ALEC"); + } + } } diff --git a/src/main/java/net/anvilcraft/thaummach/CommonProxy.java b/src/main/java/net/anvilcraft/thaummach/CommonProxy.java index c2d982e..a5c97d0 100644 --- a/src/main/java/net/anvilcraft/thaummach/CommonProxy.java +++ b/src/main/java/net/anvilcraft/thaummach/CommonProxy.java @@ -1,6 +1,8 @@ package net.anvilcraft.thaummach; +import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; +import net.anvilcraft.thaummach.container.ContainerBore; import net.anvilcraft.thaummach.tiles.TileBore; import net.anvilcraft.thaummach.tiles.TileConduit; import net.anvilcraft.thaummach.tiles.TileConduitPump; @@ -15,8 +17,11 @@ import net.anvilcraft.thaummach.tiles.TileSeal; import net.anvilcraft.thaummach.tiles.TileSoulBrazier; import net.anvilcraft.thaummach.tiles.TileVoidChest; import net.anvilcraft.thaummach.tiles.TileVoidInterface; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; -public class CommonProxy { +public class CommonProxy implements IGuiHandler { public void preInit() {} public void init() {} @@ -39,4 +44,23 @@ public class CommonProxy { GameRegistry.registerTileEntity(TileVoidInterface.class, "voidInterface"); GameRegistry.registerTileEntity(TileSoulBrazier.class, "soulBrazier"); } + + @Override + public Object + getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + switch (GuiID.get(id)) { + case BORE: + return new ContainerBore(player.inventory, (TileBore) te); + + default: + throw new IllegalArgumentException("ALEC"); + } + } + + @Override + public Object + getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { + return null; + } } diff --git a/src/main/java/net/anvilcraft/thaummach/GuiID.java b/src/main/java/net/anvilcraft/thaummach/GuiID.java new file mode 100644 index 0000000..00aea0d --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/GuiID.java @@ -0,0 +1,13 @@ +package net.anvilcraft.thaummach; + +public enum GuiID { + BORE; + + public static GuiID get(int id) { + if (id >= 0 && id < GuiID.values().length) { + return GuiID.values()[id]; + } + + return null; + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/ITileGui.java b/src/main/java/net/anvilcraft/thaummach/ITileGui.java new file mode 100644 index 0000000..7f4332b --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/ITileGui.java @@ -0,0 +1,5 @@ +package net.anvilcraft.thaummach; + +public interface ITileGui { + public GuiID getGuiID(); +} diff --git a/src/main/java/net/anvilcraft/thaummach/SlotInventory.java b/src/main/java/net/anvilcraft/thaummach/SlotInventory.java new file mode 100644 index 0000000..4735271 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/SlotInventory.java @@ -0,0 +1,16 @@ +package net.anvilcraft.thaummach; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotInventory extends Slot { + public SlotInventory(IInventory inv, int idx, int x, int y) { + super(inv, idx, x, y); + } + + @Override + public boolean isItemValid(ItemStack stack) { + return this.inventory.isItemValidForSlot(this.slotNumber, stack); + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/ThaumicMachinery.java b/src/main/java/net/anvilcraft/thaummach/ThaumicMachinery.java index 03f962f..b5bf8e2 100644 --- a/src/main/java/net/anvilcraft/thaummach/ThaumicMachinery.java +++ b/src/main/java/net/anvilcraft/thaummach/ThaumicMachinery.java @@ -18,6 +18,9 @@ import net.minecraft.world.World; @Mod(modid = "thaummach") public class ThaumicMachinery { + @Mod.Instance("thaummach") + public static ThaumicMachinery INSTANCE; + @SidedProxy( modId = "thaummach", serverSide = "net.anvilcraft.thaummach.CommonProxy", @@ -38,6 +41,8 @@ public class ThaumicMachinery { new PacketFXSparkle.Handler(), PacketFXSparkle.class, pktid++, Side.CLIENT ); + NetworkRegistry.INSTANCE.registerGuiHandler(this, proxy); + proxy.registerTileEntities(); TMBlocks.init(); TMItems.init(); diff --git a/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatus.java b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatus.java index 7752761..2908815 100644 --- a/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatus.java +++ b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatus.java @@ -2,7 +2,10 @@ package net.anvilcraft.thaummach.blocks; import java.util.Random; +import net.anvilcraft.thaummach.GuiID; +import net.anvilcraft.thaummach.ITileGui; import net.anvilcraft.thaummach.TMTab; +import net.anvilcraft.thaummach.ThaumicMachinery; import net.anvilcraft.thaummach.render.apparatus.IApparatusRenderer; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; @@ -55,9 +58,9 @@ public abstract class BlockApparatus extends BlockContainer { @Override public boolean onBlockActivated( World world, - int i, - int j, - int k, + int x, + int y, + int z, EntityPlayer entityplayer, // useless parameters int alec1, @@ -65,20 +68,21 @@ public abstract class BlockApparatus extends BlockContainer { float alec3, float alec4 ) { - if (!world.isRemote && !entityplayer.isSneaking()) { - // TODO: WTF - //TileEntity te = world.getTileEntity(i, j, k); - //if (te != null && te instanceof ITileGui) { - // ModLoader.openGUI(entityplayer, ((ITileGui) te).getGui(entityplayer)); - // return true; - //} else { - // return false; - //} + if (!entityplayer.isSneaking()) { + TileEntity te = world.getTileEntity(x, y, z); + if (te instanceof ITileGui) { + if (world.isRemote) + return true; + GuiID id = ((ITileGui) te).getGuiID(); - return false; - } else { - return false; + entityplayer.openGui( + ThaumicMachinery.INSTANCE, id.ordinal(), world, x, y, z + ); + + return true; + } } + return false; } @Override @@ -139,4 +143,10 @@ public abstract class BlockApparatus extends BlockContainer { world.setBlockMetadataWithNotify(x, y, z, meta, 3); super.onPostBlockPlaced(world, x, y, z, meta); } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { + super.onNeighborBlockChange(world, x, y, z, neighbor); + world.markBlockForUpdate(x, y, z); + } } diff --git a/src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java b/src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java new file mode 100644 index 0000000..3413960 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java @@ -0,0 +1,77 @@ +package net.anvilcraft.thaummach.container; + +import net.anvilcraft.thaummach.SlotInventory; +import net.anvilcraft.thaummach.items.ItemFocus; +import net.anvilcraft.thaummach.items.ItemSingularity; +import net.anvilcraft.thaummach.tiles.TileBore; +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 ContainerBore extends Container { + private TileBore arcaneBore; + + public ContainerBore(InventoryPlayer inventoryplayer, TileBore tileBore) { + this.arcaneBore = tileBore; + this.addSlotToContainer(new SlotInventory(tileBore, 0, 65, 17)); + this.addSlotToContainer(new SlotInventory(tileBore, 1, 65, 55)); + + int j; + for (j = 0; j < 3; ++j) { + for (int k = 0; k < 9; ++k) { + this.addSlotToContainer( + new Slot(inventoryplayer, k + j * 9 + 9, 8 + k * 18, 84 + j * 18) + ); + } + } + + for (j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inventoryplayer, j, 8 + j * 18, 142)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer entityplayer) { + return this.arcaneBore.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot) super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 2) { + if (!this.mergeItemStack(itemstack1, 2, 38, true)) { + return null; + } + } else if (i >= 2 && i < 38) { + if (itemstack.getItem() instanceof ItemFocus) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) + return null; + } else if (itemstack.getItem() instanceof ItemSingularity) { + if (!this.mergeItemStack(itemstack1, 1, 2, false)) + return null; + } + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + // TODO: WTF + //slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/entities/EntitySingularity.java b/src/main/java/net/anvilcraft/thaummach/entities/EntitySingularity.java index 6d493bb..982cbec 100644 --- a/src/main/java/net/anvilcraft/thaummach/entities/EntitySingularity.java +++ b/src/main/java/net/anvilcraft/thaummach/entities/EntitySingularity.java @@ -75,9 +75,6 @@ public class EntitySingularity extends Entity { @Override public void onUpdate() { - System.out.println( - "AAALEC: " + this.motionX + " " + this.motionY + " " + this.motionZ - ); if (this.fuse-- == 0) { this.explode(); } diff --git a/src/main/java/net/anvilcraft/thaummach/gui/GuiBore.java b/src/main/java/net/anvilcraft/thaummach/gui/GuiBore.java new file mode 100644 index 0000000..601b484 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/gui/GuiBore.java @@ -0,0 +1,39 @@ +package net.anvilcraft.thaummach.gui; + +import net.anvilcraft.thaummach.container.ContainerBore; +import net.anvilcraft.thaummach.tiles.TileBore; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiBore extends GuiContainer { + private TileBore arcaneBore; + + public GuiBore(InventoryPlayer inventoryplayer, TileBore tileBore) { + super(new ContainerBore(inventoryplayer, tileBore)); + this.arcaneBore = tileBore; + } + + @Override + protected void drawGuiContainerForegroundLayer(int alec1, int alec2) { + super.fontRendererObj.drawString("Arcane Bore", 54, 5, 0x404040); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int qq, int ww) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture( + new ResourceLocation("thaummach", "textures/guis/bore.png") + ); + int l = (super.width - super.xSize) / 2; + int i1 = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(l, i1, 0, 0, super.xSize, super.ySize); + if (this.arcaneBore.duration > 0) { + int q = (int + ) ((float) this.arcaneBore.duration / (float) this.arcaneBore.maxDuration + * 46.0F); + this.drawTexturedModalRect(l + 103, i1 + 66 - q, 176, 46 - q, 9, q + 1); + } + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/packets/PacketFXWisp.java b/src/main/java/net/anvilcraft/thaummach/packets/PacketFXWisp.java index 505650d..c393aef 100644 --- a/src/main/java/net/anvilcraft/thaummach/packets/PacketFXWisp.java +++ b/src/main/java/net/anvilcraft/thaummach/packets/PacketFXWisp.java @@ -12,6 +12,11 @@ public class PacketFXWisp implements IPacketFX { double x; double y; double z; + + double mx; + double my; + double mz; + float f; int type; boolean shrink; @@ -29,6 +34,34 @@ public class PacketFXWisp implements IPacketFX { this.type = type; this.shrink = shrink; this.gravity = gravity; + + this.mx = x; + this.my = y; + this.mz = z; + } + + public PacketFXWisp( + double x, + double y, + double z, + double mx, + double my, + double mz, + float f, + int type, + boolean shrink, + float gravity + ) { + this.x = x; + this.y = y; + this.z = z; + this.mx = mx; + this.my = my; + this.mz = mz; + this.f = f; + this.type = type; + this.shrink = shrink; + this.gravity = gravity; } @Override @@ -36,6 +69,9 @@ public class PacketFXWisp implements IPacketFX { this.x = buf.readDouble(); this.y = buf.readDouble(); this.z = buf.readDouble(); + this.mx = buf.readDouble(); + this.my = buf.readDouble(); + this.mz = buf.readDouble(); this.f = buf.readFloat(); this.type = buf.readInt(); this.shrink = buf.readBoolean(); @@ -47,6 +83,9 @@ public class PacketFXWisp implements IPacketFX { buf.writeDouble(this.x); buf.writeDouble(this.y); buf.writeDouble(this.z); + buf.writeDouble(this.mx); + buf.writeDouble(this.my); + buf.writeDouble(this.mz); buf.writeFloat(this.f); buf.writeInt(this.type); buf.writeBoolean(this.shrink); @@ -58,7 +97,15 @@ public class PacketFXWisp implements IPacketFX { @SideOnly(Side.CLIENT) public EntityFX readFX(PacketFXWisp msg) { FXWisp fx = new FXWisp( - Minecraft.getMinecraft().theWorld, msg.x, msg.y, msg.z, msg.f, msg.type + Minecraft.getMinecraft().theWorld, + msg.x, + msg.y, + msg.z, + msg.mx, + msg.my, + msg.mz, + msg.f, + msg.type ); fx.shrink = msg.shrink; diff --git a/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java b/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java index 71180cf..0f0d388 100644 --- a/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java +++ b/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java @@ -1,15 +1,11 @@ package net.anvilcraft.thaummach.render.tile; -import net.anvilcraft.thaummach.TMBlocks; -import net.anvilcraft.thaummach.blocks.BlockApparatusMetal; import net.anvilcraft.thaummach.render.apparatus.ApparatusRenderingHelper; import net.anvilcraft.thaummach.tiles.TileBore; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.init.Items; -import net.minecraft.item.ItemEnderPearl; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import org.lwjgl.opengl.GL11; @@ -19,41 +15,41 @@ public class TileBoreRenderer extends TileEntitySpecialRenderer { private ModelCrystal model = new ModelCrystal(); public void renderEntityAt(TileBore cr, double x, double y, double z, float fq) { - if (true || cr.focus != -1) { - Minecraft mc = Minecraft.getMinecraft(); - int count = mc.thePlayer.ticksExisted; - float bob = 0.0F; - float angleS = (float) cr.rotation; - float jitter = 0.0F; - if (cr.duration > 0 && cr.gettingPower()) { - jitter = (cr.getWorldObj().rand.nextFloat() - - cr.getWorldObj().rand.nextFloat()) - * 0.1F; - } + Minecraft mc = Minecraft.getMinecraft(); + int count = mc.thePlayer.ticksExisted; + float bob = 0.0F; + float angleS = (float) cr.rotation; + float jitter = 0.0F; + if (cr.duration > 0 && cr.gettingPower()) { + jitter + = (cr.getWorldObj().rand.nextFloat() - cr.getWorldObj().rand.nextFloat()) + * 0.1F; + } - this.translateFromOrientation(x, y, z, cr.orientation); - GL11.glTranslatef(0.5F, 0.5F, 0.0F); - GL11.glRotatef(angleS, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.25f, 0.25f, 0.0F); - GL11.glScalef(-0.5f, -0.5f, 1f); - // TODO: rüssel - //ThaumCraftRenderer.renderItemFromTexture( - // mc, - // "/thaumcraft/resources/items.png", - // 16, - // 43 + cr.focus, - // 0.4F, - // 1.5F + jitter, - // true, - // 1.0F, - // 1.0F, - // 1.0F, - // 220, - // 771 - //); + this.translateFromOrientation(x, y, z, cr.orientation); + GL11.glTranslatef(0.5F, 0.5F, 0.0F); + GL11.glRotatef(angleS, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.25f, 0.25f, 0.0F); + GL11.glScalef(-0.5f, -0.5f, 1f); + // TODO: rüssel + //ThaumCraftRenderer.renderItemFromTexture( + // mc, + // "/thaumcraft/resources/items.png", + // 16, + // 43 + cr.focus, + // 0.4F, + // 1.5F + jitter, + // true, + // 1.0F, + // 1.0F, + // 1.0F, + // 220, + // 771 + //); + if (cr.boreItemStacks[0] != null) { mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); - IIcon icon = Items.ender_eye.getIconFromDamage(0); + IIcon icon = cr.boreItemStacks[0].getIconIndex(); ApparatusRenderingHelper.renderItemIn2D( Tessellator.instance, icon.getMaxU(), @@ -62,13 +58,13 @@ public class TileBoreRenderer extends TileEntitySpecialRenderer { icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), - 1.0f, + 0.6f + jitter, 128 ); - - GL11.glPopMatrix(); - GL11.glPopMatrix(); } + + GL11.glPopMatrix(); + GL11.glPopMatrix(); } private void translateFromOrientation(double x, double y, double z, int orientation) { diff --git a/src/main/java/net/anvilcraft/thaummach/tiles/TileBore.java b/src/main/java/net/anvilcraft/thaummach/tiles/TileBore.java index b68c9c4..be4892b 100644 --- a/src/main/java/net/anvilcraft/thaummach/tiles/TileBore.java +++ b/src/main/java/net/anvilcraft/thaummach/tiles/TileBore.java @@ -6,10 +6,14 @@ import java.util.List; import java.util.Map; import dev.tilera.auracore.api.HelperLocation; +import net.anvilcraft.thaummach.GuiID; +import net.anvilcraft.thaummach.ITileGui; import net.anvilcraft.thaummach.TMItems; +import net.anvilcraft.thaummach.ThaumicMachinery; import net.anvilcraft.thaummach.items.ItemFocus; +import net.anvilcraft.thaummach.items.ItemSingularity; +import net.anvilcraft.thaummach.packets.PacketFXWisp; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -25,9 +29,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import thaumcraft.client.fx.particles.FXWisp; -public class TileBore extends TileEntity implements ISidedInventory { +public class TileBore extends TileEntity implements ISidedInventory, ITileGui { public int orientation = 0; public int duration; public int maxDuration; @@ -38,8 +41,9 @@ public class TileBore extends TileEntity implements ISidedInventory { private int area = 2; private int delay = 4; private boolean conserve = false; - private ItemStack[] boreItemStacks; + public ItemStack[] boreItemStacks; private Map entities; + private boolean isActive; public TileBore() { this.orientation = 0; @@ -47,11 +51,6 @@ public class TileBore extends TileEntity implements ISidedInventory { this.entities = new HashMap<>(); } - // TODO: GUIs - //public GuiScreen getGui(EntityPlayer player) { - // return new GuiBore(player.inventory, this); - //} - @Override public void updateEntity() { super.updateEntity(); @@ -65,31 +64,6 @@ public class TileBore extends TileEntity implements ISidedInventory { if (!super.worldObj.isRemote) { int a; - if (this.boreItemStacks[0] != null - && this.boreItemStacks[0].getItem() instanceof ItemFocus) { - if (this.boreItemStacks[0] != null) { - float f = super.worldObj.rand.nextFloat() * 0.8F + 0.1F; - float f1 = super.worldObj.rand.nextFloat() * 0.8F + 0.1F; - float f2 = super.worldObj.rand.nextFloat() * 0.8F + 0.1F; - EntityItem entityitem = new EntityItem( - super.worldObj, - (double) ((float) super.xCoord + f), - (double) ((float) super.yCoord + f1), - (double) ((float) super.zCoord + f2), - ItemStack.copyItemStack(this.boreItemStacks[0]) - ); - float f3 = 0.05F; - entityitem.motionX - = (double) ((float) super.worldObj.rand.nextGaussian() * f3); - entityitem.motionY = (double - ) ((float) super.worldObj.rand.nextGaussian() * f3 + 0.2F); - entityitem.motionZ - = (double) ((float) super.worldObj.rand.nextGaussian() * f3); - super.worldObj.spawnEntityInWorld(entityitem); - this.boreItemStacks[0] = null; - } - } - this.focus = -1; if (this.boreItemStacks[0] != null && this.boreItemStacks[0].getItem() == TMItems.focus0) { @@ -151,6 +125,7 @@ public class TileBore extends TileEntity implements ISidedInventory { if (this.boreItemStacks[0].getItemDamage() > this.boreItemStacks[0].getMaxDamage()) { this.boreItemStacks[0] = null; + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); } break; } @@ -169,20 +144,23 @@ public class TileBore extends TileEntity implements ISidedInventory { HelperLocation hl2 = new HelperLocation(this, this.orientation); hl.moveForwards(1.0); hl2.moveForwards(5.0); - FXWisp ef = new FXWisp( - super.worldObj, - hl.x + 0.5, - hl.y + 0.5, - hl.z + 0.5, - hl2.x + 0.5, - hl2.y + 0.5, - hl2.z + 0.5, - 0.6F, - this.focus == 0 ? 5 : this.focus + + ThaumicMachinery.sendFXPacket( + this.worldObj, + new PacketFXWisp( + hl.x + 0.5, + hl.y + 0.5, + hl.z + 0.5, + hl2.x + 0.5, + hl2.y + 0.5, + hl2.z + 0.5, + 0.6f, + this.focus == 0 ? 5 : this.focus, + true, + 0.0f + ) ); - ef.shrink = true; - ef.blendmode = 1; - Minecraft.getMinecraft().effectRenderer.addEffect(ef); + //ef.blendmode = 1; } Collection c = this.entities.values(); @@ -212,12 +190,10 @@ public class TileBore extends TileEntity implements ISidedInventory { } public boolean gettingPower() { - return super.worldObj.isBlockIndirectlyGettingPowered( - super.xCoord, super.yCoord, super.zCoord - ) - || super.worldObj.isBlockIndirectlyGettingPowered( - super.xCoord, super.yCoord + 1, super.zCoord - ); + return this.worldObj.isRemote ? this.isActive + : super.worldObj.isBlockIndirectlyGettingPowered( + super.xCoord, super.yCoord, super.zCoord + ); } @SuppressWarnings("unchecked") @@ -319,21 +295,20 @@ public class TileBore extends TileEntity implements ISidedInventory { entity.delayBeforeCanPickup = 2; entity.fireResistance = 50; entity.noClip = true; - boolean dp = true; - if (dp) { - FXWisp ef = new FXWisp( - super.worldObj, + ThaumicMachinery.sendFXPacket( + this.worldObj, + new PacketFXWisp( (double) ((float) entity.prevPosX), (double) ((float) entity.prevPosY + 0.1F), (double) ((float) entity.prevPosZ), 0.4F, - this.focus == 0 ? 5 : this.focus - ); - ef.shrink = true; - ef.blendmode = 1; - Minecraft.getMinecraft().effectRenderer.addEffect(ef); - } + this.focus == 0 ? 5 : this.focus, + true, + 0.0f + ) + ); + //ef.blendmode = 1; if (this.entities.get(entity.getEntityId()) == null) { this.entities.put(entity.getEntityId(), entity); @@ -356,16 +331,18 @@ public class TileBore extends TileEntity implements ISidedInventory { entity.motionZ = 0.0; entity.noClip = false; entity.fireResistance = 1; - FXWisp ef = new FXWisp( - super.worldObj, - (double) ((float) entity.prevPosX), - (double) ((float) entity.prevPosY + 0.1F), - (double) ((float) entity.prevPosZ), - 1.0F, - this.focus == 0 ? 5 : this.focus + ThaumicMachinery.sendFXPacket( + this.worldObj, + new PacketFXWisp( + (double) ((float) entity.prevPosX), + (double) ((float) entity.prevPosY + 0.1F), + (double) ((float) entity.prevPosZ), + 1.0F, + this.focus == 0 ? 5 : this.focus, + true, + 0.0f + ) ); - ef.shrink = true; - Minecraft.getMinecraft().effectRenderer.addEffect(ef); switch (this.orientation) { case 0: @@ -679,6 +656,7 @@ public class TileBore extends TileEntity implements ISidedInventory { @Override public void setInventorySlotContents(int i, ItemStack itemstack) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); this.boreItemStacks[i] = itemstack; if (itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) { itemstack.stackSize = this.getInventoryStackLimit(); @@ -862,8 +840,12 @@ public class TileBore extends TileEntity implements ISidedInventory { @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { - // TODO: filtering - return true; + if (slot == 0) { + return stack.getItem() instanceof ItemFocus; + } else if (slot == 1) { + return stack.getItem() instanceof ItemSingularity; + } + return false; } @Override @@ -892,6 +874,13 @@ public class TileBore extends TileEntity implements ISidedInventory { nbt.setShort("orientation", (short) this.orientation); nbt.setShort("duration", (short) this.duration); nbt.setShort("maxDuration", (short) this.maxDuration); + nbt.setBoolean("isActive", this.gettingPower()); + + if (this.boreItemStacks[0] != null) { + NBTTagCompound focus = new NBTTagCompound(); + this.boreItemStacks[0].writeToNBT(focus); + nbt.setTag("focus", focus); + } return new S35PacketUpdateTileEntity( this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), nbt @@ -905,5 +894,16 @@ public class TileBore extends TileEntity implements ISidedInventory { this.orientation = nbt.getShort("orientation"); this.duration = nbt.getShort("duration"); this.maxDuration = nbt.getShort("maxDuration"); + this.isActive = nbt.getBoolean("isActive"); + + if (nbt.hasKey("focus")) { + this.boreItemStacks[0] + = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("focus")); + } + } + + @Override + public GuiID getGuiID() { + return GuiID.BORE; } } diff --git a/src/main/resources/assets/thaummach/textures/guis/bore.png b/src/main/resources/assets/thaummach/textures/guis/bore.png new file mode 100644 index 0000000000000000000000000000000000000000..c81610f546465b75648d365a2a823b6e3763d296 GIT binary patch literal 4315 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