←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Ham_TakeDamage - jak używać...?

  • +
  • -
sebul - zdjęcie 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).
Odpowiedz

sztandi - zdjęcie sztandi 17.05.2011

wystarczy troche poszukac Tutaj

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
Odpowiedz

  • +
  • -
Muzzi - zdjęcie Muzzi 17.05.2011

To wycinek z dokumentacji amxx.pl

#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.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 17.05.2011

wystarczy troche poszukac

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.
Użytkownik sebul edytował ten post 17.05.2011 12:10
Odpowiedz

  • +
  • -
R3X - zdjęcie 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

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ń
Odpowiedz

  • +
  • -
diablix - zdjęcie 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 ł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ń


Warto dodać że w forwardzie można zmieniać parametry poprzez

SetHamParamFloat(which, Float:fValue);


which = numer parametru licząc od lewej
Odpowiedz

  • +
  • -
sebul - zdjęcie 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ć.
Odpowiedz

  • +
  • -
DarkGL - zdjęcie 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
Odpowiedz

mierzwi - zdjęcie mierzwi 18.05.2011

i z tego co wiem to fakedamage to nie fm tylko engine.
Odpowiedz

sztandi - zdjęcie sztandi 18.05.2011

masz racje funfel tylko ze :

fakedamage - Engine

fm_fakedamage - Fakemeta
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 19.05.2011

A można używać tego tak
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.
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 19.05.2011

nie
Odpowiedz

  • +
  • -
R3X - zdjęcie 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
Odpowiedz

  • +
  • -
DarkGL - zdjęcie 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(&params[2]);
	PARSE_RETURN();
}
rzeczywiście to powinno przejść , sory za wprowadzenie w błąd : )
Odpowiedz

  • +
  • -
sebul - zdjęcie 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
Odpowiedz

  • +
  • -
R3X - zdjęcie 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
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 23.05.2011

A jak napisze coś takiego
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.
Odpowiedz

  • +
  • -
R3X - zdjęcie 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
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;
}
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 23.05.2011

No to w takim razie
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
Odpowiedz

  • +
  • -
R3X - zdjęcie 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ć
Odpowiedz