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;

else

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!