Hallöschen,
habe heute morgen opensim-0.9.0.1 im standalone Modus mit SQLite installiert.
in der Opensim.ini habe ich angepasst:
Allow_osGetRegionStats = true
AllowOSFunctions = true
osslEnable.ini
Allow_osSetPrimitiveParams = true
Ich habe das modifizierte Script von Rebekka eingesetzt und mit ihrem Extra Script eine neue Notecard erstellt. Das Script wird abgearbeitet, zwar mit ein paar Drehungen des objects um die waagrechte Achse, die so mit dem Notecard Script nicht eingeben wurden, ansonsten scheinbar fehlerfrei.
Mein altes Script mit Modifikation läßt nach dem Wegepunkte lesen und touch, das object zum Startpunkt springen. Nach dem Anschubsen über Bearbeiten gleitet es auf dem Boden ganz langsam zu Simrand und bleibt stehen.
hier füge ich mal den bei mir eingesetzten unmodifizierten Code an:
Gruß
habe heute morgen opensim-0.9.0.1 im standalone Modus mit SQLite installiert.
in der Opensim.ini habe ich angepasst:
Allow_osGetRegionStats = true
AllowOSFunctions = true
osslEnable.ini
Allow_osSetPrimitiveParams = true
Ich habe das modifizierte Script von Rebekka eingesetzt und mit ihrem Extra Script eine neue Notecard erstellt. Das Script wird abgearbeitet, zwar mit ein paar Drehungen des objects um die waagrechte Achse, die so mit dem Notecard Script nicht eingeben wurden, ansonsten scheinbar fehlerfrei.
Mein altes Script mit Modifikation läßt nach dem Wegepunkte lesen und touch, das object zum Startpunkt springen. Nach dem Anschubsen über Bearbeiten gleitet es auf dem Boden ganz langsam zu Simrand und bleibt stehen.
hier füge ich mal den bei mir eingesetzten unmodifizierten Code an:
Code:
osWarpPos (key id, vector destpos ) {
vector primPos = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
integer jumps = (integer)(llVecDist(destpos, primPos) / 0.3) + 1;
// Try and avoid stack/heap collisions
if (jumps > 411)
jumps = 411;
list rules = [ PRIM_POSITION, destpos ]; //The start for the rules list
integer count = 1;
while ( ( count = count << 1 ) < jumps)
rules = [] + rules + rules; //should tighten memory use.
osSetPrimitiveParams(id, rules + llList2List( rules, (count - jumps) << 1, count) );
vector primPos2 = llList2Vector(osGetPrimitiveParams(id, [PRIM_POSITION]), 0);
if ( llVecDist( primPos2, destpos ) > .001 ) //Failsafe
while ( --jumps )
osSetPrimitiveParams(id, [PRIM_POSITION, destpos]);
}
vector SF_spos; //start position
rotation SF_srot; //starting rotation
float SF_stime; //starting time
vector SF_epos; //ending position
rotation SF_erot; //ending rotation
float SF_seconds; //time to move that distance
integer SF_target=-1; //handle of last target position
integer continuous=0; //loop back through path
SFrame()
{
SF_spos=llGetPos();
SF_stime=llGetTime();
SF_epos = llList2Vector(Points, Count);
SF_seconds=llVecDist(SF_epos, llGetPos()) / TIME;
llTargetRemove(SF_target);
SF_target=llTarget(SF_epos, 0.1);
}
integer SFnotat()
{
if (SF_target== -1) return TRUE;
float time=llGetTime();
time = (time-SF_stime)/SF_seconds;
if (time>1.0)
{
llTargetRemove(SF_target);
SF_target=-1;
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,SF_epos]);
return TRUE;
}
float emit= 1.0-time;
vector pos=SF_epos*time+SF_spos*emit;
vector v = <0.0, 0.0, 1.0>;
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,pos]);
return FALSE;
}
// ab hier hab ich das geschrieben :-)
// Mach dir eine Notecard mit den folgenden Einträgen
// Gross/Kleinschreibung ist nicht wichtig, also DRIVE ist genauso gut wie drive oder Drive
// DRIVE = Position = Rotation die Wegpunkte eben, mit Position und Rotation
// nach dem Wegpunkt (muss aber nicht sein)
// PAUSE = Sekunden hält das Objekt ne Weile an
// TEXT = text sagt den Text im Chat
// now that's my part :-)
// Make a notecard with the folling entries
// it's not case sensitive, for example drive is accepted as DRIVE or Drive
// DRIVE = Position = Rotation the waypoints with given params
// after the waypoint (optionally but but not required)
// PAUSE = seconds makes the object to stay for a while
// TEXT = text says the text in chat
// wie es oben steht, die Schlüsselwörter
// as above, the keywords
string DRIVE = "drive";
string PAUSE = "pause";
string TEXT = "text";
// Name der Notecard
// name of the notecard
string NCNAME = "config";
// Trennzeichen für die Schlüsselwörter
// separator for keywords
string SEPARATOR = "=";
// wie schnell sich das Objekt bewegt
// 1 ist ungefähr 1 Meter pro Sekunde
// Grösser = schneller, aber auch mehr ruckeln
// how fast your object will move
// 1 means appr. 1 m per second
// a greater number ist faster but less smoothly
float TIME = 1.0;
// Stell es auf TRUE, dann kommen Infos im Chat über die Wegpunkte
// set it to TRUE to get informations about the waypoints in chat
integer DEBUG = FALSE;
// Wähle die Sprache, ich kann nur die beiden unten sprechen
// 0 = deutsch, 1 = englisch
// choose language, I speak only the two below
// 0 for german, 1 for english
integer LANGUAGE = 0;
list Points;
list Rots;
list Pause;
list Text;
integer NCLine;
key NCid;
integer Count;
// liest ein Zeile aus der Notecard und speichert sie
// reads a notecard line and saves it
Read(string data)
{
list l = llParseString2List(data, [SEPARATOR], []);
string s1 = llToLower(llStringTrim(llList2String(l, 0), STRING_TRIM));
vector v1 = (vector)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM));
rotation r1 = (rotation)llToLower(llStringTrim(llList2String(l, 2), STRING_TRIM));
integer x;
if(s1 == DRIVE)
{
if(v1 != ZERO_VECTOR)
{
Points += [v1];
Rots += [r1];
Pause += [0];
Text += [""];
}
} else if(s1 == PAUSE)
{
x = llGetListLength(Pause) - 1;
Pause = llListReplaceList(Pause, [(float)llToLower(llStringTrim(llList2String(l, 1), STRING_TRIM))], x, x);
} else if(s1 == TEXT)
{
x = llSubStringIndex(data, SEPARATOR);
data = llDeleteSubString(data, 0, x);
x = llGetListLength(Text) - 1;
Text = llListReplaceList(Text, [llStringTrim(data, STRING_TRIM)], x, x);
}
}
// Sagt was in der Notecard steht (TEXT = text), ohne den Objektnamen
// es muss aber ein Leerzeichen drin sein und mindestens zwei Wörter haben
// sonst kommt nur der normale Chat mit dem Objektnamen
// says what you wrote in the notecard (TEXT = text) without the object name
// it has to be a space in it and at least two words
// otherwise you'll get only the normal chat with the object name
Say(string s)
{
string s1 = llGetObjectName();
integer x = llSubStringIndex(s, " ");
if(x != -1)
{
string s2 = llGetSubString(s, 0, x - 1);
s = llDeleteSubString(s, 0, x -1);
s = "/me" + s;
llSetObjectName(s2);
}
llSay(0, s);
llSetObjectName(s1);
}
default
{
on_rez (integer start_param) {
llResetScript();
}
state_entry()
{
llSetText("", <1,1,1>, 1.0);
Points = [];
Rots = [];
Pause = [];
Text = [];
if(llGetInventoryType(NCNAME) == INVENTORY_NONE)
{
if(LANGUAGE == 0) llOwnerSay("Keine config-NC gefunden.");
else if(LANGUAGE == 1) llOwnerSay("No config nc found.");
} else
{
if(LANGUAGE == 0) llOwnerSay("Lese config, bitte warten...");
else if(LANGUAGE == 1) llOwnerSay("Reading config nc, please wait...");
NCLine = 0;
NCid = llGetNotecardLine(NCNAME, NCLine++);
}
}
dataserver(key requested, string data)
{
if(requested == NCid)
{
if(data != EOF)
{
Read(data);
NCid = llGetNotecardLine(NCNAME, NCLine++);
} else
{
if(LANGUAGE == 0) llOwnerSay("Fertig.");
else if(LANGUAGE == 1) llOwnerSay("Ready.");
if(llGetListLength(Points) == 0)
{
if(LANGUAGE == 0) llOwnerSay("Keine Wegpunkte gefunden.");
else if(LANGUAGE == 1) llOwnerSay("No waypoints found.");
}
else
{
if(LANGUAGE == 0) llOwnerSay((string)llGetListLength(Points) + " Wegpunkte gelesen.");
else if(LANGUAGE == 1) llOwnerSay((string)llGetListLength(Points) + " waypoints read.");
state running;
}
}
}
}
}
state running
{
state_entry()
{
if(continuous == 1) {
state drive;
}
}
touch_start(integer total_number)
{
continuous = 1;
list homeList = llParseString2List(osGetNotecardLine("config", 0), "=", "");
vector homePos = llList2Vector(homeList,1);
osWarpPos(llGetKey(), homePos);
llSleep(2.0);
state drive;
}
}
state drive
{
state_entry()
{
llSetText("", <1,1,1>, 1.0);
Count = 0;
SFrame();
}
changed (integer change) {
if (change & CHANGED_REGION_START) {
SFrame();
}
}
not_at_target()
{
if(SFnotat())
{
if(DEBUG)
{
if(LANGUAGE == 0) llOwnerSay("Wegpunkt Nr. " + (string)(Count + 1) + " bei " + (string)llList2Vector(Points, Count));
else if(LANGUAGE == 1) llOwnerSay("waypoint no. " + (string)(Count + 1) + " at " + (string)llList2Vector(Points, Count));
}
if(llList2String(Text, Count) != "") Say(llList2String(Text, Count));
if(llList2Float(Pause, Count) > 0) llSleep(llList2Float(Pause, Count));
rotation newRot = llList2Rot(Rots, Count);
llSetRot(newRot); //Do the Rotation...
Count++;
if(Count == llGetListLength(Points)) state running;
SFrame();
}
}
}