Экспорт монстров и оружия в собственные мутаторы
Всё ниже написанное будет ещё неоднократно исправляться и оформляться...
Модель оружия, открытая в браузере Animations редактора KF Editor.
Некоторое время назад описывалось, как переносить оружие или монстров из мутатора в мутатор.
Перенос оружия из мутатора в мутатор
Рассмотрим ситуацию на примере NovaSix из hiyokomod, когда мы не хотим вытаскивать анимацию, текстуры, статик меши и звуки из пакетов hiyokomod и вставлять в собственные пакеты.
Окидываем взглядом содержание файлов NovaSix\*.uc и видим что нам не хватает ещё AntiSirenNade.uc и DamTypeAcid.uc.
Шаг 1: Копирование файлов
Берём эти 9 файлов и кидаем, например, в ServerPerksV5 (для простоты будем рассматривать ситуацию, когда всё в 1 папке, как в версиях до 5.10).
Шаг 2: Замена префиксов пакетов
Теперь во всех этих 9 файлах заменяем hiyokomod. на ServerPerksV5. (на самом деле придётся заменять в 6 файлах).
Шаг 3: Настройка зависимостей от перков
unrealscript
function projectile SpawnProjectile(Vector Start, Rotator Dir)
{
local KFPlayerReplicationInfo KFPRI;
KFPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo);
if (KFPRI != none)
{
if (KFPRI.ClientVeteranSkill == Class'hiyokoPerksScientist')
ProjectileClass=Class'ServerPerksV5.NovaSixProj';
}
else
ProjectileClass=Class'KFMod.M79GrenadeProjectile';
return Super.SpawnProjectile(Start,Dir);
}
Здесь мы в зависимости от перка стреляем либо гранатой NovaSix, либо обычной гранатой из M79. Так как в ServerPerks нет перка Учёный, то можем сделать, например, чтобы медик мог стрелять из NovaSix, а для остальных выстрел был бы гранатами M79.
unrealscript
function projectile SpawnProjectile(Vector Start, Rotator Dir)
{
local KFPlayerReplicationInfo KFPRI;
KFPRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo);
if (KFPRI != none)
{
if (KFPRI.ClientVeteranSkill == Class'SRVetFieldMedic')
ProjectileClass=Class'ServerPerksV5.NovaSixProj';
}
else
ProjectileClass=Class'KFMod.M79GrenadeProjectile';
return Super.SpawnProjectile(Start,Dir);
}
unrealscript
function projectile SpawnProjectile(Vector Start, Rotator Dir)
{
ProjectileClass=Class'ServerPerksV5.NovaSixProj';
return Super.SpawnProjectile(Start,Dir);
}
Шаг 4: Добавление в магазин
TraderInventory=3:ServerPerksV5.NovaSixPickup
(пусть 3 это категория медика, например)
Если хотим - добавляем его в SRVet\*.uc файлы для соответствующих перков.
Перенос монстров
Простой монстр (BloatEX)
Декомпилируем hiyokoZombiesMut, копируем ZombieBloatEX.uc в ServerPerksV5 и всё.
MonsterClasses=(MClassName="ServerPerksV5.ZombieBloatEX",Mid="P")
Монстр с собственным контроллером (NinjaPat)
Копируем NinjaPat.uc, HardPatController.uc и BossPlasmaProj.uc в наш мутатор.
Кроме того понадобятся ещё:
DamTypeHHGren.ucHHGExplosion.ucDamTypeExpBullet.uc
Заменяем hiyokomodZombie4th и hiyokomod на ServerPerksV5.
unrealscript
WeaponClass=Class'ServerPerksV5.HolyGrenade'
(иначе придётся переносить ещё и святую гранату в наш мутатор)
unrealscript
#exec OBJ LOAD FILE=godpatvoice.uax
сверху в NinjaPat.uc, а то что-то не хочет находить его.
Работа с ресурсами, не содержащимися в стандартных файлах
Будем рассматривать ситуацию, когда есть большие файлы ресурсов (анимация, текстуры, статик меши и звуки) и надо из них вытащить ресурсы конкретного монстра.
Всё будет делаться без стороннего софта, только KFEd.
Извлечение текстур
- Открываем KFEd, открываем нужный пакет текстур
- Находим нужные текстуры
- Используем функцию Rename для переименования текстур с указанием нового пакета
- Убеждаемся, что все текстуры переименованы правильно
- Сохраняем в новом пакете
Извлечение статик мешей
- Открываем KFEd, открываем нужный пакет статик мешей
- Находим нужные меши
- Переименовываем меши с указанием нового пакета
- Сохраняем в новом пакете
Извлечение анимаций и звуков
- Открываем KFEd, открываем нужный пакет анимаций
- Находим нужные анимации
- Переименовываем анимации с указанием нового пакета
- Если есть звуки в нотификациях, нужно:
- Выбрать нужную анимацию
- Переименовать AnimationSet
- Связать анимацию и меш
- Добавить Notify, выбрав тип
AnimNotify_Script - Убедиться, что все ссылки обновлены
- Сохраняем в новом пакете
Важные замечания
- При переносе мешей и анимаций нужно удалять нотификации и создавать заново, присваивая прежние настройки
- Простым перемещением звуков с анимациями обойтись не получится
- Переместив анимацию и сохранив в новом пакете, останутся ссылки на старый пакет
- В любых других случаях всё отлично срабатывает, но вот со звуками, при использовании их в нотификациях простое перемещение не работает и возникнут проблемы
Результат
После выполнения всех шагов оружие или монстр перенесены в ваш мутатор и готовы к использованию.
Свой вариант босса, урон кастомного моба и ивентовые классы
По темам «modify the BOSS abdominal tentacles», «Хард Патриарх для версии 1046 и выше», «Помогите с дамагом моба.» и «Ивентовские мобы» на форуме killingfloor.ru.
Свой Патриарх без правки KFChar. KFMod и KFChar менять не стоит. Вместо этого Flame советовал скопировать босса в свой пакет (в примере — в исходники ServerPerksV5), переименовать и унаследовать от ZombieBoss, задав нужные значения. Параметры щупалец и ударов видны в KFMod.ZombieBossBase:
class ZombieNewBoss extends ZombieBoss;
defaultproperties
{
ClawMeleeDamageRange=85.000000
ImpaleMeleeDamageRange=45.000000
MeleeDamage=75
}
Затем замените босса в настройках игры: в killingfloor.ini, раздел [KFMod.KFGameType], строку EndGameBossClass=KFChar.ZombieBoss на EndGameBossClass=ServerPerksV5.ZombieNewBoss, либо в PostBeginPlay() мутатора (в любом месте после KFGT = KFGameType(Level.Game);) добавьте:
KFGT.EndGameBossClass = string(Class'ZombieNewBoss');
Пояснения Dr_Killjoy к другим свойствам монстров: bMeleeStunImmune — монстра нельзя прервать ударом ближнего боя (состояние, когда зед запрокидывает голову и около секунды не может атаковать, но может двигаться); долгое оглушение с опущенной головой задаёт KFMonsterController(Controller).bUseFreezeHack, его вызывает функция FlipOver(), и Патриарх и некоторые зеды в него не впадают. CrispUpThreshhold — сколько ударов горения должно остаться, когда зед начинает обугливаться: при значении 6 подожжённый зед получает урон от огня 10 раз и начинает обугливаться, когда остаётся 6 (прошло 4 секунды). bFatAss, судя по комментарию в коде (// HACK for pathfinding), — хак для поиска пути, но в KFMod и KFChar эта переменная нигде не используется.
HardPat и другие наследники ZombieBoss после патча 1044. С версии 1044 в defaultproperties ZombieBoss появились строки:
EventClasses(0)="KFChar.ZombieBoss"
EventClasses(1)="KFChar.ZombieBoss"
EventClasses(2)="KFChar.ZombieBoss_HALLOWEEN"
EventClasses(3)="KFChar.ZombieBoss_XMAS"
а KFMod.KFGameType.AddBoss при вызове босса заменяет его ивентовым вариантом из этого массива. Поэтому HardPat, наследующий ZombieBoss, превращался в обычного босса. Flame предложил обнулить массив, например в PreBeginPlay мутатора KFHardPat:
class'KFHardPat.HardPat'.default.EventClasses.Length=0;
(или отдельным мутатором с той же строкой в PostBeginPlay, или не наследовать босса от KFChar.ZombieBoss). У Александры из темы этот способ не сработал, и помог только отдельный геймтайп, но у Flame оба варианта работали.
Кастомный моб не наносит урон. Одного MeleeDamage в defaultproperties мало. Урон наносится по анимации: в редакторе на нужной анимации в нужный момент ставится AnimNotify_Script и вписывается функция нанесения урона, у шивера это ClawDamageTarget (ответ 3xzet). Отдельный класс Zombie...Base для кастомного моба создавать не обязательно (Dr_Killjoy).
Ивентовые мобы. По словам LLIePLLIeHb, ивентовых мобов вырезали в версии 1032, и для них нужно брать с версии 1031 все файлы: анимации, меши, текстуры, код и звуки. Dr_Killjoy пояснял, что в KFChar их больше нет (а KFChar менять нельзя), поэтому игра вылетает; нужно создать их копии и положить в свой пакет.
Статья от Flame