Jump to content

Rufus Darkfold

Resident
  • Posts

    300
  • Joined

  • Last visited

Everything posted by Rufus Darkfold

  1. Documentation is up! https://wiki.secondlife.com/wiki/User:Rufus_Darkfold/PrimControl_HUD Distribution of the beta 1 HUDs will begin shortly to those who have already requested them. I can still accomodate a few more beta testers.
  2. Documentation is up! https://wiki.secondlife.com/wiki/User:Rufus_Darkfold/PrimControl_HUD Distribution of the beta 1 HUDs will begin shortly to those who have already requested them. I can still accomodate a few more beta testers.
  3. I just added another screen for prim torture: This utilizes the prim torture library in the wiki, modified to work with primset (updated with more current screenshot).
  4. I have been learning what the various prim and particle parameters do by making a HUD to fiddle with them. Wanna play with it? http://community.secondlife.com/t5/Building-and-Texturing-Forum/Free-primcontrol-HUD-Call-for-Beta-Testers/td-p/1092577
  5. I have been developing a HUD to manipulate prims in a linkset in various ways. It utilizes the primset script which should be installed in the root of the target. This allows the HUD to operate on the entire linkset or any subset thereof, instead of only one prim at a time as the viewer does. The HUD uses an upgraded version of dialogger to create screens for flexi, light, color, target omega, particles and prim torture. The HUD is moveable and resizable without going into edit mode. It's Free, full-perms, and open-source. Anyone interested? RSVP here (more reliable) or IM me in-world (may get capped). Main screen. This simply displays a button for each script in its inventory that starts with "prim-" and activates the corresponding script when the button is clicked. There is support for prim torture, with or without chaining: Particles required 2 screens. On the left you can see the particles being emitted by the target object. The control for each paramter utilizes a single prim, even though it may have up to 3 sliders. Flexi, currently targeting the cape my avatar is wearing. I use this to control my hair on the fly as well: Light, targeting the prim to the right of the glowing one: Also included is a new version of the charttracker mapper in the same HUD. Plots your SL position on any map. On-map avatar radar, banline checking, flight assist. 
  6. BETA 7 is now available. Primcontrol can now generate LSL code for flexiprims, texture animation, color and light parameters, particles, keyframed motion, and target omega. Keyframer now supports looping animations, and allows the range of the "move" control and the resolution of the "rotate" control to be set, New texture animation screen. Dialogger now supports dropdown menus. Can be obtained at Flexi Tribe: http://maps.secondlife.com/secondlife/Comet/26/121/123 Join "Navigator Users" to get updates. Overview: Primcontrol is a HUD to manipulate prims in a linkset in various ways. It utilizes the primset script which should be installed in the root of the target. This allows the HUD to operate on the entire linkset or any subset thereof, instead of only one prim at a time as the viewer does. The HUD uses an upgraded version of dialogger to create screens for keyframed motion, flexi, light, color, target omega, particles, and prim torture. The HUD is moveable and resizable without going into edit mode. It's Free, full-perms, and open-source. Extensible top-level menu. This simply displays a button for each script in its inventory that starts with "top-" and activates the corresponding script when the button is clicked. New items can be added to this menu by creating scripts with the "top-" prefix. "charttracker" runs the charttracker mapping HUD. "dialogger" provides an empty dialogger window for your objects to use. "primcontrol" brings up the main screen of primcontrol: Keyframed Motion Editor: Particles required 2 screens. On the left you can see the particles being emitted by the target object. The control for each paramter utilizes a single prim, even though it may have up to 3 sliders. Texture Animation: Flexi, currently targeting the cape my avatar is wearing. I use this to control my hair on the fly as well: Light, targeting the prim to the right of the glowing one: Also included is a new version of the charttracker mapper in the same HUD. Plots your SL position on any map. On-map avatar radar, banline checking, flight assist. Click on the map to get a "Places" tab: Click on an orange avatar marker to get an avatar profile: Map Selection dialog: Caveats for Using the Non-Physical Vehicle Script in Your Own Vehicle: 1. If you use the script from the non-physical vehicle in your own vehicle, note the llSetPrimitiveParms calls in the changed handler. These are intended to open and close the sphere. If it wasn't a sphere before, this will make it one. Remove that code if your vehicle is anything else. 2. Your vehcile will need at least one prim with physics set to convex hull or none.
  7. I tried to get in on the last round, but couldn't find a link to actually request a space.
  8. In Preferences / "Move and View" / "Other Devices": Look for "Control Modes". Uncheck "Avatar".
  9. Yes, and if you're using mesh, then you need a v3 viewer anyway, so you could still use MOAP which would be far more prim-efficient. Note that there is a configurable limit in the viewer (defaults to 8) for the number of MOAP prims that can display at the same time, but you would only need one per sign. Could be an issue if there are a large number of signs that are visible at the same time though.
  10. primset does this. Actually it checks both the name and the description, but you could easily change that. Droip primset on a prim, click on the prim, and then chat: /884 [something, something-else] list-of-params to llSetLinkPrimitiveParamsFast or /884 [something, something-else] ?list-of-params to llGetLinkPrimitiveParmas It will act on whatever prims in the linkset have a name or description of "something" or "something-else". The enhanced version also supports resize and the particle system.
  11. It's not all that prim-heavy, xyzzytext gets either 5 or 10 characters per prim (depending on how many textures you want to use). If that is too much, then consider MOAP. You can use data: urls to avoid the need for any server. MOAP requires at least a v2 viewer though. Parcel media may be another option, and it works with all viewers. Only one settiing per parcel though. Other than that, make textures for all the possible signs (maybe several on one texture and use offsets to select). This would be by far the easiest way if there are a relatively small number of possibilities for what the sign will display.
  12. Does the region-crossing overhead for scripts apply even if they are inactive? I would not expect it to, since inactive scripts lose state on region crossings. SVC-4329
  13. primset can filter by name or description. Drop it in the root prim and chat to it on channel 884. The part in the square brackets is a list of names or prim numbers. [foo,bar] 21, 1, 3, 0.2, 1.2, 2.5, 7.5, <0,0,0> would set the flexi params of the prims in the linkset with a name or description of "foo" or "bar": (flexible, true, softness 3, gravity 0.2, friction 1.2, wind 2.5, tension 7.5, force <0,0,0>) The arguments after the square brackets are a list to pass to llSetLinkPrimitiveParamsFast(). You could use primset as-is or modify it to do what you need.
  14. Facebook makes no effort to keep facebook ids private. If you know somebody's name, you can find their facebook ID, and visa versa. Clearly, any linkage between SL names and FB IDs must have the full, informed concent of the owner of those IDs. Like most of the other responders, and as a user of both SL and FB, I would like to know what it is you are trying to do. The Lindens might be interested as well. They want more integration with social networking services, so if what you are doing is useful, reasonably secure, and does not violate the terms of service, they might even help you.
  15. You could script it so that it turns phantom temporarily if it detects a collision where the door frame is supposed to be.
  16. I handle it by rezzing a "garbage collector" that links to the unwanted prims and then llDie()s. It does have to ask for link permissions though. In one of the "tortured prim" discussions it was mentioned that certain combinations of prim torture were being avoided because they would cause the prim to be deleted. Does this work consistently enough to be used as a means of prim disposal? Could you do it while the prim is still linked (and if so, what happens?)
  17. Might want to combine with "Highlight Transparent" and "Limit Select Distance" from the Advanced Menu. There are also free HUDs that can search for them within 96 meters if you know their names.
  18. Any neighboring no-script land might get littered with expired, comatose bullets.
  19. Void Singer wrote: LSO still transfers across regions better, and is less subject to region cross and rezzing lags, especially if the avatar is highly scripted... stable items should be fine with mono becuase they can only take the potential hit once (and the performance hit is smaller than it used to be for MONO). once rezzed/in-region MONO outperforms in every category How big a difference is it? Is it worth having 4-6 LSO scripts instead of one mono script in an attachment? I do a lot of sim crossings.
  20. It's set "no pushing", and scripting and rezzing are also not allowed. How are they doing it?
  21. Neither mesh nor sculpties can be flexi. Only regular prims can do that. There, at least, remains a niche for those using only in-world tools. The viewer does have some annoying limitiations there. You can't see what the parameter change does until you stop editing the prim, and you can only do one prim at a time. I have been developing a HUD to get around these limitations. This works with a copy of the primset script in the root prim of the object being edited. The HUD can query and set all flexi parmeters for a link set or any subset, it also does color, light and target alpha params. All parameter changes are visible instantly. The ability to set the whole linkset at once is particularly handy for hair. In the interest of making residents less building-disenfranchised, I will offer this free and open-source. Beta test will begin after Labor Day.
  22. Helium Loon wrote: …The only thing you can check is the ACTIVE group an avatar has with the llSameGroup(key agent) function.Which will also return true if the object isn't group owned! So any object you used in this way would have to be owned by that group first. Then you could use the above function to determine if a given avatar had that group as their active group. It worked for me with the object merely set to the group of interest. I just re-tested my restricted transporter that uses that call, and it still refuses to go if I don't have the right group tag set.
  23. // primset+ (includes resize and particles)// listens on 884 when touched (times out after 5 minutes idle)// prefix /nnn sets reply channel// prefix [m,n,o] selects child prims by id or name// ?<list of params> get passed to llGetLinkPrimitiveParams// $<float> resize entire linkset// $<vector> non-proportional resize (see caveats below!)// %<list> pass to llLinkParticleSystem// <list> pass to llSetLinkPrimitiveParamsFast// needs the list_cast function from the wiki library// based on the basic resize script from the library. Supports up to 64x64x64.// In most cases scal,x scal.y and scal.z should be equal.// Non-proportional re-size will work if all prims are oriented the same way,// or if it is the sort of object for which this does not matter. // use with caution and take a copy first.resize(vector scal){ integer primindx; list primP; vector s = llGetScale(); rotation saverot = llGetRot(); llSetRot(ZERO_ROTATION); integer validDim = TRUE; for ( primindx = 1; primindx <= llGetNumberOfPrims(); primindx++ ) { primP = llGetLinkPrimitiveParams( primindx, [PRIM_SIZE]); s = llList2Vector( primP, 0 ); vector vr = <scal.x*s.x,scal.y*s.y,scal.z*s.z>; debugout((string)vr); validDim = validDim && vr.x>=0.01 && vr.y>=0.01 && vr.z>=0.01 && vr.x<=64.0 && vr.y<=64.0 && vr.z<=64.0; } if ( validDim ) { s = llGetScale(); llSetScale( <scal.x*s.x,scal.y*s.y,scal.z*s.z> ); for ( primindx = 2; primindx <= llGetNumberOfPrims(); primindx++ ) { primP = llGetLinkPrimitiveParams( primindx, [PRIM_SIZE, PRIM_POSITION]); vector primScale = llList2Vector( primP, 0 ); primScale = <primScale.x*scal.x, primScale.y*scal.y, primScale.z*scal.z>; vector primPos = llList2Vector( primP, 1 ) - llGetPos(); primPos = <primPos.x*scal.x, primPos.y*scal.y, primPos.z*scal.z>; llSetLinkPrimitiveParamsFast( primindx, [PRIM_SIZE, primScale, PRIM_POSITION, primPos/llGetRootRotation()]); } } else llOwnerSay("No resize! Out of limit sizes are not accepted"); llSetRot(saverot);}debugout(string msg){ llOwnerSay(msg); // comment out if it's too chatty}integer outchan =0;reply(string msg){ llWhisper(outchan, msg); if (outchan) { debugout(msg); }}integer channel = 884;list subset;integer hlis;float timeout = 300; // stop listening after 5 minutes of inactivitydefault{ timer() { if (hlis){ llOwnerSay("Deslecting " + llGetObjectName()); llListenRemove(hlis); hlis = 0; } } touch_start(integer num) { llSetTimerEvent(300); llResetTime(); if (!hlis) { hlis = llListen(channel, "", "", ""); llOwnerSay(llGetObjectName() + " selected. Listening on channel " + (string)channel); return; } while (num--) { integer child=llDetectedLinkNumber(num); integer j = llListFindList(subset,[child]); if (~j) { llOwnerSay("Deselecting #" + (string)child); subset = llDeleteSubList(subset, j, j); } else { llOwnerSay("Selecting #" + (string)child); subset += child; } } } listen(integer ch, string name, key id, string msg) { //llOwnerSay(msg + " from " + (string)id + " owned by " + (string)llGetObjectDetails(id, [OBJECT_OWNER])); if (llGetOwner() != id) { if (llList2Key(llGetObjectDetails(id, [OBJECT_OWNER]),0) != llGetOwner()) return; } outchan = 0; if (msg == "") { subset = []; llSetTimerEvent(0.1); // empty message = disconnect right away; return; } llSetTimerEvent(timeout); if (llGetSubString(msg, 0, 0) == "/") { // specify response channel integer endch = llSubStringIndex(msg, " "); outchan = (integer)llGetSubString(msg, 1, endch); msg = llGetSubString(msg, endch+1, -1); } if (llGetSubString(msg,0,0) == "[") { // list of child prims to select by name or child id, or * for all integer e = llSubStringIndex(msg, "]"); if (e > 1) subset = list_cast(llCSV2List(llGetSubString(msg, 1, e-1))); else subset = []; msg = llStringTrim(llGetSubString(msg, e+1, -1), STRING_TRIM_HEAD); if (llList2String(subset,0) == "*") { integer i; subset = []; for (i=1; i<=llGetNumberOfPrims(); i++) subset += i; } } list sub; list cmds; if (llGetSubString(msg,0,0) == "?") { // Get params from prims cmds = list_cast(llCSV2List(llGetSubString(msg, 1, -1))); integer i; list curr; if (subset == []) // If not specified use root (or only) prim sub = [ (llGetNumberOfPrims() > 1) ]; else sub = subset; debugout(llList2CSV(cmds)); for (i = 0; i<llGetListLength(sub); i++) { if (llGetListEntryType(sub,i) == TYPE_INTEGER){ integer j = llList2Integer(sub,i); curr = llGetLinkPrimitiveParams(j, cmds); reply("[" + (string)j + "] " + llList2CSV(curr)); } else { integer k; string x=llList2String(sub,i); list exp; for (k=1; k<=llGetNumberOfPrims(); k++) { if (~llListFindList(llGetLinkPrimitiveParams(k,[PRIM_NAME,PRIM_DESC]), [x])) { curr = llGetLinkPrimitiveParams(k, cmds); exp += k; reply("[" + (string)k + "] " + llList2CSV(curr)); } } debugout(x + " is " + llList2CSV(exp)); } } return; } if (llGetSubString(msg,0,0) == "$") { // resize entire linkset msg = llDeleteSubString(msg,0,0); vector v = (vector)msg; if (v == ZERO_VECTOR) { float scal=(float)msg; v = <scal,scal,scal>; } resize(v); return; } else if (llGetSubString(msg,0,0) == "%") { // particle system msg = llDeleteSubString(msg,0,0); cmds = list_cast(llCSV2List(msg)); if (subset == []) sub = [LINK_SET]; else sub = subset; debugout("ParticleSystem On " + llList2CSV(subset) +":\nCmds: "+ llDumpList2String(cmds,"; ")); integer i; for (i = 0; i<llGetListLength(sub); i++) { if (llGetListEntryType(sub,i) == TYPE_INTEGER) llLinkParticleSystem(llList2Integer(sub,i), cmds); else //if (llGetListEntryType(subset,i) == TYPE_STRING) { integer k; string x=llList2String(sub,i); list exp; for (k=llGetNumberOfPrims(); k; k--) { if (~llListFindList(llGetLinkPrimitiveParams(k,[PRIM_NAME,PRIM_DESC]),[x])) { llLinkParticleSystem(k, cmds); exp += k; } } debugout(x + " is " + llList2CSV(exp)); } } return; } // set prim params cmds = list_cast(llCSV2List(msg)); if (subset == []) sub = [LINK_SET]; else sub = subset; debugout("On " + llList2CSV(subset) +":\nCmds: "+ llDumpList2String(cmds,"; ")); integer i; for (i = 0; i<llGetListLength(sub); i++) { if (llGetListEntryType(sub,i) == TYPE_INTEGER) llSetLinkPrimitiveParamsFast(llList2Integer(sub,i), cmds); else //if (llGetListEntryType(subset,i) == TYPE_STRING) { integer k; string x=llList2String(sub,i); list exp; for (k=llGetNumberOfPrims(); k; k--) { if (~llListFindList(llGetLinkPrimitiveParams(k,[PRIM_NAME,PRIM_DESC]),[x])) { llSetLinkPrimitiveParamsFast(k, cmds); exp += k; } } debugout(x + " is " + llList2CSV(exp)); } } }}
  24. There are some cases in which "resize along the Z axis" actually means resize each prim along its own Z axis, regardless of its orientation with the rest of the link set. Hair and certain other "organic" objects might benefit from a resize that ignores child prim rotation. For this I use the "basic resizer" in the library, modified to use a vector instead of a scalar. My version also saves the root rotation at the beginning and sets it to ZERO_ROTATION, then restores it at the end so the moves work right if the overall object is rotated. I also modded it to allow me to make megaprims up to 64x64x64 now that we can do that.
×
×
  • Create New...