Изменение приоритета пушек без патронов

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

  1. Flame

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

    Пока не надо качать - нестабильно работает)
    У предыдущей версии мутатора хватало минусов
    Поэтому вот версия работающая по иному принципу

    Итак, напоминаю суть:
    Пустые пушки с высоким приоритетом мешают жить игроку.
    Ему приходится пролистывать пушку за пушкой пока не найдёт ту у которой ещё остались патроны.
    Данный мутатор обнуляет приоритет пушек и ставит пустые пушки в самый конец списка. Если у пушек вновь появляются патроны - пушки переезжают обратно на своё привычное место.

    Старая версия будет в конце поста под спойлером

    Собственно мутатор получился простой. Настроек никаких.
    Хотя изначально он у меня был совсем не таким простеньким и к нему должна была идти полноценная статья
    + изменение SRHumanPawn
    Но утро вечера мудренее, пусть даже я ещё и не ложился и я придумал совсем простую реализацию:
    Код:
    class EmptyGunPriorityMut extends Mutator;
    
    function PostBeginPlay()
    {
        SetTimer(0.5,true);
    }
    
    function Timer()
    {
        local Controller C;
        local PlayerController PC;
        local float ca,ma;
        local Inventory Inv;
    
        for( C = Level.ControllerList; C != None; C = C.nextController )
        {
            if(C.IsA('PlayerController') && C.Pawn!=none)
            {
                PC=PlayerController(C);
                for(Inv=PC.Pawn.Inventory;Inv!=None;Inv=Inv.Inventory)
                {
                    if(KFWeapon(Inv)!=none)
                    {
                        KFWeapon(Inv).GetAmmoCount(ma,ca);
                        if(ca==0 && ca<ma && Weapon(Inv).Priority>0)
                        {
                            PC.Pawn.DeleteInventory(Inv);
                            Weapon(Inv).Priority=0;
                            PC.Pawn.AddInventory(Inv);
                            break;
                        }
                        if(ca>0 && ca<=ma && Weapon(Inv).Priority==0)
                        {
                            PC.Pawn.DeleteInventory(Inv);
                            Weapon(Inv).Priority = class<Weapon>(Inv.Class).default.Priority;
                            PC.Pawn.AddInventory(Inv);
                            break;
                        }
                    }
                }
            }
        }
    }
    
    defaultproperties
    {
        GroupName="KF-EmptyGunPriority"
        FriendlyName="EmptyGunPriorityMut"
        Description="EmptyGunPriorityMut"
    }
    
    Мысль в том, чтобы если патроны кончились, изъять пушку из связанного списка пушек (инвентарь), обнулить ей приоритет и вновь добавить в этот список. А если патроны появились, изъять, восстановить приоритет и добавить в список. Изначально я руками редактировал этот список пушек.
    Ну так или иначе я тему изучил и скоро мы по ней напишем статью)

    Ссылка 1 или Ссылка 2
    EmptyGunPriorityMut.EmptyGunPriorityMut

    Старая реализация:
    Представим ситуацию - на слоте 2 у нас куча пистолетов, но первые 3 пистолета уже без патронов
    Если мы переключаемся с другого слота на слот 2, то нам ещё трижды придётся нажать циферку 2 на клавиатуре, чтобы попасть к пистолету у которого ещё есть патроны
    Этот простенький мутатор автоматически перелистывает пушки до первой пушки с патронами

    При этом пауза при переключении тем больше, чем больше пустых пушек на пути перелистывания.
    Потом может сделаю мгновенное переключение на пушку с патронами

    Как обычно мутатор почти не тестил - вам и отлавливать косяки)

    Код:
    Код:
    class SwitchToLoadedGunMut extends Mutator;
    
    simulated function Tick(float delta)
    {
        local PlayerController PC;
        local Weapon W, NextW;
        local float ca,ma;
        local byte cgroup;
        PC = Level.GetLocalPlayerController();
        if(PC!=none && PC.Pawn!=none && PC.Pawn.Inventory!=none)
        {
            W=PC.Pawn.Weapon;
            W.GetAmmoCount(ma,ca);
            cgroup=W.default.InventoryGroup;
            NextW = W.Inventory.WeaponChange(cgroup, false);
            if(ca==0 && ca<ma && NextW!=none)
                PC.Pawn.SwitchWeapon(cgroup);
        }
        Super.Tick(delta);
    }
    
    defaultproperties
    {
        bAddToServerPackages=True
        GroupName="KF-SwitchToLoadedGun"
        FriendlyName="SwitchToLoadedGunMut"
        Description="SwitchToLoadedGunMut"
        bAlwaysRelevant=True
        RemoteRole=ROLE_SimulatedProxy
    }
    

    Ссылка 1 или Ссылка 2
    SwitchToLoadedGunMut.SwitchToLoadedGunMut
     
    Последнее редактирование: 1 окт 2016
    w.a.l и HATAXA нравится это.
  2. Flame

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

    Обновил реализацию

    Upd.
    А, блин
    Вылеты есть у игроков
    Буду править
     
    Последнее редактирование: 1 окт 2016