TUTORIAL 3 - HELLO, QWORLD !

von SumFuka


"Ey Caramba!". Ok, du hast nun die Vorkenntnisse zum compilen der qagamex86.dll - wenn du das noch nicht geschafft hast, dann musst du dir die anderen Tutorials nochmal genau durchlesen.

In diesem Tutorial werden wir nicht wirklich "Hello, Qworld!" in der Console ausgeben (langweilig!), wir werden dafür lieber die Geschwindigkeit der Raketen verändern. Dazu werden wir das ein oder andere über Raketen in Quake dabei lernen. Jetzt aber los!

1. SICHERE DEINEN CODEBESTAND
Es ist immer empfehlenswert eine originale Version des Quellcodes in Reichweite zu haben. Stell dir vor, du verpfuschst deinen Quellcode (löschst wichtige Zeilen, oder was auch immer), dann wirst du ein Backup brauchen! Und bevor du jedes mal den kompletten Source aus der .exe Datei neu installierst, laß uns einfach quake3\source unverändert behalten. MACHE KEINE ÄNDERUNGEN in quake\source!! Wir werden unsere Mods in extra Unterverzeichnissen erstellen... laß uns damit anfangen, das Verzeichnis quake3\mymod zu erstellen.

Ok, nun kopieren wir einfach alles von quake3\source in quake\mymod. Von nun ab wird nur noch auf quake3\mymod\code\quake3sdk.dsw doppelgeklickt. Von nun ab gelten alle Tutorials für dieses Verzeichnis (es mag lohnenswert sein auf dem Desktop eine Verknüpfung zur .dsw Datei zu erstellen). Wenn du im vorherigen Tutorial die Ausgabeverzeichnisse richtig gesetzt hast, sollte die .dll Datei für mymod im Verzeichnis quake3\mymod kompiliert werden. Kompiliere den "Game" Teil und überprüfe dies!

Wann immer wir mit einem Tutorial fertig sind, und unseren Codezustand wieder aufs Original zurücksetzen wollen, kopieren wir einfach quake3\source in quake3\mymod hinein. Du kannst so viele Mod Verzeichnisse erstellen, wie es dir Spaß macht. Ich habe meistens mehr als einen Mod in Bearbeitung... quake3\rail, quake3\cts, etc... nur deine Festplatte setzt die Grenze!


2. SUCHE ETWAS INTERESSANTES
Laß uns nun quake3sdk.dsw in MSVC laden. Maximiere das Fenster, du wirst all die Informationen brauchen, die deine Desktopauflösung dir bieten kann. Stelle sicher, dass "game" als aktives Projekt ausgewählt ist.Gehe links unten auf die Ordnerlasche "Dateien" und suche die Quellcode Datei "g_missile.c" in dem Baum. Sobald du diese hast, mache einen Doppelklick darauf. Voila, der Code steht nun im Editorfenster.

Gehe nun in Zeile 621 (falls es nicht genau dort steht, musst du selbst im Quellcode ein wenig suchen) und schau dir dort die fire_rocket Funktion an:

/*
=================
fire_rocket blah
=================
*/

gentity_t *fire_rocket (gentity_t *self, vec3_t start, vec3_t dir){

gentity_t *bolt;

VectorNormalize (dir);

bolt = G_Spawn();
bolt->classname = "rocket";
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;
bolt->r.ownerNum = self->s.number;
bolt->parent = self;
bolt->damage = 100;
bolt->splashDamage = 100;
bolt->splashRadius = 120;
bolt->methodOfDeath = MOD_ROCKET;
bolt->splashMethodOfDeath = MOD_ROCKET_SPLASH;
bolt->clipmask = MASK_SHOT;

bolt->s.pos.trType = TR_LINEAR;
bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame
VectorCopy( start, bolt->s.pos.trBase );
VectorScale( dir, 900, bolt->s.pos.trDelta );
SnapVector( bolt->s.pos.trDelta ); // save net bandwidth
VectorCopy (start, bolt->r.currentOrigin);

return bolt;


}

Jetzt ist genau die richtige Zeit um sich die passenden Hintergrundinformationen in unserem Artikel über Entities zu holen!

Schon wieder zurück? Großartig. Die oberste Zeile im Funktionsrumpf erzeugt ein neues Entity (genannt bolt). Die G_Spawn() Funktion erzeugt ein "leeres" Entity... Die nächste Aufgabe ist es all die kleinen Details (welche Art Entity ist es? Was sind die Eigenschaften? ...) zuzuweisen. Das tun die etwa nächsten ca. 20 Zeilen im Code.

Zuerst wird dem bolt "rocket" zugewiesen, und das Entity soll in 10 Sekunden wieder "denken" (think) (die Zeitangaben sind in 1/1000 Sekunden in der Quake-Welt, d.h. 1000 ist gleichzusetzen mit einer Sekunde). Wenn eine Rakete "denkt", dann wird sie die Funktion G_ExplodeMissile aufrufen. In anderen Worten, wenn die Rakete bisher nichts berührt hat, so wird sie von selbst nach 10 Sekunden explodieren. Dieser Mechanismus verhindert es, das Raketen unendlich lange im Raum umherfliegen.

Geschickt haben wir etwas über das Spiel herausgefunden, nur in dem wir in den Code hineingeschaut haben. Mal sehen, was wir sonst noch so herausbekommen können...

Wir sehen, dass eine Rakete 100 Schaden verursacht (egal ob direkt ODER splash), und dass der Radius der Splash Damage 120 Einheiten beträgt. Ein paar Zeilen weiter unten erfahren wir, dass sich eine Rakete mit 900 Einheiten pro Sekunde fortbewegt. Außerdem gibt es noch eine ganze Menge an Konstanten in dieser Funktion (constanten sind normalerweise GROSS GESCHRIEBEN)... bei den meisten kann man erahnen, um was es sich handelt. "ET_MISSILE" bedeuted z.B. "Entitiy Type: Missile" (im Gegensatz zu z.B. Item oder einem Spieler).

3. UNSERE ERSTEN ÄNDERUNGEN IM CODE
Lasst uns die Zeile mit Vectorscale ändern, so dass die danach folgendermaßen aussieht:


VectorScale( dir, 300, bolt->s.pos.trDelta );

Drücke F7 zum kompilieren der .dll Datei. Lade Quake (die Verknüpfung muß nun auf +set fs_game mymod angepasst werden) und überprüfe, ob es funktioniert hat. Die Raketen sollten nun deutlich langsamer fliegen!

Du hast es geschafft! Das erste richtige Tutorial! Laß uns in diesem Temp weitermachen!