Skrypt Strażnik pilnujący kołowrotu 10202 20

O temacie

Autor Vesemir

Zaczęty 1.06.2020 roku

Wyświetleń 10202

Odpowiedzi 20

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
Witam mam taki problem. Chciałbym w G2NK do konkretnego kołowrotu przy pomocy onStateFunc w Spacerze przypisać funkcję. Owa funkcja miałaby po użyciu przez Hero kołowrotu powodować że stojący obok strażnik  (dokładnie Pal_210_Torwache który jest NPCTYPE_AMBIENT ) krzyknał by łąpy precz i wynoś się stąd  przy użyciu B_Say_Overlay(self,other,"$HANDSOFF"); i B_Say_Overlay(self,other,"$GETOUTOFHERE"); a następnie atakował by gracza  B_Attack(self,other,AR_UseMob,0); Cały sęk polega na tym że nie wiem jak przypisać / przekazać aby po użyciu kołowrotu TEN konkretny NPC to powiedział i zaatakował bohatera który używa kołowrotu. Jak skonstruować tą funkcję.  :hmmm:
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Poza self, other, istnieje również dynamicznie przypisywania "zmienna" o nazwie hero.
Mógłbyś ją do tego wykorzystać, poza tym, w samych skryptach gry jest przykład tego jak npc jest zapisywany do zmiennej, którą można potem wykorzystać.


@edit:
Analizując przykładowe skrypty z gry powinieneś spokojnie do tego dojść jak taką funkcje napisać.
 

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
Znalazłem jedynie coś takiego
var C_NPC her;
her = Hlp_GetNpc(PC_Hero);
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her))
{
           coś tam robi
         };

Jedyny jaki mam pomysł to


func void B_PalProcetctGate()
{

        var C_Npc her;
  her = Hlp_GetNpc(Pal_210_Torwache);

        if (Hlp_GetInstanceID (slf) == Hlp_GetInstanceID(her) )
{

B_Say_Overlay(self,other,"$HANDSOFF");
B_Say_Overlay(self,other,"$GETOUTOFHERE");
B_Attack(self,other,AR_UseMob,0);


};

         };


Ale i tak mi się wysypuje przy prasowaniu skryptów przy funkcji B_Say_Overlay
Próbowałem też zamieniać i pisać w funkcji   B_Say_Overlay(self,other,"$HANDSOFF"); zamiast self i other to slf , hero , Pal_210_Torwache w różnych kombinacjach ale i tak nic nie działa, nie wiem jak funkcji przypisać że  w miejscu self ma być    Pal_210_Torwache    a  w miejscu   other   ma być    hero
 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Witam mam taki problem. Chciałbym w G2NK do konkretnego kołowrotu przy pomocy onStateFunc w Spacerze przypisać funkcję. Owa funkcja miałaby po użyciu przez Hero kołowrotu powodować że stojący obok strażnik  (dokładnie Pal_210_Torwache który jest NPCTYPE_AMBIENT ) krzyknał by łąpy precz i wynoś się stąd  przy użyciu B_Say_Overlay(self,other,"$HANDSOFF"); i B_Say_Overlay(self,other,"$GETOUTOFHERE"); a następnie atakował by gracza  B_Attack(self,other,AR_UseMob,0); Cały sęk polega na tym że nie wiem jak przypisać / przekazać aby po użyciu kołowrotu TEN konkretny NPC to powiedział i zaatakował bohatera który używa kołowrotu. Jak skonstruować tą funkcję.  :hmmm:
W bardzo prosty sposób bez specjalnego kombinowania w skryptach.  W spacerze klikasz na dany kołowrót i wpisujesz instancję NPC w opcji "owner," jeżeli chcesz aby inni strąznicy też reagowali to wpisujesz dla "ownerguild" na przykład GIL_GRD. To samo można zrobić z itemami rozrzuconymi po świecie.  Najprostsze metody są czasami najskuteczniejsze :)
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Cytat: Vesemir
Ale i tak mi się wysypuje przy prasowaniu skryptów przy funkcji B_Say_Overlay
Próbowałem też zamieniać i pisać w funkcji   B_Say_Overlay(self,other,"$HANDSOFF"); zamiast self i other to slf , hero , Pal_210_Torwache w różnych kombinacjach ale i tak nic nie działa, nie wiem jak funkcji przypisać że  w miejscu self ma być    Pal_210_Torwache    a  w miejscu   other   ma być    hero

Póki co w ogóle zignorowałeś fakt, że istnieje zmienna dynamicznie przypisywana o nazwie hero.
Już pomijając ten fakt, że dalej na siłę używasz self, other, nie podałeś też co ci wywala parser, zbytnio bez konkretnego błędu nikt ci nie pomoże, błędy parser pokazuje po to, by je poprawić, a nie zignorować.

Zacznij może od sprawdzenia pliku
Content/Story/Npc_Globals.d

W tym pliku możesz RAZ (nie co każde wywołanie funkcji) przypisać sobie tego npc'ta do zmiennej i później z nim pracować odwołując się do swojej zmiennej o danej nazwie (kod w tym pliku jest dosyć samo opisowy).

Po drugie:
Mając już tą zmienną, możesz jej użyć zamiast posługiwać się dynamicznie przypisywanymi przez silnik symbolami self, other. Do tego wykorzystaj fakt, że hero ma już taki dynamiczny symbol, sprawdź sobie plik:
Content/_Intern/Classes.d

Tam są wypisane deklaracje dynamicznie przypisywanych symboli przez silnik, i jest tam również hero (nie musisz pobierać hero).
 

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy

Póki co w ogóle zignorowałeś fakt, że istnieje zmienna dynamicznie przypisywana o nazwie hero.
Już pomijając ten fakt, że dalej na siłę używasz self, other, nie podałeś też co ci wywala parser, zbytnio bez konkretnego błędu nikt ci nie pomoże, błędy parser pokazuje po to, by je poprawić, a nie zignorować.


Dopisałem tego Paladyna w Content/Story/Npc_Globals.d jako GuardPaladyn
Testowo wrzuciłem do funkcji tylko taki kod

         B_Say_Overlay(GuardPaladyn,hero,"$HANDSOFF");
B_Say_Overlay(GuardPaladyn,hero,"$GETOUTOFHERE");
B_Attack(GuardPaladyn,hero,AR_UseMob,0);


@Patrix9999  Parser wyrzuca mi unknown identifier w linii B_Say_Overlay  a co do Content/_Intern/Classes.d to widzę tam tylko "prototypy" (chyba takie jest na to określenie, nie jestem pewny nie jestem programistą)  klas C_Npc , C_Mission ..... itd. a instancja hero jest pusta.



W bardzo prosty sposób bez specjalnego kombinowania w skryptach.  W spacerze klikasz na dany kołowrót i wpisujesz instancję NPC w opcji "owner," jeżeli chcesz aby inni strąznicy też reagowali to wpisujesz dla "ownerguild" na przykład GIL_GRD. To samo można zrobić z itemami rozrzuconymi po świecie.  Najprostsze metody są czasami najskuteczniejsze :)


@pawbuj  Czytałem o tych parametrach Vobów w Spacerze na forum  przez pewien czas o tym ale z tego co pisali to te funkcje miały być w Spacerze ale ostateczenie ich nie zaimplementowano i zostały tylko jako pola formularza właściwości Vobów w Spacerze.  Nie wiem ile w tym prawdy bo nie testowałem nigdy tych parametrów skoró pisali że i tak nie działają.  :hmmm:

@pawbuj  Gdyby użyć "owner"  i "ownerguild" wywoływało by to takie same reakcje NPC jak wejścia na cudzy teren czy grzebania w cudzej skrzyni ???????    (Chodzi mi o te reakcje głosowe na zachowanie gracza wywoływane przez B_Say_Overlay w różnych sytuacjach)

 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Cytat: Vesemir
@Patrix9999  Parser wyrzuca mi unknown identifier w linii B_Say_Overlay  a co do Content/_Intern/Classes.d to widzę tam tylko "prototypy" (chyba takie jest na to określenie, nie jestem pewny nie jestem programistą)  klas C_Npc , C_Mission ..... itd. a instancja hero jest pusta.

Te "puste" instancje są dynamicznie przypisywane w niektórych momentach przez grę.
Masz tam self, other, ale również hero, item i kilka innych (ciebie głównie hero interesuje).

Cytat: Vesemir
Parser wyrzuca mi unknown identifier w linii B_Say_Overlay

Gdzie umieściłeś swój skrypt?
Może jest on parsowany przed deklaracją funkcji B_Say_Overlay (czytaj, twój plik jest ładowany przed  załadowaniem AI\HUMAN\B_Human\B_Say_Overlay.d)?
Więcej nie pomogę bez dokładnego błędu (najlepszy by był screenshoot zSpy'a i ostatnich jego kilku printów).
 

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
@Patrix9999  Tu masz rację mój skrypt jest w Story\B_Content\B_PalProcetctGate.d linia 36 a b_say  AI\Human\B_Human\B_Say_Overlay.d  linia 49     

Przesunąłem kolejność ładowania skryptu w Gothic.src i wszystko się skompilowało.
Przypisałem funkcję do kołowrotu jednak po użyciu kołowrotu strażnik nie reaguje.

To kod mojej funkcji 

func void B_PalProcetctGate()
{

B_Say_Overlay(GuardPaladyn,hero,"$HANDSOFF");
B_Say_Overlay(GuardPaladyn,hero,"$GETOUTOFHERE");
B_Attack(GuardPaladyn,hero,AR_UseMob,0);


};
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Spróbuj zdebugować co jest nie tak.
Na początek może dodaj Print'a jakiegoś testowego do funkcji, by potwierdzić że się ona wykonuje.
np:
Kod: (d) [Zaznacz]
Print("Funkcja wykonana");
 

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
@Patrix9999  Przypisałem do funkcji    PrintScreen  ("Test działania funkcji", -1,-1,FONT_Screen,3);     i pomimo tego nic nie wyświetla ani nie działa po użyciu kołowrotu
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
No to masz odpowiedź dlaczego nic się nie dzieje, funkcja się nie wykonuje.
Sprawdź czy dobrą nazwę funkcji w spacerze ustawiłeś.
 

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
@Patrix9999  No w Spacerze w onStateFunc dałem B_PalProcetctGate a w definicji jest  B_PalProcetctGate() dałem bez nawiasów ale chyba tak trzeba jak patrzyłem jak pulpity z książkami są zdefiniowane to też w Spacerze te funkcje są bez nawiasów. Wiec nie mam pomysłu co mogłem zrobić źle
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Coś źle zrobiłeś, musisz kombinować dalej.
Może obczaj sobie jakiś vob, który ma taką funkcjonalnośc i porównaj go z tym twoim.
 

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Sprawdzasz to na nowej grze?
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
@Splash  Oczywiście że sprawdzam na nowej grze i reprasuje nowe skrypty za każdym razem.

@Patrix9999  Pogrzebałem trochę i z tego co się dowiedziałem to skrypt nie będzie działał gdyż jest przypisany do voba/moba który ma visuala w formacie .mds  a  przypisywanie funkcji działa tylko na voby o visualach  w formacie .ASC

Ale wpadł mi do głowy inny pomysł. Gdzieś czytałem że jest taka funkcja w G2NK która sprawdza czy dany Vob jest zajęty/używany  jeśli ma przypisaną indywidualną nazwę.  Co gdyby napisać funkcję która by sprawdzała czy ten konkretny kołowrót jest używany i jeśli jest używany do wywoływała by krzyk i atak strażnika. Wtedy ominął bym problem przypisywania funkcji w spacerze wystarczyło by że dałbym unikalną nazwę dla tego kołowtrotu w spacerze. Tylko gdzie by trzeba było wpisać wywołanie takiej funkcji żeby ona sprawdzała ciągle czy ten vob jest zajęty np. gdy Hero jest na mapie NewWorld.zen ????   Hmm... w Startupie czy gdzie ???

Edit: Znalazłem tą funkcję w Externals.d   to 
FUNC INT  Wld_IsMobAvailable   (VAR C_NPC self, VAR STRING schemeName) {};

Sprawdziłem teorię z formatami visuali niestety nawet na fotelu który ma visual w formacie .ASC dalej funkcja nie jest wywoływana. Kowadło ma visual w formacie .mds a jednak ma przypisaną funkcję a dokładnie monolog który jakoś działa wiec ostatecznie nie wiem co robię źle  :hmmm:
 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
@Splash  Oczywiście że sprawdzam na nowej grze i reprasuje nowe skrypty za każdym razem.

@Patrix9999  Pogrzebałem trochę i z tego co się dowiedziałem to skrypt nie będzie działał gdyż jest przypisany do voba/moba który ma visuala w formacie .mds  a  przypisywanie funkcji działa tylko na voby o visualach  w formacie .ASC

Ale wpadł mi do głowy inny pomysł. Gdzieś czytałem że jest taka funkcja w G2NK która sprawdza czy dany Vob jest zajęty/używany  jeśli ma przypisaną indywidualną nazwę.  Co gdyby napisać funkcję która by sprawdzała czy ten konkretny kołowrót jest używany i jeśli jest używany do wywoływała by krzyk i atak strażnika. Wtedy ominął bym problem przypisywania funkcji w spacerze wystarczyło by że dałbym unikalną nazwę dla tego kołowtrotu w spacerze. Tylko gdzie by trzeba było wpisać wywołanie takiej funkcji żeby ona sprawdzała ciągle czy ten vob jest zajęty np. gdy Hero jest na mapie NewWorld.zen ????   Hmm... w Startupie czy gdzie ???

Edit: Znalazłem tą funkcję w Externals.d   to 
FUNC INT  Wld_IsMobAvailable   (VAR C_NPC self, VAR STRING schemeName) {};

Sprawdziłem teorię z formatami visuali niestety nawet na fotelu który ma visual w formacie .ASC dalej funkcja nie jest wywoływana. Kowadło ma visual w formacie .mds a jednak ma przypisaną funkcję a dokładnie monolog który jakoś działa wiec ostatecznie nie wiem co robię źle  :hmmm:
Myślę, że przede wszytskim nie tędy droga. Skoro funkcja print nie działa po dopisaniu do "onstate" to zmiany w świecie nie są zapisane  .  I tu jest podstawowy problem.

Pierwsze też słyszę, aby funkcje w "onstate" do mobów w formacie mds nie działały,  a w "Asc" tak.  Da się to zrobić na "onstate" lub "owner". Róznica taka, że "onstate" wywoła funkcję po zakończeniu animacji , a w "owner" w momencie  kontaktu npc z mobem. Nie trzeba tworzyć też dodatkowych funkcji, gdyż jest to w skryptach AI.

Czyli jest wniosek taki: trzeba sobie utrwalić jak prawidłowo zapisuje się zmiany w zenie i odtwarza to w grze.
 

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
@pawbuj  być może ale gdy sprawdzałem teorię z formatami visuali centralnie wstawiłem fotel obok kołowrotu i przypisałem tam funkcję i odpaliłem nową grę i fotel tam był i zasaidłem na nim i też nic. Spróbuje jeszcze skompilować/zreprasować dialogi na nowo ale raczej to nic nie da

Post połączony: 2020-06-05, 16:57
Żeby rozwiać wątpliwości chcę wywołać reakcję NPC    Pal_210_Torwache który jest typu npcType = NPCTYPE_AMBIENT;
na użycie kołowrotu bramy w G2NK
 
Moja funkcja wygląda tak
func void PalProcetctGate()
{
PrintScreen  ("Test działania funkcji", -1,-1,FONT_Screen,3);
B_Say_Overlay(GuardPaladyn,hero,"$HANDSOFF");
B_Say_Overlay(GuardPaladyn,hero,"$GETOUTOFHERE");
B_Attack(GuardPaladyn,hero,AR_UseMob,0);


};

aktualnie plik z kodem funkcji jest   Story\Dialog_Mobsis\PalProcetctGate.d
i jest wpisany w pliku Gothic.src na końcu aby wszystkie potrzebne funkcje były załadowane
w pliku NPC_Globals  dołączyłem linijkę  GuardPaladyn = Hlp_GetNpc(Pal_210_Torwache);

w kołowrocie w spacerze jest wpisane  onStateFunc:PalProcetctGate     owner:Pal_210_Torwache    ownerGuild:GIL_PAL
mapa jest zapisana i wrzucona w odpowiednim miejscu teraz jeszcze dla 100% pewności zreprasuje dialogi

NIE korzystam z żadnych Icarusów czy innych LeGo
 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Pakiety skryptowe tu nie są potrzebne. Funkcja w skryptach (przy onstate) powinna wyglądać:

func void PalProcetctGate_S1()
{
PrintScreen  ("Test działania funkcji", -1,-1,FONT_Screen,3);
B_Say_Overlay(GuardPaladyn,hero,"$HANDSOFF");
B_Say_Overlay(GuardPaladyn,hero,"$GETOUTOFHERE");
B_Attack(GuardPaladyn,hero,AR_UseMob,0);

};
Z konsoli można podejrzeć (aktywny marvin i przy nakierowaniu na voba klawisz chyba J albo K ) jaka funkcja się uruchamia przy obrocie kołowrotem.

Zen zapisujemy zawsze w folderze World/_Work/ natomiast w trakcie gry powinien być on w głównym folderze World/
To nic wielkiego.
 

Vesemir

Vesemir

Użytkownicy
posty44
Propsy3
ProfesjaGracz
  • Użytkownicy
@pawbuj  Czyli według tego powinienem zmienić: ?? 
- nazwę funkcji tylko w pliku
- czy też zmienić całą nazwę pliku z funkcją 
- czy zmienić jeszcze nazwę funkcji w spacerze w mobie przy  onstateFunc z PalProcetctGate   na PalProcetctGate_S1 ????

Post połączony: 2020-06-05, 18:56
@pawbuj  zmieniłem treść funkcji dopisując w definicji _S1   nic to nie dało funkcja dalej nie działa

A jeśli chodzi o teorię o formaty visuali i działanie funkcji onStateFunc to sugerowałem się tym tematem
http://themodders.org/index.php?topic=30147.msg1356414#msg1356414     
oraz  tym  tematem
http://themodders.org/index.php?topic=30459.msg1362654#msg1362654
 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Napisałem ci juz wszystko, sprawdzić czy zmiany w świecie się zapisują...zmieniasz tylko nazwę funkcji w pliku i plik musi być czytany przez Gothic.src
 


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