rott/kf_sources/XVoting/Classes/MapVoteFooter.uc
2026-07-14 20:27:09 +07:00

281 lines
6.1 KiB
Ucode

//==============================================================================
// Created on: 01/02/2004
// Contains controls for participating in chat while mapvote menus are open
//
// Written by Ron Prestenback
// © 2003, Epic Games, Inc. All Rights Reserved
//==============================================================================
class MapVoteFooter extends GUIFooter;
var() noexport array<string> RecallQueue;
var() noexport int RecallIdx;
var() noexport int idxLastChatMsg;
var() noexport float LastMsgTime;
var automated GUISectionBackground sb_Background;
var automated GUIScrollTextBox lb_Chat;
var automated moEditBox ed_Chat;
var automated GUIButton b_Accept, b_Submit, b_Close;
delegate OnSubmit();
delegate OnAccept();
delegate bool OnSendChat( string Text )
{
if ( Text != "" )
{
if ( RecallQueue.Length == 0 || RecallQueue[RecallQueue.Length - 1] != Text )
{
RecallIdx = RecallQueue.Length;
RecallQueue[RecallIdx] = Text;
}
if ( Left(Text,4) ~= "cmd " )
PlayerOwner().ConsoleCommand( Mid(Text, 4) );
else
{
if ( Left(Text,1) == "." )
PlayerOwner().TeamSay( Mid(Text,1) );
else PlayerOwner().Say( Text );
}
}
return true;
}
function InitComponent(GUIController InController, GUIComponent InOwner)
{
local string str;
local ExtendedConsole C;
Super.InitComponent(InController, InOwner);
lb_Chat.MyScrollText.SetContent("");
lb_Chat.MyScrollText.FontScale=FNS_Small;
C = ExtendedConsole(Controller.ViewportOwner.Console);
if ( C != None )
{
C.OnChatMessage = ReceiveChat;
if ( C.bTyping )
{
str = C.TypedStr;
C.TypingClose();
if ( Left(str,4) ~= "say " )
str = Mid(str, 5);
else if ( Left(str,8) ~= "teamsay " )
str = Mid(str, 9);
ed_Chat.SetText(str);
}
}
sb_Background.Managecomponent(lb_Chat);
OnDraw=MyOnDraw;
}
function bool MyOnDraw(canvas C)
{
local float l,t,w,xl,yl;
local eFontScale fs;
// Reposition everything
t = sb_Background.ActualTop() + sb_Background.ActualHeight();
l = sb_Background.ActualLeft() + sb_Background.ActualWidth() - sb_Background.ImageOffset[3];
b_Close.Style.TextSize(C,MSAT_Blurry,b_Close.Caption, XL,YL,FS);
w = XL;
b_Submit.Style.TextSize(C,MSAT_Blurry,b_Close.Caption, XL,YL,FS);
if (XL>w)
w = XL;
b_Accept.Style.TextSize(C,MSAT_Blurry,b_Close.Caption, XL,YL,FS);
if (XL>w)
w = XL;
w = w*3;
w = ActualWidth(w);
l -= w;
b_Close.WinWidth = w;
b_Close.WinTop = t;
b_Close.WinLeft = l;
l -= w;
b_Submit.WinWidth = w;
b_Submit.WinTop = t;
b_Submit.WinLeft = l;
l -= w;
b_Accept.WinWidth = w;
b_Accept.WinTop = t;
b_Accept.WinLeft = l;
ed_Chat.WinLeft = sb_Background.ActualLeft() + sb_Background.ImageOffset[0];
ed_Chat.WinWidth = L - ed_Chat.WinLeft;
ed_Chat.WinHeight = 25;
ed_Chat.WinTop = t;
return false;
}
function ReceiveChat(string Msg)
{
lb_Chat.AddText(Msg);
lb_Chat.MyScrollText.End();
// remove top messages from list if there are more than 10
if( lb_Chat.MyScrollText.ItemCount > 10 )
lb_Chat.MyScrollText.Remove(0,lb_Chat.MyScrollText.ItemCount - 10);
}
function bool InternalOnKeyEvent(out byte Key, out byte State, float delta)
{
if ( State == 3 && Key == 0x0D ) // enter
{
if ( OnSendChat(ed_Chat.GetText()) )
ed_Chat.SetComponentValue("", True);
return true;
}
else if ( State == 1 && RecallQueue.Length > 0 )
{
if ( Key == 0x26 ) // up
{
ed_Chat.SetText(RecallQueue[RecallIdx]);
RecallIdx = Max(0, RecallIdx - 1);
return true;
}
else if ( Key == 0x28 ) // down
{
ed_Chat.SetText(RecallQueue[RecallIdx]);
RecallIdx = Min(RecallQueue.Length - 1, RecallIdx + 1);
return true;
}
}
return false;
}
function bool InternalOnClick(GUIComponent Sender)
{
if (Sender == b_Close )
{
Controller.CloseMenu(true);
return true;
}
if ( Sender == b_Submit )
{
OnSubmit();
return true;
}
if ( Sender == b_Accept )
{
OnAccept();
return true;
}
}
DefaultProperties
{
bNeverFocus=false
Begin Object Class=AltSectionBackground Name=MapvoteFooterBackground
Caption="Chat"
WinWidth=1
WinHeight=0.82
WinLeft=0
WinTop=0
bBoundToParent=True
bScaleToParent=True
bFillClient=true
LeftPadding=0.01
RightPadding=0.01
End Object
sb_Background=MapvoteFooterBackground
Begin Object Class=GUIScrollTextBox Name=ChatScrollBox
WinWidth=0.918970
WinHeight=0.582534
WinLeft=0.043845
WinTop=0.223580
CharDelay=0.0025
EOLDelay=0
bBoundToParent=true
bScaleToParent=true
bVisibleWhenEmpty=true
bNoTeletype=true
bNeverFocus=true
bStripColors=false
// StyleName="NoBackground"
StyleName="ServerBrowserGrid"
TabOrder=2
End Object
lb_Chat=ChatScrollBox
Begin Object class=moEditBox Name=ChatEditbox
WinWidth=0.700243
WinHeight=0.106609
WinLeft=0.007235
WinTop=0.868598
Caption="Say"
CaptionWidth=0.15
OnKeyEvent=InternalOnKeyEvent
TabOrder=0
bStandardized=true
End Object
ed_Chat=ChatEditbox
Begin Object Class=GUIButton Name=AcceptButton
Caption="Accept"
Hint="Click once you are satisfied with all settings and wish to offer no further modifications"
WinWidth=0.191554
WinHeight=0.071145
WinLeft=0.562577
WinTop=0.906173
OnClick=InternalOnClick
TabOrder=1
bRepeatClick=False
bStandardized=true
bBoundToParent=false
bScaleToParent=false
bVisible=false
End Object
b_Accept=AcceptButton
Begin Object Class=GUIButton Name=SubmitButton
Caption="Submit"
WinWidth=0.160075
WinHeight=0.165403
WinLeft=0.704931
WinTop=0.849625
OnClick=InternalOnClick
TabOrder=1
bStandardized=true
bBoundToParent=false
bScaleToParent=false
End Object
b_Submit=SubmitButton
Begin Object class=GUIButton Name=CloseButton
Caption="Close"
WinWidth=0.137744
WinHeight=0.165403
WinLeft=0.861895
WinTop=0.849625
OnClick=InternalOnClick
bStandardized=true
TabOrder=1
bBoundToParent=false
bScaleToParent=false
End Object
b_Close=CloseButton
StyleName="BindBox"
}