This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

NPC Rezzer um einen NPC auf einen beliebigen Poser zu setzen
#1
NPC erstellen um ihn auf einen Poser/Sittarget zu setzten, und dauerhaft in der Sim zu halten.


Das Script dient dazu einen NPC resetfest dauerhaft zu animieren.
Die Bedienung erfolgt von einem nicht auf dem Poser sitzenden Avatar aus, oder automatisch.
Das Script enthält ein Berechtigungs System wer den NPC rezzen/löschen darf: Jeder/ Selbe Gruppe / ausgewählte Avatare deren UUID im Script eingetragen wurden.

Nach Scriptreset (z.Bsp: durch Simrestart, Inventaränderung, ...) rezzt es einer Wartezeit einen NPC automatisch sofern der Poser frei ist, und setzt diesen auf den Poser.
mit Klick auf das Prim kann der NPC gelöscht, und mit einem weiteren Klick wieder gerezzt werden.
Ist der Poser frei, so kann ihn auch ein Avatar nutzen.

Das Script erfordert OSSL Befehl Berechtigung in der Sim.
Der NPC wird im Gruppenkontext des Lands gerezzt, daher braucht die Gruppe LandZugang.
Die Beschreibung des NPC erfolgt in einer Notecard, und wird automatisch erstellt (gemäß hier im Forum Beschriebenen Artikel)

https://service-silberwelten.de/showthread.php?tid=358
Wer diesen Clon Ersteller verwendet muss die Notecard nicht einmal umbenennen.

Ansonsten muss der Namen mit .NPC anfangen gefolgt von dreistelliger Nummer und einem Leerzeichen. 
Die Syntax ist identisch mit PMAC! Beispiel: ".NPC123 Amanda String".
Der angezeigte NPC Name fängt mit der 9.Stelle an.

Der NPC kann (optional) mit einem Userprofil ausgestattet werden. Unterstützt wird Bild und Beschreibung gemäß folgender Konvetion:
Im Prim ist eine Profilfoto mit dem Namen: ".bild npcname" zu hinterlegen, das als Profilfoto im NPC Profil geladen wird.
Im Prim ist eine Notizkarte mit dem Namen: ".info npcname" zu hinterlegen, dessen Inhalt im Info Feld des Profils angezeigt wird.


Code:
// P600 PMAC ADDON NPC Rezzer V1.9       by Tron Mcp       11.2021
//
// Das Script darf nicht gegen reales Geld verkauft werden, und muss fullperm bleiben. Der Autor ist als Urheber zu nennen.
// Alle anderen Nutzungen sind erlaubt.
//
// Das Script dient dazu einen NPC resetfest dauerhaft zu animieren.
// Die Bedienung erfolgt von einem nicht auf dem Poser sitzenden Avatar aus, oder automatisch.
//
// Nach Scriptreset (z.Bsp: durch Simrestart, Inventaränderung, ...) rezzt es einer Wartezeit einen NPC automatisch sofern der Poser frei ist, und setzt diesen auf den Poser.
// mit Klick auf das Prim kann der NPC gelöscht, und mit einem weiteren Klick wieder gerezzt werden.
// Ist der Poser frei, so kann ihn auch ein Avatar nutzen.

// das Script erfordert OSSL Befehl Berechtigung in der Sim.
// Der NPC wird im Gruppenkontext des Lands gerezzt, daher braucht die Gruppe LandZugang.

// die NPC Notecard muss mit .NPC anfangen gefolgt von einem Leerzeichen.
// Die Syntax ist identisch mit PMAC! Beispiel: ".NPC123 Amanda String"
// Der angezeigte NPC Name fängt mit der 9.Stelle an

// Im Prim ist eine Profilfoto mit dem Namen: ".bild npcname" zu hinterlegen, das als Profilfoto im NPC Profil geladen wird.
// Im Prim ist eine Notizkarte mit dem Namen: ".info npcname" zu hinterlegen, dessen Inhalt im Info Feld des Profils angezeigt wird.


integer autostart = TRUE;                        // TRUE / FALSE   Soll der NPC automatisch gestartet werden? Bei Scriptreset und Sim Neustartestartet

integer debug = FALSE;                           // Entwickler Infos anzeigen

list    zugangsliste = ["b6a520ac-a468-4bc3-9e52-b509e88a8bce","18da7264-3260-4b63-8173-2a6fd7e93e33","798a6b1e-2186-4cf2-b733-460cb7132ae9"]; // UUIDS berechtigter AVAs
integer groupaccess  = FALSE;                    // TRUE ore FALSE - darf die Gruppe steuern?
integer publicaccess = FALSE;                    // TRUE ore FALSE - darf jeder steuern?
vector  sitzposition = < 0.0, 0.0, 0.8>;         // Sitzposition als Offset zum Prim
vector  schriftfarbe = <0.702, 0.0, 0.0>;        // Farbe des "dance" Primschriftzugs

////// ab hier Systemvariablen - nichts einzustellen

key     npc = NULL_KEY;         // UUID des gerezzten NPC
key     toucher;                // UUID des Operator
key     dancer;                 // UUID des Posertänzer

string  npc_name;
string  npcnotecard;
integer bereit;
integer linkzahl;               // Links leeren Posers.
integer inuse;                  // TRUE wenn Poser in Nutzung ist
integer bot;                    // TRUE wenn User eine BOT ist


integer berechtigungscheck(string clicker, integer selbegruppe)  // Zugangsberechtigung auswerten
    {
        integer zugang = FALSE;
        integer personalzugang = llGetListLength(zugangsliste);
        if (publicaccess)  { zugang = TRUE;}                     // Öffentlicher Zugang
        else if (selbegruppe && groupaccess) { zugang = TRUE;}   // Gruppen Zugang
        else if (clicker ==  llGetOwner()) { zugang = TRUE;}     // Besitzer Zugang immer erlaubt
        else if (personalzugang)                                 // Persönlicher Zugang über UUID Liste
        {
            string personal;
            do
            {  
                personal = llList2String(zugangsliste, personalzugang -1 );
                if( clicker ==  personal) { zugang = TRUE; }
                personalzugang--;
            }       
            while ( personal && (!zugang));
        }
        return zugang;
    }


integer lese_nc_name()                                              // NPC Notecard prüfen
{
    integer notecards = llGetInventoryNumber(INVENTORY_NOTECARD);   // Anzahl Notecards ermitteln
    while (notecards)                                               // Test ob Notecard vorhanden
    {
        npcnotecard = llGetInventoryName(INVENTORY_NOTECARD,notecards-1);     // Namen der 1. Notecard ermitteln
        if(debug) llSay (0,(string)npcnotecard);
        if (llSubStringIndex(npcnotecard,".NPC")==0)                // Testen ob sie eine .NPC Notecard ist
        {
            npc_name = llGetSubString(npcnotecard,8,-1);            // npc_namen ermitteln
            if(debug) llSay(0,"NPC Namen: " + npc_name );
            return(TRUE);
        }
        notecards--;
    }
    return(FALSE);
}


key npc_rezzer(key sittarget, vector npcPos)    // NPC im GRUPPENKONTEXT rezzen, damit der auf Sims geht die öffentlich gesperrt, aber für Gruppe frei ist
{
    key npctorez = osNpcCreate(npc_name, "" , npcPos, npcnotecard, 8 | OS_NPC_NOT_OWNED | OS_NPC_SENSE_AS_AGENT | OS_NPC_OBJECT_GROUP );
    osNpcSit(npctorez,sittarget,OS_NPC_SIT_NOW);
    if (llGetInventoryKey(".bild " + npc_name)) osNpcSetProfileImage(npctorez,".bild "+ npc_name);                   // Testen ob Profilbild vorhanden - dann laden
    if (llGetInventoryKey(".info " + npc_name) != (string)NULL_KEY )
    {
        string info = (string) osGetNotecard(".info " + npc_name);
        osNpcSetProfileAbout(npctorez, info);  // Testen ob Profilinfo Notecard vorhanden - dann laden
    }
    bot = TRUE;
    return npctorez;
}


key npc_killer(key npctokill)                    // NPC Löschen
{
    osNpcStand(npctokill);
    llSleep(1.0);
    osNpcRemove(npctokill);
    bot = FALSE;
    return(NULL_KEY);
}   


integer npc_alive(key npctocheck)                // Check ob der vorher gerezzte NPC noch lebt
{
    if(debug) llSay(0, "NPCgeprueft : "+ osIsNpc(npctocheck));
    return osIsNpc(npctocheck);
}


default
{
    state_entry()
    {
        linkzahl = llGetNumberOfPrims();
        bereit = lese_nc_name();
        if(bereit) { if(autostart) { llSetTimerEvent(30.0); llWhisper(0,"in 30 Sekunden wird ein NPC gerezzt"); }}
        else { llSay(0,"Keine gültige NPC Notecard gefunden"); }
    }


    changed (integer change)
    {
        if ( change & ( CHANGED_INVENTORY | CHANGED_REGION_START )) { if(bot) npc = npc_killer(npc); llSleep(1.0); llResetScript();}  // Inventory Änderung und Sim Restart abfangen
       
        if (change & CHANGED_LINK)
        {
            if(linkzahl != llGetNumberOfPrims())                    // mindestens einer hat sich gesetzt
            {
                inuse = TRUE;
                dancer = llGetLinkKey(llGetNumberOfPrims());
                bot = osIsNpc(dancer);
            }
            else                                                                   // der letzte ist aufgestanden
            {
                if(linkzahl == llGetNumberOfPrims()) inuse = FALSE;
            }
        }
    }
   
   
    touch_start(integer number)                                                     // Prim wurde geklickt
    {   
        toucher = llDetectedKey(0);
        integer gruppe = llDetectedGroup(0);
        integer access = berechtigungscheck(toucher,gruppe);                        // Berechtigung checken
       
        if(access)
        {
            if(npc_alive(npc)) { npc = npc_killer(npc); llSetTimerEvent(0);}        // Poser mit NPC besetzt -> NPC löschen und warten
            else llSetTimerEvent(0.2);                            // sofort NPC Rezzen
        }
    }
   
   
    timer()
    {
        if(linkzahl == llGetNumberOfPrims()) {npc = npc_rezzer( llGetKey(), llGetPos()); llSetTimerEvent(60);}    // wenn Poser leer, NPC rezzen
    }
}

Anwendungsfall und Abgrenzung zu andern Lösungen:

Man kann natürlich NPCs auch direkt mit dem PMAC Poser oder ähnlichen Lösungen rezzen. Dann erfolgt NPC Betreuung und Animation aus dem gleichen Script heraus.

Was bei PMC aber normal nicht geht ist eine Steuerung von "aussen", also ohne selber drauf zu sitzen.
Daher braucht ein PMAC eine 2 Personen Sitz Lösung damit sich erst ein AVA setzen kann um einen NPC zu rezzen.

Dieses Script nicht. Dieses Script benötigt nur eine simple externe Steuerung die einen AVA /oder NPC animieren kann.
Das Platzieren des NPCs erfolgt genauso wie wenn sich ein Avatar drauf setzt.

Das rezzen und löschen des NPCs erfolgt von aussen (also ohne auf dem Poser zu sitzen).
Ausserdem wird der Status des NPCs gemerkt und per watchdog Timer überwacht.
Wurde einer gerezzt und ist zum Beispiele durch Sim Neustart - oder NPC Killer gelöscht worden, so wird nach einer Wartezeit der NPC wieder gerezzt.

Ich habe schon einmal ein ähnliches Script gepostet, das jedoch einen andeern Anwendungsfall hat. In der anderen Lösung wird die Animation bereits selber durchgeführt.

Dieses Script ist also explizit dafür einen verhandenen Sit Poser zu nutzen. Beispiel wäre ein NPC Kapitän auf einer automatischen Fähre für viele Personen.

Will man hingegen einen Tankwart basteln der alleine an der Zapfsäule wartet, so ist meine andere Lösung die Richtige:
https://service-silberwelten.de/showthread.php?tid=402

Viel Spaß

Tron
Zitieren


Gehe zu:


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