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

565 lines
14 KiB
Ucode

class a_WeaponManager extends a_ActorBase
config(HideMutWeapons);
// when exit save weapon list as "CurrentWeaponList"
// clean me on destroy!!!
var() KFPlayerController kfpc;
var() HideMutInteraction interaction;
var() config bool bUseVanillaManagement;
var() config bool bFastWeaponChanging;
// server preset basic support
struct serverPreset
{
var string gameMode;
var string weaponPreset;
var string serverName;
var bool bUseVanillaManagement;
};
var() config array<serverPreset> serverPresets;
var() array<string> weaponGroup1;
var() array<string> weaponGroup2;
var() array<string> weaponGroup3;
var() array<string> weaponGroup4;
var() array<string> weaponGroup5;
var() array<string> weaponGroup6;
var() array<string> weaponGroup7;
var() array<string> weaponGroup8;
var() array<string> weaponGroup9;
var() array<string> allUsedWeapons;
// self cleanup, coz simple Destroy aint enough
function Termination()
{
// remove all refs
kfpc = none;
interaction = none;
clearAllGroups();
super.Termination();
}
event postBeginPlay()
{
super.postBeginPlay();
forEach allObjects(class'HideMutInteraction', interaction)
break;
loadWeaponList("CurrentWeaponList");
if (serverPresets.length > 0)
checkGameType();
}
final protected function checkGameType()
{
local GameReplicationInfo tempGri;
local int i;
local bool highestPriority;
local bool newBUseVanillaManagement;
local bool bFoundMatchingPreset;
local string newPreset;
foreach allActors(class'GameReplicationInfo', tempGri)
{
for (i = 0; i < serverPresets.length; i++)
{
if (tempGri.gameClass == serverPresets[i].gameMode)
{
// if server name is defined, this preset has higher priority (highestPriority = true)
if (serverPresets[i].serverName != "")
{
if (inStr(caps(tempGri.serverName), caps(serverPresets[i].serverName)) != -1)
{
newBUseVanillaManagement = serverPresets[i].bUseVanillaManagement;
if (serverPresets[i].weaponPreset != "")
newPreset = serverPresets[i].weaponPreset;
highestPriority = true;
bFoundMatchingPreset = true;
}
}
// if we found preset matching gameType and server name, we should skip presets without server name
else if (!highestPriority)
{
newBUseVanillaManagement = serverPresets[i].bUseVanillaManagement;
if (serverPresets[i].weaponPreset != "")
newPreset = serverPresets[i].weaponPreset;
bFoundMatchingPreset = true;
}
}
}
}
if (bFoundMatchingPreset)
{
bUseVanillaManagement = newBUseVanillaManagement;
if (newPreset != "")
loadWeaponList(newPreset);
}
}
simulated function saveWeaponList(string listName)
{
local list_WeaponManager new_WeaponList;
new_WeaponList = new(none, listName) class'list_WeaponManager';
new_WeaponList.clearConfig();
new_WeaponList.weaponGroup1 = weaponGroup1;
new_WeaponList.weaponGroup2 = weaponGroup2;
new_WeaponList.weaponGroup3 = weaponGroup3;
new_WeaponList.weaponGroup4 = weaponGroup4;
new_WeaponList.weaponGroup5 = weaponGroup5;
new_WeaponList.weaponGroup6 = weaponGroup6;
new_WeaponList.weaponGroup7 = weaponGroup7;
new_WeaponList.weaponGroup8 = weaponGroup8;
new_WeaponList.saveConfig();
}
simulated function loadWeaponList(string listName)
{
local list_WeaponManager new_WeaponList;
clearAllGroups();
new_WeaponList = new(none, listName) class'list_WeaponManager';
weaponGroup1 = new_WeaponList.weaponGroup1;
weaponGroup2 = new_WeaponList.weaponGroup2;
weaponGroup3 = new_WeaponList.weaponGroup3;
weaponGroup4 = new_WeaponList.weaponGroup4;
weaponGroup5 = new_WeaponList.weaponGroup5;
weaponGroup6 = new_WeaponList.weaponGroup6;
weaponGroup7 = new_WeaponList.weaponGroup7;
weaponGroup8 = new_WeaponList.weaponGroup8;
updateUnusedWeapons();
}
simulated function deleteWeaponList(string listName)
{
local list_WeaponManager new_WeaponList;
new_WeaponList = new(none, listName) class'list_WeaponManager';
new_WeaponList.clearConfig();
}
final function hide_getWeapon(byte groupNumber)
{
local Inventory inv;
local int i, currentWeapon;
local array<string> loc_weaponGroup;
if (kfpc.pawn == none || kfpc.pawn.inventory == none)
return;
switch (groupNumber)
{
case 1:
loc_weaponGroup = weaponGroup1;
break;
case 2:
loc_weaponGroup = weaponGroup2;
break;
case 3:
loc_weaponGroup = weaponGroup3;
break;
case 4:
loc_weaponGroup = weaponGroup4;
break;
case 5:
loc_weaponGroup = weaponGroup5;
break;
case 6:
loc_weaponGroup = weaponGroup6;
break;
case 7:
loc_weaponGroup = weaponGroup7;
break;
case 8:
loc_weaponGroup = weaponGroup8;
break;
case 9:
loc_weaponGroup = weaponGroup9;
break;
// fallback
default:
loc_weaponGroup = weaponGroup1;
}
if (loc_weaponGroup.length == 0)
return;
currentWeapon = -1;
for (i = 0; i < loc_weaponGroup.length; i++)
{
if (string(kfpc.pawn.weapon.class) ~= loc_weaponGroup[i])
{
currentWeapon = i;
break;
}
}
if (currentWeapon < loc_weaponGroup.length - 1)
{
for (i = currentWeapon + 1; i < loc_weaponGroup.length; i++)
{
for (inv = kfpc.pawn.inventory; inv != none; inv = inv.inventory)
{
if (string(inv.class) ~= loc_weaponGroup[i])
{
kfpc.pawn.pendingWeapon = Weapon(inv);
if (bFastWeaponChanging)
kfpc.pawn.changedWeapon();
else
kfpc.pawn.weapon.putDown();
return;
}
}
}
}
for (i = 0; i < currentWeapon; i++)
{
for (inv = kfpc.pawn.inventory; inv != none; inv = inv.inventory)
{
if (string(inv.class) ~= loc_weaponGroup[i])
{
kfpc.pawn.pendingWeapon = Weapon(inv);
if(bFastWeaponChanging)
kfpc.pawn.changedWeapon();
else
kfpc.pawn.weapon.putDown();
return;
}
}
}
return;
}
// quickest way to self heal
simulated function reallyQuickHeal()
{
local Inventory inv;
local Weapon oldWeapon;
if (kfpc == none || kfpc.pawn == none || kfpc.pawn.inventory == none)
return;
for (inv = kfpc.pawn.inventory; inv != none; inv = inv.inventory)
{
if (ClassIsChildOf(inv.class, class'Syringe'))
{
oldWeapon = kfpc.pawn.weapon;
kfpc.pawn.pendingWeapon = Weapon(inv);
kfpc.pawn.changedWeapon();
// Syringe(kfpc.pawn.weapon).HackClientStartFire();
Syringe(kfpc.pawn.weapon).serverStartFire(1);
kfpc.pawn.pendingWeapon = oldWeapon;
// kfpc.pawn.changedWeapon();
kfpc.pawn.weapon.putDown();
}
}
}
simulated function fullReset()
{
local KFLevelRules kflr;
clearAllGroups();
foreach kfpc.dynamicActors(class'KFLevelRules', kflr)
{
break;
}
if (kflr == none)
{
kfpc.clientMessage("Can't access KFLevelRules. You are probably not in game.");
return;
}
parseItemForSale(kflr.mediItemForSale);
parseItemForSale(kflr.suppItemForSale);
parseItemForSale(kflr.shrpItemForSale);
parseItemForSale(kflr.commItemForSale);
parseItemForSale(kflr.bersItemForSale);
parseItemForSale(kflr.fireItemForSale);
parseItemForSale(kflr.demoItemForSale);
parseItemForSale(kflr.neutItemForSale);
// hardcode big nono
weaponGroup5[weaponGroup5.length] = "KFmod.Syringe";
weaponGroup5[weaponGroup5.length] = "KFmod.Welder";
updateUnusedWeapons();
prioritySortGroup(weaponGroup1);
prioritySortGroup(weaponGroup2);
prioritySortGroup(weaponGroup3);
prioritySortGroup(weaponGroup4);
}
simulated function basicCleaning()
{
local Inventory inv;
local array<class<Pickup> > inventoryWeapons;
clearAllGroups();
if (kfpc.pawn.inventory == none)
{
kfpc.clientMessage("This function requires you inventory.(Needs Pawn)");
return;
}
for (inv = kfpc.pawn.inventory; inv != none; inv = inv.inventory)
{
if (KFWeapon(inv) != none)
{
inventoryWeapons[inventoryWeapons.length] = KFWeapon(inv).pickupClass;
}
}
parseItemForSale(inventoryWeapons);
updateUnusedWeapons();
}
simulated function fullCleaning()
{
clearAllGroups();
updateUnusedWeapons();
}
// part of fullReset()
simulated function parseItemForSale(array<class<Pickup> > itemForSale)
{
local int i;
local class<KFWeapon> tempKFWeapon;
for (i = 0; i < itemForSale.length; i++)
{
tempKFWeapon = class<KFWeapon>(itemForSale[i].default.inventoryType);
// failsafe
if (tempKFWeapon == none)
continue;
if (tempKFWeapon.default.inventoryGroup == 1)
{
weaponGroup1[weaponGroup1.length] = string(tempKFWeapon);
continue;
}
if (tempKFWeapon.default.inventoryGroup == 2)
{
weaponGroup2[weaponGroup2.length] = string(tempKFWeapon);
continue;
}
if (tempKFWeapon.default.inventoryGroup == 3)
{
weaponGroup3[weaponGroup3.length] = string(tempKFWeapon);
continue;
}
if (tempKFWeapon.default.inventoryGroup == 4)
{
weaponGroup4[weaponGroup4.length] = string(tempKFWeapon);
continue;
}
if (tempKFWeapon.default.inventoryGroup == 5)
{
weaponGroup5[weaponGroup5.length] = string(tempKFWeapon);
continue;
}
}
}
// part of fullReset()
simulated function prioritySortGroup(out array<string> weaponGroup)
{
local int i,j;
local string tempString;
local class<KFWeapon> tempKFWeapon1, tempKFWeapon2;
for (i = 0; i < weaponGroup.length; i++)
{
for (j = i; j < weaponGroup.length; j++)
{
tempKFWeapon1 = class<KFWeapon>(dynamicLoadObject(weaponGroup[i], class'Class', true));
tempKFWeapon2 = class<KFWeapon>(dynamicLoadObject(weaponGroup[j], class'Class', true));
if (tempKFWeapon1.default.priority < tempKFWeapon2.default.priority)
{
tempString = weaponGroup[i];
weaponGroup[i] = weaponGroup[j];
weaponGroup[j] = tempString;
}
}
}
}
simulated function clearAllGroups()
{
weaponGroup1.remove(0, weaponGroup1.length);
weaponGroup2.remove(0, weaponGroup2.length);
weaponGroup3.remove(0, weaponGroup3.length);
weaponGroup4.remove(0, weaponGroup4.length);
weaponGroup5.remove(0, weaponGroup5.length);
weaponGroup6.remove(0, weaponGroup6.length);
weaponGroup7.remove(0, weaponGroup7.length);
weaponGroup8.remove(0, weaponGroup8.length);
weaponGroup9.remove(0, weaponGroup9.length);
}
simulated function updateUnusedWeapons()
{
local KFLevelRules kflr;
local array<class<Pickup> > welderSyringe;
updateAllUsedWeapons();
foreach dynamicActors(class'KFLevelRules', kflr)
{
break;
}
if (kflr == none)
{
if (kfpc != none)
kfpc.clientMessage("Can't access KFLevelRules. You are probably not in game.");
return;
}
weaponGroup9.remove(0, weaponGroup9.length);
updateUnusedWeapons_Internal(kflr.mediItemForSale);
updateUnusedWeapons_Internal(kflr.suppItemForSale);
updateUnusedWeapons_Internal(kflr.shrpItemForSale);
updateUnusedWeapons_Internal(kflr.commItemForSale);
updateUnusedWeapons_Internal(kflr.bersItemForSale);
updateUnusedWeapons_Internal(kflr.fireItemForSale);
updateUnusedWeapons_Internal(kflr.demoItemForSale);
updateUnusedWeapons_Internal(kflr.neutItemForSale);
welderSyringe[welderSyringe.length] = class'SyringePickup';
welderSyringe[welderSyringe.length] = class'WelderPickup';
updateUnusedWeapons_Internal(welderSyringe);
prioritySortGroup(weaponGroup9);
}
simulated function updateUnusedWeapons_Internal(array<class<Pickup> > parsedWeapons)
{
local int i, j;
local class<KFWeapon> tempKFWeapon;
for (i = 0; i < parsedWeapons.length; i++)
{
tempKFWeapon = class<KFWeapon>(parsedWeapons[i].default.inventoryType);
if (tempKFWeapon == none)
continue;
if (allUsedWeapons.length == 0)
{
weaponGroup9[weaponGroup9.length] = string(tempKFWeapon);
continue;
}
for (j = 0; j < allUsedWeapons.length; j++)
{
if (string(tempKFWeapon) == allUsedWeapons[j])
break;
if (j == (allUsedWeapons.length - 1))
weaponGroup9[weaponGroup9.length] = string(tempKFWeapon);
}
}
}
simulated function updateAllUsedWeapons()
{
local int i;
allUsedWeapons.remove(0, allUsedWeapons.length);
for (i = 0; i < weaponGroup1.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup1[i];
}
for (i = 0; i < weaponGroup2.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup2[i];
}
for (i = 0; i < weaponGroup3.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup3[i];
}
for (i = 0; i < weaponGroup4.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup4[i];
}
for (i = 0; i < weaponGroup5.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup5[i];
}
for (i = 0; i < weaponGroup6.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup6[i];
}
for (i = 0; i < weaponGroup7.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup7[i];
}
for (i = 0; i < weaponGroup8.length; i++)
{
allUsedWeapons[allUsedWeapons.length] = weaponGroup8[i];
}
}
simulated function array<string> getAllPresetNames()
{
local array<string> names;
local int i;
names = getPerObjectNames("HideMutWeapons", string(class'list_WeaponManager'.name));
for (i = 0; i < names.length; i++)
{
if (names[i] ~= "CurrentWeaponList")
{
names.remove(i, 1);
}
}
return names;
}
// ============================================================
// are we a variant or no
final protected function bool IsVariantClass(class<Inventory> aInventoryType)
{
return Left(aInventoryType, 12) ~= "KFMod.Golden" || Left(aInventoryType, 10) ~= "KFMod.Camo" || Left(aInventoryType, 10) ~= "KFMod.Neon";
}
defaultproperties
{
}