1
0
KF2-Dev-Scripts/KFGame/Classes/KFGFxHUD_WeaponSelectWidget.uc
2020-12-13 18:01:13 +03:00

257 lines
6.3 KiB
Ucode

//=============================================================================
// KFGFxHUD_WeaponSelectWidget
//=============================================================================
// Class Description
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// - Greg Felber 5/20/2014
//=============================================================================
class KFGFxHUD_WeaponSelectWidget extends GFxObject;
const MAX_WEAPON_GROUPS = 4;
var bool bChangingWeapons;
var localized string PrimaryString;
var localized string EquiptmentString;
var localized string MeleeString;
var localized string SecondaryString;
var localized string ThrowString;
var string ThrowGBA;
/** How many weapons were in the inventory last time we counted */
var byte LastRefreshInvCount;
function InitializeObject()
{
SetWeaponCategories();
SetString("throwString", ThrowString);
SetThowButton();
}
simulated function RefreshWeaponSelect()
{
local byte i;
for (i = 0; i < MAX_WEAPON_GROUPS; i++)
{
UpdateWeaponGroupOnHUD(i);
}
SetThowButton();
}
function SetThowButton()
{
local KFPlayerInput KFPI;
local KeyBind BoundKey;
KFPI = KFPlayerInput(GetPC().PlayerInput);
if(KFPI != none)
{
KFPI.GetKeyBindFromCommand(BoundKey, ThrowGBA, false);
SetString("throwButton", String(BoundKey.Name) );
}
}
simulated function UpdateWeaponGroupOnHUD( byte GroupIndex )
{
local Inventory Inv;
local KFWeapon KFW;
local array<KFWeapon> WeaponGroup;
if ( GetPC().Pawn == none || GetPC().Pawn.InvManager == none )
{
return;
}
for ( Inv = GetPC().Pawn.InvManager.InventoryChain; Inv != none; Inv = Inv.Inventory )
{
KFW = KFWeapon( Inv );
if ( KFW != none && KFW.InventoryGroup == GroupIndex )
{
WeaponGroup.AddItem(KFW);
}
}
SetWeaponGroupList(WeaponGroup, GroupIndex);
}
simulated function SetWeaponGroupList(out array<KFWeapon> WeaponList, byte GroupIndex)
{
local byte i;
local GFxObject DataProvider;
local GFxObject TempObj;
local bool bUsesAmmo;
DataProvider = CreateArray();
if ( DataProvider == None )
{
return; // gfx has been shut down
}
for (i = 0; i < WeaponList.length; i++)
{
TempObj = CreateObject( "Object" );
if (WeaponList[i].CurrentWeaponUpgradeIndex > 0)
{
TempObj.SetString("weaponName", WeaponList[i].ItemName);
}
else
{
TempObj.SetString("weaponName", WeaponList[i].ItemName );
}
TempObj.SetInt("weaponTier", WeaponList[i].CurrentWeaponUpgradeIndex);
TempObj.SetString( "texturePath", "img://"$PathName(WeaponList[i].WeaponSelectTexture));
TempObj.SetInt( "ammoCount", WeaponList[i].AmmoCount[0]);
TempObj.SetInt( "spareAmmoCount", WeaponList[i].SpareAmmoCount[0]);
//secondary ammo shenanigans
TempObj.SetBool("bUsesSecondaryAmmo", WeaponList[i].UsesSecondaryAmmo()&&WeaponList[i].bCanRefillSecondaryAmmo);
TempObj.SetBool("bEnabled", WeaponList[i].HasAnyAmmo());
if(WeaponList[i].UsesSecondaryAmmo() && WeaponList[i].bCanRefillSecondaryAmmo)
{
TempObj.SetBool("bCanRefillSecondaryAmmo", WeaponList[i].SpareAmmoCapacity[1] > 0);
TempObj.SetInt( "secondaryAmmoCount", WeaponList[i].AmmoCount[1]);
TempObj.SetInt( "secondarySpareAmmoCount", WeaponList[i].SpareAmmoCount[1]);
}
TempObj.SetBool( "throwable", WeaponList[i].CanThrow());
bUsesAmmo = (WeaponList[i].static.UsesAmmo());
TempObj.SetBool( "bUsesAmmo", bUsesAmmo);
DataProvider.SetElementObject( i, TempObj );
}
SetWeaponList(DataProvider, GroupIndex);
}
simulated function SetWeaponList( GFxObject WeaponList, int GroupIndex )
{
ActionScriptVoid("setWeaponList");
}
function SetSelectedWeapon( int GroupIndex, int SelectedIndex)
{
if (!KFPlayerInput(GetPC().PlayerInput).bQuickWeaponSelect && !bChangingWeapons)
{
bChangingWeapons = true;
}
SendWeaponIndex(GroupIndex, SelectedIndex);
}
/** Find KFWeapon instance from highlight */
function Weapon GetSelectedWeapon()
{
return GetPC().Pawn.InvManager.PendingWeapon;
}
function UpdateIndex()
{
ActionScriptVoid("updateIndex");
bChangingWeapons = false;
}
function Hide()
{
SetWeaponSwitchStayOpen(false);
Fadeout();
}
function SetWeaponCategories( )
{
local GFxObject CategoriesObj;
CategoriesObj = CreateObject( "Object" );
CategoriesObj.SetString( "Primary", PrimaryString );
CategoriesObj.SetString( "Backup", SecondaryString );
CategoriesObj.SetString( "Melee", MeleeString );
CategoriesObj.SetString( "Equipment", EquiptmentString );
SetObject("weaponCategories", CategoriesObj);
}
function SendWeaponIndex( int GroupIndex, int SelectedIndex )
{
ActionScriptVoid("setSelectedIndex");
}
function ShowOnlyHUDGroup( byte GroupIndex )
{
UpdateWeaponGroupOnHUD(GroupIndex);
ActionScriptVoid("showOnlyHUDGroup");
}
function ShowAllHUDGroups()
{
ActionScriptVoid("showAllHUDGroups");
}
/**
* Timer to catch inventory changes while menu is open. Can't rely on
* events since the InventoryChain doesn't have a replicated event
*/
function RefreshTimer()
{
local Inventory Inv;
local int InvCount;
local KFInventoryManager KFIM;
for ( Inv = GetPC().Pawn.InvManager.InventoryChain; Inv != none; Inv = Inv.Inventory )
{
InvCount++;
}
// RefreshWeaponSelect is not cheap, so only update if we gained or lost a weapon
if ( InvCount != LastRefreshInvCount )
{
RefreshWeaponSelect();
// Make sure that we have a valid selection
if( GetPC().Pawn.InvManager != none )
{
KFIM = KFInventoryManager( GetPC().Pawn.InvManager );
if( KFIM != none )
{
KFIM.UpdateHUD();
}
}
}
LastRefreshInvCount = InvCount;
}
function SetWeaponSwitchStayOpen(bool bStayOpen)
{
local Inventory Inv;
if ( bStayOpen )
{
LastRefreshInvCount = 0;
for ( Inv = GetPC().Pawn.InvManager.InventoryChain; Inv != none; Inv = Inv.Inventory )
{
LastRefreshInvCount++;
}
GetPC().SetTimer(0.33f, true, nameof(RefreshTimer), self);
}
else
{
GetPC().ClearTimer(nameof(RefreshTimer), self);
}
SetBool("bStayOpen", bStayOpen);
}
function FadeOut()
{
bChangingWeapons = false;
}
DefaultProperties
{
ThrowGBA="GBA_AltFire_Gamepad"
}