diff --git a/changelog b/changelog index 316a59806..b5897bc7a 100644 --- a/changelog +++ b/changelog @@ -1,28 +1,3 @@ ## Changed -* Removed advanced alloy - * All recipes that used to have AA in it now use something else - * AA tools and armor remain for now, although they are uncraftable - * Steel and titanium armor now have some DT and DR, making them roughly on-par with the old AA - * Buffed durability for steel and titanium tool materials - * Steel tools now deal more damage (still not as much as titanium) and has diamond harvest level - * AA custom machine blocks have been replaced with bronze ones which make more sense in progression, since AA was too close to steel anyway -* Renamed "worker's alloy" to "desh" to avoid confusion - * Seriously why did this have two names? -* Industrial grade and minecraft grade copper ingots now have the "ingot" suffix -* Changed the microchip assembler recipe duration so that it matches with the demand of one soldering station -* Blast furnace speed with hot air blast can now be increased to 500% (uses the same amount of hot air blast as before) - -## Fixed -* AUTOCAL - * Fixed `listen` command failing if the buffer is empty - * Fixed variable substitution failing when there is a trailing $ sign - * Fixed concat prefixing all output with "t " for some reason - * Eval(r) now uses a special mode for variable substitution that forces empty variables to be interpreted as "0" -* Fixed things not intended to be used in the blast furnace (scrap, lava) being usable fuels -* Fixed blast furnace swallowing container items left behind by fuels, instead fuels with containers will not be accepted at all -* Fixed the blast furnace NEI screen listing "0 HE" for every recipe even though it's not an electric machine -* Fixed flue gas not having an inventory texture -* Potentially fixed issue with Angelica where tile entity culling would cause cargo elevators to not render on certain angles -* Fixed the blast furnace not performing stack size checks correctly, outputting items when it shouldn't -* Fixed cargo elevators not rendering past a distance of 100 blocks -* Fixed cargo elevator syncing range being only 100 blocks, meaning that elevators taller than that don't work properly +* Updated chinese localization +* Watz powerplant now has OC and RoR integration \ No newline at end of file diff --git a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java index 0dbde4ea5..68e0e958b 100644 --- a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java +++ b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java @@ -21,6 +21,9 @@ public interface ISlotMonitorProvider { /** Returns the amount of that slot at that index. Some storages may use int64 datatypes so we have to account for those too somehow, since ItemStacks cannot handle that. */ public long getAmountAt(int index); + /** Removes the given number of items from that slot, returns the amount left to remove if the stack was smaller than the supplied amount */ + public long useUpItem(int index, long amount); + /** Whether this storage unit is reachable by the access point */ public boolean isAvailableToCache(StackCache cache); diff --git a/src/main/java/api/hbm/ntl/SlotMonitor.java b/src/main/java/api/hbm/ntl/SlotMonitor.java index b0c295743..2422456be 100644 --- a/src/main/java/api/hbm/ntl/SlotMonitor.java +++ b/src/main/java/api/hbm/ntl/SlotMonitor.java @@ -103,8 +103,6 @@ public class SlotMonitor { if(hasTypeChanged) { - System.out.println("Type changed!"); - // remove from all existing monitors Iterator iterator = viewedBy.iterator(); while(iterator.hasNext()) { @@ -130,8 +128,6 @@ public class SlotMonitor { // find new monitors if(pneumoNet != null) { - System.out.println("Adding to new network..."); - for(StackCache cache : pneumoNet.accessors) { System.out.println("Adding to cache..."); if(!cache.hasExpired && parent.isAvailableToCache(cache)) { diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java index 6c8674513..1f853f4c7 100644 --- a/src/main/java/api/hbm/ntl/StackCache.java +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -46,6 +46,29 @@ public class StackCache { cache.addMonitor(monitor); } + public CacheSlot getSlotFromStack(ItemStack stack) { + return getSlotFromStack(stack.getItem(), stack.getItemDamage(), stack.stackTagCompound); + } + + public CacheSlot getSlotFromStack(Item item, int meta, NBTTagCompound nbt) { + long monitorIdentity = getStackIdentity(item, meta, nbt); + return cacheSlots.get(monitorIdentity); + } + + /** Uses up items and returns how many of the requested items could be removed, with no desyncs that number should always be equal to the supplied amount */ + public long consumeItemsAndReturnQuantity(ItemStack stack, long amount) { + CacheSlot cache = getSlotFromStack(stack); + if(cache == null) return 0; + long originalAmount = amount; + + for(SlotMonitor monitor : cache.monitors) { + amount = monitor.parent.useUpItem(monitor.index, amount); + if(amount <= 0) break; + } + + return originalAmount - amount; + } + public void dissolveCache() { for(Entry cacheEntry : cacheSlots.entrySet()) { cacheEntry.getValue().destroy(); diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index bcd99eaf0..5cfefc1d0 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -15,12 +15,15 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerPneumoStorageAccess extends Container { protected TileEntityPneumoStorageAccess access; protected InventoryPneumoStorageAccess inventory; + + public static final String STACK_SIZE_KEY = "PNEUMO_STACK_SIZE"; public ContainerPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { this.access = access; @@ -28,7 +31,7 @@ public class ContainerPneumoStorageAccess extends Container { for(int i = 0; i < 6; i++) { for(int j = 0; j < 8; j++) { - this.addSlotToContainer(new SlotNonRetarded(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); + this.addSlotToContainer(new SlotNonRetarded(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); // TODO: add a new slot type that holds a long for the amount } } @@ -51,6 +54,38 @@ public class ContainerPneumoStorageAccess extends Container { return access.getDistanceFrom(player.posX, player.posY, player.posZ) <= 15 * 15; } + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + if(index >= 0 && index < 6 * 8) { + boolean client = player.worldObj.isRemote; + Slot slot = this.getSlot(index); + ItemStack held = player.inventory.getItemStack(); + + if(held == null && slot.getHasStack() && slot.getStack().hasTagCompound()) { + ItemStack stack = slot.getStack().copy(); + + if(button == 0) { + int toGrab = (int) Math.min(stack.getMaxStackSize(), stack.stackTagCompound.getLong(STACK_SIZE_KEY)); + + if(client) { + stack.stackSize = toGrab; + player.inventory.setItemStack(stack); + } else { + if(this.access.cache == null || this.access.cache.hasExpired) return stack; + StackCache cache = this.access.cache; + stack.stackSize = (int) cache.consumeItemsAndReturnQuantity(stack, toGrab); // this can't work because the stack got altered with the description NBT..... + player.inventory.setItemStack(stack); + } + } + + return slot.getStack().copy(); + } + } + + return super.slotClick(index, button, mode, player); + } + @Override public ItemStack transferStackInSlot(EntityPlayer player, int index) { return null; @@ -81,6 +116,7 @@ public class ContainerPneumoStorageAccess extends Container { if(cache.displayStack != null) { slots[i] = cache.displayStack.copy(); ItemStackUtil.addTooltipToStack(slots[i], "x" + cache.stacksize, "in " + cache.monitors.size() + " stacks"); + slots[i].stackTagCompound.setLong(STACK_SIZE_KEY, cache.stacksize); // TODO instead of altering the stacks so we can't resolve anything anymore, hijack the progress bar system } } } diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java index 0fbc79920..4309c6043 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipesNT.java @@ -63,8 +63,11 @@ public class BlastFurnaceRecipesNT extends GenericRecipes { .inputItems(new OreDictStack(CO.ingot()), new ComparableStack(ModItems.meteorite_sword_hardened, 1)) .outputItems(new ItemStack(ModItems.meteorite_sword_alloyed, 1))); + this.register((BlastFurnaceRecipe) new BlastFurnaceRecipe("blast.meteor").setDuration(600) + .inputItems(new OreDictStack(CO.ingot()), new ComparableStack(ModItems.powder_meteorite, 1)) + .outputItems(new ItemStack(ModItems.ingot_meteorite, 1))); this.register((BlastFurnaceRecipe) new BlastFurnaceRecipe("blast.starmetal").setDuration(600) - .inputItems(new OreDictStack(BIGMT.ingot()), new ComparableStack(ModItems.powder_meteorite, 1)) + .inputItems(new OreDictStack(BIGMT.ingot()), new ComparableStack(ModItems.ingot_meteorite, 1)) .outputItems(new ItemStack(ModItems.ingot_starmetal, 1))); this.register((BlastFurnaceRecipe) new BlastFurnaceRecipe("blast.paa").setDuration(600) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index c1d1317b4..7e4e27ce8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -35,12 +35,10 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import api.hbm.redstoneoverradio.IRORInteractive; import api.hbm.redstoneoverradio.IRORValueProvider; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; -import li.cil.oc.api.network.SimpleComponent; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -54,7 +52,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityWatz extends TileEntityMachineBase implements IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IFluidCopiable, CompatHandler.OCComponent, IRORValueProvider, IRORInteractive { +public class TileEntityWatz extends TileEntityMachineBase implements IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IFluidCopiable, CompatHandler.OCComponent, IRORValueProvider { public FluidTank[] tanks; public FluidTank[] sharedTanks; @@ -664,12 +662,6 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand return ROR; } - @Override - public String runRORFunction(String name, String[] params) { - // TODO Auto-generated method stub - return null; - } - @Override public String provideRORValue(String name) { if((PREFIX_VALUE + "heat").equals(name)) return "" + this.heat; diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java index 0159fdaf7..5e5c96b84 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java @@ -141,4 +141,16 @@ public class TileEntityPneumoStorageClutter extends TileEntityMachineBase implem public boolean isAvailableToCache(StackCache cache) { return this.isLoaded && !this.isInvalid(); } + + @Override + public long useUpItem(int index, long amount) { + + if(slots[index] != null) { + int toRemove = (int) Math.min(slots[index].stackSize, amount); + this.decrStackSize(index, toRemove); + return amount - toRemove; + } + + return amount; + } } diff --git a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java index 53172e368..00ac69f26 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java @@ -54,6 +54,17 @@ public class PneumaticNetwork extends NodeNet { accessors.clear(); storages.clear(); } + + @Override + public void joinNetworks(NodeNet network) { + super.joinNetworks(network); + + PneumaticNetwork net = (PneumaticNetwork) network; + for(StackCache cache : accessors) cache.dissolveCache(); + + for(Object connector : net.accessors) this.accessors.add((StackCache) connector); + for(Object connector : net.storages) this.storages.add((ISlotMonitorProvider) connector); + } public void addReceiver(IInventory inventory, ForgeDirection pipeDir, TileEntityPneumoTube endpoint) { receivers.put(inventory, new Triplet(pipeDir, System.currentTimeMillis(), endpoint));