Nowa mechanika szansy na trafienie krytyczne / Unknown Identifier : AIVAR 3144 4

O temacie

Autor pagi111

Zaczęty 27.02.2019 roku

Wyświetleń 3144

Odpowiedzi 4

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Siemka,
pewnie co niektórzy już rzygają na sam widok problemu z Unknown Identifier, bo to niby oczywiste, ale...

To mój skrypt:
func void InitArmourCritChanceReduction(var C_NPC hero, var C_NPC oth)
{
if (Npc_IsInState (hero, ZS_Attack))
&& (Hlp_GetInstanceID(oth) == slf.aivar[AIV_LASTTARGET])
{
print("Wykryło hero is in zs attack state oraz oth last target");
var c_item armor; armor = Npc_GetEquippedArmor (oth);
if (Hlp_IsItem (armor, ITAR_DJG_L))
{
print("wykryło zbroje i obniżyło talent");
B_AddFightSkill (hero, NPC_TALENT_1H, - 10);
};
};
};

I dostaje podczas parsowania błąd Unknown Identifier : AIVAR

1) Po pierwsze, nie wiem co to dokładnie jest to slf.aivar i inne aivary, ale z racji, że jest tego dość dużo w wielu plikach, to jak do jasnej cholery może mi wywalać błąd, że nie czegoś takiego nie zna. Pierwszy IF z mojej funkcji, czyli to:

if (Npc_IsInState (hero, ZS_Attack))
&& (Hlp_GetInstanceID(oth) == slf.aivar[AIV_LASTTARGET])

 w całości skopiowałem z pliku (B_Attack) i tam kilkukrotnie się pojawia ten aivar i wszystko działa jak należy, a jak dodam tę swoją funkcję to się zaczynają problemy - totalnie tego nie rozumiem :/

2) Druga sprawa, choć mniej paląca, jest taka, że nie wiem czy wgl dobrze się zabieram za to, co chcę zrobić. Mianowicie chcę zrobić coś takiego, żeby szansa na trafienie krytyczne bohatera (a w końcowym zamyśle również wszystkich NPC) malała w zależności od tego jaki pancerz nosi przeciwnik. Załóżmy, że mamy 100% hitchance. Gdy przeciwnik ma na sobie jakąś słabszą zbroję, to ona obniża nasz hitchance o powiedzmy 20, a jak ma jakąś mocniejszą - to powiedzmy o 70%, itp.
Zamysł mojego skryptu jest taki i tak go rozumiem (nie wiem czy dobrze):
JEŚLI hero wykonuje atak
 i oth to jest nasz target
 do tego JEŚLI
  oth ma na sobie lekką zbroję ŁS (przykładowa zbroja)
  TO
   nasz hitchance obniża się o 10 (przykładowa wartość)

To jest oczywiście uproszczony skrypt, chciałem zobaczyć czy to wgl działa... no a przez tego nieszczęsnego AIVARA nie działa  :angry:

No i tu pytanie do tęgich głów tego forum: czy to ma szansę działać :P oczywiście wiem, że trzeba do tego dorobić jeszcze przywracanie z powrotem po ataku swojego dawnego Hitchance - na chwilę obecną nie mam innego pomysłu niż jakiś timer.

Generalnie chodzi o to, żeby Hitchance zmieniał się dynamicznie w zależności od tego, którego przeciwnika akurat trafiamy i jaką on ma na sobie zbroje.

Wszelkie pomysły mile widziane i przede wszystkim o co chodzi z tym, że nie znajduje aivara, bo tego najbardziej nie rozumiem.
 

Splash

Splash

Moderator
posty4208
Propsy3410
ProfesjaNierób
  • Moderator
&& (Hlp_GetInstanceID(oth) == slf.aivar[AIV_LASTTARGET])
slf nie istnieje - stąd ten problem.

Btw. skoro atakującym ma być wyłącznie hero, to pierwszy argument jest niepotrzebny. A jeśli nie, to nazwa zadeklarowanej zmiennej jest zła, ponieważ może to powodować "konflikty" z instancją hero.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Jak to niepotrzebny? Czyli może być tylko tak:
func void InitArmourCritChanceReduction(var C_NPC oth)
?
I wtedy zmienić to slf.aivar na... hero.aivar?
I wtedy będzie to działać tylko na bohatera, jak rozumiem. Ale skąd program będzie wtedy wiedział czym jest hero? Hero będzie tak samo nieokreślony jak slf. w moim przypadku.


Ostatecznie chciałbym zrobić tak, żeby cała ta funkcja działała na wszystkich NPC ORAZ na bohatera.
W takim wypadku powinienem to zrobić tak:
func void InitArmourCritChanceReduction(var C_NPC slf, var C_NPC oth)
Zgadza się?

Pytanie jeszcze takie: czy jeśli tam jest to slf, to wtedy to działa na npc i na bohatera, czy tylko na npc, i trzeba napisać drugą podobną funkcję dla hero?

/// EDIT
Wypróbowałem na razie tyle, że zmieniłem to slf.aivar na hero.aivar - gra się wtedy uruchamia, ale ta funkcja nic nie robi :P
Co jest źle? Zakładam, że po prostu źle tę funkcję rozumiem i ona nie robi tego, co bym chciał. W grze zrobiłem tak, że przywołałem rockefellera, założyłem mu lekką zbroję ŁS i uderzałem w niego bohaterem. Efektu nie ma żadnego, print testowy się nie pokazuje, itp.

if (Npc_IsInState (hero, ZS_Attack)) - to oznacza, że hero wykonuje atak, tak?

&& (Hlp_GetInstanceID(oth) == hero.aivar[AIV_LASTTARGET]) - szczerze mówiąc tego używam na chybił-trafił. Czy to oznacza, że oth jest aktualnie celem mojego hero? Zakładam, że nie, bo wtedy funkcja powinna działać, ale nie mam pojęcia jak to inaczej zrobić :D

 

Splash

Splash

Moderator
posty4208
Propsy3410
ProfesjaNierób
  • Moderator
Cytuj
Ale skąd program będzie wtedy wiedział czym jest hero?
Hero zawsze zwraca instancję postaci, którą steruje gracz.

Btw. to co chcesz zrobić prawdopodobnie nie będzie działać dobrze, ponieważ próbujesz wywoływać funkcję, która reaguje po zaatakowaniu postaci, a nie przed. Jeśli chciałbyś zrobić to dobrze, musiałbyś sięgnąć po pakiety skryptowe lub AST; zdekompilować kod silnika do assemblera; znaleźć funkcję odpowiedzialną za kalkulację obrażeń; znaleźć moment w którym kalkulowana jest szansa na krytyczne uderzenie; zhookować go i zmodyfikować rejestr procesora, który przechowuje szansę na krytyczne uderzenie.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Hmm, no tak, tak pewnie byłoby lepiej. Niestety, jeśli chodzi o AST, pakiety skryptowe, że już o kodach silnika i hookowaniu nie wspomnę, to jeszcze słabo mi z tym idzie. Tzn. potrafię to jakoś zastosować jak mi ktoś znajdzie te funkcje czy kody (zresztą kiedyś zrobiłem inny temat tego dotyczący, w którym zresztą też się udzielałeś :D), ale nie mam tak naprawdę pojęcia, jak samemu wyszukiwać to wszystko :P

Ale co do pierwszego Twojego zdania - to właśnie myślałem, że ta funkcja powinna działać dobrze, bo reakcja jest po zaatakowaniu, ale jeszcze przed obliczaniem dmg czy szansy na krytyka. Chyba że się mylę?

Jeszcze jedna sprawa:
Cytuj
zdekompilować kod silnika do assemblera; znaleźć funkcję odpowiedzialną za kalkulację obrażeń; znaleźć moment w którym kalkulowana jest szansa na krytyczne uderzenie;
Jak Wy znajdujecie te funkcje? Jest jakiś spis tego i która za co jest odpowiedzialna czy po prostu sprawdzacie różne funkcje na chybił-trafił, sugerując się tylko ich nazwą?
 


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