Zmiana rutyny NPC 4360 11

O temacie

Autor Konsyliarz

Zaczęty 3.07.2016 roku

Wyświetleń 4360

Odpowiedzi 11

Konsyliarz

Konsyliarz

Użytkownicy
posty39
Propsy1
Profesjabrak
  • Użytkownicy
Kolejny zakładany wątek i kolejny problem. W tym wątku mam 2 pytania:

1. Jak zmienić rutynę jakiegoś NPC? (Tu jest problem z poleceniem  Npc_ExchangeRoutine, po prostu gothic nie wywala błędu a jak dochodzi do zmiany rutyny to postać się zatrzymuje i dalej robi poprzednią rutynę)

2. Czy istnieje jakaś funkcja którą można dodać w skryptach albo użyć w innej funkcji która resetuje wybranego NPC? (Czyli że NPC się z respawnuje)

Ps. Wstawiam jeszcze skrypty:
NPC:
instance MOD_0211_Zolnierz (Npc_Default)
{
// ------ NSC ------
name = "Zolnierz";
guild = GIL_MIL;
id = 0211;
voice = 12;
flags        = 0;
npctype = NPCTYPE_MAIN;

// ------ AIVARS ------
aivar[AIV_ToughGuy] = TRUE;
aivar[AIV_ToughGuyNewsOverride] = TRUE;
aivar[AIV_IGNORE_Murder] = TRUE;
aivar[AIV_IGNORE_Theft] = TRUE;
aivar[AIV_IGNORE_Sheepkiller] = TRUE;
aivar[AIV_IgnoresArmor] = TRUE;

// ------ Aivars ------
aivar[AIV_NewsOverride] = TRUE;

// ------ Attribute ------
B_SetAttributesToChapter (self, 3);

// ------ Kampf-Taktik ------
fight_tactic = FAI_HUMAN_STRONG;

// ------ Equippte Waffen ------
EquipItem (self, ItMw_1h_Mil_Sword);

// ------ Inventory ------
B_CreateAmbientInv (self);

// ------ visuals ------
B_SetNpcVisual (self, MALE, "Hum_Head_FatBald", Face_B_Tough_Silas, BodyTex_B, ITAR_MIL_L);
Mdl_SetModelFatness (self, 1);
Mdl_ApplyOverlayMds (self, "Humans_Militia.mds");

// ------ NSC-relevante Talente vergeben ------
B_GiveNpcTalents (self);

// ------ Kampf-Talente ------
B_SetFightSkills (self, 50);

// ------ TA anmelden ------
daily_routine = Rtn_Szkolenie_0211;
};

FUNC VOID Rtn_Szkolenie_0211 ()
{
    TA_Practice_Sword (05,00,06,00,"WAY_05");
    TA_Practice_Sword (06,00,05,00,"WAY_05");

};

FUNC VOID Rtn_Pozycja_0211 ()
{
TA_Stand_ArmsCrossed (08,00,23,00,"WAY_03");
TA_Stand_ArmsCrossed (23,00,08,00,"WAY_03");
};
Funkcji która zmienia rutynę:
FUNC VOID  Szkolenie()
{
if (O == TRUE)
{
  Npc_ExchangeRoutine (MOD_0211_Zolnierz, "Pozycja");
  Npc_ExchangeRoutine (MOD_0212_Zolnierz, "Pozycja");
  Npc_ExchangeRoutine (MOD_0213_Zolnierz, "Pozycja");

O = FALSE;
};
};
Funkcja jest wywoływana 10s po spawnie Żołnierzy
 

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
1. Usuń to zero na początku numeru. Nie ma liczb, których pierwsza cyfra to 0 :p walnij jakiś duży numer. Ale zero na początku to chyba zły pomysł.
2. Nie rozumiem.

Edit: co to za zmienna '0'? W ogóle spełnia Ci się tewarunek?
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
1. Musisz użyć Hlp_GetNpc(NpcInstance) i dodać to do zmiennej (var c_npc hubert; hubert = Hlp_GetNpc(None_182478_Hubert)).
2. KillNpc (nie pamiętam dokładnej nazwy) albo RemoveNpc i potem wstawiasz postać ponownie. Ale i tak po co Ci takie coś?
 
: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.

Konsyliarz

Konsyliarz

Użytkownicy
posty39
Propsy1
Profesjabrak
  • Użytkownicy
1. Wstawiam 0 na początku ID żeby przypadkiem nie podać ID już istniejącej postaci.
2. To nie jest 0 tylko O. Jest to zmienna tylko ze zadeklarowana gdzie indziej. Tak spełnia.
3. Nie rozumiem jak ma mi zmienić rutynę Hlp_GetNPC.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
var C_NPC Hubert; Hubert = Hlp_GetNpc(Jakiś jebany hubert);
Npc_ExchangeRoutine (HUBERT, "Pozycja");
 
: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.

Konsyliarz

Konsyliarz

Użytkownicy
posty39
Propsy1
Profesjabrak
  • Użytkownicy
Nie pomogło :(
 

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Nieraz miewalem taki problem i sposób Bogdana też nie pomagał. Problemem okazywał się być albo numer - w twoim przypadku może to 0 na początku numerów przeszkadza, albo komenda npc_exchangeroutine - po prostu się nie wywolywala niewiadomo czemu. Miałem tak z cztery razy. Spróbuj albo numer albo w innym miejscu wywołać komendę zmiany rutyny.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Faktycznie. Musisz mieć z dużej WP: var C_NPC Hubert; Hubert = Hlp_GetNpc(Jakiś jebany hubert);
Npc_ExchangeRoutine (HUBERT, "POZYCJA");

To nie 0 tylko O.
 
: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.

OrtegaX

OrtegaX

Użytkownicy
Bractwo Gothica
posty362
Propsy304
ProfesjaSkrypter
  • Użytkownicy
  • Bractwo Gothica
Jest też inny ciekawy sposób, który odkryłem bawiąc się ze skryptami.

Edytujesz plik TA_Stand_armsCrossed ( Taki jak dałeś w swoim skrypcie )
Spoiler
func void ZS_Stand_ArmsCrossed()
{
   Perception_Set_Normal();
   
   B_ResetAll (self);

   AI_SetWalkmode    (self, NPC_WALK);      
   
   if (Npc_GetDistToWP (self,self.wp) > TA_DIST_SELFWP_MAX)
    {
      AI_GotoWP   (self, self.wp); //Skopiuj to na dół
AI_GotoWP   (MOD_0211_Zolnierz, self.wp); //Zamiast 1 self daj instance NPC
   };
   self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

func int ZS_Stand_ArmsCrossed_loop()
{
   if (Npc_IsOnFP (self, "STAND"))
   {   
      AI_AlignToFP (self);
      if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
        {
           self.aivar[AIV_TAPOSITION] = NOTINPOS;
        };
   }   
   else if (Wld_IsFPAvailable(self,"STAND"))
   {
      AI_GotoFP       (self, "STAND");
      AI_StandUp       (self);
      AI_AlignToFP    (self);
      self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
   }
   else
   {
      AI_AlignToWP (self);
      if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
        {
           self.aivar[AIV_TAPOSITION] = NOTINPOS;
        };
   };
   
   if (self.aivar[AIV_TAPOSITION] == NOTINPOS)
   {
      AI_StandUp       (self);
      AI_PlayAni (self,"T_STAND_2_LGUARD");
      self.aivar[AIV_TAPOSITION] = ISINPOS;
   };
   
//*******************************************************
//   Hier dann die Random Anis
//*******************************************************      
   
   if ((Npc_GetStateTime(self) > 5)
   && (self.aivar[AIV_TAPOSITION] == ISINPOS))
   {
      var int random;   random = Hlp_Random(7);
      
      if (random == 0)
      {
         AI_PlayAni (self,"T_LGUARD_SCRATCH");
      }
      else if (random == 1)
      {
         AI_PlayAni (self,"T_LGUARD_STRETCH");
      }
      else if (random == 2)
      {
         AI_PlayAni (self,"T_LGUARD_CHANGELEG");
      };
      
      //ADDON>
      var int Eventrandy;   Eventrandy = Hlp_Random(200);
      if (Eventrandy == 1)
      && (CurrentLevel == ADDONWORLD_ZEN)
      && (RavenIsDead == FALSE)
      && (self.guild != GIL_PIR)
         {
            B_EVENT_PORTAL_EARTHQUAKE ();         
         };
      //ADDON<

      // ------ nicht benutzte Random-Anis ------
      //"t_LGuard_Greet"
      //"t_LGuard_NoEntry"
      //"t_LGuard_ComeIn"
      //"t_LGuard_Allright"
      
      Npc_SetStateTime (self, 0);
   };

   return LOOP_CONTINUE;
};

func void ZS_Stand_ArmsCrossed_end()
{
   AI_PlayAni (self,"T_LGUARD_2_STAND");   
};


Powinno zadziałać. Postać będzie się poruszać ( Nie będzie blokować itd ) Warto dodac, ze w taki sposob można zrobić ruch wielu npc na raz. Pamiętam, ze sam mialem taki problem, ze po dialogu byla zmiana rutyn paru NPC a tylko jeden szedl tam gdzie waypoint, teraz to dzieki temu mi dziala :)

Konsyliarz

Konsyliarz

Użytkownicy
posty39
Propsy1
Profesjabrak
  • Użytkownicy
Więc tak:
1. Zmiana ID NPC nie pomogła.
2. Wywołania funkcji z poziomu dialogu też nie.
3. Ortega The modder skąd wziąłeś ten plik Ta_Stand_armsCrossed w żadnym folderze nie mogę tego znaleźć.
 

OrtegaX

OrtegaX

Użytkownicy
Bractwo Gothica
posty362
Propsy304
ProfesjaSkrypter
  • Użytkownicy
  • Bractwo Gothica
Scripts/content/AI/Human/Ta_Human

Konsyliarz

Konsyliarz

Użytkownicy
posty39
Propsy1
Profesjabrak
  • Użytkownicy
Twój sposób też nie pomaga, ciągle machają mieczami.
 


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