TUTORIAL 15 - Beintreffer
von McBain
1. Voraussetzung
Dieses Tutorial setzt voraus, dass bereits Trefferzonen implementiert sind. Wir werden den
Code aus Tutorial 14 zugrundelegen, es sollte aber auch mit jedem anderen Trefferzonensystem
funktionieren. Dieses Tutorial zeigt, wie die Geschwindigkeit des Spielers durch Fusstreffer
verringert und durch Aufnahme von Health wieder erhöht werden kann.
2. Verlangsamung durch Treffer
Öffne zuerst g_combat.c im game Projekt.
Folgenden Code hast du in Tutorial 14 in G_LocationDamage eingefügt:
switch ( targ->client->lasthurt_location &
~(LOCATION_BACK | LOCATION_LEFT | LOCATION_RIGHT | LOCATION_FRONT) )
{
case LOCATION_HEAD:
take *= 1.8;
break;
case LOCATION_FACE:
if (targ->client->lasthurt_location & LOCATION_FRONT)
take *= 5.0; // Faceshots REALLY suck
else
take *= 1.8;
break;
case LOCATION_SHOULDER:
if (targ->client->lasthurt_location & (LOCATION_FRONT | LOCATION_BACK))
take *= 1.4; // Throat or nape of neck
else
take *= 1.1; // Shoulders
break;
case LOCATION_CHEST:
if (targ->client->lasthurt_location & (LOCATION_FRONT | LOCATION_BACK))
take *= 1.3; // Belly or back
else
take *= 0.8; // Arms
break;
case LOCATION_STOMACH:
take *= 1.2;
break;
case LOCATION_GROIN:
if (targ->client->lasthurt_location & LOCATION_FRONT)
take *= 1.3; // Groin shot
break;
case LOCATION_LEG:
take *= 0.7;
break;
case LOCATION_FOOT:
take *= 0.5;
break;
}
Dieser Code prüft den unteren Teil des Körpers auf Beintreffer (auch wenn sich der Spieler duckt).
Die Schadenswerte liegen bei 70% des normalen Schadens für Beintreffer und 50% für Fusstreffer.
Diese Werte kannst du beliebig verändern.
Um nun den getroffenen Spieler zu verlangsamen, füge folgende Zeilen unter take*=0.7; und take*=0.5;
case LOCATION_GROIN:
if (targ->client->lasthurt_location & LOCATION_FRONT)
take *= 1.3; // Groin shot
break;
case LOCATION_LEG:
take *= 0.7;
targ->client->ps.speed -= take; // slowdown if shot in legs, McBain
break;
case LOCATION_FOOT:
take *= 0.5;
targ->client->ps.speed -= take; // slowdown if shot in foot, McBain
break;
}
Diese Änderung ist recht simpel. Die Geschwindigkeit (speed) des getroffenen Spielers (targ)
wird um den Wert des Schadens verringert. Du kannst diese Abhängigkeit natürlich deinen
Vorstellungen anpassen.
3. Geschwindigkeit beim Respawn zurücksetzen
Öffne nun g_client.c und suche die Funktion ClientSpawn. Füge folgenden Code ein:
// health will count down towards max_health
ent->health = client->ps.stats[STAT_HEALTH] = client->ps.stats[STAT_MAX_HEALTH] * 1.25;
// return to normal speed, McBain
client->ps.speed = g_speed.value;
G_SetOrigin( ent, spawn_origin );
VectorCopy( spawn_origin, client->ps.origin );
Dadurch wird die Geschwindigkeit des Spielers beim Respawn auf den Standardwert des Servers
gesetzt.
4. Erholung bei Aufnahme von Health
Öffne g_items.c und darin die Funktion Pickup_Health, füge folgenden Code ein:
if ( ent->count ) {
quantity = ent->count;
} else {
quantity = ent->item->quantity;
}
other->health += quantity;
// return speed upon health pickup or more than maximum health, McBain
other->client->ps.speed += quantity;
if (other->client->ps.speed > g_speed.value) {
other->client->ps.speed = g_speed.value;
}
if (other->health >= other->client->ps.stats[STAT_MAX_HEALTH]) {
other->client->ps.speed = g_speed.value;
}
// end McBain
if (other->health > max ) {
other->health = max;
}
Hier wird die Geschwindigkeit entsprechend des aufgenommenen Health erhöht, das Maximum ist die
Standardgeschwindigkeit des Servers.
Dieser Code hat noch eine Schwachstelle: wenn der Spieler Megahealth aufgenommen hat, und einen
Fusstreffer bekommt, hat er zwar mehr als 100 Health wird aber trotzdem langsamer. Diesen einfachen
Fehler zu beheben, bleibt dem geneigten Leser überlassen (ich hasse diesen Spruch ;) ). Nebenbei
muss man in diesem Fall nur eine beliebige Menge Health aufnehmen, um wieder normal schnell zu
sein.
5. Eine weitere Ausbesserung
Eine Sache noch: der Q3 Code aktualisiert die Geschwindigkeit des Spielers während jedes "player
think", um z.B. die Wirkung des Haste-powerup an/aus zu schalten. Wir müssen verhindert, dass diese
Funktion unsere Änderungen rückgängig macht. Öffne also g_active.c, suche die Funktion ClientThink_real und kommentiere folgende Zeilen aus:
client->ps.gravity = g_gravity.value;
// set speed
// out by McBain for speed damage
// client->ps.speed = g_speed.value;
if ( client->ps.powerups[PW_HASTE] ) {
client->ps.speed *= 1.3;
}
Tadaa, fertig !
<<
Tutorial 14 | | Tutorial
16
>>