Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Einfache, leicht erweiterbare NPC Steuerung
#5
So, hier kommt die erste NPC Anwendung.
Ein Script was den NPC zu zufälligen Zeiten (einstellbar) anhält und eine Animation (bei mehreren, werden sie zufällig gewählt) ausführen lässt.
Ist zB für Tiere interessant. Ein Pferd trabt über die Wiese und hält hier und da um zu grasen oder sich eine Zecke aus dem Fell zu beißen...

Oder man kann auch einen menschlichen NPC ab u. an ein spontanes Tänzchen aufführen lassen Smile

Das Script kommt zusammen mit den Animationen in ein Objekt am NPC. Es darf aber nicht das gleiche sein wie die Steuerung. Die Kommunikation läuft über die Listen-Funktion und die „hört“ leider nicht was das eigene Objekt sagt. Mit Viewer lässt es sich nur sehr bedingt testen, da „llStopMoveToTarget“ nicht richtig funktioniert. Man bewegt sich noch einige Zeit weiter. Aber beim NPC funktionierts mit „osNpcStopMoveToTarget“ sehr gut! Der hält sofort an Smile


Code:
// NPC Steuerungssystem
// MoniTill 4.14 V1
// Lizenz: Gemeinfrei (Public Domain)

// Script um den NPC ab und an Animationen ausführen zu lassen.


// Gehdauer in Sekunden bis zur Animation (Bitte anpassen)
integer gehDauerMin =8;
integer gehDauerMax =30;

// Animationsdauer in Sekunden (Bitte anpassen)
integer animZeitMin = 10;
integer animZeitMax = 20;
// Hookkanal des NPCs- Jeder Bot muss einen eigenen haben, sonst gibts Probleme
// weil sie sich gegenseitig stoppen...
integer hookKanaldesNPC =16001;





integer gehZeit = 0;
integer zeitZaehler =0;
integer animAnzahl;

integer randInt(integer n)
{
     return (integer)llFrand(n + 1);
}


integer randIntBetween(integer min, integer max)
{
    return min + randInt(max - min);
}


default
{

on_rez(integer p)
    {
        llResetScript();
    }




state_entry()
    {
      llSleep(30);   // Startet mit 30 Sekunden Verzögerung
                     // damit vorher in jedem Fall die NPC Steuerung läuft
      animAnzahl= llGetInventoryNumber(INVENTORY_ANIMATION)-1;
      gehZeit = gehDauerMax;
      llSetTimerEvent(1);
      
    

     }



timer()
    {
       if (zeitZaehler > gehZeit){

       // Wähle eine zufällige Animation aus dem Inventar
       string aktAnim = llGetInventoryName(INVENTORY_ANIMATION, randInt(animAnzahl));

          // Ist eine Animation vorhanden, nutzen wir sie  
          if (aktAnim != "") {

          // Die NPC Steuerung unterbrechen
          llSay (hookKanaldesNPC,"*warte*");


          key owner = llGetOwner();
          llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);

            // Erstmal alle laufenden Animationen stoppen und dann....
            list anims = llGetAnimationList(llGetPermissionsKey());      
            integer len = llGetListLength(anims);
            integer i;
            for (i = 0; i < len; ++i) llStopAnimation(llList2Key(anims, i));

            
          //....die Puppen tanzen lassen.  
          llStartAnimation(aktAnim);
          llSleep(randIntBetween(animZeitMin,animZeitMax));

          llStopAnimation(aktAnim);
          gehZeit = randIntBetween(gehDauerMin,gehDauerMax);
          llReleaseControls();
          zeitZaehler = 0;

          llSay (hookKanaldesNPC,"*weiter*");
          
          }

      }
      else
      {
          zeitZaehler += 1;
      }

    }


}
Zitieren


Nachrichten in diesem Thema
RE: Einfache, leicht erweiterbare NPC Steuerung - von MoniTill - 13.04.2014, 20:11

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste