var C NPC attacker 3621 10

O temacie

Autor pawbuj

Zaczęty 15.04.2014 roku

Wyświetleń 3621

Odpowiedzi 10

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
już dość długo imam się problemem określenia NPC jako atakującego tzw. "attacker" czyli tego, który wyprowadza cios i zadaje obrażenia.

chodzi mi o jwyznaczonego NPC jako attackera, którego obrażenia powodować będą uruchomienie funkcji u otrzymującego ciosy ( wyświetlanie ilośći zadawanych obrażeń).

stworzyłem definicję atakującego, która uruchamia się w perceptionie, odp.za obrażenia.

niestety jak na razie działa, kiedy attackerem jest wyłaćznie Hero.

func int C_NpcIsAngel(var C_NPC oth)
{
PrintDebugNpc (PD_ZS_DETAIL,"C_NpcIsAngel");
//PrintDebugString (PD_ZS_DETAIL,"...name: ", oth.name);
var C_NPC Gomez; Gomez = Hlp_GetNpc(EBR_100_Gomez);
if Hlp_IsValidNpc (Gomez)
||(oth.guild == GIL_EBR)
//(oth.id == 100)
{
PrintDebugNpc (PD_ZS_DETAIL,"...true");
return TRUE;
PrintScreen ("GorHanis dostaje kopa ", 2, 48, _STR_FONT_ONSCREEN, 2 );
}
else
{
PrintDebugNpc (PD_ZS_DETAIL,"...false");
return FALSE;
};
};
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Cytuj
już dość długo imam się problemem określenia NPC jako atakującego tzw. "attacker" czyli tego, który wyprowadza cios i zadaje obrażenia.

chodzi mi o jwyznaczonego NPC jako attackera
Wyjaśnij co to znaczy "problem określenia NPC jako ataującego" i "chodzi mi o wyznaczonego".
Ty chcesz ustawić wartość zmiennej attacker i masz z tym problem? Chcesz odczytać wartość zmiennej attacker i masz z tym problem? Chcesz wiedzieć jak działa zmienna attacker? W czym problem?

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
łatwiej będzie jak powiem w praktyce, jak chcę żeby było to zrobione.

mamy NPC np. Angel (non_1000_angel).

Angel zadaje losowym NPC obrażenia .

Teraz chciałbym, aby zadawane obrażenia tylko i wyłącznie od Angela były zapisywane/wyświetlane w postaci zmiennej.

czyli funkcja uruchomi się wyłącznie, kiedy atakującym (attackerem) jest Angel i meritum sprawy jest jak wyodrębnić wartość zadawanych obrażeń tylko od Angela. .

 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Znajdź miejsce gdzie wywołujesz swoją funkcję wyświetlającą obrażenia. Prawdopodobnie będzie to w funkcji zs_reacttodamage.
Na początku linijki dodaj
if (Hlp_GetInstanceID(other) == non_1000_angel) { A na końcu
}
Atakujący będzie w zmiennej other. Ogólnie cały twój pierwszy post to brednie. Nie pisz kodu na ślepo kopiując kawałków których nie rozumiesz. Mam wrażenie że podobnie jest z tym "jako atakującego tzw. "attacker"".

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
tu jest kawałek skryptu, gdzie definiowany jest attacker.

czy jest to zmienna dla klasy NPC zdefiniowana  w silniku i co dokładnie oznacza?
//////////////////////////////////////////////////////////////////////////
// C_ChargeWasAttacked
// ===================
// Ermittelt, ob ein Schützling der NSC-Wache attackiert wurde.
//////////////////////////////////////////////////////////////////////////
func int C_ChargeWasAttacked(var C_NPC guard, var C_NPC charge, var C_NPC attacker)
{
PrintDebugNpc (PD_ZS_DETAIL, "C_ChargeWasAttacked" );

if C_NpcIsGuard(guard)
|| C_NpcIsGuardArcher(guard)
|| (guard.npctype == NPCTYPE_GUARD)
|| (guard.npctype == NPCTYPE_MINE_GUARD)
{
PrintDebugNpc (PD_ZS_DETAIL, "...NSC ist Wache oder FK-Wache!" );

if (Npc_GetAttitude(guard, charge) == ATT_FRIENDLY)
&& (Npc_GetAttitude(guard, attacker) != ATT_FRIENDLY)
{
PrintDebugNpc(PD_ZS_DETAIL, "...true");
return TRUE;
};
};

PrintDebugNpc (PD_ZS_DETAIL, "...false");
return FALSE;
};

 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Nie, to nie jest zmienna zdefiniowana w silniku, po prostu tak nazwali sobie argument tej jednej funkcji. Mogli tam napisać np "dupa" i efekt byłby ten sam. Nie masz do tego odniesienia nigdzie poza tą funkcją. Napisałem ci co masz zrobić - przy odpalaniu perc_assessdamage, other jest ustawiany na atakującego, a self na atakowanego. Musisz sprawdzić czy other i angel to ten sam npc, napisałem ci dokładnie jak.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy

pawbuj

var C NPC attacker
#6 2014-04-17, 18:24(Ostatnia zmiana: 2014-04-17, 19:15)
wierzę w szczere intencje pomocy, ale w zs_reacttodmage funkcje wg mnie nie identyfikują innego atakującego jak hero.

daję przykład najprostszej funkcji, która się nie wywołuje, kiedy npc otrzymuje obrażenia, a w pobliżu jest np. Gomez. Napis bez warunku oczywiście działa

if (Npc_GetDistToNpc (self, EBR_100_Gomez) < 5000)
   {
   PrintScreen   ("gomez jest blisko!", -1,-1,"FONT_OLD_10_ORANGE.TGA",timep);   //dla testu
   };

Post połączony: 2014-04-17, 19:15
jeżeli zdefiniujemy self dokładnie  np. if self.id == 1422 to funkcja zadziała
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Cytuj
w zs_reacttodmage funkcje wg mnie nie identyfikują
ZS_ReactToDamage to funkcja. Nie może być funkcji w funkcji. Do tego nie mam pojęcia o jakie "funkcje które identyfikują" mogłoby ci chodzić.

Nie rozumiem co masz na myśli, bo strasznie mieszasz terminy, ale jeśli chodzi ci o to że według ciebie zs_reacttodmage jest niewłaściwą funkcją, to przeczytaj jeszcze raz co napisałem: "przy odpalaniu perc_assessdamage". Nie napisałem konkretnie o "zs_reacttodmage", jedynie że to prawdopodobne - to tylko jedna z możliwych funkcji. W zależności od rutyny w jakiej jest npc i innych czynników, może to być inna funkcja. Musisz sam znaleźć która, ewentualnie wywoływać swój kod ze wszystkich. O ile nie zostaną zmodyfikowani przez wywołanie innej funkcji, zaraz po odpaleniu perc_assessdamage self będzie zawierał zaatakowanego, a other atakującego. To jest pewne na 100% i używane w tzw "mieczach runicznych", czy Szponie Beliara.

//edit:
Cytuj
jeżeli zdefiniujemy self dokładnie  np. if self.id == 1422 to funkcja zadziała
Niczego tu nie definiujesz, ale jeśli masz na myśli sprawdzanie, to taki sam efekt powinien dawać warunek który podałem ci 4 posty temu.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy

pawbuj

var C NPC attacker
#8 2014-04-18, 19:52(Ostatnia zmiana: 2014-04-18, 20:44)
Av, sprawdzałem wyświetlanie self.name i other.name i rzeczywiście zarówno self i jak other ta funkcja zs_reacttodamage definiuje. jest tak, że other jest zdefiniowany tylko przy pierwszym uderzeniu.

kolejne uderzenia są "identyfikowane" w B_CombatReactToDamage

 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Do ciebie chyba nie dociera. Jeszcze raz: nie pisałem nigdzie że zs_reacttodamage to właściwa funkcja. Pisałem że chodzi o funkcję odpalaną przez perc_assessdamage. W g1 jest to jedna z kilku, w zależności m.in. od aktywnej rutyny npc. Npc którego raz zaatakujesz, wchodzi w rutynę walki, więc ta funkcja zmienia się na inną (w przypadku ludzi, B_CombatReactToDamage). 

Musisz sam znaleźć o które funkcje chodzi. Najlepiej wywołuj swoją z nich wszystkich. Było ich w g1 bodajże 5. Aby je znaleźć, wystarczy wyszukać po skryptach wszystkie miejsca gdzie jest ustawiany perc_assessdamage. Jakiekolwiek funkcje by to nie były, self będzie zawsze w nich przyjmował wartość npc który jest atakowany, a other tego który atakuje, więc to co chcesz zrobić jest bardzo proste.

chicken

chicken

RaveN Studio
posty1230
Propsy559
ProfesjaNierób
  • RaveN Studio
Cytat: Avallach
Było ich w g1 bodajże 5.
func void B_CombatReactToDamage | w pliku B_CombatReactToDamagefunc void B_Orc_AssessDamage | w pliku B_Orc_AssessDamagefunc void ZS_ReactToDamage | w pliku ZS_ReactToDamage
Teraz plik ZS_MM_Master
func void B_MM_ReactToDamagefunc void ZS_MM_Attack


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry