Замена начального оружия

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

Метки:
  1. Flame

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

    Ой ужасы какие ))
    Я сейчас прохожу по всем своим статьям и мутаторам и стараюсь их привести в современный вид
    Этот мутатор просто очень явный кандидат - за реализацию откровенно стыдно :)

    Итак,
    Хотим мы мутатор, который меняет оружие с которым спавнится перк

    Настройки:
    Код:
    [StartWeaponReplaceMut.StartWeaponReplaceMut]
    ReplaceList=(Perk="SRVetBerserker",OldWeapon="KFMod.Knife",newWeapon="KFMod.Katana",Weight=0,bKFNeverThrow=True)
    ReplaceList=(Perk="SRVetSharpshooter",OldWeapon="KFMod.Single",newWeapon="KFMod.MK23Pistol",Weight=0,bKFNeverThrow=False)
    
    Ну всё просто:
    Perk - перк
    OldWeapon - старое оружие в виде строки (полный адрес)
    NewWeapon - новое оружие в виде строки (полный адрес)
    Weight - вес, который мы хотим поставить новой пушке
    bKFNeverThrow - может ли игрок выкидывать эту пушку
    То есть в данном примере мы заменяем нож берсу на катану, вес катаны 0, выбросить её нельзя
    Снайпер получает мк23 вместо беретты, вес мк23 - 0, выбросить можно

    Код:
    Код:
    class StartWeaponReplaceMut extends Mutator config(StartWeaponReplaceMut);
    
    struct ReplaceStructure
    {
        var config string Perk;
        var config string OldWeapon;
        var config string NewWeapon;
        var config int Weight;
        var config bool bKFNeverThrow;
    };
    var config array<ReplaceStructure> ReplaceList;
    var array<KFHumanPawn> PendingPlayers;
    
    function PostBeginPlay()
    {
        SaveConfig();
        class'KFMod.Single'.default.bKFNeverThrow=false;
        Super.PostBeginPlay();
    }
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
        if(KFHumanPawn(Other)!=none)
        {
            PendingPlayers[PendingPlayers.Length] = KFHumanPawn(Other);
            SetTimer(0.2,false);
        }
        return true;
    }
    
    function Timer()
    {
        while( PendingPlayers.Length>0 )
        {
            if( PendingPlayers[0]!=None && PendingPlayers[0].PlayerReplicationInfo.PlayerID>0)
                ReplaceWeapons(PendingPlayers[0]);
            PendingPlayers.Remove(0,1);
        }
    }
    
    function ReplaceWeapons(KFHumanPawn P)
    {
        local KFPlayerReplicationInfo KFPC;
        local Name Veterancy;
        local int i;
        KFPC=KFPlayerReplicationInfo(P.PlayerReplicationInfo);
        Veterancy=KFPC.ClientVeteranSkill.Name;
        for(i=0;i<ReplaceList.Length;i++)
        {
            if(ReplaceList[i].Perk~=string(Veterancy))
            {
                ReplaceWeapon(P,ReplaceList[i].OldWeapon,ReplaceList[i].NewWeapon,ReplaceList[i].Weight,ReplaceList[i].bKFNeverThrow);
            }
        }
    }
    
    function ReplaceWeapon(KFHumanPawn P, string oldWeapon, string newWeapon, int Weight, bool bKFNeverThrow)
    {
        local Inventory inv;
        local KFWeapon W;
        local class<KFWeapon> aClass;
        local bool bHasOldWeapon;
        //Если уже есть такое оружие, то выходим
        if( P!=None && P.Inventory!=None )
        {
            //потом может поправить возможность выкидывать
            for(inv=P.Inventory; inv!=None; inv=inv.Inventory )
            {
                if(string(inv.Class)~=newWeapon)
                    return;
            }
    
            for(inv=P.Inventory; inv!=None; inv=inv.Inventory )
            {
                if(string(inv.Class)~=oldWeapon)
                {
                    inv.Destroy();
                    bHasOldWeapon=true;
                }
            }
            if(!bHasOldWeapon) return;
            aClass = class<KFWeapon>(DynamicLoadObject(newWeapon, class'Class'));
            if(aClass!=None)
            {
                W=Spawn(aClass);
                W.Weight=Weight;
                W.bKFNeverThrow=bKFNeverThrow;
                W.GiveTo(P);
            }
        }
    }
    
    defaultproperties
    {
        ReplaceList(0)=(Perk="SRVetBerserker",OldWeapon="KFMod.Knife",newWeapon="KFMod.Katana",bKFNeverThrow=True,Weight=0)
        ReplaceList(1)=(Perk="SRVetSharpshooter",OldWeapon="KFMod.Single",newWeapon="KFMod.MK23Pistol")
        GroupName="KF-StartWeaponReplace"
        FriendlyName="Start Weapon Replace"
        Description="Replaces weapons"
    }
    

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

    Upd 2017.11.13
    Ссылка на версию Essence (замена одной пушки на несколько)

    Под спойлером старая версия:
    Возникла необходимость в мутаторе по замене оружия с которым спавнится перк
    Что-то я вот написал такое простенькое и корявое - может кому ещё пригодится )

    И вновь картиночка от ExEnSpooT
    [​IMG]

    Параметры в ini файле
    OldWeaponB, NewWeaponB - старое и новое оружие берсерка
    Например, OldWeaponB=KFMod.Knife, NewWeaponB=KFMod.Katana
    То есть вместо ножа у берса будет в руках катана при спавне
    OldWeaponCM,NewWeaponCM - старое и новое оружие коммандоса
    OldWeaponDM,NewWeaponDM - старое и новое оружие подрывника
    OldWeaponM,NewWeaponM - старое и новое оружие медика
    OldWeaponF,NewWeaponF - старое и новое оружие фаера
    OldWeaponSS,NewWeaponSS - старое и новое оружие снайпера
    OldWeaponSP,NewWeaponSP - старое и новое оружие саппа
    bKFNeverThrow - если true, то новое оружие нельзя выкинуть
    Weight - вес нового оружия

    То есть при параметрах
    OldWeaponB=KFMod.Knife, NewWeaponB=KFMod.Katana, bKFNeverThrow=true, Weight=0
    у берса будет катана в руках вместо ножа, её нельзя будет выкинуть и её вес будет 0

    если старое и новое оружие не задаётся для определённого перка, то ничего не происходит для данного перка
    если задаётся только новое оружие, то старое остаётся и добавляется новое (но лучше это делать через SRVet* классы)

    Код:
    Код:
    class StartWeaponsReplaceMut extends Mutator config(StartWeaponsReplaceMut);
    
    var array<KFHumanPawn> PendingPlayers;
    var config string OldWeaponB,NewWeaponB;
    var config string OldWeaponCM,NewWeaponCM;
    var config string OldWeaponDM,NewWeaponDM;
    var config string OldWeaponM,NewWeaponM;
    var config string OldWeaponF,NewWeaponF;
    var config string OldWeaponSS,NewWeaponSS;
    var config string OldWeaponSP,NewWeaponSP;
    var config bool bKFNeverThrow;
    var config int Weight;
    
    function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
    {
        if(Other.IsA('KFHumanPawn'))
        {
            PendingPlayers[PendingPlayers.Length]=KFHumanPawn(Other);
            SetTimer(0.1,false);
        }
        return true;
    }
    
    function Timer()
    {
        local KFPlayerReplicationInfo KFPRI;
        while( PendingPlayers.Length>0 )
        {
            KFPRI=KFPlayerReplicationInfo(PendingPlayers[0].PlayerReplicationInfo);
            if    (
                    KFPRI!=None &&
                    (
                        KFPRI.ClientVeteranSkill.Name == 'SRVetBerserker' ||
                        KFPRI.ClientVeteranSkill.Name == 'KFVetBerserker'
                    )
                )
            {
                ReplaceWeapon(PendingPlayers[0],OldWeaponB,NewWeaponB);
            }
            else if    (
                    KFPRI!=None &&
                    (
                        KFPRI.ClientVeteranSkill.Name == 'SRVetCommando' ||
                        KFPRI.ClientVeteranSkill.Name == 'KFVetCommando'
                    )
                )
            {
                ReplaceWeapon(PendingPlayers[0],OldWeaponCM,NewWeaponCM);
            }
            else if    (
                    KFPRI!=None &&
                    (
                        KFPRI.ClientVeteranSkill.Name == 'SRVetDemolitions' ||
                        KFPRI.ClientVeteranSkill.Name == 'KFVetDemolitions'
                    )
                )
            {
                ReplaceWeapon(PendingPlayers[0],OldWeaponDM,NewWeaponDM);
            }
            else if    (
                    KFPRI!=None &&
                    (
                        KFPRI.ClientVeteranSkill.Name == 'SRVetFieldMedic' ||
                        KFPRI.ClientVeteranSkill.Name == 'KFVetFieldMedic'
                    )
                )
            {
                ReplaceWeapon(PendingPlayers[0],OldWeaponM,NewWeaponM);
            }
            else if    (
                    KFPRI!=None &&
                    (
                        KFPRI.ClientVeteranSkill.Name == 'SRVetFirebug' ||
                        KFPRI.ClientVeteranSkill.Name == 'KFVetFirebug'
                    )
                )
            {
                ReplaceWeapon(PendingPlayers[0],OldWeaponF,NewWeaponF);
            }
            else if    (
                    KFPRI!=None &&
                    (
                        KFPRI.ClientVeteranSkill.Name == 'SRVetSharpshooter' ||
                        KFPRI.ClientVeteranSkill.Name == 'KFVetSharpshooter'
                    )
                )
            {
                ReplaceWeapon(PendingPlayers[0],OldWeaponSS,NewWeaponSS);
            }
            else if    (
                    KFPRI!=None &&
                    (
                        KFPRI.ClientVeteranSkill.Name == 'SRVetSupportSpec' ||
                        KFPRI.ClientVeteranSkill.Name == 'KFVetSupportSpec'
                    )
                )
            {
                ReplaceWeapon(PendingPlayers[0],OldWeaponSP,NewWeaponSP);
            }
            PendingPlayers.Remove(0,1);
        }
    }
    
    function ReplaceWeapon(KFHumanPawn P, string oldWeapon, string newWeapon)
    {
        local Inventory inv;
        local KFWeapon W;
        local class<KFWeapon> aClass;
    
        if( P!=None && P.Inventory!=None )
        {
            for(inv=P.Inventory; inv!=None; inv=inv.Inventory )
            {
                if(string(inv.Class)~=oldWeapon)
                    inv.Destroy();
            }
            aClass = class<KFWeapon>(DynamicLoadObject(newWeapon, class'Class'));
            if(aClass!=None)
            {
                W=Spawn(aClass);
                W.bKFNeverThrow=bKFNeverThrow;
                W.Weight=Weight;
                W.GiveTo(P);
            }
        }
    }
    
    defaultproperties
    {
        Weight=0
        bKFNeverThrow=true
        OldWeaponB="KFMod.Knife"
        NewWeaponB="KFMod.Katana"
        OldWeaponCM=""
        NewWeaponCM=""
        OldWeaponDM=""
        NewWeaponDM=""
        OldWeaponM=""
        NewWeaponM=""
        OldWeaponF=""
        NewWeaponF=""
        OldWeaponSS="KFMod.Single"
        NewWeaponSS="KFMod.Deagle"
        OldWeaponSP=""
        NewWeaponSP=""
        GroupName="KF-Replace"
        FriendlyName="StartWeaponsReplaceMut"
        Description="Replaces base weapons"
        bAddToServerPackages=True
    }

    Ссылка 1 или Ссылка 2
    Добавлять в виде StartWeaponsReplaceMut.StartWeaponsReplaceMut

    Если кто-то хочет предложить то или иное расширение функциональности, то пишите.
    У меня тож есть желание улучшить этот мутатор до чего-нибудь более вменяемого
     
    Последнее редактирование: 13 ноя 2017
    g0dfather, WipeMaster, HATAXA и 10 другим нравится это.
  2. NighTwinteR

    NighTwinteR Соучастник

    глупый вопрос:
    "Добавлять в виде StartWeaponsReplaceMut.StartWeaponsReplaceMut"
    можно конкретнее? я просто не понял куда добавить нужно, пытался в killingfloor.ini добавлять, реакции не последовало, как собственно (абсурдно, но...) и с serverperks.ini.
    или может я дурак?))

    и спасибо!!)
     
  3. Flame

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

    ну если используешь мутатор MutLoader, то в Mutloader.ini
    иначе в скрипт запуска, как-нибудь так:

    ucc server KF-WestLondon.rom?game=KFmod.KFGameType?VACSecured=true?MaxPlayers=6?Mutator=ServerPerksMut.ServerPerksMut,StartWeaponsReplaceMut.StartWeaponsReplaceMut

    а
    ну и вопрос тогда сразу
    а сервер то выделенный или ждущий
    куда ServerPerks вообще добавляется? )

    upd.
    На случай если мутатор добавляется из меню игры - поправил чуток
    Ссылки обновил
     
    Папка01 и ЛОХМАТЫЙ нравится это.
  4. Lexass

    Lexass Капо

    Можно добавить функцию запрета на оружие.(идея вроде норм)
    например Дать Сварочный апарат только Поддержке или Дать Шприц только Медику
    что то типо того.
    думаю некоторым понравится да и так хотя бы какая то хардкорность будет

    Флем а не подскажешь как это осушествить но только в самих перках?
    и добавь пожалуйста функцию замены ВСЕМ перкам одного оружия к примеру
     
    ЛОХМАТЫЙ нравится это.
  5. NighTwinteR

    NighTwinteR Соучастник

    ага уберем шприц, и что ты в соло будешь делать когда у тебя хп кончится? или ты предлагаешь сделать это для суровых игроков которые убивают патра за коммандоса лишь замахнувшись ножом в любую сторону?)))
    идея конечно норм, но вот она подойдет для серверов где минимум играет 2-3 человека 28 часов в сутки 10 дней в неделю, и один из них 100% играет за медика)

    хардкорности можно добавить вот так:
    Маулер + банши + дреад + убрать из магазина все (оставить магазин ради закупа патронов) + добавить РПГ систему (на подобии любой ММО чем выше уровень тем больше и лучше у тебя скиллы, так и тут чем выше уровень тем больше веса может переносить перк и тем больше оружия для своего перка он имеет, к лвл капу игрок будет таскать с собой все вооружения своего перка) + увеличить количество мобов на одну душу (скажем 100 - 200 мобов на одного человека (представть что будет творится на 10 волне при наличии 10-20 человек) + отключить лимит мобов на карте (с 800 до 8000 и более) + для получения уровня поставить Нные параметры (скажем для получения 2 уровня берсерку нужно надамажить 10-15кк (чисто к примеру) + на определенном уровне поставить блокировку прокачки (скажем берсерка) до тех пор пока не прокачаешь до определенного уровня другой перк (скажем медика), а то и 2 - 3 перка.
    ---Хардкора на месяц не прерывного задротствования)
    на крайний случай можно скачать и поставить мутатор Imposible (каждый игрок имеет всего 1 ХП, то есть умирает с одного удара)

    P.S.: крик души))
     
  6. Flame

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

    ну у нас некоторые предлагали убрать шприц и сварку (ну кроме медика и саппа) в магазин и продавать за достаточно большую сумму ))
    но мне что-то не очень эта идея

    1. чтобы убрать, например, сварку у всех кроме саппа - достаточно прописать
    OldWeaponB=KFMod.Welder,..,OldWeaponSS=KFMod.Welder,OldWeaponSP - оставить пустым
    2. в самих перках убирать оружие? не надо там этого делать ) но если очень надо, то можно хоть в AddDefaultInventory
    Там же передаётся Pawn - владелец оружия. Так же устраиваем цикл по его Inventory как и в мутаторе, так же проверяем совпадение названия нужного оружия с оружием в инвентаре и так же зовём Destroy для этого оружия
    3. прописывать всем перкам варианты замены мне уж точно лень - сами предлагайте )
     
  7. warpel

    warpel Солдат

    Вполне отличный мутатор , давно искал что либо подобное. :plus:
     
  8. S.K.A.T.1

    S.K.A.T.1 Солдат

    Что то я не понял прописал вот так
    OldWeaponB=KFMod.Knife
    NewWeaponB=KFMod.Machete
    OldWeaponCM=KFMod.AK47
    NewWeaponCM=KFmod.SCARMK17
    OldWeaponDM=KFMod.M79
    NewWeaponDM=KFMod.M4203
    OldWeaponM=KFMod.MP7M
    NewWeaponM=KFMod.MP5M
    OldWeaponF=KFMod.Single
    NewWeaponF=KFMod.FlareRevolver
    OldWeaponSS=KFMod.Single
    NewWeaponSS=KFMod.MK23
    OldWeaponSP=KFMod.BoomStick
    NewWeaponSP=KFMod.AA12
    bKFNeverThrow=false
    Weight=0
    и ничего не изменилось. Я играю с SP6.1 и без MutLoader создаю ждущий сервер.
    Постоянно путаю ждущий и выделенный сервера извини
     
  9. Flame

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

    временно замени свою версию на эту
    запусти игру и после этого пришли логи сервера (если сервер создаётся прям из игры, то логи в KillingFloor\System лежат. проще всего - кидай все файлы с расширением *.log)
     
    Папка01 нравится это.
  10. Nuton

    Nuton Соучастник

    Ха задумка с Грозы, там вместо одного писталета спавниться два один с прицелом другой с фанарем))) Че то Флейм уже засматриваеться на то что давно уже у других ^^
     
  11. Flame

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

    надо зайти чтоль на грозу хоть раз в жизни
    может какие интересные идеи увижу - сделаю свои версии ))
     
  12. Nuton

    Nuton Соучастник

    Свои версии это уже не то, не нужно просто брать идеи других проектов как то это неправильно... Да и к таму же тут где то было правило на форуме что нельзя выкладывать близко подобные разработки других проектов, ибо тааие раздачи и темы удалялись ранее, щас хз конечно.
     
  13. Dr_Killjoy

    Dr_Killjoy Заблокированные

    В этой идее нет ничего уникального.
     
  14. Flame

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

    Ну я тонко намекнул )
    Что не стоит в мои темах упоминать другие проекты и авторство идей
    Я из всех крупных серверов был только на Санрайзе на протяжении 2х волн )
    Специально не бываю ни у кого, чтобы мог с чистой совестью сказать, что не брал ниоткуда идею )
    Может, конечно, это относилось к этому автору
    Но всёж не надо )
     
    Папка01 нравится это.
  15. denfil777

    denfil777 Капо

    По моему ну никак замена стандартного оружия не может быть идей какого то сЭрвера, реализация в коде - вот в этом плане то еще можно о чем то говорить, а "задумка" сменить\выбросить 9mm пистолет или нож и т.д. у многих возникала еще до появления многих серверов :facepalm: (у меня например сразу после знакомства с игрой).
     
  16. Папка01

    Папка01 ۞ Всевидящее око форума ۞

    Никогда тут на форуме не было никогда правила что нельзя выкладывать близкий по роду контент, и никогда. Ничего. Не удалялось.
    Яркий пример. МеталМедвед делает монтровку для кф. Через меньше чем неделю ОперацияЫ делает монтировку.
    Ничего не происходит. Все просто остается. Ни у кого не припекает по этому поводу.

    Абсолютно.
     
  17. Interneyron

    Interneyron Соучастник

    круто еще бы добавить спавн с оружием на разных уровнях перка.Например что бы можно было поставить теху на 6-м дробовик а на 7-м уже AA12
     
  18. Flame

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

    А что мешает прописать это в SRVet* классах, как все уже годами делают? )
    Для SRVetSupportSpec так, например,
    Код:
    static function AddDefaultInventory(KFPlayerReplicationInfo KFPRI, Pawn P)
    {
    	if ( KFPRI.ClientVeteranSkillLevel == 6 )
    	{
    		KFHumanPawn(P).CreateInventoryVeterancy("KFMod.Shotgun", GetCostScaling(KFPRI, class'ShotgunPickup'));
    	}
    	else if ( KFPRI.ClientVeteranSkillLevel == 7 )
    	{
    		KFHumanPawn(P).CreateInventoryVeterancy("KFMod.AA12AutoShotgun", GetCostScaling(KFPRI, class'AA12Pickup'));
    	}
    }
    
     
    Interneyron нравится это.
  19. Interneyron

    Interneyron Соучастник

    Не все же умеют это прописывать.Просто было бы проще и легче делать это с самого мутатора
     
  20. Flame

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

    Нет это не легче и не проще
    Есть специальный механизм предназначенный для этих целей и не надо его обходить всякими корявыми мутаторами
    Другое дело, если не используется ServerPerks или аналог

    А насчёт не все умеют - так учитесь
    Тут полно тех, кто поможет
    Пару часов можно потратить, если уж взялись делать сервер
     
    Interneyron нравится это.