fix: correctly sync requestable count

This commit is contained in:
Timo Ley 2023-01-26 19:01:45 +01:00
parent df89a2a2d1
commit 0b182ae608
5 changed files with 56 additions and 45 deletions

View File

@ -0,0 +1,13 @@
package appeng.api.networking.events;
import appeng.api.networking.request.IRequestProvider;
public class MENetworkRequestProviderChange extends MENetworkEvent {
public IRequestProvider provider;
public MENetworkRequestProviderChange(IRequestProvider provider) {
this.provider = provider;
}
}

View File

@ -1,5 +0,0 @@
package appeng.api.networking.events;
public class MENetworkRequestableChange extends MENetworkEvent {
}

View File

@ -11,4 +11,6 @@ public interface IRequestProvider {
IAEItemStack requestStack(IAEItemStack stack, Actionable actionable);
boolean isActive();
}

View File

@ -15,7 +15,7 @@ import appeng.api.networking.IGridNode;
import appeng.api.networking.IGridStorage;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.events.MENetworkPostCacheConstruction;
import appeng.api.networking.events.MENetworkRequestableChange;
import appeng.api.networking.events.MENetworkRequestProviderChange;
import appeng.api.networking.request.IRequestGrid;
import appeng.api.networking.request.IRequestProvider;
import appeng.api.networking.security.BaseActionSource;
@ -32,13 +32,21 @@ public class RequestGridCache
private IStorageGrid storageGrid;
private Map<IAEItemStack, Requestable> requestable = new HashMap<>();
private Set<IRequestProvider> requestProviders = new HashSet<>();
private int tickSinceRefresh = 0;
public RequestGridCache(IGrid grid) {
this.grid = grid;
}
@Override
public void onUpdateTick() {}
public void onUpdateTick() {
if (requestProviders.isEmpty()) return;
if (tickSinceRefresh % 10 == 0) {
tickSinceRefresh = 0;
recalcRequestable();
}
tickSinceRefresh++;
}
@Override
public void removeNode(IGridNode gridNode, IGridHost machine) {
@ -51,8 +59,10 @@ public class RequestGridCache
@Override
public void addNode(IGridNode gridNode, IGridHost machine) {
if (machine instanceof IRequestProvider) {
requestProviders.add((IRequestProvider) machine);
recalcRequestable();
if (((IRequestProvider)machine).isActive()) {
requestProviders.add((IRequestProvider) machine);
recalcRequestable();
}
}
}
@ -66,7 +76,12 @@ public class RequestGridCache
public void populateGridStorage(IGridStorage destinationStorage) {}
@MENetworkEventSubscribe
public void requestableChange(MENetworkRequestableChange event) {
public void requestProviderChange(MENetworkRequestProviderChange event) {
if (event.provider.isActive()) {
requestProviders.add(event.provider);
} else {
requestProviders.remove(event.provider);
}
recalcRequestable();
}

View File

@ -35,7 +35,7 @@ import appeng.api.networking.energy.IEnergyGrid;
import appeng.api.networking.events.MENetworkChannelsChanged;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.events.MENetworkPowerStatusChange;
import appeng.api.networking.events.MENetworkRequestableChange;
import appeng.api.networking.events.MENetworkRequestProviderChange;
import appeng.api.networking.request.IRequestProvider;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.ticking.IGridTickable;
@ -82,9 +82,6 @@ public class TileInterface extends AENetworkInvTile
private ForgeDirection pointAt = ForgeDirection.UNKNOWN;
private ILogisticsPipes logisticsPipes = null;
private TileEntity requestPipe = null;
private int ticksSinceRefresh = 0;
private Set<IAEItemStack> requestable = new HashSet<>();
private Set<IAEItemStack> prevRequestable = new HashSet<>();
@MENetworkEventSubscribe
@ -313,16 +310,6 @@ public class TileInterface extends AENetworkInvTile
this.duality.setPriority(newValue);
}
@TileEvent(TileEventType.TICK)
public void tickEvent() {
if (logisticsPipes == null) return;
if (ticksSinceRefresh >= 10) {
refreshRequestable();
ticksSinceRefresh = 0;
}
ticksSinceRefresh++;
}
public void refreshRequestPipe() {
if (logisticsPipes != null) {
for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
@ -330,35 +317,29 @@ public class TileInterface extends AENetworkInvTile
if (logisticsPipes.isRequestPipe(te)) {
if (requestPipe != te) {
requestPipe = te;
this.refreshRequestable();
try {
this.getProxy().getGrid().postEvent(new MENetworkRequestProviderChange(this));
} catch (GridAccessException e) {
// :P
}
}
return;
}
}
}
requestPipe = null;
this.refreshRequestable();
}
public void refreshRequestable() {
requestable.clear();
if (logisticsPipes != null && requestPipe != null) {
requestable.addAll(logisticsPipes.getRequestableItems(requestPipe));
}
if (!requestable.equals(prevRequestable)) { // TODO: post event when amount changes
prevRequestable.clear();
prevRequestable.addAll(requestable);
try {
this.getProxy().getGrid().postEvent(new MENetworkRequestableChange());
} catch (GridAccessException e) {
// :P
}
}
if (requestPipe != null) {
requestPipe = null;
try {
this.getProxy().getGrid().postEvent(new MENetworkRequestProviderChange(this));
} catch (GridAccessException e) {
// :P
}
}
}
}
@Override
public Set<IAEItemStack> getRequestableItems() {
return requestable;
return logisticsPipes.getRequestableItems(requestPipe);
}
@Override
@ -433,4 +414,9 @@ public class TileInterface extends AENetworkInvTile
return 0;
}
}
@Override
public boolean isActive() {
return this.requestPipe != null;
}
}