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.
|
Ham_TakeDamage - jak używać...?
#1
Napisano 17.05.2011 11:08
Czytałem ten -> Wpływanie na obrażenia - AMXX.pl: Support AMX Mod X temat, ale czy to już wszystko?
Do tego w jaki sposób działa "HAM_IGNORED" i "HAM_HANDLED", czy też "HAM_SUPERCEDE"?
Może jeszcze dopiszę, że chcę po prostu wiedzieć wszystko, co było by mi potrzebne do edycji diablo, żeby większość obrażeń zadawać właśnie przez "hamsandwich". Na razie tylko nad tym się zastanawiałem, to też sam jeszcze nie wiem jak to będzie wyglądać, w każdym razie trzeba będzie trochę przebudować kod, szczególnie dlatego, że są te redukcje obrażeń z broni i "czarów" (przynajmniej u mnie praktycznie większość rzeczy jest redukowana).
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#3
Napisano 17.05.2011 11:43
#define HAM_IGNORED 1 /** Wywołuje funkcje i zwraca normalna wartość */
#define HAM_HANDLED 2 /**< Wywołuje funkcje jednak informuje moduł o wykonaniu czegoś i zwraca normalną warość */
#define HAM_OVERRIDE 3 /**< Wywołuje funkcje, jednak zwraca cokolwiek ustalone za pomocą SetHamReturn*() */
#define HAM_SUPERCEDE 4 /**< Blokuje wywołanie funkcji */
Plus tak jak wyżej kolega powiedział. Szukaj w dokumentacji amxx a znajdziesz.
#4
Napisano 17.05.2011 12:09
Wiedz, że już nie raz korzystałem z tej dokumentacji, ale żeby chociaż było wszystko opisane w "hamsandwich"... Bo co mi po samych komendach? I wolałbym to mieć na jakiś przykładach (tak jak to chociażby w tym temacie, co podałem na początku), lepiej mi to obrazuje, jak dana rzecz działa, opisy nie zawsze są jasne.wystarczy troche poszukac
Użytkownik sebul edytował ten post 17.05.2011 12:10
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#5
Napisano 17.05.2011 15:39
Można albo złapać obrażenia zadawane przez broń, co jest opisane w temacie do którego sam podałeś link.
Można też spowodować obrażenia za pomocą komendy ExecuteHam(Ham_TakeDamage, ...), reszta parametrów jest taka sam jak przy łapaniu
fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
ExecuteHam(Ham_TakeDamage, this, idinflictor, idattacker, Float:damage, damagebits)otrzymujemy w ten sposób najlepszą metodę zadawania obrażeń
#6
Napisano 17.05.2011 22:51
Hamsandwich jest na tyle cwany, że ciągnie za sobą normalne konsekwencje zadania obrażeń czyli efekty na ekranie, działa też dobrze w przypadku śmierci: dodaje fragi, pieniądze i komunikat o śmierci.
Można albo złapać obrażenia zadawane przez broń, co jest opisane w temacie do którego sam podałeś link.
Można też spowodować obrażenia za pomocą komendy ExecuteHam(Ham_TakeDamage, ...), reszta parametrów jest taka sam jak przy łapaniufwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits)
ExecuteHam(Ham_TakeDamage, this, idinflictor, idattacker, Float:damage, damagebits)otrzymujemy w ten sposób najlepszą metodę zadawania obrażeń
Warto dodać że w forwardzie można zmieniać parametry poprzez
SetHamParamFloat(which, Float:fValue);
which = numer parametru licząc od lewej
#7
Napisano 18.05.2011 13:37
SetHamParamFloat(which, Float:fValue);
W sumie o tym, to już trochę jest w tamtym temacie.
A co się wcześniej wykonuje? Ten rejestr z łapaniem obrażeń z "hamsandwich", czy rejestr wyłapujący obrażenia co jest standardowo w diablo? Wydaje mi się, że to pierwsze, ale wolę zapytać.
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#8
Napisano 18.05.2011 13:45
jako post cóż to już trzeba by sprawdzić które pierwsze stawiam ze ham szybciej
#9
Napisano 18.05.2011 13:59
jeśli masz fejsa i chcesz mi pomóc to wejdź tutaj: Zaproś kumpla by lubił nasz sklep | Facebook
na pewno jakoś C się odwdzięczę!
#10
Napisano 18.05.2011 14:34
fakedamage - Engine
fm_fakedamage - Fakemeta
#11
Napisano 19.05.2011 09:38
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
funkcja(this, damage) // lub inne
return HAM_HANDLED;
}
public funkcja(id, damage) {
if(damage > 0.0) SetHamParamFloat(4, 100.0);
}
To tylko taki przykład.
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#12
Napisano 19.05.2011 12:56
#13
Napisano 19.05.2011 14:19
nie widzę przeszkód
#14
Napisano 19.05.2011 14:55
static cell AMX_NATIVE_CALL SetHamParamFloat(AMX *amx, cell *params) { CHECK_STACK(ParamStack); CVector<Data *> *vec=ParamStack.front(); if (vec->size() < (unsigned)params[1] || params[1] < 1) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid parameter number, got %d, expected %d", params[1], vec->size()); return 0; } Data *dat=vec->at(params[1] - 1); int ret=dat->SetFloat(¶ms[2]); PARSE_RETURN(); }rzeczywiście to powinno przejść , sory za wprowadzenie w błąd : )
#15
Napisano 23.05.2011 09:02
Użytkownik sebul edytował ten post 23.05.2011 09:03
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#16
Napisano 23.05.2011 09:05
nie zrobiłeś nic? niech moduł zignoruje zmiany: HAM_INGORED
zmieniłeś parametry? HAM_HANDLED
zmieniłeś wynik funkcji? HAM_OVERRIDE
sam przetworzyłeś zadanie i chcesz zablokować oryginał? HAM_SUPERCEDE
#17
Napisano 23.05.2011 09:19
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
if(damage < 10.0) {
SetHamParamFloat(4, 100.0);
return HAM_HANDLED;
}
if(zmienna[idattacker] > 0) {
SetHamParamFloat(4, damage+80.0);
return HAM_HANDLED;
}
return HAM_INGORED;
}
to te dwa warunki się wykonają? Czy tylko pierwszy? Bo nie wiem czy tutaj te returny działają na takiej samej zasadzie, co w normalnych funkcjach.
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#18
Napisano 23.05.2011 09:22
wyobrażasz sobie jakby to miało działać? bo ja nie
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){ return HAM_SUPECEDE; if(damage < 10.0) { SetHamParamFloat(4, 100.0); return HAM_HANDLED; } if(zmienna[idattacker] > 0) { SetHamParamFloat(4, damage+80.0); return HAM_HANDLED; } return HAM_INGORED; }
#19
Napisano 23.05.2011 09:34
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){
if(damage < 10.0) {
SetHamParamFloat(4, 100.0);
}
if(zmienna[idattacker] > 0) {
SetHamParamFloat(4, damage+80.0);
}
return HAM_HANDLED;
}
??
To tylko taki przykład, wiem że nie powinno się zmieniać 2 razy jeden parametr.
Użytkownik sebul edytował ten post 23.05.2011 09:35
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#20
Napisano 23.05.2011 09:38
public fwTakeDamage(this, idinflictor, idattacker, Float:damage, damagebits){ new Float:fNewDamage = damage; if(damage < 10.0) { fNewDamage = 100; } if(zmienna[idattacker] > 0) { fNewDamage += 80; } if(fNewDamage != damage){ SetHamParamFloat(4, fNewDamage); return HAM_HANDLED; } return HAM_IGNORED: }ale to Twoje też powinno działać
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych