NPC und kein Ende

Monster Brandi
Monster Brandi
 Member edited June 20 in Create & Objects
Hallo an Alle,
da ich ein paar Tage Urlaub mache und nicht weiß wie dort die Internetverbindung ist, hier meine Urlaubslage.
nachdem Zak ja schon diese schöne Script hier eingestellt hatte und ich etwas dran rumgefummelt habe lief es aber bei mir nicht zufriedenstellend. Nun habe ich meine Region mal auf die neuste Metro-Version gebracht und noch einmal das Script etwas angepasst.
Die Befehle funktionieren jetzt so wie Zak es geschrieben hatte, also kill und start. Der NPC wird beim Regionsstart generiert. Ich habe aber den kompletten NPC in "appearance" gespeichert, also der Owener wird in der NC komplett mit allem was er dran hat abgespeichert und beim Start wird er aus dieser NC reproduziert.
Hier das Script.
// NPC Persistance Example created by Marcus Llewellyn.
// This script is in the Public Domain.

key npc = NULL_KEY;
string vorname = "Prototype";
string nachname = "Heller";
integer dead = FALSE;

default
{
    state_entry() {
        // Setup and rez the NPC.
        llSetTimerEvent(10);
        osAgentSaveAppearance(llGetOwner(), "appearance");
        key temp = (key)llGetObjectDesc();
        if (llKey2Name(temp) != "") {
            // An NPC matching the UUID stored in the object description
            // already exists, so just retrieve the UUID.
            npc = temp;
        } else if (dead == FALSE) {
            // Create a new instance of the NPC, record the UUID in the
            // object's description, and set starting rotation. NPC
            // rotation and location are inherited from the controlling
            // object with an offset.
            npc = osNpcCreate(vorname, nachname, llGetPos() + <10.0,0.0,0.0>, "appearance");
            llSetObjectDesc((string)npc);
            osNpcSetRot(npc, llGetRot() * (llEuler2Rot(<0, 0, 180> * DEG_TO_RAD)));
        }
        // Have the NPC say a greeting, and set up persistance timer and
        // listen for commands.
        osNpcSay(npc, vorname + " " + nachname + ", oh man, hier will och keener tot uebern Zaun haengen!");
        
        llListen(0, "", NULL_KEY, "");

    }

    timer() {
        // Our NPC UUID stored in the object description should match the
        // UUID of our existing NPC. If it does not, we presume an untimely
        // demise, and initiate resurrection by simply reseting our script.
        key temp = (key)llGetObjectDesc();
        if (llKey2Name(temp) == "" && dead == FALSE) {
            llResetScript();
        }          
    }

    listen(integer channel, string name, key id, string msg) {
        if (llToLower(msg) == "kill") {
            // Kill the NPC, set a flag so it stays dead, and misquote
            // John Donne.
            osNpcSay(npc, "Schnauze, ick hau ab!");
            osNpcRemove(npc);
            dead = TRUE;
        } else if (llToLower(msg) == "start" && dead == TRUE) {
            // Create a new instance of our NPC, and set flag for
            // persistance checks.
            npc = osNpcCreate(vorname, nachname, llGetPos() + <1.0,0.0,0.0>, "appearance");
            llSetObjectDesc((string)npc);
            osNpcSetRot(npc, llGetRot() * (llEuler2Rot(<0, 0, 90> * DEG_TO_RAD)));
            osNpcSay(npc, vorname + " " + nachname + ", oh man, hier will och keener tot uebern Zaun haengen!");
            dead = FALSE;
        } else if (llToLower(msg) == "start" && dead == FALSE) {
            // Don't do anything significant if the NPC is still incarnate.
            osNpcSay(npc, "Hey Nase, kannst nich kieken?");
        }
    }
}

Als nächstes habe ich einen einfachen Besucherempfänger gebastelt. Als erstes muß ein Landepunkt auf Eurem Land festgelegt werden. Dort platziert ihr den Prim mit dem Script und was ihr sonst noch drinn haben wollt, Sound und Animation. Der Besucher wird nun von einem NPC empfangen, der so aussieht wie er selbst. :lol:
Gut für unseren Freund den Jack.
Ausprobieren könnt Ihr das ja mal auf Prototype.
// Dieses Script erzeugt einen NPC,den eigenen AVA, wenn der Prim von einem AVA oder NPC berührt wird. Beim Verlassen des Prim werden alle NPC der //Region gelöscht.
// Dies Läßt sich hervorragend als Begrüßer einsetzen, mit persönlichem Kontakt.LOL
// Die NPC sollten ausserhalb des Prim erscheinen, denn sonst erzeugt jeder NPC wieder einen NPC. So bekommt man andererseits seine Region recht // voll. HaHa.
// Begrüßungstexte kann jeder selbst einfügen, dazu einfach den bestehenden Text überschreiben.
// den Prim nicht Phantom setzen das wird vom Script selbst gemacht.

key npc = NULL_KEY;
string vorname = "Proto"; // Der Vorname des NPC 
string nachname = "Type"; // Der Nachname des NPC
float X = 132; //Die Koordinaten wo der NPC auftauchen soll. Am besten in der Nähe des Prim, in dem das Script ist. 
float Y = 140; //Also Koordinaten aus dem Prim nehmen und etwas versetzen 
float Z = 50; //Jetzt kommt der NPC von oben.HiHi 
string sound = "wolf"; // Dies ist nur eine Spielerei, da wird beim Betreten und verlassen ein Sound abgespielt.
string sound1 = "Bumm";
string animation = "Kopf";//Hier kann man den NPC eine Animation abspielen lassen. 


default
{
    state_entry() 
    {
        
        llVolumeDetect(TRUE);
        
    }
       collision_start(integer num_detected)
            
            {
            llSetAlpha(1.0,ALL_SIDES);    // macht den Prim sichtbar
            llSetColor(<0,255,0>,ALL_SIDES); // setzt die farbe vom Prim   
            llSleep(2.0);   
            llPlaySound(sound,1.0); // spielt den Sound ab   
            vector npcPos = < X, Y, Z >;
            npc = osNpcCreate(vorname, nachname, npcPos, llDetectedKey(0));
            
            osNpcSetRot(npc, llGetRot() * (llEuler2Rot(<0, 0, 270> * DEG_TO_RAD)));// Hier kann die Drehung des NPC eingestellt werden.
        
        
            osNpcSay(npc, "Tach " + llDetectedName(0) + "! Oh man, hier will abba och keener tot uebern Zaun haengen!");
            
            llSleep(5.0);
            
            osNpcMoveToTarget(npc, llGetPos() + <0,5,0>,OS_NPC_NO_FLY);// bewegt den NPC zum Besucher.
            
            llSleep(5.0);
            
            osAvatarPlayAnimation(npc, "Kopf"); // spielt die Animation ab.
             
            }
            
       collision_end (integer num_detected)
            {
                llSetAlpha(0.0,ALL_SIDES);
                llSleep(1.0);
                llPlaySound(sound1,1.0);
// Beim verlassen des Prim werden alle NPC der Region entfernt.           
        list avies = osGetAvatarList();
        integer n;
        for(n=0;n<llGetListLength(avies);n=n+3)
        {
            osNpcSay(npc, "Na " + llDetectedName(0) + "! Dann werden wir mal die Wüste verlassen!");
            osNpcRemove((key)llList2Key(avies,n));
             
            }
        }    


}       
     

Beim Verlassen des Prim werden alle NPC der Region gelöscht, welches aber kein Problem darstellt, da mit dem ersten Script ein NPC automatisch neu hervorgezaubert wird.

Nun viel Spass
Monster
«13

Comments

  • Monster Brandi
    Monster Brandi
     Member edited 6:55PM
    Wer möchte das sein Besucher von sich selbst begrüßt wird, also der NPC ist ein komplettes Abbild des Besuchers, auch der Name. der nimmt das Script.
    // Dieses Script erzeugt einen NPC,den eigenen AVA, wenn der Prim von einem AVA oder NPC berührt wird. Beim Verlassen des Prim werden alle NPC der Region gelöscht.
    // Dies Läßt sich hervorragend als Begrüßer einsetzen, mit persönlichem Kontakt.LOL
    // Die NPC sollten ausserhalb des Prim erscheinen, denn sonst erzeugt jeder NPC wieder einen NPC. So bekommt man andererseits seine Region recht // voll. HaHa.
    // Begrüßungstexte kann jeder selbst einfügen, dazu einfach den bestehenden Text überschreiben.
    // den Prim nicht Phantom setzen das wird vom Script selbst gemacht.
    
    key npc = NULL_KEY;
    float X = 132; //Die Koordinaten wo der NPC auftauchen soll. Am besten in der Nähe des Prim, in dem das Script ist. 
    float Y = 140; //Also Koordinaten aus dem Prim nehmen und etwas versetzen 
    float Z = 50; //Jetzt kommt der NPC von oben.HiHi 
    string sound = "wolf"; // Dies ist nur eine Spielerei, da wird beim Betreten und verlassen ein Sound abgespielt.
    string sound1 = "Bumm";
    string animation = "Chickenstomp";//Hier kann man den NPC eine Animation abspielen lassen. 
    
    
    
    
    
    
    
    default
    {
        state_entry() 
        {
    
            llVolumeDetect(TRUE);
            
        }
    
           collision_start(integer num_detected)
                
                {
                llSetAlpha(1.0,ALL_SIDES);    // macht den Prim sichtbar
                llSetColor(<0,255,0>,ALL_SIDES); // setzt die farbe vom Prim   
                llSleep(2.0);   
                llPlaySound(sound,1.0); // spielt den Sound ab   
                vector npcPos = < X, Y, Z >;
                npc = osNpcCreate(llKey2Name(llDetectedKey(0)), "", npcPos, llDetectedKey(0));
                
                osNpcSetRot(npc, llGetRot() * (llEuler2Rot(<0, 0, 270> * DEG_TO_RAD)));// Hier kann die Drehung des NPC eingestellt werden.
                
                llSleep(3.0);
                
                osNpcMoveToTarget(npc, llGetPos() + <0,5,0>,OS_NPC_NO_FLY);// bewegt den NPC zum Besucher.
                
                llSleep(2.0);
                
                osNpcSay(npc, "Tach " + llDetectedName(0) + "! Oh man, hier will abba och keener tot uebern Zaun haengen!");
                
                llSleep(5.0);
                
                osAvatarPlayAnimation(npc, animation); // spielt die Animation ab.
                 
                }
                
           collision_end (integer num_detected)
                {
                    llSetAlpha(0.0,ALL_SIDES);
                    
                    llPlaySound(sound1,1.0);
                    
                    osNpcSay(npc, "Na " + llDetectedName(0) + "! Dann werden wir mal die Wüste verlassen!");
    // Beim verlassen des Prim werden alle NPC der Region entfernt.           
            list avies = osGetAvatarList();
            integer n;
            for(n=0;n<llGetListLength(avies);n=n+3)
            {
                
                llSleep(1.0);
                osNpcRemove((key)llList2Key(avies,n));
                 
            }
            } 
            }       
         
    

    Monster
  • Lena Vanilli
    Lena Vanilli
     Administrator edited 6:55PM
    Huhu Monster,

    vielen Dank für die NPC-Scripte! :)

    Du wirst ja richtig zum NPC-Guru! :D

    Also, ich kenne mich ja damit noch garnicht aus, deswegen mal meine naive Frage:

    Wie sieht das eigentlich mit der Performance aus, wenn man einen (oder mehrere) NPC zeitgesteuert animiert? Also das ein NPC zu bestimmten Zeiten irgendwas macht. Z. B. ne Kanonenkugel abschießen, oder sowas. Oder tagsüber im Freebee-Shop steht und abends nach Hause geht und sich hinlegt. :lol: :lol: :lol:

    Wäre sowas denkbar und machbar?

    Viele Grüße
    Lena
  • Diabolus Svenska
    Diabolus Svenska
     Member edited 6:55PM
    Ich kann nur sagen ... das funktioniert prächtig das script usw. Ich hab mich echt erschrocken mein Ebenbild bei ihr plötzlich rumrennen zu sehen. *g
  • Monster Brandi
    Monster Brandi
     Member edited 6:55PM
    Hallo Lena und Dia,
    erstmal Danke Euch beiden.

    @Lena ich bin ja auch nicht der große Scripter, meist schaue ich mir Scripte an, ändere sie oder verwende daraus etwas. Also mit Zeitsteuerung ist das so eine Sache, Timer brauchen Performance, genau wie Sensoren oder Listener, da sie ständig aktiv sind.
    Natürlich kann man den NPC animieren, das habe ich bei meinen Scripten oben auch gemacht. Da kommt der NPC auf den Besucher zugelaufen und tanzt. Das habe ich aber über Sleep gesteuert, da der NPC ja verschwindet wenn der Besucher den Prim verlässt, es gibt also keine Wiederholung.
    Soviel ich weiß kann man alles auch über die Tageszeiten steuern, dazu muß das Script abber immer aktiv sein, naja den Rest kannst Du dir sicherlich vorstellen. Hast du dann mehrere NPC, die ja auch Performance benötigen, und jeder soll was anderes machen, sind die NPC auf der Region sicherlich unter sich.Hihi.

    Monster
  • Hans Nerido
    Hans Nerido
     Member edited 6:55PM
    Moin Moin,

    die Tageszeitsteuerung sollte funzen wenn man die Befehle von einem Environment Script
    in einem NPC Script einfügen kann.

    Gruß
    Hans
  • Monster Brandi
    Monster Brandi
     Member edited 6:55PM
    Es sollte zwar über Environment Scripte funktionieren, aber da bei diesen meist der Sonnenstand abgefragt wird und zwar über einen Timer, ist das Script natürlich ständig aktiv.
    Bei stark belasteten Regionen ist dies sicherlich nicht vorteilhaft.
  • Monster Brandi
    Monster Brandi
     Member edited 6:55PM
    Hallo Mal wieder,
    wer nicht genug von NPC bekommen kann, hier mal ein kleines Script um Euren NPC etwas zu steuern, auch als Begleiter.
    // NPC-Begleiter mit Dialogbox-einfach anklicken.
    // Dieses Script erzeugt einen NPC aus einer NC.Mit "Hallo NPC".
    // Dies Läßt sich hervorragend als Begleiter einsetzen, mit persönlichem Kontakt.LOL
    // Die NPC erscheint an den Koordinaten x,y,z.
    // Texte kann jeder selbst einfügen, dazu einfach den bestehenden Text überschreiben.
    // Beim Befehl "Komm her" geht der NPC zum Prim in dem das Script ist.
    // Beim Befehl "Komm mit" kommt der NPC zu Eurem AVA und begleitet Euch.
    // Alles andere erklärt sich selbst.
    // Das Script wurde alles in einen Prim gelegt und auf den Owner zugelassen, da dadurch die Befehle SIM-Weit übertragen werden.
    
    key nob = NULL_KEY;
    string vorname = "Ver"; // Der Vorname des NPC 
    string nachname = "Folger"; // Der Nachname des NPC
    float X = 132; //Die Koordinaten wo der NPC auftauchen soll. Am besten in der Nähe des Prim, in dem das Script ist. 
    float Y = 140; //Also Koordinaten aus dem Prim nehmen und etwas versetzen 
    float Z = 50; //Jetzt kommt der NPC von oben.HiHi 
    string sound1 = "Bumm"; // Dies ist nur eine Spielerei, da wird beim Betreten und verlassen ein Sound abgespielt.
    string animation = "Kopf";//Hier kann man den NPC eine Animation abspielen lassen. 
    
    
    default
    {
        state_entry() 
        {
                llResetScript();
                llListen(-555,"",llGetOwner(),"");
        }       
        touch(integer num_detected)
        {
                llDialog(llGetOwner(),"NPC Follower",["Komm mit","Bleib hier","Hau ab","Hallo NPC","Komm her"],-555);
    
            
        }
    
                
                listen( integer channel,string name,key id,string msg)
                
                {
            if (msg != "")
            {
                if (msg == "Hau ab")
    
                {
                 osNpcSay(nob, "Schade !");
                  llSleep(1.0);
                 osNpcRemove(nob); 
                }
                   else if (msg == "Komm her")
                {
                    osNpcMoveToTarget(nob, llGetPos() + <0,2,0>,OS_NPC_NO_FLY);
                    llSleep(15.0);
                    osNpcSay(nob, "Da bin ich !");
                }   
                
                 else if (msg == "Komm mit")
                {
                     osNpcSay(nob, "Gerne !");
                     key gast = llDetectedKey(0);
                     llSensorRepeat("",gast,AGENT,120,TWO_PI,1);
                } 
                
                 else if (msg == "Hallo NPC")
                {
                    llPlaySound(sound1,1.0); // spielt den Sound ab   
                    vector npcPos = < X, Y, Z >;
                    nob = osNpcCreate(vorname, nachname, npcPos, "appearance wolf");
                }
                
                 else if (msg == "Bleib hier")
                {
                    osNpcSay(nob, "Ist Gut !");
                    llSensorRemove();
                }
            }
        } 
                 sensor(integer num_detected)  
                {
        
                osNpcSetRot(nob,llGetRot() * (llEuler2Rot(<0, 0, 0> * DEG_TO_RAD)));
     
                vector gast = llDetectedPos(0); 
                osNpcMoveToTarget(nob, gast + <0,2,0>,OS_NPC_NO_FLY);// bewegt den NPC zum Besucher.
            
                
             
                }
    
    }       
         
    

    Die NC für euren NPC solltet ihr schon haben. Für den Sound könnt ihr einen Eigene nehmen oder weglassen.
    Das Script ist nur als Spielerei gedacht, da ja die Region durch Sensor und Listener belastet wird.
  • MingNoi
    MingNoi
     Member edited 6:55PM
    Klasse, muss ich alles ausprobieren ;)

    Hab ja schon nen klassischen bei mir, der raus hopt und auf klick wieder verschwindet, aber das is es dann auch.

    Mit Anis ist es ja toll, wenn's nicht zu viele rumhat davon, ist ja logo das die kosten alle.
    Naja, Spass macht's auf jedenfall.

    Danke Monster ! :D
  • Xenos Yifu
    Xenos Yifu
     Member edited 6:55PM
    Habe das Prim erstellt, das Script rein gepackt, die Koordinaten angepasst.
    Der NPC (ich) erscheint, spielt sogar meine Stand-AO´s ab :D
    Aber man kann in nicht anklicken, sondern nur das Prim.
    Tue ich das erscheint auch das Menü "Komm her, Bleib ... etc".
    Aber leider tut sich nichts. Nur ein Scriptfehler wird über dem Prim angezeigt.
    Ich verwende hier das zuletzt gepostete Script.

    Achja, ich habe keine NC. Was hat es mit der auf sich?
    Und wenn ich die brauche, braucht die dann auch nicht jeder Besucher?

    Fragen über Fragen :)


    Aber auf jeden Fall eine super Sache :)
    Schon komisches Gefühl wenn man sich selber gegenüber steht ^^.
  • Zak Spot
    Zak Spot
     Moderator edited 6:55PM
    Xenos Yifu wrote:
    Nur ein Scriptfehler wird über dem Prim angezeigt.
    Sollen wir raten was in der Fehlermeldung steht oder postest du die noch? Weil darin steht die Antwort auf deine Frage.
    Zu Frage 2: die NC liegt in dem Prim falls nicht musst du die erstellen. Da stehen die Informationen zum Aussehen des NPC drin.

    Die appearance NC kann man hiermit erstellen:
    Das Script in einen Prim legen eine Notecard namens appearance dazulegen und anklicken. Danach die appearance Notecard ins Inventar kopieren und benutzen:
    key npc;
    vector toucherPos;
     
    default
    {
        touch_start(integer number)
        {
            vector npcPos = llGetPos() + <1,0,0>;
            osAgentSaveAppearance(llDetectedKey(0), "appearance");
            npc = osNpcCreate("ImYour", "Clone", npcPos, "appearance");
            toucherPos = llDetectedPos(0);
            state hasNPC;
        }
    }
     
    state hasNPC
    {
        state_entry()
        {
            osNpcMoveTo(npc, toucherPos + <3,0,0>); 
            osNpcSay(npc, "Hi there! My name is " + llKey2Name(npc));
        }
     
        touch_start(integer number)
        {
            osNpcSay(npc, "Goodbye!");
            osNpcRemove(npc);
            npc = NULL_KEY;
            state default;
        }
    }
    

    Was auch hilfreich ist ist dieses Script zum entfernen aller NPC auf der Region:
    default
    {
        state_entry()
        {
            llSay(0, "NPC-Killer");
        }
     
        touch_start(integer num)
        {
            llSay(0,"Removing all NPCs from this scene!");
            list avies = osGetAvatarList();
            integer n;
            for(n=0;n<llGetListLength(avies);n=n+3)
            {
                //llOwnerSay(llList2String(avies,n));
                llOwnerSay("Attempting to remove "+llList2String(avies,n+2)+" with UUID "+llList2String(avies,n+0));
                osNpcRemove((key)llList2Key(avies,n));
            }
     
        }
     
    }
    
  • Xenos Yifu
    Xenos Yifu
     Member edited 6:55PM
    Danke für die schnelle Antwort :)

    Hier als erstes die Fehlermeldung des Scripts:
    Primitive: System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> OpenSim.Region.ScriptEngine.Shared.ScriptException: OSSL Runtime Error: osNpcCreate: Notecard reference 'appearance wolf' not found.



    Server stack trace:

    bei OpenSim.Region.ScriptEngine.Shared.Api.OSSL_Api.OSSLError(String msg)

    bei OpenSim.Region.ScriptEngine.Shared.Api.OSSL_Api.NpcCreate(String firstname, String lastname, Vector3 position, String notecard, Boolean owned, Boolean senseAsAgent)

    bei OpenSim.Region.ScriptEngine.Shared.Api.OSSL_Api.osNpcCreate(String firstname, String lastname, Vector3 position, String notecard)

    bei System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)

    bei System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecu

    Die appearance NC, ist auf einmal im Prim, denke mal ich habe sie übersehen ...
    Habe sie in mein Inventar kopiert.

    Jetzt wird es für mich peinlich ... wie "benutzt" man eine NC?!
  • Zak Spot
    Zak Spot
     Moderator edited 6:55PM
    Xenos Yifu wrote:
    Notecard reference 'appearance wolf' not found.
    Die Notecard mit dem Namen "appearance wolf" (ohne Anführungszeichen) wurde nicht in deinem Prim gefunden. Kannst die vorhandene umbenennen in "appearance wolf" dann klappts.
  • Xenos Yifu
    Xenos Yifu
     Member edited 6:55PM
    Wunderbar, es klappt, danke :)

    ... aber das Menü ist bloß über das Prim zu öffnen, beide Clone kann man nicht anklicken, ist das richtig so?
    Toll wäre wenn man den Clone anklicken könnte, man entfernt sich ja vom Prim wenn man rum läuft und der Clone einem folgt.

    .... und keine Ahnung warum ich zwei Clone habe, einer kommt alleine, auch wenn ich per Script alle kille.
    Der andere kommt wenn ich ihn über das Prim rufe.

    Snapshot_001.jpg
  • Xenos Yifu
    Xenos Yifu
     Member edited 6:55PM
    So, habe nur noch ein Clone :)
    Hatte zwei Scripte im Prim.
  • Xenos Yifu
    Xenos Yifu
     Member edited 6:55PM
    Man kann ja beliebig viele Begleiter erschaffen.
    Was wenn zwei verschiedene Avatare je einen erschaffen und auf "folge mir" klicken?
    Folgt jeder Begleiter seinem "Erschaffer"?
Sign In or Register to comment.
© Copyright 2017 - Metropolis Metaversum
All times are GMT