2020-01-10 13:14:11 +00:00
|
|
|
// Menu system written by Marco.
|
|
|
|
Class KFGUI_Base extends Object
|
2021-05-16 09:40:02 +00:00
|
|
|
abstract;
|
2020-01-10 13:14:11 +00:00
|
|
|
|
|
|
|
var KF2GUIController Owner;
|
2021-05-16 03:37:39 +00:00
|
|
|
var ScoreboardExtHUD HUDOwner;
|
2020-01-10 13:14:11 +00:00
|
|
|
var KFGUI_Base ParentComponent; // Parent component if any.
|
|
|
|
var transient Canvas Canvas;
|
|
|
|
|
|
|
|
enum EMenuSound
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
MN_Focus,
|
|
|
|
MN_LostFocus,
|
|
|
|
MN_FocusHover,
|
|
|
|
MN_ClickButton,
|
|
|
|
MN_ClickCheckboxOn,
|
|
|
|
MN_ClickCheckboxOff,
|
|
|
|
MN_Dropdown,
|
|
|
|
MN_DropdownChange,
|
2020-01-10 13:14:11 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
var() float XPosition,YPosition,XSize,YSize;
|
|
|
|
var() name ID; // Just for internal purposes, you can give the components unique ID values.
|
|
|
|
var() int IDValue; // Integer ID value.
|
|
|
|
var transient float CompPos[4],InputPos[4];
|
|
|
|
|
|
|
|
var transient KFGUI_Base MouseArea; // Next in recurse line of the mouse pointer focus area.
|
|
|
|
|
|
|
|
var() bool bDisabled,bClickable,bCanFocus;
|
|
|
|
var bool bFocusedPostDrawItem; // If this component has been given input focus, should it receive draw menu call after everything else been drawn?
|
|
|
|
var transient bool bFocused,bTextureInit,bVisible;
|
|
|
|
var bool bIsHUDWidget,bEnableInputs,bNoLookInputs;
|
|
|
|
var array<name> TimerNames;
|
|
|
|
|
|
|
|
function InitMenu(); // Menu was initialized for the first time.
|
|
|
|
function ShowMenu(); // Menu was opened.
|
|
|
|
function PreDraw()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( !bVisible )
|
|
|
|
return;
|
|
|
|
|
|
|
|
ComputeCoords();
|
|
|
|
Canvas.SetDrawColor(255,255,255);
|
|
|
|
Canvas.SetOrigin(CompPos[0],CompPos[1]);
|
|
|
|
Canvas.SetClip(CompPos[0]+CompPos[2],CompPos[1]+CompPos[3]);
|
|
|
|
DrawMenu();
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function DrawMenu(); // Draw menu now.
|
|
|
|
function CloseMenu(); // Menu was closed.
|
|
|
|
function InventoryChanged(optional KFWeapon Wep, optional bool bRemove); // Called when a players inventory is changed.
|
|
|
|
function MenuTick( float DeltaTime );
|
|
|
|
|
|
|
|
final function SetTimer(float InRate, optional bool inbLoop, optional Name inTimerFunc='Timer')
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( InRate <= 0.f )
|
|
|
|
{
|
|
|
|
ClearTimer(inTimerFunc);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( TimerNames.Find(inTimerFunc) == INDEX_NONE )
|
|
|
|
{
|
|
|
|
TimerNames.AddItem(inTimerFunc);
|
|
|
|
}
|
|
|
|
|
|
|
|
`TimerHelper.SetTimer( InRate, inbLoop, inTimerFunc, self );
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
final function ClearTimer(optional Name inTimerFunc='Timer')
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( TimerNames.Find(inTimerFunc) != INDEX_NONE )
|
|
|
|
{
|
|
|
|
TimerNames.RemoveItem(inTimerFunc);
|
|
|
|
}
|
|
|
|
|
|
|
|
`TimerHelper.ClearTimer( inTimerFunc, self );
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function Timer();
|
|
|
|
|
|
|
|
function MouseEnter()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
bFocused = true;
|
|
|
|
OnFocus(Self,True);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function MouseLeave()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
bFocused = false;
|
|
|
|
OnFocus(Self,False);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function MouseClick( bool bRight );
|
|
|
|
function MouseRelease( bool bRight );
|
|
|
|
function DoubleMouseClick( bool bRight ) // User rapidly double clicked this component.
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
MouseClick(bRight);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function ScrollMouseWheel( bool bUp );
|
|
|
|
|
|
|
|
function bool ReceievedControllerInput(int ControllerId, name Key, EInputEvent Event)
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
return false;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
final function PlayerController GetPlayer()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
return Owner.PlayerOwner;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function SetDisabled( bool bDisable )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
bDisabled = bDisable;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Delegate OnFocus( KFGUI_Base Sender, bool bBecame );
|
|
|
|
|
|
|
|
final function ComputeCoords()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
CompPos[0] = XPosition*InputPos[2]+InputPos[0];
|
|
|
|
CompPos[1] = YPosition*InputPos[3]+InputPos[1];
|
|
|
|
CompPos[2] = XSize*InputPos[2];
|
|
|
|
CompPos[3] = YSize*InputPos[3];
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function bool CaptureMouse()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
return bVisible && ( Owner.MousePosition.X>=CompPos[0] && Owner.MousePosition.Y>=CompPos[1] && Owner.MousePosition.X<=(CompPos[0]+CompPos[2]) && Owner.MousePosition.Y<=(CompPos[1]+CompPos[3]) );
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
final function KFGUI_Base GetMouseFocus()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
local KFGUI_Base M;
|
|
|
|
|
|
|
|
for( M=Self; M.MouseArea!=None; M=M.MouseArea )
|
|
|
|
{}
|
|
|
|
return M;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function SetVisibility(bool Visible)
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
bVisible = Visible;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function DoClose()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
local int i;
|
|
|
|
|
|
|
|
for( i=0; i<TimerNames.Length; i++ )
|
|
|
|
{
|
|
|
|
ClearTimer(TimerNames[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if( ParentComponent!=None )
|
|
|
|
ParentComponent.DoClose();
|
|
|
|
else Owner.PopCloseMenu(Self);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function byte GetCursorStyle()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
return (bClickable ? `PEN_BLACK : `PEN_WHITE);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function UserPressedEsc() // user pressed escape while this menu was active.
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( ParentComponent!=None )
|
|
|
|
ParentComponent.UserPressedEsc();
|
|
|
|
else DoClose();
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function bool BringPageToFront()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( ParentComponent!=None )
|
|
|
|
return ParentComponent.BringPageToFront();
|
|
|
|
return true; // Allow user to bring this page to front.
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
final function bool IsTopMenu()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
return (Owner.ActiveMenus.Length>0 && GetPageTop()==Owner.ActiveMenus[0]);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
final function KFGUI_Page GetPageTop()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
local KFGUI_Base M;
|
|
|
|
|
|
|
|
for( M=Self; M.ParentComponent!=None; M=M.ParentComponent )
|
|
|
|
{}
|
|
|
|
return KFGUI_Page(M);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function KFGUI_Base FindComponentID( name InID )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( ID==InID )
|
|
|
|
return Self;
|
|
|
|
return None;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function FindAllComponentID( name InID, out array<KFGUI_Base> Res )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( ID==InID )
|
|
|
|
Res[Res.Length] = Self;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function RemoveComponent( KFGUI_Base B );
|
|
|
|
|
|
|
|
function GetInputFocus()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( Owner.InputFocus!=None )
|
|
|
|
Owner.InputFocus.LostInputFocus();
|
|
|
|
Owner.InputFocus = Self;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function DropInputFocus()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( Owner.InputFocus==Self )
|
|
|
|
{
|
|
|
|
Owner.InputFocus.LostInputFocus();
|
|
|
|
Owner.InputFocus = None;
|
|
|
|
}
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function LostInputFocus();
|
|
|
|
|
|
|
|
// Obtain keyboard focus.
|
|
|
|
final function GrabKeyFocus()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
Owner.GrabInputFocus(Self);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
final function ReleaseKeyFocus()
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( Owner.KeyboardFocus==Self )
|
|
|
|
Owner.GrabInputFocus(None);
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function LostKeyFocus();
|
|
|
|
|
|
|
|
function bool NotifyInputKey( int ControllerId, name Key, EInputEvent Event, float AmountDepressed, bool bGamepad )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
if( bIsHUDWidget && bEnableInputs )
|
|
|
|
{
|
|
|
|
switch( Key )
|
|
|
|
{
|
|
|
|
case 'XboxTypeS_Start':
|
|
|
|
case 'Escape':
|
|
|
|
if( Event==IE_Pressed )
|
|
|
|
UserPressedEsc();
|
|
|
|
return true;
|
|
|
|
case 'XboxTypeS_DPad_Up':
|
|
|
|
case 'XboxTypeS_DPad_Down':
|
|
|
|
case 'XboxTypeS_DPad_Left':
|
|
|
|
case 'XboxTypeS_DPad_Right':
|
|
|
|
case 'MouseScrollDown':
|
|
|
|
case 'MouseScrollUp':
|
|
|
|
case 'MouseScrollDown':
|
|
|
|
case 'MouseScrollUp':
|
|
|
|
if( Event==IE_Pressed )
|
|
|
|
ScrollMouseWheel(Key=='MouseScrollUp' || Key=='XboxTypeS_DPad_Up' || Key=='XboxTypeS_DPad_Left');
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function bool NotifyInputAxis( int ControllerId, name Key, float Delta, float DeltaTime, bool bGamepad )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
return false;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
function bool NotifyInputChar( int ControllerId, string Unicode )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
return false;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// While on input focus mode, notify that mouse just moved over the threshold.
|
|
|
|
function InputMouseMoved();
|
|
|
|
|
|
|
|
// Notify any focused menu element that mouse has been idle over it.
|
|
|
|
function NotifyMousePaused();
|
|
|
|
|
|
|
|
final function GetActualPos( out float X, out float Y )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
X = ((XPosition+X)*InputPos[2]) + InputPos[0];
|
|
|
|
Y = ((YPosition+Y)*InputPos[3]) + InputPos[1];
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
final function GetRealtivePos( out float X, out float Y )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
X = X / CompPos[2];
|
|
|
|
Y = Y / CompPos[2];
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
simulated final function PlayMenuSound( EMenuSound Slot )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
local SoundCue S;
|
|
|
|
local KFGameEngine Engine;
|
|
|
|
|
|
|
|
Engine = KFGameEngine(class'Engine'.static.GetEngine());
|
|
|
|
|
|
|
|
switch( Slot )
|
|
|
|
{
|
|
|
|
case MN_FocusHover:
|
|
|
|
case MN_Focus:
|
|
|
|
S = Owner.CurrentStyle.MenuHover;
|
|
|
|
break;
|
|
|
|
case MN_LostFocus:
|
|
|
|
S = Owner.CurrentStyle.MenuFade;
|
|
|
|
break;
|
|
|
|
case MN_ClickButton:
|
|
|
|
case MN_ClickCheckboxOff:
|
|
|
|
S = Owner.CurrentStyle.MenuClick;
|
|
|
|
break;
|
|
|
|
case MN_Dropdown:
|
|
|
|
S = Owner.CurrentStyle.MenuDown;
|
|
|
|
break;
|
|
|
|
case MN_DropdownChange:
|
|
|
|
S = Owner.CurrentStyle.MenuEdit;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( S!=None )
|
|
|
|
{
|
|
|
|
S.VolumeMultiplier = (Engine.SFxVolumeMultiplier/100.f) * (Engine.MasterVolumeMultiplier/100.f);
|
|
|
|
GetPlayer().PlaySound(S,true,,false);
|
|
|
|
}
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Pre level change notification.
|
|
|
|
function NotifyLevelChange();
|
|
|
|
|
|
|
|
final function SetPosition( float X, float Y, float XS, float YS )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
XPosition = X;
|
|
|
|
YPosition = Y;
|
|
|
|
XSize = XS;
|
|
|
|
YSize = YS;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static final function string MakeSortStr( int Value )
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
local string S;
|
|
|
|
local int i;
|
|
|
|
|
|
|
|
// Prefix with zeroes to properly sort this string.
|
|
|
|
S = string(Value);
|
|
|
|
i = Len(S);
|
|
|
|
if( i<10 )
|
|
|
|
return Mid("0000000000",i)$S;
|
|
|
|
return S;
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
defaultproperties
|
|
|
|
{
|
2021-05-16 09:40:02 +00:00
|
|
|
XSize=1
|
|
|
|
YSize=1
|
|
|
|
bCanFocus=true
|
|
|
|
bVisible=true
|
2020-01-10 13:14:11 +00:00
|
|
|
}
|