Skocz do zawartości

[KOSZ] [PAWN] Wpływanie na obrażenia


Rekomendowane odpowiedzi

  • Właściciel
Opublikowano

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

  • 4 lata później...
  • Właściciel
Opublikowano

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.

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Polityka prywatności