• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

[Lib] Weg/Ziel für Objekt prüfen

E

Ezian Ecksol

Guest
2 Funktionen, die nützlich sind, wenn man ein Objekt an eine andere Stelle in der Sim schicken möchte. Egal ob für physische oder nicht-physische Objekte, Vehikel oder Transporter, stellt sich je nach Anwendung manchmal die Frage, ob das Ziel überhaupt erreichbar ist.



Diese kleine Funze prüft, ob auf dem Weg von hier zum Ziel Noscrript-Parcel liegen würden.

Code:
integer isWayOk(vector src, vector dest) {
    integer r;
    float f;
    vector d = dest-src;
    float dm = llVecMag(d);
    for (f=2.;f<dm;f+=2.) 
        r+= !(llGetParcelFlags(src+d*f/dm) & PARCEL_FLAG_ALLOW_SCRIPTS);
    return !r;
}

Diesen Codeschnipsel habe ich mal in irgendeinem Wiki gefunden, nützlich um zu testen, ob man, um von "here" nach "there" zu gelangen, dabei versehentlich durch off-world fliegen würde.

Code:
integer wouldGoOffWorld(vector here, vector there)
{
    if (there.x < 0 || there.x > 256 || there.y < 0 || there.y > 256)
    {
        return llEdgeOfWorld(here, there - here);
    }
    else
    {
        return FALSE;
    }
}

Wenn jemand noch so nützliche kleine Funzen hätte für ähnliche Zwecke, wäre hier der richtige Platz :)
 
fuer einen kleinen Putzroboter, an dem ich gerade bastle, von dem ich irgendwann gern haette, dass er ueber unsere Parzelle wuselt, hab ich eine kleine Funktion schreiben muessen, die ihn innerhalb der Parzellengrenzen haelt. in der Sprache der vorher benannten Skripte ginge die ungefaehr so:

Code:
integer aufDerParzelle(vector ziel)
{
    integer grenze_N = 123;
    integer grenze_S = 23;
    integer grenze_O = 123;
    integer grenze_W = 12;
    if(ziel.x > grenze_W && ziel.x < grenze_O && ziel.y > grenze_S && ziel.y < grenze_N) return 1;     
    else return 0;
}
ja, die Nord-, Sued-, Ost- und Westgrenze muss ich "manuell" ins Skript einfuegen.

ich lass mich gern belehren, das cleverer zu schreiben ;)
 
Jo, auch schön. Eine unwesentliche Vereinfachung wäre noch, statt dem if-else am Ende einfach:

return (ziel.x > grenze_W && ziel.x < grenze_O && ziel.y > grenze_S && ziel.y < grenze_N);

zu schreiben.
 
Hmm das Script hat ja jetzt noch den Nachteil das es nur auf deiner Parcelle funktioniert, weil du die Koordinaten von Hand eingegeben hast.

Ich hab sowas zwar noch nicht geschrieben aber könnte so klappen:

llGetParcelDetails

damit sollte sich zumindest die qm auslesen können und dann evtl mit llGetPos oder llGetRegionCorner weiter machen.

Gibt es aber sicherlich schon fertig, denke da gerade an so gescriptete Haustiere die auf dem Grundstück rumlaufen.
 
Ich habe doch mal in irgendeinem anderen Script eine "automatische Parcelerkennung" eingebaut, fällt mir grade ein.

Da ist sie: getparcelbounds(). Am Ende der Funktion sind dann die Maße des Parcels bekannt, auf denen man grade steht:

Code:
vector parcel0; vector parcel1;
vector parcel_center; vector parcel_size;

string getparcelname(vector p) {
    return llList2String(llGetParcelDetails(p, [PARCEL_DETAILS_NAME]),0);
}

getparcelbounds() {
    vector pos = llGetPos();
    vector rpos;
    pos = <llRound(pos.x), llRound(pos.y), 0.>;
    string name = getparcelname(pos);
   
    rpos = pos;
    do { rpos.x -= 1.; } while ((getparcelname(rpos) == name) && (rpos.x>=0.));   
    parcel0.x = rpos.x + 1.;
    
    rpos = pos;
    do { rpos.y -= 1.; } while ((getparcelname(rpos) == name) && (rpos.y>=0.));    
    parcel0.y = rpos.y + 1.;
    
    rpos = pos;
    do { rpos.x += 1.; } while ((getparcelname(rpos) == name) && (rpos.x<256.));   
    parcel1.x = rpos.x;
    
    rpos = pos;
    do { rpos.y += 1.; } while ((getparcelname(rpos) == name) && (rpos.y<256.));   
    parcel1.y = rpos.y;
   
    parcel_center = (parcel1 + parcel0) / 2.;
    parcel_size = parcel1 - parcel0;

   // in parcel0 steht jetzt die linke, untere Ecke des Parcel
   // in parcel1 steht jetzt die rechte, obere Ecke des Parcel
   // in parcel_center steht jetzt der Mittelpunkt des Parcels
   // in parcel_size die Größe

}
 

Users who are viewing this thread

Zurück
Oben Unten