Новости/News | | Туториалы/Tutorials | | Форум/Forum | | ЧаВо/FAQ | | Файлы/Downloads | | Ссылки/Links | | Авторы/About |

Создание реликтов

Реликты (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 с разрешения автора.

Хостинг от uCoz