From 5db7fc8e8c92d4ed02ebcd778038a047dee4724c Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 31 Oct 2016 23:55:14 +0100 Subject: [PATCH] Show P2P-Tunnel Link Status on WAILA (#2545) Implemented QoL improvement for P2P tunnels by showing their link status via WAILA. --- .../appeng/core/localization/WailaText.java | 2 + .../modules/waila/PartWailaDataProvider.java | 4 +- .../waila/part/P2PStateWailaDataProvider.java | 158 ++++++++++++++++++ .../java/appeng/parts/p2p/PartP2PTunnel.java | 4 +- .../appliedenergistics2/lang/en_US.lang | 4 + 5 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 src/main/java/appeng/integration/modules/waila/part/P2PStateWailaDataProvider.java diff --git a/src/main/java/appeng/core/localization/WailaText.java b/src/main/java/appeng/core/localization/WailaText.java index 9d27bf3c..be50896e 100644 --- a/src/main/java/appeng/core/localization/WailaText.java +++ b/src/main/java/appeng/core/localization/WailaText.java @@ -26,6 +26,8 @@ public enum WailaText DeviceOnline, DeviceOffline, DeviceMissingChannel, + P2PUnlinked, P2PInputOneOutput, P2PInputManyOutputs, P2POutput, + Locked, Unlocked, Showing, Contains, Channels; diff --git a/src/main/java/appeng/integration/modules/waila/PartWailaDataProvider.java b/src/main/java/appeng/integration/modules/waila/PartWailaDataProvider.java index 3839a591..4d55dccc 100644 --- a/src/main/java/appeng/integration/modules/waila/PartWailaDataProvider.java +++ b/src/main/java/appeng/integration/modules/waila/PartWailaDataProvider.java @@ -39,6 +39,7 @@ import mcp.mobius.waila.api.IWailaDataProvider; import appeng.api.parts.IPart; import appeng.integration.modules.waila.part.ChannelWailaDataProvider; import appeng.integration.modules.waila.part.IPartWailaDataProvider; +import appeng.integration.modules.waila.part.P2PStateWailaDataProvider; import appeng.integration.modules.waila.part.PartAccessor; import appeng.integration.modules.waila.part.PartStackWailaDataProvider; import appeng.integration.modules.waila.part.PowerStateWailaDataProvider; @@ -78,9 +79,10 @@ public final class PartWailaDataProvider implements IWailaDataProvider final IPartWailaDataProvider channel = new ChannelWailaDataProvider(); final IPartWailaDataProvider storageMonitor = new StorageMonitorWailaDataProvider(); final IPartWailaDataProvider powerState = new PowerStateWailaDataProvider(); + final IPartWailaDataProvider p2pState = new P2PStateWailaDataProvider(); final IPartWailaDataProvider partStack = new PartStackWailaDataProvider(); - this.providers = Lists.newArrayList( channel, storageMonitor, powerState, partStack ); + this.providers = Lists.newArrayList( channel, storageMonitor, powerState, partStack, p2pState ); } @Override diff --git a/src/main/java/appeng/integration/modules/waila/part/P2PStateWailaDataProvider.java b/src/main/java/appeng/integration/modules/waila/part/P2PStateWailaDataProvider.java new file mode 100644 index 00000000..a9e77fbd --- /dev/null +++ b/src/main/java/appeng/integration/modules/waila/part/P2PStateWailaDataProvider.java @@ -0,0 +1,158 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.integration.modules.waila.part; + + +import java.util.List; + +import com.google.common.collect.Iterators; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; + +import appeng.api.parts.IPart; +import appeng.core.localization.WailaText; +import appeng.me.GridAccessException; +import appeng.parts.p2p.PartP2PTunnel; + + +/** + * Provides information about a P2P tunnel to WAILA. + */ +public final class P2PStateWailaDataProvider extends BasePartWailaDataProvider +{ + + private static final int STATE_UNLINKED = 0; + private static final int STATE_OUTPUT = 1; + private static final int STATE_INPUT = 2; + public static final String TAG_P2P_STATE = "p2p_state"; + + /** + * Adds state to the tooltip + * + * @param part part with state + * @param currentToolTip to be added to tooltip + * @param accessor wrapper for various information + * @param config config settings + * + * @return modified tooltip + */ + @Override + public List getWailaBody( final IPart part, final List currentToolTip, final IWailaDataAccessor accessor, final IWailaConfigHandler config ) + { + if( part instanceof PartP2PTunnel ) + { + NBTTagCompound nbtData = accessor.getNBTData(); + if( nbtData.hasKey( TAG_P2P_STATE ) ) + { + int[] stateArr = nbtData.getIntArray( TAG_P2P_STATE ); + if( stateArr.length == 2 ) + { + int state = stateArr[0]; + int outputs = stateArr[1]; + + switch( state ) + { + case STATE_UNLINKED: + currentToolTip.add( WailaText.P2PUnlinked.getLocal() ); + break; + case STATE_OUTPUT: + currentToolTip.add( WailaText.P2POutput.getLocal() ); + break; + case STATE_INPUT: + currentToolTip.add( getOutputText( outputs ) ); + break; + } + } + } + } + + return currentToolTip; + } + + @Override + public NBTTagCompound getNBTData( EntityPlayerMP player, IPart part, TileEntity te, NBTTagCompound tag, World world, BlockPos pos ) + { + if( part instanceof PartP2PTunnel ) + { + PartP2PTunnel tunnel = (PartP2PTunnel) part; + + // The default state + int state = STATE_UNLINKED; + int outputCount = 0; + + if( !tunnel.isOutput() ) + { + outputCount = getOutputCount( tunnel ); + if( outputCount > 0 ) + { + // Only set it to INPUT if we know there are any outputs + state = STATE_INPUT; + } + } + else + { + PartP2PTunnel input = tunnel.getInput(); + if( input != null ) + { + state = STATE_OUTPUT; + } + } + + tag.setIntArray( TAG_P2P_STATE, new int[] { + state, + outputCount + } ); + } + + return tag; + } + + private static int getOutputCount( PartP2PTunnel tunnel ) + { + try + { + return Iterators.size( tunnel.getOutputs().iterator() ); + } + catch( GridAccessException e ) + { + // Well... unknown size it is! + return 0; + } + } + + private static String getOutputText( int outputs ) + { + if( outputs <= 1 ) + { + return WailaText.P2PInputOneOutput.getLocal(); + } + else + { + return String.format( WailaText.P2PInputManyOutputs.getLocal(), outputs ); + } + } + +} diff --git a/src/main/java/appeng/parts/p2p/PartP2PTunnel.java b/src/main/java/appeng/parts/p2p/PartP2PTunnel.java index f3f1e934..06125932 100644 --- a/src/main/java/appeng/parts/p2p/PartP2PTunnel.java +++ b/src/main/java/appeng/parts/p2p/PartP2PTunnel.java @@ -73,7 +73,7 @@ public abstract class PartP2PTunnel extends PartBasicSt return null; } - T getInput() + public T getInput() { if( this.getFrequency() == 0 ) { @@ -95,7 +95,7 @@ public abstract class PartP2PTunnel extends PartBasicSt return null; } - TunnelCollection getOutputs() throws GridAccessException + public TunnelCollection getOutputs() throws GridAccessException { if( this.getProxy().isActive() ) { diff --git a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang index 972e7b3d..697d8fd7 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang +++ b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang @@ -360,6 +360,10 @@ waila.appliedenergistics2.Unlocked=Unlocked waila.appliedenergistics2.Showing=Showing waila.appliedenergistics2.Contains=Contains waila.appliedenergistics2.Channels=%1$d of %2$d Channels +waila.appliedenergistics2.P2PUnlinked=Unlinked +waila.appliedenergistics2.P2PInputOneOutput=Linked (Input Side) +waila.appliedenergistics2.P2PInputManyOutputs=Linked (Input Side) - %d Outputs +waila.appliedenergistics2.P2POutput=Linked (Output Side) // Items item.appliedenergistics2.storage_cell_1k.name=1k ME Storage Cell