Воскресенье, 24/05/19, 15:55 Приветствую Вас, Гость
Главная | Форум | Файлы | Видео | Фльмы Online | Регистрация
Меню сайта

Counter-Strike
МаппингИсходники
ТекстурыМодели
СервераПатчи
РазноеПлагины
АнтичитыМоды
КонфигиТриксы
Задние планыGUI(s)
СкриптыКонсоль
ИгрыМувики
ТутореалыБоты
WaypointsAmx Плагины
Maps - KZMaps - CS
Maps - DEMaps - AWP
Maps - SJMaps - FY
Демки

Мини-чат

Наш опрос
Какая ваша любимая игра?
Всего ответов: 1224

  Реклама:



Главная » Статьи » Mapping » Valve Hammer Editor (Worldcraft)

Создание своего .fgd
1.Начнём с самого простого.

Итак, что же такое FGD файл и с чем его едят? Любой человек, который когда-либо работал с Worldcraft (да, и вообще с какой либо другой мапперской утилитой ) знает что такое Entities. Для не просвещённых Entity - это специальные объекты, которые помогают манипулировать вашим компьютерным миром (наглядный пример: допустим, вы хотите создать какой либо объект, который при действии на него внешнего мира (взрыв бомбы, атака со стороны игрока и т.п.) ломался. Для этого вы создаёте объект при помощи браша (или префаба), но сколько по нему не стреляй, сколько по нему не лупи, толку это никакого не даст. Так вот, для того чтобы он ломался, нужно его выделить и на панели управления нажать to Entity, у вас появиться меню, в котором вы можете выбрать нужную вам ентитю, в нашем случае func_breakable и установить нужные вам опции). Ну так вот, не будем отклоняться от темы, итак:

FGD файл - это такой файл, в котором содержатся все необходимые Entities для создания данного мода, карт для этого мода или целостной игры.

Надеюсь вам понятно моё толкование данного термина. Так что если вы хотите создать свой мод (а именно на создателей модов ориентирован данный туториал), то, пожалуй, это одна из первых вещей, с которых надо начинать; так же для начала надо продумать сценарий.

2.Создание файла.

Итак, когда продуман сценарий и все энтити, можно браться за дело. Кстати все энтити подразделяются на два класса:

SolidClass - энтити, создаваемые из брашей,
PointClass - энтити - точечные объекты.

Вид энтить нужно обязательно разделять, иначе ничего не получится. Для начала создайте текстовый файл. И приступаем:

Begin *.fgd file after the line.
---------------------------------------------------------------------------------
//
//<здесь нужно указать имя мода> game definition file (.fgd)
//Version <здесь можно написать версию мода>
//For <вид и версия маппинговой утилит(ы)> and <версия Half-Life>
//
//by <автор>
//

//Worldspawn
//
@SolidClass = worldspawn : "World entity"
[

message(string) : "Map Description / Title"
skyname(string) : "environment map (cl_skyname)"
light(integer) : "Default light level"
WaveHeight(string) : "Default Wave Height"
MaxRange(string) : "Max viewable distance" : "4096"
]

Теперь создаём классы (т.е. вводим переменные, которые будут у нас выявляться в Properties)
Надпись "@BaseClass = <>" означает то, что вы вводите новую переменную. Тут указаны Основные переменные, представленные в CS, но вы можете их изменять и добавлять свои.

//
//BaseClasses
//

@BaseClass = Angles
[
angles(string) : "Pitch Yaw Roll (Y Z X)" : "0 0 0"
]

@BaseClass = Targetname
[
targetname(target_source) : "Name"
]
@BaseClass = Target
[
target(target_destination) : "Target"
]

@BaseClass base(Target) = Targetx
[
delay(string) : "Delay before trigger" : "0"
killtarget(target_destination) : "KillTarget"
]

@BaseClass = RenderFxChoices
[
renderfx(choices) :"Render FX" : 0 =
[
0: "Normal"
1: "Slow Pulse"
2: "Fast Pulse"
3: "Slow Wide Pulse"
4: "Fast Wide Pulse"
9: "Slow Strobe"
10: "Fast Strobe"
11: "Faster Strobe"
12: "Slow Flicker"
13: "Fast Flicker"
5: "Slow Fade Away"
6: "Fast Fade Away"
7: "Slow Become Solid"
8: "Fast Become Solid"
14: "Constant Glow"
15: "Distort"
16: "Hologram (Distort + fade)"
]
]

@BaseClass base(RenderFxChoices) = RenderFields
[
rendermode(choices) : "Render Mode" : 0 =
[
0: "Normal"
1: "Color"
2: "Texture"
3: "Glow"
4: "Solid"
5: "Additive"
]
renderamt(integer) : "FX Amount (1 - 255)"
rendercolor(color255) : "FX Color (R G B)" : "0 0 0"
]

@BaseClass size(-16 -16 -36, 16 16 36) color(0 255 0) base(Angles) = PlayerClass []

@BaseClass size(-16 -16 -16, 16 16 16) base(Angles) = gibshooterbase
[
targetname (target_source) : "Name"
m_iGibs(integer) : "Number of Gibs" : 3
delay(string) : "Delay between shots" : "0"
m_flVelocity(integer) : "Gib Velocity" : 200
m_flVariance(string) : "Course Variance" : "0.15"
m_flGibLife(string) : "Gib Life" : "4"
spawnflags(Flags) =
[
1 : "Repeatable" : 0
]
]

@BaseClass = Light
[
_light(color255) : "Brightness" : "255 255 128 200"
style(Choices) : "Appearance" : 0 =
[
0 : "Normal"
10: "Fluorescent flicker"
2 : "Slow, strong pulse"
11: "Slow pulse, noblack"
5 : "Gentle pulse"
1 : "Flicker A"
6 : "Flicker B"
3 : "Candle A"
7 : "Candle B"
8 : "Candle C"
4 : "Fast strobe"
9 : "Slow strobe"
]
pattern(string) : "Custom Appearance"
]

@BaseClass base(Targetname) = Breakable
[
target(target_destination) : "Target on break"
health(integer) : "Strength" : 1
material(choices) :"Material type" : 0 =
[
0: "Glass"
1: "Wood"
2: "Metal"
3: "Flesh"
4: "Cinder Block"
5: "Ceiling Tile"
6: "Computer"
7: "Unbreakable Glass"
8: "Rocks"
]
explosion(choices) : "Gibs Direction" : 0 =
[
0: "Random"
1: "Relative to Attack"
]
delay(string) : "Delay before fire" : "0"
gibmodel(studio) : "Gib Model" : ""
spawnobject(choices) : "Spawn On Break" : 0 =
[
0: "Nothing"
]
explodemagnitude(integer) : "Explode Magnitude (0=none)" : 0
]

@BaseClass base(Targetname, RenderFields, Angles) = Door
[
killtarget(target_destination) : "KillTarget"
speed(integer) : "Speed" : 100
master(string) : "Master"
movesnd(choices) : "Move Sound" : 0 =
[
0: "No Sound"
1: "Servo (Sliding)"
2: "Pneumatic (Sliding)"
3: "Pneumatic (Rolling)"
4: "Vacuum"
5: "Power Hydraulic"
6: "Large Rollers"
7: "Track Door"
8: "Snappy Metal Door"
9: "Squeaky 1"
10: "Squeaky 2"
]
stopsnd(choices) : "Stop Sound" : 0 =
[
0: "No Sound"
1: "Clang with brake"
2: "Clang reverb"
3: "Ratchet Stop"
4: "Chunk"
5: "Light airbrake"
6: "Metal Slide Stop"
7: "Metal Lock Stop"
8: "Snappy Metal Stop"
]
wait(integer) : "delay before close, -1 stay open " : 4
lip(integer) : "Lip"
dmg(integer) : "Damage inflicted when blocked" : 0
message(string) : "Message if triggered"
target(target_destination) : "Target"
delay(integer) : "Delay before fire"
netname(string) : "Fire on Close"
health(integer) : "Health (shoot open)" : 0
spawnflags(flags) =
[
1 : "Starts Open" : 0
4 : "Don't link" : 0
8: "Passable" : 0
32: "Toggle" : 0
256:"Use Only" : 0
]
locked_sound(choices) : "Locked Sound" : 0 =
[
0: "None"
2: "Access Denied"
8: "Small zap"
10: "Buzz"
11: "Buzz Off"
12: "Latch Locked"
]
unlocked_sound(choices) : "Unlocked Sound" : 0 =
[
0: "None"
1: "Big zap & Warmup"
3: "Access Granted"
4: "Quick Combolock"
5: "Power Deadbolt 1"
6: "Power Deadbolt 2"
7: "Plunger"
8: "Small zap"
9: "Keycard Sound"
10: "Buzz"
13: "Latch Unlocked"
]
locked_sentence(choices) : "Locked Sentence" : 0 =
[
0: "None"
1: "Gen. Access Denied"
2: "Security Lockout"
3: "Blast Door"
4: "Fire Door"
5: "Chemical Door"
6: "Radiation Door"
7: "Gen. Containment"
8: "Maintenance Door"
9: "Broken Shut Door"
]
unlocked_sentence(choices) : "Unlocked Sentence" : 0 =
[
0: "None"
1: "Gen. Access Granted"
2: "Security Disengaged"
3: "Blast Door"
4: "Fire Door"
5: "Chemical Door"
6: "Radiation Door"
7: "Gen. Containment"
8: "Maintenance area"
]
_minlight(string) : "Minimum light level"
]

@BaseClass base(Targetname, Target, RenderFields, Angles) = BaseTank
[
spawnflags(flags) =
[
1 : "Active" : 0
16: "Only Direct" : 0
32: "Controllable" : 0
]

yawrate(string) : "Yaw rate" : "30"
yawrange(string) : "Yaw range" : "180"
yawtolerance(string) : "Yaw tolerance" : "15"
pitchrate(string) : "Pitch rate" : "0"
pitchrange(string) : "Pitch range" : "0"
pitchtolerance(string) : "Pitch tolerance" : "5"
barrel(string) : "Barrel Length" : "0"
barrely(string) : "Barrel Horizontal" : "0"
barrelz(string) : "Barrel Vertical" : "0"
spritesmoke(sprite) : "Smoke Sprite" : ""
spriteflash(sprite) : "Flash Sprite" : ""
spritescale(string) : "Sprite scale" : "1"
rotatesound(sound) : "Rotate Sound" : ""
firerate(string) : "Rate of Fire" : "1"
bullet_damage(string) : "Damage Per Bullet" : "0"
persistence(string) : "Firing persistence" : "1"
firespread(choices) : "Bullet accuracy" : 0 =
[
0: "Perfect Shot"
1: "Small cone"
2: "Medium cone"
3: "Large cone"
4: "Extra-large cone"
]
minRange(string) : "Minmum target range" : "0"
maxRange(string) : "Maximum target range" : "0"
_minlight(string) : "Minimum light level"
]

@BaseClass = PlatSounds
[
movesnd(choices) : "Move Sound" : 0 =
[
0: "No Sound"
1: "big elev 1"
2: "big elev 2"
3: "tech elev 1"
4: "tech elev 2"
5: "tech elev 3"
6: "freight elev 1"
7: "freight elev 2"
8: "heavy elev"
9: "rack elev"
10: "rail elev"
11: "squeek elev"
12: "odd elev 1"
13: "odd elev 2"
]
stopsnd(choices) : "Stop Sound" : 0 =
[
0: "No Sound"
1: "big elev stop1"
2: "big elev stop2"
3: "freight elev stop"
4: "heavy elev stop"
5: "rack stop"
6: "rail stop"
7: "squeek stop"
8: "quick stop"
]
volume(string) : "Sound Volume 0.0 - 1.0" : "0.85"
]

@BaseClass base(Targetname, RenderFields, PlatSounds) = Trackchange
[
height(integer) : "Travel altitude" : 0
spawnflags(flags) =
[
1: "Auto Activate train" : 0
2: "Relink track" : 0
8: "Start at Bottom" : 0
16: "Rotate Only" : 0
64: "X Axis" : 0
128: "Y Axis" : 0
]
rotation(integer) : "Spin amount" : 0
train(target_destination) : "Train to switch"
toptrack(target_destination) : "Top track"
bottomtrack(target_destination) : "Bottom track"
speed(integer) : "Move/Rotate speed" : 0
]

@BaseClass base(Target, Targetname) = Trigger
[
killtarget(target_destination) : "Kill target"
netname(target_destination) : "Target Path"
style(integer) : "Style" : 32
master(string) : "Master"
sounds(choices) : "Sound style" : 0 =
[
0 : "No Sound"
]
delay(string) : "Delay before trigger" : "0"
message(string) : "Message (set sound too)"
spawnflags(flags) =
[
4: "Pushables": 0
]
]

@BaseClass = ZhltLightFlags
[
zhlt_lightflags(choices) :"Light Flags (Zhlt 2.2+)" : 0 =
[
0: "Normal"
1: "Embedded Fix"
2: "Opaque (Blocks Light)"
3: "Opaque + Embedded Fix"
]
]

Ну вот, вроде бы с переменными покончено. Теперь можно приступить к созданию непосредственно энтить. Если вы хотите создать энтити, которы уже существуют в HL или же каких-нибудь модов для неё, просто откройте их fgd файлы, выделите нужную вам энтитю и копируйте её в ваш файл.

Итак, PointClass. Не буду долго возиться, а просто на одном наглядном примере объясню что к чему.

//
// Cyclers (в эту категорию относятся энтити типа Cycler_Sprite.
//
@PointClass base(Targetname, Angles) = cycler_sprite : "Sprite Cycler"
[
model(sprite) : "Sprite"
framerate(integer) : "Frames per second" : 10
renderfx(choices) :"Render FX" : 0 =
[
0: "Normal"
1: "Slow Pulse"
2: "Fast Pulse"
3: "Slow Wide Pulse"
4: "Fast Wide Pulse"
9: "Slow Strobe"
10: "Fast Strobe"
11: "Faster Strobe"
12: "Slow Flicker"
13: "Fast Flicker"
5: "Slow Fade Away"
6: "Fast Fade Away"
7: "Slow Become Solid"
8: "Fast Become Solid"
14: "Constant Glow"
15: "Distort"
16: "Hologram (Distort + fade)"
]
rendermode(choices) : "Render Mode" : 0 =
[
0: "Normal"
1: "Color"
2: "Texture"
3: "Glow"
4: "Solid"
5: "Additive"
]
renderamt(integer) : "FX Amount (1 - 255)"
rendercolor(color255) : "FX Color (R G B)" : "0 0 0"
]

Короче, всё наглядно до ужаса, создаётся энтитя в скобках вводятся основные переменные, которые мы указывали выше, при желании вводятся свои. Значения в скобках после переменной указаны в конце туториала.

Дальше задействованы Env_энтити, создаются они так же как и вышеуказанные. Для этого надо всего лишь перед их созданием написать:

//
//Environmental effects
//

<....>

Вот и всё ,только не забывайте менять классы при создании например:
@PointClass = <>
@SolidClass = <>

И далее

Func -энтити:

//
// Function entities
//

<...>

Info-Энтити

//
// Info entities
//

<...>

И специальные энтити:

//
// <название игры> specific entities
//

<...>

А так же:

//
// Miscellaneous entities
//

<...>

Всё файл готов.

---------------------------------------------------------------------------------
End of file.

3.Константы - указатели.

Эти константы являются как раз теми самыми надписями, которые мы видели в скобках после задания объекта/опции.
Итак:

(string) - эта константа означает, что в данная опция является строковой (значение в виде текстовой строки)
(integer) - означает, что значение параметра - числовое
(choises) - означает, что имеются несколько вариантов для выбора
(flags) - означает, что опция будет находится во "флагах"
(sprite) - означает использование спрайтов
(model) - означает использование моделей

Так же, как это ни удивительно, но и переменные могут использоваться в качестве констант, а некоторые даже превращаться в полноценные энтити (например door).
===================================================================================
Да,кстати не забудьте, что не все игры, созданные на одном движке, поддерживают некоторые энтит, так допустим Counter-Strike не поддерживает энтити типа monster_, которые задают в HL различны NPC или же ваших врагов, хоть вы пихайте эту энтитю в cstrike.fgd толку от того, что вы её поставите не будет никакого!!! Просто CS поддерживает только Multiplayer режим.
===================================================================================

Спаисбо за то, что прочитали всю эту фигню.
Удачи вам, творите на здоровье!

Категория: Valve Hammer Editor (Worldcraft) | Добавил: root (08/04/18)
Просмотров: 736 | Рейтинг: 0.0/0
Форма входа
Логин:
Пароль:

Поиск

Видео

Друзья сайта
Counter-Strike Портал

Статистика

Полный онлайн - 1
Гостей - 1
Участников - 0


MSK-CS.RU by Admin[$] ICQ 5533141
Хостинг от uCoz