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

307 lines
7.7 KiB
Ucode
Raw Blame History

//-----------------------------------------------------------
//
//-----------------------------------------------------------
class KFBuyMenuOptionsList extends GUIVertList;
// Settings
var float ItemBorder; // Percent of Height to leave blank inside Item Background
var float TextTopOffset; // Percent of Height to offset top of Text
var float ItemSpacing; // Number of Pixels between Items
// Display
var texture ItemBackground;
var texture SelectedItemBackground;
var array<string> PrimaryStrings;
var array<string> SecondaryStrings;
// state
var GUIBuyable TheBuyable;
var int MouseOverIndex;
var bool bNeedsUpdate;
var bool bNoAutoFill;
var int UpdateCounter;
var localized string BuyString;
var localized string SellString;
var localized string BuyClipString;
var localized string FillString;
var localized string AutoFillString;
var localized string ExitString;
var int AutoFillCost;
event InitComponent(GUIController MyController, GUIComponent MyOwner)
{
Super.InitComponent(MyController, MyOwner);
OnDrawItem = DrawInvItem;
}
event Closed(GUIComponent Sender, bool bCancelled)
{
PrimaryStrings.Remove(0, PrimaryStrings.Length);
SecondaryStrings.Remove(0, SecondaryStrings.Length);
TheBuyable = none;
super.Closed(Sender, bCancelled);
}
function UpdateList(GUIBuyable Buyable)
{
// Clear the arrays
PrimaryStrings.Remove(0, PrimaryStrings.Length);
SecondaryStrings.Remove(0, SecondaryStrings.Length);
//Reset item count
ItemCount = 6;
TheBuyable = Buyable;
if ( TheBuyable != none )
{
// First we have to check if the item is inv or sale
if ( !TheBuyable.bSaleList )
{
//Ok, this item is already in our inventory, now let's see if we can sell it or not
if ( TheBuyable.bSellable )
{
// Now we have to check if it is a melee weapon && Check if we already have full ammo
if ( !TheBuyable.bMelee && int(TheBuyable.ItemAmmoCurrent) < int(TheBuyable.ItemAmmoMax))
{
// Sell Button
PrimaryStrings[0] = SellString;
SecondaryStrings[0] = "<22>" $ int(TheBuyable.ItemCost * 0.75) ;
// Single Clip
PrimaryStrings[1] = BuyClipString;
SecondaryStrings[1] = "<22>" $ int(TheBuyable.ItemAmmoCost);
// Fill up
PrimaryStrings[2] = FillString;
SecondaryStrings[2] = "<22>" $ int(TheBuyable.ItemFillAmmoCost);
}
else
{
// Sell Button
PrimaryStrings[2] = SellString;
SecondaryStrings[2] = "<22>" $ int(TheBuyable.ItemCost * 0.75) ;
}
}
else
{
//Check if it is a melee weapon
if ( !TheBuyable.bMelee )
{
//Check if we already have full ammo
if ( int(TheBuyable.ItemAmmoCurrent) < int(TheBuyable.ItemAmmoMax) )
{
// Single Clip
PrimaryStrings[1] = BuyClipString;
SecondaryStrings[1] = "<22>" $ int(TheBuyable.ItemAmmoCost);
// Fill up
PrimaryStrings[2] = FillString;
SecondaryStrings[2] = "<22>" $ int(TheBuyable.ItemFillAmmoCost);
}
}
}
}
else
{
//Too heavy? Too expensive?
if ( TheBuyable.ItemWeight + KFHumanPawn(PlayerOwner().Pawn).CurrentWeight <= KFHumanPawn(PlayerOwner().Pawn).MaxCarryWeight &&
TheBuyable.ItemCost <= PlayerOwner().PlayerReplicationInfo.Score && PlayerOwner().SteamStatsAndAchievements.PlayerOwnsWeaponDLC(TheBuyable.ItemWeaponClass.Default.AppID) )
{
//This is an for sale item
PrimaryStrings[2] = BuyString;
SecondaryStrings[2] = "<22>" $ int(TheBuyable.ItemCost);
}
}
}
PrimaryStrings[4] = AutoFillString;
SecondaryStrings[4] = "<22>" $ AutoFillCost;
PrimaryStrings[5] = ExitString;
SecondaryStrings[5] = "";
if ( bNotify )
{
CheckLinkedObjects(Self);
}
if ( MyScrollBar != none )
{
MyScrollBar.AlignThumb();
}
}
function int FindCheapestAmmo()
{
local Inventory CurInv;
local int CurrentCheapest, CurrentCost;
CurrentCheapest = 99999;
for ( CurInv = PlayerOwner().Pawn.Inventory; CurInv != none; CurInv = CurInv.Inventory )
{
if ( CurInv.IsA('KFAmmunition') )
{
CurrentCost = FindAmmoCost(KFAmmunition(CurInv).Class);
}
else
{
continue;
}
if ( CurrentCost < CurrentCheapest )
{
CurrentCheapest = CurrentCost;
}
}
return CurrentCheapest;
}
function int FindAmmoCost(Class<Ammunition> AClass)
{
local Inventory CurInv;
local KFWeapon MyWeapon;
for ( CurInv = PlayerOwner().Pawn.Inventory; CurInv != none; CurInv = CurInv.Inventory )
{
//if( CurInv.Class == AClass )
//{
// MyAmmo = Ammunition(CurInv);
//}
if ( KFWeapon(CurInv) != None && (Weapon(CurInv).AmmoClass[0]==AClass || Weapon(CurInv).AmmoClass[1]==AClass) )
{
MyWeapon = KFWeapon(CurInv);
break;
}
}
if ( MyWeapon != none )
{
return Class<KFWeaponPickup>(MyWeapon.PickupClass).Default.AmmoCost;
}
else
{
return 999999;
}
}
function bool PreDraw(Canvas Canvas)
{
if ( Controller.MouseX >= ClientBounds[0] && Controller.MouseX <= ClientBounds[2] && Controller.MouseY >= ClientBounds[1] )
{
// Figure out which Item we're clicking on
MouseOverIndex = Top + ((Controller.MouseY - ClientBounds[1]) / ItemHeight);
if ( MouseOverIndex >= ItemCount )
{
MouseOverIndex = -1;
}
}
else
{
MouseOverIndex = -1;
}
return false;
}
function DrawInvItem(Canvas Canvas, int CurIndex, float X, float Y, float Width, float Height, bool bSelected, bool bPending)
{
local float TempX, TempY;
local float StringHeight, StringWidth;
if ( PrimaryStrings[CurIndex] == "" )
{
return;
}
OnClickSound=CS_Click;
// Offset for the Background
TempX = X;
TempY = Y + ItemSpacing / 2.0;
// Initialize the Canvas
Canvas.Style = 1;
// Draw Item Background
Canvas.SetPos(TempX, TempY);
if ( CurIndex == MouseOverIndex )
{
Canvas.SetDrawColor(210, 210, 210, 255);
Canvas.DrawTileStretched(SelectedItemBackground, Width, Height - ItemSpacing);
}
else
{
Canvas.SetDrawColor(255, 255, 255, 255);
Canvas.DrawTileStretched(ItemBackground, Width, Height - ItemSpacing);
}
// Select Text color
if ( CurIndex == MouseOverIndex )
{
Canvas.SetDrawColor(189, 73, 74, 255);
}
else
{
Canvas.SetDrawColor(255, 255, 255, 255);
}
if ( CurIndex == 4 )
{
if ( PlayerOwner().PlayerReplicationInfo.Score < FindCheapestAmmo() )
{
Canvas.SetDrawColor(128, 128, 128, 255);
bNoAutoFill = true;
}
else
{
bNoAutoFill = false;
}
}
// Draw the function(Buy, Sell, etc.)
Canvas.StrLen(PrimaryStrings[CurIndex], StringWidth, StringHeight);
Canvas.SetPos(TempX+ (0.2 * Height), TempY + ((Height - ItemSpacing - StringHeight) / 2));
Canvas.DrawText(PrimaryStrings[CurIndex]);
// Draw the price(if any)
Canvas.StrLen(SecondaryStrings[CurIndex], StringWidth, StringHeight);
Canvas.SetPos(TempX + Width - (StringWidth + (0.2 * Height)), TempY + ((Height - ItemSpacing - StringHeight) / 2));
Canvas.DrawText(SecondaryStrings[CurIndex]);
Canvas.SetDrawColor(255, 255, 255, 255);
}
function float SaleItemHeight(Canvas c)
{
return ((MenuOwner.ActualHeight() / 6.0) - 1.0);
}
defaultproperties
{
ItemBorder=0.03
TextTopOffset=0.05
ItemSpacing=6.0
OnPreDraw=PreDraw
BuyString="Purchase"
SellString="Sell Weapon"
BuyClipString="Buy Single Clip"
FillString="Fill Selected Ammo"
AutoFillString="Auto Fill Ammo"
ExitString="Exit Trader Menu"
ItemBackground=Texture'InterfaceArt_tex.Menu.DownTickBlurry'
SelectedItemBackground=Texture'InterfaceArt_tex.Menu.DownTickWatched'
FontScale=FNS_Medium
GetItemHeight=KFBuyMenuOptionsList.SaleItemHeight
}