Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
(Fast) weiche Bewegung - Tour Skript
#15
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:
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();
          }
       }
    }
Gruß
Zitieren


Nachrichten in diesem Thema
RE: (Fast) weiche Bewegung - Tour Skript - von Cosmic - 20.01.2019, 14:33

Gehe zu:


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