TUTORIAL 6 - Bouncing Rockets
von AssKicka
Dieses Tutorial zeigt dir, wie du Raketen an der Wand abprallen und weiterfliegen
lassen kannst, in dem du dieses Feature mit einer Konsolenvariable ein- und
ausschalten kannst.
1. EIN NEUES ENTITY FLAG HINZUFÜGEN
Öffne die Datei g_local.h und füge die unterste Zeile hinzu:
// gentity->flags
#define FL_GODMODE 0x00000010
#define FL_NOTARGET 0x00000020
#define FL_TEAMSLAVE 0x00000400 // not the first on the team
#define FL_NO_KNOCKBACK 0x00000800
#define FL_DROPPED_ITEM 0x00001000
#define FL_NO_BOTS 0x00002000 // spawn point not for bot use
#define FL_NO_HUMANS 0x00004000 // spawn point just for bots
#define FL_FORCE_GESTURE 0x00008000 // force gesture on client
#define FL_ROCKETBOUNCE
0x00010000
Wenn du es gewohnt bist bitweise oder mit Flags zu arbeiten,
dann wird dir das sehr vertraut vorkommen. Wenn du jetzt nur dumm aus der
Wäsche schaust, dann wird dir diese Einführung
über Flags und Bitfelder weiterhelfen.
2. EINBAUEN DES "RBOUNCE" BEFEHLS
Nun öffne die Datei g_cmds.c und füge folgendes über der ClientCommand() Funktion
ein:
/*
=================
Cmd_RBounce_f
=================
*/
void Cmd_RBounce_f( gentity_t *ent ) {
char *msg; // message to player
ent->flags ^= FL_ROCKETBOUNCE;
if (!(ent->flags & FL_ROCKETBOUNCE))
msg = "Rocket Bounce OFF\n";
else
msg = "Rocket Bounce ON\n";
trap_SendServerCommand( ent-g_entities, va("print \"%s\"",
msg));
}
Dies erlaubt dem Spieler zwischen abprallenden Raketen hin-
und herzuschalten. Nun gehe weiter unten in die ClientCommand() Funktion
und füge dort unter dem letzten else if, aber noch über dem else folgendes
ein:
else if (Q_stricmp (cmd, "rbounce")
== 0)
Cmd_RBounce_f( ent );
Dieser Teil verarbeitet die Kommandos, die ein Spieler über
die Konsole eingibt (also z.B. "\rbounce") und ruft dann in diesem Fall die
Funktion Cmd_RBounce_f() auf.
3. DIE EIGENSCHAFT DER RAKETEN ÄNDERN
bolt = G_Spawn();
bolt->classname = "rocket";
if (self->flags & FL_ROCKETBOUNCE)
bolt->nextthink = level.time + 2500;
bolt->nextthink = level.time + 10000;
bolt->think = G_ExplodeMissile;
bolt->s.eType = ET_MISSILE;
bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN;
bolt->s.weapon = WP_ROCKET_LAUNCHER;
if (self->flags & FL_ROCKETBOUNCE)
bolt->s.eFlags = EF_BOUNCE;
bolt->r.ownerNum = self->s.number;
Die Abfrage if (self->flags & FL_ROCKETBOUNCE) überprüft,
ob am Client das Feature FL_ROCKETBOUNCE aktiviert ist oder nicht. Wenn
ja, dann wird die Rakete nach 2,5 Sekunden (anstatt 10) explodieren. Der
magische Teil, der unseren Bounce Effekt erzeugt kommt kurz darunter. Wir
fügen zu den eFlags ("effect flags") das Feature EF_BOUNCE hinzu, welches
von der technischen Realisierung her schon in Quake3Arena enthalten ist,
und z.B. beim Grenade Launcher Verwendung findet. In der Datei bg_public.h
(// entityState_t->eFlags)kann man sich eine komplette Liste aller EF_flags
ansehen.
Viel Spaß beim Spielen!
|