diff --git a/src/main/java/appeng/me/cache/TickManagerCache.java b/src/main/java/appeng/me/cache/TickManagerCache.java index 667ef20b4..fdb5858d0 100644 --- a/src/main/java/appeng/me/cache/TickManagerCache.java +++ b/src/main/java/appeng/me/cache/TickManagerCache.java @@ -19,9 +19,9 @@ package appeng.me.cache; -import java.util.HashMap; -import java.util.PriorityQueue; +import java.util.*; +import appeng.parts.automation.PartLevelEmitter; import com.google.common.base.Preconditions; import net.minecraft.crash.CrashReport; @@ -46,6 +46,7 @@ public class TickManagerCache implements ITickManager private final HashMap alertable = new HashMap<>(); private final HashMap sleeping = new HashMap<>(); private final HashMap awake = new HashMap<>(); + private final HashMap laterTicker = new HashMap<>(); private final PriorityQueue upcomingTicks = new PriorityQueue<>(); private long currentTick = 0; @@ -86,7 +87,7 @@ public class TickManagerCache implements ITickManager { this.currentTick++; - while( !this.upcomingTicks.isEmpty() ) + while ( !this.upcomingTicks.isEmpty() ) { tt = this.upcomingTicks.peek(); @@ -99,36 +100,50 @@ public class TickManagerCache implements ITickManager this.upcomingTicks.poll(); final int diff = (int) ( this.currentTick - tt.getLastTick() ); - final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff ); - switch( mod ) + if( tt.getGridTickable() instanceof PartLevelEmitter ) + { + laterTicker.put( tt.getNode(), tt ); + } else { - case FASTER: - tt.setCurrentRate( tt.getCurrentRate() - 2 ); - break; - case IDLE: - tt.setCurrentRate( tt.getRequest().maxTickRate ); - break; - case SAME: - break; - case SLEEP: - this.sleepDevice( tt.getNode() ); - break; - case SLOWER: - tt.setCurrentRate( tt.getCurrentRate() + 1 ); - break; - case URGENT: - tt.setCurrentRate( 0 ); - break; - default: - break; - } + final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff ); + + switch ( mod ) + { + case FASTER: + tt.setCurrentRate( tt.getCurrentRate() - 2 ); + break; + case IDLE: + tt.setCurrentRate( tt.getRequest().maxTickRate ); + break; + case SAME: + break; + case SLEEP: + this.sleepDevice( tt.getNode() ); + break; + case SLOWER: + tt.setCurrentRate( tt.getCurrentRate() + 1 ); + break; + case URGENT: + tt.setCurrentRate( 0 ); + break; + default: + break; + } + } if( this.awake.containsKey( tt.getNode() ) ) { this.addToQueue( tt ); } } + Iterator> ltIterator = laterTicker.entrySet().iterator(); + while ( ltIterator.hasNext() ) + { + Map.Entry tickTracker = ltIterator.next(); + tickTracker.getValue().getGridTickable().tickingRequest( tickTracker.getKey(), 1 ); + ltIterator.remove(); + } } catch( final Throwable t ) { diff --git a/src/main/java/appeng/parts/automation/PartLevelEmitter.java b/src/main/java/appeng/parts/automation/PartLevelEmitter.java index a1f46a0e7..dae9093bb 100644 --- a/src/main/java/appeng/parts/automation/PartLevelEmitter.java +++ b/src/main/java/appeng/parts/automation/PartLevelEmitter.java @@ -19,9 +19,15 @@ package appeng.parts.automation; +import javax.annotation.Nonnull; + import java.util.Collection; import java.util.Random; +import appeng.api.networking.IGridNode; +import appeng.api.networking.ticking.IGridTickable; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.api.networking.ticking.TickingRequest; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; @@ -82,7 +88,7 @@ import appeng.util.Platform; import appeng.util.inv.InvOperation; -public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherHost, IStackWatcherHost, ICraftingWatcherHost, IMEMonitorHandlerReceiver, ICraftingProvider +public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherHost, IStackWatcherHost, ICraftingWatcherHost, IMEMonitorHandlerReceiver, ICraftingProvider, IGridTickable { @PartModels @@ -118,6 +124,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH private double centerX; private double centerY; private double centerZ; + private IBaseMonitor changedMonitor; @Reflected public PartLevelEmitter( final ItemStack is ) @@ -400,7 +407,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH @Override public void postChange( final IBaseMonitor monitor, final Iterable change, final IActionSource actionSource ) { - this.updateReportingValue( (IMEMonitor) monitor ); + this.changedMonitor = monitor; } @Override @@ -576,4 +583,22 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH return this.isLevelEmitterOn() ? MODEL_ON_OFF : MODEL_OFF_OFF; } } + + @Nonnull + @Override + public TickingRequest getTickingRequest( @Nonnull IGridNode node ) + { + return new TickingRequest( 1,1,false,false ); + } + + @Nonnull + @Override + public TickRateModulation tickingRequest( @Nonnull IGridNode node, int ticksSinceLastCall ) + { + if (this.changedMonitor != null) + { + this.updateReportingValue((IMEMonitor) changedMonitor); + } + return TickRateModulation.SAME; + } }