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.
- Code: Alles auswählen
// 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.

Gut für unseren Freund den Jack.
Ausprobieren könnt Ihr das ja mal auf Prototype.
- Code: Alles auswählen
// 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