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

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

  1. shark_1900

    shark_1900 Бандит

    тут дело не в правоте а всего лишь высказывание про гемплей)))
     
  2. Фрэгл

    Фрэгл Administrator

    Любой мутатор-это своего рода ЧИТ (исправить готовый продукт под Себя).
    Вопрос лишь в том,насколько и зачем.
     
    Essence и STaJIKeR нравится это.
  3. Essence

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

    Что ж, Flame обновил код и пофиксил баг с удалением только одного предмета, а не всего инвентаря.
    А я решил добавить возврат патронов.

    Настройки:
    bRestoreAmmo - Если True, то возвращаем и патроны тоже.

    Код с комментариями:
    Код:
    Class RecoverWeaponsMut extends Mutator Config(RecoverWeaponsMut);
    
    var config bool bRestoreAmmo;
    var RecoverWeaponsRules Rules;
    
    // Спавним правила
    function PostBeginPlay()
    {
        if(Rules==None)
            Rules=Spawn(Class'RecoverWeaponsRules');
        Rules.Mut=Self;
    }
    
    // Отслеживаем появление тела игрока
    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="RecoverWeaponsMut"
        Description="Returns inventory to a deceased player."
    }
    Код:
    class RecoverWeaponsRules extends GameRules;
    
    // Структуры и массивы с информацией об умершем игроке
    struct AmmunitionStruct
    {
        var int OldAmmoAmount;
        var string OldAmmunition;
    };
    
    struct DeadPlayersStruct
    {
        var string PlayerID;
        var Name OldVeterancy;
        var array<string> WeaponsList;
        var array<AmmunitionStruct> AmmunitionsList;
    };
    var array<DeadPlayersStruct> DeadList;
    
    var RecoverWeaponsMut Mut; // Ссылка на мут
    
    // Стандартные функции
    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 AmmunitionStruct AS;
        local Inventory Inv;
        if(Killed!=None && Killed.IsA('KFHumanPawn') && Killed.Controller!=None && Killed.Controller.IsA('PlayerController'))
        {
            // Сохраняем информацию об его оружии и текущем перке
            DPS.PlayerID=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);
                }
                // Essence. Если bRestoreAmmo в настройках True, то сохраняем информацию и о патронах
                if(Mut.bRestoreAmmo && Ammunition(Inv)!=None)
                {
                    AS.OldAmmunition=string(Inv.Class);
                    AS.OldAmmoAmount=Ammunition(Inv).AmmoAmount;
                    DPS.AmmunitionsList[DPS.AmmunitionsList.Length]=AS;
                }
                //
            }
            DPS.OldVeterancy=KFPlayerReplicationInfo(Killed.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 Inventory Inv, NextInv;
        local DeadPlayersStruct DPS;
        local bool InList;
        local string Hash;
        local int i;
        Hash=PC.GetPlayerIDHash();
        // Ищем игрока в списке принявших смерть
        for(i=0; i<DeadList.Length; i++)
        {
            if(DeadList[i].PlayerID~=Hash)
            {
                DPS=DeadList[i];
                InList=True;
                DeadList.Remove(i,1);
                Break;
            }
        }
        // Нет такого игрока в списке - выходим
        if(!InList)
            Return;
        // Игрок поменял перк - выходим
        if(DPS.OldVeterancy!=KFPlayerReplicationInfo(PC.PlayerReplicationInfo).ClientVeteranSkill.Name)
            Return;
        // Начинаем возвращать:
    
        // Flame. Безопасно (!) удаляем пушки и принадлежащий им боезапас
        Inv=PC.Pawn.Inventory;
        While(Inv!=None)
        {
            NextInv=Inv.Inventory;
            if(Weapon(Inv)!=None || Ammunition(Inv)!=None)
                PC.Pawn.DeleteInventory(Inv);
            Inv=NextInv;
        }
        // Возвращаем пушки
        for(i=0; i<DPS.WeaponsList.Length; i++)
            PC.Pawn.GiveWeapon(DPS.WeaponsList[i]);
        // Essence. Если bRestoreAmmo в настройках True, то возвращаем и патроны
        if(Mut.bRestoreAmmo)
        {
            for(Inv=PC.Pawn.Inventory; Inv!=None; Inv=Inv.Inventory)
            {
                if(Ammunition(Inv)!=None)
                    ReturnAmmo(DPS, Ammunition(Inv));
            }
        }
    }
    
    function ReturnAmmo(DeadPlayersStruct DPS, Ammunition A)
    {
        local int i;
        for(i=0; i<DPS.AmmunitionsList.Length; i++)
        {
            if(string(A.Class)~=DPS.AmmunitionsList[i].OldAmmunition)
            {
                A.AmmoAmount=DPS.AmmunitionsList[i].OldAmmoAmount;
                DPS.AmmunitionsList.Remove(i,1);
                Return;
            }
        }
    }

    Скачать:
    Ссылка
     
    RaideN- и Flame нравится это.