TUTORIAL 4 - Permanent Haste

von SumFuka


1. WIE HABEN DIE DAS GEMACHT??

(Wie immer bin ich in der Annahme, dass MSVC bei dir gestartet ist, und wir im Verzechnis quake3\mymod arbeiten.)

Nun spielen wir wieder ein wenig Sherlock Holmes. Laß uns etwas über ein spezielles Feature aus dem Quellcode herausfinden. Mhhh... *grübel*... wie wäre es mit der Haste Rune (die Schneller-Laufen-Rune). Ok, wir durchsuchen wieder den kompletten Code nach dem enthaltenen Wort "Haste". Wir werden hier einiges an Einträgen finden.

Suchen nach "Haste"...
C:\Quake3\mymod\code\game\ai_chat.c(364): bs->inventory[INVENTORY_HASTE] ||
C:\Quake3\mymod\code\game\ai_dmq3.c(1745): bs->inventory[INVENTORY_HASTE] = bs->cur_ps.powerups[PW_HASTE] != 0;
C:\Quake3\mymod\code\game\bg_misc.c(535):/*QUAKED item_haste (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
C:\Quake3\mymod\code\game\bg_misc.c(538): "item_haste",
C:\Quake3\mymod\code\game\bg_misc.c(539): "sound/items/haste.wav",
C:\Quake3\mymod\code\game\bg_misc.c(540): { "models/powerups/instant/haste.md3",
C:\Quake3\mymod\code\game\bg_misc.c(541): "models/powerups/instant/haste_ring.md3",
C:\Quake3\mymod\code\game\bg_misc.c(543):/* icon */ "icons/haste",
C:\Quake3\mymod\code\game\bg_misc.c(547): PW_HASTE,
C:\Quake3\mymod\code\game\bg_pmove.c(1681): if ( pm->ps->powerups[PW_HASTE] ) {
C:\Quake3\mymod\code\game\bg_public.h(252): PW_HASTE,
C:\Quake3\mymod\code\game\g_active.c(831): if ( client->ps.powerups[PW_HASTE] ) {
C:\Quake3\mymod\code\game\g_rankings.c(883): case PW_HASTE:
C:\Quake3\mymod\code\game\g_rankings.c(884): trap_RankReportInt( self, -1, QGR_KEY_HASTE, 1, 1 );
C:\Quake3\mymod\code\game\g_rankings.h(311):#define QGR_KEY_HASTE 1111060300
C:\Quake3\mymod\code\game\inv.h(40):#define INVENTORY_HASTE 37
C:\Quake3\mymod\code\game\inv.h(100):#define MODELINDEX_HASTE 30
Es wurde(n) 17 Übereinstimmung(en) gefunden.

Ok, wir haben einige interessante Sachen gefunden. Sehen wir uns den Teil näher an, in dem "item_haste" steht. In dem Bereich sehen wir, dass die Modell- und Soundeigenschaften für die Haste Rune zugewiesen werden. Ein wenig weiter unten entdecken wir if ...blah... PW_HASTE. Das ist daher interesannt, da dieser code nur ausgeführt wird, wenn wir die Haste Rune eingesammelt haben. Das untere if mit der Abfrage einer Eigenschaft des Client, setzt folgenden Befehl:

client->ps.speed *= 1.3;

Also, wenn wir die Haste Rune haben, so können wir 30 Prozent schneller Laufen. Der "*=" Operator bedeuted nämlich eine Multiplikation mit sich selbst, also in anderen Worten "Multipliziere die jetzigen Geschwindigkeit 1,3 hinzu". Wenn wir noch ein wenig weiter oben nachsehen, erkennen wir, dass dieses ein Teil der ClientThink_real() Funktion ist. Durch unseren geschickten Detektivscharfsinn haben wir also etwas herausgefunden, das so nicht im Handbuch oder irgendwo sonst dokumentiert gewesen wäre.

Gute Arbeit, Watson!


2. LASST UNS ETWAS ÄNDERN
Ok, geben wir uns doch einfach permanent die Wirkung der Haste-Rune. Ändere das obige Codestück auf folgendes:


if ( qtrue ) {

client->ps.speed *= 1.3;

}

Das essentielle Stück (client->ps.speed *= 1.3;) wird jetzt nicht nur mit der if Bedingung, die auf Haste Rune prüft, ausgeführt, sondern wir haben dieser Bedingung den Wahrheitswert "qtrue" zugewiesen, d.h. das Programm wird jedesmal in dem Code ausführen, egal ob wir im Besitz der Rune sind oder nicht. In anderen Worten: Permanentes Haste. Kompiliere das Programm und liefere dir eine Runde mit den Bots.

Versteckter Hinweis: Spiele diesen Mod nicht zu lange, du wirst sonst gaga ;-).