Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Sebuś :** - zdjęcie

Sebuś :**

Rejestracja: 14.11.2013
Aktualnie: Nieaktywny
Poza forum Ostatnio: 18.11.2013 03:23
-----

#83575 Wpływanie na obrażenia

Napisane przez R3X w 21.09.2009 18:31

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 <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 damage
np.
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;

  • +
  • -
  • 25