From 02f2eb00bd0b67a02b7b0230766f3af6550b6c47 Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Sun, 16 Feb 2014 15:28:50 -0600 Subject: [PATCH] Network tool is now powered by black magic. --- client/ClientHelper.java | 7 ++ core/CommonHelper.java | 3 + core/sync/AppEngPacketHandlerBase.java | 3 + core/sync/packets/PacketClick.java | 58 ++++++++++++++ items/tools/ToolNetworkTool.java | 107 +++++++++++++++++-------- server/ServerHelper.java | 7 ++ 6 files changed, 151 insertions(+), 34 deletions(-) create mode 100644 core/sync/packets/PacketClick.java diff --git a/client/ClientHelper.java b/client/ClientHelper.java index db9fe110..3fd59745 100644 --- a/client/ClientHelper.java +++ b/client/ClientHelper.java @@ -9,6 +9,7 @@ import net.minecraft.client.particle.EntityFX; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; @@ -115,4 +116,10 @@ public class ClientHelper extends ServerHelper return r.nextInt( 2 * (setting + 1) ) == 0; } + @Override + public MovingObjectPosition getMOP() + { + return Minecraft.getMinecraft().objectMouseOver; + } + } \ No newline at end of file diff --git a/core/CommonHelper.java b/core/CommonHelper.java index f5ac2cbe..738b906d 100644 --- a/core/CommonHelper.java +++ b/core/CommonHelper.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Random; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import appeng.block.AEBaseBlock; import appeng.core.sync.AppEngPacket; @@ -31,4 +32,6 @@ public abstract class CommonHelper public abstract boolean shouldAddParticles(Random r); + public abstract MovingObjectPosition getMOP(); + } diff --git a/core/sync/AppEngPacketHandlerBase.java b/core/sync/AppEngPacketHandlerBase.java index 6058e59b..1e518c66 100644 --- a/core/sync/AppEngPacketHandlerBase.java +++ b/core/sync/AppEngPacketHandlerBase.java @@ -7,6 +7,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; +import appeng.core.sync.packets.PacketClick; import appeng.core.sync.packets.PacketConfigButton; import appeng.core.sync.packets.PacketInventoryAction; import appeng.core.sync.packets.PacketLightning; @@ -49,6 +50,8 @@ public class AppEngPacketHandlerBase PACKET_PROGRESS_VALUE(PacketProgressBar.class), + PACKET_CLICK(PacketClick.class), + PACKET_SWITCH_GUIS(PacketSwitchGuis.class); final public Class pc; diff --git a/core/sync/packets/PacketClick.java b/core/sync/packets/PacketClick.java new file mode 100644 index 00000000..e2d1c1a1 --- /dev/null +++ b/core/sync/packets/PacketClick.java @@ -0,0 +1,58 @@ +package appeng.core.sync.packets; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.io.IOException; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import appeng.core.sync.AppEngPacket; +import appeng.core.sync.network.INetworkInfo; +import appeng.items.tools.ToolNetworkTool; + +public class PacketClick extends AppEngPacket +{ + + int x, y, z, side; + float hitX, hitY, hitZ; + + // automatic. + public PacketClick(ByteBuf stream) throws IOException { + x = stream.readInt(); + y = stream.readInt(); + z = stream.readInt(); + side = stream.readInt(); + hitX = stream.readFloat(); + hitY = stream.readFloat(); + hitZ = stream.readFloat(); + } + + @Override + public void serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player) + { + ItemStack is = player.inventory.getCurrentItem(); + if ( is != null && is.getItem() instanceof ToolNetworkTool ) + { + ToolNetworkTool tnt = (ToolNetworkTool) is.getItem(); + tnt.serverSideToolLogic( is, player, player.worldObj, x, y, z, side, hitX, hitY, hitZ ); + } + } + + // api + public PacketClick(int x, int y, int z, int side, float hitX, float hitY, float hitZ) throws IOException { + + ByteBuf data = Unpooled.buffer(); + + data.writeInt( getPacketID() ); + data.writeInt( this.x = x ); + data.writeInt( this.y = y ); + data.writeInt( this.z = z ); + data.writeInt( this.side = side ); + data.writeFloat( this.hitX = hitX ); + data.writeFloat( this.hitY = hitY ); + data.writeFloat( this.hitZ = hitZ ); + + configureWrite( data ); + } +} diff --git a/items/tools/ToolNetworkTool.java b/items/tools/ToolNetworkTool.java index dec8f00a..18f18974 100644 --- a/items/tools/ToolNetworkTool.java +++ b/items/tools/ToolNetworkTool.java @@ -1,20 +1,26 @@ package appeng.items.tools; +import java.io.IOException; import java.util.EnumSet; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.implementations.guiobjects.IGuiItem; import appeng.api.implementations.guiobjects.IGuiItemObject; import appeng.api.implementations.items.IAEWrench; import appeng.api.networking.IGridHost; +import appeng.client.ClientHelper; import appeng.container.AEBaseContainer; +import appeng.core.AELog; import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketClick; import appeng.items.AEBaseItem; import appeng.items.contents.NetworkToolViewer; import appeng.util.Platform; @@ -39,51 +45,84 @@ public class ToolNetworkTool extends AEBaseItem implements IGuiItem, IAEWrench, } @Override - public boolean onItemUseFirst(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) - { - Block b = world.getBlock( x, y, z ); - if ( b != null && !player.isSneaking() ) - { - TileEntity te = world.getTileEntity( x, y, z ); - if ( !(te instanceof IGridHost) ) - { - if ( b.rotateBlock( world, x, y, z, ForgeDirection.getOrientation( side ) ) ) - { - player.swingItem(); - return !world.isRemote; - } - } - } - return false; - } - - @Override - public boolean onItemUse(ItemStack is, EntityPlayer p, World w, int x, int y, int z, int side, float hitx, float hity, float hitz) + public ItemStack onItemRightClick(ItemStack it, World w, EntityPlayer p) { if ( Platform.isClient() ) - return false; - - if ( !p.isSneaking() ) { - if ( p.openContainer instanceof AEBaseContainer ) - return true; + MovingObjectPosition mop = ClientHelper.proxy.getMOP(); - TileEntity te = w.getTileEntity( x, y, z ); - if ( te instanceof IGridHost ) - Platform.openGUI( p, te, ForgeDirection.getOrientation( side ), GuiBridge.GUI_NETWORK_STATUS ); + if ( mop == null ) + { + onItemUseFirst( it, p, w, 0, 0, 0, -1, 0, 0, 0 ); + } else - Platform.openGUI( p, null, ForgeDirection.UNKNOWN, GuiBridge.GUI_NETWORK_TOOL ); - return true; + { + int i = mop.blockX; + int j = mop.blockY; + int k = mop.blockZ; + + if ( w.getBlock( i, j, k ).isAir( w, i, j, k ) ) + onItemUseFirst( it, p, w, 0, 0, 0, -1, 0, 0, 0 ); + } } - return false; + return it; } @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + public boolean onItemUseFirst(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { - onItemUse( par1ItemStack, par3EntityPlayer, par2World, 0, 0, 0, -1, 0, 0, 0 ); - return super.onItemRightClick( par1ItemStack, par2World, par3EntityPlayer ); + if ( Platform.isClient() ) + { + try + { + NetworkHandler.instance.sendToServer( new PacketClick( x, y, z, side, hitX, hitY, hitZ ) ); + } + catch (IOException e) + { + AELog.error( e ); + } + } + return true; + } + + public boolean serverSideToolLogic(ItemStack is, EntityPlayer p, World w, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + if ( side >= 0 ) + { + Block b = w.getBlock( x, y, z ); + if ( b != null && !p.isSneaking() ) + { + TileEntity te = w.getTileEntity( x, y, z ); + if ( !(te instanceof IGridHost) ) + { + if ( b.rotateBlock( w, x, y, z, ForgeDirection.getOrientation( side ) ) ) + { + p.swingItem(); + return !w.isRemote; + } + } + } + + if ( !p.isSneaking() ) + { + if ( p.openContainer instanceof AEBaseContainer ) + return true; + + TileEntity te = w.getTileEntity( x, y, z ); + if ( te instanceof IGridHost ) + Platform.openGUI( p, te, ForgeDirection.getOrientation( side ), GuiBridge.GUI_NETWORK_STATUS ); + else + Platform.openGUI( p, null, ForgeDirection.UNKNOWN, GuiBridge.GUI_NETWORK_TOOL ); + return true; + } + else + b.onBlockActivated( w, x, y, z, p, side, hitX, hitY, hitZ ); + } + else + Platform.openGUI( p, null, ForgeDirection.UNKNOWN, GuiBridge.GUI_NETWORK_TOOL ); + + return false; } @Override diff --git a/server/ServerHelper.java b/server/ServerHelper.java index d93de284..6f4d098d 100644 --- a/server/ServerHelper.java +++ b/server/ServerHelper.java @@ -7,6 +7,7 @@ import java.util.Random; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import appeng.block.AEBaseBlock; import appeng.core.CommonHelper; @@ -92,4 +93,10 @@ public class ServerHelper extends CommonHelper return false; } + @Override + public MovingObjectPosition getMOP() + { + return null; + } + }