Fix FixAmmoSelling
causing invisible pickups
Non-default value of pickup class was used to spawn pickup when player drops a weapon. But since we've replaced that class and it doesn't (or might not) exist on the client - dropped weapons appeared as invisible. Catch the moment our custom pickup is spawned and replace it back with default one.
This commit is contained in:
parent
2b75722de5
commit
1a58ba0620
@ -170,6 +170,21 @@ public function OnDisabled()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Checks if given class is a one of our pickup replacer classes.
|
||||||
|
public static final function bool IsReplacer(class<Actor> pickupClass)
|
||||||
|
{
|
||||||
|
local int i;
|
||||||
|
if (pickupClass == none) return false;
|
||||||
|
for (i = 0; i < default.rules.length; i += 1)
|
||||||
|
{
|
||||||
|
if (pickupClass == default.rules[i].pickupReplacement)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// 1. Checks if weapon can be abused and if it can, - fixes the problem.
|
// 1. Checks if weapon can be abused and if it can, - fixes the problem.
|
||||||
// 2. Starts tracking abusable weapon to detect when player buys ammo for it.
|
// 2. Starts tracking abusable weapon to detect when player buys ammo for it.
|
||||||
public final function FixWeapon(KFWeapon potentialAbuser)
|
public final function FixWeapon(KFWeapon potentialAbuser)
|
||||||
|
@ -23,6 +23,15 @@ class MutatorListener_FixAmmoSelling extends MutatorListenerBase
|
|||||||
|
|
||||||
static function bool CheckReplacement(Actor other, out byte isSuperRelevant)
|
static function bool CheckReplacement(Actor other, out byte isSuperRelevant)
|
||||||
{
|
{
|
||||||
|
if (other == none) return true;
|
||||||
|
|
||||||
|
// We need to replace pickup classes back,
|
||||||
|
// as they might not even exist on clients.
|
||||||
|
if (class'FixAmmoSelling'.static.IsReplacer(other.class))
|
||||||
|
{
|
||||||
|
ReplacePickupWith(Pickup(other));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
CheckAbusableWeapon(KFWeapon(other));
|
CheckAbusableWeapon(KFWeapon(other));
|
||||||
CheckAmmoPickup(KFAmmoPickup(other));
|
CheckAmmoPickup(KFAmmoPickup(other));
|
||||||
return true;
|
return true;
|
||||||
@ -43,6 +52,50 @@ private static final function CheckAmmoPickup(KFAmmoPickup newAmmoPickup)
|
|||||||
class'AmmoPickupStalker'.static.StalkAmmoPickup(newAmmoPickup);
|
class'AmmoPickupStalker'.static.StalkAmmoPickup(newAmmoPickup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This function recreates the logic of 'KFWeapon.DropFrom()',
|
||||||
|
// since standard 'ReplaceWith' function produces bad results.
|
||||||
|
private static function ReplacePickupWith(Pickup oldPickup)
|
||||||
|
{
|
||||||
|
local Pawn instigator;
|
||||||
|
local Pickup newPickup;
|
||||||
|
local KFWeapon relevantWeapon;
|
||||||
|
if (oldPickup == none) return;
|
||||||
|
instigator = oldPickup.instigator;
|
||||||
|
if (instigator == none) return;
|
||||||
|
relevantWeapon = GetWeaponOfClass(instigator, oldPickup.inventoryType);
|
||||||
|
if (relevantWeapon == none) return;
|
||||||
|
|
||||||
|
newPickup = relevantWeapon.Spawn( relevantWeapon.default.pickupClass,,,
|
||||||
|
relevantWeapon.location);
|
||||||
|
newPickup.InitDroppedPickupFor(relevantWeapon);
|
||||||
|
newPickup.velocity = relevantWeapon.velocity +
|
||||||
|
Vector(instigator.rotation) * 100;
|
||||||
|
if (instigator.health > 0)
|
||||||
|
KFWeaponPickup(newPickup).bThrown = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this is code duplication, some sort of solution is needed
|
||||||
|
static final function KFWeapon GetWeaponOfClass
|
||||||
|
(
|
||||||
|
Pawn playerPawn,
|
||||||
|
class<Inventory> weaponClass
|
||||||
|
)
|
||||||
|
{
|
||||||
|
local Inventory invIter;
|
||||||
|
if (playerPawn == none) return none;
|
||||||
|
|
||||||
|
invIter = playerPawn.inventory;
|
||||||
|
while (invIter != none)
|
||||||
|
{
|
||||||
|
if (invIter.class == weaponClass)
|
||||||
|
{
|
||||||
|
return KFWeapon(invIter);
|
||||||
|
}
|
||||||
|
invIter = invIter.inventory;
|
||||||
|
}
|
||||||
|
return none;
|
||||||
|
}
|
||||||
|
|
||||||
defaultproperties
|
defaultproperties
|
||||||
{
|
{
|
||||||
relatedEvents = class'MutatorEvents'
|
relatedEvents = class'MutatorEvents'
|
||||||
|
Reference in New Issue
Block a user