Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Auto Plant Skript
#1
Auto Plant 2.27
Automatisches erstellen von Regionen mit Objekten und Texturen.
Automatische Größenerkennung.
Es setzt 4 Terrain PBR Materialien.
Raut die Region leicht auf.
Setzt Bäume, Büsche, Farne, Todholz, Grass und Steine.

PHP-Code:
// ============================================================
// OPENSIM WALDPFLANZER SKRIPT MIT DIALOG-MENÜ
// ============================================================

// ===== GLOBALE VARIABLEN =====
integer gIntX;
integer gIntY;  
integer gIntZ;

integer gIntStartX;
integer gIntStartY;
integer gIntEndX;
integer gIntEndY;

float gFltPlantProbability;
float gFltRandMax;

// ===== START/STOP-FUNKTION =====
integer gIntRunning FALSE;
key gKeyToucher;
integer gIntCurrentX;
integer gIntCurrentY;

// ===== PFLANZPARAMETER =====
integer PFLANZABSTAND 6;


// ===== KOMBINIERTE LISTE FÜR ALLE OBJEKTE =====
// Format: [Name, Höhe, Priorität, X-Rotation, Y-Rotation, Z-Rotation, Z-Offset]
// Je höher die Priorität, desto wahrscheinlicher wird das Objekt ausgewählt
list ALLE_OBJEKTE = [
    
// Bäume (Priorität 30)
    
"European-Beech-tree-A"10.0300.00.00.00.0,
    
"European-Beech-tree-B"10.0300.00.00.00.0,
    
"European-Oak-tree"12.0300.00.00.00.0,
    
    
// Büsche (Priorität 25)
    
"Buesche-1"3.02590.00.00.0, -2.00,
    
"Buesche-2"3.02590.00.00.0, -2.00,
    
"Buesche-3"3.02590.00.00.0, -2.00,
    
"Buesche-4"3.02590.00.00.0, -2.00,
    
    
// Farne (Priorität 20)
    
"Fern-1"1.22090.00.00.0, -0.70,
    
"Fern-2"1.22090.00.00.0, -0.70,
    
"Fern-3"1.22090.00.00.0, -0.70,
    
"Fern-4"1.22090.00.00.0, -0.70,
    
    
// Todholz (Priorität 15)
    
"Todholz-1"1.5150.00.00.0, -1.30,
    
"Todholz-2"1.5150.00.00.0, -1.30,
    
"Todholz-3"1.5150.00.00.0, -1.30,
    
"Todholz-4"1.5150.00.00.0, -1.30,
    
    
// Gräser (Priorität 15)
    
"Grass-1"0.5150.00.00.0, -0.10,
    
"Grass-2"0.5150.00.00.0, -0.10,
    
"Grass-3"0.5150.00.00.0, -0.10,
    
"Grass-4"0.5150.00.00.0, -0.10,
    
    
// Steine (Priorität 10)
    
"Stone-1"0.8100.00.00.0, -0.40,
    
"Stone-2"0.8100.00.00.0, -0.40,
    
"Stone-3"0.8100.00.00.0, -0.40,
    
"Stone-4"0.8100.00.00.0, -0.40
];

// ===== TERRAIN-TEXTUREN =====
float TextureLow 10.0;
float TextureHigh 30.0;


key Terrain_Dirt "1e78c37b-90a1-40d3-a913-31c965309679";
key Terrain_Grass "a9b4d0d5-5679-4fd5-b9e3-ac4367ea9b95";
key Terrain_Mountain "795204d3-bd28-467c-b526-08b95090841e";
key Terrain_Rock "4b012b05-a357-46af-8e6e-e8a9aa501a8c";

// key Terrain_Dirt = "9dc31f61-e30b-44bf-91dc-e4f6a8735407";
// key Terrain_Grass = "16620c30-5efd-451a-ab10-6fb3e69ad59a";
// key Terrain_Mountain = "5abbc6ef-7cb9-4340-9950-6dc61b21c99c";
// key Terrain_Rock = "429726cd-34e4-4bc9-a669-a94f2f69f11e";


// ===== DIALOG-MENÜ VARIABLEN =====
integer MENU_CHANNEL;
integer listenHandle;
string MENU_TEXT "\nWähle eine Aktion:";
list 
MENU_BUTTONS = ["? Pflanzen""? Terrain""❌ Schließen"];

// ===== HILFSFUNKTIONEN =====
float getObjectHeight(string objectName)
{
    
integer index llListFindList(ALLE_OBJEKTE, [objectName]);
    if (
index != -1)
        return 
llList2Float(ALLE_OBJEKTEindex 1);
    return 
4.0// Fallback-Höhe
}

float getObjectRotationX(string objectName)
{
    
integer index llListFindList(ALLE_OBJEKTE, [objectName]);
    if (
index != -1)
        return 
llList2Float(ALLE_OBJEKTEindex 3);
    return 
0.0// Fallback-Rotation
}

float getObjectRotationY(string objectName)
{
    
integer index llListFindList(ALLE_OBJEKTE, [objectName]);
    if (
index != -1)
        return 
llList2Float(ALLE_OBJEKTEindex 4);
    return 
0.0// Fallback-Rotation
}

float getObjectRotationZ(string objectName)
{
    
integer index llListFindList(ALLE_OBJEKTE, [objectName]);
    if (
index != -1)
        return 
llList2Float(ALLE_OBJEKTEindex 5);
    return 
0.0// Fallback-Rotation
}

float getObjectZOffset(string objectName)
{
    
integer index llListFindList(ALLE_OBJEKTE, [objectName]);
    if (
index != -1)
        return 
llList2Float(ALLE_OBJEKTEindex 6);
    return 
0.0// Fallback-Z-Offset
}

rotation getRotation(float gradXfloat gradYfloat gradZ)
{
    return 
llEuler2Rot(<gradX DEG_TO_RADgradY DEG_TO_RADgradZ DEG_TO_RAD>);
}

// ===== TERRAIN-FUNKTIONEN =====
setTerrain()
{
    list 
textures = [Terrain_DirtTerrain_GrassTerrain_MountainTerrain_Rock];
    
integer types 2;
    
osSetTerrainTextures(texturestypes);
    
    
osSetTerrainTexture(0Terrain_Dirt);
    
osSetTerrainTextureHeight(0TextureLowTextureHigh);
    
osSetTerrainTexture(1Terrain_Grass);
    
osSetTerrainTextureHeight(1TextureLowTextureHigh);
    
osSetTerrainTexture(2Terrain_Mountain);
    
osSetTerrainTextureHeight(2TextureLowTextureHigh);
    
osSetTerrainTexture(3Terrain_Rock);
    
osSetTerrainTextureHeight(3TextureLowTextureHigh);
    
    
llModifyLand(LAND_NOISE0);
    
osTerrainFlush();
    
    
llOwnerSay("✅ Terrain-Texturen wurden gesetzt und aufgeraut!");
}

// ===== PFLANZEN-FUNKTIONEN =====
plantOneTree()
{
    if (!
gIntRunning) return;
    
    if (
gIntCurrentX >= gIntEndX || gIntCurrentY >= gIntEndY)
    {
        
gIntRunning FALSE;
        
llOwnerSay("✅ Pflanzvorgang abgeschlossen!");
        
llSetText("Fertig - Klicke für neues Menü", <0,1,0>, 1.0);
        
llSetTimerEvent(0.0);
        return;
    }
    
    
gIntX gIntCurrentX;
    
gIntY gIntCurrentY;
    
    
llSetRegionPos(<gIntXgIntYgIntZ>);
    
llSetText("X: " + (string)gIntX " Y: " + (string)gIntY, <1,1,1>, 1.0);
    
    
// 1. Zufällig entscheiden, ob überhaupt etwas gepflanzt wird
    
float fltDoIRez llFrand(1.0);
    if (
fltDoIRez >= gFltPlantProbability
    {
        
gIntCurrentY += PFLANZABSTAND;
        if (
gIntCurrentY >= gIntEndY)
        {
            
gIntCurrentY gIntStartY + (PFLANZABSTAND 2);
            
gIntCurrentX += PFLANZABSTAND;
        }
        return;
    }
    
    
// ===== GEWICHTETE AUSWAHL MIT ÜBERSPRINGEN FEHLENDER OBJEKTE =====
    
    // 1. Liste der verfügbaren Objekte erstellen (nur die, die im Inventar sind)
    
list verfuegbareObjekte = [];
    
integer listLength llGetListLength(ALLE_OBJEKTE) / 7;
    
integer i;
    
    for (
0listLengthi++)
    {
        
string objName llList2String(ALLE_OBJEKTE7);
        
// Prüfen, ob Objekt im Inventar existiert
        
if (llGetInventoryType(objName) == INVENTORY_OBJECT)
        {
            
float objHeight llList2Float(ALLE_OBJEKTE, (7) + 1);
            
integer objPriority llList2Integer(ALLE_OBJEKTE, (7) + 2);
            
float objRotationX llList2Float(ALLE_OBJEKTE, (7) + 3);
            
float objRotationY llList2Float(ALLE_OBJEKTE, (7) + 4);
            
float objRotationZ llList2Float(ALLE_OBJEKTE, (7) + 5);
            
float objZOffset llList2Float(ALLE_OBJEKTE, (7) + 6);
            
verfuegbareObjekte += [objNameobjHeightobjPriorityobjRotationXobjRotationYobjRotationZobjZOffset];
        }
        
// Wenn nicht im Inventar: einfach überspringen
    
}
    
    
// Falls keine Objekte verfügbar sind
    
if (llGetListLength(verfuegbareObjekte) == 0)
    {
        
llOwnerSay("⚠️ Keine Objekte im Inventar gefunden!");
        
gIntRunning FALSE;
        
llSetTimerEvent(0.0);
        return;
    }
    
    
// 2. Gesamtgewicht der verfügbaren Objekte berechnen
    
integer availableCount llGetListLength(verfuegbareObjekte) / 7;
    
integer totalWeight 0;
    for (
0availableCounti++)
    {
        
totalWeight += llList2Integer(verfuegbareObjekte, (7) + 2);
    }
    
    
// 3. Zufällige Auswahl basierend auf Gewicht
    
integer randomWeight = (integer)llFrand(totalWeight);
    
integer selectedIndex 0;
    
integer cumulativeWeight 0;
    
    for (
0availableCounti++)
    {
        
integer priority llList2Integer(verfuegbareObjekte, (7) + 2);
        
cumulativeWeight += priority;
        if (
randomWeight cumulativeWeight)
        {
            
selectedIndex i;
            
availableCount// Schleife manuell beenden (statt break)
        
}
    }
    
    
// 4. Objekt auswählen und pflanzen
    
string gStrObjectName llList2String(verfuegbareObjekteselectedIndex 7);
    
float objectHeight llList2Float(verfuegbareObjekte, (selectedIndex 7) + 1);
    
float rotationX llList2Float(verfuegbareObjekte, (selectedIndex 7) + 3);
    
float rotationY llList2Float(verfuegbareObjekte, (selectedIndex 7) + 4);
    
float rotationZ llList2Float(verfuegbareObjekte, (selectedIndex 7) + 5);
    
float zOffset llList2Float(verfuegbareObjekte, (selectedIndex 7) + 6);
    
    
// Position und Rotation setzen
    
vector vecNowPos llGetPos();
    
float fltLandHeight osGetTerrainHeight((integer)vecNowPos.x, (integer)vecNowPos.y);
    
    
integer intNewX = (integer)vecNowPos.x;
    
integer intNewY = (integer)vecNowPos.y;
    
integer intNewZ = (integer)fltLandHeight;
    
    
vecNowPos = <intNewXintNewYintNewZ>;
    
llSetRegionPos(vecNowPos);
    
    
// Rotation basierend auf Objekt-Einstellungen
    
rotation objectRotation getRotation(rotationXrotationYrotationZ);
    
    
// Objekt rezzieren mit Höhenanpassung
    
llRezObject(gStrObjectName
                
llGetPos() + <0.00.0objectHeight zOffset>,
                <
0.00.00.0>,
                
objectRotation,
                
0);
    
llModifyLand(LAND_NOISE0); // Dabei direkt das Terrain aufrauhen.
    
llSleep(0.1);
    
    
// Debug-Ausgabe (optional - auskommentieren wenn nicht benötigt)
    // llOwnerSay("? " + gStrObjectName + " | X-Rot: " + (string)rotationX + "° | Y-Rot: " + (string)rotationY + "° | Z-Rot: " + (string)rotationZ + "° | Z-Off: " + (string)zOffset);
    
    // Zur nächsten Position
    
gIntCurrentY += PFLANZABSTAND;
    if (
gIntCurrentY >= gIntEndY)
    {
        
gIntCurrentY gIntStartY + (PFLANZABSTAND 2);
        
gIntCurrentX += PFLANZABSTAND;
    }
}

startPlanting()
{
    
vector regionSize osGetRegionSize();
    
gIntStartX 0;
    
gIntStartY 0;
    
gIntEndX = (integer)regionSize.x;
    
gIntEndY = (integer)regionSize.y;
    
    
gFltPlantProbability .7// 70% Wahrscheinlichkeit für Bewuchs
    
gIntZ 0;
    
    
gIntRunning TRUE;
    
gIntCurrentX gIntStartX + (PFLANZABSTAND 2);
    
gIntCurrentY gIntStartY + (PFLANZABSTAND 2);
    
    
// Anzahl der verfügbaren Objekte zählen
    
integer availableCount 0;
    
integer listLength llGetListLength(ALLE_OBJEKTE) / 7;
    
integer i;
    for (
0listLengthi++)
    {
        
string objName llList2String(ALLE_OBJEKTE7);
        if (
llGetInventoryType(objName) == INVENTORY_OBJECT)
            
availableCount++;
    }
    
    
llOwnerSay("? Starte Pflanzvorgang mit " + (string)availableCount " verfügbaren Objekten...");
    
llSetText("? Pflanze... Klicke zum Stoppen", <1,1,0>, 1.0);
    
    
llSetTimerEvent(2.0);
}

// ===== HAUPTTEIL DES SKRIPTS =====
default
{
    
state_entry()
    {
        
MENU_CHANNEL = -- (integer)("0x" llGetSubString((string)llGetKey(), -7, -1));
        
llOwnerSay("? Waldpflanzer bereit. Klicke für Menü.");
        
llSetText("Bereit - Klicke für Menü", <0,1,0>, 1.0);
        
llSetTimerEvent(0.0);
    }
    
    
touch_start(integer num_detected)
    {
        if (
gIntRunning)
        {
            
gIntRunning FALSE;
            
llSetTimerEvent(0.0);
            
llListenRemove(listenHandle);
            
llOwnerSay("⏹️ Pflanzvorgang wurde gestoppt!");
            
llSetText("Gestoppt - Klicke für neues Menü", <1,0,0>, 1.0);
            return;
        }
        
        
key toucher llDetectedKey(0);
        
llListenRemove(listenHandle);
        
listenHandle llListen(MENU_CHANNEL""toucher"");
        
llDialog(toucherMENU_TEXTMENU_BUTTONSMENU_CHANNEL);
        
llSetTimerEvent(60.0);
    }
    
    
listen(integer channelstring namekey idstring message)
    {
        
llSetTimerEvent(0.0);
        
llListenRemove(listenHandle);
        
        if (
message == "? Pflanzen")
        {
            
llOwnerSay("? Starte Pflanzvorgang...");
            
startPlanting();
        }
        else if (
message == "? Terrain")
        {
            
setTerrain();
            
llDialog(id"✅ Terrain-Texturen wurden aktualisiert.", ["OK"], MENU_CHANNEL);
        }
        else if (
message == "❌ Schließen")
        {
            
llOwnerSay("Menü geschlossen.");
        }
        else if (
message == "OK")
        {
            
llOwnerSay("✅ OK.");
        }
    }
    
    
timer()
    {
        if (
gIntRunning)
        {
            
plantOneTree();
        }
        else
        {
            
llSetTimerEvent(0.0);
        }
    }


Fazit: Es wird ein Zufallswald erstellt und ist noch nicht ganz fertig, zur Demo ist das aber schon gut genug.
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



[-] The following 5 users say Thank You to Manfred Aabye for this post:
  • Akira, Bogus Curry, Ezry Aldrin, Leora Jacobus, Mareta Dagostino
Zitieren
#2
Huhu,

klingt extrem interessant, nur wie und wo soll ich das Script starten?, oder kann man etwa inworld einfach so
ein PHP Script starten?

Denn alles einzeln zu machen ist bei Grössen von 1024 oder mehr einfach zuviel Arbeit.
Ich war leider sehr lang inaktiv, wenn also was neues gekommen ist für OS, habe ich das schlicht nicht mitbekommen.
Oder bezieht sich das auf das was du bei den Zollbestimmungen gepostet hast, dann muesste ich nur wissen wie ich das ans laufen bekomme.


lg
Ezry
Nichts im Leben ist ein Muss!!!!!!!!!!!..............Alles ein Kann!!!

http://angels-world.nl:8002:Angels-World
Zitieren
#3
Das OSSL Skript kommt auf einer Region in einen Würfel und dazu Bäume, Büsche, Farne, Todholz, Grass und Steine sowie die Terraintexturen einfügen.
Anklicken, dann erscheint ein Menü, dort hat man die Auswahl zwischen Pflanzen und Terrain.
Fehlende Bäume, Büsche, Farne, Todholz, Grass und Steine werden ignoriert.
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



[-] The following 2 users say Thank You to Manfred Aabye for this post:
  • Dorena Verne, Ezry Aldrin
Zitieren
#4
Huhu

leider bekomme ich die Fehlermeldung

(140,4) Error: undefined constant/function/variable osSetTerrainTextures(list,integer)

Beim click auf den Fehler springt der in diese Zeile

osSetTerrainTextures(textures, types);

Mach ich irgendwas verkehrt? Habe das Script gespeichert und in den Würfel geworfen, dazu Bäume und die Tarraintexturen und mehr nicht

lg
Ezry
Nichts im Leben ist ein Muss!!!!!!!!!!!..............Alles ein Kann!!!

http://angels-world.nl:8002:Angels-World
Zitieren
#5
Dir fehlen die Materialien und Texturen.
Suche dir 4 Materialien aus deinem Inventar aus.
Rechte Maustaste und kopiere UUID.
Füge diese ins Skript ein.

PHP-Code:
...
key Terrain_Dirt "1e78c37b-90a1-40d3-a913-31c965309679";
key Terrain_Grass "a9b4d0d5-5679-4fd5-b9e3-ac4367ea9b95";
key Terrain_Mountain "795204d3-bd28-467c-b526-08b95090841e";
key Terrain_Rock "4b012b05-a357-46af-8e6e-e8a9aa501a8c";
... 
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



[-] The following 1 user says Thank You to Manfred Aabye for this post:
  • Ezry Aldrin
Zitieren
#6
Huhu

Habe ich gemacht, der Fehler bleibt der Gleiche, langsam fehlt mir die Idee, die Texturen liegen sogar auf der Region auf und dennoch Fehler

Ich schau Morgen nochmal in Ruhe vielleicht seh ich den Fehler jetzt nicht. Mir wäre das Modul lieber, wenn es ans laufen zu bringen ist, leider jedoch habe ich diese UUIDs nicht die in die C# Datei rein muss, nur die von den Grundtexturen habe ich schon eingetragen. besitze einfach kein trockenes Gras. Einige B#ume habe ich schon aber mit Gras Farn usw sieht es Mau aus, da habe ich nur das was du ueber das Baumenu aufrufen kannst, da konnte ich zumindest die UUID vom Farn eintragen und das sieht ja fuer Simintern nicht schlecht aus. Hast du irgendwo auch eine Region laufen, das man sich das normalerweise funktionierende Ergebnis mal ansehen kann?

lg
Ezry
Nichts im Leben ist ein Muss!!!!!!!!!!!..............Alles ein Kann!!!

http://angels-world.nl:8002:Angels-World
Zitieren
#7
Ich habe das Komplettpaket in OSGrid in der Wright Plaza Mall auf Wright Plaza (158, 33, 21) in meinen Shop gestellt.
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



Zitieren
#8
Danke Manfred, ich war dort. Die Box ist allerdings weder zu Kopieren noch zu "Kaufen". Nur den Content könnte ich einzeln rauspflücken. Ist das so gedacht?

Und möglicherweise eine Frage, deren Antwort für dich selbstverständlich ist, und ich oute mich jetzt als total unwissend: Wie verhält es sich mit den Pflanzen, Felsen, Texturen, wenn ich das in einem anderen Grid rezzen will, und das Script nur auf GUIDs verweist, ohne die Objekte im Content dabei zu haben?

-----------
(EDIT: Ich hatte versehentlich URL statt GUID geschrieben.)
[-] The following 1 user says Thank You to Mareta Dagostino for this post:
  • Bogus Curry
Zitieren
#9
Es sind 2 Boxen in dieser Box, eine ist Auto-Plant und die andere Texturen.
Stelle die Texturen in dein Grid und kopiere diese Box. (Jetzt sind die Texturen in deinem Grid)
Arbeite mit deinen in deinem Grid kopierten Boxen nicht mit der Box, die du aus fremden Grids kopiert hast.
Die Materialien kopierst du in dein Inventar unter Materialien, die Texturen unter Texturen so hast du kompletten zugriff darauf.

Die Objekte sind im Würfel "Auto Plant 2.27", die Texturen im anderen Würfel.

Kopierproblem behoben.
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.



Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  skript für opensim gesucht hajo drechsler 3 1.239 18.12.2025, 15:47
Letzter Beitrag: hajo drechsler
  Skript stoppt bei Neustart und Daten weg Manfred Aabye 0 718 16.11.2025, 13:43
Letzter Beitrag: Manfred Aabye
  ATM Money Skript LSL Manfred Aabye 0 1.928 03.11.2024, 14:29
Letzter Beitrag: Manfred Aabye
  Secure Skript Manfred Aabye 6 6.383 26.04.2022, 18:51
Letzter Beitrag: Manfred Aabye
  YEngine Skript Restart Manfred Aabye 6 5.708 15.03.2022, 12:43
Letzter Beitrag: Manfred Aabye

Gehe zu:


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