//============================================================================= // 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 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 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" }