Add fix for leaking client TEs (#298)

* Add fix for leaking client TEs

* Remove client-side markDirty() call
This commit is contained in:
James Chung
2023-09-27 16:45:55 -07:00
committed by GitHub
parent 6f822af262
commit bf83de08b2
2 changed files with 24 additions and 6 deletions
@@ -32,6 +32,7 @@ import appeng.me.Grid;
import appeng.tile.AEBaseTile;
import appeng.util.IWorldCallable;
import appeng.util.Platform;
import com.google.common.base.Preconditions;
import com.google.common.base.Stopwatch;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Multimap;
@@ -66,7 +67,20 @@ public class TickHandler {
return this.cliPlayerColors;
}
/**
* Add a server or world callback which gets called the next time the queue is ticked.
* <p>
* Callbacks on the client are not support.
* <p>
* Using null as world will queue it into the global {@link TickEvent.ServerTickEvent}, otherwise it will be ticked with the
* corresponding {@link TickEvent.WorldTickEvent}.
*
* @param w null or the specific {@link World}
* @param c the callback
*/
public void addCallable(final World w, final IWorldCallable<?> c) {
Preconditions.checkArgument(w == null || !w.isRemote, "Can only register serverside callbacks");
if (w == null) {
this.serverQueue.add(c);
} else {
+10 -6
View File
@@ -434,12 +434,16 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
}
public void saveChanges() {
if (this.world != null) {
this.world.markChunkDirty(this.pos, this);
if (!this.markDirtyQueued) {
TickHandler.INSTANCE.addCallable(null, this::markDirtyAtEndOfTick);
this.markDirtyQueued = true;
}
// Clientside should not need to save/markDirty() data
if (this.world == null || this.world.isRemote) {
return;
}
// Serverside is only queued once per tick to avoid costly operations
this.world.markChunkDirty(this.pos, this);
if (!this.markDirtyQueued) {
TickHandler.INSTANCE.addCallable(null, this::markDirtyAtEndOfTick);
this.markDirtyQueued = true;
}
}