simulated function SwitchWeapon(byte F)
{
local Weapon newWeapon;
local Inventory inv;
local class<KFVeterancyTypes> Veterancy;
if ( (Level.Pauser!=None) || (Inventory == None) )
return;
//Use iterations instead of recursive calls -> faster, also it's better to filter out the best choice of weapon
if ( Weapon != None )
{
Veterancy = KFPlayerReplicationInfo(PlayerReplicationInfo).ClientVeteranSkill;
for ( inv=Weapon.Inventory; inv!=None; inv=inv.Inventory ) //Check weapons after current
{
if ( Weapon(inv) != None && inv.InventoryGroup == F && Weapon(inv).HasAmmo() )
{
//Pseudo code - prefer veterancy weapons, if player switches to a new inventory group.
//IsVeterancyWeapon() is nowhere implemented, it returns true if weapon concerns to verterancytype of holder and false if not.
//It could be implemented in class'KFVeterancyTypes'.
if ( Weapon.InventoryGroup != F )
{
if ( Veterancy.Static.IsVeterancyWeapon(Weapon(inv)) ) //first veterancy weapon after current
{
newWeapon = Weapon(inv);
break;
}
else if ( newWeapon == None ) //first non-verterancy weapon after current
newWeapon = Weapon(inv);
}
else
{
newWeapon = Weapon(inv);
break;
}
}
}
if ( newWeapon == None ) //Check weapons before current
{
for ( inv=Inventory; inv!=Weapon && inv!=None; inv=inv.Inventory )
{
if ( Weapon(inv) != None && inv.InventoryGroup == F && Weapon(inv).HasAmmo() )
{
if ( Weapon.InventoryGroup != F )
{
if ( Veterancy.Static.IsVeterancyWeapon(Weapon(inv)) ) //first veterancy weapon after current
{
newWeapon = Weapon(inv);
break;
}
else if ( newWeapon == None ) //first non-verterancy weapon after current
newWeapon = Weapon(inv);
}
else
{
newWeapon = Weapon(inv);
break;
}
}
}
}
}
if ( Weapon == None )
newWeapon = Inventory.WeaponChange(F, true);
else if ( newWeapon == None )
{
if ( Weapon.HasAmmo() )
{
newWeapon = Weapon;
if ( Weapon.InventoryGroup == F )
ClientMessage( "Other weapons in group"@F@"are out of ammo!" );
else
ClientMessage( "All weapons in group"@F@"are out of ammo!" );
}
}
if ( PendingWeapon != None && PendingWeapon.bForceSwitch )
return;
if ( Weapon == None )
{
PendingWeapon = newWeapon;
ChangedWeapon();
}
else if ( Weapon != newWeapon || PendingWeapon != None )
{
PendingWeapon = newWeapon;
Weapon.PutDown();
}
else if ( Weapon == newWeapon )
Weapon.Reselect();
}