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
 

Zdjęcie

Ham_TakeDamage - jak używać...?


  • Zamknięty Temat jest zamknięty
70 odpowiedzi w tym temacie

#1 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.05.2011 11:08

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).
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#2 sztandi

    Życzliwy

  • Zbanowany

Reputacja: 2
Nowy

  • Postów:30
  • Imię:Daniel
  • Lokalizacja:Wroclaw
Offline

Napisano 17.05.2011 11:36

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


#3 Muzzi

    Guru

  • Przyjaciel

Reputacja: 228
Wszechwidzący

  • Postów:772
  • Lokalizacja:Kraków
Offline

Napisano 17.05.2011 11:43

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.
  • +
  • -
  • 3

#4 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.05.2011 12:09

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

  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#5 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 17.05.2011 15:39

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ń
  • +
  • -
  • 1

#6 diablix

    emeryt

  • Przyjaciel

Reputacja: 507
Wszechwiedzący

  • Postów:663
  • GG:
  • Steam:steam
  • Imię:Daniel
  • Lokalizacja:Warszawa
Offline

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 ł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
  • +
  • -
  • 1

#7 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

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ć.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#8 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 18.05.2011 13:45

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
  • +
  • -
  • 0

#9 mierzwi

    Banned

  • Zbanowany

Reputacja: 235
Wszechwidzący

  • Postów:651
  • Lokalizacja:Polska
Offline

Napisano 18.05.2011 13:59

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

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 sztandi

    Życzliwy

  • Zbanowany

Reputacja: 2
Nowy

  • Postów:30
  • Imię:Daniel
  • Lokalizacja:Wroclaw
Offline

Napisano 18.05.2011 14:34

masz racje funfel tylko ze :

fakedamage - Engine

fm_fakedamage - Fakemeta

#11 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 19.05.2011 09:38

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.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#12 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 19.05.2011 12:56

nie
  • +
  • -
  • 1

#13 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 19.05.2011 14:19

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
  • +
  • -
  • 1

#14 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

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

#15 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 23.05.2011 09:02

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

  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#16 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 23.05.2011 09:05

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
  • +
  • -
  • 2

#17 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 23.05.2011 09:19

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.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#18 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 23.05.2011 09:22

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;
}

  • +
  • -
  • 1

#19 sebul

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 23.05.2011 09:34

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

  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#20 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 23.05.2011 09:38

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ć
  • +
  • -
  • 1




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych