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:
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:
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 ;-).