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 0a66bd2d4..f755c7c02 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 353ea961c..f836a1a01 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 a98298822..30fe81151 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 2476811a1..1c6227168 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 5568e36ff..9c1a4339b 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 a48c33177..7ee6975a2 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 4f4a15465..bf4ff0e54 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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

C*$ 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 Nh^MQc%Q~loCIIk}7>ED>