Fixed #924 - "TileCable should avoid being ticked"
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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<TileController> {
|
||||
public class TileController extends TileBase implements ITickable, INetworkMaster, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy<TileController> {
|
||||
public static final TileDataParameter<Integer> REDSTONE_MODE = RedstoneMode.createParameter();
|
||||
|
||||
public static final TileDataParameter<Integer> ENERGY_USAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileController>() {
|
||||
@@ -262,8 +263,6 @@ public class TileController extends TileBase implements INetworkMaster, IRedston
|
||||
RSUtils.updateBlock(world, pos);
|
||||
}
|
||||
}
|
||||
|
||||
super.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,31 +23,14 @@ import javax.annotation.Nullable;
|
||||
public abstract class TileNode<N extends NetworkNode> extends TileBase implements INetworkNodeProxy<N>, INetworkNodeHolder, IRedstoneConfigurable, IWrenchable {
|
||||
public static final TileDataParameter<Integer> 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<N extends NetworkNode> 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<N extends NetworkNode> 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
|
||||
|
||||
@@ -79,7 +79,7 @@ public class TileSolderer extends TileNode<NetworkNodeSolderer> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canUpdateCauseRerender(NBTTagCompound tag) {
|
||||
protected boolean canCauseRenderUpdate(NBTTagCompound tag) {
|
||||
EnumFacing receivedDirection = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION));
|
||||
|
||||
return receivedDirection != getDirection();
|
||||
|
||||
@@ -60,7 +60,7 @@ public class TileStorageMonitor extends TileNode<NetworkNodeStorageMonitor> {
|
||||
}
|
||||
|
||||
@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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@ public class TileDataManager {
|
||||
private List<TileDataParameter> watchedParameters = new ArrayList<>();
|
||||
private List<Object> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user