Uciekający NPC 5469 10

O temacie

Autor ChetnikPL

Zaczęty 26.08.2017 roku

Wyświetleń 5469

Odpowiedzi 10

ChetnikPL

ChetnikPL

Użytkownicy
posty86
Propsy6
Profesjabrak
  • Użytkownicy
Witam, w Gothic1 niektórzy NPC (z reguły ci słabsi) w trakcie bójki z nami zaczynają uciekać. Chciałbym zrobić kilka takich NPC'ów w Gothicu2. Szukałem co nieco w skryptach jedynki ale nie nic na razie nie znalazłem. Nie wiem czy jest to spowodowane taktyką walki, aivarem, czy npctype. Jestem zielony więc mogę się mylić. Proszę o pomoc  :D
 

Fabio

Fabio

The Modders
posty3477
Propsy2157
ProfesjaSkrypter
  • The Modders
Z walką to raczej nic wspólnego nie ma, więc to możesz wykluczyć. W Gothicu 2 nie kojarzę, żeby spylali, tu nawet kobiety Cię leją :D

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Starczy ustawić w ZS_ReactToDamage, żeby zamiast zmiany trybu na atak (po otrzymaniu obrażeń) zmieniali tryb na ucieczkę (ZS_Flee/ZS_MagicFlee).
 
: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.

ChetnikPL

ChetnikPL

Użytkownicy
posty86
Propsy6
Profesjabrak
  • Użytkownicy
Kiedy zrobiłem tak jak mówisz, tylko NPC z gildią NONE "reagowali", przy czym wyglądało to tak, że mówili "cholera, znikam stąd" i nastepnie stali  w miejscu..
 

ChetnikPL

ChetnikPL

Użytkownicy
posty86
Propsy6
Profesjabrak
  • Użytkownicy
Próbowałem wieloma sposobami, lecz żaden nie przynosił oczekiwanego efektu. Poniżej ostatnia dotąd próba (574 to jedno z ID moich postaci, które mają uciekać.)

// ************************************************************
// ZS_ReactToDamage
// ----------------
// wird duch B_AssessDamage aufgerufen
// wenn ein Freundlicher NSC aus einem TA heraus getroffen wird
// verschafft dem Spieler bei Freunden EINEN Freischlag
// ************************************************************

func void ZS_ReactToDamage ()
{
if (other.id != 574)
{
Perception_Set_Normal();
B_LookAtNpc (self, other);
B_SelectWeapon (self, other);
B_TurnToNpc (self, other);
B_Say (self, other, "$WHATAREYOUDOING");
self.aivar[AIV_StateTime] = 0;
}
else
{
AI_SetNpcsToState (self, ZS_MagicFlee, 1000); //-kairo
};
};

func int ZS_ReactToDamage_Loop ()
{
// ------ Alle 2 Sekunden zu other ausrichten ------
if (Npc_GetStateTime (self) > self.aivar[AIV_StateTime])
{
if (!Npc_CanSeeNpc (self, other))
{
AI_TurnToNpc (self, other);
};

self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1;
};

// ------ 10 Sekunden warten -------
if (Npc_GetStateTime (self) > 10)
{
return LOOP_END;
}
else
{
return LOOP_CONTINUE;
};
};

func void ZS_ReactToDamage_End ()
{
AI_RemoveWeapon (self);
B_StopLookAt (self);
};

 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
W SetNpcsToState, npc, który jest w pierwszym argumencie, to npc który wywołuje ten state. Jeśli próbowałeś to tylko na jednym npc, to się nie dziw. Zmień to na zwykłe, pojedyncze (SetNpcToState? nie pamiętam nazwy) i sprawdź czy działa (albo zmień na SetNpcsToState(other...)).
 
: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.

ChetnikPL

ChetnikPL

Użytkownicy
posty86
Propsy6
Profesjabrak
  • Użytkownicy
Po drobnej zmianie:
// ************************************************************
// ZS_ReactToDamage
// ----------------
// wird duch B_AssessDamage aufgerufen
// wenn ein Freundlicher NSC aus einem TA heraus getroffen wird
// verschafft dem Spieler bei Freunden EINEN Freischlag
// ************************************************************

func void ZS_ReactToDamage ()
{
if (self.id != 574)
{
Perception_Set_Normal();
B_LookAtNpc (self, other);
B_SelectWeapon (self, other);
B_TurnToNpc (self, other);
B_Say (self, other, "$WHATAREYOUDOING");
self.aivar[AIV_StateTime] = 0;
}
else
{
AI_StartState (self, ZS_Flee, 1000,"");
};
};

func int ZS_ReactToDamage_Loop ()
{
// ------ Alle 2 Sekunden zu other ausrichten ------
if (Npc_GetStateTime (self) > self.aivar[AIV_StateTime])
{
if (!Npc_CanSeeNpc (self, other))
{
AI_TurnToNpc (self, other);
};

self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1;
};

// ------ 10 Sekunden warten -------
if (Npc_GetStateTime (self) > 10)
{
return LOOP_END;
}
else
{
return LOOP_CONTINUE;
};
};

func void ZS_ReactToDamage_End ()
{
AI_RemoveWeapon (self);
B_StopLookAt (self);
};


Teraz tylko ten unikalny NPC reaguje w inny sposób. Jednak nie po mojej myśli, gdyż gdy go uderzę, mówi tylko "O cholera!" ale nie ucieka i dalej zachowuje sie normalnie (rozmawia itd)
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
AI_StartState (self, ZS_Flee, 1000,"");

To znaczy, że po sekundzie (albo dziesięciu, teraz nie pamiętam) npc zacznie uciekać. Powinno być 0. Jeśli dalej nie działa, wywal ten StartState i dodaj ApplyOverlay (flee)* i gotoWP (tot)*.


* Musisz poszukać, jak dokładnie wygląda funkcja oraz nazwa mds.

Jeśli modujesz G1, poszukaj jakiegoś bardzo odległego WP na który npc może biec (w jedynce nie ma WP o nazwie TOT, jeśli się nie mylę).
 
: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.

ChetnikPL

ChetnikPL

Użytkownicy
posty86
Propsy6
Profesjabrak
  • Użytkownicy
1) Próbowałem wczoraj zmieniać te liczby, to nic nie dawało.
2) // ************************************************************
// ZS_ReactToDamage
// ----------------
// wird duch B_AssessDamage aufgerufen
// wenn ein Freundlicher NSC aus einem TA heraus getroffen wird
// verschafft dem Spieler bei Freunden EINEN Freischlag
// ************************************************************

func void ZS_ReactToDamage ()
{
if (self.id != 574)
{
Perception_Set_Normal();
B_LookAtNpc (self, other);
B_SelectWeapon (self, other);
B_TurnToNpc (self, other);
B_Say (self, other, "$WHATAREYOUDOING");
self.aivar[AIV_StateTime] = 0;
}
else
{
Mdl_ApplyOverlayMds (self, "HUMANS_FLEE.MDS");
AI_GotoWP (self,"TOT");
};
};

func int ZS_ReactToDamage_Loop ()
{
// ------ Alle 2 Sekunden zu other ausrichten ------
if (Npc_GetStateTime (self) > self.aivar[AIV_StateTime])
{
if (!Npc_CanSeeNpc (self, other))
{
AI_TurnToNpc (self, other);
};

self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1;
};

// ------ 10 Sekunden warten -------
if (Npc_GetStateTime (self) > 10)
{
return LOOP_END;
}
else
{
return LOOP_CONTINUE;
};
};

func void ZS_ReactToDamage_End ()
{
AI_RemoveWeapon (self);
B_StopLookAt (self);
};
Ta metoda też nic nie dała, po otrzymaniu obrażeń NPC tylko patrzy się na mnie, nic nie mówi i nigdzie nie idzie.
3) Moduję G2NK
 

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
O ile pamiętam, waypoint TOT nie jest połączony z innymi, więc dlatego npc do niego nie idzie. Lepiej będzie przepisać funkcję z G1:
func void ZS_Flee ()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_Flee" );
PrintGlobals (PD_ZS_CHECK);

Npc_PercEnable  (self, PERC_ASSESSMAGIC , B_AssessMagic );
C_ZSInit ();

//B_DropWeapon (self); // aus Gamedesign-Gründen entfernt

AI_SetWalkmode (self, NPC_RUN);
Mdl_ApplyOverlayMds (self, "HUMANS_FLEE.MDS");// Flucht-OverlayMDS einschalten

if (Npc_IsPlayer(other))
{
Npc_SetTempAttitude (self, ATT_HOSTILE);
};
};

func int ZS_Flee_Loop ()
{
PrintDebugNpc (PD_ZS_LOOP, "ZS_Flee_Loop" );

//-------- Gegner noch gültig? --------
if (!Hlp_IsValidNpc(other))
{
PrintDebugNpc (PD_ZS_CHECK, "...Gegner nicht mehr gültig!");
return LOOP_END; //
}

//-------- Gegner weit genug weg ? --------
else if (Npc_GetDistToNpc(self, other) > HAI_DIST_ABORT_FLEE) // Gegner noch näher als 20m?
{ // ...nein...
PrintDebugNpc (PD_ZS_CHECK, "...Gegner weit genug weg -> Flucht abbrechen!");
return LOOP_END; //
}

//-------- Gegner noch kampffähig? --------
else if (C_NpcIsDown(other))
{
PrintDebugNpc (PD_ZS_CHECK, "...Gegner nicht mehr kampffähig!");
return LOOP_END; //
}

//-------- Die eigentliche Flucht --------
else
{
PrintDebugNpc (PD_ZS_CHECK, "...Gegner noch zu nah dran!");
Npc_SetTarget (self, other);

Npc_GetTarget ( self);
AI_Flee (self); // ...also weiter fliehen!
AI_Wait (self, 1);
return LOOP_CONTINUE;
};
};

func void ZS_Flee_End ()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_Flee_End");

Mdl_RemoveOverlayMDS(self,"HUMANS_FLEE.MDS");
B_LookAround ();
AI_StartState (self, ZS_HealSelf, 1, "");
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

ChetnikPL

ChetnikPL

Użytkownicy
posty86
Propsy6
Profesjabrak
  • Użytkownicy
Przy wklejeniu tego skryptu wywaliło kilka błędów, jednak kiedy usunąłem/zmieniłem kilka linijek, wszystko działa :D
Propsiki dla wszystkich którzy starali się pomóc :)

Można zamknąć :D
 


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