Всем привет. Нашел на днях отличный мутатор добавляющий разнообразия в игру: http://steamcommunity.com/sharedfiles/filedetails/?id=133208121 Но с этим мутатором не появляется патриарх в конце! Как и с версией под 1062 на сайте Трипвайера: http://forums.tripwireinteractive.c...iscussion-aa/90428-mutator-random-season-zeds Плюс в ней еще и зомби не заменяются если ставить ее на 1065... В общем хотелось бы попросить знающих в кодинге под Killing Floor подправить этот мутатор. Прикрепил версию со Стима. Она хотя бы работает наполовину с версией 1065 =)
А не проще ли это сделать через 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
Может и проще, я не в курсе. Я буквально пару дней назад запустил свой сервер Killing Floor. Только как говорится немного разобрался что к чему. Модернизировать или создавать мутаторы, как в прочем заниматься тонкой настройкой сервера я пока не умею. Я по CS 1.6 много лет специализировался, в том числе и плагины свои делал. А Killing Floor для меня пока темный лес =)
Ничего не нужно создавать или модернизировать) За тебя уже всё сделали) твое дело только в конфигах мобов прописать.
Правда там почему-то нет цирковых зомби, хотя код для них включён в пакет Поправил мутатор: 1. Добавил цирковых зомби 2. Поправил общий подход к получению случайного сквада 3. Вытащил настройку bMix в ini файл (в базовом мутаторе эту настройку надо править в killingfloor.ini) Если bMix=true, то кроме обычных ивентовских зомби появляется ещё извратная Mix версия, где тела зомбиков перемешаны (сирена ходит с фигурой патриарха и т.д) Ссылка RandomSeasonZeds.RandomSeasonZeds Чуток видео
Он появляется, но не всегда а только когда сработало какое-либо условие на замену. Стандартный не появляется, тупо нет босса в конце. Спасибо, но я уже сам все допилил =) Тоже вынес настройки в .INI отдельный + добавил настроек на каждый вид зомби. Выкинул все классы что были с мутатором в комплекте. Облегчил его с 40 до 10КБ. Также сделал настройку на выставления случайного патриарха или только обычного =) А также выставил bAddToServerPackages=False, так как это чисто серверный мутатор. Нечего его скачивать зря. С одной стороны хорошо что ты сразу не ответил. Был стимул самому все изучить.
А. Ну правильно - 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") и босса не будет.