@@ -0,0 +1,598 @@
using HarmonyLib ;
using Sandbox.Engine.Multiplayer ;
using Sandbox.Game ;
using Sandbox.Game.Gui ;
using Sandbox.Game.GUI ;
using Sandbox.Game.Localization ;
using Sandbox.Game.Multiplayer ;
using Sandbox.Game.SessionComponents ;
using Sandbox.Game.VoiceChat ;
using Sandbox.Game.World ;
using Sandbox.Graphics.GUI ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Reflection ;
using System.Text ;
using System.Threading.Tasks ;
using VRage ;
using VRage.Audio ;
using VRage.Game ;
using VRage.Game.ModAPI ;
using VRage.Utils ;
using VRageMath ;
namespace SeamlessClientPlugin.Utilities
{
public class OnlinePlayers
{
private static Harmony Patcher = new Harmony ( "OnlinePlayersPatcher" ) ;
private static MethodInfo m_UpdateCaption ;
private static MethodInfo m_RefreshMuteIcons ;
private static MethodInfo m_OnToggleMutePressed ;
private static MethodInfo m_AddCaption ;
private static MethodInfo m_profileButton_ButtonClicked ;
private static MethodInfo m_promoteButton_ButtonClicked ;
private static MethodInfo m_demoteButton_ButtonClicked ;
private static MethodInfo m_kickButton_ButtonClicked ;
private static MethodInfo m_banButton_ButtonClicked ;
private static MethodInfo m_tradeButton_ButtonClicked ;
private static MethodInfo m_inviteButton_ButtonClicked ;
private static MethodInfo m_PlayersTable_ItemSelected ;
private static MethodInfo m_UpdateButtonsEnabledState ;
private static FieldInfo m_playersTable ;
private static FieldInfo m_pings ;
private static FieldInfo m_PlayersTable ;
private static FieldInfo m_MaxPlayers ;
private static FieldInfo m_Warfare_timeRemainting_label ;
private static FieldInfo m_Warfare_timeRemainting_time ;
private static FieldInfo m_LastSelected ;
/* Buttons */
private static FieldInfo m_ProfileButton ;
private static FieldInfo m_PromoteButton ;
private static FieldInfo m_DemoteButton ;
private static FieldInfo m_KickButton ;
private static FieldInfo m_BanButton ;
private static FieldInfo m_TradeButton ;
private static FieldInfo m_InviteButton ;
private static FieldInfo m_caption ;
public static void Patch ( )
{
m_playersTable = typeof ( MyGuiScreenPlayers ) . GetField ( "m_playersTable" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_pings = typeof ( MyGuiScreenPlayers ) . GetField ( "pings" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_UpdateCaption = typeof ( MyGuiScreenPlayers ) . GetMethod ( "UpdateCaption" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_RefreshMuteIcons = typeof ( MyGuiScreenPlayers ) . GetMethod ( "RefreshMuteIcons" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_OnToggleMutePressed = typeof ( MyGuiScreenPlayers ) . GetMethod ( "OnToggleMutePressed" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_profileButton_ButtonClicked = typeof ( MyGuiScreenPlayers ) . GetMethod ( "profileButton_ButtonClicked" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_promoteButton_ButtonClicked = typeof ( MyGuiScreenPlayers ) . GetMethod ( "promoteButton_ButtonClicked" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_demoteButton_ButtonClicked = typeof ( MyGuiScreenPlayers ) . GetMethod ( "demoteButton_ButtonClicked" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_kickButton_ButtonClicked = typeof ( MyGuiScreenPlayers ) . GetMethod ( "kickButton_ButtonClicked" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_banButton_ButtonClicked = typeof ( MyGuiScreenPlayers ) . GetMethod ( "banButton_ButtonClicked" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_tradeButton_ButtonClicked = typeof ( MyGuiScreenPlayers ) . GetMethod ( "tradeButton_ButtonClicked" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_inviteButton_ButtonClicked = typeof ( MyGuiScreenPlayers ) . GetMethod ( "inviteButton_ButtonClicked" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_UpdateButtonsEnabledState = typeof ( MyGuiScreenPlayers ) . GetMethod ( "UpdateButtonsEnabledState" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_PlayersTable_ItemSelected = typeof ( MyGuiScreenPlayers ) . GetMethod ( "playersTable_ItemSelected" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
//m_SetColumnName = typeof(MyGuiScreenPlayers).GetMethod("SetColumnName", BindingFlags.Instance | BindingFlags.se);
m_caption = typeof ( MyGuiScreenPlayers ) . GetField ( "m_caption" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_PlayersTable = typeof ( MyGuiScreenPlayers ) . GetField ( "m_playersTable" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_MaxPlayers = typeof ( MyGuiScreenPlayers ) . GetField ( "m_maxPlayers" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_Warfare_timeRemainting_label = typeof ( MyGuiScreenPlayers ) . GetField ( "m_warfare_timeRemainting_label" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_Warfare_timeRemainting_time = typeof ( MyGuiScreenPlayers ) . GetField ( "m_warfare_timeRemainting_time" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_LastSelected = typeof ( MyGuiScreenPlayers ) . GetField ( "m_lastSelected" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
/* Buttons */
m_ProfileButton = typeof ( MyGuiScreenPlayers ) . GetField ( "m_profileButton" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_PromoteButton = typeof ( MyGuiScreenPlayers ) . GetField ( "m_promoteButton" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_DemoteButton = typeof ( MyGuiScreenPlayers ) . GetField ( "m_demoteButton" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_KickButton = typeof ( MyGuiScreenPlayers ) . GetField ( "m_kickButton" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_BanButton = typeof ( MyGuiScreenPlayers ) . GetField ( "m_banButton" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_TradeButton = typeof ( MyGuiScreenPlayers ) . GetField ( "m_tradeButton" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_InviteButton = typeof ( MyGuiScreenPlayers ) . GetField ( "m_inviteButton" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
m_AddCaption = typeof ( MyGuiScreenPlayers ) . GetMethod ( "AddCaption" , BindingFlags . Instance | BindingFlags . NonPublic , null , new Type [ ] { typeof ( MyStringId ) , typeof ( Vector4 ? ) , typeof ( Vector2 ? ) , typeof ( float ) } , null ) ;
MethodInfo recreateControls = typeof ( MyGuiScreenPlayers ) . GetMethod ( "RecreateControls" , BindingFlags . Instance | BindingFlags . Public ) ;
Patcher . Patch ( recreateControls , prefix : new HarmonyMethod ( GetPatchMethod ( nameof ( RecreateControlsPrefix ) ) ) ) ;
//Patcher.Patch(recreateControls, postfix: new HarmonyMethod(GetPatchMethod(nameof(RecreateControlsSuffix))));
}
public static bool RecreateControlsPrefix ( MyGuiScreenPlayers __instance , bool constructor )
{
if ( MyMultiplayer . Static ! = null & & MyMultiplayer . Static . IsLobby )
{
return true ;
}
try
{
SeamlessClient . TryShow ( "A" ) ;
//__instance.RecreateControls(constructor);
__instance . Size = new Vector2 ( 0.937f , 0.913f ) ;
__instance . CloseButtonEnabled = true ;
SeamlessClient . TryShow ( "A2" ) ;
m_caption . SetValue ( __instance , m_AddCaption . Invoke ( __instance , new object [ 4 ] { MyCommonTexts . ScreenCaptionPlayers , null , new Vector2 ( 0f , 0.003f ) , 0.8f } ) ) ;
float StartX = - 0.435f ;
float StartY = - 0.36f ;
MyGuiControlSeparatorList myGuiControlSeparatorList = new MyGuiControlSeparatorList ( ) ;
myGuiControlSeparatorList . AddHorizontal ( new Vector2 ( StartX , StartY ) , . 83f ) ;
Vector2 start = new Vector2 ( StartX , 0.358f ) ;
myGuiControlSeparatorList . AddHorizontal ( start , 0.728f ) ;
myGuiControlSeparatorList . AddHorizontal ( new Vector2 ( StartX , 0.05f ) , 0.17f ) ;
__instance . Controls . Add ( myGuiControlSeparatorList ) ;
Vector2 Spacing = new Vector2 ( 0f , 0.057f ) ;
Vector2 vector3 = new Vector2 ( StartX , StartY + 0.035f ) ;
SeamlessClient . TryShow ( "B" ) ;
MyGuiControlButton m_profileButton = new MyGuiControlButton ( vector3 , MyGuiControlButtonStyleEnum . Default , null , null , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_TOP , null , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Profile ) ) ;
m_profileButton . ButtonClicked + = delegate ( MyGuiControlButton obj ) { m_profileButton_ButtonClicked . Invoke ( __instance , new object [ ] { obj } ) ; } ;
__instance . Controls . Add ( m_profileButton ) ;
vector3 + = Spacing ;
m_ProfileButton . SetValue ( __instance , m_profileButton ) ;
MyGuiControlButton m_promoteButton = new MyGuiControlButton ( vector3 , MyGuiControlButtonStyleEnum . Default , null , null , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_TOP , null , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Promote ) ) ;
m_promoteButton . ButtonClicked + = delegate ( MyGuiControlButton obj ) { m_promoteButton_ButtonClicked . Invoke ( __instance , new object [ ] { obj } ) ; } ;
__instance . Controls . Add ( m_promoteButton ) ;
vector3 + = Spacing ;
m_PromoteButton . SetValue ( __instance , m_promoteButton ) ;
MyGuiControlButton m_demoteButton = new MyGuiControlButton ( vector3 , MyGuiControlButtonStyleEnum . Default , null , null , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_TOP , null , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Demote ) ) ;
m_demoteButton . ButtonClicked + = delegate ( MyGuiControlButton obj ) { m_demoteButton_ButtonClicked . Invoke ( __instance , new object [ ] { obj } ) ; } ;
__instance . Controls . Add ( m_demoteButton ) ;
vector3 + = Spacing ;
m_DemoteButton . SetValue ( __instance , m_demoteButton ) ;
MyGuiControlButton m_kickButton = new MyGuiControlButton ( vector3 , MyGuiControlButtonStyleEnum . Default , null , null , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_TOP , null , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Kick ) ) ;
m_kickButton . ButtonClicked + = delegate ( MyGuiControlButton obj ) { m_kickButton_ButtonClicked . Invoke ( __instance , new object [ ] { obj } ) ; } ;
__instance . Controls . Add ( m_kickButton ) ;
vector3 + = Spacing ;
m_KickButton . SetValue ( __instance , m_kickButton ) ;
MyGuiControlButton m_banButton = new MyGuiControlButton ( vector3 , MyGuiControlButtonStyleEnum . Default , null , null , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_TOP , null , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Ban ) ) ;
m_banButton . ButtonClicked + = delegate ( MyGuiControlButton obj ) { m_banButton_ButtonClicked . Invoke ( __instance , new object [ ] { obj } ) ; } ;
__instance . Controls . Add ( m_banButton ) ;
vector3 + = Spacing ;
m_BanButton . SetValue ( __instance , m_banButton ) ;
MyGuiControlButton m_tradeButton = new MyGuiControlButton ( vector3 , MyGuiControlButtonStyleEnum . Default , null , null , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_TOP , null , MyTexts . Get ( MySpaceTexts . PlayersScreen_TradeBtn ) ) ;
m_tradeButton . SetTooltip ( MyTexts . GetString ( MySpaceTexts . PlayersScreen_TradeBtn_TTP ) ) ;
m_tradeButton . ButtonClicked + = delegate ( MyGuiControlButton obj ) { m_tradeButton_ButtonClicked . Invoke ( __instance , new object [ ] { obj } ) ; } ;
__instance . Controls . Add ( m_tradeButton ) ;
m_TradeButton . SetValue ( __instance , m_tradeButton ) ;
SeamlessClient . TryShow ( "C" ) ;
m_MaxPlayers . SetValue ( __instance , ( Sync . IsServer ? MyMultiplayerLobby . MAX_PLAYERS : 16 ) ) ;
MyGuiControlButton m_inviteButton = new MyGuiControlButton ( new Vector2 ( StartX , 0.285000026f ) , MyGuiControlButtonStyleEnum . Default , null , null , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_TOP , null , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Invite ) ) ;
m_inviteButton . ButtonClicked + = delegate ( MyGuiControlButton obj ) { m_inviteButton_ButtonClicked . Invoke ( __instance , new object [ ] { obj } ) ; } ;
__instance . Controls . Add ( m_inviteButton ) ;
m_InviteButton . SetValue ( __instance , m_inviteButton ) ;
Vector2 vector6 = new Vector2 ( - StartX - 0.034f , StartY + 0.033f ) ;
Vector2 size = new Vector2 ( 0.66f , 1f ) ;
int num2 = 18 ;
float num3 = 0f ;
SeamlessClient . TryShow ( "D" ) ;
MySessionComponentMatch component = MySession . Static . GetComponent < MySessionComponentMatch > ( ) ;
if ( component . IsEnabled )
{
Vector2 vector7 = __instance . GetPositionAbsolute ( ) + vector6 + new Vector2 ( 0f - size . X , 0f ) ;
MyGuiControlLabel m_warfare_timeRemainting_label = new MyGuiControlLabel ( vector6 - new Vector2 ( size . X , 0f ) ) ;
m_warfare_timeRemainting_label . Text = MyTexts . GetString ( MySpaceTexts . WarfareCounter_TimeRemaining ) . ToString ( ) + ": " ;
__instance . Controls . Add ( m_warfare_timeRemainting_label ) ;
m_Warfare_timeRemainting_label . SetValue ( __instance , m_warfare_timeRemainting_label ) ;
TimeSpan timeSpan = TimeSpan . FromMinutes ( component . RemainingMinutes ) ;
MyGuiControlLabel m_warfare_timeRemainting_time = new MyGuiControlLabel ( vector6 - new Vector2 ( size . X , 0f ) + new Vector2 ( m_warfare_timeRemainting_label . Size . X , 0f ) ) ;
m_warfare_timeRemainting_time . Text = timeSpan . ToString ( ( timeSpan . TotalHours > = 1.0 ) ? "hh\\:mm\\:ss" : "mm\\:ss" ) ;
__instance . Controls . Add ( m_warfare_timeRemainting_time ) ;
m_Warfare_timeRemainting_time . SetValue ( __instance , m_warfare_timeRemainting_label ) ;
float num4 = 0.09f ;
float num5 = size . X / 3f - 2f * num3 ;
int num6 = 0 ;
MyFaction [ ] allFactions = MySession . Static . Factions . GetAllFactions ( ) ;
foreach ( MyFaction myFaction in allFactions )
{
if ( ( myFaction . Name . StartsWith ( "Red" ) | | myFaction . Name . StartsWith ( "Green" ) | | myFaction . Name . StartsWith ( "Blue" ) ) & & myFaction . Name . EndsWith ( "Faction" ) )
{
__instance . Controls . Add ( new MyGuiScreenPlayersWarfareTeamScoreTable ( vector7 + new Vector2 ( ( float ) num6 * ( num5 + num3 ) , m_warfare_timeRemainting_label . Size . Y + num3 ) , num5 , num4 , myFaction . Name , myFaction . FactionIcon . Value . String , MyTexts . GetString ( MySpaceTexts . WarfareCounter_EscapePod ) , myFaction . FactionId , drawOwnBackground : false , drawBorders : true , myFaction . IsMember ( MySession . Static . LocalHumanPlayer . Identity . IdentityId ) ) ) ;
num6 + + ;
}
}
vector6 . Y + = m_warfare_timeRemainting_label . Size . Y + num4 + num3 * 2f ;
num2 - = 3 ;
}
SeamlessClient . TryShow ( "E" ) ;
MyGuiControlTable m_playersTable = new MyGuiControlTable
{
Position = vector6 ,
Size = size ,
OriginAlign = MyGuiDrawAlignEnum . HORISONTAL_RIGHT_AND_VERTICAL_TOP ,
ColumnsCount = 7
} ;
m_PlayersTable . SetValue ( __instance , m_playersTable ) ;
SeamlessClient . TryShow ( "F" ) ;
m_playersTable . GamepadHelpTextId = MySpaceTexts . PlayersScreen_Help_PlayersList ;
m_playersTable . VisibleRowsCount = num2 ;
float PlayerName = 0.2f ;
float Rank = 0.08f ;
float Ping = 0.08f ;
float Muted = 0.06f ;
float SteamIcon = 0.04f ;
float Server = 0.25f ;
float FactionName = 1f - PlayerName - Rank - Muted - Ping - SteamIcon - Server ;
m_playersTable . SetCustomColumnWidths ( new float [ 7 ]
{
SteamIcon ,
PlayerName ,
FactionName ,
Rank ,
Ping ,
Muted ,
Server ,
} ) ;
SeamlessClient . TryShow ( "G" ) ;
m_playersTable . SetColumnComparison ( 1 , ( MyGuiControlTable . Cell a , MyGuiControlTable . Cell b ) = > a . Text . CompareToIgnoreCase ( b . Text ) ) ;
m_playersTable . SetColumnName ( 1 , MyTexts . Get ( MyCommonTexts . ScreenPlayers_PlayerName ) ) ;
m_playersTable . SetColumnComparison ( 2 , ( MyGuiControlTable . Cell a , MyGuiControlTable . Cell b ) = > a . Text . CompareToIgnoreCase ( b . Text ) ) ;
m_playersTable . SetColumnName ( 2 , MyTexts . Get ( MyCommonTexts . ScreenPlayers_FactionName ) ) ;
m_playersTable . SetColumnName ( 5 , new StringBuilder ( MyTexts . GetString ( MyCommonTexts . ScreenPlayers_Muted ) ) ) ;
m_playersTable . SetColumnComparison ( 3 , GameAdminCompare ) ;
m_playersTable . SetColumnName ( 3 , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Rank ) ) ;
m_playersTable . SetColumnComparison ( 4 , GamePingCompare ) ;
m_playersTable . SetColumnName ( 4 , MyTexts . Get ( MyCommonTexts . ScreenPlayers_Ping ) ) ;
StringBuilder colName = new StringBuilder ( "Server" ) ;
m_playersTable . SetColumnName ( 6 , colName ) ;
m_playersTable . SetColumnComparison ( 6 , ( MyGuiControlTable . Cell a , MyGuiControlTable . Cell b ) = > a . Text . CompareToIgnoreCase ( b . Text ) ) ;
SeamlessClient . TryShow ( "H" ) ;
//m_PlayersTable_ItemSelected
m_playersTable . ItemSelected + = delegate ( MyGuiControlTable i , MyGuiControlTable . EventArgs x ) { m_PlayersTable_ItemSelected . Invoke ( __instance , new object [ ] { i , x } ) ; } ;
m_playersTable . UpdateTableSortHelpText ( ) ;
__instance . Controls . Add ( m_playersTable ) ;
foreach ( MyPlayer onlinePlayer in Sync . Players . GetOnlinePlayers ( ) )
{
if ( onlinePlayer . Id . SerialId ! = 0 )
{
continue ;
}
for ( int j = 0 ; j < m_playersTable . RowsCount ; j + + )
{
MyGuiControlTable . Row row = m_playersTable . GetRow ( j ) ;
if ( row . UserData is ulong )
{
_ = ( ulong ) row . UserData ;
_ = onlinePlayer . Id . SteamId ;
}
}
AddPlayer ( __instance , onlinePlayer . Id . SteamId ) ;
}
SeamlessClient . TryShow ( "I" ) ;
ulong m_lastSelected = ( ulong ) m_LastSelected . GetValue ( __instance ) ;
if ( m_lastSelected ! = 0L )
{
MyGuiControlTable . Row row2 = m_playersTable . Find ( ( MyGuiControlTable . Row r ) = > ( ulong ) r . UserData = = m_lastSelected ) ;
if ( row2 ! = null )
{
m_playersTable . SelectedRow = row2 ;
}
}
m_UpdateButtonsEnabledState . Invoke ( __instance , null ) ;
//UpdateButtonsEnabledState();
m_UpdateCaption . Invoke ( __instance , null ) ;
Vector2 minSizeGui = MyGuiControlButton . GetVisualStyle ( MyGuiControlButtonStyleEnum . Default ) . NormalTexture . MinSizeGui ;
MyGuiControlLabel myGuiControlLabel = new MyGuiControlLabel ( new Vector2 ( start . X , start . Y + minSizeGui . Y / 2f ) ) ;
myGuiControlLabel . Name = MyGuiScreenBase . GAMEPAD_HELP_LABEL_NAME ;
__instance . Controls . Add ( myGuiControlLabel ) ;
__instance . GamepadHelpTextId = MySpaceTexts . PlayersScreen_Help_Screen ;
__instance . FocusedControl = m_playersTable ;
SeamlessClient . TryShow ( "J" ) ;
}
catch ( Exception ex )
{
SeamlessClient . TryShow ( ex . ToString ( ) ) ;
}
return false ;
}
/*
public void AddPlayer(ulong steamID, string memberName, string server)
{
if (string.IsNullOrEmpty(memberName))
{
return;
}
MyGuiControlTable.Row row = new MyGuiControlTable.Row(steamID);
string memberServiceName = MyMultiplayer.Static.GetMemberServiceName(steamID);
StringBuilder text = new StringBuilder();
MyGuiHighlightTexture? icon = new MyGuiHighlightTexture
{
Normal = "Textures\\GUI\\Icons\\Services\\" + memberServiceName + ".png",
Highlight = "Textures\\GUI\\Icons\\Services\\" + memberServiceName + ".png",
SizePx = new Vector2(24f, 24f)
};
row.AddCell(new MyGuiControlTable.Cell(text, null, memberServiceName, Color.White, icon, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER));
row.AddCell(new MyGuiControlTable.Cell(new StringBuilder(memberName), memberName));
long playerId = Sync.Players.TryGetIdentityId(steamID);
MyFaction playerFaction = MySession.Static.Factions.GetPlayerFaction(playerId);
string text2 = "";
StringBuilder stringBuilder = new StringBuilder();
if (playerFaction != null)
{
text2 += playerFaction.Name;
text2 = text2 + " | " + memberName;
foreach (KeyValuePair<long, MyFactionMember> member in playerFaction.Members)
{
if ((member.Value.IsLeader || member.Value.IsFounder) && MySession.Static.Players.TryGetPlayerId(member.Value.PlayerId, out var result) && MySession.Static.Players.TryGetPlayerById(result, out var player))
{
text2 = text2 + " | " + player.DisplayName;
break;
}
}
stringBuilder.Append(MyStatControlText.SubstituteTexts(playerFaction.Name));
if (playerFaction.IsLeader(playerId))
{
stringBuilder.Append(" (").Append((object)MyTexts.Get(MyCommonTexts.Leader)).Append(")");
}
if (!string.IsNullOrEmpty(playerFaction.Tag))
{
stringBuilder.Insert(0, "[" + playerFaction.Tag + "] ");
}
}
row.AddCell(new MyGuiControlTable.Cell(stringBuilder, null, text2));
StringBuilder stringBuilder2 = new StringBuilder();
MyPromoteLevel userPromoteLevel = MySession.Static.GetUserPromoteLevel(steamID);
for (int i = 0; i < (int)userPromoteLevel; i++)
{
stringBuilder2.Append("*");
}
row.AddCell(new MyGuiControlTable.Cell(stringBuilder2));
row.AddCell(new MyGuiControlTable.Cell(new StringBuilder("----")));
MyGuiControlTable.Cell cell = new MyGuiControlTable.Cell(new StringBuilder(""));
row.AddCell(cell);
if (steamID != Sync.MyId)
{
MyGuiControlButton myGuiControlButton = new MyGuiControlButton();
myGuiControlButton.CustomStyle = m_buttonSizeStyleUnMuted;
myGuiControlButton.Size = new Vector2(0.03f, 0.04f);
myGuiControlButton.CueEnum = GuiSounds.None;
//myGuiControlButton.ButtonClicked += OnToggleMutePressed;
myGuiControlButton.UserData = steamID;
cell.Control = myGuiControlButton;
table.Controls.Add(myGuiControlButton);
//RefreshMuteIcons();
}
row.AddCell(new MyGuiControlTable.Cell(new StringBuilder(server), server));
table.Add(row);
//UpdateCaption();
}
*/
private static bool AddPlayer ( MyGuiScreenPlayers __instance , ulong userId )
{
MyGuiControlTable table = ( MyGuiControlTable ) m_playersTable . GetValue ( __instance ) ;
Dictionary < ulong , short > pings = ( Dictionary < ulong , short > ) m_pings . GetValue ( __instance ) ;
string memberName = MyMultiplayer . Static . GetMemberName ( userId ) ;
if ( string . IsNullOrEmpty ( memberName ) )
{
return false ;
}
MyGuiControlTable . Row row = new MyGuiControlTable . Row ( userId ) ;
string memberServiceName = MyMultiplayer . Static . GetMemberServiceName ( userId ) ;
StringBuilder text = new StringBuilder ( ) ;
MyGuiHighlightTexture ? icon = new MyGuiHighlightTexture
{
Normal = "Textures\\GUI\\Icons\\Services\\" + memberServiceName + ".png" ,
Highlight = "Textures\\GUI\\Icons\\Services\\" + memberServiceName + ".png" ,
SizePx = new Vector2 ( 24f , 24f )
} ;
row . AddCell ( new MyGuiControlTable . Cell ( text , null , memberServiceName , Color . White , icon , MyGuiDrawAlignEnum . HORISONTAL_LEFT_AND_VERTICAL_CENTER ) ) ;
row . AddCell ( new MyGuiControlTable . Cell ( new StringBuilder ( memberName ) , memberName ) ) ;
long playerId = Sync . Players . TryGetIdentityId ( userId ) ;
MyFaction playerFaction = MySession . Static . Factions . GetPlayerFaction ( playerId ) ;
string text2 = "" ;
StringBuilder stringBuilder = new StringBuilder ( ) ;
if ( playerFaction ! = null )
{
text2 + = playerFaction . Name ;
text2 = text2 + " | " + memberName ;
foreach ( KeyValuePair < long , MyFactionMember > member in playerFaction . Members )
{
if ( ( member . Value . IsLeader | | member . Value . IsFounder ) & & MySession . Static . Players . TryGetPlayerId ( member . Value . PlayerId , out var result ) & & MySession . Static . Players . TryGetPlayerById ( result , out var player ) )
{
text2 = text2 + " | " + player . DisplayName ;
break ;
}
}
stringBuilder . Append ( MyStatControlText . SubstituteTexts ( playerFaction . Name ) ) ;
if ( playerFaction . IsLeader ( playerId ) )
{
stringBuilder . Append ( " (" ) . Append ( ( object ) MyTexts . Get ( MyCommonTexts . Leader ) ) . Append ( ")" ) ;
}
if ( ! string . IsNullOrEmpty ( playerFaction . Tag ) )
{
stringBuilder . Insert ( 0 , "[" + playerFaction . Tag + "] " ) ;
}
}
row . AddCell ( new MyGuiControlTable . Cell ( stringBuilder , null , text2 ) ) ;
StringBuilder stringBuilder2 = new StringBuilder ( ) ;
MyPromoteLevel userPromoteLevel = MySession . Static . GetUserPromoteLevel ( userId ) ;
for ( int i = 0 ; i < ( int ) userPromoteLevel ; i + + )
{
stringBuilder2 . Append ( "*" ) ;
}
row . AddCell ( new MyGuiControlTable . Cell ( stringBuilder2 ) ) ;
if ( pings . ContainsKey ( userId ) )
{
row . AddCell ( new MyGuiControlTable . Cell ( new StringBuilder ( pings [ userId ] . ToString ( ) ) ) ) ;
}
else
{
row . AddCell ( new MyGuiControlTable . Cell ( new StringBuilder ( "----" ) ) ) ;
}
MyGuiControlTable . Cell cell = new MyGuiControlTable . Cell ( new StringBuilder ( "" ) ) ;
row . AddCell ( cell ) ;
if ( userId ! = Sync . MyId )
{
MyGuiControlButton myGuiControlButton = new MyGuiControlButton ( ) ;
myGuiControlButton . CustomStyle = m_buttonSizeStyleUnMuted ;
myGuiControlButton . Size = new Vector2 ( 0.03f , 0.04f ) ;
myGuiControlButton . CueEnum = GuiSounds . None ;
Action < MyGuiControlButton > btnClicked = delegate ( MyGuiControlButton b )
{
m_OnToggleMutePressed . Invoke ( __instance , null ) ;
} ;
myGuiControlButton . ButtonClicked + = btnClicked ;
myGuiControlButton . UserData = userId ;
cell . Control = myGuiControlButton ;
table . Controls . Add ( myGuiControlButton ) ;
m_RefreshMuteIcons . Invoke ( __instance , null ) ;
//RefreshMuteIcons();
}
table . Add ( row ) ;
m_UpdateCaption . Invoke ( __instance , null ) ;
row . AddCell ( new MyGuiControlTable . Cell ( new StringBuilder ( "ThisServer" ) , "ThisServer" ) ) ;
return false ;
}
private static int GamePingCompare ( MyGuiControlTable . Cell a , MyGuiControlTable . Cell b )
{
if ( ! int . TryParse ( a . Text . ToString ( ) , out var result ) )
{
result = - 1 ;
}
if ( ! int . TryParse ( b . Text . ToString ( ) , out var result2 ) )
{
result2 = - 1 ;
}
return result . CompareTo ( result2 ) ;
}
private static int GameAdminCompare ( MyGuiControlTable . Cell a , MyGuiControlTable . Cell b )
{
ulong steamId = ( ulong ) a . Row . UserData ;
ulong steamId2 = ( ulong ) b . Row . UserData ;
int userPromoteLevel = ( int ) MySession . Static . GetUserPromoteLevel ( steamId ) ;
int userPromoteLevel2 = ( int ) MySession . Static . GetUserPromoteLevel ( steamId2 ) ;
return userPromoteLevel . CompareTo ( userPromoteLevel2 ) ;
}
private static readonly MyGuiControlButton . StyleDefinition m_buttonSizeStyleUnMuted = new MyGuiControlButton . StyleDefinition
{
NormalFont = "White" ,
HighlightFont = "White" ,
NormalTexture = MyGuiConstants . TEXTURE_HUD_VOICE_CHAT ,
HighlightTexture = MyGuiConstants . TEXTURE_HUD_VOICE_CHAT
} ;
private static MethodInfo GetPatchMethod ( string v )
{
return typeof ( OnlinePlayers ) . GetMethod ( v , BindingFlags . Static | BindingFlags . Public | BindingFlags . NonPublic ) ;
}
}
}