DropAllWeapon

Тема в разделе "Общего назначения", создана пользователем Dr_Killjoy, 5 май 2012.

  1. KF_Noob

    KF_Noob Новенький

    Ah ok thanks testing now....


    You don't have the game to test it out?

    Ok, so did some testing and it would appear that it only drops the top level melee weapon that you switch to. For example, if you don't have any melee weapons and only a knife, it will only drop the knife. If you have other melee weapons that proceeds the knife, ie you press 1 to pull out your melee weapon and you get a katana or sythe first, since that gets chosen first before your knife, then only that weapon will drop and nothing else, even if you are holding something else when you die, like 9mm which should have been dropped be default because you had it out before you died.

    Also the grenades don't drop *Or* explode if you set bExplodeGrenades=False / True respectively in the DropAllWeapConfig.ini

    Thanks!
     
  2. Essence

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

    Значит, мутатор не работает.
    Ждите, пока я доделаю свою версию.
    Или, возможно, раньше меня это сделает Flame
    Он специалист) :cool:
     
  3. KF_Noob

    KF_Noob Новенький

    Ok thanks, I will wait. Or if waiting is too long, say more than a few months, I will contact Flame and ask him or someone else who knows how to fix this.

    Thanks!
     
  4. Flame

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

    Вдохновлённый версией от Essence накидаю и я свою версию)

    Буду исходить из того, что в инвентаре лежат не только пушки, но и куча всякого полезного
    Выкидывать будем всё нужное

    Настройки:
    Массив CanDropList - тут и содержится информация о том, что мы можем выкидывать
    Применительно к обычному оружию это позволит нам выбрасывать берету (KFMod.Single) или бомбу (KFMod.PipeBombExplosive) - достаточно добавить в ini файл
    Код:
    CanDropList=Single
    CanDropList=PipeBombExplosive
    
    Массив DestroyList - тут содержится информация, что мы не хотим видеть на карте после смерти игрока с "этим" в руках.
    То есть чтобы после игроков не оставались шприцы, сварки и прочие ножики - пишем
    Код:
    DestroyList=Syringe
    DestroyList=Welder
    DestroyList=Knife
    
    Переменная Dispersion - разброс выкидываемого оружия

    Код:
    Код:
    class DropAllInvMut extends Mutator config(DropAllInvMut);
    
    var DropAllInvRules Rules;
    var config array<string> CanDropList;
    var config array<string> DestroyList;
    var config float Dispersion;
    
    function PostBeginPlay()
    {
        SaveConfig();
        if(Rules==None)
            Rules = Spawn(Class'DropAllInvRules');
        Rules.mut=self;
    }
    
    function bool InCanDropList(Inventory Inv)
    {
        local int i;
        for(i=0;i<CanDropList.Length;i++)
        {
            if(string(Inv.Class.Name)~=CanDropList[i])
                return true;
        }
        return false;
    }
    
    function bool InDestroyList(KFWeapon W)
    {
        local int i;
        for(i=0;i<DestroyList.Length;i++)
        {
            if(string(W.Class.Name)~=DestroyList[i])
                return true;
        }
        return false;
    }
    
    defaultproperties
    {
        Dispersion=20.0
    
        DestroyList(0)="Welder"
        DestroyList(1)="Syringe"
        DestroyList(2)="Knife"
    
        CanDropList(0)="Single"
    
        GroupName="KF-DropAllInvMut"
        FriendlyName="Drop All Inventory Mutator"
        Description="When player dies, all his inventory is dropped on the floor"
    }
    
    Код:
    class DropAllInvRules extends GameRules;
    
    var DropAllInvMut 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 Inventory Inv;
        local KFWeapon WeaponInHands;
        local array<Inventory> DropList;
        if(DamageType==None || Killer==None || Killed==None)
        {
            if(NextGameRules!=None)
                return NextGameRules.PreventDeath(Killed, Killer, DamageType, HitLocation);
            return false;
        }
        if(Killed.Controller!=none && Killed.Controller.bIsPlayer)
        {
            //Сохраняем пушку, которая сейчас в руках в отдельную переменную. Если это какая-нибудь сварка - потом эта пушка будет удалена. Сразу не хочу удалять во избежание конфликтов
            WeaponInHands=KFWeapon(Killed.Weapon);
            //
      
            //Цикл по inventory
            for(Inv=Killed.Inventory;Inv!=none;Inv=Inv.Inventory)
            {
                if(CanDropInventory(Inv))
                {
                    //Меняем переменные, которые нам могут как-то помешать выкинуть Inv
                    //Т.к. мы работаем с Inventory, а свойства bCanThrow и bKFNeverThrow принадлежать Weapon и KFWeapon - мы используем SetPropertyText для изменения переменной, если таковая вообще есть
                    Inv.SetPropertyText("bCanThrow","true");
                    Inv.SetPropertyText("bKFNeverThrow","false");
                    //
                    Inv.Velocity=Killed.Velocity;
                    //Сохраняем все inventory, которые выкидываем в отдельный массив, чтобы минимизировать риск конфликта
                    DropList[DropList.Length]=Inv;
                }
            }
            //Выбрасываем пушки и обнуляем массив
            DropItems(DropList,Killed.Location);
            DropList.Length=0;
            //Удаляем сохранённую пушку
            DestroyTrash(WeaponInHands);
        }
        if(NextGameRules!=None)
            return NextGameRules.PreventDeath(Killed, Killer, DamageType, HitLocation);
        return false;
    }
    
    //Выбрасываем пушки
    function DropItems(array<Inventory> DropList, Vector Location)
    {
        local int i;
        for(i=0;i<DropList.Length;i++)
            DropList[i].DropFrom(Location + VRand() * mut.Dispersion);
    }
    
    //Удаляем пушку, если она есть в списке пушек на уничтожения. Сварка, шприц и нож не хотелось бы оставлять на карте
    function DestroyTrash(KFWeapon W)
    {
        if(W!=none && mut.InDestroyList(W))
        {
            W.Destroyed();
            W.Destroy();
        }
    }
    
    //Возвращает true, если мы можем и хотим выбросить на землю weapon или inventory
    function bool CanDropInventory(Inventory Inv)
    {
        //Возможно у нас есть какой-то Inventory (не обязательно оружие), которое мы так же хотим выбрасывать
        //Кроме того здесь мы может позволить выбросить пушки с bKFNeverThrow=true или с bCanThrow=false, например KFMod.Single
        if(mut.InCanDropList(Inv))
            return true;
        //Здесь стандартная проверка на "пушковость" и выбрасываемость)
        if(KFWeapon(Inv)==none)
            return false;
        if(KFWeapon(Inv).bKFNeverThrow)
            return false;
        if(!Weapon(Inv).bCanThrow)
            return false;
    
        return true;
    }
    

    Ссылка
    DropAllInvMut.DropAllInvMut

    Замечание:
    Как всегда почти не тестировал. Вам и проверять)
     
    Последнее редактирование: 6 авг 2019
    VENOM:) и Essence нравится это.