NPC wzajemnie się atakujący 3423 7

O temacie

Autor

Zaczęty 13.01.2013 roku

Wyświetleń 3423

Odpowiedzi 7

gothic1210
  • Gość
Mam problem ze skryptem. Otóż, chcę, żeby npc który ze mną idzie atakował innych NPC. Najpierw robiłem tak, że zmieniałem tym npc gildię na ścierwojada. Npc -- pomocnik wtedty ich atakował, ale oni atakowali też siebie na wzajem (mimo iż mieli tę samą gildię). Teraz zrobiłem to tak, że w GUILDS.d zmieniłem nastawienie między gildią GRD a DMB na wrogie. Jednak to też nic nie dało.
B_ChangeGuild    (self,GIL_GRD);  
    self.aivar[AIV_PARTYMEMBER] = TRUE;
    Npc_ExchangeRoutine (self,"atak");

B_SetPermAttitude (GRD_7008_Tukash, ATT_FRIENDLY);
AI_StopProcessInfos (self);
~~~~~~~~~~~~~~~~
Npc_SetPermAttitude (ORG_810_Organisator, ATT_HOSTILE);
Npc_SetPermAttitude (ORG_807_Organisator, ATT_HOSTILE);
Npc_SetPermAttitude (ORG_828_Bruce, ATT_HOSTILE); // żeby mnie atakowali
B_ChangeGuild    (ORG_828_Bruce,GIL_DMB);  
B_ChangeGuild    (ORG_810_Organisator,GIL_DMB);  // żeby npc ich atakował
B_ChangeGuild    (ORG_807_Organisator,GIL_DMB);  
Skutek tego jest taki, że WSZYSCY npc mnie atakują, nawet pomocnik. Ma ktoś pomysł jak to zrobić inaczej?  :ok:
 

Drock

Drock

Użytkownicy
posty357
Propsy75
ProfesjaProgramista
  • Użytkownicy
A spróbuj zmienić im gildię na bandytę
 

Jaeger

Jaeger

Użytkownicy
posty162
Propsy55
  • Użytkownicy
A spróbuj zmienić im gildię na bandytę
W G1 nie ma gildii "bandyta", są bandyci Quentina którzy mają ustawione NPC_TYPE na Rogue i attitude na hostile i wtedy atakują gracza.
 
Cytuj
3. Pamiętaj, kolorek, ranga i ilość postów na forum świadczy o długości penisa!



Towarzysz Karabynier

kaczka

kaczka

RaveN Studio
Definitely not kaczka!
posty2280
Propsy2392
NagrodyV
ProfesjaLvl designer
  • RaveN Studio
  • Definitely not kaczka!
a dlaczegoby nie zrobić własnie tak jak wyżej napisał DGS, tylko że specjalnie dla tego pomocnika? Odpowiednie pozamieniać to i owo i już.
 

gothic1210
  • Gość
Nie ma w Gothiu funkcji, która zmienia nastawienie npc x do npc y. Jest tylko npc do gracza, albo całe gildie. Zajrzałem właśnie do pliku GUILDS.d. Na czas misji można byłoby podmienić gildie npców i zaczęliby walczyć. Sęk w tym, że nie walczą.
Cytuj
CONST INT GIL_ATTITUDES [TAB_ANZAHL] =   // AL und  NL verärgert (Magier zueinander freundlich) ST neutral zu AL und NL (Magier verärgert zu ST)
{
//      None         EBr            Grd            Stt            KdF            Vlk                KdW          Sld            Org          Bau          SfB                Gur          Nov          Tpl                Däm          Bab      
/*Non*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Non*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Non*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Non*/   ATT_NEUTRAL,   ATT_NEUTRAL,   

/*Ebr*/   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Ebr*/   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Ebr*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Ebr*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Grd*/   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Grd*/   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Grd*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Grd*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Stt*/   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Stt*/   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Stt*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Stt*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Kdf*/   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Kdf*/   ATT_FRIENDLY,   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Kdf*/   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Kdf*/   ATT_FRIENDLY,   ATT_NEUTRAL,   
/*Vlk*/   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Vlk*/   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Vlk*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Vlk*/   ATT_NEUTRAL,   ATT_NEUTRAL,   

/*Kdw*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_NEUTRAL,   /*Kdw*/   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Kdw*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Kdw*/   ATT_FRIENDLY,   ATT_NEUTRAL,   
/*Sld*/   ATT_NEUTRAL,   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Sld*/   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Sld*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Sld*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Org*/   ATT_NEUTRAL,   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Org*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Org*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Org*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Bau*/   ATT_NEUTRAL,   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Bau*/   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Bau*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Bau*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Sfb*/   ATT_NEUTRAL,   ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      ATT_ANGRY,      /*Sfb*/   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Sfb*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Sfb*/   ATT_NEUTRAL,   ATT_NEUTRAL,   

/*Gur*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_ANGRY,      ATT_NEUTRAL,   /*Gur*/   ATT_ANGRY,      ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Gur*/   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Gur*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Nov*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_ANGRY,      ATT_NEUTRAL,   /*Nov*/   ATT_ANGRY,      ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Nov*/   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Nov*/   ATT_NEUTRAL,   ATT_NEUTRAL,   
/*Tpl*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_ANGRY,      ATT_NEUTRAL,   /*Tpl*/   ATT_ANGRY,      ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Tpl*/   ATT_FRIENDLY,   ATT_FRIENDLY,   ATT_FRIENDLY,   /*Tpl*/   ATT_NEUTRAL,   ATT_NEUTRAL,   

/*Dmb*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_HOSTILE,   ATT_HOSTILE,   /*Dmb*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_FRIENDLY,   /*Dmb*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Dmb*/   ATT_FRIENDLY,   ATT_NEUTRAL,   
/*Bab*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Mst*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Mst*/   ATT_NEUTRAL,   ATT_NEUTRAL,   ATT_NEUTRAL,   /*Mst*/   ATT_NEUTRAL,   ATT_FRIENDLY   

};
Jako, że w g1 w rozdziałach 1-3 ani nawet później nie ma szansy na spotkanie się strażnika z nekromantą to zmieniłem właśnie im stosunki na wrogie (pogrubione linijki). A w skrypcie zadania tyle:
Cytuj
print ("test3");

B_ChangeGuild    (ORG_828_Bruce,GIL_DMB);  
B_ChangeGuild    (ORG_810_Organisator,GIL_DMB);  
B_ChangeGuild    (ORG_807_Organisator,GIL_DMB);  
ORG_828_Bruce.guild = GIL_DMB;
ORG_810_Organisator.guild = GIL_DMB;
ORG_807_Organisator.guild = GIL_DMB;


B_ChangeGuild    (GRD_7008_Tukash,GIL_GRD);  
Nic sie nie dzieje :(
 

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Zrób tak jak rutyna szkieletu pomocnika wyszukuje ona NPC w pobliżu potem sprawdzasz czy to ten NPC o którego chodzi jeśli tak to zmieniasz rutynę ataku. Poradzisz sobie ?? Tak samo zrobiłem rutynę w zombie modzie która pozwalała mi na wyłączenie ataku.

gothic1210
  • Gość

gothic1210
Gość

NPC wzajemnie się atakujący
#6 2013-01-15, 20:43(Ostatnia zmiana: 2013-01-15, 20:51)
Cytuj
//////////////////////////////////////////////////////////////////////////
//   B_Helper_AssessPlayer
//   ======================
//   Checkt während dem Laufen die Distanz zum Spieler.
//////////////////////////////////////////////////////////////////////////
func void B_Helper_AssessPlayer ()
{
   PrintDebugNpc      (PD_TA_CHECK,   "B_Helper_AssessPlayer");
   PrintGlobals      (PD_TA_CHECK);
   
   if (Npc_GetDistToNpc(self, hero) > PERC_DIST_DIALOG)
   {
      PrintDebugNpc   (PD_TA_CHECK,   "...Spieler zu weit entfernt!");
      B_FullStop      (self);
      B_SmartTurnToNpc(self,   hero);
   }
   else if (Npc_CanSeeNpc(self, hero))
   {
      B_AssessSC();
   };
};

//////////////////////////////////////////////////////////////////////////
//   B_Helper_AssessCall
//   ====================
//   Spielt einfach eine Heran-Wink-Animation ab.
//////////////////////////////////////////////////////////////////////////
func void B_Helper_AssessCall ()
{
   PrintDebugNpc      (PD_ZS_FRAME,   "B_Helper_AssessCall");      

   AI_TurnToNpc      (self,   other);
   AI_PlayAni         (self,   "T_COMEOVERHERE");
};

//////////////////////////////////////////////////////////////////////////
//   ZS_Helper
//   ==========
//   Ein TA-Zustand, der zum angegebenen Waypoint geht, aber auf den SC
//   wartet, falls dieser zu weit zurückfällt.
//////////////////////////////////////////////////////////////////////////
func void ZS_Helper ()
{
   PrintDebugNpc      (PD_TA_FRAME,   "ZS_Helper");
   
   //  Wahrnehmungen aktiv
   Npc_PercEnable     (self,    PERC_ASSESSENEMY      ,   B_AssessEnemy            );
   Npc_PercEnable     (self,    PERC_ASSESSPLAYER      ,   B_Helper_AssessPlayer      );
   Npc_SetPercTime      (self,   1);
   self.senses_range    = HAI_DIST_ASSESS_MONSTER;
   self.senses          = SENSE_SMELL|SENSE_SEE|SENSE_HEAR;
   
   // Wahrnehmungen passiv
   Npc_PercEnable     (self,   PERC_ASSESSDAMAGE      ,   ZS_ReactToDamage         );
   Npc_PercEnable     (self,    PERC_ASSESSMAGIC      ,   B_AssessMagic            );
   Npc_PercEnable     (self,    PERC_ASSESSMURDER      ,   ZS_AssessMurder            );
   Npc_PercEnable     (self,    PERC_ASSESSDEFEAT      ,   ZS_AssessDefeat            );
   Npc_PercEnable     (self,    PERC_ASSESSFIGHTSOUND   ,   B_AssessFightSound         );
   Npc_PercEnable     (self,    PERC_ASSESSTALK         ,   B_AssessTalk                );
   Npc_PercEnable     (self,    PERC_ASSESSCALL         ,   B_Helper_AssessCall      );
};

func int ZS_Helper_Loop ()
{   
   PrintDebugNpc      (PD_TA_LOOP,   "ZS_Helper_Loop");
   PrintGlobals      (PD_TA_CHECK);

   //-------- Spieler zu weit entfernt ! --------
   if (Npc_GetDistToNpc(self, hero) > PERC_DIST_DIALOG)
   {
      B_Helper_AssessPlayer();
   }
   
   //-------- Ziel zu weit entfernt ! --------
   else if (Npc_GetDistToWP(self,self.wp) > PERC_DIST_DIALOG)
   {
      PrintDebugNpc   (PD_TA_CHECK,   "...Ziel noch zu weit entfernt!");
      if   !C_BodyStateContains(self, BS_SWIM)
      {
         AI_SetWalkmode   (self,   NPC_RUN);
      };
      AI_StopLookAt   (self);
      AI_GotoWP      (self,   self.wp);
   }
   
   //-------- Ziel erreicht ! --------
   else
   {
      B_SmartTurnToNpc(self,   hero);
   };

if (Npc_GetNextTarget(self))
   {

       //-------- neues Ziel entdeckt ! --------

       PrintDebugNpc        (PD_MST_CHECK,    "...neuer Gegner gefunden");

       Npc_SetTarget        (self,    other);    

       Npc_ClearAIQueue    (self);

       AI_StartState        (self,    ZS_Attack, 0, "");
     var C_NPC Enemy1;      
   if (Enemy1.guild == GIL_ORG)
   {
      AI_StartState(self,   ZS_Attack,   0,   "");
   };

   };
   
      AI_Wait            (self,   1);      
   return            LOOP_CONTINUE;
};
   
func int ZS_Helper_End ()
{   
   PrintDebugNpc      (PD_TA_FRAME,   "ZS_Helper_End");

   //-------- aktive Wahrnehmungen wieder auf Default zurückstellen -------
   self.senses_range    = hero.senses_range;
   self.senses          = hero.senses;
};
Zrobiłem to tak. Rutyna sama w sobie działa. Jest to przerobiona rutyna GuidePC. Pogrubione dopisałem. Jednak dalej nie osiągnąłem efektu. NPC głupieje. Wyciąga broń, namierza robi trzy kroki do przodu, chowa. Gdy w końcu się dociągnie do jakiegoś npc to go atakuje (chociaż chyba woli zwierzęta, bo npca napadł tylko jednego z trzech obok  stojących  :lol2:  ) Co  z tym zrobić teraz? xD

Wprowadziłem drobną zmianę. Przestał atakować w ogóle.
if (Npc_GetNextTarget(self))
   {
  var C_NPC Enemy1;
       //-------- neues Ziel entdeckt ! --------

       PrintDebugNpc        (PD_MST_CHECK,    "...neuer Gegner gefunden");

       Npc_SetTarget        (self,    Enemy1);    

       Npc_ClearAIQueue    (self);

       AI_StartState        (self,    ZS_Attack, 0, "");

if (Enemy1.guild == GIL_ORG)
{
AI_StartState(self, ZS_Attack, 0, "");
};
   };

AI_Wait (self, 1);
return LOOP_CONTINUE;
};
 

gothic1210
  • Gość

gothic1210
Gość

NPC wzajemnie się atakujący
#7 2013-01-20, 21:05(Ostatnia zmiana: 2013-01-20, 21:06)
Hej. Odświeżam. Do tej funkcji dodałem dwa printy. Żaden z nich się nie wyświetla. Coś musi być nie tak.
func int ZS_Helper_Loop ()
{
PrintDebugNpc (PD_TA_LOOP, "ZS_Helper_Loop");
PrintGlobals (PD_TA_CHECK);

//-------- Spieler zu weit entfernt ! --------
if (Npc_GetDistToNpc(self, hero) > PERC_DIST_DIALOG)
{
B_Helper_AssessPlayer();
}

//-------- Ziel zu weit entfernt ! --------
else if (Npc_GetDistToWP(self,self.wp) > PERC_DIST_DIALOG)
{
PrintDebugNpc (PD_TA_CHECK, "...Ziel noch zu weit entfernt!");
if !C_BodyStateContains(self, BS_SWIM)
{
AI_SetWalkmode (self, NPC_RUN);
};
AI_StopLookAt (self);
AI_GotoWP (self, self.wp);
}

//-------- Ziel erreicht ! --------
else
{
B_SmartTurnToNpc(self, hero);
};
       //--------TO MA ODPOWIADAĆ ZA WALKĘ--------
if (Npc_GetNextTarget(self))
{
var C_NPC Enemy1;


       PrintDebugNpc        (PD_MST_CHECK,    "...neuer Gegner gefunden");
       Npc_SetTarget        (self,Enemy1);    
       Npc_ClearAIQueue    (self);
     //  AI_StartState        (self,ZS_Attack, 0, "");
print ("namierzanie");
if (Hlp_GetInstanceID(Enemy1)==Hlp_GetInstanceID(ORG_810_Organisator)) || (Hlp_GetInstanceID(Enemy1)==Hlp_GetInstanceID(ORG_807_Organisator)) || (Hlp_GetInstanceID(Enemy1)==Hlp_GetInstanceID(ORG_828_Bruce))// (Enemy1.guild == GIL_ORG) // próbowałem odbydwa warunki i nic.
{
print ("Atak na NPC");
Npc_SetTarget        (self,Enemy1);
AI_StartState (self,ZS_Attack,0,"");
};
};

AI_Wait (self, 1);
return LOOP_CONTINUE;
};
Rafał na pewno ta część odpowiada za walkę?
 


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