reformatted all src files (#141)

This commit is contained in:
YoungOnion
2022-09-17 05:08:02 -06:00
committed by GitHub
parent 3328bfcda2
commit 9011273229
1056 changed files with 88127 additions and 110597 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+198 -263
View File
@@ -19,15 +19,6 @@
package appeng.me.cache;
import java.util.*;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.crafting.MECraftingInventory;
import appeng.helpers.IInterfaceHost;
import appeng.helpers.IPriorityHost;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.SetMultimap;
import appeng.api.AEApi;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
@@ -41,11 +32,7 @@ import appeng.api.networking.security.ISecurityGrid;
import appeng.api.networking.storage.IStackWatcher;
import appeng.api.networking.storage.IStackWatcherHost;
import appeng.api.networking.storage.IStorageGrid;
import appeng.api.storage.ICellContainer;
import appeng.api.storage.ICellProvider;
import appeng.api.storage.IMEInventoryHandler;
import appeng.api.storage.IMEMonitor;
import appeng.api.storage.IStorageChannel;
import appeng.api.storage.*;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack;
import appeng.api.storage.data.IItemList;
@@ -54,311 +41,259 @@ import appeng.me.helpers.GenericInterestManager;
import appeng.me.helpers.MachineSource;
import appeng.me.storage.ItemWatcher;
import appeng.me.storage.NetworkInventoryHandler;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.SetMultimap;
import java.util.*;
public class GridStorageCache implements IStorageGrid
{
public class GridStorageCache implements IStorageGrid {
private final IGrid myGrid;
private final HashSet<ICellProvider> activeCellProviders = new HashSet<>();
private final HashSet<ICellProvider> inactiveCellProviders = new HashSet<>();
private final SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create();
private final GenericInterestManager<ItemWatcher> interestManager = new GenericInterestManager<>( this.interests );
private final HashMap<IGridNode, IStackWatcher> watchers = new HashMap<>();
private final Map<IStorageChannel<? extends IAEStack>, NetworkInventoryHandler<?>> storageNetworks;
private final Map<IStorageChannel<? extends IAEStack>, NetworkMonitor<?>> storageMonitors;
private int localDepth;
private final IGrid myGrid;
private final HashSet<ICellProvider> activeCellProviders = new HashSet<>();
private final HashSet<ICellProvider> inactiveCellProviders = new HashSet<>();
private final SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create();
private final GenericInterestManager<ItemWatcher> interestManager = new GenericInterestManager<>(this.interests);
private final HashMap<IGridNode, IStackWatcher> watchers = new HashMap<>();
private final Map<IStorageChannel<? extends IAEStack>, NetworkInventoryHandler<?>> storageNetworks;
private final Map<IStorageChannel<? extends IAEStack>, NetworkMonitor<?>> storageMonitors;
private int localDepth;
public GridStorageCache( final IGrid g )
{
this.myGrid = g;
this.storageNetworks = new IdentityHashMap<>();
this.storageMonitors = new IdentityHashMap<>();
public GridStorageCache(final IGrid g) {
this.myGrid = g;
this.storageNetworks = new IdentityHashMap<>();
this.storageMonitors = new IdentityHashMap<>();
AEApi.instance().storage().storageChannels().forEach( channel -> this.storageMonitors.put( channel, new NetworkMonitor<>( this, channel ) ) );
}
AEApi.instance().storage().storageChannels().forEach(channel -> this.storageMonitors.put(channel, new NetworkMonitor<>(this, channel)));
}
@Override
public void onUpdateTick()
{
this.storageMonitors.forEach( ( channel, monitor ) -> monitor.onTick() );
}
@Override
public void onUpdateTick() {
this.storageMonitors.forEach((channel, monitor) -> monitor.onTick());
}
@Override
public void removeNode( final IGridNode node, final IGridHost machine )
{
if( machine instanceof ICellContainer )
{
final ICellContainer cc = (ICellContainer) machine;
final CellChangeTracker tracker = new CellChangeTracker();
@Override
public void removeNode(final IGridNode node, final IGridHost machine) {
if (machine instanceof ICellContainer) {
final ICellContainer cc = (ICellContainer) machine;
final CellChangeTracker tracker = new CellChangeTracker();
this.removeCellProvider( cc, tracker );
this.inactiveCellProviders.remove( cc );
cellUpdate( null );
this.removeCellProvider(cc, tracker);
this.inactiveCellProviders.remove(cc);
cellUpdate(null);
tracker.applyChanges();
}
tracker.applyChanges();
}
if( machine instanceof IStackWatcherHost )
{
final IStackWatcher myWatcher = this.watchers.get( node );
if (machine instanceof IStackWatcherHost) {
final IStackWatcher myWatcher = this.watchers.get(node);
if( myWatcher != null )
{
myWatcher.reset();
this.watchers.remove( node );
}
}
}
if (myWatcher != null) {
myWatcher.reset();
this.watchers.remove(node);
}
}
}
@Override
public void addNode( final IGridNode node, final IGridHost machine )
{
if( machine instanceof ICellContainer )
{
final ICellContainer cc = (ICellContainer) machine;
this.inactiveCellProviders.add( cc );
@Override
public void addNode(final IGridNode node, final IGridHost machine) {
if (machine instanceof ICellContainer) {
final ICellContainer cc = (ICellContainer) machine;
this.inactiveCellProviders.add(cc);
cellUpdate( null );
cellUpdate(null);
if( node.isActive() )
{
final CellChangeTracker tracker = new CellChangeTracker();
if (node.isActive()) {
final CellChangeTracker tracker = new CellChangeTracker();
this.addCellProvider( cc, tracker );
tracker.applyChanges();
}
}
this.addCellProvider(cc, tracker);
tracker.applyChanges();
}
}
if( machine instanceof IStackWatcherHost )
{
final IStackWatcherHost swh = (IStackWatcherHost) machine;
final ItemWatcher iw = new ItemWatcher( this, swh );
this.watchers.put( node, iw );
swh.updateWatcher( iw );
}
}
if (machine instanceof IStackWatcherHost) {
final IStackWatcherHost swh = (IStackWatcherHost) machine;
final ItemWatcher iw = new ItemWatcher(this, swh);
this.watchers.put(node, iw);
swh.updateWatcher(iw);
}
}
@Override
public void onSplit( final IGridStorage storageB )
{
@Override
public void onSplit(final IGridStorage storageB) {
}
}
@Override
public void onJoin( final IGridStorage storageB )
{
@Override
public void onJoin(final IGridStorage storageB) {
}
}
@Override
public void populateGridStorage( final IGridStorage storage )
{
@Override
public void populateGridStorage(final IGridStorage storage) {
}
}
public <T extends IAEStack<T>> IMEInventoryHandler<T> getInventoryHandler( IStorageChannel<T> channel )
{
return (IMEInventoryHandler<T>) this.storageNetworks.computeIfAbsent( channel, this::buildNetworkStorage );
}
public <T extends IAEStack<T>> IMEInventoryHandler<T> getInventoryHandler(IStorageChannel<T> channel) {
return (IMEInventoryHandler<T>) this.storageNetworks.computeIfAbsent(channel, this::buildNetworkStorage);
}
@Override
public <T extends IAEStack<T>> IMEMonitor<T> getInventory( IStorageChannel<T> channel )
{
return (IMEMonitor<T>) this.storageMonitors.get( channel );
}
@Override
public <T extends IAEStack<T>> IMEMonitor<T> getInventory(IStorageChannel<T> channel) {
return (IMEMonitor<T>) this.storageMonitors.get(channel);
}
private CellChangeTracker addCellProvider( final ICellProvider cc, final CellChangeTracker tracker )
{
if( this.inactiveCellProviders.contains( cc ) )
{
this.inactiveCellProviders.remove( cc );
this.activeCellProviders.add( cc );
private CellChangeTracker addCellProvider(final ICellProvider cc, final CellChangeTracker tracker) {
if (this.inactiveCellProviders.contains(cc)) {
this.inactiveCellProviders.remove(cc);
this.activeCellProviders.add(cc);
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource((IActionHost) cc) : new BaseActionSource();
this.storageMonitors.forEach( ( channel, monitor ) ->
{
for( final IMEInventoryHandler<?> h : cc.getCellArray( channel ) )
{
tracker.postChanges( channel, 1, h, actionSrc );
}
} );
}
this.storageMonitors.forEach((channel, monitor) ->
{
for (final IMEInventoryHandler<?> h : cc.getCellArray(channel)) {
tracker.postChanges(channel, 1, h, actionSrc);
}
});
}
return tracker;
}
return tracker;
}
private CellChangeTracker removeCellProvider( final ICellProvider cc, final CellChangeTracker tracker )
{
if( this.activeCellProviders.contains( cc ) )
{
this.activeCellProviders.remove( cc );
this.inactiveCellProviders.add( cc );
private CellChangeTracker removeCellProvider(final ICellProvider cc, final CellChangeTracker tracker) {
if (this.activeCellProviders.contains(cc)) {
this.activeCellProviders.remove(cc);
this.inactiveCellProviders.add(cc);
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource((IActionHost) cc) : new BaseActionSource();
this.storageMonitors.forEach( ( channel, monitor ) ->
{
for( final IMEInventoryHandler<IAEItemStack> h : cc.getCellArray( channel ) )
{
tracker.postChanges( channel, -1, h, actionSrc );
}
} );
}
this.storageMonitors.forEach((channel, monitor) ->
{
for (final IMEInventoryHandler<IAEItemStack> h : cc.getCellArray(channel)) {
tracker.postChanges(channel, -1, h, actionSrc);
}
});
}
return tracker;
}
return tracker;
}
@MENetworkEventSubscribe
public void cellUpdate( final MENetworkCellArrayUpdate ev )
{
if( localDepth > 0 )
{
return;
}
localDepth++;
this.storageNetworks.clear();
@MENetworkEventSubscribe
public void cellUpdate(final MENetworkCellArrayUpdate ev) {
if (localDepth > 0) {
return;
}
localDepth++;
this.storageNetworks.clear();
final List<ICellProvider> ll = new ArrayList<ICellProvider>();
ll.addAll( this.inactiveCellProviders );
ll.addAll( this.activeCellProviders );
final List<ICellProvider> ll = new ArrayList<ICellProvider>();
ll.addAll(this.inactiveCellProviders);
ll.addAll(this.activeCellProviders);
final CellChangeTracker tracker = new CellChangeTracker();
final CellChangeTracker tracker = new CellChangeTracker();
for( final ICellProvider cc : ll )
{
boolean active = true;
for (final ICellProvider cc : ll) {
boolean active = true;
if( cc instanceof IActionHost )
{
final IGridNode node = ( (IActionHost) cc ).getActionableNode();
if( node != null && node.isActive() )
{
active = true;
}
else
{
active = false;
}
}
if (cc instanceof IActionHost) {
final IGridNode node = ((IActionHost) cc).getActionableNode();
active = node != null && node.isActive();
}
if( active )
{
this.addCellProvider( cc, tracker );
}
else
{
this.removeCellProvider( cc, tracker );
}
}
tracker.applyChanges();
localDepth--;
this.storageMonitors.forEach( ( channel, monitor ) -> monitor.setForceUpdate( true ) );
}
if (active) {
this.addCellProvider(cc, tracker);
} else {
this.removeCellProvider(cc, tracker);
}
}
tracker.applyChanges();
localDepth--;
this.storageMonitors.forEach((channel, monitor) -> monitor.setForceUpdate(true));
}
private <T extends IAEStack<T>, C extends IStorageChannel<T>> void postChangesToNetwork( final C chan, final int upOrDown, final IItemList<T> availableItems, final IActionSource src )
{
this.storageMonitors.get( chan ).postChange( upOrDown > 0, (Iterable) availableItems, src );
}
private <T extends IAEStack<T>, C extends IStorageChannel<T>> void postChangesToNetwork(final C chan, final int upOrDown, final IItemList<T> availableItems, final IActionSource src) {
this.storageMonitors.get(chan).postChange(upOrDown > 0, (Iterable) availableItems, src);
}
private <T extends IAEStack<T>, C extends IStorageChannel<T>> NetworkInventoryHandler<T> buildNetworkStorage( final C chan )
{
final SecurityCache security = this.getGrid().getCache( ISecurityGrid.class );
private <T extends IAEStack<T>, C extends IStorageChannel<T>> NetworkInventoryHandler<T> buildNetworkStorage(final C chan) {
final SecurityCache security = this.getGrid().getCache(ISecurityGrid.class);
final NetworkInventoryHandler<T> storageNetwork = new NetworkInventoryHandler<>( chan, security );
final NetworkInventoryHandler<T> storageNetwork = new NetworkInventoryHandler<>(chan, security);
for( final ICellProvider cc : this.activeCellProviders )
{
for( final IMEInventoryHandler<T> h : cc.getCellArray( chan ) )
{
storageNetwork.addNewStorage( h );
}
}
for (final ICellProvider cc : this.activeCellProviders) {
for (final IMEInventoryHandler<T> h : cc.getCellArray(chan)) {
storageNetwork.addNewStorage(h);
}
}
return storageNetwork;
}
return storageNetwork;
}
@Override
public void postAlterationOfStoredItems( final IStorageChannel<?> chan, final Iterable<? extends IAEStack<?>> input, final IActionSource src )
{
this.storageMonitors.get( chan ).postChange( true, (Iterable) input, src );
}
@Override
public void postAlterationOfStoredItems(final IStorageChannel<?> chan, final Iterable<? extends IAEStack<?>> input, final IActionSource src) {
this.storageMonitors.get(chan).postChange(true, (Iterable) input, src);
}
@Override
public void postCraftablesChanges( IStorageChannel<?> chan, Iterable<? extends IAEStack<?>> input, IActionSource src )
{
this.storageMonitors.get( chan ).updateCraftables( (Iterable) input, src );
}
@Override
public void postCraftablesChanges(IStorageChannel<?> chan, Iterable<? extends IAEStack<?>> input, IActionSource src) {
this.storageMonitors.get(chan).updateCraftables((Iterable) input, src);
}
@Override
public void registerCellProvider( final ICellProvider provider )
{
this.inactiveCellProviders.add( provider );
this.addCellProvider( provider, new CellChangeTracker() ).applyChanges();
}
@Override
public void registerCellProvider(final ICellProvider provider) {
this.inactiveCellProviders.add(provider);
this.addCellProvider(provider, new CellChangeTracker()).applyChanges();
}
@Override
public void unregisterCellProvider( final ICellProvider provider )
{
this.removeCellProvider( provider, new CellChangeTracker() ).applyChanges();
this.inactiveCellProviders.remove( provider );
}
@Override
public void unregisterCellProvider(final ICellProvider provider) {
this.removeCellProvider(provider, new CellChangeTracker()).applyChanges();
this.inactiveCellProviders.remove(provider);
}
public GenericInterestManager<ItemWatcher> getInterestManager()
{
return this.interestManager;
}
public GenericInterestManager<ItemWatcher> getInterestManager() {
return this.interestManager;
}
IGrid getGrid()
{
return this.myGrid;
}
IGrid getGrid() {
return this.myGrid;
}
private class CellChangeTrackerRecord<T extends IAEStack<T>>
{
private class CellChangeTrackerRecord<T extends IAEStack<T>> {
final IStorageChannel<T> channel;
final int up_or_down;
final IItemList<T> list;
final IActionSource src;
final IStorageChannel<T> channel;
final int up_or_down;
final IItemList<T> list;
final IActionSource src;
public CellChangeTrackerRecord( final IStorageChannel<T> channel, final int i, final IMEInventoryHandler<T> h, final IActionSource actionSrc )
{
this.channel = channel;
this.up_or_down = i;
this.src = actionSrc;
public CellChangeTrackerRecord(final IStorageChannel<T> channel, final int i, final IMEInventoryHandler<T> h, final IActionSource actionSrc) {
this.channel = channel;
this.up_or_down = i;
this.src = actionSrc;
this.list = h.getAvailableItems( channel.createList() );
}
this.list = h.getAvailableItems(channel.createList());
}
public void applyChanges()
{
if( !this.list.isEmpty() )
{
GridStorageCache.this.postChangesToNetwork( this.channel, this.up_or_down, this.list, this.src );
}
}
}
public void applyChanges() {
if (!this.list.isEmpty()) {
GridStorageCache.this.postChangesToNetwork(this.channel, this.up_or_down, this.list, this.src);
}
}
}
private class CellChangeTracker<T extends IAEStack<T>>
{
private class CellChangeTracker<T extends IAEStack<T>> {
final List<CellChangeTrackerRecord<T>> data = new ArrayList<>();
final List<CellChangeTrackerRecord<T>> data = new ArrayList<>();
public void postChanges( final IStorageChannel<T> channel, final int i, final IMEInventoryHandler<T> h, final IActionSource actionSrc )
{
this.data.add( new CellChangeTrackerRecord<T>( channel, i, h, actionSrc ) );
}
public void postChanges(final IStorageChannel<T> channel, final int i, final IMEInventoryHandler<T> h, final IActionSource actionSrc) {
this.data.add(new CellChangeTrackerRecord<T>(channel, i, h, actionSrc));
}
public void applyChanges()
{
for( final CellChangeTrackerRecord<T> rec : this.data )
{
rec.applyChanges();
}
}
}
public void applyChanges() {
for (final CellChangeTrackerRecord<T> rec : this.data) {
rec.applyChanges();
}
}
}
}
+221 -282
View File
@@ -19,8 +19,6 @@
package appeng.me.cache;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import appeng.api.AEApi;
import appeng.api.config.AccessRestriction;
import appeng.api.config.Actionable;
@@ -38,339 +36,280 @@ import appeng.me.storage.ItemWatcher;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
import java.util.Map.Entry;
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
{
@Nonnull
private static final HashMap<IActionSource, LinkedList<NetworkMonitor<?>>> src2MonitorsMap = new HashMap<>();
private static final Set<IActionSource> nestingSources = new HashSet<>();
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T> {
@Nonnull
private static final HashMap<IActionSource, LinkedList<NetworkMonitor<?>>> src2MonitorsMap = new HashMap<>();
private static final Set<IActionSource> nestingSources = new HashSet<>();
protected boolean wasNested = false;
protected boolean isNested = false;
protected boolean wasNested = false;
protected boolean isNested = false;
@Nonnull
private final GridStorageCache myGridCache;
@Nonnull
private final IStorageChannel<T> myChannel;
@Nonnull
private final IItemList<T> cachedList;
@Nonnull
private final Object2ObjectMap<IMEMonitorHandlerReceiver<T>, Object> listeners;
@Nonnull
private final GridStorageCache myGridCache;
@Nonnull
private final IStorageChannel<T> myChannel;
@Nonnull
private final IItemList<T> cachedList;
@Nonnull
private final Object2ObjectMap<IMEMonitorHandlerReceiver<T>, Object> listeners;
private boolean sendEvent = false;
private long gridItemCount;
private long gridFluidCount;
public boolean forceUpdate;
private boolean sendEvent = false;
private long gridItemCount;
private long gridFluidCount;
public boolean forceUpdate;
public NetworkMonitor( final GridStorageCache cache, final IStorageChannel<T> chan )
{
this.myGridCache = cache;
this.myChannel = chan;
this.cachedList = chan.createList();
this.listeners = new Object2ObjectOpenHashMap<>();
}
public NetworkMonitor(final GridStorageCache cache, final IStorageChannel<T> chan) {
this.myGridCache = cache;
this.myChannel = chan;
this.cachedList = chan.createList();
this.listeners = new Object2ObjectOpenHashMap<>();
}
@Override
public void addListener( final IMEMonitorHandlerReceiver<T> l, final Object verificationToken )
{
this.listeners.put( l, verificationToken );
}
@Override
public void addListener(final IMEMonitorHandlerReceiver<T> l, final Object verificationToken) {
this.listeners.put(l, verificationToken);
}
@Override
public boolean canAccept( final T input )
{
return this.getHandler().canAccept( input );
}
@Override
public boolean canAccept(final T input) {
return this.getHandler().canAccept(input);
}
@Override
public T extractItems( final T request, final Actionable mode, final IActionSource src )
{
return this.getHandler().extractItems( request, mode, src );
}
@Override
public T extractItems(final T request, final Actionable mode, final IActionSource src) {
return this.getHandler().extractItems(request, mode, src);
}
@Override
public AccessRestriction getAccess()
{
return this.getHandler().getAccess();
}
@Override
public AccessRestriction getAccess() {
return this.getHandler().getAccess();
}
@Override
public IItemList<T> getAvailableItems( final IItemList<T> out )
{
return this.getHandler().getAvailableItems( out );
}
@Override
public IItemList<T> getAvailableItems(final IItemList<T> out) {
return this.getHandler().getAvailableItems(out);
}
@Override
public IStorageChannel<T> getChannel()
{
return this.getHandler().getChannel();
}
@Override
public IStorageChannel<T> getChannel() {
return this.getHandler().getChannel();
}
@Override
public int getPriority()
{
return this.getHandler().getPriority();
}
@Override
public int getPriority() {
return this.getHandler().getPriority();
}
@Override
public int getSlot()
{
return this.getHandler().getSlot();
}
@Override
public int getSlot() {
return this.getHandler().getSlot();
}
public long getGridCurrentCount()
{
if( myChannel == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) )
{
return gridItemCount;
}
else if( myChannel == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) )
{
return gridFluidCount;
}
return 0;
}
public long getGridCurrentCount() {
if (myChannel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) {
return gridItemCount;
} else if (myChannel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)) {
return gridFluidCount;
}
return 0;
}
public void incGridCurrentCount( long count )
{
if( myChannel == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) )
{
gridItemCount += count;
}
else if( myChannel == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) )
{
gridFluidCount += count;
}
}
public void incGridCurrentCount(long count) {
if (myChannel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) {
gridItemCount += count;
} else if (myChannel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)) {
gridFluidCount += count;
}
}
@Nonnull
@Override
public IItemList<T> getStorageList()
{
return this.cachedList;
}
@Nonnull
@Override
public IItemList<T> getStorageList() {
return this.cachedList;
}
@Override
public T injectItems( final T input, final Actionable mode, final IActionSource src )
{
return this.getHandler().injectItems( input, mode, src );
}
@Override
public T injectItems(final T input, final Actionable mode, final IActionSource src) {
return this.getHandler().injectItems(input, mode, src);
}
@Override
public boolean isPrioritized( final T input )
{
return this.getHandler().isPrioritized( input );
}
@Override
public boolean isPrioritized(final T input) {
return this.getHandler().isPrioritized(input);
}
@Override
public void removeListener( final IMEMonitorHandlerReceiver<T> l )
{
this.listeners.remove( l );
}
@Override
public void removeListener(final IMEMonitorHandlerReceiver<T> l) {
this.listeners.remove(l);
}
@Override
public boolean validForPass( final int i )
{
return this.getHandler().validForPass( i );
}
@Override
public boolean validForPass(final int i) {
return this.getHandler().validForPass(i);
}
@Nullable
private IMEInventoryHandler<T> getHandler()
{
return this.myGridCache.getInventoryHandler( this.myChannel );
}
@Nullable
private IMEInventoryHandler<T> getHandler() {
return this.myGridCache.getInventoryHandler(this.myChannel);
}
private Iterator<Entry<IMEMonitorHandlerReceiver<T>, Object>> getListeners()
{
return this.listeners.entrySet().iterator();
}
private Iterator<Entry<IMEMonitorHandlerReceiver<T>, Object>> getListeners() {
return this.listeners.entrySet().iterator();
}
private void notifyListenersOfChange( final Iterable<T> diff, final IActionSource src )
{
final Iterator<Entry<IMEMonitorHandlerReceiver<T>, Object>> i = this.getListeners();
private void notifyListenersOfChange(final Iterable<T> diff, final IActionSource src) {
final Iterator<Entry<IMEMonitorHandlerReceiver<T>, Object>> i = this.getListeners();
while( i.hasNext() )
{
final Entry<IMEMonitorHandlerReceiver<T>, Object> o = i.next();
final IMEMonitorHandlerReceiver<T> receiver = o.getKey();
while (i.hasNext()) {
final Entry<IMEMonitorHandlerReceiver<T>, Object> o = i.next();
final IMEMonitorHandlerReceiver<T> receiver = o.getKey();
if( receiver.isValid( o.getValue() ) )
{
receiver.postChange( this, diff, src );
}
else
{
i.remove();
}
}
}
if (receiver.isValid(o.getValue())) {
receiver.postChange(this, diff, src);
} else {
i.remove();
}
}
}
protected void updateCraftables( Iterable<T> input, IActionSource src )
{
for( final T changedItem : input )
{
if (changedItem.isCraftable()) {
this.cachedList.add( changedItem );
}
else
{
T i = this.cachedList.findPrecise( changedItem );
if (i != null)
i.setCraftable( false );
}
}
}
protected void updateCraftables(Iterable<T> input, IActionSource src) {
for (final T changedItem : input) {
if (changedItem.isCraftable()) {
this.cachedList.add(changedItem);
} else {
T i = this.cachedList.findPrecise(changedItem);
if (i != null)
i.setCraftable(false);
}
}
}
protected void postChange( final boolean add, final Iterable<T> changes, final IActionSource src )
{
src2MonitorsMap.putIfAbsent( src, new LinkedList<>() );
if( src2MonitorsMap.get( src ).contains( this ) )
{
nestingSources.add( src );
return;
}
src2MonitorsMap.get( src ).add( this );
protected void postChange(final boolean add, final Iterable<T> changes, final IActionSource src) {
src2MonitorsMap.putIfAbsent(src, new LinkedList<>());
if (src2MonitorsMap.get(src).contains(this)) {
nestingSources.add(src);
return;
}
src2MonitorsMap.get(src).add(this);
this.sendEvent = true;
this.sendEvent = true;
for( final T change : changes )
{
//T change = changed;
if( !add && change != null )
{
//change = changed.copy();
change.setStackSize( -change.getStackSize() );
}
for (final T change : changes) {
//T change = changed;
if (!add && change != null) {
//change = changed.copy();
change.setStackSize(-change.getStackSize());
}
incGridCurrentCount( change.getStackSize() );
this.cachedList.addStorage( change );
incGridCurrentCount(change.getStackSize());
this.cachedList.addStorage(change);
if( this.myGridCache.getInterestManager().containsKey( change ) )
{
final Collection<ItemWatcher> list = this.myGridCache.getInterestManager().get( change );
if (this.myGridCache.getInterestManager().containsKey(change)) {
final Collection<ItemWatcher> list = this.myGridCache.getInterestManager().get(change);
if( !list.isEmpty() )
{
IAEStack<T> fullStack = this.getStorageList().findPrecise( change );
if (!list.isEmpty()) {
IAEStack<T> fullStack = this.getStorageList().findPrecise(change);
if( fullStack == null )
{
fullStack = change.copy();
fullStack.setStackSize( 0 );
}
if (fullStack == null) {
fullStack = change.copy();
fullStack.setStackSize(0);
}
this.myGridCache.getInterestManager().enableTransactions();
this.myGridCache.getInterestManager().enableTransactions();
for( final ItemWatcher iw : list )
{
iw.getHost().onStackChange( this.getStorageList(), fullStack, change, src, this.getChannel() );
}
for (final ItemWatcher iw : list) {
iw.getHost().onStackChange(this.getStorageList(), fullStack, change, src, this.getChannel());
}
this.myGridCache.getInterestManager().disableTransactions();
}
}
}
this.myGridCache.getInterestManager().disableTransactions();
}
}
}
this.notifyListenersOfChange( changes, src );
this.notifyListenersOfChange(changes, src);
if( src2MonitorsMap.get( src ).getFirst() == this )
{
boolean nested = nestingSources.contains( src );
src2MonitorsMap.get( src ).forEach( networkMonitor -> networkMonitor.isNested = nested );
if (src2MonitorsMap.get(src).getFirst() == this) {
boolean nested = nestingSources.contains(src);
src2MonitorsMap.get(src).forEach(networkMonitor -> networkMonitor.isNested = nested);
src2MonitorsMap.get( src ).forEach( networkMonitor -> {
if( networkMonitor.isNested != networkMonitor.wasNested )
{
networkMonitor.wasNested = networkMonitor.isNested;
networkMonitor.setForceUpdate( true );
}
} );
src2MonitorsMap.remove( src );
nestingSources.remove( src );
}
}
src2MonitorsMap.get(src).forEach(networkMonitor -> {
if (networkMonitor.isNested != networkMonitor.wasNested) {
networkMonitor.wasNested = networkMonitor.isNested;
networkMonitor.setForceUpdate(true);
}
});
src2MonitorsMap.remove(src);
nestingSources.remove(src);
}
}
public void setForceUpdate( boolean forceUpdate )
{
this.forceUpdate = forceUpdate;
}
public void setForceUpdate(boolean forceUpdate) {
this.forceUpdate = forceUpdate;
}
void forceUpdate()
{
forceUpdate = false;
this.cachedList.resetStatus();
this.getAvailableItems( this.cachedList );
void forceUpdate() {
forceUpdate = false;
this.cachedList.resetStatus();
this.getAvailableItems(this.cachedList);
long count = 0;
for( T stack : this.cachedList )
{
count += stack.getStackSize();
long count = 0;
for (T stack : this.cachedList) {
count += stack.getStackSize();
if( this.myGridCache.getInterestManager().containsKey( stack ) )
{
final Collection<ItemWatcher> list = this.myGridCache.getInterestManager().get( stack );
if (this.myGridCache.getInterestManager().containsKey(stack)) {
final Collection<ItemWatcher> list = this.myGridCache.getInterestManager().get(stack);
if( !list.isEmpty() )
{
IAEStack<T> fullStack = this.getStorageList().findPrecise( stack );
if (!list.isEmpty()) {
IAEStack<T> fullStack = this.getStorageList().findPrecise(stack);
if( fullStack == null )
{
fullStack = stack.copy();
fullStack.setStackSize( 0 );
}
if (fullStack == null) {
fullStack = stack.copy();
fullStack.setStackSize(0);
}
this.myGridCache.getInterestManager().enableTransactions();
this.myGridCache.getInterestManager().enableTransactions();
for ( final ItemWatcher iw : list )
{
iw.getHost().onStackChange( this.getStorageList(), fullStack, stack, null, this.getChannel() );
}
for (final ItemWatcher iw : list) {
iw.getHost().onStackChange(this.getStorageList(), fullStack, stack, null, this.getChannel());
}
this.myGridCache.getInterestManager().disableTransactions();
}
}
}
this.myGridCache.getInterestManager().disableTransactions();
}
}
}
if( myChannel == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) )
{
gridItemCount = count;
}
else if( myChannel == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) )
{
gridFluidCount = count;
}
if (myChannel == AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class)) {
gridItemCount = count;
} else if (myChannel == AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class)) {
gridFluidCount = count;
}
final Iterator<Entry<IMEMonitorHandlerReceiver<T>, Object>> i = this.getListeners();
while ( i.hasNext() )
{
final Entry<IMEMonitorHandlerReceiver<T>, Object> o = i.next();
final IMEMonitorHandlerReceiver<T> receiver = o.getKey();
final Iterator<Entry<IMEMonitorHandlerReceiver<T>, Object>> i = this.getListeners();
while (i.hasNext()) {
final Entry<IMEMonitorHandlerReceiver<T>, Object> o = i.next();
final IMEMonitorHandlerReceiver<T> receiver = o.getKey();
if( receiver.isValid( o.getValue() ) )
{
receiver.onListUpdate();
}
else
{
i.remove();
}
}
}
if (receiver.isValid(o.getValue())) {
receiver.onListUpdate();
} else {
i.remove();
}
}
}
void onTick()
{
if( forceUpdate )
{
forceUpdate();
}
if( this.sendEvent )
{
this.sendEvent = false;
this.myGridCache.getGrid().postEvent( new MENetworkStorageEvent( this, this.myChannel ) );
}
}
void onTick() {
if (forceUpdate) {
forceUpdate();
}
if (this.sendEvent) {
this.sendEvent = false;
this.myGridCache.getGrid().postEvent(new MENetworkStorageEvent(this, this.myChannel));
}
}
}
+169 -228
View File
@@ -19,18 +19,7 @@
package appeng.me.cache;
import java.util.Collection;
import java.util.Random;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import appeng.api.networking.GridFlags;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridCache;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.networking.IGridStorage;
import appeng.api.networking.*;
import appeng.api.networking.events.MENetworkBootingStatusChange;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.events.MENetworkPowerStatusChange;
@@ -39,261 +28,213 @@ import appeng.core.AELog;
import appeng.me.cache.helpers.TunnelCollection;
import appeng.parts.p2p.PartP2PTunnel;
import appeng.parts.p2p.PartP2PTunnelME;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.Random;
public class P2PCache implements IGridCache
{
private static final TunnelCollection<PartP2PTunnel> NULL_COLLECTION = new TunnelCollection<PartP2PTunnel>( null, null );
public class P2PCache implements IGridCache {
private static final TunnelCollection<PartP2PTunnel> NULL_COLLECTION = new TunnelCollection<PartP2PTunnel>(null, null);
private final IGrid myGrid;
private final Multimap<Short, PartP2PTunnel> inputs = LinkedHashMultimap.create();
private final Multimap<Short, PartP2PTunnel> outputs = LinkedHashMultimap.create();
private final Random frequencyGenerator;
private final IGrid myGrid;
private final Multimap<Short, PartP2PTunnel> inputs = LinkedHashMultimap.create();
private final Multimap<Short, PartP2PTunnel> outputs = LinkedHashMultimap.create();
private final Random frequencyGenerator;
public P2PCache( final IGrid g )
{
this.myGrid = g;
this.frequencyGenerator = new Random( g.hashCode() );
}
public P2PCache(final IGrid g) {
this.myGrid = g;
this.frequencyGenerator = new Random(g.hashCode());
}
@MENetworkEventSubscribe
public void bootComplete( final MENetworkBootingStatusChange bootStatus )
{
final ITickManager tm = this.myGrid.getCache( ITickManager.class );
for( final PartP2PTunnel me : this.inputs.values() )
{
if( me instanceof PartP2PTunnelME )
{
tm.wakeDevice( me.getGridNode() );
}
}
}
@MENetworkEventSubscribe
public void bootComplete(final MENetworkBootingStatusChange bootStatus) {
final ITickManager tm = this.myGrid.getCache(ITickManager.class);
for (final PartP2PTunnel me : this.inputs.values()) {
if (me instanceof PartP2PTunnelME) {
tm.wakeDevice(me.getGridNode());
}
}
}
@MENetworkEventSubscribe
public void bootComplete( final MENetworkPowerStatusChange power )
{
final ITickManager tm = this.myGrid.getCache( ITickManager.class );
for( final PartP2PTunnel me : this.inputs.values() )
{
if( me instanceof PartP2PTunnelME )
{
tm.wakeDevice( me.getGridNode() );
}
}
}
@MENetworkEventSubscribe
public void bootComplete(final MENetworkPowerStatusChange power) {
final ITickManager tm = this.myGrid.getCache(ITickManager.class);
for (final PartP2PTunnel me : this.inputs.values()) {
if (me instanceof PartP2PTunnelME) {
tm.wakeDevice(me.getGridNode());
}
}
}
@Override
public void onUpdateTick()
{
@Override
public void onUpdateTick() {
}
}
@Override
public void removeNode( final IGridNode node, final IGridHost machine )
{
if( machine instanceof PartP2PTunnel )
{
if( machine instanceof PartP2PTunnelME )
{
if( !node.hasFlag( GridFlags.REQUIRE_CHANNEL ) )
{
return;
}
}
@Override
public void removeNode(final IGridNode node, final IGridHost machine) {
if (machine instanceof PartP2PTunnel) {
if (machine instanceof PartP2PTunnelME) {
if (!node.hasFlag(GridFlags.REQUIRE_CHANNEL)) {
return;
}
}
final PartP2PTunnel t = (PartP2PTunnel) machine;
// AELog.info( "rmv-" + (t.output ? "output: " : "input: ") + t.freq );
final PartP2PTunnel t = (PartP2PTunnel) machine;
// AELog.info( "rmv-" + (t.output ? "output: " : "input: ") + t.freq );
if( t.isOutput() )
{
this.outputs.remove( t.getFrequency(), t );
}
else
{
this.inputs.remove( t.getFrequency(), t );
}
if (t.isOutput()) {
this.outputs.remove(t.getFrequency(), t);
} else {
this.inputs.remove(t.getFrequency(), t);
}
if( this.inputs.get( t.getFrequency() ).isEmpty() )
{
this.inputs.removeAll( t.getFrequency() );
}
if( this.outputs.get( t.getFrequency() ).isEmpty() )
{
this.outputs.removeAll( t.getFrequency() );
}
if (this.inputs.get(t.getFrequency()).isEmpty()) {
this.inputs.removeAll(t.getFrequency());
}
if (this.outputs.get(t.getFrequency()).isEmpty()) {
this.outputs.removeAll(t.getFrequency());
}
this.updateTunnel( t.getFrequency(), t.isOutput(), false );
}
}
this.updateTunnel(t.getFrequency(), t.isOutput(), false);
}
}
@Override
public void addNode( final IGridNode node, final IGridHost machine )
{
if( machine instanceof PartP2PTunnel )
{
if( machine instanceof PartP2PTunnelME )
{
if( !node.hasFlag( GridFlags.REQUIRE_CHANNEL ) )
{
return;
}
}
@Override
public void addNode(final IGridNode node, final IGridHost machine) {
if (machine instanceof PartP2PTunnel) {
if (machine instanceof PartP2PTunnelME) {
if (!node.hasFlag(GridFlags.REQUIRE_CHANNEL)) {
return;
}
}
final PartP2PTunnel t = (PartP2PTunnel) machine;
// AELog.info( "add-" + (t.output ? "output: " : "input: ") + t.freq );
final PartP2PTunnel t = (PartP2PTunnel) machine;
// AELog.info( "add-" + (t.output ? "output: " : "input: ") + t.freq );
if( t.isOutput() )
{
this.outputs.put( t.getFrequency(), t );
}
else
{
this.inputs.put( t.getFrequency(), t );
}
if (t.isOutput()) {
this.outputs.put(t.getFrequency(), t);
} else {
this.inputs.put(t.getFrequency(), t);
}
this.updateTunnel( t.getFrequency(), t.isOutput(), false );
}
}
this.updateTunnel(t.getFrequency(), t.isOutput(), false);
}
}
@Override
public void onSplit( final IGridStorage storageB )
{
@Override
public void onSplit(final IGridStorage storageB) {
}
}
@Override
public void onJoin( final IGridStorage storageB )
{
@Override
public void onJoin(final IGridStorage storageB) {
}
}
@Override
public void populateGridStorage( final IGridStorage storage )
{
@Override
public void populateGridStorage(final IGridStorage storage) {
}
}
public void removeTunnel( final PartP2PTunnel t, short freq )
{
this.outputs.remove( freq, t );
this.inputs.remove( freq, t );
if( this.inputs.get( t.getFrequency() ).isEmpty() )
{
this.inputs.removeAll( t.getFrequency() );
}
if( this.outputs.get( t.getFrequency() ).isEmpty() )
{
this.outputs.removeAll( t.getFrequency() );
}
}
public void removeTunnel(final PartP2PTunnel t, short freq) {
this.outputs.remove(freq, t);
this.inputs.remove(freq, t);
if (this.inputs.get(t.getFrequency()).isEmpty()) {
this.inputs.removeAll(t.getFrequency());
}
if (this.outputs.get(t.getFrequency()).isEmpty()) {
this.outputs.removeAll(t.getFrequency());
}
}
private void updateTunnel( final short freq, final boolean updateOutputs, final boolean configChange )
{
for( final PartP2PTunnel p : this.outputs.get( freq ) )
{
if( configChange )
{
p.onTunnelConfigChange();
}
p.onTunnelNetworkChange();
}
private void updateTunnel(final short freq, final boolean updateOutputs, final boolean configChange) {
for (final PartP2PTunnel p : this.outputs.get(freq)) {
if (configChange) {
p.onTunnelConfigChange();
}
p.onTunnelNetworkChange();
}
for( final PartP2PTunnel in : this.inputs.get( freq ) )
{
if( configChange )
{
in.onTunnelConfigChange();
}
in.onTunnelNetworkChange();
}
}
for (final PartP2PTunnel in : this.inputs.get(freq)) {
if (configChange) {
in.onTunnelConfigChange();
}
in.onTunnelNetworkChange();
}
}
public void updateFreq( final PartP2PTunnel t, final short newFrequency )
{
if( this.outputs.containsValue( t ) )
{
this.outputs.remove( t.getFrequency(), t );
}
public void updateFreq(final PartP2PTunnel t, final short newFrequency) {
if (this.outputs.containsValue(t)) {
this.outputs.remove(t.getFrequency(), t);
}
if( this.inputs.containsValue( t ) )
{
this.inputs.remove( t.getFrequency(), t );
}
if (this.inputs.containsValue(t)) {
this.inputs.remove(t.getFrequency(), t);
}
t.setFrequency( newFrequency );
t.setFrequency(newFrequency);
if( t.isOutput() )
{
this.outputs.put( t.getFrequency(), t );
}
else
{
this.inputs.put( t.getFrequency(), t );
}
if (t.isOutput()) {
this.outputs.put(t.getFrequency(), t);
} else {
this.inputs.put(t.getFrequency(), t);
}
// AELog.info( "update-" + (t.output ? "output: " : "input: ") + t.freq );
this.updateTunnel( t.getFrequency(), t.isOutput(), true );
}
// AELog.info( "update-" + (t.output ? "output: " : "input: ") + t.freq );
this.updateTunnel(t.getFrequency(), t.isOutput(), true);
}
public short newFrequency()
{
short newFrequency;
int cycles = 0;
public short newFrequency() {
short newFrequency;
int cycles = 0;
do
{
newFrequency = (short) this.frequencyGenerator.nextInt( 1 << 16 );
cycles++;
}
while( newFrequency == 0 || this.inputs.containsKey( newFrequency ) );
do {
newFrequency = (short) this.frequencyGenerator.nextInt(1 << 16);
cycles++;
}
while (newFrequency == 0 || this.inputs.containsKey(newFrequency));
if( cycles > 25 )
{
AELog.debug( "Generating a new P2P frequency '%1$d' took %2$d cycles", newFrequency, cycles );
}
if (cycles > 25) {
AELog.debug("Generating a new P2P frequency '%1$d' took %2$d cycles", newFrequency, cycles);
}
return newFrequency;
}
return newFrequency;
}
public TunnelCollection<PartP2PTunnel> getOutputs( final short freq, final Class<? extends PartP2PTunnel> c )
{
Collection<PartP2PTunnel> in = this.inputs.get( freq );
public TunnelCollection<PartP2PTunnel> getOutputs(final short freq, final Class<? extends PartP2PTunnel> c) {
Collection<PartP2PTunnel> in = this.inputs.get(freq);
if( in == null )
{
return NULL_COLLECTION;
}
if (in == null) {
return NULL_COLLECTION;
}
TunnelCollection<PartP2PTunnel> out;
for( PartP2PTunnel part : this.inputs.get( freq ) )
{
out = part.getCollection( this.outputs.get( freq ), c );
if( out != null )
{
return out;
}
}
return NULL_COLLECTION;
}
TunnelCollection<PartP2PTunnel> out;
for (PartP2PTunnel part : this.inputs.get(freq)) {
out = part.getCollection(this.outputs.get(freq), c);
if (out != null) {
return out;
}
}
return NULL_COLLECTION;
}
public TunnelCollection<PartP2PTunnel> getInputs( final short freq, final Class<? extends PartP2PTunnel> c )
{
Collection<PartP2PTunnel> out = this.outputs.get( freq );
public TunnelCollection<PartP2PTunnel> getInputs(final short freq, final Class<? extends PartP2PTunnel> c) {
Collection<PartP2PTunnel> out = this.outputs.get(freq);
if( out == null )
{
return NULL_COLLECTION;
}
if (out == null) {
return NULL_COLLECTION;
}
TunnelCollection<PartP2PTunnel> in;
for( PartP2PTunnel part : this.outputs.get( freq ) )
{
in = part.getCollection( this.inputs.get( freq ), c );
if( in != null )
{
return in;
}
}
return NULL_COLLECTION;
}
TunnelCollection<PartP2PTunnel> in;
for (PartP2PTunnel part : this.outputs.get(freq)) {
in = part.getCollection(this.inputs.get(freq), c);
if (in != null) {
return in;
}
}
return NULL_COLLECTION;
}
}
+255 -341
View File
@@ -19,25 +19,8 @@
package appeng.me.cache;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import appeng.api.AEApi;
import appeng.api.networking.GridFlags;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridBlock;
import appeng.api.networking.IGridConnection;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridMultiblock;
import appeng.api.networking.IGridNode;
import appeng.api.networking.IGridStorage;
import appeng.api.networking.*;
import appeng.api.networking.events.MENetworkBootingStatusChange;
import appeng.api.networking.events.MENetworkChannelChanged;
import appeng.api.networking.events.MENetworkControllerChange;
@@ -52,391 +35,322 @@ import appeng.core.features.AEFeature;
import appeng.core.stats.IAdvancementTrigger;
import appeng.me.GridConnection;
import appeng.me.GridNode;
import appeng.me.pathfinding.AdHocChannelUpdater;
import appeng.me.pathfinding.ControllerChannelUpdater;
import appeng.me.pathfinding.ControllerValidator;
import appeng.me.pathfinding.IPathItem;
import appeng.me.pathfinding.PathSegment;
import appeng.me.pathfinding.*;
import appeng.tile.networking.TileController;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import java.util.*;
public class PathGridCache implements IPathingGrid
{
public class PathGridCache implements IPathingGrid {
private final List<PathSegment> active = new ArrayList<>();
private final Set<TileController> controllers = new HashSet<>();
private final Set<IGridNode> requireChannels = new HashSet<>();
private final Set<IGridNode> blockDense = new HashSet<>();
private final IGrid myGrid;
private int channelsInUse = 0;
private int channelsByBlocks = 0;
private double channelPowerUsage = 0.0;
private boolean recalculateControllerNextTick = true;
private boolean updateNetwork = true;
private boolean booting = false;
private ControllerState controllerState = ControllerState.NO_CONTROLLER;
private int ticksUntilReady = 20;
private int lastChannels = 0;
private HashSet<IPathItem> semiOpen = new HashSet<>();
private final List<PathSegment> active = new ArrayList<>();
private final Set<TileController> controllers = new HashSet<>();
private final Set<IGridNode> requireChannels = new HashSet<>();
private final Set<IGridNode> blockDense = new HashSet<>();
private final IGrid myGrid;
private int channelsInUse = 0;
private int channelsByBlocks = 0;
private double channelPowerUsage = 0.0;
private boolean recalculateControllerNextTick = true;
private boolean updateNetwork = true;
private boolean booting = false;
private ControllerState controllerState = ControllerState.NO_CONTROLLER;
private int ticksUntilReady = 20;
private int lastChannels = 0;
private HashSet<IPathItem> semiOpen = new HashSet<>();
public PathGridCache( final IGrid g )
{
this.myGrid = g;
}
public PathGridCache(final IGrid g) {
this.myGrid = g;
}
@Override
public void onUpdateTick()
{
if( this.recalculateControllerNextTick )
{
this.recalcController();
}
@Override
public void onUpdateTick() {
if (this.recalculateControllerNextTick) {
this.recalcController();
}
if( this.updateNetwork )
{
if( !this.booting )
{
this.myGrid.postEvent( new MENetworkBootingStatusChange() );
}
if (this.updateNetwork) {
if (!this.booting) {
this.myGrid.postEvent(new MENetworkBootingStatusChange());
}
this.booting = true;
this.updateNetwork = false;
this.setChannelsInUse( 0 );
this.booting = true;
this.updateNetwork = false;
this.setChannelsInUse(0);
if( this.controllerState == ControllerState.NO_CONTROLLER )
{
final int requiredChannels = this.calculateRequiredChannels();
int used = requiredChannels;
if( AEConfig.instance().isFeatureEnabled( AEFeature.CHANNELS ) && requiredChannels > 8 )
{
used = 0;
}
if (this.controllerState == ControllerState.NO_CONTROLLER) {
final int requiredChannels = this.calculateRequiredChannels();
int used = requiredChannels;
if (AEConfig.instance().isFeatureEnabled(AEFeature.CHANNELS) && requiredChannels > 8) {
used = 0;
}
final int nodes = this.myGrid.getNodes().size();
this.setChannelsInUse( used );
final int nodes = this.myGrid.getNodes().size();
this.setChannelsInUse(used);
this.ticksUntilReady = 20 + Math.max( 0, nodes / 100 - 20 );
this.setChannelsByBlocks( nodes * used );
this.setChannelPowerUsage( this.getChannelsByBlocks() / 128.0 );
this.ticksUntilReady = 20 + Math.max(0, nodes / 100 - 20);
this.setChannelsByBlocks(nodes * used);
this.setChannelPowerUsage(this.getChannelsByBlocks() / 128.0);
this.myGrid.getPivot().beginVisit( new AdHocChannelUpdater( used ) );
}
else if( this.controllerState == ControllerState.CONTROLLER_CONFLICT )
{
this.ticksUntilReady = 20;
this.myGrid.getPivot().beginVisit( new AdHocChannelUpdater( 0 ) );
}
else
{
final int nodes = this.myGrid.getNodes().size();
this.ticksUntilReady = 20 + Math.max( 0, nodes / 100 - 20 );
final HashSet<IPathItem> closedList = new HashSet<>();
this.semiOpen = new HashSet<>();
this.myGrid.getPivot().beginVisit(new AdHocChannelUpdater(used));
} else if (this.controllerState == ControllerState.CONTROLLER_CONFLICT) {
this.ticksUntilReady = 20;
this.myGrid.getPivot().beginVisit(new AdHocChannelUpdater(0));
} else {
final int nodes = this.myGrid.getNodes().size();
this.ticksUntilReady = 20 + Math.max(0, nodes / 100 - 20);
final HashSet<IPathItem> closedList = new HashSet<>();
this.semiOpen = new HashSet<>();
// myGrid.getPivot().beginVisit( new AdHocChannelUpdater( 0 )
// );
for( final IGridNode node : this.myGrid.getMachines( TileController.class ) )
{
closedList.add( (IPathItem) node );
for( final IGridConnection gcc : node.getConnections() )
{
final GridConnection gc = (GridConnection) gcc;
if( !( gc.getOtherSide( node ).getMachine() instanceof TileController ) )
{
final List<IPathItem> open = new ArrayList<>();
closedList.add( gc );
open.add( gc );
gc.setControllerRoute( (GridNode) node, true );
this.active.add( new PathSegment( this, open, this.semiOpen, closedList ) );
}
}
}
}
}
// myGrid.getPivot().beginVisit( new AdHocChannelUpdater( 0 )
// );
for (final IGridNode node : this.myGrid.getMachines(TileController.class)) {
closedList.add((IPathItem) node);
for (final IGridConnection gcc : node.getConnections()) {
final GridConnection gc = (GridConnection) gcc;
if (!(gc.getOtherSide(node).getMachine() instanceof TileController)) {
final List<IPathItem> open = new ArrayList<>();
closedList.add(gc);
open.add(gc);
gc.setControllerRoute((GridNode) node, true);
this.active.add(new PathSegment(this, open, this.semiOpen, closedList));
}
}
}
}
}
if( !this.active.isEmpty() || this.ticksUntilReady > 0 )
{
final Iterator<PathSegment> i = this.active.iterator();
while ( i.hasNext() )
{
final PathSegment pat = i.next();
if( pat.step() )
{
pat.setDead( true );
i.remove();
}
}
if (!this.active.isEmpty() || this.ticksUntilReady > 0) {
final Iterator<PathSegment> i = this.active.iterator();
while (i.hasNext()) {
final PathSegment pat = i.next();
if (pat.step()) {
pat.setDead(true);
i.remove();
}
}
this.ticksUntilReady--;
this.ticksUntilReady--;
if( this.active.isEmpty() && this.ticksUntilReady <= 0 )
{
if( this.controllerState == ControllerState.CONTROLLER_ONLINE )
{
final Iterator<TileController> controllerIterator = this.controllers.iterator();
if( controllerIterator.hasNext() )
{
final TileController controller = controllerIterator.next();
controller.getGridNode( AEPartLocation.INTERNAL ).beginVisit( new ControllerChannelUpdater() );
}
}
if (this.active.isEmpty() && this.ticksUntilReady <= 0) {
if (this.controllerState == ControllerState.CONTROLLER_ONLINE) {
final Iterator<TileController> controllerIterator = this.controllers.iterator();
if (controllerIterator.hasNext()) {
final TileController controller = controllerIterator.next();
controller.getGridNode(AEPartLocation.INTERNAL).beginVisit(new ControllerChannelUpdater());
}
}
// check for achievements
this.achievementPost();
// check for achievements
this.achievementPost();
this.booting = false;
this.setChannelPowerUsage( this.getChannelsByBlocks() / 128.0 );
this.myGrid.postEvent( new MENetworkBootingStatusChange() );
}
}
}
this.booting = false;
this.setChannelPowerUsage(this.getChannelsByBlocks() / 128.0);
this.myGrid.postEvent(new MENetworkBootingStatusChange());
}
}
}
@Override
public void removeNode( final IGridNode gridNode, final IGridHost machine )
{
if( machine instanceof TileController )
{
this.controllers.remove( machine );
this.recalculateControllerNextTick = true;
}
@Override
public void removeNode(final IGridNode gridNode, final IGridHost machine) {
if (machine instanceof TileController) {
this.controllers.remove(machine);
this.recalculateControllerNextTick = true;
}
final EnumSet<GridFlags> flags = gridNode.getGridBlock().getFlags();
final EnumSet<GridFlags> flags = gridNode.getGridBlock().getFlags();
if( flags.contains( GridFlags.REQUIRE_CHANNEL ) )
{
this.requireChannels.remove( gridNode );
}
if (flags.contains(GridFlags.REQUIRE_CHANNEL)) {
this.requireChannels.remove(gridNode);
}
if( flags.contains( GridFlags.CANNOT_CARRY_COMPRESSED ) )
{
this.blockDense.remove( gridNode );
}
if (flags.contains(GridFlags.CANNOT_CARRY_COMPRESSED)) {
this.blockDense.remove(gridNode);
}
this.repath();
}
this.repath();
}
@Override
public void addNode( final IGridNode gridNode, final IGridHost machine )
{
if( machine instanceof TileController )
{
this.controllers.add( (TileController) machine );
this.recalculateControllerNextTick = true;
}
@Override
public void addNode(final IGridNode gridNode, final IGridHost machine) {
if (machine instanceof TileController) {
this.controllers.add((TileController) machine);
this.recalculateControllerNextTick = true;
}
final EnumSet<GridFlags> flags = gridNode.getGridBlock().getFlags();
final EnumSet<GridFlags> flags = gridNode.getGridBlock().getFlags();
if( flags.contains( GridFlags.REQUIRE_CHANNEL ) )
{
this.requireChannels.add( gridNode );
}
if (flags.contains(GridFlags.REQUIRE_CHANNEL)) {
this.requireChannels.add(gridNode);
}
if( flags.contains( GridFlags.CANNOT_CARRY_COMPRESSED ) )
{
this.blockDense.add( gridNode );
}
if (flags.contains(GridFlags.CANNOT_CARRY_COMPRESSED)) {
this.blockDense.add(gridNode);
}
this.repath();
}
this.repath();
}
@Override
public void onSplit( final IGridStorage storageB )
{
@Override
public void onSplit(final IGridStorage storageB) {
}
}
@Override
public void onJoin( final IGridStorage storageB )
{
@Override
public void onJoin(final IGridStorage storageB) {
}
}
@Override
public void populateGridStorage( final IGridStorage storage )
{
@Override
public void populateGridStorage(final IGridStorage storage) {
}
}
private void recalcController()
{
this.recalculateControllerNextTick = false;
final ControllerState old = this.controllerState;
private void recalcController() {
this.recalculateControllerNextTick = false;
final ControllerState old = this.controllerState;
if( this.controllers.isEmpty() )
{
this.controllerState = ControllerState.NO_CONTROLLER;
}
else
{
final IGridNode startingNode = this.controllers.iterator().next().getGridNode( AEPartLocation.INTERNAL );
if( startingNode == null )
{
this.controllerState = ControllerState.CONTROLLER_CONFLICT;
return;
}
if (this.controllers.isEmpty()) {
this.controllerState = ControllerState.NO_CONTROLLER;
} else {
final IGridNode startingNode = this.controllers.iterator().next().getGridNode(AEPartLocation.INTERNAL);
if (startingNode == null) {
this.controllerState = ControllerState.CONTROLLER_CONFLICT;
return;
}
final DimensionalCoord dc = startingNode.getGridBlock().getLocation();
final ControllerValidator cv = new ControllerValidator( dc.x, dc.y, dc.z );
final DimensionalCoord dc = startingNode.getGridBlock().getLocation();
final ControllerValidator cv = new ControllerValidator(dc.x, dc.y, dc.z);
startingNode.beginVisit( cv );
startingNode.beginVisit(cv);
if( cv.isValid() && cv.getFound() == this.controllers.size() )
{
this.controllerState = ControllerState.CONTROLLER_ONLINE;
}
else
{
this.controllerState = ControllerState.CONTROLLER_CONFLICT;
}
}
if (cv.isValid() && cv.getFound() == this.controllers.size()) {
this.controllerState = ControllerState.CONTROLLER_ONLINE;
} else {
this.controllerState = ControllerState.CONTROLLER_CONFLICT;
}
}
if( old != this.controllerState )
{
this.myGrid.postEvent( new MENetworkControllerChange() );
}
}
if (old != this.controllerState) {
this.myGrid.postEvent(new MENetworkControllerChange());
}
}
private int calculateRequiredChannels()
{
this.semiOpen.clear();
private int calculateRequiredChannels() {
this.semiOpen.clear();
int depth = 0;
for( final IGridNode nodes : this.requireChannels )
{
if( !this.semiOpen.contains( (IPathItem) nodes ) )
{
final IGridBlock gb = nodes.getGridBlock();
final EnumSet<GridFlags> flags = gb.getFlags();
int depth = 0;
for (final IGridNode nodes : this.requireChannels) {
if (!this.semiOpen.contains((IPathItem) nodes)) {
final IGridBlock gb = nodes.getGridBlock();
final EnumSet<GridFlags> flags = gb.getFlags();
if( flags.contains( GridFlags.COMPRESSED_CHANNEL ) && !this.blockDense.isEmpty() )
{
return 9;
}
if (flags.contains(GridFlags.COMPRESSED_CHANNEL) && !this.blockDense.isEmpty()) {
return 9;
}
depth++;
depth++;
if( flags.contains( GridFlags.MULTIBLOCK ) )
{
final IGridMultiblock gmb = (IGridMultiblock) gb;
final Iterator<IGridNode> i = gmb.getMultiblockNodes();
while ( i.hasNext() )
{
this.semiOpen.add( (IPathItem) i.next() );
}
}
}
}
if (flags.contains(GridFlags.MULTIBLOCK)) {
final IGridMultiblock gmb = (IGridMultiblock) gb;
final Iterator<IGridNode> i = gmb.getMultiblockNodes();
while (i.hasNext()) {
this.semiOpen.add((IPathItem) i.next());
}
}
}
}
return depth;
}
return depth;
}
private void achievementPost()
{
if( this.lastChannels != this.getChannelsInUse() && AEConfig.instance().isFeatureEnabled( AEFeature.CHANNELS ) )
{
final IAdvancementTrigger currentBracket = this.getAchievementBracket( this.getChannelsInUse() );
final IAdvancementTrigger lastBracket = this.getAchievementBracket( this.lastChannels );
if( currentBracket != lastBracket && currentBracket != null )
{
for( final IGridNode n : this.requireChannels )
{
EntityPlayer player = AEApi.instance().registries().players().findPlayer( n.getPlayerID() );
if( player instanceof EntityPlayerMP )
{
currentBracket.trigger( (EntityPlayerMP) player );
}
}
}
}
this.lastChannels = this.getChannelsInUse();
}
private void achievementPost() {
if (this.lastChannels != this.getChannelsInUse() && AEConfig.instance().isFeatureEnabled(AEFeature.CHANNELS)) {
final IAdvancementTrigger currentBracket = this.getAchievementBracket(this.getChannelsInUse());
final IAdvancementTrigger lastBracket = this.getAchievementBracket(this.lastChannels);
if (currentBracket != lastBracket && currentBracket != null) {
for (final IGridNode n : this.requireChannels) {
EntityPlayer player = AEApi.instance().registries().players().findPlayer(n.getPlayerID());
if (player instanceof EntityPlayerMP) {
currentBracket.trigger((EntityPlayerMP) player);
}
}
}
}
this.lastChannels = this.getChannelsInUse();
}
private IAdvancementTrigger getAchievementBracket( final int ch )
{
if( ch < 8 )
{
return null;
}
private IAdvancementTrigger getAchievementBracket(final int ch) {
if (ch < 8) {
return null;
}
if( ch < 128 )
{
return AppEng.instance().getAdvancementTriggers().getNetworkApprentice();
}
if (ch < 128) {
return AppEng.instance().getAdvancementTriggers().getNetworkApprentice();
}
if( ch < 2048 )
{
return AppEng.instance().getAdvancementTriggers().getNetworkEngineer();
}
if (ch < 2048) {
return AppEng.instance().getAdvancementTriggers().getNetworkEngineer();
}
return AppEng.instance().getAdvancementTriggers().getNetworkAdmin();
}
return AppEng.instance().getAdvancementTriggers().getNetworkAdmin();
}
@MENetworkEventSubscribe
void updateNodReq( final MENetworkChannelChanged ev )
{
final IGridNode gridNode = ev.node;
@MENetworkEventSubscribe
void updateNodReq(final MENetworkChannelChanged ev) {
final IGridNode gridNode = ev.node;
if( gridNode.getGridBlock().getFlags().contains( GridFlags.REQUIRE_CHANNEL ) )
{
this.requireChannels.add( gridNode );
}
else
{
this.requireChannels.remove( gridNode );
}
if (gridNode.getGridBlock().getFlags().contains(GridFlags.REQUIRE_CHANNEL)) {
this.requireChannels.add(gridNode);
} else {
this.requireChannels.remove(gridNode);
}
this.repath();
}
this.repath();
}
@Override
public boolean isNetworkBooting()
{
return !this.booting && !this.active.isEmpty();
}
@Override
public boolean isNetworkBooting() {
return !this.booting && !this.active.isEmpty();
}
@Override
public ControllerState getControllerState()
{
return this.controllerState;
}
@Override
public ControllerState getControllerState() {
return this.controllerState;
}
@Override
public void repath()
{
// clean up...
this.active.clear();
@Override
public void repath() {
// clean up...
this.active.clear();
this.setChannelsByBlocks( 0 );
this.updateNetwork = true;
}
this.setChannelsByBlocks(0);
this.updateNetwork = true;
}
double getChannelPowerUsage()
{
return this.channelPowerUsage;
}
double getChannelPowerUsage() {
return this.channelPowerUsage;
}
private void setChannelPowerUsage( final double channelPowerUsage )
{
this.channelPowerUsage = channelPowerUsage;
}
private void setChannelPowerUsage(final double channelPowerUsage) {
this.channelPowerUsage = channelPowerUsage;
}
public int getChannelsByBlocks()
{
return this.channelsByBlocks;
}
public int getChannelsByBlocks() {
return this.channelsByBlocks;
}
public void setChannelsByBlocks( final int channelsByBlocks )
{
this.channelsByBlocks = channelsByBlocks;
}
public void setChannelsByBlocks(final int channelsByBlocks) {
this.channelsByBlocks = channelsByBlocks;
}
public int getChannelsInUse()
{
return this.channelsInUse;
}
public int getChannelsInUse() {
return this.channelsInUse;
}
public void setChannelsInUse( final int channelsInUse )
{
this.channelsInUse = channelsInUse;
}
public void setChannelsInUse(final int channelsInUse) {
this.channelsInUse = channelsInUse;
}
}
+107 -140
View File
@@ -19,16 +19,6 @@
package appeng.me.cache;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import com.google.common.base.Preconditions;
import com.mojang.authlib.GameProfile;
import net.minecraft.entity.player.EntityPlayer;
import appeng.api.config.SecurityPermissions;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
@@ -40,163 +30,140 @@ import appeng.api.networking.security.ISecurityGrid;
import appeng.api.networking.security.ISecurityProvider;
import appeng.core.worlddata.WorldData;
import appeng.me.GridNode;
import com.google.common.base.Preconditions;
import com.mojang.authlib.GameProfile;
import net.minecraft.entity.player.EntityPlayer;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
public class SecurityCache implements ISecurityGrid
{
public class SecurityCache implements ISecurityGrid {
private final IGrid myGrid;
private final List<ISecurityProvider> securityProvider = new ArrayList<>();
private final HashMap<Integer, EnumSet<SecurityPermissions>> playerPerms = new HashMap<>();
private long securityKey = -1;
private final IGrid myGrid;
private final List<ISecurityProvider> securityProvider = new ArrayList<>();
private final HashMap<Integer, EnumSet<SecurityPermissions>> playerPerms = new HashMap<>();
private long securityKey = -1;
public SecurityCache( final IGrid g )
{
this.myGrid = g;
}
public SecurityCache(final IGrid g) {
this.myGrid = g;
}
@MENetworkEventSubscribe
public void updatePermissions( final MENetworkSecurityChange ev )
{
this.playerPerms.clear();
if( this.securityProvider.isEmpty() )
{
return;
}
@MENetworkEventSubscribe
public void updatePermissions(final MENetworkSecurityChange ev) {
this.playerPerms.clear();
if (this.securityProvider.isEmpty()) {
return;
}
this.securityProvider.get( 0 ).readPermissions( this.playerPerms );
}
this.securityProvider.get(0).readPermissions(this.playerPerms);
}
public long getSecurityKey()
{
return this.securityKey;
}
public long getSecurityKey() {
return this.securityKey;
}
@Override
public void onUpdateTick()
{
@Override
public void onUpdateTick() {
}
}
@Override
public void removeNode( final IGridNode gridNode, final IGridHost machine )
{
if( machine instanceof ISecurityProvider )
{
this.securityProvider.remove( machine );
this.updateSecurityKey();
}
}
@Override
public void removeNode(final IGridNode gridNode, final IGridHost machine) {
if (machine instanceof ISecurityProvider) {
this.securityProvider.remove(machine);
this.updateSecurityKey();
}
}
private void updateSecurityKey()
{
final long lastCode = this.securityKey;
private void updateSecurityKey() {
final long lastCode = this.securityKey;
if( this.securityProvider.size() == 1 )
{
this.securityKey = this.securityProvider.get( 0 ).getSecurityKey();
}
else
{
this.securityKey = -1;
}
if (this.securityProvider.size() == 1) {
this.securityKey = this.securityProvider.get(0).getSecurityKey();
} else {
this.securityKey = -1;
}
if( lastCode != this.securityKey )
{
this.getGrid().postEvent( new MENetworkSecurityChange() );
for( final IGridNode n : this.getGrid().getNodes() )
{
( (GridNode) n ).setLastSecurityKey( this.securityKey );
}
}
}
if (lastCode != this.securityKey) {
this.getGrid().postEvent(new MENetworkSecurityChange());
for (final IGridNode n : this.getGrid().getNodes()) {
((GridNode) n).setLastSecurityKey(this.securityKey);
}
}
}
@Override
public void addNode( final IGridNode gridNode, final IGridHost machine )
{
if( machine instanceof ISecurityProvider )
{
this.securityProvider.add( (ISecurityProvider) machine );
this.updateSecurityKey();
}
else
{
( (GridNode) gridNode ).setLastSecurityKey( this.securityKey );
}
}
@Override
public void addNode(final IGridNode gridNode, final IGridHost machine) {
if (machine instanceof ISecurityProvider) {
this.securityProvider.add((ISecurityProvider) machine);
this.updateSecurityKey();
} else {
((GridNode) gridNode).setLastSecurityKey(this.securityKey);
}
}
@Override
public void onSplit( final IGridStorage destinationStorage )
{
@Override
public void onSplit(final IGridStorage destinationStorage) {
}
}
@Override
public void onJoin( final IGridStorage sourceStorage )
{
@Override
public void onJoin(final IGridStorage sourceStorage) {
}
}
@Override
public void populateGridStorage( final IGridStorage destinationStorage )
{
@Override
public void populateGridStorage(final IGridStorage destinationStorage) {
}
}
@Override
public boolean isAvailable()
{
return this.securityProvider.size() == 1 && this.securityProvider.get( 0 ).isSecurityEnabled();
}
@Override
public boolean isAvailable() {
return this.securityProvider.size() == 1 && this.securityProvider.get(0).isSecurityEnabled();
}
@Override
public boolean hasPermission( final EntityPlayer player, final SecurityPermissions perm )
{
Preconditions.checkNotNull( player );
Preconditions.checkNotNull( perm );
@Override
public boolean hasPermission(final EntityPlayer player, final SecurityPermissions perm) {
Preconditions.checkNotNull(player);
Preconditions.checkNotNull(perm);
final GameProfile profile = player.getGameProfile();
final int playerID = WorldData.instance().playerData().getPlayerID( profile );
final GameProfile profile = player.getGameProfile();
final int playerID = WorldData.instance().playerData().getPlayerID(profile);
return this.hasPermission( playerID, perm );
}
return this.hasPermission(playerID, perm);
}
@Override
public boolean hasPermission( final int playerID, final SecurityPermissions perm )
{
if( this.isAvailable() )
{
final EnumSet<SecurityPermissions> perms = this.playerPerms.get( playerID );
@Override
public boolean hasPermission(final int playerID, final SecurityPermissions perm) {
if (this.isAvailable()) {
final EnumSet<SecurityPermissions> perms = this.playerPerms.get(playerID);
if( perms == null )
{
if( playerID == -1 ) // no default?
{
return false;
}
else
{
return this.hasPermission( -1, perm );
}
}
if (perms == null) {
if (playerID == -1) // no default?
{
return false;
} else {
return this.hasPermission(-1, perm);
}
}
return perms.contains( perm );
}
return true;
}
return perms.contains(perm);
}
return true;
}
@Override
public int getOwner()
{
if( this.isAvailable() )
{
return this.securityProvider.get( 0 ).getOwner();
}
return -1;
}
@Override
public int getOwner() {
if (this.isAvailable()) {
return this.securityProvider.get(0).getOwner();
}
return -1;
}
public IGrid getGrid()
{
return this.myGrid;
}
public IGrid getGrid() {
return this.myGrid;
}
}
+149 -179
View File
@@ -19,10 +19,6 @@
package appeng.me.cache;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
@@ -37,223 +33,197 @@ import appeng.me.cluster.implementations.SpatialPylonCluster;
import appeng.tile.spatial.TileSpatialIOPort;
import appeng.tile.spatial.TileSpatialPylon;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class SpatialPylonCache implements ISpatialCache
{
private final IGrid myGrid;
private long powerRequired = 0;
private double efficiency = 0.0;
private DimensionalCoord captureMin;
private DimensionalCoord captureMax;
private boolean isValid = false;
private List<TileSpatialIOPort> ioPorts = new ArrayList<>();
private HashMap<SpatialPylonCluster, SpatialPylonCluster> clusters = new HashMap<>();
public class SpatialPylonCache implements ISpatialCache {
public SpatialPylonCache( final IGrid g )
{
this.myGrid = g;
}
private final IGrid myGrid;
private long powerRequired = 0;
private double efficiency = 0.0;
private DimensionalCoord captureMin;
private DimensionalCoord captureMax;
private boolean isValid = false;
private List<TileSpatialIOPort> ioPorts = new ArrayList<>();
private HashMap<SpatialPylonCluster, SpatialPylonCluster> clusters = new HashMap<>();
@MENetworkEventSubscribe
public void bootingRender( final MENetworkBootingStatusChange c )
{
this.reset( this.myGrid );
}
public SpatialPylonCache(final IGrid g) {
this.myGrid = g;
}
private void reset( final IGrid grid )
{
@MENetworkEventSubscribe
public void bootingRender(final MENetworkBootingStatusChange c) {
this.reset(this.myGrid);
}
this.clusters = new HashMap<>();
this.ioPorts = new ArrayList<>();
private void reset(final IGrid grid) {
for( final IGridNode gm : grid.getMachines( TileSpatialIOPort.class ) )
{
this.ioPorts.add( (TileSpatialIOPort) gm.getMachine() );
}
this.clusters = new HashMap<>();
this.ioPorts = new ArrayList<>();
final IReadOnlyCollection<IGridNode> set = grid.getMachines( TileSpatialPylon.class );
for( final IGridNode gm : set )
{
if( gm.meetsChannelRequirements() )
{
final SpatialPylonCluster c = ( (TileSpatialPylon) gm.getMachine() ).getCluster();
if( c != null )
{
this.clusters.put( c, c );
}
}
}
for (final IGridNode gm : grid.getMachines(TileSpatialIOPort.class)) {
this.ioPorts.add((TileSpatialIOPort) gm.getMachine());
}
this.captureMax = null;
this.captureMin = null;
this.isValid = true;
final IReadOnlyCollection<IGridNode> set = grid.getMachines(TileSpatialPylon.class);
for (final IGridNode gm : set) {
if (gm.meetsChannelRequirements()) {
final SpatialPylonCluster c = ((TileSpatialPylon) gm.getMachine()).getCluster();
if (c != null) {
this.clusters.put(c, c);
}
}
}
int pylonBlocks = 0;
for( final SpatialPylonCluster cl : this.clusters.values() )
{
if( this.captureMax == null )
{
this.captureMax = cl.getMax().copy();
}
if( this.captureMin == null )
{
this.captureMin = cl.getMin().copy();
}
this.captureMax = null;
this.captureMin = null;
this.isValid = true;
pylonBlocks += cl.tileCount();
int pylonBlocks = 0;
for (final SpatialPylonCluster cl : this.clusters.values()) {
if (this.captureMax == null) {
this.captureMax = cl.getMax().copy();
}
if (this.captureMin == null) {
this.captureMin = cl.getMin().copy();
}
this.captureMin.x = Math.min( this.captureMin.x, cl.getMin().x );
this.captureMin.y = Math.min( this.captureMin.y, cl.getMin().y );
this.captureMin.z = Math.min( this.captureMin.z, cl.getMin().z );
pylonBlocks += cl.tileCount();
this.captureMax.x = Math.max( this.captureMax.x, cl.getMax().x );
this.captureMax.y = Math.max( this.captureMax.y, cl.getMax().y );
this.captureMax.z = Math.max( this.captureMax.z, cl.getMax().z );
}
this.captureMin.x = Math.min(this.captureMin.x, cl.getMin().x);
this.captureMin.y = Math.min(this.captureMin.y, cl.getMin().y);
this.captureMin.z = Math.min(this.captureMin.z, cl.getMin().z);
double maxPower = 0;
double minPower = 0;
if( this.hasRegion() )
{
this.isValid = this.captureMax.x - this.captureMin.x > 1 && this.captureMax.y - this.captureMin.y > 1 && this.captureMax.z - this.captureMin.z > 1;
this.captureMax.x = Math.max(this.captureMax.x, cl.getMax().x);
this.captureMax.y = Math.max(this.captureMax.y, cl.getMax().y);
this.captureMax.z = Math.max(this.captureMax.z, cl.getMax().z);
}
for( final SpatialPylonCluster cl : this.clusters.values() )
{
switch( cl.getCurrentAxis() )
{
case X:
double maxPower = 0;
double minPower = 0;
if (this.hasRegion()) {
this.isValid = this.captureMax.x - this.captureMin.x > 1 && this.captureMax.y - this.captureMin.y > 1 && this.captureMax.z - this.captureMin.z > 1;
this.isValid = this.isValid && ( ( this.captureMax.y == cl.getMin().y || this.captureMin.y == cl
.getMax().y ) || ( this.captureMax.z == cl.getMin().z || this.captureMin.z == cl.getMax().z ) ) && ( ( this.captureMax.y == cl
.getMax().y || this.captureMin.y == cl
.getMin().y ) || ( this.captureMax.z == cl.getMax().z || this.captureMin.z == cl.getMin().z ) );
for (final SpatialPylonCluster cl : this.clusters.values()) {
switch (cl.getCurrentAxis()) {
case X:
break;
case Y:
this.isValid = this.isValid && ((this.captureMax.y == cl.getMin().y || this.captureMin.y == cl
.getMax().y) || (this.captureMax.z == cl.getMin().z || this.captureMin.z == cl.getMax().z)) && ((this.captureMax.y == cl
.getMax().y || this.captureMin.y == cl
.getMin().y) || (this.captureMax.z == cl.getMax().z || this.captureMin.z == cl.getMin().z));
this.isValid = this.isValid && ( ( this.captureMax.x == cl.getMin().x || this.captureMin.x == cl
.getMax().x ) || ( this.captureMax.z == cl.getMin().z || this.captureMin.z == cl.getMax().z ) ) && ( ( this.captureMax.x == cl
.getMax().x || this.captureMin.x == cl
.getMin().x ) || ( this.captureMax.z == cl.getMax().z || this.captureMin.z == cl.getMin().z ) );
break;
case Y:
break;
case Z:
this.isValid = this.isValid && ((this.captureMax.x == cl.getMin().x || this.captureMin.x == cl
.getMax().x) || (this.captureMax.z == cl.getMin().z || this.captureMin.z == cl.getMax().z)) && ((this.captureMax.x == cl
.getMax().x || this.captureMin.x == cl
.getMin().x) || (this.captureMax.z == cl.getMax().z || this.captureMin.z == cl.getMin().z));
this.isValid = this.isValid && ( ( this.captureMax.y == cl.getMin().y || this.captureMin.y == cl
.getMax().y ) || ( this.captureMax.x == cl.getMin().x || this.captureMin.x == cl.getMax().x ) ) && ( ( this.captureMax.y == cl
.getMax().y || this.captureMin.y == cl
.getMin().y ) || ( this.captureMax.x == cl.getMax().x || this.captureMin.x == cl.getMin().x ) );
break;
case Z:
break;
case UNFORMED:
this.isValid = false;
break;
}
}
this.isValid = this.isValid && ((this.captureMax.y == cl.getMin().y || this.captureMin.y == cl
.getMax().y) || (this.captureMax.x == cl.getMin().x || this.captureMin.x == cl.getMax().x)) && ((this.captureMax.y == cl
.getMax().y || this.captureMin.y == cl
.getMin().y) || (this.captureMax.x == cl.getMax().x || this.captureMin.x == cl.getMin().x));
final int reqX = this.captureMax.x - this.captureMin.x;
final int reqY = this.captureMax.y - this.captureMin.y;
final int reqZ = this.captureMax.z - this.captureMin.z;
final int requirePylonBlocks = Math.max( 6, ( ( reqX * reqZ + reqX * reqY + reqY * reqZ ) * 3 ) / 8 );
break;
case UNFORMED:
this.isValid = false;
break;
}
}
this.efficiency = (double) pylonBlocks / (double) requirePylonBlocks;
final int reqX = this.captureMax.x - this.captureMin.x;
final int reqY = this.captureMax.y - this.captureMin.y;
final int reqZ = this.captureMax.z - this.captureMin.z;
final int requirePylonBlocks = Math.max(6, ((reqX * reqZ + reqX * reqY + reqY * reqZ) * 3) / 8);
if( this.efficiency > 1.0 )
{
this.efficiency = 1.0;
}
if( this.efficiency < 0.0 )
{
this.efficiency = 0.0;
}
this.efficiency = (double) pylonBlocks / (double) requirePylonBlocks;
minPower = (double) reqX * (double) reqY * reqZ * AEConfig.instance().getSpatialPowerMultiplier();
maxPower = Math.pow( minPower, AEConfig.instance().getSpatialPowerExponent() );
}
if (this.efficiency > 1.0) {
this.efficiency = 1.0;
}
if (this.efficiency < 0.0) {
this.efficiency = 0.0;
}
final double affective_efficiency = Math.pow( this.efficiency, 0.25 );
this.powerRequired = (long) ( affective_efficiency * minPower + ( 1.0 - affective_efficiency ) * maxPower );
minPower = (double) reqX * (double) reqY * reqZ * AEConfig.instance().getSpatialPowerMultiplier();
maxPower = Math.pow(minPower, AEConfig.instance().getSpatialPowerExponent());
}
for( final SpatialPylonCluster cl : this.clusters.values() )
{
final boolean myWasValid = cl.isValid();
cl.setValid( this.isValid );
if( myWasValid != this.isValid )
{
cl.updateStatus( false );
}
}
}
final double affective_efficiency = Math.pow(this.efficiency, 0.25);
this.powerRequired = (long) (affective_efficiency * minPower + (1.0 - affective_efficiency) * maxPower);
@Override
public boolean hasRegion()
{
return this.captureMin != null;
}
for (final SpatialPylonCluster cl : this.clusters.values()) {
final boolean myWasValid = cl.isValid();
cl.setValid(this.isValid);
if (myWasValid != this.isValid) {
cl.updateStatus(false);
}
}
}
@Override
public boolean isValidRegion()
{
return this.hasRegion() && this.isValid;
}
@Override
public boolean hasRegion() {
return this.captureMin != null;
}
@Override
public DimensionalCoord getMin()
{
return this.captureMin;
}
@Override
public boolean isValidRegion() {
return this.hasRegion() && this.isValid;
}
@Override
public DimensionalCoord getMax()
{
return this.captureMax;
}
@Override
public DimensionalCoord getMin() {
return this.captureMin;
}
@Override
public long requiredPower()
{
return this.powerRequired;
}
@Override
public DimensionalCoord getMax() {
return this.captureMax;
}
@Override
public float currentEfficiency()
{
return (float) this.efficiency * 100;
}
@Override
public long requiredPower() {
return this.powerRequired;
}
@Override
public void onUpdateTick()
{
}
@Override
public float currentEfficiency() {
return (float) this.efficiency * 100;
}
@Override
public void removeNode( final IGridNode node, final IGridHost machine )
{
@Override
public void onUpdateTick() {
}
}
@Override
public void removeNode(final IGridNode node, final IGridHost machine) {
@Override
public void addNode( final IGridNode node, final IGridHost machine )
{
}
}
@Override
public void addNode(final IGridNode node, final IGridHost machine) {
@Override
public void onSplit( final IGridStorage storageB )
{
}
}
@Override
public void onSplit(final IGridStorage storageB) {
@Override
public void onJoin( final IGridStorage storageB )
{
}
}
@Override
public void onJoin(final IGridStorage storageB) {
@Override
public void populateGridStorage( final IGridStorage storage )
{
}
}
@Override
public void populateGridStorage(final IGridStorage storage) {
}
}
+160 -194
View File
@@ -19,15 +19,6 @@
package appeng.me.cache;
import java.util.*;
import appeng.parts.automation.PartLevelEmitter;
import com.google.common.base.Preconditions;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
@@ -37,234 +28,209 @@ import appeng.api.networking.ticking.ITickManager;
import appeng.api.networking.ticking.TickRateModulation;
import appeng.api.networking.ticking.TickingRequest;
import appeng.me.cache.helpers.TickTracker;
import com.google.common.base.Preconditions;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException;
import java.util.HashMap;
import java.util.PriorityQueue;
public class TickManagerCache implements ITickManager
{
public class TickManagerCache implements ITickManager {
private final IGrid myGrid;
private final HashMap<IGridNode, TickTracker> alertable = new HashMap<>();
private final HashMap<IGridNode, TickTracker> sleeping = new HashMap<>();
private final HashMap<IGridNode, TickTracker> awake = new HashMap<>();
private final HashMap<IGridNode, TickTracker> laterTicker = new HashMap<>();
private final PriorityQueue<TickTracker> upcomingTicks = new PriorityQueue<>();
private final IGrid myGrid;
private final HashMap<IGridNode, TickTracker> alertable = new HashMap<>();
private final HashMap<IGridNode, TickTracker> sleeping = new HashMap<>();
private final HashMap<IGridNode, TickTracker> awake = new HashMap<>();
private final HashMap<IGridNode, TickTracker> laterTicker = new HashMap<>();
private final PriorityQueue<TickTracker> upcomingTicks = new PriorityQueue<>();
private long currentTick = 0;
private long currentTick = 0;
public TickManagerCache( final IGrid g )
{
this.myGrid = g;
}
public TickManagerCache(final IGrid g) {
this.myGrid = g;
}
public long getCurrentTick()
{
return this.currentTick;
}
public long getCurrentTick() {
return this.currentTick;
}
public long getAvgNanoTime( final IGridNode node )
{
TickTracker tt = this.awake.get( node );
public long getAvgNanoTime(final IGridNode node) {
TickTracker tt = this.awake.get(node);
if( tt == null )
{
tt = this.sleeping.get( node );
}
if (tt == null) {
tt = this.sleeping.get(node);
}
if( tt == null )
{
return -1;
}
if (tt == null) {
return -1;
}
return tt.getAvgNanos();
}
return tt.getAvgNanos();
}
@Override
public void onUpdateTick()
{
TickTracker tt = null;
@Override
public void onUpdateTick() {
TickTracker tt = null;
try
{
this.currentTick++;
try {
this.currentTick++;
while ( !this.upcomingTicks.isEmpty() )
{
tt = this.upcomingTicks.peek();
while (!this.upcomingTicks.isEmpty()) {
tt = this.upcomingTicks.peek();
// Stop once it reaches a TickTracker running at a later tick
if( tt.getNextTick() > this.currentTick )
{
break;
}
// Stop once it reaches a TickTracker running at a later tick
if (tt.getNextTick() > this.currentTick) {
break;
}
this.upcomingTicks.poll();
this.upcomingTicks.poll();
final int diff = (int) ( this.currentTick - tt.getLastTick() );
final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff );
final int diff = (int) (this.currentTick - tt.getLastTick());
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;
}
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 );
}
}
}
catch( final Throwable t )
{
final CrashReport crashreport = CrashReport.makeCrashReport( t, "Ticking GridNode" );
final CrashReportCategory crashreportcategory = crashreport.makeCategory( tt.getGridTickable().getClass().getSimpleName() + " being ticked." );
tt.addEntityCrashInfo( crashreportcategory );
throw new ReportedException( crashreport );
}
}
if (this.awake.containsKey(tt.getNode())) {
this.addToQueue(tt);
}
}
} catch (final Throwable t) {
final CrashReport crashreport = CrashReport.makeCrashReport(t, "Ticking GridNode");
final CrashReportCategory crashreportcategory = crashreport.makeCategory(tt.getGridTickable().getClass().getSimpleName() + " being ticked.");
tt.addEntityCrashInfo(crashreportcategory);
throw new ReportedException(crashreport);
}
}
private void addToQueue( final TickTracker tt )
{
tt.setLastTick( this.currentTick );
this.upcomingTicks.add( tt );
}
private void addToQueue(final TickTracker tt) {
tt.setLastTick(this.currentTick);
this.upcomingTicks.add(tt);
}
@Override
public void removeNode( final IGridNode gridNode, final IGridHost machine )
{
if( machine instanceof IGridTickable )
{
this.alertable.remove( gridNode );
this.sleeping.remove( gridNode );
this.awake.remove( gridNode );
}
}
@Override
public void removeNode(final IGridNode gridNode, final IGridHost machine) {
if (machine instanceof IGridTickable) {
this.alertable.remove(gridNode);
this.sleeping.remove(gridNode);
this.awake.remove(gridNode);
}
}
@Override
public void addNode( final IGridNode gridNode, final IGridHost machine )
{
if( machine instanceof IGridTickable )
{
final IGridTickable tickable = ( (IGridTickable) machine );
final TickingRequest tr = tickable.getTickingRequest( gridNode );
@Override
public void addNode(final IGridNode gridNode, final IGridHost machine) {
if (machine instanceof IGridTickable) {
final IGridTickable tickable = ((IGridTickable) machine);
final TickingRequest tr = tickable.getTickingRequest(gridNode);
Preconditions.checkNotNull( tr );
Preconditions.checkNotNull(tr);
final TickTracker tt = new TickTracker( tr, gridNode, (IGridTickable) machine, this.currentTick, this );
final TickTracker tt = new TickTracker(tr, gridNode, (IGridTickable) machine, this.currentTick, this);
if( tr.canBeAlerted )
{
this.alertable.put( gridNode, tt );
}
if (tr.canBeAlerted) {
this.alertable.put(gridNode, tt);
}
if( tr.isSleeping )
{
this.sleeping.put( gridNode, tt );
}
else
{
this.awake.put( gridNode, tt );
this.addToQueue( tt );
}
}
}
if (tr.isSleeping) {
this.sleeping.put(gridNode, tt);
} else {
this.awake.put(gridNode, tt);
this.addToQueue(tt);
}
}
}
@Override
public void onSplit( final IGridStorage storageB )
{
@Override
public void onSplit(final IGridStorage storageB) {
}
}
@Override
public void onJoin( final IGridStorage storageB )
{
@Override
public void onJoin(final IGridStorage storageB) {
}
}
@Override
public void populateGridStorage( final IGridStorage storage )
{
@Override
public void populateGridStorage(final IGridStorage storage) {
}
}
@Override
public boolean alertDevice( final IGridNode node )
{
Preconditions.checkNotNull( node );
@Override
public boolean alertDevice(final IGridNode node) {
Preconditions.checkNotNull(node);
final TickTracker tt = this.alertable.get( node );
if( tt == null )
{
return false;
}
// throw new RuntimeException(
// "Invalid alerted device, this node is not marked as alertable, or part of this grid." );
final TickTracker tt = this.alertable.get(node);
if (tt == null) {
return false;
}
// throw new RuntimeException(
// "Invalid alerted device, this node is not marked as alertable, or part of this grid." );
// set to awake, this is for sanity.
this.sleeping.remove( node );
this.awake.put( node, tt );
// set to awake, this is for sanity.
this.sleeping.remove(node);
this.awake.put(node, tt);
// configure sort.
tt.setLastTick( tt.getLastTick() - tt.getRequest().maxTickRate );
tt.setCurrentRate( tt.getRequest().minTickRate );
// configure sort.
tt.setLastTick(tt.getLastTick() - tt.getRequest().maxTickRate);
tt.setCurrentRate(tt.getRequest().minTickRate);
// prevent dupes and tick build up.
this.upcomingTicks.remove( tt );
this.upcomingTicks.add( tt );
// prevent dupes and tick build up.
this.upcomingTicks.remove(tt);
this.upcomingTicks.add(tt);
return true;
}
return true;
}
@Override
public boolean sleepDevice( final IGridNode node )
{
Preconditions.checkNotNull( node );
@Override
public boolean sleepDevice(final IGridNode node) {
Preconditions.checkNotNull(node);
if( this.awake.containsKey( node ) )
{
final TickTracker gt = this.awake.get( node );
this.awake.remove( node );
this.sleeping.put( node, gt );
if (this.awake.containsKey(node)) {
final TickTracker gt = this.awake.get(node);
this.awake.remove(node);
this.sleeping.put(node, gt);
return true;
}
return true;
}
return false;
}
return false;
}
@Override
public boolean wakeDevice( final IGridNode node )
{
Preconditions.checkNotNull( node );
@Override
public boolean wakeDevice(final IGridNode node) {
Preconditions.checkNotNull(node);
if( this.sleeping.containsKey( node ) )
{
final TickTracker gt = this.sleeping.get( node );
this.sleeping.remove( node );
this.awake.put( node, gt );
this.upcomingTicks.remove( gt );
this.addToQueue( gt );
if (this.sleeping.containsKey(node)) {
final TickTracker gt = this.sleeping.get(node);
this.sleeping.remove(node);
this.awake.put(node, gt);
this.upcomingTicks.remove(gt);
this.addToQueue(gt);
return true;
}
return true;
}
return false;
}
return false;
}
}
+11 -15
View File
@@ -22,23 +22,19 @@ package appeng.me.cache.helpers;
import appeng.api.networking.IGridConnection;
public class ConnectionWrapper
{
public class ConnectionWrapper {
private IGridConnection connection;
private IGridConnection connection;
public ConnectionWrapper( final IGridConnection gc )
{
this.setConnection( gc );
}
public ConnectionWrapper(final IGridConnection gc) {
this.setConnection(gc);
}
public IGridConnection getConnection()
{
return this.connection;
}
public IGridConnection getConnection() {
return this.connection;
}
public void setConnection( final IGridConnection connection )
{
this.connection = connection;
}
public void setConnection(final IGridConnection connection) {
this.connection = connection;
}
}
+39 -50
View File
@@ -19,70 +19,59 @@
package appeng.me.cache.helpers;
import java.util.HashMap;
import net.minecraft.world.World;
import appeng.api.networking.IGridNode;
import appeng.parts.p2p.PartP2PTunnelME;
import appeng.util.IWorldCallable;
import net.minecraft.world.World;
import java.util.HashMap;
public class Connections implements IWorldCallable<Void>
{
public class Connections implements IWorldCallable<Void> {
private final HashMap<IGridNode, TunnelConnection> connections = new HashMap<>();
private final PartP2PTunnelME me;
private boolean create = false;
private boolean destroy = false;
private final HashMap<IGridNode, TunnelConnection> connections = new HashMap<>();
private final PartP2PTunnelME me;
private boolean create = false;
private boolean destroy = false;
public Connections( final PartP2PTunnelME o )
{
this.me = o;
}
public Connections(final PartP2PTunnelME o) {
this.me = o;
}
@Override
public Void call( final World world ) throws Exception
{
this.me.updateConnections( this );
@Override
public Void call(final World world) throws Exception {
this.me.updateConnections(this);
return null;
}
return null;
}
public void markDestroy()
{
this.setCreate( false );
this.setDestroy( true );
}
public void markDestroy() {
this.setCreate(false);
this.setDestroy(true);
}
public void markCreate()
{
this.setCreate( true );
this.setDestroy( false );
}
public void markCreate() {
this.setCreate(true);
this.setDestroy(false);
}
public HashMap<IGridNode, TunnelConnection> getConnections()
{
return this.connections;
}
public HashMap<IGridNode, TunnelConnection> getConnections() {
return this.connections;
}
public boolean isCreate()
{
return this.create;
}
public boolean isCreate() {
return this.create;
}
private void setCreate( final boolean create )
{
this.create = create;
}
private void setCreate(final boolean create) {
this.create = create;
}
public boolean isDestroy()
{
return this.destroy;
}
public boolean isDestroy() {
return this.destroy;
}
private void setDestroy( final boolean destroy )
{
this.destroy = destroy;
}
private void setDestroy(final boolean destroy) {
this.destroy = destroy;
}
}
+72 -90
View File
@@ -19,124 +19,106 @@
package appeng.me.cache.helpers;
import javax.annotation.Nonnull;
import net.minecraft.crash.CrashReportCategory;
import appeng.api.networking.IGridNode;
import appeng.api.networking.ticking.IGridTickable;
import appeng.api.networking.ticking.TickingRequest;
import appeng.api.util.DimensionalCoord;
import appeng.me.cache.TickManagerCache;
import appeng.parts.AEBasePart;
import net.minecraft.crash.CrashReportCategory;
import javax.annotation.Nonnull;
public class TickTracker implements Comparable<TickTracker>
{
public class TickTracker implements Comparable<TickTracker> {
private final TickingRequest request;
private final IGridTickable gt;
private final IGridNode node;
private final TickingRequest request;
private final IGridTickable gt;
private final IGridNode node;
private final long LastFiveTicksTime = 0;
private final long LastFiveTicksTime = 0;
private long lastTick;
private int currentRate;
private long lastTick;
private int currentRate;
public TickTracker( final TickingRequest req, final IGridNode node, final IGridTickable gt, final long currentTick, final TickManagerCache tickManagerCache )
{
this.request = req;
this.gt = gt;
this.node = node;
this.setCurrentRate( ( req.minTickRate + req.maxTickRate ) / 2 );
this.setLastTick( currentTick );
}
public TickTracker(final TickingRequest req, final IGridNode node, final IGridTickable gt, final long currentTick, final TickManagerCache tickManagerCache) {
this.request = req;
this.gt = gt;
this.node = node;
this.setCurrentRate((req.minTickRate + req.maxTickRate) / 2);
this.setLastTick(currentTick);
}
public long getAvgNanos()
{
return( this.LastFiveTicksTime / 5 );
}
public long getAvgNanos() {
return (this.LastFiveTicksTime / 5);
}
@Override
public int compareTo( @Nonnull final TickTracker t )
{
int next = Long.compare( this.getNextTick(), t.getNextTick() );
@Override
public int compareTo(@Nonnull final TickTracker t) {
int next = Long.compare(this.getNextTick(), t.getNextTick());
if( next != 0 )
{
return next;
}
if (next != 0) {
return next;
}
int last = Long.compare( this.getLastTick(), t.getLastTick() );
int last = Long.compare(this.getLastTick(), t.getLastTick());
if( last != 0 )
{
return last;
}
if (last != 0) {
return last;
}
return Integer.compare( this.getCurrentRate(), t.getCurrentRate() );
return Integer.compare(this.getCurrentRate(), t.getCurrentRate());
}
}
public void addEntityCrashInfo( final CrashReportCategory crashreportcategory )
{
if( this.getGridTickable() instanceof AEBasePart )
{
final AEBasePart part = (AEBasePart) this.getGridTickable();
part.addEntityCrashInfo( crashreportcategory );
}
public void addEntityCrashInfo(final CrashReportCategory crashreportcategory) {
if (this.getGridTickable() instanceof AEBasePart) {
final AEBasePart part = (AEBasePart) this.getGridTickable();
part.addEntityCrashInfo(crashreportcategory);
}
crashreportcategory.addCrashSection( "CurrentTickRate", this.getCurrentRate() );
crashreportcategory.addCrashSection( "MinTickRate", this.getRequest().minTickRate );
crashreportcategory.addCrashSection( "MaxTickRate", this.getRequest().maxTickRate );
crashreportcategory.addCrashSection( "MachineType", this.getGridTickable().getClass().getName() );
crashreportcategory.addCrashSection( "GridBlockType", this.getNode().getGridBlock().getClass().getName() );
crashreportcategory.addCrashSection( "ConnectedSides", this.getNode().getConnectedSides() );
crashreportcategory.addCrashSection("CurrentTickRate", this.getCurrentRate());
crashreportcategory.addCrashSection("MinTickRate", this.getRequest().minTickRate);
crashreportcategory.addCrashSection("MaxTickRate", this.getRequest().maxTickRate);
crashreportcategory.addCrashSection("MachineType", this.getGridTickable().getClass().getName());
crashreportcategory.addCrashSection("GridBlockType", this.getNode().getGridBlock().getClass().getName());
crashreportcategory.addCrashSection("ConnectedSides", this.getNode().getConnectedSides());
final DimensionalCoord dc = this.getNode().getGridBlock().getLocation();
if( dc != null )
{
crashreportcategory.addCrashSection( "Location", dc );
}
}
final DimensionalCoord dc = this.getNode().getGridBlock().getLocation();
if (dc != null) {
crashreportcategory.addCrashSection("Location", dc);
}
}
public int getCurrentRate()
{
return this.currentRate;
}
public int getCurrentRate() {
return this.currentRate;
}
public void setCurrentRate( final int currentRate )
{
this.currentRate = Math.min( this.getRequest().maxTickRate, Math.max( this.getRequest().minTickRate, currentRate ) );
}
public void setCurrentRate(final int currentRate) {
this.currentRate = Math.min(this.getRequest().maxTickRate, Math.max(this.getRequest().minTickRate, currentRate));
}
public long getNextTick()
{
return this.lastTick + this.currentRate;
}
public long getNextTick() {
return this.lastTick + this.currentRate;
}
public long getLastTick()
{
return this.lastTick;
}
public long getLastTick() {
return this.lastTick;
}
public void setLastTick( final long lastTick )
{
this.lastTick = lastTick;
}
public void setLastTick(final long lastTick) {
this.lastTick = lastTick;
}
public IGridNode getNode()
{
return this.node;
}
public IGridNode getNode() {
return this.node;
}
public IGridTickable getGridTickable()
{
return this.gt;
}
public IGridTickable getGridTickable() {
return this.gt;
}
public TickingRequest getRequest()
{
return this.request;
}
public TickingRequest getRequest() {
return this.request;
}
}
+32 -41
View File
@@ -19,58 +19,49 @@
package appeng.me.cache.helpers;
import java.util.Collection;
import java.util.Iterator;
import appeng.parts.p2p.PartP2PTunnel;
import appeng.util.iterators.NullIterator;
import java.util.Collection;
import java.util.Iterator;
public class TunnelCollection<T extends PartP2PTunnel> implements Iterable<T>
{
private final Class clz;
private Collection<T> tunnelSources;
public class TunnelCollection<T extends PartP2PTunnel> implements Iterable<T> {
public TunnelCollection( final Collection<T> src, final Class c )
{
this.tunnelSources = src;
this.clz = c;
}
private final Class clz;
private Collection<T> tunnelSources;
public void setSource( final Collection<T> c )
{
this.tunnelSources = c;
}
public TunnelCollection(final Collection<T> src, final Class c) {
this.tunnelSources = src;
this.clz = c;
}
public boolean isEmpty()
{
return !this.iterator().hasNext();
}
public void setSource(final Collection<T> c) {
this.tunnelSources = c;
}
@Override
public Iterator<T> iterator()
{
if( this.tunnelSources == null )
{
return new NullIterator<>();
}
return new TunnelIterator<>( this.tunnelSources, this.clz );
}
public boolean isEmpty() {
return !this.iterator().hasNext();
}
public boolean matches( final Class<? extends PartP2PTunnel> c )
{
return this.clz == c;
}
@Override
public Iterator<T> iterator() {
if (this.tunnelSources == null) {
return new NullIterator<>();
}
return new TunnelIterator<>(this.tunnelSources, this.clz);
}
public Class<? extends PartP2PTunnel> getClz()
{
return this.clz;
}
public boolean matches(final Class<? extends PartP2PTunnel> c) {
return this.clz == c;
}
public int size()
{
return this.tunnelSources == null ? 0 : this.tunnelSources.size();
}
public Class<? extends PartP2PTunnel> getClz() {
return this.clz;
}
public int size() {
return this.tunnelSources == null ? 0 : this.tunnelSources.size();
}
}
+13 -17
View File
@@ -23,25 +23,21 @@ import appeng.api.networking.IGridConnection;
import appeng.parts.p2p.PartP2PTunnelME;
public class TunnelConnection
{
public class TunnelConnection {
private final PartP2PTunnelME tunnel;
private final IGridConnection c;
private final PartP2PTunnelME tunnel;
private final IGridConnection c;
public TunnelConnection( final PartP2PTunnelME t, final IGridConnection con )
{
this.tunnel = t;
this.c = con;
}
public TunnelConnection(final PartP2PTunnelME t, final IGridConnection con) {
this.tunnel = t;
this.c = con;
}
public IGridConnection getConnection()
{
return this.c;
}
public IGridConnection getConnection() {
return this.c;
}
public PartP2PTunnelME getTunnel()
{
return this.tunnel;
}
public PartP2PTunnelME getTunnel() {
return this.tunnel;
}
}
+34 -42
View File
@@ -19,56 +19,48 @@
package appeng.me.cache.helpers;
import appeng.parts.p2p.PartP2PTunnel;
import java.util.Collection;
import java.util.Iterator;
import appeng.parts.p2p.PartP2PTunnel;
public class TunnelIterator<T extends PartP2PTunnel> implements Iterator<T> {
public class TunnelIterator<T extends PartP2PTunnel> implements Iterator<T>
{
private final Iterator<T> wrapped;
private final Class targetType;
private T Next;
private final Iterator<T> wrapped;
private final Class targetType;
private T Next;
public TunnelIterator(final Collection<T> tunnelSources, final Class clz) {
this.wrapped = tunnelSources.iterator();
this.targetType = clz;
this.findNext();
}
public TunnelIterator( final Collection<T> tunnelSources, final Class clz )
{
this.wrapped = tunnelSources.iterator();
this.targetType = clz;
this.findNext();
}
private void findNext() {
while (this.Next == null && this.wrapped.hasNext()) {
this.Next = this.wrapped.next();
if (!this.targetType.isInstance(this.Next)) {
this.Next = null;
}
}
}
private void findNext()
{
while( this.Next == null && this.wrapped.hasNext() )
{
this.Next = this.wrapped.next();
if( !this.targetType.isInstance( this.Next ) )
{
this.Next = null;
}
}
}
@Override
public boolean hasNext() {
this.findNext();
return this.Next != null;
}
@Override
public boolean hasNext()
{
this.findNext();
return this.Next != null;
}
@Override
public T next() {
final T tmp = this.Next;
this.Next = null;
return tmp;
}
@Override
public T next()
{
final T tmp = this.Next;
this.Next = null;
return tmp;
}
@Override
public void remove()
{
// no.
}
@Override
public void remove() {
// no.
}
}