From b44860d3cec83b78fc097a7a84f664e6125cef62 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 8 May 2017 18:08:29 +0200 Subject: [PATCH] Fixed #924 - "TileCable should avoid being ticked" --- CHANGELOG.md | 1 + build.gradle | 8 +-- .../apiimpl/network/NetworkNodeListener.java | 16 +++++ .../refinedstorage/tile/TileBase.java | 19 ++---- .../refinedstorage/tile/TileController.java | 5 +- .../refinedstorage/tile/TileNode.java | 64 +++++++++---------- .../refinedstorage/tile/TileSolderer.java | 2 +- .../tile/TileStorageMonitor.java | 2 +- .../tile/data/ContainerListener.java | 31 ++++++++- .../tile/data/TileDataManager.java | 10 +++ 10 files changed, 99 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0521a0ea..0c8b7d07f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Fixed Crafting Tweaks buttons positioned wrongly (blay09) - Fixed Crafting Tweaks keybindings interfering with RS keybindings (blay09) - Fixed crash when updating storages (raoulvdberge) +- Removed ticking tile entities, every tile entity in RS is non-ticking now (raoulvdberge) ### 1.4.4 - Updated Forge to 2284 (raoulvdberge) diff --git a/build.gradle b/build.gradle index 75b95e189..27193a98d 100755 --- a/build.gradle +++ b/build.gradle @@ -48,9 +48,9 @@ repositories { name "Cyclops Repo" url "https://dl.bintray.com/cyclopsmc/dev/" } - maven { - name = "oc" - url = "http://maven.cil.li/" + maven { + name "oc" + url "http://maven.cil.li/" } } @@ -61,7 +61,7 @@ dependencies { deobfCompile "org.cyclops.cyclopscore:CyclopsCore:1.11.2-0.10.2-542" deobfCompile "org.cyclops.commoncapabilities:CommonCapabilities:1.11.2-1.3.2-107" deobfCompile "MCMultiPart2:MCMultiPart-exp:2.0.0_19" - deobfCompile "li.cil.oc:OpenComputers:MC1.11.2-1.7.0.14:api" + deobfCompile "li.cil.oc:OpenComputers:MC1.11.2-1.7.0.14:api" } processResources { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java index 22bc22b89..69e0fa0a5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkNodeListener.java @@ -12,8 +12,24 @@ import net.minecraft.util.EnumFacing; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; public class NetworkNodeListener { + @SubscribeEvent + public void onWorldTick(TickEvent.WorldTickEvent e) { + e.world.profiler.startSection("network node ticking"); + + if (e.phase == TickEvent.Phase.END) { + for (INetworkNode node : API.instance().getNetworkNodeManager(e.world.provider.getDimension()).all()) { + if (e.world.isBlockLoaded(node.getPos())) { + node.update(); + } + } + } + + e.world.profiler.endSection(); + } + @SubscribeEvent public void onBlockPlace(BlockEvent.PlaceEvent e) { if (!e.getWorld().isRemote) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java index f62142346..b88ca6e45 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileBase.java @@ -8,29 +8,18 @@ import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; -import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; -public abstract class TileBase extends TileEntity implements ITickable { +public abstract class TileBase extends TileEntity { protected static final String NBT_DIRECTION = "Direction"; private EnumFacing direction = EnumFacing.NORTH; protected TileDataManager dataManager = new TileDataManager(this); - protected int ticks = 0; - - @Override - public void update() { - if (!getWorld().isRemote) { - ++ticks; - - dataManager.detectAndSendChanges(); - } - } public void setDirection(EnumFacing direction) { this.direction = direction; @@ -65,16 +54,16 @@ public abstract class TileBase extends TileEntity implements ITickable { } public void readUpdate(NBTTagCompound tag) { - boolean doRerender = canUpdateCauseRerender(tag); + boolean doRender = canCauseRenderUpdate(tag); direction = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); - if (doRerender) { + if (doRender) { RSUtils.updateBlock(getWorld(), pos); } } - protected boolean canUpdateCauseRerender(NBTTagCompound tag) { + protected boolean canCauseRenderUpdate(NBTTagCompound tag) { return true; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 415b3712a..e9dd1bbfd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -57,6 +57,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; +import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; @@ -69,7 +70,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.*; -public class TileController extends TileBase implements INetworkMaster, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy { +public class TileController extends TileBase implements ITickable, INetworkMaster, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy { public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); public static final TileDataParameter ENERGY_USAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { @@ -262,8 +263,6 @@ public class TileController extends TileBase implements INetworkMaster, IRedston RSUtils.updateBlock(world, pos); } } - - super.update(); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java index 7fa188ac2..84957f7d9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileNode.java @@ -23,31 +23,14 @@ import javax.annotation.Nullable; public abstract class TileNode extends TileBase implements INetworkNodeProxy, INetworkNodeHolder, IRedstoneConfigurable, IWrenchable { public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); - private NBTTagCompound legacyTagToRead; + private NBTTagCompound legacyTag; + protected static final String NBT_ACTIVE = "Active"; public TileNode() { dataManager.addWatchedParameter(REDSTONE_MODE); } - @Override - public void update() { - if (!getWorld().isRemote) { - if (legacyTagToRead != null) { - getNode().read(legacyTagToRead); - getNode().markDirty(); - - legacyTagToRead = null; - - markDirty(); - } - - getNode().update(); - } - - super.update(); - } - @Override public World world() { return getWorld(); @@ -82,21 +65,7 @@ public abstract class TileNode extends TileBase implement public void read(NBTTagCompound tag) { super.read(tag); - // Ugly code for checking if this is a legacy tile. Sue me. - boolean hasMeta = tag.hasKey("x") && tag.hasKey("y") && tag.hasKey("z") && tag.hasKey("id"); - boolean hasForgeData = tag.hasKey("ForgeData"); - boolean hasForgeCaps = tag.hasKey("ForgeCaps"); - - // + 1 because of "Direction". - if (tag.getSize() == 4 + 1 && hasMeta) { - // NO OP - } else if (tag.getSize() == 5 + 1 && hasMeta && (hasForgeData || hasForgeCaps)) { - // NO OP - } else if (tag.getSize() == 6 + 1 && hasMeta && hasForgeData && hasForgeCaps) { - // NO OP - } else { - legacyTagToRead = tag; - } + this.legacyTag = tag; } public NBTTagCompound writeUpdate(NBTTagCompound tag) { @@ -135,9 +104,36 @@ public abstract class TileNode extends TileBase implement node.setHolder(this); } + if (legacyTag != null) { + doLegacyCheck(node); + } + return (N) node; } + private void doLegacyCheck(NetworkNode node) { + // Ugly code for checking if this is a legacy tile. Sue me. + boolean hasMeta = legacyTag.hasKey("x") && legacyTag.hasKey("y") && legacyTag.hasKey("z") && legacyTag.hasKey("id"); + boolean hasForgeData = legacyTag.hasKey("ForgeData"); + boolean hasForgeCaps = legacyTag.hasKey("ForgeCaps"); + + // + 1 because of "Direction". + if (legacyTag.getSize() == 4 + 1 && hasMeta) { + // NO OP + } else if (legacyTag.getSize() == 5 + 1 && hasMeta && (hasForgeData || hasForgeCaps)) { + // NO OP + } else if (legacyTag.getSize() == 6 + 1 && hasMeta && hasForgeData && hasForgeCaps) { + // NO OP + } else { + node.read(legacyTag); + node.markDirty(); + + markDirty(); + } + + this.legacyTag = null; + } + public abstract N createNode(); @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java index 571b2cdb0..af362e924 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSolderer.java @@ -79,7 +79,7 @@ public class TileSolderer extends TileNode { } @Override - protected boolean canUpdateCauseRerender(NBTTagCompound tag) { + protected boolean canCauseRenderUpdate(NBTTagCompound tag) { EnumFacing receivedDirection = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); return receivedDirection != getDirection(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java index 14a9c8769..dc5e174c4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorageMonitor.java @@ -60,7 +60,7 @@ public class TileStorageMonitor extends TileNode { } @Override - protected boolean canUpdateCauseRerender(NBTTagCompound tag) { + protected boolean canCauseRenderUpdate(NBTTagCompound tag) { EnumFacing receivedDirection = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); boolean receivedActive = tag.getBoolean(NBT_ACTIVE); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/ContainerListener.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/ContainerListener.java index 602d7b776..981792fa0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/ContainerListener.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/ContainerListener.java @@ -16,7 +16,36 @@ public class ContainerListener { TileBase tile = ((ContainerBase) container).getTile(); if (tile != null && !tile.getWorld().isRemote) { - tile.getDataManager().sendParametersTo((EntityPlayerMP) e.getEntityPlayer()); + TileDataManager manager = tile.getDataManager(); + + manager.sendParametersTo((EntityPlayerMP) e.getEntityPlayer()); + + int watchers = manager.getWatchers(); + + manager.setWatchers(watchers + 1); + + if (watchers == 0) { + Thread listenerThread = new Thread(() -> { + while (manager.getWatchers() > 0) { + manager.detectAndSendChanges(); + } + }, "RS tile listener " + tile.getPos().getX() + ", " + tile.getPos().getY() + ", " + tile.getPos().getZ()); + + listenerThread.start(); + } + } + } + } + + @SubscribeEvent + public void onContainerClose(PlayerContainerEvent.Close e) { + Container container = e.getContainer(); + + if (container instanceof ContainerBase) { + TileBase tile = ((ContainerBase) container).getTile(); + + if (tile != null && !tile.getWorld().isRemote) { + tile.getDataManager().setWatchers(tile.getDataManager().getWatchers() - 1); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java index eda502c03..3325bfb00 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java @@ -24,6 +24,8 @@ public class TileDataManager { private List watchedParameters = new ArrayList<>(); private List watchedParametersCache = new ArrayList<>(); + private int watchers = 0; + public static void registerParameter(TileDataParameter parameter) { parameter.setId(LAST_ID); @@ -44,6 +46,14 @@ public class TileDataManager { this.tile = tile; } + public int getWatchers() { + return watchers; + } + + public void setWatchers(int watchers) { + this.watchers = Math.max(0, watchers); + } + public void addParameter(TileDataParameter parameter) { parameters.add(parameter); }