Создание реликтов
Реликты (Relics) по сути своей являются мутаторами, которые наделяют различными возможностями/эффектами "хозяина", т.е. игрока, имеющего реликт в своем инвентаре. Для того, чтобы показать как изготовить свой реликт, я просто "пробегу" по коду Blink реликта, который я написал. Вся его работа заключается в том, что он переключает видимость/невидимость игрока - в итоге получается эффект мерцания. Довольно просто, не так ли?
Для изготовления реликта Вам понадобиться написать два класса: сам класс реликта, который "отвечает" за порождение второго класса - предмета инвентаря (т.е. реликта, который Вы видите непосредственно в уровне). Пусть эти классы зовутся RelicBlink и RelicBlinkInventory соответственно. Перед созданием Вашего собственного реликта, обязательно загляните в классы Relic и RelicInventory, а также посмотрите, как реализованы другие реликты. Это поможет Вам понять, как они работают. Также, если Вы не очень знакомы с мутаторами, Вам необходимо заглянуть и в них, т.к. реликт не что иное как "приукрашенный" мутатор.
//=====================================================
// RelicBlink.
//=====================================================
class RelicBlink expands Relic;
defaultproperties
{
RelicClass=Class'grelics.RelicBlinkInventory'
}
|
Все просто. К счастью, класс Relic (который мы наследуем) берет на себя всю заботу о порождении реликта-инвентаря и прочую рутину, поэтому все что Вам нужно будет указать - это объект какого класса необходимо порождать. В этом случае указан 'grelics.RelicBlinkInventory'. Теперь перейдем к "мясу" реликта...
//===================================================== // RelicBlinkInventory // // "Переключает" видимость/невидимость путем // порождения/уничтожения предмета, // обеспечивающего невидимость у игрока //===================================================== class RelicBlinkInventory expands RelicInventory; #exec MESH IMPORT MESH=blink ANIVFILE=MODELS\blink_a.3d DATAFILE=MODELS\blink_d.3d X=0 Y=0 Z=0 #exec MESH ORIGIN MESH=blink X=0 Y=0 Z=0 #exec MESH SEQUENCE MESH=blink SEQ=All STARTFRAME=0 NUMFRAMES=1 #exec MESH SEQUENCE MESH=blink SEQ=blink STARTFRAME=0 NUMFRAMES=1 #exec TEXTURE IMPORT NAME=blink_skin FILE=TEXTURES\blink_skin2.pcx GROUP=Skins FLAGS=2 #exec MESHMAP NEW MESHMAP=blink MESH=blink #exec MESHMAP SCALE MESHMAP=blink X=0.1 Y=0.1 Z=0.2 #exec MESHMAP SETTEXTURE MESHMAP=blink NUM=0 TEXTURE=blink_skin // Является ли игрок невидимым? var bool bIsInvis; // Makeinvis() - порождает предмет "невидимость" // и "дает" его игроку (grelics.BlinkItem) function MakeInvis() { local BlinkItem invis; // Все, что нужно здесь сделать - породить предмет, // обеспечивающий невидимость (в данном случае: BlinkItem), // установить некоторый свойства для него и "передать" игроку // с помощью функции GiveTo() invis = Spawn(class'grelics.BlinkItem'); invis.Charge = 500; invis.bHeldItem = true; invis.RespawnTime = 0.0; invis.GiveTo(Pawn(Owner)); invis.Activate(); // Установим переменную bIsInvis равной true и используем функцию SetTimer // для последующего вызова (через 5 сек) функции, делающего игрока снова видимым bIsInvis = true; SetTimer(5.0, true); } // MakeVis() - находит предмет "невидимость" у игрока и "забирает" (уничтожает) его function MakeVis() { local Inventory invis; // Прямая противоположность MakeInvis(). Здесь мы используем // функцию FindInventoryType() из класса Pawn для того, чтобы узнать // есть ли у игрока предмет "невидимость". Если есть, то "выключим" его // и предадим забвению... invis = Pawn(Owner).FindInventoryType(class'grelics.BlinkItem'); if (invis != NONE) { Pickup(invis).UsedUp(); Pawn(Owner).DeleteInventory(invis); invis.Destroy(); } // Снова установим Timer // для обеспечения невидимости игроку через секунду SetTimer(1.0, true); bIsInvis = false; } // Когда подбирается реликт, он переходит в состояние (state) Activated, // поэтому именно здесь находится код // для старта всего процесса (видимости/невидимости), // также здесь описана функция Timer, обеспечивающая переключение видимости state Activated { function Timer() { if (bIsInvis) MakeVis(); else MakeInvis(); } Begin: MakeInvis(); bIsInvis = true; SetTimer(5.0, true); } defaultproperties { PickupMessage="You picked up the blink relic." PickupViewMesh=Mesh'grelics.blink' PickupViewScale=0.600000 Icon=Texture'relics.Icons.RelicIconRedemption' Physics=PHYS_Rotating Skin=Texture'grelics.Skins.blink_skin' CollisionHeight=40.000000 } |
Вот, пожалуй, и все. Да, если Вы все еще не догадались, что же это за BlinkItem, то я поясню: это обычный подкласс UT_Invisibility, у которого я убрал появление сообщения "Invisibility has worn off..." (эта надпись появлялась, когда заканчивалось действие UT_Invisibility). И последнее, для всех мутаторов (включая и реликты), Вы должны создать .int файл, для того, чтобы мутатор/реликт был доступен из меню мутаторов в Unreal Tournament. Ниже приведен пример содержимого .int файла (grelics.int) для моего реликта:
[Public] Object=(Name=grelics.RelicBlink,Class=Class,MetaClass=Engine.Mutator, Description="Relic: Blink,A magical relic that causes the owner to blink in and out of visibility.") |
Это также не сложно. Простая строка, указывающая имя реликта и описывающая его действие. Создайте свой .int файл для Вашего пака (package), например, blah.int или sexy.int :), воткните его вместе с паком в директорию UT/system и Ваш реликт будет доступен из меню мутаторов. Если у Вас находится несколько реликтов в одном паке, просто добавьте необходимое количество строк.
Автор
crack_addict
Источник: www.unrealscript.com
Перевод сделан 32_Pistoleta с разрешения автора.