Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Zollbestimmungen
#11
(14.07.2026, 18:02)Manfred Aabye schrieb: Na gut ich ziehe jetzt in den Wald Tongue
GitHub: https://github.com/ManfredAabye/OpenSim-...ural-World

Nice! Worin unterscheidet es sich vom existierenden TreePopulatorModule? Hat das TreePopulatorModule ein Problem von dem ich nicht weiss? ( Ausser dass ich bei mir vergessen hab die default Texturen zu importieren und die Bäume deshalb grau sind, aber das ist mein Problem ). Dann gibt es noch das VegetationModule, das auch irgendwas mit Bäumen und Gras macht. TODO to Self Issue #371: Das zeugs mal genau unter die Lupe nehmen.
[Bild: footert5jul.jpg]
Zitieren
#12
Huhu,

Das Treemodul funktioniert in OS doch absolut überhaupt garnicht, hat es noch nie, oder ich mach was falsch?
Oder gibt es ein neueres das mir entgangen ist, war ja bald ein Jahr völlig inaktiv ausser mal kurz beim Freitag oder mittwoch vorbeizuschauen


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

http://angels-world.nl:8002:Angels-World
Zitieren
#13
Auto Plant 1.14
Neues Inworld Skript in gepanschtem OSSL LSL.
Automatische Größenerkennung.
Es setzt PBR Material.
Raut die Region leicht auf.
Setzt Bäume (Jeder Baum wird dabei um 15 Grad gedreht).
Es fehlt noch: Todholz, Büsche, Steine, Gräser, Farne.

Es sind 3 unterschiedliche Bäume enthalten und es gibt eine Kiste mit Material bei mir.
Fazit: Es ist noch nicht ganz fertig zur Demo ist das aber schon gut genug.

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;
float ROTATION_SCHRITT 15.0;
float AKTUELLE_ROTATION 0.0;

// ===== BAUM-KONFIGURATIONEN =====
list BAUM_HOEHEN = [
    
"European-Beech-tree-A"10.0,
    
"European-Beech-tree-B"10.0,
    
"European-Oak-tree"12.0
];

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

key Terrain_Dirt "9dc31f61-e30b-44bf-91dc-e4f6a8735407";
key Terrain_Grass "20a4e1b3-be0f-45ae-9683-54809ac750f7";
key Terrain_Mountain "ebf2583d-0d94-4066-a684-e39b37fe2f57";
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 getTreeHeight(string treeName)
{
    
integer index llListFindList(BAUM_HOEHEN, [treeName]);
    if (
index != -1)
        return 
llList2Float(BAUM_HOEHENindex 1);
    return 
10.0;
}

rotation getRotation(float grad)
{
    return 
llEuler2Rot(<0.00.0grad DEG_TO_RAD>);
}

// ===== TERRAIN-FUNKTIONEN MIT AUFRAUUNG =====
setTerrain()
{
    
// 1. Texturen setzen (wie gehabt)
    
list textures = [Terrain_DirtTerrain_GrassTerrain_MountainTerrain_Rock];
    
integer types 2// Legacy + PBR
    
osSetTerrainTextures(texturestypes);
    
    
// Fallback für ältere Systeme
    
osSetTerrainTexture(0Terrain_Dirt);
    
osSetTerrainTextureHeight(0TextureLowTextureHigh);
    
osSetTerrainTexture(1Terrain_Grass);
    
osSetTerrainTextureHeight(1TextureLowTextureHigh);
    
osSetTerrainTexture(2Terrain_Mountain);
    
osSetTerrainTextureHeight(2TextureLowTextureHigh);
    
osSetTerrainTexture(3Terrain_Rock);
    
osSetTerrainTextureHeight(3TextureLowTextureHigh);
    
    
// 2. Terrain aufrauen für besseren PBR-Effekt
    // ACHTUNG: llModifyLand benötigt Estate-Manager-Rechte!
    
llModifyLand(LAND_NOISE0); // 0, 1, 2 ,3, 4

    // 3. Terrain aktualisieren
    
osTerrainFlush();
    
    
llOwnerSay("✅ Terrain-Texturen wurden gesetzt und leicht 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 " Rot: " + (string)((integer)AKTUELLE_ROTATION) + "°", <1,1,1>, 1.0);
    
    
integer gIntTreePick = (integer) llFrand(gFltRandMax 1);
    
float fltDoIRez llFrand(1.0);
    
    if (
fltDoIRez gFltPlantProbability
    {
        
string gStrTreeName llGetInventoryName(INVENTORY_OBJECTgIntTreePick);
        
        if (
gStrTreeName != "")
        {
            
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);
            
            
float treeHeight getTreeHeight(gStrTreeName);
            
rotation treeRotation getRotation(AKTUELLE_ROTATION);
            
            
llRezObject(gStrTreeName
                        
llGetPos() + <0.00.0treeHeight>,
                        <
0.00.00.0>,
                        
treeRotation,
                        
0);
            
            
AKTUELLE_ROTATION += ROTATION_SCHRITT;
            if (
AKTUELLE_ROTATION >= 360.0)
                
AKTUELLE_ROTATION -= 360.0;
            
            
llSleep(0.1);
        }
    }
    
    
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 .5;
    
integer count llGetInventoryNumber(INVENTORY_OBJECT);
    
gFltRandMax = (float)count;
    
gIntZ 0;
    
    
gIntRunning TRUE;
    
gIntCurrentX gIntStartX + (PFLANZABSTAND 2);
    
gIntCurrentY gIntStartY + (PFLANZABSTAND 2);
    
AKTUELLE_ROTATION 0.0;
    
    
llOwnerSay("? Starte Pflanzvorgang... Klicke erneut zum Stoppen.");
    
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)
    {
        
// Wenn gerade gepflanzt wird, soll ein Klick den Vorgang stoppen
        
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;
        }
        
        
// Ansonsten: Dialog-Menü anzeigen
        
key toucher llDetectedKey(0);
        
llListenRemove(listenHandle);
        
listenHandle llListen(MENU_CHANNEL""toucher"");
        
llDialog(toucherMENU_TEXTMENU_BUTTONSMENU_CHANNEL);
        
llSetTimerEvent(60.0); // Timeout nach 60 Sekunden
    
}
    
    
listen(integer channelstring namekey idstring message)
    {
        
// Timeout zurücksetzen, da eine Auswahl getroffen wurde
        
llSetTimerEvent(0.0);
        
llListenRemove(listenHandle);
        
        if (
message == "? Pflanzen")
        {
            
llOwnerSay("? Starte Pflanzvorgang...");
            
startPlanting();
        }
        else if (
message == "? Terrain")
        {
            
setTerrain();
            
// Optional: Kurze Bestätigung im Dialog
            
llDialog(id"✅ Terrain-Texturen wurden aktualisiert.", ["OK"], MENU_CHANNEL);
        }
        else if (
message == "❌ Schließen")
        {
            
llOwnerSay("Menü geschlossen.");
        }
        else if (
message == "OK")
        {
            
// Nur für die Bestätigung nach Terrain-Update
            
llOwnerSay("✅ OK.");
        }
    }
    
    
timer()
    {
        
// Timeout: Menü und Listener schließen
        
llSetTimerEvent(0.0);
        
llListenRemove(listenHandle);
        
llOwnerSay("⏳ Menü abgelaufen. Klicke erneut für Optionen.");
        
llSetText("Bereit - Klicke für Menü", <0,1,0>, 1.0);
    }

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
#14
Mal ganz blöd gefragt, was zum henker haben die Zollbestimmungen nun mit OpenSim zutun ? Oder hab ich irgendwas verpasst ? Muss ich nun Zoll bezahlen ?
Zitieren
#15
(17.07.2026, 05:41)Bogus Curry schrieb: Mal ganz blöd gefragt, was zum henker haben die Zollbestimmungen nun mit OpenSim zutun ? Oder hab ich irgendwas verpasst ? Muss ich nun Zoll bezahlen ?

Ist seit dem Wald-Plugin abgedriftet musst dort wohl einen cut machen und in ein entwickler forum schieben Cool
[Bild: footert5jul.jpg]
[-] The following 1 user says Thank You to Akira for this post:
  • Bogus Curry
Zitieren


Gehe zu:


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