1
0
KF2-Dev-Scripts/KFGame/Classes/KFGFxControlsContainer_Keybinding.uc
2023-05-11 18:55:04 +03:00

314 lines
8.8 KiB
Ucode

//=============================================================================
// KFGFxOptionsContainer_Keybinding
//=============================================================================
// Class Description
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// Greg Felber - 9/10/2014
//=============================================================================
class KFGFxControlsContainer_Keybinding extends KFGFxObject_Container
config(UI);
var KFGfxMoviePlayer_Manager Manager;
/** Populated from DefaultUI.ini */
var config array<string> MovementBindList;
var config array<string> CombatBindList;
var config array<string> WeaponSelectBindList;
var config array<string> InteractionBindList;
var config array<string> VoiceCommBindList;
var config array<string> OtherBindList;
var KeyBind PendingKeyBind;
var KeyBind OldKeyBind;
/** The name of the command we are trying to bind */
var string BindCommand;
var byte CurrentlySelectedSection;
/** These are set true if ctrl, shift, or alt are being held down */
var bool bModCtrl;
var bool bModShift;
var bool bModAlt;
var bool bWaitForInput;
var const string SectionName;
const MAX_SECTIONS = 6;
var byte TotalBindSections;
var localized array<string> SectionHeaders;
var localized string ResetString, ApplyString, KeyAlreadyBoundString, PressKeyString;
var localized string WarningString, RebindString, ClearedString, CancelString, AcceptString, IgnoredKeyString;
function Initialize( KFGFxObject_Menu NewParentMenu )
{
local GFxObject LocalizedObject;
super.Initialize( NewParentMenu );
Manager = NewParentMenu.Manager;
LocalizedObject = CreateObject( "Object" );
LocalizedObject.SetString("resetLabel", ResetString);
LocalizedObject.SetString("applyLabel", ApplyString);
SetObject("localizedText", LocalizedObject);
LocalizedObject = CreateObject( "Object" );
LocalizedObject.SetString("warningLabel", WarningString);
LocalizedObject.SetString("rebindLabel", RebindString);
LocalizedObject.SetString("clearedLabel", ClearedString);
LocalizedObject.SetString("cancelLabel", CancelString);
LocalizedObject.SetString("acceptLabel", AcceptString);
SetObject("localizedPopup", LocalizedObject);
InitalizeCommandList(MovementBindList);
InitalizeCommandList(InteractionBindList);
InitalizeCommandList(CombatBindList);
InitalizeCommandList(WeaponSelectBindList);
InitalizeCommandList(VoiceCommBindList);
InitalizeCommandList(OtherBindList);
UpdateAllBindings();
}
function InitalizeCommandList( out array<string> BindList )
{
local byte i;
local GFxObject CommandSlot;
local GFxObject DataProvider;
if( TotalBindSections < MAX_SECTIONS )
{
DataProvider = CreateArray();
DataProvider.SetInt("sectionIndex", TotalBindSections);
DataProvider.SetString("bindingHeader", SectionHeaders[TotalBindSections]);
DataProvider.SetString("pressKeyString", PressKeyString);
for (i = 0; i < BindList.Length; i++)
{
CommandSlot = CreateObject( "Object" );
CommandSlot.SetString("label", Localize(SectionName, BindList[i], "KFGame"));
DataProvider.SetElementObject(i, CommandSlot);
}
SetObject("commandList", DataProvider);
TotalBindSections++;
}
}
function UpdateAllBindings()
{
UpdateBindList( MovementBindList, 0 );
UpdateBindList( InteractionBindList, 1 );
UpdateBindList( CombatBindList, 2 );
UpdateBindList( WeaponSelectBindList, 3 );
UpdateBindList( VoiceCommBindList, 4 );
UpdateBindList( OtherBindList, 5);
Manager.UpdateDynamicIgnoreKeys();
}
/************************************************************************
* Binding
*************************************************************************/
/** Populates the binding list */
function UpdateBindList( out array<string> BindList, int SectionIndex )
{
local byte i;
local GFxObject DataProvider;
local GFxObject BindSlot;
local KeyBind MyKeyBind;
local KFPlayerInput KFInput;
if (GetPC() == None || KFPlayerInput(GetPC().PlayerInput) == none)
{
return;
}
DataProvider = CreateArray();
KFInput = KFPlayerInput(GetPC().PlayerInput);
for (i = 0; i < BindList.Length; i++)
{
BindSlot = CreateObject("Object");
KFInput.GetKeyBindFromCommand(MyKeyBind, BindList[i], false);
BindSlot.SetString("command", BindList[i]);
if (MyKeyBind.Name != 'None')
{
BindSlot.SetString("label", KFInput.GetBindDisplayName(MyKeyBind));
}
else
{
BindSlot.SetString("label", "");
}
DataProvider.SetElementObject(i, BindSlot);
}
SetSectionBindings( SectionIndex, DataProvider );
}
function SetSectionBindings( int i, GFxObject bindData )
{
ActionscriptVoid("setSectionBindings");
}
/** Wait for player input to modify the current bind command */
function ChangeBind( string ChangedCommand, byte SelectedSection )
{
`Log("Change BIND Command " $ChangedCommand);
BindCommand = ChangedCommand;
CurrentlySelectedSection = SelectedSection;
bWaitForInput = true;
}
/** Receives the key we want to bind for a particular command and adds any modifiers (ctrl, shift ) */
function BindKey( name KeyPressed, EInputEvent EventType)
{
local KeyBind NewKeyBind;
if ( !bWaitForInput )
{
return;
}
NewKeyBind.Name = KeyPressed;
if (EventType == EInputEvent.IE_Pressed)
{
// If Ctrl, shift, or alt are pressed wait for a second input to modify the binding
UpdateModKeys(KeyPressed, EventType);
}
// If we release a mod key before pressing anything else
if (EventType == EInputEvent.IE_Released)
{
// If Ctrl, shift, or alt are pressed wait for a second input to modify the binding
UpdateModKeys(KeyPressed, EventType);
NewKeyBind.Control = bModCtrl;
NewKeyBind.Shift = bModShift;
NewKeyBind.Alt = bModAlt;
bWaitForInput = false;
SetKeyBind( NewKeyBind );
ResetModKeys();
}
//reset ignores
Manager.ClearFocusIgnoreKeys();
}
function UpdateModKeys(name KeyPressed, EInputEvent EventType)
{
switch (KeyPressed)
{
case 'LeftControl':
ResetModKeys();
bModCtrl = EventType == EInputEvent.IE_Pressed;
break;
case 'LeftShift':
ResetModKeys();
bModShift = EventType == EInputEvent.IE_Pressed;
break;
case 'LeftAlt':
ResetModKeys();
bModAlt = EventType == EInputEvent.IE_Pressed;
break;
}
}
function ResetModKeys()
{
bModCtrl = false;
bModShift = false;
bModAlt = false;
}
function SetKeyBind(KeyBind NewKeyBind)
{
local KFPlayerInput KFInput;
local string OldKeyCommand;
if ( GetPC() == None || KFPlayerInput(GetPC().PlayerInput) == none )
{
return;
}
//The escape key does not have a gba. We want it to be a constant command. Esc cancels bind.
if(NewKeyBind.name == 'Escape')
{
UpdateAllBindings();
return;
}
//prevent loss of mouse click or controller selection
if( (NewKeyBind.name == 'XboxTypeS_A' || NewKeyBind.name == 'LeftMouseButton') && Manager.IsFocusIgnoreKey(BindCommand))
{
//reject and show pop up
Manager.DelayedOpenPopup(ENotification, EDPPID_Misc, default.WarningString, NewKeyBind.name @default.IgnoredKeyString, class'KFCommon_LocalizedStrings'.default.OKString);
UpdateAllBindings();
return;
}
KFInput = KFPlayerInput( GetPC().PlayerInput );
OldKeyCommand = KFInput.GetGameBindableAction( NewKeyBind.Name );
// If this key is already bound, create a popup to confirm we want to switch
if ( NewKeyBind.Name != 'Delete' && OldKeyCommand != "" && OldKeyCommand != BindCommand )
{
PendingKeyBind = NewKeyBind;
OldKeyBind.Command = OldKeyCommand;
OldKeyBind.Name = 'Delete';
SetConflictMessage( string(NewKeyBind.Name), OldKeyCommand, BindCommand, CurrentlySelectedSection );
}
else
{
`Log("BIND BindCommand " $BindCommand);
KFInput.BindKey( NewKeyBind, BindCommand, false );
UpdateAllBindings();
}
}
function SetConflictMessage( String KeyString, String OldCommand, String NewCommand, byte SelectedSection )
{
KeyString = Repl(KeyAlreadyBoundString, "%x%", KeyString, true);
OldCommand = Localize(SectionName, OldCommand, "KFGame");
NewCommand = Localize(SectionName, NewCommand, "KFGame");
ActionscriptVoid("setConflictMessage");
}
function AcceptBind()
{
KFPlayerInput( GetPC().PlayerInput ).BindKey( OldKeyBind, OldKeyBind.Command, false );
KFPlayerInput( GetPC().PlayerInput ).BindKey( PendingKeyBind, BindCommand, false );
UpdateAllBindings();
}
function ResetControls()
{
if (GetPC() != None && GetPC().PlayerInput != None)
{
KFPlayerInput(GetPC().PlayerInput).ResetKeysToDefault();
UpdateAllBindings();
}
}
function ClearInputOnContainer()
{
UpdateAllBindings();
bWaitForInput = false;
}
DefaultProperties
{
SectionName="LocalizedControls"
}