Jump to content

Donovan Michalski

Resident
  • Posts

    303
  • Joined

  • Last visited

Posts posted by Donovan Michalski

  1. On 1/14/2024 at 3:42 AM, Midnoot said:

    I've also had people attempt to befriend my own friends in attempts to pit them against me... HMMMM, it's all coming back.. Maybe SL IS more toxic than other games... Especially when the people doing these things are intelligent enough to fly under the radar of oblivious sim owners and moderators while they wreak havok. You'd be surprised how many times it happens.

    I think this is a good example of the particular type of "toxic" that's so common and destructive here when compared to other games.

    Rather than outright aggression, it tends to be more manipulative.  Sure, direct attacks are still mixed in from time to time, but it's the quiet whispers in the background that often lead to things spiraling out of control.  

    • Like 3
    • Thanks 1
  2. Here's another Blake for the thread.

    Body, head, and clothing are all from the Blake folder;  skin, eyes, and hair are from elsewhere in my inventory.  The skin is actually from a place that has its own group of male mesh avatars and somewhere around 30+ skins all available for 1L each, so that made it pretty easy to find something to use since most of my current skins are for either a catwa or LeL head and wouldn't have worked right on this one.  

    Blake.jpg

    • Like 15
    • Thanks 2
  3. I've had to combat the effects of one particular HUD of this type myself.

    The two most sure-fire ways we've found are:

    1.  Require the driver to be 100% script-free while using the vehicle.  This can be checked in the vehicle script - if at any point it detects an active script attached to the avatar, the vehicle stops working. (Alternatively, if the vehicle requires a hud of its own or you want to allow a specific scripted attachment, adjust the number of attached scripts the vehicle will allow, but also have the vehicle communicate with that script to verify it is the allowed one before operation continues).

    2.  Require all participants to use vehicles that come from a rezzer, rather than their own personal copy.  Since the rezzer vehicle has a different owner, the HUD is unable to affect it.

     

    The HUD in question does have a detector, but it only works because the HUD creator scripted it specifically to announce itself on use.  If someone were to use similar methods to create a similar device, you wouldn't be able to detect it directly.  You'd likely have to use calculation-based methods as already described in the thread here.

    • Thanks 1
  4. On 11/29/2022 at 2:58 AM, animats said:

    M's R&D on Robin Loop in Neumogen hsa some nice newer vehicles. Try the newer ones with the purple demo rezzers on the ground. I just drove the demo Honda S800 all the way around Heterocera without problems. The motor scooter is fun, but not as stable as the S800. Plus some unusual vehicles, including a rickshaw.

    True, but today there's no shortage of vehicles that can stay on the road and get you some place.

    I'll second the M's R&D recommendation - Myuki's cars got me into mainland driving in the first place.

    While I'm here, I should also point out to those of you reading this that are into motorcycles, animats has one that's pretty much the gold standard when it comes to mainland riding.

     

    Snapshot_012.png

    • Like 1
    • Thanks 1
  5. 11 hours ago, Orwar said:

       They've got a flipping Volvo V70 (Lusch's Nordic), doesn't get more eye candy-er than that!

       Also, as the EXP Super 80 is now out on the market I can strongly recommend giving it a whirl. By far my favourite car in SL to date.

    The Super 80 is a fun car, no doubt.  I recommend it to everyone just because of how well-made and unique it is.

     

  6. It's Carmonair Speed Week at LC Racing Circuits as we lead up to the 5th running of the Carmonair 500!  All listed events below are FREE TO JOIN, and the cars are available at the track!

    Wednesday @ 1:00 & 6:00 PM PST
    - 1990's Stock Cars (Hosted by Aaron Robins)

    Friday @ 1:00 PM PST
    - Stock Car Pickup Trucks (Hosted by Kandy Tomorrow)

    Saturday @ 6:00 PM PST
    - 5th Running of the Carmonair 500 (Hosted by Luke Carmona and Kristina Curtau)

    Contact any of the above names if you have questions!

    SLURL to Carmonair Speedway

    Snapshot_002.thumb.png.57d6601db7cd48ff382cfe889f099e4b.png

     

  7. Finally made the 'big' change - switching mesh heads from the Catwa Daniel I'd been using for years to the LeLutka Logan that's been sitting unused in my inventory for months.  After a lot of editing, re-editing, trying out skin demos, buying skins, buying MORE skins, then picking up add-on eyebrows to go with a no-brow skin because I preferred the brows from one on the skin of the other...I think I'm done.  For now.  🤣

    Don_Pic.jpg

    • Like 29
  8. Picked up the Legacy male body earlier in the week.  I'm liking it so far, no complaints on my end.  I made a few small adjustments to my shape (as I had been using Gianni before), and I'm sure I'll continue to tweak it for a while.  

    I've been in that stage for a while now where I'm happy with the overall look of my av, and I don't make major changes very often, which is a relief to my wallet.  🤣

    Don22_16x10.jpg

    • Like 29
    • Thanks 1
  9. 9 minutes ago, CalypsoJewel said:

    Some people on SL take some things a bit seriously, and some are probably stuck on the "furry" stigma even for animal avatars.

    This was my first thought as well.  I've met/known a lot of people who view just about everything in SL through the lens of "adult" activities, and many of them were very creeped out by anyone with an avatar that was anything but "adult human".  🤨

    • Like 4
    • Thanks 1
  10. 1 hour ago, SarahKB7 Koskinen said:

    I think the only place I've ever seen a lap counter was at the start/finish line at the vehicle testing sandbox in Brilliant region.

    For most racing groups, the gate from Les White is the most commonly used.  It works great, honestly.  The only issues most of us ever run into are that it has a limit of 12 drivers per race, and it only supports race distances set by lap count, rather than by time (race for 20 minutes, see who makes the most laps in that time period).

    The time-based races are the main reason I've been working on this other one.  It had that built in from the start when I picked it up, and that part worked great with very little modification required.

  11. On 2/28/2022 at 9:32 AM, Fenix Eldritch said:

    It will detect both, but I suspect the script as currently written might only be processing one.

    The integer seen in a collision's event handler* is an index into a table of all targets that collided with it on that frame. You need a loop to iterate through them all to process them.

    default
    {
        collision_start(integer num)
        {
            llOwnerSay("total collisons detected in this event: "+(string)num);
            integer x;
            for(x=0;x<num;x++)
            {
                llOwnerSay(llDetectedName(x));
            }
        }
    }

    Rez a prim and resize it to have a large horizontal area. Drop the above script into it.
    Then, rez two more prims above the first, making sure they are at the same elevation. Give them unique names and then turn both physical. Let them drop - they should hit the first prim at the same time and demonstrate the effect.

    *and it's not just collision events, this is used for others as well, like touch.

    Edit: You can probably set up a similar test with your existing gates, even if you don't have access to the script. Orient the gate horizontally so that you can position and drop two prims through it from the same height. If you don't get two signals, then it's likely that it wasn't scripted to handle multiple simultaneous collisions.

    So I made the adjustment to the gate, adding the for loop to the collision_start section.  You were correct in that it was initially scripted to only act on a single collision. 

    Unfortunately it didn't seem to clear up the issue - we still had a number of missed collisions, resulting in drivers not being recorded correctly.

    I did what you suggested in terms of a basic test as well - using the code above in a new detection prim, along with a couple of physical prims dropped from various heights, and it DID pick up multiple collisions per event, reporting the object names as expected. 

    The script for the gate seems to run really well aside from these occasional missed collisions;  I'm going to have to keep digging to figure this one out.

  12. Now that I have my flag system working properly, I have another general question.

    Auto racing in SL that takes place on a closed circuit - meaning the race is made up of multiple laps around a track - usually involves some type of lap counter/timer system.  This system keeps track of how many laps each driver has completed, as well as their individual laptimes, sometimes also storing their best individual laps or other data.

    I have a lap counter system I got from someone in Opensim a few years ago.  I brought it into SL and it has been a side project I've been tinkering with when I'm not busy with other things.

    For the most part it works great, but the other night when we were doing some test races for the previously-mentioned flag system, the lap counter missed a few instances where drivers passed through, meaning they were suddenly displayed as being a lap behind everyone else.

    Although I couldn't see the exact circumstances for each driver it happened to, I have an idea what might be going on since it happened to me as well.  I'm thinking that if two drivers collide with the lap counter at nearly the same time, it may only detect one of them.

    The counter is 0.5m thick and using llVolumeDetect, with the detection process being on a collision_start event.

    The LSL wiki entry for "Collision" itself says that the smallest repeat rate is about 0.13 seconds...is it possible that's what we're running into here?  Two cars pass through the gate fast enough that it only has time to detect one?

    The main reason I ask is because there are other, existing lap counter systems that don't seem to have this problem (and their detection prims are thinner than the 0.5m I set this one to), but not being privy to how they're scripted I don't know what might be different.

  13. On 2/14/2022 at 11:48 AM, Fenix Eldritch said:

    So the ultimate goal is to telegraph to the driver whether other approaching racers are already a lap or more ahead of them? If so, I can think of a simpler system that might achieve the same result without the need for much cross communication.

    Keep your rearward facing sensor, but instead of scanning for avatars, scan for the cars themselves. Have the cars all be named the same, so you can keep the sensor filter tight (this is crucial because a sensor can only detect 16 results per sweep). I presume the cars somehow know what lap they are on, correct?  Store that information in the car's root prim description field, perhaps along with the name of the driver too. That way, when your car scans behind itself and detects other cars in range, it can check those car's description field and compare their lap counter to your own. If theirs is grater than yours, display the flag and driver name as before.

    By storing the lap counter and driver name in the car's root description, you make it easy for other cars to query that data immediately using llGetObjectDetails, as soon as they get the car's uuid from the senor. As opposed to having to bounce between sensor and listen events to process the data fully. Being able to do everything quickly in one event and then exit makes life much easier, especially in time sensitive scenarios like a race. And using a lap counter as opposed to say, total distance driven would be preferable I think, as it would only need to be updated once each lap.

    Just as a follow-up, this is the route I ultimately went with.

    I have three triggers placed along the track that use llVolumeDetect - when a car passes through them, they send a message to the car via llRegionSay.  

    The car, upon hearing the message, increments a counter that is stored in the vehicle description field.

    The rearward-facing sensor scans for that number, and compares it to your own.  If the difference is greater than a certain amount, it displays the flag.

    It worked great in the test races we did a couple of nights ago, and also helped with my goal of remaining independent of both the race gate/timer system and the vehicle script system.

  14. I've had people pay me for custom vehicle scripting, and my partner has had people offer to pay her to landscape/decorate for them.  

    I don't often pay for services, as my time in SL is normally occupied by vehicle-related activities or just socializing, but I will often buy things that I find to be clever or interesting in some way...even if it isn't something I will regularly use...just because I appreciate novel ideas and want to show the creator some support.

    • Like 1
  15. 23 minutes ago, Mollymews said:

    maybe alternatively we can think about how this can be done with the race control system

    when a car passes the race control points spread round the track then send the car a message from race control

    the message info can include:

    a) my race position (other useful info can be laps remaining in race for me)

    b) the car in front of me, their race position, and the time gap between the cars
    c) the car behind me, their race position, and time gap between the cars

    d) the time gap to the car next in front of me by race position
    e) the time gap to the car next behind me by race position

    from b) and c) we can deduce blue flag (car behind has a numerically lower race position than me)

    from d) and e) we can know where our nearest competitors are on the track

     

    when we go this way then the race control system detects the cars, the cars don't have to detect each other

    I like the idea, but this approach requires building a new race control system rather than using one of the existing systems on the market - most multi-driver races are held using Les White's lap gate system, while competitions based on setting fastest laptimes use one of the old SD timing systems (the original creator no longer offers those, but sold some full perm copies before shutting down her own store).

    I actually have a different system I got from someone over on Opensim that I've converted for use here in SL, making some pretty big revisions to get it functioning like we need it to for the types of races we run.  It's far from a finished product though, and it has only just recently started being used successfully in actual racing events.

    Adding control points around the track can be done - I've put together similar objects in the past that communicate various bits of data to the cars as needed.  As with what I'm doing now, they work fine when there are only a few drivers...with more drivers on the track, though, it's hard to say how well it would go.  I think a lot would depend on how much data is being thrown around at any given moment.

    The other aspect is that I'm hoping to keep it simple - right now it's just a single prim with one script that attaches to the rear of the car, and of course the flag(s) that are positioned above the car.  If all you need is the blue flag functionality, it can be attached to any car built with any script system, and it doesn't rely on a specific race gate/timer system.  I have some black flag/penalty code built into this script as sort of a secondary function (so a race administrator can issue a penalty to a driver who isn't following the rules), but that's just an extra I threw in there.

  16. 55 minutes ago, Fenix Eldritch said:

    So the ultimate goal is to telegraph to the driver whether other approaching racers are already a lap or more ahead of them? If so, I can think of a simpler system that might achieve the same result without the need for much cross communication.

    Keep your reward facing sensor, but instead of scanning for avatars, scan for the cars themselves. Have the cars all be named the same, so you can keep the sensor filter tight (this is crucial because a sensor can only detect 16 results per sweep). I presume the cars somehow know what lap they are on, correct?  Store that information in the car's root prim description field, perhaps along with the name of the driver too. That way, when your car scans behind itself and detects other cars in range, it can check those car's description field and compare their lap counter to your own. If theirs is grater than yours, display the flag and driver name as before.

    By storing the lap counter and driver name in the car's root description, you make it easy for other cars to query that data immediately using llGetObjectDetails, as soon as they get the car's uuid from the senor. As opposed to having to bounce between sensor and listen events to process the data fully. Being able to do everything quickly in one event and then exit makes life much easier, especially in time sensitive scenarios like a race. And using a lap counter as opposed to say, total distance driven would be preferable I think, as it would only need to be updated once each lap.

     

    Putting the data into the description was another idea I was considering, but hadn't tried yet.  Based on what you're saying there, I see how it would be an improvement.

     

  17. I have a side project I've been working on, and I figured I'd discuss it here and get some input from some more experienced scripters.

    My main activity in SL is racing - cars, specifically.  I have a number of vehicles I've put together for this purpose, and I'm a member of a few different groups that focus on motorsports in SL.

    As with any sport, game, or activity, there are varying levels of talent amongst our regular drivers...but as long as everyone does their best to be aware of what's going on around them and drive with respect for everyone else, we all end up having a good time.

    Where it tends to go wrong are the moments when a faster driver is a lap or more ahead of a slower driver, but that slower driver doesn't realize it - and they fight with the faster driver on track even though it doesn't benefit their position in the race.  The result is that both drivers end up losing time overall because they're focused on each other, instead of on the track...and sometimes it even causes accidents that hurt them both even more (not to mention how it can provoke arguments after the race is over).

    In order to help with this, I've been working on a system that can be added to our vehicles that gives you a warning that the driver behind you is a lap or more ahead, and that you should give them room when they try to pass you.  In real-world motorsports, this is usually signified by showing the slower car a blue flag, notifying them that they need to let the faster driver go.

    As of right now, what I'm doing is attaching a "transponder" of sorts to the back of the car.  It serves a few different purposes...it contains code from an odometer script that tracks how far you've driven since the start of the race (a race official resets everyone's distance before the race begins), it contains a rearward-facing sensor to look for other avatars within a certain range, and it handles communication with the other cars on the track.

    The idea is this:  when the sensor detects another driver, it will compare how far you and the other avatar have driven.  If their total distance is greater than yours by a certain amount (set by the admin, usually the length of the full course), then a blue flag will appear above your car, and that driver's name will be above the flag in floating text.  Once they have passed you, the flag disappears.

    Most of it seems to be working as intended when testing with three or four cars, but during our first test in actual racing conditions with about ten drivers, results were mixed.  Sometimes the flag would show up, and sometimes it wouldn't.

    While putting this together, I came up with two methods for handling the communication between cars so that the transponder script can compare the distances:

    • Direct car-to-car communication using unique llRegionSay channels generated from the UUID of each car
    • Shared communication amongst all cars on a standard channel, with each car broadcasting its data every 2 - 2.5 seconds, each car storing a list of active drivers and distances

    Our test race was done using the second method.  As mentioned before, it worked some of the time.  I don't know if the failures were due to a delay in the sensor detecting people, or if the script just didn't have enough time to process everything it needs to do in that moment.  

    I'm definitely no expert when it comes to scripting.  I still have a lot to learn, and this is one of those times where I feel like I should get some input from people who've been doing it longer.

    (I should note that this system is primarily intended for use in dedicated motorsports regions - the few serious racing spots we have take a lot of steps to minimize the number of running scripts in the region in order to avoid performance issues.  These aren't multipurpose regions with an already heavy script count where we're just throwing in some racing for the heck of it.)

     

    // Note:  There might be items here that aren't in use, as this script has been through multiple revisions.  I've tried to clean them up as much as possible.
    
    list    detectedNames = [];
    list    driverList = [];
    list    distanceList = [];
    list    detectedKeys = [];
    list    leaderList = [];
    
    integer adminChannel = -10240;
    integer dataChannel = -10241;
    integer vehicleChannel;
    integer aC_handle;
    integer data_handle;
    integer vC_handle;
    
    integer transpondercount = 0;
    
    key     owner;
    key     detectedAvatar;
    string  detectedName;
    float   detectedDistance;
    
    string letPass;
    
    float   totaldistance = 0.0;
    float   distance = 0.0;
    float   difference;
    float   blueflag = 1.0;
    vector  oldPos;
    vector  newPos;
    
    integer Flag;
    integer FlagPole;
    integer Flag2;
    integer FlagPole2;
    vector blue = <0, 0, 1>;
    vector black = <0.078, 0.078, 0.078>;
    vector white = <1, 1, 1>;
    integer FlagStatus = 0;
    integer PenaltyStatus = 0;
    
    list    PrimNameList;
    
    ///////Prim name and floating text code
    PrimNames()
    {
            PrimNameList = [];    
            integer i;    
            for(i=1;i<=llGetNumberOfPrims();++i) 
                {
                PrimNameList += [llGetLinkName(i)];
                }
                
            Flag = llListFindList(PrimNameList, ["RaceFlag"]) + 1;
            FlagPole = llListFindList(PrimNameList, ["RaceFlagPole"]) + 1;
            Flag2 = llListFindList(PrimNameList, ["RaceFlag2"]) + 1;
            FlagPole2 = llListFindList(PrimNameList, ["RaceFlagPole2"]) + 1;
    }
    
    LinkText(integer linknum, string text, vector color, float alpha) 
    {
        llSetLinkPrimitiveParamsFast(linknum, [PRIM_TEXT, text, color, alpha]);
    }
    ///////
    
    ///////Keep track of distance travelled 
    measureDistance()
    {
        newPos = llGetPos();
        distance = llVecDist(oldPos, newPos) / 1000;
        totaldistance += distance;
        oldPos = newPos;
    }
    ///////
    
    ///////Artificial throttling - slows the sending of data so it isn't constantly flooding region chat.  There's probably a better way to do this.
    transponder()
    {
        ++transpondercount;
        if(transpondercount == 5)
        {
            llRegionSay(dataChannel, (string)owner + "," + (string)totaldistance);
            transpondercount = 0;
        }
    }
    ///////
    
    ///////Checks how many cars are in sensor range, then compares your distance driven to theirs
    checkDetected()
    {
        integer length = llGetListLength(detectedNames);  //Get the number of detected cars
        
        if(length == 0) //Nobody in sensor range
        {
            ClearFlag();  //Clear any active flag
        }
        
        if(length > 0)  //At least one car detected
        {
            integer i;
            for(i = 0; i < length; ++i) // Do the following for each car in range
            {
                string nametocheck = llList2String(detectedNames, i);   //Get the name of the driver
                integer index = llListFindList(driverList, [nametocheck]);  //Find the driver's index number
                if(index != -1)  // If the driver is in the list of drivers using the transponder...
                {
                    float theirdistance = llList2Float(distanceList, index);  //Look up their total distance
                    difference = theirdistance - totaldistance;  //DO THE MATHS
                    
                    if(difference > blueflag)  // If you're too far behind...
                    {
                        integer isleader = llListFindList(leaderList, [nametocheck]);  //See if that driver is in the leader list
                        if(isleader == -1)  //If not...
                        {
                            leaderList += nametocheck;  //...put them in the list
                            letPass = llList2CSV(leaderList);  //...convert the list to a string
                            BlueFlag();  //Activate the flag
                        }
                    }
                }
            }
        }
    }
    ///////
    
    ///////Leader list cleanup - if multiple names appear in the text above the flag, but one of them is no longer in sensor range, we want to remove that name while leaving the others
    clearleaderlist()
    {
        integer length = llGetListLength(leaderList);  //How long is the current leader list?
        
        if(length > 0)  //If the list contains names...
        {
            integer i;
            
            for(i = 0; i < length; ++i)  //Go through each entry in the list
            {
                string nametocheck = llList2String(leaderList, i);  //Get the name
                integer index = llListFindList(detectedNames, [nametocheck]);  //See if that name is currently in sensor range
                
                if(index == -1)  //If that person isn't being picked up by the sensor anymore...
                {
                    llDeleteSubList(leaderList, i, i);  //Take them out of the leader list so they don't appear in the floating text
                }
                
            }
        }
        
        if(length == 0)  //Or, if the leader list is empty
        {
            ClearFlag();  //Just get rid of the flag
        }
    }
    ///////
    
    ///////Turn blue flag on
    BlueFlag()
    {
        llSetLinkPrimitiveParamsFast(Flag, [PRIM_COLOR, 1, blue, 1.0, PRIM_TEXTURE, 1, "c51a3c5b-c325-1027-1e19-1b763b0e460d", <1.0, 1.0, 0.0>, ZERO_VECTOR, PI/2 ]);
        llSetLinkPrimitiveParamsFast(FlagPole, [PRIM_COLOR, 0, white, 1.0]);
        LinkText(FlagPole, letPass, <1, 1, 1>, 1.0);
        FlagStatus = 1;
        llRegionSay(adminChannel, (string)owner + "," + (string)FlagStatus);
    }
    ///////
    
    ///////Turn flag off
    ClearFlag()
    {
        llSetLinkPrimitiveParamsFast(Flag, [PRIM_COLOR, 1, blue, 0.0, PRIM_COLOR, 2, blue, 0.0]);
        llSetLinkPrimitiveParamsFast(FlagPole, [PRIM_COLOR, 0, white, 0.0]);
        LinkText(FlagPole, "", <1, 1, 1>, 1.0);
        FlagStatus = 0;
        llRegionSay(adminChannel, (string)owner + "," + (string)FlagStatus);
    }
    
    ///////
    default
    {
        state_entry()
        {
            owner = llGetOwner();
            vehicleChannel = (integer) ( "0xF" + llGetSubString(owner,0,6 ) );
            data_handle = llListen(dataChannel, "", "", "");
            aC_handle = llListen(adminChannel,"","","");
            vC_handle = llListen(vehicleChannel,"","","");
            PrimNames();
            oldPos = llGetPos();
        }
        
        changed(integer change)
        {
            if(change & CHANGED_OWNER)
            {
                llResetScript();
            }
        }
    
        sensor (integer detected)
        {
            while(detected--)
            {
                detectedAvatar = llDetectedKey(detected);  //Get the unique ID for the avatar
                string name = llGetUsername(detectedAvatar);    //Get the avatar's username
                integer index = llListFindList(detectedNames, [name]);  //Find the username in the list of people in sensor range
                if(index == -1)  //If the name isn't already there
                {
                    detectedNames += name;  //Add it to the list
                }  
            }
        }
        
        no_sensor()
        {
            detectedNames = [];  //If nobody is in range, clear the list of detected avatars
            leaderList = [];  //If nobody is in range, clear the list of leaders
            letPass = "";  //If nobody is in range, clear the list that would be shown in floating text
            ClearFlag();  //If nobody is in range, clear any active flag
        }
        
        listen(integer channel, string name, key id, string message)
        {
            if(channel == dataChannel)
            {
                list data = llCSV2List(message);
                key identifier = llList2Key(data, 0);
                string drivername = llGetUsername(identifier);
                string currentdist = llList2String(data, 1);
                integer index = llListFindList(driverList, [drivername]);
                
                if(index == -1)
                {
                    driverList += drivername;
                    distanceList += currentdist;
                }
                
                else if(index != -1)
                {
                    distanceList = llListReplaceList(distanceList, [currentdist], index, index);
                }
                
            }
            
            else if(channel == adminChannel)
            {
                if(message == "start")
                {
                    llSensorRepeat("", "", AGENT, 32, PI / 3, 2);
                    llSetTimerEvent(0.5);
                }
                
                else if(message == "stop")
                {
                    llSensorRemove();
                    llSetTimerEvent(0.0);
                    ClearFlag();
                }
                
                else if(message == "reset")
                {
                    totaldistance = 0.0;
                    oldPos = llGetPos();
                    driverList = [];
                    distanceList = [];
                    leaderList = [];
                    letPass = "";
                    ClearFlag();
                    
                }  
            }
            
            else if(channel == vehicleChannel)
            {
                list data = llCSV2List(message);
                string datatype = llList2String(data, 0);
                
                if(datatype == "blackflag")
                {
                    llSetLinkPrimitiveParamsFast(Flag2, [PRIM_COLOR, 1, white, 1.0, PRIM_TEXTURE, 1, "c2d5e50c-7edd-08c2-49bd-b12eada045ce", <1.0, 1.0, 0.0>, ZERO_VECTOR, PI/2 ]);
                    llSetLinkPrimitiveParamsFast(Flag2, [PRIM_COLOR, 2, white, 1.0, PRIM_TEXTURE, 2, "c2d5e50c-7edd-08c2-49bd-b12eada045ce", <1.0, 1.0, 0.0>, ZERO_VECTOR, PI/2 ]);
                    llSetLinkPrimitiveParamsFast(FlagPole2, [PRIM_COLOR, 0, white, 1.0]);
                    PenaltyStatus = 1;
                    LinkText(FlagPole2, "Drive Through Penalty", <1, 1, 1>, 1.0);
                }
                
                else if(datatype == "clearblackflag")
                {
                    if(PenaltyStatus == 1)
                    {
                    llSetLinkPrimitiveParamsFast(Flag2, [PRIM_COLOR, 1, white, 0.0, PRIM_COLOR, 2, white, 0.0]);
                    llSetLinkPrimitiveParamsFast(FlagPole2, [PRIM_COLOR, 0, white, 0.0]);
                    LinkText(FlagPole2, "", <1, 1, 1>, 1.0);
                    PenaltyStatus = 0;
                    }
                    
                    else
                    {
                        PenaltyStatus--;
                    }
                }
            }
            
        }
        
        link_message(integer sender_num, integer num, string message, key id)
        {
            if(num == 409)
            {
                if(message == "pitting")
                {
                    if(PenaltyStatus > 0)
                    {
                        ++PenaltyStatus;
                    }
                }
            }
        }
        
        timer()
        {
            measureDistance();
            transponder();
            checkDetected();
            if(FlagStatus == 1){clearleaderlist();}  //Only run the cleanup routine if the flag is active
        }
        
    }
    

     

  18. I had this happen yesterday.  I made a few small changes to things I had rezzed out on my mainland parcel.  Less than 30 minutes later, SOME things had reverted back...while others remained the same.

    Some objects I had deleted were back in their original place, and the ones I'd rezzed to replace them were gone.  Nothing in Lost & Found.

    A skybox I had rezzed at a different height was still there, along with most of its contents - but the teleporter I had put in that building for access was gone.

     

×
×
  • Create New...