Community-Tutorials (Source)

FGD-Skript

Was ist eine FGD-Datei?

In diesem Tutorial wird erklärt, was es mit den FGD-Dateien (game definition file) auf sich hat.

Der Hammer-Editor benötigt eine FGD-Datei, damit Entities (Point- und Brush-Entities) editiert werden können. Für jede Entity gibt es einen Eintrag, in dem beschrieben wird, wie die Entity im Hammer-Editor aussieht (bzw. im Object-Properties-Dialog ausgewählt werden kann) und wie sie später im Entity-Script der Map (BSP-Datei) steht.

Skript-Dateien haben den Vorteil, dass man sie 'leicht' lesen und mit einem Texteditor bearbeiten kann. Dadurch kann man den Hammer-Editor für jedes MOD benutzen, egal welche Entities man dafür definiert. Man muss nur seine eigene FDG schreiben. An einem Beispiel wird erkärt, wie die Waffen-Entities in derFGD für Counter-Strike erweitert werden können.

Auch wenn hier am Beispiel einiger Entities (aus Counter-Strike) die FGD erkärt wird, ist dies kein Tutorial über Enities und was in ihnen definiert werden muss. Etwas Basiswissen über Entities wird also vorausgesetzt.

Wie bindet man eine FGD-Datei ein?
Für CSS ist das die Datei 'cstrike.fgd'. Ihr findet sie im Ordner sourcesdk/bin.

tnentpic03.jpg

Vor den Erfolg haben die Götter den Spaß gesetzt. Wer Lust hat, kann alles gleich an meiner Modifikation der 'cstrike.fgd' ausprobieren. Einfach die Datei 'jdk.fgd' in den Ordner sourcesdk/bin kopieren, wo auch die Datei 'cstrike.fgd' steht.

Spoiler

//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. =======
//
// Purpose: Counter-Strike: Source game definition file (.fgd)
//
//=============================================================================

@include "base.fgd"

//-------------------------------------------------------------------------
//
// Base Classes
//
//-------------------------------------------------------------------------

@BaseClass = Target
[
target(target_destination) : "Target"
]

@BaseClass = TeamNum
[
TeamNum(choices) : "Team Number (int)" : 0 =
[
2 : "Terrorist"
3 : "Counter-Terrorist"
]
input SetTeam(integer) : "Changes the entity's team"
]

@BaseClass color(200 200 0) base(Targetname, Angles) = Weapon
[
spawnflags(Flags) =
[
1 : "Start constrained" : 0
]

output OnPlayerUse(void) : "Fires when the player +uses this weapon"
output OnPlayerPickup(void) : "Fires when the player picks up this weapon"
]

@BaseClass color(200 200 0) base(Targetname, Angles) = WeaponPlus
[
ammo(integer):"Munition":0:"Zusätzliche Munition"
]

@FilterClass base(BaseFilter) size(-8 -8 -8, 8 8 8) = filter_activator_team :
"A filter that filters by the team of the activator."
[
filterteam(choices) : "Filter Team Number" : 2 : "The team number to filter by. If the filter mode is Allow, only entities whose "+
"team number matches the given team will pass the filter. If the filter mode is Disallow, "+
"all entities EXCEPT those whose team number matches the given team will pass the filter." =
[
2 : "Terrorist"
3 : "Counter-Terrorist"
]
]

//-------------------------------------------------------------------------
//
// Point Classes
//
//-------------------------------------------------------------------------

@PointClass base(Angles) studio("models/player/urban.mdl") = info_player_counterterrorist :
"This entity marks the start point for counter-terrorists. One of these needs to be placed for each team member. " +
"20 start points is typical. Should be placed at least 128 units away from each other and surrounding walls"
[
]

@PointClass base(Angles) studio("models/player/terror.mdl") = info_player_terrorist :
"This entity marks the start point for terrorists. One of these needs to be placed for each team member. " +
"20 start points is typical. Should be placed at least 128 units away from each other and surrounding walls."
[
]

@PointClass base(Angles) studio("models/editor/playerstart.mdl") = info_player_logo :
"This is for logo maps for demos. All players will spawn here, and there will be no " +
"class menu, team menu, or HUD."
[
]

@PointClass base(Angles) studio("models/Characters/hostage_04.mdl") = hostage_entity :
"Hostage. A hostage NPC will spawn at this point.\n\n" +
"There are usually four hostages placed in each hostage rescue map. The model for each Hostage is randomly chosen."
[

HostageType(choices) : "Hostage Model (int)" : 0 : "Not used. Hostage models are chosen randomly by the game." =
[
0 : "A"
1 : "B"
1 : "C"
1 : "D"
]
]

@PointClass base(Angles) = info_view_parameters :
"This entity selects whether or not this level uses the Half-Life 2 view parameters (eye height: 64, FOV: 75) " +
"or the old Counter-Strike settings (eye height: 53.5, FOV: 90)."
[
ViewMode(choices) : "View Mode" : 0 =
[
0 : "Old"
1 : "New"
]
]

@PointClass = info_map_parameters :
"Map parameters. Currently used only to set the C4 bomb detonation radius."
[
bombradius(integer) : "C4 Explosion Radius" : : "Overrides the default radius of the explosion when the C4 bomb explodes."
]

@PointClass base(Angles) = env_detail_controller : "An entity that lets you control the fade distances for detail props."
[
fademindist(float) : "Start Fade Dist/Pixels" : 400 : "Distance at which the prop starts to fade."
fademaxdist(float) : "End Fade Dist/Pixels" : 1200 : "Maximum distance at which the prop is visible."
]

//-------------------------------------------------------------------------
//
// Weapons
//
//-------------------------------------------------------------------------

@PointClass base(Weapon) studio("models/weapons/w_knife_t.mdl") = weapon_knife : "Knife" []

@PointClass base(Weapon) studio("models/weapons/w_eq_fraggrenade.mdl") = weapon_flashbang : "Flashbang" []
@PointClass base(Weapon) studio("models/weapons/w_eq_fraggrenade.mdl") = weapon_hegrenade : "HE Grenade" []
@PointClass base(Weapon) studio("models/weapons/w_eq_smokegrenade.mdl") = weapon_smokegrenade : "Smoke Grenade" []

@PointClass base(Weapon) studio("models/weapons/w_defuser.mdl") = item_defuser : "Defuse Kit" []
@PointClass base(Weapon) studio("models/weapons/w_c4.mdl") = weapon_c4 : "C4 Bomb" []

@PointClass base(WeaponPlus) studio("models/weapons/w_pist_glock18.mdl") = weapon_glock : "9X19mm Sidearm" []
@PointClass base(WeaponPlus) studio("models/weapons/w_pist_usp.mdl") = weapon_usp : "K&M .45 Tactical" []
@PointClass base(WeaponPlus) studio("models/weapons/w_pist_p228.mdl") = weapon_p228 : "228 Compact" []
@PointClass base(WeaponPlus) studio("models/weapons/w_pist_deagle.mdl") = weapon_deagle : "Night Hawk .50C" []
@PointClass base(WeaponPlus) studio("models/weapons/w_pist_fiveseven.mdl") = weapon_fiveseven : "ES Five-Seven" []
@PointClass base(WeaponPlus) studio("models/weapons/w_pist_elite.mdl") = weapon_elite : ".40 Dual Elites" []

@PointClass base(WeaponPlus) studio("models/weapons/w_shot_m3super90.mdl") = weapon_m3 : "Leone 12 Gauge Super" []
@PointClass base(WeaponPlus) studio("models/weapons/w_shot_xm1014.mdl") = weapon_xm1014 : "Leone YG1265 Auto Shotgun" []

@PointClass base(WeaponPlus) studio("models/weapons/w_smg_tmp.mdl") = weapon_tmp : "Schmidt Machine Pistol" []
@PointClass base(WeaponPlus) studio("models/weapons/w_smg_mp5.mdl") = weapon_mp5navy : "K&M Sub-Machine Gun" []
@PointClass base(WeaponPlus) studio("models/weapons/w_smg_ump45.mdl") = weapon_ump45 : "K&M UMP45" []
@PointClass base(WeaponPlus) studio("models/weapons/w_smg_p90.mdl") = weapon_p90 : "ES C90" []
@PointClass base(WeaponPlus) studio("models/weapons/w_smg_mac10.mdl") = weapon_mac10 : "Ingram MAC-10" []

@PointClass base(WeaponPlus) studio("models/weapons/w_rif_galil.mdl") = weapon_galil : "IDF Defender" []
@PointClass base(WeaponPlus) studio("models/weapons/w_rif_ak47.mdl") = weapon_ak47 : "CV-47" []
@PointClass base(WeaponPlus) studio("models/weapons/w_rif_sg552.mdl") = weapon_sg552 : "Krieg 552 Commando" []
@PointClass base(WeaponPlus) studio("models/weapons/w_rif_famas.mdl") = weapon_famas : "Clarion 5.56" []
@PointClass base(WeaponPlus) studio("models/weapons/w_rif_m4a1.mdl") = weapon_m4a1 : "Maverick M4A1 Carbine" []
@PointClass base(WeaponPlus) studio("models/weapons/w_rif_aug.mdl") = weapon_aug : "Bullpup" []

@PointClass base(WeaponPlus) studio("models/weapons/w_snip_scout.mdl") = weapon_scout : "Schmidt Scout" []
@PointClass base(WeaponPlus) studio("models/weapons/w_snip_g3sg1.mdl") = weapon_g3sg1 : "D3/AU-1 Semi-Auto Sniper Rifle" []
@PointClass base(WeaponPlus) studio("models/weapons/w_snip_sg550.mdl") = weapon_sg550 : "Krieg 550 Commando" []
@PointClass base(WeaponPlus) studio("models/weapons/w_snip_awp.mdl") = weapon_awp : "Magnum Sniper Rifle" []

@PointClass base(WeaponPlus) studio("models/weapons/w_mach_m249para.mdl") = weapon_m249 : "ES M249 Para" []

//-------------------------------------------------------------------------
//
// Solid Classes
//
//-------------------------------------------------------------------------

@SolidClass = func_ladder :
"Ladder. Players will be able to freely along this brush, as if it was a ladder. If you are using a model prop " +
"for the visual representation of the ladder in the map, apply the toolsinvisibleladder material to the " +
"func_ladder brush."
[
]

@SolidClass base(func_physbox) = func_physbox_multiplayer :
"This class is the same as func_physbox, except the runtime collisions use a more bouncy method that avoids " +
"the prediction errors normal physics objects get."
[
]

@SolidClass base(Targetname, TeamNum) = func_buyzone:
"Buy Zone. Players can buy equipment while standing in this zone, if the zone matches their current team.\n\n" +
"A single Buy Zone entity must be either terrorist or counter-terrorist, it cannot be both. Should have " +
"the toolstrigger material applied to all sides"
[
]

@SolidClass base(Targetname) = func_bomb_target:
"Bomb Target. The terrorists can place C4 explosives while standing in this zone.\n\n" +
"When the bomb is planted and explodes inside this area, the BombExplode outputs are fired. The game handles " +
"all of the bomb planting and scoring logic – the BombExplode outputs are provided to add visual and damage effects."
[
output BombExplode(void): "Fires when C4 explodes"
]

@SolidClass base(Targetname) = func_hostage_rescue:
"Hostage Rescue Zone. When a hostage is led into this zone, it is marked as rescued."
[
]

//-------------------------------------------------------------------------
//
// Sound Test Map Entities
//
//-------------------------------------------------------------------------

@PointClass base(Targetname) size(-8 -8 -8, 8 8 8) = point_surroundtest
: "Surround Sound Test"
[
input FireCorrectOutput(void) : "Fire output based on snd_surround_speaker cvar value"
output On2Speakers(void) : "Fired if player is using 2 speakers."
output On4Speakers(void) : "Fired if player is using 4 speakers."
output On51Speakers(void) : "Fired if player is using 5.1 speakers."
]

Natürlich kann man die Datei 'cstrike.fgd' auch direkt verändern, nur sind beim nächsten Start alle Einträge wieder weg. Steam merkt nämlich, dass die Datei nicht mit dem Original übereinstimmt und 'denkt', da ist ein Update fällig. Tja, und schon ist die Datei 'erneuert' und die änderungen sind den Bach runter.

Damit das neue FGD auch im Hammer-Editor wirksam wird, müsst Ihr unter 'Tools->Options' folgende Einstellung vornehmen.

  1. Im Menü Tools den Eintrag Options auswählen
    tnentpic01.jpg
  2. Den Eintrag 'cstrike.fgd' löschen (Remove).
    tnentpic09.jpg
  3. Die neue Datei (hier 'jdk.fgd') hinzufügen (Add).
    tnentpic04.jpg

Welche Struktur hat eine Entity-Beschreibung?

Jetzt zur Skript-Datei: Wie Ihr Euch sicher denken könnt, muss man in der Skript-Datei gewissen Formate einhalten. Die Grobstruktur eines Eintrags ist:


@[color=blue]EntityKlasse[/color]
Verweise = [color=red]EntityName[/color]
[color=green][
    Inhalt-Beschreibung
][/color]
// Kommentare

Als EntityKlassen können include, BaseClass, PointClass oder SolidClass verwendet werden (es gibt noch andere, die für uns aber keine Rolle spielen).

Die Verweise und die Inhalts-Beschreibung sind optional, d.h. sie müssen nicht enthalten sein. Kommentare werden mit den Zeichen "//" eingeleitet und gehen bis zum Ende der Zeile.

Ein minimale Entity-Eintrag könnte dann lauten:


@[color=blue]PointClass[/color] = [color=red][i]MeineErsteEntity[/i][/color]
[color=green][
][/color]

Na klar, mit einer Entity names MeineErsteEntity wird die Engine nichts anfangen können. Deshalb dürfen in der FGD-Datei nur Entity-Namen verwendet werden, die die Engine auch versteht.

Im Tutorial werden alle Namen, die im MOD definiert sind in rot und kursiv dargestellt.

Was bedeuten die EntityKlassen?

Mit '@include' kann man bereits bestehenden Skript-Dateien laden. Das macht das 'cstrike.fgd' ganz zu Anfang und lädt die Datei 'base.fgd'; und so macht es auch mein Skript (was ja eine Erweiterung von 'cstrike.fgd' ist).

Die beiden Entity-Typen (PointClass, SolidClass) beschreiben die Entities, die im Hammer-Editor verwendet werden können. Wenn Ihr jetzt im Skript eine solche Entity-Beschreibung löscht, ist sie auch im Hammer-Editor verschwunden. Und entsprechend, wenn Ihr eine neue Beschreibung einfügt, kann die verwendet werden.

Damit man in den Entities häufig wiederkehrende Teile nicht immer wieder hinschreiben muss, kann man Basis-Entities (BaseClass) definieren, die dann einfach in der Verweis-Liste aufgenommen werden.

Was darf in den Verweisen stehen?

Die Verweise beziehen sich entweder auf Basis-Entities (base (...)), die ebenfalls in der neuen Entity enthalten sein sollen, oder definiern das Erscheinungsbild (color (0, 0, 200), studio("path"), iconsprite("path"), sphere() und size()) im Hammer-Editor.

So bedeutet die Zeile:


@[color=blue]BaseClass[/color] color(0 0 200) base([color=red]Targetname[/color], [color=red]Angles[/color]) = [color=red]Weapon [/color]...

dass die Entity 'Weapon' im Hammer-Editor durch einen blauen Würfel dargestellt werden soll und außerdem alles, was in der Basisklasse 'Targetname' und 'Angles' enthalten ist, auch in der Entity Weapon enthalten sein soll. Natürlich dürfen die verwendeten Entities nur vom Klassentype BaseClass sein.

Diese Entity (Weapon) kann im Hammer-Editor nicht direkt verwendet werden, sondern nur zur Definition von Point- oder Brush-Entities dienen. Die Namen der Base-Entities sind nur für die FGD-Datei und den Editor intern von Bedeutung. Im Entity-Skript der BSP-Datei tauchen sie nicht mehr auf.

Hier eine Zusammenfassung der wichtigsten Elemente in der Verweisliste:

  • base
    Alle aufgeführten BaseClass Entities sollen Bestandteil dieser Entity werden.
  • size
    Im Hammer-Editor wird die Entity als Würfel dargestellt. Angegeben werden zwei Eckpunkte.
  • color
    Im Hammer-Editor bekomnt die Entity die in RGB Werten (0..255) angegebene Farbe.
  • sphare
    Die Entity bekommt zusätzlich eine Gitter-Kugel. Die Größe der Gitter-Kugel kann durch einen Wert in der Entity bestimmt werden (z.B. sphare(radius)).
  • studio
    Die Entity wird durch ein Model dargestellt. Angeben wird der Pfad des Models (MDL-Datei).
  • iconsprite
    Die Entity wird durch eine Textur (genauer Sprite) dargestellt. Angeben wird der Pfad der Textur (VMT-Datei).

Die Point- und Solid-Entities können eine Erklärhilfe erhalten. Man schreibt einfach das Zeichen ':' hinter den Entity-Namen und fügt den Erklär-Text ein. Texte müssen immer in Gänsefüsschen eingeschlossen werden. So wie
"hier". Interessanter Weise kann man Texte auch addiern. Der Text "Anfang" + "Und" + "Ende" wird zu "AnfangUndEnde".

Die Beschreibung der Point-Entity 'info_player_terrorist' (und der BasisEntity Angles) sieht dann so aus:


@[color=blue]BaseClass[/color] = [color=red]Angles[/color]
[color=green][[/color]
    [color=red][i]angles[/i][/color](angle)[color=green] : "Pitch Yaw Roll (Y Z X)" : "0 0 0" :[/color] 
        [color=orange]"This entity's orientation in the world. Pitch is rotation around the Y axis, "[/color] +
        [color=orange]"yaw is the rotation around the Z axis, roll is the rotation around the X axis."[/color]
[color=green]][/color]

@[color=blue]PointClass[/color] base([color=red]Angles[/color]) studio("models/player/terror.mdl") = [color=red][i]info_player_terrorist[/i][/color] :
        [color=orange]"This entity marks the start point for terrorists."[/color] +
        [color=orange]"One of these needs to be placed for each team member."[/color] +
        [color=orange]"20 start points is typical. Should be placed at least 128 units away "[/color] +
        [color=orange]"from each other and surrounding walls."[/color]
[color=green][
][/color]

Verwendet wird die Basisklasse 'Angles' und im Hammer-Editor soll das Entity durch das Model "models/player/terror.mdl" dargestellt werden. Die Inhalts-Beschreibung ist leer, da ja alles Nötige bereits in der Basisklasse 'Angles' beschrieben ist.

Das Element "origin" wird vom Hammer-Editor eingefügt.

  • Der Property Dialog im Hammer-Editor
    tnentpic25.jpg
  • SmartEdit off
    tnentpic26.jpg
  • Der Eintrag im Entity-Skript der BSP-Datei
    
      {
      "origin" "52 272 96"
      "angles" "0 180 0"
      "classname" "info_player_terrorist"
      }
    

Was steht in der Inhalts-Beschreibung?

Kommen wir nun zur Inhalts-Beschreibung. Alle Inhalts-Elemente haben einen Namen (Key) und einen Wert. Wenn Ihr bei den Properties SmartEdit abschaltet seht Ihr sie. Im Entity-Skript der BSP sind nur noch diese Pärchen abgespeichert. Für den Hammer-Editor muss aber noch eine Bezeichnung eingetragen werden. Wenn man will, kann auch den Inhalts-Elementen noch eine Erklärhilfe hinzugefügt werden.

Eine Erweiterung für eine Waffen-Entity könnte so aussehen:


@[color=blue]PointClass[/color] base([color=red]Weapon[/color]) studio("models/weapons/w_rif_m4a1.mdl") = [color=red][i]weapon_m4a1[/i][/color] :
[color=orange]"Maverick M4A1 Carbine"[/color]
[color=green][[/color]
    [color=red][i]ammo[/i][/color](integer) [color=green]: "Munition" : 0 :[/color] [color=orange]"Zusätzliche Munition"[/color]
[color=green]][/color]

Die Einträge müssen mit dem Zeichen ':' getrennt werden. Sie haben folgende Bedeutung:

  • ammo(integer)
    Der Name des Elements, wie er in das Entity-Skript der BSP geschreiben wird.
    Der in Klammern stehende Name bezeichnet den Typ der Werte. In diesem Fall nur ganzzalig.
  • "Munition"
    Die Bezeichnung, wie sie im Object-Properties Dialog im Hammer-Editor verwendet wird.
  • 0
    Der Standard-Wert. Hier kann man den Wert eintragen, der genommen werden soll, wenn nichts anderes eingetragen wird.
  • [color=orange]"Zusätzliche Munition"
    Erklärhilfe. Hier kann ein beliebieger Text stehen, der im Object-Properties-Dialog im Hammer-Editor angezeigt wird.

Der Standard-Wert und die Erklärhilfe sind optional, d.h. sie dürfen auch weggelassen werden.

  • Die Definition in der FGD-Datei
    
    @[color=blue]PointClass[/color] base([color=red]Weapon[/color]) studio("models/weapons/w_rif_m4a1.mdl") = [color=red][i]weapon_m4a1[/i][/color] :
    [color=orange]"Maverick M4A1 Carbine"[/color]
    [color=green][[/color]
        [color=red][i]ammo[/i][/color](integer) [color=green]: "Munition" : 0 :[/color] [color=orange]"Zusätzliche Munition"[/color]
    [color=green]][/color]
    
  • Die Property im Hammer-Editor
    tnentpic24.jpg
  • Der Eintrag im Entity-Skript der BSP-Datei
    
    {
    "origin" "528 272 0"
    "ammo" "100"
    "angles" "0 0 0"
    "classname" "weapon_m4a1"
    }
    
  • In-Game nach dem Aufnehmen der Waffe
    tnentpic41.jpg

Damit wir diese Erweiterung nicht auch in den anderen Waffen eintragen müssen, können wir eine eigene Basis-Entity definieren, die dann mit in die Verweisliste aufgenommen wird. Dazu brauch man nur die Basis-Entity Weapon erweitern:


@[color=blue]BaseClass[/color] base([color=red]Weapon[/color]) = [color=red]WeaponPlus[/color]
[color=green][[/color]
    [color=red][i]ammo[/i][/color](integer) [color=green]: "Munition" : 0 :[/color] [color=orange]"Zusätzliche Munition"[/color]
[color=green]][/color]

Nun brauchen wir nur überall, wo Waffen noch Munition erhalten können, statt der Basis-Entity Weapon auf WeaponPlus verweisen. In unserem Fall sieht das dann so aus:


@[color=blue]PointClass[/color] base([color=red]WeaponPlus[/color]) studio("models/weapons/w_rif_m4a1.mdl") = [color=red][i]weapon_m4a1[/i][/color] :
[color=orange]"Maverick M4A1 Carbine"[/color]
[color=green][
][/color]

Welche Element-Typen gibt es?

Die Element-Namen und -Typen haben natürlich nur dann eine Bedeutung, wenn sie im MOD verstanden werden. Als Element-Typen sind folgenden Einträge möglich:

  • integer
    Eingetragen werden ganzzahlige Werte.
  • float
    Eingetragen werden reelle Werte.
  • color255
    Eingetragen werden Farb-Werte in RGB (rot/grün/blau) Darstellung. Jeder Farbwert muss im Bereich 0..255 liegen. Der Farb-Wert für rot wird als 255 0 0 angegeben.
  • angle
    Eingetragen werden Gradzahlen für die Drehung um die Y-, Z- und X-Achse des Objekts.
  • string
    Eingetragen werden können beliebige Texte.
  • sound
    Eingetragen werden können Namen (Texte).
  • studio
    Eingetragen werden können Modelle.
  • target_source
    Eingetragen werden können Namen (Texte). Auf diese Entity kann mit dem eingetragenen Namen (von anderen Entities aus) verwiesen werden.
  • target_destination
    Eingetragen werden können Namen (Texte). Es muss eine Entity mit diesem Namen (target_source) existieren, auf die mit diesem Eintrag verwiesen wird.
  • choices
    Aus verschiedenen Werten kann einer ausgewählt werden. Diesem Eintrag muss noch eine weitere Definition folgen.
  • flags
    Aus einer Liste von Möglichkeiten dürfen beliebig viele ausgewählt werden. Auch diesem Eintrag muss noch eine weitere Definition folgen.

Was sind Choices und Flags?

Die Werte-Definition für "flags" und "choices" werden wieder mit einem Gleichheitszeichen ('=') eingeleitet und mit eckigen Klammern ('[' und ']') eingeschlossen:

  • Der Skript-Eintrag choices
    
    [color=red][i]disableshadows[/i][/color][color=green]([b]choices[/b]) : "Disable Shadows" : 0 :
        [color=orange]"Used to disable dynamic shadows on this entity."[/color] = 
    [
        0 : "No"
        1 : "Yes"
    ][/color]
    
  • Der Object-Properties-Dialog
    tnentpic35.jpg

Beim Element-Typ choices kann ein Standard-Wert eingetragen werden. Jeder der aufgezählten Werte muss eine Bezeichnung bekommen. Im Editor kann genau einer der Werte ausgewählt werden.

Diesen Elementtyp nimmt man, wenn die Werte bestimmte Bedeutungen haben sollen.

  • Der Skript-Eintrag flags
    
    [color=red][i]spawnflags[/i][/color][color=green]([b]flags[/b]) = 
    [
        1 : "Only Break on Trigger" : 0
        2 : "Break on Touch" : 0
        4 : "Break on Pressure" : 0
        512: "Break immediately on Physics" : 0
        1024: "Don't take physics damage" : 0
    ][/color]
    
  • Der Object-Properties-Dialog
    tnentpic36.jpg

Der Element-Typ flags wird eigentlich nur für die 'Spawnflags' verwendet und trägt deshalb keine Bezeichnung (und weder Standard-Wert noch Erklärungstext). Die Flag-Werte müssen 2er Potenzen sein (d.h. 1, 2, 4, 8, usw.). Im Hammer-Editor können mehrere der angebenen Optionen angeklickt werden. Die Standard-Auswahl wird in der Options-Liste angegeben (0 oder 1).

Im Entity-Skript der BSP wird dann die Summe der ausgewählten Options-Werte eingetragen. Bei der Auswahl "Break on Pressure" und "Don't take physics damage" würde im Entity-Skript "spwanflags" "1028" stehen.

Wie definiert man Input/Output?

Input und Output Einträge werden im Prinzip wie normale Elemente definiert. Sie werden mit dem Wort "input" bzw. "output" eingeleitet, bestehen aber nur aus dem Namen (mit Elementtyp) und einem Erklärtext. Beispiele hierfür sind:


@PointClass ... = [color=red][i]light_dynamic[/i][/color] :
    [color=orange]"An invisible lightsource ..."[/color]
[color=green][
    ...
    [/color]// Inputs
    [color=green]input Color(color255) : "Set the light's render color (R G B)."
    input brightness(integer) : "Set the light brightness."
][/color]