perceptiony a otwieranie skrzyń 7134 29

O temacie

Autor pawbuj

Zaczęty 8.01.2014 roku

Wyświetleń 7134

Odpowiedzi 29

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
wyświetla się tylko opcja textowa "działa" i do tego kiedy ruszę kołowrót straży, dla skrzyni reakcji brak. sam pomysł testowania rewelacyjny.

cały skrypt wyglądał tak: func void B_AssessUseMob ()
{
   PrintDebugNpc               (PD_ZS_FRAME,   "B_AssessUseMob");
   var string detectedMob;
   detectedMob = Npc_GetDetectedMob(other);
   PrintDebugNpc               (PD_ZS_CHECK,   detectedMob);

   if (Npc_CanSeeNpcFreeLOS      (self, other))
   {
      if (Npc_IsDetectedMobOwnedByNpc(other,   self)
      ||   Npc_IsDetectedMobOwnedByGuild(other, self.guild)
      ||  Hlp_StrCmp(LastMobName, "Chest") )
      {   
         PrintDebugNpc         (PD_ZS_CHECK,   "...MOB gehört NSC oder seiner Gilde!");
         
         if (Npc_GetPermAttitude   (self, other)==ATT_FRIENDLY || self.guild==other.guild)
         {
            PrintDebugNpc      (PD_ZS_CHECK,   "...Manipulator ist FRIENDLY oder in gleicher Gilde!");
            B_Say             (self,   other,   "$HandsOff");
           
            penaltymoboc();
         }
         else
         {
            PrintGlobals(PD_ZS_CHECK);
            penaltymoboc();
            PrintScreen     (IntToString(Npc_IsDetectedMobOwnedByNpc(other,   self)), 3,50,"font_old_10_white.tga",2);
            PrintScreen     (IntToString(Npc_IsDetectedMobOwnedByGuild(other, self.guild)), 3,55,"font_old_10_white.tga",2);
            PrintScreen     (LastMobName, 3,60,"font_old_10_white.tga",2);
            PrintScreen     ("działa",-1,-1,"font_old_10_white.tga",5);
            //---- Täter vermöbeln ----
            Npc_SetTempAttitude   ( self,   ATT_HOSTILE);
            Npc_ClearAIQueue   ( self);
            B_WhirlAround      ( self,   other);
            B_SayOverlay      ( self,   other,   "$IWillTeachYouRespectForForeignProperty");
            // JP: Ist ein heikler Fall, eigentlich sollten die Nsc´s nah genug sein, evtl. aber noch auf ZS_WarnAndPunish umbauen
            AI_SetWalkmode      ( self,   NPC_RUN);
            Npc_SetTarget       ( self,   other);
            AI_StartState      ( self,   ZS_Attack,   0,   "");
           
            //penaltymoboc();
         };
      }   
      else
      {
          PrintDebugNpc               (PD_ZS_DETAIL,   "not my MoB");     
      };
   }   
   else
   {
       PrintDebugNpc               (PD_ZS_DETAIL,   "kann SC nicht sehen");   
   };
};
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Masz jakieś dziwne problemy. Od razu na początku dal linijkę która wydrukuje te dwa stringi (piszę pseudokodem)
Npc_GetDetectedMob(other)
other.focus_vob.name
I wywal resztę kodu. Patrz co ci się drukuje. Nie dawaj żadnycn warunków oprócz sprawdzania czy focus_vob zawiera oCMoba dopóki nie jesteś pewien jak ich używać i czy reszta działa.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
"other.focus_vob.name" tu wywala błąd z c npc.


może inaczej zróbmy.

każdy mob ma swoją indywidulną nazwę, może zamiast biegać w spacerze po skrzyniach to z poziomu ikariusa regulować "cechy" takiego moba jak owner czy  ownerguild, ba nawet ilość przekręceń wytrychem.

 


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
mam skrypt odnosśnie samego otwierania skrzyń i wyświetlania textów. co do za warunki, które nie dwołują się do konkretnych wartości zmiennych ? jeszcze jedna uwaga, testowałem wyświetlanie się wszystkich numerów od 1 do 4 i nie wyświetla się tylko 1 czyli w momencie kiedy  uda nam się wytrychem otworzyć skrzynię? jakieś pomysły dlaczego tak jest?

func void G_PickLock(var int bSuccess,var int bBrokenOpen)
{
    var string strSoundFX;
    var string strMessage;
    var int strYPos;
    strSoundFX = _STR_INVALID;
    strMessage = _STR_INVALID;
    if(bSuccess)
    {
        if (bBrokenOpen)
        {
            strSoundFX = _STR_SOUND_PICKLOCK_UNLOCK;
            strMessage = _STR_MESSAGE_PICKLOCK_UNLOCK;
            strYPos = _YPOS_MESSAGE_PICKLOCK_UNLOCK;
            PrintScreen    ("1!", yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep);    //dla testu
        }
        else
        {
            strSoundFX = _STR_SOUND_PICKLOCK_SUCCESS;
            strMessage = _STR_MESSAGE_PICKLOCK_SUCCESS;
            strYPos = _YPOS_MESSAGE_PICKLOCK_SUCCESS;
            chest_exp     = chest_exp + 4;
            PrintScreen    ("2!", yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep);    //dla testu
        };
    }
    else if(bBrokenOpen)
    {
        strSoundFX = _STR_SOUND_PICKLOCK_BROKEN;
        strMessage = _STR_MESSAGE_PICKLOCK_BROKEN;
        strYPos = _YPOS_MESSAGE_PICKLOCK_BROKEN;
        PrintScreen    ("3!", yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep);    //dla testu
        chest_exp = 0;
    }
    else
    {
        strSoundFX = _STR_SOUND_PICKLOCK_FAILURE;
        strMessage = _STR_MESSAGE_PICKLOCK_FAILURE;
        strYPos = _YPOS_MESSAGE_PICKLOCK_FAILURE;
        chest_exp = 0;
        PrintScreen    ("4!", yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep);    //dla testu
    };
    Snd_Play3d(self,strSoundFX);
    PrintScreen(strMessage,-1,strYPos,_STR_FONT_ONSCREEN,_TIME_MESSAGE_PICKLOCK);
};

 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Jeśli w warunku jest jedynie nazwa zmiennej, znaczy to że sprawdzamy czy jest ona nierówna zeru.
if (zmienna)znaczy to samo co
if (zmienna != 0)Drugie pytanie napisałeś dość dziwnie i nie jestem pewien czy je rozumiem, ale jeśli chodzi ci o to dlaczego pierwsza z sekcji nigdy nie jest wykonywana, to wydaje się to być dość logiczne. Gdybyśmy złamali wytrych (bBrokenOpen) to skrzynia nie zostałaby otwarta (bSuccess). Są tylko trzy logiczne sytuacje:
wytrych przekręcony poprawnie co otwarło skrzynię
wytrych przekręcony poprawnie co jeszcze nie otwarło skrzyni
wytrych przekręcony niepoprawnie (więc skrzynia na pewno jeszcze nie otwarta).

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
a możemy zrobić czwarty z napisem "skrzynia została otwarta' . pomożesz?

mam to rozwiązanie na skróty przez tick tocka.,wolałbym z tego zejść.

dodam, że do b_assessusemob możemy dodać zmienną, dotyczącą otwierania skrzyń, która spowoduje, że npc będą reagować w momencie, kiedy zaczniemy kręcić wytrychem.
 


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
działa jeśli przekręcimy wytrychem w sposób poprawny z napisem brzmi nieźle. przy finalnym ostatnim takim przekręceniu poza "brzmi nieźle" nic się nie wyświetla. w skrypcie od 1 do 4 ponumerowałem każdą z sytuacji i tak jak mówiłem tam gdzie jest 1 nic nie wyświetla się.  obszedłem to tick-tockiem, ale wolałbym inne rozwiązanie

Post połączony: 2014-01-15, 19:39
zrobiłem  zależność wyzwalania reakcji od wartości zmiennej chest_exp, która zwiększa się przy każdym przekręceniu wytrychem aż do jego złamania

zmienna wyświetlana jest z z b_asessusemob i pomimo wartości pow. 0, nie następuje reakcja łąncuchowa. nie bardzo rozumiem.

func void B_AssessUseMob ()
{
   PrintDebugNpc               (PD_ZS_FRAME,   "B_AssessUseMob");
   var string detectedMob;
   detectedMob = Npc_GetDetectedMob(other);
   var string expo;
   expo = ConcatStrings (IntToString (chest_exp),"pts.");
     
   PrintDebugNpc               (PD_ZS_CHECK,   detectedMob);
   PrintScreen   (expo, yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep);   //dla testu

   if (Npc_CanSeeNpcFreeLOS      (self, other))
   {
      if (Npc_IsDetectedMobOwnedByNpc(other,   self)
      ||   Npc_IsDetectedMobOwnedByGuild(other, self.guild))
      ||  (chest_exp > 0)
     
      {   
         PrintDebugNpc         (PD_ZS_CHECK,   "...MOB gehört NSC oder seiner Gilde!");
         PrintScreen   (expo, yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep);   //dla testu
         if (Npc_GetPermAttitude   (self, other)==ATT_FRIENDLY || self.guild==other.guild)
         {
            PrintDebugNpc      (PD_ZS_CHECK,   "...Manipulator ist FRIENDLY oder in gleicher Gilde!");
            B_Say             (self,   other,   "$HandsOff");
           
            //penaltymoboc();
         }
         else
         {
            PrintGlobals(PD_ZS_CHECK);
           
            //---- Täter vermöbeln ----
            Npc_SetTempAttitude   ( self,   ATT_HOSTILE);
            Npc_ClearAIQueue   ( self);
            B_WhirlAround      ( self,   other);
            B_SayOverlay      ( self,   other,   "$IWillTeachYouRespectForForeignProperty");
            // JP: Ist ein heikler Fall, eigentlich sollten die Nsc´s nah genug sein, evtl. aber noch auf ZS_WarnAndPunish umbauen
            AI_SetWalkmode      ( self,   NPC_RUN);
            Npc_SetTarget       ( self,   other);
            AI_StartState      ( self,   ZS_Attack,   0,   "");
           
            penaltymoboc();
         };
      }   
      else
      {
          PrintDebugNpc               (PD_ZS_DETAIL,   "not my MoB");     
      };
   }   
   else
   {
       PrintDebugNpc               (PD_ZS_DETAIL,   "kann SC nicht sehen");   
   };
};


 

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
podaję skrypt odnośnie prawidłwoego rozwiązania, npc reaguja na dotykanie skrzyń w ich obecności nawet jeśli nie należą do nich czy ich gildii.
func void B_AssessUseMob ()
{
   PrintDebugNpc               (PD_ZS_FRAME,   "B_AssessUseMob");
   var string detectedMob;
   detectedMob = Npc_GetDetectedMob(other);
   var string expo;
   expo = ConcatStrings (IntToString (chest_exp),"pts.");
     
   PrintDebugNpc               (PD_ZS_CHECK,   detectedMob);
   touched_chest ();
   //PrintScreen   (expo, yposition,yaposition,"FONT_OLD_10_WHITE.TGA",timep);   //dla testu

   if (Npc_CanSeeNpcFreeLOS      (self, other))
   {
      if (Npc_IsDetectedMobOwnedByNpc(other,   self)
      ||   Npc_IsDetectedMobOwnedByGuild(other, self.guild))     
      {   
         PrintDebugNpc         (PD_ZS_CHECK,   "...MOB gehört NSC oder seiner Gilde!");
         
         if (Npc_GetPermAttitude   (self, other)==ATT_FRIENDLY || self.guild==other.guild)
         {
            PrintDebugNpc      (PD_ZS_CHECK,   "...Manipulator ist FRIENDLY oder in gleicher Gilde!");
            B_Say             (self,   other,   "$HandsOff");
           
            //penaltymoboc();
         }
         else
         {
            PrintGlobals(PD_ZS_CHECK);
           
            //---- Täter vermöbeln ----
            Npc_SetTempAttitude   ( self,   ATT_HOSTILE);
            Npc_ClearAIQueue   ( self);
            B_WhirlAround      ( self,   other);
            B_SayOverlay      ( self,   other,   "$IWillTeachYouRespectForForeignProperty");
            // JP: Ist ein heikler Fall, eigentlich sollten die Nsc´s nah genug sein, evtl. aber noch auf ZS_WarnAndPunish umbauen
            AI_SetWalkmode      ( self,   NPC_RUN);
            Npc_SetTarget       ( self,   other);
            AI_StartState      ( self,   ZS_Attack,   0,   "");
           
            penaltymoboc();
         };
      }   
      else
      {
          PrintDebugNpc               (PD_ZS_DETAIL,   "not my MoB");     
      };
   }   
   else
   {
       PrintDebugNpc               (PD_ZS_DETAIL,   "kann SC nicht sehen");   
   };
};
[code]func void touched_chest ()
{
Npc_SetTempAttitude ( self, ATT_HOSTILE);
Npc_ClearAIQueue ( self);
B_WhirlAround ( self, other);
B_SayOverlay ( self, other, "$IWillTeachYouRespectForForeignProperty");
// JP: Ist ein heikler Fall, eigentlich sollten die Nsc´s nah genug sein, evtl. aber noch auf ZS_WarnAndPunish umbauen
AI_SetWalkmode ( self, NPC_RUN);
Npc_SetTarget ( self, other);
AI_StartState ( self, ZS_Attack, 0, "");
penaltymoboc();
};
[/code]temat zamykamy!
 


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