Random Season Zeds

Тема в разделе "Мутаторы", создана пользователем Maksovich, 3 фев 2017.

  1. Maksovich

    Maksovich Соучастник

    Всем привет. Нашел на днях отличный мутатор добавляющий разнообразия в игру:
    http://steamcommunity.com/sharedfiles/filedetails/?id=133208121

    Но с этим мутатором не появляется патриарх в конце! Как и с версией под 1062 на сайте Трипвайера:
    http://forums.tripwireinteractive.c...iscussion-aa/90428-mutator-random-season-zeds

    Плюс в ней еще и зомби не заменяются если ставить ее на 1065...

    В общем хотелось бы попросить знающих в кодинге под Killing Floor подправить этот мутатор.
    Прикрепил версию со Стима. Она хотя бы работает наполовину с версией 1065 =)
     

    Вложения:

  2. RaideN-

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

    А не проще ли это сделать через MonsterConfig ? Просто создавая отряды из разных евентовских мобов.
    Пример:

    Код:
    [ClotHW MCMonsterInfo]
    MonsterClass=class'KFChar.ZombieClot_HALLOWEEN'
    MonsterName=Clot_Halloween
    
    [ClotXM MCMonsterInfo]
    MonsterClass=class'KFChar.ZombieCLot_XMas'
    MonsterName=Clot_Xmas
    
    [ClotCR MCMonsterInfo]
    MonsterClass=class'KFChar.ZombieClot_CIRCUS'
    MonsterName=Clot_Circus
     
  3. Maksovich

    Maksovich Соучастник

    Может и проще, я не в курсе. Я буквально пару дней назад запустил свой сервер Killing Floor. Только как говорится немного разобрался что к чему. Модернизировать или создавать мутаторы, как в прочем заниматься тонкой настройкой сервера я пока не умею. Я по CS 1.6 много лет специализировался, в том числе и плагины свои делал. А Killing Floor для меня пока темный лес =)
     
    Последнее редактирование: 3 фев 2017
  4. RaideN-

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

    Ничего не нужно создавать или модернизировать) За тебя уже всё сделали) твое дело только в конфигах мобов прописать.
     
  5. Flame

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

    Тот мутатор что ты прикрепил отлично у меня работает
    И босс появляется и зомби заменяются)
     
  6. Flame

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

    Правда там почему-то нет цирковых зомби, хотя код для них включён в пакет
    Поправил мутатор:
    1. Добавил цирковых зомби
    2. Поправил общий подход к получению случайного сквада
    3. Вытащил настройку bMix в ini файл (в базовом мутаторе эту настройку надо править в killingfloor.ini)
    Если bMix=true, то кроме обычных ивентовских зомби появляется ещё извратная Mix версия, где тела зомбиков перемешаны (сирена ходит с фигурой патриарха и т.д)

    Ссылка
    RandomSeasonZeds.RandomSeasonZeds

    Чуток видео
     
  7. Maksovich

    Maksovich Соучастник

    Он появляется, но не всегда а только когда сработало какое-либо условие на замену. Стандартный не появляется, тупо нет босса в конце.

    Спасибо, но я уже сам все допилил =) Тоже вынес настройки в .INI отдельный + добавил настроек на каждый вид зомби. Выкинул все классы что были с мутатором в комплекте. Облегчил его с 40 до 10КБ. Также сделал настройку на выставления случайного патриарха или только обычного =) А также выставил bAddToServerPackages=False, так как это чисто серверный мутатор. Нечего его скачивать зря. С одной стороны хорошо что ты сразу не ответил. Был стимул самому все изучить. :)
     
    Последнее редактирование модератором: 12 фев 2017
    Flame нравится это.
  8. Flame

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

    А. Ну правильно - GetReplaceClass не возвращает никакого значения в случае стандартных зомбиков
    Допиши в конце return MC;
    Потестил - все патрики есть

    Код мутатора:
    Код:
    class RandomSeasonZeds extends Mutator config(RandomSeasonZeds);
    
    var config bool bMix;
    
    function PostBeginPlay()
    {
        SetTimer(0.1,false);
    }
    
    function Timer()
    {
        local KFGameType KF;
        local int i,j;
        local class<KFMonstersCollection> MC;
    
        KF = KFGameType(Level.Game);
        if ( KF!=None )
        {
            for( i=0; i<KF.InitSquads.Length; i++ )
            {
                for( j=0; j<KF.InitSquads[i].MSquad.Length; j++ )
                    KF.InitSquads[i].MSquad[j] = GetReplaceClass(KF.InitSquads[i].MSquad[j]);
            }
            for( i=0; i<KF.SpecialSquads.Length; i++ )
            {
                for( j=0; j<KF.SpecialSquads[i].ZedClass.Length; j++ )
                    ReplaceMonsterStr(KF.SpecialSquads[i].ZedClass[j]);
            }
            for( i=0; i<KF.FinalSquads.Length; i++ )
            {
                for( j=0; j<KF.FinalSquads[i].ZedClass.Length; j++ )
                    ReplaceMonsterStr(KF.FinalSquads[i].ZedClass[j]);
            }
            KF.FallbackMonster = GetReplaceClass( Class<KFMonster>(KF.FallbackMonster) );
            ReplaceMonsterStr(KF.EndGameBossClass);
            MC = KF.MonsterCollection;
            if( MC!=None )
            {
                ReplaceMonsterStr(MC.Default.EndGameBossClass);
                for( i=0; i<MC.Default.SpecialSquads.Length; i++ )
                {
                    for( j=0; j<MC.Default.SpecialSquads[i].ZedClass.Length; j++ )
                        ReplaceMonsterStr(MC.Default.SpecialSquads[i].ZedClass[j]);
                }
                for( i=0; i<MC.Default.FinalSquads.Length; i++ )
                {
                    for( j=0; j<MC.Default.FinalSquads[i].ZedClass.Length; j++ )
                        ReplaceMonsterStr(MC.Default.FinalSquads[i].ZedClass[j]);
                }
            }
        }
        Destroy();
    }
    
    final function Class<KFMonster> GetReplaceClass( Class<KFMonster> MC )
    {
        local float seasonChoice;
        seasonChoice=FRand();
        if(seasonChoice<=0.25)
        {
            switch( MC )
            {
            case Class'ZombieClot_STANDARD':
                return Class'ZombieClot_XMas';
            case Class'ZombieBloat_STANDARD':
                return Class'ZombieBloat_XMas';
            case Class'ZombieCrawler_STANDARD':
                return Class'ZombieCrawler_XMas';
            case Class'ZombieStalker_STANDARD':
                return Class'ZombieStalker_XMas';
            case Class'ZombieSiren_STANDARD':
                return Class'ZombieSiren_XMas';
            case Class'ZombieHusk_STANDARD':
                return Class'ZombieHusk_XMas';
            case Class'ZombieScrake_STANDARD':
                return Class'ZombieScrake_XMas';
            case Class'ZombieFleshPound_STANDARD':
                return Class'ZombieFleshPound_XMas';
            case Class'ZombieGorefast_STANDARD':
                return Class'ZombieGorefast_XMas';
            case Class'ZombieBoss_STANDARD':
                return Class'ZombieBoss_XMas';
            default:
                return MC;
            }
        }
        else if(seasonChoice<=0.50)
        {
            switch( MC )
            {
            case Class'ZombieClot_STANDARD':
                return Class'ZombieClot_CIRCUS';
            case Class'ZombieBloat_STANDARD':
                return Class'ZombieBloat_CIRCUS';
            case Class'ZombieCrawler_STANDARD':
                return Class'ZombieCrawler_CIRCUS';
            case Class'ZombieStalker_STANDARD':
                return Class'ZombieStalker_CIRCUS';
            case Class'ZombieSiren_STANDARD':
                return Class'ZombieSiren_CIRCUS';
            case Class'ZombieHusk_STANDARD':
                return Class'ZombieHusk_CIRCUS';
            case Class'ZombieScrake_STANDARD':
                return Class'ZombieScrake_CIRCUS';
            case Class'ZombieFleshPound_STANDARD':
                return Class'ZombieFleshPound_CIRCUS';
            case Class'ZombieGorefast_STANDARD':
                return Class'ZombieGorefast_CIRCUS';
            case Class'ZombieBoss_STANDARD':
                return Class'ZombieBoss_CIRCUS';
            default:
                return MC;
            }
        }
        else if(seasonChoice<=0.75)
        {
            switch( MC )
            {
            case Class'ZombieClot_STANDARD':
                return Class'ZombieClot_HALLOWEEN';
            case Class'ZombieBloat_STANDARD':
                return Class'ZombieBloat_HALLOWEEN';
            case Class'ZombieCrawler_STANDARD':
                return Class'ZombieCrawler_HALLOWEEN';
            case Class'ZombieStalker_STANDARD':
                return Class'ZombieStalker_HALLOWEEN';
            case Class'ZombieSiren_STANDARD':
                return Class'ZombieSiren_HALLOWEEN';
            case Class'ZombieHusk_STANDARD':
                return Class'ZombieHusk_HALLOWEEN';
            case Class'ZombieScrake_STANDARD':
                return Class'ZombieScrake_HALLOWEEN';
            case Class'ZombieFleshPound_STANDARD':
                return Class'ZombieFleshPound_HALLOWEEN';
            case Class'ZombieGorefast_STANDARD':
                return Class'ZombieGorefast_HALLOWEEN';
            case Class'ZombieBoss_STANDARD':
                return Class'ZombieBoss_HALLOWEEN';
            default:
                return MC;
            }
        }
        else if( bMix && FRand() <= 0.20 )
        {
            switch( MC )
            {
            case Class'ZombieClot_STANDARD':
                return Class'ZombieClotMix';
            case Class'ZombieBloat_STANDARD':
                return Class'ZombieBloatMix';
            case Class'ZombieCrawler_STANDARD':
                return Class'ZombieCrawlerMix';
            case Class'ZombieStalker_STANDARD':
                return Class'ZombieStalkerMix';
            case Class'ZombieSiren_STANDARD':
                return Class'ZombieSirenMix';
            case Class'ZombieScrake_STANDARD':
                return Class'ZombieScrakeMix';
            case Class'ZombieFleshPound_STANDARD':
                return Class'ZombieFleshPoundMix';
            case Class'ZombieGorefast_STANDARD':
                return Class'ZombieGoreFastMix';
            case Class'ZombieBoss_STANDARD':
                return Class'ZombieBossMix';
            default:
                return MC;
            }
        }
        return MC;
    }
    
    final function ReplaceMonsterStr( out string MC )
    {
        MC = string(GetReplaceClass(Class<KFMonster>(DynamicLoadObject(MC,Class'Class'))));
    }
    
    static function FillPlayInfo(PlayInfo PlayInfo)
    {
        Super.FillPlayInfo(PlayInfo);
        PlayInfo.AddSetting(default.RulesGroup, "bMix", "Mix Zeds", 0, 1, "Check");
    }
    
    defaultproperties
    {
        GroupName="KF-RandomSeasonZeds"
        FriendlyName="Random Season Mode!"
        Description="Give specimen Random Season Models + Mix Zeds"
    }
    

    Насчёт чисто серверного - он чисто серверный в том случае если убрать оттуда код для цирковых зомби
    Видимо эти файлы были добавлены в те времена, когда TWI убрали из ресурсов цирковых зомби

    Если же файлы оставить, то он именно их примет за код цирковых, а если ты уберёшь закачку в кэш, то на клиенте эти зомби будут невидимые, ибо код то только на сервере

    Возможно ты в теме, но мало ли - многие горят на том, что убирают закачку в кэш, а потом не понимают чего ж оно не работает

    Upd. Стало интересно - почему обычные сквады без исправления мутатора всё же появляются.
    Функция GetReplaceClass возвращает класс KFMonster на замену существующему.
    Обычные сквады - массивы классов. Если функция не возвращает никаких значений, то значение класса не меняется при попытке присвоения (не знал этого, думал None присвоится, хотя может и идёт попытка присвоить None, но этого не происходит).

    А в случае босса и спец сквадов - информация хранится в строке и после попытки замены и невозвращённого значения, мы получим пустую строчку (ну точнее строку "None") и босса не будет.
     
    Последнее редактирование: 12 фев 2017
    USF нравится это.