Мутаторы и UnrealScript

Экспорт монстров и оружия в собственные мутаторы

Всё ниже написанное будет ещё неоднократно исправляться и оформляться...

Модель оружия в браузере Animations Модель оружия, открытая в браузере 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.uc
  • HHGExplosion.uc
  • DamTypeExpBullet.uc

Заменяем hiyokomodZombie4th и hiyokomod на ServerPerksV5.

unrealscript
WeaponClass=Class'ServerPerksV5.HolyGrenade'

(иначе придётся переносить ещё и святую гранату в наш мутатор)

unrealscript
#exec OBJ LOAD FILE=godpatvoice.uax

сверху в NinjaPat.uc, а то что-то не хочет находить его.

Работа с ресурсами, не содержащимися в стандартных файлах

Будем рассматривать ситуацию, когда есть большие файлы ресурсов (анимация, текстуры, статик меши и звуки) и надо из них вытащить ресурсы конкретного монстра.

Всё будет делаться без стороннего софта, только KFEd.

Извлечение текстур

  1. Открываем KFEd, открываем нужный пакет текстур
  2. Находим нужные текстуры
  3. Используем функцию Rename для переименования текстур с указанием нового пакета
  4. Убеждаемся, что все текстуры переименованы правильно
  5. Сохраняем в новом пакете

Извлечение статик мешей

  1. Открываем KFEd, открываем нужный пакет статик мешей
  2. Находим нужные меши
  3. Переименовываем меши с указанием нового пакета
  4. Сохраняем в новом пакете

Извлечение анимаций и звуков

  1. Открываем KFEd, открываем нужный пакет анимаций
  2. Находим нужные анимации
  3. Переименовываем анимации с указанием нового пакета
  4. Если есть звуки в нотификациях, нужно:
    • Выбрать нужную анимацию
    • Переименовать AnimationSet
    • Связать анимацию и меш
    • Добавить Notify, выбрав тип AnimNotify_Script
    • Убедиться, что все ссылки обновлены
  5. Сохраняем в новом пакете

Важные замечания

  • При переносе мешей и анимаций нужно удалять нотификации и создавать заново, присваивая прежние настройки
  • Простым перемещением звуков с анимациями обойтись не получится
  • Переместив анимацию и сохранив в новом пакете, останутся ссылки на старый пакет
  • В любых других случаях всё отлично срабатывает, но вот со звуками, при использовании их в нотификациях простое перемещение не работает и возникнут проблемы

Результат

После выполнения всех шагов оружие или монстр перенесены в ваш мутатор и готовы к использованию.

Свой вариант босса, урон кастомного моба и ивентовые классы

По темам «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