Возвращаем пушки ожившему игроку

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

  1. Flame

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

    Суть:
    Игрок умирает - пушки запоминаются. Игрок оживает - пушки возвращаются.
    При условии, что пока он был трупом он не сменил перк

    Часто просят модификации этого мутатора.
    Начал было отвечать на этот пост, но что-то подумал, что проще мне просто накидать мутатор
    Хотя бы простейшую версию, чтобы был понятен алгоритм

    Код:
    Код:
    Class RecoverWeaponsMut extends Mutator;
    
    var RecoverWeaponsRules Rules;
    function PostBeginPlay()
    {
        if(Rules==None)
            Rules = Spawn(Class'RecoverWeaponsRules');
    }
    
    function ModifyPlayer(Pawn P)
    {
        if(PlayerController(P.Controller)!=none)
            Rules.ReturnWeapons(PlayerController(P.Controller));
        if(NextMutator != None)
            NextMutator.ModifyPlayer(P);
    }
    
    defaultproperties
    {
        GroupName="KF-RecoverWeapons"
        FriendlyName="RecoverWeapons"
        Description="RecoverWeapons"
    }
    
    Код:
    class RecoverWeaponsRules extends GameRules;
    
    //Структура и массив с информацией об умершем
    struct DeadPlayersStruct
    {
        var string ID;
        var Name OldVeterancy;
        var array<string> weaponsList;
    };
    var array<DeadPlayersStruct> deadList;
    
    //Стандартные функции для GameRules
    function PostBeginPlay()
    {
        if(Level.Game.GameRulesModifiers == none)
            Level.Game.GameRulesModifiers = self;
        else
            Level.Game.GameRulesModifiers.AddGameRules(self);
    }
    function AddGameRules(GameRules GR)
    {
        if(GR != self)
            super.AddGameRules(GR);
    }
    //
    
    function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> damageType, vector HitLocation)
    {
        local DeadPlayersStruct dps;
        local Inventory Inv;
        if    (
                KFHumanPawn(Killed)!=none
                &&    Killed.Controller.IsA('PlayerController')
            )
        {
            //Если игрок помер - сохраняем информацию об его оружии и текущем перке
            dps.ID=PlayerController(Killed.Controller).GetPlayerIDHash();
            for(Inv=Killed.Inventory; Inv!=None; Inv=Inv.Inventory )
            {
                if(Weapon(Inv)!=none)
                    dps.weaponsList[dps.weaponsList.Length]=string(Inv.Class);
            }
            dps.OldVeterancy=KFPlayerReplicationInfo(PlayerController(Killed.Controller).PlayerReplicationInfo).ClientVeteranSkill.Name;
            //Добавляем его в массив.
            deadList[deadList.Length]=dps;
    
            //Чтобы после игрока на земле ничего не валялось
            Killed.Weapon.Destroy();
        }
        if ( NextGameRules != None)
            return NextGameRules.PreventDeath(Killed,Killer, damageType,HitLocation);
        return false;
    }
    
    function ReturnWeapons(PlayerController PC)
    {
        local int i;
        local DeadPlayersStruct dps;
        local bool inList;
        local string Hash;
        local Inventory Inv,NextInv;
        Hash=PC.GetPlayerIDHash();
        //Ищем игрока в списке принявших смерть
        for(i=deadList.Length-1;i>=0;i--)
        {
            if(deadList[i].ID==Hash)
            {
                dps=deadList[i];
                inList=true;
                deadList.Remove(i,1);
                break;
            }
        }
        //Нету такого игрока в списке - выходим
        if(!inList)
            return;
        //Поменял игрок перк - выходим
        if(dps.OldVeterancy!=KFPlayerReplicationInfo(PC.PlayerReplicationInfo).ClientVeteranSkill.Name)
            return;
        //Начинаем возвращать:
    
        //Удаляем инвентарь
        Inv=PC.Pawn.Inventory;
        while(Inv!=none)
        {
            NextInv=Inv.Inventory;
            PC.Pawn.DeleteInventory(Inv);
            Inv=NextInv;
        }
    
        //Возвращаем пушки
        for(i=0;i<dps.weaponsList.Length;i++)
            PC.Pawn.GiveWeapon(dps.weaponsList[i]);
    
        //Эта версия мутатора не сохраняет количество патронов в пушках. Если надо выдать полные пушки - раскомментируйте AllAmmo
        //AllAmmo(di.PC.Pawn);
    }
    
    /*
    function AllAmmo(Pawn P)
    {
        local Inventory Inv;
        for( Inv=P.Inventory; Inv!=None; Inv=Inv.Inventory )
        {
            if(KFWeapon(Inv)!=None)
                KFWeapon(Inv).MaxOutAmmo();
        }
    }
    */
    

    В комментариях к коду вроде достаточно подробно описан процесс

    Ссылка

    Версия Essence с более аккуратным удалением стартового оружия (что позволяет сохранить уже работающие Item'ы) и восстановлением количества патронов
    Ссылка

    Upd (2020.03.15) Обновил кусок кода отвечающий за удаление Inventory
     
    Последнее редактирование: 16 мар 2020
    Essence нравится это.
  2. w.a.l

    w.a.l Консильери

    Мутатор хороший, но не справедливый. Мало того что он оживает во время волны после таймера смерти, что само по себе не по правилам, так ещё и пушки которые про срал возвращаются. Осталось ещё деньги как компенсацию давать....
     
  3. Serega

    Serega Дон

    и минет делать!
     
  4. gall87

    gall87 Капо

    Флэйм ты супер!
     
  5. STaJIKeR

    STaJIKeR Капо

    Видишь ли, не все понимают смысла KF....
    KF стал чем-то вроде, аркадного шутера на некоторых серверах, стреляй-взрывай-беги....
    Весь смысл серваков.... А не выжить...
     
    HATAXA нравится это.
  6. Flame

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

    Ну я для себя другую реализацию сделаю. Отслеживание вылетов из игры. Вот им я верну пушки, жизнь и деньги. И может ещё что сделаю ))
    Другое дело, что пользователь убив процесс кф сможет сымитировать вылет. Ну посмотрим сколько будет читеров - я то веду статистику по каждому игроку, как часто они вот так неожиданно покидают сервак)
     
  7. Flame

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

    Не. Он никого не оживляет раньше времени. По крайней мере та реализация, которую я тут опубликовал)
     
  8. RaideN-

    RaideN- Игровая Администрация

    А те пушки после смерти игрока пропадают? Или их другие игроки могут своровать?
     
  9. Flame

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

    Пропадают
    Ну можно сделать и чтобы валялись
    Пара строчек кода)
     
  10. w.a.l

    w.a.l Консильери

    Я имел ввиду респаунмут оживления который установлен на 99% серверов
     
  11. STaJIKeR

    STaJIKeR Капо

    99.99%
     
  12. Arckon.

    Arckon. Соучастник

    Глянул.
    Минус в следующем: после смерти стволы возвращаются, но при этом у ожившего игрока в инвентаре стандартный набор уже вместе со стволами, с которыми он погиб. Соответственно, здесь возникает неправильность по весу: вес инвентаря превышает стандартное значение, что не должно быть. :)
     
  13. STaJIKeR

    STaJIKeR Капо

    Ну свою задачу мутатор выполняет... А это уже супер)
     
  14. Arckon.

    Arckon. Соучастник

    Выполняет. Однако, вытекающие последствия неблагоприятные.
     
  15. Essence

    Essence Moderator Команда форума

    Сложно назвать это минусом. Скорее, это уже тонкости использования мутатора.
    Тут уж под себя нужно переделывать, чтобы неблагоприятных последствий не было.
     
  16. Flame

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

    Я сделаю версию, которая просто заменяет пушки
    Это просто была базовая версия, которая возникла в ходе работы над куда более сложным мутатором

    Потом может выложу реализацию, где после смерти игрока остаётся кейс (или другой контейнер) с его пушками, который потом можно будет подобрать, выбрать пушки и т.д.
    Но эт потом
     
    Arckon. и STaJIKeR нравится это.
  17. STaJIKeR

    STaJIKeR Капо

    А вот это было б неплохо)
     
  18. shark_1900

    shark_1900 Бандит

    а мне кажется мутатор какой то халявный)))) по сути если игрока убили... оружки выпали лежат должен сам прорываться + команда должна помочь ему забрать свои оружки))))
     
  19. Flame

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

    Ну как бы от игрового процесса зависит
    Может там смерть настигает в среднем каждые 20-25 секунд
    И постоянные оживления
    Разные ж игровые режимы, разные настройки
    Для классики то да
     
    STaJIKeR и shark_1900 нравится это.
  20. STaJIKeR

    STaJIKeR Капо

    Флейм как всегда прав.
    У каждого сервера свои игровые режимы... Где-то упор на пиф-паф, где-то упор на тимплей...
    ЗЫ!
    На вкус и цвет все фломастеры разные! :D