Guten Morgen
Willkommen zu meinen 5. Tutorial (oder so).
Ja heute wollen wir uns einen Trigger Programmieren.
Vorraussetzungen: Ein wenig C++ verständis, aber keine Angst der Code ist nich sehr schwer;)
Also dann mal los, wir öffnen unser Visual Studio und gehe in die Datei "triggers.cpp" im Serverprojekt.
Ihr geht dann ungefähr in die Zeile 560 (Strg + G und dann Zeile eingeben) und nach
void CTriggerRemove::Touch( CBaseEntity *pOther )
{
if (!PassesTriggerFilters(pOther))
return;
UTIL_Remove( pOther );
}
macht ihr einen Zeilenumbruch und fügt folgenden Code ein:
class CMyTrigger: public CBaseTrigger
{
public:
DECLARE_CLASS( CMyTrigger, CBaseTrigger );
void Spawn( void );
void Touch( CBaseEntity *pOther );
DECLARE_DATADESC();
// Outputs
COutputEvent m_OnTouch;
};
BEGIN_DATADESC( CMyTrigger )
// Outputs
DEFINE_OUTPUT( m_OnTouch, "OnTouch" ),
END_DATADESC()
LINK_ENTITY_TO_CLASS( trigger_test, CMyTrigger );
void CMyTrigger::Spawn( void )
{
BaseClass::Spawn();
InitTrigger();
}
void CMyTrigger::Touch( CBaseEntity *pOther )
{
}
So dann wollen wir mal durch den Code gehen :-)
class CMyTrigger: public CBaseTrigger
Hier wir eine neue Klasse erstellt, die von der Klasse CBaseTrigger die Funktionen erbt.
public:
DECLARE_CLASS( CMyTrigger, CBaseTrigger );
Hier wird eurem HL2 nochmals klargemacht, das die Klasse CMyTrigger von der Klasse CBaseTrigger erbt.
void Spawn( void );
void Touch( CBaseEntity *pOther );
Hier werden die Memberfunktionen erstellt. Ihr könnt auch noch eigene mit eigenem Programmcode erstellen.
DECLARE_DATADESC();
COutputEvent m_OnTouch;
Hier wird ein Output Event erstellt, kennt ihr ja sicherlich.
ist ja meistens so wenn man über einen trigger läuft das der irgendwas auslöst...
BEGIN_DATADESC( CMyTrigger )
DEFINE_OUTPUT( m_OnTouch, "OnTouch" ),
END_DATADESC()
Hier wird jetzt nochmals der Output deklariert.
LINK_ENTITY_TO_CLASS( [COLOR="Red"]trigger_test[/COLOR], CMyTrigger );
Das ist jetzt wichtig, hier wird ein Entity Name (in dem Fall trigger_test) mit unserer Klasse CMytrigger verbunden,
damit das Spiel auch später weiß, die beiden zusammengehören.
void CMyTrigger::Spawn( void )
{
BaseClass::Spawn();
InitTrigger();
}
Hier wird einfach nur der Trigger gespawnt un initialisiert, hier solltet ihr möglichst nicht drann rumspielen.
void CMyTrigger::Touch( CBaseEntity *pOther )
{
}
So jetzt wird es interessant.
In dieser Funktion wird gehandelt was passiert, wenn der Trigger berühert wurde.
Als Input wurde hier "CBaseEntity *pOther" deklariert.
Das ist sozusagen das "etwas" was unseren trigger berühert hat.
Ich habe die Funktion jetz mal etwas umgeschrieben, damit wir auch sehen das sich etwas tut (ich habe alles ausreichende kommentiert):
void CMyTrigger::Touch( CBaseEntity *pOther )
{
if (pOther->IsPlayer()) [COLOR="SeaGreen"]//Wenn das was den trigger berühert hat der Spieler war[/COLOR]
{
CBasePlayer *pPlayer = (CBasePlayer *)pOther; [COLOR="SeaGreen"]//dann wird der Zeiger pOther auf den Spieler "zugeschnitten",[/COLOR]
[COLOR="SeaGreen"] //weil wir ja wissen das es der Spieler war[/COLOR]
const char *playername; /[COLOR="SeaGreen"]/Wir erstellen eine neue Textvariable[/COLOR]
playername = pPlayer->GetPlayerName(); [COLOR="SeaGreen"]//Nun holen wir uns den namen vom Spieler und legen sie auf unsere playername Variable[/COLOR]
UTIL_ClientPrintAll( HUD_PRINTCENTER, "Guten Morgen %s1.", playername );
[COLOR="SeaGreen"]
//Wir schicken einen nachricht an alle Spieler und sagen ihnen wer gerade durch den trigger gelaufen ist
//statt %s1 wir dann die Variable "playername" angezeigt[/COLOR]
} [COLOR="SeaGreen"]//Klammer zu ist ganz wichtig :-)[/COLOR]
}
Ihr müsst es natürlich nicht so wie ich machen, ihr könnt auch was ganz anderes mit demTrigger anstellen, das ist nur ein Beispiel.
Jetzt geht ihr in das Bin Verzeichnis eures Source SDK's (bei mir "C:\Programme\Steam\SteamApps\**Username**\sourcesdk\bin
Dort erstellt ihr eine neue Datei, die könnt ihr nennen wie ihr wollt (muss aber die Endung .fgd haben) und fügt dort folgendes ein:
@include "halflife2.fgd"
@include "hl2mp.fgd"
@SolidClass base(TriggerOnce) = [COLOR="Red"]trigger_test[/COLOR] :
"test trigger"
[
output OnTouch(void) : "Bei berührung des Spielers aktiviert."
]
das Rot markierte müsst ihr durch den namen ersetzen den ihr beim im Code gewählt habt!
Nun öffnen wir den Hammer für unsere Mod und binden das neue FGD ein.
Wir erstellen uns einen kleinen raum mit einem info_player_deathmatch und einem andern brush, über den wir die Trigger Textur legen.
Nun klicken wir rechts auf dem brush, wählen Tie to Entity und wählen da dann "trigger_test" aus.

Nun bestätigen wir mit Apply und kompilieren.
Dann verschieben wir die Datei in das Maps Verzeichnis unserer MOD.
So müsste das ganze dann aussehen:

Fertig Popertig.
Mein Nickname ist übrigends durch erst wildes herumdrücken, dann meinen richtigen Nickname und ein paar zahlen entstanden:D .
Zu guter letzt hänge ich noch die Datei "triggers.cpp" an in denen meine Änderungen enthalten sind =)
triggers.cppWenn es was gibt, fragt mich einfach;)
Kyle