/**
* Description: Usually called whenever an entity takes any kind of damage.
* Inflictor is the entity that caused the damage (such as a gun).
* Attacker is the entity that tirggered the damage (such as the gun's owner).
* Forward params: function(this, idinflictor, idattacker, Float:damage, damagebits);
* Return type: Integer.
* Execute params: ExecuteHam(Ham_TakeDamage, this, idinflictor, idattacker, Float:damage, damagebits);
*/
Ham_TakeDamage,
this to id ofiary obrażeń
idinflictor to id bytu zadającego obrażenia
idattacker to id bytu, będącego atakującym.
damage to zadawane obrażenia (nie zabierane życie)
damagebits to flagi obrażeń (np. od ognia, gazu trującego, czy kuli pistoletu)
Zauważ, że atakujący (
idattacker) nie musi być graczem, może być to równie dobrze lawa, prąd lub byt bólu.
Należy zatem sprawdzić, czy atakujący jest graczem i najlepiej dodać warunek na to, czy jest on z innej drużyny.
Nie zawsze jednak atakujący jest określony lub jest określony poprawnie. Wówczas istnieje szansa, że odczytamy atakującego,
pobierając id właściciela bytu zadającego obrażenia (np. właściciela granatu HE, czyli osobę, która granat w nas rzuciła).
Nie uwzględnienie tego sprawi, że będziesz próbował chociażby pobrać element tablicy o indeksie bytu > 33, co zakończy się każdorazowo błędem.
Przykład implementacji:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#define IsPlayer(%1) (1<=%1<=maxPlayers)
new wiekszy_dmg[33], maxPlayers;
public plugin_init(){
register_plugin("", "", "");
RegisterHam(Ham_TakeDamage, "player", "TakeDamage", 0);
}
public plugin_cfg(){
maxPlayers=get_maxplayers();
}
public TakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
new ioid, // inflictor owner id, czyli id bytu zadającego obrażenia
raid; // real attacker id, czyli gracz odpowiedzialny za zadanie obrażeń
if(IsPlayer(idattacker)){
raid=idattacker; // atakujący jest graczem
} else {
ioid=pev(idinflictor, pev_owner); // pobranie właściciela bytu zadającego obrażenia
if(IsPlayer(ioid)){
raid=ioid; // właściciel bytu zadającego obrażenia jest graczem
}
}
if(raid && wiekszy_dmg[raid]){
new Float:newdamage = damage*1.1
SetHamParamFloat(4, newdamage);
return HAM_HANDLED;
}
return HAM_IGNORED;
}