diff --git a/CHANGELOG.md b/CHANGELOG.md index 44cd1183f..3fdcc12e3 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Refined Storage Changelog +### 1.5.26 +- Added Funky Locomotion integration (raoulvdberge) + ### 1.5.25 - Fixed not being able to autocraft different Storage Drawers' wood drawers (raoulvdberge) - Fixed not being able to autocraft certain Modular Routers items (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java index 83b6f382a..7a397aef6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java @@ -38,6 +38,7 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor, private EnumFacing direction; + private boolean throttlingDisabled; private boolean couldUpdate; private int ticksSinceUpdateChanged; @@ -104,6 +105,10 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor, return 4; } + public void setThrottlingDisabled() { + throttlingDisabled = true; + } + @Override public void update() { ++ticks; @@ -113,9 +118,10 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor, if (couldUpdate != canUpdate) { ++ticksSinceUpdateChanged; - if (canUpdate ? (ticksSinceUpdateChanged > getUpdateThrottleInactiveToActive()) : (ticksSinceUpdateChanged > getUpdateThrottleActiveToInactive())) { + if ((canUpdate ? (ticksSinceUpdateChanged > getUpdateThrottleInactiveToActive()) : (ticksSinceUpdateChanged > getUpdateThrottleActiveToInactive())) || throttlingDisabled) { ticksSinceUpdateChanged = 0; couldUpdate = canUpdate; + throttlingDisabled = false; if (hasConnectivityState()) { WorldUtils.updateBlock(world, pos); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index 920cdb1ef..9339f238b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -5,6 +5,8 @@ import com.google.gson.JsonSyntaxException; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSItems; +import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; +import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeManager; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.*; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack; @@ -20,6 +22,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriter import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRedstone; import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRecipeLoader; import com.raoulvdberge.refinedstorage.block.BlockBase; +import com.raoulvdberge.refinedstorage.block.BlockNode; import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.gui.GuiHandler; import com.raoulvdberge.refinedstorage.integration.craftingtweaks.IntegrationCraftingTweaks; @@ -37,7 +40,10 @@ import com.raoulvdberge.refinedstorage.tile.grid.WirelessGrid; import com.raoulvdberge.refinedstorage.tile.grid.portable.PortableGrid; import com.raoulvdberge.refinedstorage.tile.grid.portable.TilePortableGrid; import com.raoulvdberge.refinedstorage.util.StackUtils; +import com.rwtema.funkylocomotion.api.FunkyRegistry; +import com.rwtema.funkylocomotion.api.IMoveFactory; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentData; import net.minecraft.init.Items; @@ -45,8 +51,13 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemEnchantedBook; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import net.minecraft.util.JsonUtils; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.common.crafting.IIngredientFactory; @@ -264,7 +275,62 @@ public class ProxyCommon { @SubscribeEvent public void registerBlocks(RegistryEvent.Register e) { - blocksToRegister.forEach(e.getRegistry()::register); + blocksToRegister.forEach(b -> { + if (b instanceof BlockNode && FunkyRegistry.INSTANCE != null) { + FunkyRegistry.INSTANCE.registerMoveFactoryBlock(b, new IMoveFactory() { + @Override + public NBTTagCompound destroyBlock(World world, BlockPos pos) { + INetworkNodeManager manager = API.instance().getNetworkNodeManager(world); + + INetworkNode node = manager.getNode(pos); + + TileNode tile = (TileNode) world.getTileEntity(pos); + + NBTTagCompound tag = new NBTTagCompound(); + + tag.setInteger("Direction", tile.getDirection().ordinal()); + tag.setTag("Node", node.write(new NBTTagCompound())); + tag.setString("NodeID", node.getId()); + + // Funky Locomotion requires this + IBlockState state = world.getBlockState(pos); + tag.setString("Block", Block.REGISTRY.getNameForObject(state.getBlock()).toString()); + tag.setInteger("Meta", state.getBlock().getMetaFromState(state)); + tag.setTag("Tile", tile.writeToNBT(new NBTTagCompound())); + + manager.removeNode(pos); // Avoid inventory dropping + manager.markForSaving(); + + return tag; + } + + @Override + @SuppressWarnings("deprecation") + public boolean recreateBlock(World world, BlockPos pos, NBTTagCompound tag) { + NetworkNode node = (NetworkNode) API.instance().getNetworkNodeRegistry().get(tag.getString("NodeID")).create(tag.getCompoundTag("Node"), world, pos); + node.setThrottlingDisabled(); + + INetworkNodeManager manager = API.instance().getNetworkNodeManager(world); + + manager.setNode(pos, node); + manager.markForSaving(); + + Block block = Block.REGISTRY.getObject(new ResourceLocation(tag.getString("Block"))); + world.setBlockState(pos, block.getStateFromMeta(tag.getInteger("Meta"))); + + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof TileNode) { + ((TileNode) tile).setDirection(EnumFacing.getFront(tag.getInteger("Direction"))); + tile.markDirty(); + } + + return true; + } + }); + } + + e.getRegistry().register(b); + }); } @SubscribeEvent diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 71d0687f7..091070d3b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -149,6 +149,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe private EnergyForge energy = new EnergyForge(RS.INSTANCE.config.controllerCapacity); + private boolean throttlingDisabled = true; // Will be enabled after first update private boolean couldRun; private int ticksSinceUpdateChanged; @@ -236,9 +237,10 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe if (couldRun != canRun) { ++ticksSinceUpdateChanged; - if (canRun ? (ticksSinceUpdateChanged > THROTTLE_INACTIVE_TO_ACTIVE) : (ticksSinceUpdateChanged > THROTTLE_ACTIVE_TO_INACTIVE)) { + if ((canRun ? (ticksSinceUpdateChanged > THROTTLE_INACTIVE_TO_ACTIVE) : (ticksSinceUpdateChanged > THROTTLE_ACTIVE_TO_INACTIVE)) || throttlingDisabled) { ticksSinceUpdateChanged = 0; couldRun = canRun; + throttlingDisabled = false; nodeGraph.rebuild(); securityManager.rebuild(); diff --git a/src/main/java/com/rwtema/funkylocomotion/api/FunkyRegistry.java b/src/main/java/com/rwtema/funkylocomotion/api/FunkyRegistry.java new file mode 100644 index 000000000..d5bb55ef4 --- /dev/null +++ b/src/main/java/com/rwtema/funkylocomotion/api/FunkyRegistry.java @@ -0,0 +1,19 @@ +package com.rwtema.funkylocomotion.api; + +import net.minecraft.block.Block; +import net.minecraftforge.common.capabilities.Capability; + +import javax.annotation.Nullable; + +public abstract class FunkyRegistry { + @Nullable + public static FunkyRegistry INSTANCE = null; + + public abstract void registerMoveFactoryBlock(Block b, IMoveFactory factory); + + public abstract void registerMoveFactoryTileEntityClass(Class tile, IMoveFactory factory); + + public abstract void registerMoveFactoryBlockClass(Class b, IMoveFactory factory); + + public abstract void registerProxy(Object object, Capability capability, T type); +} diff --git a/src/main/java/com/rwtema/funkylocomotion/api/IMoveFactory.java b/src/main/java/com/rwtema/funkylocomotion/api/IMoveFactory.java new file mode 100644 index 000000000..e39258e98 --- /dev/null +++ b/src/main/java/com/rwtema/funkylocomotion/api/IMoveFactory.java @@ -0,0 +1,11 @@ +package com.rwtema.funkylocomotion.api; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public interface IMoveFactory { + NBTTagCompound destroyBlock(World world, BlockPos pos); + + boolean recreateBlock(World world, BlockPos pos, NBTTagCompound tag); +} diff --git a/src/main/java/com/rwtema/funkylocomotion/api/package-info.java b/src/main/java/com/rwtema/funkylocomotion/api/package-info.java new file mode 100644 index 000000000..95e03a443 --- /dev/null +++ b/src/main/java/com/rwtema/funkylocomotion/api/package-info.java @@ -0,0 +1,4 @@ +@API(apiVersion = "2.0", owner = "funkylocomotion", provides = "funkylocomotion_api") +package com.rwtema.funkylocomotion.api; + +import net.minecraftforge.fml.common.API; \ No newline at end of file