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.

Hallo, Gast
Sie müssen sich registrieren bevor Sie auf unserer Seite Beiträge schreiben können.

Benutzername
  

Passwort
  





Durchsuche Foren

(Erweiterte Suche)

Foren-Statistiken
» Mitglieder: 23
» Neuestes Mitglied: Lilida
» Foren-Themen: 601
» Foren-Beiträge: 1.574

Komplettstatistiken

Aktive Themen
AI text/image to mesh
Forum: Informationen und aktuelle Meldungen
Letzter Beitrag: Cheryl Furse
Vor 6 Stunden
» Antworten: 0
» Ansichten: 9
Promo Couple Walk
Forum: Informationen und aktuelle Meldungen
Letzter Beitrag: Cheryl Furse
25.04.2024, 11:42
» Antworten: 0
» Ansichten: 67
Red light district
Forum: Informationen und aktuelle Meldungen
Letzter Beitrag: Cheryl Furse
23.04.2024, 11:12
» Antworten: 6
» Ansichten: 297
Sim geht in Schlafmodus
Forum: OpenSim
Letzter Beitrag: ThunderTower
21.04.2024, 12:31
» Antworten: 5
» Ansichten: 612
Tanzball rezzen
Forum: OpenSim-Manager
Letzter Beitrag: Lilida
16.04.2024, 14:27
» Antworten: 6
» Ansichten: 566
Was ist ne Kaffestube ohn...
Forum: Kaffeestube
Letzter Beitrag: Susan
15.04.2024, 15:17
» Antworten: 0
» Ansichten: 294
C Programmierung und bull...
Forum: Scripting
Letzter Beitrag: Cheryl Furse
07.04.2024, 00:50
» Antworten: 2
» Ansichten: 369
Steampunk-Party mit Marlo...
Forum: Informationen und aktuelle Meldungen
Letzter Beitrag: ThunderTower
02.04.2024, 18:29
» Antworten: 0
» Ansichten: 248
ERÖFFNUNG FLORES SEA Wild...
Forum: Informationen und aktuelle Meldungen
Letzter Beitrag: ThunderTower
01.04.2024, 18:52
» Antworten: 3
» Ansichten: 356
Einladung zur SCIFI Party...
Forum: Virtual Africa
Letzter Beitrag: Cheryl Furse
31.03.2024, 13:32
» Antworten: 7
» Ansichten: 724

 
  NPC CLONE Script um NPC Notecards zu erstellen von Aine Caolmhe
Geschrieben von: Tron Mcp - 22.07.2022, 20:24 - Forum: Scripting - Keine Antworten

NPC CLONE Script um NPC Notecards vom aktuellen Avatar zu erstellen


   
Foto: Ein Avatar inspiziert seinen Clone

Dieses Script ist das Original von Aine Caolmhe.
Ich habe lediglich die CardPrefix geändert.


Somit wird die Notecard gleich in gültiger PMAC Nomenklatur beschriftet und muss nicht umbenannt werden.
Ebenso passt direkt sie in alle meine, oder von mir angepasste NPC Scripte. Zum Beispiel in die Paramout Line Dancer OSSL Version hier im Forum.


Auf der Sim auf der das Script zum Einsatz kommt müssen OSSL Befehle (in der OSSL.ini) erlaubt sein, und der User muss auf der Parzelle das Recht haben diese zu nutzen.


ANWENDUNG:

Das Script kommt in ein Prim oder ein anderes (Mesh-) Objekt hinein.
Durch Berührung mittels Avatar wird der Vorgang gestartet, und dem Avatar eine Notecard für den Clone übergeben.

Der Inhalt der Notecard kann übrigens als XML Datei bei Problemen bearbeitet werden, zum Beispiel mit Notepad++.
Anhand der Attachment points kann rausgefunden werden welches Objekt den Fehler macht, und die betreffende XML Sequenz entfernt werden.
Ebenso könnte man auch Attachments nachträglich hinzufügen.


   
Foto: Ein NPC in der Clonaufbewahrung

Zur Konfiguration gibt es im dem Script nur 2 Dinge:

1. Soll die Notecard auch im Prim gespeichert werden?
2. Wie lautet der Prefix der Notecard.




Code:
// HEDONE CLONE-ME UTILITY  -  erstellt Notecarten für NPCs von Avataren die auf das Objekt clicken
// By Aine Caolmhe Feb 2013
//
// ******************************************
// ***              OVERVIEW              ***
// ******************************************
// Ensure that the OSSL Function osAgentSaveAppearance() is enabled in your region (http://opensimulator.org/wiki/OSSL_Enabling_Functions)
// Place this script into any prim
// On touch, your current appearance will be cloned to a new notecard and given to you.
// Optionally, the original will be stored in the prim itself (technically it always gets stored there...the option is whether to delete it)
//
// ******************************************
// ***              USAGE                 ***
// ******************************************
// This script is supplied under the terms of the GPU General Public License 3.0
// You are free to modify, copy,and/or redistribute this work provided you:
// 1. Supply it free of charge
// 2. Attribute it as the modified work of the original creator (Aine Caolmhe)
// 3. Also make your modified version freely available to copy, modify, and redistribute
//    under the same GPU3.0 terms that this script was given.
// Full details of the GPU General Public License are available at http://www.gnu.org/licenses/gpl.html
//
// USER VARIABLES
integer storeCopy=FALSE;            // TRUE will store a copy of each appearance notecard in the prim's inventory
string cardPrefix=".NPC123";        // notecard will have this string + First Name + Last Name + a number if it duplicates an existing card name
//
// ###################################################################
// DO NOT CHANGE ANYTHING BELOW HERE UNLESS YOU KNOW WHAT YOU'RE DOING
// ###################################################################

default
{
    state_entry()
    {
        string txt="Paramour Clone-Me Utility\nTouch to clone a copy of\nyourself to a NPC appeance notecard";
        if (storeCopy) txt+="\nA copy of the card will be kept in the prim inventory";
        llSetText(txt,<1.0,0.85,0.2>,1.0);
        llOwnerSay("Clone-Me utility is ready for use. Please ensure that the OSSL function osAgentSaveAppearance() is enabled in your region.");
    }
    
    
    touch_start(integer num)
    {
        list toucherData=[llDetectedKey(0),llDetectedName(0)];
        llRegionSayTo(llList2Key(toucherData,0),0,"Please wait while appearance data is stored - it will take several seconds...");
        string cardName;
        integer i=1;
        integer nameAvailable;
        while (!nameAvailable)
        {
            if (i==1) cardName=cardPrefix+llList2String(toucherData,1);
            else cardName=cardPrefix+llList2String(toucherData,1)+" "+(string)i;
            if(llGetInventoryType(cardName)==INVENTORY_NOTECARD) i++;
            else nameAvailable=TRUE;
        }
        
        osAgentSaveAppearance(llList2Key(toucherData,0),cardName);
        integer cardReady;
        
        while(!cardReady)
        {
            if(llGetInventoryType(cardName)==INVENTORY_NOTECARD) cardReady=TRUE;
            else llSleep(0.2); // not ready so wait a little longer before checking again
        }
        
        llGiveInventory(llList2Key(toucherData,0),cardName);
        
        if (!storeCopy)
        {
            llRemoveInventory(cardName);
            llRegionSayTo(llList2Key(toucherData,0),0,"The notecard has now been removed from the prim's inventory");
        }
    }
}



Einen herzlichen Dank meinerseits an Aine Caolmhe für diese guten Scripte in der Opensim Anfangszeit.
Thank you so much Aine, for supporting Opensim from the beginning with this helpful scripts.


Tron

Drucke diesen Beitrag

  NPC Killer Script um marodierende NPCs zu löschen, von Aine Caolmhe
Geschrieben von: Tron Mcp - 22.07.2022, 20:03 - Forum: Scripting - Keine Antworten

NPC Killer Script um marodierende NPCS zu löschen.


Dieses Script ist das Original von Aine Caolmhe.

Es hilft einen NPCs zu löschen die unkontrolliert auf der Sim vagabundieren.

Dies pasiert zum Beispiel wenn das Script das den NPC gerezzt hat, und kontrolliert, resettet wird ohne vorher den NPC zu löschen.
Das kann man (je nach Rezzscript) zwar auch mit einem SIM Neustart beheben.

Viel schlimmer ist aber der Fall das das Rezzscript unentwegt neue NPCs rezzt weil die vorangegangenen sich nicht auf den Sitzposer gesetzt haben.
Dies kommt zum Beispiel vor wenn die "alte" NPC Rezz Befehls Syntax genutzt wird die die NPCs nicht im Gruppenkontext rezzt, und gelichzeitig die Sim für "public" gesperrt wird.

So kann in wenigen Minuten die Sim so stark gefüllt werden das man als Admin nicht mal mehr rauf kommt um den Rezzer einhalt zu gebieten.
Das ist mir auch schon mehrfach pasiert.

Da hilft dann diesen NPC Killer an den Ava auf einer anderen Sim anzuziehen, und sich TP bereit zu machen.
Dann die marode Sim restarten, und sofort wenn sie da ist rüber teleportieren . Und mehrfach diesen NPC Killer berühren.
So kann man die Anzahl gerezzter NPCs minimieren, bis man Scripte auf der Sim stoppt, und den Fehler behebt.

Ebenso kann diese NPC Killer bei Events helfen, wenn die Sim wegen Überlastung Probleme bekommt.



ANWENDUNG:


Das Script wird in ein Prim gelegt, und wartet auf eine Berührung.
Dann legt es los, holt sich die Avatarliste der Sim und versucht alle Avatar UUIDs mit dem OSSL - NPC Kill Befehl zu löschen.

Man könnte es heute zwar etwas verbessern und vorab checken ob die UUID einem Avatar oder einem NPC gehört,
aber das Script läuft auch so schon jahrelang zuverlässig. Daher belasse ich es im Original.

Als dieses Script erstellt wurde gab es noch nicht den OSSL Befehl einen Avatareintrag auf NPC zu testen.


Code:
// P605 Hedone NPC Killer
// by Aine Caolmhe Jan 2013
//
// This script is full perm and may be used and altered in any way you wish
//
// Place in any prim, then click the prim to kill all NPCs in the current region
// OSSL functions osGetAvatarList and osNpcRemove must be enabled in the region

default
{
    state_entry()
    {
        llSay(0, "NPC Killer ready - touch me to remove all NPCs from your region");
    }
    
    
    touch_start(integer num)
    {
        list agentList=osGetAvatarList();
        integer listLength=llGetListLength(agentList);
        integer i;
        
        while (i<listLength)
        {
            osNpcRemove(llList2Key(agentList,i));
            i+=3;
        }
        llOwnerSay("All NPCs should now be dead");
    }
}


Einen herzlichen Dank meinerseits an Aine Caolmhe für diese guten Scripte in der Opensim Anfangszeit.
Thank you so much Aine, for supporting Opensim from the beginning with this helpful scripts.


Tron

Drucke diesen Beitrag

  Gothic-Party am Freitag
Geschrieben von: Marina Baer - 21.07.2022, 19:55 - Forum: Termine und Veranstaltungen in Opensim - Antworten (1)

FREITAG ist Gothic-Time. Ab 20:00 Uhr startet die Gothic-Party mit Gast DJane Biene. Die Frau mit flotter Zunge und guter Musik wird Euch den Abend versüssen.

Taxi: thepublicworld.de:8002:tpw-club

   

Drucke diesen Beitrag

  Party Fun Radio im Moonrose Grid
Geschrieben von: Dina - 21.07.2022, 19:08 - Forum: Termine und Veranstaltungen in Opensim - Antworten (5)

Wir sind wieder da am 22.07.2022 ab 20 Uhr testen wir .
DJ Achim legt auf und dazu seit ihr alle eingeladen.
   
Taxi:moonrose-grid.de:8002: Dance Hall

Drucke diesen Beitrag

  Paramour Line Dancer Script für Opensim in OSSL Regionen mit NPC Unterstützung
Geschrieben von: Tron Mcp - 19.07.2022, 20:01 - Forum: Scripting - Antworten (3)

Paramour Line Dancer Script für Opensim in OSSL Regionen mit NPC Unterstützung

Folgendes Script basiert auf der Arbeit von Mata Hari / Aine Caoimhe.

Und ist unter folgenden Lizenzbedingungen einzusetzten:           https://creativecommons.org/licenses/by-nc-sa/4.0/

Hier nun die 2. Versprochene Variante für OPENSIM Regionen die OSSL Befehle freigeschalten haben.
Dies ist die Basis damit auch NPCs funktionieren.

ACHTUNG: DIESE VERSION funktioniert nur wenn entsprechende OSSL Befehle für die Region freigegeben sind, und der Primbesitzer ausreichend Rechte hat diese zu nutzen.

Es gilt alles was ich schon im Artikel  "Paramour Line Dancer Script für SL und Opensim in nicht OSSL Regionen" gesagt habe.
Das werde ich an dieser Stelle auch nicht wiederholen.
Hier der Link zum Nachlesen:  https://service-silberwelten.de/showthread.php?tid=157

So- was ist hier anders? Und warum sollte man diese Version einsetzten wo es doch die Andere gibt, die in allen Regionen läuft?
Die Antwort sind die NPCs.
Die gab es auch schon im Original von Mata Hari / Aine Caoimhe.
Aber genau an diesem Punkt haben sich die meisten Verbesserungen in Opensim abgespielt.

Im Detail ist hier folgendes nun im Script verändert:
NPCs können auch auf gesperrten Sims gerezzt werden, wenn in dem Prim aus dem sie gestartet werden die gültige Landgruppe der Sim eingestellt ist.
Ebenso überleben sie dann auch ein nachträgliches Sperren der Sim. Die Gruppe muss aber erlaubt bleiben.

Ausserdem unterstützt dieses Script nun auch für NPCs Profilfotos und Profilinfos.
Ein Dancline NPC hat also nun auch ein Profilbild und eine Beschreibung sofern ihr die anlegt.

Dafür habe ich eine feste Notation eingeführt. Diese ermöglicht es mehrere NPCs unabhängig bereitzustellen.
Ausserdem ziehe ich die gleich Notation auch in allen anderen NPC Scripten nach, damit die Karten einfach austauschbar sind.
Bei dem NPC Beschreibungs Notecards habe ich die Nomenklatur von PMAC zugrunde gelegt.

Eine vollständige NPC Beschreibung besteht also künftig aus 3 Notecards.
Der erste Teil der Notecard ist die Kennung was für eine Karte das ist. Der 2.Teil jeder Notecard ist ein identischer NPC Name.

NPC Outfit Beschreibung:    .NPC123NPCNAME           PFLICHTEINTRAG
NPC Foto:                               .bildNPCNAME                  Optionaler Eintrag
NPC Beschreibung:               .infoNPCNAME                  Optionaler Eintrag

Beispiel:     .NPC123Susan Vogue    
                  .bildSusan Vogue
                  .infoSusan Vogue

Gross/Klein Schreibung und eventuelle Leerzeichen hinter den NPC Namen sind zu beachten.

Für die NPC Outfit Beschreibung gibt PMAC folgendes vor:
.NPC ist die Kennung das es sich um eine Outfit Karte handelt.
Danach folgt eine beliebige 3-stellige Zahl, die von PMAC aber zur Sortierung genutzt wird.
Anschliessend folgt der NPCName. Dieser darf auch 2-teilig mit Leerzeichen dazwischen sein.

Ausserdem neu ist das Berechtigungs System wer NPCs rezzen und den Poser steuern darf. Siehe Script Zeile 56 bis 58
Es bietet Optionen wie "jeder", die gleiche Gruppe" oder spezielle Avas die per UUID  angegeben werden.

Das Script benötigt genau wie PMAC eine Basisanimation niedrigster Priorität.  
Diese muss wie im Script angegeben heissen: "*****base_DO NOT DELETE ME!"


In der Version 3.7 werden die zum Rezzen angeforderten NPCs per Zufall ausgewählt.

Code:
// P604 PARAMOUR LINE-DANCE CONTROLLER OSSL v3.7 VSL by Tron 11.2021
// original OSSL Version by Mata Hari / Aine Caoimhe November 2014
// Provided under Creative Commons Attribution-Non-Commercial-ShareAlike 4.0 International license.
// Please be sure you read and adhere to the terms of this license: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
// *** Dieses Script benötigt Regionen in denen OSSL Befehle freigeschalten sind, und der Scriptbesitzer diese Rechte hat***
//
// Unbedingt darauf achten das Prim dieses Scriptes im Kontext der erlaubten Simgruppe zu rezzen,
// ansonsten kommt es zu NPC Fehlern wenn der öffentliche Zugang abgeschalten wird!
//
// Diverse Änderungen: NPCs rezzen nun Fehlerfrei auf gesperrten Sims wenn sie die erlaubte Gruppe haben
// Änderungen by Tron: Script für Funktionsfähigkeit in Sl und Opensim umgeschrieben.
// Hinzufügung eines umfangreichen Berechtigungs Systems.
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// USER SETTINGS - stuff that any user should feel comfortable setting
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
integer textanzeige =TRUE;                      // TRUE = show floaty text, FALSE = hide it
string  textmessage;                            // name to appear in floaty text above the line dance object. Read from Prim description
vector  textcolour =<1.000, 0.847, 0.200>;      // colour to use for the floaty text
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// ADVANCED USER SETTINGS - a more advanced user might want to adjust these
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
integer  debug = FALSE;
integer  maxLineLength=5;                        // maximum number of dancers allowed in a single line
float    spacingX=1.5;                           // distance between each dancer in the line (side to side)
float    spacingY=-1.5;                          // when more than 1 line is needed, how far apart to space lines
vector   p1Pos=<0.0, 0.0, 1.25>;                 // sit target position for 1st dancer - all other dancers positioned relative to this position (and centered on it) <0.0, 0.0, -2.0>;
rotation p1Rot=ZERO_ROTATION;                    // sit target rotation for 1st dancer - making this non-zero could produce unusual results!
integer  randomOrder=FALSE;                      // TRUE = play dances in random order, FALSE = play in alphabetical order
float    danceTimer=60.0;                        // how long (in seconds) to play each line dance by default before moving on to the next one (owner can also change this via dialog)
//
//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// DON'T CHANGE ANYTHING BELOW HERE UNLESS YOU KNOW WHAT YOU'RE DOING!!!!!
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
string  baseAnim="*****base_DO NOT DELETE ME!";
list    animatliste;
integer animationsnr;
string  currentAn;
list    dancerliste;              // Liste von Avataren UND NPCs auf dem Poser
string  myState="OFF";
integer myChannel;
integer handle;
integer closeHandle;
list    npcList;
integer npcToRez;
integer taenzeranzahl;            // Integer! Anzahl der aktuellen Tänzer

integer poserlinks;
integer taenzeraufposer;

key     toucher;               // UUID des Operator des Menüs

list    zugangsliste = ["2338a1d0-0d7b-4ec1-b841-029c49c9d461","8998586e-b754-4032-856f-f4f4b122eb6e"]; // UUIDS berechtigter AVAs
integer groupaccess  = TRUE;   // TRUE ore FALSE - darf die Gruppe steuern?
integer publicaccess = FALSE;  // TRUE ore FALSE - darf jeder steuern?

list    npccardlist;
list    npcnamelist;


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 ( (integer)personal && (!zugang));
        }
        return zugang;
     }


showMenu(key operator)
{
    myChannel=0x80000000 | (integer)("0x"+(string)operator);
    string txtDia="Danceliner Optionen Menü: ADD/Kill NPCs, Animationswechel, Ändern der Tanzdauer";
    list butDia=["ABBRUCH","NextDance","Add NPC","Kill NPC","Kill ALL","60 SEC","90 SEC","120 SEC","300 SEC","Debugmode"];
    handle=llListen(myChannel,"",operator,"");
    llDialog(operator,txtDia,butDia,myChannel);
    closeHandle=TRUE;
}


positionDancers()
{
    dancerliste=[];
    integer link=llGetNumberOfPrims();
    while (link>0)
    {
        if (llGetAgentSize(llGetLinkKey(link))!=ZERO_VECTOR) dancerliste=[]+[llGetLinkKey(link),link]+dancerliste;
        link--;
    }
    integer laufvar5;
    taenzeranzahl=llGetListLength(dancerliste);
    integer row;
    integer pos;
    integer thisLineCount;
    while (laufvar5 < taenzeranzahl)
    {
        vector thisPos=p1Pos;
        rotation thisRot=p1Rot;
        thisPos.y+=(pos*spacingX);
        thisPos.x+=(row*spacingY);
        llSetLinkPrimitiveParamsFast(llList2Integer(dancerliste,laufvar5+1),[PRIM_POS_LOCAL,thisPos,PRIM_ROT_LOCAL,thisRot]);
        thisLineCount++;
        if(thisLineCount>=maxLineLength)
        {
            thisLineCount=0;
            pos=0;
            if (row==0) row++;
            else if (row>0) row=row*-1;
            else row=(row*-1)+1;
        }
        else
        {
            if (pos==0) pos++;
            else if (pos>0) pos=pos*-1;
            else pos=(pos*-1)+1;
        }
        laufvar5 +=2;
    }
}


startDancing(key who)
{
    llRequestPermissions(who, PERMISSION_TRIGGER_ANIMATION );
    key doNotStop=llGetInventoryKey(baseAnim);
    osAvatarPlayAnimation(who,baseAnim);
    list anToStop=llGetAnimationList(who);
    integer avacount=llGetListLength(anToStop);
    while (--avacount>=0) { if (llList2Key(anToStop,avacount)!=doNotStop) osAvatarStopAnimation(who,llList2Key(anToStop,avacount)); }
    osAvatarPlayAnimation(who,currentAn);
}


nextDance()
{
    animationsnr++;
   
    if (animationsnr>=llGetListLength(animatliste))
    {
        if (randomOrder) animatliste=[]+llListRandomize(animatliste,1);
        animationsnr=0;
    }
    string nextDance=llList2String(animatliste,animationsnr);
    taenzeranzahl=llGetListLength(dancerliste);  
    if (debug) llWhisper(0,"Starting " +(string)animationsnr +". Animation:  "  +nextDance+"  Stopping: "+currentAn );
    integer i;
    while (i<taenzeranzahl)
    {
        key who=llList2Key(dancerliste,i);
        llRequestPermissions(who, PERMISSION_TRIGGER_ANIMATION );
        osAvatarStopAnimation(who,currentAn);
        osAvatarPlayAnimation(who,nextDance);
        i+=2;
    }
    currentAn=nextDance;
    positionDancers();
    llSetTimerEvent(danceTimer);
}


showText(integer anzeige)
{
    if (anzeige)
    { 
        if (myState=="ERROR") { llSetText("ERROR - owner needs to fix and reset",textcolour,1.0);}
        else llSetText(textmessage,textcolour,1.0);
    }
    else llSetText("",textcolour,0.0);
}


buildAnimList()
{
    animatliste=[];
    integer l=llGetInventoryNumber(INVENTORY_ANIMATION);
    while (--l>=0) { if (llGetInventoryName(INVENTORY_ANIMATION,l)!=baseAnim) animatliste=[]+[llGetInventoryName(INVENTORY_ANIMATION,l)]+animatliste; }
    if (llGetListLength(animatliste)==0)
    {
        llWhisper(0,"ERROR! No dance animations in inventory!");
        myState="ERROR";
    }
    else if (llGetListLength(animatliste)>1)
    {
        if (randomOrder) animatliste=[]+llListRandomize(animatliste,1);
        else animatliste=[]+llListSort(animatliste,1,TRUE);
    }
    if(debug) llSay(0,"Animations Liste: "+ (string)animatliste);
    animationsnr=-1;
}


integer buildNPClist()
{
    npccardlist = [];
    npcnamelist = [];
    integer npczahl;
    integer notecardzahl = llGetInventoryNumber(INVENTORY_NOTECARD);
    while (notecardzahl)
    {
        notecardzahl--;                                              // Anzahl ist 1 höher als Adressierung.
        string notecardname = llGetInventoryName(INVENTORY_NOTECARD,notecardzahl);
        if (llSubStringIndex(notecardname,".NPC")==0)               // Testen ob sie eine .NPC Notecard ist
        {
            string npc_name = llGetSubString(notecardname,8,-1);     // npc_namen ermitteln
            if(debug) llSay(0,"NPC Namen: " + npc_name );
            npccardlist += notecardname;                            // Liste mit NPC enthaltenden Notecards erstellen
            npcnamelist += npc_name;                                // Liste mit NPC Namen erstellen
            npczahl++;
        }
    }
    if(debug) llSay(0,"NPC Zahl: "+ (string)npczahl +"  NPC Liste: "+(string) npcnamelist);
    return (npczahl);
}


npc_alive_check()                                                    // Check ob die vorher gerezzten NPCs noch leben
{
    integer npczahl = llGetListLength(npcList);
    list    restnpcList = [];
    integer laufvar;
    while (laufvar < npczahl)
    {
        key npctocheck = llList2Key(npcList,laufvar);                // Check ob NPC Key noch vorhanden- als Lebenszeichen
        if (osIsNpc(npctocheck)) { restnpcList += npctocheck;}        // Rest NPC Liste erstellen
        laufvar++;
    }
    npcList = [] + restnpcList;                                        // NPC Liste aktualisieren
    if(debug) llSay(0,"Lebendige NPCs: "+ (string)npczahl +" UUID Liste gerezzter NPCs: "+(string) npcList);
}


key npc_rezzer(key sittarget, vector npcPos, string npcnotecard, string npc_name)    // 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 );
    llSleep(0.5);
    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
    }
    if(debug) llSay(0," NPC gerezzt: " + npc_name + " mit UUID: " + (string)npctorez);
    llSleep(1.0);
    osAvatarPlayAnimation(npctorez,currentAn);
    return npctorez;
}


npc_rez_selector(list npccardlist, list npcnamelist )    // NPC auswählen der gerezzt werden soll
{
    key sittarget = llGetKey();
    vector npcPos = llGetPos();
    integer randomnpc = llFloor(llFrand(llGetListLength(npccardlist)));
    string  npcnotecard = llList2String(npccardlist,randomnpc);
    string  npc_name    = llList2String(npcnamelist,randomnpc);
    if(debug) llSay(0,"NPC Selector: NPC "+ (string) llGetListLength(npccardlist) + " per Zufall gewählt: " + (string)randomnpc + "  " + npc_name);
    key npc = npc_rezzer(sittarget, npcPos, npcnotecard, npc_name);
    npcList=[]+npcList+[npc];
}


default
{
    on_rez (integer foo) {llResetScript();}


    state_entry()
    {
        poserlinks = llGetNumberOfPrims();  // Primzahl leeren Posers ermittlen und speichern
        textmessage  = llGetObjectDesc();   // Prim Beschreibungsfeld auslesen
        llSetSitText(textmessage);
        llSitTarget(<0.0,0.0,0.0001>,ZERO_ROTATION);
        if (llGetInventoryType(baseAnim)!=INVENTORY_ANIMATION) {llWhisper(0,"ERROR! Unable to locate the base animation which MUST be in the ball."); myState="ERROR";}
        buildAnimList();
        integer npczahl = buildNPClist();
        if (debug) llSay(0, "Anzahl gefundenen NPCs: "+(string)npczahl );
        if (myState!="ERROR")
        {
            myState="READY";
            dancerliste=[];
            animationsnr=0;
            currentAn=llList2String(animatliste,animationsnr);
        }
        showText(textanzeige); // dient auch zum Löschen
    }

   
    changed (integer change)
    {
        if (change & CHANGED_REGION_START) llResetScript();
        if (change & CHANGED_OWNER) llResetScript();
        if (change & CHANGED_LINK)
        {
            list newDancerslist;
            integer aktlinkzahl=llGetNumberOfPrims();
            taenzeraufposer = aktlinkzahl - poserlinks;  // Tänzerzahl aus Primdifferenz ermitteln und speichern
            if(taenzeraufposer) {showText(FALSE);} else {if(textanzeige) showText(TRUE);}
            if(debug) llWhisper(0,"Aktuelle Tänzerzahl auf Poser: "+ (string)taenzeraufposer);
            npc_alive_check(); // Testen ob NPCs verschwunden sind, und NPC Liste bereinigen.
            while (aktlinkzahl>0)  // Taenzer abzählen und Liste erstellen
            {
                if (llGetAgentSize(llGetLinkKey(aktlinkzahl))!=ZERO_VECTOR) newDancerslist=[]+newDancerslist+[llGetLinkKey(aktlinkzahl),aktlinkzahl];
                aktlinkzahl--;
            }
            taenzeranzahl =llGetListLength(dancerliste);      
            integer laufvar1;
            while (laufvar1 < taenzeranzahl)
            {
                key who=llList2Key(dancerliste,laufvar1);
                integer ind=llListFindList(newDancerslist,[who]);
                if (ind>=0) // jemand sitzt neu
                {
                    dancerliste=[]+llListReplaceList(dancerliste,[llList2Integer(newDancerslist,ind+1)],laufvar1+1,laufvar1+1);
                    newDancerslist=[]+llDeleteSubList(newDancerslist,ind,ind+1);
                }
                else // jemand steht auf
                {
                    osAvatarPlayAnimation(who,"stand");
                    osAvatarStopAnimation(who,currentAn);
                    osAvatarStopAnimation(who,baseAnim);
                    dancerliste=[]+llDeleteSubList(dancerliste,laufvar1,laufvar1+1);
                }
                laufvar1+=2;
            }

            integer neutaenzer =llGetListLength(newDancerslist);  // Anzahl neuer Tänzer ermitteln- Achtung gibt doppelte Zahl aus.
            integer laufvar2 =0;

            while (laufvar2<neutaenzer)
            {
                startDancing(llList2Key(newDancerslist,laufvar2));
                laufvar2+=2;
            }

            dancerliste=[]+dancerliste+newDancerslist;
            if (llGetListLength(dancerliste)==0) { myState="READY"; llSetTimerEvent(0.0);}
            else if (myState=="READY") { myState="ON"; nextDance();}   // have to advance dance to keep them all synched and to trigger positioning
        }
    }


    touch_start(integer dummy)  // Menü Zugriff regeln
     {
        toucher = llDetectedKey(0);
        integer gruppe = llDetectedGroup(0);
        integer access;
        access = berechtigungscheck(toucher,gruppe);
        if(access) {showMenu(toucher); if(debug) llInstantMessage(toucher,"Menü Zugriff gewährt");}
     }


    listen(integer channel, string name, key who, string message)
    {
        llListenRemove(handle);
        if(debug) llSay(0,"Message enpfangen: " + message);
        closeHandle=FALSE;
   
        if (message=="ABBRUCH") return;

        else if (message == "NextDance") {if (myState=="ON") nextDance();}

        else if (message == "Add NPC")
        {
            if (llGetInventoryNumber(INVENTORY_NOTECARD)<1) { llInstantMessage(toucher,"I can't find any NPC notecards to use!");}
            else { npc_rez_selector(npccardlist, npcnamelist ); llSetTimerEvent(2.0); ;
            }
        }

        else if (message == "Kill NPC")
        {
            osNpcRemove(llList2Key(npcList,-1));
            npcList=[]+llDeleteSubList(npcList,-1,-1);
            showMenu(toucher);
        }

        else if (message == "Kill ALL")
        {
            while(llGetListLength(npcList))
            {
                osNpcRemove(llList2Key(npcList,-1));
                npcList=[]+llDeleteSubList(npcList,-1,-1);
            }
        }

        else if (llSubStringIndex(message," SEC")>=0)
        {
            danceTimer=(float)(llGetSubString(message,0,llSubStringIndex(message," MIN")-1));
            llInstantMessage(toucher,"Animations Dauer ist nun auf " + message + " gestellt");
            if (myState=="ON")
            {
                llSetTimerEvent(danceTimer);
                nextDance();
            }
            showMenu(toucher);
        }

        else if (message == "Debugmode") { debug = !debug; llInstantMessage(toucher,"Debugmodus [1 an / 0 aus] = "+(string)debug);}
    }
   
   
    timer()
    {
        if(closeHandle)
        {
            closeHandle++;
            if (closeHandle>2)
            {
                closeHandle=0;
                llInstantMessage(toucher, "Dialog has timed out...touch me again to re-active the dialog menu");
                llListenRemove(handle);
            }
        }
        if (myState=="ON") { nextDance(); }
        else llSetTimerEvent(0.0);
    }
}




ANWENDUNG:

- Rezze einen Würfel
- lege die Basisanimation "*****base_DO NOT DELETE ME!" hinein.
- füge die gewünschten Soll Animationen hinzu.
- (optional) dann die vorbereiteten NPC Karten (-Sets)
dann das Script
Änder die Primbeschreibung von "touch" auf "sit" damit man den Stuhl angezeigt bekommt wenn man mit dem Mauscursor über das Prim fährt.


Viel Spaß damit Tron

Drucke diesen Beitrag

  Kollaboratives Whiteboard
Geschrieben von: Kubwa - 16.07.2022, 08:41 - Forum: Serversoftware - Antworten (2)

Yo leute,

ich hab für ein kleines Projekt ein Kollaboratives Whiteboard gebaut. Quellcode bekommt man hier: 
Da ist auch ein Link zu einer live Demo.

Mit diesem Board können alle gleichzeitig malen und sehen auch in Echtzeit was die anderen gerade malen. Das Ganze lässt sich auch per Media on Prim direkt in OpenSim einsetzen, sodass man in OpenSim gemeinsam auf Prims malen kann.

Das Tool ist noch in der Weiterentwicklung. Wenn ihr Ideen und Verbesserungsvorschläge habt bin ich offen.

Drucke diesen Beitrag

  Lebensraum von Trugnattern und anderen Giftschlangen
Geschrieben von: ThunderTower - 16.07.2022, 08:20 - Forum: Informationen und aktuelle Meldungen - Keine Antworten

Über den Lebensraum von Trugnattern und anderen Giftschlangen

Normalerweise leben die giftigsten Schlangen in Australien oder vor der Ostküste Brasiliens. Dies stimmt aber nur zum Teil, denn der

Lebensraum von Trugnattern und anderen Giftschlangen erstreckt sich bis nach OpenSim. Weltweit werden so Menschen in unterschiedlichen

Grids von Giftschlangen gebissen. Schlangengifte enthalten nicht nur Falschaussagen, sondern auch Enzyme, die der menschlichen Ignoranz

sehr ähnlich sind. Diese Gifte zerstören selbst lange Freundschaften und machten in der Vergangenheit einige Grids zu Feinde. 

Mit der Art und Weise einer unglaublichen Arglist, hinterlistig und heimtückisch werden so pro Jahr viele Freundschaften zerstört.

Schlangen haben unterschiedliche Jagdtechniken. So jagen selbige (je nach Art) meistens im Chat oder per Voice.

Giftschlangen begehen auch sehr gern Rufmord und töten ihre Beute mit einem einzigen Giftbiss. 

   

Ich wünsche Ihnen ein schönes Wochenende

Coffee

Drucke diesen Beitrag

  Meine SSH-Konfiguration für Ubuntu 20.4 LTS
Geschrieben von: ThunderTower - 15.07.2022, 11:51 - Forum: Serversoftware - Keine Antworten

Meine SSH-Konfiguration für Ubuntu 20.4 LTS

Ports und Benutzer sind hier nur als Beispiel angegeben und müssen angepasst werden!

Konfiguration auf dem Server öffnen:

sudo nano /etc/ssh/sshd_config

#      $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Protocol 2

Include /etc/ssh/sshd_config.d/*.conf

Port 30100 z.B oder eben was anderes

#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m

PermitRootLogin no

#StrictModes yes

MaxAuthTries 3

#MaxSessions 10

PubkeyAuthentication yes

# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile    .ssh/authorized_keys .ssh/authorized_keys2

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!

PasswordAuthentication no

#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

AllowUsers anabel nini help pepsi ( Benutzer mit Leerzeichen!)

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no


# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem sftp  /usr/lib/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#      X11Forwarding no
#      AllowTcpForwarding no
#      PermitTTY no
#      ForceCommand cvs server


DenyUsers root
DenyGroups root

#######################

Hinweis:

Eine  Fehlkonfiguration vom SSH-Key, Benutzername oder Port sperrt Sie komplett aus!

Prickelndes Erlebnis: wenn der SSH-Port verändert, aber vergessen diesen Port in der
ufw auf allow zu setzen :-)

Fliegenfänger und Kleber:

Endlessh: an SSH tarpit (noch ungetestet)

Install:

sudo apt-get update

sudo apt-get install endlessh

mehr:

https://github.com/skeeto/endlessh/blob/.../README.md

Drucke diesen Beitrag

Music *Una notte Italiana*
Geschrieben von: Sylvia Koeln - 15.07.2022, 08:20 - Forum: Termine und Veranstaltungen in Opensim - Antworten (1)

Taxi: soul-grid.de:8002:LaToya
Wichtig: Die Sim wird erst am 16.07.22 geöffnet





Angehängte Dateien Thumbnail(s)
   
Drucke diesen Beitrag

  Eigener Server mit OpenSim
Geschrieben von: ThunderTower - 09.07.2022, 12:48 - Forum: Kaffeestube - Antworten (1)

Hallo Gesprächspartner,

hier meine Empfehlung für das Projekt:

Cloud VPS XL

10 vCPU-Kerne

60 GB RAM

Serverstandort EU

Speicher 1,6 TB SSD

BS Ubuntu 20.4

IPv4 Ja - ganz wichtig!

Kündigungsfristen nach Auswahl

Monatlicher Grundpreis 26,99 €

Mehr Infos:

https://contabo.com/de/vps/vps-xl-ssd/?i...1-6-tb-ssd

Damit hast du also den Server für ca 30 Euro, aber immer noch keine gültige URL bzw. Domain!

Du benötigst also zum Server noch einen Namen kurz URL die auf die Zieladresse (IP-Adresse vom Server) verweist.

Alles ist konfigurierbar und machbar, insofern man so ungefähr weiß was man will. Natürlich könnte man Hardware und Preis

noch weiter runterschrauben, aber man sollte dann auch keine Wunder in Sachen Performance erwarten. 4 - 5 Regionen auf einem Lappi zu

hosten ist absoluter Käse und auch eher nur prahlerei.     

Mit der letzten Stable Mono release 6.12.0 Stable (6.12.0.182) mit Ubuntu 20.4 LTS und OpenSim current release 0.9.2.1

(released on March 1, 2022) und MySQL-Server hast du ein tolles Grid. Zugriff und Wartung geht easy über das Terminal.

Die Initiale Vertragslaufzeit bei Contabo ist kundenfreundlich kulant.

Du musst also noch eine Domain registrieren hier:

https://www.ionos.de/domains/domain-registrieren

Sinnvollerweise könnte man die Domain dem Gridnamen anpassen.

Es sollte jedem klar sein, welche enorme Verantwortung mit dem Betrieb eines Servers verknüpft ist.

Als Betreiber muss ich rechtliche Konsequenzen wegen mangelhafter Sicherheit (also im Falle eines Missbrauchs) tragen.

24h Onlinezeit bedeutet auch 24h Angriffszeit. Das OpenSim toll funktioniert ist nur ein nützlicher Nebeneffekt.

Nachaltige Wartung und die richtige Auswertung der Server-Logs gehört am Tag zum Standart.

Der Server darf ein keinen Fall durch Schattenkrieger zur Zombie-Zone mutieren.

Wir können in Ruhe mal am Abend darüber reden.

Variante 2 sollte aber möglicherweise etwas besser für Dich sein:

Dazu benötigst Du nur einen Rechner mit z.B 32GB Arbeitsspeicher und einer 1TB Festplatte.

Die Grafikkarte kannst Du entfernen, da die Onboard-Grafik ausreichend ist. Es wird keine grafische Benutzeroberfläche installiert.

Wichtiger ist Dynamisches DNS, oder auch DynDNS - DDNS genannt. Hier registrierst Du quasi bei einem Anbieter eine Host-Adresse (Url).

Diese Adresse wird auf deine öffentliche Router-IP weitergeleitet. Dein Router muss aber diese Funktion DynDNS auch unterstützen.

Ein update-Token aktualisiert automatisch deine sich täglich ändernde IP. Damit wäre über diese eingerichtete Host-Adresse (url) dein

privater Router erreichbar. Bei entsprechender Portfreigabe bzw. Weiterleitung könnte man also über diese URL zum neuen Rechner gelangen.

Je nach DSL-Anschluss ist diese Art der Anbindung mal besser oder mal schlechter.

Ideal also für erste Gehversuche.

Coffee

Drucke diesen Beitrag