Added Shit+Mouse wheel to pick up / drop items.

Added Partial ItemStack packets to report to the server what itemstack is the target of interation.
Fixed Repairing Items in CraftingTerminal.
This commit is contained in:
AlgorithmX2
2014-05-12 23:11:19 -05:00
parent 9ba6f195fd
commit ff12aa1673
7 changed files with 291 additions and 34 deletions
+40 -14
View File
@@ -115,11 +115,41 @@ public abstract class AEBaseGui extends GuiContainer
{
super.handleMouseInput();
if ( myScrollBar != null )
int i = Mouse.getEventDWheel();
if ( i != 0 && isShiftKeyDown() )
{
int i = Mouse.getEventDWheel();
if ( i != 0 )
myScrollBar.wheel( i );
int x = Mouse.getEventX() * this.width / this.mc.displayWidth;
int y = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
mouseWheelEvent( x, y, i / Math.abs( i ) );
}
else if ( i != 0 && myScrollBar != null )
myScrollBar.wheel( i );
}
protected void mouseWheelEvent(int x, int y, int wheel)
{
Slot slot = getSlot( x, y );
if ( slot instanceof SlotME )
{
IAEItemStack item = ((SlotME) slot).getAEStack();
if ( item != null )
{
try
{
((AEBaseContainer) inventorySlots).setTargetStack( item );
InventoryAction direction = wheel > 0 ? InventoryAction.ROLLDOWN : InventoryAction.ROLLUP;
int times = Math.abs( wheel );
for (int h = 0; h < times; h++)
{
PacketInventoryAction p = new PacketInventoryAction( direction, inventorySlots.inventorySlots.size(), null );
NetworkHandler.instance.sendToServer( p );
}
}
catch (IOException e)
{
AELog.error( e );
}
}
}
}
@@ -149,15 +179,13 @@ public abstract class AEBaseGui extends GuiContainer
if ( slot instanceof SlotFake )
{
InventoryAction action = null;
IAEItemStack stack = null;
action = ctrlDown == 1 ? InventoryAction.SPLIT_OR_PLACESINGLE : InventoryAction.PICKUP_OR_SETDOWN;
if ( action != null )
{
PacketInventoryAction p;
try
{
p = new PacketInventoryAction( action, slotIdx, stack );
PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, null );
NetworkHandler.instance.sendToServer( p );
}
catch (IOException e)
@@ -175,7 +203,6 @@ public abstract class AEBaseGui extends GuiContainer
return; // prevent weird double clicks..
InventoryAction action = null;
IAEItemStack stack = null;
if ( key == 1 )
action = InventoryAction.CRAFT_SHIFT;
else
@@ -183,10 +210,9 @@ public abstract class AEBaseGui extends GuiContainer
if ( action != null )
{
PacketInventoryAction p;
try
{
p = new PacketInventoryAction( action, slotIdx, stack );
PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, null );
NetworkHandler.instance.sendToServer( p );
}
catch (IOException e)
@@ -204,7 +230,6 @@ public abstract class AEBaseGui extends GuiContainer
if ( slot instanceof SlotME )
stack = ((SlotME) slot).getAEStack();
PacketInventoryAction p;
try
{
int slotNum = inventorySlots.inventorySlots.size();
@@ -212,7 +237,8 @@ public abstract class AEBaseGui extends GuiContainer
if ( !(slot instanceof SlotME) && slot != null )
slotNum = slot.slotNumber;
p = new PacketInventoryAction( InventoryAction.MOVE_REGION, slotNum, stack );
((AEBaseContainer) inventorySlots).setTargetStack( stack );
PacketInventoryAction p = new PacketInventoryAction( InventoryAction.MOVE_REGION, slotNum, null );
NetworkHandler.instance.sendToServer( p );
}
catch (IOException e)
@@ -257,10 +283,10 @@ public abstract class AEBaseGui extends GuiContainer
if ( action != null )
{
PacketInventoryAction p;
try
{
p = new PacketInventoryAction( action, inventorySlots.inventorySlots.size(), stack );
((AEBaseContainer) inventorySlots).setTargetStack( stack );
PacketInventoryAction p = new PacketInventoryAction( action, inventorySlots.inventorySlots.size(), null );
NetworkHandler.instance.sendToServer( p );
}
catch (IOException e)
+156 -17
View File
@@ -1,5 +1,6 @@
package appeng.container;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
@@ -13,6 +14,8 @@ import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
@@ -42,6 +45,7 @@ import appeng.container.slot.SlotPlayerInv;
import appeng.core.AELog;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketInventoryAction;
import appeng.core.sync.packets.PacketPartialItem;
import appeng.core.sync.packets.PacketValueConfig;
import appeng.helpers.ICustomNameObject;
import appeng.helpers.InventoryAction;
@@ -50,6 +54,8 @@ import appeng.util.Platform;
import appeng.util.inv.AdaptorPlayerHand;
import appeng.util.item.AEItemStack;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
public abstract class AEBaseContainer extends Container
{
@@ -65,6 +71,101 @@ public abstract class AEBaseContainer extends Container
int ticksSinceCheck = 900;
IAEItemStack clientRequestedTargetItem = null;
List<PacketPartialItem> dataChunks = new LinkedList();
public void postPartial(PacketPartialItem packetPartialItem)
{
dataChunks.add( packetPartialItem );
if ( packetPartialItem.getPageCount() == dataChunks.size() )
parsePartials();
}
private void parsePartials()
{
int total = 0;
for (PacketPartialItem ppi : dataChunks)
total += ppi.getSize();
byte[] buffer = new byte[total];
int cursor = 0;
for (PacketPartialItem ppi : dataChunks)
cursor = ppi.write( buffer, cursor );
try
{
NBTTagCompound data = CompressedStreamTools.readCompressed( new ByteArrayInputStream( buffer ) );
if ( data != null )
setTargetStack( AEApi.instance().storage().createItemStack( ItemStack.loadItemStackFromNBT( data ) ) );
}
catch (IOException e)
{
AELog.error( e );
}
dataChunks.clear();
}
public void setTargetStack(IAEItemStack stack)
{
// client dosn't need to re-send, makes for lower overhead rapid packets.
if ( Platform.isClient() )
{
ItemStack a = stack == null ? null : stack.getItemStack();
ItemStack b = clientRequestedTargetItem == null ? null : clientRequestedTargetItem.getItemStack();
if ( Platform.isSameItemPrecise( a, b ) )
return;
ByteOutputStream stream = new ByteOutputStream();
NBTTagCompound item = new NBTTagCompound();
if ( stack != null )
stack.writeToNBT( item );
try
{
CompressedStreamTools.writeCompressed( item, stream );
int maxChunkSize = 30000;
List<byte[]> miniPackets = new LinkedList();
byte[] data = stream.getBytes();
ByteArrayInputStream bis = new ByteArrayInputStream( data, 0, stream.size() );
while (bis.available() > 0)
{
int nextBLock = bis.available() > maxChunkSize ? maxChunkSize : bis.available();
byte[] nextSegment = new byte[nextBLock];
bis.read( nextSegment );
miniPackets.add( nextSegment );
}
bis.close();
stream.close();
int page = 0;
for (byte[] packet : miniPackets)
{
PacketPartialItem ppi = new PacketPartialItem( page++, miniPackets.size(), packet );
NetworkHandler.instance.sendToServer( ppi );
}
}
catch (IOException e)
{
AELog.error( e );
return;
}
}
clientRequestedTargetItem = stack == null ? null : stack.copy();
}
public IAEItemStack getTargetStack()
{
return clientRequestedTargetItem;
}
public BaseActionSource getSource()
{
return mySrc;
@@ -492,7 +593,7 @@ public abstract class AEBaseContainer extends Container
return ais.getItemStack();
}
public void doAction(EntityPlayerMP player, InventoryAction action, int slot, IAEItemStack slotItem)
public void doAction(EntityPlayerMP player, InventoryAction action, int slot)
{
if ( slot >= 0 && slot < inventorySlots.size() )
{
@@ -576,6 +677,9 @@ public abstract class AEBaseContainer extends Container
return;
}
// get target item.
IAEItemStack slotItem = getTargetStack();
switch (action)
{
case SHIFT_CLICK:
@@ -601,6 +705,34 @@ public abstract class AEBaseContainer extends Container
adp.addItems( ais.getItemStack() );
}
break;
case ROLLDOWN:
if ( powerSrc == null || cellInv == null )
return;
int releaseQty = 1;
ItemStack isg = player.inventory.getItemStack();
if ( isg != null && releaseQty > 0 )
{
IAEItemStack ais = AEApi.instance().storage().createItemStack( isg );
ais.setStackSize( 1 );
IAEItemStack extracted = ais.copy();
ais = Platform.poweredInsert( powerSrc, cellInv, ais, mySrc );
if ( ais == null )
{
InventoryAdaptor ia = new AdaptorPlayerHand( player );
ItemStack fail = ia.removeItems( 1, extracted.getItemStack(), null );
if ( fail == null )
cellInv.extractItems( extracted, Actionable.MODULATE, mySrc );
updateHeld( player );
}
}
break;
case ROLLUP:
case PICKUP_SINGLE:
if ( powerSrc == null || cellInv == null )
return;
@@ -608,13 +740,13 @@ public abstract class AEBaseContainer extends Container
if ( slotItem != null )
{
int liftQty = 1;
ItemStack isg = player.inventory.getItemStack();
ItemStack isgg = player.inventory.getItemStack();
if ( isg != null )
if ( isgg != null )
{
if ( isg.stackSize >= isg.getMaxStackSize() )
if ( isgg.stackSize >= isgg.getMaxStackSize() )
liftQty = 0;
if ( !Platform.isSameItemPrecise( slotItem.getItemStack(), isg ) )
if ( !Platform.isSameItemPrecise( slotItem.getItemStack(), isgg ) )
liftQty = 0;
}
@@ -623,14 +755,16 @@ public abstract class AEBaseContainer extends Container
IAEItemStack ais = slotItem.copy();
ais.setStackSize( 1 );
ais = Platform.poweredExtraction( powerSrc, cellInv, ais, mySrc );
if ( ais != null )
{
InventoryAdaptor ia = new AdaptorPlayerHand( player );
InventoryAdaptor ia = new AdaptorPlayerHand( player );
ItemStack fail = ia.addItems( ais.getItemStack() );
if ( fail != null )
cellInv.injectItems( ais, Actionable.MODULATE, mySrc );
ItemStack fail = ia.addItems( ais.getItemStack() );
if ( fail != null )
cellInv.injectItems( ais, Actionable.MODULATE, mySrc );
updateHeld( player );
updateHeld( player );
}
}
}
break;
@@ -751,13 +885,17 @@ public abstract class AEBaseContainer extends Container
private void updateHeld(EntityPlayerMP p)
{
try
if ( Platform.isServer() )
{
NetworkHandler.instance.sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.create( p.inventory.getItemStack() ) ), p );
}
catch (IOException e)
{
AELog.error( e );
try
{
NetworkHandler.instance.sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.create( p.inventory.getItemStack() ) ),
p );
}
catch (IOException e)
{
AELog.error( e );
}
}
}
@@ -824,4 +962,5 @@ public abstract class AEBaseContainer extends Container
a.putStack( testA );
b.putStack( testB );
}
}
+21
View File
@@ -6,6 +6,7 @@ import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.world.World;
@@ -123,7 +124,27 @@ public class SlotCraftingTerm extends AppEngCraftingSlot
IRecipe r = Platform.findMatchingRecipe( ic, p.worldObj );
if ( r == null )
{
Item target = request.getItem();
if ( target.isDamageable() && target.isRepairable() )
{
boolean isBad = false;
for (int x = 0; x < ic.getSizeInventory(); x++)
{
ItemStack pis = ic.getStackInSlot( x );
if ( pis == null )
continue;
if ( pis.getItem() != target )
isBad = true;
}
if ( !isBad )
{
super.onPickupFromSlot( p, is );
return request;
}
}
return null;
}
is = r.getCraftingResult( ic );
+4 -1
View File
@@ -20,6 +20,7 @@ import appeng.core.sync.packets.PacketMultiPart;
import appeng.core.sync.packets.PacketNEIRecipe;
import appeng.core.sync.packets.PacketNewStorageDimension;
import appeng.core.sync.packets.PacketPartPlacement;
import appeng.core.sync.packets.PacketPartialItem;
import appeng.core.sync.packets.PacketProgressBar;
import appeng.core.sync.packets.PacketSwapSlots;
import appeng.core.sync.packets.PacketSwitchGuis;
@@ -67,7 +68,9 @@ public class AppEngPacketHandlerBase
PACKET_SWAP_SLOTS(PacketSwapSlots.class),
PACKET_RECIPE_NEI(PacketNEIRecipe.class);
PACKET_RECIPE_NEI(PacketNEIRecipe.class),
PACKET_PARTIAL_ITEM(PacketPartialItem.class);
final public Class pc;
final public Constructor con;
+6 -1
View File
@@ -13,6 +13,7 @@ import appeng.container.AEBaseContainer;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
import appeng.helpers.InventoryAction;
import appeng.util.Platform;
import appeng.util.item.AEItemStack;
public class PacketInventoryAction extends AppEngPacket
@@ -40,7 +41,7 @@ public class PacketInventoryAction extends AppEngPacket
if ( sender.openContainer instanceof AEBaseContainer )
{
AEBaseContainer aebc = (AEBaseContainer) sender.openContainer;
aebc.doAction( sender, action, slot, slotItem );
aebc.doAction( sender, action, slot );
}
}
@@ -58,6 +59,10 @@ public class PacketInventoryAction extends AppEngPacket
// api
public PacketInventoryAction(InventoryAction action, int slot, IAEItemStack slotItem) throws IOException {
if ( Platform.isClient() && slotItem != null )
throw new RuntimeException( "invalid packet, client cannot post inv actions with stacks." );
this.action = action;
this.slot = slot;
this.slotItem = slotItem;
+63
View File
@@ -0,0 +1,63 @@
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 appeng.container.AEBaseContainer;
import appeng.core.sync.AppEngPacket;
import appeng.core.sync.network.INetworkInfo;
public class PacketPartialItem extends AppEngPacket
{
short pageNum;
byte[] data;
// automatic.
public PacketPartialItem(ByteBuf stream) throws IOException {
pageNum = stream.readShort();
stream.readBytes( data = new byte[stream.readableBytes()] );
}
@Override
public void serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player)
{
if ( player.openContainer instanceof AEBaseContainer )
{
((AEBaseContainer) player.openContainer).postPartial( this );
}
}
// api
public PacketPartialItem(int page, int maxPages, byte[] buf) throws IOException {
ByteBuf data = Unpooled.buffer();
pageNum = (short) (page | (maxPages << 8));
this.data = buf;
data.writeInt( getPacketID() );
data.writeShort( pageNum );
data.writeBytes( buf );
configureWrite( data );
}
public int getPageCount()
{
return pageNum >> 8;
}
public int getSize()
{
return data.length;
}
public int write(byte[] buffer, int cursor)
{
System.arraycopy( data, 0, buffer, cursor, data.length );
return cursor + data.length;
}
}
+1 -1
View File
@@ -9,5 +9,5 @@ public enum InventoryAction
CRAFT_STACK, CRAFT_ITEM, CRAFT_SHIFT,
// extra...
MOVE_REGION, PICKUP_SINGLE, UPDATE_HAND
MOVE_REGION, PICKUP_SINGLE, UPDATE_HAND, ROLLUP, ROLLDOWN
}