Сохранение патронов после смерти

Тема в разделе "Общего назначения", создана пользователем Flame, 16 дек 2016.

Метки:
  1. Flame

    Flame -Заслуженый кодер форума-

    Что-то не нравится мне, что в той пушке, что была в руках игрока после смерти патроны сбрасываются на стандартное число
    Этот простенький мутатор решает данную несправедливость)

    Принцип работы:
    После смерти игрока вызывается функция DropFrom из KFWeapon. Если выкидывать пушку вызывается та же функция.
    Но в случае смерти переменная bThrown остаётся в значении false
    Код:
    function DropFrom(vector StartLocation)
    {
        ...
        Pickup = Spawn(PickupClass,,, StartLocation);
        if ( Pickup != None )
        {
            ...
            if (Instigator.Health > 0)
                WeaponPickup(Pickup).bThrown = true;
        }
        ...
    }
    
    Игрок оживает, пытается поднять пушку и вызывается функция добавления патронов GiveAmmo
    А там такой код:
    Код:
    function GiveAmmo(int m, WeaponPickup WP, bool bJustSpawned)
    {
        ...
        if ( FireMode[m] != None && FireMode[m].AmmoClass != None )
        {
                InitialAmount = FireMode[m].AmmoClass.Default.InitialAmount;
                if(WP!=none && WP.bThrown==true)
                    InitialAmount = WP.AmmoAmount[m];
        ...
    }
    
    То есть по умолчанию выдаётся количество патронов - InitialAmount из Ammo класса
    А если bThrown==true, то выдаётся сохранённое количество патронов

    Значит что нам надо? Нам надо отловить пушку после смерти игрока и поставить значение bThrown в true
    Чтобы не затрагивать пушки, которые спавнятся на карте - будем менять bThrown только у тех пушек у которых bDropped==true
    Ну и собственно код

    Код:
    Код:
    class SaveAmmoAfterDeathMut extends Mutator;
    
    var array<WeaponPickup> PendingPickups;
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
        if(WeaponPickup(Other)!=None)
        {
            PendingPickups[PendingPickups.Length] = WeaponPickup(Other);
            SetTimer(0.1,false);
        }
        return true;
    }
    
    function Timer()
    {
        local int i;
        for(i=0;i<PendingPickups.Length;i++)
        {
            if(PendingPickups[i].bDropped)
                PendingPickups[i].bThrown=true;
        }
        PendingPickups.Length = 0;
    }
    
    defaultproperties
    {
        GroupName="KF-SaveAmmoAfterDeath"
        FriendlyName="SaveAmmoAfterDeathMut"
        Description="SaveAmmoAfterDeathMut"
    }
    

    Ссылка 1 или Ссылка 2
    SaveAmmoAfterDeathMut.SaveAmmoAfterDeathMut
     
    RaideN- и Essence нравится это.