OSSLNPC/de
From OpenSimulator
Contents |
Einführung
Im OpenSimulator stehen eine Reihe von Funktionen zum Erstellen und Bearbeiten serverseitiger NPCs (Non Player Characters) zur Verfügung.
NPCs werden über ein Skript gesteuert, das sich in derselben Region befinden muss wie der NPC. Dies könnte in einem Anhang untergebracht sein, der mit dem Avatar verbunden ist.
Serverseitige NPCs können die Region, in der sie geboren wurden, nicht verlassen.
Das serverseitige NPC-Erscheinungsbild wird gespeichert und geladen, indem die Erscheinungsdatenstruktur mit einer Notecard serialisiert wird, die sich im selben Prim wie das Skript befindet. Die erforderlichen Texturen bleiben erhalten, wenn ein OAR gespeichert und geladen wird.
Das aktuelle Erscheinungsdatenformat (wie in Notecards, die durch das Anschein von Speichern erstellt wurden) ist das gleiche, das für das OpenSimulator-Kabelformat verwendet wird, und ist daher nicht für die direkte Bearbeitung gedacht. Mit größter Sorgfalt ist dies möglich. Weitere Informationen finden Sie unter Appearance Formats Es wird jedoch nicht empfohlen, es sei denn, Sie müssen es wirklich tun.
Weitere Einzelheiten zu OsIsNpc Funktionen finden sie hier: http://opensimulator.org/wiki/Category:OSSL_Functions
Aktivieren
Um diese Funktionen nutzen zu können, benötigen Sie in der Datei OpenSim.ini die folgende Konfiguration
- Enabled = true, eingestellt im Abschnitt [NPC].
- Aktivieren der Skript-Engine
in config-include/osslEnable.ini
- AllowOSFunctions = true
- Überprüfen Sie den Wert von osslNPC, um die Rechte der meisten NPC-Funktionen festzulegen.
Sie müssen möglicherweise auch die Rechte von osAgentSaveAppearance() prüfen.
Seit 0.9.2.0 ist die maximale Anzahl von NPCs pro Szene auf den Wert des MaxNumberNPCsPerScene Eintrags im Abschnitt [NPC] begrenzt.
Siehe Configuring Simulator Parameters#Getting information about parameters wenn Sie überprüfen müssen, ob diese Parameter richtig eingestellt wurden.
Anmerkungen
- Wenn Sie Ihren Avatar vor dem Speichern für die Modelldarstellung verwenden, müssen Sie einige Sekunden warten, bevor Sie einen Befehl zum Speichern der Darstellung aufrufen. Dies liegt daran, dass das Speichern des Erscheinungsbilds derzeit für einen Timer ausgeführt wird, um mehrere Erscheinungsaktualisierungen vom Viewer aus zu verwalten.
- Wenn Sie Ihren Avatar zum Erscheinungsbild des Modells verwenden, müssen Sie Anhänge auf dem NPC neu positionieren
- Positionieren Sie es auf sich selbst
- Trennen Sie sie zum Inventar
- Bringen Sie sie wieder an
- Speichern Sie das Erscheinungsbild
Dies liegt daran, dass das Speichern von Erscheinungsdaten nicht das Speichern aktueller Anlagenpositionen auslöst.
Sensing
llAgentSensor() kann verwendet werden, um einen Sensor einzurichten, der anstelle von oder von anderen Regionsentitäten NPCs erkennt.
Im OpenSimulator werden NPCs, sofern nicht anders angegeben, nur mit dem OpenSimulator-spezifischen NPC-Flag erkannt.
//Author: mewtwo0641 list keys = []; key npc; string toucher; key toucherkey; vector toucherPos; integer npc_on = FALSE; default { touch_start(integer x) { toucherkey = llDetectedKey(0); toucherPos = llDetectedPos(0); vector npcPos = llGetPos() + <1,1,1>; if(npc_on == FALSE) { npc = osNpcCreate("Fred", "Flintstone", npcPos, toucherkey); npc_on = TRUE; llSensor("", "", AGENT | NPC, 96.0, PI); //Will always return NPC key regardless of npc create option return; } if(npc_on == TRUE) { osNpcRemove(npc); llResetScript(); } } sensor(integer num) { keys = []; integer i = 0; for(i; i < num; i++) { keys += llDetectedKey(i); } llOwnerSay(llDumpList2String(keys, "\n")); } no_sensor() { keys = []; } }
Sie können NPCs dazu bringen, erneut als AGENTs erkannt zu werden, indem Sie die unten stehende Option OS_NPC_SENSE_AS_AGENT in osNpcCreate() verwenden.
Die Begründung ist, dass die Erkennung von NPCs als AGENTs standardmäßig dazu führen kann, dass einige Skripts unbrauchbar werden (z. B. Radargeräte, die nichts über NPCs wissen). Umgekehrt verhalten sich andere Skripts jedoch möglicherweise nicht wie erwartet, wenn NPCs nicht als Agenten erkannt werden (z. B. öffnen sich automatisch geöffnete Türen für Avatare für NPCs nicht).
llGetDetectedType() setzt das NPC-Flag, wenn ein NPC erkannt wurde. Wenn der NPC mit der Option OS_NPC_SENSE_AS_AGENT erstellt wurde, wird auch das Flag AGENT gesetzt.
Datenformate
Weitere Informationen zum Format zum Speichern von Erscheinungsinformationen in Notecards finden Sie unter Appearance Formats.
Funktionen
Erstellen und entfernen
osNpcCreate
osNpcCreate(string Vorname, string Nachname, vector position, string cloneFrom):key
cloneFrom kann sein:
- Name der Notecard, die ein serialisiertes Avatar-Erscheinungsbild enthält, oder
- Asset-UUID der Notecard oder
- UUID eines Avatars, der in derselben Region angemeldet ist. Beachten Sie jedoch, dass dieses Erscheinungsbild nicht dauerhaft bleibt, wenn nicht osNpcSaveAppearance() aufgerufen wird.
Wenn der NPC erfolgreich erstellt wurde, wird seine UUID zurückgegeben, die für alle nachfolgenden Funktionen erforderlich ist. Ein Beispiel ist bei osNpcCreate verfügbar.
osNpcCreate
osNpcCreate(string Vorname, string Nachname, vector position, string cloneFrom, integer optionen):key
cloneFrom kann sein:
- Name der Notecard, die ein serialisiertes Avatar-Erscheinungsbild enthält, oder
- Asset-UUID der Notecard oder
- UUID eines Avatars, der in derselben Region angemeldet ist. Beachten Sie jedoch, dass dieses Erscheinungsbild nicht dauerhaft bleibt, wenn nicht osNpcSaveAppearance() aufgerufen wird.
integer Ganzzahl ist eine Menge von Flags, die 0 oder eine oder mehrere sein können
- OS_NPC_NOT_OWNED - Erstellen Sie einen nicht besetzten NPC.
- OS_NPC_SENSE_AS_AGENT - Erstellen Sie einen NPC, der als AGENT mit LSL-Sensoren erfasst wird
- OS_NPC_OBJECT_GROUP - Erstellen Sie einen NPC mit der Gruppe des Objekts mit dem Skript, wenn der Eigentümer dieses Objekts Mitglied dieser Gruppe ist.
Wenn der NPC erfolgreich erstellt wurde, wird seine UUID zurückgegeben, die für alle nachfolgenden Funktionen erforderlich ist. Ein Beispiel ist bei osNpcCreate verfügbar.
osNpcRemove
osNpcRemove(key npc):void
Entfernt den angegebenen Avatar aus der Region. Beispiel bei osNpcRemove.
Get and Set
osIsNpc
osIsNpc(key npc):integer
Gibt TRUE zurück, wenn der angegebene Schlüssel ein NPC ist, andernfalls false.
osNpcGetRot
Ruft die Drehung des Avatars ab. Nur die Drehung um die Z-Ebene bei der Euler-Drehung (horizontale Drehung) hat eine Bedeutung.
osNpcGetRot(key npc):rotation
osNpcSetRot
osNpcSetRot(key npc, rotation rot):void
Stellt die Drehung des Avatars ein. Nur das Einstellen der Rotation in der Z-Ebene in Euler-Rotation hat einen sinnvollen Effekt (den Avatar so drehen, dass er in die eine oder andere Richtung zeigt). Das Festlegen von X- oder Y-Euler-Werten führt dazu, dass sich der Avatar auf undefinierte Weise dreht.
osNpcGetPos
osNpcGetPos(key npc):vector
Gibt die aktuelle Position des NPC zurück.
osNpcGetOwner
osNpcGetOwner(key npc):key
Gibt den Besitzer des angegebenen NPC zurück (d. h. den Besitzer des Skripts, das ihn erstellt hat). Wenn der NPC nicht im Besitz ist oder der Eingabeschlüssel keinem NPC gehört, wird NULL_KEY zurückgegeben.
Movement
osNpcMoveTo
osNpcMoveTo(key npc, vector position):void
Eine ältere Funktion, die ein osNpcMoveToTarget() ausführt, indem sie auf dem Ziel fliegt und landet.
osNpcMoveToTarget
osNpcMoveToTarget(key npc, vector target, int options):void
- OS_NPC_FLY - Fly the avatar to the given position. The avatar will not land unless the OS_NPC_LAND_AT_TARGET option is also given.
- OS_NPC_NO_FLY - Do not fly to the target. The NPC will attempt to walk to the location. If it's up in the air then the avatar will keep bouncing hopeless until another move target is given or the move is stopped
- OS_NPC_LAND_AT_TARGET - If given and the avatar is flying, then it will land when it reaches the target. If OS_NPC_NO_FLY is given then this option has no effect.
- OS_NPC_RUNNING - if given, NPC avatar moves at running/fast flying speed, otherwise moves at walking/slow flying speed.
OS_NPC_FLY and OS_NPC_NO_FLY are options that cannot be combined - the avatar will end up doing one or the other. If you want the avatar to fly and land at the target, then OS_NPC_LAND_AT_TARGET must be combined with OS_NPC_FLY. For instance,
Bewegt den Avatar im Laufe der Zeit zu einem bestimmten Ziel. Wie der Avatar dorthin gelangt, hängt von den folgenden Optionen ab.
- OS_NPC_FLY - Fliege den Avatar zur angegebenen Position. Der Avatar wird nicht landen, es sei denn, die Option OS_NPC_LAND_AT_TARGET ist ebenfalls angegeben.
- OS_NPC_NO_FLY - Fliege nicht zum Ziel. Der NPC wird versuchen, zu dem Ort zu gehen. Wenn es in der Luft ist, hüpft der Avatar hoffnungslos weiter, bis ein anderes Bewegungsziel gegeben oder die Bewegung gestoppt wird
- OS_NPC_LAND_AT_TARGET - Wenn angegeben und der Avatar fliegt, landet er, wenn er das Ziel erreicht. Wenn OS_NPC_NO_FLY angegeben ist, hat diese Option keine Auswirkung.
- OS_NPC_RUNNING - falls angegeben, bewegt sich der NPC-Avatar mit Lauf-/Schnellfluggeschwindigkeit, ansonsten mit walking/slow flying speed.
OS_NPC_FLY und OS_NPC_NO_FLY sind Optionen, die nicht kombiniert werden können – der Avatar wird am Ende entweder das eine oder das andere tun. Wenn Sie möchten, dass der Avatar auf dem Ziel fliegt und landet, muss OS_NPC_LAND_AT_TARGET mit OS_NPC_FLY kombiniert werden. Zum Beispiel:
osNpcMoveToTarget(npc, llGetPos() + <9,9,5>, OS_NPC_FLY|OS_NPC_LAND_AT_TARGET);
osNpcStopMoveToTarget
osNpcStopMoveToTarget(key npc):void
Stoppt eine aktuelle Bewegung zu einem Ziel.
Sitting and standing
osNpcSit
osNpcSit(key npc, key target, int options):void
Setzt einen NPC auf ein Ziel.
osNpcStand
osNpcStand(key npc):void
Einen NPC aufstehen lassen.
Communication
osNpcSay
osNpcSay(key npc, string message):void osNpcSay(key npc, int channel, string message):void
Bringt einen NPC dazu, die angegebene Nachricht zu sagen.
Wenn ein Kanal angegeben ist, wird der Chat auf dem angegebenen Kanal gesprochen.
osNpcShout
osNpcShout(key npc, int channel, string message):void
Bringt einen NPC dazu, die angegebene Nachricht auf dem angegebenen Kanal zu rufen.
osNpcWhisper
osNpcWhisper(key npc, int channel, string message):void
Bringt einen NPC dazu, die angegebene Nachricht auf dem angegebenen Kanal zu flüstern.
Animations
osNpcPlayAnimation
osNpcPlayAnimation(key npc, string animation):void
Bringt einen NPC dazu, eine Animation abzuspielen. Die Animation kann entweder ein Schlüssel oder der Name einer Animation im selben Inventar wie das Skript sein.
osNpcStopAnimation
osNpcStopAnimation(key npc, string animation):void
Bringt einen NPC dazu, das Abspielen einer Animation zu beenden. Die Animation kann entweder ein Schlüssel oder der Name einer Animation im selben Inventar wie das Skript sein.
Appearance
Das Erscheinungsbild von NPCs wird durch Speichern und Laden von Erscheinungsbilddaten aus Notizkarten aus demselben Inventar wie das aufrufende Skript manipuliert.
osOwnerSaveAppearance
osOwnerSaveAppearance(string notecard):key
Speichert das aktuelle Erscheinungsbild des Besitzers in einer Notizkarte im Inventar des Prims. Dazu gehören Körperteildaten, Kleidungsstücke und Anhänge. Wenn bereits eine Notizkarte mit demselben Namen vorhanden ist, wird sie ersetzt. Der Besitzer muss in der Region anwesend sein, wenn diese Funktion aufgerufen wird. Die gebackenen Texturen für den Besitzer (notwendig, um das Aussehen auf dem NPC nachzubilden) werden dauerhaft gespeichert.
osAgentSaveAppearance
osAgentSaveAppearance(key agentId, string notecard):key
Speichert das Aussehen eines beliebigen Avatars in einer Notizkarte im Inventar des Prims. Dazu gehören Körperteildaten, Kleidungsstücke und Anhänge. Wenn bereits eine Notizkarte mit demselben Namen vorhanden ist, wird sie ersetzt. Der Avatar muss in der Region vorhanden sein, wenn diese Funktion aufgerufen wird. Die gebackenen Texturen für den Avatar (erforderlich, um das Aussehen auf dem NPC nachzubilden) werden dauerhaft gespeichert.
osNpcSaveAppearance
osNpcSaveAppearance(key npc, string notecard):key
Speichert das aktuelle Aussehen eines NPCs in einer Notizkarte im Inventar des Prims. Dazu gehören Körperteildaten, Kleidungsstücke und Anhänge. Wenn bereits eine Notizkarte mit demselben Namen vorhanden ist, wird diese ersetzt. Der Avatar muss in der Region vorhanden sein, wenn diese Funktion aufgerufen wird. Die gebackenen Texturen für den Avatar (erforderlich, um das Erscheinungsbild anzuzeigen) werden dauerhaft gespeichert.
osNpcLoadAppearance
osNpcLoadAppearance(key npc, string notecard):void
NPC Erscheinungsbild von einer Notecard laden. Diese Notizkarte muss Aussehensdaten enthalten, die mit einer der Funktionen zum Speichern des Aussehens erstellt wurden.
Touch
osNpcTouch
osNpcTouch(key npc, key objectKey, integer linkNum)
Ermöglicht es einem NPC, Objekte zu berühren.
Examples
NPC Automator
Dies ist ein grobes Beispielskript für die meisten aktuellen NPC-Funktionen. Einer der größten aktuellen Mängel ist, dass es nicht mehr als einen erstellten Avatar gleichzeitig verfolgt. Bitte fühlen Sie sich frei, es zu verbessern.
key npc; integer listenChannel = 10; default { // NPC manipulator adapted by justincc 0.0.3 released 20121025 state_entry() { llListen(listenChannel,"",NULL_KEY,""); llSetText("Listening on " + listenChannel, <0, 255, 0>, 1); llOwnerSay("Say /" + (string)listenChannel + " help for commands"); } listen(integer channel, string name, key id, string msg) { if (msg != "") { list commands = llParseString2List(msg, [ " " ], []); string msg0 = llList2String(commands, 0); string msg1 = llList2String(commands, 1); string msg2 = llList2String(commands, 2); string msg3 = llList2String(commands, 3); if (msg0 == "create") { if (msg1 != "") { string notecardName = msg1; npc = osNpcCreate("Jane", "Doe", llGetPos() + <5, 5, 0>, notecardName); llOwnerSay("Created npc from notecard " + notecardName); } else { llOwnerSay("Usage: create <notecard-name>"); } } else if (msg0 =="createm" && msg1 != "") { osOwnerSaveAppearance("appearance"); vector pos = llGetPos(); integer i; for (i = 0; i < (integer)msg1; i++) { osNpcCreate("John", "Doe", pos + <8, 0, 0>, "appearance"); llSleep(1); } } else if (msg0 == "remove" && npc != NULL_KEY) { osNpcSay(npc, "You will pay for this with your liiiiiivvveeessss!!!....."); osNpcRemove(npc); } else if (msg0 == "say" && npc != NULL_KEY) { osNpcSay(npc, "I am your worst Nightmare!!!!"); } else if (msg0 == "move") { if (msg1 != "" && msg2 != "" && npc != NULL_KEY) { vector delta = <(integer)msg1, (integer)msg2, 0>; if (msg3 != "") { delta.z = (integer)msg3; } osNpcMoveTo(npc, osNpcGetPos(npc) + delta); } else { llOwnerSay("Usage: move <x> <y> [<z>]"); } } else if (msg0 == "moveto") { if (msg1 != "" && msg2 != "" && npc != NULL_KEY) { vector pos = <(integer)msg1, (integer)msg2, 0>; if (msg3 != "") { pos.z = (integer)msg3; } osNpcMoveTo(npc, pos); } else { llOwnerSay("Usage: move <x> <y> [<z>]"); } } else if (msg0 == "movetarget" && npc != NULL_KEY) { osNpcMoveToTarget(npc, llGetPos() + <9,9,5>, OS_NPC_FLY|OS_NPC_LAND_AT_TARGET); } else if (msg0 == "movetargetnoland" && npc != NULL_KEY) { osNpcMoveToTarget(npc, llGetPos() + <9,9,5>, OS_NPC_FLY); } else if (msg0 == "movetargetwalk" && npc != NULL_KEY) { osNpcMoveToTarget(npc, llGetPos() + <9,9,0>, OS_NPC_NO_FLY); } else if (msg0 == "rot" && npc != NULL_KEY) { vector xyz_angles = <0,0,90>; // This is to define a 1 degree change vector angles_in_radians = xyz_angles * DEG_TO_RAD; // Change to Radians rotation rot_xyzq = llEuler2Rot(angles_in_radians); // Change to a Rotation rotation rot = osNpcGetRot(npc); osNpcSetRot(npc, rot * rot_xyzq); } else if (msg0 == "rotabs" && msg1 != "") { vector xyz_angles = <0, 0, (integer)msg1>; vector angles_in_radians = xyz_angles * DEG_TO_RAD; // Change to Radians rotation rot_xyzq = llEuler2Rot(angles_in_radians); // Change to a Rotation osNpcSetRot(npc, rot_xyzq); } else if (msg0 == "animate" && npc != NULL_KEY) { osAvatarPlayAnimation(npc, "stabbed+die_2"); llSleep(3); osAvatarStopAnimation(npc, "stabbed+die_2"); } else if (msg0 == "save" && msg1 != "" && npc != NULL_KEY) { osNpcSaveAppearance(npc, msg1); llOwnerSay("Saved appearance " + msg1 + " to " + npc); } else if (msg0 == "load" && msg1 != "" && npc != NULL_KEY) { osNpcLoadAppearance(npc, msg1); llOwnerSay("Loaded appearance " + msg1 + " to " + npc); } else if (msg0 == "clone") { if (msg1 != "") { osOwnerSaveAppearance(msg1); llOwnerSay("Cloned your appearance to " + msg1); } else { llOwnerSay("Usage: clone <notecard-name-to-save>"); } } else if (msg0 == "stop" && npc != NULL_KEY) { osNpcStopMoveToTarget(npc); } else if (msg0 == "sit" && msg1 != "" && npc != NULL_KEY) { osNpcSit(npc, msg1, OS_NPC_SIT_NOW); } else if (msg0 == "stand" && npc != NULL_KEY) { osNpcStand(npc); } else if (msg0 == "help") { llOwnerSay("Commands are:"); llOwnerSay("create <notecard-name> - Create NPC from a stored notecard"); llOwnerSay("createm"); llOwnerSay("remove - Remove current NPC"); llOwnerSay("clone <notecard-name> - Clone own appearance to a notecard"); llOwnerSay("load <notecard-name> - Load appearance on notecard to current npc"); llOwnerSay("save <notecard-name> - Save appearance of current NPC to notecard"); llOwnerSay("animate"); llOwnerSay("move"); llOwnerSay("moveto <x> <y> <z> - move to absolute position"); llOwnerSay("movetarget"); llOwnerSay("movetargetnoland"); llOwnerSay("movetargetwalk"); llOwnerSay("rot"); llOwnerSay("say"); llOwnerSay("sit <target-uuid>"); llOwnerSay("stop"); llOwnerSay("stand"); } else { llOwnerSay("I don't understand [" + msg + "]"); } } } }
Wandering und Puppeteer
Wizardry and Steamworks (Bitte drücken sie auf SHOW INDEX) bietet einen kostenlosen, erweiterbaren NPC-Satz von Skripten, veröffentlicht unter der GPLv3-Lizenz, der die meisten NPC-Funktionen implementiert und es Ihnen ermöglicht, bequem NPCs zu erstellen. Zum Zeitpunkt des Schreibens sind mehrere Skripte verfügbar:
- Wandering NPCs ist ein Skript, das einen nicht interaktiven NPC einfach in einem bestimmten Gebiet herumwandern lässt.
- NPC Puppeteer ist ein System, das es Ihnen erleichtert, NPCs ohne allzu viel Wissen über LSL oder OSSL zu erstellen.
Die Besten Tools für den OpenSimulator - NPC maker, Recorder und Controller für den OpenSimulator auf den Outworldz Seiten NPC Recorder und Controller
OSW NPCs Controller
OpenSimWorld bietet einen NPC-Controller, der interaktive NPCs unterstützt. Das System ermöglicht es Ihnen, NPCs über den lokalen Chat Befehle zu erteilen und komplexe Verhaltensweisen durch einfach zu schreibende Notizkarten aufzubauen. Außerdem können Sie eine "Karte" Ihrer Region angeben, damit die NPCs gezielt gehen können.
Fragen/Kommentare
Bitte hinterlassen Sie Ihre Fragen und Kommentare hier: this article's talk page.