Jump to content

Wulfie Reanimator

  • Content Count

  • Joined

  • Last visited

Community Reputation

925 Excellent

About Wulfie Reanimator

Recent Profile Visitors

892 profile views
  1. Thread was posted 29 minutes ago, edited 17 minutes ago to this? You aren't very patient, are you?
  2. But resorting to cloud storage would potentially make this even more complicated / slow. First (I'm) uploading to the cloud for at least 12 days. Then, assuming you can install SL into that cloud as well (or somehow "directly connect it"), you're at the mercy of that cloud service's bandwidth limits which may be limited/restricted.Though the currently fastest cloud service I could find is able to upload files at 40Mbps or 5MB/s, it is still 55 hours on top of my 12 days of uploading to the cloud and doesn't include any bandwidth usage limits imposed by the service itself. Besides, ChinRey stated in her OP that the upload fees alone would put the whole planet in poverty many times over, so the final cost can already be ignored as untenable.
  3. The more immediate question is, are you gonna be able to fit all of those on your HDD? 32-bit color depth means 256 colors (0-255) per Red, Green, and Blue. 256 * 256 * 256 = 16'777'216 shades of color. 1024 * 1024 = 1'048'576 pixels. 1048576 * 16777216 = 17'592'186'044'416 unique 1024px textures. A PNG file with 32 bits of color information at 1024x1024 resolution is going to take up exactly 4096KB (4MB) of space to store. 4 * 17592186044416 = 70'368'744'177'664 MB or 70 Terabytes of storage space required. (Not including all of the lower resolutions.) My personal internet connection is a 60/10, meaning my upload speed is 10Mb/s or 1.25MB/s. This means that, in lab-perfect conditions, with no interference or interruptions (and no throttling from Linden Lab), it would take me almost 278 hours or 11.5 days to upload those highest resolution textures. And honestly, you wouldn't want to generate all of those lowest resolutions first. If you generated only the highest resolution textures, you could crop them to get yourself lower resolution textures that would still be equally unique (since all of those unique lower resolution textures would be contained in the 1024x1024 ones).
  4. Understandable but kind of silly of a question. It's an acceptable risk that requires you to sell 8 copies before you're making profit, the idea being that you may get more potential customers faster. (Or end up losing your whole account, as Dakota Linden said.) There are plenty of backwards-sounding marketing strategies (especially if paying a flat fee for a visibility boost is your bar for silly), such as intentionally selling a product for a loss. (Look up "loss leader") Popular example: Sony is losing money for every console they sell. Their profit comes long-term from game sales and their subscription services. Or even giving away your product for free, but selling accessories and services for the initially free product. As a kind of similar and within-SL-rules example, you could also sell your product for dirt cheap to attract more people and spread your product/brand. This happens especially when you're a newcomer to a large market.
  5. Gonna need a big source on that. Alpha sorting is certainly not an unsolvable problem, especially not to the degree that it is in SL. Our rendering code is just a bit ancient, duct tape and all. (Doesn't help OP, but that's way too big of a claim to brush over.)
  6. @LeonissiaLoc There is no real communication needed between the two objects. For example, I have a nondescript object moving around in a circle (1 degree every 0.022 seconds). It only has code for moving itself, it does not listen or send messages. I then have this script in a worn attachment (also updating the camera params every 0.022 seconds, but you do not need to do it this often): key uuid = "c6e3e94d-9586-ff64-2f52-bae2b76a25b9"; default { state_entry() { llRequestPermissions(llGetOwner(), PERMISSION_CONTROL_CAMERA); } run_time_permissions(integer perm) { llSetTimerEvent(0.022); } timer() { // Get the remote object's position and rotation. list data = llGetObjectDetails(uuid, [OBJECT_POS, OBJECT_ROT]); vector pos = llList2Vector(data, 0); rotation rot = llList2Rot(data, 1); llSetCameraParams([ // Begin controlling the camera and prevent it from being moved. // (Alt-cam will still override this.) CAMERA_ACTIVE, TRUE, CAMERA_FOCUS_LOCKED, TRUE, CAMERA_POSITION_LOCKED, TRUE, CAMERA_FOCUS, pos, // The position the camera will LOOK at. CAMERA_POSITION, pos + (<0, -2, 1> * rot) // The position the camera will BE at. ]); } touch_start(integer n) { llClearCameraParams(); llSetTimerEvent(0); } } Note that I used "<0, -2, 1>" as an offset so that the camera would be on the object's right side and slightly above it. For testing purposes, you can select any object or link in Edit Mode and click on the "Copy Keys" button in the General tab of the Edit Tools window. If you were to rez an object with a script and wanted to track that instead, you could get the rezzed object's key through the object_rez event. For any other case, you'd require some kind of custom communication between the objects. Also note: Because of the *_LOCKED values, the camera change will be instant, so this will always look jerky.
  7. Sadly, that page was created in 2010 and the related JIRA article is from 2007.
  8. The only way for an avatar to automatically sit on anything is with an RLV command. http://wiki.secondlife.com/wiki/LSL_Protocol/RestrainedLoveAPI To clarify, especially if you've never used RLV, these commands are used with llOwnerSay so the viewer can take action. string target_prim_uuid; llOwnerSay("@sit:" + target_prim_uuid + "=force"); Also to add; You can get the UUID of the rezzed object in the object_rez event, eg: default { state_entry() { // llRezObject } object_rez(key id) { llOwnerSay("@sit:" + (string)id + "=force"); } }
  9. The most active group I'm in is called "Script Academy" but another, more general group would be the "Builders' Brewery" (but it's for all builders, not just scripters).
  10. I think we're gonna have to consult NASA for the level of Woosh in this thread.
  11. "Ternary operator" (as opposed to unary or binary) is actually a real term in other programming languages, like the C family. The syntax is something like: condition ? true : false The LSL version's syntax in general is a little suspect. It's not necessarily less typing and it's definitely more memory-consuming. I can't say anything about its speed though. But it's not something you should worry about. If that line was the slowest part of your whole script, you've got literally nothing to worry about. (speed-wise)
  12. Also, depending what sort of look you're going for (or what you're into), I would recommend SKNK by Tokeli Zabelin. There's plenty of human options, some even bento-rigged. Personally I prefer the smooth/cute Verpas series over anything like the overly detailed Aeros. Your mileage will vary, especially if your body skin does not match the "cute and smooth" style.
  13. The term "hack" has many meanings in different contexts. I was half-expecting someone to wander in and say something like "you can't hack anything with LSL!" I use the term "hack" in this case to refer to code that does something particularly unusual. Something that doesn't look pretty or is hard to understand when you first read it. While it is true that "hacks" are just another way to do something, the term usually has a negative connotation because hacks are often undesirable solutions. Here are some additional examples of code I have written: // Use a "nonzero" check to toggle another value. integer multiplier = 3; integer test = 3 * !!multiplier; // test will be 3, not 9. // Multiplier will be used as 1, not 3. // If multiplier is 0, it stays 0. // Clamp value with if-check float test = 1.5; if((test += 1.5) > 2.5) test = 2.5; // test will be 2.5 instead of 3. // llList2* functions as ternary-operators string greeting = llList2String(["Afternoon!", "Morning!"], (llGetGMTclock() / 3600) < 12); And all together now, just as an example I came up now to illustrate all of these things in practice. default { state_entry() { integer score_threshold = 100; integer current_score = 95; integer current_multiplier = 2; integer score_gained = 5; // Final score being added before prize checking. integer final = llList2Integer([current_score * current_multiplier, 0], (current_score += score_gained) > score_threshold); // condition llOwnerSay(llList2String([ "Scored too high! Better luck next time!", "Your final score is: " + (string)final], !!final)); // 95 + 5 = 100, not over threshold. The user wins the game with 190 points. // If score_gained is 10, the score threshold is exceeded and the user loses with 0 points. } } Or heck, this is some real code I'm using right now (in a timer):
  14. Nothing is stopping you from using the main body slots normally used for LL UVs to bake textures compatible with your custom mesh body instead.
  15. Scripting is about solving problems. Syntax has surprisingly loose rules sometimes. What kind of code have you written that made you surprised that it even worked at all? (Or maybe it was just something you discovered by accident or never thought about before.) I was inspired to post this because of something I was implementing. For context, I was trying to select the closest avatar within a sensor that was not in the same group as the object. The first line is what I originally did, and the lines after it are changes I made to it to see if I could shorten it without breaking anything. All of these lines are valid and have the exact same result. integer i = -1; do { ++i; } while(llSameGroup(llDetectedKey(i))); integer i = -1; do ++i; while(llSameGroup(llDetectedKey(i))); integer i = -1; do; while(llSameGroup(llDetectedKey(++i))); integer i = -1; while(llSameGroup(llDetectedKey(++i))); // Final i is then used for other llDetected* functions.
  • Create New...