From a8c920932e06269a5b2c774e9198fe3da7f7a0dc Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 16 Jan 2015 19:58:11 +0100 Subject: [PATCH] Formation plane can now drop blocks as items --- src/api/java/appeng/api/config/Settings.java | 31 ++++--- .../implementations/GuiFormationPlane.java | 28 +++++- .../client/gui/widgets/GuiImgButton.java | 4 +- .../ContainerFormationPlane.java | 28 +++--- .../core/localization/ButtonToolTips.java | 12 ++- .../parts/automation/PartFormationPlane.java | 81 ++++++++++-------- .../appliedenergistics2/lang/en_US.lang | 3 + .../textures/guis/states.png | Bin 7115 -> 11902 bytes 8 files changed, 118 insertions(+), 69 deletions(-) diff --git a/src/api/java/appeng/api/config/Settings.java b/src/api/java/appeng/api/config/Settings.java index 0a66bd2d..f755c7c0 100644 --- a/src/api/java/appeng/api/config/Settings.java +++ b/src/api/java/appeng/api/config/Settings.java @@ -23,35 +23,37 @@ package appeng.api.config; + import java.util.EnumSet; + public enum Settings { - LEVEL_EMITTER_MODE(EnumSet.allOf( LevelEmitterMode.class )), + LEVEL_EMITTER_MODE( EnumSet.allOf( LevelEmitterMode.class ) ), - REDSTONE_EMITTER(EnumSet.of( RedstoneMode.HIGH_SIGNAL, RedstoneMode.LOW_SIGNAL )), REDSTONE_CONTROLLED(EnumSet.allOf( RedstoneMode.class )), + REDSTONE_EMITTER( EnumSet.of( RedstoneMode.HIGH_SIGNAL, RedstoneMode.LOW_SIGNAL ) ), REDSTONE_CONTROLLED( EnumSet.allOf( RedstoneMode.class ) ), - CONDENSER_OUTPUT(EnumSet.allOf( CondenserOutput.class )), + CONDENSER_OUTPUT( EnumSet.allOf( CondenserOutput.class ) ), - POWER_UNITS(EnumSet.allOf( PowerUnits.class )), ACCESS(EnumSet.of( AccessRestriction.READ_WRITE, AccessRestriction.READ, AccessRestriction.WRITE )), + POWER_UNITS( EnumSet.allOf( PowerUnits.class ) ), ACCESS( EnumSet.of( AccessRestriction.READ_WRITE, AccessRestriction.READ, AccessRestriction.WRITE ) ), - SORT_DIRECTION(EnumSet.allOf( SortDir.class )), SORT_BY(EnumSet.allOf( SortOrder.class )), + SORT_DIRECTION( EnumSet.allOf( SortDir.class ) ), SORT_BY( EnumSet.allOf( SortOrder.class ) ), - SEARCH_TOOLTIPS(EnumSet.of( YesNo.YES, YesNo.NO )), VIEW_MODE(EnumSet.allOf( ViewItems.class )), SEARCH_MODE(EnumSet.allOf( SearchBoxMode.class )), + SEARCH_TOOLTIPS( EnumSet.of( YesNo.YES, YesNo.NO ) ), VIEW_MODE( EnumSet.allOf( ViewItems.class ) ), SEARCH_MODE( EnumSet.allOf( SearchBoxMode.class ) ), - ACTIONS(EnumSet.allOf( ActionItems.class )), IO_DIRECTION(EnumSet.of( RelativeDirection.LEFT, RelativeDirection.RIGHT )), + ACTIONS( EnumSet.allOf( ActionItems.class ) ), IO_DIRECTION( EnumSet.of( RelativeDirection.LEFT, RelativeDirection.RIGHT ) ), - BLOCK(EnumSet.of( YesNo.YES, YesNo.NO )), OPERATION_MODE(EnumSet.allOf( OperationMode.class )), + BLOCK( EnumSet.of( YesNo.YES, YesNo.NO ) ), OPERATION_MODE( EnumSet.allOf( OperationMode.class ) ), - FULLNESS_MODE(EnumSet.allOf( FullnessMode.class )), CRAFT_ONLY(EnumSet.of( YesNo.YES, YesNo.NO )), + FULLNESS_MODE( EnumSet.allOf( FullnessMode.class ) ), CRAFT_ONLY( EnumSet.of( YesNo.YES, YesNo.NO ) ), - FUZZY_MODE(EnumSet.allOf( FuzzyMode.class )), LEVEL_TYPE(EnumSet.allOf( LevelType.class )), + FUZZY_MODE( EnumSet.allOf( FuzzyMode.class ) ), LEVEL_TYPE( EnumSet.allOf( LevelType.class ) ), - TERMINAL_STYLE(EnumSet.of( TerminalStyle.TALL, TerminalStyle.SMALL )), COPY_MODE(EnumSet.allOf( CopyMode.class )), + TERMINAL_STYLE( EnumSet.of( TerminalStyle.TALL, TerminalStyle.SMALL ) ), COPY_MODE( EnumSet.allOf( CopyMode.class ) ), - INTERFACE_TERMINAL(EnumSet.of( YesNo.YES, YesNo.NO )), CRAFT_VIA_REDSTONE(EnumSet.of( YesNo.YES, YesNo.NO )), + INTERFACE_TERMINAL( EnumSet.of( YesNo.YES, YesNo.NO ) ), CRAFT_VIA_REDSTONE( EnumSet.of( YesNo.YES, YesNo.NO ) ), - STORAGE_FILTER(EnumSet.allOf( StorageFilter.class )); + STORAGE_FILTER( EnumSet.allOf( StorageFilter.class ) ), PLACE_BLOCK( EnumSet.of( YesNo.YES, YesNo.NO ) ); private final EnumSet values; @@ -60,7 +62,8 @@ public enum Settings return this.values; } - private Settings(EnumSet set) { + private Settings( EnumSet set ) + { if ( set == null || set.isEmpty() ) throw new RuntimeException( "Invalid configuration." ); this.values = set; diff --git a/src/main/java/appeng/client/gui/implementations/GuiFormationPlane.java b/src/main/java/appeng/client/gui/implementations/GuiFormationPlane.java index 353ea961..f836a1a0 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiFormationPlane.java +++ b/src/main/java/appeng/client/gui/implementations/GuiFormationPlane.java @@ -18,59 +18,79 @@ package appeng.client.gui.implementations; + +import org.lwjgl.input.Mouse; + import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.player.InventoryPlayer; import appeng.api.config.FuzzyMode; import appeng.api.config.Settings; +import appeng.api.config.YesNo; import appeng.client.gui.widgets.GuiImgButton; import appeng.client.gui.widgets.GuiTabButton; import appeng.container.implementations.ContainerFormationPlane; import appeng.core.localization.GuiText; import appeng.core.sync.GuiBridge; import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketConfigButton; import appeng.core.sync.packets.PacketSwitchGuis; import appeng.parts.automation.PartFormationPlane; + public class GuiFormationPlane extends GuiUpgradeable { GuiTabButton priority; + GuiImgButton placeMode; - public GuiFormationPlane(InventoryPlayer inventoryPlayer, PartFormationPlane te) { + public GuiFormationPlane( InventoryPlayer inventoryPlayer, PartFormationPlane te ) + { super( new ContainerFormationPlane( inventoryPlayer, te ) ); this.ySize = 251; } @Override - public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) + public void drawFG( int offsetX, int offsetY, int mouseX, int mouseY ) { this.fontRendererObj.drawString( this.getGuiDisplayName( GuiText.FormationPlane.getLocal() ), 8, 6, 4210752 ); this.fontRendererObj.drawString( GuiText.inventory.getLocal(), 8, this.ySize - 96 + 3, 4210752 ); if ( this.fuzzyMode != null ) this.fuzzyMode.set( this.cvb.fzMode ); + + if ( this.placeMode != null ) + this.placeMode.set( ( ( ContainerFormationPlane ) this.cvb ).placeMode ); } @Override protected void addButtons() { - this.fuzzyMode = new GuiImgButton( this.guiLeft - 18, this.guiTop + 28, Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); + this.placeMode = new GuiImgButton( this.guiLeft - 18, this.guiTop + 28, Settings.PLACE_BLOCK, YesNo.YES ); + this.fuzzyMode = new GuiImgButton( this.guiLeft - 18, this.guiTop + 48, Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); this.buttonList.add( this.priority = new GuiTabButton( this.guiLeft + 154, this.guiTop, 2 + 4 * 16, GuiText.Priority.getLocal(), itemRender ) ); + this.buttonList.add( this.placeMode ); this.buttonList.add( this.fuzzyMode ); } @Override - protected void actionPerformed(GuiButton btn) + protected void actionPerformed( GuiButton btn ) { super.actionPerformed( btn ); + boolean backwards = Mouse.isButtonDown( 1 ); + if ( btn == this.priority ) { NetworkHandler.instance.sendToServer( new PacketSwitchGuis( GuiBridge.GUI_PRIORITY ) ); } + else if ( btn == this.placeMode ) + { + NetworkHandler.instance.sendToServer( new PacketConfigButton( this.placeMode.getSetting(), backwards ) ); + } + } @Override diff --git a/src/main/java/appeng/client/gui/widgets/GuiImgButton.java b/src/main/java/appeng/client/gui/widgets/GuiImgButton.java index a9829882..30fe8115 100644 --- a/src/main/java/appeng/client/gui/widgets/GuiImgButton.java +++ b/src/main/java/appeng/client/gui/widgets/GuiImgButton.java @@ -155,6 +155,9 @@ public class GuiImgButton extends GuiButton implements ITooltip this.registerApp( 16 * 3 + 5, Settings.STORAGE_FILTER, StorageFilter.EXTRACTABLE_ONLY, ButtonToolTips.ReportInaccessibleItems, ButtonToolTips.ReportInaccessibleItemsNo ); this.registerApp( 16 * 3 + 6, Settings.STORAGE_FILTER, StorageFilter.NONE, ButtonToolTips.ReportInaccessibleItems, ButtonToolTips.ReportInaccessibleItemsYes ); + + this.registerApp( 16 * 14, Settings.PLACE_BLOCK, YesNo.YES, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementYes ); + this.registerApp( 16 * 14 + 1, Settings.PLACE_BLOCK, YesNo.NO, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementNo ); } } @@ -362,7 +365,6 @@ public class GuiImgButton extends GuiButton implements ITooltip } } - private static class ButtonAppearance { public int index; diff --git a/src/main/java/appeng/container/implementations/ContainerFormationPlane.java b/src/main/java/appeng/container/implementations/ContainerFormationPlane.java index 2476811a..1c622716 100644 --- a/src/main/java/appeng/container/implementations/ContainerFormationPlane.java +++ b/src/main/java/appeng/container/implementations/ContainerFormationPlane.java @@ -26,18 +26,25 @@ import appeng.api.config.FuzzyMode; import appeng.api.config.SecurityPermissions; import appeng.api.config.Settings; import appeng.api.config.Upgrades; +import appeng.api.config.YesNo; +import appeng.container.guisync.GuiSync; import appeng.container.slot.OptionalSlotFakeTypeOnly; import appeng.container.slot.SlotFakeTypeOnly; import appeng.container.slot.SlotRestrictedInput; import appeng.parts.automation.PartFormationPlane; import appeng.util.Platform; + public class ContainerFormationPlane extends ContainerUpgradeable { final PartFormationPlane storageBus; - public ContainerFormationPlane(InventoryPlayer ip, PartFormationPlane te) { + @GuiSync( 6 ) + public YesNo placeMode; + + public ContainerFormationPlane( InventoryPlayer ip, PartFormationPlane te ) + { super( ip, te ); this.storageBus = te; } @@ -61,7 +68,7 @@ public class ContainerFormationPlane extends ContainerUpgradeable } @Override - public boolean isSlotEnabled(int idx) + public boolean isSlotEnabled( int idx ) { int upgrades = this.upgradeable.getInstalledUpgrades( Upgrades.CAPACITY ); @@ -75,9 +82,9 @@ public class ContainerFormationPlane extends ContainerUpgradeable int yo = 23 + 6; IInventory config = this.upgradeable.getInventoryByName( "config" ); - for (int y = 0; y < 7; y++) + for ( int y = 0; y < 7; y++ ) { - for (int x = 0; x < 9; x++) + for ( int x = 0; x < 9; x++ ) { if ( y < 2 ) this.addSlotToContainer( new SlotFakeTypeOnly( config, y * 9 + x, xo + x * 18, yo + y * 18 ) ); @@ -87,11 +94,11 @@ public class ContainerFormationPlane extends ContainerUpgradeable } IInventory upgrades = this.upgradeable.getInventoryByName( "upgrades" ); - this.addSlotToContainer( (new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 0, 187, 8, this.invPlayer )).setNotDraggable() ); - this.addSlotToContainer( (new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 1, 187, 8 + 18, this.invPlayer )).setNotDraggable() ); - this.addSlotToContainer( (new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 2, 187, 8 + 18 * 2, this.invPlayer )).setNotDraggable() ); - this.addSlotToContainer( (new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 3, 187, 8 + 18 * 3, this.invPlayer )).setNotDraggable() ); - this.addSlotToContainer( (new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 4, 187, 8 + 18 * 4, this.invPlayer )).setNotDraggable() ); + this.addSlotToContainer( ( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 0, 187, 8, this.invPlayer ) ).setNotDraggable() ); + this.addSlotToContainer( ( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 1, 187, 8 + 18, this.invPlayer ) ).setNotDraggable() ); + this.addSlotToContainer( ( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 2, 187, 8 + 18 * 2, this.invPlayer ) ).setNotDraggable() ); + this.addSlotToContainer( ( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 3, 187, 8 + 18 * 3, this.invPlayer ) ).setNotDraggable() ); + this.addSlotToContainer( ( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, 4, 187, 8 + 18 * 4, this.invPlayer ) ).setNotDraggable() ); } @Override @@ -101,7 +108,8 @@ public class ContainerFormationPlane extends ContainerUpgradeable if ( Platform.isServer() ) { - this.fzMode = (FuzzyMode) this.upgradeable.getConfigManager().getSetting( Settings.FUZZY_MODE ); + this.fzMode = ( FuzzyMode ) this.upgradeable.getConfigManager().getSetting( Settings.FUZZY_MODE ); + this.placeMode = ( YesNo ) this.upgradeable.getConfigManager().getSetting( Settings.PLACE_BLOCK ); } this.standardDetectAndSendChanges(); diff --git a/src/main/java/appeng/core/localization/ButtonToolTips.java b/src/main/java/appeng/core/localization/ButtonToolTips.java index 5568e36f..9c1a4339 100644 --- a/src/main/java/appeng/core/localization/ButtonToolTips.java +++ b/src/main/java/appeng/core/localization/ButtonToolTips.java @@ -18,8 +18,10 @@ package appeng.core.localization; + import net.minecraft.util.StatCollector; + public enum ButtonToolTips { PowerUnits, IOMode, CondenserOutput, RedstoneMode, MatchingFuzzy, @@ -54,15 +56,19 @@ public enum ButtonToolTips Stash, StashDesc, Encode, EncodeDescription, Substitutions, SubstitutionsOn, SubstitutionsOff, SubstitutionsDesc, CraftOnly, CraftEither, - Craft, Mod, DoesntDespawn, EmitterMode, CraftViaRedstone, EmitWhenCrafting, ReportInaccessibleItems, ReportInaccessibleItemsYes, ReportInaccessibleItemsNo; + Craft, Mod, DoesntDespawn, EmitterMode, CraftViaRedstone, EmitWhenCrafting, ReportInaccessibleItems, ReportInaccessibleItemsYes, ReportInaccessibleItemsNo, + + BlockPlacement, BlockPlacementYes, BlockPlacementNo; final String root; - ButtonToolTips() { + ButtonToolTips() + { this.root = "gui.tooltips.appliedenergistics2"; } - ButtonToolTips(String r) { + ButtonToolTips( String r ) + { this.root = r; } diff --git a/src/main/java/appeng/parts/automation/PartFormationPlane.java b/src/main/java/appeng/parts/automation/PartFormationPlane.java index a48c3317..7ee6975a 100644 --- a/src/main/java/appeng/parts/automation/PartFormationPlane.java +++ b/src/main/java/appeng/parts/automation/PartFormationPlane.java @@ -18,6 +18,7 @@ package appeng.parts.automation; + import java.util.ArrayList; import java.util.List; @@ -51,6 +52,7 @@ import appeng.api.config.FuzzyMode; import appeng.api.config.IncludeExclude; import appeng.api.config.Settings; import appeng.api.config.Upgrades; +import appeng.api.config.YesNo; import appeng.api.networking.events.MENetworkCellArrayUpdate; import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.events.MENetworkEventSubscribe; @@ -80,6 +82,7 @@ import appeng.util.Platform; import appeng.util.prioitylist.FuzzyPriorityList; import appeng.util.prioitylist.PrecisePriorityList; + public class PartFormationPlane extends PartUpgradeable implements ICellContainer, IPriorityHost, IMEInventory { @@ -89,14 +92,16 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine final MEInventoryHandler myHandler = new MEInventoryHandler( this, StorageChannel.ITEMS ); final AppEngInternalAEInventory Config = new AppEngInternalAEInventory( this, 63 ); - public PartFormationPlane(ItemStack is) { + public PartFormationPlane( ItemStack is ) + { super( PartFormationPlane.class, is ); this.settings.registerSetting( Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); + this.settings.registerSetting( Settings.PLACE_BLOCK, YesNo.YES ); this.updateHandler(); } @Override - public boolean onPartActivate(EntityPlayer player, Vec3 pos) + public boolean onPartActivate( EntityPlayer player, Vec3 pos ) { if ( !player.isSneaking() ) { @@ -117,7 +122,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public IInventory getInventoryByName(String name) + public IInventory getInventoryByName( String name ) { if ( name.equals( "config" ) ) return this.Config; @@ -127,7 +132,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine @Override @MENetworkEventSubscribe - public void powerRender(MENetworkPowerStatusChange c) + public void powerRender( MENetworkPowerStatusChange c ) { boolean currentActive = this.proxy.isActive(); if ( this.wasActive != currentActive ) @@ -139,7 +144,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @MENetworkEventSubscribe - public void updateChannels(MENetworkChannelsChanged changedChannels) + public void updateChannels( MENetworkChannelsChanged changedChannels ) { boolean currentActive = this.proxy.isActive(); if ( this.wasActive != currentActive ) @@ -151,8 +156,8 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - @SideOnly(Side.CLIENT) - public void renderInventory(IPartRenderHelper rh, RenderBlocks renderer) + @SideOnly( Side.CLIENT ) + public void renderInventory( IPartRenderHelper rh, RenderBlocks renderer ) { rh.setTexture( CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartTransitionPlaneBack.getIcon(), this.is.getIconIndex(), CableBusTextures.PartPlaneSides.getIcon(), @@ -166,8 +171,8 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - @SideOnly(Side.CLIENT) - public void renderStatic(int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer) + @SideOnly( Side.CLIENT ) + public void renderStatic( int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer ) { int minX = 1; int minY = 1; @@ -191,7 +196,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine if ( this.isTransitionPlane( te.getWorldObj().getTileEntity( x + u.offsetX, y + u.offsetY, z + u.offsetZ ), this.side ) ) maxY = 16; - boolean isActive = (this.clientFlags & (this.POWERED_FLAG | this.CHANNEL_FLAG)) == (this.POWERED_FLAG | this.CHANNEL_FLAG); + boolean isActive = ( this.clientFlags & ( this.POWERED_FLAG | this.CHANNEL_FLAG ) ) == ( this.POWERED_FLAG | this.CHANNEL_FLAG ); this.renderCache = rh.useSimplifiedRendering( x, y, z, this, this.renderCache ); rh.setTexture( CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartPlaneSides.getIcon(), @@ -211,18 +216,18 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine this.renderLights( x, y, z, rh, renderer ); } - private boolean isTransitionPlane(TileEntity blockTileEntity, ForgeDirection side) + private boolean isTransitionPlane( TileEntity blockTileEntity, ForgeDirection side ) { if ( blockTileEntity instanceof IPartHost ) { - IPart p = ((IPartHost) blockTileEntity).getPart( side ); + IPart p = ( ( IPartHost ) blockTileEntity ).getPart( side ); return p instanceof PartFormationPlane; } return false; } @Override - public void getBoxes(IPartCollisionHelper bch) + public void getBoxes( IPartCollisionHelper bch ) { int minX = 1; int minY = 1; @@ -265,7 +270,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public List getCellArray(StorageChannel channel) + public List getCellArray( StorageChannel channel ) { if ( this.proxy.isActive() && channel == StorageChannel.ITEMS ) { @@ -277,14 +282,14 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue) + public void updateSetting( IConfigManager manager, Enum settingName, Enum newValue ) { this.updateHandler(); this.host.markForSave(); } @Override - public void setPriority(int newValue) + public void setPriority( int newValue ) { this.priority = newValue; this.host.markForSave(); @@ -292,7 +297,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack) + public void onChangeInventory( IInventory inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack ) { super.onChangeInventory( inv, slot, mc, removedStack, newStack ); @@ -315,7 +320,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine IItemList priorityList = AEApi.instance().storage().createItemList(); int slotsToUse = 18 + this.getInstalledUpgrades( Upgrades.CAPACITY ) * 9; - for (int x = 0; x < this.Config.getSizeInventory() && x < slotsToUse; x++) + for ( int x = 0; x < this.Config.getSizeInventory() && x < slotsToUse; x++ ) { IAEItemStack is = this.Config.getAEStackInSlot( x ); if ( is != null ) @@ -323,7 +328,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } if ( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 ) - this.myHandler.myPartitionList = new FuzzyPriorityList( priorityList, (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ); + this.myHandler.myPartitionList = new FuzzyPriorityList( priorityList, ( FuzzyMode ) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ); else this.myHandler.myPartitionList = new PrecisePriorityList( priorityList ); @@ -331,14 +336,14 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine { this.proxy.getGrid().postEvent( new MENetworkCellArrayUpdate() ); } - catch (GridAccessException e) + catch ( GridAccessException e ) { // :P } } @Override - public void writeToNBT(NBTTagCompound data) + public void writeToNBT( NBTTagCompound data ) { super.writeToNBT( data ); this.Config.writeToNBT( data, "config" ); @@ -346,7 +351,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public void readFromNBT(NBTTagCompound data) + public void readFromNBT( NBTTagCompound data ) { super.readFromNBT( data ); this.Config.readFromNBT( data, "config" ); @@ -355,13 +360,13 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) + public IAEItemStack extractItems( IAEItemStack request, Actionable mode, BaseActionSource src ) { return null; } @Override - public IItemList getAvailableItems(IItemList out) + public IItemList getAvailableItems( IItemList out ) { return out; } @@ -379,7 +384,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public void blinkCell(int slot) + public void blinkCell( int slot ) { // :P } @@ -399,11 +404,13 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) + public IAEItemStack injectItems( IAEItemStack input, Actionable type, BaseActionSource src ) { if ( this.blocked || input == null || input.getStackSize() <= 0 ) return input; + YesNo placeBlock = ( YesNo ) this.getConfigManager().getSetting( Settings.PLACE_BLOCK ); + ItemStack is = input.getItemStack(); Item i = is.getItem(); @@ -420,17 +427,17 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine if ( w.getBlock( x, y, z ).isReplaceable( w, x, y, z ) ) { - if ( i instanceof ItemBlock || i instanceof IPlantable || i instanceof ItemSkull || i instanceof ItemFirework || i instanceof IPartItem - || i instanceof ItemReed ) + if ( placeBlock == YesNo.YES && ( i instanceof ItemBlock || i instanceof IPlantable || i instanceof ItemSkull || i instanceof ItemFirework || i instanceof IPartItem + || i instanceof ItemReed ) ) { - EntityPlayer player = Platform.getPlayer( (WorldServer) w ); + EntityPlayer player = Platform.getPlayer( ( WorldServer ) w ); Platform.configurePlayer( player, side, this.tile ); if ( i instanceof ItemFirework ) { Chunk c = w.getChunkFromBlockCoords( x, z ); int sum = 0; - for (List Z : c.entityLists) + for ( List Z : c.entityLists ) sum += Z.size(); if ( sum > 32 ) return input; @@ -473,7 +480,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine worked = true; Chunk c = w.getChunkFromBlockCoords( x, z ); int sum = 0; - for (List Z : c.entityLists) + for ( List Z : c.entityLists ) sum += Z.size(); if ( sum < AEConfig.instance.formationPlaneEntityLimit ) @@ -481,12 +488,12 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine if ( type == Actionable.MODULATE ) { - is.stackSize = (int) maxStorage; + is.stackSize = ( int ) maxStorage; EntityItem ei = new EntityItem( w, // w - ((side.offsetX != 0 ? 0.0 : 0.7) * (Platform.getRandomFloat() - 0.5f)) + 0.5 + side.offsetX * -0.3 + x, // spawn - ((side.offsetY != 0 ? 0.0 : 0.7) * (Platform.getRandomFloat() - 0.5f)) + 0.5 + side.offsetY * -0.3 + y, // spawn - ((side.offsetZ != 0 ? 0.0 : 0.7) * (Platform.getRandomFloat() - 0.5f)) + 0.5 + side.offsetZ * -0.3 + z, // spawn - is.copy() ); + ( ( side.offsetX != 0 ? 0.0 : 0.7 ) * ( Platform.getRandomFloat() - 0.5f ) ) + 0.5 + side.offsetX * -0.3 + x, // spawn + ( ( side.offsetY != 0 ? 0.0 : 0.7 ) * ( Platform.getRandomFloat() - 0.5f ) ) + 0.5 + side.offsetY * -0.3 + y, // spawn + ( ( side.offsetZ != 0 ? 0.0 : 0.7 ) * ( Platform.getRandomFloat() - 0.5f ) ) + 0.5 + side.offsetZ * -0.3 + z, // spawn + is.copy() ); Entity result = ei; @@ -531,7 +538,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine } @Override - public void saveChanges(IMEInventory cellInventory) + public void saveChanges( IMEInventory cellInventory ) { // nope! } diff --git a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang index 4f4a1546..bf4ff0e5 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang +++ b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang @@ -288,6 +288,9 @@ gui.tooltips.appliedenergistics2.EmitWhenCrafting=Emit Redstone while item is cr gui.tooltips.appliedenergistics2.ReportInaccessibleItems=Report Inaccessible Items gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=Yes: Items that cannot be extracted will be visible. gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=No: Only extractable items will be visible. +gui.tooltips.appliedenergistics2.BlockPlacement=Block Placement +gui.tooltips.appliedenergistics2.BlockPlacementYes=Blocks will be placed as block. +gui.tooltips.appliedenergistics2.BlockPlacementNo=Blocks will be dropped as item. gui.appliedenergistics2.units.appliedenergstics=AE gui.appliedenergistics2.units.buildcraft=Minecraft Joules diff --git a/src/main/resources/assets/appliedenergistics2/textures/guis/states.png b/src/main/resources/assets/appliedenergistics2/textures/guis/states.png index 937e8391cf4e741c6720c859657e02cd8f57a137..fc9e11b2f337b77cddf0063fd81693aaa71e5c9d 100644 GIT binary patch literal 11902 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