W tym poradniku postaram się opisać kilka operacji związanych z obrażeniami.
Wstęp
- Opis argumentów funkcji RegisterHam
- Argument 1 = Ham_TakeDamage: Ten argument oznacza jakie zdarzenie chcemy "złapać". Skoro chcemy przechwycić zadawanie obrażeń, będzie to Ham_TakeDamage.
- Argument 2 = "player": Drugi argument oznacza klasę u której chcemy "złapać" zdarzenie, w tym wypadku zadanie obrażeń. Ta wartość oznacza gracza.
- Argument 3 = "fw_TakeDamagePre": Jest to po prostu nazwa funkcji, za pomocą której będziemy "łapać" zdarzenie.
- Argument 4: W tym wypadku nie podaje jego wartości, ponieważ jego domniemana wartość to 0. 0 oznacza, iż chcemy złapać moment przed zdarzeniem ( daje to możliwość modyfikacji parametrów zdarzenia ). 1 oznacza, że nie mamy już wpływu na przebieg zdarzenia.
2. Opis argumentów zdarzenia Ham_TakeDamage
- this - identyfikator istoty ( bytu, entu, etc. ), która otrzyma/ła obrażenia
- idinflictor - identyfikator bytu zadającego obrażenia, zwykle idinflictor == idattacker, jednak kiedy obrażenia zadaje przykładowo granat to w tym argumencie właśnie będzie jego identyfikator.
- idattacker - identyfikator osoby, istoty, bytu, etc. która atakuje this-a
- Float:damage - ilość zadawanych obrażeń ( zwróć uwagę iż jest to liczba typu float )
- damagebits - bit typ/ów zadanych obrażeń ( więcej: http://amxx.pl/topic/28881-damagebits/ )
a) Natychmiastowe zabicie z X broni:
hamsandwich amxmodx
1. Zarejestruj w plugin_init zdarzenie z modułu hamsandwich, Ham_TakeDamage.
RegisterHam( Ham_TakeDamage, "player", "fw_TakeDamagePre" );
2. "Utwórz" funkcję:
public fw_TakeDamagePre( this, idinflictor, idattacker, Float:damage, damagebits )
{
// tu będzie kod
}
3. Wewnątrz funkcji, sprawdź czy this i idattacker żyją:
if( !is_user_alive( idattacker ) || !is_user_alive( this ) )
return HAM_IGNORED;
4. Jeżeli chcesz, aby było natychmiastowe zabicie z granatu dodaj taki warunek:
if( idinflictor == idattacker )
return HAM_IGNORED;
if( !(damagebits & (1<<24) ) )
return HAM_IGNORED;
- Teraz dodajemy natychmiastowe zabicie z HE:
SetHamParamFloat( 4, float( get_user_health( this ) + 1) );
return HAM_HANDLED;
- Jeżeli chcesz mieć ułamkową szansę na natychmiastowe zabicie przed powyższym kodem dodaj:
if( !random( X ))
return HAM_IGNORED;
Jako x należy podstawić wartość zakresu, np. jeżeli dasz 5, to szansa będzie 1/5.
4. Jeżeli chcesz, aby było natychmiastowe zabicie z innej broni niż granat dodaj warunek:
if( idifnlictor != idattacker )
return HAM_IGNORED;
- Teraz sprawdźmy z jakiej broni zabito:
if( get_user_weapon( idattacker ) != Y )
Jako Y należy podstawić definicje identyfikatora naszej broni.
return HAM_IGNORED; - Teraz dodajemy natychmiastowe zabicie z naszej broni:
SetHamParamFloat( 4, float( get_user_health( this ) + 1) );
return HAM_HANDLED; - Jeżeli chcesz mieć ułamkową szansę na natychmiastowe zabicie przed powyższym kodem dodaj:
if( !random( X ))
return HAM_IGNORED;
Jako x należy podstawić wartość zakresu, np. jeżeli dasz 5, to szansa będzie 1/5.
B) Odporność ( % ) na obrażenia
1. Zarejestruj w plugin_init zdarzenie z modułu hamsandwich, Ham_TakeDamage.
RegisterHam( Ham_TakeDamage, "player", "fw_TakeDamagePre" );
2. "Utwórz" funkcję:
public fw_TakeDamagePre( this, idinflictor, idattacker, Float:damage, damagebits )
{
// tu będzie kod
}
3. Wewnątrz funkcji, sprawdź czy this i idattacker żyją:
if( !is_user_alive( idattacker ) || !is_user_alive( this ) )
return HAM_IGNORED;
4. Teraz dodajemy już ostatnie 2 linie:
SetHamParamFloat( 4, damage * ( 1.00 - ( O_ILE_PROCENT_ZMNIEJSZAMY_OBRAZENIA / 100 ) ) );
return HAM_HANDLED;
Chyba nie muszę tłumaczyć co podstawiamy za O_ILE_PROCENT_ZMNIEJSZAMY_OBRAZENIA.
c) Obrażenia większe o %
1. Zarejestruj w plugin_init zdarzenie z modułu hamsandwich, Ham_TakeDamage.
RegisterHam( Ham_TakeDamage, "player", "fw_TakeDamagePre" );
2. "Utwórz" funkcję:
public fw_TakeDamagePre( this, idinflictor, idattacker, Float:damage, damagebits )
{
// tu będzie kod
}
3. Wewnątrz funkcji, sprawdź czy this i idattacker żyją:
if( !is_user_alive( idattacker ) || !is_user_alive( this ) )
return HAM_IGNORED;
4. Teraz dodajemy już ostatnie 2 linie:
SetHamParamFloat( 4, damage * ( 1.00 + ( O_ILE_PROCENT_ZWIĘKSZAMY_OBRAZENIA / 100 ) ) );
return HAM_HANDLED;
Chyba nie muszę tłumaczyć co podstawiamy za O_ILE_PROCENT_ZWIĘKSZAMY_OBRAZENIA.
d) Szansa na pełną absorpcję obrażeń
1. Zarejestruj w plugin_init zdarzenie z modułu hamsandwich, Ham_TakeDamage.
RegisterHam( Ham_TakeDamage, "player", "fw_TakeDamagePre" );
2. "Utwórz" funkcję:
public fw_TakeDamagePre( this, idinflictor, idattacker, Float:damage, damagebits )
{
// tu będzie kod
}
3. Wewnątrz funkcji, sprawdź czy this i idattacker żyją:
if( !is_user_alive( this ) )
return HAM_IGNORED;
4. W poniższym kodzie jako X wstaw szansę na absorpcję ( 1/X ):
if( !random( X ))
return HAM_IGNORED;
5. Teraz dodajemy już ostatnie 2 linie:
return HAM_SUPERCEDE;
Jeżeli macie jeszcze jakieś pomysły na nowe podpunkty dotyczące operacji na obrażeniach, proszę pisać śmiało w komentarzach :)