Jump to content

Donovan Michalski

Resident
  • Posts

    305
  • Joined

  • Last visited

Everything posted by Donovan Michalski

  1. Side note - it took me until today to realize that the forums here have a 'signature' option. I never had it enabled in my account settings here until I saw this comment and went looking for it. Then I come back here, see your forum signature, and say "Oh, THAT'S who you are." 🤣
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. The Super 80 is a fun car, no doubt. I recommend it to everyone just because of how well-made and unique it is.
  7. 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
  8. This started happening last week, there was some discussion in the Drivers of SL group chat about it - multiple regions had the issue. In some cases, if you have a premium account you could use the support chat bot and request a region restart, which would fix the issue (at least for the moment). If it's something malicious as Lucia seems to be indicating, it could always return.
  9. 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. 🤣
  10. 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. 🤣
  11. 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". 🤨
  12. 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.
  13. 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.
  14. Good to know - I'll give that a look next time I'm on. Thanks!
  15. 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.
  16. 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.
  17. 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.
  18. I'll do your blogging for you, and I'll only charge 1 L$ per letter typed. You have to take your own photos though, I have a screenshot phobia.
  19. 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.
  20. 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.
  21. 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 } }
  22. 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...