używając modułu hamsandwich
Aby mieć możliwość edycji obrażeń należy złapać zdarzenie Ham_TakeDamage z post=0
#include <amxmodx> #include <amxmisc> #include <hamsandwich> #define PLUGIN "HamSandwich Damage" #define VERSION "1.0" #define AUTHOR "R3X" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) RegisterHam(Ham_TakeDamage, "player","fwTakeDamage",0); }
event łapiemy w funkcji (ja nazwałem ją "fwTakeDamage"), której parametry są następujące
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){ return HAM_IGNORED; }
this - atakowany gracz
idinflictor - byt zadający obrażenia
idattacker - byt powodujący obrażenia
damage - wielkość obrażeń
damagebits - typ obrażeń
jeśli idattacker to gracz zazwyczaj idinflictor to również id atakującego, wyjątek stanowi granat: w tym przypadku idinflictor to indeks bytu granatu
w przeciwnym razie (!is_user_connected(idattacker)), idinflictor może być bytem typu trigger_hurt lub po prostu 0
damagebits przekazuje informacje o obrażeniach na podstawie składowych flag:
#define DMG_GENERIC 0 // Generic damage was done #define DMG_CRUSH (1<<0) // Crushed by falling or moving object #define DMG_BULLET (1<<1) // Shot #define DMG_SLASH (1<<2) // Cut, clawed, stabbed #define DMG_BURN (1<<3) // Heat burned #define DMG_FREEZE (1<<4) // Frozen #define DMG_FALL (1<<5) // Fell too far #define DMG_BLAST (1<<6) // Explosive blast damage #define DMG_CLUB (1<<7) // Crowbar, punch, headbutt #define DMG_SHOCK (1<<8) // Electric shock #define DMG_SONIC (1<<9) // Sound pulse shockwave #define DMG_ENERGYBEAM (1<<10) // Laser or other high energy beam #define DMG_NEVERGIB (1<<12) // With this bit OR'd in, no damage type will be able to gib victims upon death #define DMG_ALWAYSGIB (1<<13) // With this bit OR'd in, any damage type can be made to gib victims upon death. #define DMG_DROWN (1<<14) // Drowning #define DMG_PARALYZE (1<<15) // Slows affected creature down #define DMG_NERVEGAS (1<<16) // Nerve toxins, very bad #define DMG_POISON (1<<17) // Blood poisioning #define DMG_RADIATION (1<<18) // Radiation exposure #define DMG_DROWNRECOVER (1<<19) // Drowning recovery #define DMG_ACID (1<<20) // Toxic chemicals or acid burns #define DMG_SLOWBURN (1<<21) // In an oven #define DMG_SLOWFREEZE (1<<22) // In a subzero freezer #define DMG_MORTAR (1<<23) // Hit by air raid (done to distinguish grenade from mortar) #define DMG_TIMEBASED (~(0x3fff)) // Mask for time-based damagenp.
if(damagebits&DMG_BLAST){ //gracz prawdopodobnie zginął od wybuchu bomby }
Zarejestrowanie Ham_TakeDamage z post = 0 daje możliwość ingerencji w przebieg tego wydarzenia.
Możemy po prostu anulować obrażenia przez zwrócenie HAM_SUPERCEDE lub HAM_OVERRIDE
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){ return HAM_SUPERCEDE; }
albo zmienić dowolny parametr funkcji przy użyciu funkcji SetHamParam*, gdzie * to typ argumentu.
SetHamParamInteger - dla liczby całkowitej
SetHamParamFloat - dla liczby rzeczywistej
SetHamParamVector - dla wektora (Float:v[3])
SetHamParamEntity - dla bytu (np. id gracza)
SetHamParamString - tekst
Po operacjach zwracamy HAM_HANDLED, aby zatwierdzić zmiany.
Przykład:
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){ SetHamParamFloat(4, 100.0); return HAM_HANDLED; }Zmieniamy czwarty argument (damage) typu Float: na 100.0, co spowoduje, że praktycznie każde uderzenie czy upadek skończy się śmiercią.
W połączeniu z warunkami daje to nam całkowitą kontrolę nad obrażeniami.
Uwaga:
Broń z jakiej zadane zostały obrażenia (przy podłączony idattacker) to:
- w przypadku idinflictor==idattacker
new bron = get_user_weapon(idattacker);- w przypadku idinflictor!=idattacker
new bron = CSW_HEGRENADE;