537 lines
15 KiB
Ucode
537 lines
15 KiB
Ucode
class SRTab_MidGameVoiceChat extends SRTab_Base;
|
|
|
|
var array<UT2K4Tab_MidGameVoiceChat.ChatItem> ChatList;
|
|
|
|
var automated GUISectionBackground sb_Players, sb_Specs, sb_Options;
|
|
var automated GUIListBox lb_Players, lb_Specs;
|
|
var automated GUIList li_Players, li_Specs;
|
|
var automated moCheckbox ch_NoVoiceChat, ch_NoSpeech, ch_NoText, ch_Ban;
|
|
|
|
var() int SelectIndex;
|
|
|
|
var() editconst bool bTeamGame;
|
|
|
|
function GameReplicationInfo GRI()
|
|
{
|
|
return PlayerOwner().GameReplicationInfo;
|
|
}
|
|
|
|
function InitComponent(GUIController MyController, GUIComponent MyOwner)
|
|
{
|
|
// Init localizations
|
|
sb_Players.Caption = Class'UT2K4Tab_MidGameVoiceChat'.Default.sb_Players.Caption;
|
|
sb_Specs.Caption = Class'UT2K4Tab_MidGameVoiceChat'.Default.sb_Specs.Caption;
|
|
sb_Options.Caption = Class'UT2K4Tab_MidGameVoiceChat'.Default.sb_Options.Caption;
|
|
ch_NoVoiceChat.Caption = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_NoVoiceChat.Caption;
|
|
ch_NoVoiceChat.Hint = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_NoVoiceChat.Hint;
|
|
ch_NoSpeech.Caption = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_NoSpeech.Caption;
|
|
ch_NoSpeech.Hint = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_NoSpeech.Hint;
|
|
ch_NoText.Caption = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_NoText.Caption;
|
|
ch_NoText.Hint = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_NoText.Hint;
|
|
ch_Ban.Caption = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_Ban.Caption;
|
|
ch_Ban.Hint = Class'UT2K4Tab_MidGameVoiceChat'.Default.ch_Ban.Hint;
|
|
|
|
Super.InitComponent(MyController, MyOwner);
|
|
|
|
// Tie lists together with buttons
|
|
li_Players = lb_Players.List;
|
|
li_Specs = lb_Specs.List;
|
|
|
|
li_Players.bInitializeList = false;
|
|
li_Specs.bInitializeList = false;
|
|
|
|
sb_Players.ManageComponent( lb_Players );
|
|
sb_Specs.ManageComponent( lb_Specs );
|
|
|
|
sb_Options.ManageComponent( ch_NoText );
|
|
sb_Options.ManageComponent( ch_NoSpeech );
|
|
sb_Options.ManageComponent( ch_NoVoiceChat );
|
|
sb_Options.ManageComponent( ch_Ban );
|
|
|
|
AssociateButtons();
|
|
}
|
|
|
|
function ShowPanel( bool bShow )
|
|
{
|
|
Super.ShowPanel(bShow);
|
|
if ( !bShow )
|
|
{
|
|
ClearIndexes(None);
|
|
SaveRestrictions();
|
|
}
|
|
}
|
|
|
|
event Closed( GUIComponent Sender, bool bCancelled )
|
|
{
|
|
SaveRestrictions();
|
|
Super.Closed(Sender,bCancelled);
|
|
}
|
|
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
// GUI Interface
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
|
|
function bool PreDraw(Canvas Canvas)
|
|
{
|
|
if ( GRI() != None )
|
|
{
|
|
bTeamGame = GRI().bTeamGame;
|
|
FillPlayerLists();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// Called when an player's name is clicked on
|
|
function ListChange( GUIComponent Sender )
|
|
{
|
|
local int ID;
|
|
local GUIList List;
|
|
|
|
List = GUIListBox(Sender).List;
|
|
if ( List == None )
|
|
return;
|
|
|
|
ClearIndexes( List );
|
|
|
|
// grab the associated PlayerID from the selected player
|
|
id = int(List.GetExtra());
|
|
if ( PlayerIDIsMine(id) )
|
|
{
|
|
SelectedSelf();
|
|
return;
|
|
}
|
|
SelectIndex = FindChatListIndex(id);
|
|
LoadRestrictions(SelectIndex);
|
|
}
|
|
|
|
function InternalOnChange(GUIComponent Sender)
|
|
{
|
|
local bool bResult;
|
|
|
|
if ( !ValidIndex(SelectIndex) )
|
|
return;
|
|
|
|
bResult = moCheckbox(Sender).IsChecked();
|
|
ChatList[SelectIndex].bDirty = true;
|
|
switch (Sender)
|
|
{
|
|
case ch_NoText:
|
|
ChatList[SelectIndex].bNoText = bResult;
|
|
break;
|
|
|
|
case ch_NoSpeech:
|
|
ChatList[SelectIndex].bNoSpeech = bResult;
|
|
break;
|
|
|
|
case ch_NoVoiceChat:
|
|
ChatList[SelectIndex].bNoVoice = bResult;
|
|
break;
|
|
|
|
case ch_Ban:
|
|
ChatList[SelectIndex].bBanned = bResult;
|
|
break;
|
|
}
|
|
|
|
if ( ChatList[SelectIndex].bDirty && ApplyRestriction(SelectIndex) )
|
|
{
|
|
ModifiedChatRestriction(Self, ChatList[SelectIndex].PlayerID);
|
|
ChatList[SelectIndex].bDirty = False;
|
|
}
|
|
}
|
|
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
// Implementation
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
|
|
// Get a list of all players, and put them into the appropriate list
|
|
function FillPlayerLists()
|
|
{
|
|
local string idx;
|
|
|
|
if ( GRI() == None )
|
|
return;
|
|
|
|
// if an item was selected, remember the selected PlayerID while we clear and refill the lists
|
|
if ( li_Players.IsValid() )
|
|
idx = li_Players.GetExtra();
|
|
else if ( li_Specs.IsValid() )
|
|
idx = "";
|
|
|
|
// Disable all list notification while we're clearing and refilling the lists
|
|
li_Players.bNotify = false;
|
|
li_Specs.bNotify = false;
|
|
|
|
ClearLists();
|
|
PopulateLists( GRI() );
|
|
|
|
// if we had a PlayerID selected, attempt to reselect that PlayerID in any list
|
|
if ( idx != "" )
|
|
{
|
|
if ( li_Players.Find(idx,false,true) != "" )
|
|
{
|
|
if ( !PlayerIDIsMine(idx) )
|
|
li_Players.CheckLinkedObjects(li_Players);
|
|
}
|
|
else if ( li_Specs.Find(idx,false,true) != "" )
|
|
{
|
|
if ( !PlayerIDIsMine(idx) )
|
|
li_Specs.CheckLinkedObjects(li_Specs);
|
|
}
|
|
}
|
|
|
|
li_Players.bNotify = true;
|
|
li_Specs.bNotify = true;
|
|
}
|
|
|
|
function PopulateLists(GameReplicationInfo GRI)
|
|
{
|
|
local int i;
|
|
local PlayerReplicationInfo PRI;
|
|
|
|
for ( i = 0; i < GRI.PRIArray.Length; i++ )
|
|
{
|
|
PRI = GRI.PRIArray[i];
|
|
if ( PRI == None || PRI.bBot || xPlayerReplicationInfo(PRI) == none )
|
|
continue;
|
|
|
|
// If this is the first time seeing this playerid, request the ban/ignore info from our ChatManager
|
|
if ( FindChatListIndex(PRI.PlayerID) == -1 )
|
|
AddPlayerInfo(PRI.PlayerID);
|
|
|
|
if ( PRI.bOnlySpectator )
|
|
li_Specs.Add(PRI.PlayerName,,string(PRI.PlayerID));
|
|
else li_Players.Add( PRI.PlayerName,,string(PRI.PlayerID) );
|
|
}
|
|
}
|
|
|
|
// When a list item is selected, clear the indexes of the other lists
|
|
function ClearIndexes( GUIList List )
|
|
{
|
|
if ( List != li_Players)
|
|
li_Players.SilentSetIndex(-1);
|
|
|
|
if ( List != li_Specs )
|
|
li_Specs.SilentSetIndex(-1);
|
|
|
|
if ( List == None )
|
|
SelectedSelf();
|
|
}
|
|
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
// Chat Manager Interface
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
|
|
// Set the checkboxes to the values associated with the given player
|
|
function LoadRestrictions(int i)
|
|
{
|
|
if ( !ValidIndex(i) )
|
|
{
|
|
ch_NoText.SetComponentValue(False, True);
|
|
ch_NoSpeech.SetComponentValue(False, True);
|
|
ch_NoVoiceChat.SetComponentValue(False, True);
|
|
ch_Ban.SetComponentValue(False, True);
|
|
}
|
|
else
|
|
{
|
|
ch_NoText.SetComponentValue(ChatList[i].bNoText, True);
|
|
ch_NoSpeech.SetComponentValue(ChatList[i].bNoSpeech, True);
|
|
ch_NoVoiceChat.SetComponentValue(ChatList[i].bNoVoice, True);
|
|
ch_Ban.SetComponentValue(ChatList[i].bBanned, True);
|
|
}
|
|
}
|
|
|
|
// Called when a new playerID is found while filling the lists
|
|
// Request stored chat restrictions for this PlayerID from the ChatManager
|
|
function int AddPlayerInfo(int PlayerID)
|
|
{
|
|
local int i;
|
|
local PlayerController PC;
|
|
local byte Restriction;
|
|
|
|
PC = PlayerOwner();
|
|
if ( PC.ChatManager == None )
|
|
return -1;
|
|
|
|
// Verify that we don't already have this player ID in the list
|
|
i = FindChatListIndex( PlayerID );
|
|
if ( i == -1 )
|
|
{
|
|
i = ChatList.Length;
|
|
ChatList.Length = i+1;
|
|
}
|
|
|
|
ChatList[i].PlayerID = PlayerID;
|
|
|
|
// Query the ChatManager for the settings for this player
|
|
Restriction = PC.ChatManager.GetPlayerRestriction(PlayerID);
|
|
UnpackRestriction(i, Restriction);
|
|
return i;
|
|
}
|
|
|
|
function PackRestriction(int i, out byte Restriction)
|
|
{
|
|
Restriction = 0;
|
|
if ( ValidIndex(i) )
|
|
{
|
|
if ( ChatList[i].bNoText )
|
|
Restriction = Restriction | 1;
|
|
if ( ChatList[i].bNoSpeech )
|
|
Restriction = Restriction | 2;
|
|
if ( ChatList[i].bNoVoice )
|
|
Restriction = Restriction | 4;
|
|
if ( ChatList[i].bBanned )
|
|
Restriction = Restriction | 8;
|
|
}
|
|
}
|
|
|
|
function UnpackRestriction(int i, byte Restriction)
|
|
{
|
|
if ( ValidIndex(i) )
|
|
{
|
|
ChatList[i].bNoText = bool(Restriction & 1);
|
|
ChatList[i].bNoSpeech = bool(Restriction & 2);
|
|
ChatList[i].bNoVoice = bool(Restriction & 4);
|
|
ChatList[i].bBanned = bool(Restriction & 8);
|
|
Chatlist[i].bDirty = false;
|
|
}
|
|
}
|
|
|
|
function bool ApplyRestriction(int i)
|
|
{
|
|
local byte Restriction;
|
|
|
|
// Send restrictions to player's chat manager
|
|
if ( ValidIndex(i) )
|
|
{
|
|
PackRestriction(i, Restriction);
|
|
return PlayerOwner().ChatBan(ChatList[i].PlayerID, Restriction);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function SaveRestrictions()
|
|
{
|
|
local int i;
|
|
|
|
for ( i = 0; i < ChatList.Length; i++ )
|
|
{
|
|
if ( Chatlist[i].bDirty && ApplyRestriction(i) )
|
|
{
|
|
ModifiedChatRestriction(Self, Chatlist[i].PlayerID);
|
|
Chatlist[i].bDirty = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
function ResetRestrictions()
|
|
{
|
|
local int i;
|
|
local byte Restriction;
|
|
|
|
for ( i = 0; i < ChatList.Length; i++ )
|
|
{
|
|
PackRestriction(i, Restriction);
|
|
if ( Restriction != 0 )
|
|
PlayerOwner().ChatBan(ChatList[i].PlayerID, 0);
|
|
}
|
|
|
|
PlayerOwner().ChatManager.ClearConfig();
|
|
}
|
|
|
|
function UpdateChatRestriction( int PlayerID )
|
|
{
|
|
local int i;
|
|
|
|
Super.UpdateChatRestriction(PlayerID);
|
|
|
|
i = FindChatListIndex(PlayerID);
|
|
if ( ValidIndex(i) )
|
|
UnpackRestriction( i, PlayerOwner().ChatManager.GetPlayerRestriction(PlayerID) );
|
|
}
|
|
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
// Utility / Helper functions
|
|
// =====================================================================================================================
|
|
// =====================================================================================================================
|
|
|
|
function ClearLists()
|
|
{
|
|
if ( li_Players.ItemCount > 0 )
|
|
li_Players.Clear();
|
|
|
|
if ( li_Specs.ItemCount > 0 )
|
|
li_Specs.Clear();
|
|
}
|
|
|
|
// Disable/enable these components based on whether or not a list has a valid index
|
|
function AssociateButtons()
|
|
{
|
|
LinkList(li_Players);
|
|
LinkList(li_Specs);
|
|
}
|
|
|
|
function LinkList( GUIList List )
|
|
{
|
|
if ( List == None )
|
|
return;
|
|
|
|
List.AddLinkObject( ch_NoVoiceChat );
|
|
List.AddLinkObject( ch_NoSpeech );
|
|
List.AddLinkObject( ch_NoText );
|
|
List.AddLinkObject( ch_Ban );
|
|
}
|
|
|
|
function int FindChatListIndex(int PlayerID)
|
|
{
|
|
local int i;
|
|
|
|
for ( i = 0; i < ChatList.Length; i++ )
|
|
if ( PlayerID == ChatList[i].PlayerID )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
function bool ValidIndex(int i)
|
|
{
|
|
return i >= 0 && i < ChatList.Length;
|
|
}
|
|
|
|
function SelectedSelf()
|
|
{
|
|
ch_NoText.SetComponentValue(False, True);
|
|
ch_NoSpeech.SetComponentValue(False, True);
|
|
ch_NoVoiceChat.SetComponentValue(False, True);
|
|
ch_Ban.SetComponentValue(False, True);
|
|
|
|
DisableComponent(ch_NoText);
|
|
DisableComponent(ch_NoSpeech);
|
|
DisableComponent(ch_NoVoiceChat);
|
|
DisableComponent(ch_Ban);
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
Begin Object Class=AltSectionBackground Name=PlayersBackground
|
|
LeftPadding=0.000000
|
|
RightPadding=0.000000
|
|
TopPadding=0.000000
|
|
BottomPadding=0.000000
|
|
WinTop=0.030000
|
|
WinLeft=0.019250
|
|
WinWidth=0.462019
|
|
WinHeight=0.840000
|
|
bBoundToParent=True
|
|
bScaleToParent=True
|
|
OnPreDraw=PlayersBackground.InternalPreDraw
|
|
End Object
|
|
sb_Players=AltSectionBackground'ServerPerks.SRTab_MidGameVoiceChat.PlayersBackground'
|
|
|
|
Begin Object Class=AltSectionBackground Name=SpecBackground
|
|
LeftPadding=0.000000
|
|
RightPadding=0.000000
|
|
TopPadding=0.000000
|
|
BottomPadding=0.000000
|
|
WinTop=0.030325
|
|
WinLeft=0.512544
|
|
WinWidth=0.462019
|
|
WinHeight=0.468385
|
|
bBoundToParent=True
|
|
bScaleToParent=True
|
|
OnPreDraw=SpecBackground.InternalPreDraw
|
|
End Object
|
|
sb_Specs=AltSectionBackground'ServerPerks.SRTab_MidGameVoiceChat.SpecBackground'
|
|
|
|
Begin Object Class=AltSectionBackground Name=OptionBackground
|
|
TopPadding=0.040000
|
|
BottomPadding=0.000000
|
|
WinTop=0.508063
|
|
WinLeft=0.512544
|
|
WinWidth=0.462019
|
|
WinHeight=0.362000
|
|
bBoundToParent=True
|
|
bScaleToParent=True
|
|
OnPreDraw=OptionBackground.InternalPreDraw
|
|
End Object
|
|
sb_Options=AltSectionBackground'ServerPerks.SRTab_MidGameVoiceChat.OptionBackground'
|
|
|
|
Begin Object Class=GUIListBox Name=PlayersList
|
|
bInitializeList=False
|
|
OnCreateComponent=PlayersList.InternalOnCreateComponent
|
|
WinTop=0.041667
|
|
WinLeft=0.056250
|
|
WinWidth=0.431250
|
|
WinHeight=0.760000
|
|
TabOrder=0
|
|
OnChange=SRTab_MidGameVoiceChat.ListChange
|
|
End Object
|
|
lb_Players=GUIListBox'ServerPerks.SRTab_MidGameVoiceChat.PlayersList'
|
|
|
|
Begin Object Class=GUIListBox Name=SpecList
|
|
bInitializeList=False
|
|
OnCreateComponent=SpecList.InternalOnCreateComponent
|
|
WinTop=0.041667
|
|
WinLeft=0.531250
|
|
WinWidth=0.431250
|
|
WinHeight=0.518750
|
|
TabOrder=1
|
|
OnChange=SRTab_MidGameVoiceChat.ListChange
|
|
End Object
|
|
lb_Specs=GUIListBox'ServerPerks.SRTab_MidGameVoiceChat.SpecList'
|
|
|
|
Begin Object Class=moCheckBox Name=NoVoiceChat
|
|
OnCreateComponent=NoVoiceChat.InternalOnCreateComponent
|
|
WinTop=0.750178
|
|
WinLeft=0.647884
|
|
WinWidth=0.338524
|
|
WinHeight=0.049840
|
|
TabOrder=4
|
|
OnChange=SRTab_MidGameVoiceChat.InternalOnChange
|
|
End Object
|
|
ch_NoVoiceChat=moCheckBox'ServerPerks.SRTab_MidGameVoiceChat.NoVoiceChat'
|
|
|
|
Begin Object Class=moCheckBox Name=NOSPEECH
|
|
OnCreateComponent=NOSPEECH.InternalOnCreateComponent
|
|
WinTop=0.685424
|
|
WinLeft=0.647884
|
|
WinWidth=0.338524
|
|
WinHeight=0.049840
|
|
TabOrder=3
|
|
OnChange=SRTab_MidGameVoiceChat.InternalOnChange
|
|
End Object
|
|
ch_NoSpeech=moCheckBox'ServerPerks.SRTab_MidGameVoiceChat.NOSPEECH'
|
|
|
|
Begin Object Class=moCheckBox Name=NOTEXT
|
|
OnCreateComponent=NOTEXT.InternalOnCreateComponent
|
|
WinTop=0.620670
|
|
WinLeft=0.647884
|
|
WinWidth=0.338524
|
|
WinHeight=0.049840
|
|
TabOrder=2
|
|
OnChange=SRTab_MidGameVoiceChat.InternalOnChange
|
|
End Object
|
|
ch_NoText=moCheckBox'ServerPerks.SRTab_MidGameVoiceChat.NOTEXT'
|
|
|
|
Begin Object Class=moCheckBox Name=BanPlayer
|
|
OnCreateComponent=BanPlayer.InternalOnCreateComponent
|
|
WinTop=0.814932
|
|
WinLeft=0.647884
|
|
WinWidth=0.338524
|
|
WinHeight=0.049840
|
|
TabOrder=5
|
|
OnChange=SRTab_MidGameVoiceChat.InternalOnChange
|
|
End Object
|
|
ch_Ban=moCheckBox'ServerPerks.SRTab_MidGameVoiceChat.BanPlayer'
|
|
|
|
OnPreDraw=SRTab_MidGameVoiceChat.PreDraw
|
|
}
|