Ham_TakeDamage - jak używać...?
sebul
17.05.2011
Witam. Poszukuje jakiegoś szczegółowego poradnika na temat zadawania obrażeń poprzez "hamsandwich". Czyli jak zredukować/zwiększyć/usunąć obrażenia i ogólnie wszystkie komendy jakich można w tym użyć. Ostatecznie może być po angielsku, coś tam zawsze zrozumiem, a z translatorem może nawet wszystko.
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).
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).
sztandi 17.05.2011
wystarczy troche poszukac Tutaj
Zadawanie obrazen
ja osobiscie wole to robic w fm
Ten kod po podczepieniu do funkcji bedzie rozrywal gracza na kawalki
Użytkownik sztandi edytował ten post 17.05.2011 11:48
Zadawanie obrazen
ja osobiscie wole to robic w fm
fakedamage(victim, "Twoja Notatka", 100.0, DMG_GENERIC);
Ten kod po podczepieniu do funkcji bedzie rozrywal gracza na kawalki
Użytkownik sztandi edytował ten post 17.05.2011 11:48
Muzzi
17.05.2011
To wycinek z dokumentacji amxx.pl
Plus tak jak wyżej kolega powiedział. Szukaj w dokumentacji amxx a znajdziesz.
#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.
sebul
17.05.2011
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
R3X
17.05.2011
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 łapaniu
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ń
diablix
17.05.2011
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
sebul
18.05.2011
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ć.
DarkGL
18.05.2011
hmm sam nie wiem napewno jak zarejestrujesz jako pre to wykona sie przed tym z diablo tylko w pre mozesz zmieniac dmg
jako post cóż to już trzeba by sprawdzić które pierwsze stawiam ze ham szybciej
jako post cóż to już trzeba by sprawdzić które pierwsze stawiam ze ham szybciej
sztandi 18.05.2011
masz racje funfel tylko ze :
fakedamage - Engine
fm_fakedamage - Fakemeta
fakedamage - Engine
fm_fakedamage - Fakemeta
sebul
19.05.2011
A można używać tego tak
To tylko taki przykład.
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.
R3X
19.05.2011
a dlaczego nie? wykonanie funkcji to właściwie skok z powrotem, nie psuje stosu, czas wykonania tej operacji pasuje do callbacka fwTakeDamage
nie widzę przeszkód
nie widzę przeszkód
DarkGL
19.05.2011
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 : )
sebul
23.05.2011
Który "return" (czy jak to nazwać) powinno się używać? "HAM_IGNORED" czy "HAM_HANDLED"? Opisy te które dał Muzzi jakoś mi tu wiele nie mówią do tych dwóch "returnów", bo zauważyłem też, że w różnych pluginach na przemian się tego używa.
Użytkownik sebul edytował ten post 23.05.2011 09:03
Użytkownik sebul edytował ten post 23.05.2011 09:03
R3X
23.05.2011
używasz jak chcesz potraktować zmiany:
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
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
sebul
23.05.2011
A jak napisze coś takiego
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.
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.
R3X
23.05.2011
return to return; wyjście z wywołania funkcji,
wyobrażasz sobie jakby to miało działać? bo ja nie
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; }
sebul
23.05.2011
No to w takim razie
??
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
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
R3X
23.05.2011
lepiej tak
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ć