Problem z AI_Teleport 8596 20

O temacie

Autor Darkmodders

Zaczęty 24.08.2017 roku

Wyświetleń 8596

Odpowiedzi 20

Darkmodders

Darkmodders

DarkModders Team
Mistrz mrocznych sztuk
posty828
Propsy283
ProfesjaProducent
  • DarkModders Team
  • Mistrz mrocznych sztuk
Witam.

Otóż mam problem z AI_Teleport. Korzystam z czystych, polskich skryptów i używam dwóch zenów. Na jednym AI_Teleport działa poprawnie, odwrotnie jest na zenie NewWorld. Używając, na tym zenie, AI_Teleport postać nie przenosi się, tylko stoi w miejscu. Na dodatek NPC przestają reagować na atak ze strony bohatera bądź kradzież. Czym to może być spowodowane?
Nie wiem czy to ważne ale NewWorld zen wcześniej macrosowałem.
 
Blog grupy DarkModders Team.

http://darkmodders.pl/

Discord: darkmodders

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Użyj Npc_ClearAIQueue(npc)* przed teleportem i sprawdź, czy coś się zmieniło.

* Nie pamiętam, czy aby na pewno tak ta funkcja wygląda.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy
Witam
Ja też mam problem z AI_Teleport.
Co muszę zrobić żeby po śmierci przeniosło mnie do wybranego waypointa?
Z góry dziękuję za jakąkolwiek pomoc. 
 

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Albo w ZS_Dead.d : (nie wiem, czy działa)

if (Hlp_GetInstanceID (self) == Hlp_GetInstanceID (PC_HERO))
{
AI_Teleport (hero, "TWOJ_WP");
};

albo w TickTocku :

if  (hero.attribute[ATR_HITPOINTS]==0) {
AI_Teleport (hero, "TWOJ_WP");
};
 

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy
Pierwszy sposób działa tylko co muszę zrobić żeby np ten teleport nie było od razu i jak mnie przenosi to żebym był żywy.
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Funkcje AI_* są wykonywane w kolejce. Kolejkę tą czyści funkcja Npc_ClearAIQueue(instance); Jeżeli chcesz aby wyglądało w taki sposób:
Zgon->Czekaj->Teleport->Ożywienie
Musisz w kodzie który podał @TheKetrab dopisać nad AI_Teleport(hero, "WP");
Npc_ClearAIQueue(hero);
AI_Wait(hero, 5); //5 = 5 sekund
Zaś ożywienie funkcją wykonaną w odstępie czasu z tego co wiem jest możliwe tylko za pomocą Tick-Tock'a | FrameFunctions lub AI_Functions z LeGo.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy
Po zrobieniu to co podałeś to wcale mnie nie teleportuje :hmmm:
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Odczekałeś 5 sekund? Jeżeli tak i nie zostałeś teleportowany to wywal to:
Npc_ClearAIQueue(hero);
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy
Nadal nie teleportuje
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Pokaż jak dodałeś kod.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy

Wezmir

Problem z AI_Teleport
#10 2017-08-25, 14:20(Ostatnia zmiana: 2017-08-25, 14:40)
Spoiler
func void ZS_Dead ()
{   
   // ------ aivars resetten ------
   self.aivar[AIV_RANSACKED] = FALSE;
   self.aivar[AIV_PARTYMEMBER] = FALSE;
   
   B_StopLookAt   (self);
   AI_StopPointAt   (self);
      
   // ------ XP ------
   if ( Npc_IsPlayer(other) || (other.aivar[AIV_PARTYMEMBER]==TRUE) )
   && (self.aivar[AIV_VictoryXPGiven] == FALSE)                     
   {
      B_GivePlayerXP (self.level * XP_PER_VICTORY);         
      
      self.aivar[AIV_VictoryXPGiven] = TRUE;
   };
   
   if (Hlp_GetInstanceID (self) == Hlp_GetInstanceID (PC_HERO))
   {
   
   AI_Wait(hero, 5); bez tego działa
   AI_Teleport (hero, "KASERNE");
   };

   // ------ Greg ------
   if C_IAmCanyonRazor (self) == TRUE
   {
      CanyonRazorBodyCount = CanyonRazorBodyCount +1;
      if (MIS_Addon_Greg_ClearCanyon == LOG_RUNNING)
      {
         B_CountCanyonRazor ();
      };
   };
 

Splash

Splash

Moderator
posty4211
Propsy3414
ProfesjaNierób
  • Moderator
Drugim argumentem funkcji AI_Await ma być liczba zmiennoprzecinkowa, a nie całkowita.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy
Drugim argumentem funkcji AI_Await ma być liczba zmiennoprzecinkowa, a nie całkowita.
A jak tego dokonać? :hmmm:
 

Toworish

Toworish

Użytkownicy
http://chomikuj.pl/ToWoRiSh
posty1664
Propsy254
ProfesjaNierób
  • Użytkownicy
  • http://chomikuj.pl/ToWoRiSh
np tak:
AI_Wait(self, 0.38);
jest taki fajny program jak Notepad++ posiada on wspaniałą funkcję szukania interesujacego cie tekstu w pilikach znajdujących się w danym folderze.

Używając tej opcji możesz łatwo znaleźć przykład prawie każdej funkcji w skryptach goticzka.
 
Niebawem...Pierdolnę se poradniki do Goticzka. Albo i nie, bo sie mnie nie chce.

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy

Wezmir

Problem z AI_Teleport
#14 2017-08-25, 18:12(Ostatnia zmiana: 2017-08-25, 19:01)
np tak:
AI_Wait(self, 0.38);
jest taki fajny program jak Notepad++ posiada on wspaniałą funkcję szukania interesujacego cie tekstu w pilikach znajdujących się w danym folderze.

Używając tej opcji możesz łatwo znaleźć przykład prawie każdej funkcji w skryptach goticzka.
Korzystam z Notepadd++ i staram się szukać to co mi potrzeba w skryptach ale jak nie mogę czegoś znaleźć to wchodzę na forum bo dopiero raczkuje z modowaniem gothica
Dzięki ale to nie działa  ;(

znalazłem w pliku externals.d to tylko wszelkie próby kończą się błędem z nawiasem ')'
Spoiler
FUNC VOID    AI_Wait          ( VAR C_NPC n0, VAR float n1 ) { };

Udało mi się naprawić ten błąd ale nadal jest to co wcześniej czyli po śmierci i odczekaniu tego czasu nic się nie dzieje.
Fragment mojego ZS_Dead.d
Spoiler
// *****************************************
// ZS_Dead
// -------
// wird auch nach jedem Load Game ausgeführt
// wird auch vom Spieler ausgeführt
// *****************************************
Const  float  czas = 0.30; przy tej wartości działa teleport tylko że ten wait trwa mniej niż sekunda i jest przy tym też mały lag jeżli czas = więcej niż 0.30 to nie teleportuje mnie


func void ZS_Dead ()
{   
   // ------ aivars resetten ------
   self.aivar[AIV_RANSACKED] = FALSE;
   self.aivar[AIV_PARTYMEMBER] = FALSE;
   
   B_StopLookAt   (self);
   AI_StopPointAt   (self);
      
   // ------ XP ------
   if ( Npc_IsPlayer(other) || (other.aivar[AIV_PARTYMEMBER]==TRUE) )
   && (self.aivar[AIV_VictoryXPGiven] == FALSE)                     
   {
      B_GivePlayerXP (self.level * XP_PER_VICTORY);         
      
      self.aivar[AIV_VictoryXPGiven] = TRUE;
   };
   
   
   // ------ Greg ------
   if C_IAmCanyonRazor (self) == TRUE
   {
      CanyonRazorBodyCount = CanyonRazorBodyCount +1;
      if (MIS_Addon_Greg_ClearCanyon == LOG_RUNNING)
      {
         B_CountCanyonRazor ();
      };
   };
   
   if (Hlp_GetInstanceID (self) == Hlp_GetInstanceID (PC_HERO))
   {
      AI_Wait(self,   czas); bez tego teleportacja działa
      AI_Teleport (hero, "KASERNE");
      
   };

   
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
AI_WaitMS(hero, 5000); // 5000ms = 5s
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Nie szedłbym na twoim miejscu w stronę AI_Wait.
Dużo bawiłem się w zdarzenia, że coś dzieje się co ileś sekund i moim zdaniem najpłynniej sprawuje się taki system:

1. Pobierz pakiet LeGo i odpowiednio go zainicjuj, zaznajom się z poradnikiem o FrameFunctions.
2. Zadziałaj w ten sposób:
 - jeśli hero zginie, to zmienna zmienia się na TRUE w ZS_Dead.d

if (Hlp_GetInstanceID (self) == Hlp_GetInstanceID (PC_HERO))
{
HeroUmarl = TRUE;
};

 - i tutaj wchodzi funkcja wywoływana co sekundę (1000 milisekund) jako FrameFunction (poradnik):

// ***** ***** ***** ***** ***** ***** ***** ***** ***** *****
func void TimeSec ()
{
var int secHeroIsDead;
if (HeroUmarl == TRUE) {

secHeroIsDead = secHeroIsDead + 1; //co sekundę zmienia się numer sekundy, w której jesteś.

if (secHeroIsDead == 1) { //jeśli to pierwsza sekunda
//to zrób cośtam (np. przeteleportuj)
};

if (secHeroIsDead == 3) { //jeśli to 3 sekunda
//to zrób cośtam (np. spraw, że hero ma max życia)
};

if (secHeroIsDead == 5) { //jeśli to 5 sekunda
HeroUmarl = FALSE; //przestaje naliczać sekundy
secHeroIsDead = 0; //wraca do tego, że 'stoper' ma zero sekund
};
};

};
 

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy
if (Hlp_GetInstanceID (self) == Hlp_GetInstanceID (PC_HERO))
{
   HeroUmarl = TRUE;
};
tu mi w zSpy pokazuje Unknown

ikarus i lego mi działają normalnie
ten twój skrypt wkleiłem na koniec framefunctions.d
 i błąd jest
Spoiler
// ***** ***** ***** ***** ***** ***** ***** ***** ***** *****
func void TimeSec ()
{
var int secHeroIsDead;
   if (HeroUmarl == TRUE) {

      secHeroIsDead = secHeroIsDead + 1; //co sekundę zmienia się numer sekundy, w której jesteś.
   
      if (secHeroIsDead == 1) { //jeśli to pierwsza sekunda
         //to zrób cośtam (np. przeteleportuj)
      };

      if (secHeroIsDead == 3) { //jeśli to 3 sekunda
         //to zrób cośtam (np. spraw, że hero ma max życia)
      };

      if (secHeroIsDead == 5) { //jeśli to 5 sekunda
         HeroUmarl = FALSE; //przestaje naliczać sekundy
         secHeroIsDead = 0; //wraca do tego, że 'stoper' ma zero sekund
      };
   };   

};
 

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Znalazłeś błąd braku średnika, a nie zorientowałeś się, że musisz samemu dodać nową zmienną? W story_globals.d dopisz linijkę:
var int HeroUmarl;

edit: jak już go ładnie wkleiłeś CTRL+C CRTL+V to zajrzyj do poradnika, tak jak poprosiłem. Wywołujesz funkcję co jedną sekundę?

W startup.d w func void INIT_GLOBAL musisz dopisać:
if (!FF_Active (TimeSec))
{
FF_ApplyOnceExt (TimeSec, 1000, -1);//raz na 1s
};

edit2: patrzę na swój który wyżej podałem i nie widzę, żeby nie było braku średnika :O a nie edytowałem, nieważne. Dasz radę :)
 

Wezmir

Wezmir

Użytkownicy
posty12
ProfesjaGracz
  • Użytkownicy
Takie rzeczy jak dopisywanie do różnych plików czegoś to jeszcze dla mnie nie ten poziom dopiero zaczynam znam podstawy
Dzięki za pomoc
Dam ci propsa jak będzie działać.
 


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