Właściciel GET Opublikowano 6 Sierpnia 2012 Właściciel Opublikowano 6 Sierpnia 2012 Wpływanie na obrażenia używając modułu hamsandwich Aby mieć możliwość edycji obrażeń należy złapać zdarzenie Ham_TakeDamage z post=0 #include #include #include #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 damage przykład: 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; Autor: "ertrzyiks" amxx.pl Uwagi: to, że daję tutoriale, które ktoś zrobił nie oznacza, że tego nie potrafię lub z tego korzystam ;)
Właściciel GET Opublikowano 6 Czerwca 2017 Autor Właściciel Opublikowano 6 Czerwca 2017 Wiadomość została wygenerowana automatycznie. Ten temat został oznaczony przez Moderatora jako spam i wyrzucony do -> archiwum. Jeśli się z tym nie zgadzasz, raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Rekomendowane odpowiedzi