Автовыкидывание оружия при несовпадении условий

Автовыкидывание оружия при несовпадении условий

  • Тема закрыта
  • Вы не можете ответить в тему

Автовыкидывание оружия при несовпадении условий Автовыкидывание оружия при несовпадении условий Мутатор выкидывания оружия, если игрок не отвечает определённым критериям. Например, выкидывание оружия чужого перка или выкидывание спец пушек, для которых надо обладат...

Geekrainian #1

    • Группа: Администратор
    • Сообщений: 800

    Отправлено:

    Автовыкидывание оружия при несовпадении условий

    Мутатор выкидывания оружия, если игрок не отвечает определённым критериям.
    Например, выкидывание оружия чужого перка или выкидывание спец пушек, для которых надо обладать определённым уровнем и/или перка.
    Оружие выкидывается перед игроком на определённом расстоянии.

    Настройки в ini файле:

    WeaponInfoList=(Perk="SRVetBerserker",Level=4,Weapon="KFMod.Katana") - элемент основного массива
    Weapon - код пушки (полный - пакет.оружие)
    Perk -  перк обладателю которого позволено владеть данной пушкой (если написать Perk="", то важен только уровень - перк любой)
    Level - уровень начиная с которого можно владеть оружием
    
    То есть если мы хотим, чтобы катана у всех перков кроме берсеркера 4+ уровня выпадала - пишем то, что написано выше
    Если мы хотим чтобы все перки до 6 выкидывали катану - пишем
    WeaponInfoList=(Perk="",Level=6,Weapon="KFMod.Katana")
    Если же мы хотим, чтобы катаной могли владеть берс начиная с 4 уровня и медик начиная с 8 уровня, то создаём ещё один элемента массива:
    WeaponInfoList=(Perk="SRVetFieldMedic",Level=8,Weapon="KFMod.Katana")
    При такой настройке катана будет у 4+ берса и 8+ медика, у остальных она будет выпадать
    
    Ну вроде самое сложное отписал. Если что непонятно - спрашивайте в комментариях.
    Остальные настройки:
    
    ExceptionList=76561198044444444  - массив игроков на которых мутатор не действует
    bAdminInExceptionList=false - принадлежат ли админы к исключениям? если true, то на всех кто сейчас находится под админкой мутатор не действует
    TimerPeriod=2.000000 - период таймера в секундах, который осуществляет проверку легитимности)
    bDestroy=True - некоторые пушки нельзя выкинуть, если значение этого параметра true - значит такие пушки просто будут уничтожаться
    ThrowDistance=100 - расстояние на которое выбрасываются пушки впереди игрока
    bSendInfoMessage=True - пишем ли мы сообщение игроку о выбрасывании пушки
    MSG_Drop=Your perk and/or level is not good enough to possess - само сообщение. в конце данного сообщения автоматически добавляется название пушки (Weapon.ItemName)

    Мутатор:

    class DropWeaponsMut extends Mutator config(DropWeaponsMut);
    
    // Мутатор выкидывает упомянутое в ini оружие, если не выполнены условия по уровню и/или перку.
    struct WeaponInfoStruct
    {
        var() globalconfig string Perk;
        var() globalconfig int Level;
        var() globalconfig string Weapon;
    };
    
    var() globalconfig array<WeaponInfoStruct> WeaponInfoList;
    var() globalconfig array<string> ExceptionList;
    var() globalconfig bool bAdminInExceptionList;
    var() globalconfig float TimerPeriod;
    var() globalconfig bool bDestroy;
    var() globalconfig int ThrowDistance;
    var() globalconfig bool bSendInfoMessage;
    var() globalconfig string MSG_Drop;
    
    function PostBeginPlay()
    {
        SaveConfig();
        SetTimer(TimerPeriod, true);
    }
    
    function Timer()
    {
        local Controller C;
    
        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
            if (C.IsA('PlayerController') && C.Pawn != None)
                ModifyPawn(C.Pawn);
        }
    }
    
    // Клиент: не оставить игрока без оружия после выброса.
    simulated function Tick(float Delta)
    {
        local PlayerController PC;
    
        PC = Level.GetLocalPlayerController();
        if (PC != None && PC.Pawn != None && PC.Pawn.Weapon == None)
            PC.SwitchToBestWeapon();
    }
    
    function ModifyPawn(Pawn Other)
    {
        local Inventory Inv;
    
        if (Other == None || Other.Inventory == None)
            return;
        for (Inv = Other.Inventory; Inv != None; Inv = Inv.Inventory)
        {
            if (InDropList(Inv, Other) && !InExceptionList(Other.Controller))
                DropOrDestroy(Inv, Other);
        }
    }
    
    function bool InDropList(Inventory Inv, Pawn Other)
    {
        local int i;
        local int cLevel;
        local string Veterancy;
        local int InList, ReturnTrue;
        local KFPlayerReplicationInfo KFPRI;
    
        KFPRI = KFPlayerReplicationInfo(Other.PlayerReplicationInfo);
        if (KFPRI != None)
        {
            cLevel = KFPRI.ClientVeteranSkillLevel;
            Veterancy = string(KFPRI.ClientVeteranSkill.Name);
        }
        for (i = 0; i < WeaponInfoList.Length; i++)
        {
            if (string(Inv.Class) ~= WeaponInfoList[i].Weapon)
            {
                InList++;
                if (
                    (WeaponInfoList[i].Perk != "" && Veterancy != WeaponInfoList[i].Perk)
                    || cLevel < WeaponInfoList[i].Level)
                {
                    ReturnTrue++;
                }
            }
        }
        if (InList > 0 && ReturnTrue == InList)
            return true;
        return false;
    }
    
    function DropOrDestroy(Inventory Inv, Pawn Other)
    {
        if (KFWeapon(Inv) == None)
            return;
        if (!KFWeapon(Inv).bKFNeverThrow)
        {
            if (PlayerController(Other.Controller) != None && bSendInfoMessage)
                PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
            Inv.DropFrom(Other.Location + vector(Other.Rotation) * ThrowDistance);
        }
        else if (bDestroy)
        {
            if (PlayerController(Other.Controller) != None && bSendInfoMessage)
                PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
            Inv.Destroy();
        }
    }
    
    function bool InExceptionList(Controller C)
    {
        local PlayerController PC;
        local int i;
        local string Hash;
    
        PC = PlayerController(C);
        if (PC == None)
            return true;
        if (bAdminInExceptionList && C.PlayerReplicationInfo.bAdmin)
            return true;
        Hash = PC.GetPlayerIDHash();
        for (i = 0; i < ExceptionList.Length; i++)
        {
            if (ExceptionList[i] ~= Hash)
                return true;
        }
        return false;
    }
    
    defaultproperties
    {
        ExceptionList(0)="76561198044444444"
        WeaponInfoList(0)=(Weapon="KFMod.Katana",Perk="SRVetBerserker",Level=4)
        WeaponInfoList(1)=(Weapon="KFMod.Deagle",Perk="SRVetSharpshooter",Level=4)
        WeaponInfoList(2)=(Weapon="KFMod.Katana",Perk="SRVetFieldMedic",Level=8)
        bSendInfoMessage=true
        MSG_Drop="Your perk and/or level is not good enough to possess"
        bDestroy=true
        bAdminInExceptionList=false
        TimerPeriod=2.0
        ThrowDistance=100
        bAddToServerPackages=True
        GroupName="KF-DropWeapons"
        FriendlyName="DropWeapons"
        Description="DropWeapons"
        bAlwaysRelevant=True
        RemoteRole=ROLE_SimulatedProxy
    }

    Путь к мутатору:

    DropWeaponsMut.DropWeaponsMut

    Скомпилированная версия: https://yadi.sk/d/PdqXk-b_dpfCo

    Написал я этот мутатор и подумал
    А ведь тому, кто меня просил небось просто нужен был мутатор, который выкидывает пушки чужого перка
    Он же задерётся вбивать все пушки в инишник)
    И сделал урезанную версию того же самого мутатора без всяких списков. Тупо проверяющую индекс перка и индекс пушки

    Итак, мутатор выкидывает пушки принадлежащие чужому перку

    Настройки в ini файле:

    ExceptionList=76561198044444444  - массив игроков на которых мутатор не действует
    bAdminInExceptionList=false - принадлежат ли админы к исключениям? если true, то на всех кто сейчас находится под админкой мутатор не действует
    TimerPeriod=1.000000 - период таймера в секундах, который осуществляет проверку легитимности)
    bDestroy=True - некоторые пушки нельзя выкинуть, если значение этого параметра true - значит такие пушки просто будут уничтожаться
    ThrowDistance=100 - расстояние на которое выбрасываются пушки впереди игрока
    bSendInfoMessage=True - пишем ли мы сообщение игроку о выбрасывании пушки
    MSG_Drop=You have wrong perk to possess - само сообщение. в конце данного сообщения автоматически добавляется название пушки (Weapon.ItemName)

    Мутатор:

    class DropNonPerkWeaponsMut extends Mutator config(DropNonPerkWeaponsMut);
    
    // Мутатор выкидывает оружие других перков (упрощённая схема по индексу перка).
    var() globalconfig array<string> ExceptionList;
    var() globalconfig bool bAdminInExceptionList;
    var() globalconfig float TimerPeriod;
    var() globalconfig bool bDestroy;
    var() globalconfig int ThrowDistance;
    var() globalconfig bool bSendInfoMessage;
    var() globalconfig string MSG_Drop;
    
    function PostBeginPlay()
    {
        SaveConfig();
        SetTimer(TimerPeriod, true);
    }
    
    function Timer()
    {
        local Controller C;
    
        for (C = Level.ControllerList; C != None; C = C.NextController)
        {
            if (C.IsA('PlayerController') && C.Pawn != None)
                ModifyPawn(C.Pawn);
        }
    }
    
    simulated function Tick(float Delta)
    {
        local PlayerController PC;
    
        PC = Level.GetLocalPlayerController();
        if (PC != None && PC.Pawn != None && PC.Pawn.Weapon == None)
            PC.SwitchToBestWeapon();
    }
    
    function ModifyPawn(Pawn Other)
    {
        local Inventory Inv;
    
        if (Other == None || Other.Inventory == None)
            return;
        for (Inv = Other.Inventory; Inv != None; Inv = Inv.Inventory)
        {
            if (InDropList(Inv, Other) && !InExceptionList(Other.Controller))
                DropOrDestroy(Inv, Other);
        }
    }
    
    function bool InDropList(Inventory Inv, Pawn Other)
    {
        local int cLevel;
        local string Veterancy;
        local KFPlayerReplicationInfo KFPRI;
        local int PerkIndex;
    
        if (KFWeapon(Inv) == None)
            return false;
        KFPRI = KFPlayerReplicationInfo(Other.PlayerReplicationInfo);
        if (KFPRI != None)
        {
            cLevel = KFPRI.ClientVeteranSkillLevel;
            Veterancy = string(KFPRI.ClientVeteranSkill.Name);
            PerkIndex = KFPRI.ClientVeteranSkill.default.PerkIndex;
        }
        if (PerkIndex != class<KFWeaponPickup>(KFWeapon(Inv).PickupClass).default.CorrespondingPerkIndex)
            return true;
        return false;
    }
    
    function DropOrDestroy(Inventory Inv, Pawn Other)
    {
        if (KFWeapon(Inv) == None)
            return;
        if (!KFWeapon(Inv).bKFNeverThrow)
        {
            if (PlayerController(Other.Controller) != None && bSendInfoMessage)
                PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
            Inv.DropFrom(Other.Location + vector(Other.Rotation) * ThrowDistance);
        }
        else if (bDestroy)
        {
            if (PlayerController(Other.Controller) != None && bSendInfoMessage)
                PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
            Inv.Destroy();
        }
    }
    
    function bool InExceptionList(Controller C)
    {
        local PlayerController PC;
        local int i;
        local string Hash;
    
        PC = PlayerController(C);
        if (PC == None)
            return true;
        if (bAdminInExceptionList && C.PlayerReplicationInfo.bAdmin)
            return true;
        Hash = PC.GetPlayerIDHash();
        for (i = 0; i < ExceptionList.Length; i++)
        {
            if (ExceptionList[i] ~= Hash)
                return true;
        }
        return false;
    }
    
    defaultproperties
    {
        ExceptionList(0)="76561198044444444"
        bSendInfoMessage=true
        MSG_Drop="You have wrong perk to possess"
        bDestroy=false
        bAdminInExceptionList=false
        TimerPeriod=1.0
        ThrowDistance=150
        bAddToServerPackages=True
        GroupName="KF-DropNonPerkWeapons"
        FriendlyName="DropNonPerkWeaponsMut"
        Description="DropNonPerkWeaponsMut"
        bAlwaysRelevant=True
        RemoteRole=ROLE_SimulatedProxy
    }

    Путь к мутатору:

    DropNonPerkWeaponsMut.DropNonPerkWeaponsMut

    Скомпилированная версия: https://yadi.sk/d/FzmWo6KNdpfUH

    P.S.
    Оба мутатора чуток спамят в лог при выкидывании пушек. Потом поправлю.

    Warning: DropWeaponsMut KF-Meow-NewYearFix.DropWeaponsMut (Function DropWeaponsMut.DropWeaponsMut.ModifyPawn:008A) Accessed None 'Inv'

    Автор: Flame

    Назад