1445 Commits

Author SHA1 Message Date
lickx
1c348f7f69 Check llGetInventoryKey against NULL_KEY 2017-02-20 16:30:32 +01:00
lickx
8759b01b6a Revert "Check llGetInventoryKey against NULL_KEY"
This reverts commit b2a4316667.
2017-02-20 16:00:29 +01:00
lickx
b2a4316667 Check llGetInventoryKey against NULL_KEY
And prevent Settings menu opening twice
2017-02-20 15:55:07 +01:00
lickx
56f1214e46 OpenSim 0.8 compatibility, version bump 2017-02-20 09:18:22 +01:00
lickx
a446f0393c Update news, disable news by default
No more annoying news on each script reset such as returning from the
hypergrid. You can still enable it in the menu.
2017-01-21 04:41:38 +01:00
lickx
0496b00229 Backport leash clash fix
Couple things to notice;
* in an object with multiple scripts each using at_target/not_at_target,
when using targets it triggers the events in both scripts so we have to
explicitly check for the handle
* this handle is not zero'd by opensim on llTargetRemove so must be set
0 by hand

This is a hotfix, main work continues on oscollar6 branch
2017-01-21 02:25:53 +01:00
lickx
85a406229c Update README.md 2016-10-14 10:38:55 +02:00
Lotek Ixtar
73cb4d86a8 Update README.md 2016-09-14 20:06:33 +02:00
Lotek Ixtar
172d015ec1 Update README.md 2016-09-14 20:05:50 +02:00
Lotek Ixtar
c29f3c117e Update README.md 2016-09-14 20:04:57 +02:00
lickx
c4b0b0ad16 Remove obsolete JSon workaround
Since http://opensimulator.org/mantis/view.php?id=7957 is fixed in
OpenSim 0.9 master
2016-09-14 04:03:53 +02:00
lickx
cb3bc181ad Update news summary for release 2016-09-12 11:27:09 +02:00
lickx
6f86a3da4e Fixes #9 for oscollar3
Bump version as this fix is important and probably has to do with the
introduced leash code
2016-09-12 11:21:38 +02:00
lickx
cc35f9ac86 Release 3.998.1
Inworld vendor updated, region Oaks Woods in OsGrid
2016-09-12 10:26:11 +02:00
lickx
5a71a0ea7b Integrate most recent leash code of OC 3.99x branch
Yes, it's up to date now with the last OpenCollar 3.x
Tested & verified in OpenSim 0.8 and OpenSim 0.9 please report any bugs
you may find
2016-09-12 09:39:33 +02:00
Lotek Ixtar
8170121985 Add inworld location for a ready made Collar 2016-09-12 08:56:08 +02:00
lickx
a23ee1262c Limit number of characters on a button
Should fix #8
2016-09-12 08:23:03 +02:00
lickx
ac136fdfe0 3.998 Release
Update github references as well
2016-08-07 13:16:33 +02:00
lickx
2c56a1c72b Correct rotation for default grabby post 2016-08-07 11:54:00 +02:00
lickx
5aa41e6d5b Readme.md 4 2016-07-27 17:46:55 +02:00
lickx
dfe15fd962 Readme.md 3 2016-07-27 17:45:48 +02:00
lickx
407433865f Readme.md 2 2016-07-27 17:42:12 +02:00
lickx
6b980d8811 Start of a readme.md 2016-07-27 17:41:18 +02:00
lickx
30371830ab Made compatible with OpenSim 0.8
Only camera.lsl does not work on OpenSim 0.8; XEngine in OpenSim 0.8 has
incomplete Json support
2016-07-27 16:06:46 +02:00
lickx
a1055a0b34 Meshlabel backport to v3 from OpenCollar 6 2016-07-27 13:37:29 +02:00
lickx
2e6efd9cc2 Rename .styles to ~styles in Git
In the inworld collar it would have to be .styles
2016-07-21 14:51:23 +02:00
lickx
af7e00162e Replacement by osReplaceString 2016-07-21 14:49:38 +02:00
lickx
c68d43b2a8 Styles support ('Themes' in OsCollar6) 2016-07-19 14:07:09 +02:00
lickx
1c71d836d0 Have a working grabbypost
It's correctly rotated now for a ring as root prim. The height our
(temporary) post rezzes at is for now -0.3. Change it higher like 0 or
0.1 if you have a taller post. Todo: create a post for release
2016-07-16 19:31:26 +02:00
lickx
c744994c24 If bell on, continue making sounds after region crossings/teleports 2016-07-10 20:29:56 +02:00
lickx
2cb2ef14b8 Replace _SELF_ with WEARERNAME instead of g_sPartnerName
:)
2016-07-10 20:17:58 +02:00
lickx
5c75f85517 Use osReplaceString instead of StrReplace 2016-07-10 20:05:36 +02:00
lickx
a7099903df If bell is on, make it actually work at startup
+ ZERO_VECTOR compatibility fix for OpenSim 0.8
+ Bell sounds (from Open Collar 6)
2016-07-10 19:54:32 +02:00
lickx
e077ebf5b4 Reword no avatars found message
Closes #6
2016-07-10 17:15:37 +02:00
lickx
56786904c6 Update to info 2016-07-05 19:10:43 +02:00
lickx
09e18c2d3a Collar version, contact link 2016-07-05 13:02:58 +02:00
lickx
88e26990e7 Make group link work 2016-07-05 13:02:33 +02:00
lickx
e3ae45ad46 We use osReplaceString instead of StrReplace 2016-07-05 12:45:27 +02:00
lickx
38c0cb6bd3 Port v6 camera restrictions json code to v3
Since tightlist doesn't work (yet) in opensim
2016-07-05 12:42:35 +02:00
lickx
d073a7e2be Update http urls and info 2016-07-04 22:40:07 +02:00
lickx
ca34c1dd71 Exclude NPCs from add to owner/secowner list
Closes issue #5
2016-07-04 22:13:44 +02:00
lickx
d53b8a2163 Don't add 'Back' as owner (back button) 2016-07-04 01:19:20 +02:00
lickx
a64bfe5025 Reset on change owner 2016-07-04 01:18:48 +02:00
lickx
1937267c70 Checks for keys and NULL_KEY 2016-07-04 00:28:56 +02:00
lickx
6cabf85323 Make back buttons work 2016-07-03 23:57:30 +02:00
lickx
6bba16f246 Opensim leash fix
Resolves issue #2
2016-07-03 01:34:05 +02:00
lickx
141795719a Opensim 0.8 compatibility
ZERO_VECTOR fixes

Tested on 0.8 and 0.9
2016-02-26 17:44:54 +01:00
lickx
856b3233e6 Revert to 3.917 leash code with additions, slight bump
leash.lsl can't coexist with couples.lsl in the collar; it's either one
or the other
2016-01-31 11:45:47 +01:00
lickx
9858e7929b Remove debug llOwnerSay 2016-01-31 11:43:23 +01:00
lickx
37d0b56320 Init 2016-01-28 18:28:44 +01:00
WendyStarfall
d38e8a279f Update ~news 2015-11-07 22:55:39 +01:00
WendyStarfall
545de39d77 Update news.md 2015-10-30 11:35:24 +01:00
WendyStarfall
b937acf8ce update slurls 2015-10-12 14:57:38 +02:00
WendyStarfall
7cfb59bcd3 Update ~bookmarks 2015-10-06 03:12:42 +02:00
WendyStarfall
41362306c7 Update ~news 2015-10-06 03:12:03 +02:00
WendyStarfall
e2bf411d2a Update ~update 2015-10-06 03:10:44 +02:00
WendyStarfall
1fa3209c99 Update ~places 2015-10-06 03:01:54 +02:00
WendyStarfall
4f926dbecd Update ~contact 2015-10-06 03:01:01 +02:00
WendyStarfall
d686e97bd2 Merge pull request #549 from RomkaSwallowtail/patch-1
Force unsit when "pull leash"
2015-07-12 21:45:33 +02:00
Romka
ab48c80673 Force unsit when "pull leash"
avatar don't follow target when sitting
need force unsit
2015-07-12 21:03:21 +03:00
WendyStarfall
bf65bfd86f Merge pull request #534 from RomkaSwallowtail/patch-1
rlvmain - llSleep again
2015-06-27 08:30:57 +02:00
WendyStarfall
ef6b44b1cb Merge pull request #533 from RomkaSwallowtail/patch-2
llSleep?  bad idea. I propose to use a timer instead of llSleep.
2015-06-27 08:30:51 +02:00
Romka
d2c1b876d7 llSleep again
after check RLV, script requested MENUNAME_REQUEST and fall asleep for 5 seconds.
at this time, the script must handle MENUNAME_RESPONSE events.
at this time will not works restrictions and exceptions, collar is detachable.

5 seconds is too long for escape

I suggest using a timer... again
I think it should be tested.
2015-06-14 08:28:31 +03:00
WendyStarfall
5ae8b09d78 Merge pull request #532 from RomkaSwallowtail/patch-1
Request Permissions twice?
2015-06-12 21:33:12 +02:00
Romka
dbd9118503 Update OpenCollar - main.lsl 2015-06-12 14:47:49 +03:00
Romka
7e86565c03 llSleep? bad idea
I think that the use llSlep in the init function is a bad idea.
script sleeps for one second at on_rez and can non hanle any events!
but at the same time 'settings' script send all settings, and other scripts can sends linked messages! 
all this events are queued FIFO, but not more than 64 events, all the more are discarded!
and when the script wakes up and asks MENUNAME_REQUEST, he receives spam from FIFO and MENUNAME_RESPONSE from other scripts.
This can cause the "disappearance" of some of the menu buttons.

I propose to use a timer instead of llSleep.
2015-06-12 14:43:18 +03:00
Romka
3328b61f5f Request Permissions twice?
in fact, no need to request permission at on_rez
it is done on attach
2015-06-12 10:53:21 +03:00
WendyStarfall
8a7ce35098 fix touch self restriction #531
thanks @KarinKorpov for spotting this one
2015-05-07 00:39:54 +02:00
WendyStarfall
093ae9a892 Merge pull request #527 from RomkaSwallowtail/patch-3
Update OpenCollar - hide.lsl
2015-05-05 22:15:57 +02:00
WendyStarfall
078ec72f3b Merge pull request #528 from RomkaSwallowtail/patch-4
Update OpenCollar - bell.lsl
2015-05-05 22:11:57 +02:00
WendyStarfall
89c1779075 remove sandbox
c'est la vie
2015-04-28 01:07:01 +02:00
Romka
4ae5b55595 Update OpenCollar - bell.lsl
optimize prim glow saving
2015-04-14 12:40:54 +03:00
Romka
9e95f7c91d Update OpenCollar - hide.lsl
optimize prim glow saving
2015-04-14 12:37:52 +03:00
WendyStarfall
54b68ed315 give re-menu and infor for... pt.II
oops! forgot the important part 😇
2015-04-14 02:13:33 +02:00
WendyStarfall
675e6de3f2 give re-menu and info for all non authorized roles
that means for temporary, secondary, group/public and wearer
2015-04-14 02:11:40 +02:00
WendyStarfall
27d800e964 Merge pull request #526 from Judge17/patch-2
Update OpenCollar - leash.lsl
2015-04-10 04:24:39 +02:00
Judge17
3bc1c3decd Update OpenCollar - leash.lsl
Fix for griefer sub problem
2015-04-09 21:22:14 -05:00
WendyStarfall
2ac3c5a6ab Merge pull request #525 from RomkaSwallowtail/patch-3
Update OpenCollar - bell.lsl
2015-04-10 02:22:48 +02:00
Romka
60b00fec10 Update OpenCollar - bell.lsl
reset script when chaged owner
2015-04-09 14:13:25 +03:00
WendyStarfall
86c5623b18 update version number 2015-02-28 03:36:26 +01:00
WendyStarfall
dee3af7cb8 3.997 ready to ship
- Increased detail in informal blurb for non-RLV users with active RLV.
- Stability improvement for already listed exceptions for real auth
roles.
- Fix for wearer name refresh in assemblies that didn't reset after
production.
2015-02-28 00:44:41 +01:00
WendyStarfall
96f943ac90 make help blurb print more...
...often for non-rlv users and improve help blurb with popup_help
message.

manually merged from Virtual Disgrace source
2015-02-26 00:28:24 +01:00
WendyStarfall
6baf7c2f23 ship with RLV pre-enabled 2015-02-26 00:25:31 +01:00
WendyStarfall
78295e31ba check if exceptions are already part of rlvex lists
addressing #521
Attribution: littlemousy
manually merged from Virtual Disgrace source
2015-02-26 00:10:33 +01:00
WendyStarfall
850beb8ea4 update news
valentine's day 2015
2015-02-13 08:34:45 +01:00
WendyStarfall
fa1b1d0641 Merge pull request #520 from RomkaSwallowtail/patch-3
update prims glow save/restore
2015-01-27 07:02:09 +01:00
Romka
2f8f84e2b6 Update OpenCollar - bell.lsl 2015-01-27 08:42:19 +03:00
Romka
70487344f7 Update OpenCollar - hide.lsl
update prims glow save/restore
2015-01-27 08:40:07 +03:00
WendyStarfall
42e9101aea Merge pull request #519 from RomkaSwallowtail/patch-4
Update OpenCollar - customizer.lsl
2015-01-11 15:12:35 +01:00
WendyStarfall
9a77eb12c3 Merge pull request #518 from RomkaSwallowtail/patch-3
Update OpenCollar - styles.lsl fix some bugs
2015-01-11 15:12:16 +01:00
Romka
a50e714389 Update OpenCollar - customizer.lsl 2015-01-10 18:20:28 +03:00
Romka
91b13172b1 Update OpenCollar - styles.lsl
fix some bugs
2015-01-10 16:20:28 +03:00
WendyStarfall
40a1bb97b8 Merge pull request #517 from RomkaSwallowtail/patch-5
Update OpenCollar - shininess.lsl
2015-01-05 19:56:50 +01:00
WendyStarfall
1921268299 Merge pull request #515 from RomkaSwallowtail/patch-3
Create OpenCollar - glow.lsl
2015-01-05 19:56:35 +01:00
WendyStarfall
cd798c7903 Merge pull request #516 from RomkaSwallowtail/patch-4
Create OpenCollar - customizer.lsl
2015-01-05 19:54:09 +01:00
Romka
9d6b2bdbe8 Update OpenCollar - shininess.lsl 2015-01-04 19:25:15 +03:00
Romka
9a4d428e9b Create OpenCollar - customizer.lsl
Customizer
to change the description of the elements

I'm not sure that it should be.
2015-01-04 19:22:44 +03:00
Romka
6bb01a0dba Create OpenCollar - glow.lsl
set elements glow, like shininness
2015-01-04 19:10:04 +03:00
WendyStarfall
602ae2b19d Merge pull request #513 from RomkaSwallowtail/patch-2
Update OpenCollar - bell.lsl  Glow!
2015-01-04 01:30:11 +01:00
Romka
2bb8b5de8b Update OpenCollar - hide.lsl 2015-01-03 23:33:57 +03:00
Romka
9ac6a6f340 Update OpenCollar - bell.lsl 2015-01-03 23:31:38 +03:00
Romka
294da7e461 Update OpenCollar - bell.lsl
prim glow save/restore on hide/show bell, like as hide script
2015-01-03 23:11:50 +03:00
WendyStarfall
24d7d1e31a Merge pull request #511 from RomkaSwallowtail/patch-2
Update OpenCollar - shocker.lsl
2015-01-03 09:58:50 +01:00
WendyStarfall
f2d6c880c4 Merge pull request #510 from RomkaSwallowtail/patch-1
Update OpenCollar - styles.lsl  standalone
2015-01-03 09:58:40 +01:00
Romka
a0b0b4b4bc Update OpenCollar - styles.lsl 2015-01-03 11:54:41 +03:00
Romka
34e7e0b3aa Update OpenCollar - styles.lsl 2015-01-03 11:54:17 +03:00
Romka
66bd31853a Update OpenCollar - shocker.lsl
some polished
2015-01-03 11:39:41 +03:00
Romka
912710dc00 Update OpenCollar - styles.lsl
made standalone work, if not installed scripts texture color and shine.

stupid spaces!
2015-01-03 11:36:27 +03:00
WendyStarfall
39724f7a8e 3.995 ready to ship
- Relay uses the up to date way to query avatar "About".
- Wearers are able to break leashes they created themselves.
- RLV sections no longer irritate users with defunct V̶i̶e̶w̶ features.
- The Grabby Post has been replaced with a solid, minimal memory Leash
Post.
- The camera app has working RLV 2.9 features with alt-pan lock and
mouselook.
2015-01-02 23:52:46 +01:00
WendyStarfall
8e717b0392 add info note for cam feature requirements 2014-12-31 16:17:25 +01:00
WendyStarfall
57487a4897 Merge pull request #509 from RomkaSwallowtail/main
Update OpenCollar - rlvmain.lsl   what if RLV disabled?
2014-12-26 16:21:47 +01:00
Romka
c9be6b90aa Update OpenCollar - rlvmain.lsl
added information in RLV-menu if RLV disabled
2014-12-26 15:12:13 +03:00
WendyStarfall
9d2252077f Merge pull request #508 from RomkaSwallowtail/main
Update OpenCollar - main.lsl   "Fix Menu" for owners
2014-12-22 00:07:37 +01:00
Romka
6f48985804 Update OpenCollar - main.lsl
I think it is right.
2014-12-22 00:35:38 +03:00
WendyStarfall
b491e1701d Merge pull request #507 from RomkaSwallowtail/main
Update OpenCollar - rlvrelay.lsl
2014-12-20 16:23:17 +01:00
Romka
2d1a6eb492 Update OpenCollar - rlvrelay.lsl 2014-12-20 11:19:50 +03:00
WendyStarfall
cd9855ad51 Merge pull request #506 from RomkaSwallowtail/patch-1
Update OpenCollar - rlvstuff.lsl : Fix previous break View features on RLV 2.9
2014-12-19 22:26:39 +01:00
Romka
b1753ed25e Update OpenCollar - rlvstuff.lsl 2014-12-19 23:35:50 +03:00
Romka
9aa966afe8 Update OpenCollar - rlvstuff.lsl
fix break View features on RLV 2.9
2014-12-19 23:25:06 +03:00
WendyStarfall
c8e66e4405 Merge pull request #504 from RomkaSwallowtail/patch-2
Update OpenCollar - rlvstuff.lsl  SitNow don't work!
2014-12-19 20:38:10 +01:00
WendyStarfall
d60d02e836 Merge pull request #505 from RomkaSwallowtail/patch-3
Update OpenCollar - listener.lsl   llGetOwnerKey(kID)
2014-12-19 20:36:37 +01:00
WendyStarfall
af040ba760 Merge pull request #503 from RomkaSwallowtail/patch-1
Update BUNDLE_99_Clutter_DEPRECATED, remove old rlv scripts
2014-12-19 20:32:06 +01:00
Romka
627b64ab24 Update OpenCollar - listener.lsl
is no need llGetOwnerKey(kID) in this
auth works properly without them, Owner HUD and Grabby/Leash Post too
2014-12-19 18:16:41 +03:00
Romka
9c5a1c03a0 Update OpenCollar - rlvstuff.lsl
fix sBehavior for  'sit:<uuid>=force' command
2014-12-19 17:59:21 +03:00
Romka
12596233c1 Update BUNDLE_99_Clutter_DEPRECATED
remove old unused scripts, they replaced by rlvstuff
2014-12-19 16:13:02 +03:00
WendyStarfall
ffabe106da rlvview redundant with changes in rlvstuff
rather than introducing a whole extra, optional script, this is solved
by a short info note in the view section in stuff
2014-12-19 06:06:10 +01:00
WendyStarfall
d808eb3153 Revert "Use Say instead of regionsay for ping response"
This reverts commit 0351f9cceb.
2014-12-19 05:36:52 +01:00
WendyStarfall
3f35710386 change "landmark" to "bookmark" in dialog 2014-12-19 05:29:15 +01:00
WendyStarfall
a83d2e6e1e fix undesired force tps by obsolete devices 2014-12-19 05:25:34 +01:00
WendyStarfall
eaee57bde1 swap posts; make rezpost leash wearer
this is a trick I learned from mouse
2014-12-19 04:45:09 +01:00
WendyStarfall
32ad6e5ee7 add info note for view features 2014-12-19 04:02:08 +01:00
WendyStarfall
bbce07c42c resurrect view section
Alright, so we said we make a test to see if the minimum required
version of RLV is used and depending on that have several options how to
handle things if the version cannot play camera/view features:

a) We use an alternative menu informing the minimum required RLV version
is not used.

b) We don't show the button in the first place.

c) We show the button but instead of letting it give the menu we do a
notify to inform the minimum required RLV version is not used.
2014-12-17 00:16:07 +01:00
WendyStarfall
995770339e create rlvview spare part (read description!)
This is a copy of rlvstuff with only the Camera/View specific features,
however, there are also leftovers from sit commands etc.. so it will
have to be cleaned up before putting it into a collar.

For now, we can work on this source and improve the view section to
merge it back into rlvstuff at a later point or we can work on our
existing optional Camera app.

Camera/View features as present in RLV 2.9 have to remain optional until
the majority of viewers provide this or a similar feature set and there
is no rush for this.
2014-12-15 01:05:36 +01:00
WendyStarfall
f184503c65 remove view section 2014-12-15 00:52:38 +01:00
WendyStarfall
7023ed2b96 make modes also set camunlock restriction...
...or the wearer can simply alt-zoom/pan elsewhere; this could
optionally be replaced with a checkbox tho
2014-12-15 00:50:46 +01:00
WendyStarfall
9a176fd654 add mouselook feature 2014-12-15 00:09:09 +01:00
WendyStarfall
21292074c8 make ClearCam function lift camunlock restriction 2014-12-14 23:10:42 +01:00
WendyStarfall
ae61b2128e make LockCam function set camunlock restriction 2014-12-14 23:09:58 +01:00
WendyStarfall
55b8155d85 add rlv command message 2014-12-14 23:07:47 +01:00
littlemousy
0351f9cceb Use Say instead of regionsay for ping response
say the response instead of regionsay.  Regionsay goes further, but always goes to the object's owner, not the object itself.  This breaks grabbypost, and any other items using the ownerchannel that aren't worn attachments.
2014-12-11 20:07:34 +00:00
littlemousy
4f49c597c5 Merge pull request #499 from ml132/main
Added tpto:<coord>=force processing to bookmarks.lsl
2014-12-09 10:28:59 +00:00
littlemousy
8bbfd0240a Grant wearer permission to break leashes they create themselves 2014-12-05 16:37:40 +00:00
Alex (ml132)
e7d92c08ea Added tptp:<coord>=force processing to bookmarks.lsl
Due to recent changes, Opencollar no longer accepts the command
"tpto:<coord>=force" (tested with the old owner hud).  This commit fixes
this issue.
2014-12-01 18:32:21 -08:00
littlemousy
50b3b6b4c1 Merge pull request #498 from RomkaSwallowtail/main
Update OpenCollar - badwords.lsl    don't disable and clear badwords on Safeword
2014-12-01 19:54:30 +00:00
Romka
714a4683f7 Update OpenCollar - badwords.lsl 2014-12-01 21:06:00 +03:00
littlemousy
7d18872a7e Merge pull request #497 from RomkaSwallowtail/main
Update OpenCollar - badwords.lsl            clear clutters, fix Safeword
2014-12-01 15:03:48 +00:00
Romka
0498b8854e Update OpenCollar - badwords.lsl
clear clutters, fix Safeword
2014-12-01 17:35:19 +03:00
WendyStarfall
c77c1ab88f update news
marketplace availability
2014-11-28 09:52:22 +01:00
WendyStarfall
8c38b203f3 3.994 ready to ship
- stabilize behaviour for secowner list
- reliably clear secowner exceptions
2014-11-24 02:54:23 +01:00
WendyStarfall
76fe6f4c37 clear exceptions for removed agents (#493)
for some reason exceptions for primary owners were cleared correctly
without this change but not for secondary owners; this should take care
of both
2014-11-23 23:30:26 +01:00
WendyStarfall
b6cb47c5e8 remove ~secowners artifact in OldToken fix (#493)
this should clear secondary owner lists properly without leaving an
empty ~secowners string in our settings cache behind
2014-11-23 23:08:58 +01:00
WendyStarfall
8b2c7356e3 bandaid for #493
needs to be looked over by mouse; the problem with sec owners not removed from the list is solved here, we keep a settings artifact "secowners~" but access and exceptions are added and cleared correctly
2014-11-22 15:16:28 +01:00
WendyStarfall
a1c2eb3c25 change default plugin menu to Apps 2014-11-18 22:52:40 +01:00
WendyStarfall
f905a7a690 3.993 ready to ship
- fix for runaway disabler
- fix for clearing rlv in timer
2014-11-18 17:03:43 +01:00
littlemousy
7cdcea5334 fix menu bug going up from root actions 2014-11-18 15:53:00 +00:00
WendyStarfall
e70e07eb99 Merge pull request #491 from Ansariel/main
Added basic support for Gaeline AOs
2014-11-03 05:26:34 +01:00
Ansariel Hiller
b2659991ee Added basic support for Gaeline AOs 2014-11-03 02:13:33 +01:00
littlemousy
4c7e369437 Merge pull request #486 from ml132/patch-1
Don't treat rlv commands (tplm=n) as teleport requests
2014-10-28 09:13:08 +00:00
Alex
e055bf9911 Don't treat rlv commands (tplm=n) as teleport requests
When using the chat commands for the teleport restrictions, this change prevents the script for searching for landmarks named "m=n", "oc=n" and "ure=n"
2014-10-27 20:48:08 -07:00
littlemousy
a2dd701c2d Fix typo in save settings string
Addresses #485
2014-10-28 01:58:04 +00:00
littlemousy
50fdf5aac7 Merge pull request #481 from RomkaSwallowtail/main
Adjustment as plugin
2014-10-27 10:57:57 +00:00
littlemousy
ad01c6b623 Merge pull request #484 from masterofsorts/patch-1
Update OpenCollar - rlvstuff.lsl
2014-10-27 09:44:50 +00:00
masterofsorts
3d1d18236c Update OpenCollar - rlvstuff.lsl
Removing : as a delimiter, these elements should be fed forward to RLV main
2014-10-27 05:08:47 +00:00
littlemousy
5149a88dff Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main 2014-10-24 16:03:07 +01:00
littlemousy
266dc72f7c Replace "RESET" command with "clear" to release RLV locks
Fix issue #482
2014-10-24 16:00:53 +01:00
Romka
bc7bbd57b5 Update BUNDLE_01_Core_REQUIRED
Adjustments as plugin
2014-10-23 20:18:45 +04:00
Romka
76620dee31 Create BUNDLE_25_Adjustment_INSTALL
Adjustments as plugin
2014-10-23 20:18:04 +04:00
littlemousy
e1ea1e9688 Merge pull request #477 from RomkaSwallowtail/main
appearance and adjustment menus corrections
2014-10-23 14:53:54 +01:00
Romka
9984e6cf39 Update OpenCollar - main.lsl
fix the url
2014-10-23 14:51:55 +04:00
Romka
7ab3d9c8f4 Update OpenCollar - adjustment.lsl 2014-10-23 14:36:52 +04:00
littlemousy
57a04204eb Merge pull request #475 from RomkaSwallowtail/main
rename Appearace to Adjustment
2014-10-22 21:59:40 +01:00
littlemousy
7d15f00424 Merge pull request #476 from RomkaSwallowtail/patch-1
Update OpenCollar - bell.lsl
2014-10-22 21:58:18 +01:00
Romka
84b7ab0177 Update OpenCollar - bell.lsl
remove clutter
add CTYPE
change save settings
2014-10-23 00:51:16 +04:00
littlemousy
5a8ab58fd4 Reset Appearance menu buttons on menu reset 2014-10-22 14:39:04 +01:00
Romka
8aba2025fc Update BUNDLE_99_Clutter_DEPRECATED 2014-10-21 08:54:01 +04:00
Romka
460169444f Update BUNDLE_01_Core_REQUIRED
appearance -> adjustment
2014-10-21 08:51:01 +04:00
Romka
772812b809 Update and rename OpenCollar - appearance.lsl to OpenCollar - adjustment.lsl
rename
2014-10-21 08:48:38 +04:00
Romka
49f8af09a5 Merge pull request #1 from OpenCollar/main
3.992 ready to ship
2014-10-21 08:43:30 +04:00
WendyStarfall
5b1e68bbe3 3.992 ready to ship
- fix for "re-sit on relog" nuisance
2014-10-20 16:18:42 +02:00
WendyStarfall
0bed553921 Merge pull request #471 from RomkaSwallowtail/patch-1
Update OpenCollar - appearance.lsl     swop axes ?
2014-10-18 02:06:20 +02:00
littlemousy
05d2552360 Fix problem with forced sit on relog 2014-10-17 08:56:51 +01:00
Romka
f830549e69 Update OpenCollar - appearance.lsl 2014-10-16 23:18:54 +04:00
Romka
e5af110ebd Update OpenCollar - appearance.lsl 2014-10-16 23:15:06 +04:00
Romka
d3b852d3eb Update OpenCollar - appearance.lsl
swop  X Y Z axes depending on the attachment, for correct buttons response
2014-10-16 23:06:25 +04:00
littlemousy
2f2b5ee389 Merge pull request #470 from RomkaSwallowtail/patch-1
Update OpenCollar - appearance.lsl    optimisation
2014-10-16 15:20:24 +01:00
Romka
78803a72b3 Update OpenCollar - appearance.lsl
remove clutter
slight optimisation
allow Owner access menu

maybe rename script to 'adjust' ?
2014-10-16 18:05:23 +04:00
littlemousy
f129878e68 Same again, without the debug. 2014-10-16 03:36:28 +01:00
littlemousy
4950971d2f First step in decoupling size/position from root of appearance subsystem.
The current Appearance script act as a root for all of the appearance functions, and also includes a (mainly redundant) resize and positioning system that duplicates viewer controls.  This commit is the first step in getting Main to hold the appearance menu (if any appearance plugins are installed) along with the appearance lock. This will allow users to install whichever appearance module they like without needing the size/position baggage they might not want.
Still needs a few loose ends tidying up, and the normal optimization.
2014-10-16 03:21:51 +01:00
littlemousy
304f553839 Merge pull request #469 from RomkaSwallowtail/patch-1
Update OpenCollar - badwords.lsl   WEARERNAME
2014-10-15 20:50:02 +01:00
Romka
10ea3ae8c8 Update OpenCollar - badwords.lsl
llWhisper or llSay ?
2014-10-15 23:14:24 +04:00
littlemousy
0d13f69c82 Add placeholder for llSetMemoryLimit() in each script
This should be the last of the debug/profile changes ( #331 )
2014-10-15 09:01:57 +01:00
littlemousy
864e291848 Merge pull request #468 from RomkaSwallowtail/patch-1
Update OpenCollar - anim.lsl  -  a typo!
2014-10-15 08:53:54 +01:00
Romka
69c6cf0ac7 Update OpenCollar - anim.lsl
a typo!
2014-10-15 10:52:30 +04:00
WendyStarfall
b8fc0a7e35 3.991 ready to ship
- fix for events in anim
- fix for unwanted sit restriction in stuff
2014-10-15 06:58:05 +02:00
littlemousy
3c234659a0 Fix bugs in last round of Debug changes ( issue #331 ) 2014-10-15 02:00:58 +01:00
littlemousy
2c520b7b86 Remove unwanted unsit=n
unsit=y....unsit=n sent in error regardless of existing sit restriction.
Another catch by Romka.  Thanks!
2014-10-14 15:15:32 +01:00
littlemousy
8441ab2de3 Add standard debug function with profiling.
See Issue #331
2014-10-14 09:48:26 +01:00
littlemousy
808f4d1121 Fix second permissions bug from new collars 2014-10-14 00:32:15 +01:00
littlemousy
ad2ca9c0f9 Quick fix to anim permissions bug in new collars 2014-10-13 23:18:23 +01:00
littlemousy
06c80ce05b Quick fix to anim permissions bug
on_rez event fires before change event, where script is reset on owner change.  Getting the owner key dynamically here should prevent the error by requeting permissions from the correct avatar.
2014-10-13 23:14:30 +01:00
littlemousy
fac4c942ab changes to debug 2014-10-13 23:12:55 +01:00
littlemousy
c52cf54de9 Add llSetTimerEvent call
Well spotted Romka.  Timer events don't do anything without setting up the timers to call them :)
Fixed.
2014-10-13 18:56:51 +01:00
littlemousy
a1ffea27e9 Merge pull request #463 from RomkaSwallowtail/patch-1
Update OpenCollar - listener.lsl  a typo
2014-10-13 18:55:00 +01:00
Romka
b656d54023 Update OpenCollar - listener.lsl
a typo

and look at line 641    timer()
where llSetTimerEvent( time ) ?
2014-10-13 21:50:14 +04:00
littlemousy
d1920554e7 Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main 2014-10-13 18:50:11 +01:00
littlemousy
fc8ba75462 Re-added GetName(...) function.
Clobbered Romka's GetName function in my last commit, replaced.
2014-10-13 18:39:08 +01:00
littlemousy
af822987d0 fix typos in variable names 2014-10-13 18:33:47 +01:00
littlemousy
678fb7bf3b Make listener respond to WEARERNAME deletes.
If listener sends out the "default" wearername after wearername is reset, all other scripts don't need to know how to preapre the default wearer name.
Also, no need for other scripts to listen for the WEARERNAME delete messages.
2014-10-13 18:23:11 +01:00
littlemousy
e4a14a490e Refactor for better memory useage 2014-10-13 18:11:17 +01:00
littlemousy
06682e9238 Make listener respond to WEARERNAME deletes.
If listener sends out the "default" wearername after wearername is reset, all other scripts don't need to know how to preapre the default wearer name.
Also, no need for other scripts to listen for the WEARERNAME delete messages.
2014-10-13 17:35:17 +01:00
WendyStarfall
2563d35a2f 3.990 ready to ship
3.990 Summary:

- fix for valid tpto commands in bookmarks from 3.944 HUDs (Sumi)
- touch feature for bell (Romka)
- changes to notify handling in all scripts (Romka)
- cosmetic fix for a chat prompt in leash (mrbendig)
- automatic correction for description in floattext elements on update
(Romka)
- fix for temporary ownership token (mouse)
- fix for a loop coming from the relay (mouse)
- tweak for checking rlv in the viewer (mouse)
- re-menu and information for non-authorized attempts to access rlvex
(Wendy)
- replace and replace all buttons in rlvfolders restored (Wendy)
- wrap-up for touch feature in bell while keeping the menu visually
familiar (Wendy)
- global wearer name support for bell (Wendy)
- optimization for global wearer name support in bell (Romka)
- nicer formatting for multi-page menus and those with menu keys (Wendy)
- major tidy up for timer in menus and code readability (Wendy)
- fix for unleash perms on timer expiration while wearer is offline
(mouse)
- merge of all rlv plugins into rlvstuff (mouse)
- new features for touch restrictions (mouse)
- implementation of miscellaneous feature set in rlvstuff (Wendy)
- new features for visibility restrictions (Wendy)
- "prettynames" can now contain spaces (mouse)
- fine polishes for restriction names and descriptions (Wendy)
- fix for hovertext restriction in misc (Wendy)
- further tidy-up with Notifies (Romka)
- llRegionSayTo implemented where meaningful (Romka)
- changes in timer menu composition (Wendy)
- llOwnerSay where more efficient than Notify (Romka)
- fix in SitNow command rewrite (mouse)
- fix for nuisance in timed unleashing if unleashed (mouse)
- cosmetic enhancements in auth from disgraced collars (Wendy)
- major optimization and cleanup for the animation script (mouse)
- fix for a rare bug where poses might get stuck (mouse)
- change plus and minus unicode symbols for localized OS compatibility
(Wendy)
2014-10-13 05:15:42 +02:00
WendyStarfall
8aced1d9d2 change plus and minus symbols...
...apparently some localized versions of windows 7 don't have the
unicode character block for mathematical operators installed by default.

On the other hand, I already had a funny feeling in my belly when I did
83b7a4c841 hence the pie. (There is also
emoji for pie by the way.)
2014-10-12 18:10:31 +02:00
WendyStarfall
207a204783 sync in-world at 3.990 (RC)
- major optimization for the animation script
- fixes a rare bug that makes users stuck in a pose
- cosmetic changes in auth dialog menu
2014-10-12 02:10:34 +02:00
littlemousy
6f53c71fe0 Remove debug... D'oh! 2014-10-12 00:50:48 +01:00
littlemousy
f498c4bfa1 General cleanup, removed un-needed clutter
Big optimize of various parts of the code for better memory use.  Functionality should be same as before.
2014-10-12 00:48:54 +01:00
WendyStarfall
83b7a4c841 three point one four one five nine two six
five three five eight nine seven nine three two three eight four six two
six four three three eight three two seven nine five zero two eight
eight four one nine seven one six nine three nine nine three seven five
one zero five eight two zero nine seven four nine four four five nine
two three zero seven eight one six four zero six two eight six two zero
eight nine nine eight six two eight zero three four eight two five three
four two one one seven zero six seven nine eight two one four eight zero
eight six five one three two eight two three zero six six four seven
zero nine three eight four four six zero nine five five zero five eight
two two three one seven two five three five nine four zero eight one two
eight four eight one one one seven four five zero two eight four one
zero two seven zero one nine three eight five two one one zero five five
five nine six four four six two two nine four eight nine five four nine
three zero three eight one nine six four four two eight eight one zero
nine seven five six six five nine three three four four six one two
eight four seven five six four eight two three three seven eight six
seven eight three one six five two seven one two zero one nine zero nine
one four five six four eight five six six nine two three four six zero
three four eight six one zero four five four three two six six four
eight two one three three nine three six zero seven two six zero two
four nine one four one two seven three...
2014-10-10 03:02:34 +02:00
WendyStarfall
f02d7d31f1 sync in-world at 3.990 (BUILD 8)
- changes in timer menu compostion
- llOwnerSay where more efficient than Notify
- fix in SitNow command
- fix for nuisance in timed unleashing if unleashed
2014-10-10 02:21:18 +02:00
WendyStarfall
feab97891f Merge pull request #458 from RomkaSwallowtail/main
remove clutter
2014-10-10 01:58:00 +02:00
littlemousy
92477f1cc2 Add wearer key as recipient for unleash messages 2014-10-10 00:30:52 +01:00
littlemousy
4f9f574dd4 Fix immediate command bug
Fixed error in strided list lookup for identifying immediate comands
added missing "_" for sit usercommand
removed a bucket full of llToLower I accidentally spilled while coding.. sorry 'bout that
2014-10-10 00:29:25 +01:00
Romka
3ce8137ed7 Update OpenCollar - timer.lsl 2014-10-10 02:37:14 +04:00
Romka
b952703e7d Update OpenCollar - shocker.lsl 2014-10-10 02:34:18 +04:00
Romka
f30b161748 Update OpenCollar - rlvstuff.lsl 2014-10-10 02:33:30 +04:00
Romka
b70a211bd0 Update OpenCollar - rlvrelay.lsl 2014-10-10 02:32:50 +04:00
Romka
88d5135168 Update OpenCollar - rlvmain.lsl 2014-10-10 02:32:15 +04:00
Romka
6cb5cdc866 Update OpenCollar - main.lsl 2014-10-10 02:31:28 +04:00
Romka
eca76c8edb Update OpenCollar - listener.lsl 2014-10-10 02:30:33 +04:00
Romka
7b442b400b Update OpenCollar - leash.lsl 2014-10-10 02:29:03 +04:00
Romka
0e482e0206 Update OpenCollar - couples.lsl 2014-10-10 02:28:14 +04:00
Romka
eee5acebeb Update OpenCollar - badwords.lsl 2014-10-10 02:27:27 +04:00
Romka
c2c62362c0 Update OpenCollar - auth.lsl 2014-10-10 01:46:53 +04:00
Romka
170d505d39 Update OpenCollar - anim.lsl 2014-10-10 01:33:23 +04:00
Romka
9b9125a76b Update OpenCollar - main.lsl 2014-10-10 01:02:44 +04:00
Romka
8a5e6bb499 Update OpenCollar - listener.lsl 2014-10-10 00:59:41 +04:00
Romka
f2aa0cf4bf Update OpenCollar - auth.lsl 2014-10-10 00:56:10 +04:00
Romka
1feb070f52 Update OpenCollar - anim.lsl 2014-10-10 00:50:59 +04:00
WendyStarfall
9768c734d9 remove clutter; add pizza 2014-10-09 20:53:22 +02:00
WendyStarfall
110fd83038 sync in-world at 3.990 (BUILD 6)
- merge of all rlv plugins
- new features for touch restrictions
- new features for visibility restrictions
- "prettynames" can now contain spaces
- fine polishes for restriction names and descriptions
- fix for hovertext restriction in misc
- further tidy-up with Notifies
- llRegionSayTo implemented where meaningful
2014-10-09 19:12:22 +02:00
WendyStarfall
1b845a4148 Merge pull request #457 from RomkaSwallowtail/main
llRegionSayTo  instead  llWhisper #456
2014-10-09 18:31:59 +02:00
WendyStarfall
43582b38fd Merge pull request #455 from RomkaSwallowtail/patch-1
Update OpenCollar - rlvrelay.lsl    Instant Messages ?
2014-10-09 17:59:06 +02:00
Romka
43d8d09996 Update OpenCollar - timer.lsl 2014-10-09 19:44:30 +04:00
Romka
8722186c42 Update OpenCollar - main.lsl 2014-10-09 19:41:15 +04:00
Romka
d8f5681959 Update OpenCollar - listener.lsl 2014-10-09 19:39:45 +04:00
Romka
7718e567f0 Update OpenCollar - couples.lsl 2014-10-09 19:38:04 +04:00
Romka
438ee81262 Update OpenCollar - auth.lsl 2014-10-09 19:35:12 +04:00
Romka
274a420e20 Update OpenCollar - anim.lsl 2014-10-09 19:31:35 +04:00
Romka
e6b4d13719 Merge pull request #4 from OpenCollar/main
update3
2014-10-09 19:24:44 +04:00
Romka
78e044ffb0 Update OpenCollar - rlvrelay.lsl
replace llInstantMessage(kID,...   with Notify(kID, ...
2014-10-09 17:59:45 +04:00
WendyStarfall
ba2b0a4493 Merge pull request #454 from RomkaSwallowtail/patch-1
Update OpenCollar - rlvstuff.lsl  Notify..
2014-10-09 14:10:41 +02:00
Romka
68844c994a Update OpenCollar - rlvstuff.lsl
add llRegionSayTo into Notify
2014-10-09 12:04:38 +04:00
WendyStarfall
5ebe162d43 delete rlvmisc, rlvsit, rlvtalk and rlvtp 2014-10-09 04:05:10 +02:00
WendyStarfall
155f4b4302 change hovertext command 2014-10-09 00:25:36 +02:00
littlemousy
f4d9c8a512 Fix "no spaces in button names" issue
also substitute already prepared variable for redundant llList2String calls
correct long comment closes
2014-10-08 21:30:59 +01:00
WendyStarfall
1ecdc62c3d change prettyname and description in rlvtalk...
...and change manual links

This will need a fix for prettynames with spaces.
2014-10-08 21:36:24 +02:00
WendyStarfall
d5dfacc0c6 disable debugging and profiling
Mouse added a very clever way to disable/enable debugging. It's
efficient, quick and a chimpanzee would be able to use this method.
However, you should keep in mind that when you let the compiler bop you
from line, it's a genuinely bad idea to do this in a script nested
inside of an object you are currently wearing. The asset will go
hay-wire eventually and you might lose n hours of work unless you
regularly save back to your local drive. This has nothing to do with the
debugging, it's just if saving a nested script in quicker succession
than the database can keep track of it.

I've created a short ritual for myself, you do it your way but maybe
this might help you too:

1. I decide that the script is now production ready
2. I load the contents of my collar
3. I drag the script I had been working on to my inventory
4. I close all scripts to prevent mixing stuff up
5. I open the script in my inventory
6. I follow the pattern to disable debugging
7. I save to my local drive when the compiler is happy
8. I open my object once again and load the production ready script from
my local drive

This is happening in motion with guideline #331 and committed for future
reference.
2014-10-08 19:16:45 +02:00
WendyStarfall
669708c94c i eated whitespaec 2014-10-08 18:58:49 +02:00
WendyStarfall
c3fe34a471 add view section
The menu button itself is striked through to make it visually more
understandable these features will likely not work.

We require a user to run a minimum RLV version of 2.9 which isn't part
of many viewers yet. A manual page explaining that will be made
available.
2014-10-08 18:30:48 +02:00
WendyStarfall
bb951b3f04 add unicode, shorten touch restriction names 2014-10-08 17:40:21 +02:00
WendyStarfall
478fed6ebb Merge pull request #452 from RomkaSwallowtail/patch-1
Update OpenCollar - shocker.lsl
2014-10-07 22:48:09 +02:00
WendyStarfall
6507d17cb3 add misc section 2014-10-07 21:45:11 +02:00
Romka
03fa3ec2d9 Merge pull request #3 from OpenCollar/main
update
2014-10-07 22:56:27 +04:00
Romka
c9e4683e8e Update OpenCollar - shocker.lsl 2014-10-07 22:53:49 +04:00
Romka
0d2c3c7bf6 Update OpenCollar - shocker.lsl
notify, wearername, e.t.c.
2014-10-07 22:51:02 +04:00
littlemousy
a27f9924e1 merge several rlv restrictions scripts 2014-10-07 19:48:48 +01:00
WendyStarfall
1d5a706f78 sync in-world at 3.989
- re-menu and information for non-authorized attempts to access rlvex
- replace and replace all buttons in rlvfolders restored
- wrap-up for touch feature in bell while keeping the menu visually
familiar
- global wearer name support for bell
- nicer formatting for multi-page menus and those with menu keys
- tidy up for timer and fix for unleash perms on timer expiration while
wearer is offline
2014-10-07 19:59:26 +02:00
Romka
83db19c451 Merge pull request #2 from OpenCollar/main
update2
2014-10-07 20:22:57 +04:00
littlemousy
cf97e57042 Test unleash permissions at timer expiry
Timer script was removing unleash request from timers when wearer was releashed.  Removed clearing g_iUnleash at leash change, and added a permission check at timer expiry.
2014-10-07 15:36:09 +01:00
WendyStarfall
e7b4ecba01 tidy up and preparations to address #438
- remove redundant commentary
- remove unused keys and integers
- remove dead functions
- remove plugin template artifacts
- update global name for attachments to 3.9 API
- change and format button names
- add feature to reset both timers in root menu
- make buttons arrange orderly
- fix spelling in function names and dialogs
- change flag for link constants
2014-10-07 16:15:11 +02:00
Romka
6505032906 Merge pull request #1 from OpenCollar/main
1
2014-10-07 08:26:42 +04:00
WendyStarfall
6806af5630 Merge pull request #450 from RomkaSwallowtail/patch-2
Update OpenCollar - bell.lsl DisplayName
2014-10-06 23:08:29 +02:00
Romka
0f6c1aad46 Update OpenCollar - bell.lsl
user define function to get DisplayName for wearer and toucher.
not need spaces for "sort" buttons ON/OFF SHOW/HIDE
2014-10-06 18:29:40 +04:00
WendyStarfall
a784df7456 add linebreak for page counter...
...and nicer formatting for large dialogs with menu keys
2014-10-06 16:10:35 +02:00
WendyStarfall
4a2862f782 restore replace and replace all buttons
#441
2014-10-06 15:56:21 +02:00
WendyStarfall
1827e5e1ff add global wearer name support 2014-10-06 15:35:07 +02:00
WendyStarfall
a990bdc8de remove extra token for touch setting
we don't need the extra setting, if shown, it rings on touch and setting
is "show"
2014-10-06 15:18:01 +02:00
WendyStarfall
7c4cd08b8f make bell always ring on touch if shown
if the bell is ON, we have it ringing on walk, if it is SHOWN we have it
ringing on touch regardless if ON or OFF
2014-10-06 15:13:12 +02:00
WendyStarfall
bf6d0a842c make owned wearers receive re-menu...
...on touching Exceptions and inform them; #448
2014-10-06 14:42:15 +02:00
WendyStarfall
fb6cf1f01f sync in-world at 3.988
####Summary

- changes to notify handling in all scripts
- cosmetic fix for a chat prompt in leash
- automatic correction for description in floattext elements when doing
updates on rezzed collars
- fix for temporary ownership token
- fix for a loop coming from the relay
- tweak for checking rlv in the viewer
2014-10-06 14:03:59 +02:00
littlemousy
d39b7d27d4 Tweak versioncheck
Verioncheck is now disabled when RLV is switched off
2014-10-06 03:49:47 +01:00
WendyStarfall
a124d78c1e update news
covers the german temple and a version blip
2014-10-03 06:48:20 +02:00
littlemousy
6d43400657 fix loop bug in showrestrictions 2014-10-02 00:16:43 +01:00
littlemousy
333d31ea6c typo 2014-09-29 14:19:25 +01:00
WendyStarfall
501a717cfc Merge pull request #446 from RomkaSwallowtail/patch-1
Update OpenCollar - titler.lsl    colorizer and titler
2014-09-28 13:09:41 +02:00
WendyStarfall
805285c250 Merge pull request #445 from mrbendig/main
fixed small double space
2014-09-28 13:09:20 +02:00
Romka
d3463eeee5 Update OpenCollar - titler.lsl
add change prim description
for issue #442
2014-09-28 10:59:09 +04:00
Rainer Bendig
9bfeadc925 fixed small double space 2014-09-28 02:02:09 +02:00
WendyStarfall
124afd713f Merge pull request #444 from RomkaSwallowtail/main
Notify.... again... big change.... new attempt
2014-09-27 16:41:55 +02:00
WendyStarfall
a33dcf66a3 sync in-world at 3.987
auth, main and rlvmain
2014-09-27 14:02:38 +02:00
WendyStarfall
57aa062ba4 change web link and wording 2014-09-27 14:00:01 +02:00
Romka
8dc66805c9 Update OpenCollar - takeme.lsl 2014-09-26 13:45:33 +04:00
Romka
c6b598d205 Update OpenCollar - shocker.lsl 2014-09-26 13:44:36 +04:00
Romka
4d4a7ed5fb Update OpenCollar - safezone.lsl 2014-09-26 13:43:42 +04:00
Romka
624fe2b8f5 Update OpenCollar - rlvcmd.lsl 2014-09-26 13:42:48 +04:00
Romka
942c328e8d Update OpenCollar - paint.lsl 2014-09-26 13:40:45 +04:00
Romka
5217ac4b94 Update OpenCollar - outfits.lsl 2014-09-26 13:38:54 +04:00
Romka
b44ebc6928 Update OpenCollar - leashParticle.lsl 2014-09-26 13:37:54 +04:00
Romka
9164b0773d Update OpenCollar - capture.lsl 2014-09-26 13:36:52 +04:00
Romka
268e3a098d Update OpenCollar - cagehome.lsl 2014-09-26 13:35:33 +04:00
Romka
e6d16ab86c Update OpenCollarUpdater - Master.lsl 2014-09-26 13:29:19 +04:00
Romka
30de110d03 Update OpenCollarUpdater - Dialog.lsl 2014-09-26 13:24:26 +04:00
Romka
a54635b96f Update OpenCollar - titler.lsl 2014-09-26 13:21:38 +04:00
Romka
81562a09c2 Update OpenCollar - timer.lsl 2014-09-26 13:20:19 +04:00
Romka
ff46185970 Update OpenCollar - texture.lsl 2014-09-26 13:16:17 +04:00
Romka
da69b623a8 Update OpenCollar - styles.lsl 2014-09-26 13:15:44 +04:00
Romka
8f669eed10 Update OpenCollar - shininess.lsl 2014-09-26 13:14:41 +04:00
Romka
45e3d7337f Update OpenCollar - settings.lsl 2014-09-26 13:13:29 +04:00
Romka
2925d3a5f4 Update OpenCollar - rlvundress.lsl 2014-09-26 13:12:56 +04:00
Romka
bba26c49f7 Update OpenCollar - rlvtp.lsl 2014-09-26 13:04:57 +04:00
Romka
f524ac05e2 Update OpenCollar - rlvtalk.lsl 2014-09-26 13:04:09 +04:00
Romka
01b7149f11 Update OpenCollar - rlvsit.lsl 2014-09-26 13:03:20 +04:00
Romka
aa125485c3 Update OpenCollar - rlvrelay.lsl 2014-09-26 13:02:26 +04:00
Romka
0ecad78ce0 Update OpenCollar - rlvmisc.lsl 2014-09-26 13:01:41 +04:00
Romka
56f7dd5c61 Update OpenCollar - rlvmain.lsl 2014-09-26 13:01:01 +04:00
Romka
3ad7b0092d Update OpenCollar - rlvfolders.lsl 2014-09-26 13:00:16 +04:00
Romka
573cee7354 Update OpenCollar - rlvex.lsl 2014-09-26 12:59:32 +04:00
Romka
161eef5e25 Update OpenCollar - plugin template.lsl 2014-09-26 12:58:04 +04:00
Romka
41f7fc5eb1 Update OpenCollar - main.lsl 2014-09-26 12:56:30 +04:00
Romka
2d118af577 Update OpenCollar - listener.lsl 2014-09-26 12:55:30 +04:00
Romka
7a4172c901 Update OpenCollar - leashParticle.lsl 2014-09-26 12:54:18 +04:00
Romka
2c790cf172 Update OpenCollar - leash.lsl 2014-09-26 12:53:27 +04:00
Romka
526f3e6109 Update OpenCollar - leash.lsl 2014-09-26 12:52:41 +04:00
Romka
2885070b08 Update OpenCollar - label.lsl 2014-09-26 12:51:24 +04:00
Romka
b72f6dd1c5 Update OpenCollar - hide.lsl 2014-09-26 12:49:33 +04:00
Romka
57595b5d1d Update OpenCollar - garble.lsl 2014-09-26 12:49:00 +04:00
Romka
fbd5fd48e0 Update OpenCollar - dialog.lsl 2014-09-26 12:46:47 +04:00
Romka
29afe03d3c Update OpenCollar - couples.lsl 2014-09-26 12:46:01 +04:00
Romka
542848bece Update OpenCollar - color.lsl 2014-09-26 12:44:13 +04:00
Romka
78b9ae988d Update OpenCollar - camera.lsl 2014-09-26 12:43:20 +04:00
Romka
b6233d83c8 Update OpenCollar - bookmarks.lsl 2014-09-26 12:41:59 +04:00
Romka
9c1582b77c Update OpenCollar - badwords.lsl 2014-09-26 12:39:27 +04:00
Romka
642363245b Update OpenCollar - auth.lsl 2014-09-26 12:36:12 +04:00
Romka
0a2b55879b Update OpenCollar - auth.lsl 2014-09-26 12:35:51 +04:00
Romka
adc2b5b353 Update OpenCollar - bell.lsl 2014-09-26 12:34:11 +04:00
Romka
23d2c2fad4 Update OpenCollar - appearance.lsl 2014-09-26 12:33:24 +04:00
Romka
825fedfa9a Update OpenCollar - bell.lsl 2014-09-26 12:30:56 +04:00
Romka
2288a7c496 Update OpenCollar - anim.lsl 2014-09-26 12:30:05 +04:00
littlemousy
324fa793ef add hook for utility RLV functions to not be cleared by safeword 2014-09-24 21:37:12 +01:00
WendyStarfall
2f4c6ff618 sync in-world at 3.986
main and rlvmain...

...and a 🍺 for mouse!
2014-09-24 22:35:43 +02:00
littlemousy
8fdfb3be83 Use textkey for lock in RLV_REFRESH/RLV_CLEAR 2014-09-24 21:11:41 +01:00
littlemousy
f05ea00c3e inlined single line SendCommand() fuction
plus a few other minor fixlets
2014-09-24 20:38:15 +01:00
WendyStarfall
2862a80274 sync in-world at 3.985
for the changes in auth, bell, listener, rlvmain and UpdateShim
2014-09-24 17:45:43 +02:00
littlemousy
ae8ca16a88 add RLV_CLEAR message to safeword() 2014-09-24 03:18:46 +01:00
littlemousy
af39e752ee typo 2014-09-23 23:24:55 +01:00
littlemousy
749e96defd clear exceptions on runaway
deleteing the lists wasn't enough to trigger rlvex to remove exceptions
2014-09-23 21:51:32 +01:00
littlemousy
9ac2c1a41c update "fix menus" at end of update 2014-09-23 14:14:45 +01:00
littlemousy
872c702084 remove debug 2014-09-23 14:10:28 +01:00
littlemousy
5b8f2f9235 remove argument from safeword() 2014-09-23 13:47:24 +01:00
littlemousy
168b554b3e move safeword from auth to listener 2014-09-23 02:45:57 +01:00
littlemousy
ee830927b1 Move safeword code to listener 2014-09-23 02:25:50 +01:00
littlemousy
3f390d45e1 formatting change 2014-09-23 02:01:18 +01:00
littlemousy
ca6caee073 Change safeword to exclude exceptions and lock 2014-09-23 02:00:32 +01:00
littlemousy
f8840025cd Fix safeword bug 2014-09-23 01:21:59 +01:00
WendyStarfall
83f499a1c0 Merge pull request #439 from RomkaSwallowtail/patch-1
Update OpenCollar - bell.lsl  Ring on Touch - chat spam prevent
2014-09-22 22:26:25 +02:00
littlemousy
8c77592735 Fix bug where secowner-wearer can't runaway 2014-09-22 21:02:30 +01:00
Romka
ae3b365ba7 Update OpenCollar - bell.lsl
add GlobalHide check
add touch timeout and toucher key check
2014-09-22 21:01:31 +04:00
WendyStarfall
a40b4fd48e sync in-world at 3.984 2014-09-22 04:33:39 +02:00
WendyStarfall
3124eff4f5 re-add some stuffs that got lost during merge 2014-09-22 04:05:47 +02:00
WendyStarfall
7654f08167 sync in-world at 3.983 2014-09-21 22:00:33 +02:00
littlemousy
7722a95e20 add textkey to unlock rlv command 2014-09-20 16:52:30 +01:00
littlemousy
1dfc4075b4 fix clear to leave lock and exceptions in place 2014-09-20 16:43:42 +01:00
littlemousy
f918bf1cbd add textkey to lock rlv command 2014-09-20 16:35:37 +01:00
WendyStarfall
ba2e50d9c7 sync with in-world at 3.982
and leashParticle
2014-09-19 19:42:21 +02:00
littlemousy
ae065fd868 Support changes in listener to removing globals 2014-09-19 12:24:23 +01:00
littlemousy
b5ee3c6306 remove test code 2014-09-19 09:31:28 +01:00
littlemousy
9e7fcc331c Add response to attachmentversion command and new debug 2014-09-19 09:23:42 +01:00
littlemousy
863b55886c Inline single use functions, remove globals, add central notify 2014-09-19 09:11:14 +01:00
littlemousy
bb7b109979 Improve memory handling of exceptions
general cleanup
inlining HandleCommand()
make DoUnlock()
swap pair of lists  (one for source keys and one for restrictions/exceptions) to a pair of lists (strided list for sources/restrictions and strided list for AvID/exceptions)

This was a 2-way merge, my changes were based on a slightly older version that the script in HEAD.  Apologies to anyone concerned if I pooped on your changes.
2014-09-19 02:15:01 +01:00
WendyStarfall
10bad123ec Merge pull request #437 from RomkaSwallowtail/patch-1
Update OpenCollar - bell.lsl
2014-09-18 18:36:16 +02:00
Romka
289590f819 Update OpenCollar - bell.lsl
change menu, add 'TouchRing' button ...
2014-09-18 16:40:21 +04:00
littlemousy
b6414b030d Fix bug in long dialog prompt handling 2014-09-17 21:19:04 +01:00
littlemousy
6035d42227 Move "unseat leashed avatar" code
Rather than a continual stream of "unsit=force" while the wearer is leashed, moved this code to the "yank" command to save on link messages, cpu time, and to provide more interaction between the leasher and their unruly subs.
2014-09-17 15:43:44 +01:00
littlemousy
6459edb7f8 prevent collar rlv menu from unsitting AVs trapped by relay 2014-09-17 15:40:03 +01:00
WendyStarfall
ce1fbd290a Merge pull request #436 from RomkaSwallowtail/patch-1
Update OpenCollar - bell.lsl   bell will ring if the touch
2014-09-17 16:11:55 +02:00
Romka
3d46bba736 Update OpenCollar - bell.lsl
bell will ring if the touch
2014-09-17 16:55:48 +04:00
littlemousy
b1836eea40 Check if releashing to same object
this prevents constant releashing when bumping a grabby post you're already leashed to
2014-09-17 13:43:29 +01:00
littlemousy
61f632638e make wearer set leash store auth as COMMAND_GROUP
A situation was discovered where a wearer who was their own owner (or secowner) with public access set could leash themselves to an unwillling person, and that person be unable to unleash themselves.  This change forces any leash set by the wearer to be stored with a group level auth, which can be broken in public access mode.
2014-09-17 13:40:50 +01:00
WendyStarfall
68b066bc2e Merge pull request #432 from SumiPerl/patch-26
RE: plugin request #427
2014-09-12 08:57:36 +02:00
SumiPerl
4c8539ed6c RE: plugin request #427 2014-09-11 22:46:46 -04:00
WendyStarfall
0432982fa0 Merge pull request #431 from SumiPerl/patch-24
bookmarks.lsl - catch owner hud force teleport commands
2014-09-11 21:56:31 +02:00
WendyStarfall
85e6b3b46c update news 2014-09-11 20:43:44 +02:00
WendyStarfall
5a1f3234d4 Merge pull request #430 from SumiPerl/patch-23
rlvcmd fixed a bad notify in invalid command, changed to OWNER only acce...
2014-09-11 08:41:43 +02:00
SumiPerl
a29ee9eed4 bookmarks.lsl - catch owner hud force teleport commands
Was sending an error to the hud wearer when using the latest hud release.

This trap catches the RLV command, and ignores it since rlvtp.lsl is dealing with that message right now

(tested on hud version 3.944)
2014-09-11 00:35:49 -04:00
SumiPerl
4d4ea94730 rlvcmd fixed a bad notify in invalid command, changed to OWNER only access 2014-09-11 00:14:34 -04:00
WendyStarfall
351d03a162 Delete OpenCollar - subspy.lsl
This source can be found on different forks now.
2014-09-11 03:48:52 +02:00
WendyStarfall
16079348b7 Merge pull request #429 from SumiPerl/patch-22
AO Link Lite - added (limited) AKEYO support
2014-09-11 01:10:36 +02:00
SumiPerl
9580b9d8c0 AO Link Lite - added (limited) AKEYO support
My AKEYO AO doesn't have a menu that we can trigger.  This just receives AO On/Off messages from the collar and switches AKEYO AO on/off respectively.
2014-09-10 14:58:37 -04:00
WendyStarfall
5a4afaab71 fix "more and less" buttons 2014-09-10 05:24:37 +02:00
WendyStarfall
668b71a78a Merge pull request #428 from SumiPerl/patch-21
rlvcmd - command line and menu tool to interface with RLV
2014-09-09 23:31:56 +02:00
SumiPerl
9b711f4235 rlvcmd - command line and menu tool to interface with RLV 2014-09-09 15:52:13 -04:00
WendyStarfall
651a0ee06d Merge pull request #426 from SumiPerl/patch-20
rlvcmd.lsl plugin to send direct rlv commands to subs
2014-09-09 20:48:09 +02:00
SumiPerl
8c1e438d2f rlvcmd.lsl plugin to send direct rlv commands to subs 2014-09-09 08:50:25 -04:00
WendyStarfall
c1e6ee361e update news 2014-09-09 09:31:20 +02:00
littlemousy
d06675ac73 add startim to clearex 2014-09-08 23:39:30 +01:00
littlemousy
810462905a Check for comments before split lines 2014-09-08 08:58:05 +01:00
WendyStarfall
90ceddd460 Merge pull request #425 from SumiPerl/patch-19
takeme.lsl - fix some auth values and temp owner list updates
2014-09-07 23:43:45 +02:00
WendyStarfall
ac6b5efb6b Merge pull request #423 from SumiPerl/patch-18
outfits.lsl an RLV/a outfits plugin …
2014-09-07 23:43:37 +02:00
SumiPerl
59609e77b4 takeme.lsl - fix some auth values and temp owner list updates 2014-09-07 17:42:30 -04:00
SumiPerl
3e2adaa3dc outfits.lsl an RLV/a outfits plugin …
This plugin makes dropping viewer made outfits switching easy with #RLV folders.

The plugin looks for saved outfits inside #RLV/.outfits

Once an outfit is worn, it strips off all unlocked items, and wears the full contents of the outfit selected. If a folder named .alwaysadd exists in the subfolder of the outfit, it will auto add those items once the outfit is fully worn.

the #rlv/.outfits/.alwaysadd folder is also always worn on top. It's a good idea to link your collar inside this folder to make sure it's readded if for some reason your collar wasn't locked on.

This detects RLVa, so commandline searches like outfits something may return multiple matches, and it will prompt you with a list of matches that you can select from and wear. If using RLV, it will automatically wear the first match it finds.

Folder structure:
image

You can copy your existing outfits into this folder structure, or simply move them from your saved outfits location into the RLV folder structure
2014-09-07 04:27:15 -04:00
WendyStarfall
3920fbb2af Merge pull request #422 from SumiPerl/patch-17
outfits.lsl - an RLV/a outfits plugin
2014-09-07 10:22:55 +02:00
SumiPerl
6bec9bdc2b outfits.lsl - an RLV/a outfits plugin
This plugin makes dropping viewer made outfits switching easy with #RLV folders.

The plugin looks for saved outfits inside #RLV/.outfits

Once an outfit is worn, it strips off all unlocked items, and wears the full contents of the outfit selected.  If a folder named .alwaysadd exists in the subfolder of the outfit, it will auto add those items once the outfit is fully worn.

the #rlv/.outfits/.alwaysadd folder is also always worn on top.  It's a good idea to link your collar inside this folder to make sure it's readded if for some reason your collar wasn't locked on.

This detects RLVa, so commandline searches like <prefix>outfits something may return multiple matches, and it will prompt you with a list of matches that you can select from and wear.  If using RLV, it will automatically wear the first match it finds.

Folder structure:

#RLV
|_.outfits
  |_.alwaysadd
  |_outfit1
  |_outfit2
  |_outfit_category1
    |_.alwaysadd
    |_someoutfit3

You can copy your existing outfits into this folder structure, or simply move them from your saved outfits location into the RLV folder structure
2014-09-07 04:22:25 -04:00
WendyStarfall
5304e77815 Merge pull request #421 from SumiPerl/patch-16
takeme.lsl plugin (a capture app)
2014-09-07 10:11:06 +02:00
SumiPerl
68d8fd4955 takeme.lsl plugin (a capture app)
Uses Auth Tempowner functionality

Settings: 
On/Off - Enable/Disable addon
Limit distance - Proximity to wearer before someone can click to take control
Force - If enabled, the clicker has an option to take control.  If disabled, the wearer gets a popup to allow/reject control
2014-09-07 04:08:55 -04:00
WendyStarfall
24ddf7604a Merge pull request #420 from marrmist/main
strict leash mode unsits avatar when leash pulled
2014-09-07 06:01:49 +02:00
WendyStarfall
e5a338891e Merge pull request #419 from SumiPerl/patch-15
rlvfolders - added multiple item matching from commandline
2014-09-07 01:58:01 +02:00
WendyStarfall
2620230b60 Merge pull request #417 from SumiPerl/patch-13
rlvmain - issue #416
2014-09-07 01:57:37 +02:00
marrmist
2e0f5859fe strict leash mode unsits avatar when leash pulled 2014-09-06 15:52:59 -05:00
SumiPerl
c346ed6aa4 rlvfolders - added multiple item matching from commandline
pops up a dialog box for RLVa enabled viewers.  Normal behavior for RLV only

Depends on #416
2014-09-06 02:36:42 -04:00
SumiPerl
bca8b9fe19 rlvmain - issue #416
I've tested this in current Firestorm and current Restrained Love Viewer (results in script comments)
2014-09-06 01:26:22 -04:00
littlemousy
53a5d5b611 Fix "upmenu from add owner" bug 2014-09-05 09:13:04 +01:00
WendyStarfall
57a38d571e Merge pull request #412 from SumiPerl/patch-5
listener.lsl <prefix>name command now supports more than one word
2014-09-05 00:55:26 +02:00
SumiPerl
98fb9b4edb listener.lsl <prefix>name command now supports more than one word 2014-09-04 13:21:27 -04:00
WendyStarfall
becea86c48 update news for 3.980 2014-09-04 10:58:24 +02:00
WendyStarfall
32079e5374 change whitespace for "load from" feature 2014-09-04 06:18:54 +02:00
WendyStarfall
7a3f61444d Merge pull request #411 from SumiPerl/patch-4
couples remove debug
2014-09-04 06:09:12 +02:00
SumiPerl
a81f01d4ee couples remove debug 2014-09-04 00:06:03 -04:00
WendyStarfall
a5bab98418 #410 2014-09-04 06:02:05 +02:00
WendyStarfall
a0554227a9 Merge pull request #409 from SumiPerl/patch-2
rlvmain - more checks for @rlv viewer
2014-09-04 05:55:12 +02:00
WendyStarfall
c8e46b4725 Merge pull request #408 from SumiPerl/patch-1
listener remove lltolower from sValue for displayname
2014-09-04 05:54:43 +02:00
SumiPerl
b2853b42b7 rlvmain - more checks for @rlv viewer
some users were timing out on larger inventories
2014-09-03 23:54:29 -04:00
SumiPerl
f3a89c5023 listener remove lltolower from sValue for displayname 2014-09-03 23:53:11 -04:00
WendyStarfall
fc544dba8f Merge pull request #407 from SumiPerl/main
DisplayName support to all
2014-09-04 05:38:18 +02:00
SumiPerl
12ea074ba0 DisplayName support to all
Add timer to listener to identify namechange
force update namechange on:
           Global_WearerName token change
           Global_WearerName token deletion
2014-09-03 23:34:41 -04:00
WendyStarfall
a467181310 increase viewer check to 10 granulars 2014-09-04 05:29:25 +02:00
WendyStarfall
82a1979181 create extra scalar installer bundles 2014-09-04 03:12:02 +02:00
WendyStarfall
f1a8f5693a create bookmarks installer bundle 2014-09-04 03:11:16 +02:00
WendyStarfall
675d09ba76 create styles installer bundle 2014-09-04 03:10:36 +02:00
WendyStarfall
89e7c162c7 create shininess installer bundle 2014-09-04 03:10:09 +02:00
WendyStarfall
f5faa433f1 update bundles for 3.980 setup 2014-09-04 03:04:29 +02:00
WendyStarfall
10774a0274 remove verbose http throttle debug 2014-09-04 00:46:34 +02:00
WendyStarfall
d33827e667 Merge pull request #405 from SumiPerl/patch-12
bookmarks.lsl delint, formatting, add mouse's debug
2014-09-04 00:41:35 +02:00
WendyStarfall
603b56035f Merge pull request #406 from SumiPerl/patch-13
garble.lsl unicode displayname support added
2014-09-04 00:36:16 +02:00
SumiPerl
287476bff7 garble.lsl unicode displayname support added 2014-09-03 18:24:32 -04:00
SumiPerl
39e7befbf1 bookmarks.lsl delint, formatting, add mouse's debug 2014-09-03 18:11:17 -04:00
WendyStarfall
f37e471abf Merge pull request #404 from SumiPerl/patch-10
Add deprecated setting list and test
2014-09-03 23:18:57 +02:00
SumiPerl
fb49569b18 Add deprecated setting list and test
Allow for deprecated settings to be removed after update process.
2014-09-03 17:08:35 -04:00
WendyStarfall
d6e5cad623 fix secondary owner tokens
this also makes exceptions work for secondary owners now; the naming
convention for secowner/s is a major pita
2014-09-03 20:44:19 +02:00
WendyStarfall
f11ea9e7a1 Merge pull request #403 from RomkaSwallowtail/patch-1
touch notify
2014-09-03 19:23:20 +02:00
Romka
d8f2c0d126 touch notify
use kToucher instead llDetectedKey is correct.
check kToucher to prevent 'self touch' notify
2014-09-03 12:34:38 +04:00
WendyStarfall
5ce022e7e0 remove deprecated comment 2014-09-03 04:40:08 +02:00
WendyStarfall
5d87b88314 update version header 2014-09-03 04:03:50 +02:00
littlemousy
cdc6659dee Optimize 2014-09-03 02:58:31 +01:00
littlemousy
8acb36cd18 Add UPMENU fix from getavi dialog 2014-09-03 02:51:31 +01:00
littlemousy
2f04bda738 Set memory limit 2014-09-03 02:36:54 +01:00
littlemousy
6b0cc2efb8 Remove un-needed "default prefix" code 2014-09-03 02:35:03 +01:00
littlemousy
349d4cc78f Remove unused variable 2014-09-03 02:30:15 +01:00
littlemousy
8539e6b16b Remove nStartsWith function 2014-09-03 02:23:15 +01:00
littlemousy
d557c895be remove g_sBellChatPrefix variable 2014-09-03 02:20:33 +01:00
littlemousy
540fa8dbaf Remove un-needed response to save settings message 2014-09-03 02:14:34 +01:00
littlemousy
02791101e0 Tidy up old code 2014-09-03 02:12:27 +01:00
littlemousy
b89f69f587 Remove un-needed "bell available" code 2014-09-03 02:10:35 +01:00
littlemousy
f836acae6d Remove unused variables 2014-09-03 02:02:33 +01:00
littlemousy
56ca2d704e Tidy block function comments 2014-09-03 01:57:00 +01:00
littlemousy
336150e839 Tidy notify function 2014-09-03 01:55:49 +01:00
littlemousy
466ea79141 Add new debug function 2014-09-03 01:53:13 +01:00
littlemousy
2f3aba8ccc Remove unused messages from message map 2014-09-03 01:50:41 +01:00
WendyStarfall
8b22bad11c remove warning for missing card 2014-09-03 02:49:05 +02:00
littlemousy
2839b2e8cf Fix "channel command with no parameter" 2014-09-03 01:46:45 +01:00
littlemousy
ab74c5b02f Remove verbose http throttle warnings 2014-09-03 01:36:32 +01:00
littlemousy
1e08843b0e Remove reporting of http throttle 2014-09-03 01:34:22 +01:00
WendyStarfall
001e488b63 change version header 2014-09-03 00:34:38 +02:00
WendyStarfall
3ba897fb9b Merge pull request #401 from SumiPerl/patch-9
remove pretty object naming in favor of simpler emotes
2014-09-02 21:30:38 +02:00
SumiPerl
ac65defa77 remove pretty object naming in favor of simpler emotes 2014-09-02 15:30:01 -04:00
littlemousy
8a88c82b2c Fix dialog error on public access
Fixed a bug where no dialog prompt was generated when nonowner/non-wearer accessed runaway menu
Fixed a bug in "LimitRange" buttons, script was expecting input from buttons called "Limit Range"
Added new debug function, activates profiling when used, should always be commented out in production/released code
2014-09-02 14:59:57 +01:00
WendyStarfall
e83e53ec87 remove notify in #398
the notify was the issue, I think it would have to be with a kID instead
of an iNum;

currently the collar has no way to understand if stealth/hide all is "on
or off", so our menu checkbox will not behave as expected, this is no
big deal but could be looked at if anyone is up for it
2014-09-02 15:00:59 +02:00
WendyStarfall
6e294cfa41 revert #398
this one won't compile; reverting it for now
2014-09-02 13:03:02 +02:00
WendyStarfall
374e9d2d01 Merge pull request #398 from SumiPerl/patch-1
stealth command switch state
2014-09-02 07:53:24 +02:00
SumiPerl
2fbbd8de0a stealth command switch state 2014-09-02 01:52:29 -04:00
WendyStarfall
012400a428 change ~destinations to g_sCard in print
and some formatting
2014-09-01 00:53:02 +02:00
WendyStarfall
3d3c5c2679 Merge pull request #397 from SumiPerl/main
WearerName and TouchNotify
2014-08-31 19:27:07 +02:00
SumiPerl
ecfbac018f Flip touchnotify bit correctly this time 2014-08-31 13:20:56 -04:00
SumiPerl
30cad2ae9a Formatting 2014-08-31 13:12:37 -04:00
SumiPerl
259e012a3d WEARERNAME change to Global_WearerName token 2014-08-31 13:03:19 -04:00
SumiPerl
83bffa463c Merge pull request #1 from OpenCollar/main
sync
2014-08-31 12:42:40 -04:00
WendyStarfall
bfc63803dd add touch notify
this one attributes to mouse, Romka and me; we can call <fix>busted
on/off for touch notifications
2014-08-31 18:07:07 +02:00
WendyStarfall
926930da39 update conformity for lsl compiler +...
...update conformity for version numbers in headers; and define string
at line 500 in leash.lsl
2014-08-31 12:32:26 +02:00
WendyStarfall
7d600b669d Merge pull request #394 from SumiPerl/main
Update Display Name Support
2014-08-31 11:50:46 +02:00
SumiPerl
2edea41f0f Update Display Name Support 2014-08-31 05:47:55 -04:00
WendyStarfall
13f93e5dbd Merge pull request #392 from RomkaSwallowtail/patch-2
notecard name in 'Dump style'
2014-08-30 10:41:18 +02:00
WendyStarfall
3f4c6bdbd6 Merge pull request #391 from RomkaSwallowtail/patch-1
BUG: HeightFix state don't save/restore
2014-08-30 10:41:10 +02:00
Romka
0749689200 notecard name in 'Dump style'
use g_sNotecardName instead '~styles'
2014-08-30 09:55:08 +04:00
Romka
da962647fe BUG: HeightFix state don't save/restore
fixed
2014-08-30 09:08:39 +04:00
WendyStarfall
d76df65251 take me away, oh gumby 2014-08-29 04:35:18 +02:00
WendyStarfall
91194cb931 make Page counter have it's own line 2014-08-29 04:20:48 +02:00
WendyStarfall
f8d3bce3ae re-order heightfix checkbox
just a little, so it won't show up on each pose page
2014-08-29 04:19:34 +02:00
WendyStarfall
d3c03588b5 change some formatting and text 2014-08-29 03:58:59 +02:00
WendyStarfall
30c2842e3b Merge pull request #390 from SumiPerl/patch-8
anim.lsl move heightfix to pose menu
2014-08-29 03:51:13 +02:00
SumiPerl
0689b5a611 anim.lsl move heightfix to pose menu 2014-08-28 21:48:12 -04:00
WendyStarfall
b5e0e5612c remove replace/replace_all buttons
we retain chat commands but make it less error prone in menus where the
replace and replace all buttons are broadly used by error; "replace" is
not the same as in outfits; the option remains to just make folders
always add even via chat commands but I won't touch this yet
2014-08-29 03:33:30 +02:00
WendyStarfall
e0d37a4f87 Merge pull request #389 from SumiPerl/patch-7
rlvfolders - re-order buttons
2014-08-29 03:06:35 +02:00
SumiPerl
bbd4a02844 rlvfolders - re-order buttons 2014-08-28 21:05:13 -04:00
WendyStarfall
859b8b9aed change some formatting and text 2014-08-29 02:20:00 +02:00
WendyStarfall
980ebf98d3 remove take controls for movement
this is supposed to be used with AntiSlide active in the collar; instead
of pausing the collar pose when we move, we just leave the AO turned off
and use the walk defined in the AntiSlide menu of the collar

hax done by Sumi Perl on my request; we need to test it a bit more and
hopefully can make this a public release along with 3.980 collars;
relates to #263
2014-08-28 03:20:21 +02:00
WendyStarfall
853898f330 Merge pull request #388 from SumiPerl/patch-4
anim.lsl - changed buttons, added prompts
2014-08-28 02:08:47 +02:00
SumiPerl
36557d5340 anim.lsl - changed buttons, added prompts 2014-08-27 20:03:15 -04:00
WendyStarfall
39e4e801d2 copy AO Link
preparing this script for a "lite" version that will only turn AOs on or
off to work with collar internal AntiSlide technology
2014-08-28 01:41:26 +02:00
WendyStarfall
d2ba3bdfe5 change installation methods
from now on we only have two options, standard or custom; basic and
developer options were misleading and we lack the space in a dialog
header to note it all down for proper explanation; Silkie helped with
the editing for the text to turn my blurb into proper English; the
".version" card is not installed, it only tells the updater hover text
which version to display and how to rename the updater object itself but
should follow the new naming convention nevertheless
2014-08-28 01:02:29 +02:00
WendyStarfall
c001ef312f change naming convention for cards
these two cards will be new for the 3.980 release; we can change naming
convention for these two already:

cards starting with a dot are supposed to be "stock" and selected
plugins can give cards starting with an exclamation mark priority; I
will explain this better when doing the changes for texture, couples and
ultimately colors and settings
2014-08-28 00:49:43 +02:00
WendyStarfall
fa76ed1007 change posture animation name
this is also because we change the license for this animation to a
CC-BY-SA 4.0 with Medea's permission
2014-08-27 23:51:26 +02:00
WendyStarfall
668ce30e02 move into spare_parts directory 2014-08-26 20:33:14 +02:00
WendyStarfall
36f291cf4d Merge pull request #387 from SumiPerl/main
Removed run selection, but retain matching for ~walk_animation auto sele...
2014-08-26 20:26:18 +02:00
WendyStarfall
907339afa4 delete beta directory 2014-08-26 20:25:23 +02:00
WendyStarfall
08ee17741c delete alternative label
all of Romka's changes to label are now part of the public distribution
and can be found in the label script in the lsl directory
2014-08-26 20:22:36 +02:00
WendyStarfall
bfa1588f71 delete customize 2014-08-26 20:20:14 +02:00
WendyStarfall
c3a950ada7 move into lsl directory
this stuff is part of the public distribution now and will be released
with 3.980
2014-08-26 20:15:45 +02:00
WendyStarfall
106d2fc170 add oc header 2014-08-26 20:11:36 +02:00
WendyStarfall
0563a148e4 add file endings
so we can export from in-world editors seamlessly
2014-08-26 20:09:32 +02:00
SumiPerl
3d6a93f13e Removed run selection, but retain matching for ~walk_animation auto select ~run_animation - default to ~run if available 2014-08-26 14:07:07 -04:00
WendyStarfall
ee2a5221b9 sync with in-world styles
this is a bit cleaner, based on Romka's own in-world styles and uses the
tilde in front of the styles setting card for conformity
2014-08-26 20:06:30 +02:00
WendyStarfall
3c8682a574 merge 3.980 into main (manually)
we are getting merge conflicts otherwhise and I don't want to override
the files we need for queries; attribution to hide goes to Romka;
attribution to changes in settings and main go to mouse; all other
commits are cherry-picked from main to 3.980 or vice versa and show
correctly in the history; the alternate hide, main and settings can be
found for now in the alpha branch as of the 26th of August 2014
2014-08-26 18:28:50 +02:00
WendyStarfall
b48e8b797f Merge pull request #383 from SumiPerl/main
anim.lsl auth.lsl
2014-08-26 16:40:41 +02:00
SumiPerl
79d8dc0a95 Merge branch 'main' of https://github.com/SumiPerl/OpenCollarUpdater into main 2014-08-26 07:26:31 -04:00
SumiPerl
1f835648cd sync 2014-08-26 07:26:02 -04:00
SumiPerl
078313f27a sync 2014-08-26 07:24:19 -04:00
SumiPerl
22a56ee48c sync 2014-08-26 07:21:21 -04:00
SumiPerl
d03816d23d sync 2014-08-26 07:20:42 -04:00
SumiPerl
c452e76ccd Sync 2014-08-26 07:16:40 -04:00
SumiPerl
13fc6608b5 sync 2014-08-26 07:07:18 -04:00
WendyStarfall
dfe854c626 Merge pull request #369 from SumiPerl/patch-26
anim.lsl added custom walk selection and menu
2014-08-25 23:32:51 +02:00
SumiPerl
3688b9c581 anim.lsl added custom walk selection and menu 2014-08-25 17:31:35 -04:00
WendyStarfall
2f6a1ca7aa update dialog and message text 2014-08-25 23:29:31 +02:00
WendyStarfall
d303b991e5 Merge pull request #367 from SumiPerl/patch-23
styles.lsl Remove OwnerSay if no notecard present
2014-08-25 04:22:31 +02:00
SumiPerl
5bab94a89f styles.lsl Remove OwnerSay if no notecard present 2014-08-24 22:20:41 -04:00
WendyStarfall
abe061d62b Merge pull request #366 from SumiPerl/patch-22
anim.lsl Bypass error if no notecard present
2014-08-25 04:07:24 +02:00
SumiPerl
f6255f97bf Bypass error if no notecard present 2014-08-24 22:06:36 -04:00
WendyStarfall
76f8f5f39b Merge pull request #365 from SumiPerl/patch-20
paint.lsl - Bypass error if no notecard present
2014-08-25 04:02:46 +02:00
SumiPerl
26b8375679 paint.lsl - Bypass error if no notecard present 2014-08-24 22:01:58 -04:00
WendyStarfall
531c7925da Merge pull request #364 from SumiPerl/patch-19
anim.sl - Move out of pose using llSetAnimationOverride
2014-08-25 02:01:16 +02:00
SumiPerl
beb1254ffb anim.sl - Move out of pose using llSetAnimationOverride
This avoids any timers and trickery

Poses become a "Standing" animation override, so you don't get dragged around

There's a button to enable in Animations menu - defaults to OFF

Notes: We could add custom walks and runs etc at line #345
2014-08-24 17:02:33 -04:00
WendyStarfall
f501a462cb Merge pull request #363 from SumiPerl/patch-18
(Discussion) possible solution to RLV status inconsistency
2014-08-23 23:42:56 +02:00
SumiPerl
6b266576a9 (Discussion) possible solution to RLV status inconsistency 2014-08-23 12:06:40 -04:00
WendyStarfall
1a8c855794 add manual link 2014-08-23 17:27:57 +02:00
WendyStarfall
9910cf3607 change sMessages to upper case 2014-08-23 16:00:22 +02:00
WendyStarfall
7ab84fd3ce Merge pull request #362 from SumiPerl/patch-17
bookmarks.lsl - re-order utility buttons, call menu on blank save field
2014-08-23 15:53:25 +02:00
SumiPerl
24de7fc45d bookmarks.lsl - re-order utility buttons, call menu on blank save field 2014-08-23 09:52:37 -04:00
WendyStarfall
b9785e6576 Merge pull request #361 from SumiPerl/patch-16
change as per upper management
2014-08-22 17:00:50 +02:00
SumiPerl
1109845034 change as per upper management 2014-08-22 11:00:22 -04:00
WendyStarfall
0ab3a62a79 Merge pull request #360 from SumiPerl/patch-15
removed bugs, put in garbage, set on fire
2014-08-22 16:48:49 +02:00
SumiPerl
8c2cdd5010 removed bugs, put in garbage, set on fire 2014-08-22 10:47:59 -04:00
WendyStarfall
d25846fd30 Merge pull request #359 from SumiPerl/patch-13
update some hard coded 'bookmark' references to global variable
2014-08-22 16:27:09 +02:00
SumiPerl
0896854589 update some hard coded 'bookmark' references to global variable 2014-08-22 10:24:23 -04:00
WendyStarfall
eef6f0efdd Merge pull request #358 from SumiPerl/patch-12
added case insensitivity
2014-08-22 16:08:33 +02:00
WendyStarfall
4ff0ec53c1 Merge pull request #357 from SumiPerl/patch-11
removed landmark logic and menus
2014-08-22 16:07:54 +02:00
SumiPerl
9378a7a266 added case insensitivity
and multiple bookmark matching
2014-08-22 10:07:33 -04:00
SumiPerl
39a11348e6 removed landmark logic and menus
re-mapped tp command to rlvtp
2014-08-22 10:06:43 -04:00
WendyStarfall
81d1712259 Merge pull request #354 from RomkaSwallowtail/patch-2
Update OpenCollar - appearance.lsl   MENUNAME_REMOVE
2014-08-21 15:58:57 +02:00
Romka
31c1313fe6 Update OpenCollar - appearance.lsl
added MENUNAME_REMOVE processing
2014-08-21 17:41:49 +04:00
WendyStarfall
bc684e9c1f Merge pull request #352 from RomkaSwallowtail/patch-2
Update OpenCollar - label.lsl   HIDE bug fixed
2014-08-20 11:17:18 +02:00
Romka
2ba03d1665 Update OpenCollar - label.lsl
bug fixed: label visible if attach/rez hided collar
2014-08-20 02:00:05 +04:00
WendyStarfall
b75c676e62 Merge pull request #351 from RomkaSwallowtail/patch-1
Update OpenCollar - hide.lsl  GLOW  bugfix
2014-08-19 22:54:45 +02:00
Romka
e4c61aaab5 Update OpenCollar - hide.lsl
fixed bug: not restore glow after detach/attach hidden collar
2014-08-20 00:45:50 +04:00
WendyStarfall
ee1f3374a9 Merge pull request #350 from RomkaSwallowtail/patch-1
Update OpenCollar - hide.lsl  GLOW
2014-08-19 20:51:45 +02:00
Romka
cfc0c19fb3 Update OpenCollar - hide.lsl
add save and restore prims glow, before/after hide/show elements and all collar
2014-08-19 22:46:15 +04:00
WendyStarfall
d7706c018c Merge pull request #349 from SumiPerl/patch-10
Issue #344 - clear folder locks on safeword
2014-08-19 10:26:13 +02:00
WendyStarfall
e72cfc73c2 Merge pull request #346 from SumiPerl/patch-9
Generated errors on SAFEWORD due to invalid key
2014-08-19 10:25:42 +02:00
SumiPerl
cf60b21561 Issue #344 - clear folder locks on safeword
https://github.com/OpenCollar/OpenCollarUpdater/issues/344
2014-08-19 02:04:26 -04:00
SumiPerl
8e8c204de6 Generated errors on SAFEWORD due to invalid key 2014-08-19 00:34:18 -04:00
littlemousy
2a04a0b2ad fix bug in "reauth after auth list change" 2014-08-18 16:02:04 +01:00
WendyStarfall
31566bd088 testing formatted links 2014-08-17 06:09:00 +02:00
littlemousy
7333d87881 Apply "runaway disable" logic to runaway action 2014-08-17 02:26:40 +02:00
WendyStarfall
042e01c6c8 update news
z-offset blog post; tpv meeting
2014-08-16 10:07:30 +02:00
WendyStarfall
abb8af50eb update formatting 2014-08-16 05:07:35 +02:00
WendyStarfall
1dad59d59f updates news test 004 formatting
to make it work for default communications box sizes
2014-08-16 04:51:56 +02:00
WendyStarfall
adea60eb2b update news for test 004
let's try some real news
2014-08-16 04:49:22 +02:00
WendyStarfall
f05bf61ba6 make adding owners by UUID perform...
...dataserver look-up for the name, ignore the name it returns and send
the UUID to AddUniquePerson function instead; fixes problem with runaway
and add by UUID (no name) -> attributes to littlemousy
2014-08-16 03:43:29 +02:00
littlemousy
c0d7c45bcb Update ~news 2014-08-15 18:43:42 +01:00
littlemousy
15c23adc53 Update ~news 2014-08-15 18:32:17 +01:00
WendyStarfall
8a46714ebd update news for test 003 2014-08-15 17:49:09 +02:00
WendyStarfall
92915574c1 update news for test 002 2014-08-15 17:12:29 +02:00
WendyStarfall
94fe2b28b6 update news for test 001 2014-08-15 17:06:20 +02:00
WendyStarfall
bd4e26bc97 change default visibility to false + ...
...set bell element alpha in state_entry (to prevent the bell from
showing each time we runaway)

attributes to mouse
2014-08-15 16:22:32 +02:00
littlemousy
1f5bc2e773 Fix bugs in runaway, re-auth when owner list changes, restrict tempowners from runaway enable 2014-08-15 14:27:13 +01:00
WendyStarfall
d39fbe9c58 change button name and dialog text
"Sack Wearer" changed to "Release" and just a few linebreaks here and
there
2014-08-15 13:30:27 +02:00
WendyStarfall
b9eb5ff4d6 change 3 default colours
this colour selection should now work for most engravings and also led
labels
2014-08-15 11:42:56 +02:00
WendyStarfall
738d2585e2 change button name and dialog header text
says now "Set Label", so it's like in Titler with "Set Title"; the note
in the dialog header we don't need anymore because label self destructs
in items that have no label element prims defined
2014-08-15 11:29:31 +02:00
WendyStarfall
4aff7f7270 update version coherency in header 2014-08-15 08:14:06 +02:00
WendyStarfall
9825760a04 make commands send user key to rlvmain
bookmarks part of mouses fix for #316
2014-08-15 07:13:27 +02:00
WendyStarfall
ef5b941e39 remove deprecated destinations
superseded by bookmarks
2014-08-15 07:08:36 +02:00
WendyStarfall
5d363a43dd remove redundant smarthelp and reference 2014-08-15 06:53:33 +02:00
WendyStarfall
95e1bf7097 remove redundant help button 2014-08-15 06:51:38 +02:00
WendyStarfall
42ef0af35c change default blank button to dash
to distinguish these clearly from dynamic blank buttons in Leash and the
Main Menu
2014-08-15 06:49:37 +02:00
WendyStarfall
5eb47a06ef make heightscalars dynamic and non-contiguous
This commit attributes to littlemousy.

We are able to add, remove and hand-pick heightscalar animations without
them having to follow a hard defined list from -30 to -50.
2014-08-15 06:39:35 +02:00
littlemousy
f0e27ab629 Fix issue #316
rlvtp now sends user key to rlvmain.  rlvmain now checks for baked tp restrictions before allowing tpto command.  Chat message sent to person requesting the TP.
Needs better error reporting, as per Satomi's comment, but fixes the problem reported by the OP.
2014-08-14 02:00:29 +01:00
WendyStarfall
25133377ef change Customize button to Paint 2014-08-13 21:43:44 +02:00
littlemousy
5bc2b8aa0d Add symantic version check, tidy up, fix remenus 2014-08-13 15:33:54 +01:00
littlemousy
85d066df28 add sample capture app
Demonstration/test script for the new temp owners function in auth
2014-08-13 11:18:27 +01:00
WendyStarfall
e2edfe34bf change upmenu for conformity 2014-08-13 10:15:23 +02:00
WendyStarfall
b4480dd2e5 mix paint...
...as a whole and in main. Also includes invisible and visible paint!

[fix]paint spikes invisible
2014-08-13 10:12:28 +02:00
littlemousy
c9b3623aab merge main and update 2014-08-13 04:06:07 +01:00
littlemousy
541d064312 no need for duplicate main 2014-08-13 03:29:08 +01:00
littlemousy
23fbf803b6 Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main 2014-08-13 03:27:47 +01:00
littlemousy
8a0dd2cd68 Add menuresponse 2014-08-13 03:25:22 +01:00
littlemousy
e8545eaa73 Change menu entries 2014-08-12 21:36:02 +01:00
littlemousy
01907a30b2 Fix menu rebuild bug 2014-08-12 21:11:45 +01:00
WendyStarfall
9805be2f42 Merge pull request #339 from SumiPerl/patch-5
Update OpenCollar - bookmarks.lsl
2014-08-12 09:01:55 +02:00
SumiPerl
2cf21be220 Update OpenCollar - bookmarks.lsl
Fixed notecard reading
updated bookmark ordering for OC to take top spots
2014-08-12 02:23:15 -04:00
WendyStarfall
ccacc83d40 Merge pull request #338 from SumiPerl/patch-4
Update OpenCollar - bookmarks.lsl
#309
2014-08-12 07:40:52 +02:00
SumiPerl
e7ede639b5 Update OpenCollar - bookmarks.lsl
Fix printing destinations and confirmation notifications
2014-08-12 01:38:21 -04:00
WendyStarfall
2635a7d47b fix menu nesting + ...
...sync with development channel

I received help from Sumi for this one!
2014-08-12 07:04:59 +02:00
WendyStarfall
6724d136b9 Merge pull request #337 from SumiPerl/patch-3
Update OpenCollar - bookmarks.lsl
#309
2014-08-12 06:10:06 +02:00
SumiPerl
c2e92bf094 Update OpenCollar - bookmarks.lsl
Updated to ~bookmarks notecard
Kept silent if notecard does not exist
2014-08-12 00:07:25 -04:00
WendyStarfall
41488e2da7 add text and links
addresses #335
2014-08-12 03:32:57 +02:00
littlemousy
707cd64eaf Remove "No updaters found" message
This message will be included in the text downloaded from the web
2014-08-12 02:20:37 +01:00
WendyStarfall
d9d1c9f782 Merge pull request #336 from SumiPerl/patch-1
Bookmarks Guideline #309
2014-08-12 03:14:08 +02:00
SumiPerl
8d817c4be3 Bookmarks Guideline #309
Added manual entry capabilities to the 'Save' button
Cleaned up some menus and buttons
Added a function to validate user input
Added a slurl to location conversion
2014-08-11 21:12:29 -04:00
WendyStarfall
c01945921b remove redundant quick help
addresses #304
2014-08-12 03:12:10 +02:00
littlemousy
408643029f Add tempowner list, add "no runaway" options
Addresses issue #308
2014-08-12 01:55:06 +01:00
littlemousy
b6a07b4dd1 Change menu structre for main, settings and update
Move fixmenus command to main and remove button.
2014-08-12 01:20:23 +01:00
WendyStarfall
ffbb84f809 add links 2014-08-12 00:15:47 +02:00
WendyStarfall
a1b288b8cf Merge pull request #334 from RomkaSwallowtail/patch-1
Update OpenCollar - label.lsl
2014-08-11 22:35:57 +02:00
Romka
e314344921 Update OpenCollar - label.lsl
font, color, scroll
2014-08-12 00:29:12 +04:00
littlemousy
66517e8702 Improve memory handling
Quick fix to issue #332
2014-08-11 21:11:46 +01:00
WendyStarfall
ab9705648e Merge pull request #333 from SumiPerl/main
Bookmarks Guideline #309
2014-08-10 22:29:17 +02:00
SumiPerl
0a3d37db7b Bookmarks Guideline #309 2014-08-10 16:04:47 -04:00
WendyStarfall
8f85f7bee3 change region name 2014-08-10 21:44:13 +02:00
WendyStarfall
34d7131b0a init bookmarks file empty
fresh canvas! <3
2014-08-10 21:24:46 +02:00
WendyStarfall
dbe48ac705 create ~bookmarks card 2014-08-10 21:16:43 +02:00
WendyStarfall
2df0770427 Merge pull request #328 from RomkaSwallowtail/patch-1
Update OpenCollar - listener.lsl  sim-wide HUD response
2014-08-09 19:09:52 +02:00
Romka
57f471a423 Update OpenCollar - listener.lsl
use llRegionSayTo instead llSay for hud response
2014-08-09 19:34:56 +04:00
WendyStarfall
7228e90fc5 create thingy
is pretty <3
2014-08-09 04:17:49 +02:00
WendyStarfall
3ed3cc3256 Merge pull request #315 from RomkaSwallowtail/patch-7
Update OpenCollar - main.lsl
2014-08-08 00:40:34 +02:00
WendyStarfall
eab5a4e933 Merge pull request #314 from RomkaSwallowtail/patch-6
Update OpenCollar - settings.lsl
2014-08-08 00:39:35 +02:00
Romka
b45b7f4ab1 Update OpenCollar - main.lsl 2014-08-07 20:37:14 +04:00
Romka
7146625a68 Update OpenCollar - settings.lsl 2014-08-07 20:31:04 +04:00
WendyStarfall
b7e3ab1219 Merge pull request #303 from RomkaSwallowtail/patch-5
Update OpenCollar - settings.lsl
2014-08-05 09:53:28 +02:00
Romka
366a27b5b5 Update OpenCollar - settings.lsl 2014-08-05 09:28:27 +04:00
WendyStarfall
6c6091d72f Merge pull request #297 from RomkaSwallowtail/patch-4
Update textures - same textures keys
2014-07-27 07:50:52 +02:00
Romka
29b57fbe6e Update textures 2014-07-26 22:21:20 +04:00
Romka
35b9ccc8bd Update textures 2014-07-26 22:20:05 +04:00
Romka
1dc4886826 Update textures 2014-07-26 22:18:24 +04:00
littlemousy
042a4d6290 Remove old "change text colour with prim" code
fixes issue #295
2014-07-24 19:32:08 +01:00
WendyStarfall
bb1710b514 3.970 ready to ship 2014-07-24 19:35:31 +02:00
WendyStarfall
fa45c9c6de update news 3.970 2014-07-23 06:00:56 +02:00
WendyStarfall
31e5b5ff9b add links and formatting 2014-07-22 04:51:43 +02:00
WendyStarfall
33ec783f38 remove sandbox and shack 2014-07-21 05:43:04 +02:00
WendyStarfall
442bd4e380 fix grammar and formatting 2014-07-21 05:14:00 +02:00
WendyStarfall
ed0a70835b deprecated shack and sandbox 2014-07-21 05:03:53 +02:00
WendyStarfall
829aa0b21f add places and groups http request 2014-07-21 04:55:41 +02:00
WendyStarfall
c9cea6d82f update slurl 2014-07-21 04:53:45 +02:00
WendyStarfall
14a905c265 create places slurls and groups uris 2014-07-21 04:34:07 +02:00
WendyStarfall
2ad6a88f26 Merge pull request #292 from RomkaSwallowtail/patch-1
Create OpenCollar - styles.lsl
2014-07-15 11:46:15 +02:00
Romka
c7f0fc7291 Update OpenCollar - styles.lsl
some polish...
2014-07-15 11:30:25 +03:00
Romka
78f874e8fb Update OpenCollar - styles.lsl
add applock feature and changed style command
2014-07-15 10:45:09 +03:00
Romka
81dab8cc1c Create OpenCollar - styles.lsl
want to quickly change styles collar? Now it's easy!

in Appearance menu *Styles* , with "Dump Style" button dump current appearance that set using "texture", "color" ("shine"), and write it as "your style" in 'styles' notecard in the collar.
And this style will appear in the Styles menu for further use.
2014-07-15 08:28:16 +03:00
WendyStarfall
67c3824cf4 Merge pull request #286 from RomkaSwallowtail/patch-1
Update OpenCollar - customize.lsl
2014-07-15 04:15:38 +02:00
WendyStarfall
0a6d1afb28 Merge pull request #287 from RomkaSwallowtail/patch-2
Update OpenCollar - texture.lsl
2014-07-13 23:04:34 +02:00
WendyStarfall
7e1d1645ed Merge pull request #288 from RomkaSwallowtail/patch-3
Update OpenCollar - shocker
2014-07-13 23:03:40 +02:00
Romka
fa9b31f662 Update OpenCollar - shocker 2014-07-13 14:08:23 +04:00
Romka
ad23526c57 Update OpenCollar - texture.lsl
altered processing of user commands,
use llSetLinkPrimitiveParamsFast, instead llSetLinkTexture, for improve applying textures
2014-07-13 12:39:26 +04:00
Romka
d7362d0774 Update OpenCollar - customize.lsl
optimize texture and color apply
2014-07-12 10:45:38 +03:00
Romka
f87b5dcfcf Update OpenCollar - customize.lsl
elements with "notexture" & "nocolor" & "nohide" and empty tags don't show in element menu
2014-07-12 09:05:43 +03:00
WendyStarfall
4008fd140d create customize+...
create OpenCollar - customize + nesting changes for OpenCollar - main
for SPARE_PARTS -> #281
2014-07-09 11:00:49 +02:00
WendyStarfall
70c1f2ff29 change submenu name to Particle
customization for the leash is revolving fully around particles; we keep
the name "customize" reserved to avoid doubling up menus in the future
2014-07-09 10:55:26 +02:00
WendyStarfall
7a4b343c81 add rlv query and response lms
please take a look at rlvmain to see how that works
2014-07-09 10:47:26 +02:00
WendyStarfall
39db69e19b Merge pull request #247 from NorthGlenwalker/patch-1
Update OpenCollar - rlvmisc.lsl
2014-07-08 18:18:04 +02:00
WendyStarfall
53bfb75d67 fix #277 by littlemousy
I have received this as in-world contribution by littlemousy. She also
mentioned that this is a really good example of saving code from the
"textkey" change. I feel the same because I have been able to understand
it this way too now and for those interested, this could be reference to
gain better understanding about it all.
2014-07-08 10:16:22 +02:00
WendyStarfall
599600e11a Merge pull request #278 from VirtualDisgrace/raspberrytarzan
auth; Refactor and Optimize by littlemousy
2014-07-07 22:42:15 +02:00
WendyStarfall
1d121e6712 auth; Refactor and Optimize by littlemousy
auth in the upstream currently has 9,592 bytes free on start-up; after
refactor and optimization we have 17,134 bytes free on start-up; that's
a difference of 7,542 bytes more memory available
2014-07-07 06:14:36 +02:00
WendyStarfall
b67e883cca Merge pull request #276 from RomkaSwallowtail/patch-1
Update OpenCollar - listener.lsl   ml132 found bug:  #275
2014-07-05 08:35:18 +02:00
Romka
ed4e2e7084 Update OpenCollar - listener.lsl
#275
2014-07-05 07:30:13 +03:00
WendyStarfall
51d362bf24 Merge pull request #274 from RomkaSwallowtail/patch-1
Create OpenCollar SPARE PARTS - shininess & shocker plugins
2014-07-04 15:28:38 +02:00
Romka
dee09209c6 Update OpenCollar - shininess 2014-07-04 15:00:41 +04:00
Romka
0d73ec1578 Create OpenCollar - shocker 2014-07-04 12:57:40 +04:00
Romka
d881b7f72e Create OpenCollar - shininess
Based on 'Opencollar - texture'
2014-07-04 12:49:46 +04:00
WendyStarfall
08153f69de Merge pull request #272 from RomkaSwallowtail/patch-110
Update OpenCollar - label.lsl   with scroll long text
relates to #266
2014-07-03 19:28:11 +02:00
Romka
066267fd15 Update OpenCollar - label.lsl 2014-07-03 21:00:51 +04:00
WendyStarfall
e595c3e852 init base source for alternative label 2014-07-03 18:56:10 +02:00
WendyStarfall
6f106b6dca Merge pull request #270 from VirtualDisgrace/raspberrytarzan
fix element calculation
2014-07-03 18:45:24 +02:00
WendyStarfall
b5ffad6a70 fix element calculation 2014-07-03 18:39:25 +02:00
WendyStarfall
9199f7ecba Merge pull request #269 from SilkieSabra/patch-1
Update OpenCollar - AO Link.lsl
2014-07-03 17:59:23 +02:00
SilkieSabra
9addb8ca94 Update OpenCollar - AO Link.lsl
Edit the first sentence in the version notes, fix a typo, say where to drop in the scripts, add Vista.
2014-07-03 11:57:30 -04:00
WendyStarfall
9b690ee47b 3.968 ready to ship 2014-07-03 15:28:20 +02:00
WendyStarfall
77de50d504 Merge pull request #268 from VirtualDisgrace/raspberrytarzan
add send exceptions through rlvmain
2014-07-03 14:47:10 +02:00
WendyStarfall
8f50717c4c add send exceptions through rlvmain
addresses #267 in upstream source
2014-07-03 13:48:03 +02:00
WendyStarfall
738ce34753 Merge pull request #265 from NorthGlenwalker/patch-2
Update OpenCollar - anim.lsl
2014-07-02 14:16:07 +02:00
WendyStarfall
bcafe2c7e9 3.967 ready to ship 2014-07-02 13:39:13 +02:00
NorthGlenwalker
a3ffa80f42 Update OpenCollar - anim.lsl
To show what our current pose is in the pose menu
2014-07-02 11:40:05 +01:00
WendyStarfall
a9f2440d3b Merge pull request #264 from XenHat/patch-1
Basic VISTA AO support
#263
2014-07-01 04:12:22 +02:00
Tarnix Wilcox
e8e098195e Fixed whitespaces in AO Link 2014-06-30 22:07:22 -04:00
Tarnix Wilcox
799798e4c9 Basic VISTA AO support
Supports:
- AO ON/OFF
- Sits ON/OFF
- Next Stand (differs from ZHAO)
2014-06-30 22:00:00 -04:00
WendyStarfall
1e9a2b5f28 init Medea Destiny's AO Link
Medea Destiny's AO interface script for OpenCollar

This script is inteneded to be a drop-in for ZHAO-2 and Oracul AOs that
are not already compatible with OpenCollar's AO interface.

Scope: The script tries to identify the AO type by checking script
naming. It receives the ZHAO ON, ZHAO OFF and ZHAO Menu commands from
the collar, and uses link messages to send appropriate commands to the
AO, depending on the detected collar type. It is not a complete
replacement of the Sub AO as it cannot allow as complete access to the
AO as that does, but it should provide most of the functionality while
being very easy to add to user's pre-existing AOs.

When the AO is switched on, but the collar sends a command to switch it
off, the script will take controls and detect for movement. While the
avatar is trying to move, the AO will told to switch the AO back on
again until movement ceases.

An alternative to this method would be to capture the AO's walk
animation and play the animation itself as a walk overrider. The
disadvantage of that is trying to capture the walk animation isn't
straightforward, particular when there is more than one walk configured.
The disadvantage of this method is that it does a lot more AO
triggering.
2014-06-30 23:18:46 +02:00
littlemousy
72b6f1bdc1 Merge pull request #262 from VirtualDisgrace/lemoncheese
Add dialog...
2014-06-30 02:00:36 +01:00
WendyStarfall
bd6c5ee5d6 Add dialog...
...to select from non-unique TP destinations from chat
2014-06-30 02:56:07 +02:00
WendyStarfall
d36266082f OCD check; in-world sync
We arrive at 3.967 in summary with all changes here and in-world. Source
is synchronized. (I wished there was a way to push from in-world to git
repos, this should be a top priority feature for the next virtual
world..)
2014-06-30 01:16:24 +02:00
WendyStarfall
521ac20c57 added destinations command... +...
this is by littlemousy and adds a chat command for calling the
destinations menu, also a more sophisticated approach for finding and
executing landmark teleports via chat command, shortened commands are
possible now for landmarks containing spaces and a check is in place if
the shortened command could have addressed more than 1 such landmark
"More than one matching landmark was found in the collar..."
2014-06-29 22:59:57 +02:00
WendyStarfall
279ba62c6d added stuff!
by littlemousy; this adds the new query and response messages for rlv
plugins, also corrects the cosmetic issues with the "All" button and
sets the new StartIM exception as default for fresh collars
2014-06-29 05:15:48 +02:00
WendyStarfall
f768d644ad i made thingy error, sorry!
also less confusing say messages, this time giving a positive when
approrpiate instead pending
2014-06-29 03:06:59 +02:00
WendyStarfall
b1184ca6aa removed redundant scalars
from ~-40 on we need avatars taller than possible unless if using a
deformer animation which would conflict with the scalars; 11 less
contents is the bigger win here
2014-06-29 01:17:54 +02:00
WendyStarfall
5b39579a8c adjusted for #254, #255 and #259
(loosely related to #243)
2014-06-29 01:10:07 +02:00
WendyStarfall
b4415a0287 Merge pull request #259 from VirtualDisgrace/powerpony
self destructing titler
2014-06-29 00:23:22 +02:00
WendyStarfall
51ef605d9d self destructing titler
if we don't have a FloatText element, the script cleans itself up;
otherwhise the same theory/practice case like in #254 and #255
2014-06-29 00:19:50 +02:00
WendyStarfall
d874b6ea64 Merge pull request #258 from VirtualDisgrace/yesbunny
shorter dialog text and weblink
2014-06-29 00:07:12 +02:00
WendyStarfall
0aecaa4830 Merge pull request #257 from VirtualDisgrace/megapie
Refactor and Optimize... +...
2014-06-29 00:06:34 +02:00
WendyStarfall
827b25fd73 Merge pull request #255 from VirtualDisgrace/doodoopop
self destructing label
2014-06-29 00:05:19 +02:00
WendyStarfall
51895d8641 Merge pull request #254 from VirtualDisgrace/moobell
self destructing bell
2014-06-29 00:05:05 +02:00
WendyStarfall
716e821e5e Merge pull request #253 from VirtualDisgrace/shoechew
Multisearch for RLV Folders
2014-06-29 00:04:48 +02:00
WendyStarfall
b620ffd3bd Merge pull request #252 from VirtualDisgrace/saladbomb
dynamic main
2014-06-29 00:04:13 +02:00
WendyStarfall
be40c449a1 Merge pull request #251 from VirtualDisgrace/powerpony
dedicated colorizer for titler
2014-06-29 00:03:57 +02:00
WendyStarfall
b616833c9b Merge pull request #250 from VirtualDisgrace/mybranch2
restrictive garble
2014-06-29 00:03:29 +02:00
WendyStarfall
ac6440d2a0 shorter dialog text and weblink
weblink leads to essentially the same spot the Help button does but we
might want this for continuity throughout menus; shorter text should
encourage users who seek more documentation to follow up on a properly
formatted web page - the rest don't read it anyway, amirite?
2014-06-28 23:14:35 +02:00
WendyStarfall
56d2f482a8 Refactor and Optimize... +...
This refactoring and optimization is by littlemousy:

Refactoring and optimize memory footprint. Fix broken "repeat
restrictions on region change", add "RLV_QUERY" and "RLV_RESPONSE"
messages for checking current rlv state, Add support for tracking
restrictions by script: use textString instead of key. Add StartIM
exception.
2014-06-28 04:03:23 +02:00
WendyStarfall
a2a744ac40 self destructing label
if we don't have label prims, the script cleans itself up; mouse found a
clever solution to determine if we have label prims for this case;
unfortunate is that the label text on the default collar design is
slightly off center but that was always the case for any other collar
design that had labels smaller or greater than a dozen characters and
weren't using tortured cylinders; otherwhise the same as stated in #254
2014-06-28 02:37:18 +02:00
WendyStarfall
cae2d6e322 self destructing bell
if we don't have a bell element, the script cleans itself up; designs
that have a bell element that shouldn't be hidden will have to give it a
~nohide tag; in theory users wouldn't install bell if there is no such
element present, in practice users ask where the bell is after they
installed the script on their design that simply didn't feature the
element, this should clean up script load and confusion
2014-06-28 02:36:37 +02:00
WendyStarfall
05be8ea095 Multisearch for RLV Folders
This feature is by Medea Destiny:

improved chat functionality for attaching folders. Now accepts two-level
search terms with a /. Example: <prefix>&&gag/rr will find the first
folder with "gag" in the title just as <prefix>&&gag would now, but
instead of attaching that, will look for a subfolder below that with
"rr" in the title, and attach that folder instead.

additional improvement: search with no result caused "no folder found"
message to be sent to kID, which is llGetOwner() in listen event,
changed to g_kAsyncMenuUser to return error message to person issuing
the search command.
2014-06-27 06:55:10 +02:00
WendyStarfall
3c5683c793 dynamic main
blanks out Animations and RLV buttons if those features are not
installed; the overall menu buttons stay consistent though and don't
jump around; also appearance will blank out if the script is /manually/
removed
2014-06-27 02:10:00 +02:00
WendyStarfall
ccad0c0f2f dedicated colorizer for titler
this is saves the need for a global colorizer in collars that are
otherwhise without coloable elements but feature a titler; this script
has also been moused ( = overall optimization by littlemousy)
2014-06-26 21:27:19 +02:00
WendyStarfall
08d461f32b restrictive garble 2014-06-26 03:04:08 +02:00
WendyStarfall
591852eb2e Merge pull request #249 from VirtualDisgrace/main
140624test
2014-06-24 19:22:04 +02:00
littlemousy
2a9f294a48 Please ignore - no real changes
Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main
2014-06-24 10:02:29 +01:00
Romka
7ed191d2f4 Update OpenCollar - rlvmain.lsl
I think it will be correctly
2014-06-24 06:01:12 +02:00
WendyStarfall
cc90961aee manual link corrected
this link is received by owners after being added; thanks to Vulcan
Viper for reporting this
2014-06-24 06:01:11 +02:00
littlemousy
8dbdc97b38 Added chat command for "Set Title" dialog 2014-06-24 06:01:11 +02:00
KireF
d69ca9333c Update OpenCollar - rlvtp.lsl 2014-06-24 06:01:10 +02:00
WendyStarfall
f0ea7a4ec4 Merge pull request #246 from RomkaSwallowtail/patch-109
Update OpenCollar - rlvmain.lsl
2014-06-24 04:41:33 +02:00
NorthGlenwalker
302db5f502 Update OpenCollar - rlvmisc.lsl
To add support of "Force Mouselook" using new RLV 2.9 API to rlvmisc
2014-06-19 14:34:54 +01:00
Romka
164d350a35 Update OpenCollar - rlvmain.lsl
I think it will be correctly
2014-06-09 19:17:25 +04:00
WendyStarfall
64860736fa manual link corrected
this link is received by owners after being added; thanks to Vulcan
Viper for reporting this
2014-05-07 17:45:04 +02:00
littlemousy
cd8a5f602b Added chat command for "Set Title" dialog 2014-05-03 01:51:08 +01:00
WendyStarfall
527d1461ba Merge pull request #239 from KireF/main
Update OpenCollar - rlvtp.lsl - further on the LM tp bug
2014-05-03 01:03:22 +02:00
KireF
e47d0d5b4f Update OpenCollar - rlvtp.lsl 2014-05-03 00:43:39 +02:00
littlemousy
678e45f2c0 Adds support for LMs with spaces in the name 2014-04-24 15:41:37 +01:00
WendyStarfall
073df24a23 PATCH I 3.960 ready to ship
Fixes #227, #229, #230, #231, #232 and #236
2014-04-24 01:58:06 +02:00
littlemousy
006a5aa2d8 Adds "add secowner by uuid" function 2014-04-23 13:45:31 +01:00
littlemousy
85b80100bf Fix for "request permission after notecard settings change" bug
Replaced bitwise & for logical && in test for getting permissions after new settings are received.  g_iBellOn is not a bool, it is an int reflecting auth level of last user to set the bell.
2014-04-19 23:48:11 +01:00
littlemousy
dbbd3c097f Merge pull request #233 from RomkaSwallowtail/patch-107
Update OpenCollar - bell.lsl  bugfix #232
2014-04-18 11:48:03 +01:00
Romka
91560fb89b Update OpenCollar - bell.lsl
add PERMISSION_TAKE_CONTROLS at on_rez
2014-04-18 12:23:18 +03:00
littlemousy
24938fbd2f Fixes problem with initial state of g_iAllAlpha
Fixes issue with initial setting of g_iAllAlpha on collars with more than one side
2014-04-15 13:18:08 +01:00
littlemousy
c5d5089536 Update OpenCollar - leash.lsl 2014-04-14 10:34:37 +01:00
littlemousy
79ecceec6f Fixed typo, Thanks Romka! 2014-04-14 10:31:31 +01:00
littlemousy
2c4b27176c Quick fix for pose and posture permissions
Quick fix for Pose lock and Posture lock being unsettable by wearer.  Full "Can't override setting of person with higher auth" will come later.
2014-04-14 09:49:47 +01:00
littlemousy
95e9554f7e Fixed "No anim when no name given" bug
Permission to animate was not being requested when a non-wearer triggered a couples anim without using a name.
2014-04-14 00:38:07 +01:00
littlemousy
2e968f878b Refresh RLV state on script start
#227 looks like a failure to get the RLV state when the script starts, probably down to script reset order.  Asking for it at state_entry seems to help on an isolate leash script reset.
2014-04-13 21:20:10 +01:00
WendyStarfall
36e9774874 Merge pull request #226 from JoyStipe/main
final changes
2014-04-11 22:51:19 +02:00
JoyStipe
8e03410aab final changes
mixed last of Romka's edits that went to main release in, is all
2014-04-11 13:41:24 -07:00
WendyStarfall
4cc7e991d0 3.960 ready to ship
#RLV History, HeightFix, Strict Leashing, lightning fast Trace, Relay
Buffer, RLV Viewer/Server fail-safe, fewer scripts, lower memory
consumption, add owners grid-wide, all new web guide
2014-04-11 18:44:45 +02:00
WendyStarfall
862382ef9f Updated urls 2014-04-11 13:47:09 +02:00
WendyStarfall
c6182b4b88 Updated settings help url 2014-04-11 09:16:08 +02:00
WendyStarfall
429bcb125c Updated help url 2014-04-11 02:36:58 +02:00
littlemousy
6f6f733012 Changed chat commands to something a little more keyboard friendly 2014-04-10 00:47:32 +01:00
littlemousy
e96cb99078 Merge pull request #225 from RomkaSwallowtail/patch-106
Update OpenCollar - leashParticle.lsl 'chain' & 'rope' buttons don't work
2014-04-09 19:33:34 +01:00
Romka
312b810a83 Update OpenCollar - leashParticle.lsl
Texture menu:
buttons 'chain' and 'rope' don't set texture name
2014-04-09 09:42:03 +03:00
WendyStarfall
5206940023 Merge pull request #224 from JoyStipe/main
defaults bugfix
2014-04-08 21:56:12 +02:00
JoyStipe
4b725e564a defaults bugfix
"leashDefaults_" is not a valid ScriptName in the current settings
format (does not exist), so the script's default list is never filled,
causing revert to oc defaults on any default button usage (chain, etc),
regardless of settings in NC. Removed all reference to the variable, as
it is only used for that & repaired particle (current used) script to
properly establish it's defaults.
2014-04-08 12:44:06 -07:00
WendyStarfall
d2e6905d77 Merge pull request #223 from RomkaSwallowtail/patch-105
Update OpenCollar - couples.lsl  iAuth bug
2014-04-08 21:41:11 +02:00
Romka
b7708efbad Update OpenCollar - couples.lsl
wrong use iNum instead iAuth for SENSORDIALOG
2014-04-08 22:36:00 +03:00
WendyStarfall
53d014f8e6 working clear all in badwords root
I needed help from littlemousy for this one; fixes #220
2014-04-08 20:47:16 +02:00
WendyStarfall
2cbcdd939b Merge pull request #222 from RomkaSwallowtail/patch-104
Update OpenCollar - couples.lsl  bugfix #219
2014-04-08 20:44:46 +02:00
Romka
20f1bcc992 Update OpenCollar - couples.lsl
fix #219
2014-04-08 15:44:10 +03:00
WendyStarfall
7a14d5302a Merge pull request #221 from RomkaSwallowtail/patch-103
Update OpenCollar - leashParticle.lsl
2014-04-08 09:28:12 +02:00
Romka
2eef5f573d Update OpenCollar - leashParticle.lsl 2014-04-08 10:19:56 +03:00
WendyStarfall
f781a783fe Added guide links; point 38 2014-04-08 08:34:33 +02:00
WendyStarfall
2fff2f988a Added guide links 2014-04-08 07:51:27 +02:00
WendyStarfall
33a10ca68f Added guide links; declutter 2014-04-08 07:35:19 +02:00
WendyStarfall
3bfce5c023 Added guide link 2014-04-08 06:49:53 +02:00
WendyStarfall
ce0ca5d5f5 Added guide link; quick formatting 2014-04-08 06:33:45 +02:00
WendyStarfall
67d213ee17 Merge pull request #218 from JoyStipe/main
remenu
2014-04-08 06:16:06 +02:00
WendyStarfall
2a275a2e76 Added guide link; check point 34 2014-04-08 06:08:06 +02:00
WendyStarfall
d933878a49 Added guide link; removed clutter 2014-04-08 05:58:00 +02:00
WendyStarfall
441af80848 Added guide link 2014-04-08 05:39:59 +02:00
WendyStarfall
9cf5671e22 Added guide link; less spaces 2014-04-08 05:33:46 +02:00
WendyStarfall
a7e5183616 Added guide link 2014-04-08 05:23:18 +02:00
WendyStarfall
1927c922d6 Added guide link 2014-04-08 05:18:19 +02:00
WendyStarfall
679376390a Added guide link; minor formatting 2014-04-08 05:10:55 +02:00
JoyStipe
2a745176f7 remenu
*blushing* I forgot to put in a re-menu on the on/off buttons for
emitters
2014-04-07 20:05:52 -07:00
WendyStarfall
3243195cc0 Added guide link; clear all button
the clear all button needs a re-menu yet
2014-04-08 05:02:14 +02:00
WendyStarfall
28487977a0 Added guide link; some formatting 2014-04-08 04:28:02 +02:00
WendyStarfall
6054af2daa Added guide link; reversed checkboxes 2014-04-08 03:41:03 +02:00
WendyStarfall
123884251f mouse & wendy in-world;
added guide link; formatting; removed menu key title in dialog
2014-04-08 02:34:26 +02:00
WendyStarfall
e1a9ac8be4 Added guide link; formatting 2014-04-08 01:48:52 +02:00
WendyStarfall
8063b057ac Merge pull request #217 from JoyStipe/main
bugfixes
2014-04-08 01:09:08 +02:00
JoyStipe
c034a950b2 bugfixes
Default list bug &
lsl convention crap issue define+set variable inside conditional test
2014-04-07 16:01:50 -07:00
WendyStarfall
85e769b2cd mouse & wendy in-world; anim
Added CTYPE; reworded prompts; added chat messages; kerrect bizarro
legassy gremmer nad spaling
2014-04-07 23:25:17 +02:00
WendyStarfall
31d822ea53 Added CTYPE string and guide link 2014-04-07 22:54:27 +02:00
WendyStarfall
813fe0e3ee littlemousy in-world; anim
cancels offsets past the end of the range
2014-04-07 18:20:48 +02:00
WendyStarfall
fcbdf768b2 Romka Swallowtail added to attribution 2014-04-07 17:06:24 +02:00
WendyStarfall
4c9a72290a Merge pull request #214 from JoyStipe/main
multi-leash variant edits
2014-04-07 16:17:11 +02:00
JoyStipe
1f648be23e made the adjustments to/for the *latest* submit (pull 213)
just started with the changes in 213 from Romka & plugged in (reworked
as needed) my variations for multi-attachment leashes
2014-04-07 00:02:58 -07:00
JoyStipe
31e19bc035 adds
Added "instructions" for usage of this script; also added variable
definition (for prim description field) up top, to make it easier for
user to change that value.
2014-04-06 23:32:33 -07:00
WendyStarfall
6b3f10a7fa Merge pull request #213 from RomkaSwallowtail/patch-102
Update OpenCollar - leashParticle.lsl  Errors HotFix
2014-04-07 08:03:29 +02:00
Romka
2a112be848 Update OpenCollar - leashParticle.lsl
fix some typo and mistakes
2014-04-07 07:41:22 +03:00
WendyStarfall
539a3377fb littlemousy in-world; anim
moved the sub ao url to the dialog prompt
2014-04-07 02:52:04 +02:00
WendyStarfall
b78e919649 littlemousy in-world; anim
We are now able to adjust height offset with handy up and down arrows,
as well as store the individually selected scalar for the specified
pose. mouse kicks ass!
2014-04-07 01:47:59 +02:00
WendyStarfall
c348f31898 3.960; sync IV
titler, label, main, leashParticle, update; build11
2014-04-06 17:20:18 +02:00
WendyStarfall
6a96e57ea2 Joy Stipe in-world; MultiLeash point 2014-04-06 17:09:15 +02:00
WendyStarfall
4dcbff7704 Merge pull request #211 from RomkaSwallowtail/patch-100
Update OpenCollar - appearance.lsl  buttons
2014-04-06 17:07:36 +02:00
WendyStarfall
dab355d649 Merge pull request #212 from RomkaSwallowtail/patch-101
Update OpenCollar - leashParticle.lsl   defaultsettings?
2014-04-06 17:06:53 +02:00
Romka
111933a015 Update OpenCollar - leashParticle.lsl
added reading default particles parameters from 'defaultsettings' notecard, if it's present.
changed method of save/restore particles settings.
refined treatment menu buttons.

tested on a cat =^_^=
2014-04-06 17:59:06 +03:00
WendyStarfall
f9b71b6986 Merge pull request #210 from RomkaSwallowtail/patch-99
Update OpenCollar - update.lsl BETA   broken link
2014-04-06 06:20:52 +02:00
WendyStarfall
70b04aeb2a Merge pull request #209 from RomkaSwallowtail/patch-98
Update OpenCollar - update.lsl  broken link
2014-04-06 06:20:39 +02:00
WendyStarfall
b48906320a Joy Stipe in-world; multi-point leash
Notes for Multi-point/Satellite leash particle systems (by Joy Stipe)
- Command TO satellites is
llRegionSayTO (Wearer) - so that ONLY the collar wearer's stuff hears
ON (HUD_CHANNEL) - see state-entry for specifics
3-part message, begins with KEY (UUID) of target to leash TO
+ "\\LeashUp\\" - exactly as in the quotes, case sensitive
+ settings as a comma-seperated string (CSV)
OR (string)NULL_KEY + "\\Unleash"
It is up to the satellite script to "interpret" the message
and make/remove leash particles
2014-04-06 01:58:45 +02:00
Romka
8c641cf36f Update OpenCollar - appearance.lsl
move "adjust" buttons to end
2014-04-05 20:27:27 +03:00
WendyStarfall
1e101cbc10 heightfix back as standard
attribution to the improved p4 scalars as of 3.960 BUILD10 goes to Karo
Weirsider!
2014-04-05 19:24:36 +02:00
WendyStarfall
c8ae5f48ad merge of legacy heightfix with new source
as a marker: BUILD9 is the last variant of 3.960 without this code
2014-04-05 19:18:55 +02:00
Romka
9c2f1973ab Update OpenCollar - update.lsl
broken link on the marketplace
2014-04-05 19:58:41 +03:00
Romka
9cc39f0fa9 Update OpenCollar - update.lsl
broken link on the marketplace
2014-04-05 19:56:38 +03:00
WendyStarfall
2871c014a2 dialog prompt adjusted for 3.960 bundles 2014-04-05 18:47:39 +02:00
WendyStarfall
0ae44c61a9 making the url easier to spot 2014-04-05 18:41:58 +02:00
WendyStarfall
04a698899c these two fonts play fine on cut boxes;
while they may not ideally align on cut cylinders, it doesn't break
anything as users can just flip to a different font
2014-04-04 23:48:33 +02:00
WendyStarfall
b6495e64b4 ketchup & nests snuggly in 3.960s;
for 3.950s, please use the variation before this commit
2014-04-04 23:45:01 +02:00
WendyStarfall
7fbc6c15fe we keep heightscalars just in case;
also, I'm trying to get rid of script asset artifacts appearing usually
as 'Old Script', for the spy module, please see
ce6cdccd0c
2014-04-04 23:39:34 +02:00
WendyStarfall
8c48a76013 littlemousy in-world; titler
this is if a prim type in >3.960 was no box, so a user who had a
deformed sphere or other type displaying text, would end up having this
text forever and ever, thanks mousekin!!
2014-04-04 22:48:50 +02:00
WendyStarfall
5529b28137 mouse & wendy in-world; titler
we add as requirement that the floattext prim also must be a box because
of behaviour in size, slicing and rotation; this is OK we had always
boxes in our stock design, recommended and showed box on google code and
have it stated on our new guide as well - better than torturing poor
spheres or tori? <3
2014-04-04 22:26:05 +02:00
WendyStarfall
2e8af44300 Merge pull request #208 from RomkaSwallowtail/patch-97
Update OpenCollar - titler.lsl   BUG!  'no textprim' message don't appear
2014-04-04 21:30:25 +02:00
Romka
91417e5387 Update OpenCollar - titler.lsl
change Titler menu if no textprim
2014-04-04 23:18:03 +04:00
WendyStarfall
2417ea5ef2 Merge pull request #207 from RomkaSwallowtail/patch-96
Update OpenCollar - update.lsl
2014-04-03 23:14:33 +02:00
Romka
46c447d089 Update OpenCollar - update.lsl 2014-04-03 23:46:08 +04:00
WendyStarfall
292d1936af 3.960; sync III
main, update
2014-04-03 21:27:34 +02:00
WendyStarfall
5a934c41df littlemousy in-world; main 2014-04-03 21:25:00 +02:00
WendyStarfall
369bf0a5de Merge pull request #205 from RomkaSwallowtail/patch-94
Update OpenCollar - update.lsl   MENUNAME_RESPONSE
2014-04-03 21:22:07 +02:00
Romka
14376a10ff Update OpenCollar - update.lsl 2014-04-03 22:46:41 +04:00
Romka
9175e59b20 Update OpenCollar - update.lsl
no need MENUNAME_RESPONSE for Help/about menu, because it is not processed in main script.
2014-04-03 22:23:54 +04:00
WendyStarfall
d1decbf818 3.960; sync II
badwords, bell, camera, garble, label, timer, titler
2014-04-03 20:03:13 +02:00
WendyStarfall
184d7b4f1d 3.960; sync I
anim, appearance, auth, leash, main, rlvmain, settings
2014-04-03 19:32:28 +02:00
WendyStarfall
48cfaac7ef Merge pull request #204 from RomkaSwallowtail/patch-93
Update OpenCollar - settings.lsl MENUNAME_RESPONSE
2014-04-03 19:13:56 +02:00
WendyStarfall
8626b9fda1 Merge pull request #203 from RomkaSwallowtail/patch-92
Update OpenCollar - leash.lsl  MENUNAME_RESPONSE
2014-04-03 19:13:49 +02:00
WendyStarfall
d410bee94a Merge pull request #202 from RomkaSwallowtail/patch-91
Update OpenCollar - auth.lsl  MENUNAME_RESPONSE
2014-04-03 19:13:43 +02:00
WendyStarfall
989eea3cca Merge pull request #201 from RomkaSwallowtail/patch-90
Update OpenCollar - appearance.lsl  MENUNAME_RESPONSE
2014-04-03 19:13:36 +02:00
WendyStarfall
07feed8229 Merge pull request #200 from RomkaSwallowtail/patch-89
Update OpenCollar - anim.lsl   MENUNAME_RESPONSE
2014-04-03 19:13:29 +02:00
WendyStarfall
8034603558 Merge pull request #199 from RomkaSwallowtail/patch-88
OpenCollar - rlvmain.lsl  bug:  RLV submenu don't update on "Fix Menus"
2014-04-03 19:13:18 +02:00
Romka
81e52c4156 Update OpenCollar - settings.lsl 2014-04-03 01:14:59 +03:00
Romka
1e815f2409 Update OpenCollar - leash.lsl
no need MENUNAME_RESPONSE for Main menu, because it is not processed in main script.
2014-04-03 01:01:49 +03:00
Romka
8329165d59 Update OpenCollar - auth.lsl
no need MENUNAME_RESPONSE for Main menu, because it is not processed in main script.
2014-04-03 01:00:36 +03:00
Romka
b95bd05671 Update OpenCollar - appearance.lsl
no need MENUNAME_RESPONSE for Main menu, because it is not processed in main script.
2014-04-03 00:59:24 +03:00
Romka
dc54bdca34 Update OpenCollar - anim.lsl
no need MENUNAME_RESPONSE for Main menu, because it is not processed in main script.
2014-04-03 00:58:29 +03:00
Romka
78ad3be7e0 Update OpenCollar - rlvmain.lsl
no need MENUNAME_RESPONSE for Main menu, because it is not processed in main script.

add update submenu for "Fix Menus"
2014-04-03 00:52:00 +03:00
WendyStarfall
5dbbd5c89f Merge pull request #198 from RomkaSwallowtail/patch-87
Update OpenCollar - main.lsl  Global_trace !
2014-04-02 23:34:51 +02:00
WendyStarfall
2070c598f7 BETA 3.959 ready to ship 2014-04-02 23:25:45 +02:00
Romka
55ff299d00 Update OpenCollar - main.lsl
fixes Trace button changing state on fix menus
2014-04-03 00:25:18 +03:00
WendyStarfall
1f7512a67d fixes lock button changing state on fix menus 2014-04-02 22:16:13 +02:00
WendyStarfall
71c4ee9eac prepping 3.959; sync III
auth, garble, leash, main
2014-04-02 20:02:25 +02:00
WendyStarfall
940d5b9e90 littlemousy in-world; garble
and we have a remenu (that was quick!)
2014-04-02 18:15:30 +02:00
WendyStarfall
7cf13edb63 boxes instead on/off
we need a remenu here yet
2014-04-02 18:12:57 +02:00
WendyStarfall
18a569d07f fancier boxes for trace 2014-04-02 18:04:19 +02:00
WendyStarfall
f72016baf0 mouse & wendy in-world; main 2014-04-02 17:19:51 +02:00
WendyStarfall
09f0829089 littlemousy in-world; auth 2014-04-02 16:51:09 +02:00
WendyStarfall
dcada629c4 tidy up; debugs 2014-04-01 11:01:12 +02:00
WendyStarfall
0b7b542860 ketchup; grabbypost 2014-04-01 10:47:10 +02:00
WendyStarfall
fc768dc332 ketchup; leashholder 2014-04-01 10:42:01 +02:00
WendyStarfall
adb9afa287 attribution to littlemousy
and attribution to a few legacy members, in this case Lulu Pink for
rewriting the old leash, Garvin Twine for the initial
leash/leashParticle split and Cleo Collins for the bell; OpenCollar
Organiser was removed as it is "the organization" and not actually a
legal entity like an individual
2014-04-01 04:28:56 +02:00
WendyStarfall
ff04e364f3 ketchup; Master 2014-04-01 04:17:36 +02:00
WendyStarfall
9b3526b334 ketchup; Dialog 2014-04-01 04:16:53 +02:00
WendyStarfall
7f8411e990 ketchup; BundleGiver 2014-04-01 04:14:07 +02:00
WendyStarfall
d082087789 ketchup; UpdateShim 2014-04-01 04:12:13 +02:00
WendyStarfall
816406f581 grooming & ketchup; update 2014-04-01 04:09:34 +02:00
WendyStarfall
8858b9589e grooming & ketchup; update
//3.935 Bugfix for sending collarversion to menu script, 1 and 0 instead
of TRUE and FALSE;
//3.940 doesn't give regular updaters, informs user where to get an
updater, and get updater button gives current updater
2014-04-01 04:04:54 +02:00
WendyStarfall
c61005c0af grooming & ketchup; titler
// SatomiAhn Initial support for llTextBox.
// Romka Swallowtail add some buttons =^_^=
2014-04-01 04:02:28 +02:00
WendyStarfall
b3e056cdcf bbq sauce; timer 2014-04-01 03:56:02 +02:00
WendyStarfall
ad0bfa3b86 grooming & ketchup; texture
//3.936 reset script on owner change
//Version 3.934 New Feature. Allow textures to be specified in a texture
notecard. Notecard must contain textures on a separate line per texture,
in the format name,uuid. -MD

//Version 3.935 Added support for texture notecard named textures_custom
which will be read instead of the standard texture notecard if present.
Also put MENUNAME_RESPONSE into onrez in place of reset. This menu
building system is... uh... yeah. -MD

//Version 3.935 removed llToLower() in GetLongName(),
GetElementHasTexs() and BuildTexButtons() functions. This commit makes
textureable elements case sensitive; we need that if textures are
exclusive to specific elements on the collar otherwhise those textures
would have to be named like the element but in lower caps - Karo
Weirsider
// Flip side, now it relies on them being the same. Risk of breaking
some existing content here? I'm inclined to say it would be better to
put llToLower on both sides of the test comparisons, no? -Medea Destiny.
2014-04-01 03:51:13 +02:00
WendyStarfall
ec02db39f1 grooming & ketchup; settings
//3.936 Fixed up multiline and multi-item cache dump to text to properly
use new line characters at the start of each line so that the output
list is properly NOT concatenated into a single line per script despite
continuation characters.
//3.934 Added a load defaults button to menu to user to reload the
settings from the defaults notecard without having to open the notecard,
edit it, and save it again, as script is only being reset on a changed
owner. This allows people to restore settings more easily, for example
if they change appearance or if they runaway and want to restore the
owner settings from the defaults card. -MD
//3.934 Menu Changes: the help/debug > settings setup removed, now help
goes into the help/about menu and these functions appear in the Options
menu under main. For the sake of simplicity, Fix Menus is now handled
here, by using llResetOtherScript(); -MD
2014-04-01 03:48:05 +02:00
WendyStarfall
0a3bd86d72 grooming & ketchup; rlvundress
// 3.936 New feature! Smartstrip. When smartstrip is activated, the
standard clothing removal folder will use detachallthis instead of
remoutfit, to remove everything in the same folder or child folders of
the item being removed. For people with a sensibly set up #RLV, this
makes this a far more useful option! Because lots of people *don't* have
a #RLV folder set up for this, we also have a notecard to give to help
people with setting up folders. Yay! Smartstrip gets turned on and off
via the menus or via the chat commands "smartstrip on" and "smartstrip
off". Owners and Wearers can both change this setting. However! We also
have a g_kSmartUser key. If someone other an Owner or Wearer selects it,
their key gets dumped into this value, which is not saved. This allows
other people to activate it for themselves only, for that session only.
As an additional bonus, removing clothing can now be accessed by an easy
chat command, "strip (item)" or "strip all". For now, I haven't changed
the behaviour of strip all, however the code is there commented out if
we think it's a good idea for strip all to use smartstrip.
2014-04-01 03:44:34 +02:00
WendyStarfall
4cb75a2fc7 grooming & ketchup; rlvtp
//3.004 - adding "accepttp" support.  No button, just automatically
turned on for owner.
//3.524+ - moving accepttp to the exception script.
2014-04-01 03:39:25 +02:00
WendyStarfall
638e9fb5e5 ketchup; rlvtalk 2014-04-01 03:33:25 +02:00
WendyStarfall
32a1316ef3 grooming & ketchup; rlvsit
//3.928 -- addition to 3.925, sensor is called in two separate places
(ugh), fix to apply 3.925 change to both. Spotted by Edgar Yven. --
3.925 Revision Proposal, Medea Destiny. ISSUE: Sit Now button will not
return all objects. What's going on? It's a bit of an oddity about the
way sensors work. The SCRIPTED sensor flag only returns active scripted
items, i.e. scripts actually doing something like listening. A
work-around that seems to work is to search for PASSIVE|SCRIPTED in the
sensor, then filter by llDetectedType, which gives SCRIPTED for
non-active scripts. I've implemented that in this script. The downside
is you'll get fewer objects returned to the SIT_NOW menu as the sensor
will pick up the nearest 16 PASSIVE or SCRIPTED items, so you'll have to
be nearer to the object. So, pro: you'll now be able to find dumb sit
scripts. Con: you'll have to be nearer the item. Is this a good
trade-off?
2014-04-01 03:30:24 +02:00
WendyStarfall
44560dd89a ketchup; rlvrelay 2014-04-01 03:26:30 +02:00
WendyStarfall
c281682b5b ketchup; rlvmisc 2014-04-01 03:20:44 +02:00
WendyStarfall
9a627a4849 grooming & ketchup; rlvmain
//3.934: Something situation could cause the viewer check to get stuck.
Not clear what, but I've thrown in a few robustness measures that
hopefully should sort that out.
2014-04-01 03:18:24 +02:00
WendyStarfall
340b34a014 grooming & ketchup; rlvfolders
//3.934 removed many newlines from browse folder prompts, it was getting
ridiculously big! -MD
2014-04-01 03:13:17 +02:00
WendyStarfall
96f396dffa OCD grooming & ketchup; rlvex 2014-04-01 03:11:17 +02:00
WendyStarfall
3b69d60caf grooming & ketchup; rlvex
//3.959 Medea/Lucian: g_iAuth was not being set in menu path to adding
user, resulting in no auth value for return menu. Added  g_iAuth=auth;
to fetchAvi command.

//3.936 Bugfixes:  1. Reported issue, message about UUID not found when
trying to add other. I haven't found this to be repeatable, but I have
managed to get it to do it once. Increased llRequestAgentInfo timer to 4
seconds from 0.5, because 0.5 may simply be too short to reliably get a
response from the dataserver, particularly in a laggy sim. Hopefully
this will remove the issue, but let's monitor this.  2. Reported issue
in secowner exceptions not being set. Typo in settings was looking for
auth_secowner rather than auth_secowners in LM_SETTINGS_RESPONSE, so
secowners list was not getting filled.

//3.934 notes. I've overhauled the menu appearance as it wasn't really
that easy to understand, following the RLV terminology which is a bit of
a headache for scripters, let alone users. Descriptions are clearer and
now represent the current state, and we use unicode ☐ and ☒ to indicate
selected/deselected state on the buttons, common with unicode
enhancements to other menus. ALL buttons indicators swapped to make
clearer the effect of pressing them, and the person to whom the
exceptions will be added/removed is now named at the top of the menu.
Finally, I've cleared up remenuing a little. When someone who is not an
owner/secowner is set to default and removed from the list, we now
return the personlist, and when a new person is added, we remenu. -
Medea

//3.934 notes. Removed SetOwnerExs as it's never called. Added a check
to setAllExs to  avoid setting exceptions for wearer (for example if the
wearer is set as an owner) as they're pointless. - Medea
2014-04-01 03:09:03 +02:00
WendyStarfall
d3b24f3653 grooming & ketchup; main
//3.934d fix for kID instead of kAv for inventory giving. Duh.

// 3.934 reimplemented Menuto function for hud channel. This seems to
have been lost by the wayside in the interface channel mods. I've added
a check to see if the object owner is the same as the menuto target key,
as this will mean a new auth is not required and saves double authing in
that situation (probably the most common). -MD
// 3.934 Menu changes. help/debug is now replaced with Options menu,
operated from the settings script. Refresh menus is now done from the
Options menu in settings, using llResetOtherScript instead of from here,
to keep things simple. Info button in main menu is now a Help/About
menu, which has links to wiki in a button in it, and gets the various
help buttons formerly in the help/debug menu. Update script now sends
the current version and whether there's an update available. The actual
version number is now reported in main and in help/about, and the prompt
text for all three menus is returned by a function now instead of stored
in a list, which allows us to keep up to date, and notify in help/about
prompt when an update is available.  -MD
//3.934 Added button in Help/About to give license notecard and another
to open Defaultsettings help URL.
2014-04-01 03:07:13 +02:00
WendyStarfall
a9bc2965ee grooming & ketchup; listener
//3.941 - littlemousy - combined listen script with touch script, so all
input to collar goes through a single script.  Should save us some
memory.
2014-04-01 03:05:32 +02:00
WendyStarfall
8a415b7cc1 grooming & ketchup; leashParticle
// ADDED "LIFE" MENU FUNCTION TO LEASH MENU FOR ST ("Slave Trash"
version) by Jean Severine 2014-01-25

//Split from the leash script in April 2010 by Garvin Twine

//3.934 replace g_sParticleTextureID with texture name if NULL_KEY. This
is for non full perms textures, which return a null key, giving a blank
particle. This should still work for linked leash points if the texture
is added to the leash point as well.
2014-04-01 03:02:59 +02:00
WendyStarfall
a075718044 grooming & ketchup; leash
// -------------------------------
// Original leash scripting & ongoing updates
// Author: Nandana Singh
// Date: Oct. 18, 2008
// -------------------------------
// Rewrite & various updates
// Author: Lulu Pink
// -------------------------------
// Various updates
// Author: Garvin Twine
// -------------------------------
// Edited & Added integration for particle-system to OC Settings &
Dialog Subsystems (3.421)
// Author: Joy Stipe
// -------------------------------
//April 2010 splitting of the particle part into its own script April
2010
// Author: Garvin Twine
// -------------------------------
2014-04-01 02:56:01 +02:00
WendyStarfall
8540067d69 grooming & ketchup; label
// SatomiAhn Initial support for llTextBox.
2014-04-01 02:48:39 +02:00
WendyStarfall
e31c6b9c8c ketchup; hide 2014-04-01 02:47:38 +02:00
WendyStarfall
83546004e8 grooming & ketchup; garble
//v3.601 by Joy Stipe 2010/07/28
2014-04-01 02:46:28 +02:00
WendyStarfall
b940c3a2e4 grooming & ketchup; dialog
// SatomiAhn Initial support for llTextBox.
//3.951 <512 not <513 for dialog message length. AAAARGH. *bangs head
against wall* -MD
2014-04-01 02:44:09 +02:00
WendyStarfall
a6e8b8f261 ketchup; couples 2014-04-01 02:41:38 +02:00
WendyStarfall
dfeab03462 ketchup; color 2014-04-01 02:40:56 +02:00
WendyStarfall
ca88076b7c ketchup; cleanup 2014-04-01 02:39:55 +02:00
WendyStarfall
3e238537b9 grooming & ketchup; camera
//3.927 MD: added perms check before attempting to clear camera params
in case of reset when collar not worn.
2014-04-01 02:38:17 +02:00
WendyStarfall
5a31fb0e2d grooming & ketchup; bell
//3.927 MD: Update g_kOwners in on_rez event, as we don't necessarily
reset this script and currently we may get failed permission requests
targeting the wrong avatar! See line 513. Added check for runaway, if
bell should be hidden, sleep for 4 seconds then re-hide the bell
elements. This is to avoid other scripts resetting visibility. See line
712. Added changed event: INVENTORY changes mean more sounds may be
available, so redo prepareSounds(), and LINK to redo
BuildBellElementList(). See line 753

//Collar Cuff Menu

//=============================================================================
//== OC Bell Plugin - Adds bell sounds while moving to the collar,
allows to adjust vol, sound and timing
//== as well to switch them off and hide the bell
//==
//== Note to Designers
//== Plugin offers option to show/hide the bell if there are prims named
"Bell"
//== Plugin has a few default sounds, you can add more by putting them
in the collar. The plugin scan for sounds starting with "bell_", f.i.
"bell_kitty1"
//==
//== 2009-01-30 Cleo Collins - 1. draft
//==
//==

//=============================================================================
2014-04-01 02:35:56 +02:00
WendyStarfall
4cf37d2081 grooming & ketchup; badwords
// SatomiAhn Initial support for llTextBox.
2014-04-01 02:17:27 +02:00
WendyStarfall
65f6767617 grooming & ketchup; auth
//3.934 submenu name changed to "access" for menu updates and chat
command for submenu updated to match (now works with both <prefix>owners
and <prefix>access. Much bigger update to this script is in the works,
but I think that's all that's needed for this release.
2014-04-01 02:16:05 +02:00
WendyStarfall
7d0b2a0d72 ketchup; appearance 2014-04-01 02:14:52 +02:00
WendyStarfall
4005175d4f grooming & ketchup; anim
//3.940 gives AO from inventory only

//3.936 bugfix: out of order command handling in dialog response was
sending some commands back to child scripts. Also, added script reset on
changed owner.

//3.935   Added support for posture collar neck locking using provided
~PostureOverride animation, or another animation named in
g_sPostureAnim. Supplied animation locks head and neck and priority 6 to
ensure overriding. If the animation is found in inventory, animation
menu will have a "☐Posture" as button defined in POSTURE. Button will
not show if animation is not present. Also responds to chat commands
"posture on" and "posture off". Posture is saved in settings with the
token (g_sPostureToke) posture=1 when active, and read back from
settings/defaultsettings notecard when settings are sent by settings
script. Posture is reposed when animations refreshed and when
permissions are granted (i.e. on attach) if g_iPosture is TRUE.

//3.935 Removed reset on rez. CreateAnimList now happens if
g_iNumberOfAnims changes instead of each rez. Much more sensible.
requestperm() removed (let's not have single use functions! Bad!
Naughty!) and permission requested in attach event instead, saving the
unnecessary if(llGetAttached()); call. run_time_permissions is added to
allow restoring posture. Also, good practice to have it. Probably should
store permission in an integer to save llGetPermissions checks. We
should consider if we want to refresh poses here rather than having all
poses scrapped on rez as current. Added remenuing to the animation menu
where sensible.

//2009-03-22, Lulu Pink, animlock - issue 367
2014-04-01 02:13:52 +02:00
WendyStarfall
ce6cdccd0c This is the wonderful thing about espionage;
nothing exists anymore. - Sir William Samuel Stephenson
2014-04-01 01:34:47 +02:00
WendyStarfall
89915b3cc3 Merge pull request #193 from RomkaSwallowtail/patch-85
Update OpenCollar - timer.lsl  WEARERLOCKEDOUT
2014-04-01 00:48:49 +02:00
WendyStarfall
4b9be4d7ea installer; new main menu setup
we no longer need an extra menu and master lock as both elements are now
combined to "main"
2014-04-01 00:33:37 +02:00
WendyStarfall
b95cde67b3 prepping 3.959; in-world sync II
auth, couples, label, rlvfolders, rlvundress, settings
2014-04-01 00:00:23 +02:00
littlemousy
77b0e0dfdb removed redundant button handling code 2014-03-31 19:06:49 +01:00
littlemousy
54493571b9 Fixed endless anims bug in new timer setup 2014-03-31 19:02:44 +01:00
littlemousy
1449eff092 Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main 2014-03-31 18:59:37 +01:00
WendyStarfall
9bf5e7e72d box labels default to Serif 2
which would be the more common case; for designs that need LCD like
colony or tech, I will adjust the defaultsettings cards
2014-03-31 14:52:46 +02:00
WendyStarfall
0b916a43d2 littlemousy in-world; settings 2014-03-31 14:31:13 +02:00
littlemousy
c88007482e changed script name to reflect renamed/merged menu script 2014-03-31 13:21:14 +01:00
littlemousy
faa397d4c1 Fixed update bug 2014-03-31 13:03:43 +01:00
littlemousy
44430cdf5a Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main 2014-03-31 13:02:13 +01:00
littlemousy
f8ca4bff76 Add owner by key
Add owner by key

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2014-03-31 12:59:21 +01:00
WendyStarfall
55bda57d18 Merge pull request #194 from KeiyraAeon/patch-1
Dialog typo - rlvundress.lsl
2014-03-31 11:50:11 +02:00
KeiyraAeon
743d23b8b4 rlvundress.lsl dialog typo
Since the dawn of time, "attachEments" has been the bane of grammar enthusiasts everywhere.
2014-03-30 18:20:02 -04:00
littlemousy
1e452cf9b5 merged main and lock 2014-03-30 21:29:47 +01:00
Romka
0d7bb61935 Update OpenCollar - timer.lsl 2014-03-29 20:54:44 +03:00
WendyStarfall
133496e8fb littlemousy in-world; leash 2014-03-29 05:00:38 +01:00
WendyStarfall
9ecce4f761 littlemousy in-world; leashParticle 2014-03-29 05:00:00 +01:00
WendyStarfall
50b5d18c5e Revert "Moved absent leasher detect code from leashparticle to leash"
This reverts commit 8cc3f67f86.
2014-03-29 04:37:14 +01:00
WendyStarfall
f953059df4 mouse & wendy in-world; titler 2014-03-29 04:19:29 +01:00
littlemousy
f6c6181edf Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main 2014-03-29 02:57:40 +00:00
littlemousy
8cc3f67f86 Moved absent leasher detect code from leashparticle to leash 2014-03-29 02:49:00 +00:00
WendyStarfall
b84206814c copyright; date 2014-03-29 02:02:13 +01:00
WendyStarfall
2d41dbee1e prepping 3.959; in-world sync I
rlvrelay, rlvex, lock, titler
2014-03-29 01:54:36 +01:00
WendyStarfall
504620b606 Merge pull request #192 from RomkaSwallowtail/patch-84
Update OpenCollar - lock.lsl   BUG, if changed "Lock" prims links
2014-03-29 01:49:05 +01:00
WendyStarfall
d6dd1763c1 Satomi Ahn in-world; rlvrelay 2014-03-29 00:03:54 +01:00
littlemousy
aec0ae213b Added "remove restrictions when leasher out of range" code 2014-03-28 19:47:45 +00:00
Romka
a88ff3cc12 Update OpenCollar - lock.lsl
I link "padlock" to collar, but the script did not see it until script was reset.
need rebuild LockElementList if links changed.
2014-03-28 19:04:30 +03:00
littlemousy
e2ea9dd69b Added check on strict mode active when setting restrictions (Duhhh) 2014-03-28 14:33:57 +00:00
WendyStarfall
3e65b35b14 Merge pull request #190 from RomkaSwallowtail/patch-83
Update OpenCollar - titler.lsl  fix loses the auth on relog
2014-03-27 23:43:20 +01:00
Romka
549fa90a91 Update OpenCollar - titler.lsl
increased to 0.5 default text offset 
add save and restore last auth from settings
2014-03-27 23:51:55 +03:00
WendyStarfall
c2584c7478 Satomi Ahn in-world; rlvrelay
"Change of queue cleaning policy in relay ask mode: when memory is full,
oldest request is dropped instead of newest."
2014-03-26 23:39:43 +01:00
WendyStarfall
03cf36ba66 Medea Destiny in-world; rlvex
"g_iAuth was not being set in menu path to adding user, resulting in no
auth value for return menu. Added  g_iAuth=auth; to fetchAvi command";
bug found by Lucian Underwood
2014-03-26 20:38:41 +01:00
littlemousy
3b44944cce Merge pull request #188 from RomkaSwallowtail/patch-82
Update OpenCollar - leash.lsl length set 30m don't work
2014-03-26 18:37:32 +00:00
Romka
3735cabcb3 Update OpenCollar - leash.lsl
fix max length 30 m
2014-03-26 19:25:58 +03:00
WendyStarfall
6fee134005 BETA 3.958 ready to ship 2014-03-26 04:21:52 +01:00
WendyStarfall
314dcece0c Satomi Ahn in-world; rlvrelay
adds a memory check patch
2014-03-26 02:22:09 +01:00
WendyStarfall
fa25b3df62 in-world sync; cleanup 2014-03-26 01:00:10 +01:00
littlemousy
2ac9f8bb6c added third test, for "!totallytransparent" as string not uuid 2014-03-25 23:51:55 +00:00
littlemousy
47162bcad0 Replaced missing notify message for wearer 2014-03-25 21:33:05 +00:00
WendyStarfall
f5212458e7 prepping 3.958; OCD check and headers 2014-03-25 17:40:10 +01:00
littlemousy
a64d9813ba Merge pull request #175 from RomkaSwallowtail/patch-69
Update OpenCollar - couples.lsl   I correct my big mistake
2014-03-25 09:34:44 +00:00
littlemousy
5961c6bf29 Merge pull request #176 from RomkaSwallowtail/patch-70
Update OpenCollar - garble.lsl   I correct my big mistake
2014-03-25 09:34:37 +00:00
littlemousy
a82d224819 Merge pull request #177 from RomkaSwallowtail/patch-71
Update OpenCollar - leash.lsl   I correct my big mistake
2014-03-25 09:34:29 +00:00
littlemousy
2f3f830a7a Merge pull request #178 from RomkaSwallowtail/patch-72
Update OpenCollar - lock.lsl   I correct my big mistake
2014-03-25 09:34:22 +00:00
littlemousy
4ddacc513c Merge pull request #179 from RomkaSwallowtail/patch-73
Update OpenCollar - rlvex.lsl   I correct my big mistake
2014-03-25 09:34:14 +00:00
littlemousy
4c9e8cbc0e Merge pull request #180 from RomkaSwallowtail/patch-74
Update OpenCollar - rlvfolders.lsl    corrected my big mistake
2014-03-25 09:34:01 +00:00
littlemousy
0faea49265 Merge pull request #181 from RomkaSwallowtail/patch-75
Update OpenCollar - rlvmain.lsl corrected my big mistake
2014-03-25 09:33:51 +00:00
littlemousy
71c94af0da Merge pull request #182 from RomkaSwallowtail/patch-76
Update OpenCollar - rlvmisc.lsl  corrected my big mistake
2014-03-25 09:33:42 +00:00
littlemousy
4074a50f93 Merge pull request #183 from RomkaSwallowtail/patch-77
Update OpenCollar - rlvrelay.lsl  corrected my big mistake
2014-03-25 09:33:33 +00:00
littlemousy
44eb249407 Merge pull request #184 from RomkaSwallowtail/patch-78
Update OpenCollar - rlvsit.lsl  corrected my big mistake
2014-03-25 09:33:24 +00:00
littlemousy
5231418142 Merge pull request #185 from RomkaSwallowtail/patch-79
Update OpenCollar - rlvtalk.lsl  corrected my big mistake
2014-03-25 09:33:16 +00:00
littlemousy
9696d68572 Merge pull request #186 from RomkaSwallowtail/patch-80
Update OpenCollar - rlvtp.lsl  corrected my big mistake
2014-03-25 09:33:02 +00:00
littlemousy
16e6e9f0e9 Merge pull request #187 from RomkaSwallowtail/patch-81
Update OpenCollar - rlvundress.lsl   corrected my big mistake
2014-03-25 09:32:47 +00:00
Romka
0c5209faec Update OpenCollar - rlvundress.lsl 2014-03-25 12:24:08 +03:00
Romka
d9baa0f2cc Update OpenCollar - rlvtp.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:22:57 +03:00
Romka
533f3119d1 Update OpenCollar - rlvtalk.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:22:06 +03:00
Romka
1a51d04a25 Update OpenCollar - rlvsit.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:21:20 +03:00
Romka
05a51c199c Update OpenCollar - rlvrelay.lsl 2014-03-25 12:20:24 +03:00
Romka
f8d82e3c21 Update OpenCollar - rlvmisc.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:19:24 +03:00
Romka
159c719e47 Update OpenCollar - rlvmain.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:18:31 +03:00
Romka
cc4acb3dd3 Update OpenCollar - rlvfolders.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:16:21 +03:00
Romka
46907deb6a Update OpenCollar - rlvex.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:15:16 +03:00
Romka
ae1f6aa14a Update OpenCollar - lock.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:14:11 +03:00
Romka
44ce210319 Update OpenCollar - leash.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:13:08 +03:00
Romka
c98075be0c Update OpenCollar - garble.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:11:40 +03:00
Romka
448b32af8c Update OpenCollar - couples.lsl
RLV commands not work properly without NULL_KEYs
2014-03-25 12:09:38 +03:00
littlemousy
132c8b0fd4 Oops, forgot to replace constant from testing with variable in loop
Now also replaces default testure, to fix up collars broken by the previous version
2014-03-25 01:22:21 +00:00
WendyStarfall
64816ede64 BETA 3.957 ready to ship 2014-03-25 00:36:49 +01:00
WendyStarfall
416604125d just commented out the debug line for free memory 2014-03-24 23:20:24 +01:00
WendyStarfall
a1dddac9c4 ready for 3.960 2014-03-24 23:08:59 +01:00
WendyStarfall
d03f75da2a #RLV and Relay guides are embedded
this is just to be tidy; in-world we have the #RLV and Relay help
notecards embedded in the OpenCollar Guide
2014-03-24 23:04:08 +01:00
WendyStarfall
3cc7f9fea6 cleaning up at 3.957
merged: dialog now also plays getavi dialogs; merged: listener takes
care of touch events; what we don't uninstall anymore by default are old
couple animations just as we don't install or override new couple
animations or the coupleanims notecard
2014-03-24 23:00:05 +01:00
WendyStarfall
1901c6ffaf hovertext becomes titler
in installers, menus and now also the script itself
2014-03-24 22:49:54 +01:00
WendyStarfall
0ad7fc2947 putting rlvmisc back in
rlvmisc is now also default-able and can be part of the standard rlv
suite
2014-03-24 22:46:16 +01:00
WendyStarfall
3af4241026 we <3 animals
this bundles includes anim, couples and the posture animation; it has an
INSTALL tag by default because most users will want to play poses,
however, animal avatars who cannot play standard poses or couple
animations can now simply untick this bundle when running the custom
installation option; yay!
2014-03-24 22:42:25 +01:00
WendyStarfall
62dd8be2c7 mousekins magical coupleanim merge
just renaming the coupleanim.lsl file to couples.lsl and binning the old
files
2014-03-24 22:35:49 +01:00
WendyStarfall
d7ae1f84ba Strict Mode and final polish
littlemousy did a /flawless/ job there merging real leash with leash,
all credit and more power to her; all I did here was obsessing over
cosmetic stuff and for the reason the original real leash plugin allowed
setting restrictions individually, I felt it necessary to give it a
fresh name to prevent misunderstandings about the functionality; this
push concludes and closes #75
2014-03-24 22:21:41 +01:00
WendyStarfall
d4b91a1c9a grabby post is back as an actual post
this was a popular request; I changed the folder name to reflect the
same name of the object in-world
2014-03-24 21:05:36 +01:00
WendyStarfall
8e51acdcf0 new raw urls; merge beta/main
mousekin merged; I adjusted the new raw urls github gives us now which
used to be raw.github.com and then became raw2.github.com and now is
raw.githubusercontent.com for some reason
2014-03-24 14:42:57 +01:00
WendyStarfall
c7b45e1413 Merge pull request #174 from RomkaSwallowtail/patch-68
Update OpenCollar - update.lsl   prevent  possible collarversion bug
2014-03-24 13:47:49 +01:00
Romka
3e473bc23c Update OpenCollar - update.lsl
add delete old version if it's saved in db.
to prevent LM_SETTING_RESPONSE conflicts of the new version vs old, if it's saved in settings DB.
2014-03-24 11:17:04 +03:00
WendyStarfall
2414dd3029 prepping 3.957; OCD check and headers 2014-03-24 05:20:03 +01:00
littlemousy
aa6cd0cf0a Settings loaded from database are now applied 2014-03-24 02:13:10 +00:00
littlemousy
941eb2fd2d Merge branch 'main' of https://github.com/OpenCollar/OpenCollarUpdater into main 2014-03-24 01:15:25 +00:00
littlemousy
b7c1b938b5 added code to replace !totallytransparent texture with the system transparent texture key 2014-03-24 01:13:37 +00:00
littlemousy
a71f168d45 Merge pull request #173 from RomkaSwallowtail/patch-67
Update OpenCollar - hovertext.lsl   use settings DB
2014-03-23 12:49:41 +00:00
Romka
fed2ce620a Update OpenCollar - hovertext.lsl
use save and restore parameters into/from DB
2014-03-23 15:17:15 +03:00
littlemousy
238be69b23 New file, merges coupleanim1 and coupleanim2 scripts, and uses sensordialogs from dialog script instead of rolling its own 2014-03-23 10:07:49 +00:00
littlemousy
8931384545 Merge pull request #172 from RomkaSwallowtail/patch-66
Update OpenCollar - hovertext.lsl
2014-03-23 09:02:33 +00:00
Romka
003a4460e1 Update OpenCollar - hovertext.lsl
add arrows in the up and down buttons
add restore hovertext prim size
2014-03-23 08:31:02 +03:00
WendyStarfall
41396be89a Merge pull request #170 from RomkaSwallowtail/patch-65
Update OpenCollar - update.lsl NULL_KEY
2014-03-22 21:31:01 +01:00
WendyStarfall
33f12b8580 Merge pull request #169 from RomkaSwallowtail/patch-64
Update OpenCollar - update.lsl NULL_KEY
2014-03-22 21:19:41 +01:00
WendyStarfall
04540ed4c0 Merge pull request #168 from RomkaSwallowtail/patch-63
Update OpenCollar - timer.lsl NULL_KEY
2014-03-22 21:19:01 +01:00
WendyStarfall
e57da0ad85 Merge pull request #167 from RomkaSwallowtail/patch-62
Update OpenCollar - texture.lsl NULL_KEY
2014-03-22 21:18:54 +01:00
WendyStarfall
cdff456ae4 Merge pull request #166 from RomkaSwallowtail/patch-61
Update OpenCollar - subspy.lsl NULL_KEY
2014-03-22 21:18:47 +01:00
WendyStarfall
394f0d089a Merge pull request #165 from RomkaSwallowtail/patch-60
Update OpenCollar - settings.lsl NULL_KEY
2014-03-22 21:18:40 +01:00
WendyStarfall
c80c1eb8f7 Merge pull request #164 from RomkaSwallowtail/patch-59
Update OpenCollar - rlvundress.lsl NULL_KEY
2014-03-22 21:18:32 +01:00
WendyStarfall
d3fbca0046 Merge pull request #163 from RomkaSwallowtail/patch-58
Update OpenCollar - rlvtp.lsl NULL_KEY
2014-03-22 21:18:24 +01:00
WendyStarfall
3550b96b4c Merge pull request #162 from RomkaSwallowtail/patch-57
Update OpenCollar - rlvtalk.lsl NULL_KEY
2014-03-22 21:18:15 +01:00
WendyStarfall
394c0ce145 Merge pull request #161 from RomkaSwallowtail/patch-56
Update OpenCollar - rlvsit.lsl NULL_KEY
2014-03-22 21:18:08 +01:00
WendyStarfall
5eeeb485e0 Merge pull request #160 from RomkaSwallowtail/patch-55
Update OpenCollar - rlvrelay.lsl  NULL_KEY
2014-03-22 21:18:01 +01:00
WendyStarfall
a5e5b393e1 Merge pull request #159 from RomkaSwallowtail/patch-54
Update OpenCollar - rlvmisc.lsl NULL_KEY
2014-03-22 21:17:53 +01:00
WendyStarfall
2ce9c2300c Merge pull request #158 from RomkaSwallowtail/patch-53
Update OpenCollar - rlvmain.lsl NULL_KEY
2014-03-22 21:17:45 +01:00
WendyStarfall
4067ad5d4d Merge pull request #157 from RomkaSwallowtail/patch-52
Update OpenCollar - rlvfolders.lsl NULL_KEY
2014-03-22 21:17:33 +01:00
WendyStarfall
e937c4cc4a Merge pull request #156 from RomkaSwallowtail/patch-51
Update OpenCollar - rlvex.lsl NULL_KEY
2014-03-22 21:17:25 +01:00
WendyStarfall
1a90028fd7 Merge pull request #155 from RomkaSwallowtail/patch-50
Update OpenCollar - plugin template.lsl NULL_KEY
2014-03-22 21:17:10 +01:00
WendyStarfall
7812a11951 Merge pull request #154 from RomkaSwallowtail/patch-49
Update OpenCollar - menu.lsl NULL_KEY
2014-03-22 21:17:02 +01:00
WendyStarfall
09653f7685 Merge pull request #153 from RomkaSwallowtail/patch-48
Update OpenCollar - lock.lsl NULL_KEY
2014-03-22 21:16:53 +01:00
WendyStarfall
4ecae541f4 Merge pull request #152 from RomkaSwallowtail/patch-47
Update OpenCollar - listener.lsl NULL_KEY
2014-03-22 21:16:36 +01:00
WendyStarfall
bbadc2be23 Merge pull request #151 from RomkaSwallowtail/patch-46
Update OpenCollar - leashParticle.lsl NULL_KEY
2014-03-22 21:16:27 +01:00
WendyStarfall
88344e9dce Merge pull request #150 from RomkaSwallowtail/patch-45
Update OpenCollar - leash.lsl NULL_KEY
2014-03-22 21:16:19 +01:00
WendyStarfall
e937509594 Merge pull request #149 from RomkaSwallowtail/patch-44
Update OpenCollar - label.lsl NULL_KEY
2014-03-22 21:16:10 +01:00
WendyStarfall
a55490b894 Merge pull request #148 from RomkaSwallowtail/patch-43
Update OpenCollar - hovertext.lsl NULL_KEY
2014-03-22 21:16:01 +01:00
WendyStarfall
64629c135e Merge pull request #147 from RomkaSwallowtail/patch-42
Update OpenCollar - hide.lsl NULL_KEY
2014-03-22 21:15:46 +01:00
WendyStarfall
6429a0fae2 Merge pull request #146 from RomkaSwallowtail/patch-41
Update OpenCollar - garble.lsl NULL_KEY
2014-03-22 21:15:33 +01:00
WendyStarfall
aeb0ad8029 Merge pull request #145 from RomkaSwallowtail/patch-40
Update OpenCollar - dialog.lsl NULL_KEY
2014-03-22 21:15:15 +01:00
WendyStarfall
48bac0d9ff Merge pull request #144 from RomkaSwallowtail/patch-39
Update OpenCollar - coupleanim1.lsl NULL_KEY
2014-03-22 21:15:04 +01:00
WendyStarfall
722348eb1c Merge pull request #143 from RomkaSwallowtail/patch-38
Update OpenCollar - color.lsl NULL_KEY
2014-03-22 21:14:51 +01:00
WendyStarfall
a6cc06f253 Merge pull request #142 from RomkaSwallowtail/patch-37
Update OpenCollar - bell.lsl NULL_KEY
2014-03-22 21:14:39 +01:00
WendyStarfall
1adf5fe284 Merge pull request #141 from RomkaSwallowtail/patch-36
Update OpenCollar - badwords.lsl  NULL_KEY
2014-03-22 21:14:05 +01:00
WendyStarfall
7f4e2f71a4 Merge pull request #140 from RomkaSwallowtail/patch-35
Update OpenCollar - auth.lsl NULL_KEY
2014-03-22 21:13:52 +01:00
WendyStarfall
8b74a8946e Merge pull request #139 from RomkaSwallowtail/patch-34
Update OpenCollar - appearance.lsl  NULL_KEY
2014-03-22 21:13:37 +01:00
WendyStarfall
72f1a75a90 Merge pull request #138 from RomkaSwallowtail/patch-33
Update OpenCollar - anim.lsl   NULL_KEYs
2014-03-22 21:13:20 +01:00
Romka
f91c175f2b Update OpenCollar - update.lsl 2014-03-22 22:21:08 +03:00
Romka
b9a14b30fc Update OpenCollar - update.lsl 2014-03-22 22:18:35 +03:00
Romka
cee33b6c50 Update OpenCollar - timer.lsl 2014-03-22 22:16:04 +03:00
Romka
c2e955746e Update OpenCollar - texture.lsl 2014-03-22 22:15:18 +03:00
Romka
dc4b5efea2 Update OpenCollar - subspy.lsl 2014-03-22 22:14:35 +03:00
Romka
60f2837cb3 Update OpenCollar - settings.lsl 2014-03-22 22:13:29 +03:00
Romka
c59b15796d Update OpenCollar - rlvundress.lsl 2014-03-22 22:12:52 +03:00
Romka
42cd1cf990 Update OpenCollar - rlvtp.lsl 2014-03-22 22:11:54 +03:00
Romka
9e37448079 Update OpenCollar - rlvtalk.lsl 2014-03-22 22:11:14 +03:00
Romka
8b05316dd0 Update OpenCollar - rlvsit.lsl 2014-03-22 22:10:37 +03:00
Romka
27e406f798 Update OpenCollar - rlvrelay.lsl 2014-03-22 22:09:50 +03:00
Romka
158325e42e Update OpenCollar - rlvmisc.lsl 2014-03-22 22:09:07 +03:00
Romka
11c7ec9c75 Update OpenCollar - rlvmain.lsl 2014-03-22 22:08:19 +03:00
Romka
68564b6ed0 Update OpenCollar - rlvfolders.lsl 2014-03-22 22:06:44 +03:00
Romka
b8d4b4aa70 Update OpenCollar - rlvex.lsl 2014-03-22 22:05:35 +03:00
Romka
11223a0bfa Update OpenCollar - plugin template.lsl 2014-03-22 22:02:32 +03:00
Romka
28b1e10e5c Update OpenCollar - menu.lsl 2014-03-22 22:00:18 +03:00
Romka
c2b7f8ece4 Update OpenCollar - lock.lsl 2014-03-22 21:59:42 +03:00
Romka
99ac68ef91 Update OpenCollar - listener.lsl 2014-03-22 21:58:57 +03:00
Romka
9bb2cd2b73 Update OpenCollar - leashParticle.lsl 2014-03-22 21:58:12 +03:00
Romka
f931f776e9 Update OpenCollar - leash.lsl 2014-03-22 21:57:32 +03:00
Romka
4765307e27 Update OpenCollar - label.lsl 2014-03-22 21:49:25 +03:00
Romka
09ad9e0b13 Update OpenCollar - hovertext.lsl 2014-03-22 21:48:19 +03:00
Romka
26ae9d0b19 Update OpenCollar - hide.lsl 2014-03-22 21:46:31 +03:00
Romka
adefd925d8 Update OpenCollar - garble.lsl 2014-03-22 21:32:07 +03:00
Romka
50d05a65e6 Update OpenCollar - dialog.lsl 2014-03-22 21:31:21 +03:00
Romka
b56ce42932 Update OpenCollar - coupleanim1.lsl 2014-03-22 21:30:08 +03:00
Romka
16c7f1ad54 Update OpenCollar - color.lsl 2014-03-22 21:29:12 +03:00
Romka
f384fdcf5c Update OpenCollar - bell.lsl 2014-03-22 21:27:32 +03:00
Romka
12c45a6e59 Update OpenCollar - badwords.lsl
NULL_KEY
2014-03-22 21:25:50 +03:00
Romka
6a1faf6875 Update OpenCollar - auth.lsl
replace NULL_KEY's with ""
2014-03-22 21:24:38 +03:00
Romka
ae6c80003c Update OpenCollar - appearance.lsl
replace NULL_KEY's with ""
2014-03-22 21:23:08 +03:00
Romka
c9a9552abe Update OpenCollar - anim.lsl
NULL_KEY
2014-03-22 21:20:21 +03:00
WendyStarfall
f5779054ad sandbox & shack 2014-03-20 20:09:27 +01:00
littlemousy
b404cd3eab Merge branch 'patch-32' of https://github.com/RomkaSwallowtail/OpenCollarUpdater into RomkaSwallowtail-patch-32
Conflicts:
	LSL/OpenCollar - hide.lsl
2014-03-20 10:54:29 +00:00
Romka
f69c76445b Update OpenCollar - hide.lsl 2014-03-20 13:43:31 +03:00
littlemousy
ca8b05e983 Merge pull request #136 from lucianunderwood/patch-1
Update OpenCollar - hide.lsl
2014-03-20 10:13:55 +00:00
Romka
5c0477cbe8 Update OpenCollar - hide.lsl
reworking фтв fix #135 issue
2014-03-20 13:12:11 +03:00
lucianunderwood
96fa7267ae Update OpenCollar - hide.lsl
Removes notification occurring on menu use - Quick Fix
2014-03-20 02:18:47 -07:00
WendyStarfall
111ced6aeb BETA 3.956 ready to ship 2014-03-19 03:56:56 +01:00
WendyStarfall
27724f0f58 I pity the fool who doesn't know this is V...
let's display the version number as float text above the software box
instead of a long blurb that no a** ever reads and is already better
read-able in the confirmation dialog
2014-03-19 03:09:21 +01:00
WendyStarfall
b0a799d7ff prepping 3.956; OCD check and headers 2014-03-19 02:11:50 +01:00
littlemousy
062338c5a5 Merge pull request #133 from littlemousy/main
Lots of refactoring to save memory
2014-03-19 00:35:04 +00:00
littlemousy
8dd7263bdb Lots of refactoring to save memory 2014-03-19 00:28:07 +00:00
WendyStarfall
7ebb60bf9c Merge pull request #131 from SatomiAhn/SmarterSt
Update OpenCollar - rlvfolders.lsl
2014-03-19 01:11:27 +01:00
littlemousy
ff080443ba Merge pull request #132 from littlemousy/main
Added checks on change to alpha state to avoid infinite loops
2014-03-18 23:59:06 +00:00
littlemousy
3cf0e658b0 Added checks on change to alpha state to avoid infinite loops 2014-03-18 23:57:47 +00:00
Satomi Ahn
c13e8ebb1c Update OpenCollar - rlvfolders.lsl
- removed stray llOwnerSay()
- more logical returns from action menu (back to where we come from after any action, except "Browse", which leads to browsing current folder if it contains subfolders, or its parent otherwise).
2014-03-18 14:00:28 +01:00
WendyStarfall
31c78efee2 Merge pull request #130 from SatomiAhn/SmarterSt
Update OpenCollar - rlvfolders.lsl
2014-03-18 13:08:34 +01:00
Satomi Ahn
7f86a65b0c Update OpenCollar - rlvfolders.lsl
Added:
- history of recently used #RLV folders
- chat command for the above (xxhistory)
- chat command for direct access to browsing some subfolder (xx#rlv substring)
2014-03-18 12:50:35 +01:00
WendyStarfall
abe8325957 removed; maintained by original author 2014-03-18 10:47:36 +01:00
WendyStarfall
294d6b0182 Merge pull request #124 from RomkaSwallowtail/patch-26
Update OpenCollar - rlvmain.lsl
2014-03-18 10:38:10 +01:00
WendyStarfall
3340817ee2 Merge pull request #123 from RomkaSwallowtail/patch-25
Update OpenCollar - rlvfolders.lsl
2014-03-18 10:38:03 +01:00
WendyStarfall
ff8908d047 Merge pull request #125 from RomkaSwallowtail/patch-27
Update OpenCollar - rlvmisc.lsl
2014-03-18 10:37:56 +01:00
WendyStarfall
74122bd222 Merge pull request #126 from RomkaSwallowtail/patch-28
Update OpenCollar - rlvundress.lsl
2014-03-18 10:36:47 +01:00
WendyStarfall
21d515414e Merge pull request #120 from RomkaSwallowtail/patch-22
Update OpenCollar - appearance.lsl
2014-03-18 10:34:25 +01:00
WendyStarfall
6b59121344 Merge pull request #122 from RomkaSwallowtail/patch-24
Update OpenCollar - garble.lsl
2014-03-18 10:34:16 +01:00
WendyStarfall
c8355ad112 Merge pull request #128 from RomkaSwallowtail/patch-30
Update OpenCollar - cagehome.lsl
2014-03-18 06:28:12 +01:00
Romka
3dcbe4d4fe Update OpenCollar - cagehome.lsl
use  llGenerateKey();
2014-03-17 14:12:12 +03:00
Romka
d2601c29f2 Update OpenCollar - cagehome.lsl
update MENUNAME_REQUEST /
2014-03-17 14:09:41 +03:00
Romka
ef9ee74c87 Update OpenCollar - rlvundress.lsl
deprecated "refreshmenu"

no need MENUNAME_RESPONSE / MENUNAME_REQUEST at start
2014-03-17 13:52:56 +03:00
Romka
67bfccd04c Update OpenCollar - rlvmisc.lsl 2014-03-17 13:16:48 +03:00
Romka
f8c028fbe5 Update OpenCollar - rlvmisc.lsl
add page to Misc menu
2014-03-17 13:15:02 +03:00
Romka
0fb56c340a Update OpenCollar - rlvmain.lsl
no need to send MENUNAME_RESPONSE at start
2014-03-17 13:04:11 +03:00
Romka
ffe034e1c4 Update OpenCollar - rlvfolders.lsl
no need to send MENUNAME_RESPONSE at start
2014-03-17 12:57:21 +03:00
Romka
2b5aa29d63 Update OpenCollar - garble.lsl
no need to send gkWear in LM_SETTING_REQUEST
no need llSleep
2014-03-17 12:49:16 +03:00
Romka
0183b6dac5 Update OpenCollar - appearance.lsl
senseless three times:  if (vSize.x > 10.0) return TRUE;

deprecated "refreshmenu"
2014-03-17 12:31:58 +03:00
littlemousy
0d227c6e86 Merge pull request #118 from RomkaSwallowtail/patch-7
Update OpenCollar - leash.lsl :   improvement leash menu
2014-03-16 23:59:58 +00:00
Romka
85c33514bf Update OpenCollar - leash.lsl
"give Holder" - fix return to post menu instead leash menu
"stay" "unstay" - add return to leash menu
2014-03-16 11:10:02 +03:00
WendyStarfall
7d5347219f BETA 3.955 ready to ship 2014-03-16 05:44:11 +01:00
littlemousy
a650b528c6 Merge pull request #117 from littlemousy/main
changed default size
2014-03-16 03:36:02 +00:00
littlemousy
0b93ae5dcd changed default size 2014-03-16 03:31:49 +00:00
littlemousy
4c054bb14b Merge pull request #116 from littlemousy/main
Sensor dialog patch
2014-03-16 03:02:17 +00:00
littlemousy
1d382d1de2 Sensor dialog patch 2014-03-16 02:59:27 +00:00
WendyStarfall
276bfead2a adjusted for ao and leash textures 2014-03-16 02:44:55 +01:00
WendyStarfall
3b2a45f6f7 littlemousy in-world; leashParticle
I asked Mlle Mouse to add a bit of UUIDness here into the script so we
can spare another two contents from the object inventory -> we nijna
asshet sevre! >,,<'
2014-03-16 02:28:35 +01:00
WendyStarfall
7cca2d5d54 sub AO from MP
pew! pew! another content less and users will always get the recent one
that way \o/
2014-03-16 02:26:46 +01:00
WendyStarfall
1b17545a24 help cards links in the main guide instead 2014-03-16 01:55:03 +01:00
WendyStarfall
4025336c56 no more updater from contents; web link
Get Updater now gives a load url that either links directly to
marketplace or the user can click one of the urls in the dialog
2014-03-16 01:33:17 +01:00
WendyStarfall
23417d4469 headers and help links changed
yet two less object contents
2014-03-16 01:27:17 +01:00
littlemousy
ee8131afbe Merge pull request #115 from littlemousy/main
re make rlv restrictions after teleport or region change, because SL seems to be losing them
2014-03-15 23:13:54 +00:00
WendyStarfall
fcf7b20d2c listener; header and bundles
we no longer require a dedicated touch plugin
2014-03-15 23:59:19 +01:00
littlemousy
af1b5c7614 fixed line feeds in last commit 2014-03-15 21:50:41 +00:00
littlemousy
7d93b422e6 added "resend rlv restrictions after tp or change region" code 2014-03-15 21:47:56 +00:00
littlemousy
6d808ce959 Merge pull request #114 from littlemousy/main
Merged listener and touch scripts, reducing overall script count
2014-03-15 17:24:45 +00:00
littlemousy
13d27c51db Merged listener and touch scripts, reducing overall script count 2014-03-15 17:10:36 +00:00
WendyStarfall
23fe7107c5 prepping 3.955; Bundles I
First here is addressing the realleash plugins that have to be
uninstalled or we would double up the same the normal leash does now.

Second is the updater that caused more confusion if handed from
contents, so for now, let's have Get Updater inform users /where/ to get
the actual update rather than receive a package manager style updater
from contents. I will be working on the necessary changes in OpenCollar
- update to have it shipped with 3.955.

Third is the keys/keyholder/keyholder plugin. Putting it back in
received no feedback, the issues on it received no response and the
problem with missing attributions has been addressed properly. I believe
at this point it will be best to stick to our popular set of official
plugins and the two "missing" rlv features. I will contact Whitefire
Sondergaard and ask for a link and slurl where interested people could
acquire the plugin from the original author. These links can be blogged
with the announcement for beta 3.955!
2014-03-15 06:51:32 +01:00
WendyStarfall
7abab1fa55 we no longer override couple anims
makes a slimmer update and prevents buttz from hurted; also in case the
stock couple anims are desired we have them included in all our stock
designs, this is not necessary to include over and over in a software
update
2014-03-15 06:38:54 +01:00
WendyStarfall
5a379af6d7 deprecated; merged with leash
from 3.955 on realistic rlv restrictions are part of the standard leash
2014-03-15 06:32:52 +01:00
WendyStarfall
42f87547c1 prepping 3.955; OCD check and headers
these 15 scripts are back in sync with the beta updater in-world!
2014-03-15 06:01:04 +01:00
WendyStarfall
dd06f4e639 Merge pull request #113 from littlemousy/main
Merged realleash functions into main leash script.  Changed menu layout to avoid multi page menu. Settings script resends settings when script is edited.
2014-03-15 03:12:23 +01:00
littlemousy
07cee6f03c Merged realleash functions into main leash script. 2014-03-14 21:09:09 +00:00
littlemousy
53d0039ea9 send settings whenever inventory changes, so settings are sent out when a script is edited 2014-03-14 21:07:57 +00:00
WendyStarfall
c07bef0dfc Merge pull request #94 from RomkaSwallowtail/patch-8
Update OpenCollar - leashParticle.lsl
2014-03-14 13:49:02 +01:00
WendyStarfall
b72b961c21 Merge pull request #95 from RomkaSwallowtail/patch-9
Update OpenCollar - realleash.lsl
2014-03-14 13:48:49 +01:00
WendyStarfall
b5b196fece Merge pull request #96 from RomkaSwallowtail/patch-10
Update OpenCollar - leash.lsl
2014-03-14 13:48:39 +01:00
WendyStarfall
cf24e6b973 Merge pull request #106 from RomkaSwallowtail/patch-20
Update OpenCollar - update.lsl
2014-03-14 13:42:10 +01:00
WendyStarfall
089ca5c553 Merge pull request #100 from RomkaSwallowtail/patch-14
Update OpenCollar - badwords.lsl
2014-03-14 13:41:54 +01:00
WendyStarfall
49c7423b7b Merge pull request #101 from RomkaSwallowtail/patch-15
Update OpenCollar - color.lsl
2014-03-14 13:41:35 +01:00
WendyStarfall
3c0df2b18c Merge pull request #102 from RomkaSwallowtail/patch-16
Update OpenCollar - hide.lsl
2014-03-14 13:41:26 +01:00
WendyStarfall
bc60e7fba8 Merge pull request #103 from RomkaSwallowtail/patch-17
Update OpenCollar - label.lsl
2014-03-14 13:41:06 +01:00
WendyStarfall
8548a55492 Merge pull request #104 from RomkaSwallowtail/patch-18
Update OpenCollar - texture.lsl
2014-03-14 13:40:55 +01:00
WendyStarfall
00b7d7d0bb Merge pull request #111 from RomkaSwallowtail/patch-6
Update OpenCollar - hovertext.lsl
2014-03-14 13:40:41 +01:00
WendyStarfall
97d799ed1e Merge pull request #99 from RomkaSwallowtail/patch-13
Update OpenCollar - auth.lsl
2014-03-14 13:40:16 +01:00
WendyStarfall
baeb253bd6 Merge pull request #98 from RomkaSwallowtail/patch-12
Update OpenCollar - appearance.lsl
2014-03-14 13:39:52 +01:00
WendyStarfall
6b8fce3dc8 Merge pull request #88 from RomkaSwallowtail/patch-4
Update OpenCollar - update.lsl
2014-03-14 13:39:42 +01:00
WendyStarfall
d7901341a7 Merge pull request #105 from RomkaSwallowtail/patch-19
Update OpenCollar - timer.lsl
2014-03-14 13:39:09 +01:00
WendyStarfall
b981bc5fb2 Merge pull request #97 from RomkaSwallowtail/patch-11
Update OpenCollar - anim.lsl
2014-03-14 13:38:58 +01:00
Romka
7572149a8c Update OpenCollar - hovertext.lsl
fix MENUNAME_REQUEST / RESPONSE
2014-03-10 09:30:47 +03:00
Romka
7e98a27621 Update OpenCollar - timer.lsl
add flush submenu buttons
2014-03-04 08:20:41 +03:00
Romka
3ff5775bab Update OpenCollar - leash.lsl
add flush submenu buttons
2014-03-04 08:10:19 +03:00
Romka
b80eb73f1b Update OpenCollar - appearance.lsl 2014-03-03 19:54:22 +03:00
Romka
e3417b7547 Update OpenCollar - anim.lsl
reset and update submenu buttons
2014-03-03 19:23:00 +03:00
WendyStarfall
f0c50162c5 Merge pull request #91 from RomkaSwallowtail/patch-7
Update OpenCollar - coupleanim1.lsl
2014-03-02 21:40:08 +01:00
Romka
2c55640785 Update OpenCollar - update.lsl
no need to MENUNAME_REQUEST at the start script.
(reduces link_message flow)
2014-03-01 18:00:15 +03:00
Romka
bc4bf47945 Update OpenCollar - timer.lsl
no need to MENUNAME_REQUEST at the start script.
(reduces link_message flow)

change buttons (*) ( )  >  ☒  ☐
2014-03-01 17:58:12 +03:00
Romka
2e7f758c7d Update OpenCollar - texture.lsl
no need to MENUNAME_REQUEST at the start script.
(reduces link_message flow)
2014-03-01 17:51:44 +03:00
Romka
f712de172a Update OpenCollar - label.lsl
no need to MENUNAME_REQUEST at the start script.
(reduces link_message flow)
2014-03-01 17:42:36 +03:00
Romka
9a262155a7 Update OpenCollar - hide.lsl
no need to SETTING_REQUEST at the start script, because settings script sends all settings after rez automatically.
no need to MENUNAME_REQUEST at the start script.
(reduces link_message flow)
2014-03-01 17:39:34 +03:00
Romka
694488d349 Update OpenCollar - color.lsl
no more need MENUNAME_RESPONSE at start script
2014-03-01 17:29:30 +03:00
Romka
010ad1299c Update OpenCollar - badwords.lsl 2014-03-01 17:23:33 +03:00
Romka
f3bdcfd789 Update OpenCollar - badwords.lsl
no need to SETTING_REQUEST at the start script, because settings script sends all settings after rez automatically.
(reduces link_message flow)
2014-03-01 17:22:21 +03:00
Romka
2de71d7cbc Update OpenCollar - auth.lsl
no need to SETTING_REQUEST at the start script, because settings script sends all settings after rez automatically.
(reduces link_message flow)
2014-03-01 17:19:22 +03:00
Romka
9ec761a92a Update OpenCollar - appearance.lsl
first response to request parent menu 
and then request sub menu
2014-03-01 17:10:23 +03:00
Romka
e843de5e4e Update OpenCollar - anim.lsl
first response to request parent menu
and then request sub menu
2014-03-01 17:07:51 +03:00
Romka
116fe5d8fa Update OpenCollar - leashParticle.lsl
particle defaultsettings should not change
2014-02-28 14:57:42 +03:00
Romka
a3b934721d Update OpenCollar - leashParticle.lsl 2014-02-28 14:49:50 +03:00
Romka
5d9880de6e Update OpenCollar - leash.lsl
fix nocorrect MENUNAME_REQUEST for parent menu
add MENUNAME_REQUEST for submenu
2014-02-27 00:02:09 +03:00
Romka
8d041cd6c7 Update OpenCollar - realleash.lsl
use llGenerateKey() instead ShortKey()
2014-02-26 22:37:39 +03:00
Romka
f91e4b3b89 Update OpenCollar - leashParticle.lsl
fix no correct MENUNAME_REQUEST responce
2014-02-26 22:31:10 +03:00
WendyStarfall
2768c52977 new forever home 2014-02-24 02:04:51 +01:00
WendyStarfall
307f87eb93 littlemousy in-world; dialog
might fix #92
2014-02-22 18:26:47 +01:00
Romka
329efab436 Update OpenCollar - coupleanim1.lsl
just add duration time information in couple menu
2014-02-22 19:10:35 +03:00
WendyStarfall
e15999158c "region full" issue 2014-02-21 20:53:01 +01:00
Romka
98faa377fc Update OpenCollar - update.lsl
because the script does not save 'collar version' to database, 
script does not respond version at any time upon request.
2014-02-20 15:44:01 +03:00
WendyStarfall
dab45f44a0 BETA 3.954 ready to ship 2014-02-20 10:56:52 +01:00
WendyStarfall
f0b81ccc33 littlemousy in-world; dialog
I pushed the wrong dialog 2 days ago! Sorry! (Wendy)
2014-02-20 10:37:18 +01:00
WendyStarfall
9036118d34 Merge pull request #87 from RomkaSwallowtail/patch-3
Update OpenCollar - menu.lsl
2014-02-19 23:08:24 +01:00
Romka
36248cb925 Update OpenCollar - menu.lsl
fix "OpenCollar Version (loading...)" after "Fix Menus"
2014-02-19 23:34:03 +03:00
WendyStarfall
eae83dfb1e BETA 3.953 ready to ship 2014-02-19 19:51:30 +01:00
WendyStarfall
0d86be15c2 removed Qandico slurl 2014-02-19 19:15:18 +01:00
WendyStarfall
b6a7cb2f07 added a g_
that's right! I added a g_
\o/
2014-02-19 19:02:20 +01:00
WendyStarfall
ffeb5b2d95 prepping 3.953; OCD check and headers 2014-02-19 18:47:07 +01:00
WendyStarfall
cf41e513d9 Merge pull request #85 from RomkaSwallowtail/patch-2
Update OpenCollar - hide.lsl
2014-02-19 17:32:24 +01:00
WendyStarfall
44dafef52f prepping new dialog
the debug line for dialog is commented out; bundles no longer install
getavi and remove it if present
2014-02-18 02:45:16 +01:00
WendyStarfall
760da2a763 littlemousy in-world; dialog
mousekin says: "Merged getavi dialogs into main dialog script. Stopped
passing g_lMenus as parameter to RemoveMenuStride function."
2014-02-18 02:32:08 +01:00
WendyStarfall
cfe42045df Romka Swallowtail in-world; badwords
adds a more sophisticated way to use sounds for badwords, also makes
things work with defaultsettings, yay!
2014-02-18 02:24:41 +01:00
WendyStarfall
b0917e885a Merge pull request #86 from RomkaSwallowtail/patch-1
Update OpenCollar - appearance.lsl
2014-02-17 19:03:54 +01:00
Romka
969255d00d Update OpenCollar - appearance.lsl
fix 'nudge' buttons
2014-02-17 20:57:26 +03:00
Romka
8402e68c3a Update OpenCollar - hide.lsl
total revision, 
added restore settings from the database (by LM_SETTING_REQUEST),
changed menu: 'show / hide All' replaced by 'show/hide collar',

'show/hide collar' now does not affect to hide settings of elements
2014-02-13 16:40:42 +03:00
WendyStarfall
e1d34d3ab9 Merge pull request #84 from RomkaSwallowtail/patch-1
Update OpenCollar - hovertext.lsl
2014-02-12 22:19:33 +01:00
Romka
3e9464cb9c Update OpenCollar - hovertext.lsl 2014-02-12 20:01:52 +03:00
WendyStarfall
61d3cced8e BETA 3.952 ready to ship 2014-02-12 15:21:17 +01:00
WendyStarfall
08f362a15b final formatting.. weew! 2014-02-12 14:30:09 +01:00
WendyStarfall
737c4f4348 oopsie! kept the debugz
and mouse helped me again, I learnt something new! \o/
2014-02-12 14:21:26 +01:00
WendyStarfall
048fe51e0b we just need one temple kthx
now that we (thankfully) only have one in-world temple to manage we can
bin this tardissimo idea about having two landmarks, yin and yang, and
keep it to a single landmark -> Temple
2014-02-12 14:08:34 +01:00
WendyStarfall
dab3c1ae2a littlemousy in-world; hovertext
mouse helped me there with the formatting changes I wanted to do and we
also needed the prim desc seperated from the menu button name after
renaming the feature to "Titler"
2014-02-12 13:52:26 +01:00
WendyStarfall
c6634a5d75 formatting for the menu
keeping it short so we don't have to scroll and can have more continuity
with other menus
2014-02-12 12:40:06 +01:00
WendyStarfall
a5f6b83e55 corrected a typo and some formatting <3 2014-02-12 12:21:12 +01:00
WendyStarfall
7372e006d0 menu item renamed to: Titler
so we have it called the same like the bundle in the updater/installer
2014-02-12 11:58:25 +01:00
WendyStarfall
a4796b50f0 prepping 3.952; OCD check and headers 2014-02-12 11:50:03 +01:00
WendyStarfall
20e8701179 Romka Swallowtail in-world; hovertext
Satomi Ahn's initial llTextBox support; refined and merged with current
versions by Ромка; major usability improvements, no longer error prone
if missing a hovertext prim and persistency after resets also programmed
by Ромка - thank you! <3
2014-02-12 10:37:54 +01:00
WendyStarfall
1cc5f14de4 Romka Swallowtail in-world; label
Satomi Ahn's initial llTextBox support; refined and merged with current
versions by Ромка
2014-02-12 10:31:51 +01:00
WendyStarfall
92768d3d8d Romka Swallowtail in-world; badwords
Satomi Ahn's initial llTextBox support; refined with extra buttons,
features and merged with current versions by Ромка
2014-02-12 10:30:00 +01:00
WendyStarfall
990321a330 Romka Swallowtail in-world; dialog
Satomi Ahn's initial llTextBox support; refined and merged with current
versions by Ромка
2014-02-12 10:24:56 +01:00
WendyStarfall
1e9d4012da Merge pull request #83 from littlemousy/main
updated subspy and getavi
2014-02-11 02:34:56 +01:00
littlemousy
a19f8b8c35 Revert "Changed notificcations, reduced startup spam. Renamed module."
This reverts commit 38722d6927.
2014-02-11 00:58:45 +00:00
littlemousy
65397baffe Revert "revoked"
This reverts commit 8fe389fd21.
2014-02-11 00:58:03 +00:00
littlemousy
8fe389fd21 revoked 2014-02-11 00:52:11 +00:00
littlemousy
35f6823fc8 Added UPMENU to avi search dialog 2014-02-11 00:48:44 +00:00
littlemousy
41a4a1b7ed Changed notfications, removed spurious debug, changed module name. 2014-02-11 00:39:43 +00:00
littlemousy
38722d6927 Changed notificcations, reduced startup spam. Renamed module. 2014-02-11 00:15:28 +00:00
littlemousy
55e6d37584 merging upstream changes with fork
Merge remote-tracking branch 'upstream/main' into main
2014-02-11 00:02:17 +00:00
WendyStarfall
fa41d139e0 Romka Swallowtail in-world; hovertext III
removes the redundant pin and function for cleaning up the hover text
prim contents and adds parameters for minimum and maximum offset for the
text
2014-02-09 21:20:26 +01:00
WendyStarfall
9f14a255f0 Romka Swallowtail via tracker; hovertext II
that one is even better than just using the slice parameter; it lets us
adjust the offset for hover text with neat buttons in the AddOns -
FloatText menu
2014-02-09 20:14:13 +01:00
WendyStarfall
0b5df2af10 Romka Swallowtail via tracker; hovertext
Ромка had a really clever idea how to deal with the expanding hover text
prim; we need to expand it to get the text high up enough but then we
end up having the invisible stick poking out of our heads! Ромка's
solution is to just slice the prim parameters -> keep in mind this
requires the hover text prim to be a box!
2014-02-09 09:25:49 +01:00
WendyStarfall
df4690b016 Romka Swallowtail via tracker; anim
This one deals with the re-menu hiccup if clicking AnimLock; #77 fixed
2014-02-09 09:09:43 +01:00
littlemousy
2d80aab760 Merge pull request #1 from OpenCollar/main
update my repo with changes from main OC
2014-02-08 20:25:08 +00:00
WendyStarfall
2fc4d5c757 BETA 3.951 ready to ship 2014-02-08 18:57:58 +01:00
WendyStarfall
1d45bfdac0 version from card instead string
this is kinda a test if we get the version number in the main menu
properly fetched from the card; I used to always put it in the string at
line 25 each update to work around the problem described in #26 but that
didn't really solve it; Medea wrote the parts to have the version number
fetched from the card and recommended to put something like "fetching"
or "loading" lets see if it works!
2014-02-08 17:09:19 +01:00
WendyStarfall
c1b18b6a4e beta urls and current slurls 2014-02-08 16:40:23 +01:00
WendyStarfall
b859843965 BETA channel init
so instead of a seperated branch lets try having the "beta channel" just
as a folder; included are version and news item as well as the update
script so we won't have to edit the url each time in the "main channel"
update script
2014-02-08 16:29:43 +01:00
WendyStarfall
ab8cdec3cd rolling back realtime feature
for the next beta version we want the broken feature back inside to be
able running more tests; I believe the problem is fixed with the updated
keyholder script by WhiteFire Sondergaard
2014-02-08 10:05:40 +01:00
WendyStarfall
d3decc4737 Jean Severine in-world; leashParticle
this commit ads a "life" menu function for the particle engine for
leashes
2014-02-08 10:01:46 +01:00
WendyStarfall
bbee5f0df3 WhiteFire Sondergaard in-world; keyholder
WhiteFire: "Fixed the refactoring in UserCommand() so it actually works
with buttons from foreign menus."
2014-02-04 10:46:52 +01:00
WendyStarfall
28e32b7e4c re-added missing attributions and changelog
The script was missing attributions which must have been lost while work
was done on it in-world; this script was originally created by WhiteFire
Sondergaard based on the plugin template at the time by Cleo Collins.
Kadah Coba, Satomi Ahn and various others contributed improvements and
patches to this script.
2014-02-04 09:22:54 +01:00
WendyStarfall
8ce66d99b7 Medea Destiny in-world; dialog
Medea says: "<512 not <513 for dialog message length. AAAARGH. *bangs
head against wall*"

This fixes #76
2014-01-30 00:45:48 +01:00
WendyStarfall
a95c23a42b 3.950 ready to ship 2014-01-25 20:02:21 +01:00
WendyStarfall
fe50232013 prepping 3.950 II; bundles 2014-01-25 19:44:47 +01:00
WendyStarfall
6c7e5e2310 anim; teensy bit of cosmetic syntax 2014-01-25 19:35:22 +01:00
WendyStarfall
20a2884954 new rez position for mesh post; renamed
Carina Asbrink created a 1 prim LI mesh variation based on my ball&chain
design. I renamed it to "OpenCollar Post" as some people were confused
why a sphere thing popped up if they clicked Rez Post. There have not
been any changes in Toy Wylie's grabbypost script; the folder has been
renamed to reflect the new name of the in-world object.
2014-01-25 13:05:01 +01:00
WendyStarfall
507a970826 Medea Destiny in-world; rlvundress
Medea: "Removed kSmartUser stuff, cos I decided it's a bad idea. Using
smartstrip for stripAll now (was already present, just uncommented it)."
2014-01-25 10:31:11 +01:00
WendyStarfall
3f7b434039 rlvmisc optional
this commit removes poses as bundle and adds rlvmisc instead as an
optional feature to install; most people never need rlvmisc, it makes
sense to keep it optional not only because it is excluded from defaults;
investigated for issue #65; poses are removed because of the many
requests to have our updaters not mess with peoples custom arrangements
for poses, our own poses will be supplied inside of stock designs and
the signature collar but not part of the software/content package in the
updater
2014-01-24 05:38:44 +01:00
WendyStarfall
17fb2b14d0 Updater - Master; Help weblink 2014-01-24 05:13:08 +01:00
WendyStarfall
1f8e08f6dc prepping 3.950 I
adjusting headers for 3.950 in the scripts specific to the collar;
OCDing if they are the same in-world
2014-01-24 05:11:05 +01:00
WendyStarfall
14d7c7313c Merge pull request #74 from littlemousy/main
Fixes for broken buttons and help notecard
2014-01-23 13:11:38 -08:00
littlemousy
31e3bad753 Added response to "RLV help" button 2014-01-23 21:06:50 +00:00
littlemousy
4a561fc117 We also need to parse arguments separated by spaces 2014-01-23 21:04:47 +00:00
WendyStarfall
6c43805b10 Merge pull request #73 from littlemousy/main
A selection of updates from Ray Zopf's latest in-world file
2014-01-23 12:10:12 -08:00
littlemousy
629b888f4a Added additional logging of position in spy reports when attached from ground, from Ray Zopf 2014-01-23 02:31:12 +00:00
littlemousy
0223f3eea5 Added missing line feed, from Ray Zopf 2014-01-23 02:27:59 +00:00
littlemousy
3d928b8bdb Changed logical tests in case Linden change "0 means false", from Ray Zopf 2014-01-23 02:26:13 +00:00
littlemousy
473baa183b Added additional logging in spy reports for settings changes, from Ray Zopf 2014-01-23 02:20:54 +00:00
littlemousy
0a88dedb3e Added notify for settings change by non-wearer in local sim 2014-01-23 02:14:40 +00:00
littlemousy
8fea70fc3b Don't get location unless you need to, from Ray Zopf 2014-01-23 01:44:48 +00:00
littlemousy
99db77cb9e Moved warning text and parameter reporting to fix a "messages out of order" bug introduced by Littlemousy's big change, from Ray Zopf 2014-01-23 01:15:23 +00:00
littlemousy
3db688a622 Added log of configuration changes to spy reports, from Ray Zopf 2014-01-23 01:10:48 +00:00
littlemousy
657502c39b Added additional text to dialog, repeating information available in the button checkboxes. From Ray Zopf. 2014-01-23 00:42:02 +00:00
WendyStarfall
7d66455178 Merge pull request #72 from KaroWeirsider/main
#60 Timer issue
2014-01-22 12:54:33 -08:00
KaroWeirsider
d6d76e7a7c #60 Timer issue
Removed the menu references to the Realtime timer. Everything else
remains with the assumption the timer will be replaced in later
versions.
2014-01-22 15:33:44 -05:00
WendyStarfall
37a68504b7 Merge pull request #71 from littlemousy/main
Updated formatting to remove change made during last in-world submission...
2014-01-22 07:29:14 -08:00
littlemousy
d0e0685253 Updated formatting to remove change made during last in-world submission. This should make subsequent commits a lot easier to read. 2014-01-22 12:27:09 +00:00
WendyStarfall
6a8e0b4321 littlemousy in-world; bell
There we go, bell is cured of the global show/hide annoyances too now.
mousy rocks! <3
2014-01-21 01:32:06 +01:00
WendyStarfall
a82fbc1e7e RomkaSwallowtail via tracker; lock
This the fix proposed by Romka Swallowtail to handle the lock in both
states showing if doing a global hide and show. littlemousy added it to
the script in-world and it worked flawlessly. #58 fixed
2014-01-21 01:17:25 +01:00
WendyStarfall
73bfa5e61a littlemousy in-world; subspy
This is a working spy plugin now; we (mousy and wendy) tested it
in-world and the result is as good as this feature possibly could get.
Also the script is much tidier and easier to read. Cosmetic changes make
#69 mostly redundant but please do know that Ray's efforts are valued
and appreciated equally and mentioned on the blog.
2014-01-20 23:19:29 +01:00
WendyStarfall
9771afebd1 fixes #64
I'm basically just reverting one change, added the reset back and
doubled up the request for permissions. That fixes our problem with
losing perms to animate. It's a bizarre way to go about it and the reset
feels out of place but I have yet to see an alternative fix that works?
2014-01-20 22:28:20 +01:00
WendyStarfall
5e0c62f93b Medea Destiny in-world; rlvundress
Medea: "New feature! Smartstrip. When smartstrip is activated, the
standard clothing removal folder will use detachallthis instead of
remoutfit, to remove everything in the same folder or child folders of
the item being removed. For people with a sensibly set up #RLV, this
makes this a far more useful option! Because lots of people *don't* have
a #RLV folder set up for this, we also have a notecard to give to help
people with setting up folders. Yay! Smartstrip gets turned on and off
via the menus or via the chat commands "smartstrip on" and "smartstrip
off". Owners and Wearers can both change this setting. However! We also
have a g_kSmartUser key. If someone other an Owner or Wearer selects it,
their key gets dumped into this value, which is not saved. This allows
other people to activate it for themselves only, for that session only.
As an additional bonus, removing clothing can now be accessed by an easy
chat command, "strip (item)" or "strip all". For now, I haven't changed
the behaviour of strip all, however the code is there commented out if
we think it's a good idea for strip all to use smartstrip."
2014-01-20 07:42:08 +01:00
WendyStarfall
944adf2667 littlemousy in-world; subspy
final fix for #66
2014-01-09 07:19:17 +01:00
WendyStarfall
dbadd308f2 Merge pull request #67 from RayZopf/main
subspy: minor bugfix for messages on settings change
2013-12-27 00:01:35 -08:00
RayZopf
b762d452be Merge pull request #8 from OpenCollar/main
sync for 3.940
2013-12-26 20:48:18 -08:00
RayZopf
88e3b5ebe0 more information on settings change
workaround for not getting messages on changed settings
state more clearly if option is on or off
2013-12-27 05:44:37 +01:00
RayZopf
6ceaa675d1 annotation
#66
2013-12-20 14:21:09 +01:00
WendyStarfall
4fd547c3a0 ball and chain release 2013-12-13 01:17:42 +01:00
WendyStarfall
27dbf64ffb Toy Wylie in-world; grabbypost init (rewrite)
folder name is the same as the in-world object name
2013-12-11 16:35:24 +01:00
WendyStarfall
93fa0d7cff leashholder init; folder name = object name 2013-12-11 16:32:44 +01:00
WendyStarfall
5060b1ea8e 3.940 ready to ship 2013-12-09 23:34:50 +01:00
WendyStarfall
411ca8b777 prepping 3.940 2013-12-09 21:19:29 +01:00
WendyStarfall
2e067cb8d3 hierarchy adjusted to prevent cosmetic errors
this is to prevent the collar telling it skipped an animation because it
wasn't found if the asset loaded too slow
2013-12-09 21:18:19 +01:00
WendyStarfall
4fd3b17504 removing grabby post and other redundant items
grabby is replaced with Ball&Chain; leash script tweaked for rez
position; this commit also uninstalls the remaining keyholder scripts in
older versions
2013-12-09 19:07:11 +01:00
WendyStarfall
a5fccf2564 attribution to Medea Destiny and Marine Kelley 2013-12-09 00:00:45 +01:00
WendyStarfall
3c9113ced4 lil change in the hover text 2013-12-08 22:22:03 +01:00
WendyStarfall
730b333b24 bundle adjusted to install AO 2013-12-05 04:44:55 +01:00
WendyStarfall
9e73dceb34 looped subhug; fixes #56
the non looped variation is now called "pet"; emotes have been adjusted
to more neutral sounding phrases as this was requested by some users
2013-12-05 04:42:49 +01:00
WendyStarfall
0f19040fa4 update; Updater from contents 2013-12-05 04:36:48 +01:00
WendyStarfall
75f19b89a1 anim; AO from contents 2013-12-05 04:35:39 +01:00
RayZopf
542ff3c47a Merge pull request #7 from OpenCollar/main
resync 3.937
2013-11-16 14:45:54 -08:00
WendyStarfall
f9616c3e26 3.937 ready to ship 2013-11-15 03:27:20 +01:00
WendyStarfall
a9758d1aa0 prepping 3.937 2013-11-13 21:40:47 +01:00
WendyStarfall
abeeca9230 Medea Destiny in-world; rlvex (fixes #45)
Medea: Bugfixes -  1. Reported issue, message about UUID not found when
trying to add other. I haven't found this to be repeatable, but I have
managed to get it to do it once. Increased llRequestAgentInfo timer to 4
seconds from 0.5, because 0.5 may simply be too short to reliably get a
response from the dataserver, particularly in a laggy sim. Hopefully
this will remove the issue, but let's monitor this.  2. Reported issue
in secowner exceptions not being set. Typo in settings was looking for
auth_secowner rather than auth_secowners in LM_SETTINGS_RESPONSE, so
secowners list was not getting filled.
2013-11-11 03:08:35 +01:00
WendyStarfall
4b83ea8143 3.936 ready to ship 2013-11-08 05:38:11 +01:00
WendyStarfall
dd15412862 Medea Destiny in-world; anim (fixes #53) 2013-11-08 04:56:58 +01:00
WendyStarfall
fa0e04bc2b Merge pull request #51 from RayZopf/main
changes to realleash and subspy + workaround for #54
2013-11-07 12:05:48 -08:00
RayZopf
d9114d3a31 Merge pull request #6 from OpenCollar/main
sync back
2013-11-07 07:43:33 -08:00
RayZopf
df6a57070c listener: try to avoid heap collision
just discarding and capping chat messages above a certain limit - 450
chars
giving out of order reports when limit (1000 chars) is reached
that is a workaround - no solution
state to user that radar timer is listen report timer too
2013-11-07 16:40:58 +01:00
WendyStarfall
89de9f846f rolling rlvtalk back for now 2013-11-06 06:53:41 +01:00
WendyStarfall
e5fc4e2b74 Rebbie in-world; settings
Rebbie: Fixed up multiline and multi-item cache dump to text to properly
use new line characters at the start of each line so that the output
list is properly NOT concatenated into a single line per script despite
continuation characters.
2013-11-05 23:02:54 +01:00
WendyStarfall
048e9ce85e xx Reyes in-world; rlvtalk
slut (xx.Reyes): "stripped out all the @emote logic there..  emotes are
truncated automatically with chat exceptions"

fixes the problem with emotes sticking as restricted if using the clear
all button in the talk menu
2013-11-04 23:47:31 +01:00
WendyStarfall
09812fc808 Medea Destiny in-world; texture 2013-11-04 21:26:02 +01:00
RayZopf
f4e0a05302 rewording message
not that someone thinks it's checking every and each feature
2013-11-04 01:21:25 +01:00
RayZopf
bc337eb0c6 startup messages again
removed parts of what i messed with before
2013-11-04 00:36:31 +01:00
RayZopf
309d870328 Merge pull request #5 from OpenCollar/main
sync back
2013-11-03 13:22:28 -08:00
RayZopf
352e37b631 some more startup info
installed does not mean active - (re)added messages
2013-11-03 22:03:10 +01:00
RayZopf
e897f0ddad only date change 2013-11-03 22:01:55 +01:00
WendyStarfall
1787eaf7f5 3.935 ready to ship 2013-10-29 11:36:46 +01:00
WendyStarfall
8435003ac9 version string for 3.935
for this release I'll put the version number, we can put an (is
checking) instead in the future but I don't mind editing this manually
2013-10-29 05:47:33 +01:00
WendyStarfall
919c6ae662 Medea Destiny in-world; update
Medea: Bugfix for sending collarversion to menu script, 1 and 0 instead
of TRUE and FALSE;
2013-10-29 05:28:24 +01:00
WendyStarfall
1e470de4e3 3.935 bundles
stock textures bundle is back and independant of the texturizer; Posture
is in by default to bring it among people for feedback
2013-10-29 03:49:30 +01:00
WendyStarfall
8144168a26 Medea Destiny in-world; texture
Medea: "Added support for texture notecard named textures_custom which
will be read instead of the standard texture notecard if present. Also
put MENUNAME_RESPONSE into onrez in place of reset. This menu building
system is... uh... yeah."

Karo: "removed llToLower() in GetLongName(), GetElementHasTexs() and
BuildTexButtons() functions. This commit makes textureable elements case
sensitive; we need that if textures are exclusive to specific elements
on the collar otherwhise those textures would have to be named like the
element but in lower caps"

Medea: "Flip side, now it relies on them being the same. Risk of
breaking some existing content here? I'm inclined to say it would be
better to put llToLower on both sides of the test comparisons, no?"
2013-10-28 09:50:54 +01:00
WendyStarfall
56e37add80 Medea Destiny in-world; menu
Medea: fix for kID instead of kAv for inventory giving.
2013-10-28 09:47:26 +01:00
WendyStarfall
1f7683b66e Medea Destiny in-world; lock
Medea:

New feature: Added support for setting in defaultsettings notecard
User_lock=locksound~<value> and User_lock=unlocksound~<value> accepting
either a UUID or a sound in inventory or "default", which restores the
sounds to the default setting: User_lock=locksound~default . Shall we
put something in Options menu to set this? Or keep it as a designer's
thing? Or play a sound called "lock" if found in inventory regardless of
settings?

Other enchancements: Memory limit set to llGetUsedMemory (after building
list)+6000 should enough memory, but THIS NEEDS WATCHING! Minor
efficiency improvement to SetLockElementAlpha (using g_iLocked and
!g_iLocked for alpha values instead of fAlpha). Removed unnecessary
on_rez event. Fixed GetPSTDate so that conversion on the 1st of the
month before 8am UST doesn't return the 0th of the month. Fix foolishly
does not account for centuries not being leap years, yes, yes, I know I
was lazy, but we've got 86 years to fix this.
2013-10-28 09:45:56 +01:00
WendyStarfall
1ee8b13a79 Medea Destiny in-world; anim
Medea: Added support for posture collar neck locking using provided
~PostureOverride animation, or another animation named in
g_sPostureAnim. Supplied animation locks head and neck and priority 6 to
ensure overriding. If the animation is found in inventory, animation
menu will have a "☐Posture" as button defined in POSTURE. Button will
not show if animation is not present. Also responds to chat commands
"posture on" and "posture off". Posture is saved in settings with the
token (g_sPostureToke) posture=1 when active, and read back from
settings/defaultsettings notecard when settings are sent by settings
script. Posture is reposed when animations refreshed and when
permissions are granted (i.e. on attach) if g_iPosture is TRUE.

Removed reset on rez. CreateAnimList now happens if g_iNumberOfAnims
changes instead of each rez. Much more sensible. requestperm() removed
(let's not have single use functions! Bad! Naughty!) and permission
requested in attach event instead, saving the unnecessary
if(llGetAttached()); call. run_time_permissions is added to allow
restoring posture. Also, good practice to have it. Probably should store
permission in an integer to save llGetPermissions checks. We should
consider if we want to refresh poses here rather than having all poses
scrapped on rez as current. Added remenuing to the animation menu where
sensible.
2013-10-28 09:41:41 +01:00
RayZopf
dde0e01540 mini change to realleash -notify wearer on enable
much more to do ... also kind of bugfixing needed
2013-10-27 23:30:04 +01:00
RayZopf
f4ad35715b Merge pull request #4 from OpenCollar/main
3.934 sync
2013-10-27 15:28:08 -07:00
WendyStarfall
f9e7013198 3.934 ready to ship 2013-10-27 05:16:41 +01:00
WendyStarfall
568f8c5285 font compatibility III
that one is just specific to the updater itself
2013-10-27 04:14:43 +01:00
WendyStarfall
b33e64169f font compatibility II
swapped are the eject, stop and endless symbols
2013-10-27 02:57:54 +01:00
WendyStarfall
5cc53f0474 font compatibility; anim
the next bunch of commits will remove all unicode characters that aren't
compatible with the custom fonts some viewers use
2013-10-27 02:25:35 +01:00
WendyStarfall
ad523efcec inventory kinks; wording
For whatever reason we need to spoof the chat command to be authorized
getting notecards from the inventory; that's fine and we can look into
this whenever we have time or entirely for OC4; also some changes to
wrap up with the previous commit for settings
2013-10-27 02:07:49 +01:00
WendyStarfall
4717ac9714 help url in options menu; wording
I'm putting the url loader for the settings guide right into the
options/settings menu, then we have full buttons and I think the feature
in general is something you either bother with for a reason or totally
can ignore as a user; it's all in one place now =)
2013-10-27 02:36:50 +02:00
WendyStarfall
f8985ca369 priority rank; redundant textures
We run smoother updates if we remove clutter right away, I left Core as
Nr. 1 but might be best to do the DEPRACATED bundle as first. Let's see
for 3.935
2013-10-26 13:27:41 +02:00
WendyStarfall
3a95029351 extended attention blurb
I've added a little more text to the heads-up print for subspy being
installed. Couldn't resist it..
2013-10-26 13:23:01 +02:00
WendyStarfall
2dd218217b 3.934 for headers
so we know which of the scripts are in fact altered with an update;
let's just bounce all the changed ones up to the current version to
remove some confusion if people edit in-world
2013-10-26 12:05:04 +02:00
WendyStarfall
c1bf66887b updater prompt re-merge 2013-10-26 11:56:54 +02:00
WendyStarfall
05c9d3c544 texture UUIDs; texture bundles adjusted
addendum to efe9d1163c
2013-10-26 11:53:07 +02:00
WendyStarfall
73bbf0dff6 Medea Destiny in-world; update
Medea: version check now sends LM_SETTINGS_RESPONSE
collarversion=versionnumber=isLatestVersion(TRUE/FALSE). this is read by
the menu script to put the actual version number in menus, and allow
prompts to indicate if an update is available.
2013-10-26 09:50:37 +02:00
WendyStarfall
efe9d1163c Medea Destiny in-world; texture
Medea: New Feature. Allow textures to be specified in a texture
notecard. Notecard must contain textures on a separate line per texture,
in the format name,uuid.

Wendy: Woooot! \o/
2013-10-26 09:47:44 +02:00
WendyStarfall
fa431f6b86 Medea Destiny in-world; settings
Medea: Added a load defaults button to menu to user to reload the
settings from the defaults notecard without having to open the notecard,
edit it, and save it again, as script is only being reset on a changed
owner. This allows people to restore settings more easily, for example
if they change appearance or if they runaway and want to restore the
owner settings from the defaults card.

Menu Changes: the help/debug > settings setup removed, now help goes
into the help/about menu and these functions appear in the Options menu
under main. For the sake of simplicity, Fix Menus is now handled here,
by using llResetOtherScript();
2013-10-26 09:43:14 +02:00
WendyStarfall
0d62ae50b4 Medea Destiny in-world; rlvmain
Medea: Some situation could cause the viewer check to get stuck. Not
clear what, but I've thrown in a few robustness measures that hopefully
should sort that out.
2013-10-26 09:40:55 +02:00
WendyStarfall
9dc74fdb24 Medea Destiny in-world; rlvfolders
Medea: removed many newlines from browse folder prompts, it was getting
ridiculously big!

Wendy: thanks for looking over the formatting, I did it pretty much in
one run for all scripts and it's true, in this case it's tidy enough
without the line breaks; had to laugh about the menu getting so big,
it's hilarious, I wonder if we could hit a size limit? XD

Support Question: "Help! My menu is so big it don't fit on the screen
anymore!!!"

Support Answer: "If you have a HD 16:9 screen, turn your monitor 90°."
2013-10-26 09:35:29 +02:00
WendyStarfall
60e367f550 Medea Destiny in-world; rlvex
Medea: Removed SetOwnerExs as it's never called. Added a check to
setAllExs to  avoid setting exceptions for wearer (for example if the
wearer is set as an owner) as they're pointless.
2013-10-26 09:28:44 +02:00
WendyStarfall
548dcfe49c Medea Destiny in-world; menu
Medea: reimplemented Menuto function for hud channel. This seems to have
been lost by the wayside in the interface channel mods. I've added a
check to see if the object owner is the same as the menuto target key,
as this will mean a new auth is not required and saves double authing in
that situation (probably the most common).

Menu changes. help/debug is now replaced with Options menu, operated
from the settings script. Refresh menus is now done from the Options
menu in settings, using llResetOtherScript instead of from here, to keep
things simple. Info button in main menu is now a Help/About menu, which
has links to wiki in a button in it, and gets the various help buttons
formerly in the help/debug menu. Update script now sends the current
version and whether there's an update available. The actual version
number is now reported in main and in help/about, and the prompt text
for all three menus is returned by a function now instead of stored in a
list, which allows us to keep up to date, and notify in help/about
prompt when an update is available.

Added button in Help/About to give license notecard and another to open
Defaultsettings help URL.
2013-10-26 09:26:43 +02:00
WendyStarfall
9db7016adc Medea Destiny in-world; dialog
Medea: Project:despam! NOT READY FOR RELEASE, still needs a small logic
check at minimum, not to mention a little testing to see how effective
it is! What is Project: despam!? It's about making certain menus less
spammy. Previously, if any button options were sent to dialog where the
button length is too long, the dialog system would add numbers to the
buttons, and send the list of them to Noftify, so the menu user has a
key to truncated buttons. Example: #RLV browsing, you might have buttons
for Black Leather Skirt and Black Leather Cuffs. This would then become
"1.Black Leath" and "2.Black Leath" as buttons, and the chat would
include "1. Black Leather Skirt", "2. Black Leather Cuffs". Necessary
for identifying truncated buttons, but horribly spammy!

So, Project: despam does this. Instead of listing out all the buttons
after the dialog is sent, as current, the listing process is now done in
the dialog function. Advantages: removed doubling up of various
functions used both in the dialog routine and in the spamming routine,
the list now only provides a list for the current page when selected to
reduce spamminess, and best of all, if there's enough room, the list
will be displayed in the menu prompt and not sent to local chat at all.

Added PrettyMain to make main menu look better.
2013-10-26 09:21:12 +02:00
WendyStarfall
e5e385982d Medea Destiny in-world; auth
Medea: submenu name changed to "access" for menu updates and chat
command for submenu updated to match (now works with both <prefix>owners
and <prefix>access. Much bigger update to this script is in the works,
but I think that's all that's needed for this release.
2013-10-26 09:18:10 +02:00
WendyStarfall
94995fb1f2 Merge pull request #49 from RayZopf/main
Notify owners on SubSpy disable
2013-10-26 00:05:08 -07:00
RayZopf
7834914b9d remove double message
only one message if wearer = owner, added sub's name to message
2013-10-25 03:37:26 +02:00
RayZopf
cb8d6801fb Notify owners on SubSpy disable
only when safeword is used
2013-10-25 02:59:01 +02:00
WendyStarfall
6a64bacd43 Merge pull request #44 from RayZopf/main
bugfixes and minor modifications
2013-10-11 04:28:12 -07:00
RayZopf
37ec8ddc40 additional warning messages for wearer
on rez, when wearer/owner changes or when using safeword/runnaway
2013-10-10 02:54:09 +02:00
RayZopf
a74568e06f bugfixes, minor modification
save settings working again
added runaway
warning on startup when enabled via defaultsettings NC
2013-10-10 02:18:21 +02:00
RayZopf
154bedc6d0 small bugfix
show Real-Leash status only once when reading from defaultsettings NC
2013-10-10 01:53:35 +02:00
RayZopf
8f9fc6cac4 Merge pull request #3 from OpenCollar/main
3.933 sync
2013-10-09 03:16:23 -07:00
WendyStarfall
ce4cfdd310 3.933 ready to ship 2013-10-09 09:06:21 +02:00
WendyStarfall
fa9ab8e9d1 3.933; headers and OCD check 2013-10-09 08:41:47 +02:00
WendyStarfall
ce79377965 3.933; update menu text 2013-10-09 08:11:21 +02:00
WendyStarfall
965ab71ee4 3.933; Updater Master wording/naming 2013-10-09 08:10:11 +02:00
WendyStarfall
44a8b6f9a8 3.933; Real Leash added 2013-10-09 08:06:46 +02:00
WendyStarfall
6b16173d05 3.933; Core bundle adjusted 2013-10-09 08:03:23 +02:00
WendyStarfall
10056c06df 3.933; Couples bundle new 2013-10-09 08:01:26 +02:00
WendyStarfall
73b931d83a 3.933; Poses bundle new 2013-10-09 08:00:15 +02:00
WendyStarfall
31c789b3e4 3.933; Texture bundle split 2013-10-09 07:58:24 +02:00
WendyStarfall
aa5f914e77 3.933; RLV bundle unified 2013-10-09 07:54:26 +02:00
WendyStarfall
210073e592 3.933; renaming bundles 2013-10-09 07:51:04 +02:00
WendyStarfall
2cd5f40cc3 Medea Destiny in-world
Medea: "replace g_sParticleTextureID with texture name if NULL_KEY. This
is for non full perms textures, which return a null key, giving a blank
particle. This should still work for linked leash points if the texture
is added to the leash point as well. "
2013-10-09 06:26:45 +02:00
WendyStarfall
c84b1ccfdc should fix #41 2013-10-09 06:24:18 +02:00
RayZopf
e2ecccd917 Merge pull request #2 from OpenCollar/main
backsync
2013-10-08 13:02:50 -07:00
WendyStarfall
d202f7535e typo and trying to make diffs work
I also bin the old "real leash", Ray was right to change the naming for
convention and in case it would up the settings if a name is two words
2013-10-08 21:16:01 +02:00
WendyStarfall
959b3940aa Merge pull request #42 from RayZopf/main
bugfixing on Real Leash
2013-10-08 10:39:09 -07:00
RayZopf
e2c16ef517 stay in menu after dis/enabling RealLeash
stupid mistake
2013-10-08 18:14:50 +02:00
RayZopf
d5d7fb313d version number
only in comment
2013-10-08 17:13:09 +02:00
RayZopf
e039b29dff code cleanup, minor bugfixes
removed unused functions
have defaultsettings NC working
2013-10-08 17:08:43 +02:00
RayZopf
c09761b3b5 initial version
same as last OpenCollar - real leash.lsl
with minor changes
2013-10-08 16:11:10 +02:00
RayZopf
5ef6efdff0 many small changes 2013-10-08 16:11:08 +02:00
RayZopf
1c41af91e7 Revert "many small changes"
This reverts commit f39761f809.
2013-10-08 16:00:00 +02:00
RayZopf
f39761f809 many small changes 2013-10-08 15:59:41 +02:00
RayZopf
e39c4b00d2 debug code, indent again
much indent changes...
- linkmessage part is badly coded
2013-10-07 22:23:53 +02:00
RayZopf
3c30d3058a indent changes
let LSL-Editor change document/indent format
2013-10-07 19:16:08 +02:00
RayZopf
a51029d250 Merge pull request #1 from OpenCollar/main
sync back
2013-10-06 16:41:15 -07:00
RayZopf
9b4056941d try to get it working again
cosmetic changes
save settings - changed everything to former httpdb
rlv-detection/leashto - new linkmessages
2013-10-07 01:28:36 +02:00
WendyStarfall
f6b41af481 Medea Destiny: major rlvex menu overhaul
Medea: "I've overhauled the menu appearance as it wasn't really that
easy to understand, following the RLV terminology which is a bit of a
headache for scripters, let alone users. Descriptions are clearer and
now represent the current state, and we use unicode ☐ and ☒ to indicate
selected/deselected state on the buttons, common with unicode
enhancements to other menus. ALL buttons indicators swapped to make
clearer the effect of pressing them, and the person to whom the
exceptions will be added/removed is now named at the top of the menu.
Finally, I've cleared up remenuing a little. When someone who is not an
owner/secowner is set to default and removed from the list, we now
return the personlist, and when a new person is added, we remenu."
2013-10-07 01:04:14 +02:00
WendyStarfall
b81c5f8ada by Karo Weirsider in-world: case sensitivity
this commit makes textureable elements case sensitive; we need that if
textures are exclusive to specific elements on the collar otherwhise
those textures would have to be named like the element but in lower caps
2013-10-06 20:35:31 +02:00
RayZopf
1685382dad cosmetic
only formating and comments
2013-10-04 02:20:23 +02:00
WendyStarfall
4bfa2e1bed Merge pull request #39 from RayZopf/main
make badwords addon working again with defaultsettings NC
2013-10-03 04:14:16 -07:00
RayZopf
ba14e082b2 make badwords addon working again with defaultsettings NC
replaced '~' with ','
-makes reading settings from NC working again
-gives correct dump settings output to place in NC
and cosmetic change by replacing 'or' with ',' when listing badwords
2013-10-03 01:27:07 +02:00
WendyStarfall
ec243a1ccf spare parts init
I'm adding them to repo in case somebody will want to work on them or
dig around in the spare parts box we keep under the bed. =)
2013-10-01 22:48:19 +02:00
WendyStarfall
cf74d058a6 3.932 ready to ship 2013-10-01 00:00:46 +02:00
WendyStarfall
a14c78c8de prepping 3.932 2013-09-30 23:40:23 +02:00
WendyStarfall
b21b7c1b97 Merge pull request #37 from KaroWeirsider/main
Update for Issue #23 Update button giving 2 dialogs
2013-09-30 14:22:51 -07:00
KaroWeirsider
e9ab471979 Update for Issue #23 Update button giving 2 dialogs
TucoSolo's suggested correction is accurate.
Also updated the formatting for consistency
2013-09-30 16:29:34 -04:00
WendyStarfall
fb8fd004d6 Merge pull request #36 from KaroWeirsider/main
Update for Issue #25 OpenCollar 3.931 - Badwords: button "ClearAll" call...
2013-09-30 12:29:04 -07:00
KaroWeirsider
0aeaf71a28 Update for Issue #25 OpenCollar 3.931 - Badwords: button "ClearAll" call DialogBadwords twice
Commented out the duplicate call for a dialog.
Modified some other sections for consistency in coding style.
2013-09-30 15:24:24 -04:00
WendyStarfall
c7b4222485 Merge pull request #35 from KaroWeirsider/main
Update for Issue #30 Post button pops up unusable Leash menu
2013-09-30 11:19:15 -07:00
KaroWeirsider
698b450cd2 Update for Issue 30
Correction for Buttons in Leash menu not functioning properly
2013-09-30 13:51:09 -04:00
WendyStarfall
fae5973f6e Update README.md 2013-09-30 19:40:14 +02:00
WendyStarfall
edd8ecd0c4 fixes issue #27 2013-09-30 12:25:26 +02:00
WendyStarfall
c28430aac6 3.931 Main ready to ship 2013-09-27 16:00:48 +02:00
WendyStarfall
e72ea3a4b2 #22 badwords clearall fixed 2013-09-27 15:33:00 +02:00
WendyStarfall
a90549c043 3.930 Main ready to ship II
typo..
2013-09-26 00:53:49 +02:00
WendyStarfall
37946d17ab 3.930 Main ready to ship 2013-09-26 00:53:00 +02:00
WendyStarfall
46f1460f79 3.930; main channel links 2013-09-25 22:29:21 +02:00
WendyStarfall
b11364ead9 3.930 ready to ship 2013-09-25 21:36:24 +02:00
WendyStarfall
5313daad1c 3.930; updater master tiny edit 2013-09-25 21:06:05 +02:00
WendyStarfall
1ef09b5014 3.930; unicode and formatting 2013-09-25 21:02:19 +02:00
WendyStarfall
428d42c82a 3.930; unicode and commenting timeout 2013-09-25 21:01:12 +02:00
WendyStarfall
d639dd1a3b 3.930; update help text 2013-09-25 20:57:19 +02:00
WendyStarfall
d0a7e335c6 3.930; menu polishing
#21 I'm asking to query for version number so users can see it spot-on
in their main menu without having to <fix>version or Get Version; I put
a static number there as a pita until we put a proper query there; the ℹ
text works now better with 3rd party designs, nobody should get confused
no more =)
2013-09-25 19:45:22 +02:00
WendyStarfall
29dfb8f45c 3.930; OCD check and headers
this helps me in my workflow for compiling in world and making sure what
we have in world is what we host on github; the scripts with changes get
a sticker (version up in the header) when loaded up and sent back with
it
2013-09-25 19:40:23 +02:00
WendyStarfall
91b4f517c3 menu: enhancement proposal #21 2013-09-25 15:48:04 +02:00
WendyStarfall
81daa83138 rlvundress: unicode, wording and formatting 2013-09-25 15:23:08 +02:00
WendyStarfall
69009b94d7 rlvtp: unicode, wording and formatting 2013-09-25 15:06:49 +02:00
WendyStarfall
a4a5757e7a rlvtalk: unicode, wording and formatting 2013-09-25 15:05:31 +02:00
WendyStarfall
58c4323be0 rlvsit: unicode, wording and formatting 2013-09-25 15:04:50 +02:00
WendyStarfall
5d1fa74edb rlvmisc: unicode, wording and formatting II 2013-09-25 15:04:00 +02:00
WendyStarfall
88ce309344 rlvrelay: unicode, wording and formatting 2013-09-25 14:33:58 +02:00
WendyStarfall
7d1619cf5d rlvmisc: unicode, wording and formatting 2013-09-25 14:14:38 +02:00
WendyStarfall
26e382bada rlvmain: unicode and formatting 2013-09-25 14:06:12 +02:00
WendyStarfall
7035dd97cf rlvfolders: unicode and formatting 2013-09-25 14:04:41 +02:00
WendyStarfall
557d1f7d84 rlvex: unicode and formatting 2013-09-25 13:52:35 +02:00
WendyStarfall
3e873ccad5 timer: unicode, wording and formatting
issue #20 described the problem with this addon not doing well together
with the key return feature; otherwhise the timer works just fine
2013-09-25 13:47:16 +02:00
WendyStarfall
37daf23bd9 keyholder: unicode, wording and formatting III
this one won't do well with unicode symbol checkboxes; I also opened
issue #20 to tell about the broken inter-compatibility with the timer
addon
2013-09-25 13:45:24 +02:00
WendyStarfall
bab16f2e1a subspy: unicode, wording and formatting 2013-09-25 12:34:51 +02:00
WendyStarfall
757f4e23c8 texture: unicode, wording and formatting 2013-09-24 22:41:24 +02:00
WendyStarfall
6da0efa8c1 update: just formatting 2013-09-24 22:36:22 +02:00
WendyStarfall
30ad1a2b4d settings: unicode, wording and formatting
and that solves the problem with the cut off button! hrhrhr :3
2013-09-24 22:33:07 +02:00
WendyStarfall
efca8266e9 menu: unicode, wording and formatting
along to that there is also an "About" (ℹ) pop-up now that will serve as
homepage link, license info and copyright info; there are also two more
buttons for Help/Debug to join the Chatter or R&D group; for line 285 to
294 I have received help by xx Reyes in world - thank you!!
2013-09-24 22:11:13 +02:00
WendyStarfall
491e251b73 lock: wording and formatting 2013-09-24 21:36:56 +02:00
WendyStarfall
cb84344e9b leashParticle: unicode, wording and formatting
here I also add the new color set and rename the L(eash)-Options inside
of Leash Options to "Advanced" (in submenu: Advanced Leash Options)
2013-09-24 21:34:57 +02:00
WendyStarfall
62e2b062a2 leash: unicode, wording and formatting 2013-09-24 21:32:55 +02:00
WendyStarfall
431b9ff326 label: unicode, wording and formatting 2013-09-24 13:15:12 +02:00
WendyStarfall
bdcfa6c37f keyholder: unicode, wording and formatting II
forgot checkboxes; also needs some formatting for the menu texts yet
2013-09-24 13:05:58 +02:00
WendyStarfall
081ffc6309 keyholder: unicode, wording and formatting
this one is still unstable
2013-09-24 13:01:23 +02:00
WendyStarfall
325acfc875 hide: unicode, wording and formatting 2013-09-24 12:58:14 +02:00
WendyStarfall
6694c3268e getavi: unicode, wording and formatting 2013-09-24 12:29:52 +02:00
WendyStarfall
2dd791d3cd garble: updated safeword 2013-09-24 12:28:32 +02:00
WendyStarfall
e512e6d763 dialog: unicode, wording and formatting
here I also comment the timeout line that would display in each menu; we
keep it in case we want it back or for others to see how it is possible
to add the same string to each menu
2013-09-24 12:25:56 +02:00
WendyStarfall
03934f0790 coupleanim: unicode, wording and formatting 2013-09-24 12:21:40 +02:00
WendyStarfall
5c9a2b7fae color: unicode, wording and formatting 2013-09-24 12:16:53 +02:00
WendyStarfall
88f50c8d38 camera: unicode, wording and formatting 2013-09-24 11:42:27 +02:00
WendyStarfall
098f40f652 bell: unicode, wording and formatting 2013-09-24 08:11:44 +02:00
WendyStarfall
a7b01cba67 badwords: unicode, wording and formatting 2013-09-24 07:52:46 +02:00
WendyStarfall
c0e4b13f73 auth: unicode, wording and formatting 2013-09-24 07:43:04 +02:00
WendyStarfall
f16fba6c28 appearance: unicode, wording and formatting 2013-09-24 07:38:53 +02:00
WendyStarfall
ee026461ef unicode, wording and formatting I
I'm also adding a new chat command "stop" here  to release poses;
2013-09-24 07:29:50 +02:00
WendyStarfall
ee856e7669 issue #14 keyholder: force return added by medea 2013-09-22 20:34:25 +02:00
WendyStarfall
fb3ddc1242 issue #14 keyholder: safeword issue fixed
that one adds the bit to the safeword so it will also lift the lockout;
that was only half the issue fixed tho, owners can force return the key
but the other person who held the key still keeps access to the menu
2013-09-19 15:06:50 +02:00
WendyStarfall
03fc739303 some edits and formatting 2013-09-19 13:07:35 +02:00
WendyStarfall
897024c5c9 3.929 ready to ship 2013-09-19 12:47:30 +02:00
WendyStarfall
4f4742222f version in comments
ups the version in appearance in badwords to reflect those two were
altered; it was the == in badwords and the grammar corrections in
appearance; both contributed by Nori Ovis/Boxspring
2013-09-19 07:36:04 +02:00
WendyStarfall
ea59a75bce 3.929; Medea in-world
MD: "fixing that messed up chat retextureing command with "settexture
element texture" format to do it properly. See notes to 3.921 below,
this kills the scriptiness. Also, removes arbitrary warning when
appearance is locked which was spamming the message on unfiltered link
messages from wearer."
2013-09-19 07:03:02 +02:00
WendyStarfall
c56be2bdad Merge pull request #15 from Boxspring/beta
Appearance script grammar fixes: "From Tuco Solo's incorrect grammar report. #13"
Contributed by Nori Ovis
2013-09-18 19:34:14 -07:00
Boxspring
4a78029431 Appearance script grammar fixes. 2013-09-18 07:26:15 -07:00
WendyStarfall
7a7c3f22fe Merge pull request #12 from Boxspring/beta
Contributed by Nori Ovis; Fixed setting overwrite in Badwords: "Penance Phrase would overwrite Badwords list."
2013-09-18 06:06:34 -07:00
Boxspring
32793dd762 Fixed setting overwrite in Badwords:
Penance Phrase would overwrite Badwords list.
2013-09-18 05:54:36 -07:00
WendyStarfall
bb8bd166d9 3.928 ready to ship 2013-09-18 13:47:10 +02:00
WendyStarfall
7928449114 3.928; grooming and mayonese
yep, yep! this one includes a new tidy header for license and such, some
formatting and mayonese.
2013-09-18 13:19:08 +02:00
WendyStarfall
4109af4491 3.928; Medea Destiny and Edgar Yven in-world
@rlvsit.lsl - Medea: "addition to 3.925, sensor is called in two
separate places (ugh), fix to apply 3.925 change to both. Spotted by
Edgar Yven."
2013-09-18 09:08:50 +02:00
WendyStarfall
bbb84ccb0e 3.927 ready to ship 2013-09-17 23:28:38 +02:00
WendyStarfall
ff2a796f8b 3.927; Medea Destiny in-world contribution
@bell.lsl - Medea: "Update g_kOwners in on_rez event, as we don't
necessarily reset this script and currently we may get failed permission
requests targeting the wrong avatar! See line 513. Added check for
runaway, if bell should be hidden, sleep for 4 seconds then re-hide the
bell elements. This is to avoid other scripts resetting visibility. See
line 712. Added changed event: INVENTORY changes mean more sounds may be
available, so redo prepareSounds(), and LINK to redo
BuildBellElementList(). See line 753"

@camera.lsl - Medea: "added perms check before attempting to clear
camera params in case of reset when collar not worn."
2013-09-17 07:30:39 +02:00
WendyStarfall
f5b5fba73e 3.926 ready to ship 2013-09-17 06:03:28 +02:00
WendyStarfall
1235b19608 3.926; Corwin Davidson pull request #4
we are adding this one afterall to solve a problem with the bell plugin
getting confused by the menu and element sharing the same name; the menu
or element should be renamed nevertheless; also correcting the
"contributors so far" to reflect Corwin because we didn't really know
who and I just added Kittyn believing it came from her, doesn't matter
though as both shared with us; this commit does not deal with issue #7
yet!
2013-09-17 03:34:13 +02:00
WendyStarfall
398d1aa885 added a website button
so this empty, lonely button in the main menu finally has a good purpose
now <3
2013-09-16 22:33:08 +02:00
WendyStarfall
d5a19539a2 3.925 ready to ship 2013-09-16 18:04:44 +02:00
WendyStarfall
e3e51236c6 3.925; Medea Destiny in-world contribution I
"3.925 Revision Proposal, Medea Destiny. ISSUE: Sit Now button will not
return all objects. What's going on? It's a bit of an oddity about the
way sensors work. The SCRIPTED sensor flag only returns active scripted
items, i.e. scripts actually doing something like listening. A
work-around that seems to work is to search for PASSIVE|SCRIPTED in the
sensor, then filter by llDetectedType, which gives SCRIPTED for
non-active scripts. I've implemented that in this script. The downside
is you'll get fewer objects returned to the SIT_NOW menu as the sensor
will pick up the nearest 16 PASSIVE or SCRIPTED items, so you'll have to
be nearer to the object. So, pro: you'll now be able to find dumb sit
scripts. Con: you'll have to be nearer the item. Is this a good
trade-off?"

It's a good trade-off.
2013-09-16 04:34:22 +02:00
WendyStarfall
1a1799dbed 3.924 ready to ship 2013-09-16 03:06:39 +02:00
WendyStarfall
765a15aa13 removal of interface.lsl III
this one will rid contents of the interface script after installing
3.924; one last time if we need it back, it is still present in the
3.844 branch
2013-09-16 02:48:22 +02:00
WendyStarfall
ad0f467144 removal of interface.lsl II
this one removes the interface from the core bundle; again if we need it
back, it is still present in the 3.844 branch
2013-09-16 02:43:31 +02:00
WendyStarfall
1f06000e0c removal of interface.lsl
okay, that's a tough one, this commit makes the interface.lsl script
gone, poof, away.. if we need it back, it is still present in the 3.844
branch!
2013-09-16 02:26:56 +02:00
WendyStarfall
ffd4bef4de 3.924; Medea Destiny in-world contribution
rlvmain: line 16, halved query timer to 30s * 2. line 510, removed
llResetScript(). line 560, i_OwnerCount added to remove llGetListLength
from a loop.
listener: brings back old interface behaviour; line 13-16, line 41-42,
line 92-93, line 142-143, line 189, line 209-232, line 318-322 and line
336 (putting it for those who will not want to use diff for whatever
reason)
2013-09-16 01:50:25 +02:00
WendyStarfall
619e604533 two contributors were missing 2013-09-12 04:22:20 +02:00
WendyStarfall
6524f7a461 3.923 ready to ship
this one has the fix for the subspy plugin contributed by LoveMeNow2013
(github: macom2013)
2013-09-11 14:37:57 +02:00
WendyStarfall
03f03af5dc Merge pull request #6 from macom2013/macom2013
Fix subspy notification code by LoveMeNow2012
2013-09-11 04:13:24 -07:00
macom2013
eb4cf87f4d Fix subspy notification code by LoveMeNow2012
Notify collar owner via IM if he is not nearby, else notify him via
RegionSay
2013-09-11 12:45:57 +02:00
WendyStarfall
4e47a3fa6f 3.922; Medea Destiny in-world Contribution
Medea Destiny's fix for the dump cache/texture setting bug: "The
previous version was basically treating everything as a texture setting
to an arbitrary element, because it didn't check to see if the element
exists." Medea feels that the current technique used is possibly
over-scripty and will hit that routine too often.
2013-09-08 19:26:25 +02:00
WendyStarfall
377b18706c 3.921 ready to ship
Altered parentheses for AO/HUD compatibility by North Glenwalker;
we still have the funny "feature" to issue a <prefix>iwffjnf
CollarElement Texture Name;
we contemplate if to fix the ghost menu items in the texture settings
dump are to be fixed with protective code or if to investigate further
2013-09-04 22:14:40 +02:00
WendyStarfall
2907e37e11 parantheses changes
contributed by North Glenwalker
2013-09-04 20:20:59 +02:00
WendyStarfall
d2aa13ed08 North Glenwalker fix for AO/Hud compatibility 2013-09-04 11:52:17 +02:00
opencollar
74062a130c beta channel 2013-09-04 09:23:39 +02:00
opencollar
87583287c4 a ninja eated .gitattributes 2013-09-04 09:00:43 +02:00
opencollar
da6e853c63 3.920 bundles 2013-09-02 12:17:18 +02:00
opencollar
a1014f79a6 3.920 ready to ship
touch back as default
2013-09-01 09:40:05 +02:00
opencollar
688cf264e1 3.919 ready to ship
fixed a content bug that would wrap root prims in the plywood texture
2013-08-31 10:17:09 +02:00
opencollar
6b4b966a52 3.9 api templates 2013-08-31 08:25:59 +02:00
opencollar
3c04268dee 3.918 ready to ship (formatting) 2013-08-31 07:53:17 +02:00
opencollar
64f3778f98 3.918 ready to ship
mission goals; nirea's original text for the readme modified and put
back
2013-08-31 07:33:26 +02:00
opencollar
5586c31390 3.918 wrap-up II
interface has to be a core item; keyholder plugin plugin "replaced" by
keyholder plugin; touch and garble are by default optional features
2013-08-31 06:38:04 +02:00
opencollar
caa02ec4a8 3.918 wrap-up
interface and garble added; manual merge 3.844 -> 3.913 -> 3.914;
in-world steps towards 3.918; all scripts got a newline at end;
practical test of saving scripts stored in object contents to the
desktop ->
will asset lag have any impact on saving to desktop from the script
editor?
2013-08-31 06:17:05 +02:00
opencollar
f65d0f06b5 GPLv2 + Addendum
This is just so people won't have to digg around the LSL folder to read
the full license.
2013-08-31 02:41:29 +02:00
opencollar
012f43e370 gitattributes
newlines cannot be normalized for us:
bundles even if being non-binary don't love newlines, it messes with the
updater parsing the "playlist" if the last item is
nullnilnadazeronothingyemptynewline
2013-08-31 02:24:03 +02:00
opencollar
95797790d6 Revert "3.913 merge (messy)"
This reverts commit c3ee38d3f5.
2013-08-31 02:16:22 +02:00
opencollar
c3ee38d3f5 3.913 merge (messy)
This looks like I will have to manually go over file by file but...
let's see what happens anyway! =)
2013-08-31 02:09:05 +02:00
opencollar
5838adb778 3.914 bundles
defaultsettings need no longer be overidden; touch and garble optional
2013-08-31 01:54:09 +02:00
opencollar
27c2307256 3.912 ready to ship 2013-08-28 00:25:57 +02:00
opencollar
16c56c9197 rotations fix by Mickey Drayman 2013-08-28 00:03:09 +02:00
opencollar
5609f883dc just file extensions; no code changes 2013-08-27 23:45:35 +02:00
opencollar
312fe15fba Revert "merge of 3.844"
This reverts commit 816cbf2c26.
2013-08-17 13:21:58 +02:00
opencollar
9e253eb907 Revert "bmc design defaults"
This reverts commit 25c8d9dd3a.
2013-08-17 13:21:32 +02:00
JoyStipe
25c8d9dd3a bmc design defaults
since this system is now wiping out existing cards and replacing them, all BMCs come with these settings in the card
2013-08-16 21:26:41 -07:00
Joy Stipe
816cbf2c26 merge of 3.844
this adds in teh changes made between 3.841 & 3.844. Apologies if I
stepped on anyone's toes (unintentional)
2013-08-16 21:20:41 -07:00
opencollar
dbf9e90747 3.911 ready to distribute 2013-08-16 08:24:24 +02:00
opencollar
b8cb85a915 Contributed by Rebbie (rebbie.resident) in-world
This is a kluge to take care of the problem that there is NO way to have
more than four owners,
subowners, or blacklist entries in the default settings, which is
normally used as permanent
storage to avoid the problems that occur when a collar needs to have
it's scripts reset.

Unfortunately, this need appears to occur more frequently when the
collar has multiple
owners - it needs to be reset when there is a script error (such as the
RLV relay
settings script crashing due to having too many exceptions + large
numbers of
relay commands). Since the original script can't dump and restore
multiple owners,
however, this is probably not something the original scripters
considered.

The kluge is in two parts.

Part 1 - Reading the data lines.

In the Dataserver event, each line being read is inspected to see if it
ends with "&&", which
is considered to be a continuation indicator.  If this is found, the
line is saved (in g_sSavedLine),
and no processing of the line is done.  When the next line is read, then
the saved line is
prepended to the line being read to regenerate the full original line.
This reoccurs until
a line is read that does NOT have a "&&" at the end, at which point the
entire reassembled
line is read.   The only limitation on the number of continuation lines
is script memory.

The only values that appear to exceed the 255 character limit are owners
lists, and
texture settings for complex collars. Neither of these have "&&"
anywhere in the typical
data strings, thus the && should be a safe choice.

Part 2 - Writing a data dump that does NOT have lines longer than 255
characters.

The easiest part of the fix is to simply change the length at which the
script preferentially
breaks the output into separate parts to 255 characters instead of 1023.
This causes the
script to break up data values for the same module into multiple lines
when possible,
each of which is individually readable without error.  It is NOT optimal
in terms of making
the dump output a minimum number of actual lines output, but it does
make it more
readable i.e. makes it easier for manual editing of the result, and
incidentally reduces
the need for splitting up long values using continuation flags. As an
example, it forces
the owners list settings and the group settings to be

The second part of the fix is to take lines that cannot (because of long
value strings) be
written as multiple lines.  The subroutine "WhisperLine" will output a
long line in chunks
approximately 250 characters long, with all but the last chunk marked
with an "&&" flag.
2013-08-16 08:15:58 +02:00
opencollar
9022dbc4b5 adjusted for beta 2013-08-16 08:14:11 +02:00
opencollar
eb0e0b8130 3.910 HOTFIX 2013-08-15 06:55:50 +02:00
opencollar
a18259c8c6 couple anims re-rolled/fixed 2013-08-15 06:48:31 +02:00
opencollar
d993937020 url for beta version tracking and news 2013-08-10 20:56:03 +02:00
opencollar
c8fca2c607 url for news and version tracking 2013-08-10 20:42:46 +02:00
opencollar
5cb08a776d fresh for 3.900 2013-08-10 20:33:38 +02:00
298 changed files with 28317 additions and 81418 deletions

1
.gitattributes vendored
View File

@@ -1 +0,0 @@
*.lsl text eol=lf

82
LICENSE
View File

@@ -1,4 +1,78 @@
GNU GENERAL PUBLIC LICENSE
The OpenCollar scripts are licensed under the GPLv2 with the following addendum:
Throughout this license the term "authors" refers to Nandana Singh,
OpenCollar Organiser, Wendy Starfall, Satomi Ahn, Joy Stipe and
other contributors to OpenCollar - submission set free.
"Full perms" means maintaining the modify, copy, and transfer permissions in
Second Life. If the Second Life platform should allow more fine-grained
permissions in the future, then "full perms" will mean the most permissive
possible set of permissions allowed by the platform.
The OpenCollar scripts are free to be copied, modified, and redistributed,
subject to the following conditions:
If you distribute the OpenCollar scripts, you must leave them full perms.
(This includes using the scripts in collars that you make.)
If you modify the OpenCollar scripts and distribute the modifications, you
must also make your modifications full perms.
Custom plugins that are entirely created by you, and which communicate with the
OpenCollar scripts only through link messages, are not subject to the above
restrictions.
The OpenCollar hug and kiss scripts were originally created by Francis Chung,
with only slight modifications by Ilse Mannonen. To the best of our knowledge,
they are in the public domain.
To the best of our knowledge, the animations included in OpenCollar which were
not created by the authors (which is most of them), may be used without
restriction. Animations created by the authors must remain full perms. If you
created one of the included animations and would like to have it removed,
please notify Wendy Starfall.
Likewise, all textures included in the OpenCollar that were not created by the
authors are, to the best of our knowledge, free to use for any purpose. The
textures included which were created by the authors must remain full perms. If
you created one of the included textures and would like to have it removed,
please notify Wendy Starfall.
The base OpenCollar object (in which the OpenCollar scripts are placed) must
also remain full perms. (If you want to use the OpenCollar scripts in collars
that you have made and wish to sell, you can restrict copy or trans permissions
on your prims, but you must leave the OpenCollar scripts full perms).
OpenCollar 3rd Party Extension Policy
Part of OpenCollar being "open" means that we aim to provide a platform that
people can easily integrate with. We encourage people to create their own
products, tools, extensions, or services that integrate with OpenCollar.
You're even free to charge money for them. There are a few ground rules though:
1. Any scripts containing OpenCollar code must use the GPL license and remain
full perms in SL.
2. You must be very very clear that your product/service/whatever is not
affiliated with or supported by the OpenCollar project. Users must not be
confused about who they're trusting.
3. You must not advertise in the OpenCollar groups. Our groups prohibit all
advertising. There is no exception for products that integrate with OpenCollar
in some way.
(We may add to those rules if we missed something important or see people trying
to pick loopholes in them, but that's it for now.)
We are eager to welcome creators willing to follow these rules. We want to
support your creativity by giving you a solid platform to build on, and we want
you as part of our community.
For now, violations of these rules will be dealt with through group ejection and
public shunning. We may in the future create a directory of third party products
and services that we trust. Violators of these rules will be forbidden from
being on that list.
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
@@ -290,8 +364,8 @@ to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
The repository for the OpenCollar main release channel.
Copyright (C) 2013 opencollar
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -329,7 +403,7 @@ necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into

View File

@@ -0,0 +1,16 @@
ITEM|OpenCollar Guide
ITEM|OpenCollar License
ITEM|Leash Holder
ITEM|Grabby Post
SCRIPT|OpenCollar - cleanup
SCRIPT|OpenCollar - main
SCRIPT|OpenCollar - auth
SCRIPT|OpenCollar - listener
SCRIPT|OpenCollar - dialog
SCRIPT|OpenCollar - settings
SCRIPT|OpenCollar - leash
SCRIPT|OpenCollar - leashParticle
SCRIPT|OpenCollar - hide
SCRIPT|OpenCollar - label
SCRIPT|OpenCollar - bell
SCRIPT|OpenCollar - titler

View File

@@ -0,0 +1,8 @@
SCRIPT|OpenCollar - rlvmain
SCRIPT|OpenCollar - rlvex
SCRIPT|OpenCollar - rlvtalk
SCRIPT|OpenCollar - rlvtp
SCRIPT|OpenCollar - rlvsit
SCRIPT|OpenCollar - rlvundress
SCRIPT|OpenCollar - rlvfolders
SCRIPT|OpenCollar - rlvmisc

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - rlvrelay

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - texture

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - color

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - shininess

View File

@@ -0,0 +1 @@
ITEM|textures

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - styles

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - adjustment

View File

@@ -0,0 +1,19 @@
ITEM|~-30
ITEM|~-31
ITEM|~-32
ITEM|~-33
ITEM|~-34
ITEM|~-35
ITEM|~-36
ITEM|~-37
ITEM|~-38
ITEM|~-39
ITEM|~walk_Male
ITEM|~walk_Female
ITEM|~walk_Crawl
ITEM|~walk_Pony
ITEM|~walk_Worm
ITEM|~run
ITEM|~stiff
SCRIPT|OpenCollar - anim
SCRIPT|OpenCollar - couples

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - bookmarks

View File

@@ -0,0 +1,2 @@
ITEM|~shock
SCRIPT|OpenCollar - badwords

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - timer

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - camera

View File

@@ -0,0 +1 @@
SCRIPT|OpenCollar - garble

View File

@@ -0,0 +1,10 @@
ITEM|~-20
ITEM|~-21
ITEM|~-22
ITEM|~-23
ITEM|~-24
ITEM|~-25
ITEM|~-26
ITEM|~-27
ITEM|~-28
ITEM|~-29

View File

@@ -0,0 +1,10 @@
ITEM|~-10
ITEM|~-11
ITEM|~-12
ITEM|~-13
ITEM|~-14
ITEM|~-15
ITEM|~-16
ITEM|~-17
ITEM|~-18
ITEM|~-19

View File

@@ -0,0 +1,9 @@
ITEM|~-1
ITEM|~-2
ITEM|~-3
ITEM|~-4
ITEM|~-5
ITEM|~-6
ITEM|~-7
ITEM|~-8
ITEM|~-9

View File

@@ -0,0 +1,11 @@
ITEM|~-40
ITEM|~-41
ITEM|~-42
ITEM|~-43
ITEM|~-44
ITEM|~-45
ITEM|~-46
ITEM|~-47
ITEM|~-48
ITEM|~-49
ITEM|~-50

View File

@@ -0,0 +1,80 @@
SCRIPT|Old Script
SCRIPT|OpenCollar - menu
SCRIPT|OpenCollar - lock
SCRIPT|OpenCollar - touch
SCRIPT|OpenCollar - getavi
SCRIPT|OpenCollar - interface
SCRIPT|OpenCollar - remoteserver
SCRIPT|OpenCollar - anim/pose
SCRIPT|OpenCollar - cmdupdate
SCRIPT|OpenCollar - techlabel
SCRIPT|OpenCollar - BMC
SCRIPT|OpenCollar - realleash
SCRIPT|OpenCollar - real leash - 0.1
SCRIPT|OpenCollar - real leash - 0.2
SCRIPT|OpenCollar - coupleanim1
SCRIPT|OpenCollar - coupleanim2
SCRIPT|OpenCollar - hovertext
SCRIPT|OpenCollar - subspy
SCRIPT|OpenCollar - update
SCRIPT|OpenCollar - appearance
SCRIPT|OpenCollar - rlvmisc
SCRIPT|OpenCollar - rlvsit
SCRIPT|OpenCollar - rlvtalk
SCRIPT|OpenCollar - rlvtp
ITEM|How to set up your #RLV and use SmartStrip
ITEM|OpenCollar - rlvrelay - Help
ITEM|OpenCollar RLV Relay Help
ITEM|OpenCollar Updater
ITEM|OpenCollar Sub AO
ITEM|OpenCollar Post
ITEM|OC_Leash_Post
ITEM|Ball&Chain
ITEM|chain
ITEM|rope
ITEM|brushedmetal-hshaded-contrasty
ITEM|brushedmetal-hshaded
ITEM|brushedmetal-roundshaded
ITEM|brushedmetal-vshaded
ITEM|blank
ITEM|blkgraindot
ITEM|Celtic
ITEM|diamond
ITEM|I-Beam
ITEM|metal-h
ITEM|metal-h-contrast
ITEM|metal-round
ITEM|metal-v
ITEM|opaque gradient circle
ITEM|Rusty Metal Chest
ITEM|Rusty Panel
ITEM|seamless foil
ITEM|seamless gold foil
ITEM|Silver Filligree
ITEM|!fadestripe
ITEM|!whiteleather
ITEM|!totallytransparent
ITEM|5fadestripes
ITEM|Blank
ITEM|Brass
ITEM|Chrome
ITEM|Fur Dark
ITEM|Fur Light
ITEM|Gem
ITEM|Gold
ITEM|Grunge
ITEM|Lace
ITEM|Leather Dark
ITEM|Leather Light
ITEM|Rust
ITEM|Silver
ITEM|Snake
ITEM|Steel
ITEM|yin
ITEM|yang
ITEM|Tranquility
ITEM|Shack
ITEM|Sandbox
ITEM|~version
ITEM|Temple
ITEM|~PostureOverride

View File

@@ -1,20 +1,16 @@
// Copyright (c) 2013 - 2015 Toy Wylie et. al
//
// This script is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation, version 2.
//
// This script is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this script; if not, see www.gnu.org/licenses/gpl-2.0
//
// Debug(string sStr) { llOwnerSay("Debug ["+llGetScriptName()+"]: " + sStr); }
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - grabbypost //
// version 3.940 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Toy Wylie and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// Needs OpenCollar 3.9x or higher to work
@@ -46,8 +42,12 @@ list listeners=[]; // collar pong listeners per victim
//=
//= returns : Channel iNumber to be used
//===============================================================================
integer PersonalChannel(string sID, integer iOffset) {
return -llAbs((integer)("0x"+llGetSubString(sID,-7,-1)) + iOffset);
integer GetOwnerChannel(key kOwner, integer iOffset)
{
integer iChan = (integer)("0x"+llGetSubString((string)kOwner,2,7)) + iOffset;
if (iChan > 0) iChan *= -1;
if (iChan > -10000) iChan -= 30000;
return iChan;
}
// resets the menu dialog
@@ -84,9 +84,9 @@ notFound(key k)
// leash a victim
leash(key k)
{
integer channel=PersonalChannel((string)k,0);
integer channel=GetOwnerChannel(k,1111);
llRegionSayTo(k,channel,"length "+(string) LEASH_LENGTH);
llRegionSayTo(k,channel,"anchor "+(string) llGetKey());
llRegionSayTo(k,channel,"leashto "+(string) llGetKey());
}
default
@@ -171,7 +171,7 @@ default
// scan for victims
if(message=="Scan")
{
llRegionSayTo(menuUser,0,"Scanning for OsCollar compatible victims, please wait ...");
llRegionSayTo(menuUser,0,"Scanning for OpenCollar compatible victims, please wait ...");
llSensor("",NULL_KEY,AGENT,RANGE,PI);
// set up scanning mode
@@ -211,10 +211,10 @@ default
if(message==((string) wearer+":pong"))
{
// get the collar wearer's name
string sName=llKey2Name(wearer);
name=llKey2Name(wearer);
// cut to max. 11 characters and add to the list of names
victimNames+=[llGetSubString(sName,0,11)];
// cut to max. 24 characters and add to the list of names
victimNames+=[llGetSubString(name,0,23)];
// add to the list of keys
victimKeys+=[wearer];
@@ -245,14 +245,14 @@ default
if(k!=menuUser)
{
// calculate collar channel per victim and add a listener
channel=PersonalChannel((string)k,1234);
channel=GetOwnerChannel(k,1111);
listeners+=
[
llListen(channel,"",NULL_KEY,"")
];
// ping victim's collar
llRegionSayTo(k,channel,(string)k+":ping");
llRegionSayTo(k,channel,"ping");
}
}

View File

@@ -0,0 +1,68 @@
================
OpenCollar - Quick Guide
================
Your prefix are the first letter of your firstname and the first letter of your surname. If you don't have a surname, your surname will always be "Resident".
- Wendy Starfall (wendy.starfall)'s prefix is: ws
- wendy4u (wendy4u Resident)'s prefix is: wr
- ????i? ?l?? (fraulein.fapalot)'s prefix is: ff
Your prefix is used to issue commands in the Nearby Chat.
<prefix>menu
<prefix>pose
<prefix>kneel
<prefix>release
<prefix>grab
<prefix>yank
<prefix>unleash
<prefix>sitnow
If you don't like your prefix, you can change it.
wsprefix wen
wrprefix we
jsprefix sex
You can also issue commands on channel 1.
/1<prefix>menu
Or if you don't like channel 1 set a different channel.
<prefix>channel 2
<prefix>channel 3
<prefix>channel 69
<prefix>channel 9001
If you are considerate about lag, you can also turn off the Nearby Chat listener.
<prefix>channel -1
Your collar also has a safeword which you simply type in the nearby chat. This will lift all RLV resctrictions, unpose, unleash and unlock you. It will also send your Owner a message to check for your well being.
RED
RED in capital letters is the default safeword.
If that's too hard to remember you can easily change it.
<prefix>safeword Mayday!
<prefix>safeword taxi
<prefix>safeword BANANA
Too much to type? There is also a menu that has buttons for all these many commands. The menu can be opened in multiple ways.
1. <prefix>menu
2. Click the collar!
3. If you use the Sub AO, it's menu has a button.
4. If you are an Owner, use the Owner HUD.
Yay! Now that you know how to use your prefix, your channel, chat commands and the menu, you are ready to find an Owner. If things don't turn out all that great:
<prefix>runaway
===============================
For a full manual, please visit www.opencollar.at
===============================

View File

@@ -0,0 +1,148 @@
Table of contents
-----------------
1. Introduction
2. User help
1. Menu buttons
2. Chat commands
3. Technical information for RLV scripters
1. Features and specifications
2. Caveats
3. Want more fun?
*****
1. Introduction
===============
Restrained Love Viewer API (Application Programming Interface) is a Second Life viewer feature that allows rezzed objects that you own to speak to your viewer and ask it to perform certain actions (teleporting, force-sitting or stripping the avatar) or toggle certain restrictions (such as on chat or clothing). This is limited to *your* objects, however.
A Restrained Love Viewer relay, or just "relay", is a script that listens for in-world object commands and transmits them to your viewer so that you can be controlled by objects belonging to *other* people. Of course, the task of the relay is not only to transmit such commands, but also to manage which objects should be allowed or not, and to keep track of the applied restrictions.
OpenCollar includes such a relay. The relay included in OpenCollar has a few particularities:
- In contrast to most older relays (prior to 2009), it allows several concurrent sources to communicate with your viewer and lock your relay.
- It has many access control options (both basic and more complicated modes, along with blacklists and whitelists).
- It optionally allows release from restrictions via safewording.
- It is integrated with the collar system in that (1) sources owned by owners are automatically accepted by the relay, and (2) owners can force the relay mode above a specified level of acceptance.
2. User help
============
1.1. Menu buttons
-----------------
(Don't be surprised if some of these buttons aren't always displayed, since, depending on the context, irrelevant ones are automatically hidden.)
In the main dialog:
* Auto: the relay accepts every future request (except from blacklisted devices).
* Ask: the relay asks before accepting future requests (except from whitelisted or blacklisted devices).
* Restricted: the relay rejects every future request (except from whitelisted devices and devices already controlling you).
* ( )/(*)Playful: enables/disables automatic acceptance of non-restraining commands (combines with the previous modes).
* ( )/(*)Land: enables/disables automatic acceptance of commands from devices belonging to the sim landowner.
* ( )/(*)Safeword: enables/disables the possibility to escape restriction by use of a safeword.
* Grabbed by: shows the list of devices currently controlling your avatar, and the list of restrictions enforced.
* Pending: shows the request dialog, in case there are pending requests.
* Help: gives this notecard.
* Safeword: clears all restrictions; equivalent to typing "[initials]relay safeword".
* Access lists: opens the access list management dialog, for removing trusted or banned sources.
* MinMode (owner only): pops up a submenu in which a primary owner can set minimal function levels for the relay. If the owner chooses the Restricted option here, for instance, the sub cannot go "under" it by disabling the relay completely, but can choose between Restricted and the options "above", namely Ask and Auto; while if the owner chooses the highest level, Auto, it may not be changed and neither Restricted nor Ask is available to the sub. Likewise, if the "lower" settings with safeword, not playful, and landowner not trusted are set in MinMode, they can be changed by the sub; but if the owner dictates that the safeword cannot be used, that the sub must be playful, and/or that landowner must be trusted, the sub cannot change these settings.
In the request dialog, which will pop up in Ask mode when an RLV source tries to lock the relay:
* Yes: accept this command (and other commands from the same device until unrestricted).
* No: rejects this command (and other commands from the same device in the following seconds).
* Trust Object: same as Yes, but adds the object to the whitelist.
* Ban Object: same as No, but adds the object to the blacklist.
* Trust Owner: same as Yes, but adds the owner of the object to the whitelist.
* Ban Owner: same as No, but adds the owner of the object to the blacklist.
* Trust User: same as Yes, but adds the avatar using the object to the whitelist.
* Ban User: same as No, but adds the avatar using the object to the blacklist.
1.2. Chat commands:
-------------------
* [initials]showrestrictions: shows the list of restrictions to which the wearer is subject, and the devices issuing these.
* [initials]relay [ask/auto/restricted/off]: toggles the selected mode.
* [initials]relay playful [on/off]: toggles playful submode.
* [initials]relay land [on/off]: toggles landowner submode.
* [initials]relay safeword [on/off]: toggles safewording.
* [initials]relay safeword: safewords.
* [initials]relay minmode [ask/auto/restrcted/off]: sets the minimal basic mode.
* [initials]relay minmode [playful/land/safeword] [on/off] (owner only): sets the minimal submodes.
* [initials]relay getdebug: starts relay debugging, i.e. forwards all relay chat to the person issuing this command
* [initials]relay stopdebug: stops relay debugging
3. Technical information for RLV scripters
==========================================
2.1. Features and specifications
--------------------------------
As an ORG (Open Relay Group) relay, this relay conforms to
[this specification](https://wiki.secondlife.com/wiki/LSL_Protocol/Restrained_Love_Open_Relay_Group)
- the [basic relay specification version 1.100](https://wiki.secondlife.com/wiki/LSL_Protocol/Restrained_Love_Relay)
- the [ORG additional requirements version 0003](https://wiki.secondlife.com/wiki/LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Requirements)
- and to one optional "x-tension", [who, version 001](https://wiki.secondlife.com/wiki/LSL_Protocol/Restrained_Love_Open_Relay_Group/who)
In particular, this means that this relay will understand relay commands using a wildcard "ffffffff-ffff-ffff-ffff-ffffffffffff" instead of the avatar key, allowing efficient scanning and zone effects.
Also, through the x-tension who, this relay understands the meta-command !x-who, which allows RLV sources to specify who (which avatar) is now using the source to grab the relay. This information is reported in the Ask dialog prompt and can be used by the wearer to decide whether to accept being locked, and also maybe to blacklist or whitelist the avatar using the source.
2.2. Caveats
------------
This script uses a lot of memory, and even more when it has to decompose and analyze relay commands. Moreover, this relay manages several RLV sources (an arbitrary number of them) from only two scripts, which makes things even worse. We took great care in optimizing it the best we could, but it is not impossible that a stack-heap collision will still occur. If that happens:
- To make your relay work again, you will have to reset the script using the Tools menu of your viewer (alas, a script that crashed cannot be reset by another script).
- We would be glad if you could tell us where and how the crash happened, and report your incident on the [OpenCollar bug tracker](http://code.google.com/p/opencollar/issues). Any other bug in the relay or issue with the documentation should be reported there as well.
Also, due to the way RLV works, having several RLV sources managing from a single script (and hence a single prim) can trigger unexpected results. For instance, the command @getstatus would report all restrictions set by the collar, instead of just those set by the source sending the command. This is not something we can fix unless we restrict the relay to a single source (which would be a shame!) or unless we use a multiprim approach, which would be highly impractical in the OpenCollar context.
Some other bugs might arise, related to contradictory commands, restrictions and exceptions from different sources. This category of bugs can sometimes be mitigated in some way by using scripting tricks, so if you notice one of this kind please report it on the bug tracker so we can see if something can be done.
2.3. Want more fun?
-------------------
If you are interested in relays with advanced features, there is a HUD version of this relay (also open source), implementing even more fancy features from ORG. Look for "Satomi's Multi-Relay HUD" on the SL market place or grab it at the OpenCollar Temple if you want a copy of that relay.
If you want to to discuss relay features, you can comment on the [ORG wiki pages](https://wiki.secondlife.com/wiki/LSL_Protocol/Restrained_Love_Open_Relay_Group), and/or join the Restrained Love Open Relay Group in SecondLife.

View File

@@ -0,0 +1,66 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - leashholder //
// version 3.940 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// based on a script by Ilse Mannonen
integer g_iMychannel = -8888;
string g_sListenfor;
string g_sResponse;
AnnounceLeashHolder()
{
llSay(g_iMychannel, g_sResponse);
}
default
{
state_entry()
{
g_sListenfor = (string)llGetOwner() + "handle";
g_sResponse = (string)llGetOwner() + "handle ok";
llListen(g_iMychannel, "", NULL_KEY, g_sListenfor);
AnnounceLeashHolder();
llSetTimerEvent(2.0);
}
listen(integer channel, string name, key id, string message)
{
AnnounceLeashHolder();
llSetTimerEvent(2.0);
}
attach(key kAttached)
{
if (kAttached == NULL_KEY)
{
llSay(g_iMychannel, (string)llGetOwner() + "handle detached");
}
}
changed(integer change)
{
if (change & CHANGED_TELEPORT)
{
AnnounceLeashHolder();
llSetTimerEvent(2.0);
}
}
timer()
{
llSetTimerEvent(0.0);
AnnounceLeashHolder();
}
on_rez(integer param)
{
llResetScript();
}
}

View File

@@ -0,0 +1,277 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - UpdateShim //
// version 3.985 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// This script is like a kamikaze missile. It sits dormant in the updater
// until an update process starts. Once the initial handshake is done, it's
// then inserted into the object being updated, where it chats with the bundle
// giver script inside the updater to let it know what to send over. When the
// update is finished, this script does a little final cleanup and then deletes
// itself.
integer iStartParam;
// a strided list of all scripts in inventory, with their names,versions,uuids
// built on startup
list lScripts;
// list where we'll record all the settings and local settings we're sent, for replay later.
// they're stored as strings, in form "<cmd>|<data>", where cmd is either LM_SETTING_SAVE
list lSettings;
// list of deprecated tokens to remove from previous collar scripts
list lDeprecatedSettingTokens = [
"collarversion"
];
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
// Return the name and version of an item as a list. If item has no version, return empty string for that part.
list GetNameParts(string name) {
list nameparts = llParseString2List(name, [" - "], []);
string shortname = llDumpList2String(llList2List(nameparts, 0, 1), " - ");
string version;
if (llGetListLength(nameparts) > 2) {
version = llList2String(nameparts, -1);
} else {
version = "";
}
return [shortname, version];
}
// Given the name (but not version) of a script, look it up in our list and return the key
// returns "" if not found.
key GetScriptFullname(string name) {
integer idx = llListFindList(lScripts, [name]);
if (idx == -1) {
return (key)"";
}
string version = llList2String(lScripts, idx + 1);
if (version == "") {
return name;
} else {
return llDumpList2String([name, version], " - ");
}
}
integer COMMAND_NOAUTH = 0;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to settings store
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from store
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the settings store
// Some versions of the collar have a hover text script in them that breaks
// updates because it set a script pin that overwrites the one set by this shim
// script. So before starting, delete any script that starts with "OpenCollar
// - hovertext".
// In general, removal of old cruft should be done with the cleanup script or
// a "DEPRECATED" bundle, but this has to be done here because it breaks the updater
// before bundles get going.
RemoveHoverTextScript() {
string kill = "OpenCollar - hovertext";
integer n;
// loop from the top down to avoid shifting indices
for (n = llGetInventoryNumber(INVENTORY_SCRIPT) - 1; n >= 0; n--) {
string name = llGetInventoryName(INVENTORY_SCRIPT, n);
if (llSubStringIndex(name, kill) == 0) {
llRemoveInventory(name);
}
}
}
default
{
state_entry()
{
iStartParam = llGetStartParameter();
RemoveHoverTextScript();
// build script list
integer n;
integer stop = llGetInventoryNumber(INVENTORY_SCRIPT);
for (n = 0; n < stop; n++) {
string name = llGetInventoryName(INVENTORY_SCRIPT, n);
// add to script list
lScripts += GetNameParts(name);
}
//Debug(llDumpList2String(lScripts, "|"));
// listen on the start param channel
llListen(iStartParam, "", "", "");
// let mama know we're ready
llWhisper(iStartParam, "reallyready");
//Debug("Starting");
}
listen(integer channel, string name, key id, string msg) {
//Debug("heard: " + msg);
if (llGetOwnerKey(id) == llGetOwner()) {
list parts = llParseString2List(msg, ["|"], []);
if (llGetListLength(parts) == 4) {
string type = llList2String(parts, 0);
string name = llList2String(parts, 1);
key uuid = (key)llList2String(parts, 2);
string mode = llList2String(parts, 3);
string cmd;
if (mode == "INSTALL" || mode == "REQUIRED") {
if (type == "SCRIPT") {
// see if we have that script in our list.
integer idx = llListFindList(lScripts, [name]);
if (idx == -1) {
// script isn't in our list.
cmd = "GIVE";
} else {
// it's in our list. Check UUID.
string script_name = GetScriptFullname(name);
key script_id = llGetInventoryKey(script_name);
if (script_id == uuid) {
// already have script. skip
cmd = "SKIP";
} else {
// we have the script but it's the wrong version. delete and get new one.
llRemoveInventory(script_name);
cmd = "GIVE";
}
}
} else if (type == "ITEM") {
if (llGetInventoryType(name) != INVENTORY_NONE) {
// item exists. check uuid.
if (llGetInventoryKey(name) != uuid) {
// mismatch. delete and report
llRemoveInventory(name);
cmd = "GIVE";
} else {
// match. Skip
cmd = "SKIP";
}
} else {
// we don't have item. get it.
cmd = "GIVE";
}
}
} else if (mode == "REMOVE" || mode == "DEPRECATED") {
//Debug("remove: " + msg);
if (type == "SCRIPT") {
string script_name = GetScriptFullname(name);
//Debug("script name: " + script_name);
if (llGetInventoryType(script_name) != INVENTORY_NONE) {
llRemoveInventory(script_name);
}
} else if (type == "ITEM") {
if (llGetInventoryType(name) != INVENTORY_NONE) {
llRemoveInventory(name);
}
}
cmd = "OK";
}
string response = llDumpList2String([type, name, cmd], "|");
//Debug("responding: " + response);
llRegionSayTo(id, channel, response);
} else {
if (llSubStringIndex(msg, "CLEANUP") == 0) {
// Prior to 3.706, collars would store version number in
// both the object name and description. This has
// problems: 1) It prevents running updates while worn,
// since llSetObjectName doesn't reliably persist for
// attachments, 2) it's needless repetition and creates
// unnecessary complexity, and 3) version numbers are ugly.
// So now we store version number in just one place, inside
// the "~version" notecard, which is automatically kept up
// to date when the core bundle is installed. The lines
// below here exist to clean up version numbers in old
// collars.
list msgparts = llParseString2List(msg, ["|"], []);
// look for a version in the name and remove if present
list nameparts = llParseString2List(llGetObjectName(), [" - "], []);
if (llGetListLength(nameparts) == 2 && (integer)llList2String(nameparts, 1)) {
// looks like there's a version in the name. Remove
// it!
string just_name = llList2String(nameparts, 0);
llSetObjectName(just_name);
}
// We used to set the version in the desc too. Now we just
// leave it alone in this script. The in-collar update
// script now uses that part of the desc to remember the
// timestamp of the last news item that it reported.
//restore settings
integer n;
integer stop = llGetListLength(lSettings);
list sDeprecatedSplitSettingTokenForTest;
for (n = 0; n < stop; n++) {
string setting = llList2String(lSettings, n);
//Look through deprecated settings to see if we should ignore any...
// Settings look like rlvmain_on=1, we want to deprecate the token ie. rlvmain_on <--store
sDeprecatedSplitSettingTokenForTest = llList2List(llParseString2List(setting,["="],[]),0,0);
if (llListFindList(lDeprecatedSettingTokens,sDeprecatedSplitSettingTokenForTest) < 0) { //If it doesn't exist in our list
llMessageLinked(LINK_SET, LM_SETTING_SAVE, setting, "");
//Debug("SP - Saving :"+setting);
}
else {
//Debug("SP - Deleting :"+ llList2String(sDeprecatedSplitSettingTokenForTest,0));
//remove it if it's somehow persistent still
llMessageLinked(LINK_SET, LM_SETTING_DELETE, llList2String(sDeprecatedSplitSettingTokenForTest,0), "");
}
}
// tell scripts to rebuild menus (in case plugins have been removed)
llMessageLinked(LINK_SET, COMMAND_NOAUTH, "fixmenus", llGetOwner());
// remove the script pin
llSetRemoteScriptAccessPin(0);
// celebrate
llOwnerSay("Update complete!");
// delete shim script
llRemoveInventory(llGetScriptName());
}
}
}
}
link_message(integer sender, integer num, string str, key id) {
// The settings script will dump all its settings when an inventory change happens, so listen for that and remember them
// so they can be restored when we're done.
if (num == LM_SETTING_RESPONSE) {
if (str != "settings=sent") {
if (llListFindList(lSettings, [str]) == -1) {
lSettings += [str];
}
}
}
}
}

View File

@@ -0,0 +1,608 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - adjustment //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//handle appearance menu
//handle saving position on detach, and restoring it on httpdb_response
string g_sSubMenu = "Size/Position";
string g_sParentMenu = "Appearance";
string CTYPE = "collar";
list g_lMenuIDs;//3-strided list of avkey, dialogid, menuname
integer g_iMenuStride = 3;
string POSMENU = "Position";
string ROTMENU = "Rotation";
string SIZEMENU = "Size";
float g_fSmallNudge=0.0005;
float g_fMediumNudge=0.005;
float g_fLargeNudge=0.05;
float g_fNudge=0.005; // g_fMediumNudge;
float g_fRotNudge;
// SizeScale
list SIZEMENU_BUTTONS = [ "-1%", "-2%", "-5%", "-10%", "+1%", "+2%", "+5%", "+10%", "100%" ]; // buttons for menu
list g_lSizeFactors = [-1, -2, -5, -10, 1, 2, 5, 10, -1000]; // actual size factors
list g_lPrimStartSizes; // area for initial prim sizes (stored on rez)
integer g_iScaleFactor = 100; // the size on rez is always regarded as 100% to preven problem when scaling an item +10% and than - 10 %, which would actuall lead to 99% of the original size
integer g_iSizedByScript = FALSE; // prevent reseting of the script when the item has been chnged by the script
integer g_iAppLock = FALSE;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
//integer POPUP_HELP = 1001;
//integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
//integer LM_SETTING_DELETE = 2003;//delete token from DB
//integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
//string UPMENU = "↑";//when your menu hears this, give the parent menu
string UPMENU = "BACK";
key g_kWearer;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
integer MinMaxUnscaled(vector vSize, float fScale)
{
if (fScale < 1.0)
{
if (vSize.x <= 0.01) return TRUE;
if (vSize.y <= 0.01) return TRUE;
if (vSize.z <= 0.01) return TRUE;
}
else
{
if (vSize.x >= 10.0) return TRUE;
if (vSize.y >= 10.0) return TRUE;
if (vSize.z >= 10.0) return TRUE;
}
return FALSE;
}
integer MinMaxScaled(vector vSize, float fScale)
{
if (fScale < 1.0)
{
if (vSize.x < 0.01) return TRUE;
if (vSize.y < 0.01) return TRUE;
if (vSize.z < 0.01) return TRUE;
}
else
{
if (vSize.x > 10.0) return TRUE;
if (vSize.y > 10.0) return TRUE;
if (vSize.z > 10.0) return TRUE;
}
return FALSE;
}
Store_StartScaleLoop()
{
g_lPrimStartSizes = [];
integer iPrimIndex;
vector vPrimScale;
vector vPrimPosit;
list lPrimParams;
if (llGetNumberOfPrims()<2)
{
vPrimScale = llGetScale();
g_lPrimStartSizes += vPrimScale.x;
}
else
{
for (iPrimIndex = 1; iPrimIndex <= llGetNumberOfPrims(); iPrimIndex++ )
{
lPrimParams = llGetLinkPrimitiveParams( iPrimIndex, [PRIM_SIZE, PRIM_POSITION]);
vPrimScale=llList2Vector(lPrimParams,0);
vPrimPosit=(llList2Vector(lPrimParams,1)-llGetRootPosition())/llGetRootRotation();
g_lPrimStartSizes += [vPrimScale,vPrimPosit];
}
}
g_iScaleFactor = 100;
}
ScalePrimLoop(integer iScale, integer iRezSize, key kAV)
{
integer iPrimIndex;
float fScale = iScale / 100.0;
list lPrimParams;
vector vPrimScale;
vector vPrimPos;
vector vSize;
if (llGetNumberOfPrims()<2)
{
vSize = llList2Vector(g_lPrimStartSizes,0);
if (MinMaxUnscaled(llGetScale(), fScale) || !iRezSize)
{
Notify(kAV, "The object cannot be scaled as you requested; prims are already at minimum or maximum size.", TRUE);
return;
}
else if (MinMaxScaled(fScale * vSize, fScale) || !iRezSize)
{
Notify(kAV, "The object cannot be scaled as you requested; prims would surpass minimum or maximum size.", TRUE);
return;
}
else
{
llSetScale(fScale * vSize); // not linked prim
}
}
else
{
if (!iRezSize)
{
// first some checking
for (iPrimIndex = 1; iPrimIndex <= llGetNumberOfPrims(); iPrimIndex++ )
{
lPrimParams = llGetLinkPrimitiveParams( iPrimIndex, [PRIM_SIZE, PRIM_POSITION]);
vPrimScale = llList2Vector(g_lPrimStartSizes, (iPrimIndex - 1)*2);
if (MinMaxUnscaled(llList2Vector(lPrimParams,0), fScale))
{
Notify(kAV, "The object cannot be scaled as you requested; prims are already at minimum or maximum size.", TRUE);
return;
}
else if (MinMaxScaled(fScale * vPrimScale, fScale))
{
Notify(kAV, "The object cannot be scaled as you requested; prims would surpass minimum or maximum size.", TRUE);
return;
}
}
}
Notify(kAV, "Scaling started, please wait ...", TRUE);
g_iSizedByScript = TRUE;
for (iPrimIndex = 1; iPrimIndex <= llGetNumberOfPrims(); iPrimIndex++ )
{
// lPrimParams = llGetLinkPrimitiveParams(iPrimIndex, [PRIM_SIZE, PRIM_POSITION]);
vPrimScale = fScale * llList2Vector(g_lPrimStartSizes, (iPrimIndex - 1)*2);
vPrimPos = fScale * llList2Vector(g_lPrimStartSizes, (iPrimIndex - 1)*2+1);
if (iPrimIndex == 1)
{
llSetLinkPrimitiveParamsFast(iPrimIndex, [PRIM_SIZE, vPrimScale]);
}
else
{
llSetLinkPrimitiveParamsFast(iPrimIndex, [PRIM_SIZE, vPrimScale, PRIM_POSITION, vPrimPos]);
}
}
g_iScaleFactor = iScale;
g_iSizedByScript = TRUE;
Notify(kAV, "Scaling finished, the "+CTYPE+" is now on "+ (string)g_iScaleFactor +"% of the rez size.", TRUE);
}
}
ForceUpdate()
{
//workaround for https://jira.secondlife.com/browse/VWR-1168
llSetText(".", <1,1,1>, 1.0);
llSetText("", <1,1,1>, 1.0);
}
vector ConvertPos(vector pos)
{
integer ATTACH = llGetAttached();
vector out ;
if (ATTACH == 1) { out.x = pos.y; out.y = pos.z; out.z = pos.x; }
else if (ATTACH == 5 || ATTACH == 20 || ATTACH == 21 ) { out.x = pos.x; out.y = -pos.z; out.z = pos.y ; }
else if (ATTACH == 6 || ATTACH == 18 || ATTACH == 19 ) { out.x = pos.x; out.y = pos.z; out.z = -pos.y; }
else out = pos ;
return out ;
}
AdjustPos(vector vDelta)
{
if (llGetAttached())
{
llSetPos(llGetLocalPos() + ConvertPos(vDelta));
ForceUpdate();
}
}
vector ConvertRot(vector rot)
{
integer ATTACH = llGetAttached();
vector out ;
if (ATTACH == 1) { out.x = rot.y; out.y = rot.z; out.z = rot.x; }
else if (ATTACH == 5 || ATTACH == 20 || ATTACH == 21) { out.x = rot.x; out.y = -rot.z; out.z = rot.y; }
else if (ATTACH == 6 || ATTACH == 18 || ATTACH == 19) { out.x = rot.x; out.y = rot.z; out.z = -rot.y; }
else out = rot ;
return out ;
}
AdjustRot(vector vDelta)
{
if (llGetAttached())
{
llSetLocalRot(llGetLocalRot() * llEuler2Rot(ConvertRot(vDelta)));
ForceUpdate();
}
}
RotMenu(key kAv, integer iAuth)
{
string sPrompt = "\nAdjust the "+CTYPE+"'s rotation.\n\nNOTE: Arrows refer to the neck joint.";
list lMyButtons = ["tilt up ↻", "left ↶", "tilt left ↙", "tilt down ↺", "right ↷", "tilt right ↘"];// ria change
key kMenuID = Dialog(kAv, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
integer iMenuIndex = llListFindList(g_lMenuIDs, [kAv]);
list lAddMe = [kAv, kMenuID, ROTMENU];
if (iMenuIndex == -1)
{
g_lMenuIDs += lAddMe;
}
else
{
g_lMenuIDs = llListReplaceList(g_lMenuIDs, lAddMe, iMenuIndex, iMenuIndex + g_iMenuStride - 1);
}
}
PosMenu(key kAv, integer iAuth)
{
string sPrompt = "\nAdjust the "+CTYPE+"'s position.\n\nNOTE: Arrows refer to the neck joint.\n\nCurrent nudge strength is: ";
list lMyButtons = ["left ←", "up ↑", "forward ↳", "right →", "down ↓", "backward ↲"];// ria iChange
if (g_fNudge!=g_fSmallNudge) lMyButtons+=["▸"];
else sPrompt += "▸";
if (g_fNudge!=g_fMediumNudge) lMyButtons+=["▸▸"];
else sPrompt += "▸▸";
if (g_fNudge!=g_fLargeNudge) lMyButtons+=["▸▸▸"];
else sPrompt += "▸▸▸";
key kMenuID = Dialog(kAv, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
integer iMenuIndex = llListFindList(g_lMenuIDs, [kAv]);
list lAddMe = [kAv, kMenuID, POSMENU];
if (iMenuIndex == -1)
{
g_lMenuIDs += lAddMe;
}
else
{
g_lMenuIDs = llListReplaceList(g_lMenuIDs, lAddMe, iMenuIndex, iMenuIndex + g_iMenuStride - 1);
}
}
SizeMenu(key kAv, integer iAuth)
{
string sPrompt = "\nAdjust the "+CTYPE+"'s scale.\n\nIt is based on the size the "+CTYPE+" has upon rezzing. You can change back to this size by using '100%'.\n\nCurrent size: " + (string)g_iScaleFactor + "%\n\nWARNING: Make a backup copy of your "+CTYPE+" first! Considering the massive variation of designs, this feature is not granted to work in all cases. Possible rendering bugs mean having to right-click your "+CTYPE+" first to see the actual result.";
key kMenuID = Dialog(kAv, sPrompt, SIZEMENU_BUTTONS, [UPMENU], 0, iAuth);
integer iMenuIndex = llListFindList(g_lMenuIDs, [kAv]);
list lAddMe = [kAv, kMenuID, SIZEMENU];
if (iMenuIndex == -1)
{
g_lMenuIDs += lAddMe;
}
else
{
g_lMenuIDs = llListReplaceList(g_lMenuIDs, lAddMe, iMenuIndex, iMenuIndex + g_iMenuStride - 1);
}
//Debug("FreeMem: " + (string)llGetFreeMemory());
}
DoMenu(key kAv, integer iAuth)
{
list lMyButtons ;
string sPrompt;
if (g_iAppLock && iAuth != COMMAND_OWNER) {
sPrompt = "\nThe appearance of the "+CTYPE+" has been locked.\n\nAn owner must unlock it to allow modification.";
} else {
sPrompt = "\nChange the position, rotation and size of your "+CTYPE+".\n\nwww.opencollar.at/appearance";
lMyButtons = [POSMENU, ROTMENU, SIZEMENU]; //["Position", "Rotation", "Size"];
}
key kMenuID = Dialog(kAv, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
integer iMenuIndex = llListFindList(g_lMenuIDs, [kAv]);
list lAddMe = [kAv, kMenuID, g_sSubMenu];
if (iMenuIndex == -1) g_lMenuIDs += lAddMe;
else g_lMenuIDs = llListReplaceList(g_lMenuIDs, lAddMe, iMenuIndex, iMenuIndex + g_iMenuStride - 1);
}
UserCommand(integer iNum, string sStr, key kID) {
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
string sValue = llToLower(llList2String(lParams, 1));
if (sCommand == "menu" && llGetSubString(sStr, 5, -1) == g_sSubMenu)
{
//someone asked for our menu
//give this plugin's menu to id
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the "+CTYPE+"'s appearance.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu " + g_sParentMenu, kID);
}
else DoMenu(kID, iNum);
} else if (sCommand=="lockappearance") {
g_iAppLock=(integer)sValue;
} else if (sStr == "appearance")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the "+CTYPE+"'s appearance.", FALSE);
}
else DoMenu(kID, iNum);
}
else if (sStr == "rotation")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the "+CTYPE+"'s rotation.", FALSE);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the "+CTYPE+" is locked. You cannot access this menu now!", FALSE);
DoMenu(kID, iNum);
}
else RotMenu(kID, iNum);
}
else if (sStr == "position")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the "+CTYPE+"'s position.", FALSE);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the "+CTYPE+" is locked. You cannot access this menu now!", FALSE);
DoMenu(kID, iNum);
}
else PosMenu(kID, iNum);
}
else if (sStr == "size")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the "+CTYPE+"'s size.", FALSE);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the "+CTYPE+" is locked. You cannot access this menu now!", FALSE);
DoMenu(kID, iNum);
}
else SizeMenu(kID, iNum);
}
}
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
g_fRotNudge = PI / 32.0;//have to do this here since we can't divide in a global var declaration
Store_StartScaleLoop();
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)
{
UserCommand( iNum, sStr, kID);
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == "Appearance_Lock") g_iAppLock = (integer)sValue;
}
else if (iNum == DIALOG_RESPONSE)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
string sMenuType = llList2String(g_lMenuIDs, iMenuIndex + 1);
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenuType == g_sSubMenu)
{
if (sMessage == UPMENU) llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
else if (sMessage == POSMENU) PosMenu(kAv, iAuth);
else if (sMessage == ROTMENU) RotMenu(kAv, iAuth);
else if (sMessage == SIZEMENU) SizeMenu(kAv, iAuth);
}
else if (sMenuType == POSMENU)
{
if (sMessage == UPMENU)
{
DoMenu(kAv, iAuth);
return;
}
else if (llGetAttached())
{
if (sMessage == "forward ↳") AdjustPos(<g_fNudge, 0, 0>);
else if (sMessage == "left ←") AdjustPos(<0, g_fNudge, 0>);
else if (sMessage == "up ↑") AdjustPos(<0, 0, g_fNudge>);
else if (sMessage == "backward ↲") AdjustPos(<-g_fNudge, 0, 0>);
else if (sMessage == "right →") AdjustPos(<0, -g_fNudge, 0>);
else if (sMessage == "down ↓") AdjustPos(<0, 0, -g_fNudge>);
else if (sMessage == "▸") g_fNudge=g_fSmallNudge;
else if (sMessage == "▸▸") g_fNudge=g_fMediumNudge;
else if (sMessage == "▸▸▸") g_fNudge=g_fLargeNudge;
}
else Notify(kAv, "Sorry, position can only be adjusted while worn",FALSE);
PosMenu(kAv, iAuth);
}
else if (sMenuType == ROTMENU)
{
if (sMessage == UPMENU)
{
DoMenu(kAv, iAuth);
return;
}
else if (llGetAttached())
{
if (sMessage == "tilt right ↘") AdjustRot(<g_fRotNudge, 0, 0>);
else if (sMessage == "tilt up ↻") AdjustRot(<0, g_fRotNudge, 0>);
else if (sMessage == "left ↶") AdjustRot(<0, 0, g_fRotNudge>);
else if (sMessage == "right ↷") AdjustRot(<0, 0, -g_fRotNudge>);
else if (sMessage == "tilt left ↙") AdjustRot(<-g_fRotNudge, 0, 0>);
else if (sMessage == "tilt down ↺") AdjustRot(<0, -g_fRotNudge, 0>);
}
else Notify(kAv, "Sorry, position can only be adjusted while worn", FALSE);
RotMenu(kAv, iAuth);
}
else if (sMenuType == SIZEMENU)
{
if (sMessage == UPMENU)
{
DoMenu(kAv, iAuth);
return;
}
else
{
integer iMenuCommand = llListFindList(SIZEMENU_BUTTONS, [sMessage]);
if (iMenuCommand != -1)
{
integer iSizeFactor = llList2Integer(g_lSizeFactors, iMenuCommand);
if (iSizeFactor == -1000)
{
// ResSize requested
if (g_iScaleFactor == 100)
{
Notify(kAv, "Resizing canceled; the "+CTYPE+" is already at original size.", FALSE);
}
else
{
ScalePrimLoop(100, TRUE, kAv);
}
}
else
{
ScalePrimLoop(g_iScaleFactor + iSizeFactor, FALSE, kAv);
}
}
SizeMenu(kAv, iAuth);
}
}
}
}
else if (iNum == DIALOG_TIMEOUT)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
}
}
timer()
{
// the timer is needed as the changed_size even is triggered twice
llSetTimerEvent(0);
if (g_iSizedByScript)
g_iSizedByScript = FALSE;
}
changed(integer iChange)
{
if (iChange & (CHANGED_SCALE))
{
if (g_iSizedByScript)
// the item had ben rescaled by the script, do NOT reset the script and store new positions
{
// ignore the event and trigger timer to reset flag. needed as we got the event twice after scaling
llSetTimerEvent(0.5);
}
else
// it was a user change, so we have to store the basic values again
{
Store_StartScaleLoop();
}
}
if (iChange & (CHANGED_SHAPE | CHANGED_LINK))
{
Store_StartScaleLoop();
}
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

662
LSL/OpenCollar - anim.lsl Normal file
View File

@@ -0,0 +1,662 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - anim //
// version 3.990 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//needs to handle anim requests from sister scripts as well
//this script as essentially two layers
//lower layer: coordinate animation requests that come in on link messages. keep a list of playing anims disable AO when needed
//upper layer: use the link message anim api to provide a pose menu
list g_lAnims; //list of queued anims
list g_lPoseList; //list of standard poses to use in the menu
integer g_iNumberOfAnims; //we store this to avoid running createanimlist() every time inventory is changed...
//PoseMove tweak stuff
integer g_iTweakPoseAO = 0; //Disable/Enable AO for posed animations - set it to 1 to default PoseMove tweak to ON
string g_sPoseMoveWalk; //Variable to hold our current Walk animation
string g_sPoseMoveRun; //Variable to hold our run animation
string g_sWalkButtonPrefix = ""; //This can be changed to prefix walks in the PoseMove menu
list g_lPoseMoveAnimationPrefix = ["~walk_","~run_"];
//for the height scaling feature
key g_kDataID; //uuid of notecard read request
integer g_iLine = 0; //records progress through notecard
list g_lAnimScalars; //a 3-strided list in form animname,scalar,delay
integer g_iAdjustment = 0; //heightfix on/off
string g_sCurrentPose = "";
integer g_iLastRank = 0; //in this integer, save the rank of the person who posed the av, according to message map. 0 means unposed
integer g_iLastPostureRank = 504;
integer g_iLastPoselockRank = 504;
list g_lAnimButtons; // initialized in state_entry for OpenSim compatibility (= ["Pose", "AO Menu", g_sGiveAO, "AO ON", "AO OFF"];)
integer g_iAnimLock = FALSE; //animlock on/off
integer g_iPosture; //posture lock on/off
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_SAFEWORD = 510;
//EXTERNAL MESSAGE MAP
integer EXT_COMMAND_COLLAR = 499; //added for collar or cuff commands to put ao to pause or standOff
integer LM_SETTING_SAVE = 2000; //scripts send messages on this channel to have settings saved to httpdb
integer LM_SETTING_RESPONSE = 2002; //the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003; //delete token from DB
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer ANIM_START = 7000;
integer ANIM_STOP = 7001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer g_iAOChannel = -782690;
integer g_iInterfaceChannel = -12587429;
key g_kWearer;
string WEARERNAME;
list g_lMenuIDs; //three strided list of avkey, dialogid, and menuname
integer g_iMenuStride = 3;
integer g_iHeightFix = TRUE; //stores setting for should we use heightfix or not
list g_lHeightFixAnims; //stores a list of all of the heighfix anims installed in the collar
integer g_iMaxHeightAdjust; //largest height fix anim
integer g_iMinHeightAdjust; //smallest height fix anim
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Dialog(key kID, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string sName) {
key kMenuID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kID + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kMenuID);
integer iIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iIndex) g_lMenuIDs = llListReplaceList(g_lMenuIDs, [kID, kMenuID, sName], iIndex, iIndex + g_iMenuStride - 1); //we've alread given a menu to this user. overwrite their entry
else g_lMenuIDs += [kID, kMenuID, sName]; //we've not already given this user a menu. append to list
//Debug("Made "+sName+" menu.");
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
AnimMenu(key kID, integer iAuth) {
string sPrompt = WEARERNAME;
list lButtons;
if (g_iAnimLock) {
sPrompt += " is forbidden to change or stop poses on their own";
lButtons = ["☒ AnimLock"];
} else {
sPrompt += " is allowed to change or stop poses on their own";
lButtons = ["☐ AnimLock"];
}
if (llGetInventoryType("~stiff")==INVENTORY_ANIMATION) {
if (g_iPosture) {
sPrompt +=" and has their neck forced stiff.";
lButtons += ["☒ Posture"];
} else {
sPrompt +=" and can relax their neck.";
lButtons += ["☐ Posture"];
}
}
if (g_iTweakPoseAO) lButtons += ["☒ AntiSlide"];
else lButtons += ["☐ AntiSlide"];
lButtons += ["AO Menu", "AO ON", "AO OFF", "Pose"];
sPrompt +="\n\nwww.opencollar.at/animations";
Dialog(kID, sPrompt, lButtons+g_lAnimButtons, ["BACK"], 0, iAuth, "Anim");
}
PoseMenu(key kID, integer iPage, integer iAuth) { //create a list
string sPrompt = "\nChoose a pose to play.\n\nwww.opencollar.at/animations\n\nCurrent Pose is ";
if (g_sCurrentPose == "")sPrompt += "None\n";
else sPrompt += g_sCurrentPose +"\n";
string sHeightFixButton= "☐ HeightFix";
if (g_iHeightFix) sHeightFixButton = "☒ HeightFix";
list lUtilityButtons=["STOP", "BACK"];
if (g_iHeightFix) lUtilityButtons=["↑","↓"]+lUtilityButtons;
Dialog(kID, sPrompt, [sHeightFixButton]+g_lPoseList, lUtilityButtons, iPage, iAuth, "Pose");
}
PoseMoveMenu(key kID, integer iPage, integer iAuth) {
string sPrompt = "\nChoose a pose to play.\n\nwww.opencollar.at/animations\n\n";
list lButtons;
if (g_iTweakPoseAO) {
sPrompt += "\nThe AntiSlide tweak is enabled.";
lButtons += ["OFF"];
} else {
sPrompt += "\nThe AntiSlide tweak is disabled.";
lButtons += ["ON"];
}
if (g_sPoseMoveWalk != "") {
if (g_iTweakPoseAO) {
sPrompt += "\n\nSelected Walk: "+g_sPoseMoveWalk;
if (llGetInventoryKey(g_sPoseMoveRun)) sPrompt += "\nSelected Run: "+g_sPoseMoveRun;
else sPrompt += "\nSelected Run: ~run";
}
lButtons += ["☐ none"];
} else {
sPrompt += "\n\nAntiSlide is not overriding any walk animations.";
lButtons += ["☒ none"];
}
integer i = 0;
integer iAnims = llGetInventoryNumber(INVENTORY_ANIMATION) - 1;
string sAnim;
for (i=0;i<=iAnims;++i) {
sAnim = llGetInventoryName(INVENTORY_ANIMATION,i);
if (llSubStringIndex(sAnim,llList2String(g_lPoseMoveAnimationPrefix,0)) == 0 ) {
if (sAnim == g_sPoseMoveWalk) lButtons += ["☒ " + g_sWalkButtonPrefix+ llGetSubString(sAnim,llStringLength(llList2String(g_lPoseMoveAnimationPrefix,0)),-1)];
else lButtons += ["☐ " +g_sWalkButtonPrefix+ llGetSubString(sAnim,llStringLength(llList2String(g_lPoseMoveAnimationPrefix,0)),-1)];
}
}
Dialog(kID, sPrompt, lButtons, ["BACK"], 0, iAuth, "AntiSlide");
}
AOMenu(key kID, integer iAuth) { // wrapper to send menu back to the AO's menu
llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarCommand|" + (string)iAuth + "|ZHAO_MENU|" + (string)kID);
llRegionSayTo(g_kWearer,g_iAOChannel, "ZHAO_MENU|" + (string)kID);
}
integer SetPosture(integer iOn, key kCommander) {
if (llGetInventoryType("~stiff")!=INVENTORY_ANIMATION) return FALSE;
if (llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) {
if (iOn && !g_iPosture) {
llStartAnimation("~stiff");
if (kCommander) Notify(kCommander,"Posture override active.",TRUE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "anim_posture=1","");
} else if (!iOn) {
llStopAnimation("~stiff");
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_posture", "");
}
g_iPosture=iOn;
return TRUE;
} else {
llOwnerSay("Error: Somehow I lost permission to animate you. Try taking me off and re-attaching me.");
return FALSE;
}
}
RefreshAnim() { //g_lAnims can get lost on TP, so re-play g_lAnims[0] here, and call this function in "changed" event on TP
if (llGetListLength(g_lAnims)) {
if (g_iPosture) llStartAnimation("~stiff");
if (llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) {
string sAnim = llList2String(g_lAnims, 0);
if (llGetInventoryType(sAnim) == INVENTORY_ANIMATION) StartAnim(sAnim); //get and stop currently playing anim
} else llOwnerSay( "Error: Somehow I lost permission to animate you. Try taking me off and re-attaching me.");
}
}
StartAnim(string sAnim) { //adds anim to queue, calls PlayAnim to play it, and calls AO as necessary
if (llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) {
if (llGetInventoryType(sAnim) == INVENTORY_ANIMATION) {
//stop currently playing anim
if (llGetListLength(g_lAnims)) UnPlayAnim(llList2String(g_lAnims, 0));
//add new anim to list
g_lAnims = [sAnim] + g_lAnims; //this way, g_lAnims[0] is always the currently playing anim
//play new anim
PlayAnim(sAnim);
//switch off AO
llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarComand|" + (string)EXT_COMMAND_COLLAR + "|ZHAO_STANDOFF");
llRegionSayTo(g_kWearer,g_iAOChannel, "ZHAO_STANDOFF");
}
} else llOwnerSay( "Error: Somehow I lost permission to animate you. Try taking me off and re-attaching me.");
}
PlayAnim(string sAnim){ //plays anim and heightfix, depending on methods configured for each
//play anim
llStartAnimation(sAnim);
//play heightfix
if (g_iHeightFix) {
integer iIndex = llListFindList(g_lAnimScalars, [sAnim]);
if (~iIndex) { //we just started playing an anim in our g_lAnimScalars list
llSleep((float)llList2String(g_lAnimScalars, iIndex + 2)); //pause to give certain anims time to ease in
vector vAvScale = llGetAgentSize(g_kWearer);
float fScalar = (float)llList2String(g_lAnimScalars, iIndex + 1);
g_iAdjustment = llRound(vAvScale.z * fScalar);
if (g_iAdjustment > g_iMaxHeightAdjust) g_iAdjustment = g_iMaxHeightAdjust;
else if (g_iAdjustment < g_iMinHeightAdjust) g_iAdjustment = g_iMinHeightAdjust;
llStartAnimation("~" + (string)g_iAdjustment);
}
}
}
StopAnim(string sAnim) { //deals with removing anim from queue, calls UnPlayAnim to stop it, calls AO as nexessary
if (llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) {
if (llGetInventoryType(sAnim) == INVENTORY_ANIMATION) {
//remove all instances of stopped anim from the queue
while(~llListFindList(g_lAnims,[sAnim])){
integer n=llListFindList(g_lAnims,[sAnim]);
g_lAnims=llDeleteSubList(g_lAnims, n, n);
}
//stop the pose
UnPlayAnim(sAnim);
//play the new g_lAnims[0]. If anim list is empty, turn AO back on
if (llGetListLength(g_lAnims)) PlayAnim(llList2String(g_lAnims, 0));
else {
llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarComand|" + (string)EXT_COMMAND_COLLAR + "|ZHAO_STANDON");
llRegionSayTo(g_kWearer,g_iAOChannel, "ZHAO_STANDON");
}
}
} else llOwnerSay( "Error: Somehow I lost permission to animate you. Try taking me off and re-attaching me.");
}
UnPlayAnim(string sAnim){ //stops anim and heightfix, depending on methods configured for each
//stop the pose
llStopAnimation(sAnim);
//stop any currently-playing height adjustment
if (g_iAdjustment) {
llStopAnimation("~" + (string)g_iAdjustment);
g_iAdjustment = 0;
}
}
CreateAnimList() {
g_lPoseList=[];
g_lHeightFixAnims=[];
g_iNumberOfAnims=llGetInventoryNumber(INVENTORY_ANIMATION);
integer iNumberOfAnims = g_iNumberOfAnims;
while (iNumberOfAnims--) {
string sName=llGetInventoryName(INVENTORY_ANIMATION, iNumberOfAnims);
if (sName != "" && llGetSubString(sName, 0, 0) != "~") g_lPoseList+=[sName]; //check here if the anim start with ~ or for some reason does not get a name returned (spares to check that all again in the menu ;)
if (llSubStringIndex(sName,"~")==0 && llStringLength(sName)==4) {
sName=llGetSubString(sName,1,3);
if ((integer)sName != 0) g_lHeightFixAnims += sName;
}
}
g_lHeightFixAnims=llListSort(g_lHeightFixAnims,1,1);
g_iMaxHeightAdjust=llList2Integer(g_lHeightFixAnims,0);
g_iMinHeightAdjust=llList2Integer(g_lHeightFixAnims,-1);
}
AdjustOffset(integer direction) {
if (llGetListLength(g_lAnims)>0) { //first, check we're running an anim
//get sleep time from list
string sNewAnim = llList2String(g_lAnims, 0);
integer iIndex = llListFindList(g_lAnimScalars, [sNewAnim]);
string sleepTime="2.0";
if (iIndex != -1) {
sleepTime=llList2String(g_lAnimScalars, iIndex + 2);
g_lAnimScalars=llDeleteSubList(g_lAnimScalars,iIndex,iIndex+2); //we re-write it at the end
}
//stop last adjustment anim and play next one
integer iOldAdjustment=g_iAdjustment;
if (g_iAdjustment) {
g_iAdjustment+=direction;
while (g_iAdjustment > g_iMinHeightAdjust && g_iAdjustment < g_iMaxHeightAdjust && !~llListFindList(g_lHeightFixAnims,[(string)g_iAdjustment])) {
//Debug("Re-adjust "+(string)g_iAdjustment);
g_iAdjustment+=direction;
}
if (g_iAdjustment > g_iMaxHeightAdjust) {
g_iAdjustment = 0;
llOwnerSay(sNewAnim+" height fix cancelled");
} else if (g_iAdjustment < g_iMinHeightAdjust) g_iAdjustment = g_iMinHeightAdjust;
} else if (direction == -1) g_iAdjustment=g_iMaxHeightAdjust;
if (g_iAdjustment != 0) {
llStartAnimation("~" + (string)g_iAdjustment);
//now calculate the new offset for notecard dump print
vector avscale = llGetAgentSize(g_kWearer);
float test = (float)g_iAdjustment/avscale.z;
llOwnerSay(sNewAnim+"|"+(string)test+"|"+sleepTime);
//and store it
g_lAnimScalars+=[sNewAnim,test,sleepTime];
}
if (iOldAdjustment && iOldAdjustment != g_iAdjustment) {
llStopAnimation("~" + (string)iOldAdjustment);
}
}
}
UserCommand(integer iNum, string sStr, key kID) {
if (iNum == COMMAND_EVERYONE) return; // No command for people with no privilege in this plugin.
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
string sValue = llToLower(llList2String(lParams, 1));
if (sCommand == "menu") {
string sSubmenu = llGetSubString(sStr, 5, -1);
if (sSubmenu == "Pose") PoseMenu(kID, 0, iNum);
else if (sSubmenu == "AntiSlide") PoseMoveMenu(kID,0,iNum);
else if (sSubmenu == "AO") AOMenu(kID, iNum);
else if (sSubmenu == "Animations") AnimMenu(kID, iNum);
} else if (sStr == "release" || sStr == "stop") { //only release if person giving command outranks person who posed us
if (iNum <= g_iLastRank || !g_iAnimLock) {
g_iLastRank = 0;
llMessageLinked(LINK_SET, ANIM_STOP, g_sCurrentPose, "");
g_sCurrentPose = "";
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_currentpose", "");
}
} else if (sStr == "animations") AnimMenu(kID, iNum); //give menu
else if (sStr == "pose") PoseMenu(kID, 0, iNum); //pose menu
else if (sStr == "runaway" && (iNum == COMMAND_OWNER || iNum == COMMAND_WEARER)) { //stop pose on runaway
if (g_sCurrentPose != "") StopAnim(g_sCurrentPose);
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_currentpose", "");
llResetScript();
} else if ( sCommand=="posture") { //posture
if ( sValue=="on") { //posture
if (iNum<=COMMAND_WEARER) {
g_iLastPostureRank=iNum;
SetPosture(TRUE,kID);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "anim_PostureRank="+(string)g_iLastPostureRank,"");
llOwnerSay( "Your neck is locked in place.");
if (kID != g_kWearer) Notify(kID, WEARERNAME + "'s neck is locked in place.", FALSE);
} else Notify(kID,"Only owners can do that, sorry.",FALSE);
} else if ( sValue=="off") {
if (iNum<=g_iLastPostureRank) {
g_iLastPostureRank=COMMAND_WEARER;
SetPosture(FALSE,kID);
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_PostureRank", "");
llOwnerSay( "You can move your neck again.");
if (kID != g_kWearer) Notify(kID, WEARERNAME + " is free to move their neck.", FALSE);
} else Notify(kID,"Someone more important locked "+WEARERNAME+"'s neck in this position",FALSE);
}
} else if ( sCommand=="animlock") { //anim lock
if ( sValue=="on") { //anim lock
if (iNum<=COMMAND_WEARER) {
g_iLastPoselockRank=iNum;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "anim_PoselockRank="+(string)g_iLastPoselockRank,"");
g_iAnimLock = TRUE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "anim_animlock=1", "");
llOwnerSay( "Only owners can change or stop your poses now.");
if (kID != g_kWearer) Notify(kID, WEARERNAME + " can have their poses changed or stopped only by owners.", FALSE);
} else Notify(kID,"You don't have permission to lock "+WEARERNAME+" in this position",FALSE);
} else if ( sValue=="off") {
if (iNum<=g_iLastPoselockRank) {
g_iAnimLock = FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_animlock", "");
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_PoselockRank", "");
llOwnerSay( "You are now free to change or stop poses on your own.");
if (kID != g_kWearer) Notify(kID, WEARERNAME + " is free to change or stop poses on their own.", FALSE);
} else Notify(kID,"Someone more important locked "+WEARERNAME+" in this position",FALSE);
}
} else if ( sCommand=="heightfix") { //heightfix
if ((iNum == COMMAND_OWNER)||(kID == g_kWearer)) {
if (sValue=="on"){
g_iHeightFix = TRUE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_HFix", "");
} else if (sValue=="off"){
g_iHeightFix = FALSE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "anim_HFix=0", "");
}
Notify(kID, "HeightFix override "+sValue+".", TRUE);
if (g_sCurrentPose != "") {
StopAnim(g_sCurrentPose);
StartAnim(g_sCurrentPose);
}
} else Notify(kID,"Only owners or the wearer can change HeightFix settings.",FALSE);
} else if (sCommand == "ao") { //AO
if (sValue == "" || sValue == "menu") AOMenu(kID, iNum);
else if (sValue == "off") {
llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarCommand|" + (string)iNum + "|ZHAO_AOOFF|" + (string)kID);
llRegionSayTo(g_kWearer,g_iAOChannel,"ZHAO_AOOFF");
} else if (sValue == "on") {
llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarCommand|" + (string)iNum + "|ZHAO_AOON|" + (string)kID);
llRegionSayTo(g_kWearer,g_iAOChannel,"ZHAO_AOON");
} else if (sValue == "lock") llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarCommand|" + (string)iNum + "|ZHAO_LOCK|" + (string)kID);
else if (sValue == "unlock") llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarCommand|" + (string)iNum + "|ZHAO_UNLOCK|" + (string)kID);
else if (sValue == "hide") llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarCommand|" + (string)iNum + "|ZHAO_AOHIDE|" + (string)kID);
else if (sValue == "show") llRegionSayTo(g_kWearer,g_iInterfaceChannel, "CollarCommand|" + (string)iNum + "|ZHAO_AOSHOW|" + (string)kID);
} else if (sCommand == "antislide") { //check for text command of PoseMoveMenu's string
if ((iNum == COMMAND_OWNER)||(kID == g_kWearer)) {
string sValueNotLower = llList2String(lParams, 1);
if (sValue == "on") {
g_iTweakPoseAO = 1;
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, "anim_TweakPoseAO=1" , "");
RefreshAnim();
Notify(kID, "AntiSlide is now enabled.", TRUE);
} else if (sValue == "off") {
g_iTweakPoseAO = 0;
llMessageLinked(LINK_THIS, LM_SETTING_DELETE, "anim_TweakPoseAO", "");
RefreshAnim();
Notify(kID, "AntiSlide is now disabled.", TRUE);
} else if (sValue == "none") {
llMessageLinked(LINK_THIS, LM_SETTING_DELETE, "anim_PoseMoveWalk", "");
g_sPoseMoveWalk = "";
g_sPoseMoveRun = "";
RefreshAnim();
Notify(kID, "AntiSlide animation is \"none\".", TRUE);
} else if (llGetInventoryType(llList2String(g_lPoseMoveAnimationPrefix,0)+sValueNotLower)==INVENTORY_ANIMATION) {
g_sPoseMoveWalk = llList2String(g_lPoseMoveAnimationPrefix,0) + sValueNotLower;
g_sPoseMoveRun = llList2String(g_lPoseMoveAnimationPrefix,1) + sValueNotLower;
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, "anim_PoseMoveWalk=" + g_sPoseMoveWalk, "");
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, "anim_PoseMoveRun=" + g_sPoseMoveRun, "");
RefreshAnim();
Notify(kID, "AntiSlide animation is \""+sValueNotLower+"\".", TRUE);
} else if (sValue=="") PoseMoveMenu(kID,0,iNum);
else Notify(kID,"Can't find animation "+llList2String(g_lPoseMoveAnimationPrefix,0)+sValueNotLower,FALSE);
} else llOwnerSay( "Only owners or the wearer can change antislide settings.");
} else if (llGetInventoryType(sStr) == INVENTORY_ANIMATION) { //strike a pose...
if (iNum <= g_iLastRank || !g_iAnimLock || g_sCurrentPose == "") {
if (g_sCurrentPose != "") llMessageLinked(LINK_SET, ANIM_STOP, g_sCurrentPose, "");
g_sCurrentPose = sStr;
g_iLastRank = iNum;
llMessageLinked(LINK_SET, ANIM_START, g_sCurrentPose, "");
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "anim_currentpose=" + g_sCurrentPose + "," + (string)g_iLastRank, "");
} else Notify(kID, "Someone more important has locked "+WEARERNAME+" in this position.",FALSE);
}
}
default {
on_rez(integer iNum) {
if (llGetOwner() != g_kWearer) llResetScript();
//if (llGetAttached()) llRequestPermissions(g_kWearer, PERMISSION_TRIGGER_ANIMATION | PERMISSION_OVERRIDE_ANIMATIONS );
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
g_iInterfaceChannel = (integer)("0x" + llGetSubString(g_kWearer,30,-1));
if (g_iInterfaceChannel > 0) g_iInterfaceChannel = -g_iInterfaceChannel;
if (llGetAttached()) llRequestPermissions(g_kWearer, PERMISSION_TRIGGER_ANIMATION);
CreateAnimList();
if (llGetInventoryKey("~heightscalars")) g_kDataID = llGetNotecardLine("~heightscalars", g_iLine); //start reading the ~heightscalars notecard
//Debug("Starting");
}
dataserver(key kID, string sData) {
if (kID == g_kDataID) {
if (sData != EOF) {
g_lAnimScalars += llParseString2List(sData, ["|"], []);
g_kDataID = llGetNotecardLine("~heightscalars", ++g_iLine);
}
//else Debug("Notecard read complete");
}
}
run_time_permissions(integer iPerm) {
if (iPerm & PERMISSION_TRIGGER_ANIMATION) {
if (g_iPosture) llStartAnimation("~stiff");
}
}
attach(key kID) {
if (kID == NULL_KEY) { //we were just detached. clear the anim list and tell the ao to play stands again.
llRegionSayTo(g_kWearer,g_iInterfaceChannel, (string)EXT_COMMAND_COLLAR + "|ZHAO_STANDON");
llRegionSayTo(g_kWearer,g_iAOChannel, "ZHAO_STANDON");
g_lAnims = [];
}
else llRequestPermissions(g_kWearer, PERMISSION_TRIGGER_ANIMATION);
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
if (iNum <= COMMAND_EVERYONE && iNum >= COMMAND_OWNER) UserCommand(iNum, sStr, kID);
else if (iNum == ANIM_START) StartAnim(sStr);
else if (iNum == ANIM_STOP) StopAnim(sStr);
else if (iNum == MENUNAME_REQUEST && sStr == "Main") {
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, "Main|Animations", ""); //no need for fixed main menu
llMessageLinked(LINK_SET, MENUNAME_REQUEST, "Animations", "");
} else if (iNum == MENUNAME_RESPONSE) {
if (llSubStringIndex(sStr, "Animations|")==0) { //if sStr starts with "Animations|"
string child = llList2String(llParseString2List(sStr, ["|"], []), 1);
if (llListFindList(g_lAnimButtons, [child]) == -1) g_lAnimButtons += [child];
}
} else if (iNum == COMMAND_SAFEWORD) { // saefword command recieved, release animation
if (llGetInventoryType(g_sCurrentPose) == INVENTORY_ANIMATION) {
g_iLastRank = 0;
llMessageLinked(LINK_SET, ANIM_STOP, g_sCurrentPose, "");
g_iAnimLock = FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "anim_animlock", "");
g_sCurrentPose = "";
}
} else if (iNum == LM_SETTING_RESPONSE) {
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == "anim_") {
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "currentpose") {
list lAnimParams = llParseString2List(sValue, [","], []);
g_sCurrentPose = llList2String(lAnimParams, 0);
g_iLastRank = (integer)llList2String(lAnimParams, 1);
llMessageLinked(LINK_SET, ANIM_START, g_sCurrentPose, "");
} else if (sToken == "animlock") g_iAnimLock = (integer)sValue;
else if (sToken =="posture") SetPosture((integer)sValue,NULL_KEY);
else if (sToken == "PoseMoveWalk") g_sPoseMoveWalk = sValue;
else if (sToken == "PoseMoveRun") g_sPoseMoveRun = sValue;
else if (sToken == "TweakPoseAO") g_iTweakPoseAO = (integer)sValue;
else if (sToken == "PostureRank") g_iLastPostureRank= (integer)sValue;
else if (sToken == "PoselockRank") g_iLastPoselockRank= (integer)sValue;
else if (sToken == "TweakPoseAO") g_iTweakPoseAO = (integer)sValue;
else if (sToken == "HFix") g_iHeightFix = (integer)sValue;
} else if (sToken == "Global_WearerName") WEARERNAME = sValue;
} else if (iNum == DIALOG_RESPONSE) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex) { //got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = llList2Integer(lMenuParams, 3);
string sMenuType = llList2String(g_lMenuIDs, iMenuIndex + 1);
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenuType == "Anim") {
//Debug("Got message "+sMessage);
if (sMessage == "BACK") llMessageLinked(LINK_SET, iAuth, "menu Main", kAv);
else if (sMessage == "Pose") PoseMenu(kAv, 0, iAuth);
else if (llGetSubString(sMessage, 2, -1) == "AntiSlide") PoseMoveMenu(kAv,iNum,iAuth); //This is the Animation menu item, we need to call the PoseMoveMenu item from here...
else if (~llListFindList(g_lAnimButtons, [sMessage])) llMessageLinked(LINK_SET, iAuth, "menu " + sMessage, kAv); // SA: can be child scripts menus, not handled in UserCommand()
else if (sMessage == "AO Menu") {
Notify(kAv, "Attempting to trigger the AO menu. This will only work if " + WEARERNAME + " is using a Submissive AO or an AO Link script in their normal AO.", FALSE);
AOMenu(kAv, iAuth);
} else {
if (sMessage== "☐ AnimLock") UserCommand(iAuth, "animlock on", kAv);
else if (sMessage== "☒ AnimLock") UserCommand(iAuth, "animlock off", kAv);
else if (sMessage== "☐ Posture") UserCommand(iAuth, "posture on", kAv);
else if (sMessage== "☒ Posture") UserCommand(iAuth, "posture off", kAv);
else UserCommand(iAuth, sMessage, kAv);
AnimMenu(kAv, iAuth);
}
} else if (sMenuType == "Pose") {
if (sMessage == "BACK") AnimMenu(kAv, iAuth); //return on parent menu, so the animmenu below doesn't come up
else {
if (sMessage == "STOP") UserCommand(iAuth, "release", kAv);
else if (sMessage == "↑") AdjustOffset(1);
else if (sMessage == "↓") AdjustOffset(-1);
else if (sMessage == "☒ HeightFix") UserCommand(iAuth, "heightfix off", kAv);
else if (sMessage == "☐ HeightFix") UserCommand(iAuth, "heightfix on", kAv);
else UserCommand(iAuth, sMessage, kAv); //got pose name
PoseMenu(kAv, iPage, iAuth);
}
} else if (sMenuType == "AntiSlide") {
if (sMessage == "BACK") AnimMenu(kAv, iAuth); //return on parent menu, so the animmenu below doesn't come up
else {
if (sMessage == "ON") UserCommand(iAuth, "antislide on", kAv);
else if (sMessage == "OFF") UserCommand(iAuth, "antislide off", kAv);
else if (llGetSubString(sMessage,2,-1) == "none" ) UserCommand(iAuth, "antislide none", kAv);
else if (llGetInventoryType(llList2String(g_lPoseMoveAnimationPrefix,0)+llGetSubString(sMessage,2+llStringLength(g_sWalkButtonPrefix),-1))==INVENTORY_ANIMATION) UserCommand(iAuth, "antislide "+llGetSubString(sMessage,2+llStringLength(g_sWalkButtonPrefix),-1), kAv);
PoseMoveMenu(kAv,iNum,iAuth);
}
}
}
}
}
changed(integer iChange) {
if (iChange & CHANGED_OWNER) llResetScript();
if (iChange & CHANGED_TELEPORT) RefreshAnim();
if (iChange & CHANGED_INVENTORY) { //start re-reading the ~heightscalars notecard
g_lAnimScalars = [];
g_iLine = 0;
if (llGetInventoryKey("~heightscalars")) g_kDataID = llGetNotecardLine("~heightscalars", g_iLine);
if (g_iNumberOfAnims!=llGetInventoryNumber(INVENTORY_ANIMATION)) CreateAnimList();
}
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

929
LSL/OpenCollar - auth.lsl Normal file
View File

@@ -0,0 +1,929 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - auth //
// version 3.994 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
key g_kWearer;
list g_lOwners;//strided list in form key,name
list g_lSecOwners;//strided list in the form key,name
list g_lBlackList;//list of blacklisted UUID
list g_lTempOwners;//list of temp owners UUID. Temp owner is just like normal owner, but can't add new owners.
key g_kGroup = "";
string g_sGroupName;
integer g_iGroupEnabled = FALSE;
string g_sParentMenu = "Main";
string g_sSubMenu = "Access";
integer g_iRunawayDisable=0;
string g_sPrefix;
list g_lQueryId; //5 strided list of dataserver/http request: key, uuid, requestType, kAv, remenu. For AV name/group name lookups
integer g_iQueryStride=5;
//added for attachment auth
integer g_iInterfaceChannel;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510; // new for safeword
integer COMMAND_BLACKLIST = 520;
// added so when the sub is locked out they can use postions
integer COMMAND_WEARERLOCKEDOUT = 521;
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
//integer MENUNAME_REQUEST = 3000;
//integer MENUNAME_RESPONSE = 3001;
//integer MENUNAME_REMOVE = 3003;
//integer RLV_CMD = 6000;
//integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
//integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
//integer ANIM_START = 7000;//send this with the name of an anim in the string part of the message to play the anim
//integer ANIM_STOP = 7001;//send this with the name of an anim in the string part of the message to stop the anim
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer FIND_AGENT = -9005;
//added for attachment auth (garvin)
integer ATTACHMENT_REQUEST = 600;
integer ATTACHMENT_RESPONSE = 601;
//new evolution style to handle attachment auth
integer INTERFACE_REQUEST = -9006;
integer INTERFACE_RESPONSE = -9007;
//this can change
integer WEARERLOCKOUT=620;
string UPMENU = "BACK";
string CTYPE = "collar";
integer g_iOpenAccess; // 0: disabled, 1: openaccess
integer g_iLimitRange=1; // 0: disabled, 1: limited
integer g_iWearerlocksOut;
list g_lMenuIDs;
integer g_iMenuStride = 3;
key REQUEST_KEY;
string g_sScript;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Dialog(key kID, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string sName) {
key kMenuID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kID + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kMenuID);
integer iIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iIndex) g_lMenuIDs = llListReplaceList(g_lMenuIDs, [kID, kMenuID, sName], iIndex, iIndex + g_iMenuStride - 1);
else g_lMenuIDs += [kID, kMenuID, sName];
//Debug("Made "+sName+" menu.");
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
FetchAvi(integer iAuth, string type, string name, key kAv) {
if (name == "") name = " ";
string out = llDumpList2String(["getavi_", g_sScript, kAv, iAuth, type, name], "|");
integer i = 0;
list src = g_lOwners;
if (type == "tempowner") src += g_lTempOwners;
if (type == "secowner") src += g_lSecOwners;
else if (type == "blacklist") src = g_lBlackList;
list exclude; // build list of existing-listed keys to exclude from name search
for (; i < llGetListLength(src); i += 2)
{
exclude += [llList2String(src, i)];
}
if (llGetListLength(exclude))
out += "|" + llDumpList2String(exclude, ",");
REQUEST_KEY = llGenerateKey();
llMessageLinked(LINK_THIS, FIND_AGENT, out, REQUEST_KEY);
}
AuthMenu(key kAv, integer iAuth) {
string sPrompt = "\nOpen the pod bay doors, "+CTYPE+".\n\nwww.opencollar.at/access";
list lButtons = ["+ Owner", "+ Secowner", "+ Blacklisted", " Owner", " Secowner", " Blacklisted"];
if (g_kGroup=="") lButtons += ["Group ☐"]; //set group
else lButtons += ["Group ☒"]; //unset group
if (g_iOpenAccess) lButtons += ["Public ☒"]; //set open access
else lButtons += ["Public ☐"]; //unset open access
if (g_iLimitRange) lButtons += ["LimitRange ☒"]; //set ranged
else lButtons += ["LimitRange ☐"]; //unset open ranged
lButtons += ["Runaway","List Owners"];
Dialog(kAv, sPrompt, lButtons, [UPMENU], 0, iAuth, "Auth");
}
RemPersonMenu(key kID, string sToken, integer iAuth) {
list lPeople;
if (sToken=="owner") lPeople=g_lOwners;
else if (sToken=="tempowner") lPeople=g_lTempOwners;
else if (sToken=="secowner") lPeople=g_lSecOwners;
else if (sToken=="blacklist") lPeople=g_lBlackList;
else return;
if (llGetListLength(lPeople)){
string sPrompt = "\nChoose the person to remove:\n";
list lButtons;
integer iNum= llGetListLength(lPeople);
integer n;
for (n=1; n <= iNum/2; n = n + 1) {
string sName = llList2String(lPeople, 2*n-1);
if (sName != "") {
sPrompt += "\n" + (string)(n) + " - " + sName;
lButtons += [(string)(n)];
}
}
lButtons += ["Remove All"];
Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth, "rem"+sToken);
} else {
Notify(kID, "The list is empty", FALSE);
AuthMenu(kID, iAuth);
}
}
RemovePerson(string sName, string sToken, key kCmdr) {
//where "lPeople" is a 2-strided list in form key,name
//looks for strides identified by "name", removes them if found, and returns the list
//also handles notifications so as to reduce code duplication in the link message event
//Debug("removing: " + sName);
//all our comparisons will be cast to lower case first
list lPeople;
if (sToken=="owner") lPeople=g_lOwners;
else if (sToken=="tempowner") lPeople=g_lTempOwners;
else if (sToken=="secowner") lPeople=g_lSecOwners;
else if (sToken=="blacklist") lPeople=g_lBlackList;
else return;
if ((~llListFindList(g_lTempOwners,[(string)kCmdr])) && ! (~llListFindList(g_lOwners,[(string)kCmdr])) && sToken != "tempowner"){
Notify(kCmdr,"Temporary owners can only change the temporary owners list",FALSE);
return;
}
sName = llToLower(sName);
integer iFound=FALSE;
integer numPeople= llGetListLength(lPeople)/2;
while (numPeople--) {
string sThisName = llToLower(llList2String(lPeople, numPeople*2+1));
//Debug("checking " + sThisName);
if (sName == sThisName || sName == "remove all") { //remove name and key
if (sToken == "owner") {
Notify(llList2String(lPeople,numPeople*2),"You have been removed as owner on the " + CTYPE + " of " + llKey2Name(g_kWearer) + ".",FALSE);
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "CollarCommand|499|OwnerChange"); //tell attachments owner changed
} else if (sToken == "secowner") {
Notify(llList2String(lPeople,numPeople*2),"You have been removed as secowner on the " + CTYPE + " of " + llKey2Name(g_kWearer) + ".",FALSE);
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "CollarCommand|499|OwnerChange"); //tell attachments owner changed
}
lPeople = llDeleteSubList(lPeople, numPeople*2, numPeople*2+1);
Notify(kCmdr, sThisName + " removed from list.", TRUE);
iFound=TRUE;
}
}
if (iFound){
//save to db
string sOldToken=sToken;
if (sToken == "secowner") sOldToken+="s";
if (llGetListLength(lPeople)>0)
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + sOldToken + "=" + llDumpList2String(lPeople, ","), "");
else
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + sOldToken, "");
//store temp list
if (sToken=="owner") g_lOwners = lPeople;
else if (sToken=="tempowner") g_lTempOwners = lPeople;
else if (sToken=="secowner") g_lSecOwners = lPeople;
else if (sToken=="blacklist") g_lBlackList = lPeople;
} else
Notify(kCmdr, "Error: '" + sName + "' not in list.",FALSE);
}
AddUniquePerson(key kPerson, string sName, string sToken, key kAv) {
list lPeople;
//Debug(llKey2Name(kAv)+" is adding "+llKey2Name(kPerson)+" to list "+sToken);
if ((~llListFindList(g_lTempOwners,[(string)kAv])) && ! (~llListFindList(g_lOwners,[(string)kAv])) && sToken != "tempowner"){
Notify(kAv,"Temporary owners can only change the temporary owners list",FALSE);
} else {
if (sToken=="owner") {
lPeople=g_lOwners;
} else if (sToken=="secowner") {
lPeople=g_lSecOwners;
if (llGetListLength (lPeople) >=20) {
Notify(kAv, "The maximum of 10 people allowed in this list.",FALSE);
return;
}
} else if (sToken=="tempowner") {
lPeople=g_lTempOwners;
if (llGetListLength (lPeople) >=20) {
Notify(kAv, "The maximum of 10 people allowed in this list.",FALSE);
return;
}
} else if (sToken=="blacklist") {
lPeople=g_lBlackList;
if (llGetListLength (lPeople) >=20) {
Notify(kAv, "The maximum of 10 people allowed in this list.",FALSE);
return;
}
} else
return;
if (! ~llListFindList(lPeople, [(string)kPerson])) //owner is not already in list. add him/her
lPeople += [(string)kPerson, sName];
if (kPerson != g_kWearer) {
Notify(kAv, "Added " + sName + " to " + sToken + ".", FALSE);
if (sToken == "owner")
llOwnerSay("Your owner can have a lot power over you and you consent to that by adding " + sName + " as owner to your " + CTYPE + ". They can leash you, put you in poses and lock your " + CTYPE + ". If you are using RLV they can undress you, make you wear clothes, restrict your chat, IMs and TPs as well as force TP you anywhere they like. Please read the [http://www.opencollar.at/manual.html manual on the web] for more info. If you do not consent, you can use the command \"" + g_sPrefix + "runaway\" to remove all owners from the " + CTYPE + ".");
}
if (sToken == "owner" || sToken == "secowner") {
Notify(kPerson, "You have been added to the " + sToken + " list on " + llKey2Name(g_kWearer) + "'s " + CTYPE + ". For help concerning the " + CTYPE + " usage, please see the [http://www.opencollar.at/manual.html manual on the web] or type \"" + g_sPrefix + "menu\" in chat to explore the " + CTYPE + " and find links to dedicated manual pages in the menu headers.",FALSE);
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "CollarCommand|499|OwnerChange"); //tell attachments owner changed
}
string sOldToken=sToken;
if (sToken == "secowner") sOldToken+="s";
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + sOldToken + "=" + llDumpList2String(lPeople, ","), "");
if (sToken=="owner") g_lOwners = lPeople;
else if (sToken=="secowner") g_lSecOwners = lPeople;
else if (sToken=="tempowner") g_lTempOwners = lPeople;
else if (sToken=="blacklist") g_lBlackList = lPeople;
}
}
SayOwners() {
// Give a "you are owned by" message, nicely formatted.
list ownernames = llList2ListStrided(llDeleteSubList(g_lOwners, 0, 0), 0, -1, 2);
integer ownercount = llGetListLength(ownernames);
if (ownercount) {
string msg = "You are owned by ";
if (ownercount == 1) {
// if one person, then just name.
msg += (string)ownernames;
} else if (ownercount == 2) {
// if two people, then A and B.
msg += llDumpList2String(ownernames, " and ");
} else {
// if >2 people, then A, B, and C
list init = llDeleteSubList(ownernames, -1, -1);
list tail = llDeleteSubList(ownernames, 0, -2);
msg += llDumpList2String(init, ", ");
msg += ", and " + (string)tail;
}
// end with a period.
msg += ".";
Notify(llGetOwner(), msg, FALSE);
}
}
SetPrefix(string sValue) {
if (sValue != "auto") g_sPrefix = sValue;
else {
list name = llParseString2List(llKey2Name(g_kWearer), [" "], []);
string init = llGetSubString(llList2String(name, 0), 0, 0);
init += llGetSubString(llList2String(name, 1), 0, 0);
g_sPrefix = llToLower(init);
}
}
integer in_range(key kID) {
if (g_iLimitRange) {
if (llVecDist(llGetPos(), llList2Vector(llGetObjectDetails(kID, [OBJECT_POS]), 0)) > 20) { //if the distance between my position and their position > 20
llDialog(kID, "\nNot in range...", [], 298479);
return FALSE;
}
}
return TRUE;
}
integer Auth(string kObjID, integer attachment) {
string kID = (string)llGetOwnerKey(kObjID); // if kObjID is an avatar key, then kID is the same key
integer iNum;
if (~llListFindList(g_lOwners+g_lTempOwners, [kID]))
iNum = COMMAND_OWNER;
else if (g_iWearerlocksOut && kID == (string)g_kWearer && !attachment)
iNum = COMMAND_WEARERLOCKEDOUT;
else if (llGetListLength(g_lOwners+g_lTempOwners) == 0 && kID == (string)g_kWearer)
//if no owners set, then wearer's cmds have owner auth
iNum = COMMAND_OWNER;
else if (~llListFindList(g_lBlackList, [kID]))
iNum = COMMAND_BLACKLIST;
else if (~llListFindList(g_lSecOwners, [kID]))
iNum = COMMAND_SECOWNER;
else if (kID == (string)g_kWearer)
iNum = COMMAND_WEARER;
else if (g_iOpenAccess) {
if (in_range((key)kID))
iNum = COMMAND_GROUP;
else
iNum = COMMAND_EVERYONE;
} else if (g_iGroupEnabled && (string)llGetObjectDetails((key)kObjID, [OBJECT_GROUP]) == (string)g_kGroup && (key)kID != g_kWearer) //meaning that the command came from an object set to our control group, and is not owned by the wearer
iNum = COMMAND_GROUP;
else if (llSameGroup(kID) && g_iGroupEnabled && kID != (string)g_kWearer) {
if (in_range((key)kID))
iNum = COMMAND_GROUP;
else
iNum = COMMAND_EVERYONE;
} else
iNum = COMMAND_EVERYONE;
//Debug("Authed as "+(string)iNum);
return iNum;
}
// returns TRUE if eligible (AUTHED link message number)
integer UserCommand(integer iNum, string sStr, key kID, integer remenu) { // here iNum: auth value, sStr: user command, kID: avatar id
//Debug ("UserCommand("+(string)iNum+","+sStr+","+(string)kID+")");
if (iNum == COMMAND_EVERYONE) return TRUE; // No command for people with no privilege in this plugin.
else if (iNum > COMMAND_EVERYONE || iNum < COMMAND_OWNER) return FALSE; // sanity check
string sMessage=llToLower(sStr);
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
string sOwnerError="Sorry, only an owner can do that.";
if (sStr == "menu "+g_sSubMenu) {
AuthMenu(kID, iNum);
} else if (sStr == "listowners") { //say owner, secowners, group
if (iNum == COMMAND_OWNER || kID == g_kWearer) {
//Do Owners list
integer iLength = llGetListLength(g_lOwners);
string sOutput="";
while (iLength)
sOutput += "\n" + llList2String(g_lOwners, --iLength) + " (" + llList2String(g_lOwners, --iLength) + ")";
if (sOutput) Notify(kID, "Owners: " + sOutput,FALSE);
else Notify(kID, "Owners: None",FALSE);
//Do TempOwners list
iLength = llGetListLength(g_lTempOwners);
sOutput="";
while (iLength)
sOutput += "\n" + llList2String(g_lTempOwners, --iLength) + " (" + llList2String(g_lTempOwners, --iLength) + ")";
if (sOutput) Notify(kID, "Temp Owners: " + sOutput,FALSE);
//Do Secowners list
iLength = llGetListLength(g_lSecOwners);
sOutput="";
while (iLength)
sOutput += "\n" + llList2String(g_lSecOwners, --iLength) + " (" + llList2String(g_lSecOwners, --iLength) + ")";
if (sOutput) Notify(kID, "Secowners: " + sOutput,FALSE);
iLength = llGetListLength(g_lBlackList);
sOutput="";
while (iLength)
sOutput += "\n" + llList2String(g_lBlackList, --iLength) + " (" + llList2String(g_lBlackList, --iLength) + ")";
if (sOutput) Notify(kID, "Black List: " + sOutput,FALSE);
if (g_sGroupName) Notify(kID, "Group: " + g_sGroupName,FALSE);
if (g_kGroup) Notify(kID, "Group Key: " + (string)g_kGroup,FALSE);
sOutput="false";
if (g_iOpenAccess) sOutput="true";
Notify(kID, "Open Access: "+ sOutput,FALSE);
sOutput="false";
if (g_iLimitRange) sOutput="true";
Notify(kID, "LimitRange: "+ sOutput,FALSE);
}
else Notify(kID, "Only Owners & Wearer may access this command",FALSE);
if (remenu) AuthMenu(kID, iNum);
} else if (sStr == "owners" || sStr == "access") { //give owner menu
AuthMenu(kID, iNum);
// } else if (sStr=="give hud" || sMessage == "give hud") {
// if (kID == g_kWearer) llGiveInventory(kID,"Virtual Disgrace - Collar HUD");
// else llGiveInventory(kID,"Virtual Disgrace - Owner HUD");
// if (remenu) AuthMenu(kID, iNum);
} else if (sMessage == "owner" && remenu==FALSE) { //request for access menu from chat
AuthMenu(kID, iNum);
} else if (sCommand == "owner" || sCommand == "tempowner" || sCommand == "secowner" || sCommand == "blacklist") { //add a person to a list
string sTmpName = llDumpList2String(llDeleteSubList(lParams,0,0), " "); //get full name
if (iNum!=COMMAND_OWNER) {
Notify(kID, sOwnerError, FALSE);
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (osIsUUID(sTmpName)){
g_lQueryId+=[llRequestAgentData( sTmpName, DATA_NAME ),sTmpName,sCommand, kID, remenu];
if (remenu) FetchAvi(Auth(kID,FALSE), sCommand, sTmpName, kID);
} else
FetchAvi(iNum, sCommand, sTmpName, kID);
} else if (llSubStringIndex(sCommand,"rem")==0) { //remove person from a list
if (sCommand=="remowners") sCommand="remowner";
//Debug("got command "+sCommand);
string sToken = llGetSubString(sCommand,3,-1);
//Debug("got token "+sToken);
string sTmpName = llDumpList2String(llDeleteSubList(lParams,0,0), " "); //get full name
if (iNum!=COMMAND_OWNER){
Notify(kID, sOwnerError, FALSE);
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (sTmpName=="")
RemPersonMenu(kID, sToken, iNum);
else {
RemovePerson(sTmpName, sToken, kID);
if (remenu) RemPersonMenu(kID, sToken, Auth(kID,FALSE));
}
} else if (sCommand == "setgroup") {
if (iNum==COMMAND_OWNER){
//if key provided use that, else read current group
if (osIsUUID(llList2String(lParams, -1))) g_kGroup = (key)llList2String(lParams, -1);
else g_kGroup = (key)llList2String(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0); //record current group key
if (g_kGroup != "") {
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "group=" + (string)g_kGroup, "");
g_iGroupEnabled = TRUE;
key kGroupHTTPID = llHTTPRequest("http://world.secondlife.com/group/" + (string)g_kGroup, [], ""); //get group name from world api
g_lQueryId+=[kGroupHTTPID,"","group", kID, FALSE];
}
} else {
Notify(kID, sOwnerError, FALSE);
}
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (sCommand == "setgroupname") {
if (iNum==COMMAND_OWNER){
g_sGroupName = llDumpList2String(llList2List(lParams, 1, -1), " ");
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "groupname=" + g_sGroupName, "");
} else {
Notify(kID, sOwnerError, FALSE);
}
} else if (sCommand == "unsetgroup") {
if (iNum==COMMAND_OWNER){
g_kGroup = "";
g_sGroupName = "";
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "group", "");
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "groupname", "");
g_iGroupEnabled = FALSE;
Notify(kID, "Group unset.", FALSE);
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "CollarCommand|499|OwnerChange"); //tell attachments owner changed
} else {
Notify(kID, sOwnerError, FALSE);
}
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (sCommand == "setopenaccess") {
if (iNum==COMMAND_OWNER){
g_iOpenAccess = TRUE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "openaccess=" + (string) g_iOpenAccess, "");
Notify(kID, "Your " + CTYPE + " is open to the public.", FALSE);
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "CollarCommand|499|OwnerChange"); //tell attachments owner changed
} else {
Notify(kID, sOwnerError, FALSE);
}
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (sCommand == "unsetopenaccess") {
if (iNum==COMMAND_OWNER){
g_iOpenAccess = FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "openaccess", "");
Notify(kID, "Your " + CTYPE + " is closed to the public.", FALSE);
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "CollarCommand|499|OwnerChange"); //tell attachments owner changed
} else {
Notify(kID, sOwnerError, FALSE);
}
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (sCommand == "setlimitrange") {
if (iNum==COMMAND_OWNER){
g_iLimitRange = TRUE;
// as the default is range limit on, we do not need to store anything for this
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "limitrange", "");
Notify(kID, "Range is limited.", FALSE);
} else {
Notify(kID, sOwnerError, FALSE);
}
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (sCommand == "unsetlimitrange") {
if (iNum==COMMAND_OWNER){
g_iLimitRange = FALSE;
// save off state for limited range (default is on)
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "limitrange=" + (string) g_iLimitRange, "");
Notify(kID, "Range is simwide.", FALSE);
} else {
Notify(kID, sOwnerError, FALSE);
}
if (remenu) AuthMenu(kID, Auth(kID,FALSE));
} else if (sCommand == "runaway"){
list lButtons=[];
string message="Only the wearer or an Owner can access this menu";
if (iNum == COMMAND_OWNER && kID == g_kWearer) { //wearer-owner called for menu
if (g_iRunawayDisable){
lButtons=["Stay","Enable"];
message="\nYou chose to disable the runaway function.\n\nAs an owner you can restore this ability if desired.";
} else {
lButtons=["Runaway!", "Disable"];
message="\nYou can run away from your owners or you can disable your ability to ever run from them.";
}
} else if (kID == g_kWearer){ //wearer called for menu
if (g_iRunawayDisable){
lButtons=["Stay","Cancel","Remain","Don't Run", "Stay Loyal"];
message="\nACCESS DENIED:\n\nYou chose to disable the runaway function.\n\nOnly primary owners can restore this ability.";
} else {
lButtons=["Runaway!", "Disable"];
message="\nYou can run away from your owners or you can disable your ability to ever run from them.";
}
} else if (iNum == COMMAND_OWNER ) { //owner called for menu
if (g_iRunawayDisable){
lButtons=["Release", "Enable"];
message="\nYou can release this sub of your service or you can return their ability to run away on their own.";
} else {
lButtons=["Release"];
message="\nYou can release this sub of your service.";
}
}
//Debug("runaway button");
Dialog(kID, message, lButtons, [UPMENU], 0, iNum, "runawayMenu");
}
return TRUE;
}
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "auth_";
g_kWearer = llGetOwner(); //until set otherwise, wearer is owner
SetPrefix("auto");
//added for attachment auth
g_iInterfaceChannel = (integer)("0x" + llGetSubString(g_kWearer,30,-1));
if (g_iInterfaceChannel > 0) g_iInterfaceChannel = -g_iInterfaceChannel;
//Debug("Auth starting: "+(string)llGetFreeMemory());
// Request owner list. Be careful about doing this in all scripts,
// because we can easily flood the 64 event limit in LSL's event queue
// if all the scripts send a ton of link messages at the same time on
// startup.
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, g_sScript + "owner", "");
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, g_sScript + "secowners", "");
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, g_sScript + "tempowners", "");
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, g_sScript + "blacklist", "");
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
if (iNum == COMMAND_NOAUTH) { //authenticate messages on COMMAND_NOAUTH
integer iAuth = Auth((string)kID, FALSE);
if ( kID == g_kWearer && sStr == "runaway") { // note that this will work *even* if the wearer is blacklisted or locked out
if (g_iRunawayDisable){
llOwnerSay("Runaway is currently disabled.");
} else {
llOwnerSay("Running away from all owners started, your owners will now be notified!");
integer n;
integer stop = llGetListLength(g_lOwners+g_lTempOwners);
for (n = 0; n < stop; n += 2) {
key kOwner = (key)llList2String(g_lOwners+g_lTempOwners, n);
if (kOwner != g_kWearer)
{
Notify(kOwner, llKey2Name(g_kWearer) + " has run away!",FALSE);
}
}
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + "owner=", "");
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + "secowners=", "");
llMessageLinked(LINK_THIS, LM_SETTING_DELETE, g_sScript + "all", "");
llOwnerSay("Runaway finished, the " + CTYPE + " will now release locks!");
// moved reset request from settings to here to allow noticifation of owners.
llMessageLinked(LINK_SET, COMMAND_OWNER, "clear", kID); // clear RLV restrictions
llMessageLinked(LINK_SET, COMMAND_OWNER, "runaway", kID); // this is not a LM loop, since it is now really authed
llResetScript();
}
}
else if (kID != g_kWearer && iAuth == COMMAND_OWNER && sStr == "runaway") { //owner requests the runaway menu
//We trap here and pull up the UserCommand manually to avoid passing 'runaway' prematurely to linkmessage (this was unlocking/unleashing)
UserCommand(iAuth, "runaway", kID, FALSE);
}
else llMessageLinked(LINK_SET, iAuth, sStr, kID);
//Debug("noauth: " + sStr + " from " + (string)kID + " who has auth " + (string)iAuth);
return; // NOAUTH messages need go no further
} else if (UserCommand(iNum, sStr, kID, FALSE)) return;
else if (iNum == LM_SETTING_RESPONSE) {
//Debug("Got setting response: "+sStr);
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript) {
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "owner") {
// temporarily stash owner list so we can see if it's changing.
list tmpowners = g_lOwners;
g_lOwners = llParseString2List(sValue, [","], []);
// only say the owner list if it has changed (including on_rez)
if (llGetListLength(g_lOwners) && tmpowners != g_lOwners) SayOwners();
} else if (sToken == "tempowner") {
// temporarily stash owner list so we can see if it's changing.
list tmpowners = g_lTempOwners;
g_lTempOwners = llParseString2List(sValue, [","], []);
//Debug("Tempowners: "+llDumpList2String(g_lTempOwners,","));
// only say the owner list if it has changed (including on_rez)
if (llGetListLength(g_lTempOwners) && tmpowners != g_lTempOwners) SayOwners();
} else if (sToken == "group") {
g_kGroup = (key)sValue;
//check to see if the object's group is set properly
if (g_kGroup != "") {
if ((key)llList2String(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0) == g_kGroup) g_iGroupEnabled = TRUE;
else g_iGroupEnabled = FALSE;
}
else g_iGroupEnabled = FALSE;
}
else if (sToken == "groupname") g_sGroupName = sValue;
else if (sToken == "openaccess") g_iOpenAccess = (integer)sValue;
else if (sToken == "limitrange") g_iLimitRange = (integer)sValue;
else if (sToken == "runawayDisable") g_iRunawayDisable = (integer)sValue;
else if (sToken == "secowners") g_lSecOwners = llParseString2List(sValue, [","], [""]);
else if (sToken == "blacklist") g_lBlackList = llParseString2List(sValue, [","], [""]);
}
else if (sToken == "Global_prefix") SetPrefix(sValue);
else if (sToken == "Global_CType") CTYPE = sValue;
} else if (iNum == LM_SETTING_EMPTY) {
//Debug("Got setting empty: "+sStr);
integer i = llSubStringIndex(sStr, "_");
if (llGetSubString(sStr, 0, i) == g_sScript) {
sStr = llGetSubString(sStr, i + 1, -1);
if (sStr == "owner") {
g_lOwners = [];
SayOwners();
} else if (sStr == "tempowner") {
g_lTempOwners = [];
SayOwners();
} else if (sStr == "group") {
g_kGroup = NULL_KEY;
g_iGroupEnabled = FALSE;
}
else if (sStr == "groupname") g_sGroupName = "";
else if (sStr == "openaccess") g_iOpenAccess = FALSE;
else if (sStr == "limitrange") g_iLimitRange = TRUE;
else if (sStr == "runawayDisable") g_iRunawayDisable = FALSE;
else if (sStr == "secowners") g_lSecOwners = [];
else if (sStr == "blacklist") g_lBlackList = [];
}
} else if (iNum == LM_SETTING_SAVE) {
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == "Global_prefix") SetPrefix(sValue);
}
// JS: For backwards compatibility until all attachments/etc are rolled over to new interface
//added for attachment auth (Garvin)
else if (iNum == ATTACHMENT_REQUEST) {
integer iAuth = Auth((string)kID, TRUE);
llMessageLinked(LINK_SET, ATTACHMENT_RESPONSE, (string)iAuth+"|"+sStr, kID);
}
// JS: Remove ATTACHMENT_REQUEST & RESPONSE after all attachments have been updated properly
else if (iNum == INTERFACE_REQUEST) {
list lParams = llParseString2List(sStr, ["|"], []);
string sTarget = llList2String(lParams, 0);
string sCommand = llList2String(lParams, 1);
if (sTarget == "auth_") {
if (sCommand == "level") {
string sAuth = (string)Auth((string)kID, TRUE);
lParams = llListReplaceList(lParams, ["level=" + sAuth], 1, 1);
}
else return; // do not send response if the message was erroneous
llMessageLinked(LINK_SET, INTERFACE_RESPONSE, llDumpList2String(lParams, "|"), kID);
}
} else if (iNum == WEARERLOCKOUT) {
if (sStr == "on") g_iWearerlocksOut=TRUE;
else if (sStr == "off") g_iWearerlocksOut=FALSE;
} else if (iNum == DIALOG_RESPONSE) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex) {
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
//remove stride from g_lMenuIDs
string sMenu=llList2String(g_lMenuIDs, iMenuIndex + 1);
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenu == "Auth") {
//g_kAuthMenuID responds to setowner, setsecowner, setblacklist, remowner, remsecowner, remblacklist, setgroup, unsetgroup, setopenaccess, unsetopenaccess
if (sMessage == UPMENU)
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
else {
list lTranslation=[
"+ Owner","owner",
// "+ Temp Owner","tempowner",
"+ Secowner","secowner",
"+ Blacklisted","blacklist",
" Owner","remowner",
// " Temp Owner","remtempowner",
" Secowner","remsecowner",
" Blacklisted","remblacklist",
"Group ☐","setgroup",
"Group ☒","unsetgroup",
"Public ☐","setopenaccess",
"Public ☒","unsetopenaccess",
"LimitRange ☐","setlimitrange",
"LimitRange ☒","unsetlimitrange",
//"Give Hud","givehud",
"List Owners","listowners",
"Runaway","runaway"
];
integer buttonIndex=llListFindList(lTranslation,[sMessage]);
if (~buttonIndex){
sMessage=llList2String(lTranslation,buttonIndex+1);
}
//Debug("Sending UserCommand "+sMessage);
UserCommand(iAuth, sMessage, kAv, TRUE);
}
} else if (sMenu == "remowner" || sMenu == "remsecowner" || sMenu == "remblacklist" ) {
if (sMessage == UPMENU) {
AuthMenu(kAv, iAuth);
} else if (sMessage == "Remove All") {
UserCommand(iAuth, sMenu + " Remove All", kAv,TRUE);
} else if (sMenu == "remowner") {
UserCommand(iAuth, sMenu+" " + llList2String(g_lOwners, (integer)sMessage*2 - 1), kAv, TRUE);
} else if (sMenu == "remtempowner") {
UserCommand(iAuth, sMenu+" " + llList2String(g_lTempOwners, (integer)sMessage*2 - 1), kAv, TRUE);
} else if(sMenu == "remsecowner") {
UserCommand(iAuth, sMenu+" " + llList2String(g_lSecOwners, (integer)sMessage*2 - 1), kAv, TRUE);
} else if(sMenu == "remblacklist") {
UserCommand(iAuth, sMenu+" " + llList2String(g_lBlackList, (integer)sMessage*2 - 1), kAv, TRUE);
}
} else if (sMenu == "runawayMenu" ) { //no chat commands for this menu, by design, so handle it all here
if (sMessage == UPMENU) {
AuthMenu(kAv, iAuth);
} else if (sMessage == "Runaway!") {
llMessageLinked(LINK_SET, COMMAND_NOAUTH, "runaway", kAv);
} else if (sMessage == "Enable") {
if ((~llListFindList(g_lTempOwners,[(string)kAv])) && ! (~llListFindList(g_lOwners,[(string)kAv])) ){
Notify(kAv,"Temporary owners can't enable runaway.",FALSE);
} else {
g_iRunawayDisable=FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript+"runawayDisable","");
Notify(kAv,"The ability to runaway has been restored.", TRUE);
UserCommand(iAuth, "runaway", kAv, TRUE);
}
} else if (sMessage == "Disable") {
g_iRunawayDisable=TRUE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"runawayDisable=1","");
llOwnerSay("You have disabled your ability to runaway.");
UserCommand(iAuth, "runaway", kAv, TRUE);
} else if (sMessage == "Cancel") {
return; //no remenu on canel
} else if (sMessage == "Release") {
integer iOwnerIndex=llListFindList(g_lOwners,[(string)kAv]);
if (~iOwnerIndex){
string name=llList2String(g_lOwners,iOwnerIndex+1);
UserCommand(iAuth, "remowner "+name, kAv, FALSE); //no remenu, owner is done with this sub
//llMessageLinked(LINK_SET, COMMAND_OWNER, "runaway", kID); //let other scripts know we're running away
} else {
Notify(kAv, "You are not on the owners list.", TRUE);
UserCommand(iAuth,"runaway",kAv, TRUE); //remenu to runaway
}
} else {
UserCommand(iAuth,"runaway",kAv, TRUE); //remenu to runaway
}
}
}
} else if (iNum == FIND_AGENT) { //reply from add-by-name or add-from-menu (via FetchAvi dialog)
if (kID == REQUEST_KEY) {
list params = llParseString2List(sStr, ["|"], []);
if (llList2String(params, 0) == g_sScript) {
string sRequestType = llList2String(params, 4);
key kAv = llList2Key(params, 2);
integer iAuth= llList2Integer(params, 3);
string sNewOwner=llList2String(params, 5);
if (osIsUUID(sNewOwner)){
AddUniquePerson((key)sNewOwner, llKey2Name((key)sNewOwner), sRequestType, kAv); //should be safe to uase key2name here, as we added from sensor dialog
//FetchAvi(llList2Integer(params, 3), sRequestType, "", kAv); //remenu
integer iNewAuth=Auth(kAv,FALSE);
if (iNewAuth == COMMAND_OWNER){
UserCommand(iNewAuth,sRequestType,kAv,TRUE);
//FetchAvi(COMMAND_OWNER, sRequestType, "", kAv); //remenu
} else {
AuthMenu(kAv,iNewAuth);
}
} else {
AuthMenu(kAv,iAuth);
}
}
}
} else if (iNum == DIALOG_TIMEOUT) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
}
http_response(key kQueryId, integer iStatus, list lMeta, string sBody) { //response to a group name lookup
integer listIndex=llListFindList(g_lQueryId,[kQueryId]);
if (listIndex!= -1){
key g_kDialoger=llList2Key(g_lQueryId,listIndex+3);
g_lQueryId=llDeleteSubList(g_lQueryId,listIndex,listIndex+g_iQueryStride-1);
g_sGroupName = "(group name hidden)";
if (iStatus == 200) {
integer iPos = llSubStringIndex(sBody, "<title>");
integer iPos2 = llSubStringIndex(sBody, "</title>");
if ((~iPos) // Found
&& iPos2 > iPos // Has to be after it
&& iPos2 <= iPos + 43 // 36 characters max (that's 7+36 because <title> has 7)
&& !~llSubStringIndex(sBody, "AccessDenied") // Check as per groupname.py (?)
) {
g_sGroupName = llGetSubString(sBody, iPos + 7, iPos2 - 1);
}
}
Notify(g_kDialoger, "Group set to " + g_sGroupName + ".", FALSE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "groupname=" + g_sGroupName, "");
}
}
dataserver(key kQueryId, string sData){ //response after an add-by-uuid
integer listIndex=llListFindList(g_lQueryId,[kQueryId]);
if (listIndex!= -1){
key newOwner=llList2Key(g_lQueryId,listIndex+1);
string sRequestType=llList2String(g_lQueryId,listIndex+2);
key kAv =llList2Key(g_lQueryId,listIndex+3);
integer remenu =llList2Integer(g_lQueryId,listIndex+4);
g_lQueryId=llDeleteSubList(g_lQueryId,listIndex,listIndex+g_iQueryStride-1);
AddUniquePerson(newOwner, sData, sRequestType, kAv);
if (remenu){
integer iNewAuth=Auth(kAv,FALSE);
if (iNewAuth == COMMAND_OWNER){
UserCommand(iNewAuth,sRequestType,kAv,TRUE);
//FetchAvi(COMMAND_OWNER, sRequestType, "", kAv); //remenu
} else {
AuthMenu(kAv,iNewAuth);
}
}
}
}
changed(integer iChange) {
if (iChange & CHANGED_OWNER) llResetScript();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -0,0 +1,391 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - badwords //
// version 3.990 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//MESSAGE MAP
integer COMMAND_OWNER = 500;
integer COMMAND_EVERYONE = 504;
integer COMMAND_SAFEWORD = 510; // new for safeword
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer ANIM_START = 7000;
integer ANIM_STOP = 7001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
//5000 block is reserved for IM slaves
string CTYPE = "collar";
string WEARERNAME;
string g_sNoSound = "silent" ;
string g_sBadWordSound;
string g_sBadWordAnim ;
list g_lBadWords;
string g_sPenance = "I didn't do it!";
integer g_iListenerHandle;
key g_kWearer;
list g_lMenuIDs;
integer g_iMenuStride=3;
integer g_iIsEnabled=0;
integer g_iHasSworn = FALSE;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Dialog(key kID, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string sName) {
key kMenuID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kID + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kMenuID);
integer iIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iIndex) g_lMenuIDs = llListReplaceList(g_lMenuIDs, [kID, kMenuID, sName], iIndex, iIndex + g_iMenuStride - 1);
else g_lMenuIDs += [kID, kMenuID, sName];
//Debug("Made "+sName+" menu.");
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
ListenControl() {
if(g_iIsEnabled && llGetListLength(g_lBadWords)) g_iListenerHandle = llListen(0, "", g_kWearer, "");
else llListenRemove(g_iListenerHandle);
}
string DePunctuate(string sStr) {
string sLastChar = llGetSubString(sStr, -1, -1);
if (sLastChar == "," || sLastChar == "." || sLastChar == "!" || sLastChar == "?") sStr = llGetSubString(sStr, 0, -2);
return sStr;
}
string WordPrompt() {
string sName = llKey2Name(g_kWearer);
string sPrompt = sName + " is forbidden from saying ";
integer iLength = llGetListLength(g_lBadWords);
if (!iLength) sPrompt = sName + " is not forbidden from saying anything.";
else if (iLength == 1) sPrompt += llList2String(g_lBadWords, 0);
else if (iLength == 2) sPrompt += llList2String(g_lBadWords, 0) + " or " + llList2String(g_lBadWords, 1);
else sPrompt += llDumpList2String(llDeleteSubList(g_lBadWords, -1, -1), ", ") + ", or " + llList2String(g_lBadWords, -1);
sPrompt += "\nThe penance phrase to clear the punishment anim is '" + g_sPenance + "'.";
return sPrompt;
}
MenuBadwords(key kID, integer iNum){
list lButtons = ["Penance", "Add", "Remove", "Animation", "Sound", "Clear"];
if (g_iIsEnabled) lButtons += ["OFF"];
else lButtons += ["ON"];
string sText="\n\nwww.opencollar.at/badwords\n\n";
sText+="\nBad Words: " + llDumpList2String(g_lBadWords, ", ");
sText+="\nBad Word Anim: " + g_sBadWordAnim;
sText+="\nPenance: " + g_sPenance;
sText+="\nBad Word Sound: " + g_sBadWordSound;
Dialog(kID, sText, lButtons, ["BACK"],0, iNum, "BadwordsMenu");
}
// returns TRUE if eligible (AUTHED link message number)
UserCommand(integer iNum, string sStr, key kID, integer remenu) { // here iNum: auth value, sStr: user command, kID: avatar id
if (iNum != COMMAND_OWNER && kID != g_kWearer) return;
//Debug("Got command:"+sStr);
sStr=llStringTrim(sStr,STRING_TRIM);
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
if (llToLower(sStr) == "badwords" || llToLower(sStr) == "menu badwords") {
MenuBadwords(kID, iNum);
} else if (llToLower(sCommand)=="badwords"){
if (iNum != COMMAND_OWNER) return;
sCommand = llToLower(llList2String(lParams, 1));
if (sCommand == "add") { //support owner adding words
list lNewBadWords = llDeleteSubList(lParams, 0, 1);
if (llGetListLength(lNewBadWords)){
while (llGetListLength(lNewBadWords)){
string sNewWord=llToLower(DePunctuate(llList2String(lNewBadWords,-1)));
if (llListFindList(g_lBadWords, [sNewWord]) == -1) g_lBadWords += [sNewWord];
lNewBadWords=llDeleteSubList(lNewBadWords,-1,-1);
}
if (llGetListLength(g_lBadWords)) {
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "badwords_words=" + llDumpList2String(g_lBadWords, ","), "");
Notify(kID, WordPrompt(),TRUE);
}
if (remenu) MenuBadwords(kID,iNum);
} else {
string sText = "\n- Submit the new badword in the field below.\n- Submit a blank field to go back.";
Dialog(kID, sText, [], [], 0, iNum, "BadwordsAdd");
}
} else if (sCommand == "animation") { //Get all text after the command, strip spaces from start and end
if (llGetListLength(lParams)>2){
integer iPos=llSubStringIndex(llToLower(sStr),"on");
string sName = llStringTrim(llGetSubString(sStr, iPos+2, -1),STRING_TRIM);
if(sName == "Default") sName = "~shock";
if (llGetInventoryType(sName) == INVENTORY_ANIMATION) {
g_sBadWordAnim = sName;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "badwords_animation=" + g_sBadWordAnim, "");
Notify(kID, "Punishment animation for bad words is now '" + g_sBadWordAnim + "'.",FALSE);
} else Notify(kID, sName + " is not a valid animation name.",FALSE);
if (remenu) MenuBadwords(kID,iNum);
} else {
list lPoseList = ["Default"];
integer iMax = llGetInventoryNumber(INVENTORY_ANIMATION);
integer i;
string sName;
for (i=0;i<iMax;i++)
{
sName=llGetInventoryName(INVENTORY_ANIMATION, i);
//check here if the anim start with ~ or for some reason does not get a name returned (spares to check that all again in the menu ;)
if (sName != "" && llGetSubString(sName, 0, 0) != "~") lPoseList+=sName;
}
string sText = "Current punishment animation is: "+g_sBadWordAnim+"\n\n";
sText += "Select a new animation to use as a punishment.\n\n";
Dialog(kID, sText, lPoseList, ["BACK"],0, iNum, "BadwordsAnimation");
}
} else if (sCommand == "sound") { //Get all text after the command, strip spaces from start and end
if (llGetListLength(lParams)>2){
integer iPos=llSubStringIndex(llToLower(sStr),"nd");
string sName = llStringTrim(llGetSubString(sStr, iPos+2, -1),STRING_TRIM);
if (sName == "silent") Notify(kID, "Punishment will be silent.",FALSE);
else if (llGetInventoryType(sName) == INVENTORY_SOUND) {
Notify(kID, "You will hear the sound "+sName+" when "+WEARERNAME+" is punished.",FALSE);
} else {
Notify(kID, "Can't find sound "+sName+", using default.",FALSE);
sName = "Default" ;
}
g_sBadWordSound = sName;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "badwords_sound=" + g_sBadWordSound, "");
if (remenu) MenuBadwords(kID,iNum);
} else {
list lSoundList = ["Default","silent"];
integer iMax = llGetInventoryNumber(INVENTORY_SOUND);
integer i;
string sName;
for (i=0;i<iMax;i++)
{
sName=llGetInventoryName(INVENTORY_SOUND, i);
//check here if the sound start with ~ or for some reason does not get a name returned (spares to check that all again in the menu ;)
if (sName != "" && llGetSubString(sName, 0, 0) != "~") lSoundList+=[sName];
}
string sText = "Current sound is: "+g_sBadWordSound+"\n\n";
sText += "Select a new sound to use.\n\n";
Dialog(kID, sText, lSoundList, ["BACK"],0, iNum, "BadwordsSound");
}
} else if (sCommand == "penance") {
if (llGetListLength(lParams)>2){
integer iPos=llSubStringIndex(llToLower(sStr),"ce");
g_sPenance = llStringTrim(llGetSubString(sStr, iPos+2, -1),STRING_TRIM);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "badwords_penance=" + g_sPenance, "");
Notify(kID, WordPrompt() ,TRUE);
if (remenu) MenuBadwords(kID,iNum);
} else {
string sText = "\n- Submit the new penance in the field below.\n- Submit a blank field to go back.";
sText += "\n\n- Current penance is: " + g_sPenance;
Dialog(kID, sText, [], [],0, iNum, "BadwordsPenance");
}
} else if (sCommand == "remove") {
list lNewBadWords = llDeleteSubList(lParams, 0, 1);
if (llGetListLength(lNewBadWords)){
while (llGetListLength(lNewBadWords)){
string sNewWord=llToLower(DePunctuate(llList2String(lNewBadWords,-1)));
integer iIndex=llListFindList(g_lBadWords, [sNewWord]);
if (~iIndex) g_lBadWords = llDeleteSubList(g_lBadWords,iIndex,iIndex);
lNewBadWords=llDeleteSubList(lNewBadWords,-1,-1);
}
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "badwords_words=" + llDumpList2String(g_lBadWords, ","), "");
Notify(kID, WordPrompt(),TRUE);
if (remenu) MenuBadwords(kID,iNum);
} else {
if (llGetListLength(g_lBadWords)) Dialog(kID, "Select a badword to remove or clear them all.", g_lBadWords, ["Clear", "BACK"],0, iNum, "BadwordsRemove");
else {
Notify(kID, "The list of badwords is currently empty.", FALSE);
MenuBadwords(kID,iNum);
}
}
} else if (sCommand == "on") {
g_iIsEnabled = 1;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "badwords_on=1", "");
Notify(kID, "Use of bad words will now be punished.",FALSE);
if (remenu) MenuBadwords(kID,iNum);
} else if(sCommand == "off") {
g_iIsEnabled = 0;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "badwords_on","");
Notify(kID, "Use of bad words will not be punished.",FALSE);
if (remenu) MenuBadwords(kID,iNum);
} else if(sCommand == "clear") {
g_lBadWords = [];
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "badwords_words","");
Notify(kID, "The list of bad words has been cleared.",FALSE);
if (remenu) MenuBadwords(kID,iNum);
}
ListenControl();
}
}
default {
on_rez(integer iParam) {
ListenControl();
}
state_entry() {
llSetMemoryLimit(36*1024);
g_kWearer = llGetOwner();
g_sBadWordAnim = "~shock" ;
g_sBadWordSound = "Default" ;
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
//Debug("Got message:"+(string)iNum+" "+sStr);
if (iNum <= COMMAND_EVERYONE && iNum >= COMMAND_OWNER) UserCommand(iNum, sStr, kID, FALSE);
else if (iNum == MENUNAME_REQUEST && sStr == "Apps") llMessageLinked(LINK_SET, MENUNAME_RESPONSE, "Apps|Badwords", "");
else if (iNum == COMMAND_SAFEWORD)
{
//stop sound and animation
if(g_sBadWordSound != g_sNoSound) llStopSound();
llMessageLinked(LINK_SET, ANIM_STOP, g_sBadWordAnim, "");
g_iHasSworn = FALSE;
}
else if (iNum == LM_SETTING_RESPONSE) {
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == "badwords_") {
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "on") g_iIsEnabled = (integer)sValue;
else if (sToken == "animation") g_sBadWordAnim = sValue;
else if (sToken == "sound") g_sBadWordSound = sValue;
else if (sToken == "words") g_lBadWords = llParseString2List(llToLower(sValue), [","], []);
else if (sToken == "penance") g_sPenance = sValue;
ListenControl();
} else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken == "Global_WearerName") WEARERNAME = sValue;
}
else if (iNum == DIALOG_RESPONSE) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex) {
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iAuth = (integer)llList2String(lMenuParams, 3);
//remove stride from g_lMenuIDs
string sMenu=llList2String(g_lMenuIDs, iMenuIndex + 1);
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenu=="BadwordsMenu") {
if (sMessage == "BACK") llMessageLinked(LINK_SET, iAuth, "menu apps", kAv);
else UserCommand(iAuth, "badwords "+sMessage, kAv, TRUE);
} else if (sMenu=="BadwordsAdd") {
if (sMessage) UserCommand(iAuth, "badwords add " + sMessage, kAv, TRUE);
else MenuBadwords(kID,iNum);
} else if (sMenu=="BadwordsRemove") {
if (sMessage == "BACK") MenuBadwords(kID,iNum);
else if (sMessage == "Clear") UserCommand(iAuth, "badwords clear", kAv, TRUE);
else if (sMessage) UserCommand(iAuth, "badwords remove " + sMessage, kAv, TRUE);
else MenuBadwords(kID,iNum);
} else if (sMenu=="BadwordsAnimation") {
if (sMessage == "BACK") MenuBadwords(kID,iNum);
else UserCommand(iAuth, "badwords animation " + sMessage, kAv, TRUE);
} else if (sMenu=="BadwordsSound") {
if (sMessage == "BACK") MenuBadwords(kID,iNum);
else UserCommand(iAuth, "badwords sound " + sMessage, kAv, TRUE);
} else if (sMenu=="BadwordsPenance") {
if (sMessage) UserCommand(iAuth, "badwords penance " + sMessage, kAv, TRUE);
else MenuBadwords(kID,iNum);
}
}
} else if (iNum == DIALOG_TIMEOUT) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
}
listen(integer iChannel, string sName, key kID, string sMessage) {
//release anim if penance & play anim if swear
if ((~(integer)llSubStringIndex(llToLower(sMessage), llToLower(g_sPenance))) && g_iHasSworn ) { //stop sound
if(g_sBadWordSound != g_sNoSound) llStopSound();
//stop anim
llMessageLinked(LINK_SET, ANIM_STOP, g_sBadWordAnim, "");
Notify(g_kWearer, "Penance accepted.",FALSE);
g_iHasSworn = FALSE;
}
else if (~llSubStringIndex(sMessage, "rembadword")) return; //subs could theoretically circumvent this feature by sticking "rembadowrd" in all chat, but it doesn't seem likely to happen often
else { //check for swear
sMessage = llToLower(sMessage);
list lWords = llParseString2List(sMessage, [" "], []);
while (llGetListLength(lWords)) {
string sWord = llList2String(lWords, -1);
sWord = DePunctuate(sWord);
if (llListFindList(g_lBadWords, [sWord]) != -1) {
//start sound
if(g_sBadWordSound != g_sNoSound) {
if(g_sBadWordSound == "Default") llLoopSound( "4546cdc8-8682-6763-7d52-2c1e67e8257d", 1.0 );
else llLoopSound( g_sBadWordSound, 1.0 );
}
//start anim
llMessageLinked(LINK_SET, ANIM_START, g_sBadWordAnim, "");
llWhisper(0, WEARERNAME + " has said a bad word and is being punished.");
g_iHasSworn = TRUE;
}
lWords=llDeleteSubList(lWords,-1,-1);
}
}
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

646
LSL/OpenCollar - bell.lsl Normal file
View File

@@ -0,0 +1,646 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - bell //
// version 3.995 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//scans for sounds starting with: bell_
//show/hide for elements named: Bell
//2009-01-30 Cleo Collins - 1. draft
string g_sSubMenu = "Bell";
string g_sParentMenu = "Apps";
key g_kDialogID;
list g_lLocalButtons = ["Next Sound","Vol +","Delay +","Ring it!","Vol -","Delay -"];
float g_fVolume=0.5; // volume of the bell
float g_fVolumeStep=0.1; // stepping for volume
float g_fSpeed=1.0; // Speed of the bell
float g_fSpeedStep=0.5; // stepping for Speed adjusting
float g_fSpeedMin=0.5; // stepping for Speed adjusting
float g_fSpeedMax=5.0; // stepping for Speed adjusting
integer g_iBellOn=0; // are we ringing. Off is 0, On = Auth of person which enabled
string g_sBellOn="ON"; // menu text of bell on
string g_sBellOff="OFF"; // menu text of bell off
integer g_iBellShow=FALSE; // is the bell visible
string g_sBellShow="SHOW"; //menu text of bell visible
string g_sBellHide="HIDE"; //menu text of bell hidden
list g_listBellSounds=["10b27c32-43b5-40fb-b5a2-bbf770fbec5c",
"a4c075a9-359e-4055-b093-5aa42cddea1c",
"1e6f849d-9fee-42f2-b89a-98882a28b152",
"d1cdd688-42d7-4780-804f-0abe94ebca2a",
"ac855add-8834-4284-a6c1-74769b7cccb4",
"aba3c635-efb6-4642-aea4-5a4ea94df059",
"a6a3fcd4-3330-451f-b332-3fd59e3d698a",
"74811182-df1d-4b72-a9de-87f3706ac7bd",
"1d1b675c-4bee-4cc4-b225-69793893e66b",
"687a10f6-5c97-419f-8fc4-51013b821d9d",
"0c3774b9-90d9-4089-9198-f0445fa053e6",
"d71c05d2-1869-4e94-b077-9de8551e8917"];
key g_kCurrentBellSound ; // curent bell sound key
integer g_iCurrentBellSound; // curent bell sound sumber
integer g_iBellSoundCount; // number of avail bell sounds
key g_kLastToucher ; // store tocher key
float g_fNextTouch ; // store time for the next touch
float g_fTouch = 10.0 ; // timeout for touch chat notify
list g_lBellElements; // list with number of prims related to the bell
list g_lGlows; // 2-strided list [integer link_num, float glow]
float g_fNextRing; // store time for the next ringing here;
key g_kWearer; // key of the current wearer to reset only on owner changes
integer g_iHasControl=FALSE; // dow we have control over the keyboard?
list g_lButtons;
integer g_iHide ; // global hide
//MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
//integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer COMMAND_RLV_RELAY = 507;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
//integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
//integer DIALOG_TIMEOUT = -9002;
string UPMENU = "BACK";//when your menu hears this, give the parent menu
string g_sScript;
string CTYPE="collar";
string WEARERNAME;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
DoMenu(key kID, integer iAuth)
{
string sPrompt = "\n";
// sPrompt += "(Menu will time out in " + (string)g_iTimeOut + " seconds.)\n";
list lMyButtons;
//fill in your button list here
// Show buton for ringing the bell and add a text for it
if (g_iBellOn>0) // the bell rings currently
{
lMyButtons+= g_sBellOff;
sPrompt += "Bell is ringing";
}
else
{
lMyButtons+= g_sBellOn;
sPrompt += "Bell is NOT ringing";
}
// Show button for showing/hidding the bell and add a text for it, if there is a bell
if (g_iBellShow) // the bell is hidden
{
lMyButtons+= g_sBellHide;
sPrompt += " and shown.\n\n";
}
else
{
lMyButtons+= g_sBellShow;
sPrompt += " and NOT shown.\n\n";
}
// and show the volume and timing of the bell sound
sPrompt += "The volume of the bell is now: "+(string)((integer)(g_fVolume*10))+"/10.\n";
sPrompt += "The bell rings every "+llGetSubString((string)g_fSpeed,0,2)+" seconds when moving.\n";
sPrompt += "Currently used sound: "+(string)(g_iCurrentBellSound+1)+"/"+(string)g_iBellSoundCount+"\n";
sPrompt +="\nwww.opencollar.at/bell";
lMyButtons += g_lLocalButtons + g_lButtons;
g_kDialogID=Dialog(kID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
}
SetBellElementAlpha()
{
if (g_iHide) return ; // ***** if collar is hide, don't do anything
//loop through stored links, setting color if element type is bell
integer n;
integer iLinkElements = llGetListLength(g_lBellElements);
for (n = 0; n < iLinkElements; n++)
{
llSetLinkAlpha(llList2Integer(g_lBellElements,n), (float)g_iBellShow, ALL_SIDES);
UpdateGlow(llList2Integer(g_lBellElements,n), g_iBellShow);
}
}
UpdateGlow(integer link, integer alpha)
{
if (alpha == 0)
{
SavePrimGlow(link);
llSetLinkPrimitiveParamsFast(link, [PRIM_GLOW, ALL_SIDES, 0.0]); // set no glow;
}
else RestorePrimGlow(link);
}
SavePrimGlow(integer link)
{
float glow = llList2Float(llGetLinkPrimitiveParams(link,[PRIM_GLOW,0]),0); // get current prim glow
integer i = llListFindList(g_lGlows,[link]); // search in list
if (glow > 0) // if glow
{
if (i !=-1) g_lGlows = llListReplaceList(g_lGlows,[glow],i+1,i+1); // update if present
else g_lGlows += [link, glow]; // add if absent
}
else if (i !=-1) g_lGlows = llDeleteSubList(g_lGlows,i,i+1); // remove if present
}
RestorePrimGlow(integer link)
{
integer i = llListFindList(g_lGlows,[link]);
if (i != -1) llSetLinkPrimitiveParamsFast(link, [PRIM_GLOW, ALL_SIDES, llList2Float(g_lGlows, i+1)]);
}
BuildBellElementList()
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
list lParams;
// clear list just in case
g_lBellElements = [];
//root prim is 1, so start at 2
for (n = 2; n <= iLinkCount; n++)
{
// read description
lParams=llParseString2List((string)llGetObjectDetails(llGetLinkKey(n), [OBJECT_DESC]), ["~"], []);
// check inf name is baell name
if (llList2String(lParams, 0)=="Bell")
{
// if so store the number of the prim
g_lBellElements += [n];
// Debug("added " + (string)n + " to elements");
}
}
if (llGetListLength(g_lBellElements)==0){
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu + "|" + g_sSubMenu, "");
llRemoveInventory(llGetScriptName());
}
}
PrepareSounds()
{
// parse names of sounds in inventiory if those are for the bell
integer i;
integer m=llGetInventoryNumber(INVENTORY_SOUND);
string s;
for (i=0;i<m;i++)
{
s=llGetInventoryName(INVENTORY_SOUND,i);
if (llSubStringIndex(s,"bell_")==0)
{
// sound found, add key to list
g_listBellSounds+=llGetInventoryKey(s);
}
}
// and set the current sound
g_iBellSoundCount=llGetListLength(g_listBellSounds);
g_iCurrentBellSound=0;
g_kCurrentBellSound=llList2Key(g_listBellSounds,g_iCurrentBellSound);
}
// returns TRUE if eligible (AUTHED link message number)
integer UserCommand(integer iNum, string sStr, key kID) // here iNum: auth value, sStr: user command, kID: avatar id
{
if (iNum > COMMAND_WEARER || iNum < COMMAND_OWNER) return FALSE; // sanity check
string test=llToLower(sStr);
if (sStr == "menu " + g_sSubMenu || sStr == "bell")
{// the command prefix + bell without any extentsion is used in chat
//give this plugin's menu to kID
DoMenu(kID, iNum);
}
// we now chekc for chat commands
else if (llSubStringIndex(test,"bell")==0)
{
// it is a chat commad for the bell so process it
list lParams = llParseString2List(test, [" "], []);
string sToken = llList2String(lParams, 1);
string sValue = llList2String(lParams, 2);
if (sToken=="volume")
{
integer n=(integer)sValue;
if (n<1) n=1;
if (n>10) n=10;
g_fVolume=(float)n/10;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "vol=" + (string)llFloor(g_fVolume*10), "");
Notify(kID,"Bell volume set to "+(string)n, TRUE);
}
else if (sToken=="delay")
{
g_fSpeed=(float)sValue;
if (g_fSpeed<g_fSpeedMin) g_fSpeed=g_fSpeedMin;
if (g_fSpeed>g_fSpeedMax) g_fSpeed=g_fSpeedMax;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "speed=" + (string)llFloor(g_fSpeed*10), "");
Notify(kID,"Bell delay set to "+llGetSubString((string)g_fSpeed,0,2)+" seconds.", TRUE);
}
else if (sToken=="show" || sToken=="hide")
{
if (sToken=="show")
{
g_iBellShow=TRUE;
Notify(kID,"The bell is now visible.",TRUE);
}
else
{
g_iBellShow=FALSE;
Notify(kID,"The bell is now invisible.",TRUE);
}
SetBellElementAlpha();
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "show=" + (string)g_iBellShow, "");
}
else if (sToken=="on")
{
if (iNum!=COMMAND_GROUP)
{
if (g_iBellOn==0)
{
g_iBellOn=iNum;
if (!g_iHasControl) llRequestPermissions(g_kWearer,PERMISSION_TAKE_CONTROLS);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "on=" + (string)g_iBellOn, "");
Notify(kID,"The bell rings now.",TRUE);
}
}
else
{
Notify(kID,"Group users or Open Acces users cannot change the ring status of the bell.",TRUE);
}
}
else if (sToken=="off")
{
if ((g_iBellOn>0)&&(iNum!=COMMAND_GROUP))
{
g_iBellOn=0;
if (g_iHasControl)
{
llReleaseControls();
g_iHasControl=FALSE;
}
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "on=" + (string)g_iBellOn, "");
Notify(kID,"The bell is now quiet.",TRUE);
}
else
{
Notify(kID,"Group users or Open Access users cannot change the ring status of the bell.",TRUE);
}
}
else if (sToken=="nextsound")
{
g_iCurrentBellSound++;
if (g_iCurrentBellSound>=g_iBellSoundCount)
{
g_iCurrentBellSound=0;
}
g_kCurrentBellSound=llList2Key(g_listBellSounds,g_iCurrentBellSound);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "sound=" + (string)g_iCurrentBellSound, "");
Notify(kID,"Bell sound changed, now using "+(string)(g_iCurrentBellSound+1)+" of "+(string)g_iBellSoundCount+".",TRUE);
}
// let the bell ring one time
else if (sToken=="ring")
{
// update variable for time check
g_fNextRing=llGetTime()+g_fSpeed;
// and play the sound
llPlaySound(g_kCurrentBellSound,g_fVolume);
}
}
return TRUE;
}
string GetName(key uuid)
{
string name = llGetDisplayName(uuid);
if (name == "???" || name == "") name = llKey2Name(uuid);
return name;
}
default {
on_rez(integer param) {
g_kWearer=llGetOwner();
if (g_iBellOn) llRequestPermissions(g_kWearer,PERMISSION_TAKE_CONTROLS);
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
g_kWearer=llGetOwner(); // key of the wearer
WEARERNAME = GetName(g_kWearer); //quick and dirty default, will get replaced by value from settings
llResetTime(); // reset script time used for ringing the bell in intervalls
BuildBellElementList(); //build up list of prims with bell elements
PrepareSounds();
SetBellElementAlpha();
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
// the menu structure is to be build again, so make sure we get recognized
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
g_lButtons = [] ; // flush submenu buttons
llMessageLinked(LINK_SET, MENUNAME_REQUEST, g_sSubMenu, "");
}
else if (iNum == MENUNAME_RESPONSE)
{
list lParts = llParseString2List(sStr, ["|"], []);
if (llList2String(lParts, 0) == g_sSubMenu)
{//someone wants to stick something in our menu
string button = llList2String(lParts, 1);
if (llListFindList(g_lButtons, [button]) == -1)
{
g_lButtons = llListSort(g_lButtons + [button], 1, TRUE);
}
}
}
else if (iNum == MENUNAME_REMOVE)
{
list lParts = llParseString2List(sStr, ["|"], []);
if (llList2String(lParts, 0) == g_sSubMenu)
{
string button = llList2String(lParts, 1);
integer iIndex = llListFindList(g_lButtons , [button]);
if (iIndex != -1)
{
g_lButtons = llDeleteSubList(g_lButtons , iIndex, iIndex);
}
}
}
else if (iNum == LM_SETTING_RESPONSE)
{
// some responses from the DB are coming in, check if it is about bell values
integer i = llSubStringIndex(sStr, "=");
string sToken = llGetSubString(sStr, 0, i - 1);
string sValue = llGetSubString(sStr, i + 1, -1);
i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "on")
{
g_iBellOn=(integer)sValue;
if (g_iBellOn && !g_iHasControl)
{
llRequestPermissions(g_kWearer,PERMISSION_TAKE_CONTROLS);
}
else if (!g_iBellOn && g_iHasControl)
{
llReleaseControls();
g_iHasControl=FALSE;
}
}
else if (sToken == "show")
{
g_iBellShow=(integer)sValue;
SetBellElementAlpha();
}
else if (sToken == "sound")
{
g_iCurrentBellSound=(integer)sValue;
g_kCurrentBellSound=llList2Key(g_listBellSounds,g_iCurrentBellSound);
}
else if (sToken == "vol") g_fVolume=(float)sValue/10;
else if (sToken == "speed") g_fSpeed=(float)sValue/10;
} else if (sToken=="Global_WearerName") WEARERNAME=sValue;
else if (sToken == "Global_CType") CTYPE = sValue;
}
else if (UserCommand(iNum, sStr, kID)) return;
else if (iNum==DIALOG_RESPONSE)
{
//str will be a 2-element, pipe-delimited list in form pagenum|response
if (kID == g_kDialogID)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAV = llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
//give id the parent menu
llMessageLinked(LINK_SET, iAuth, "menu "+g_sParentMenu, kAV);
return; // no "remenu"
}
else if (~llListFindList(g_lLocalButtons, [sMessage]))
{
//we got a response for something we handle locally
if (sMessage == "Vol +") // pump up the volume and store the value
{
g_fVolume+=g_fVolumeStep;
if (g_fVolume>1.0) g_fVolume=1.0;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "vol=" + (string)llFloor(g_fVolume*10), "");
}
else if (sMessage == "Vol -") // be more quiet, and store the value
{
g_fVolume-=g_fVolumeStep;
if (g_fVolume<0.1) g_fVolume=0.1;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "vol=" + (string)llFloor(g_fVolume*10), "");
}
else if (sMessage == "Delay +") // dont annoy people and ring slower
{
g_fSpeed+=g_fSpeedStep;
if (g_fSpeed>g_fSpeedMax) g_fSpeed=g_fSpeedMax;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "speed=" + (string)llFloor(g_fSpeed*10), "");
}
else if (sMessage == "Delay -") // annoy the hell out of the, ring plenty, ring often
{
g_fSpeed-=g_fSpeedStep;
if (g_fSpeed<g_fSpeedMin) g_fSpeed=g_fSpeedMin;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "speed=" + (string)llFloor(g_fSpeed*10), "");
}
else if (sMessage == "Next Sound") // choose another sound for the bell
{
g_iCurrentBellSound++;
if (g_iCurrentBellSound>=g_iBellSoundCount) g_iCurrentBellSound=0;
g_kCurrentBellSound=llList2Key(g_listBellSounds,g_iCurrentBellSound);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "sound=" + (string)g_iCurrentBellSound, "");
}
//added a button to ring the bell. same call as when walking.
else if (sMessage == "Ring it!")
{
// update variable for time check
g_fNextRing=llGetTime()+g_fSpeed;
// and play the sound
llPlaySound(g_kCurrentBellSound,g_fVolume);
//Debug("Bing");
}
}
else if (sMessage == g_sBellOff || sMessage == g_sBellOn)
// someone wants to change if the bell rings or not
{
string s;
if (g_iBellOn>0) s="bell off";
else s="bell on";
UserCommand(iAuth,s,kAV);
}
else if (sMessage == g_sBellShow || sMessage == g_sBellHide)
// someone wants to hide or show the bell
{
g_iBellShow=!g_iBellShow;
SetBellElementAlpha();
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "show=" + (string)g_iBellShow, "");
}
else if (~llListFindList(g_lButtons, [sMessage]))
{
//we got a submenu selection
//UserCommand(iAuth, "menu "+sMessage, kAV);
llMessageLinked(LINK_SET, iAuth, "menu " + sMessage, kAV);
return; // no main menu
}
// do we want to see the menu again?
DoMenu(kAV, iAuth);
}
}
else if(iNum=COMMAND_OWNER && sStr=="runaway")
{
llSleep(4);
SetBellElementAlpha();
}
}
control( key kID, integer nHeld, integer nChange )
// we watch for movement from
{
// we dont want the bell to ring, so just exit
if (!g_iBellOn) return;
// Is the user holding down a movement key
if ( nHeld & (CONTROL_LEFT|CONTROL_RIGHT|CONTROL_DOWN|CONTROL_UP|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|CONTROL_FWD|CONTROL_BACK) )
{
// check if the time is ready for the next ring
if (llGetTime()>g_fNextRing)
{
// update variable for time check
g_fNextRing=llGetTime()+g_fSpeed;
// and play the sound
llPlaySound(g_kCurrentBellSound,g_fVolume);
//Debug("Bing");
}
}
}
run_time_permissions(integer nParam)
// we requested permissions, now we take control
{
if( nParam & PERMISSION_TAKE_CONTROLS)
{
//Debug("Bing");
llTakeControls( CONTROL_DOWN|CONTROL_UP|CONTROL_FWD|CONTROL_BACK|CONTROL_LEFT|CONTROL_RIGHT|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT, TRUE, TRUE);
g_iHasControl=TRUE;
g_fNextRing=llGetTime()+g_fSpeed;
}
}
touch_start(integer n)
{
if (g_iBellShow && !g_iHide && llListFindList(g_lBellElements,[llDetectedLinkNumber(0)]) != -1)
{
key toucher = llDetectedKey(0);
g_fNextRing=llGetTime()+g_fSpeed;
llPlaySound(g_kCurrentBellSound,g_fVolume);
if (toucher != g_kLastToucher || llGetTime() > g_fNextTouch)
{
g_fNextTouch=llGetTime()+g_fTouch;
g_kLastToucher = toucher;
llSay(0, GetName(toucher) + " plays with the trinket on " + WEARERNAME + "'s "+CTYPE+"." );
}
}
}
changed(integer change) {
if(change & CHANGED_LINK) BuildBellElementList();
else if (change & CHANGED_INVENTORY) PrepareSounds();
if (change & CHANGED_COLOR) {
integer iNewHide=!(integer)llGetAlpha(ALL_SIDES) ; //check alpha
if (g_iHide != iNewHide){ //check there's a difference to avoid infinite loop
g_iHide = iNewHide;
SetBellElementAlpha(); // update hide elements
}
}
if (change & CHANGED_OWNER) llResetScript();
if (change & CHANGED_REGION) {
if (g_iBellOn) g_fNextRing=llGetTime()+g_fSpeed;
/* if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}*/
}
}
}

View File

@@ -0,0 +1,562 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - bookmarks //
// version 3.995 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string SUBMENU_BUTTON = "Bookmarks"; // Name of the submenu
string COLLAR_PARENT_MENU = "Apps"; // name of the menu, where the menu plugs in, should be usually Addons. Please do not use the mainmenu anymore
string PLUGIN_CHAT_COMMAND = "tp"; // every menu should have a chat command, so the user can easily access it by type for instance *plugin
string PLUGIN_CHAT_COMMAND_ALT = "bookmarks"; //taking control over some map/tp commands from rlvtp
integer IN_DEBUG_MODE = FALSE; // set to TRUE to enable Debug messages
string g_sCard = ".bookmarks"; //Name of the notecards to store destinations.
key webLookup;
list g_lDestinations = []; //Destination list direct from static notecard
list g_lDestinations_Slurls = []; //Destination list direct from static notecard
list g_lVolatile_Destinations = []; //These are in memory preferences that are not yet saved into the notecard
list g_lVolatile_Slurls = []; //These are in memory preferences that are not yet saved into the notecard
key g_kRequestHandle = NULL_KEY; //Sim Request Handle to convert global coordinates
vector g_vLocalPos = ZERO_VECTOR;
key g_kRemoveMenu = NULL_KEY; //Use a separate key for the remove menu ID
integer g_iRLVOn = FALSE; //Assume RLV is off until we hear otherwise
string g_tempLoc = ""; //This holds a global temp location for manual entry from provided location but no favorite name - g_kTBoxIdLocationOnly
key g_kMenuID; // menu handler
key g_kWearer; // key of the current wearer to reset only on owner changes
key g_kTBoxIdSave = "null";
key g_kTBoxIdLocationOnly = "null";
string g_sScript; // part of script name used for settings
key g_kDataID;
integer g_iLine = 0;
string UPMENU = "BACK"; // when your menu hears this, give the parent menu
key g_kCommander;
string CTYPE = "collar"; // designer can set in notecard to appropriate word for their item
list PLUGIN_BUTTONS = ["SAVE", "PRINT", "REMOVE"];
list g_lButtons;
integer COMMAND_OWNER = 500;
integer COMMAND_WEARER = 503;
integer LM_SETTING_SAVE = 2000; // scripts send messages on this channel to have settings saved to settings store
integer LM_SETTING_RESPONSE = 2002; // the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003; // delete token from settings store
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer RLV_CMD = 6000;
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if((integer)llStringLength(sMsg) > 1023) { //Line too long, gotta chop this up!
integer i;
integer x = 0;
for(i = 1023; x <= i; --i) {
if(llGetSubString(sMsg, i, i) == "\n") { //got a breaking point
Notify(kID, llGetSubString(sMsg, 0, i), iAlsoNotifyWearer);
Notify(kID, llGetSubString(sMsg, i, -1), iAlsoNotifyWearer);
return;
}
}
}
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
DoMenu(key keyID, integer iAuth)
{
string sPrompt = "\nTake me away, gumby!\n\nwww.opencollar.at/bookmarks";
list lMyButtons = PLUGIN_BUTTONS + g_lButtons + g_lDestinations + g_lVolatile_Destinations;
g_kMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
}
integer UserCommand(integer iNum, string sStr, key kID)
{
if(!(iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)) {
return FALSE;
}
// a validated command from a owner, secowner, groupmember or the wearer has been received
list lParams = llParseString2List(sStr, [" "], []);
//string sCommand = llToLower(llList2String(lParams, 0));
//string sValue = llToLower(llList2String(lParams, 1));
// So commands can accept a value
if(sStr == "reset") {
// it is a request for a reset
if(iNum == COMMAND_WEARER || iNum == COMMAND_OWNER) {
//only owner and wearer may reset
llResetScript();
}
} else if(sStr == PLUGIN_CHAT_COMMAND || sStr == "menu " + SUBMENU_BUTTON || sStr == PLUGIN_CHAT_COMMAND_ALT) {
// an authorized user requested the plugin menu by typing the menus chat command
DoMenu(kID, iNum);
} else if(llGetSubString(sStr, 0, llStringLength(PLUGIN_CHAT_COMMAND + " save") - 1) == PLUGIN_CHAT_COMMAND + " save") { //grab partial string match to capture destination name
if(llStringLength(sStr) > llStringLength(PLUGIN_CHAT_COMMAND + " save")) {
string sAdd = llStringTrim(llGetSubString(sStr, llStringLength(PLUGIN_CHAT_COMMAND + " save") + 1, -1), STRING_TRIM);
if(llListFindList(g_lVolatile_Destinations, [sAdd]) >= 0 || llListFindList(g_lDestinations, [sAdd]) >= 0) {
Notify(kID, "This destination name is already taken", FALSE);
} else {
string slurl = FormatRegionName();
addDestination(sAdd, slurl, kID);
}
} else {
// Notify that they need to give a description of the saved destination ie. <prefix>bookmarks save description
g_kTBoxIdSave = Dialog(kID,
"Enter a name for the destination below. Submit a blank field to cancel and return.
You can enter:
1) A friendly name to save your current location to your favorites
2) A new location or SLurl", [], [], 0, iNum);
}
} else if(llGetSubString(sStr, 0, llStringLength(PLUGIN_CHAT_COMMAND + " remove") - 1) == PLUGIN_CHAT_COMMAND + " remove") { //grab partial string match to capture destination name
if(llStringLength(sStr) > llStringLength(PLUGIN_CHAT_COMMAND + " remove")) {
string sDel = llStringTrim(llGetSubString(sStr, llStringLength(PLUGIN_CHAT_COMMAND + " remove"), -1), STRING_TRIM);
if(llListFindList(g_lVolatile_Destinations, [sDel]) < 0) {
Notify(kID, "Can't find bookmark " + (string)sDel + " to be deleted", FALSE);
} else {
integer iIndex;
llMessageLinked(LINK_THIS, LM_SETTING_DELETE, g_sScript + sDel, "");
iIndex = llListFindList(g_lVolatile_Destinations, [sDel]);
g_lVolatile_Destinations = llDeleteSubList(g_lVolatile_Destinations, iIndex, iIndex);
g_lVolatile_Slurls = llDeleteSubList(g_lVolatile_Slurls, iIndex, iIndex);
Notify(kID, "Removed destination " + sDel, FALSE);
}
} else {
g_kRemoveMenu = Dialog(kID, "Select a bookmark to be removed...", g_lVolatile_Destinations, [UPMENU], 0, iNum);
}
} else if(llGetSubString(sStr, 0, llStringLength(PLUGIN_CHAT_COMMAND + " print") - 1) == PLUGIN_CHAT_COMMAND + " print") { //grab partial string match to capture destination name
PrintDestinations(kID);
} else if(llGetSubString(sStr, 0, llStringLength(PLUGIN_CHAT_COMMAND) - 1) == PLUGIN_CHAT_COMMAND) {
string sCmd = llStringTrim(llGetSubString(sStr, llStringLength(PLUGIN_CHAT_COMMAND) + 1, -1), STRING_TRIM);
g_kCommander = kID;
if(llGetSubString(sStr,-2,-1) == "=n" || llGetSubString(sStr,-2,-1) == "=y" || llGetSubString(sStr,-4,-1) == "=add" || llGetSubString(sStr,-4,-1) == "=rem") { //ignore RLV restriction commands in this script
} else if(llListFindList(g_lVolatile_Destinations, [sCmd]) >= 0) {
integer iIndex = llListFindList(g_lVolatile_Destinations, [sCmd]);
TeleportTo(llList2String(g_lVolatile_Slurls, iIndex));
} else if(llListFindList(g_lDestinations, [sCmd]) >= 0) { //Found exact match, TP over
integer iIndex = llListFindList(g_lDestinations, [sCmd]);
TeleportTo(llList2String(g_lDestinations_Slurls, iIndex));
} else if(llStringLength(sCmd) > 0) { // We didn't get a case sensitive match, so lets loop through what we know and try find what we need
integer i = 0;
integer x = llGetListLength(g_lDestinations);
string s;
integer found = 0;
list matchedBookmarks;
for(i = 0; i < x; i++) { //First check OC locations
s = llList2String(g_lDestinations, i);
if(llSubStringIndex(llToLower(s), llToLower(sCmd)) >= 0) {
//store it, if we only find one, we'll go there
//Notify(kID,"Matched bookmark '"+s+"'",FALSE);
found += 1;
matchedBookmarks += s;
}
}
i = 0;
x = llGetListLength(g_lVolatile_Destinations);
for(i = 0; i < x; i++) { //Then check volatile destinations
s = llList2String(g_lVolatile_Destinations, i);
if(llSubStringIndex(llToLower(s), llToLower(sCmd)) >= 0) {
//store it, if we only find one, we'll go there
//Notify(kID,"Matched bookmark '"+s+"'",FALSE);
found += 1;
matchedBookmarks += s;
}
}
if(found == 0) {
//old hud command compatibility: 'o:176382.800000/261210.900000/3503.276000=force'
if (llSubStringIndex(sCmd,"o:") == 0){} // prevents errors in obsolete huds
else Notify(kID, "The bookmark '" + sCmd + "' has not been found in the " + CTYPE + " of " + llKey2Name(g_kWearer) + ".", FALSE);
} else if(found > 1) {
g_kMenuID = Dialog(kID, "More than one matching bookmark was found in the " + CTYPE + " of " + llKey2Name(g_kWearer) +
".\nChoose a bookmark to teleport to.", matchedBookmarks, [UPMENU], 0, iNum);
} else { //exactly one matching LM found, so use it
UserCommand(iNum, PLUGIN_CHAT_COMMAND + " " + llList2String(matchedBookmarks, 0), g_kCommander); //Push matched result to command for processing
}
}
//Can't find in list, lets try find substring matches
else {
Notify(kID, "I didn't understand your command.", FALSE);
}
}
return TRUE;
}
addDestination(string sMessage, string sLoc, key kID)
{
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + sMessage + "=" + sLoc, "");
g_lVolatile_Destinations += sMessage;
g_lVolatile_Slurls += sLoc;
Notify(kID, "Added destination " + sMessage + " with a location of: " + sLoc, FALSE);
}
string FormatRegionName()
{
//Formatting to regionname(x,x,x)
string region = llGetRegionName();
vector pos = llGetPos();
string posx = (string)llRound(pos.x);
string posy = (string)llRound(pos.y);
string posz = (string)llRound(pos.z);
return (region + "(" + posx + "," + posy + "," + posz + ")");
}
string convertSlurl(string sStr, key kAv, integer iAuth) //convert the slurl http strings to region (xxx,xxx,xxx)
{
sStr = llStringTrim(llUnescapeURL(sStr), STRING_TRIM);
string sIndex = "http:";
list lPieces = llParseStringKeepNulls(sStr, ["/"], []);
integer iHttploc = 0;
string sStringToKeep;
integer iHttpInString = llSubStringIndex(llList2String(lPieces, 0), sIndex);
if(iHttpInString > 0) {
sStringToKeep = llGetSubString(llList2String(lPieces, 0), 0, iHttpInString - 1);
}
if(llGetListLength(lPieces) == 8) { //
string sRegion = llList2String(lPieces, iHttploc + 4);
string sLocationx = llList2String(lPieces, iHttploc + 5);
string sLocationy = llList2String(lPieces, iHttploc + 6);
string sLocationz = llList2String(lPieces, iHttploc + 7);
sStr = sStringToKeep + sRegion + "(" + sLocationx + "," + sLocationy + "," + sLocationz + ")";
//Debug("Converted slurl, sending for processing..." + sStr);
return sStr; //successful conversion, send converted string assembly
}
//Debug("No slurl detected, sending for processing anyways :" + sStr);
return sStr; //failed conversion, send raw string assuming there's no Slurls
}
integer isInteger(string input) //for validating location scheme
{
return ((string)((integer)input) == input);
}
integer validatePlace(string sStr, key kAv, integer iAuth)
{
//Debug("validatePlaces working on: "+sStr);
list lPieces;
integer MAX_CHAR_TYPE = 2; //we use +1 due since we're counting with a list split. We can only accept 1 of each of the following: ()~
string sAssembledLoc;
string sRegionName;
string sFriendlyName;
sStr = llStringTrim(sStr, STRING_TRIM); //clean up whitespace
lPieces = llParseStringKeepNulls(sStr, ["~"], []); // split location from friendly name
if(llGetListLength(lPieces) == MAX_CHAR_TYPE) { //We have a tilde, so make sure the friendly name is good
if(llStringLength(llList2String(lPieces, 0)) < 1) { return 2;} //make sure friendly name isn't empty
sFriendlyName = llStringTrim(llList2String(lPieces, 0), STRING_TRIM); //assign friendly name
lPieces = llParseStringKeepNulls(llList2String(lPieces, 1), ["("], []); // split location from friendly name
} else if(llGetListLength(lPieces) > MAX_CHAR_TYPE) { return 1; } //too many tildes, retreat
else { lPieces = llParseStringKeepNulls(llList2String(lPieces, 0), ["("], []); } // We don't have a friendly name, so let's ignore that for now and split at 0
if(llGetListLength(lPieces) == MAX_CHAR_TYPE) { //Check to see we don't have extra ('s - this might also mean there's no location coming...
if(llStringLength(llList2String(lPieces, 0)) < 1) { return 4;} //make sure region name isn't empty
sRegionName = llStringTrim(llList2String(lPieces, 0), STRING_TRIM); //trim off whitespace from region name
} else if(llGetListLength(lPieces) > MAX_CHAR_TYPE) {return 3; } //this location looks wrong, retreat
else { //there's no location here, kick out new menu
UserCommand(iAuth, PLUGIN_CHAT_COMMAND + " save " + sStr, kAv);
UserCommand(iAuth, PLUGIN_CHAT_COMMAND, kAv);
return 0;
}
//we're left with sFriendlyname,sRegionName,["blah","123,123)"] - so lets validate the last list item
sAssembledLoc = llStringTrim("(" + llList2String(lPieces, 1), STRING_TRIM); //reattach the bracket we lost, clean up whitespace
lPieces = llParseStringKeepNulls(sAssembledLoc, [","], []); // split location from friendly name
if(llGetListLength(lPieces) != 3) { return 5; } //Check to see we don't have extra ,'s
if(llGetSubString(sAssembledLoc, 0, 0) != "(") { return 6; } //location doesn't start with (
if(llGetSubString(sAssembledLoc, llStringLength(sAssembledLoc) - 1, llStringLength(sAssembledLoc) - 1) != ")") { return 7; } //location doesn't end with )
lPieces = llParseStringKeepNulls(llGetSubString(sAssembledLoc, 1, llStringLength(sAssembledLoc) - 2), [","], []); // lPieces should be a list of 3 sets of numbers
integer i = 0;
integer x = llGetListLength(lPieces) - 1;
for(i = 0; i <= x; ++i) { //run through this number list to make sure each character is numeric
integer y = 0;
integer z = llStringLength(llList2String(lPieces, i)) - 1;
for(y = 0; y <= z; ++y) {
if(isInteger(llGetSubString(llList2String(lPieces, i), y, y)) != 1) { return 8; } //something left in here isn't an integer
}
}
if(sFriendlyName == "") {
g_tempLoc = sRegionName + sAssembledLoc; //assign a global for use in response menu
g_kTBoxIdLocationOnly = Dialog(kAv,
"\nEnter a name for the destination " + sRegionName + sAssembledLoc + "
below.\n- Submit a blank field to cancel and return.", [], [], 0, iAuth);
} else {
addDestination(sFriendlyName, sRegionName, kAv);
UserCommand(iAuth, PLUGIN_CHAT_COMMAND, kAv);
}
return 0;
}
ReadDestinations() // On inventory change, re-read our ~destinations notecard and pull from https://raw.githubusercontent.com/OpenCollar/OpenCollarUpdater/main/LSL/~bookmarks
{
key kAv;
webLookup = llHTTPRequest("https://raw.githubusercontent.com/OpenCollar/OpenCollarUpdater/main/LSL/~bookmarks",
[HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE], "");
g_lDestinations = [];
g_lDestinations_Slurls = [];
//start re-reading the notecards
if(llGetInventoryKey(g_sCard)) {
g_kDataID = llGetNotecardLine(g_sCard, 0);
}
}
TeleportTo(string sStr) //take a string in region (x,y,z) format, and retrieve global coordinates. The teleport takes place in the data server section
{
string sRegion = llStringTrim(llGetSubString(sStr, 0, llSubStringIndex(sStr, "(") - 1), STRING_TRIM);
string sCoords = llStringTrim(llGetSubString(sStr, llSubStringIndex(sStr, "(") + 1 , llStringLength(sStr) - 2), STRING_TRIM);
list tokens = llParseString2List(sCoords, [","], []);
// Extract local X, Y and Z
g_vLocalPos.x = llList2Float(tokens, 0);
g_vLocalPos.y = llList2Float(tokens, 1);
g_vLocalPos.z = llList2Float(tokens, 2);
// Request info about the sim
if(g_iRLVOn == FALSE) { //If we don't have RLV, we can just send to llMapDestination for a popup
llMapDestination(sRegion, g_vLocalPos, ZERO_VECTOR);
} else { //We've got RLV, let's use it
g_kRequestHandle = llRequestSimulatorData(sRegion, DATA_SIM_POS);
}
}
PrintDestinations(key kID) // On inventory change, re-read our ~destinations notecard
{
integer i;
integer length = llGetListLength(g_lDestinations);
string sMsg;
sMsg += "\n\nThe below can be copied and pasted into the " + g_sCard + " notecard. The format should follow:\n\ndestination name~region name(123,123,123)\n\n";
for(i = 0; i < length; i++) {
sMsg += llList2String(g_lDestinations, i) + "~" + llList2String(g_lDestinations_Slurls, i) + "\n";
}
length = llGetListLength(g_lVolatile_Destinations);
for(i = 0; i < length; i++) {
sMsg += llList2String(g_lVolatile_Destinations, i) + "~" + llList2String(g_lVolatile_Slurls, i) + "\n";
}
Notify(kID, sMsg, i);
}
default {
on_rez(integer iParam) {
if(llGetOwner() != g_kWearer) llResetScript(); // Reset if wearer changed
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
g_kWearer = llGetOwner(); // store key of wearer
ReadDestinations(); //Grab our presets
// send request to main menu and ask other menus if they want to register with us
llMessageLinked(LINK_THIS, MENUNAME_REQUEST, SUBMENU_BUTTON, "");
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
//Debug("Starting");
}
http_response(key id, integer status, list meta, string body) {
if(status == 200) { // be silent on failures.
// Debug(body);
if(id == webLookup) {
list lResponse;
lResponse = llParseString2List(body, ["\n"], [""]);
integer i = 0;
integer x = 0;
string sData;
list split;
x = llGetListLength(lResponse) - 1;
for(i = 0; i <= x; ++i) {
sData = llStringTrim(llList2String(lResponse, i), STRING_TRIM);
split = llParseString2List(sData, ["~"], []);
g_lDestinations = [ llStringTrim(llList2String(split, 0), STRING_TRIM) ] + g_lDestinations;
g_lDestinations_Slurls = [ llStringTrim(llList2String(split, 1), STRING_TRIM) ] + g_lDestinations_Slurls ;
}
// Debug("Body: " + body);
}
}
}
dataserver(key kID, string sData) {
if(kID == g_kRequestHandle) {
// Parse the dataserver response (it is a vector cast to a string)
list tokens = llParseString2List(sData, ["<", ",", ">"], []);
string pos_str;
vector global_pos;
// The coordinates given by the dataserver are the ones of the
// South-West corner of this sim
// => offset with the specified local coordinates
global_pos.x = llList2Float(tokens, 0);
global_pos.y = llList2Float(tokens, 1);
global_pos.z = llList2Float(tokens, 2);
global_pos += g_vLocalPos;
// Build the command
pos_str = (string)((integer)global_pos.x)
+ "/" + (string)((integer)global_pos.y)
+ "/" + (string)((integer)global_pos.z);
//Debug("Global position : "+(string)pos_str); // Debug purposes
// Pass command to main
if(g_iRLVOn) {
string sRlvCmd = "tpto:" + pos_str + "=force";
llMessageLinked(LINK_SET, RLV_CMD, sRlvCmd, g_kCommander);
}
}
if(kID == g_kDataID) { //User notecard
list split;
if(sData != EOF) {
if(llGetSubString(sData, 0, 2) != "") { //Ignore blank lines
sData = llStringTrim(sData, STRING_TRIM);
split = llParseString2List(sData, ["~"], []);
g_lDestinations += [ llStringTrim(llList2String(split, 0), STRING_TRIM) ];
g_lDestinations_Slurls += [ llStringTrim(llList2String(split, 1), STRING_TRIM) ];
}
g_iLine++;
g_kDataID = llGetNotecardLine(g_sCard, g_iLine);
}
}
}
// listen for linked messages from OC scripts
link_message(integer iSender, integer iNum, string sStr, key kID) {
// Debug((string)iSender + "|" + (string)iNum + "|" + sStr + "|" + (string)kID);
if(iNum == MENUNAME_REQUEST && sStr == COLLAR_PARENT_MENU) {
// our parent menu requested to receive buttons, so send ours
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
g_lButtons = [] ;
llMessageLinked(LINK_THIS, MENUNAME_REQUEST, SUBMENU_BUTTON, "");
} else if(iNum == RLV_OFF) { // rlvoff -> we have to turn the menu off too
g_iRLVOn = FALSE;
} else if(iNum == RLV_ON) { // rlvon -> we have to turn the menu on again
g_iRLVOn = TRUE;
} else if(iNum == MENUNAME_RESPONSE) {
// a button is send to be added to a menu
list lParts = llParseString2List(sStr, ["|"], []);
if(llList2String(lParts, 0) == SUBMENU_BUTTON) {
// someone wants to stick something in our menu
string button = llList2String(lParts, 1);
if(llListFindList(g_lButtons, [button]) == -1) {
// if the button isnt in our menu yet, than we add it
g_lButtons = llListSort(g_lButtons + [button], 1, TRUE);
}
}
} else if(iNum == LM_SETTING_RESPONSE) {
// response from setting store have been received
// pares the answer
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
// and check if any values for use are received
// replace "value1" by your own token
integer i = llSubStringIndex(sToken, "_");
if(llGetSubString(sToken, 0, i) == g_sScript) {
list lDestination = [llGetSubString(sToken, llSubStringIndex(sToken, "_") + 1, llSubStringIndex(sToken, "="))];
if(llListFindList(g_lVolatile_Destinations, lDestination) < 0) {
g_lVolatile_Destinations += lDestination;
g_lVolatile_Slurls += [sValue];
}
} else if(sToken == "Global_CType") { CTYPE = sValue; }
} else if(UserCommand(iNum, sStr, kID)) {
// do nothing more if TRUE
} else if(iNum == DIALOG_RESPONSE) {
if(llListFindList([g_kMenuID, g_kTBoxIdSave, g_kRemoveMenu, g_kTBoxIdLocationOnly], [kID]) != -1) {
//got a menu response meant for us, extract the values
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
list lParams = llParseStringKeepNulls(sStr, ["|"], []);
if(kID == g_kTBoxIdLocationOnly) {
//got a menu response meant for us. pull out values
if(sMessage != "") {
addDestination(sMessage, g_tempLoc, kID);
}
UserCommand(iAuth, PLUGIN_CHAT_COMMAND, kAv);
} else if(kID == g_kTBoxIdSave) {
//got a menu response meant for us. pull out values
// if(sMessage != "") UserCommand(iAuth, "bookmarks save " + sMessage, kAv);
//Debug("TBoxIDSave " + sMessage);
if(sMessage != "") {
validatePlace(convertSlurl(sMessage, kAv, iAuth), kAv, iAuth);
} else {
UserCommand(iAuth, PLUGIN_CHAT_COMMAND, kAv);
}
} else if(kID == g_kRemoveMenu) {
// Debug("|"+sMessage+"|");
if(sMessage == UPMENU) {
UserCommand(iAuth, PLUGIN_CHAT_COMMAND, kAv);
return;
}
if(sMessage != "") {
//got a menu response meant for us. pull out values
UserCommand(iAuth, PLUGIN_CHAT_COMMAND + " remove " + sMessage, kAv);
UserCommand(iAuth, PLUGIN_CHAT_COMMAND + " remove", kAv);
} else { UserCommand(iAuth, PLUGIN_CHAT_COMMAND, kAv); }
} else if(sMessage == UPMENU) {
llMessageLinked(LINK_THIS, iAuth, "menu " + COLLAR_PARENT_MENU, kAv);
} else if(~llListFindList(PLUGIN_BUTTONS, [sMessage])) {
if(sMessage == "SAVE") {
UserCommand(iAuth, PLUGIN_CHAT_COMMAND + " save", kAv);
} else if(sMessage == "REMOVE") {
UserCommand(iAuth, PLUGIN_CHAT_COMMAND + " remove", kAv);
} else if(sMessage == "PRINT") {
UserCommand(iAuth, PLUGIN_CHAT_COMMAND + " print", kAv);
UserCommand(iAuth, PLUGIN_CHAT_COMMAND, kAv);
}
} else if(~llListFindList(g_lDestinations + g_lVolatile_Destinations, [sMessage])) {
UserCommand(iAuth, PLUGIN_CHAT_COMMAND + " " + sMessage, kAv);
} else if(~llListFindList(g_lButtons, [sMessage])) {
llMessageLinked(LINK_THIS, iAuth, "menu " + sMessage, kAv);
}
}
}
}
changed(integer iChange) {
if(iChange & CHANGED_INVENTORY) {
ReadDestinations();
}
if(iChange & CHANGED_OWNER) { llResetScript(); }
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

475
LSL/OpenCollar - camera.lsl Normal file
View File

@@ -0,0 +1,475 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - camera //
// version 3.996.1 //
// Only compatible with OpenSim 0.9 or higher //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2016 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//allows owner to set different camera mode
//responds to commands from modes list
key g_kWearer;
integer g_iLastNum;
string g_sSubMenu = "Camera";
string g_sParentMenu = "Apps";
key g_kMenuID;
string g_sCurrentMode = "default";
float g_fReapeat = 0.5;
//these 4 are used for syncing dom to us by broadcasting cam pos/rot
integer g_iSync2Me;//TRUE if we're currently dumping cam pos/rot iChanges to chat so the owner can sync to us
vector g_vCamPos;
rotation g_rCamRot;
integer g_rBroadChan;
string g_sJsonModes;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510; // new for safeword
integer COMMAND_BLACKLIST = 520;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to settings store
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from store
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the settings store
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
integer RLV_CLEAR = 6002;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
string UPMENU = "BACK";
//string MORE = ">";
string g_sScript;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
//changed the mode handles to a Json object with json arrays, one issue remains:
//vectors get converted into strings and need to be reconverted to vectors.
//For this to work easiest seems to just put for any mode which contains a vector,
//the vector as last entry (if there shall be a mode which contains 2 vectors,
//this needs to be addressed and handles as excetion in the list lJsonModes function
string JsonModes() {
string sDefault = llList2Json(JSON_ARRAY, [CAMERA_ACTIVE,FALSE]);
string sHuman = llList2Json(JSON_ARRAY, [CAMERA_ACTIVE,TRUE,
CAMERA_BEHINDNESS_ANGLE,0.0,
CAMERA_BEHINDNESS_LAG,0.0,
CAMERA_DISTANCE,2.5,
CAMERA_FOCUS_LAG,0.05,
CAMERA_POSITION_LOCKED,FALSE,
CAMERA_FOCUS_THRESHOLD,0.0,
CAMERA_PITCH,20.0,
CAMERA_POSITION_LAG,0.0,
CAMERA_POSITION_THRESHOLD,0.0,
CAMERA_FOCUS_OFFSET,<0.0, 0.0, 0.35>]);
string s1stperson = llList2Json(JSON_ARRAY,[CAMERA_ACTIVE,TRUE,
CAMERA_DISTANCE, 0.5,
CAMERA_FOCUS_OFFSET, <2.5,0,1.0>]);
string sAss = llList2Json(JSON_ARRAY,[CAMERA_ACTIVE,TRUE,
CAMERA_DISTANCE,0.5]);
string sFar = llList2Json(JSON_ARRAY,[CAMERA_ACTIVE,TRUE,
CAMERA_DISTANCE,10.0]);
string sGod = llList2Json(JSON_ARRAY,[CAMERA_ACTIVE,TRUE,
CAMERA_DISTANCE,10.0,
CAMERA_PITCH,80.0]);
string sGround = llList2Json(JSON_ARRAY,[CAMERA_ACTIVE,TRUE,
CAMERA_PITCH,-15.0]);
string sWorm = llList2Json(JSON_ARRAY,[CAMERA_ACTIVE,TRUE,
CAMERA_PITCH,-15.0,
CAMERA_FOCUS_OFFSET, <0.0,0.0,-0.75>]);
return llList2Json(JSON_OBJECT,["default",sDefault,"human", sHuman, "1stperson",s1stperson,"ass",sAss,"far",sFar,"god",sGod,"ground",sGround,"worm",sWorm]);
}
list lJsonModes(string sMode) {
string sJsonTmp = llJsonGetValue(g_sJsonModes, [sMode]);
list lTest = llJson2List(sJsonTmp);
integer index = llGetListLength(lTest)-1;
//last entry is checked if it is a vector to be converted from string to vector here:
if ((vector)llList2String(lTest,index)) lTest = llListReplaceList(lTest,[(vector)llList2String(lTest,index)],index,index);
return lTest;
}
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
CamMode(string sMode) {
llClearCameraParams();
llSetCameraParams(lJsonModes(sMode));
}
ClearCam()
{
if (llGetPermissions()&PERMISSION_CONTROL_CAMERA) llClearCameraParams();
g_iLastNum = 0;
g_iSync2Me = FALSE;
llMessageLinked(LINK_SET, RLV_CMD, "camunlock=y", "camera");
llMessageLinked(LINK_SET, RLV_CMD, "camdistmax:0=y", "camera");
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "all", "");
}
CamFocus(vector g_vCamPos, rotation g_rCamRot)
{
vector vStartPose = llGetCameraPos();
rotation rStartRot = llGetCameraRot();
float fSteps = 8.0;
//Keep fSteps a float, but make sure its rounded off to the nearest 1.0
fSteps = (float)llRound(fSteps);
//Calculate camera position increments
vector vPosStep = (g_vCamPos - vStartPose) / fSteps;
//Calculate camera rotation increments
//rotation rStep = (g_rCamRot - rStartRot);
//rStep = <rStep.x / fSteps, rStep.y / fSteps, rStep.z / fSteps, rStep.s / fSteps>;
float fCurrentStep = 0.0; //Loop through motion for fCurrentStep = current step, while fCurrentStep <= Total steps
for(; fCurrentStep <= fSteps; ++fCurrentStep)
{
//Set next position in tween
vector vNextPos = vStartPose + (vPosStep * fCurrentStep);
rotation rNextRot = Slerp( rStartRot, g_rCamRot, fCurrentStep / fSteps);
//Set camera parameters
llSetCameraParams([
CAMERA_ACTIVE, 1, //1 is active, 0 is inactive
CAMERA_BEHINDNESS_ANGLE, 0.0, //(0 to 180) degrees
CAMERA_BEHINDNESS_LAG, 0.0, //(0 to 3) seconds
CAMERA_DISTANCE, 0.0, //(0.5 to 10) meters
CAMERA_FOCUS, vNextPos + llRot2Fwd(rNextRot), //Region-relative position
CAMERA_FOCUS_LAG, 0.0 , //(0 to 3) seconds
CAMERA_FOCUS_LOCKED, TRUE, //(TRUE or FALSE)
CAMERA_FOCUS_THRESHOLD, 0.0, //(0 to 4) meters
CAMERA_POSITION, vNextPos, //Region-relative position
CAMERA_POSITION_LAG, 0.0, //(0 to 3) seconds
CAMERA_POSITION_LOCKED, TRUE, //(TRUE or FALSE)
CAMERA_POSITION_THRESHOLD, 0.0, //(0 to 4) meters
CAMERA_FOCUS_OFFSET, ZERO_VECTOR //<-10,-10,-10> to <10,10,10> meters
]);
}
}
rotation Slerp( rotation a, rotation b, float f ) {
float fAngleBetween = llAngleBetween(a, b);
if ( fAngleBetween > PI )
fAngleBetween = fAngleBetween - TWO_PI;
return a*llAxisAngle2Rot(llRot2Axis(b/a)*a, fAngleBetween*f);
}//Written by Francis Chung, Taken from http://forums.secondlife.com/showthread.php?p=536622
LockCam()
{
llSetCameraParams([
CAMERA_ACTIVE, TRUE,
//CAMERA_POSITION, llGetCameraPos()
CAMERA_POSITION_LOCKED, TRUE
]);
llMessageLinked(LINK_SET, RLV_CMD, "camunlock=n", "camera");
}
CamMenu(key kID, integer iAuth)
{
string sPrompt = "\n[http://www.example.com Camera]\n\nCurrent camera mode is " + g_sCurrentMode +
"\nThis app requires OpenSim 0.9 and RLV v2.9+";
list lButtons = ["CLEAR","FREEZE","MOUSELOOK"];
integer n;
integer stop = llGetListLength(llJson2List(g_sJsonModes));
for (n = 0; n < stop; n +=2)
{
lButtons += [Capitalize(llList2String(llJson2List(g_sJsonModes),n))];
}
g_kMenuID = Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
string Capitalize(string sIn)
{
return llToUpper(llGetSubString(sIn, 0, 0)) + llGetSubString(sIn, 1, -1);
}
SaveSetting(string sToken)
{
sToken = g_sScript + sToken;
string sValue = (string)g_iLastNum;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, sToken + "=" + sValue, "");
}
ChatCamParams(integer chan)
{
g_vCamPos = llGetCameraPos();
g_rCamRot = llGetCameraRot();
string sPosLine = osReplaceString((string)g_vCamPos, " ", "", -1, 0) + " " + osReplaceString((string)g_rCamRot, " ", "", -1, 0);
//if not channel 0, say to whole region. else just say locally
if (chan)
{
llRegionSay(chan, sPosLine);
}
else
{
llSay(chan, sPosLine);
}
}
integer UserCommand(integer iNum, string sStr, key kID) // here iNum: auth value, sStr: user command, kID: avatar id
{
if (iNum > COMMAND_WEARER || iNum < COMMAND_OWNER) return FALSE; // sanity check
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
string sValue2 = llList2String(lParams, 2);
if (sStr == "menu " + g_sSubMenu) {
CamMenu(kID, iNum);
}
else if (sCommand == "cam" || sCommand == "camera")
{
if (sValue == "")
{
//they just said *cam. give menu
CamMenu(kID, iNum);
return TRUE;
}
if (!(llGetPermissions() & PERMISSION_CONTROL_CAMERA))
{
Notify(kID, "Permissions error: Can not control camera.", FALSE);
return TRUE;
}
if (g_iLastNum && iNum > g_iLastNum)
{
Notify(kID, "Sorry, cam settings have already been set by someone outranking you.", FALSE);
return TRUE;
}
//Debug("g_iLastNum=" + (string)g_iLastNum);
if (sValue == "clear")
{
ClearCam();
Notify(kID, "Cleared camera settings.", TRUE);
}
else if (sValue == "freeze")
{
LockCam();
Notify(kID, "Freezing current camera position.", TRUE);
g_iLastNum = iNum;
SaveSetting("freeze");
}
else if (sValue == "mouselook")
{
Notify(kID, "Enforcing mouselook.", TRUE);
g_iLastNum = iNum;
llMessageLinked(LINK_SET, RLV_CMD, "camdistmax:0=n", "camera");
SaveSetting("mouselook");
}
else if ((vector)sValue != ZERO_VECTOR && (vector)sValue2 != ZERO_VECTOR)
{
Notify(kID, "Setting camera focus to " + sValue + ".", TRUE);
//CamFocus((vector)sValue, (vector)sValue2);
g_iLastNum = iNum;
//Debug("newiNum=" + (string)iNum);
}
else
{
integer iIndex = llSubStringIndex(g_sJsonModes, sValue);//llListFindList(g_lModes, [sValue]);
if (iIndex != -1)
{
CamMode(sValue);
g_iLastNum = iNum;
llMessageLinked(LINK_SET, RLV_CMD, "camunlock=n", "camera");
Notify(kID, "Set " + sValue + " camera mode.", TRUE);
SaveSetting(sValue);
}
else
{
Notify(kID, "Invalid camera mode: " + sValue, FALSE);
}
}
}
else if (sCommand == "camto")
{
if (!g_iLastNum || iNum <= g_iLastNum)
{
CamFocus((vector)sValue, (rotation)sValue2);
g_iLastNum = iNum;
}
else
{
Notify(kID, "Sorry, cam settings have already been set by someone outranking you.", FALSE);
}
}
else if (sCommand == "camdump")
{
g_rBroadChan = (integer)sValue;
integer g_fReapeat = (integer)sValue2;
ChatCamParams(g_rBroadChan);
if (g_fReapeat)
{
g_iSync2Me = TRUE;
llSetTimerEvent(g_fReapeat);
}
}
else if ((iNum == COMMAND_OWNER || kID == g_kWearer) && sStr == "runaway")
{
ClearCam();
llResetScript();
}
return TRUE;
}
default {
on_rez(integer iNum) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
g_kWearer = llGetOwner();
g_sJsonModes = JsonModes();
if (llGetAttached()) llRequestPermissions(g_kWearer, PERMISSION_CONTROL_CAMERA | PERMISSION_TRACK_CAMERA);
//Debug("Starting");
}
run_time_permissions(integer iPerms)
{
if (iPerms & (PERMISSION_CONTROL_CAMERA | PERMISSION_TRACK_CAMERA))
{
llClearCameraParams();
}
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
//only respond to owner, secowner, group, wearer
if (UserCommand(iNum, sStr, kID)) return;
else if (iNum == COMMAND_SAFEWORD || iNum == RLV_CLEAR)
{
ClearCam();
llResetScript();
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["=", ","], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
if (llGetPermissions() & PERMISSION_CONTROL_CAMERA)
{
if (sToken == "freeze") LockCam();
else if (sToken == "mouselook") llMessageLinked(LINK_SET, RLV_CMD, "camdistmax:0=n", "camera");
else if (~llSubStringIndex(g_sJsonModes, sToken)) CamMode(sToken);
g_iLastNum = (integer)sValue;
}
}
}
else if (iNum == DIALOG_RESPONSE)
{
if (kID == g_kMenuID)
{
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
// integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else
{
UserCommand(iAuth, "cam " + llToLower(sMessage), kAv);
CamMenu(kAv, iAuth);
}
}
}
}
timer()
{
//handle cam pos/rot changes
if (g_iSync2Me)
{
vector vNewPos = llGetCameraPos();
rotation rNewRot = llGetCameraRot();
if (vNewPos != g_vCamPos || rNewRot != g_rCamRot)
{
ChatCamParams(g_rBroadChan);
}
}
else
{
llSetTimerEvent(0.0);
}
}
changed(integer iChange) {
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -1,118 +1,138 @@
// Copyright (c) 2011 - 2015 Nandana Singh, Satomi Ahn, Wendy Starfall,
// littlemousy et al.
//
// This script is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation, version 2.
//
// This script is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this script; if not, see www.gnu.org/licenses/gpl-2.0
//
// Debug(string sStr) { llOwnerSay("Debug ["+llGetScriptName()+"]: " + sStr); }
// This script exists to clean up some legacy cruft in old collars:
// - delete the hovertext script that is in a child prim
// - delete the mis-named "OpenCollar - remoteserver- 3.481" script (missing a space in the name pattern)
// The items we want to delete are identified by having these strings in their names
list garbage = [
"hovertext@",
"OpenCollar - remoteserver-"
];
// Allow this many seconds to hear back from child prims before
// removing self from root prim inventory
integer deathtimer = 3;
integer UPDATE = 10001;
// Function that will look at all items in the prim and delete any
// whose names contain the pattern.
DelMatchingItems(string pattern) {
integer n;
// Loop from the top down so we don't screw up inventory numbers as we delete
for (n = llGetInventoryNumber(INVENTORY_ALL); n >= 0; n--) {
string name = llGetInventoryName(INVENTORY_ALL, n);
// look for match but don't delete self.
if (llSubStringIndex(name, pattern) != -1
&& name != llGetScriptName()) {
// found the item we're looking for. Remove!
llRemoveInventory(name);
//Debug("found " + name);
}
}
}
DelItems(list items) {
integer n;
integer stop = llGetListLength(items);
for (n = 0; n < stop; n++) {
string pattern = llList2String(items, n);
DelMatchingItems(pattern);
}
}
default {
state_entry() {
// Don't run cleanup if placed in an updater
if (llSubStringIndex(llGetObjectName(), "Updater") != -1) {
//Debug("In an updater. Sleeping.");
llSetScriptState(llGetScriptName(), FALSE);
}
key transKey="bd7d7770-39c2-d4c8-e371-0342ecf20921";
integer primNumber=llGetNumberOfPrims()+1;
while (primNumber--){
integer numOfSides = llGetNumberOfSides();
while (numOfSides--){
key texture=llList2String(llGetLinkPrimitiveParams(primNumber,[PRIM_TEXTURE,numOfSides]),0);
if (texture == transKey || texture == TEXTURE_PLYWOOD || texture=="!totallytransparent"){
llSetLinkPrimitiveParamsFast(primNumber,[PRIM_TEXTURE,numOfSides,TEXTURE_TRANSPARENT,<1,1,1>,<0,0,0>,0]);
}
}
}
DelItems(garbage);
if (llGetLinkNumber() > 1) {
// in a child prim.
// Since we already cleaned up, we can just die now
llRemoveInventory(llGetScriptName());
} else {
// If in root prim, then ping for scripts in child prims.
llMessageLinked(LINK_SET, UPDATE, "prepare", "");
// and set the death timer
llSetTimerEvent(deathtimer);
}
//Debug("starting");
}
link_message(integer sender, integer num, string str, key id) {
//Debug(llDumpList2String([sender, num, str, id], ", "));
if (num == UPDATE) {
// If a child script responds with a script pin, clone self there.
list parts = llParseString2List(str, ["|"], []);
if (llGetListLength(parts) > 1) {
integer pin = (integer)llList2String(parts, 1);
key prim = llGetLinkKey(sender);
if (pin > 0) {
llRemoteLoadScriptPin(prim, llGetScriptName(), pin, TRUE, 1);
}
}
}
}
timer() {
//Debug("timer");
llRemoveInventory(llGetScriptName());
}
}
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - cleanup //
// version 3.958 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// This script exists to clean up some legacy cruft in old collars:
// - delete the hovertext script that is in a child prim
// - delete the mis-named "OpenCollar - remoteserver- 3.481" script (missing a space in the name pattern)
// The items we want to delete are identified by having these strings in their names
list garbage = [
"hovertext@",
"OpenCollar - remoteserver-"
];
// Allow this many seconds to hear back from child prims before
// removing self from root prim inventory
integer deathtimer = 3;
integer UPDATE = 10001;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
// Function that will look at all items in the prim and delete any
// whose names contain the pattern.
DelMatchingItems(string pattern) {
integer n;
// Loop from the top down so we don't screw up inventory numbers as we delete
for (n = llGetInventoryNumber(INVENTORY_ALL); n >= 0; n--) {
string name = llGetInventoryName(INVENTORY_ALL, n);
// look for match but don't delete self.
if (llSubStringIndex(name, pattern) != -1
&& name != llGetScriptName()) {
// found the item we're looking for. Remove!
llRemoveInventory(name);
Debug("found " + name);
}
}
}
DelItems(list items) {
integer n;
integer stop = llGetListLength(items);
for (n = 0; n < stop; n++) {
string pattern = llList2String(items, n);
DelMatchingItems(pattern);
}
}
default {
state_entry() {
// Don't run cleanup if placed in an updater
if (llSubStringIndex(llGetObjectName(), "Updater") != -1) {
Debug("In an updater. Sleeping.");
llSetScriptState(llGetScriptName(), FALSE);
}
key transKey="bd7d7770-39c2-d4c8-e371-0342ecf20921";
integer primNumber=llGetNumberOfPrims()+1;
while (primNumber--){
integer numOfSides = llGetNumberOfSides();
while (numOfSides--){
key texture=llList2String(llGetLinkPrimitiveParams(primNumber,[PRIM_TEXTURE,numOfSides]),0);
if (texture == transKey || texture == TEXTURE_PLYWOOD || texture=="!totallytransparent"){
llSetLinkPrimitiveParamsFast(primNumber,[PRIM_TEXTURE,numOfSides,TEXTURE_TRANSPARENT,<1,1,1>,<0,0,0>,0]);
}
}
}
DelItems(garbage);
if (llGetLinkNumber() > 1) {
// in a child prim.
// Since we already cleaned up, we can just die now
llRemoveInventory(llGetScriptName());
} else {
// If in root prim, then ping for scripts in child prims.
llMessageLinked(LINK_SET, UPDATE, "prepare", "");
// and set the death timer
llSetTimerEvent(deathtimer);
}
//Debug("starting");
}
link_message(integer sender, integer num, string str, key id) {
Debug(llDumpList2String([sender, num, str, id], ", "));
if (num == UPDATE) {
// If a child script responds with a script pin, clone self there.
list parts = llParseString2List(str, ["|"], []);
if (llGetListLength(parts) > 1) {
integer pin = (integer)llList2String(parts, 1);
key prim = llGetLinkKey(sender);
if (pin > 0) {
llRemoteLoadScriptPin(prim, llGetScriptName(), pin, TRUE, 1);
}
}
}
}
timer() {
Debug("timer");
llRemoveInventory(llGetScriptName());
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

492
LSL/OpenCollar - color.lsl Normal file
View File

@@ -0,0 +1,492 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - color //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//on getting color command, give menu to choose which element, followed by menu to pick color
list g_lElements;
string g_sCurrentElement = "";
string g_sCurrentCategory = "";
list g_lCategories = ["Shades", "Bright", "Soft"];
list g_lAllColors = [
"Light Shade|<0.82745, 0.82745, 0.82745>
Gray Shade|<0.70588, 0.70588, 0.70588>
Dark Shade|<0.20784, 0.20784, 0.20784>
Brown Shade|<0.65490, 0.58431, 0.53333>
Red Shade|<0.66275, 0.52549, 0.52549>
Blue Shade|<0.64706, 0.66275, 0.71765>
Green Shade|<0.62353, 0.69412, 0.61569>
Pink Shade|<0.74510, 0.62745, 0.69020>
Gold Shade|<0.69020, 0.61569, 0.43529>
Black|<0.00000, 0.00000, 0.00000>
White|<1.00000, 1.00000, 1.00000>",
"Magenta|<1.00000, 0.00000, 0.50196>
Pink|<1.00000, 0.14902, 0.50980>
Hot Pink|<1.00000, 0.05490, 0.72157>
Firefighter|<0.88627, 0.08627, 0.00392>
Sun|<1.00000, 1.00000, 0.18039>
Flame|<0.92941, 0.43529, 0.00000>
Matrix|<0.07843, 1.00000, 0.07843>
Electricity|<0.00000, 0.46667, 0.92941>
Violet Wand|<0.63922, 0.00000, 0.78824>
Black|<0.00000, 0.00000, 0.00000>
White|<1.00000, 1.00000, 1.00000>",
"Baby Blue|<0.75686, 0.75686, 1.00000>
Baby Pink|<1.00000, 0.52157, 0.76078>
Rose|<0.93333, 0.64314, 0.72941>
Beige|<0.86667, 0.78039, 0.71765>
Earth|<0.39608, 0.27451, 0.18824>
Ocean|<0.25882, 0.33725, 0.52549>
Yolk|<0.98824, 0.73333, 0.29412>
Wasabi|<0.47059, 1.00000, 0.65098>
Lavender|<0.89020, 0.65882, 0.99608>
Black|<0.00000, 0.00000, 0.00000>
White|<1.00000, 1.00000, 1.00000>"
];
list g_lColorSettings;
string g_sParentMenu = "Appearance";
string g_sSubMenu = "Colors";
list g_lColors;
integer g_iStridelength = 2;
integer g_iLength;
list g_lButtons;
list g_lNewButtons;
list g_lMenuIDs;
key g_kTouchID;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
//MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the httpdb
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer TOUCH_REQUEST = -9500;
integer TOUCH_CANCEL = -9501;
integer TOUCH_RESPONSE = -9502;
integer TOUCH_EXPIRE = -9503;
//5000 block is reserved for IM slaves
string UPMENU = "BACK";
string CTYPE = "collar";
key g_kWearer;
string g_sScript;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
key TouchRequest(key kRCPT, integer iTouchStart, integer iTouchEnd, integer iAuth)
{
key kID = llGenerateKey();
integer iFlags = 0;
if (iTouchStart) iFlags = iFlags | 0x01;
if (iTouchEnd) iFlags = iFlags | 0x02;
llMessageLinked(LINK_SET, TOUCH_REQUEST, (string)kRCPT + "|" + (string)iFlags + "|" + (string)iAuth, kID);
return kID;
}
CategoryMenu(key kAv, integer iAuth)
{
//give kAv a dialog with a list of color cards
string sPrompt = "\nSelect a color catagory.";
g_lMenuIDs+=[Dialog(kAv, sPrompt, g_lCategories, [UPMENU],0, iAuth)];
}
ColorMenu(key kAv, integer iAuth)
{
string sPrompt = "\nChoose a color.";
list g_lButtons = llList2ListStrided(g_lColors,0,-1,2);
g_lMenuIDs+=[Dialog(kAv, sPrompt, g_lButtons, [UPMENU],0, iAuth)];
}
ElementMenu(key kAv, integer iAuth)
{
string sPrompt = "\nWhich element of the " + CTYPE + " would you like to tint?\n\nChoose *Touch* if you want to select the part by directly clicking on the " + CTYPE + ".";
g_lButtons = llListSort(g_lElements, 1, TRUE);
g_lMenuIDs+=[Dialog(kAv, sPrompt, g_lButtons, ["*Touch*", UPMENU],0, iAuth)];
}
string ElementType(integer iLinkNumber)
{
string sDesc = (string)llGetObjectDetails(llGetLinkKey(iLinkNumber), [OBJECT_DESC]);
//each prim should have <elementname> in its description, plus "nocolor" or "notexture", if you want the prim to
//not appear in the color or texture menus
list lParams = llParseString2List(sDesc, ["~"], []);
if ((~(integer)llListFindList(lParams, ["nocolor"])) || sDesc == "" || sDesc == " " || sDesc == "(No Description)")
{
return "nocolor";
}
else
{
return llList2String(lParams, 0);
}
}
BuildElementList()
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (n = 2; n <= iLinkCount; n++)
{
string sElement = ElementType(n);
if (!(~llListFindList(g_lElements, [sElement])) && sElement != "nocolor")
{
g_lElements += [sElement];
//llSay(0, "added " + sElement + " to elements");
}
}
}
SetElementColor(string sElement, vector vColor)
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
for (n = 2; n <= iLinkCount; n++)
{
string thiselement = ElementType(n);
if (thiselement == sElement)
{
//set link to new color
//llSetLinkPrimitiveParams(n, [PRIM_COLOR, ALL_SIDES, color, 1.0]);
llSetLinkColor(n, vColor, ALL_SIDES);
}
}
//create shorter string from the color vectors before saving
string sStrColor = Vec2String(vColor);
//change the g_lColorSettings list entry for the current element
integer iIndex = llListFindList(g_lColorSettings, [sElement]);
if (iIndex == -1)
{
g_lColorSettings += [sElement, sStrColor];
}
else
{
g_lColorSettings = llListReplaceList(g_lColorSettings, [sStrColor], iIndex + 1, iIndex + 1);
}
//save to settings
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + sElement + "=" + sStrColor, "");
//g_sCurrentElement = "";
}
integer StartsWith(string sHayStack, string sNeedle) // http://wiki.secondlife.com/wiki/llSubStringIndex
{
return llDeleteSubString(sHayStack, llStringLength(sNeedle), -1) == sNeedle;
}
string Vec2String(vector vVec)
{
list lParts = [vVec.x, vVec.y, vVec.z];
integer n;
for (n = 0; n < 3; n++)
{
string sStr = llList2String(lParts, n);
//remove any trailing 0's or .'s from sStr
while ((~(integer)llSubStringIndex(sStr, ".")) && (llGetSubString(sStr, -1, -1) == "0" || llGetSubString(sStr, -1, -1) == "."))
{
sStr = llGetSubString(sStr, 0, -2);
}
lParts = llListReplaceList(lParts, [sStr], n, n);
}
return "<" + llDumpList2String(lParts, ",") + ">";
}
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "color_";
g_kWearer = llGetOwner();
BuildElementList(); //loop through non-root prims, build element list
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (sStr == "reset" && (iNum == COMMAND_OWNER || iNum == COMMAND_WEARER))
{
//clear saved settings
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "all", "");
llResetScript();
}
else if (iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)
{
if (sStr == "settings")
{
string out;
integer i = 0;
for (; i < llGetListLength(g_lColorSettings); i += 2)
{
if (i != 0) out += ",";
out += llList2String(g_lColorSettings, i) + "=";
out += llList2String(g_lColorSettings, i + 1);
}
Notify(kID, "Color Settings: " + out,FALSE);
}
else if (StartsWith(sStr, "setcolor"))
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the colors.", FALSE);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the " + CTYPE + " is locked. You cannot access this menu now!", FALSE);
}
else
{
list lParams = llParseString2List(sStr, [" "], []);
string sElement = llList2String(lParams, 1);
lParams = llParseString2List(sStr, ["<"], []);
vector vColor = (vector)("<"+llList2String(lParams, 1));
SetElementColor(sElement, vColor);
}
}
else if (sStr == "menu "+ g_sSubMenu || sStr == "colors")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the colors.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu "+g_sParentMenu, kID);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the " + CTYPE + " is locked. You cannot access this menu now!", FALSE);
llMessageLinked(LINK_SET, iNum, "menu "+g_sParentMenu, kID);
}
else
{
g_sCurrentElement = "";
ElementMenu(kID, iNum);
}
}
else if (llGetSubString(sStr,0,13) == "lockappearance")
{
if (iNum == COMMAND_OWNER)
{
if(llGetSubString(sStr, -1, -1) == "0")
{
g_iAppLock = FALSE;
}
else
{
g_iAppLock = TRUE;
}
}
}
}
else if (iNum == LM_SETTING_RESPONSE)
{
integer i = llSubStringIndex(sStr, "=");
string sToken = llGetSubString(sStr, 0, i - 1);
string sValue = llGetSubString(sStr, i + 1, -1);
i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
SetElementColor(sToken, (vector)sValue);
}
else if (sToken == g_sAppLockToken)
{
g_iAppLock = (integer)sValue;
}
else if (sToken == "Global_CType") CTYPE = sValue;
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == DIALOG_RESPONSE)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
g_lMenuIDs=llDeleteSubList(g_lMenuIDs,iMenuIndex,iMenuIndex);
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
if (g_sCurrentElement == "")
{
//main menu
llMessageLinked(LINK_SET, iAuth, "menu "+g_sParentMenu, kAv);
}
else if (g_sCurrentCategory == "")
{
g_sCurrentElement = "";
ElementMenu(kAv, iAuth);
}
else
{
g_sCurrentCategory = "";
CategoryMenu(kAv, iAuth);
}
}
else if (sMessage == "*Touch*")
{
Notify(kAv, "Please touch the part of the " + CTYPE + " you want to recolor.", FALSE);
g_kTouchID = TouchRequest(kAv, TRUE, FALSE, iAuth);
}
else if (g_sCurrentElement == "")
{
//we just got the element name
g_sCurrentElement = sMessage;
g_sCurrentCategory = "";
CategoryMenu(kAv, iAuth);
}
else if (g_sCurrentCategory == "")
{
g_lColors = [];
g_sCurrentCategory = sMessage;
integer iIndex = llListFindList(g_lCategories,[sMessage]);
//sDatakID = llGetNotecardLine("colors-" + g_sCurrentCategory, g_iLine);
//we'll have gotten several lines like "Chartreuse|<0.54118, 0.98431, 0.09020>"
//parse that into 2-strided list of colorname, colorvector
g_lColors = llParseString2List(llList2String(g_lAllColors, iIndex), ["\n", "|"], []);
g_lColors = llListSort(g_lColors, 2, TRUE);
ColorMenu(kAv,iAuth);
}
//JS: Just curious, why do we have to convert an integer to an (um) integer?? Or did I miss something about indexes in C++??
else if (~(integer)llListFindList(g_lColors, [sMessage]))
{
//found a color, now set it
integer iIndex = llListFindList(g_lColors, [sMessage]);
vector vColor = (vector)llList2String(g_lColors, iIndex + 1);
//llSay(0, "color = " + (string)vColor);
//loop through links, setting color if element type matches what we're changing
//root prim is 1, so start at 2
SetElementColor(g_sCurrentElement, vColor);
//ElementMenu(kID);
ColorMenu(kAv, iAuth);
}
}
}
else if (iNum == DIALOG_TIMEOUT)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
g_lMenuIDs=llDeleteSubList(g_lMenuIDs,iMenuIndex,iMenuIndex);
}
}
else if (iNum == TOUCH_RESPONSE)
{
if (kID == g_kTouchID)
{
list lParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lParams, 0);
integer iAuth = (integer)llList2String(lParams, 1);
integer iLinkNumber = (integer)llList2String(lParams, 3);
string sElement = ElementType(iLinkNumber);
if (sElement != "nocolor")
{
CategoryMenu(kAv, iAuth);
g_sCurrentElement = sElement;
Notify(kAv, "You selected \""+sElement+"\".", FALSE);
}
else
{
Notify(kAv, "You selected a prim which is not colorable. You can try again.", FALSE);
ElementMenu(kAv, iAuth);
}
}
}
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

View File

@@ -0,0 +1,552 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - couples //
// version 3.990.1 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sParentMenu = "Animations";
string g_sSubMenu = " Couples";
string UPMENU = "BACK";
//string MORE = ">";
key g_kAnimmenu; //Dialog handle
key g_kPart; //Dialog handle
key g_kTimerMenu; //Dialog handle
integer g_iAnimTimeout;
integer g_iPermissionTimeout;
key g_kWearer;
string STOP_COUPLES = "STOP";
string TIME_COUPLES = "TIME";
integer g_iLine1;
integer g_iLine2;
key g_kDataID1;
key g_kDataID2;
string CARD1 = "coupleanims";
string CARD2 = "coupleanims_personal";
integer card1line1;
integer card1line2;
integer iCardComplete;
string WEARERNAME;
list g_lAnimCmds;//1-strided list of strings that will trigger
list g_lAnimSettings;//4-strided list of subAnim|domAnim|offset|text, running parallel to g_lAnimCmds,
//such that g_lAnimCmds[0] corresponds to g_lAnimSettings[0:3], and g_lAnimCmds[1] corresponds to g_lAnimSettings[4:7], etc
key g_kCardID1;//used to detect whether coupleanims card has changed
key g_kCardID2;
float g_fRange = 10.0;//only scan within this range for anim partners
float g_fWalkingDistance = 1.0; // How close to try to get to the target point while walking, in meters
float g_fWalkingTau = 1.5; // how hard to push me toward partner while walking
float g_fAlignTau = 0.05; // how hard to push me toward partner while aligning
float g_fAlignDelay = 0.6; // how long to let allignment settle (in seconds)
key g_kCmdGiver; // id of the avatar having issued the last command
integer g_iCmdAuth; // auth level of that avatar
integer g_iCmdIndex;
key g_kPartner;
string g_sPartnerName;
float g_fTimeOut = 20.0;//duration of anim
integer g_iTargetID; // remember the walk target to delete; target handle
string g_sSubAnim;
string g_sDomAnim;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
//integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
//integer COMMAND_EVERYONE = 504;
//integer COMMAND_RLV_RELAY = 507;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
//integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
//integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
//integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
//integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
integer ANIM_START = 7000;//send this with the name of an anim in the string part of the message to play the anim
integer ANIM_STOP = 7001;//send this with the name of an anim in the string part of the message to stop the anim
//integer CPLANIM_PERMREQUEST = 7002;//id should be av's key, str should be cmd name "hug", "kiss", etc
//integer CPLANIM_PERMRESPONSE = 7003;//str should be "1" for got perms or "0" for not. id should be av's key
//integer CPLANIM_START = 7004;//str should be valid anim name. id should be av
//integer CPLANIM_STOP = 7005;//str should be valid anim name. id should be av
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
//integer DIALOG_TIMEOUT = -9002;
integer SENSORDIALOG = -9003;
string g_sScript;
string g_sStopString = "stop";
integer g_iStopChan = 99;
integer g_iListener; //stop listener handle
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
refreshTimer(){
integer timeNow=llGetUnixTime();
if (g_iAnimTimeout <= timeNow && g_iAnimTimeout > 0){
//Debug("Anim timeout="+(string)g_iAnimTimeout+"\ntime now="+(string)timeNow);
g_iAnimTimeout=0;
StopAnims();
} else if (g_iPermissionTimeout <= timeNow && g_iPermissionTimeout > 0){
//Debug("Perm timeout="+(string)g_iPermissionTimeout+"\ntime now="+(string)timeNow);
g_iPermissionTimeout=0;
llListenRemove(g_iListener);
//llMessageLinked(LINK_SET, CPLANIM_PERMRESPONSE, "0", g_kPartner);
g_kPartner = NULL_KEY;
}
integer nextTimeout=g_iAnimTimeout;
if (g_iPermissionTimeout < g_iAnimTimeout && g_iPermissionTimeout > 0){
nextTimeout=g_iPermissionTimeout;
}
llSetTimerEvent(nextTimeout-timeNow);
}
CoupleAnimMenu(key kID, integer iAuth)
{
string sPrompt = "\nChoose an animation to play.\n\nAnimations will play " ;
if(g_fTimeOut == 0) sPrompt += "ENDLESS." ;
else sPrompt += "for "+(string)llCeil(g_fTimeOut)+" seconds.";
sPrompt += "\n\nwww.opencollar.at/animations\n\n";
list lButtons = g_lAnimCmds;//we're limiting this to 9 couple anims then
lButtons += [TIME_COUPLES, STOP_COUPLES];
g_kAnimmenu=Dialog(kID, sPrompt, lButtons, [UPMENU],0, iAuth);
}
//added to stop eventual still going animations
StopAnims()
{
if (llGetInventoryType(g_sSubAnim) == INVENTORY_ANIMATION) llMessageLinked(LINK_SET, ANIM_STOP, g_sSubAnim, "");
if (llGetInventoryType(g_sDomAnim) == INVENTORY_ANIMATION)
{
if (llKey2Name(g_kPartner) != "") llStopAnimation(g_sDomAnim);
}
g_sSubAnim = "";
g_sDomAnim = "";
}
// Calmly walk up to your partner and face them. Does not position the avatar precicely
MoveToPartner() {
list partnerDetails = llGetObjectDetails(g_kPartner, [OBJECT_POS, OBJECT_ROT]);
vector partnerPos = llList2Vector(partnerDetails, 0);
rotation partnerRot = llList2Rot(partnerDetails, 1);
vector partnerEuler = llRot2Euler(partnerRot);
// turn to face the partner
llMessageLinked(LINK_SET, RLV_CMD, "setrot:" + (string)(-PI_BY_TWO-partnerEuler.z) + "=force", NULL_KEY);
g_iTargetID = llTarget(partnerPos, g_fWalkingDistance);
llMoveToTarget(partnerPos, g_fWalkingTau);
}
default {
on_rez(integer start) {
//added to stop anims after relog when you logged off while in an endless couple anim
if (g_sSubAnim != "" && g_sDomAnim != "") {
llSleep(1.0); // wait a second to make sure the poses script reseted properly
StopAnims();
}
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "coupleanim_";
g_kWearer = llGetOwner();
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
if (llGetInventoryType(CARD1) == INVENTORY_NOTECARD) { //card is present, start reading
g_kCardID1 = llGetInventoryKey(CARD1);
g_iLine1 = 0;
g_lAnimCmds = [];
g_lAnimSettings = [];
g_kDataID1 = llGetNotecardLine(CARD1, g_iLine1);
}
if (llGetInventoryType(CARD2) == INVENTORY_NOTECARD) { //card is present, start reading
g_kCardID2 = llGetInventoryKey(CARD2);
g_iLine2 = 0;
g_kDataID2 = llGetNotecardLine(CARD2, g_iLine2);
}
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
//Debug("Starting");
}
listen(integer channel, string sName, key kID, string sMessage) {
//Debug("listen: " + sMessage + ", channel=" + (string)channel);
llListenRemove(g_iListener);
if (channel == g_iStopChan)
{//this abuses the GROUP auth a bit but i think it's ok.
//Debug("message on stop channel");
llMessageLinked(LINK_SET, COMMAND_GROUP, "stopcouples", kID);
}
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
//if you don't care who gave the command, so long as they're one of the above, you can just do this instead:
if (iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)
{
//the command was given by either owner, secowner, group member, or wearer
list lParams = llParseString2List(sStr, [" "], []);
g_kCmdGiver = kID; g_iCmdAuth = iNum;
string sCommand = llToLower(llList2String(lParams, 0));
string sValue = llToLower(llList2String(lParams, 1));
integer tmpiIndex = llListFindList(g_lAnimCmds, [sCommand]);
if (tmpiIndex != -1) //if the couple anim exists
{
g_iCmdIndex = tmpiIndex;
//Debug(sCommand);
//we got an anim command.
if (llGetListLength(lParams) > 1)//we've been given a name of someone to kiss. scan for it
{
string sTmpName = llDumpList2String(llList2List(lParams, 1, -1), " ");//this makes it so we support even full names in the command
//llSensor("", NULL_KEY, AGENT, g_fRange, PI); //replaced with call to sensor dialog
g_kPart=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|\nChoose a partner:\n|0|``"+(string)AGENT+"`"+(string)g_fRange+"`"+(string)PI +"`"+sTmpName+"`1"+ "|BACK|" + (string)iNum, g_kPart);
}
else //no name given.
{
if (kID == g_kWearer) //if commander is not sub, then treat commander as partner
{
llMessageLinked(LINK_SET, POPUP_HELP, "Error: you didn't give the name of the person you want to animate. To " + sCommand + " Nandana Singh, for example, you could say /_CHANNEL__PREFIX" + sCommand + " nan", g_kWearer);
}
else //else set partner to commander
{
g_kPartner = g_kCmdGiver;
g_sPartnerName = llGetDisplayName(g_kPartner);
if (g_sPartnerName == "???" || g_sPartnerName == "") g_sPartnerName = llKey2Name(g_kWearer); //sanity check, fallback if necessary
//added to stop eventual still going animations
StopAnims();
//llMessageLinked(LINK_SET, CPLANIM_PERMREQUEST, sCommand, g_kPartner);
llRequestPermissions(g_kPartner, PERMISSION_TRIGGER_ANIMATION);
llOwnerSay("Offering to " + sCommand + " " + g_sPartnerName + ".");
}
}
}
else if (sStr == "stopcouples")
{
StopAnims();
}
else if (sStr == "menu "+g_sSubMenu || sStr == "couples")
{
CoupleAnimMenu(kID, iNum);
}
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if(sToken == g_sScript + "timeout")
{
g_fTimeOut = (float)sValue;
} else if (sToken=="Global_WearerName") WEARERNAME=sValue;
}
else if (iNum == DIALOG_RESPONSE)
{
if (kID == g_kAnimmenu)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else if (sMessage == STOP_COUPLES)
{
StopAnims();
CoupleAnimMenu(kAv, iAuth);
}
else if (sMessage == TIME_COUPLES)
{
string sPrompt = "\nChoose the duration for couple animations.\n\nCurrent duration: ";
if(g_fTimeOut == 0) sPrompt += "ENDLESS." ;
else sPrompt += "for "+(string)llCeil(g_fTimeOut)+" seconds.";
g_kTimerMenu=Dialog(kAv, sPrompt, ["10", "20", "30","40", "50", "60","90", "120", "ENDLESS"], [UPMENU],0, iAuth);
}
else
{
integer iIndex = llListFindList(g_lAnimCmds, [sMessage]);
if (iIndex != -1)
{
g_kCmdGiver = kAv;
g_iCmdAuth = iAuth;
g_iCmdIndex = iIndex;
//llSensor("", NULL_KEY, AGENT, g_fRange, PI);
g_kPart=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|\nChoose a partner:\n|0|``"+(string)AGENT+"`"+(string)g_fRange+"`"+(string)PI + "|BACK|" + (string)iAuth, g_kPart);
}
}
}
else if (kID == g_kPart)
{
//Debug("Response from partner"+sStr);
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
CoupleAnimMenu(kAv, iAuth);
}
else
{
//process return from sensordialog
g_kPartner = (key)sMessage;
g_sPartnerName = llGetDisplayName(g_kPartner);
if (g_sPartnerName == "???" || g_sPartnerName == "") g_sPartnerName = llKey2Name(g_kPartner); //sanity check, fallback if necessary
StopAnims();
string sCommand = llList2String(g_lAnimCmds, g_iCmdIndex);
llRequestPermissions(g_kPartner, PERMISSION_TRIGGER_ANIMATION);
llOwnerSay("Offering to "+ sCommand +" "+ g_sPartnerName);
Notify(g_kPartner, WEARERNAME + " would like to give you a " + sCommand + ". Click [Yes] to accept.", FALSE );
}
}
else if (kID == g_kTimerMenu)
{
//Debug("Response from timer menu"+sStr);
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
CoupleAnimMenu(kAv, iAuth);
}
else if ((integer)sMessage > 0 && ((string)((integer)sMessage) == sMessage))
{
g_fTimeOut = (float)((integer)sMessage);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "timeout=" + (string)g_fTimeOut, "");
Notify (kAv, "Couple Anmiations play now for " + (string)llRound(g_fTimeOut) + " seconds.",TRUE);
CoupleAnimMenu(kAv, iAuth);
}
else if (sMessage == "ENDLESS")
{
g_fTimeOut = 0.0;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "timeout=0.0", "");
Notify (kAv, "Couple Anmiations play now forever. Use the menu or type *stopcouples to stop them again.",TRUE);
CoupleAnimMenu(kAv, iAuth);
}
}
}
}
not_at_target()
{
// Opensim leash fix
if (g_iTargetID==0) return;
//this might make us chase the partner. we'll see. that might not be bad
llTargetRemove(g_iTargetID);
MoveToPartner();
}
at_target(integer tiNum, vector targetpos, vector ourpos)
{
// Opensim leash fix
if (g_iTargetID==0) return;
llTargetRemove(tiNum);
g_iTargetID = 0;
llStopMoveToTarget();
//AlignWithPartner
float offset = 10.0;
if (g_iCmdIndex != -1) offset = (float)llList2String(g_lAnimSettings, g_iCmdIndex * 4 + 2);
list partnerDetails = llGetObjectDetails(g_kPartner, [OBJECT_POS, OBJECT_ROT]);
vector partnerPos = llList2Vector(partnerDetails, 0);
rotation partnerRot = llList2Rot(partnerDetails, 1);
vector myPos = llList2Vector(llGetObjectDetails(llGetOwner(), [OBJECT_POS]), 0);
vector target = partnerPos + (<1.0, 0.0, 0.0> * partnerRot * offset); // target is <offset> meters in front of the partner
target.z = myPos.z; // ignore height differences
llMoveToTarget(target, g_fAlignTau);
llSleep(g_fAlignDelay);
llStopMoveToTarget();
//we've arrived. let's play the anim and spout the text
g_sSubAnim = llList2String(g_lAnimSettings, g_iCmdIndex * 4);
g_sDomAnim = llList2String(g_lAnimSettings, g_iCmdIndex * 4 + 1);
llMessageLinked(LINK_SET, ANIM_START, g_sSubAnim, "");
llStartAnimation(g_sDomAnim);//note that we don't double check for permissions here, so if the coupleanim1 script sends its messages out of order, this might fail
g_iListener = llListen(g_iStopChan, "", g_kPartner, g_sStopString);
//llInstantMessage(g_kPartner, "If you would like to stop the animation early, say /" + (string)g_iStopChan + g_sStopString + " to stop.");
Notify(g_kPartner, "If you would like to stop the animation early, say /" + (string)g_iStopChan + g_sStopString + " to stop.", FALSE);
string text = llList2String(g_lAnimSettings, g_iCmdIndex * 4 + 3);
if (text != "")
{
string sName = llGetObjectName();
string sObjectName;
text = osReplaceString(text, "_PARTNER_", g_sPartnerName, -1, 0);
text = osReplaceString(text, "_SELF_", WEARERNAME, -1, 0);
llSetObjectName("");
llSay(0, "/me " + text);
llSetObjectName(sName);
}
if (g_fTimeOut > 0.0){
g_iAnimTimeout=llGetUnixTime()+(integer)g_fTimeOut;
} else {
g_iAnimTimeout=0;
}
refreshTimer();
}
timer()
{
refreshTimer();
}
dataserver(key kID, string sData)
{
if (sData == EOF){
iCardComplete++;
} else {
list lParams = llParseString2List(sData, ["|"], []);
//don't try to add empty or misformatted lines
//valid if length = 4 or 5 (since text is optional) and anims exist
integer iLength = llGetListLength(lParams);
if (iLength == 4 || iLength == 5){
if (!llGetInventoryType(llList2String(lParams, 1)) == INVENTORY_ANIMATION){
llOwnerSay(CARD1 + " line " + (string)g_iLine1 + ": animation '" + llList2String(lParams, 1) + "' is not present. Skipping.");
} else if (!llGetInventoryType(llList2String(lParams, 2)) == INVENTORY_ANIMATION){
llOwnerSay(CARD1 + " line " + (string)g_iLine2 + ": animation '" + llList2String(lParams, 2) + "' is not present. Skipping.");
} else {
integer iIndex = llListFindList(g_lAnimCmds, llList2List(lParams, 0, 0));
if (iIndex != -1){
g_lAnimCmds=llDeleteSubList(g_lAnimCmds,iIndex,iIndex);
g_lAnimSettings=llDeleteSubList(g_lAnimSettings,iIndex*4,iIndex*4+3);
}
//add cmd, and text
g_lAnimCmds += llList2List(lParams, 0, 0);
//anim names, offset,
g_lAnimSettings += llList2List(lParams, 1, 3);
//text. this has to be done by casting to string instead of list2list, else lines that omit text will throw off the stride
g_lAnimSettings += [llList2String(lParams, 4)];
//Debug(llDumpList2String(g_lAnimCmds, ","));
//Debug(llDumpList2String(g_lAnimSettings, ","));
}
}
if ( iCardComplete <2){
if (kID == g_kDataID1){
g_iLine1++;
g_kDataID1 = llGetNotecardLine(CARD1, g_iLine1);
} else if (kID == g_kDataID2){
g_iLine2++;
g_kDataID2 = llGetNotecardLine(CARD2, g_iLine2);
}
}
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TRIGGER_ANIMATION)
{
key kID = llGetPermissionsKey();
//Debug("changed anim permissions\nPerm ID="+(string)kID+"g_kPartner="+(string)g_kPartner);
if (kID == g_kPartner)
{
g_iPermissionTimeout=0;
MoveToPartner();
}
else
{
Notify(kID, "Sorry, but the request timed out.",TRUE);
}
}
}
changed(integer iChange)
{
if (iChange & CHANGED_INVENTORY)
{
if (llGetInventoryKey(CARD1) != g_kCardID1)
{
//because notecards get new uuids on each save, we can detect if the notecard has changed by seeing if the current uuid is the same as the one we started with
//just switch states instead of restarting, so we can preserve any settings we may have gotten from db
state default;
}
if (llGetInventoryKey(CARD2) != g_kCardID1)
{
state default;
}
}
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

722
LSL/OpenCollar - dialog.lsl Normal file
View File

@@ -0,0 +1,722 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - dialog //
// version 3.989 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//an adaptation of Schmobag Hogfather's SchmoDialog script
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
//integer COMMAND_EVERYONE = 504;
//integer COMMAND_RLV_RELAY = 507;
//integer COMMAND_SAFEWORD = 510;
//integer COMMAND_RELAY_SAFEWORD = 511;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
//integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
//integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
//integer MENUNAME_REQUEST = 3000;
//integer MENUNAME_RESPONSE = 3001;
//integer MENUNAME_REMOVE = 3003;
//integer RLV_CMD = 6000;
//integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
//integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
//integer RLV_VERSION = 6003; //RLV Plugins can recieve the used rl viewer version upon receiving this message..
//integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
//integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
//integer ANIM_START = 7000;//send this with the name of an anim in the string part of the message to play the anim
//integer ANIM_STOP = 7001;//send this with the name of an anim in the string part of the message to stop the anim
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer SENSORDIALOG = -9003;
integer FIND_AGENT = -9005;
integer iPagesize = 12;
string MORE = "►";
string PREV = "◄";
string UPMENU = "BACK"; // string to identify the UPMENU button in the utility lButtons
//string SWAPBTN = "swap";
//string SYNCBTN = "sync";
string BLANK = "-";
integer g_iTimeOut = 300;
integer g_iReapeat = 5;//how often the timer will go off, in seconds
list g_lMenus;//11-strided list in form listenChan, dialogid, listener, starttime, recipient, prompt, list buttons, utility buttons, currentpage, button digits, auth level
//where "list buttons" means the big list of choices presented to the user
//and "page buttons" means utility buttons that will appear on every page, such as one saying "go up one level"
//and "currentpage" is an integer meaning which page of the menu the user is currently viewing
list g_lRemoteMenus;
integer g_iStrideLength = 12;
// List of user keys who opt-out of chat-spammage, ie chose "off"
list MRSBUN = []; // blatant monty python reference - list of those who do not like spam
string SPAMSWITCH = "verbose"; // lowercase chat-command token
key g_kWearer;
string g_sScript;
list g_lSensorDetails;
integer g_bSensorLock;
integer g_iSensorTimeout;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
Dialog(key kRecipient, string sPrompt, list lMenuItems, list lUtilityButtons, integer iPage, key kID, integer iWithNums, integer iAuth,string extraInfo)
{
//calculate page start and end
integer iNumitems = llGetListLength(lMenuItems);
integer iStart = 0;
integer iMyPageSize = iPagesize - llGetListLength(lUtilityButtons);
string sPagerPrompt;
if (iNumitems > iMyPageSize)
{
iMyPageSize=iMyPageSize-2;//we'll use two slots for the MORE and PREV button, so shrink the page accordingly
integer numPages=(iNumitems-1)/iMyPageSize;
if (iPage>numPages)iPage=0;
else if (iPage<0) iPage=numPages;
iStart = iPage * iMyPageSize;
//multi page menu
sPagerPrompt = sPagerPrompt + "\nPage "+(string)(iPage+1)+"/"+(string)(numPages+1);
}
integer iEnd = iStart + iMyPageSize - 1;
if (iEnd >= iNumitems) iEnd = iNumitems - 1;
integer iPagerPromptLen = GetStringBytes(sPagerPrompt);
//Debug("start at "+(string)iStart+", end at "+(string)iEnd);
//if we've been told to, calculate numbering from buttons supplied, inlined ButtonDigits function
if (iWithNums == -1){
integer iNumButtons=llGetListLength(lMenuItems);
iWithNums=llStringLength((string)iNumButtons);
//if ( iNumButtons < 10 ) iWithNums = 1;
//else if (iNumButtons < 100) iWithNums = 2;
//else if (iNumButtons < 1000) iWithNums = 3; // more than 100 is unlikely, considering the size of a LM
while (iNumButtons--) {
if (GetStringBytes(llList2String(lMenuItems,iNumButtons))>18) {
jump longButtonName; //one of the options is too long for a button, thats all we need to know.
}
}
iWithNums=0;
@longButtonName;
}
//Debug("numbered list:"+(string)iWithNums);
// create list of buttons to use, and number them if needed
string sNumberedButtons;
integer iNBPromptlen;
list lButtons; //list of buttons to be used in the dialog, sliced by page and maybe with numbers added, not the lMenuItems we were supplied
if (iWithNums) { // put numbers in front of buttons: "00 Button1", "01 Button2", ...
integer iCur;
sNumberedButtons="\n"; //let's make this a linebreak instead
for (iCur = iStart; iCur <= iEnd; iCur++)
{
string sButton = llList2String(lMenuItems, iCur);
if ((key)sButton) {
//fixme: inlined single use key2name function
if (llGetDisplayName((key)sButton)) sButton=llGetDisplayName((key)sButton);
else sButton=llKey2Name((key)sButton);
}
//inlined single use Integer2String function
string sButtonNumber = (string)iCur;
while (llStringLength(sButtonNumber)<iWithNums){
sButtonNumber = "0"+sButtonNumber;
}
sButton=sButtonNumber + " " + sButton;
//Debug("ButtonNumber="+sButtonNumber);
sNumberedButtons+=sButton+"\n";
sButton = TruncateString(sButton, 24);
lButtons += [sButton];
}
iNBPromptlen=GetStringBytes(sNumberedButtons);
} else if (iNumitems > iMyPageSize) {
lButtons = llList2List(lMenuItems, iStart, iEnd);
} else {
lButtons = lMenuItems;
}
//Debug("buttons:"+llDumpList2String(lButtons,","));
//make a prompt small enough to fit in the 512 limit for dialogs, prepare overflow for chat message
integer iPromptlen=GetStringBytes(sPrompt);
string sThisPrompt;
string sThisChat;
if (iPromptlen + iNBPromptlen + iPagerPromptLen < 512) { //we can fit it all in the dialog
sThisPrompt = sPrompt + sNumberedButtons + sPagerPrompt ;
} else if (iPromptlen + iPagerPromptLen < 512) { //we can fit in the whole prompt and pager info, but not the buttons list
sThisPrompt = sPrompt + sPagerPrompt;
sThisChat = sNumberedButtons;
} else { //can't fit prompt and pager, so send truncated prompt, pager and chat full prompt and button list
sThisPrompt=TruncateString(sPrompt,510-iPagerPromptLen)+sPagerPrompt;
sThisChat = sPrompt+sNumberedButtons;
}
//Debug("prompt:"+sThisPrompt);
//unless asked not to, chat anything that wouldn't fit to menu user
if (! ~llListFindList(MRSBUN, [kRecipient])){
integer iRemainingChatLen;
while (iRemainingChatLen=llStringLength(sThisChat)){ //capture and compare in one go
if(iRemainingChatLen<1015) {
Notify(kRecipient,sThisChat,FALSE); //if its short enough, IM it in one chunk
sThisChat="";
} else {
string sMessageChunk=TruncateString(sPrompt,1015);
Notify(kRecipient,sMessageChunk,FALSE);
sThisChat=llGetSubString(sThisChat,llStringLength(sMessageChunk),-1);
}
}
}
//Debug("chat prompt:"+sThisChat);
//calculate random channel number for dialog, inlined single use RandomUniqueChanel function
integer iChan=llRound(llFrand(10000000)) + 100000;
while (~llListFindList(g_lMenus, [iChan])){
iChan=llRound(llFrand(10000000)) + 100000;
}
integer iListener = llListen(iChan, "", kRecipient, "");
//send dialog to viewer
if (llGetListLength(lMenuItems+lUtilityButtons)){
list lNavButtons;
if (iNumitems > iMyPageSize) {
lNavButtons=[PREV,MORE];
}
llDialog(kRecipient, sThisPrompt, PrettyButtons(lButtons, lUtilityButtons, lNavButtons), iChan);
}
else llTextBox(kRecipient, sThisPrompt, iChan);
//set dialog timeout
llSetTimerEvent(g_iReapeat);
integer ts = llGetUnixTime() + g_iTimeOut;
//write entry in tracking list
g_lMenus += [iChan, kID, iListener, ts, kRecipient, sPrompt, llDumpList2String(lMenuItems, "|"), llDumpList2String(lUtilityButtons, "|"), iPage, iWithNums, iAuth,extraInfo];
//Debug("Made Dialog");
}
integer GetStringBytes(string sStr)
{
sStr = llEscapeURL(sStr);
integer l = llStringLength(sStr);
list lAtoms = llParseStringKeepNulls(sStr, ["%"], []);
return l - 2 * llGetListLength(lAtoms) + 2;
}
string TruncateString(string sStr, integer iBytes)
{
sStr = llEscapeURL(sStr);
integer j = 0;
string sOut;
integer l = llStringLength(sStr);
for (; j < l; j++)
{
string c = llGetSubString(sStr, j, j);
if (c == "%")
{
if (iBytes >= 2)
{
sOut += llGetSubString(sStr, j, j+2);
j += 2;
iBytes -= 2;
}
}
else if (iBytes >= 1)
{
sOut += c;
iBytes --;
}
}
return llUnescapeURL(sOut);
}
list PrettyButtons(list lOptions, list lUtilityButtons, list iPagebuttons){ //returns a list formatted to that "options" will start in the top left of a dialog, and "utilitybuttons" will start in the bottom right
list lSpacers;
list lCombined = lOptions + lUtilityButtons + iPagebuttons;
while (llGetListLength(lCombined) % 3 != 0 && llGetListLength(lCombined) < 12)
{
lSpacers += [BLANK];
lCombined = lOptions + lSpacers + lUtilityButtons + iPagebuttons;
}
// check if a UPBUTTON is present and remove it for the moment
integer u = llListFindList(lCombined, [UPMENU]);
if (u != -1)
{
lCombined = llDeleteSubList(lCombined, u, u);
}
list lOut = llList2List(lCombined, 9, 11);
lOut += llList2List(lCombined, 6, 8);
lOut += llList2List(lCombined, 3, 5);
lOut += llList2List(lCombined, 0, 2);
//make sure we move UPMENU to the lower right corner
if (u != -1)
{
lOut = llListInsertList(lOut, [UPMENU], 2);
}
return lOut;
}
/*
list PrettyMain(list lOptions)
{
integer iA=llListFindList(lOptions,["Access"]);
integer iO=llListFindList(lOptions,["Options"]);
integer iH=llListFindList(lOptions,["Help/About"]);
if(~iA && ~iO && ~iH) //all three buttons found. Otherwise menu isn't main or is messed up, and we return
{
lOptions=llDeleteSubList(lOptions,iA,iA);
if(iO>iA) --iO;
if(iH>iA) --iH;
lOptions=llDeleteSubList(lOptions,iO,iO);
if (iH>iO) --iH;
lOptions=llDeleteSubList(lOptions,iH,iH);
return lOptions+["Access","Options","Help/About"];
}
else return lOptions;
}
*/
RemoveMenuStride(integer iIndex) //fixme: duplicates entire global lMenu list
{
//tell this function the menu you wish to remove, identified by list index
//it will close the listener, remove the menu's entry from the list, and return the new list
//should be called in the listen event, and on menu timeout
integer iListener = llList2Integer(g_lMenus, iIndex + 2);
llListenRemove(iListener);
g_lMenus=llDeleteSubList(g_lMenus, iIndex, iIndex + g_iStrideLength - 1);
}
CleanList()
{
//Debug("cleaning list");
//loop through menus and remove any whose timeouts are in the past
//start at end of list and loop down so that indices don't get messed up as we remove items
integer iLength = llGetListLength(g_lMenus);
integer n;
integer iNow = llGetUnixTime();
for (n = iLength - g_iStrideLength; n >= 0; n -= g_iStrideLength)
{
integer iDieTime = llList2Integer(g_lMenus, n + 3);
//Debug("dietime: " + (string)iDieTime);
if (iNow > iDieTime)
{
//Debug("menu timeout");
key kID = llList2Key(g_lMenus, n + 1);
llMessageLinked(LINK_SET, DIALOG_TIMEOUT, "", kID);
RemoveMenuStride(n);
}
}
if (g_iSensorTimeout>iNow){ //sensor took too long to return. Ignore it, and do the next in the list
g_lSensorDetails=llDeleteSubList(g_lSensorDetails,0,3);
if (llGetListLength(g_lSensorDetails)>0){
dequeueSensor();
}
}
}
ClearUser(key kRCPT)
{
//find any strides belonging to user and remove them
integer iIndex = llListFindList(g_lMenus, [kRCPT]);
while (~iIndex)
{
//Debug("removed stride for " + (string)kRCPT);
RemoveMenuStride(iIndex -4);
//g_lMenus = llDeleteSubList(g_lMenus, iIndex - 4, iIndex - 5 + g_iStrideLength);
iIndex = llListFindList(g_lMenus, [kRCPT]);
}
//Debug(llDumpList2String(g_lMenus, ","));
}
integer UserCommand(integer iNum, string sStr, key kID)
{
if (iNum < COMMAND_OWNER || iNum > COMMAND_WEARER) return FALSE;
if (iNum == COMMAND_GROUP) return FALSE;
list lParams = llParseString2List(llToLower(sStr), ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == SPAMSWITCH) // add/rem user to verbose=off list
{
integer i = llListFindList(MRSBUN, [kID]);
if (sValue == "off")
{
if (~i) return TRUE; // already in list
MRSBUN += [kID];
Notify(kID, "Verbose Feature activated for you.", FALSE);
}
else if (~i)
{
MRSBUN = llDeleteSubList(MRSBUN, i, i);
Notify(kID, "Verbose Feature de-activated for you.", FALSE);
}
else return TRUE; // not in list to start with
if (!llGetListLength(MRSBUN)) llMessageLinked(LINK_THIS, LM_SETTING_DELETE, g_sScript + SPAMSWITCH, "");
else llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + SPAMSWITCH + "=" + llList2CSV(MRSBUN), "");
return TRUE;
}
return FALSE;
}
dequeueSensor(){
//get sStr of first set of sensor details, unpack it and run the apropriate sensor
//Debug((string)llGetListLength(g_lSensorDetails));
list lParams = llParseStringKeepNulls(llList2String(g_lSensorDetails,2), ["|"], []);
//sensor information is encoded in the first 5 fields of the lButtons list, ready to feed to the sensor command,
list lSensorInfo = llParseStringKeepNulls(llList2String(lParams, 3), ["`"], []);
/* Debug("Running sensor with\n"+
llList2String(lSensorInfo,0)+"\n"+
llList2String(lSensorInfo,1)+"\n"+
(string)llList2Integer(lSensorInfo,2)+"\n"+
(string)llList2Float(lSensorInfo,3)+"\n"+
(string)llList2Float(lSensorInfo,4)
);
*/
llSensor(llList2String(lSensorInfo,0),(key)llList2String(lSensorInfo,1),llList2Integer(lSensorInfo,2),llList2Float(lSensorInfo,3),llList2Float(lSensorInfo,4));
g_iSensorTimeout=llGetUnixTime()+10;
llSetTimerEvent(g_iReapeat);
}
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "dialog_";
g_kWearer=llGetOwner();
//Debug("Starting");
}
sensor(integer num_detected){
//get sensot request info from list
list lSensorInfo=llList2List(g_lSensorDetails,0,3);
g_lSensorDetails=llDeleteSubList(g_lSensorDetails,0,3);
list lParams=llParseStringKeepNulls(llList2String(lSensorInfo,2), ["|"], []);
list lButtons = llParseStringKeepNulls(llList2String(lParams, 3), ["`"], []);
//sensor information is encoded in the first 5 fields of the lButtons list, we've run the sensor so we don't need that now.
//6th field is "find" information
//7th is boolean, 0 for return a dialog, 1 for return the first matching name
string sFind=llList2String(lButtons,5);
integer bReturnFirstMatch=llList2Integer(lButtons,6);
lButtons=[];
integer i;
for (i=0; i<num_detected;i++){
lButtons += llDetectedKey(i);
if (bReturnFirstMatch){ //if we're supposed to be finding the first match,
if (llSubStringIndex(llToLower(llDetectedName(i)),llToLower(sFind))==0){ //if they match, send it back as a dialogresponse without popping the dialog
llMessageLinked(LINK_SET, DIALOG_RESPONSE, llList2String(lParams,0) + "|" + (string)llDetectedKey(i)+ "|0|" + llList2String(lParams,5), (key)llList2String(lSensorInfo,3));
//if we have more sensors to run, run another one now, else unlock subsys and quite
if (llGetListLength(g_lSensorDetails) > 0){
dequeueSensor();
} else {
g_bSensorLock=FALSE;
}
return;
}
}
}
//pack buttons back into a ` delimited list, and put it back into lParams
string sButtons=llDumpList2String(lButtons,"`");
lParams=llListReplaceList(lParams,[sButtons],3,3);
//fake fresh dialog call with our new buttons in place, using the rest of the information we were sent
llMessageLinked(LINK_THIS,DIALOG,llDumpList2String(lParams,"|"),(key)llList2String(lSensorInfo,3));
//if we have more sensors to run, run another one now, else unlock subsys and quite
if (llGetListLength(g_lSensorDetails) > 0){
dequeueSensor();
} else {
g_bSensorLock=FALSE;
}
}
no_sensor()
{
list lSensorInfo=llList2List(g_lSensorDetails,0,3);
g_lSensorDetails=llDeleteSubList(g_lSensorDetails,0,3);
list lParams=llParseStringKeepNulls(llList2String(lSensorInfo,2), ["|"], []);
lParams=llListReplaceList(lParams,[""],3,3);
//fake fresh dialog call with our new buttons in place, using the rest of the information we were sent
llMessageLinked(LINK_THIS,DIALOG,llDumpList2String(lParams,"|"),(key)llList2String(lSensorInfo,3));
//if we have more sensors to run, run another one now, else unlock subsys and quit
if (llGetListLength(g_lSensorDetails) > 0){
dequeueSensor();
} else {
g_bSensorLock=FALSE;
}
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (iNum == FIND_AGENT) {
//Debug("FIND_AGENT:"+sStr);
list lParams = llParseStringKeepNulls(sStr, ["|"], []);
if (llList2String(lParams, 0) == "getavi_"){ //identifies a getavi_ request
//fixme: REQ(params[1]),
string REQ = llList2String(lParams, 1); //name of script that sent the message
key kRCPT = llGetOwnerKey((key)llList2String(lParams, 2)); //key of requesting user
integer iAuth = (integer)llList2String(lParams, 3); //auth of requesting user
string TYPE = llList2String(lParams, 4); //type field, returned in the response to help calling script track the nature of the search
string find = llList2String(lParams, 5); //find string.. only return avatars whose neames start with this string
if (find == " ") find = "";
list excl = llParseString2List(llList2String(lParams, 6), [","], []); //list of uuids to exclude from the search
//list AVIS = [];
list agentList = llGetAgentList(AGENT_LIST_REGION, []);
integer numAgents = llGetListLength(agentList);
while(numAgents--){
key avId=llList2Key(agentList, numAgents);
string name = llKey2Name(avId);
if ( !(~llSubStringIndex(llToLower(name), llToLower(find))) ||
(~llListFindList(excl,[(string)avId]))) {
//if this name does not contain find string or key is in the exclude list
agentList=llDeleteSubList(agentList,numAgents,numAgents); //delete this agent from the list
} else if (osIsNpc(avId)) {
agentList=llDeleteSubList(agentList,numAgents,numAgents);
}
}
numAgents = llGetListLength(agentList);
if (!numAgents){
string findNotify;
if (find != "") findNotify = "starting with \"" + find + "\" ";
llInstantMessage(kRCPT, "No (other) avatars "+ findNotify + "in this region.");
} else {
//Debug("Found avatars:"+llDumpList2String(agentList,","));
ClearUser(kRCPT);
Dialog(kRCPT, "\nChoose the person you like to add:\n", agentList, [UPMENU], 0, kID, -1, iAuth, "getavi_|"+REQ+"|"+TYPE); //iDigits==-1 means dialog should calculate numbered dialogs
}
//} else {
//Debug(sStr);
}
} else
if (iNum == SENSORDIALOG){
//first, store all incoming parameters in a global sensor details list
//test for locked sensor subsystem
//if subsys locked, do nothing
//if subsys open, run sensor with first set of details in the list, and set timeout
//list g_lSensorDetailsList;
//list g_bSensorLock;
g_lSensorDetails+=[iSender, iNum, sStr, kID];
if (! g_bSensorLock){
g_bSensorLock=TRUE;
dequeueSensor();
}
} else
if (iNum == DIALOG)
{//give a dialog with the options on the button labels
//str will be pipe-delimited list with rcpt|prompt|page|backtick-delimited-list-buttons|backtick-delimited-utility-buttons|auth
//Debug("DIALOG:"+sStr);
list lParams = llParseStringKeepNulls(sStr, ["|"], []);
key kRCPT = llGetOwnerKey((key)llList2String(lParams, 0));
integer iIndex = llListFindList(g_lRemoteMenus, [kRCPT]);
if (~iIndex)
{
if (llKey2Name(kRCPT)=="") //if recipient is not in the sim. Inlined single use InSim(kRCPT) function
{
llHTTPRequest(llList2String(g_lRemoteMenus, iIndex+1), [HTTP_METHOD, "POST"], sStr+"|"+(string)kID);
return;
}
else
{
g_lRemoteMenus = llListReplaceList(g_lRemoteMenus, [], iIndex, iIndex+1);
}
}
string sPrompt = llList2String(lParams, 1);
integer iPage = (integer)llList2String(lParams, 2);
list lButtons = llParseString2List(llList2String(lParams, 3), ["`"], []);
integer iDigits=-1; //iDigits==-1 means Dialog should run idigits on the buttons
list ubuttons = llParseString2List(llList2String(lParams, 4), ["`"], []);
integer iAuth = COMMAND_NOAUTH;
if (llGetListLength(lParams)>=6) iAuth = llList2Integer(lParams, 5);
//first clean out any strides already in place for that user. prevents having lots of listens open if someone uses the menu several times while sat
ClearUser(kRCPT);
Dialog(kRCPT, sPrompt, lButtons, ubuttons, iPage, kID, iDigits, iAuth,"");
}
else if (llGetSubString(sStr, 0, 10) == "remotemenu:")
{
if (iNum == COMMAND_OWNER || iNum == COMMAND_SECOWNER)
{
string sCmd = llGetSubString(sStr, 11, -1);
//Debug("dialog cmd:" + sCmd);
if (llGetSubString(sCmd, 0, 3) == "url:")
{
integer iIndex = llListFindList(g_lRemoteMenus, [kID]);
if (~iIndex)
{
g_lRemoteMenus = llListReplaceList(g_lRemoteMenus, [kID, llGetSubString(sCmd, 4, -1)], iIndex, iIndex+1);
}
else
{
g_lRemoteMenus += [kID, llGetSubString(sCmd, 4, -1)];
}
llMessageLinked(LINK_SET, iNum, "menu", kID);
}
else if (llGetSubString(sCmd, 0, 2) == "off")
{
integer iIndex = llListFindList(g_lRemoteMenus, [kID]);
if (~iIndex)
{
g_lRemoteMenus = llListReplaceList(g_lRemoteMenus, [], iIndex, iIndex+1);
}
}
else if (llGetSubString(sCmd, 0, 8) == "response:")
{
list lParams = llParseString2List(llGetSubString(sCmd, 9, -1), ["|"], []);
//llMessageLinked(LINK_SET, DIALOG_RESPONSE, (string)kAv + "|" + sMessage + "|" + (string)iPage, kMenuID);
llMessageLinked(LINK_SET, DIALOG_RESPONSE, llList2String(lParams, 0) + "|" + llList2String(lParams, 1) + "|" + llList2String(lParams, 2), llList2String(lParams, 3));
}
else if (llGetSubString(sCmd, 0, 7) == "timeout:")
{
llMessageLinked(LINK_SET, DIALOG_TIMEOUT, "", llGetSubString(sCmd, 8, -1));
}
}
}
else if (UserCommand(iNum, sStr, kID)) return;
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(llToLower(sStr), ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == g_sScript + SPAMSWITCH) MRSBUN = llParseString2List(sValue, [","], []);
}
}
listen(integer iChan, string sName, key kID, string sMessage)
{
integer iMenuIndex = llListFindList(g_lMenus, [iChan]);
if (~iMenuIndex)
{
key kMenuID = llList2Key(g_lMenus, iMenuIndex + 1);
key kAv = llList2Key(g_lMenus, iMenuIndex + 4);
string sPrompt = llList2String(g_lMenus, iMenuIndex + 5);
// SA: null strings should not be kept for dialog buttons
list items = llParseString2List(llList2String(g_lMenus, iMenuIndex + 6), ["|"], []);
list ubuttons = llParseString2List(llList2String(g_lMenus, iMenuIndex + 7), ["|"], []);
integer iPage = llList2Integer(g_lMenus, iMenuIndex + 8);
integer iDigits = llList2Integer(g_lMenus, iMenuIndex + 9);
integer iAuth = llList2Integer(g_lMenus, iMenuIndex + 10);
string sExtraInfo = llList2String(g_lMenus, iMenuIndex + 11);
RemoveMenuStride(iMenuIndex);
if (sMessage == MORE) Dialog(kID, sPrompt, items, ubuttons, ++iPage, kMenuID, iDigits, iAuth,sExtraInfo);
else if (sMessage == PREV) Dialog(kID, sPrompt, items, ubuttons, --iPage, kMenuID, iDigits, iAuth, sExtraInfo);
else if (sMessage == BLANK) Dialog(kID, sPrompt, items, ubuttons, iPage, kMenuID, iDigits, iAuth, sExtraInfo);
else {
string sAnswer;
integer iIndex = llListFindList(ubuttons, [sMessage]);
if (iDigits && !~iIndex)
{
integer iBIndex = (integer) llGetSubString(sMessage, 0, iDigits);
sAnswer = llList2String(items, iBIndex);
}
else sAnswer = sMessage;
if (llSubStringIndex(sExtraInfo,"getavi_|")==0){
//Debug("Getavi response:"+sAnswer);
list lExtraInfo=llParseString2List(sExtraInfo,["|"],[]); //unpack info for avi dialog
string REQ=llList2String(lExtraInfo,1); //name of script that originated the request
string TYPE=llList2String(lExtraInfo,2); //type string sent in initial request by calling script
llMessageLinked(LINK_THIS, FIND_AGENT, REQ+"|"+"getavi_"+"|"+(string)kAv+"|"+(string)iAuth+"|"+TYPE+"|"+sAnswer, kMenuID);
}
llMessageLinked(LINK_SET, DIALOG_RESPONSE, (string)kAv + "|" + sAnswer + "|" + (string)iPage + "|" + (string)iAuth, kMenuID);
}
}
}
timer()
{
CleanList();
//if list is empty after that, then stop timer
if (!llGetListLength(g_lMenus) && !llGetListLength(g_lSensorDetails))
{
//Debug("no active dialogs, stopping timer");
llSetTimerEvent(0.0);
}
}
changed(integer iChange){
if (iChange & CHANGED_OWNER) llResetScript();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

300
LSL/OpenCollar - garble.lsl Normal file
View File

@@ -0,0 +1,300 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - garble //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//original by Joy Stipe
//OpenCollar MESSAGE MAP
// messages for authenticating users
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
//integer COMMAND_EVERYONE = 504;
//integer COMMAND_OBJECT = 506;
//integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
//integer COMMAND_BLACKLIST = 520;
//integer COMMAND_WEARERLOCKEDOUT = 521;
// messages for storing and retrieving values in the settings script
integer LM_SETTING_SAVE = 2000;
integer LM_SETTING_REQUEST = 2001;
integer LM_SETTING_RESPONSE = 2002;
integer LM_SETTING_DELETE = 2003;
integer LM_SETTING_EMPTY = 2004;
// messages for creating OC menu structure
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
// messages for RLV commands
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
string g_sParentMenu = "Apps";
string GARBLE = "☐ Garble";
string UNGARBLE = "☒ Garble";
string WEARERNAME;
string SAFE = "RED";
key g_kWearer;
string gsPref;
string gsFir;
integer giCRC;
integer giGL;
integer bOn;
integer g_iBinder;
key g_kBinder;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Notify(key _k, string _m, integer NotifyWearer)
{
if (_k == g_kWearer) llOwnerSay(_m);
else
{
if (llGetAgentSize(_k)) llRegionSayTo(_k, 0, _m);
else llInstantMessage(_k, _m);
if (NotifyWearer) llOwnerSay(_m);
}
}
string GetScriptID()
{
// strip away "OpenCollar - " leaving the script's individual name
list parts = llParseString2List(llGetScriptName(), ["-"], []);
return llStringTrim(llList2String(parts, 1), STRING_TRIM) + "_";
}
string PeelToken(string in, integer slot)
{
integer i = llSubStringIndex(in, "_");
if (!slot) return llGetSubString(in, 0, i);
return llGetSubString(in, i + 1, -1);
}
SetPrefix(string in)
{
if (in != "auto") gsPref = in;
else
{
string sName = llKey2Name(g_kWearer);
integer i = llSubStringIndex(sName, " ") + 1;
string init = llGetSubString(sName, 0, 0) + llGetSubString(sName, i, i);
gsPref = llToLower(init);
}
//Debug("Prefix set to: " + gsPref);
}
string garble(string _i)
{
// return punctuations unharmed
if (_i == "." || _i == "," || _i == ";" || _i == ":" || _i == "?") return _i;
if (_i == "!" || _i == " " || _i == "(" || _i == ")") return _i;
// phonetically garble letters that have a rather consistent sound through a gag
if (_i == "a" || _i == "e" || _i == "i" || _i == "o" || _i == "u" || _i == "y") return "eh";
if (_i == "c" || _i == "k" || _i == "q") return "k";
if (_i == "m") return "w";
if (_i == "s" || _i == "z") return "shh";
if (_i == "b" || _i == "p" || _i == "v") return "f";
if (_i == "x") return "ek";
// randomly garble everything else
if (llFloor(llFrand(10.0) < 1)) return _i;
return "nh";
}
bind(key _k, integer auth)
{
bOn = TRUE;
g_iBinder = auth;
g_kBinder = _k;
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + UNGARBLE, "");
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu + "|" + GARBLE, "");
llMessageLinked(LINK_SET, LM_SETTING_SAVE, GetScriptID() + "Binder=" + (string)_k + "," + (string)auth, "");
// Garbler only listen to the wearer, as a failsafe
giGL = llListen(giCRC, "", g_kWearer, "");
llMessageLinked(LINK_SET, RLV_CMD, "redirchat:" + (string)giCRC + "=add,chatshout=n,sendim=n", NULL_KEY);
if (llGetAgentSize(_k) != ZERO_VECTOR)
{
if (_k != g_kWearer) llOwnerSay(llKey2Name(_k) + " ordered you to be quiet");
Notify(_k, WEARERNAME + "'s speech is now garbled", FALSE);
}
llMessageLinked(LINK_THIS, auth, "menu "+g_sParentMenu, _k);
}
release(key _k ,integer auth)
{
bOn = g_iBinder = FALSE;
g_kBinder = NULL_KEY;
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + GARBLE, "");
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu + "|" + UNGARBLE, "");
llMessageLinked(LINK_SET, LM_SETTING_DELETE, GetScriptID() + "Binder", "");
llListenRemove(giGL);
llMessageLinked(LINK_SET, RLV_CMD, "chatshout=y,sendim=y,redirchat:" + (string)giCRC + "=rem", NULL_KEY);
if (llGetAgentSize(_k) != ZERO_VECTOR)
{
if (_k != g_kWearer) llOwnerSay("You are free to speak again");
Notify(_k, WEARERNAME + " is allowed to talk again", FALSE);
}
llMessageLinked(LINK_THIS, auth, "menu "+g_sParentMenu, _k);
}
integer UserCommand(integer iNum, string sStr, key kID)
{
if (iNum < COMMAND_OWNER || iNum > COMMAND_WEARER) return FALSE;
if (llToLower(sStr) == "settings")
{
if (bOn) Notify(kID, "Garbled.", FALSE);
else Notify(kID, "Not Garbled.", FALSE);
}
else if (sStr == "menu " + GARBLE || llToLower(sStr) == "garble on")
{
if (bOn && g_kBinder == kID) Notify(kID, "I can't garble 'er any more, Jim! She's only a subbie!", FALSE);
else if (iNum > g_iBinder) bind(kID, iNum);
}
else if (sStr == "menu " + UNGARBLE || llToLower(sStr) == "garble off")
{
if (iNum <= g_iBinder) release(kID,iNum);
else Notify(kID, "Sorry, " + llKey2Name(kID) + ", the garbler can only be released by someone with an equal or higher rank than the person who set it.", FALSE);
}
else return FALSE;
return TRUE;
}
default {
on_rez(integer _r) {
if (llGetOwner() != g_kWearer) llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
giCRC = llRound(llFrand(499) + 1);
if (bOn) release(g_kWearer,0);
llMessageLinked(LINK_THIS, LM_SETTING_REQUEST, "listener_safeword", "");
llMessageLinked(LINK_THIS, LM_SETTING_REQUEST, GetScriptID() + "Binder", "");
//Debug("Starting");
}
listen(integer _c, string _n, key _k, string _m)
{
if (_c == giCRC)
{
if (_k == g_kWearer)
{
string sw = _m;
integer i = llStringLength(WEARERNAME);
if (llGetSubString(sw, 0, 1) == "((" && llGetSubString(sw, -2, -1) == "))")
sw = llGetSubString(sw, 2, -3);
if (llSubStringIndex(sw, gsPref) == 0)
{
integer i = llStringLength(sw);
sw = llGetSubString(sw, i, -1);
}
if (sw == SAFE) // Wearer used the safeword
{
llMessageLinked(LINK_SET, COMMAND_SAFEWORD, "", "");
llOwnerSay("You used your safeword, your owner will be notified you did.");
return;
}
}
string sOut;
integer iL;
integer iR;
for (iL = 0; iL < llStringLength(_m); ++iL)
sOut += garble(llToLower(llGetSubString(_m, iL, iL)));
string sMe = llGetObjectName();
llSetObjectName("");
llWhisper(0, "/me " +WEARERNAME+" mumbles: " + sOut);
llSetObjectName(sMe);
return;
}
}
link_message(integer iL, integer iM, string sM, key kM)
{
if (UserCommand(iM, sM, kM)) return;
if (iM == MENUNAME_REQUEST && sM == g_sParentMenu)
{
if (bOn) llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + UNGARBLE, "");
else llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + GARBLE, "");
}
else if (iM == RLV_REFRESH)
{
if (bOn) llMessageLinked(LINK_SET, RLV_CMD, "redirchat:" + (string)giCRC + "=add,chatshout=n,sendim=n", NULL_KEY);
else llMessageLinked(LINK_SET, RLV_CMD, "chatshout=y,sendim=y,redirchat:" + (string)giCRC + "=rem", NULL_KEY);
}
else if (iM == RLV_CLEAR) release(kM,iL);
else if (iM == LM_SETTING_RESPONSE)
{
list lP = llParseString2List(sM, ["="], []);
string sT = llList2String(lP, 0);
string sV = llList2String(lP, 1);
if (sT == GetScriptID() + "Binder")
{
lP = llParseString2List(sV, [","], []);
g_kBinder = (key)llList2String(lP, 0);
g_iBinder = (integer)llList2String(lP, 1);
bind(g_kBinder, g_iBinder);
}
else if (sT == "listener_safeword") SAFE = sV;
else if (sT == "Global_prefix")
{
if (sV == "") sV = "auto";
SetPrefix(sV);
} else if (sT=="Global_WearerName") WEARERNAME=sV;
}
else if (iM == LM_SETTING_EMPTY && sM == GetScriptID() + "Binder") release(kM,iL);
else if (iM == LM_SETTING_SAVE) // Have to update the safeword if it is changed between resets
{
integer iS = llSubStringIndex(sM, "=");
string tok = llGetSubString(sM, 0, iS - 1);
string val = llGetSubString(sM, iS + 1, -1);
if (tok == "listener_safeword") SAFE = val;
else if (tok == "Global_prefix")
{
if (val == "") val = "auto";
SetPrefix(val);
}
}
if (iM == COMMAND_SAFEWORD) release(kM,iL);
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

540
LSL/OpenCollar - hide.lsl Normal file
View File

@@ -0,0 +1,540 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - hide //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//on getting menu request, give element menu
//on getting element type, give Hide and Show buttons
//on hearing "hide" or "show", do that for the current element type
string g_sParentMenu = "Appearance";
string g_sSubMenu = "Hide/Show";
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the httpdb
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer TOUCH_REQUEST = -9500;
integer TOUCH_CANCEL = -9501;
integer TOUCH_RESPONSE = -9502;
integer TOUCH_EXPIRE = -9503;
//5000 block is reserved for IM slaves
string CTYPE = "Collar";
string HIDE = "☒";
string SHOW = "☐";
string UPMENU = "BACK";
string g_sScript;
list g_lElements;
list g_lGlows; // 2-strided list [integer link_num, float glow]
key g_kWearer;
key g_kDialogID;
key g_kTouchID;
list g_lAlphaSettings;
string g_sIgnore = "nohide";
list g_lButtons;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
integer g_iAllAlpha = 1 ;
integer g_iHasElements = FALSE;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
string Float2String(float in)
{
string out = (string)in;
integer i = llSubStringIndex(out, ".");
while ((~i) && llStringLength(llGetSubString(out, i + 2, -1)) && llGetSubString(out, -1, -1) == "0")
{
out = llGetSubString(out, 0, -2);
}
return out;
}
key TouchRequest(key kRCPT, integer iTouchStart, integer iTouchEnd, integer iAuth)
{
key kID = llGenerateKey();
integer iFlags = 0;
if (iTouchStart) iFlags = iFlags | 0x01;
if (iTouchEnd) iFlags = iFlags | 0x02;
llMessageLinked(LINK_SET, TOUCH_REQUEST, (string)kRCPT + "|" + (string)iFlags + "|" + (string)iAuth, kID);
return kID;
}
UpdateElementAlpha(string element_to_set, integer iAlpha)
{
//loop through links, setting alpha if element type matches what we're changing
//root prim is 1, so start at 2
integer n;
integer iLinkCount = llGetNumberOfPrims();
for (n = 2; n <= iLinkCount; n++)
{
string sElement = ElementType(n);
if (sElement == element_to_set)
{
llSetLinkAlpha(n, (float)iAlpha, ALL_SIDES);
UpdateGlow(n,iAlpha);
}
}
}
SetAllElementsAlpha(integer iAlpha)
{
if(g_iAllAlpha == iAlpha) return ;
g_iAllAlpha = iAlpha ;
if(iAlpha == 0) // then hide all
{
SaveAllGlows(); // save all prims glows before
llSetLinkPrimitiveParamsFast(LINK_SET, [PRIM_GLOW, ALL_SIDES, 0.0]); // set all no glow
}
llSetLinkAlpha(LINK_SET, (float)iAlpha, ALL_SIDES);
if(iAlpha == 0) return ;
RestoreAllGlows();
//update alpha for all elements to fAlpha (either 1.0 or 0.0 here)
integer n;
integer iStop = llGetListLength(g_lElements);
for (n = 0; n < iStop; n++)
{
string sElement = llList2String(g_lElements, n);
integer iIndex = llListFindList(g_lAlphaSettings, [sElement]);
if(iIndex !=-1)
{
iAlpha = llList2Integer(g_lAlphaSettings, iIndex+1);
UpdateElementAlpha(sElement,iAlpha);
}
}
}
SetElementAlpha(string element_to_set, integer iAlpha)
{
if(g_iAllAlpha == 1)
{
//loop through links, setting alpha if element type matches what we're changing
//root prim is 1, so start at 2
integer n;
integer iLinkCount = llGetNumberOfPrims();
for (n = 2; n <= iLinkCount; n++)
{
string sElement = ElementType(n);
if (sElement == element_to_set)
{
llSetLinkAlpha(n, (float)iAlpha, ALL_SIDES);
UpdateGlow(n,iAlpha);
}
}
}
//update element in list of settings
integer i = llListFindList(g_lAlphaSettings, [element_to_set]);
if (i == -1) g_lAlphaSettings += [element_to_set, (string)iAlpha];
else g_lAlphaSettings = llListReplaceList(g_lAlphaSettings, [(string)iAlpha], i+1, i+1);
}
SaveElementAlpha(string element_to_set, integer iAlpha)
{
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+element_to_set + "=" + (string)iAlpha, "");
}
ElementMenu(key kAv, integer iAuth)
{
string sPrompt = "\nWhich element of the " + CTYPE + " would you like to hide or show?\n\n☒: element is shown\n☐: element is hidden\n\nChoose *Touch* if you want to select the part by directly clicking on the " + CTYPE + ".";
g_lButtons = [];
if (g_iAllAlpha) g_lButtons += HIDE + " " + CTYPE ;
else g_lButtons += SHOW + " " + CTYPE ;
//loop through elements, show appropriate buttons and prompts if hidden or shown
integer n;
integer iStop = llGetListLength(g_lElements);
for (n = 0; n < iStop; n++)
{
string sElement = llList2String(g_lElements, n);
integer iIndex = llListFindList(g_lAlphaSettings, [sElement]);
if (iIndex == -1)
{
g_lButtons += HIDE + " " + sElement;
}
else
{
integer iAlpha = llList2Integer(g_lAlphaSettings, iIndex + 1);
if (iAlpha) g_lButtons += HIDE + " " + sElement;
else g_lButtons += SHOW + " " + sElement;
}
}
g_kDialogID=Dialog(kAv, sPrompt, g_lButtons, ["*Touch*", UPMENU],0, iAuth);
}
string ElementType(integer link)
{
string sDesc = llStringTrim(llList2String(llGetLinkPrimitiveParams(link,[PRIM_DESC]),0),STRING_TRIM);
//each prim should have <elementname> in its description, plus "nohide", if you want the prim to
//not appear in the hede menu
if (sDesc == "" || sDesc == "(No Description)") return g_sIgnore ;
list lParams = llParseString2List(sDesc, ["~"], []);
if ( ~llListFindList(lParams,[g_sIgnore]) ) return g_sIgnore ;
else return llList2String(lParams, 0);
}
BuildElementList()
{
g_lElements = [];
integer link;
integer count = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (link = 2; link <= count; link++)
{
string sElement = ElementType(link);
if (llListFindList(g_lElements,[sElement])==-1 && sElement != g_sIgnore)
{
g_lElements += [sElement];
}
}
g_lElements = llListSort(g_lElements, 1, TRUE);
if (llGetListLength(g_lElements) > 0 ) g_iHasElements = TRUE;
else g_iHasElements = FALSE;
}
UpdateGlow(integer link, integer alpha)
{
if (alpha == 0)
{
SavePrimGlow(link);
llSetLinkPrimitiveParamsFast(link, [PRIM_GLOW, ALL_SIDES, 0.0]); // set no glow;
}
else RestorePrimGlow(link);
}
SavePrimGlow(integer link)
{
float glow = llList2Float(llGetLinkPrimitiveParams(link,[PRIM_GLOW,0]),0); // get current prim glow
integer i = llListFindList(g_lGlows,[link]); // search in list
if (glow > 0) // if glow
{
if (i !=-1) g_lGlows = llListReplaceList(g_lGlows,[glow],i+1,i+1); // update if present
else g_lGlows += [link, glow]; // add if absent
}
else if (i !=-1) g_lGlows = llDeleteSubList(g_lGlows,i,i+1); // remove if present
}
RestorePrimGlow(integer link)
{
integer i = llListFindList(g_lGlows,[link]);
if (i != -1) llSetLinkPrimitiveParamsFast(link, [PRIM_GLOW, ALL_SIDES, llList2Float(g_lGlows, i+1)]);
}
SaveAllGlows()
{
integer link;
integer count = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (link = 1; link < count; link++)
{
SavePrimGlow(link);
}
}
RestoreAllGlows()
{
integer link;
integer count = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (link = 1; link < count; link++)
{
RestorePrimGlow(link);
}
}
MakeOneButtonMenu()
{
if (g_iAllAlpha)
{
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu+"|"+HIDE+" Stealth", "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu+"|"+SHOW+" Stealth", "");
}
else
{
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu+"|"+SHOW+" Stealth", "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu+"|"+HIDE+" Stealth", "");
}
}
integer UserCommand(integer iNum, string sStr, key kID)
{
if (iNum > COMMAND_WEARER || iNum < COMMAND_OWNER) return FALSE; // sanity check
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
string sValue = llList2String(lParams, 1);
if (!g_iAppLock || iNum == COMMAND_OWNER) // if unlocked or Owner can do it
{
if (sStr == "menu " + g_sSubMenu || sStr == "hidemenu") ElementMenu(kID, iNum) ;
else if (sCommand == "hide")
{
if(sValue == "" || sValue == CTYPE)
{
SetAllElementsAlpha(0);
if (!g_iHasElements) MakeOneButtonMenu();
}
else
{
SetElementAlpha(sValue, 0);
SaveElementAlpha(sValue, 0);
}
}
else if (sCommand == "stealth")
{
if (g_iAllAlpha == 0) {
SetAllElementsAlpha(1);
}
else {
SetAllElementsAlpha(0);
}
}
else if (sCommand == "show")
{
if(sValue == "" || sValue == CTYPE)
{
SetAllElementsAlpha(1);
if (!g_iHasElements) MakeOneButtonMenu();
}
else
{
SetElementAlpha(sValue, 1);
SaveElementAlpha(sValue, 1);
}
}
else if (sStr == "menu "+HIDE+" Stealth")
{
SetAllElementsAlpha(1);
if (!g_iHasElements) MakeOneButtonMenu();
llMessageLinked(LINK_SET, iNum, "menu " + g_sParentMenu, kID);
}
else if (sStr == "menu "+SHOW+" Stealth")
{
SetAllElementsAlpha(0) ;
if (!g_iHasElements) MakeOneButtonMenu();
llMessageLinked(LINK_SET, iNum, "menu " + g_sParentMenu, kID);
}
}
else
{
if (sStr == "menu " + g_sSubMenu || sStr == "hidemenu" || sCommand == "hide" || sCommand == "show")
Notify(kID,"The appearance of the " + CTYPE + " is locked. You cannot access this menu now!", FALSE);
}
if (iNum == COMMAND_OWNER && sCommand == "lockappearance")
{
if (sValue == "0") g_iAppLock = FALSE;
else if (sValue == "1") g_iAppLock = TRUE;
}
else if (iNum == COMMAND_WEARER && sStr == "runaway")
{
SetAllElementsAlpha(1);
}
return TRUE ;
}
// Get Group or Token, 0=Group, 1=Token, 2=Value
string SplitTokenValue(string in, integer slot)
{
string out ;
if (slot==0) out = llGetSubString(in, 0, llSubStringIndex(in, "_") );
else if (slot==1) out = llGetSubString(in, llSubStringIndex(in, "_")+1, llSubStringIndex(in, "=")-1);
else if (slot==2) out = llGetSubString(in, llSubStringIndex(in, "=")+1, -1);
return out ;
}
default {
on_rez(integer iParam) {
g_iAllAlpha=0;
if (llGetAlpha(ALL_SIDES)>0) g_iAllAlpha=1;
if (!g_iHasElements) BuildElementList();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
BuildElementList();
g_sScript = "hide_";
g_kWearer = llGetOwner();
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (UserCommand(iNum, sStr, kID)) return;
else if (iNum == LM_SETTING_RESPONSE)
{
string sGroup = SplitTokenValue(sStr, 0);
string sToken = SplitTokenValue(sStr, 1);
string sValue = SplitTokenValue(sStr, 2);
if (sGroup == g_sScript)
{
SetElementAlpha(sToken, (integer)sValue);
}
else if (sGroup+sToken == g_sAppLockToken)
{
g_iAppLock = (integer)sValue;
}
else if (sGroup+sToken == "Global_CType") CTYPE = sValue;
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
if (g_iHasElements) llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
else MakeOneButtonMenu() ;
}
else if (iNum == DIALOG_RESPONSE)
{
if (kID==g_kDialogID)
{
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
//main menu
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else if (sMessage == "*Touch*")
{
Notify(kAv, "Please touch the part of the " + CTYPE + " you want to hide or show. You can press ctr+alt+T to see invisible parts.", FALSE);
g_kTouchID = TouchRequest(kAv, TRUE, FALSE, iAuth);
}
else
{
//get "Hide" or "Show" and element name
list lParams = llParseString2List(sMessage, [" "], []);
string sCmd = llList2String(lParams, 0);
string sElement = llList2String(lParams, 1);
if (sCmd == HIDE ) sCmd = "hide";
else if (sCmd == SHOW ) sCmd = "show";
UserCommand(iAuth, sCmd + " " + sElement, kAv);
ElementMenu(kAv, iAuth);
}
}
}
else if (iNum == TOUCH_RESPONSE)
{
if (kID == g_kTouchID)
{
list lParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lParams, 0);
integer iAuth = (integer)llList2String(lParams, 1);
integer iLinkNumber = (integer)llList2String(lParams, 3);
string sElement = ElementType(iLinkNumber);
if (sElement != g_sIgnore)
{
integer iIndex = llListFindList(g_lAlphaSettings, [sElement]);
integer iAlpha;
if (iIndex == -1) iAlpha = 1; // assuming visible
else iAlpha = llList2Integer(g_lAlphaSettings, iIndex + 1);
Notify(kAv, "You selected \"" + sElement+"\". Toggling its transparency.", FALSE);
SetElementAlpha(sElement, !iAlpha);
SaveElementAlpha(sElement, !iAlpha);
}
else
{
Notify(kAv, "You selected a prim which is not hideable. You can try again.", FALSE);
}
ElementMenu(kAv, iAuth);
}
}
}
changed(integer change) {
if (change & CHANGED_LINK) BuildElementList();
if (change & CHANGED_OWNER) llResetScript();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

692
LSL/OpenCollar - label.lsl Normal file
View File

@@ -0,0 +1,692 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - label //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sParentMenu = "Apps";
string g_sSubMenu = "Label";
key g_kWearer;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
//opencollar MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the httpdb
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer g_iCharLimit = -1;
string UPMENU = "BACK";
string CTYPE = "collar";
string g_sTextMenu = "Set Label";
string g_sFontMenu = "Font";
string g_sColorMenu = "Color";
key g_kDialogID;
key g_kTBoxID;
key g_kFontID;
key g_kColorID;
list g_lColours=[
"Gray Shade",<0.70588, 0.70588, 0.70588>,
"Gold Shade",<0.69020, 0.61569, 0.43529>,
"Baby Pink",<1.00000, 0.52157, 0.76078>,
"Hot Pink",<1.00000, 0.05490, 0.72157>,
"Firefighter",<0.88627, 0.08627, 0.00392>,
"Flame",<0.92941, 0.43529, 0.00000>,
"Matrix",<0.07843, 1.00000, 0.07843>,
"Electricity",<0.00000, 0.46667, 0.92941>,
"Violet Wand",<0.63922, 0.00000, 0.78824>,
"Black",<0.00000, 0.00000, 0.00000>,
"White",<1.00000, 1.00000, 1.00000>
];
integer g_iScroll = FALSE;
integer g_iShow = TRUE;
vector g_vColor;
string g_sLabelText = "";
float g_iRotIncrement = 11.75;
// defaults for cylinders
vector g_vGridOffset;
vector g_vRepeats;
vector g_vOffset;
////////////////////////////////////////////
// Changed for the OpenColar label, only one face per prim on a cut cylinder,
// HEAVILY reduced to what we need, else functions removed for easier reading
// Lulu Pink 11/2008
//
// XyzzyText v2.1.UTF8 (UTF8-support) by Salahzar Stenvaag
// XyzzyText v2.1 Script (Set Line Color) by Huney Jewell
// XyzzyText v2.0 Script (5 Face, Single Texture)
//
// Heavily Modified by Thraxis Epsilon, Gigs Taggart 5/2007 and Strife Onizuka 8/2007
// Rewrite to allow one-script-per-object operation w/ optional slaves
// Enable prim-label functionality
// Enabled Banking
//
// Modified by Kermitt Quirk 19/01/2006
// To add support for 5 face prim instead of 3
//
// Core XyText Originally Written by Xylor Baysklef
//
//
////////////////////////////////////////////
/////////////// CONSTANTS ///////////////////
// XyText Message Map.
integer DISPLAY_STRING = 204000;
integer DISPLAY_EXTENDED = 204001;
integer REMAP_INDICES = 204002;
integer RESET_INDICES = 204003;
//integer SET_FADE_OPTIONS = 204004;
integer SET_FONT_TEXTURE = 204005;
//integer SET_LINE_COLOR = 204006;
//integer SET_COLOR = 204007;
integer RESCAN_LINKSET = 204008;
// This is an extended character escape sequence.
string ESCAPE_SEQUENCE = "\\e";
// This is used to get an index for the extended character.
string EXTENDED_INDEX = "12345";
// Face numbers.
// only one face needed. -1 lets setup function know that it hasn't run yet
integer FACE = -1;
// Used to hide the text after a fade-out.
//key TRANSPARENT = "701917a8-d614-471f-13dd-5f4644e36e3c";
//key null_key = NULL_KEY;
///////////// END CONSTANTS ////////////////
///////////// GLOBAL VARIABLES ///////////////
// This is the key of the font we are displaying.
//key gFontTexture = "b2e7394f-5e54-aa12-6e1c-ef327b6bed9e";
// 48 pixel font key g_kFontTexture = "f226766c-c5ac-690e-9018-5a37367ae95a";
// 38 pixel font
//key g_kFontTexture= "ac955f98-74bb-290f-7eb6-dca54e5e4491";
//key g_kFontTexture= "e5efeead-c69e-eb81-e7bd-dad2bb787d2b"; // Bitstream Vera Monotype // SALAHZAR
//key g_kFontTexture= "41b57e2d-e60b-01f0-8f23-e109f532d01d"; //oldEnglish Chars
//key g_kFontTexture = "0d3c99c1-5df4-638c-0f51-ed8591ae8b93"; //Bitstream Vera Serif
//key g_kFontTexture = "a37110e0-5a1f-810d-f999-d0b88568adf0"; //Apple Chancery
//key g_kFontTexture = "020f8783-0d0d-88e3-487d-df3e07d068e7"; //Lucida Bright
//key g_kFontTexture = "fa87184c-35ca-5143-fe24-cdf70e427a09"; // monotype Corsiva
//key g_kFontTexture = "34835ebf-b13a-a054-46bc-678d0849025c"; // DejaVu Sans Mono
//key g_kFontTexture = "316b2161-0669-1796-fec2-976526a29efd";//Andale Mono, Etched
//key g_kFontTexture = "f38c6993-d85e-cffb-fce9-7aed87b80c2e";//andale mono etched 45 point
//key g_kFontTexture = "bf2b6c21-e3d7-877b-15dc-ad666b6c14fe";//verily serif 40 etched, on white
key g_kFontTexture = NULL_KEY;
list g_lFonts = [
"Andale 1", "ccc5a5c9-6324-d8f8-e727-ced142c873da", //
"Andale 2", "8e10462f-f7e9-0387-d60b-622fa60aefbc", //not ideally aligned
"Serif 1", "2c1e3fa3-9bdb-2537-e50d-2deb6f2fa22c",
"Serif 2", "bf2b6c21-e3d7-877b-15dc-ad666b6c14fe",
"LCD", "014291dc-7fd5-4587-413a-0d690a991ae1"
];
// All displayable characters. Default to ASCII order.
string g_sCharIndex;
list g_lDecode=[]; // to handle special characters from CP850 page for european countries // SALAHZAR
string g_sScript;
/////////// END GLOBAL VARIABLES ////////////
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
ResetCharIndex() {
g_sCharIndex = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`";
g_sCharIndex += "abcdefghijklmnopqrstuvwxyz{|}~\n\n\n\n\n";
g_lDecode= [ "%C3%87", "%C3%BC", "%C3%A9", "%C3%A2", "%C3%A4", "%C3%A0", "%C3%A5", "%C3%A7", "%C3%AA", "%C3%AB" ];
g_lDecode+=[ "%C3%A8", "%C3%AF", "%C3%AE", "%C3%AC", "%C3%84", "%C3%85", "%C3%89", "%C3%A6", "%C3%AE", "xxxxxx" ];
g_lDecode+=[ "%C3%B6", "%C3%B2", "%C3%BB", "%C3%B9", "%C3%BF", "%C3%96", "%C3%9C", "%C2%A2", "%C2%A3", "%C2%A5" ];
g_lDecode+=[ "%E2%82%A7", "%C6%92", "%C3%A1", "%C3%AD", "%C3%B3", "%C3%BA", "%C3%B1", "%C3%91", "%C2%AA", "%C2%BA"];
g_lDecode+=[ "%C2%BF", "%E2%8C%90", "%C2%AC", "%C2%BD", "%C2%BC", "%C2%A1", "%C2%AB", "%C2%BB", "%CE%B1", "%C3%9F" ];
g_lDecode+=[ "%CE%93", "%CF%80", "%CE%A3", "%CF%83", "%C2%B5", "%CF%84", "%CE%A6", "%CE%98", "%CE%A9", "%CE%B4" ];
g_lDecode+=[ "%E2%88%9E", "%CF%86", "%CE%B5", "%E2%88%A9", "%E2%89%A1", "%C2%B1", "%E2%89%A5", "%E2%89%A4", "%E2%8C%A0", "%E2%8C%A1" ];
g_lDecode+=[ "%C3%B7", "%E2%89%88", "%C2%B0", "%E2%88%99", "%C2%B7", "%E2%88%9A", "%E2%81%BF", "%C2%B2", "%E2%82%AC", "" ];
// END // SALAHZAR
}
vector GetGridOffset(integer iIndex) {
// Calculate the offset needed to display this character.
integer iRow = iIndex / 10;
integer iCol = iIndex % 10;
// Return the offset in the texture.
return <g_vGridOffset.x + 0.1 * iCol, g_vGridOffset.y - 0.05 * iRow, g_vGridOffset.z>; // SALAHZAR modified vertical offsets for 512x1024 textures // Lulu modified for cut cylinders
// return <-0.725 + 0.1 * iCol, 0.472 - 0.05 * iRow, 0.0>;
}
//ShowChars(integer link,vector grkID_offset1, vector grkID_offset2, vector grkID_offset3, vector grkID_offset4, vector grkID_offset5)
ShowChars(integer link,vector grkID_offset)
{
// SALAHZAR modified .1 to .05 to handle different sized texture
float alpha = llList2Float(llGetLinkPrimitiveParams( link,[PRIM_COLOR,FACE]),1);
llSetLinkPrimitiveParamsFast( link,[
PRIM_TEXTURE, FACE, (string)g_kFontTexture, g_vRepeats, grkID_offset - g_vOffset, 0.0,
PRIM_COLOR, FACE, g_vColor, alpha]);
}
// SALAHZAR intelligent procedure to extract UTF-8 codes and convert to index in our "cp850"-like table
integer GetIndex(string sChar)
{
integer iRet=llSubStringIndex(g_sCharIndex, sChar);
if(iRet>=0) return iRet;
// special char do nice trick :)
string sEscaped=llEscapeURL(sChar);
integer iFound=llListFindList(g_lDecode, [sEscaped]);
// Return blank if not found
if(iFound<0) return 0;
// return correct index
return 100+iFound;
}
// END SALAHZAR
RenderString(integer iLink, string sStr)
{
if(iLink <= 0) return; // check for negative and zero linknumber
// Get the grid positions for each pair of characters.
vector GridOffset1 = GetGridOffset( GetIndex(llGetSubString(sStr, 0, 0)) ); // SALAHZAR intermediate function
// Use these grid positions to display the correct textures/offsets.
// ShowChars(iLink,GridOffset1, GridOffset2, GridOffset3, GridOffset4, GridOffset5);
ShowChars(iLink,GridOffset1);
}
integer ConvertIndex(integer iIndex) {
// This converts from an ASCII based index to our indexing scheme.
if (iIndex >= 32) // ' ' or higher
iIndex -= 32;
else { // index < 32
// Quick bounds check.
if (iIndex > 15)
iIndex = 15;
iIndex += 94; // extended characters
}
return iIndex;
}
/////END XYTEXT FUNCTIONS
// add for text scroll
float g_fScrollTime = 0.2 ;
integer g_iSctollPos ;
string g_sScrollText;
list g_lLabelLinks ;
// find all 'Label' prims, count and store it's link numbers for fast work SetLabel() and timer
integer LabelsCount()
{
integer ok = TRUE ;
g_lLabelLinks = [] ;
string sLabel;
list lTmp;
integer iLink;
integer iLinkCount = llGetNumberOfPrims();
//find all 'Label' prims and count it's
for(iLink=2; iLink <= iLinkCount; iLink++)
{
sLabel = llList2String(llGetLinkPrimitiveParams(iLink,[PRIM_NAME]),0);
lTmp = llParseString2List(sLabel, ["~"],[]);
sLabel = llList2String(lTmp,0);
if(sLabel == "Label")
{
g_lLabelLinks += [0]; // fill list witn nulls
//change prim description
llSetLinkPrimitiveParamsFast(iLink,[PRIM_DESC,"Label~notexture~nocolor~nohide"]);
}
}
g_iCharLimit = llGetListLength(g_lLabelLinks);
//find all 'Label' prims and store it's links to list
for(iLink=2; iLink <= iLinkCount; iLink++)
{
sLabel = llList2String(llGetLinkPrimitiveParams(iLink,[PRIM_NAME]),0);
lTmp = llParseString2List(sLabel, ["~"],[]);
sLabel = llList2String(lTmp,0);
if(sLabel == "Label")
{
integer iLabel = (integer)llList2String(lTmp,1);
integer link = llList2Integer(g_lLabelLinks,iLabel);
if(link == 0)
{
g_lLabelLinks = llListReplaceList(g_lLabelLinks,[iLink],iLabel,iLabel);
}
else
{
ok = FALSE;
llOwnerSay("Warning! Found duplicated label prims: "+sLabel+" with link numbers: "+(string)link+" and "+(string)iLink);
//llOwnerSay("Prims marked RED!");
//llSetLinkPrimitiveParamsFast(link, [PRIM_COLOR, 1, <1,0,0>, 1.0, PRIM_TEXTURE, 1, TEXTURE_BLANK, <1,1,1>, <0,0,0>, 0] );
//llSetLinkPrimitiveParamsFast(iLink, [PRIM_COLOR, 1, <1,0,0>, 1.0, PRIM_TEXTURE, 1, TEXTURE_BLANK, <1,1,1>, <0,0,0>, 0] );
}
}
}
return ok;
}
SetLabel()
{
string sText ;
if (g_iShow) sText = g_sLabelText;
string sPadding;
if(g_iScroll==TRUE) // || llStringLength(g_sLabelText) > g_iCharLimit)
{
// add some blanks
while(llStringLength(sPadding) < g_iCharLimit) sPadding += " ";
g_sScrollText = sPadding + sText;
llSetTimerEvent(g_fScrollTime);
//g_iScroll = TRUE;
}
else
{
g_sScrollText = "";
llSetTimerEvent(0);
//inlined single use CenterJustify function
while(llStringLength(sPadding + sText + sPadding) < g_iCharLimit) sPadding += " ";
string sText = sPadding + sText;
integer iCharPosition;
for(iCharPosition=0; iCharPosition < g_iCharLimit; iCharPosition++)
{
RenderString(llList2Integer(g_lLabelLinks, iCharPosition), llGetSubString(sText, iCharPosition, iCharPosition));
}
}
}
SetOffsets(key font)
{
// get 1-st link number from list
integer link = llList2Integer(g_lLabelLinks, 0);
// Compensate for label box-prims, which must use face 0. Others can be added as needed.
list params = llGetLinkPrimitiveParams(link, [PRIM_DESC, PRIM_TYPE]);
string desc = llGetSubString(llList2String(params, 0), 0, 4);
if (desc == "Label")
{
integer t = (integer)llList2String(params, 1);
if (t == PRIM_TYPE_BOX)
{
if (font == NULL_KEY) font = "bf2b6c21-e3d7-877b-15dc-ad666b6c14fe"; // LCD default for box
g_vGridOffset = <-0.45, 0.425, 0.0>;
g_vRepeats = <0.126, 0.097, 0>;
g_vOffset = <0.036, 0.028, 0>;
FACE = 0;
}
else if (t == PRIM_TYPE_CYLINDER)
{
if (font == NULL_KEY) font = "2c1e3fa3-9bdb-2537-e50d-2deb6f2fa22c"; // Serif default for cyl
g_vGridOffset = <-0.725, 0.425, 0.0>;
g_vRepeats = <1.434, 0.05, 0>;
g_vOffset = <0.037, 0.003, 0>;
FACE = 1;
}
integer o = llListFindList(g_lFonts, [(string)g_kFontTexture]);
integer n = llListFindList(g_lFonts, [(string)font]);
if (~o && o != n) // changing fonts - adjust for differences in font offsets
{
if (n < 8 && o == 9) g_vOffset.y += 0.0015;
else if (o < 8 && n == 9) g_vOffset.y -= 0.0015;
}
//Debug("Offset = " + (string)g_vOffset);
}
g_kFontTexture = font;
}
MainMenu(key kID, integer iAuth)
{
list lButtons= [g_sTextMenu, g_sColorMenu, g_sFontMenu];
if (g_iShow) lButtons += ["☒ Show"];
else lButtons += ["☐ Show"];
if (g_iScroll) lButtons += ["☒ Scroll"];
else lButtons += ["☐ Scroll"];
string sPrompt = "\nCustomize the " + CTYPE + "'s label!\n\nwww.opencollar.at/label";
g_kDialogID=Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
TextMenu(key kID, integer iAuth)
{
string sPrompt="\n- Submit the new label in the field below.\n- Submit a few spaces to clear the label.\n- Submit a blank field to go back to " + g_sSubMenu + ".\n\nwww.opencollar.at/label";
g_kTBoxID = Dialog(kID, sPrompt, [], [], 0, iAuth);
}
ColorMenu(key kID, integer iAuth)
{
string sPrompt = "\n\nSelect a colour from the list";
list lColourNames;
integer numColours=llGetListLength(g_lColours)/2;
while (numColours--)
{
lColourNames+=llList2String(g_lColours,numColours*2);
}
g_kColorID=Dialog(kID, sPrompt, lColourNames, [UPMENU], 0, iAuth);
}
FontMenu(key kID, integer iAuth)
{
list lButtons=llList2ListStrided(g_lFonts,0,-1,2);
string sPrompt = "\nSelect the font for the " + CTYPE + "'s label.\n\nNOTE: This feature requires a design with label prims. If the worn design doesn't have any of those, it is recommended to uninstall Label with the updater.\n\nwww.opencollar.at/label";
g_kFontID=Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
integer UserCommand(integer iAuth, string sStr, key kAv)
{
if (iAuth > COMMAND_WEARER || iAuth < COMMAND_OWNER) return FALSE; // sanity check
if (iAuth == COMMAND_OWNER || !g_iAppLock)
{
if (sStr == "menu " + g_sSubMenu || llToLower(sStr)=="label")
{
MainMenu(kAv, iAuth);
return TRUE;
}
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
if (sCommand == "lockappearance" && iAuth == COMMAND_OWNER)
{
if (llToLower(llList2String(lParams, 1)) == "0") g_iAppLock = FALSE;
else g_iAppLock = TRUE;
}
else if (sCommand == "labeltext")
{
lParams = llDeleteSubList(lParams, 0, 0);
g_sLabelText = llDumpList2String(lParams, " ");
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "text=" + g_sLabelText, "");
SetLabel();
}
else if (sCommand == "labelfont")
{
lParams = llDeleteSubList(lParams, 0, 0);
string font = llDumpList2String(lParams, " ");
integer iIndex = llListFindList(g_lFonts, [font]);
if (iIndex != -1)
{
SetOffsets((key)llList2String(g_lFonts, iIndex + 1));
SetLabel();
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "font=" + (string)g_kFontTexture, "");
}
else FontMenu(kAv, iAuth);
}
else if (sCommand == "labelcolor")
{
string sColour= llDumpList2String(llDeleteSubList(lParams,0,0)," ");
integer colourIndex=llListFindList(g_lColours,[sColour]);
if (~colourIndex)
{
g_vColor=(vector)llList2String(g_lColours,colourIndex+1);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"color="+(string)g_vColor, "");
SetLabel();
}
}
else if (sCommand == "labelshow")
{
g_iShow = llList2Integer(lParams, 1);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"show="+(string)g_iShow, "");
SetLabel();
}
else if (sCommand == "labelscroll")
{
g_iScroll = llList2Integer(lParams, 1);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"scroll="+(string)g_iScroll, "");
SetLabel();
}
}
else if ((iAuth >= COMMAND_SECOWNER && iAuth <= COMMAND_WEARER) && g_iAppLock)
{
string sCommand = llToLower(llList2String(llParseString2List(sStr, [" "], []), 0));
if (sStr=="menu "+g_sSubMenu)
{
llMessageLinked(LINK_SET, iAuth, "menu "+g_sParentMenu, kAv);
Notify(kAv,"Only owners can change the label!", FALSE);
}
else if (sCommand=="labeltext" || sCommand == "labelfont" || sCommand == "labelcolor" || sCommand == "labelshow")
{
Notify(kAv,"Only owners can change the label!", FALSE);
}
}
return TRUE;
}
default
{
on_rez(integer iNum) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "label_";
g_kWearer = llGetOwner();
integer ok = LabelsCount(); //first count the label prims.
SetOffsets(NULL_KEY);
ResetCharIndex(); // Initialize the character index.
if (g_iCharLimit <= 0) {
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu + "|" + g_sSubMenu, "");
llRemoveInventory(llGetScriptName());
}
g_sLabelText = llList2String(llParseString2List(llKey2Name(llGetOwner()), [" "], []), 0);
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if ( UserCommand(iNum, sStr, kID) ) {}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "text") g_sLabelText = sValue;
else if (sToken == "font") SetOffsets((key)sValue);
else if (sToken == "color") g_vColor = (vector)sValue;
else if (sToken == "show") g_iShow = (integer)sValue;
else if (sToken == "scroll") g_iScroll = (integer)sValue;
}
else if (sToken == g_sAppLockToken) g_iAppLock = (integer)sValue;
else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken == "settings" && sValue == "sent") SetLabel();
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == DIALOG_RESPONSE)
{
if (kID==g_kDialogID)
{
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU) llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
else if (sMessage == g_sTextMenu) TextMenu(kAv, iAuth);
else if (sMessage == g_sColorMenu) ColorMenu(kAv, iAuth);
else if (sMessage == g_sFontMenu) FontMenu(kAv, iAuth);
else if (sMessage == "☐ Show")
{
UserCommand(iAuth, "labelshow 1", kAv);
MainMenu(kAv, iAuth);
}
else if (sMessage == "☒ Show")
{
UserCommand(iAuth, "labelshow 0", kAv);
MainMenu(kAv, iAuth);
}
else if (sMessage == "☐ Scroll")
{
UserCommand(iAuth, "labelscroll 1", kAv);
MainMenu(kAv, iAuth);
}
else if (sMessage == "☒ Scroll")
{
UserCommand(iAuth, "labelscroll 0", kAv);
MainMenu(kAv, iAuth);
}
}
else if (kID == g_kColorID)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else
{
UserCommand(iAuth, "labelcolor "+sMessage, kAv);
ColorMenu(kAv, iAuth);
}
}
else if (kID == g_kFontID)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else
{
UserCommand(iAuth, "labelfont " + sMessage, kAv);
FontMenu(kAv, iAuth);
}
}
else if (kID == g_kTBoxID) // TextBox response, extract values
{
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage != "") UserCommand(iAuth, "labeltext " + sMessage, kAv);
llMessageLinked(LINK_ROOT, iAuth, "menu " + g_sSubMenu, kAv);
}
}
}
timer()
{
string sText = llGetSubString(g_sScrollText, g_iSctollPos, -1);
integer iCharPosition;
for(iCharPosition=0; iCharPosition < g_iCharLimit; iCharPosition++)
{
RenderString(llList2Integer(g_lLabelLinks, iCharPosition), llGetSubString(sText, iCharPosition, iCharPosition));
}
g_iSctollPos++;
if(g_iSctollPos > llStringLength(g_sScrollText)) g_iSctollPos = 0 ;
}
changed(integer change) {
if(change & CHANGED_LINK) // if links changed
{
if (LabelsCount()==TRUE) SetLabel();
}
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

820
LSL/OpenCollar - leash.lsl Normal file
View File

@@ -0,0 +1,820 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - leash //
// version 3.995.2 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// Oct. 18, 2008
// Nandana Singh, Lulu Pink, Garvin Twine, Joy Stipe
// ------ TOKEN DEFINITIONS ------
// ---- Immutable ----
// - Should be constant across collars, so not prefixed
// --- db tokens ---
string TOK_LENGTH = "leashlength";
string TOK_DEST = "leashedto"; // format: uuid,rank
// --- channel tokens ---
// - MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
//integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_SAFEWORD = 510;
integer POPUP_HELP = 1001;
// -- SETTINGS (whatever the actual backend)
// - Setting strings must be in the format: "token=value"
integer LM_SETTING_SAVE = 2000; // to have settings saved to httpdb
integer LM_SETTING_REQUEST = 2001; // send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002; // responses received on this channel
integer LM_SETTING_DELETE = 2003; // delete token from DB
integer LM_SETTING_EMPTY = 2004; // returned when a token has no value in the httpdb
// -- MENU/DIALOG
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
//integer DIALOG_TIMEOUT = -9002;
integer SENSORDIALOG = -9003;
integer COMMAND_PARTICLE = 20000;
integer COMMAND_LEASH_SENSOR = 20001;
// --- menu button tokens ---
string BUTTON_UPMENU = "BACK";
string BUTTON_PARENTMENU = "Main";
string BUTTON_SUBMENU = "Leash";
//string BUTTON_LEASH = "Grab";
//string BUTTON_LEASH_TO = "LeashTo";
//string BUTTON_FOLLOW = "Follow Me";
//string BUTTON_FOLLOW_MENU = "FollowTarget";
//string BUTTON_UNLEASH = "Unleash";
//string BUTTON_UNFOLLOW = "Unfollow";
//string BUTTON_STAY = "Stay";
//string BUTTON_UNSTAY = "UnStay";
//string BUTTON_ROT = "Rotate";
//string BUTTON_UNROT = "Don't Rotate";
//string BUTTON_LENGTH = "Length";
//string BUTTON_GIVE_HOLDER = "give Holder";
//string BUTTON_GIVE_POST = "give Post";
//string BUTTON_REZ_POST = "Rez Post";
//string BUTTON_POST = "Post";
//string BUTTON_YANK = "Yank";
// ---------------------------------------------
// ------ VARIABLE DEFINITIONS ------
// ----- menu -----
key g_kMenuUser;
key g_kMainDialogID;
key g_kSetLengthDialogID;
key g_kLeashTargetDialogID;
key g_kFollowTargetDialogID;
key g_kPostTargetDialogID;
key g_kPostMenuDialogID;
list g_lDialogs; //tracks dialogs generated. 2 strided, key, type
list g_lButtons; //buttons added by other scripts
// ----- collar -----
key g_kWearer;
integer g_iJustMoved;
// ----- leash -----
integer g_iLength = 3;
integer g_iStay = FALSE;
integer g_iTargetHandle;
integer g_iLastRank;
integer g_iStayRank;
vector g_vPos = ZERO_VECTOR;
string g_sTmpName;
key g_kCmdGiver;
key g_kLeashedTo = NULL_KEY;
integer g_bLeashedToAvi;
integer g_bFollowMode;
string g_sScript="leash_";
string CTYPE = "collar";
string WEARERNAME;
integer g_iRezAuth;
string g_sCheck;
//realleash variables
integer g_iStrictModeOn=FALSE; //default is Real-Leash OFF
integer g_iLeasherInRange=FALSE; //
integer g_iRLVOn=FALSE; // To store if RLV was enabled in the collar
integer g_iAwayCounter=0;
list g_lRestrictionNames= ["fartouch","sittp","tplm","tplure","tploc"];
string RLV_STRING = "rlvmain_on";
string OWNER_STRING = "auth_owner";
// ---------------------------------------------
// ------ FUNCTION DEFINITIONS ------
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth){
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer){
if (kID == g_kWearer) llOwnerSay(sMsg);
else{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
integer CheckCommandAuth(key kCmdGiver, integer iAuth){
// Check for invalid auth
if (iAuth < COMMAND_OWNER || iAuth > COMMAND_WEARER) return FALSE;
// If leashed, only move leash if Comm Giver outranks current leasher
if (g_kLeashedTo != NULL_KEY && iAuth > g_iLastRank){
Notify(kCmdGiver, "Sorry, someone who outranks you on " + WEARERNAME +"'s " + CTYPE + " leashed " + WEARERNAME + " already.", FALSE);
return FALSE;
}
return TRUE;
}
SetLength(integer iIn){
g_iLength = iIn;
// llTarget needs to be changed to the new length if leashed
if(g_kLeashedTo){
llTargetRemove(g_iTargetHandle);
g_iTargetHandle = llTarget(g_vPos, g_iLength);
}
}
ApplyRestrictions(){
//Debug("Applying Restrictions");
if (g_iLeasherInRange){
if (g_iStrictModeOn){
if (g_kLeashedTo){
//Debug("Setting restrictions");
llMessageLinked(LINK_SET, RLV_CMD, "fartouch=n,sittp=n,tplm=n,tplure=n,tploc=n,tplure:" + (string) g_kLeashedTo + "=add", "realleash"); //set all restrictions
return;
}
//} else {
//Debug("Strict is off");
}
//} else {
//Debug("Leasher out of range");
}
//Debug("Releasing restrictions");
llMessageLinked(LINK_SET, RLV_CMD, "clear", "realleash"); //release all restrictions
}
// Wrapper for DoLeash with notifications
integer LeashTo(key kTarget, key kCmdGiver, integer iAuth, list lPoints, integer iFollowMode){
// can't leash wearer to self.
if (kTarget == g_kWearer) return FALSE;
if (!CheckCommandAuth(kCmdGiver, iAuth)){
return FALSE;
}
if (g_kLeashedTo==kTarget) return TRUE;
if (g_kLeashedTo){
DoUnleash();
}
integer bCmdGiverIsAvi=llGetAgentSize(kCmdGiver) != ZERO_VECTOR;
integer bTargetIsAvi=llGetAgentSize(kTarget) != ZERO_VECTOR;
// Send notices to wearer, leasher, and target
// Only send notices if Leasher is an AV, as objects normally handle their own messages for such things
if (bCmdGiverIsAvi) {
string sTarget = llGetDisplayName(kTarget);
if (sTarget == "???" || sTarget == "") sTarget = llKey2Name(kTarget);
string sCmdGiver = llGetDisplayName(kCmdGiver);
if (sCmdGiver == "???" || sCmdGiver == "") sCmdGiver = llKey2Name(kCmdGiver);
string sWearMess;
if (kCmdGiver == g_kWearer) {// Wearer is Leasher
if (iFollowMode){
sWearMess = "You begin following " + sTarget + ".";
} else {
//sCmdMess = ""; // Only one message will need to be sent
sWearMess = "You take your leash";
if (bTargetIsAvi) { // leashing self to someone else
sWearMess += ", and hand it to " + sTarget + ".";
} else { // leashing self to an object
sWearMess += ", and tie it to " + sTarget + ".";
}
}
} else {// Leasher is not Wearer
string sCmdMess;
if (iFollowMode){
if (kCmdGiver != kTarget) { // LeashTo someone else
Notify(kTarget, sCmdGiver + " commands " + WEARERNAME + " to follow you.", FALSE);
sCmdMess= "You command " + WEARERNAME + " to follow " + sTarget + ".";
sWearMess = sCmdGiver + " commands you to follow " + sTarget + ".";
} else {
sCmdMess= "You command " + WEARERNAME + " to follow you.";
sWearMess = sCmdGiver + " commands you to follow them.";
}
} else {
string sPsv = "'s"; // Possessive, will vary if name ends in "s"
if (llGetSubString(WEARERNAME, -1,-1)=="s") sPsv = "'";
sCmdMess= "You grab " + WEARERNAME + sPsv + " leash";
sWearMess = sCmdGiver + " grabs your leash";
if (kCmdGiver != kTarget) { // Leasher is not LeashTo
if (bTargetIsAvi) { // LeashTo someone else
sCmdMess += ", and hand it to " + sTarget + ".";
sWearMess += ", and hands it to " + sTarget + ".";
Notify(kTarget, sCmdGiver + " hands you " + WEARERNAME + sPsv + " leash.", FALSE);
} else {// LeashTo object
sCmdMess += ", and tie it to " + sTarget + ".";
sWearMess += ", and ties it to " + sTarget + ".";
}
}
}
Notify(kCmdGiver, sCmdMess, FALSE);
}
llOwnerSay(sWearMess);
}
g_bFollowMode = iFollowMode; // leashing, or following
if (bTargetIsAvi) g_bLeashedToAvi = TRUE;
if (llGetOwnerKey(kCmdGiver)==g_kWearer) iAuth=COMMAND_WEARER; //prevents owner-wearer with public access creating an unbreakable leash to an unwilling participant
DoLeash(kTarget, iAuth, lPoints);
// Notify Target how to unleash, only if:
// Avatar
// Didn't send the command
// Don't own the object that sent the command
if (g_bLeashedToAvi && kCmdGiver != kTarget && llGetOwnerKey(kCmdGiver) != kTarget) {
if (iFollowMode){
llMessageLinked(LINK_SET, POPUP_HELP, WEARERNAME + " has been commanded to follow you. Say \"_PREFIX_unfollow\" to relase them.", g_kLeashedTo);
} else {
llMessageLinked(LINK_SET, POPUP_HELP, WEARERNAME + " has been leashed to you. Say \"_PREFIX_unleash\" to unleash them. Say \"_PREFIX_giveholder\" to get a leash holder.", g_kLeashedTo);
}
}
return TRUE;
}
DoLeash(key kTarget, integer iAuth, list lPoints){
g_iLastRank = iAuth;
g_kLeashedTo = kTarget;
if (g_bFollowMode) {
llMessageLinked(LINK_THIS, COMMAND_PARTICLE, "unleash", g_kLeashedTo);
} else {
integer iPointCount = llGetListLength(lPoints);
g_sCheck = "";
if (iPointCount) {//if more than one leashpoint, listen for all strings, else listen just for that point
if (iPointCount == 1) g_sCheck = (string)llGetOwnerKey(kTarget) + llList2String(lPoints, 0) + " ok";
}
//Send link message to the particle script
//Debug("leashing with "+g_sCheck);
llMessageLinked(LINK_THIS, COMMAND_PARTICLE, "leash" + g_sCheck + "|" + (string)g_bLeashedToAvi, g_kLeashedTo);
llSetTimerEvent(3.0); //check for leasher out of range
}
// change to llTarget events by Lulu Pink
g_vPos = llList2Vector(llGetObjectDetails(g_kLeashedTo, [OBJECT_POS]), 0);
//to prevent multiple target events and llMoveToTargets
llTargetRemove(g_iTargetHandle);
llStopMoveToTarget();
g_iTargetHandle = llTarget(g_vPos, (float)g_iLength);
if (g_vPos != ZERO_VECTOR) {
llMoveToTarget(g_vPos, 0.7);
}
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + TOK_DEST + "=" + (string)kTarget + "," + (string)iAuth + "," + (string)g_bLeashedToAvi + "," + (string)g_bFollowMode, "");
g_iLeasherInRange=TRUE;
ApplyRestrictions();
}
// Wrapper for DoUnleash()
Unleash(key kCmdGiver)
{
string sTarget = llGetDisplayName(g_kLeashedTo);
if (sTarget == "???" || sTarget == "") sTarget = llKey2Name(g_kLeashedTo);
if ( osIsUUID(g_kLeashedTo) ){
string sCmdGiver = llGetDisplayName(kCmdGiver);
if (sCmdGiver == "???" || sCmdGiver == "") sCmdGiver = llKey2Name(kCmdGiver);
string sWearMess;
string sCmdMess;
string sTargetMess;
integer bCmdGiverIsAvi=llGetAgentSize(kCmdGiver) != ZERO_VECTOR;
if (bCmdGiverIsAvi) {
if (kCmdGiver == g_kWearer) // Wearer is Leasher
{
if (g_bFollowMode) {
sWearMess = "You stop following " + sTarget + ".";
sTargetMess = WEARERNAME + " stops following you.";
} else {
sWearMess = "You unleash yourself from " + sTarget + "."; // sTarget might be an object
sTargetMess = WEARERNAME + " unleashes from you.";
}
if (g_bLeashedToAvi) Notify(g_kLeashedTo, sTargetMess, FALSE);
} else { // Unleasher is not Wearer
if (kCmdGiver == g_kLeashedTo) {
if (g_bFollowMode) {
sCmdMess= "You release " + WEARERNAME + " from following you.";
sWearMess = sCmdGiver + " releases you from following.";
} else {
sCmdMess= "You unleash " + WEARERNAME + ".";
sWearMess = sCmdGiver + " unleashes you.";
}
} else {
if (g_bFollowMode) {
sCmdMess= "You release " + WEARERNAME + " from following " + sTarget + ".";
sWearMess = sCmdGiver + " releases you from following " + sTarget + ".";
sTargetMess = WEARERNAME + " stops following you.";
} else {
sCmdMess= "You unleash " + WEARERNAME + " from " + sTarget + ".";
sWearMess = sCmdGiver + " unleashes you from " + sTarget + ".";
sTargetMess = sCmdGiver + " unleashes " + WEARERNAME + " from you.";
}
if (g_bLeashedToAvi) Notify(g_kLeashedTo, sTargetMess, FALSE);
}
Notify(kCmdGiver, sCmdMess, FALSE);
}
llOwnerSay(sWearMess);
}
DoUnleash();
} else {
Notify(kCmdGiver, WEARERNAME+" is not leashed", FALSE);
}
}
DoUnleash(){
llTargetRemove(g_iTargetHandle);
llStopMoveToTarget();
llMessageLinked(LINK_SET, COMMAND_PARTICLE, "unleash", g_kLeashedTo);
g_kLeashedTo = NULL_KEY;
g_iLastRank = COMMAND_EVERYONE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + TOK_DEST, "");
llSetTimerEvent(0.0); //stop checking for leasher out of range
g_iLeasherInRange=FALSE;
ApplyRestrictions();
}
YankTo(key kIn){
llMoveToTarget(llList2Vector(llGetObjectDetails(kIn, [OBJECT_POS]), 0), 0.5);
llSleep(2.0);
llStopMoveToTarget();
}
integer UserCommand(integer iAuth, string sMessage, key kMessageID, integer bFromMenu){
//Debug("Got user comand:\niAuth: "+(string)iAuth+"\nsMessage: "+sMessage+"\nkMessageID: "+(string)kMessageID+"\nbFromMenu: "+(string)bFromMenu);
if (iAuth >= COMMAND_OWNER && iAuth <= COMMAND_WEARER) {
g_kCmdGiver = kMessageID;
list lParam = llParseString2List(sMessage, [" "], []);
string sComm = llToLower(llList2String(lParam, 0));
string sVal = llToLower(llList2String(lParam, 1));
string sVal2= llList2String(lParam, 2);
sMessage = llToLower(sMessage); //convert sMessage to lower case for caseless comparisson
//debug(sMessage);
if (sMessage=="leashmenu" || sMessage == "menu leash"){
list lButtons;
if (g_iStrictModeOn==TRUE) {
lButtons += "Strict ☒";
} else {
lButtons += "Strict ☐";
}
if (kMessageID != g_kWearer) lButtons += "Grab";// Only if not the wearer.
else lButtons += [" "];
if (g_kLeashedTo != NULL_KEY) {
if (g_bFollowMode) lButtons += ["Unfollow"];
else lButtons += ["Unleash"];
}
else lButtons += " ";
lButtons += ["LeashTo","Post"];
//lButtons += ["give Post"];
if (kMessageID == g_kLeashedTo) lButtons += "Yank";//only if leash holder
else lButtons += " ";
lButtons += ["FollowTarget"];
if (g_iStay) lButtons += ["UnStay"];
else lButtons += ["Stay"];
lButtons += ["give Holder"];
lButtons += ["Length"];
lButtons += g_lButtons;
string sPrompt = "\nLet's go walkies!\n\nwww.opencollar.at/leash";
g_kMainDialogID = Dialog(kMessageID, sPrompt, lButtons, [BUTTON_UPMENU], 0, iAuth);
} else if (sComm == "post") {
if (sComm == "post" && !bFromMenu) UserCommand(iAuth, "find"+sMessage, kMessageID ,bFromMenu); //hack to keep old chat comand behaviour
else if (sVal==llToLower(BUTTON_UPMENU)){
UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else if (sMessage == "post give post") {
UserCommand(iAuth, "givepost", kMessageID ,bFromMenu);
} else if (sMessage == "post rez post") {
UserCommand(iAuth, "rezpost", kMessageID ,bFromMenu);
} else if (sMessage == "post find post") {
UserCommand(iAuth, "findpost", kMessageID ,bFromMenu);
} else {
g_kPostMenuDialogID = Dialog(kMessageID, "\n\nPost Options:", ["Find Post", "Rez Post", "give Post"], [BUTTON_UPMENU], 0, iAuth);
}
} else if (sMessage == "grab" || sMessage == "leash" || (sMessage == "toggleleash" && NULL_KEY == g_kLeashedTo)) {
LeashTo(kMessageID, kMessageID, iAuth, ["handle"], FALSE);
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else if(sComm == "follow" || sComm == "followtarget") {
//Debug("Got a follow command:"+sMessage);
if (!CheckCommandAuth(kMessageID, iAuth)) return TRUE;
if (sVal==llToLower(BUTTON_UPMENU)){
UserCommand(iAuth, "leash", kMessageID ,bFromMenu);
} else if (sVal == ""){
g_kFollowTargetDialogID=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|Who shall be followed?|0|``"+(string)AGENT+"`10`"+(string)PI + "|BACK|" + (string)iAuth, g_kFollowTargetDialogID);
} else if (sVal == "me") {
LeashTo(kMessageID, kMessageID, iAuth, [], TRUE);
} else if (osIsUUID(sVal)) {
LeashTo((key)sVal, kMessageID, iAuth, [], TRUE);
//no remenu to leash menu
//if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else {
g_kFollowTargetDialogID=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|Who shall be followed?|0|``"+(string)AGENT+"`10`"+(string)PI +"`"+sVal+"`1|BACK|" + (string)iAuth, g_kFollowTargetDialogID);
}
} else if (sMessage == "runaway" && iAuth == COMMAND_OWNER) Unleash(kMessageID);
else if (sMessage == "unleash" || sMessage == "unfollow" || (sMessage == "toggleleash" && NULL_KEY != g_kLeashedTo)) {
if (CheckCommandAuth(kMessageID, iAuth)) Unleash(kMessageID);
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else if (sMessage == "giveholder" || sMessage == "give holder") {
llGiveInventory(kMessageID, "Leash Holder");
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else if (sMessage == "givepost" || sMessage == "give post") {
llGiveInventory(kMessageID, "Leash Post");
if (bFromMenu) UserCommand(iAuth, "post", kMessageID ,bFromMenu);
} else if (sMessage == "rezpost" || sMessage == "rez post") {
g_iRezAuth=iAuth;
llRezObject("Leash Post", llGetPos() + (<0.1, 0.0, 0.37> * llGetRot()), ZERO_VECTOR, llEuler2Rot(<0, 90, 270> * DEG_TO_RAD), 0);
if (bFromMenu) UserCommand(iAuth, "post", kMessageID ,bFromMenu);
} else if (sMessage == "yank" && kMessageID == g_kLeashedTo) {
//Person holding the leash can yank.
if(llGetAgentInfo(g_kWearer)&AGENT_SITTING) llMessageLinked(LINK_SET, RLV_CMD, "unsit=force", "realleash");
YankTo(kMessageID);
} else if (sMessage == "beckon" && iAuth == COMMAND_OWNER) {
//Owner can beckon
YankTo(kMessageID);
} else if (sMessage == "stay") {
if (iAuth <= COMMAND_GROUP) {
g_iStayRank = iAuth;
g_iStay = TRUE;
string sCmdGiver = llGetDisplayName(kMessageID);
if (sCmdGiver == "???" | sCmdGiver == "") sCmdGiver = llKey2Name(kMessageID);
llRequestPermissions(g_kWearer, PERMISSION_TAKE_CONTROLS);
llOwnerSay(sCmdGiver + " commanded you to stay in place, you cannot move until the command is revoked again.");
Notify(kMessageID, "You commanded " + WEARERNAME + " to stay in place. Either leash the slave with the grab command or use \"unstay\" to enable movement again.", FALSE);
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
}
} else if ((sMessage == "unstay" || sMessage == "move") && g_iStay) {
if (iAuth <= g_iStayRank) {
g_iStay = FALSE;
llReleaseControls();
llOwnerSay("You are free to move again.");
Notify(kMessageID,"You allowed " + WEARERNAME + " to move freely again.", FALSE);
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
}
} else if (sMessage == "strict on" || sMessage == "strict ☐") {
g_iStrictModeOn=TRUE;
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + "strict=1", "");
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, TOK_DEST, ""); //query current leasher, the response will trigger ApplyRestrictions
Notify(kMessageID,"Strict leashing enabled.",TRUE);
ApplyRestrictions();
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else if (sMessage == "strict off" || sMessage == "strict ☒") {
if (g_kLeashedTo) {
Notify(kMessageID, "You can't disable Strict Mode while leashed.",FALSE);
} else {
g_iStrictModeOn=FALSE;
llMessageLinked(LINK_THIS, LM_SETTING_DELETE, g_sScript + "strict", "");
ApplyRestrictions();
Notify(kMessageID,"Strict leashing disabled.",FALSE);
}
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else if (sComm == "leashto") {
if (!CheckCommandAuth(kMessageID, iAuth)) return TRUE;
if (sVal==llToLower(BUTTON_UPMENU)){
UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
} else if (sVal == "") {
g_kLeashTargetDialogID=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|Who shall we leash to?|0|``"+(string)AGENT+"`10`"+(string)PI + "|BACK|" + (string)iAuth, g_kLeashTargetDialogID);
} else if(osIsUUID(sVal)) {
list lPoints;
if (llGetListLength(lParam) > 2) lPoints = llList2List(lParam, 2, -1);
//debug("leash target is key");//could be a post, or could be we specified an av key
LeashTo((key)sVal, kMessageID, iAuth, lPoints, FALSE);
//remenu to sensor dialog
//if (bFromMenu) UserCommand(iAuth, "leashto", kMessageID ,bFromMenu);
} else {
g_kLeashTargetDialogID=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|Who shall we leash to?|0|``"+(string)AGENT+"`10`"+(string)PI +"`"+sVal+"`1|BACK|" + (string)iAuth, g_kLeashTargetDialogID);
}
} else if (sComm == "length") {
integer iNewLength = (integer)sVal;
if (sVal==llToLower(BUTTON_UPMENU)){
UserCommand(iAuth, "leash", kMessageID ,bFromMenu);
} else if(iNewLength > 0 && iNewLength <= 30){
//Person holding the leash can always set length.
if (kMessageID == g_kLeashedTo || CheckCommandAuth(kMessageID, iAuth))
{
SetLength(iNewLength);
//tell wearer
Notify(kMessageID, "Leash length set to " + (string)g_iLength+"m.", TRUE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + TOK_LENGTH + "=" + sVal, "");
}
if (bFromMenu) UserCommand(iAuth, "leashmenu", kMessageID ,bFromMenu);
}
else { //no value given, or value out of range, must be from chat, give menu
Notify(kMessageID, "The current leash length is " + (string)g_iLength + "m.", TRUE);
//LengthMenu(kMessageID,iAuth);
g_kSetLengthDialogID = Dialog(kMessageID, "\n\nSet a leash length in meter:\nCurrent length is: " + (string)g_iLength + "m", ["1", "2", "3", "4", "5", "8","10" , "15", "20", "25", "30"], [BUTTON_UPMENU], 0, iAuth);
}
} else if (sComm == "findpost" || sMessage == "find post") {
if (!CheckCommandAuth(kMessageID, iAuth)) {
if (bFromMenu) UserCommand(iAuth, "post", kMessageID ,bFromMenu);
return TRUE;
}
if (sVal==llToLower(BUTTON_UPMENU)){
UserCommand(iAuth, "post", kMessageID ,bFromMenu);
} else if (sVal == ""){// no parameters were passed
g_kPostTargetDialogID=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|\n\nWhat's going to serve us as a post? If the desired object isn't on the list, please try moving closer.\n|0|``"+(string)(PASSIVE | ACTIVE)+"`10`"+(string)PI + "|BACK|" + (string)iAuth, g_kPostTargetDialogID);
} else if(osIsUUID(sVal)) {
list lPoints;
if (llGetListLength(lParam) > 2) lPoints = llList2List(lParam, 2, -1);
//debug("leash target is key");//could be a post, or could be we specified an av key
if (bFromMenu) UserCommand(iAuth, "findpost", kMessageID ,bFromMenu);
LeashTo((key)sVal, kMessageID, iAuth, lPoints, FALSE);
} else {
g_kPostTargetDialogID=llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)g_kCmdGiver + "|chatmode|0|``"+(string)(PASSIVE | ACTIVE)+"`10`"+(string)PI +"`"+sVal+"`1|BACK|" + (string)iAuth, g_kPostTargetDialogID);
}
}
} else if (iAuth == COMMAND_EVERYONE) {
if (kMessageID == g_kLeashedTo) {
sMessage = llToLower(sMessage);
if (sMessage == "unleash" || sMessage == "unfollow" || (sMessage == "toggleleash" && NULL_KEY != g_kLeashedTo)) Unleash(kMessageID);
else if (sMessage == "giveholder") llGiveInventory(kMessageID, "Leash Holder");
else if (sMessage == "yank") YankTo(kMessageID);
}
} else return FALSE;
return TRUE;
}
default {
on_rez(integer start_param) {
DoUnleash();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
DoUnleash();
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, RLV_STRING, "");
//Debug("Starting");
}
timer() {
//inlined old isInSimOrJustOutside function
vector vLeashedToPos=llList2Vector(llGetObjectDetails(g_kLeashedTo,[OBJECT_POS]),0);
integer iIsInSimOrJustOutside=TRUE;
if(vLeashedToPos == ZERO_VECTOR || vLeashedToPos.x < -25 || vLeashedToPos.x > 280 || vLeashedToPos.y < -25 || vLeashedToPos.y > 280) iIsInSimOrJustOutside=FALSE;
if (iIsInSimOrJustOutside && llVecDist(llGetPos(),vLeashedToPos)<60) //if the leasher is now in range
{
if(!g_iLeasherInRange) //and the leasher was previously not in range
{
if (g_iAwayCounter)
{
g_iAwayCounter = 0;
llSetTimerEvent(3.0);
}
//Debug("leashing with "+g_sCheck);
llMessageLinked(LINK_THIS, COMMAND_PARTICLE, "leash" + g_sCheck + "|" + (string)g_bLeashedToAvi, g_kLeashedTo);
g_iLeasherInRange = TRUE;
llTargetRemove(g_iTargetHandle);
g_vPos = vLeashedToPos;
g_iTargetHandle = llTarget(g_vPos, (float)g_iLength);
if (g_vPos != ZERO_VECTOR) llMoveToTarget(g_vPos, 0.7);
ApplyRestrictions();
}
}
else //the leasher is not now in range
{
if(g_iLeasherInRange) //but was a short while ago
{
if (g_iAwayCounter > 3)
{
llTargetRemove(g_iTargetHandle);
llStopMoveToTarget();
llMessageLinked(LINK_THIS, COMMAND_PARTICLE, "unleash", g_kLeashedTo);
g_iLeasherInRange=FALSE;
ApplyRestrictions();
}
}
g_iAwayCounter++; //+1 every 3 secs
if (g_iAwayCounter > 200) //3mins 20 secs
{//slow down the sensor:
g_iAwayCounter = 1;
llSetTimerEvent(11.0);
}
}
}
link_message(integer iPrim, integer iNum, string sMessage, key kMessageID){
if (UserCommand(iNum, sMessage, kMessageID, FALSE)) return;
else if (iNum == MENUNAME_REQUEST && sMessage == BUTTON_PARENTMENU) {
//llMessageLinked(LINK_SET, MENUNAME_RESPONSE, BUTTON_PARENTMENU + "|" + BUTTON_SUBMENU, "");
g_lButtons = [] ; // flush submenu buttons
llMessageLinked(LINK_SET, MENUNAME_REQUEST, BUTTON_SUBMENU, "");
} else if (iNum == MENUNAME_RESPONSE) {
list lParts = llParseString2List(sMessage, ["|"], []);
if (llList2String(lParts, 0) == BUTTON_SUBMENU) {//someone wants to stick something in our menu
string button = llList2String(lParts, 1);
if (llListFindList(g_lButtons, [button]) == -1) {
g_lButtons = llListSort(g_lButtons + [button], 1, TRUE);
}
}
} else if (iNum == COMMAND_SAFEWORD) {
g_iStay = FALSE;
llReleaseControls();
DoUnleash();
} else if (iNum == LM_SETTING_RESPONSE) {
integer iInd = llSubStringIndex(sMessage, "=");
string sToken = llGetSubString(sMessage, 0, iInd -1);
string sValue = llGetSubString(sMessage, iInd + 1, -1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript) {
//Debug("got Leash settings:"+sMessage);
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == TOK_DEST) {
//we got the last leasher's id and rank from the local settings
list lParam = llParseString2List(llGetSubString(sMessage, iInd + 1, -1), [","], []);
key kTarget = (key)llList2String(lParam, 0);
g_bLeashedToAvi = (integer)llList2String(lParam, 2);
g_bFollowMode = (integer)llList2String(lParam, 3);
list lPoints;
if (g_bLeashedToAvi) lPoints = ["collar", "handle"];
// if PostedTo object has vanished, clear out the leash settings
if (!llGetObjectPrimCount(kTarget) && !g_bLeashedToAvi) DoUnleash();
else DoLeash(kTarget, (integer)llList2String(lParam, 1), lPoints);
}
else if (sToken == TOK_LENGTH) SetLength((integer)sValue);
if (sToken=="strict"){
g_iStrictModeOn = (integer)sValue;
ApplyRestrictions();
}
} else if (sToken == RLV_STRING) { // something enabled or disabled RLV. Remember which
//Debug("SetRLV:"+sValue);
g_iRLVOn = (integer)sValue;
ApplyRestrictions();
} else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken=="Global_WearerName") WEARERNAME=sValue;
//else //Debug("setting response:"+sToken);
} else if (iNum == DIALOG_RESPONSE) {
list lMenuParams = llParseString2List(sMessage, ["|"], []);
key kAV = (key)llList2String(lMenuParams, 0);
string sButton = llList2String(lMenuParams, 1);
integer iAuth = (integer) llList2String(lMenuParams, 3);
if (kMessageID == g_kMainDialogID){
if (sButton == BUTTON_UPMENU) {
llMessageLinked(LINK_SET, iAuth, "menu "+BUTTON_PARENTMENU, kAV);
} else if (~llListFindList(g_lButtons, [sButton])){ //process buttons other scripts added
llMessageLinked(LINK_SET, iAuth, "menu "+sButton, kAV);
} else { // catch all
UserCommand(iAuth, llToLower(sButton), kAV, TRUE);
}
}
else if (kMessageID == g_kLeashTargetDialogID) UserCommand(iAuth, "leashto " + sButton, kAV, TRUE);
else if (kMessageID == g_kFollowTargetDialogID) UserCommand(iAuth, "follow " + sButton, kAV, TRUE);
else if (kMessageID == g_kPostTargetDialogID) UserCommand(iAuth, "findpost " + sButton, kAV, TRUE);
else if (kMessageID == g_kSetLengthDialogID) UserCommand(iAuth, "length " + sButton, kAV, TRUE);
else if (kMessageID == g_kPostMenuDialogID) UserCommand(iAuth, "post " + sButton, kAV, TRUE);
}
}
at_target(integer iNum, vector vTarget, vector vMe){
if (g_iTargetHandle==0) return;
llStopMoveToTarget();
llTargetRemove(g_iTargetHandle);
g_iTargetHandle = 0;
g_vPos = llList2Vector(llGetObjectDetails(g_kLeashedTo,[OBJECT_POS]),0);
g_iTargetHandle = llTarget(g_vPos, (float)g_iLength);
if(g_iJustMoved) {
vector pointTo = llList2Vector(llGetObjectDetails(g_kLeashedTo,[OBJECT_POS]),0) - llGetPos();
float turnAngle = llAtan2(pointTo.x, pointTo.y);// - myAngle;
llMessageLinked(LINK_SET, RLV_CMD, "setrot:" + (string)(turnAngle) + "=force", NULL_KEY); //transient command, doesn;t need our fakekey
g_iJustMoved = 0;
}
}
not_at_target() {
if (g_iTargetHandle==0) return;
g_iJustMoved = 1;
// i ran into a problem here which seems to be "speed" related, specially when using the menu to unleash this event gets triggered together or just after the CleanUp() function
//to prevent to get stay in the target events i added a check on g_kLeashedTo is NULL_KEY
if(g_kLeashedTo) {
vector vNewPos = llList2Vector(llGetObjectDetails(g_kLeashedTo,[OBJECT_POS]),0);
//llStopMoveToTarget();
if (g_vPos != vNewPos) {
llTargetRemove(g_iTargetHandle);
g_vPos = vNewPos;
g_iTargetHandle = llTarget(g_vPos, (float)g_iLength);
}
if (g_vPos != ZERO_VECTOR) llMoveToTarget(g_vPos,0.7);
else llStopMoveToTarget();
} else {
DoUnleash();
}
}
run_time_permissions(integer iPerm)
{
if (iPerm & PERMISSION_TAKE_CONTROLS) {
//disbale all controls but left mouse button (for stay cmd)
llTakeControls(CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT | CONTROL_LBUTTON | CONTROL_ML_LBUTTON, FALSE, FALSE);
}
}
object_rez(key id) {
g_iLength=3;
DoLeash(id, g_iRezAuth, []);
}
changed (integer change){
if (change & CHANGED_OWNER){
g_kWearer = llGetOwner();
}
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -0,0 +1,989 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - leashParticle //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//Split from the leash script in April 2010 by Garvin Twine
//Nandana Singh, Lulu Pink, Joy Stipe, Wendy Starfall
//Medea Destiny, Jean Severine, littlemousy, Romka Swallowtail
// - MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_SAFEWORD = 510;
integer POPUP_HELP = 1001;
// -- SETTINGS
// - Setting strings must be in the format: "token=value"
integer LM_SETTING_SAVE = 2000; // to have settings saved to settings store
integer LM_SETTING_REQUEST = 2001; // send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002; // responses received on this channel
integer LM_SETTING_DELETE = 2003; // delete token from store
integer LM_SETTING_EMPTY = 2004; // returned when a token has no value in the store
// -- MENU/DIALOG
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer LOCKMEISTER = -8888;
integer LOCKGUARD = -9119;
integer g_iLMListener;
integer g_iLMListernerDetach;
integer COMMAND_PARTICLE = 20000;
integer COMMAND_LEASH_SENSOR = 20001;
// --- menu tokens ---
string UPMENU = "BACK";
//string MORE = ">";
string PARENTMENU = "Leash";
string SUBMENU = "Particle";
string L_TEXTURE = "Texture";
string L_DENSITY = "Density";
string L_COLOR = "Color";
string L_GRAVITY = "Gravity";
string L_SIZE = "Size";
string L_LIFE = "Life"; // ADDED FOR ST
string L_GLOW = "Glow";
string L_DEFAULTS = "ResetDefaults";
// Defalut leash particle, can read from defaultsettings:
// User_leashDefaults=Texture~chain~Size~<0.07,0.07,1.0>~Color~<1,1,1>~Density~-0.04~Gravity~-1.1~Life~3.0~Glow~1
//list g_lDefaultSettings = [L_TEXTURE,"chain", L_SIZE,"<0.07,0.07,1.0>", L_COLOR,"<1,1,1>", L_DENSITY,"-0.04", L_GRAVITY,"-1.0", L_LIFE, "3.0", L_GLOW, "0"];
list g_lDefaultSettings = ["Texture","chain", "Size","<0.07,0.07,1.0>", "Color","<1,1,1>", "Density","-0.04", "Gravity","-1.0", "Life", "3.0", "Glow", "0"];
list g_lSettings;
string g_sCurrentMenu = "";
key g_kDialogID;
string g_sCurrentCategory = "";
list g_lCategories = ["Shades", "Bright", "Soft"];
list g_lColors;
list g_lAllColors = [
"Light Shade|<0.82745, 0.82745, 0.82745>
Gray Shade|<0.70588, 0.70588, 0.70588>
Dark Shade|<0.20784, 0.20784, 0.20784>
Brown Shade|<0.65490, 0.58431, 0.53333>
Red Shade|<0.66275, 0.52549, 0.52549>
Blue Shade|<0.64706, 0.66275, 0.71765>
Green Shade|<0.62353, 0.69412, 0.61569>
Pink Shade|<0.74510, 0.62745, 0.69020>
Gold Shade|<0.69020, 0.61569, 0.43529>
Black|<0.00000, 0.00000, 0.00000>
White|<1.00000, 1.00000, 1.00000>",
"Magenta|<1.00000, 0.00000, 0.50196>
Pink|<1.00000, 0.14902, 0.50980>
Hot Pink|<1.00000, 0.05490, 0.72157>
Firefighter|<0.88627, 0.08627, 0.00392>
Sun|<1.00000, 1.00000, 0.18039>
Flame|<0.92941, 0.43529, 0.00000>
Matrix|<0.07843, 1.00000, 0.07843>
Electricity|<0.00000, 0.46667, 0.92941>
Violet Wand|<0.63922, 0.00000, 0.78824>
Black|<0.00000, 0.00000, 0.00000>
White|<1.00000, 1.00000, 1.00000>",
"Baby Blue|<0.75686, 0.75686, 1.00000>
Baby Pink|<1.00000, 0.52157, 0.76078>
Rose|<0.93333, 0.64314, 0.72941>
Beige|<0.86667, 0.78039, 0.71765>
Earth|<0.39608, 0.27451, 0.18824>
Ocean|<0.25882, 0.33725, 0.52549>
Yolk|<0.98824, 0.73333, 0.29412>
Wasabi|<0.47059, 1.00000, 0.65098>
Lavender|<0.89020, 0.65882, 0.99608>
Black|<0.00000, 0.00000, 0.00000>
White|<1.00000, 1.00000, 1.00000>"
];
// ----- collar -----
//string g_sWearerName;
string CTYPE = "collar";
key g_kWearer;
key NULLKEY = "";
key g_kLeashedTo = ""; //NULLKEY;
key g_kLeashToPoint = ""; //NULLKEY;
key g_kParticleTarget = ""; //NULLKEY;
integer g_bLeasherInRange;
integer g_bInvisibleLeash = FALSE;
integer g_iAwayCounter;
integer g_bLeashActive;
//List of 4 leash/chain points, lockmeister names used (list has to be all lower case, prims dont matter, converting on compare to lower case)
//strided list... LM name, linkNumber, BOOL_ACVTIVE
list g_lLeashPrims;
//global integer used for loops
integer g_iLoop;
string g_sScript;
//Particle system and variables
string g_sParticleTexture = "chain";
string g_sParticleTextureID; //we need the UUID for llLinkParticleSystem
float g_fLeashLength;
vector g_vLeashColor = <1,1,1>;
//vector g_vLeashSize = <0.22, 0.17, 0.0>; // CHANGED FROM DEFAULT <0.07, 0.07, 1.0>, JEAN SEVERINE 2012-02-22
vector g_vLeashSize = <0.07, 0.07, 1.0>; // CHANGED back
integer g_bParticleGlow = TRUE;
float g_fParticleAge = 1.0;
float g_fParticleAlpha = 1.0;
vector g_vLeashGravity = <0.0,0.0,-1.0>;
integer g_iParticleCount = 1;
float g_fBurstRate = 0.04;
//same g_lSettings but to store locally the default settings recieved from the defaultsettings note card, using direct string here to save some bits
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
FindLinkedPrims()
{
integer linkcount = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (g_iLoop = 2; g_iLoop <= linkcount; g_iLoop++)
{
string sPrimDesc = (string)llGetObjectDetails(llGetLinkKey(g_iLoop), [OBJECT_DESC]);
list lTemp = llParseString2List(sPrimDesc, ["~"], []);
integer iLoop;
for (iLoop = 0; iLoop < llGetListLength(lTemp); iLoop++)
{
string sTest = llList2String(lTemp, iLoop);
//Debug(sTest);
//expected either "leashpoint" or "leashpoint:point"
if (llGetSubString(sTest, 0, 9) == "leashpoint")
{
if (llGetSubString(sTest, 11, -1) == "")
{
g_lLeashPrims += [sTest, (string)g_iLoop, "1"];
}
else
{
g_lLeashPrims += [llGetSubString(sTest, 11, -1), (string)g_iLoop, "1"];
}
}
}
}
//if we did not find any leashpoint... we unset the root as one
if (!llGetListLength(g_lLeashPrims))
{
g_lLeashPrims = ["collar", LINK_THIS, "1"];
}
}
Particles(integer iLink, key kParticleTarget)
{
//when we have no target to send particles to, dont create any
if (kParticleTarget == NULLKEY)
{
return;
}
//taken out as vars to save memory
//float fMaxSpeed = 3.0; // Max speed each particle is spit out at
//float fMinSpeed = 3.0; // Min speed each particle is spit out at
//these values do nothing when particles go to a target, the speed is determined by the particle age then
//integer iFlags = PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_FOLLOW_VELOCITY_MASK | PSYS_PART_TARGET_POS_MASK;
integer iFlags = PSYS_PART_FOLLOW_VELOCITY_MASK | PSYS_PART_TARGET_POS_MASK|PSYS_PART_FOLLOW_SRC_MASK;
if (g_bParticleGlow) iFlags = iFlags | PSYS_PART_EMISSIVE_MASK;
list lTemp = [
PSYS_PART_MAX_AGE,g_fParticleAge,
PSYS_PART_FLAGS,iFlags,
PSYS_PART_START_COLOR, g_vLeashColor,
//PSYS_PART_END_COLOR, g_vLeashColor,
PSYS_PART_START_SCALE,g_vLeashSize,
//PSYS_PART_END_SCALE,g_vLeashSize,
PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_DROP,
PSYS_SRC_BURST_RATE,g_fBurstRate,
PSYS_SRC_ACCEL, g_vLeashGravity,
PSYS_SRC_BURST_PART_COUNT,g_iParticleCount,
//PSYS_SRC_BURST_SPEED_MIN,fMinSpeed,
//PSYS_SRC_BURST_SPEED_MAX,fMaxSpeed,
PSYS_SRC_TARGET_KEY,kParticleTarget,
PSYS_SRC_MAX_AGE, 0,
PSYS_SRC_TEXTURE, g_sParticleTextureID
//PSYS_PART_START_ALPHA, g_fParticleAlpha,
//PSYS_PART_END_ALPHA, g_fParticleAlpha
];
llLinkParticleSystem(iLink, lTemp);
}
StartParticles(key kParticleTarget)
{
//Debug(llList2CSV(g_lLeashPrims));
for (g_iLoop = 0; g_iLoop < llGetListLength(g_lLeashPrims); g_iLoop = g_iLoop + 3)
{
if ((integer)llList2String(g_lLeashPrims, g_iLoop + 2))
{
Particles((integer)llList2String(g_lLeashPrims, g_iLoop + 1), kParticleTarget);
}
}
g_bLeashActive = TRUE;
}
StopParticles(integer iEnd)
{
for (g_iLoop = 0; g_iLoop < llGetListLength(g_lLeashPrims); g_iLoop++)
{
llLinkParticleSystem((integer)llList2String(g_lLeashPrims, g_iLoop + 1), []);
}
if (iEnd)
{
g_bLeashActive = FALSE;
g_kLeashedTo = NULLKEY;
g_kLeashToPoint = NULLKEY;
g_kParticleTarget = NULLKEY;
llSensorRemove();
}
}
string Vec2String(vector vVec)
{
list lParts = [vVec.x, vVec.y, vVec.z];
for (g_iLoop = 0; g_iLoop < 3; g_iLoop++)
{
string sStr = llList2String(lParts, g_iLoop);
//remove any trailing 0's or .'s from sStr
//while ((~(integer)llSubStringIndex(sStr, ".")) && (llGetSubString(sStr, -1, -1) == "0" || llGetSubString(sStr, -1, -1) == "."))
while ((~llSubStringIndex(sStr, ".")) && (llGetSubString(sStr, -1, -1) == "0" || llGetSubString(sStr, -1, -1) == "."))
{
sStr = llGetSubString(sStr, 0, -2);
}
lParts = llListReplaceList(lParts, [sStr], g_iLoop, g_iLoop);
}
return "<" + llDumpList2String(lParts, ",") + ">";
}
string Float2String(float in)
{
string out = (string)in;
integer i = llSubStringIndex(out, ".");
while ((~i) && llStringLength(llGetSubString(out, i + 2, -1)) && llGetSubString(out, -1, -1) == "0")
{
out = llGetSubString(out, 0, -2);
}
return out;
}
SaveSettings(string sToken, string sValue, integer bSaveToLocal)
{
integer iIndex = llListFindList(g_lSettings, [sToken]);
if (iIndex>=0)
{
g_lSettings = llListReplaceList(g_lSettings, [sValue], iIndex +1, iIndex +1);
}
else
{
g_lSettings += [sToken, sValue];
}
if (bSaveToLocal)
{
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + sToken + "=" + sValue, "");
}
}
SaveDefaultSettings(string sToken, string sValue)
{
integer index = llListFindList(g_lDefaultSettings, [sToken]);
if (index>=0)
{
g_lDefaultSettings = llListReplaceList(g_lDefaultSettings, [sValue], index+1, index+1);
}
else
{
g_lDefaultSettings += [sToken, sValue];
}
}
string GetDefaultSetting(string sToken)
{
integer index = llListFindList(g_lDefaultSettings, [sToken]);
return llList2String(g_lDefaultSettings, index + 1);
}
string GetSetting(string sToken)
{
integer index = llListFindList(g_lSettings, [sToken]);
if (index != -1) return llList2String(g_lSettings, index + 1);
else return GetDefaultSetting(sToken); // return from defaultsettings if not present
}
// get settings before StartParticles
GetSettings()
{
g_fBurstRate = (float)GetSetting(L_DENSITY);
g_vLeashGravity.z = (float)GetSetting(L_GRAVITY);
g_vLeashSize = (vector)GetSetting(L_SIZE);
g_fParticleAge = (float)GetSetting(L_LIFE); // ADDED FOR ST
g_vLeashColor = (vector)GetSetting(L_COLOR);
//g_bParticleGlow = (integer)GetSetting(L_GLOW);
string glow = llToLower(GetSetting(L_GLOW));
if (glow == "off" || glow == "0") g_bParticleGlow = 0 ;
if (glow == "on" || glow == "1") g_bParticleGlow = 1 ;
SetTexture(GetSetting(L_TEXTURE), NULLKEY);
}
// Added bSave as a boolean, to make this a more versatile wrapper
SetTexture(string sIn, key kIn)
{
g_sParticleTexture = sIn;
if (sIn=="chain"){
g_sParticleTextureID="796ef797-1726-4409-a70f-cd64304ada22";
} else if (sIn=="rope"){
g_sParticleTextureID="36b304cc-6209-4f47-9e4a-a68901e98e6e";
} else if (sIn=="totallytransparent"){
g_sParticleTextureID="8dcd4a48-2d37-4909-9f78-f7a9eb4ef903";
} else {
if (llToLower(g_sParticleTexture) == "noleash")
{
g_bInvisibleLeash = TRUE;
}
else
{
g_bInvisibleLeash = FALSE;
}
//Debug("particleTexture= " + sIn);
g_sParticleTextureID = llGetInventoryKey(sIn);
if(g_sParticleTextureID == NULL_KEY) g_sParticleTextureID=sIn; //for textures without full perm, we send the texture name. For this to work, texture must be in the emitter prim as well as in root, if different.
}
//Debug("particleTextureID= " + (string)g_sParticleTextureID);
if (kIn)
{
Notify(kIn, "Leash texture set to " + g_sParticleTexture, FALSE);
}
//Debug("activeleashpoints= " + (string)g_bLeashActive);
if (g_bLeashActive)
{
if (g_bInvisibleLeash)
{
StopParticles(FALSE);
}
else
{
StartParticles(g_kParticleTarget);
}
}
}
integer KeyIsAv(key id)
{
return llGetAgentSize(id) != ZERO_VECTOR;
}
//Menus
OptionsMenu(key kIn, integer iAuth)
{
g_sCurrentMenu = SUBMENU;
list lButtons = [L_TEXTURE, L_DENSITY, L_GRAVITY, L_COLOR, L_SIZE, L_LIFE];
if (g_bParticleGlow)
{
lButtons += "GlowOff";
}
else
{
lButtons += "GlowOn";
}
lButtons += [L_DEFAULTS];
string sPrompt = "\nCustomize the looks and feel of your leash.";
g_kDialogID = Dialog(kIn, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
DensityMenu(key kIn, integer iAuth)
{
list lButtons = ["+", "", "Default"];
g_sCurrentMenu = L_DENSITY;
string Default = GetDefaultSetting(L_DENSITY);
string sPrompt = "\nChoose + for more and for less particles\n'Default' to revert to the default: "+Default;
sPrompt += "\n\nCurrent Density = "+Float2String(g_fBurstRate) ;// BurstRate is opposite the implied effect of density
g_kDialogID = Dialog(kIn, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
GravityMenu(key kIn, integer iAuth)
{
list lButtons = ["+", "", "Default", "noGravity"];
g_sCurrentMenu = L_GRAVITY;
string Default = GetDefaultSetting(L_GRAVITY);
string sPrompt = "\nChoose + for more and for less leash-gravity\n'Default' to revert to the default: "+Default;
sPrompt += "\n\nCurrent Gravity = "+Float2String(g_vLeashGravity.z) ;
g_kDialogID = Dialog(kIn, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
SizeMenu(key kIn, integer iAuth)
{
list lButtons = ["X+", "Y+", "Default", "X-", "Y-", "MIN"]; // ADDED FOR ST changed "minimum" to "MIN"
g_sCurrentMenu = L_SIZE;
vector defaultsize = (vector)GetDefaultSetting(L_SIZE);
string sPrompt = "\nChoose '+' for bigger and '-' for smaller size of the leash texture";
sPrompt += "\n'Default' to revert to the default size: "+Float2String(defaultsize.x)+" x "+Float2String(defaultsize.y);
sPrompt += "\n'MIN' for the smallest possible: 0.04 x 0.04\n" ;
sPrompt += "\nCurrent Size = "+ Float2String(g_vLeashSize.x)+" x "+Float2String(g_vLeashSize.y) + " (0.03 steps)";
g_kDialogID = Dialog(kIn, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
LifeMenu(key kIn, integer iAuth) // ADDED FOR ST
{
list lButtons = ["+0.1", "+0.5", "Default", "-0.1", "-0.5", "MIN"];
g_sCurrentMenu = L_LIFE;
string sPrompt = "\nChoose '+' for longer or '-' for shorter life,";
sPrompt += "\n'Default' to revert to the default life: "+GetDefaultSetting(L_LIFE);
sPrompt += "\n'MIN' for the shortest life: 0.1\n";
sPrompt += "\nCurrent Life = "+llGetSubString((string)g_fParticleAge,0,2);
g_kDialogID = Dialog(kIn, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
ColorCategoryMenu(key kIn, integer iAuth)
{
//give kAv a dialog with a list of color cards
string sPrompt = "\nChoose a color category.";
g_sCurrentMenu = "L-ColorCat";
g_kDialogID = Dialog(kIn, sPrompt, g_lCategories, [UPMENU], 0, iAuth);
}
ColorMenu(key kIn, integer iAuth)
{
string sPrompt = "\nChoose a color.";
list lButtons = llList2ListStrided(g_lColors,0,-1,2);
g_sCurrentMenu = L_COLOR;
g_kDialogID = Dialog(kIn, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
TextureMenu(key kIn, integer iAuth)
{
list lButtons = ["Default", "chain","rope"];
integer iLoop;
string sName;
integer iCount = llGetInventoryNumber(0);
for (iLoop = 0; iLoop < iCount; iLoop++)
{
sName = llGetInventoryName(0, iLoop);
if (sName == "chain" || sName == "rope")
{
lButtons += [sName];
}
else if (llGetSubString(sName, 0, 5) == "leash_")
{
sName = llDeleteSubString(sName, 0, 5);
if (llStringLength(sName) > 24)
{
Notify(kIn, "Omitting '" + sName + "' from texture menu because it is too long. Please rename it.", TRUE);
}
else
{
lButtons += [sName];
}
}
}
lButtons += ["noTexture", "noLeash"];
g_sCurrentMenu = L_TEXTURE;
string sPrompt = "\nChoose a texture\nnoTexture does default SL particle dots\nnoLeash means no particle leash at all\n\nCurrent Texture = ";
sPrompt += g_sParticleTexture;
g_kDialogID = Dialog(kIn, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
LMSay()
{
llShout(LOCKMEISTER, (string)llGetOwnerKey(g_kLeashedTo) + "collar");
llShout(LOCKMEISTER, (string)llGetOwnerKey(g_kLeashedTo) + "handle");
}
default {
on_rez(integer iRez) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "leashParticle_";
g_kWearer = llGetOwner();
FindLinkedPrims();
StopParticles(TRUE);
llListen(COMMAND_PARTICLE,"","",""); // ADDED FOR BETA 0.1
//Debug("Starting");
}
link_message(integer iSenderPrim, integer iNum, string sMessage, key kMessageID)
{
if (iNum == COMMAND_PARTICLE)
{
g_kLeashedTo = kMessageID;
if (sMessage == "unleash")
{
StopParticles(TRUE);
llListenRemove(g_iLMListener);
llListenRemove(g_iLMListernerDetach);
}
else
{
//Debug("leash active");
if (! g_bInvisibleLeash)
{
integer bLeasherIsAv = (integer)llList2String(llParseString2List(sMessage, ["|"], [""]), 1);
g_kParticleTarget = g_kLeashedTo;
StartParticles(g_kParticleTarget);
if (bLeasherIsAv)
{
llListenRemove(g_iLMListener);
llListenRemove(g_iLMListernerDetach);
if (llGetSubString(sMessage, 0, 10) == "leashhandle")
{
g_iLMListener = llListen(LOCKMEISTER, "", "", (string)g_kLeashedTo + "handle ok");
g_iLMListernerDetach = llListen(LOCKMEISTER, "", "", (string)g_kLeashedTo + "handle detached");
}
else
{
g_iLMListener = llListen(LOCKMEISTER, "", "", "");
}
LMSay();
}
}
}
}
else if (iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)
{
if (llToLower(sMessage) == llToLower(SUBMENU))
{
if(iNum == COMMAND_OWNER) OptionsMenu(kMessageID, iNum);
else Notify(kMessageID, "Leash Options can only be changed by " + CTYPE + " Owners.", FALSE);
}
else if (sMessage == "menu "+SUBMENU)
{
if(iNum == COMMAND_OWNER) OptionsMenu(kMessageID, iNum);
else
{
Notify(kMessageID, "Leash Options can only be changed by " + CTYPE + " Owners.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu "+PARENTMENU, kMessageID);
}
}
}
else if (iNum == MENUNAME_REQUEST && sMessage == PARENTMENU)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, PARENTMENU + "|" + SUBMENU, "");
}
else if (iNum == DIALOG_RESPONSE)
{
if (kMessageID == g_kDialogID)
{
list lMenuParams = llParseString2List(sMessage, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sButton = llList2String(lMenuParams, 1);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sButton == UPMENU)
{
if(g_sCurrentMenu == SUBMENU)
{
llMessageLinked(LINK_SET, iAuth, "menu " + PARENTMENU, kAv);
}
else if (g_sCurrentMenu == L_COLOR)
{
ColorCategoryMenu(kAv, iAuth);
}
else
{
OptionsMenu(kAv, iAuth);
}
}
else if (g_sCurrentMenu == "Particle")
{
if (sButton == L_DEFAULTS)
{
g_lSettings = []; // clear current settings
Notify(kAv, "Leash-settings restored to " + CTYPE + " defaults.", FALSE);
// Cleo: as we use standard, no reason to keep the local settings
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "all", "");
if (!g_bInvisibleLeash && g_bLeashActive)
{
GetSettings(); // get settings before
StartParticles(g_kParticleTarget);
}
OptionsMenu(kAv, iAuth);
}
else if (sButton == L_TEXTURE)
{
TextureMenu(kAv, iAuth);
}
else if (sButton == L_COLOR)
{
ColorCategoryMenu(kAv, iAuth);
}
else if (sButton == L_DENSITY)
{
DensityMenu(kAv, iAuth);
}
else if (sButton == L_GRAVITY)
{
GravityMenu(kAv, iAuth);
}
else if (sButton == L_SIZE)
{
SizeMenu(kAv, iAuth);
}
else if (sButton == L_LIFE) // ADDED FOR ST
{
LifeMenu(kAv, iAuth);
}
else if (llGetSubString(sButton, 0, 3) == L_GLOW)
{
g_bParticleGlow = !g_bParticleGlow;
SaveSettings(L_GLOW, (string)g_bParticleGlow, TRUE);
if (!g_bInvisibleLeash && g_bLeashActive)
{
StartParticles(g_kParticleTarget);
}
OptionsMenu(kAv, iAuth);
}
}
else if (g_sCurrentMenu == "L-ColorCat")
{
g_sCurrentCategory = sButton;
integer iIndex = llListFindList(g_lCategories,[sButton]);
g_lColors = llParseString2List(llList2String(g_lAllColors, iIndex), ["\n", "|"], []);
g_lColors = llListSort(g_lColors, 2, TRUE);
ColorMenu(kAv, iAuth);
}
else if (g_sCurrentMenu == L_COLOR)
{
integer iIndex = llListFindList(g_lColors, [sButton]) +1;
if (iIndex)
{
g_vLeashColor = (vector)llList2String(g_lColors, iIndex);
SaveSettings(L_COLOR, Vec2String(g_vLeashColor), TRUE);
}
if (!g_bInvisibleLeash && g_bLeashActive)
{
StartParticles(g_kParticleTarget);
}
ColorMenu(kAv, iAuth);
}
else if (g_sCurrentMenu == L_TEXTURE)
{
g_bInvisibleLeash = FALSE;
if (sButton == "Default")
{
SetTexture(GetDefaultSetting(L_TEXTURE), kAv);
}
else if (sButton == "chain")
{
SetTexture(sButton, kAv);
}
else if(sButton == "rope")
{
SetTexture(sButton, kAv);
}
else if (sButton == "noTexture")
{
SetTexture(sButton, kAv);
}
else if (sButton == "noLeash")
{
SetTexture(sButton, kAv);
}
else
{
sButton = "leash_" + sButton;
if (llGetInventoryType(sButton)==INVENTORY_TEXTURE) //the texture exists
{
SetTexture(sButton, kAv);
}
}
SaveSettings(L_TEXTURE, g_sParticleTexture, TRUE);
TextureMenu(kAv, iAuth);
}
else if (g_sCurrentMenu == L_DENSITY)
{
if (sButton == "Default")
{
g_fBurstRate = (float)GetDefaultSetting(L_DENSITY);
}
else if (sButton == "+")
{
g_fBurstRate -= 0.01;
}
else if (sButton == "")
{
g_fBurstRate += 0.01;
}
if (!g_bInvisibleLeash && g_bLeashActive)
{
StartParticles(g_kParticleTarget);
}
SaveSettings(L_DENSITY, Float2String(g_fBurstRate), TRUE);
DensityMenu(kAv, iAuth);
}
else if (g_sCurrentMenu == L_GRAVITY)
{
if (sButton == "Default")
{
g_vLeashGravity.z = (float)GetDefaultSetting(L_GRAVITY);
}
else if (sButton == "+")
{
g_vLeashGravity.z -= 0.1;
if (g_vLeashGravity.z < -3.0)
{
g_vLeashGravity.z = -3.0;
Notify(kAv, "You have already reached maximum gravity.", FALSE);
}
}
else if (sButton == "")
{
g_vLeashGravity.z += 0.1;
if (g_vLeashGravity.z > 0.0)
{
g_vLeashGravity.z = 0.0 ;
Notify(kAv, "You have already reached 0 leash-gravity.", FALSE);
}
}
else if (sButton == "noGravity")
{
g_vLeashGravity = <0.0,0.0,0.0>;
}
if (!g_bInvisibleLeash && g_bLeashActive)
{
StartParticles(g_kParticleTarget);
}
SaveSettings(L_GRAVITY, Float2String(g_vLeashGravity.z), TRUE);
GravityMenu(kAv, iAuth);
}
else if (g_sCurrentMenu == L_SIZE)
{
if (sButton == "Default")
{
g_vLeashSize = (vector)GetDefaultSetting(L_SIZE);
}
else if (sButton == "X+")
{
g_vLeashSize.x +=0.03;
}
else if (sButton == "Y+")
{
g_vLeashSize.y +=0.03;
}
else if (sButton == "X-")
{
g_vLeashSize.x -=0.03;
if (g_vLeashSize.x < 0.04)
{
g_vLeashSize.x = 0.04 ;
Notify(kAv, "You have reached the minimum size for particles.", FALSE);
}
}
else if (sButton == "Y-")
{
g_vLeashSize.y -=0.03;
if (g_vLeashSize.y < 0.04)
{
g_vLeashSize.y = 0.04 ;
Notify(kAv, "You have reached the minimum size for particles.", FALSE);
}
}
else if (sButton == "MIN") // ADDED FOR ST changed "minimum" to "MIN"
{
g_vLeashSize = <0.04,0.04,0.0>;
}
if (!g_bInvisibleLeash && g_bLeashActive)
{
StartParticles(g_kParticleTarget);
}
SaveSettings(L_SIZE, Vec2String(g_vLeashSize), TRUE);
SizeMenu(kAv, iAuth);
}
else if (g_sCurrentMenu == L_LIFE) // ADDED FOR ST
{
if (sButton == "Default")
{
g_fParticleAge = (float)GetDefaultSetting(L_LIFE);
}
else if (sButton == "+0.5")
{
g_fParticleAge += 0.5;
}
else if (sButton == "-0.5")
{
//if (g_fParticleAge <= 0.5)
//{
// Notify(kAv, "Use the -0.1 button to reach minimum particle life.", FALSE);
//}
//else
//{
g_fParticleAge -= 0.5;
//}
if (g_fParticleAge < 0.1)
{
g_fParticleAge = 0.1;
Notify(kAv, "You have reached minimum particle life.", FALSE);
}
}
else if (sButton == "+0.1")
{
g_fParticleAge += 0.1;
}
else if (sButton == "-0.1")
{
g_fParticleAge -= 0.1;
if (g_fParticleAge < 0.1)
{
g_fParticleAge = 0.1;
Notify(kAv, "You have reached minimum particle life.", FALSE);
}
}
else if (sButton == "MIN")
{
g_fParticleAge = 0.1;
}
if (!g_bInvisibleLeash && g_bLeashActive)
{
StartParticles(g_kParticleTarget);
}
SaveSettings(L_LIFE, Float2String(g_fParticleAge), TRUE);
LifeMenu(kAv,iAuth);
}
}
}
else if (iNum == LM_SETTING_RESPONSE)
{
//Debug ("LocalSettingsResponse: " + sMessage);
integer i = llSubStringIndex(sMessage, "=");
string sToken = llGetSubString(sMessage, 0, i - 1);
string sValue = llGetSubString(sMessage, i + 1, -1);
i = llSubStringIndex(sToken, "_");
if (sToken == "leash_leashedto")
{
g_kLeashedTo = (key)llList2String(llParseString2List(sValue, [","], []), 0);
}
else if (llGetSubString(sToken, 0, i) == g_sScript)
{
// load current settings
sToken = llGetSubString(sToken, i + 1, -1);
SaveSettings(sToken, sValue, FALSE);
SaveDefaultSettings(sToken, sValue);
}
else if (sToken == "Global_CType") CTYPE = sValue;
// in case wearer is currently leashed
else if (sMessage == "settings=sent")
{
GetSettings(); // get settings before
if (g_kLeashedTo != NULLKEY) StartParticles(g_kParticleTarget);
}
}
else if (iNum == LM_SETTING_DELETE)
{
if (sMessage == "leash_leashedto")
{
StopParticles(TRUE);
}
}
}
listen(integer iChannel, string sName, key kID, string sMessage)
{
if (iChannel == LOCKMEISTER)
{
//leash holder announced it got detached... send particles to avi
if (sMessage == (string)g_kLeashedTo + "handle detached")
{
g_kParticleTarget = g_kLeashedTo;
StartParticles(g_kParticleTarget);
}
// We heard from a leash holder. re-direct particles
if (llGetOwnerKey(kID) == g_kLeashedTo)
{
sMessage = llGetSubString(sMessage, 36, -1);
if (sMessage == "collar ok")
{
g_kParticleTarget = kID;
StartParticles(g_kParticleTarget);
}
if (sMessage == "handle ok")
{
g_kParticleTarget = kID;
StartParticles(g_kParticleTarget);
}
}
}
// ADDED BELOW FOR BETA 0.1 TOGGLES LEASH PARTICLES OFF IF COFFLES BEING USED.
else if(iChannel == COMMAND_PARTICLE)
{
if(llGetOwnerKey(kID) == g_kWearer)
{
integer currentglow;
if(sMessage == "noLeash")
{
currentglow = g_bParticleGlow;
g_bParticleGlow = FALSE;
SetTexture(sMessage, g_kWearer);
StartParticles(g_kParticleTarget);
}
if(sMessage == "chain")
{
g_bParticleGlow = currentglow;
SetTexture(sMessage, g_kWearer);
StartParticles(g_kParticleTarget);
}
}
}
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

View File

@@ -0,0 +1,664 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - listener //
// version 3.990 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
integer g_iListenChan = 1;
integer g_iListenChan0 = TRUE;
string g_sPrefix = ".";
integer g_iPollForNameChange = 60; //seconds to poll for name change
integer g_iCustomName = FALSE; //this is our bit flag to see if we're using an LM_SETTING custom name
integer g_iLockMeisterChan = -8888;
integer g_iListener1;
integer g_iListener2;
integer g_iLockMeisterListener;
integer g_iHUDListener;
integer g_iHUDChan;
//list g_lHudComms; //2 strided list of uuid and unixtime of something that communicated on the hud channel
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510; // new for safeword
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer NOTIFY=1002;
integer NOTIFY_OWNERS=1003;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the httpdb
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer INTERFACE_REQUEST = -9006;
integer INTERFACE_RESPONSE = -9007;
integer TOUCH_REQUEST = -9500;
integer TOUCH_CANCEL = -9501;
integer TOUCH_RESPONSE = -9502;
integer TOUCH_EXPIRE = -9503;
//5000 block is reserved for IM slaves
//EXTERNAL MESSAGE MAP
integer EXT_COMMAND_COLLAR = 499;
// new g_sSafeWord
string g_sSafeWord = "RED";
//added for attachment auth
integer g_iInterfaceChannel; // AO Backwards Compatibility
integer g_iListenHandleAtt;
integer ATTACHMENT_REQUEST = 600;
integer ATTACHMENT_RESPONSE = 601;
integer ATTACHMENT_FORWARD = 610;
key g_kWearer;
string g_sScript = "listener_";
string CTYPE = "collar";
string WEARERNAME;
list g_lOwners;
//globlals for supporting touch requests
list g_lTouchRequests; // 4-strided list in form of touchid, recipient, flags, auth level
integer g_iStrideLength = 4;
integer FLAG_TOUCHSTART = 0x01;
integer FLAG_TOUCHEND = 0x02;
integer g_iNeedsPose = FALSE; // should the avatar be forced into a still pose for making touching easier
string g_sPOSE_ANIM = "turn_180";
integer g_iTouchNotify = FALSE; // for Touch Notify
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
// integer pos;
// while (~pos=llSubStringIndex(sMsg, "%WEARERNAME%")) {
// if (llStringLength(sMsg) == 12) { sMsg = WEARERNAME; }
// else if (pos == 0) { sMsg = WEARERNAME+llGetSubString(sMsg, pos+12, -1); }
// else if (pos == llStringLength(sMsg)-12) { sMsg = llGetSubString(sMsg, 0, pos-1)+WEARERNAME; }
// else { sMsg = llGetSubString(sMsg, 0, pos-1)+WEARERNAME+llGetSubString(sMsg, pos+12, -1); }
// }
if ((key)kID){
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
// if (~llListFindList(g_lHudComms,[kID])){
// llRegionSayTo(kID,g_iHUDChan,sMsg);
// } else
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
//} else {
//Debug("Bad key, can't notify:"+sMsg);
}
}
NotifyOwners(string sMsg, string comments) {
integer n;
integer iStop = llGetListLength(g_lOwners);
for (n = 0; n < iStop; n += 2) {
key kAv = (key)llList2String(g_lOwners, n);
if (comments=="ignoreNearby"){
//we don't want to bother the owner if he/she is right there, so check distance
vector vOwnerPos = (vector)llList2String(llGetObjectDetails(kAv, [OBJECT_POS]), 0);
if (vOwnerPos == ZERO_VECTOR || llVecDist(vOwnerPos, llGetPos()) > 20.0) {//vOwnerPos will be ZERO_VECTOR if not in sim
//Debug("notifying " + (string)kAv);
//Debug("Sending notify to "+(string)kAv);
Notify(kAv, sMsg,FALSE);
//} else {
//Debug("Not sending notify to "+(string)kAv);
}
} else {
//Debug("Sending notify to "+(string)kAv);
Notify(kAv, sMsg,FALSE);
}
}
}
//functions from touch script
ClearUser(key kRCPT, integer iNotify) {
//find any strides belonging to user and remove them
integer iIndex = llListFindList(g_lTouchRequests, [kRCPT]);
while (~iIndex)
{
if (iNotify)
{
key kID = llList2Key(g_lTouchRequests, iIndex -1);
integer iAuth = llList2Integer(g_lTouchRequests, iIndex + 2);
llMessageLinked(LINK_THIS, TOUCH_EXPIRE, (string) kRCPT + "|" + (string) iAuth,kID);
}
g_lTouchRequests = llDeleteSubList(g_lTouchRequests, iIndex - 1, iIndex - 2 + g_iStrideLength);
iIndex = llListFindList(g_lTouchRequests, [kRCPT]);
}
if (g_iNeedsPose && [] == g_lTouchRequests) llStopAnimation(g_sPOSE_ANIM);
}
sendCommandFromLink(integer iLinkNumber, string sType, key kToucher) {
// check for temporary touch requests
integer iTrig;
integer iNTrigs = llGetListLength(g_lTouchRequests);
for (iTrig = 0; iTrig < iNTrigs; iTrig+=g_iStrideLength)
{
if (llList2Key(g_lTouchRequests, iTrig + 1) == kToucher)
{
integer iTrigFlags = llList2Integer(g_lTouchRequests, iTrig + 2);
if (((iTrigFlags & FLAG_TOUCHSTART) && sType == "touchstart")
||((iTrigFlags & FLAG_TOUCHEND)&& sType == "touchend"))
{
integer iAuth = llList2Integer(g_lTouchRequests, iTrig + 3);
string sReply = (string) kToucher + "|" + (string) iAuth + "|" + sType +"|"+ (string) iLinkNumber;
llMessageLinked(LINK_THIS, TOUCH_RESPONSE, sReply, llList2Key(g_lTouchRequests, iTrig));
}
if (sType =="touchend") ClearUser(kToucher, FALSE);
return;
}
}
// check for permanent triggers (inlined sendPermanentCommandFromLink(iLinkNumber, sType, kToucher);)
//string sDesc = (string)llGetObjectDetails(llGetLinkKey(iLinkNumber), [OBJECT_DESC]);
//sDesc += (string)llGetObjectDetails(llGetLinkKey(LINK_ROOT), [OBJECT_DESC]);
string sDesc = llDumpList2String(llGetLinkPrimitiveParams(iLinkNumber,[PRIM_DESC])+llGetLinkPrimitiveParams(LINK_ROOT,[PRIM_DESC]),"~");
list lDescTokens = llParseStringKeepNulls(sDesc, ["~"], []);
integer iNDescTokens = llGetListLength(lDescTokens);
integer iDescToken;
for (iDescToken = 0; iDescToken < iNDescTokens; iDescToken++) {
string sDescToken = llList2String(lDescTokens, iDescToken);
if (sDescToken == sType || sDescToken == sType+":" || sDescToken == sType+":none") return;
else if (!llSubStringIndex(sDescToken, sType+":")) {
string sCommand = llGetSubString(sDescToken, llStringLength(sType)+1, -1);
if (sCommand != "") llMessageLinked(LINK_SET, COMMAND_NOAUTH, sCommand, kToucher);
return;
}
}
if (sType == "touchstart") {
llMessageLinked(LINK_SET, COMMAND_NOAUTH, "menu", kToucher);
if (g_iTouchNotify && kToucher!=g_kWearer) llOwnerSay("\n\nsecondlife:///app/agent/"+(string)kToucher+"/about touched your "+CTYPE+".\n");
}
}
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
list name = llParseString2List(llKey2Name(g_kWearer), [" "], []);
g_sPrefix = llGetSubString(llList2String(name, 0), 0, 0);
g_sPrefix += llGetSubString(llList2String(name, 1), 0, 0);
g_sPrefix = llToLower(g_sPrefix);
//Debug("Default prefix: " + g_sPrefix);
//inlined single use getOwnerChannel function
g_iHUDChan = -llAbs((integer)("0x"+llGetSubString((string)g_kWearer,2,7)) + 1111);
if (g_iHUDChan > -10000) g_iHUDChan -= 30000;
g_iInterfaceChannel = (integer)("0x" + llGetSubString(g_kWearer,30,-1));
if (g_iInterfaceChannel > 0) g_iInterfaceChannel = -g_iInterfaceChannel;
//set up listeners... inlined existing function
//public listener
llListenRemove(g_iListener1);
if (g_iListenChan0 == TRUE) g_iListener1 = llListen(0, "", NULL_KEY, "");
//private listener
llListenRemove(g_iListener2);
g_iListener2 = llListen(g_iListenChan, "", NULL_KEY, "");
//lockmeister listener
llListenRemove(g_iLockMeisterListener);
g_iLockMeisterListener = llListen(g_iLockMeisterChan, "", NULL_KEY, (string)g_kWearer + "collar");
//garvin attachments listener
llListenRemove(g_iListenHandleAtt);
g_iListenHandleAtt = llListen(g_iInterfaceChannel, "", "", "");
//owner hud listener
llListenRemove(g_iHUDListener);
g_iHUDListener = llListen(g_iHUDChan, "", NULL_KEY ,""); //reinstated
integer iAttachPt = llGetAttached();
if ((iAttachPt > 0 && iAttachPt < 31) || iAttachPt == 39) // if collar is attached to the body (thus excluding HUD and root/avatar center)
llRequestPermissions(g_kWearer, PERMISSION_TRIGGER_ANIMATION);
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "Global_WearerName", "");
//llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "channel", "");
llSetTimerEvent(60.0); //set timer event to catch changes in display name
//Debug("Starting");
}
attach(key kID)
{
//g_kWearer = llGetOwner();
if (kID == NULL_KEY)
{
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "OpenCollar=No");
}
else
{
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "OpenCollar=Yes");
}
integer iAttachPt = llGetAttached();
if ((iAttachPt > 0 && iAttachPt < 31) || iAttachPt == 39) // if collar is attached to the body (thus excluding HUD and root/avatar center)
llRequestPermissions(g_kWearer, PERMISSION_TRIGGER_ANIMATION);
}
listen(integer iChan, string sName, key kID, string sMsg)
{
if (iChan == g_iHUDChan)
{
// //track hud channel users
// integer hudIndex;
// if (~hudIndex=llListFindList(g_lHudComms,[kID])){
// g_lHudComms=llDeleteSubList(g_lHudComms,hudIndex,hudIndex+1);
// }
// g_lHudComms += [kID,llGetUnixTime()];
//check for a ping, if we find one we request auth and answer in LMs with a pong
if (sMsg==(string)g_kWearer + ":ping")
{
llMessageLinked(LINK_SET, COMMAND_NOAUTH, "ping", kID);
//llMessageLinked(LINK_SET, COMMAND_NOAUTH, "ping", llGetOwnerKey(kID));
}
// an object wants to know the version, we check if it is allowed to
else if (sMsg==(string)g_kWearer + ":version")
{
llMessageLinked(LINK_SET, COMMAND_NOAUTH, "objectversion", kID);
//llMessageLinked(LINK_SET, COMMAND_NOAUTH, "objectversion", llGetOwnerKey(kID));
}
// it it is not a ping, it should be a command for use, to make sure it has to have the key in front of it
else if (!llSubStringIndex(sMsg,(string)g_kWearer + ":"))
{
sMsg = llGetSubString(sMsg, 37, -1);
llMessageLinked(LINK_SET, COMMAND_NOAUTH, sMsg, kID);
//llMessageLinked(LINK_SET, COMMAND_NOAUTH, sMsg, llGetOwnerKey(kID));
}
else
{
// //Debug("command: "+sMsg+" from "+(string)kID);
// if (llGetOwnerKey(kID)==llGetOwner()){ //if the wearer's attachment requests it, then the command can be proxied for another user
// key sDestAv = llGetSubString(sMsg, 0, 35);
// if ((key)sDestAv){
// sMsg = llGetSubString(sMsg, 36, -1);
// kID=sDestAv;
// //Debug("command for foreign user");
// }
// }
//Debug("command: "+sMsg+" from "+(string)kID);
llMessageLinked(LINK_SET, COMMAND_NOAUTH, sMsg, kID);
//llMessageLinked(LINK_SET, COMMAND_NOAUTH, sMsg, llGetOwnerKey(kID));
}
return;
}
if (iChan == g_iLockMeisterChan)
{
llWhisper(g_iLockMeisterChan,(string)g_kWearer + "collar ok");
return;
}
if(llGetOwnerKey(kID) == g_kWearer) // also works for attachments
{
string sw = sMsg; // we'll have to shave pieces off as we go to test
// safeword can be the safeword or safeword said in OOC chat "((SAFEWORD))"
// and may include prefix
if (llGetSubString(sw, 0, 3) == "/me ") sw = llGetSubString(sw, 4, -1);
if (llGetSubString(sw, 0, 1) == "((" && llGetSubString(sw, -2, -1) == "))") sw = llGetSubString(sw, 2, -3);
if (llSubStringIndex(sw, g_sPrefix)==0) sw = llGetSubString(sw, llStringLength(g_sPrefix), -1);
if (sw == g_sSafeWord) {
llMessageLinked(LINK_SET, COMMAND_SAFEWORD, "", "");
llOwnerSay("You used your safeword, your owners will be notified you did.");
NotifyOwners("Your sub " + WEARERNAME + " has used the safeword. Please check on their well-being in case further care is required.","");
llMessageLinked(LINK_THIS, INTERFACE_RESPONSE, "safeword", "");
return;
}
}
//added for attachment auth (garvin)
if (iChan == g_iInterfaceChannel)
{
//Debug(sMsg);
//do nothing if wearer isnt owner of the object
if (llGetOwnerKey(kID) != g_kWearer) return;
//if (sMsg == "OpenCollar?") llWhisper(g_iInterfaceChannel, "OpenCollar=Yes");
if (sMsg == "OpenCollar?") llRegionSayTo(g_kWearer, g_iInterfaceChannel, "OpenCollar=Yes");
else if (sMsg == "version") llMessageLinked(LINK_SET, COMMAND_WEARER, "attachmentversion", g_kWearer); //main knows version number, main can respond to this request for us
else {
list lParams = llParseString2List(sMsg, ["|"], []);
integer iAuth = llList2Integer(lParams, 0);
if (iAuth == 0) //auth request
{
string sCmd = llList2String(lParams, 1);
string sUserId= llGetSubString(llList2String(lParams, 2),0,35);
string sObjectId= llGetSubString(llList2String(lParams, 2),36,-1);
//Debug("garvin auth for key"+sUserId);
//just send ATTACHMENT_REQUEST and ID to auth, as no script IN the collar needs the command anyway
llMessageLinked(LINK_SET, ATTACHMENT_REQUEST, sCmd+"|"+sUserId+"|"+sObjectId, (key)sUserId);
}
else if (iAuth == EXT_COMMAND_COLLAR) //command from attachment to AO
{
llRegionSayTo(g_kWearer, g_iInterfaceChannel, sMsg);
}
else
{
// we received a unkown command, so we just forward it via LM into the cuffs
llMessageLinked(LINK_SET, ATTACHMENT_FORWARD, sMsg, kID);
}
}
} else { //check for our prefix, or *
if (!llSubStringIndex(sMsg, g_sPrefix)) sMsg = llGetSubString(sMsg, llStringLength(g_sPrefix), -1); //strip our prefix from command
else if (llGetSubString(sMsg, 0, 0) == "*") sMsg = llGetSubString(sMsg, 1, -1); //strip * (all collars wildcard) from command
else if ((llGetSubString(sMsg, 0, 0) == "#") && (kID != g_kWearer)) sMsg = llGetSubString(sMsg, 1, -1); //strip # (all collars but me) from command
else return;
//Debug("Got comand "+sMsg);
llMessageLinked(LINK_SET, COMMAND_NOAUTH, sMsg, kID);
}
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (iNum==INTERFACE_RESPONSE)
{
if (sStr == "safeword") llRegionSay(g_iHUDChan, "safeword");
}
else if (iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)
{
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
string sValue = llToLower(llList2String(lParams, 1));
if (sStr == "ping") { // ping from an object, we answer to it on the object channel
llRegionSayTo(kID,g_iHUDChan,(string)g_kWearer+":pong"); // sim wide response to owner hud
} else if (iNum == COMMAND_OWNER) { //handle changing prefix and channel from owner
if (sCommand == "prefix")
{
string value = llList2String(lParams, 1);
if (value == "")
{
Notify(kID,"prefix: " + g_sPrefix, FALSE);
return;
}
g_sPrefix=value;
Notify(kID, "\n" + WEARERNAME + "'s prefix is '" + g_sPrefix + "'.\nTouch the " + CTYPE + " or say '" + g_sPrefix + "menu' for the main menu.\nSay '" + g_sPrefix + "help' for a list of chat commands.", FALSE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "Global_prefix=" + g_sPrefix, "");
}
else if (sCommand == "name")
{
if (sValue=="") { //Just let them know their current name
string message= "\n\n"+WEARERNAME+"'s current name is " + WEARERNAME;
message += "\nName command help: <prefix>name [newname|reset]\n";
Notify(kID, message, FALSE);
}
else if(sValue=="reset") { //unset Global_WearerName
string message=WEARERNAME+"'s new name is reset to ";
WEARERNAME = llGetDisplayName(g_kWearer);
if (WEARERNAME == "???" || WEARERNAME == "") WEARERNAME = llKey2Name(g_kWearer);
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "Global_WearerName", "");
llMessageLinked(LINK_SET, LM_SETTING_RESPONSE, "Global_WearerName="+WEARERNAME, "");
message += WEARERNAME;
g_iCustomName = FALSE;
Notify(kID, message, FALSE);
}
else {
string message=WEARERNAME+"'s new name is ";
WEARERNAME = llDumpList2String(llList2List(lParams, 1,-1)," ");
message += WEARERNAME;
g_iCustomName = TRUE;
Notify(kID, message, FALSE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "Global_WearerName=" + WEARERNAME, ""); //store
llMessageLinked(LINK_SET, LM_SETTING_RESPONSE, "Global_WearerName="+WEARERNAME, "");
}
}
else if (sCommand == "channel")
{
integer iNewChan = (integer)sValue;
if (sValue=="") { //they left the param blank, report listener status
string message=CTYPE+" is listening on channel";
if (g_iListenChan0) message += "s 0 and";
message += " "+(string)g_iListenChan+".";
Notify(kID, message, FALSE);
} else if (iNewChan > 0) { //set new channel for private listener
g_iListenChan = iNewChan;
llListenRemove(g_iListener2);
g_iListener2 = llListen(g_iListenChan, "", NULL_KEY, "");
Notify(kID, "Now listening on channel " + (string)g_iListenChan + ".", FALSE);
if (g_iListenChan0) //save setting along with the state of thepublic listener (messy!)
{
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "channel=" + (string)g_iListenChan + ",TRUE", "");
}
else
{
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "channel=" + (string)g_iListenChan + ",FALSE", "");
}
}
else if (iNewChan == 0) //enable public listener
{
g_iListenChan0 = TRUE;
llListenRemove(g_iListener1);
g_iListener1 = llListen(0, "", NULL_KEY, "");
Notify(kID, "You enabled the public channel listener.\nTo disable it use -1 as channel command.", FALSE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "channel=" + (string)g_iListenChan + ",TRUE", "");
}
else if (iNewChan == -1) //disable public listener
{
g_iListenChan0 = FALSE;
llListenRemove(g_iListener1);
Notify(kID, "You disabled the public channel listener.\nTo enable it use 0 as channel command, remember you have to do this on your channel /" +(string)g_iListenChan, FALSE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "channel=" + (string)g_iListenChan + ",FALSE", "");
}
}
}
if (kID == g_kWearer)
{
if (sCommand == "safeword")
{ // new for safeword
if(llStringTrim(sValue, STRING_TRIM) != "")
{
g_sSafeWord = llList2String(lParams, 1);
llOwnerSay("You set a new safeword: " + g_sSafeWord + ".");
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "safeword=" + g_sSafeWord, "");
}
else
{
llOwnerSay("Your safeword is: " + g_sSafeWord + ".");
}
}
else if (sCommand == "busted")
{
if (sValue == "on")
{
llMessageLinked(LINK_THIS,LM_SETTING_SAVE,"Global_touchNotify=1","");
g_iTouchNotify=TRUE;
llOwnerSay("Touch notification is now enabled.");
}
else if (sValue == "off")
{
llMessageLinked(LINK_THIS,LM_SETTING_DELETE,"Global_touchNotify","");
g_iTouchNotify=FALSE;
llOwnerSay("Touch notification is now disabled.");
}
else if (sValue == "")
{
if (g_iTouchNotify) {
llOwnerSay("Touch notification is now disabled.");
llMessageLinked(LINK_THIS,LM_SETTING_DELETE,"Global_touchNotify","");
g_iTouchNotify = FALSE;
}
else {
llOwnerSay("Touch notification is now enabled.");
llMessageLinked(LINK_THIS,LM_SETTING_SAVE,"Global_touchNotify=1","");
g_iTouchNotify = TRUE;
}
}
}
}
} else if (iNum == LM_SETTING_SAVE) {
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == "auth_owner" && llStringLength(sValue) > 0) g_lOwners = llParseString2List(sValue, [","], []);
} else if (iNum == LM_SETTING_EMPTY) {
if (sStr=="Global_WearerName"){
WEARERNAME = llGetDisplayName(g_kWearer);
if (WEARERNAME == "???" || WEARERNAME == "") WEARERNAME = llKey2Name(g_kWearer);
llMessageLinked(LINK_THIS,LM_SETTING_RESPONSE,"Global_WearerName="+WEARERNAME,"");
}
} else if (iNum == LM_SETTING_RESPONSE) {
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == "Global_prefix")
{
if (sValue != "") g_sPrefix=sValue;
}
else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken == "Global_touchNotify") g_iTouchNotify = (integer)sValue; // for Touch Notify
else if (sToken == "Global_WearerName") WEARERNAME = sValue;
else if (sToken == "auth_owner" && llStringLength(sValue) > 0) g_lOwners = llParseString2List(sValue, [","], []);
else if (sToken == "listener_safeword") g_sSafeWord = sValue;
else if (sToken == "listener_channel") {
g_iListenChan = (integer)sValue;
if (llGetSubString(sValue, llStringLength(sValue) - 5 , -1) == "FALSE") g_iListenChan0 = FALSE;
else g_iListenChan0 = TRUE;
llListenRemove(g_iListener1);
if (g_iListenChan0 == TRUE) g_iListener1 = llListen(0, "", NULL_KEY, "");
llListenRemove(g_iListener2);
g_iListener2 = llListen(g_iListenChan, "", NULL_KEY, "");
}
}
else if (iNum == POPUP_HELP)
{
//replace _PREFIX_ with prefix, and _CHANNEL_ with (strin) channel
sStr = osReplaceString(sStr, "_PREFIX_", g_sPrefix, -1, 0);
sStr = osReplaceString(sStr, "_CHANNEL_", (string)g_iListenChan, -1, 0);
Notify(kID, sStr, FALSE);
}
//added for attachment auth (garvin)
else if (iNum == ATTACHMENT_RESPONSE)
{
//Debug(sStr);
//here the response from auth has to be:
// llMessageLinked(LINK_SET, ATTACHMENT_RESPONSE, "auth", UUID);
//where "auth" has to be (string)COMMAND_XY
//reason for this is: i dont want to have all other scripts recieve a COMMAND+xy and check further for the command
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "RequestReply|" + sStr);
}
else if (iNum == TOUCH_REQUEST)
{ //str will be pipe-delimited list with rcpt|flags|auth
list lParams = llParseStringKeepNulls(sStr, ["|"], []);
key kRCPT = (key)llList2String(lParams, 0);
integer iFlags = (integer)llList2String(lParams, 1);
integer iAuth = (integer)llList2String(lParams, 2);
ClearUser(kRCPT, TRUE);
g_lTouchRequests += [kID, kRCPT, iFlags, iAuth];
if (g_iNeedsPose) llStartAnimation(g_sPOSE_ANIM);
}
else if (iNum == TOUCH_CANCEL)
{
integer iIndex = llListFindList(g_lTouchRequests, [kID]);
if (~iIndex)
{
g_lTouchRequests = llDeleteSubList(g_lTouchRequests, iIndex, iIndex - 1 + g_iStrideLength);
if (g_iNeedsPose && [] == g_lTouchRequests) llStopAnimation(g_sPOSE_ANIM);
}
} else if (iNum==NOTIFY){
Notify(kID,llGetSubString(sStr,1,-1),(integer)llGetSubString(sStr,0,0));
} else if (iNum==NOTIFY_OWNERS){
NotifyOwners(sStr,(string)kID);
}
}
touch_start(integer iNum)
{
//Debug("touched");
sendCommandFromLink(llDetectedLinkNumber(0), "touchstart", llDetectedKey(0));
}
touch_end(integer iNum)
{
sendCommandFromLink(llDetectedLinkNumber(0), "touchend", llDetectedKey(0));
}
//no more self resets
timer()
{
if (g_iCustomName == FALSE) { //If we don't have a custom LM_SETTING Global_WearerName
string sLoadDisplayName = llGetDisplayName(g_kWearer); //Load this once
if (((sLoadDisplayName != "") && (sLoadDisplayName != "???")) && (sLoadDisplayName != WEARERNAME)) {
//The displayname loaded correctly, and it's different than our current WEARERNAME
//wearer changed their displayname since last timer event
WEARERNAME = sLoadDisplayName;
llMessageLinked(LINK_SET, LM_SETTING_RESPONSE, "Global_WearerName="+WEARERNAME, ""); //force update other scripts
}
}
}
run_time_permissions(integer iPerm)
{
if (iPerm & PERMISSION_TRIGGER_ANIMATION) g_iNeedsPose = TRUE;
}
changed(integer iChange)
{
if (iChange & CHANGED_OWNER) llResetScript();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

792
LSL/OpenCollar - main.lsl Normal file
View File

@@ -0,0 +1,792 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - main //
// version 3.998.4 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//on start, send request for submenu names
//on getting submenu name, add to list if not already present
//on menu request, give dialog, with alphabetized list of submenus
//on listen, send submenu link message
string g_sCollarVersion="3.998.4";
integer g_iLatestVersion=TRUE;
list g_lOwners;
key g_kWearer;
//string g_sOldRegionName;
//list g_lMenuPrompts;
list g_lMenuIDs;//3-strided list of avatars given menus, their dialog ids, and the name of the menu they were given
integer g_iMenuStride = 3;
integer g_iScriptCount;//when the scriptcount changes, rebuild menus
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the httpdb
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
//5000 block is reserved for IM slaves
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
string UPMENU = "BACK";
string CTYPE="collar";
string WEARERNAME;
string GIVECARD = "Quick Guide";
string HELPCARD = "OpenCollar Guide";
string CONTACT = "Contact";
string LICENSE="License";
key g_kWebLookup;
key g_kCurrentUser;
list g_lAppearanceButtons;
list g_lAppsButtons;
integer g_iLocked = FALSE;
integer g_bDetached = FALSE;
integer g_iHide ; // global hide
integer g_iNews=FALSE;
string g_sLockPrimName="Lock"; // Description for lock elements to recognize them //EB //SA: to be removed eventually (kept for compatibility)
string g_sOpenLockPrimName="OpenLock"; // Prim description of elements that should be shown when unlocked
string g_sClosedLockPrimName="ClosedLock"; // Prim description of elements that should be shown when locked
list g_lClosedLockElements; //to store the locks prim to hide or show //EB
list g_lOpenLockElements; //to store the locks prim to hide or show //EB
string g_sDefaultLockSound="73f3f84b-0447-487d-8246-4ab3e5fdbf40";
string g_sDefaultUnlockSound="d64c3566-cf76-44b5-ae76-9aabf60efab8";
string g_sLockSound="73f3f84b-0447-487d-8246-4ab3e5fdbf40";
string g_sUnlockSound="d64c3566-cf76-44b5-ae76-9aabf60efab8";
integer g_iAppLock = FALSE; //appearance lock flag
integer g_iAnimsMenu=FALSE;
integer g_iRlvMenu=FALSE;
integer g_iAppearanceMenu=FALSE;
integer g_iCustomizeMenu=FALSE;
integer g_iPaintMenu=FALSE;
integer g_iUpdateChan = -7483214;
integer g_iUpdateHandle;
key g_kUpdaterOrb;
integer g_iUpdateFromMenu;
string version_check_url = "https://raw.githubusercontent.com/lickx/opencollar-os/oscollar3/LSL/~version";
key github_version_request;
string news_url = "https://raw.githubusercontent.com/lickx/opencollar-os/oscollar3/LSL/~news";
key news_request;
string g_sLastNewsTime = "0";
integer g_iUpdateAuth;
integer g_iWillingUpdaters = 0;
integer g_iListenChan=1;
string g_sSafeWord="RED";
string g_sPrefix;
integer g_iWaitUpdate = FALSE;
integer g_iWaitRebuild = FALSE;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Dialog(key kID, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string sName) {
key kMenuID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kID + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kMenuID);
integer iIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iIndex) g_lMenuIDs = llListReplaceList(g_lMenuIDs, [kID, kMenuID, sName], iIndex, iIndex + g_iMenuStride - 1);
else g_lMenuIDs += [kID, kMenuID, sName];
//Debug("Made "+sName+" menu.");
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
string AutoPrefix()
{
list sName = llParseString2List(llKey2Name(llGetOwner()), [" "], []);
return llToLower(llGetSubString(llList2String(sName, 0), 0, 0)) + llToLower(llGetSubString(llList2String(sName, 1), 0, 0));
}
integer compareVersions(string v1, string v2){ //compares two symantic version strings, true if v1 >= v2
integer v1Index=llSubStringIndex(v1,".");
integer v2Index=llSubStringIndex(v2,".");
integer v1a=(integer)llGetSubString(v1,0,v1Index);
integer v2a=(integer)llGetSubString(v2,0,v2Index);
if (v1a == v2a) {
if ((~v1Index) || (~v2Index)){
string v1b;
if (v1Index == -1 || v1Index==llStringLength(v1)) {
v1b="0";
} else {
v1b=llGetSubString(v1,v1Index+1,-1);
}
string v2b;
if (v2Index == -1 || v2Index==llStringLength(v2)) {
v2b="0";
} else {
v2b=llGetSubString(v2,v2Index+1,-1);
}
return compareVersions(v1b,v2b);
} else {
return FALSE;
}
}
return v1a > v2a;
}
AppsMenu(key kID, integer iAuth) {
string sPrompt="\nBrowse apps, extras and custom features.\n\nwww.opencollar.at/apps";
Dialog(kID, sPrompt, g_lAppsButtons, [UPMENU], 0, iAuth, "Apps");
}
AppearanceMenu(key kID, integer iAuth) {
string sPrompt;
string sLooksLockButton;
if (g_iAppLock){
sPrompt = "\nThe appearance of the "+CTYPE+" has been locked.\n\nAn owner must unlock it to allow modification.";
sLooksLockButton="☒ LooksLock";
} else {
sPrompt="\nMake changes to the "+CTYPE+"'s appearance.";
sLooksLockButton="☐ LooksLock";
}
sPrompt += "\n\nwww.opencollar.at/appearance";
Dialog(kID, sPrompt, [sLooksLockButton]+g_lAppearanceButtons, [UPMENU], 0, iAuth, "Appearance");
}
HelpMenu(key kID, integer iAuth) {
string sPrompt="\nOpenCollar Version "+g_sCollarVersion+"\n";
if(!g_iLatestVersion) sPrompt+="Update available!";
sPrompt+="\n\nPrefix: "+g_sPrefix+"\nChannel: "+(string)g_iListenChan+"\nSafeword: "+g_sSafeWord+"\n\nwww.opencollar.at/helpabout";
string sNewsButton="☐ News";
if (g_iNews){
sNewsButton="☒ News";
}
list lStaticButtons=[GIVECARD,CONTACT,LICENSE,sNewsButton,"Update"];
Dialog(kID, sPrompt, lStaticButtons, [UPMENU], 0, iAuth, "Help/About");
}
MainMenu(key kID, integer iAuth) {
string sPrompt="\nOpenCollar Version "+g_sCollarVersion;
if(!g_iLatestVersion) sPrompt+="\nUpdate available!";
sPrompt += "\n\nwww.opencollar.at/main-menu";
//Debug("max memory used: "+(string)llGetSPMaxMemory());
list lStaticButtons;
if (g_iLocked) lStaticButtons+="UNLOCK";
else lStaticButtons+="LOCK";
lStaticButtons+="Apps";
if (g_iAnimsMenu){
lStaticButtons+="Animations";
} else {
lStaticButtons+=" ";
}
if (llGetListLength(g_lAppearanceButtons)>0) {
lStaticButtons+="Appearance";
} else {
lStaticButtons+=" ";
}
lStaticButtons+="Leash";
if (g_iRlvMenu){
lStaticButtons+="RLV";
} else {
lStaticButtons+=" ";
}
lStaticButtons+=["Access","Options","Help/About"];
Dialog(kID, sPrompt, lStaticButtons, [], 0, iAuth, "Main");
}
NotifyOwners(string sMsg) {
integer n;
integer stop = llGetListLength(g_lOwners);
for (n = 0; n < stop; n += 2) {
Notify((key)llList2String(g_lOwners, n), sMsg, FALSE);
}
}
string GetTimestamp() { // Return a string of the date and time
string out;
string DateUTC = llGetDate();
if (llGetGMTclock() < 28800) { // that's 28800 seconds, a.k.a. 8 hours.
list DateList = llParseString2List(DateUTC, ["-", "-"], []);
integer year = llList2Integer(DateList, 0);
integer month = llList2Integer(DateList, 1);
integer day = llList2Integer(DateList, 2);
// day = day - 1; //Remember, remember, the 0th of November!
if(day==1) {
if(month==1) return (string)(year-1) + "-01-31";
else {
--month;
if(month==2) day = 28+(year%4==FALSE); //To do: fix before 28th feb 2100.
else day = 30+ (!~llListFindList([4,6,9,11],[month])); //31 days hath == TRUE
}
}
else --day;
out=(string)year + "-" + (string)month + "-" + (string)day;
} else out=llGetDate();
integer t = (integer)llGetWallclock(); // seconds since midnight
out += " " + (string)(t / 3600) + ":";
integer mins=(t % 3600) / 60;
if (mins <10){
out += "0";
}
out += (string)mins+":";
integer secs=t % 60;
if (secs < 10){
out += "0";
}
out += (string)secs;
return out;
}
BuildLockElementList()//EB
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
list lParams;
// clear list just in case
g_lOpenLockElements = [];
g_lClosedLockElements = [];
//root prim is 1, so start at 2
for (n = 2; n <= iLinkCount; n++)
{
// read description
lParams=llParseString2List((string)llGetObjectDetails(llGetLinkKey(n), [OBJECT_DESC]), ["~"], []);
// check inf name is lock name
if (llList2String(lParams, 0)==g_sLockPrimName || llList2String(lParams, 0)==g_sClosedLockPrimName)
{
// if so store the number of the prim
g_lClosedLockElements += [n];
}
else if (llList2String(lParams, 0)==g_sOpenLockPrimName)
{
// if so store the number of the prim
g_lOpenLockElements += [n];
}
}
}
SetLockElementAlpha() //EB
{
if (g_iHide) return ; // ***** if collar is hide, don't do anything
//loop through stored links, setting alpha if element type is lock
integer n;
//float fAlpha;
//if (g_iLocked) fAlpha = 1.0; else fAlpha = 0.0; //Let's just use g_iLocked!
integer iLinkElements = llGetListLength(g_lOpenLockElements);
for (n = 0; n < iLinkElements; n++)
{
llSetLinkAlpha(llList2Integer(g_lOpenLockElements,n), !g_iLocked, ALL_SIDES);
}
iLinkElements = llGetListLength(g_lClosedLockElements);
for (n = 0; n < iLinkElements; n++)
{
llSetLinkAlpha(llList2Integer(g_lClosedLockElements,n), g_iLocked, ALL_SIDES);
}
}
RebuildMenu()
{
//Debug("Rebuild Menu");
g_iAnimsMenu=FALSE;
g_iRlvMenu=FALSE;
g_iAppearanceMenu=FALSE;
g_lAppsButtons = [] ;
g_lAppearanceButtons = [];
llMessageLinked(LINK_SET, MENUNAME_REQUEST, "Main", "");
llMessageLinked(LINK_SET, MENUNAME_REQUEST, "AddOns", "");
llMessageLinked(LINK_SET, MENUNAME_REQUEST, "Apps", "");
llMessageLinked(LINK_SET, MENUNAME_REQUEST, "Appearance", "");
}
init (){
github_version_request = llHTTPRequest(version_check_url, [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE], "");
g_iWaitRebuild = TRUE;
llSetTimerEvent(1);//delay menu rebuild until other scripts are ready
}
integer UserCommand(integer iNum, string sStr, key kID, integer fromMenu) {
if (iNum == COMMAND_EVERYONE) return TRUE; // No command for people with no privilege in this plugin.
else if (iNum > COMMAND_EVERYONE || iNum < COMMAND_OWNER) return FALSE; // sanity check
//Debug("Got message "+sStr);
list lParams = llParseString2List(sStr, [" "], []);
string sCmd = llToLower(llList2String(lParams, 0));
if (sCmd == "menu") {
string sSubmenu = llToLower(llList2String(lParams, 1));
if (sSubmenu == "main" || sSubmenu == "") MainMenu(kID, iNum);
else if (sSubmenu == "apps" || sSubmenu=="addons") AppsMenu(kID, iNum);
else if (sSubmenu == "help/about") HelpMenu(kID, iNum);
else if (sSubmenu == "appearance") AppearanceMenu(kID, iNum);
} else if (sStr == "license") {
if(llGetInventoryType("OpenCollar License")==INVENTORY_NOTECARD) llGiveInventory(kID,"OpenCollar License");
else Notify(kID,"License notecard missing from collar, sorry.", FALSE);
if (fromMenu) HelpMenu(kID, iNum);
} else if (sStr == "help") {
llGiveInventory(kID, HELPCARD);
if (fromMenu) HelpMenu(kID, iNum);
} else if (sStr =="about" || sStr=="help/about") HelpMenu(kID,iNum);
else if (sStr == "addons" || sStr=="apps") AppsMenu(kID, iNum);
else if (sStr == "appearance") AppearanceMenu(kID, iNum);
else if (sCmd == "menuto") {
key kAv = (key)llList2String(lParams, 1);
if (llGetAgentSize(kAv) != ZERO_VECTOR) //if kAv is an avatar in this region
{
if(llGetOwnerKey(kID)==kAv) MainMenu(kID, iNum); //if the request was sent by something owned by that agent, send a menu
else llMessageLinked(LINK_SET, COMMAND_NOAUTH, "menu", kAv); //else send an auth request for the menu
}
} else if (sCmd == "lock" || (!g_iLocked && sStr == "togglelock")) { //does anything use togglelock? If not, it'd be nice to get rid of it
//Debug("User command:"+sCmd);
if (iNum == COMMAND_OWNER || kID == g_kWearer ) { //primary owners and wearer can lock and unlock. no one else
//inlined old "Lock()" function
g_iLocked = TRUE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "Global_locked=1", "");
llMessageLinked(LINK_SET, RLV_CMD, "detach=n", "main");
llPlaySound(g_sLockSound, 1.0);
SetLockElementAlpha();//EB
Notify(kID,CTYPE + " has been locked.",TRUE);
}
else Notify(kID, "Sorry, only primary owners and wearer can lock the " + CTYPE + ".", FALSE);
if (fromMenu) MainMenu(kID, iNum);
} else if (sStr=="☒ LooksLock" || llToLower(sStr)=="lookslock off") {
if (iNum == COMMAND_OWNER) {
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "Appearance_Lock", "");
llMessageLinked(LINK_SET, iNum, "lockappearance 0", kID);
g_iAppLock=FALSE;
} else Notify(kID,"Only owners can change the looks lock.", FALSE);
if (fromMenu) AppearanceMenu(kID,iNum);
} else if (sStr=="☐ LooksLock" || llToLower(sStr)=="lookslock on") {
if (iNum == COMMAND_OWNER) {
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "Appearance_Lock" + "=1", "");
llMessageLinked(LINK_SET, iNum, "lockappearance 1", kID);
g_iAppLock=TRUE;
} else Notify(kID,"Only owners can change the looks lock.", FALSE);
if (fromMenu) AppearanceMenu(kID,iNum);
} else if (sStr == "runaway" || sCmd == "unlock" || (g_iLocked && sStr == "togglelock")) {
if (iNum == COMMAND_OWNER) { //primary owners can lock and unlock. no one else
//inlined old "Unlock()" function
g_iLocked = FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "Global_locked", "");
llMessageLinked(LINK_SET, RLV_CMD, "detach=y", "main");
llPlaySound(g_sUnlockSound, 1.0);
SetLockElementAlpha(); //EB
Notify(kID,CTYPE + " has been unlocked.",TRUE);
}
else Notify(kID, "Sorry, only primary owners can unlock the " + CTYPE + ".", FALSE);
if (fromMenu) MainMenu(kID, iNum);
} else if (sCmd == "fixmenus") {
if (kID == g_kWearer || iNum==COMMAND_OWNER){
RebuildMenu();
Notify(kID, "Rebuilding menus, this may take several seconds.", FALSE);
} else Notify(kID, "Sorry, only primary owners and wearer can fix menus.", FALSE);
} else if (sCmd == "news"){
if (kID == g_kWearer || iNum==COMMAND_OWNER){
if (sStr=="news off"){
g_iNews=FALSE;
Notify(kID,"News items will no longer be downloaded from the OpenCollar web site.",TRUE); //notify news off
} else if (sStr=="news on"){
g_iNews=TRUE;
Notify(kID,"News items will be downloaded from the OpenCollar web site when they are available.",TRUE); //notify news on
g_sLastNewsTime="0";
news_request = llHTTPRequest(news_url, [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE], "");
} else {
g_sLastNewsTime="0";
news_request = llHTTPRequest(news_url, [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE], "");
}
} else Notify(kID,"Only primary owners and wearer can change news settings.",FALSE);
if (fromMenu) HelpMenu(kID, iNum);
} else if (sCmd == "update") {
// if (llGetOwnerKey(kID) == g_kWearer) {
if (kID == g_kWearer) {
string sVersion = llList2String(llParseString2List(llGetObjectDesc(), ["~"], []), 1);
g_iWillingUpdaters = 0;
g_kCurrentUser = kID;
g_iUpdateAuth = iNum;
Notify(kID,"Searching for nearby updater",FALSE);
g_iUpdateHandle = llListen(g_iUpdateChan, "", "", "");
g_iUpdateFromMenu=fromMenu;
llWhisper(g_iUpdateChan, "UPDATE|" + sVersion);
g_iWaitUpdate = TRUE;
llSetTimerEvent(5.0); //set a timer to wait for responses from updaters
} else {
Notify(kID,"Only the wearer can update the " + CTYPE + ".",FALSE);
if (fromMenu) HelpMenu(kID, iNum);
}
} else if (sCmd == "version") {
Notify(kID, "I am running OpenCollar version " + g_sCollarVersion, FALSE);
} else if (sCmd == "objectversion") { // ping from an object, we answer to it on the object channel
integer iChan = (integer)("0x"+llGetSubString((string)g_kWearer,2,7)) + 1111;
if (iChan>0) iChan=iChan*(-1);
if (iChan > -10000) iChan -= 30000;
llSay(iChan,(string)g_kWearer+"\\version="+g_sCollarVersion);
} else if (sCmd == "attachmentversion") {
// Reply to version request from "garvin style" attachment
integer iInterfaceChannel = (integer)("0x" + llGetSubString(g_kWearer,30,-1));
if (iInterfaceChannel > 0) iInterfaceChannel = -iInterfaceChannel;
llRegionSayTo(g_kWearer, iInterfaceChannel, "version="+g_sCollarVersion);
}
return TRUE;
}
default {
on_rez(integer iParam) {
init();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner(); //updates in change event prompting script restart
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
BuildLockElementList(); //updates in change event, doesn;t need a reset every time
g_iScriptCount = llGetInventoryNumber(INVENTORY_SCRIPT); //updates on change event;
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "Global_locked", ""); //settings will send these on_rez, so no need to ask every rez
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "auth_owner", ""); //settings will send these on_rez, so no need to ask every rez
init(); //do stuf needed on_rez AND on script start
g_sPrefix=AutoPrefix();
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
// SA: delete this after transition is finished
if (iNum == COMMAND_NOAUTH) return;
// /SA
else if (iNum == MENUNAME_RESPONSE) {
//sStr will be in form of "parent|menuname"
//Debug("got menu button "+sStr);
list lParams = llParseString2List(sStr, ["|"], []);
string sName = llList2String(lParams, 0);
string sSubMenu = llList2String(lParams, 1);
if (sName=="AddOns" || sName=="Apps"){ //we only accept buttons for apps nemu
//Debug("we handle " + sName);
if (llListFindList(g_lAppsButtons, [sSubMenu]) == -1) {
g_lAppsButtons += [sSubMenu];
g_lAppsButtons = llListSort(g_lAppsButtons, 1, TRUE);
}
} else if (sName=="Appearance") { //and appearance
if (llListFindList(g_lAppearanceButtons, [sSubMenu]) == -1) {
g_lAppearanceButtons += [sSubMenu];
g_lAppearanceButtons = llListSort(g_lAppearanceButtons, 1, TRUE);
}
} else if (sStr=="Main|Animations"){
g_iAnimsMenu=TRUE;
} else if (sStr=="Main|RLV"){
g_iRlvMenu=TRUE;
// } else if (sStr=="Main|Appearance"){
// g_iAppearanceMenu=TRUE;
} else if (sStr=="Main|Customize"){
g_iCustomizeMenu=TRUE;
} else if (sStr=="Main|Paint"){
g_iPaintMenu=TRUE;
}
} else if (iNum == MENUNAME_REMOVE) {
//sStr should be in form of parentmenu|childmenu
list lParams = llParseString2List(sStr, ["|"], []);
string parent = llList2String(lParams, 0);
string child = llList2String(lParams, 1);
if (parent=="Apps" || parent=="AddOns") {
integer gutiIndex = llListFindList(g_lAppsButtons, [child]);
if (gutiIndex != -1) g_lAppsButtons = llDeleteSubList(g_lAppsButtons, gutiIndex, gutiIndex);
}
if (parent=="Appearance") {
integer gutiIndex = llListFindList(g_lAppsButtons, [child]);
if (gutiIndex != -1) g_lAppearanceButtons = llDeleteSubList(g_lAppearanceButtons, gutiIndex, gutiIndex);
}
} else if (iNum == DIALOG_RESPONSE) {
//Debug("Menu response");
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1) { //got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
//remove stride from g_lMenuIDs. We have to subtract from the index because the dialog id comes in the middle of the stride
string sMenu=llList2String(g_lMenuIDs, iMenuIndex + 1);
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
//process response
if (sMenu=="Main"){
//Debug("Main menu response: '"+sMessage+"'");
if (sMessage == "LOCK" || sMessage== "UNLOCK"){
//Debug("doing usercommand for lock/unlock");
UserCommand(iAuth, sMessage, kAv, TRUE);
} else if (sMessage == "Help/About"){
HelpMenu(kAv, iAuth);
} else if (sMessage == "Apps"){
AppsMenu(kAv, iAuth);
} else if (sMessage == "Appearance"){
AppearanceMenu(kAv, iAuth);
} else {
llMessageLinked(LINK_SET, iAuth, "menu "+sMessage, kAv);
}
} else if (sMenu=="Apps" || sMenu=="Appearance"){
//Debug("Apps menu response:"+sMessage);
if (sMessage == UPMENU) {
MainMenu(kAv, iAuth);
} else if (llSubStringIndex(sMessage,"LooksLock")==2) {
UserCommand(iAuth, sMessage, kAv, TRUE);
} else {
llMessageLinked(LINK_SET, iAuth, "menu "+sMessage, kAv);
}
} else if (sMenu=="Help/About"){
//Debug("Help menu response");
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else if (sMessage == "Settings") {
llMessageLinked(LINK_SET, iAuth, "menu settings", kAv);
} else if (sMessage == GIVECARD) {
UserCommand(iAuth,"help",kAv, TRUE);
} else if (sMessage == LICENSE) {
UserCommand(iAuth,"license",kAv, TRUE);
} else if (sMessage == CONTACT) {
g_kWebLookup = llHTTPRequest("https://raw.githubusercontent.com/lickx/opencollar-os/oscollar3/LSL/~contact", [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE], "");
g_kCurrentUser = kAv;
HelpMenu(kAv, iAuth);
} else if (sMessage=="☐ News") {
//Debug("News on button");
UserCommand(iAuth, "news on", kAv, TRUE);
} else if (sMessage=="☒ News") {
//Debug("News off button");
UserCommand(iAuth, "news off", kAv, TRUE);
} else if (sMessage == "Update") UserCommand(iAuth,"update",kAv,TRUE);
}
}
}
else if (UserCommand(iNum, sStr, kID, FALSE)) return;
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == "Global_locked") {
g_iLocked = (integer)sValue;
SetLockElementAlpha(); //EB
} else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken == "auth_owner")
{
g_lOwners = llParseString2List(sValue, [","], []);
}
else if(sToken =="lock_locksound")
{
if(sValue=="default") g_sLockSound=g_sDefaultLockSound;
else if((key)sValue!=NULL_KEY || llGetInventoryType(sValue)==INVENTORY_SOUND) g_sLockSound=sValue;
}
else if (sToken == "Appearance_Lock") g_iAppLock = (integer)sValue;
else if(sToken =="lock_unlocksound")
{
if(sValue=="default") g_sUnlockSound=g_sDefaultUnlockSound;
else if((key)sValue!=NULL_KEY || llGetInventoryType(sValue)==INVENTORY_SOUND) g_sUnlockSound=sValue;
}
else if (sToken == "listener_channel") g_iListenChan = llList2Integer(llParseString2List(sValue,[","],[]),0);
else if (sToken == "listener_safeword") g_sSafeWord = sValue;
else if (sToken == "Global_prefix") g_sPrefix = sValue;
else if (sToken == "Global_news") g_iNews = (integer)sValue;
else if (sStr == "settings=sent") {
if (g_iNews) news_request = llHTTPRequest(news_url, [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE], "");
} else if (sToken=="Global_WearerName") WEARERNAME=sValue;
}
else if (iNum == DIALOG_TIMEOUT)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
else if (iNum == LM_SETTING_SAVE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == "auth_owner") g_lOwners = llParseString2List(sValue, [","], []);
else if (sToken == "listener_channel") g_iListenChan = llList2Integer(llParseString2List(sValue,[","],[]),0);
else if (sToken == "listener_safeword") g_sSafeWord = sValue;
else if (sToken == "Global_prefix") g_sPrefix = sValue;
}
else if (iNum == RLV_REFRESH || iNum == RLV_CLEAR)
{
if (g_iLocked) llMessageLinked(LINK_SET, RLV_CMD, "detach=n", "main");
else llMessageLinked(LINK_SET, RLV_CMD, "detach=y", "main");
}
}
attach(key kID)
{
if (g_iLocked)
{
if(kID == NULL_KEY)
{
g_bDetached = TRUE;
NotifyOwners(WEARERNAME + " has detached me while locked at " + GetTimestamp() + "!");
}
else if(g_bDetached)
{
NotifyOwners(WEARERNAME + " has re-atached me at " + GetTimestamp() + "!");
g_bDetached = FALSE;
}
}
}
http_response(key id, integer status, list meta, string body){
if (status == 200) { // be silent on failures.
if (id == g_kWebLookup){
Notify(g_kCurrentUser,body,FALSE);
} else if (id == github_version_request) { // strip the newline off the end of the text
if (compareVersions(llStringTrim(body, STRING_TRIM),g_sCollarVersion)) g_iLatestVersion=FALSE;
else g_iLatestVersion=TRUE;
} else if (id == news_request) { // We got a response back from the news page on Github. See if it's new enough to report to the user.
// The first line of a news item should be space delimited list with timestamp in format yyyymmdd.n as the last field, where n is the number of messages on this day
string firstline = llList2String(llParseString2List(body, ["\n"], []), 0);
list firstline_parts = llParseString2List(firstline, [" "], []);
string this_news_time = llList2String(firstline_parts, -1);
if (compareVersions(this_news_time,g_sLastNewsTime)) {
string news = "Newsflash " + body;
llOwnerSay(news);
g_sLastNewsTime = this_news_time;
}
}
}
}
listen(integer channel, string name, key id, string message) {
if (llGetOwnerKey(id) == g_kWearer) { //collar and updater have to have the same Owner else do nothing!
list lTemp = llParseString2List(message, [","],[]);
string sCommand = llList2String(lTemp, 0);
if( message == "get ready") {
g_iWillingUpdaters++;
g_kUpdaterOrb = id;
}
}
}
timer() {
if (g_iWaitUpdate) {
g_iWaitUpdate = FALSE;
llListenRemove(g_iUpdateHandle);
if (!g_iWillingUpdaters) { //if no updaters responded, get upgrader info from web and remenu
g_kWebLookup = llHTTPRequest("https://raw.githubusercontent.com/OpenCollar/OpenCollarUpdater/main/LSL/~update", [HTTP_METHOD, "GET", HTTP_VERBOSE_THROTTLE, FALSE], "");
if (g_iUpdateFromMenu) HelpMenu(g_kCurrentUser,g_iUpdateAuth);
} else if (g_iWillingUpdaters > 1) { //if too many updaters, PANIC!
Notify(g_kCurrentUser,"Multiple updaters were found within 10m. Please remove all but one and try again",FALSE);
} else { //perform update
integer pin = (integer)llFrand(99999998.0) + 1; //set a random pin
llSetRemoteScriptAccessPin(pin);
llRegionSayTo(g_kUpdaterOrb, g_iUpdateChan, "ready|" + (string)pin );
}
}
if (g_iWaitRebuild) {
g_iWaitRebuild = FALSE;
RebuildMenu();
}
if (!g_iWaitUpdate && !g_iWaitRebuild) llSetTimerEvent(0.0);
}
changed(integer iChange)
{
if (iChange & CHANGED_INVENTORY)
{
if (llGetInventoryNumber(INVENTORY_SCRIPT) != g_iScriptCount) { //a script has been added or removed. Reset to rebuild menu
RebuildMenu(); //llResetScript();
}
g_iScriptCount=llGetInventoryNumber(INVENTORY_SCRIPT);
}
if (iChange & CHANGED_OWNER) llResetScript();
if (iChange & CHANGED_COLOR) // *********************
{
integer iNewHide=!(integer)llGetAlpha(ALL_SIDES) ; //check alpha
if (g_iHide != iNewHide){ //check there's a difference to avoid infinite loop
g_iHide = iNewHide;
SetLockElementAlpha(); // update hide elements
}
}
if (iChange & CHANGED_LINK) BuildLockElementList(); // need rebuils lockelements list
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -0,0 +1,507 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - meshlabel //
// version 160727.1 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sParentMenu = "Apps";
string g_sSubMenu = "Label";
key g_kWearer;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
//opencollar MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the httpdb
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer g_iCharLimit = -1;
string UPMENU = "BACK";
string CTYPE = "collar";
string g_sTextMenu = "Set Label";
string g_sFontMenu = "Font";
string g_sColorMenu = "Color";
key g_kDialogID;
key g_kTBoxID;
key g_kFontID;
key g_kColorID;
list g_lColours=[
"Gray Shade",<0.70588, 0.70588, 0.70588>,
"Gold Shade",<0.69020, 0.61569, 0.43529>,
"Baby Pink",<1.00000, 0.52157, 0.76078>,
"Hot Pink",<1.00000, 0.05490, 0.72157>,
"Firefighter",<0.88627, 0.08627, 0.00392>,
"Flame",<0.92941, 0.43529, 0.00000>,
"Matrix",<0.07843, 1.00000, 0.07843>,
"Electricity",<0.00000, 0.46667, 0.92941>,
"Violet Wand",<0.63922, 0.00000, 0.78824>,
"Black",<0.00000, 0.00000, 0.00000>,
"White",<1.00000, 1.00000, 1.00000>
];
string g_sCharmap = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƒƠơƯưǰǺǻǼǽǾǿȘșʼˆˇˉ˘˙˚˛˜˝˳̣̀́̃̉̏΄΅Ά·ΈΉΊΌΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϑϒϖЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ҂҃҄҅҆҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓḀḁḾḿẀẁẂẃẄẅẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹὍ–—―‗‘’‚‛“”„†‡•…‰′″‹›‼⁄ⁿ₣₤₧₫€℅ℓ№™Ω℮⅛⅜⅝⅞∂∆∏∑−√∞∫≈≠≤≥◊fiflffiffl ";
list g_lFonts = [
"Solid", "464e8b47-d578-4e24-a671-de7c2f2b7a24",
"Outlined", "efeb123d-a014-4586-8012-62086272ccaf"
];
key g_kFontTexture = "464e8b47-d578-4e24-a671-de7c2f2b7a24";
integer x = 45;
integer y = 19;
integer faces = 6;
float g_fScrollTime = 0.3 ;
integer g_iSctollPos ;
string g_sScrollText;
list g_lLabelLinks ;
integer g_iScroll = FALSE;
integer g_iShow;
vector g_vColor = <1,1,1>;
string g_sLabelText = "";
string g_sSettingToken = "label_";
//string g_sGlobalToken = "global_";
float Ureps;
float Vreps;
string g_sScript = "label_";
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
integer GetIndex(string sChar) {
integer i;
if (sChar == "") return 854;
else i = llSubStringIndex(g_sCharmap, sChar);
if (i>=0) return i;
else return 854;
}
RenderString(integer iPos, string sChar) { // iPos - позиция символа на лейбле
integer frame = GetIndex(sChar); //номер символа в таблице
integer i = iPos/faces;
integer link = llList2Integer(g_lLabelLinks,i);
integer face = iPos - faces * i;
integer frameY = frame / x;
integer frameX = frame - x * frameY;
float Uoffset = -0.5 + (Ureps/2 + Ureps*(frameX)) ;
float Voffset = 0.5 - (Vreps/2 + Vreps*(frameY)) ;
llSetLinkPrimitiveParamsFast(link, [PRIM_TEXTURE, face, g_kFontTexture, <Ureps, Vreps,0>, <Uoffset, Voffset, 0>, 0]);
}
SetColor() {
integer i=0;
do {
integer iLink = llList2Integer(g_lLabelLinks,i);
float fAlpha = llList2Float(llGetLinkPrimitiveParams( iLink,[PRIM_COLOR,ALL_SIDES]),1);
llSetLinkPrimitiveParamsFast(iLink, [PRIM_COLOR, ALL_SIDES, g_vColor, fAlpha]);
} while (++i < llGetListLength(g_lLabelLinks));
}
// find all 'Label' prims, count and store it's link numbers for fast work SetLabel() and timer
integer LabelsCount() {
integer ok = TRUE ;
g_lLabelLinks = [] ;
string sLabel;
list lTmp;
integer iLink;
integer iLinkCount = llGetNumberOfPrims();
//find all 'Label' prims and count it's
for(iLink=2; iLink <= iLinkCount; iLink++) {
lTmp = llParseString2List(llList2String(llGetLinkPrimitiveParams(iLink,[PRIM_NAME]),0), ["~"],[]);
sLabel = llList2String(lTmp,0);
if(sLabel == "MeshLabel") {
g_lLabelLinks += [0]; // fill list witn nulls
//change prim description
llSetLinkPrimitiveParamsFast(iLink,[PRIM_DESC,"Label~notexture~nocolor~nohide~noshiny"]);
}
}
g_iCharLimit = llGetListLength(g_lLabelLinks) * 6;
//find all 'Label' prims and store it's links to list
for(iLink=2; iLink <= iLinkCount; iLink++) {
lTmp = llParseString2List(llList2String(llGetLinkPrimitiveParams(iLink,[PRIM_NAME]),0), ["~"],[]);
sLabel = llList2String(lTmp,0);
if (sLabel == "MeshLabel") {
integer iLabel = (integer)llList2String(lTmp,1);
integer link = llList2Integer(g_lLabelLinks,iLabel);
if (link == 0)
g_lLabelLinks = llListReplaceList(g_lLabelLinks,[iLink],iLabel,iLabel);
else {
ok = FALSE;
llOwnerSay("Warning! Found duplicated label prims: "+sLabel+" with link numbers: "+(string)link+" and "+(string)iLink);
}
}
}
if (!ok) {
if ((~llSubStringIndex(llGetObjectName(),"Installer")) && (~llSubStringIndex(llGetObjectName(),"Updater")))
return 1;
}
return ok;
}
SetLabel() {
string sText ;
if (g_iShow) sText = g_sLabelText;
string sPadding;
if(g_iScroll==TRUE) {
while(llStringLength(sPadding) < g_iCharLimit) sPadding += " ";
g_sScrollText = sPadding + sText;
llSetTimerEvent(g_fScrollTime);
} else {
g_sScrollText = "";
llSetTimerEvent(0);
//inlined single use CenterJustify function
while(llStringLength(sPadding + sText + sPadding) < g_iCharLimit) sPadding += " ";
sText = sPadding + sText;
integer iCharPosition;
for(iCharPosition=0; iCharPosition < g_iCharLimit; iCharPosition++)
RenderString(iCharPosition, llGetSubString(sText, iCharPosition, iCharPosition));
}
//Debug("Label Set");
}
MainMenu(key kID, integer iAuth)
{
list lButtons= [g_sTextMenu, g_sColorMenu, g_sFontMenu];
if (g_iShow) lButtons += ["☒ Show"];
else lButtons += ["☐ Show"];
if (g_iScroll) lButtons += ["☒ Scroll"];
else lButtons += ["☐ Scroll"];
string sPrompt = "\nCustomize the " + CTYPE + "'s label!\n\nwww.opencollar.at/label";
g_kDialogID=Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
TextMenu(key kID, integer iAuth)
{
string sPrompt="\n- Submit the new label in the field below.\n- Submit a few spaces to clear the label.\n- Submit a blank field to go back to " + g_sSubMenu + ".\n\nwww.opencollar.at/label";
g_kTBoxID = Dialog(kID, sPrompt, [], [], 0, iAuth);
}
ColorMenu(key kID, integer iAuth)
{
string sPrompt = "\n\nSelect a colour from the list";
list lColourNames;
integer numColours=llGetListLength(g_lColours)/2;
while (numColours--)
{
lColourNames+=llList2String(g_lColours,numColours*2);
}
g_kColorID=Dialog(kID, sPrompt, lColourNames, [UPMENU], 0, iAuth);
}
FontMenu(key kID, integer iAuth)
{
list lButtons=llList2ListStrided(g_lFonts,0,-1,2);
string sPrompt = "\nSelect the font for the " + CTYPE + "'s label.\n\nNOTE: This feature requires a design with label prims. If the worn design doesn't have any of those, it is recommended to uninstall Label with the updater.\n\nwww.opencollar.at/label";
g_kFontID=Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
integer UserCommand(integer iAuth, string sStr, key kAv)
{
if (iAuth > COMMAND_WEARER || iAuth < COMMAND_OWNER) return FALSE; // sanity check
if (iAuth == COMMAND_OWNER || !g_iAppLock)
{
if (sStr == "menu " + g_sSubMenu || llToLower(sStr)=="label")
{
MainMenu(kAv, iAuth);
return TRUE;
}
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
if (sCommand == "lockappearance" && iAuth == COMMAND_OWNER) {
if (llToLower(llList2String(lParams, 1)) == "0") g_iAppLock = FALSE;
else g_iAppLock = TRUE;
} else if (sCommand == "labeltext") {
g_sLabelText = llStringTrim(llDumpList2String(llDeleteSubList(lParams,0,0)," "),STRING_TRIM);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "text=" + g_sLabelText, "");
if (llStringLength(g_sLabelText) > g_iCharLimit) {
string sDisplayText = llGetSubString(g_sLabelText, 0, g_iCharLimit-1);
Notify(kAv,"Unless you set your label to scroll it will be truncated at "+sDisplayText+".", FALSE);
}
SetLabel();
} else if (sCommand == "labelfont") {
lParams = llDeleteSubList(lParams, 0, 0);
string font = llDumpList2String(lParams, " ");
integer iIndex = llListFindList(g_lFonts, [font]);
if (iIndex != -1)
{
g_kFontTexture = (key)llList2String(g_lFonts, iIndex + 1);
SetLabel();
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "font=" + (string)g_kFontTexture, "");
}
else FontMenu(kAv, iAuth);
} else if (sCommand == "labelcolor") {
string sColour= llDumpList2String(llDeleteSubList(lParams,0,0)," ");
integer colourIndex=llListFindList(g_lColours,[sColour]);
if (~colourIndex)
{
g_vColor=(vector)llList2String(g_lColours,colourIndex+1);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"color="+(string)g_vColor, "");
SetColor();
}
} else if (sCommand == "labelshow") {
g_iShow = llList2Integer(lParams, 1);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"show="+(string)g_iShow, "");
SetLabel();
} else if (sCommand == "labelscroll") {
g_iScroll = llList2Integer(lParams, 1);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"scroll="+(string)g_iScroll, "");
SetLabel();
}
}
else if ((iAuth >= COMMAND_SECOWNER && iAuth <= COMMAND_WEARER) && g_iAppLock)
{
string sCommand = llToLower(llList2String(llParseString2List(sStr, [" "], []), 0));
if (sStr=="menu "+g_sSubMenu)
{
llMessageLinked(LINK_SET, iAuth, "menu "+g_sParentMenu, kAv);
Notify(kAv,"Only owners can change the label!", FALSE);
}
else if (sCommand=="labeltext" || sCommand == "labelfont" || sCommand == "labelcolor" || sCommand == "labelshow")
{
Notify(kAv,"Only owners can change the label!", FALSE);
}
}
return TRUE;
}
default
{
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "meshlabel_";
g_kWearer = llGetOwner();
Ureps = (float)1 / x;
Vreps = (float)1 / y;
LabelsCount();
if (g_iCharLimit <= 0) {
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu + "|" + g_sSubMenu, "");
llRemoveInventory(llGetScriptName());
}
// g_sLabelText = llList2String(llParseString2List(llKey2Name(llGetOwner()), [" "], []), 0);
//SetLabel();
//Debug("Starting");
}
on_rez(integer iNum) {
if (g_kWearer != llGetOwner()) {
g_sLabelText = "";
SetLabel();
}
llResetScript();
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if ( UserCommand(iNum, sStr, kID) ) {}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "text") g_sLabelText = sValue;
else if (sToken == "font") g_kFontTexture = (key)sValue;
else if (sToken == "color") g_vColor = (vector)sValue;
else if (sToken == "show") g_iShow = (integer)sValue;
else if (sToken == "scroll") g_iScroll = (integer)sValue;
}
else if (sToken == g_sAppLockToken) g_iAppLock = (integer)sValue;
else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken == "settings" && sValue == "sent") {
SetColor();
SetLabel();
}
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == DIALOG_RESPONSE)
{
if (kID==g_kDialogID)
{
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU) llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
else if (sMessage == g_sTextMenu) TextMenu(kAv, iAuth);
else if (sMessage == g_sColorMenu) ColorMenu(kAv, iAuth);
else if (sMessage == g_sFontMenu) FontMenu(kAv, iAuth);
else if (sMessage == "☐ Show")
{
UserCommand(iAuth, "labelshow 1", kAv);
MainMenu(kAv, iAuth);
}
else if (sMessage == "☒ Show")
{
UserCommand(iAuth, "labelshow 0", kAv);
MainMenu(kAv, iAuth);
}
else if (sMessage == "☐ Scroll")
{
UserCommand(iAuth, "labelscroll 1", kAv);
MainMenu(kAv, iAuth);
}
else if (sMessage == "☒ Scroll")
{
UserCommand(iAuth, "labelscroll 0", kAv);
MainMenu(kAv, iAuth);
}
}
else if (kID == g_kColorID)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else
{
UserCommand(iAuth, "labelcolor "+sMessage, kAv);
ColorMenu(kAv, iAuth);
}
}
else if (kID == g_kFontID)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else
{
UserCommand(iAuth, "labelfont " + sMessage, kAv);
FontMenu(kAv, iAuth);
}
}
else if (kID == g_kTBoxID) // TextBox response, extract values
{
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage != "") UserCommand(iAuth, "labeltext " + sMessage, kAv);
llMessageLinked(LINK_ROOT, iAuth, "menu " + g_sSubMenu, kAv);
}
}
}
timer()
{
string sText = llGetSubString(g_sScrollText, g_iSctollPos, -1);
integer iCharPosition;
for(iCharPosition=0; iCharPosition < g_iCharLimit; iCharPosition++)
{
RenderString(iCharPosition, llGetSubString(sText, iCharPosition, iCharPosition));
}
g_iSctollPos++;
if(g_iSctollPos > llStringLength(g_sScrollText)) g_iSctollPos = 0 ;
}
changed(integer change) {
if(change & CHANGED_LINK) // if links changed
{
if (LabelsCount()==TRUE) SetLabel();
}
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -0,0 +1,420 @@
// Template for creating a OpenCollar Plugin
// API Version: 3.9
// Licensed under the GPLv2, with the additional requirement that these scripts
// remain "full perms" in Second Life. See "OpenCollar License" for details.
// Please agressively remove any unneeded code sections to save memory and sim time
string SUBMENU_BUTTON = "Plugin"; // Name of the submenu
string COLLAR_PARENT_MENU = "Apps"; // name of the menu, where want to plug it in
string PLUGIN_CHAT_COMMAND = "plugin"; // every menu should have a chat command, so the user can easily access it by type for instance *plugin
integer IN_DEBUG_MODE = FALSE; // set to TRUE to enable Debug messages
key g_kMenuID; // menu handler
key g_kWearer; // key of the current wearer to reset only on owner changes
string g_sScript; // part of script name used for settings
string CTYPE = "collar"; // designer can set in notecard to appropriate word for their item
// any local, not changing buttons which will be used in this plugin, leave empty or add buttons as you like:
list PLUGIN_BUTTONS = ["Command 1", "Command 2", "AuthCommand"];
list g_lButtons;
// OpenCollar MESSAGE MAP
// messages for authenticating users
// integer COMMAND_NOAUTH = 0; // for reference, but should usually not be in use inside plugins
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
integer COMMAND_RELAY_SAFEWORD = 511;
integer COMMAND_BLACKLIST = 520;
// added for timer so when the sub is locked out they can use postions
integer COMMAND_WEARERLOCKEDOUT = 521;
integer ATTACHMENT_REQUEST = 600;
integer ATTACHMENT_RESPONSE = 601;
integer ATTACHMENT_FORWARD = 610;
integer WEARERLOCKOUT = 620; // turns on and off wearer lockout
// integer SEND_IM = 1000; deprecated. each script should send its own IMs now.
// This is to reduce even the tiny bit of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
// messages for storing and retrieving values from settings store
integer LM_SETTING_SAVE = 2000; // scripts send messages on this channel to have settings saved to settings store
// str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001; // when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002; // the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003; // delete token from settings store
integer LM_SETTING_EMPTY = 2004; // sent by settings script when a token has no value in the settings store
integer LM_SETTING_REQUEST_NOCACHE = 2005;
// messages for creating OC menu structure
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
// messages for RLV commands
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001; // RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002; // RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; // RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer RLV_QUERY = 6102; //query from a script asking if RLV is currently functioning
integer RLV_RESPONSE = 6103; //reply to RLV_QUERY, with "ON" or "OFF" as the message
// messages for poses and couple anims
integer ANIM_START = 7000; // send this with the name of an anim in the string part of the message to play the anim
integer ANIM_STOP = 7001; // send this with the name of an anim in the string part of the message to stop the anim
integer CPLANIM_PERMREQUEST = 7002; // id should be av's key, str should be cmd name "hug", "kiss", etc
integer CPLANIM_PERMRESPONSE = 7003; // str should be "1" for got perms or "0" for not. id should be av's key
integer CPLANIM_START = 7004; // str should be valid anim name. id should be av
integer CPLANIM_STOP = 7005; // str should be valid anim name. id should be av
// messages to the dialog helper
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer FIND_AGENT = -9005; // to look for agent(s) in region with a (optional) search string
key REQUEST_KEY;
integer TIMER_EVENT = -10000; // str = "start" or "end". For start, either "online" or "realtime".
integer UPDATE = 10001; // for child prim scripts (currently none in 3.8, thanks to LSL new functions)
// For other things that want to manage showing/hiding keys.
integer KEY_VISIBLE = -10100;
integer KEY_INVISIBLE = -10100;
integer COMMAND_PARTICLE = 20000;
integer COMMAND_LEASH_SENSOR = 20001;
//chain systems
integer LOCKMEISTER = -8888;
integer LOCKGUARD = -9119;
//rlv relay chan
integer RLV_RELAY_CHANNEL = -1812221819;
// menu option to go one step back in menustructure
string UPMENU = "^"; // when your menu hears this, give the parent menu
//===============================================================================
//= parameters : string sMsg message string received
//=
//= return : none
//=
//= description : output debug messages
//=
//===============================================================================
Debug(string sMsg) {
if (!IN_DEBUG_MODE) {
return;
}
llOwnerSay(llGetScriptName() + " [DEBUG]: " + sMsg);
}
//===============================================================================
//= parameters : key kID key of the avatar that receives the message
//= string sMsg message to send
//= integer iAlsoNotifyWearer if TRUE, a copy of the message is sent to the wearer
//=
//= return : none
//=
//= description : notify targeted id and maybe the wearer
//=
//===============================================================================
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
//===============================================================================
//= parameters : key kRCPT recipient of the dialog
//= string sPrompt dialog prompt
//= list lChoices true dialog buttons
//= list lUtilityButtons utility buttons (kept on every iPage)
//= integer iPage Page to be display
//=
//= return : key handler of the dialog
//=
//= description : displays a dialog to the given recipient
//=
//===============================================================================
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
return kID;
}
//===============================================================================
//= parameters : string keyID key of person requesting the menu
//=
//= return : none
//=
//= description : build menu and display to user
//=
//===============================================================================
DoMenu(key keyID, integer iAuth) {
string sPrompt = "Pick an option.\n";
list lMyButtons = PLUGIN_BUTTONS + g_lButtons;
//fill in your button list and additional prompt here
lMyButtons = llListSort(lMyButtons, 1, TRUE); // resort menu buttons alphabetical
// and dispay the menu
g_kMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
}
//===============================================================================
//= parameters : auth: integer (avatar auth level)
//= type: string; user-defined label; what to do with result
//= name: search string (optional) full or partial name to seek
//= user: key; Requesting Agent (menu user / chat commander)
//=
//= return : none
//=
//= description : request agent key, searching in region, with name as criteria
//=
//===============================================================================
FetchAvi(integer auth, string type, string name, key user)
{
if (name == "") name = " "; // getavi requires a value here - blank will search with no string
string out = llDumpList2String(["getavi_", g_sScript, user, auth, type, name], "|");
// sometimes, you want to exclude possible finds, such as if they exist in a list you are adding to
// do not search for these names (can be partial string)
list exclude = ["source list"];
if (llGetListLength(exclude))
out += "|" + llDumpList2String(exclude, ",");
llMessageLinked(LINK_THIS, FIND_AGENT, out, REQUEST_KEY = llGenerateKey());
}
//===============================================================================
//= parameters : iNum: integer parameter of link message (avatar auth level)
//= sStr: string parameter of link message (command name)
//= kID: key parameter of link message (user key, usually)
//=
//= return : TRUE if the command was handled, FALSE otherwise
//=
//= description : handles user chat commands (also used as backend for menus)
//=
//===============================================================================
integer UserCommand(integer iNum, string sStr, key kID) {
if (!(iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)) {
return FALSE;
}
// a validated command from a owner, secowner, groupmember or the wearer has been received
// can also be used to listen to chat commands
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
string sValue = llToLower(llList2String(lParams, 1));
// So commands can accept a value
if (sStr == "reset") {
// it is a request for a reset
if (iNum == COMMAND_WEARER || iNum == COMMAND_OWNER) {
//only owner and wearer may reset
llResetScript();
}
}
else if (sStr == PLUGIN_CHAT_COMMAND || sStr == "menu " + SUBMENU_BUTTON) {
// an authorized user requested the plugin menu by typing the menus chat command
DoMenu(kID, iNum);
}
else if (sStr == "yourcommandhere") {
// example for a command which can be invoked by chat and/or menu, replace yourcommandhere by what you need
Debug("Do some fancy stuff to impress the user");
// maybe save a value to the setting store:
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + "token=value", "");
// or delete a toke from the setting store:
llMessageLinked(LINK_THIS, LM_SETTING_DELETE, g_sScript + "token", "");
}
return TRUE;
}
default {
state_entry()
{
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
// store key of wearer
g_kWearer = llGetOwner();
// sleep a second to allow all scripts to be initialized
llSleep(1);
// send request to main menu and ask other menus if they want to register with us
//llMessageLinked(LINK_THIS, MENUNAME_REQUEST, SUBMENU_BUTTON, "");
//llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
}
// Reset the script if wearer changes. By only reseting on owner change we can keep most of our
// configuration in the script itself as global variables, so that we don't loose anything in case
// the settings store isn't available, and also keep settings that were not sent to that store
// in the first place.
// Cleo: As per Nan this should be a reset on every rez, this has to be handled as needed, but be prepared that the user can reset your script anytime using the OC menus
on_rez(integer iParam) {
if (llGetOwner()!=g_kWearer) {
// Reset if wearer changed
llResetScript();
}
}
// listen for linked messages from OC scripts
link_message(integer iSender, integer iNum, string sStr, key kID) {
if (iNum == MENUNAME_REQUEST && sStr == COLLAR_PARENT_MENU) {
// our parent menu requested to receive buttons, so send ours
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
g_lButtons = [] ;
llMessageLinked(LINK_THIS, MENUNAME_REQUEST, SUBMENU_BUTTON, "");
}
else if (iNum == MENUNAME_RESPONSE) {
// a button is send to be added to a menu
list lParts = llParseString2List(sStr, ["|"], []);
if (llList2String(lParts, 0) == SUBMENU_BUTTON) {
// someone wants to stick something in our menu
string button = llList2String(lParts, 1);
if (llListFindList(g_lButtons, [button]) == -1) {
// if the button isnt in our menu yet, than we add it
g_lButtons = llListSort(g_lButtons + [button], 1, TRUE);
}
}
}
else if (iNum == LM_SETTING_RESPONSE)
{
// response from setting store have been received
// pares the answer
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
// and check if any values for use are received
// replace "value1" by your own token
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "value1" )
{
// work with the received values
}
// replace "value2" by your own token, but if possible try to store everything in one token
// to reduce the load on the setting store (especially if it is implemented as a webservice... )
else if (sToken == "value2")
{
// work with the received values
}
}
// or check for specific values from the collar like "auth_owner" (for owners) "auth_secowners" (for secondary owners) etc
else if (sToken == "auth_owner")
{
// work with the received values, in this case pare the vlaue into a strided list with the owners
list lOwners = llParseString2List(sValue, [","], []);
}
else if (sToken == "Global_CType") CTYPE = sValue;
}
else if (UserCommand(iNum, sStr, kID)) {
// do nothing more if TRUE
}
else if (iNum == COMMAND_EVERYONE) {
// you might want to react on unauthorized users or such, see message map on the top of the script, please remove if not needed
Debug("Go away and get your own sub, you have no right on this " + CTYPE + "");
}
else if (iNum == COMMAND_SAFEWORD) {
// Safeword has been received, release any restricitions that should be released
Debug("Safeword received, releasing the subs restricions as needed");
}
else if (iNum == DIALOG_RESPONSE) {
// answer from menu system
// careful, don't use the variable kID to identify the user, it is the UUID we generated when calling the dialog
// you have to parse the answer from the dialog system and use the parsed variable kAv
if (kID == g_kMenuID) {
//got a menu response meant for us, extract the values
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
// request to switch to parent menu
if (sMessage == UPMENU) {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu "+COLLAR_PARENT_MENU, kAv);
}
else if (~llListFindList(PLUGIN_BUTTONS, [sMessage])) {
//we got a response for something we handle locally
if (sMessage == "Command 1") {
// do What has to be Done
Debug("Command 1");
// and restart the menu if wanted/needed
DoMenu(kAv, iAuth);
}
else if (sMessage == "Command 2") {
// do What has to be Done
Debug("Command 2");
// and restart the menu if wanted/needed
DoMenu(kAv, iAuth);
}
else if (sMessage == "AuthCommand") {
// we assume the action assoctiated to the button also
// has a chat command trigger, which we call here,
// thus finally handling menu and chat the same way
UserCommand(iAuth, "yourcommandhere", kAv);
// then we show the menu again
DoMenu(kAv, iAuth);
}
}
else if (~llListFindList(g_lButtons, [sMessage])) {
//we got a button which another plugin put into into our menu
llMessageLinked(LINK_THIS, iAuth, "menu "+ sMessage, kAv);
}
}
}
else if (iNum == DIALOG_TIMEOUT) {
// timeout from menu system, you do not have to react on this, but you can
if (kID == g_kMenuID) {
// if you react, make sure the timeout is from your menu by checking the g_kMenuID variable
Debug("The user was to slow or lazy, we got a timeout!");
}
}
else if (iNum == FIND_AGENT)
{
if (kID != REQUEST_KEY) return; // if we didn't request it, we won't know what to do with it
list params = llParseString2List(sStr, ["|"], []);
if (llList2String(params, 0) != g_sScript) return; // not sent to us
key kUser = (key)llList2String(params, 2); // requesting user key, for Notify or more menus
integer iAuth = (integer)llList2String(params, 3); // auth level of user
string sType = llList2String(params, 4); // we sent this string as an identifier for what to do with the result
key kNew = (key)llList2String(params, 5); // this is the key for whatever agent we picked by name
if (sType == "our type identifier")
{ // examples
// g_lMyList += [kNew];
// Notify(kUser, "I think " + llKey2Name(kNew) + " likes you", FALSE);
}
}
}
}

View File

@@ -0,0 +1,23 @@
// OpenCollar - remote template
// Licensed under the GPLv2, with the additional requirement that these scripts remain "full perms" in Second Life. See "OpenCollar License" for details.
key kToucher;
Debug(string in)
{
//llOwnerSay(llGetScriptName() + ": " + in);
}
integer GetOwnerChannel(key kOwner, integer iOffset)
{
integer iChan = (integer)("0x"+llGetSubString((string)kOwner,2,7)) + iOffset;
if (iChan>0)
{
iChan=iChan*(-1);
}
if (iChan > -10000)
{
iChan -= 30000;
}
return iChan;
}

1021
LSL/OpenCollar - rlvex.lsl Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,924 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - rlvfolders //
// version 3.989.1 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sParentMenu = "Un/Dress";
list g_lChildren = ["Browse #RLV", "#RLV History"];
//MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//sStr must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
//integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; //RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLVA_VERSION = 6004; //RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
string PARENT = "⏎";
string ACTIONS_CURRENT = "Actions";
string ROOT_ACTIONS = "Global Actions";
string UPMENU = "BACK";
//string MORE = ">";
// Folder actions
//string ALL = "*All*";
//string SELECT_CURRENT = "*This*";
string REPLACE_ALL = "Replace all";
string ADD_ALL = "Add all";
string DETACH_ALL = "Detach all";
string REPLACE = "Replace this";
string ADD = "Add this";
string DETACH = "Detach this";
string LOCK_ATTACH_ALL = "Lock att. all";
string LOCK_DETACH_ALL = "Lock det. all";
string LOCK_ATTACH = "Lock att. this";
string LOCK_DETACH = "Lock det. this";
integer g_iUnsharedLocks = 0; // 2 bits bitfield: first (strong) one for unsharedwear, second (weak) one for unsharedunwear
list g_lFolderLocks; // strided list: folder path, lock type (4 bits field)
integer g_iTimeOut = 60;
integer g_iFolderRLV = 78467;
integer g_iRLVaOn = FALSE; //Assume we don't have RLVa, until we hear that we do
key g_kBrowseID;
key g_kActionsID;
key g_kRootActionsID;
key g_kHistoryMenuID;
key g_kMultipleFoldersOnSearchMenuID;
integer g_iPage = 0;//Having a global is nice, if you redisplay the menu after an action on a folder.
integer g_iListener;//Nan:do we still need this? -- SA: of course. It's where the viewer talks.
// Asynchronous menu request. Alas still needed since some menus are triggered after an answer from the viewer.
key g_kAsyncMenuUser;
integer g_iAsyncMenuAuth;
integer g_iAsyncMenuRequested = FALSE;
string sPrompt;//Nan: why is this global?
string g_sFolderType; //what to do with those folders
string g_sCurrentFolder;
list g_lOutfit; //saved folder list
list g_lToCheck; //stack of folders to check, used for subfolder tree search
list g_lSearchList; //list of folders to search
integer g_iLastFolderState;
key g_kWearer;
string g_sScript;
list g_lHistory;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
addToHistory(string folder)
{
if (!(~llListFindList(g_lHistory, [folder]))) g_lHistory+=[folder];
g_lHistory = llList2List(g_lHistory, -10, -1);
}
ParentFolder() {
list lFolders = llParseString2List(g_sCurrentFolder,["/"],[]);
g_iPage = 0; // changing the folder also means going back to first page
if (llGetListLength(lFolders)>1) {
g_sCurrentFolder=llList2String(lFolders,0);
integer i;
for (i=1;i<llGetListLength(lFolders)-1;i++) g_sCurrentFolder+="/"+llList2String(lFolders,i);
}
else g_sCurrentFolder="";
}
QueryFolders(string sType)
{
g_sFolderType = sType;
g_iFolderRLV = 9999 + llRound(llFrand(9999999.0));
g_iListener = llListen(g_iFolderRLV, "", llGetOwner(), "");
llSetTimerEvent(g_iTimeOut);
llMessageLinked(LINK_SET, RLV_CMD, "getinvworn:"+g_sCurrentFolder+"=" + (string)g_iFolderRLV, NULL_KEY);
}
string lockFolderButton(integer iLockState, integer iLockNum, integer iAuth)
{
string sOut;
if ((iLockState >> (4 + iLockNum)) & 0x1) sOut = "☔";
else if ((iLockState >> iLockNum) & 0x1) sOut = "✔";
else sOut = "✘";
if (iLockNum == 0) sOut += LOCK_ATTACH;
else if (iLockNum == 1) sOut += LOCK_DETACH;
else if (iLockNum == 2) sOut += LOCK_ATTACH_ALL;
else if (iLockNum == 3) sOut += LOCK_DETACH_ALL;
if (iAuth > COMMAND_GROUP) sOut = "("+sOut+")";
return sOut;
}
string lockUnsharedButton(integer iLockNum, integer iAuth)
{
string sOut;
if ((g_iUnsharedLocks >> iLockNum) & 0x1) sOut = "✔";
else sOut = "✘";
if (iLockNum == 1) sOut += "Lk Unsh Wear";
else if (iLockNum == 0) sOut += "Lk Unsh Remove";
if (iAuth > COMMAND_GROUP) sOut = "("+sOut+")";
return sOut;
}
HistoryMenu(key kAv, integer iAuth)
{
g_kHistoryMenuID = Dialog(kAv, "\nRecently worn #RLV folders:", g_lHistory, [UPMENU], 0, iAuth);
}
RootActionsMenu(key kAv, integer iAuth)
{
list lActions = [lockUnsharedButton(0, iAuth), lockUnsharedButton(1, iAuth), "Save", "Restore"];
string sPrompt = "\nwww.opencollar.at/folders\n\nYou are at the #RLV shared root.\n\nFrom here, you can restrict wearing or removing not shared items, you can also save the list of worn shared folders or make the currently saved list be worn again.\n\nWhat do you want to do?";
g_kRootActionsID = Dialog(kAv, sPrompt, lActions, [UPMENU], 0, iAuth);
}
FolderActionsMenu(integer iState, key kAv, integer iAuth)
{
integer iStateThis = iState / 10;
integer iStateSub = iState % 10;
list lActions;
if (g_sFolderType == "history") lActions += "Browse";
g_sFolderType += "_actions";
if (!iStateSub) g_sFolderType += "_sub";
if (g_sCurrentFolder != "")
{
integer iIndex = llListFindList(g_lFolderLocks, [g_sCurrentFolder]);
integer iLock;
if (~iIndex)
{
iLock = llList2Integer(g_lFolderLocks, iIndex+1);
}
if ( iStateThis == 1 || iStateThis == 2) // there are items that can be added in current folder
lActions += [REPLACE, ADD, lockFolderButton(iLock, 0, iAuth)];
if ( iStateThis == 2 || iStateThis == 3) // there are items that can be removed
lActions += [DETACH, lockFolderButton(iLock, 1, iAuth)];
if ( iStateSub == 1 || iStateSub == 2) // there are items that can be added in descendant folder
lActions += [REPLACE_ALL, ADD_ALL, lockFolderButton(iLock, 2, iAuth)];
if ( iStateSub == 2 || iStateSub == 3) // there are items that can be removed from descendant folders
lActions += [DETACH_ALL, lockFolderButton(iLock, 3, iAuth)];
}
string sPrompt = "\nwww.opencollar.at/folders\n\nCurrent folder is ";
if (g_sCurrentFolder == "") sPrompt += "root";
else sPrompt += g_sCurrentFolder;
sPrompt += ".\n";
sPrompt += "\nWhat do you want to do?";
g_kActionsID = Dialog(kAv, sPrompt, lActions, [UPMENU], 0, iAuth);
}
string folderIcon(integer iState)
{
string sOut = "";
integer iStateThis = iState / 10;
integer iStateSub = iState % 10;
if (iStateThis==0) sOut += "⬚"; //▪";
else if (iStateThis==1) sOut += "◻";
else if (iStateThis==2) sOut += "◩";
else if (iStateThis==3) sOut += "◼";
else sOut += " ";
// sOut += "/";
if (iStateSub==0) sOut += "⬚"; //▪";
else if (iStateSub==1) sOut += "◻";
else if (iStateSub==2) sOut += "◩";
else if (iStateSub==3) sOut += "◼";
else sOut += " ";
return sOut;
}
integer StateFromButton(string sButton)
{
string sIconThis = llGetSubString(sButton, 0, 0);
string sIconSub = llGetSubString(sButton, 1, 1);
integer iState;
if (sIconThis=="◻") iState = 1;
else if (sIconThis=="◩") iState = 2;
else if (sIconThis=="◼") iState = 3;
iState *= 10;
if (sIconSub=="◻") iState +=1;
else if (sIconSub=="◩") iState +=2;
else if (sIconSub=="◼") iState += 3;
return iState;
}
string FolderFromButton(string sButton)
{
return llToLower(llGetSubString(sButton, 2, -1));
}
updateFolderLocks(string sFolder, integer iAdd, integer iRem)
{ // adds and removes locks for sFolder, which implies saving to central settings and triggering a RLV command (dolockFolder)
integer iLock;
integer iIndex = llListFindList(g_lFolderLocks, [sFolder]);
if (~iIndex)
{
iLock = ((llList2Integer(g_lFolderLocks, iIndex+1) | iAdd) & ~iRem);
if (iLock)
{
g_lFolderLocks = llListReplaceList(g_lFolderLocks, [iLock], iIndex+1, iIndex+1);
doLockFolder(iIndex);
}
else
{
g_lFolderLocks = llDeleteSubList(g_lFolderLocks, iIndex, iIndex+1);
llMessageLinked(LINK_SET, RLV_CMD, "attachthis_except:"+sFolder+"=y,detachthis_except:"+sFolder+"=y,attachallthis_except:"+sFolder+"=y,detachallthis_except:"+sFolder+"=y,"+ "attachthis:"+sFolder+"=y,detachthis:"+sFolder+"=y,attachallthis:"+sFolder+"=y,detachallthis:"+sFolder+"=y", NULL_KEY);
}
}
else
{
iLock = iAdd & ~iRem;
g_lFolderLocks += [sFolder, iLock];
iIndex = llGetListLength(g_lFolderLocks)-2;
doLockFolder(iIndex);
}
if ([] != g_lFolderLocks) llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "Locks=" + llDumpList2String(g_lFolderLocks, ","), "");
else llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "Locks", "");
}
doLockFolder(integer iIndex)
{ // sends command to the viewer to update all locks concerning folder #iIndex
string sFolder = llList2String(g_lFolderLocks, iIndex);
integer iLock = llList2Integer(g_lFolderLocks, iIndex + 1);
string sRlvCom = "attachthis:"+sFolder+"=";
if ((iLock >> 0) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",detachthis:"+sFolder+"=";
if ((iLock >> 1) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",attachallthis:"+sFolder+"=";
if ((iLock >> 2) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",detachallthis:"+sFolder+"=";
if ((iLock >> 3) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",attachthis_except:"+sFolder+"=";
if ((iLock >> 4) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",detachthis_except:"+sFolder+"=";
if ((iLock >> 5) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",attachallthis_except:"+sFolder+"=";
if ((iLock >> 6) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",detachallthis_except:"+sFolder+"=";
if ((iLock >> 7) & 1) sRlvCom += "n"; else sRlvCom += "y";
// llOwnerSay(sRlvCom);
llMessageLinked(LINK_SET, RLV_CMD, sRlvCom, NULL_KEY);
}
updateUnsharedLocks(integer iAdd, integer iRem)
{ // adds and removes locks for unshared items, which implies saving to central settings and triggering a RLV command (dolockUnshared)
g_iUnsharedLocks = ((g_iUnsharedLocks | iAdd) & ~iRem);
doLockUnshared();
if (g_iUnsharedLocks) llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "Unshared=" + (string) g_iUnsharedLocks, "");
else llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "Unshared", "");
}
doLockUnshared()
{ // sends command to the viewer to update all locks concerning unshared items
string sRlvCom = "unsharedunwear=";
if ((g_iUnsharedLocks >> 0) & 1) sRlvCom += "n"; else sRlvCom += "y";
sRlvCom += ",unsharedwear=";
if ((g_iUnsharedLocks >> 1) & 1) sRlvCom += "n"; else sRlvCom += "y";
llMessageLinked(LINK_SET, RLV_CMD, sRlvCom, NULL_KEY);
}
// Browsing menu, called asynchronously only (after querying folder state). Queries user and auth from globals.
FolderBrowseMenu(string sStr)
{
g_iAsyncMenuRequested = FALSE;
list lUtilityButtons = [UPMENU];
string sPrompt = "\nwww.opencollar.at/folders\n\nCurrent folder is ";
if (g_sCurrentFolder == "")
{
sPrompt += "root";
}
else sPrompt += g_sCurrentFolder;
sPrompt += ".\n";
list sData = llParseStringKeepNulls(sStr, [","], []);
string sFirst = llList2String(sData, 0);
sData = llListSort(llList2List(sData, 1, -1), 1, 1);
integer i;
list lItem;
integer iWorn;
list lFolders = [];
// now add the button for wearing all recursively when it makes sense
if (g_sCurrentFolder!="") {
lItem=llParseString2List(sFirst,["|"],[]);
iWorn=llList2Integer(lItem,0);
g_iLastFolderState=iWorn;
if (iWorn / 10 == 1 ) sPrompt += "It has wearable items";
else if (iWorn / 10 == 2 ) sPrompt += "It has wearable and removable items";
else if (iWorn / 10 == 3 ) sPrompt += "It has removable items";
else if (iWorn / 10 == 0 ) sPrompt += "It does not directly have any wearable or removable item";
sPrompt += ".\n";
lUtilityButtons += [ACTIONS_CURRENT];
}
else lUtilityButtons += [ROOT_ACTIONS];
for (i=0;i<llGetListLength(sData);i++) {
lItem=llParseString2List(llList2String(sData,i),["|"],[]);
string sFolder = llList2String(lItem,0);
iWorn=llList2Integer(lItem,1);
if (iWorn != 0)
{
lFolders += [llGetSubString(folderIcon(iWorn)+sFolder, 0, 12)];
}
}
sPrompt += "\n- Click "+ACTIONS_CURRENT+" to manage this folder content.\n- Click one of the subfolders to browse it.\n";
if (g_sCurrentFolder!="") {sPrompt += "- Click "+PARENT+" to browse parent folder.\n"; lUtilityButtons += [PARENT];}
sPrompt += "- Click "+UPMENU+" to go back to "+g_sParentMenu+".\n";
g_kBrowseID = Dialog(g_kAsyncMenuUser, sPrompt, lFolders, lUtilityButtons, g_iPage, g_iAsyncMenuAuth);
}
SaveFolder(string sStr)
{
list sData = llParseString2List(sStr, [","], []);
integer i;
list lItem;
integer iWorn;
if (g_sCurrentFolder!="") g_sCurrentFolder+="/";
for (i=1;i<llGetListLength(sData);i++) {
lItem=llParseString2List(llList2String(sData,i),["|"],[]);
iWorn=llList2Integer(lItem,1);
if (iWorn>=30) g_lOutfit+=[g_sCurrentFolder+llList2String(lItem,0)];
else if (iWorn>=20) g_lOutfit=[g_sCurrentFolder+llList2String(lItem,0)]+g_lOutfit;
if (iWorn%10>=2) g_lToCheck+=[g_sCurrentFolder+llList2String(lItem,0)];
}
if (llGetListLength(g_lToCheck)>0)
{
g_sCurrentFolder=llList2String(g_lToCheck,-1);
g_lToCheck=llDeleteSubList(g_lToCheck,-1,-1);
QueryFolders("save");
}
else
{
Notify(g_kAsyncMenuUser,"Current outfit has been saved.", TRUE);
g_sCurrentFolder="";
if (g_iAsyncMenuRequested)
{
g_iAsyncMenuRequested=FALSE;
llMessageLinked(LINK_SET, g_iAsyncMenuAuth, "menu "+g_sParentMenu, g_kAsyncMenuUser);
}
}
}
handleMultiSearch()
{
string sItem=llList2String(g_lSearchList,0);
string pref1 = llGetSubString(sItem, 0, 0);
string pref2 = llGetSubString(sItem, 0, 1);
g_lSearchList=llDeleteSubList(g_lSearchList,0,0);
if (pref1 == "+" || pref1 == "&") g_sFolderType = "searchattach";
else if (pref1 == "-") g_sFolderType = "searchdetach";
else jump next; // operator was omitted, then repeat last action
if (pref2 == "++" || pref2 == "--" || pref2 == "&&")
{
g_sFolderType += "all";
sItem = llToLower(llGetSubString(sItem,2,-1));
}
else sItem = llToLower(llGetSubString(sItem,1,-1));
if (pref1 == "&") g_sFolderType += "over";
@next;
searchSingle(sItem);
}
string g_sFirstsearch;
string g_sNextsearch;
string g_sBuildpath;
searchSingle(string sItem)
{
//open listener
g_iFolderRLV = 9999 + llRound(llFrand(9999999.0));
g_iListener = llListen(g_iFolderRLV, "", llGetOwner(), "");
//start timer
g_sFirstsearch="";
g_sNextsearch="";
g_sBuildpath="";
if(~llSubStringIndex(sItem,"/"))
{
//we're doing a two-level search.
list tlist=llParseString2List(sItem,["/"],[]);
g_sFirstsearch=llList2String(tlist,0);
g_sNextsearch=llList2String(tlist,1);
sItem=g_sFirstsearch;
}
llSetTimerEvent(g_iTimeOut);
//llMessageLinked(LINK_SET, RLV_CMD, "findfolder:"+sItem+"="+(string)g_iFolderRLV, NULL_KEY);
if ((g_iRLVaOn) && (g_sNextsearch == "")) { //use multiple folder matching from RLVa if we have it
llOwnerSay("@findfolders:"+sItem+"="+(string)g_iFolderRLV); //Unstored one-shot commands are better performed locally to save the linked message.
}
else llOwnerSay("@findfolder:"+sItem+"="+(string)g_iFolderRLV); //Unstored one-shot commands are better performed locally to save the linked message.
}
// set a dialog to be requested after the next viewer answer
SetAsyncMenu(key kAv, integer iAuth)
{
g_iAsyncMenuRequested = TRUE;
g_kAsyncMenuUser = kAv;
g_iAsyncMenuAuth = iAuth;
}
integer UserCommand(integer iNum, string sStr, key kID)
{
if (iNum < COMMAND_OWNER || iNum > COMMAND_WEARER) return FALSE;
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
string sValue = llToLower(llList2String(lParams, 1));
if (llToLower(sStr) == "#rlv" || sStr == "menu Browse #RLV")
{
g_sCurrentFolder = "";
QueryFolders("browse");
SetAsyncMenu(kID, iNum);
}
else if (llToLower(sStr) == "history" || sStr == "menu #RLV History")
{
HistoryMenu(kID, iNum);
}
else if (llToLower(llGetSubString(sStr, 0, 4)) == "#rlv ")
{
SetAsyncMenu(kID, iNum);
g_sFolderType = "searchbrowse";
string sPattern = llDeleteSubString(sStr,0, 4);
llOwnerSay("Searching folder containing string \"" + sPattern + "\" for browsing.");
searchSingle(sPattern);
}
else if (sStr=="save")
{
g_sCurrentFolder = "";
g_lOutfit=[];
g_lToCheck=[];
QueryFolders("save");
//if (sCommand == "menu") SetAsyncMenu(kID, iNum);
g_kAsyncMenuUser = kID; // needed for notifying
}
else if (sStr=="restore"/*|| sStr=="menu Restore"*/)
{
integer i = 0; integer n = llGetListLength(g_lOutfit);
for (; i < n; ++i)
llMessageLinked(LINK_SET, RLV_CMD, "attachover:" + llList2String(g_lOutfit,i) + "=force", NULL_KEY);
Notify(kID, "Saved outfit has been restored.", TRUE );
//if (sCommand == "menu") llMessageLinked(LINK_SET, iNum, "menu " + g_sParentMenu, kID);;
}
else if (llGetSubString(sStr,0,0)=="+"||llGetSubString(sStr,0,0)=="-"||llGetSubString(sStr,0,0)=="&")
{
g_kAsyncMenuUser = kID;
g_lSearchList=llParseString2List(sStr,[","],[]);
handleMultiSearch();
}
else if (iNum <= COMMAND_GROUP)
{
list lArgs = llParseStringKeepNulls(sStr, ["="], []);
integer val;
if (llList2String(lArgs,0)=="unsharedwear") val = 0x2;
else if (llList2String(lArgs,0)=="unsharedunwear") val = 0x1;
else return TRUE;
if (llList2String(lArgs,1)=="y") updateUnsharedLocks(0, val);
else if (llList2String(lArgs,1)=="n") updateUnsharedLocks(val, 0);
else return TRUE;
}
return TRUE;
}
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "rlvfolders_";
g_kWearer = llGetOwner();
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
integer i;
for (i=0;i < llGetListLength(g_lChildren);i++)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + llList2String(g_lChildren,i), "");
}
}
else if (iNum == RLV_CLEAR) //this triggers for safeword as well
{
g_lFolderLocks = [];
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "Locks", NULL_KEY);
}
else if (UserCommand(iNum, sStr, kID)) return;
else if (iNum == RLVA_VERSION) g_iRLVaOn = TRUE;
else if (iNum == DIALOG_RESPONSE)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
g_iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (kID == g_kHistoryMenuID)
{
if (sMessage == UPMENU)
{
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
return;
}
else
{
g_sCurrentFolder = sMessage;
g_iPage = 0;
SetAsyncMenu(kAv, iAuth);
QueryFolders("history");
}
}
else if (kID == g_kMultipleFoldersOnSearchMenuID) {
if (sMessage == UPMENU) {
g_sCurrentFolder = "";
QueryFolders("browse");
return;
}
llMessageLinked(LINK_SET, RLV_CMD, llGetSubString(g_sFolderType,6,-1)+":"+sMessage+"=force", NULL_KEY);
addToHistory(sMessage);
Notify(kAv, "Now "+llGetSubString(g_sFolderType,6,11)+"ing "+sMessage, TRUE);
}
else if (kID == g_kRootActionsID)
{
if (sMessage == UPMENU)
{
SetAsyncMenu(kAv, iAuth); QueryFolders("browse");
return;
}
else if (sMessage == "Save") UserCommand(iAuth, "save", kAv);
else if (sMessage == "Restore") UserCommand(iAuth, "restore", kAv);
else if (sMessage == lockUnsharedButton(0, 0))
{
if (g_iUnsharedLocks & 0x1) {
updateUnsharedLocks(0x0, 0x1);
Notify(kAv, "Now removing unshared items is no longer forbidden.", TRUE);
}
else {
updateUnsharedLocks(0x1, 0x0);
Notify(kAv, "Now removing unshared items is forbidden.", TRUE);
}
}
else if (sMessage == lockUnsharedButton(1, 0))
{
if (g_iUnsharedLocks & 0x2) {
updateUnsharedLocks(0x0, 0x2);
Notify(kAv, "Now wearing unshared items is no longer forbidden.", TRUE);
}
else {
updateUnsharedLocks(0x2, 0x0);
Notify(kAv, "Now wearing unshared items is forbidden.", TRUE);
}
}
RootActionsMenu(kAv, iAuth);
}
else if (kID == g_kBrowseID)
{
if (sMessage == UPMENU)
{
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
return;
}
else if (sMessage == ROOT_ACTIONS)
{
RootActionsMenu(kAv, iAuth);
return;
}
else if (sMessage == ACTIONS_CURRENT)
{
FolderActionsMenu(g_iLastFolderState, kAv, iAuth);
return;
}
else if (sMessage == PARENT)
{
ParentFolder();
}
else
{ //we got a folder. send the RLV command to remove/attach it.
integer iState = StateFromButton(sMessage);
string folder = FolderFromButton(sMessage);
if (g_sCurrentFolder == "") g_sCurrentFolder = folder;
else g_sCurrentFolder += "/" + folder;
if ((iState % 10) == 0)
{ // open actions menu if requested folder does not have subfolders
FolderActionsMenu(iState, kAv, iAuth);
return;
}
}
g_iPage = 0;
SetAsyncMenu(kAv, iAuth);
QueryFolders("browse");
}
else if (kID == g_kActionsID)
{
if (sMessage == ADD)
{
llMessageLinked(LINK_SET, RLV_CMD, "attachover:" + g_sCurrentFolder + "=force", NULL_KEY);
Notify(kAv, "Now adding "+g_sCurrentFolder, TRUE);
}
else if (sMessage == REPLACE)
{
llMessageLinked(LINK_SET, RLV_CMD, "attach:" + g_sCurrentFolder + "=force", NULL_KEY);
addToHistory(g_sCurrentFolder);
Notify(kAv, "Now attaching "+g_sCurrentFolder, TRUE);
}
else if (sMessage == DETACH)
{
llMessageLinked(LINK_SET, RLV_CMD, "detach:" + g_sCurrentFolder + "=force", NULL_KEY);
Notify(kAv, "Now detaching "+g_sCurrentFolder, TRUE);
}
else if (sMessage == ADD_ALL)
{
llMessageLinked(LINK_SET, RLV_CMD, "attachallover:" + g_sCurrentFolder + "=force", NULL_KEY);
Notify(kAv, "Now adding everything in "+g_sCurrentFolder, TRUE);
}
else if (sMessage == REPLACE_ALL)
{
llMessageLinked(LINK_SET, RLV_CMD, "attachall:" + g_sCurrentFolder + "=force", NULL_KEY);
Notify(kAv, "Now attaching everything in "+g_sCurrentFolder, TRUE);
}
else if (sMessage == DETACH_ALL)
{
llMessageLinked(LINK_SET, RLV_CMD, "detachall:" + g_sCurrentFolder + "=force", NULL_KEY);
Notify(kAv, "Now detaching everything in "+g_sCurrentFolder, TRUE);
}
else if (sMessage == lockFolderButton(0x00, 0, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x01, 0x10);
Notify(kAv, "Now wearing "+g_sCurrentFolder+ " is forbidden (this overrides parent exceptions).", TRUE);
}
else if (sMessage == lockFolderButton(0x00,1, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x02, 0x20);
Notify(kAv, "Now removing "+g_sCurrentFolder+ " is forbidden (this overrides parent exceptions).", TRUE);
}
else if (sMessage == lockFolderButton(0x00, 2, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x04, 0x40);
Notify(kAv, "Now wearing "+g_sCurrentFolder+ " or its subfolders is forbidden (this overrides parent exceptions).", TRUE);
}
else if (sMessage == lockFolderButton(0x00, 3, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x08, 0x80);
Notify(kAv, "Now removing "+g_sCurrentFolder+ " or its subfolders is forbidden (this overrides parent exceptions).", TRUE);
}
else if (sMessage == lockFolderButton(0x0F, 0, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x10, 0x01);
Notify(kAv, "Now wearing "+g_sCurrentFolder+ " is exceptionally allowed (this overrides parent locks).", TRUE);
}
else if (sMessage == lockFolderButton(0x0F, 1, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x20, 0x02);
Notify(kAv, "Now removing "+g_sCurrentFolder+ " is exceptionally allowed (this overrides parent locks).", TRUE);
}
else if (sMessage == lockFolderButton(0x0F,2, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x40, 0x04);
Notify(kAv, "Now wearing "+g_sCurrentFolder+ " or its subfolders is exceptionally allowed (this overrides parent locks).", TRUE);
}
else if (sMessage == lockFolderButton(0x0F,3, 0))
{
updateFolderLocks(g_sCurrentFolder, 0x80, 0x08);
Notify(kAv, "Now removing "+g_sCurrentFolder+ " or its subfolders is exceptionally allowed (this overrides parent locks).", TRUE);
}
else if (sMessage == lockFolderButton(0xFFFF,0, 0))
{
updateFolderLocks(g_sCurrentFolder, 0, 0x11);
Notify(kAv, "Now there is no restriction or exception on wearing "+g_sCurrentFolder+ ".", TRUE);
}
else if (sMessage == lockFolderButton(0xFFFF,1, 0))
{
updateFolderLocks(g_sCurrentFolder, 0, 0x22);
Notify(kAv, "Now there is no restriction or exception on removing "+g_sCurrentFolder+ ".", TRUE);
}
else if (sMessage == lockFolderButton(0xFFFF,2, 0))
{
updateFolderLocks(g_sCurrentFolder, 0, 0x44);
Notify(kAv, "Now there is no restriction or exception on wearing "+g_sCurrentFolder+ " and its subfolders.", TRUE);
}
else if (sMessage == lockFolderButton(0xFFFF,3, 0))
{
updateFolderLocks(g_sCurrentFolder, 0, 0x88);
Notify(kAv, "Now there is no restriction or exception on removing "+g_sCurrentFolder+ " and its subfolders.", TRUE);
}
else if (llGetSubString(sMessage, 0, 0) == "(") Notify(kAv, "This action is forbidden at your authentification level.", FALSE);
if (sMessage != UPMENU) { addToHistory(g_sCurrentFolder); llSleep(1.0);} //time for command to take effect so that we see the result in menu
//Return to browse menu
if (llGetSubString(g_sFolderType, 0, 14) == "history_actions" && sMessage != "Browse") {HistoryMenu(kAv, iAuth); return;}
if (llGetSubString(g_sFolderType, -4, -1) == "_sub") ParentFolder();
SetAsyncMenu(kAv, iAuth);
QueryFolders("browse");
}
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "Locks")
{
g_lFolderLocks = llParseString2List(sValue, [","], []);
integer iN = llGetListLength(g_lFolderLocks);
for (i = 0; i < iN; i += 2) doLockFolder(i);
}
else if (sToken == "Unshared")
{
g_iUnsharedLocks = (integer) sValue;
doLockUnshared();
}
}
}
}
listen(integer iChan, string sName, key kID, string sMsg)
{
llListenRemove(g_iListener);
llSetTimerEvent(0.0);
if (iChan == g_iFolderRLV)
{ //we got a list of folders
if (g_sFolderType=="browse")
{
if (sMsg == "")
{ // try again if the folder name was wrong (may happen if the inventory changed)
g_sCurrentFolder = "";
g_iPage = 0;
QueryFolders("browse");
}
else FolderBrowseMenu(sMsg);
}
else if (g_sFolderType=="history")
{
list sData = llParseStringKeepNulls(sMsg, [",", "|"], []);
integer iState = llList2Integer(sData, 1);
FolderActionsMenu(iState, g_kAsyncMenuUser, g_iAsyncMenuAuth);
}
else if (g_sFolderType=="save") SaveFolder(sMsg);
else if (llGetSubString(g_sFolderType,0,5)=="search")
{
if (sMsg=="") Notify(g_kAsyncMenuUser,sMsg+"No folder found", FALSE);
else if (llGetSubString(g_sFolderType,6,-1)=="browse")
{
g_sCurrentFolder = sMsg;
QueryFolders("browse");
}
else
{
if(g_sFirstsearch!="")
{
integer idx=llSubStringIndex(llToLower(sMsg),llToLower(g_sFirstsearch));
g_sBuildpath=llGetSubString(sMsg,0,idx);
sMsg=llDeleteSubString(sMsg,0,idx);
idx=llSubStringIndex(sMsg,"/");
g_sBuildpath+=llGetSubString(sMsg,0,idx);
g_sFirstsearch="";
g_iListener = llListen(g_iFolderRLV, "", llGetOwner(), "");
llSetTimerEvent(g_iTimeOut);
llOwnerSay("@getinv:"+g_sBuildpath+"="+(string)g_iFolderRLV);
}
else
{
if(g_sNextsearch!="")
{
list tlist=llParseString2List(sMsg,[","],[]);
integer i=llGetListLength(tlist);
string found;
string test;
while(i)
{
--i;
test=llList2String(tlist,i);
if(~llSubStringIndex(llToLower(test),llToLower(g_sNextsearch)))
{
i=0;
found=test;
}
}
if(found=="")
{
Notify(g_kAsyncMenuUser,g_sNextsearch+" subfolder not found", FALSE);
return;
}
else sMsg=g_sBuildpath+"/"+found;
g_sNextsearch="";
g_sBuildpath="";
}
if ((llSubStringIndex(sMsg,",") >=0) && (g_iRLVaOn)) { //we have multiple results, bring up a menu
list lMultiFolders = llParseString2List(sMsg,[","],[]);
string sPrompt = "Multiple results found. Please select an item\n";
sPrompt += "Current action is "+g_sFolderType+"\n";
g_kMultipleFoldersOnSearchMenuID = Dialog(g_kAsyncMenuUser, sPrompt, lMultiFolders, [UPMENU], 0, iChan);
return;
}
llMessageLinked(LINK_SET, RLV_CMD, llGetSubString(g_sFolderType,6,-1)+":"+sMsg+"=force", NULL_KEY);
addToHistory(sMsg);
Notify(g_kAsyncMenuUser, "Now "+llGetSubString(g_sFolderType,6,11)+"ing "+sMsg, TRUE);
}
}
if (g_lSearchList!=[]) handleMultiSearch();
}
}
}
timer()
{
llListenRemove(g_iListener);
llSetTimerEvent(0.0);
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

View File

@@ -0,0 +1,742 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - rlvmain //
// version 3.990 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//201410060330
integer g_iRLVOn = TRUE;//set to TRUE if DB says user has turned RLV features on
integer g_iViewerCheck = FALSE;//set to TRUE if viewer is has responded to @versionnum message
integer g_iRlvActive = FALSE;
//integer g_iRLVNotify = FALSE;//if TRUE, ownersay on each RLV restriction
integer g_iListener;
float g_fVersionTimeOut = 30.0; //MD- changed from 60. 2 minute wait before finding RLV is off is too long.
integer g_iRlvVersion;
integer g_iRlvaVersion;
integer g_iCheckCount;//increment this each time we say @versionnum. check it each time timer goes off in default state. give up if it's >= 2
integer g_iMaxViewerChecks=10;
integer g_iCollarLocked=FALSE;
string g_sParentMenu = "Main";
string g_sSubMenu = "RLV";
list g_lMenu;
key kMenuID;
integer RELAY_CHANNEL = -1812221819;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
//integer COMMAND_SECOWNER = 501;
//integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
integer COMMAND_RELAY_SAFEWORD = 511;
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
//integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; //RLV Plugins can recieve the used RLV viewer version upon receiving this message..
integer RLVA_VERSION = 6004; //RLV Plugins can recieve the used RLVa viewer version upon receiving this message..
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer RLV_QUERY = 6102; //query from a script asking if RLV is currently functioning
integer RLV_RESPONSE = 6103; //reply to RLV_QUERY, with "ON" or "OFF" as the message
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
string UPMENU = "BACK";
string TURNON = " ON";
string TURNOFF = " OFF";
string CLEAR = "CLEAR ALL";
string CTYPE = "collar";
string WEARERNAME;
key g_kWearer;
string g_sScript="rlvmain_";
string g_sRlvVersionString="(unknown)";
string g_sRlvaVersionString="(unknown)";
list g_lOwners;
list g_lRestrictions; //2 strided list of sourceId, § separated list of restrictions strings
list g_lExceptions;
list g_lBaked=[]; //list of restrictions currently in force
key g_kSitter=NULL_KEY;
key g_kSitTarget=NULL_KEY;
integer CMD_ADDSRC = 11;
integer CMD_REMSRC = 12;
integer g_iWaitRelay = FALSE ;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Notify(key kID, string sMsg, integer iAlsoNotifyWearer){
if (kID == g_kWearer) llOwnerSay(sMsg);
else{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
DoMenu(key kID, integer iAuth){
list lButtons;
if (g_iRLVOn)
{
lButtons += [TURNOFF];
if (g_iViewerCheck) lButtons += [CLEAR] + llListSort(g_lMenu, 1, TRUE);
}
else lButtons += [TURNON];
string sPrompt = "\nRestrained Love Viewer Options\n";
if (g_iRlvVersion) sPrompt += "Detected Version of RLV: "+g_sRlvVersionString;
if (g_iRlvaVersion) sPrompt += " (RLVa: "+g_sRlvaVersionString+")";
if (!g_iViewerCheck) sPrompt += "Could not detect Restrained Love Viewer.\nRestrained Love functions disabled.";
sPrompt +="\n\nwww.opencollar.at/rlv";
kMenuID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kID + "|" + sPrompt + "|0|" + llDumpList2String(lButtons, "`") + "|" + UPMENU + "|" + (string)iAuth, kMenuID);
//Debug("Made menu.");
}
rebakeSourceRestrictions(key kSource){
//Debug("rebakeSourceRestrictions "+(string)kSource);
integer iSourceIndex=llListFindList(g_lRestrictions,[kSource]);
if (~iSourceIndex) { // if its a known source, rebake its restrictions
list lRestr=llParseString2List(llList2String(g_lRestrictions,iSourceIndex+1),["§"],[]);
while(llGetListLength(lRestr)){
ApplyAdd(llList2String(lRestr,-1));
lRestr=llDeleteSubList(lRestr,-1,-1);
}
}
}
DoLock(){
//lock the collar if there are still restrictions from active traps. Garbage collection will clear lock if they are stale.
integer numSources=llGetListLength(llList2ListStrided(g_lRestrictions,0,-2,2));
while (numSources--){
if ((key)llList2Key(llList2ListStrided(g_lRestrictions,0,-2,2),numSources)){
//an active source has a valid key, so remain locked... return
ApplyAdd("detach");
return;
}
}
ApplyRem("detach"); //we only get here if none of the active sources is a real source, so remove our lock
}
setRlvState(){
if (g_iRLVOn && g_iViewerCheck){ //everyone says RLV on
if (!g_iRlvActive) { //its newly active
//Debug("RLV went active");
//Debug("Sources:"+llDumpList2String(g_lSources,";"));
g_iRlvActive=TRUE;
llMessageLinked(LINK_SET, RLV_ON, "", NULL_KEY);
g_lMenu = [] ; // flush submenu buttons
llMessageLinked(LINK_SET, MENUNAME_REQUEST, g_sSubMenu, "");
//tell rlv plugins to reinstate restrictions (and wake up the relay listener... so that it can at least hear !pong's!
llMessageLinked(LINK_SET, RLV_REFRESH, "", NULL_KEY);
g_iWaitRelay = TRUE ;
llSetTimerEvent(5); //Make sure the relay is ready before pinging
//move ping to timer
//reinstate exceptions
//Debug("adding exceptions:\n"+llDumpList2String(g_lExceptions,",\n"));
integer i;
for (i=0;i<llGetListLength(g_lExceptions);i+=2) {
key kSource=(key)llList2String(g_lExceptions,i);
list lBehaviours=llParseString2List(llList2String(g_lExceptions,i+1),["§"],[]);
while (llGetListLength(lBehaviours)){
//Debug("re-adding exception "+llList2String(lBehaviours,-1)+" for "+(string)kSource);
ApplyAdd(llList2String(lBehaviours,-1)+":"+(string)kSource);
lBehaviours=llDeleteSubList(lBehaviours,-1,-1);
}
}
llMessageLinked(LINK_SET, RLV_VERSION, (string) g_iRlvVersion, NULL_KEY);
if (g_iRlvaVersion) { //Respond on RLVa as well
llMessageLinked(LINK_SET, RLVA_VERSION, (string) g_iRlvaVersion, NULL_KEY);
}
llOwnerSay("RLV ready! (v" + g_sRlvVersionString + ")");
DoLock();
}
} else if (g_iRlvActive) { //Both were true, but not now. g_iViewerCheck must still be TRUE (as it was once true), so g_iRLVOn must have just been set FALSE
//Debug("RLV went inactive");
g_iRlvActive=FALSE;
//SafeWord(TRUE);
while (llGetListLength(g_lBaked)){
llOwnerSay("@"+llList2String(g_lBaked,-1)+"=y"); //remove restriction
g_lBaked=llDeleteSubList(g_lBaked,-1,-1);
}
llMessageLinked(LINK_SET, RLV_OFF, "", NULL_KEY);
} else if (g_iRLVOn){ //g_iViewerCheck must be FALSE (see above 2 cases), so g_iRLVOn must have just been set to TRUE, so do viewer check
if (g_iListener) llListenRemove(g_iListener);
g_iListener = llListen(293847, "", g_kWearer, "");
llSetTimerEvent(g_fVersionTimeOut);
g_iCheckCount=0;
llOwnerSay("@versionnew=293847");
} else { //else both are FALSE, its the only combination left, No need to do viewercheck if g_iRLVOn is FALSE
llSetTimerEvent(0.0);
}
}
AddRestriction(key kID, string sBehav) {
if (kID=="rlvex"){ //if its an exception, add it to the exceptions list
list lParams = llParseString2List(sBehav, [":"], []);
key kAv = (key)llList2String(lParams, 1);
sBehav = llList2String(lParams, 0);
//Debug("apply exception ("+(string)kAv+")"+sBehav);
if ((key)kAv){
integer iSource=llListFindList(g_lExceptions,[kAv]);
if (! ~iSource ) { //if this is an exception for a new agent
//Debug("Exception for new agent "+(string)kAv);
g_lExceptions+=[kAv,""]; //add UUID and blank list to exceptions list
iSource=-2;
}
//Debug("trying to apply exception ("+(string)kID+")"+sBehav);
string sSrcRestr = llList2String(g_lExceptions,iSource+1);
if (!(sSrcRestr==sBehav || (~llSubStringIndex(sSrcRestr,"§"+sBehav)) || (~llSubStringIndex(sSrcRestr,sBehav+"§"))) ) {
//Debug("AddRestriction 2.2");
sSrcRestr+="§"+sBehav;
if (llSubStringIndex(sSrcRestr,"§")==0) sSrcRestr=llGetSubString(sSrcRestr,1,-1);
g_lExceptions=llListReplaceList(g_lExceptions,[sSrcRestr],iSource+1, iSource+1);
ApplyAdd(sBehav+":"+(string)kAv);
//} else {
//Debug("exception already active ("+(string)kID+")"+sBehav);
//Debug(sSrcRestr);
}
} else {
llOwnerSay("OC doesn't currently support global exceptions");
}
} else { //add this restriction to the list for this source
//add new sources to sources list
integer iSource=llListFindList(g_lRestrictions,[kID]);
if (! ~iSource ) { //if this is a restriction from a new source
g_lRestrictions += [kID,""];
iSource=-2;
if ((key)kID) llMessageLinked(LINK_SET, CMD_ADDSRC,"",kID); //tell relay script we have a new restriction source
}
string sSrcRestr = llList2String(g_lRestrictions,iSource+1);
//Debug("AddRestriction 2.1");
if (!(sSrcRestr==sBehav || (~llSubStringIndex(sSrcRestr,"§"+sBehav)) || (~llSubStringIndex(sSrcRestr,sBehav+"§"))) ) {
//Debug("AddRestriction 2.2");
sSrcRestr+="§"+sBehav;
if (llSubStringIndex(sSrcRestr,"§")==0) sSrcRestr=llGetSubString(sSrcRestr,1,-1);
g_lRestrictions=llListReplaceList(g_lRestrictions,[sSrcRestr],iSource+1, iSource+1);
//Debug("apply restriction ("+(string)kID+")"+sBehav);
ApplyAdd(sBehav);
//Debug("AddRestriction 2.3");
if (sBehav=="unsit") {
g_kSitTarget = llList2Key(llGetObjectDetails(g_kWearer, [OBJECT_ROOT]), 0);
g_kSitter=kID;
}
}
DoLock(); //if there are sources with valid keys, collar should be locked.
}
}
ApplyAdd (string sBehav) {
if (! ~llListFindList(g_lBaked, [sBehav])) { //if this restriction is not already baked
g_lBaked+=[sBehav];
llOwnerSay("@"+sBehav+"=n");
//Debug("'"+sBehav+"' added to the baked list");
//} else {
//Debug(sBehav+" is already baked");
}
}
RemRestriction(key kID, string sBehav) {
if ((string)kID=="rlvex"){
//Debug("RemRestriction [rlvex] "+sBehav);
list lParams = llParseString2List(sBehav, [":"], []);
key kAv = (key)llList2String(lParams, 1);
sBehav = llList2String(lParams, 0);
integer iSource=llGetListLength(g_lExceptions);
while (iSource){
iSource -= 2;
key thisAgent=llList2Key(g_lExceptions,iSource);
if (thisAgent==kAv || kAv==""){ //if we're clearing this one, or all
//Debug("clearing "+(string)sBehav+" for "+(string)thisAgent);
list lSrcRestr = llParseString2List(llList2String(g_lExceptions,iSource+1),["§"],[]); //get a list of this source's restrictions
integer iRestr=llListFindList(lSrcRestr,[sBehav]); //get index of this restriction from that list
if (~iRestr) { //if the restriction is in the list
if (llGetListLength(lSrcRestr)==1) { //if it is the only restriction in the list
//Debug("removing last restriction");
g_lExceptions=llDeleteSubList(g_lExceptions,iSource, iSource+1); //remove the restrictions list
} else { //else, the source has other restrictions
lSrcRestr=llDeleteSubList(lSrcRestr,iRestr,iRestr); //delete the restriction from the list
g_lExceptions=llListReplaceList(g_lExceptions,[llDumpList2String(lSrcRestr,"§")] ,iSource+1,iSource+1);//store the list in the sources restrictions list
//Debug("removed restriction, there are "+(string)llGetListLength(lSrcRestr)+" remaining "+llDumpList2String(lSrcRestr,"|"));
}
lSrcRestr=[];
ApplyRem(sBehav+":"+(string)thisAgent);
//} else {
//Debug("restriction is not in the list");
}
}
}
} else {
//Debug("RemRestriction ("+(string)kID+")"+sBehav);
integer iSource=llListFindList(g_lRestrictions,[kID]); //find index of the source
if (~iSource) { //if this source set any restrictions
list lSrcRestr = llParseString2List(llList2String(g_lRestrictions,iSource+1),["§"],[]); //get a list of this source's restrictions
integer iRestr=llListFindList(lSrcRestr,[sBehav]); //get index of this restriction from that list
if ((~iRestr) || sBehav=="ALL") { //if the restriction is in the list
if (llGetListLength(lSrcRestr)==1) { //if it is the only restriction in the list
g_lRestrictions=llDeleteSubList(g_lRestrictions,iSource, iSource+1); //remove the restrictions list
if ((key)kID) llMessageLinked(LINK_SET, CMD_REMSRC,"",kID); //tell the relay the source has no restrictions
} else { //else, the source has other restrictions
lSrcRestr=llDeleteSubList(lSrcRestr,iRestr,iRestr); //delete the restriction from the list
g_lRestrictions=llListReplaceList(g_lRestrictions,[llDumpList2String(lSrcRestr,"§")] ,iSource+1,iSource+1);//store the list in the sources restrictions list
}
if (sBehav=="unsit"&&g_kSitter==kID) {
g_kSitter=NULL_KEY;
g_kSitTarget=NULL_KEY;
}
lSrcRestr=[];
ApplyRem(sBehav);
}
}
DoLock();
}
}
ApplyRem(string sBehav) {
//Debug("(rem) Baked restrictions:\n"+llDumpList2String(g_lBaked,"\n"));
integer iRestr=llListFindList(g_lBaked, [sBehav]); //look for this restriction in the baked list
if (~iRestr) { //if this restriction has been baked already
integer i;
for (i=0;i<=llGetListLength(g_lRestrictions);i++) { //for each source
list lSrcRestr=llParseString2List(llList2String(g_lRestrictions,i),["§"],[]); //get its restrictions list
if (llListFindList(lSrcRestr, [sBehav])!=-1) return; //check it for this restriction
}
// //also check the exceptions list, in case its an exception
list lParts=llParseString2List(sBehav,[":"],[]);
key exceptee=llList2Key(lParts,1);
if (exceptee) {
integer exceptionIndex=llListFindList(g_lExceptions,[exceptee]);
if (~exceptionIndex){
//Debug("This exceptee has exceptions");
list lExceptions=llParseString2List(llList2String(g_lExceptions,exceptionIndex+1),["§"],[]);
string exception=llList2String(lParts,0);
if (~llListFindList(lExceptions,[exception])){
//Debug("we found this exception for this person set by rlvex, so don't release it");
return;
}
//} else {
//Debug("Exceptions list is "+llDumpList2String(g_lExceptions,",")+"\n checking for "+exception+" from "+(string)exceptee);
}
//} else {
//Debug((string)exceptee+" is not a key, so this is not an exception");
}
g_lBaked=llDeleteSubList(g_lBaked,iRestr,iRestr); //delete it from the baked list
llOwnerSay("@"+sBehav+"=y"); //remove restriction
//} else {
//Debug("Restriction '"+sBehav+"'not in baked list");
}
//Debug("(post rem) Baked restrictions:\n"+llDumpList2String(g_lBaked,"\n"));
}
SafeWord() {
//leave lock and exceptions intact, clear everything else
integer numRestrictions=llGetListLength(g_lRestrictions);
while (numRestrictions){
numRestrictions -= 2;
string kSource=llList2String(g_lRestrictions,numRestrictions);
if (kSource != "main" && kSource != "rlvex" && llSubStringIndex(kSource,"utility_") != 0){
llMessageLinked(LINK_SET,RLV_CMD,"clear",kSource);
}
}
llMessageLinked(LINK_SET,RLV_CLEAR,"","");
}
// End of book keeping functions
UserCommand(integer iNum, string sStr, key kID) {
if (iNum == COMMAND_EVERYONE) return; // No command for people with no privilege in this plugin.
list lParams = llParseString2List(sStr, [" "], []);
string sCmd = llList2String(lParams, 0);
string sValue = llToLower(llList2String(lParams, 1));
lParams=[];
if (sStr=="runaway" && kID==g_kWearer) { // some scripts reset on runaway, we want to resend RLV state.
llSleep(2); //give some time for scripts to get ready.
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "on="+(string)g_iRLVOn, "");
} else if (llToLower(sStr) == "rlv" || llToLower(sStr) == "menu rlv" ){
//someone clicked "RLV" on the main menu. Give them our menu now
DoMenu(kID, iNum);
// } else if (sStr == "rlvnotify on") {
// g_iRLVNotify = TRUE;
// llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "notify=1", "");
// } else if (sStr == "rlvnotify off") {
// g_iRLVNotify = FALSE;
// llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "notify=0", "");
} else if (sStr == "rlvon") {
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "on=1", "");
g_iRLVOn = TRUE;
setRlvState();
} else if (sStr == "rlvoff") {
if (iNum == COMMAND_OWNER) {
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "on=0", "");
g_iRLVOn = FALSE;
setRlvState();
} else Notify(kID, "Sorry, only owner may disable Restrained Love functions", FALSE);
} else if (sStr == "clear") {
if (iNum == COMMAND_WEARER) llOwnerSay("Sorry, but the sub cannot clear RLV settings.");
else SafeWord();
} else if (sStr=="showrestrictions") {
string sOut="You are being restricted by the following objects";
integer numRestrictions=llGetListLength(g_lRestrictions);
while (numRestrictions){
key kSource=(key)llList2String(g_lRestrictions,numRestrictions);
if ((key)kSource)
sOut+="\n"+llKey2Name((key)kSource)+" ("+(string)kSource+"): "+llList2String(g_lRestrictions,numRestrictions+1);
else
sOut+="\nThis " + CTYPE + "("+(string)kSource+"): "+llList2String(g_lRestrictions,numRestrictions+1);
numRestrictions -= 2;
}
Notify(kID,sOut,FALSE);
}
}
default {
on_rez(integer param) {
/*
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
*/
g_iRlvActive=FALSE;
g_iViewerCheck=FALSE;
g_iRLVOn=FALSE;
g_lBaked=[]; //just been rezzed, so should have no baked restrictions
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
setRlvState();
llOwnerSay("@clear");
g_kWearer = llGetOwner();
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
//Debug("Starting");
}
listen(integer iChan, string sName, key kID, string sMsg) {
//RestrainedLove viewer v2.8.0 (RLVa 1.4.10) <-- @versionnew response structure v1.23 (implemented April 2010).
//lines commented out are from @versionnum response string (implemented late 2009)
llListenRemove(g_iListener);
llSetTimerEvent(0.0);
g_iCheckCount = 0;
g_iViewerCheck = TRUE;
//send the version to rlv plugins
list lParam = llParseString2List(sMsg,[" "],[""]); //(0:RestrainedLove)(1:viewer)(2:v2.8.0)(3:(RLVa)(4:1.4.10))
//g_iRlvVersion = (integer) llGetSubString(sMsg, 0, 2); //expects (208)0000 (old versionnum response)
list lVersionSplit = llParseString2List(llGetSubString(llList2String(lParam,2), 1, -1),["."],[]); //expects (208)0000 | derive from:(2:v2.8.0)
g_iRlvVersion = llList2Integer(lVersionSplit,0) * 100 + llList2Integer(lVersionSplit,1); //we should now have (integer)208
//integer i=(integer)sMsg;
//string s3=llGetSubString((string)(i/100),-2,-1);
//string s2=llGetSubString((string)(i/10000),-2,-1);
//string s1=llGetSubString((string)(i/1000000),-2,-1);
//g_sRlvVersionString = s1+"."+s2+"."+s3;
string sRlvResponseString = llList2String(lParam,2); //(2:v2.8.0) RLV segmented response from viewer
g_sRlvVersionString = llGetSubString(sRlvResponseString,llSubStringIndex(sRlvResponseString,"v")+1,llSubStringIndex(sRlvResponseString,")") );
string sRlvaResponseString = llList2String(lParam,4); //(4:1.4.10)) RLVa segmented response from viewer
g_sRlvaVersionString = llGetSubString(sRlvaResponseString,0,llSubStringIndex(sRlvaResponseString,")") -1);
lVersionSplit = llParseString2List(g_sRlvaVersionString,["."],[]); //split up RLVa version string (1.4.10)
g_iRlvaVersion = llList2Integer(lVersionSplit,0) * 100 + llList2Integer(lVersionSplit,1); //we should now have (integer)104
//We should now have: ["2.8.0" in g_sRlvVersionString] and ["1.4.10" in g_sRlvaVersionString]
//Debug("g_iRlvVersion: "+(string)g_iRlvVersion+" g_sRlvVersionString: "+g_sRlvVersionString+ " g_sRlvaVersionString: "+g_sRlvaVersionString+ " g_iRlvaVersion: "+(string)g_iRlvaVersion);
//Debug("|"+sMsg+"|");
setRlvState();
//Debug("Starting");
} //Firestorm - viewer response: RestrainedLove viewer v2.8.0 (RLVa 1.4.10)
//Firestorm - rlvmain parsed result: g_iRlvVersion: 208 (same as before) g_sRlvVersionString: 2.8.0 (same as before) g_sRlvaVersionString: 1.4.10 (new) g_iRlvaVersion: 104 (new)
//
//Marine's RLV Viewer - viewer response: RestrainedLove viewer v2.09.01.0 (3.7.9.32089)
//Marine's RLV Viewer - rlvmain parsed result: g_iRlvVersion: 209 (same as before) g_sRlvVersionString: 2.09.01.0 (same as before) g_sRlvaVersionString: NULL (new) g_iRlvaVersion: 0 (new)
link_message(integer iSender, integer iNum, string sStr, key kID) {
if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu) {
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
g_lMenu = [] ; // flush submenu buttons
llMessageLinked(LINK_SET, MENUNAME_REQUEST, g_sSubMenu, "");
}
else if (iNum == COMMAND_NOAUTH) return; // SA: TODO remove later
else if (iNum <= COMMAND_EVERYONE && iNum >= COMMAND_OWNER) UserCommand(iNum, sStr, kID);
else if (iNum == DIALOG_RESPONSE) {
//Debug(sStr);
if (kID == kMenuID) {
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMsg = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
lMenuParams=[];
//Debug(sMsg);
if (sMsg == TURNON) {
UserCommand(iAuth, "rlvon", kAv);
} else if (sMsg == TURNOFF) {
UserCommand(iAuth, "rlvoff", kAv);
DoMenu(kAv, iAuth);
} else if (sMsg == CLEAR) {
UserCommand(iAuth, "clear", kAv);
DoMenu(kAv, iAuth);
} else if (sMsg == UPMENU) {
llMessageLinked(LINK_SET, iAuth, "menu "+g_sParentMenu, kAv);
} else if (~llListFindList(g_lMenu, [sMsg])) { //if this is a valid request for a foreign menu
llMessageLinked(LINK_SET, iAuth, "menu " + sMsg, kAv);
}
}
} else if (iNum == LM_SETTING_SAVE) {
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
lParams=[];
if(sToken == "auth_owner" && llStringLength(sValue) > 0) g_lOwners = llParseString2List(sValue, [","], []);
else if (sToken=="Global_lock") g_iCollarLocked=(integer)sValue;
else if (sToken=="Global_CType") CTYPE=sValue;
} else if (iNum == LM_SETTING_RESPONSE) {
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
lParams=[];
if (sToken == "auth_owner" && llStringLength(sValue) > 0) g_lOwners = llParseString2List(sValue, [","], []);
else if (sToken=="Global_lock") g_iCollarLocked=(integer)sValue;
else if (sToken=="Global_CType") CTYPE=sValue;
else if (sToken=="Global_WearerName") WEARERNAME=sValue;
// else if (sToken=="rlvmain_notify") g_iRLVNotify = (integer)sValue;
else if (sToken=="rlvmain_on") {
g_iRLVOn=(integer)sValue;
setRlvState();
}
} else if (iNum == COMMAND_SAFEWORD) SafeWord();
else if (iNum==COMMAND_RELAY_SAFEWORD) SafeWord();
else if (iNum==RLV_QUERY){
if (g_iRlvActive) llMessageLinked(LINK_SET, RLV_RESPONSE, "ON", "");
else llMessageLinked(LINK_SET, RLV_RESPONSE, "OFF", "");
} else if (iNum == MENUNAME_RESPONSE) { //sStr will be in form of "parentmenu|menuname"
list lParams = llParseString2List(sStr, ["|"], []);
string sThisParent = llList2String(lParams, 0);
string sChild = llList2String(lParams, 1);
lParams=[];
if (sThisParent == g_sSubMenu) { //add this str to our menu buttons
if (! ~llListFindList(g_lMenu, [sChild])) {
g_lMenu += [sChild];
}
}
} else if (iNum == MENUNAME_REMOVE) { //sStr will be in form of "parentmenu|menuname"
list lParams = llParseString2List(sStr, ["|"], []);
string sThisParent = llList2String(lParams, 0);
string sChild = llList2String(lParams, 1);
lParams=[];
if (sThisParent == g_sSubMenu) {
integer iIndex = llListFindList(g_lMenu, [sChild]);
if (iIndex != -1) {
g_lMenu = llDeleteSubList(g_lMenu, iIndex, iIndex);
}
}
}
//these are things we only do if RLV is ready to go
else if (g_iRlvActive) { //if RLV is off, don't even respond to RLV submenu events
if (iNum == RLV_CMD) {
//Debug("Received RLV_CMD: "+sStr+" from "+(string)kID);
list lCommands=llParseString2List(llToLower(sStr),[","],[]);
while (llGetListLength(lCommands)){
string sCommand=llToLower(llList2String(lCommands,0));
list lArgs = llParseString2List(sCommand,["="],[]); //split the command on "="
string sCom = llList2String(lArgs,0); //store first part of command
if (llGetSubString(sCom,-1,-1)==":") sCom=llGetSubString(sCom,0,-2); //remove trailing :
string sVal = llList2String(lArgs,1); //store value
lArgs=[];
if (sVal=="n"||sVal=="add") AddRestriction(kID,sCom); //add a restriction
else if (sVal=="y"||sVal=="rem") RemRestriction(kID,sCom); //remove a restriction
else if (sCom=="clear") { //release some or all restrictions FOR THIS OBJECT ONLY
//Debug("Got clear command:\nkey: "+(string)kID+"\ncommand: "+sCommand);
integer iSource=llListFindList(g_lRestrictions,[kID]);
if (kID=="rlvex"){
RemRestriction(kID,sVal);
} else if (~iSource) { //if this is a known source
//Debug("Clearing restrictions:\nrestrictions: "+sVal+"\nfor key: "+(string)kID+"\nindex: "+(string)iSource);
list lSrcRestr=llParseString2List(llList2String(g_lRestrictions,iSource+1),["§"],[]); //get a list of this source's restrictions
integer numRestrictions=llGetListLength(lSrcRestr);
list lRestrictionsToRemove;
while (llGetListLength(lSrcRestr)) { //loop through all of this source's restrictions and store them in a new list
string sBehav=llList2String(lSrcRestr,-1); //get the name of the restriction from the list
if (sVal=="" || llSubStringIndex(sBehav,sVal)!=-1) { //if the restriction to remove matches the start of the behaviour in the list, or we need to remove all of them
//Debug("Clearing restriction "+sBehav+" for "+(string)kID);
lRestrictionsToRemove+=sBehav;
//RemRestriction(kID,sBehav); //remove the restriction from the list
}
lSrcRestr=llDeleteSubList(lSrcRestr,-1,-1);
}
lSrcRestr=[]; //delete the list to free memory
//Debug("removing restrictions:"+llDumpList2String(lRestrictionsToRemove,"|")+" for "+(string)kID);
while(llGetListLength(lRestrictionsToRemove)){
RemRestriction(kID,llList2String(lRestrictionsToRemove,-1)); //remove the restriction from the list
lRestrictionsToRemove=llDeleteSubList(lRestrictionsToRemove,-1,-1);
}
}
} else { //perform other command
//Debug("Got other command:\nkey: "+(string)kID+"\ncommand: "+sCommand);
if (llSubStringIndex(sCom,"tpto")==0) { //looks like a tpto command, lets check to see if we should honour it or not, and message back if we can if it fails
if ( (~llListFindList(g_lBaked,["tploc"])) || (~llListFindList(g_lBaked,["unsit"])) ) {
if ((key)kID) Notify(kID,"Can't teleport due to RLV restrictions",TRUE);
return;
}
} else if (sStr=="unsit=force") {
if (~llListFindList(g_lBaked,["unsit"]) ) {
if ((key)kID) Notify(kID,"Can't force stand due to RLV restrictions",TRUE);
return;
}
}
llOwnerSay("@"+sCommand);
if (g_kSitter==NULL_KEY&&llGetSubString(sCommand,0,3)=="sit:") {
g_kSitter=kID;
//Debug("Sitter:"+(string)(g_kSitter));
g_kSitTarget=(key)llGetSubString(sCom,4,-1);
//Debug("Sittarget:"+(string)(g_kSitTarget));
}
}
lCommands=llDeleteSubList(lCommands,0,0);
//Debug("Command list now "+llDumpList2String(lCommands,"|"));
}
} else if (iNum == COMMAND_RLV_RELAY) {
if (llGetSubString(sStr,-43,-1)== ","+(string)g_kWearer+",!pong") { //if it is a pong aimed at wearer
//Debug("Received pong:"+sStr+" from "+(string)kID);
if (kID==g_kSitter) llOwnerSay("@"+"sit:"+(string)g_kSitTarget+"=force"); //if we stored a sitter, sit on it
rebakeSourceRestrictions(kID);
}
}
}
}
timer() {
if (g_iWaitRelay) {
llSetTimerEvent(0.0);
g_iWaitRelay = FALSE;
//ping inworld object so that they reinstate their restrictions
integer i;
for (i=0;i<llGetListLength(g_lRestrictions)/2;i++) {
key kSource=(key)llList2String(llList2ListStrided(g_lRestrictions,0,-1,2),i);
if ((key)kSource) llShout(RELAY_CHANNEL,"ping,"+(string)kSource+",ping,ping");
else rebakeSourceRestrictions(kSource); //reapply collar's restrictions here
}
} else if (g_iCheckCount++ <= g_iMaxViewerChecks) { //no response in timeout period, try again
llOwnerSay("@versionnew=293847");
if (g_iCheckCount>1) llMessageLinked(LINK_SET, POPUP_HELP, "\n\nIf your viewer doesn't support RLV, you can stop the \"@versionnew\" message by switching RLV off in your "+CTYPE+"'s RLV menu or by typing: _PREFIX_rlvoff\n", g_kWearer);
} else { //we've waited long enough, and are out of retries
llSetTimerEvent(0.0);
llListenRemove(g_iListener);
g_iCheckCount=0;
//llSetTimerEvent(0.0);
g_iViewerCheck = FALSE;
g_iRlvVersion = FALSE;
g_iRlvaVersion = FALSE;
setRlvState();
llOwnerSay("Could not detect Restrained Love Viewer. Restrained Love functions disabled.");
if (llGetListLength(g_lRestrictions) > 0 && llGetListLength(g_lOwners) > 0) {
string sMsg = WEARERNAME+" appears to have logged in without using the Restrained Love Viewer. Their Restrained Love functions have been disabled.";
integer i_OwnerCount=llGetListLength(g_lOwners);
integer i;
for(i=0; i < i_OwnerCount; i+=2) {
Notify(llList2Key(g_lOwners,i), sMsg, FALSE);
}
if (i_OwnerCount == 2) llOwnerSay("Your owner has been notified.");
else llOwnerSay("Your owners have been notified.");
}
}
}
changed(integer change) {
if (change & CHANGED_OWNER) {
llResetScript();
}
//re make rlv restrictions after teleport or region change, because SL seems to be losing them
if (change & CHANGED_TELEPORT || change & CHANGED_REGION) { //if we teleported, or changed regions
//re make rlv restrictions after teleport or region change, because SL seems to be losing them
integer numBaked=llGetListLength(g_lBaked);
while (numBaked--){
llOwnerSay("@"+llList2String(g_lBaked,numBaked)+"=n");
//Debug("resending @"+llList2String(g_lBaked,numBaked));
}
}
if (change & CHANGED_INVENTORY) { //A script may have been recompiled or added, lets refresh the RLV state for other scripts
if (g_iRlvActive==TRUE) {
llSleep(2);
llMessageLinked(LINK_SET, RLV_ON, "", NULL_KEY);
if (g_iRlvaVersion) llMessageLinked(LINK_SET, RLVA_VERSION, (string) g_iRlvaVersion, NULL_KEY);
}
}
}
/*
if (change & CHANGED_REGION) {
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,565 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - rlvstuff //
// version 3.995 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sParentMenu = "RLV";
list g_lSettings; //3 strided list of prefix,option,value
list g_lChangedCategories;//list of categories that changed since last saved
integer g_lRLVcmds_stride=4;
list g_lRLVcmds=[ //4 strided list of menuname,command,prettyname,description
"rlvsit_","unsit","Stand","Stand up if seated",
"rlvsit_","sittp","Sit","Sit on objects >1.5m away",
"rlvtp_","tplm","Landmark","Teleport via Landmark",
"rlvtp_","tploc","Slurl","Teleport via Slurl/Map",
"rlvtp_","tplure","Lure","Teleport via offers",
"rlvtp_","showworldmap","Map","View World-map",
"rlvtp_","showminimap","Mini-map","View Mini-map",
"rlvtp_","showloc","Location","See current location",
"rlvtalk_","sendchat","Chat","Ability to Chat",
"rlvtalk_","chatshout","Shout","Ability to Shout",
"rlvtalk_","chatnormal","Whisper","Forced to Whisper",
"rlvtalk_","startim","Start IMs","Initiate IM Sessions",
"rlvtalk_","sendim","Send IMs","Respond to IMs",
"rlvtalk_","recvim","Get IMs","Receive IMs",
"rlvtalk_","recvchat","See Chat","Receive Chat",
"rlvtalk_","recvemote","See Emote","Receive Emotes",
"rlvtalk_","emote","Emote","Short Emotes if Chat blocked",
"rlvtouch_","fartouch","Far","Touch objects >1.5m away",
"rlvtouch_","touchworld","World","Touch in-world objects",
"rlvtouch_","touchattachself","Self","Touch your attachments",
"rlvtouch_","touchattachother","Others","Touch others' attachments",
"rlvmisc_","shownames","Names","See Avatar Names",
"rlvmisc_","fly","Fly","Ability to Fly",
"rlvmisc_","edit","Edit","Edit Objects",
"rlvmisc_","rez","Rez","Rez Objects",
"rlvmisc_","showinv","Inventory","View Inventory",
"rlvmisc_","viewnote","Notecards","View Notecards",
"rlvmisc_","viewscript","Scripts","View Scripts",
"rlvmisc_","viewtexture","Textures","View Textures",
"rlvmisc_","showhovertextworld","Hovertext","See hovertext like titles",
"rlvview_","camdistmax:0","Mouselook","Leave Mouselook",
"rlvview_","camunlock","Alt Zoom","Alt zoom/pan around",
"rlvview_","camdrawalphamax:1","See","See anything at all"
];
//commands take effect immediately and are not stored, like: force sit and force stand
//4 strided list of menuname,cmd,prettyname,desc
integer g_lIdmtCmds_stride=4;
list g_lIdmtCmds = [
"rlvsit_","sit","SitNow","Force Sit",
"rlvsit_","forceunsit","StandNow","Force Stand"
];
list g_lMenuHelpMap = [
"rlvsit_","sit",
"rlvtp_","travel",
"rlvtalk_","talk",
"rlvtouch_","touch",
"rlvmisc_","misc",
"rlvview_","view\n\nNOTE: This will only work on RLV API v2.9 and greater."
];
string TURNON = "✔";
string TURNOFF = "✘";
string CTYPE = "collar";
float g_fScanRange = 20.0;//range we'll scan for scripted objects when doing a force-sit
// Variables used for sit memory function
string g_sSitTarget = "";
integer g_iSitMode;
integer g_iSitListener;
float g_fRestoreDelay = 1.0;
integer g_iRestoreCount = 0;
float g_fPollDelay = 10.0;
//MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer SENSORDIALOG = -9003;
string UPMENU = "BACK";
key g_kWearer;
string g_sScript_sit="rlvsit_";
integer g_iRLVOn=FALSE;
list g_lMenuIDs;//3-strided list of avatars given menus, their dialog ids, and the name of the menu they were given
integer g_iMenuStride = 3;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Dialog(key kID, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string sName) {
key kMenuID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kID + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kMenuID);
integer iIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iIndex) g_lMenuIDs = llListReplaceList(g_lMenuIDs, [kID, kMenuID, sName], iIndex, iIndex + g_iMenuStride - 1);
else g_lMenuIDs += [kID, kMenuID, sName];
//Debug("Made "+sName+" menu.");
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID, 0, sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
Menu(key kID, integer iAuth, string sMenuName) {
//Debug("Making menu "+sMenuName);
if (!g_iRLVOn) {
Notify(kID, "RLV features are now disabled in this " + CTYPE + ". You can enable those in RLV submenu. Opening it now.", FALSE);
llMessageLinked(LINK_SET, iAuth, "menu RLV", kID);
return;
}
//build prompt showing current settings
//make enable/disable buttons
integer n;
string sPrompt;
list lButtons;
n=llListFindList(g_lMenuHelpMap,[sMenuName]);
if (~n){
sPrompt="\nwww.opencollar.at/"+llList2String(g_lMenuHelpMap,n+1)+"\n";
}
integer iStop = llGetListLength(g_lRLVcmds);
for (n = 0; n < iStop; n+=g_lRLVcmds_stride) {
if (llList2String(g_lRLVcmds,n)==sMenuName){
//see if there's a setting for this in the settings list
string sCmd = llList2String(g_lRLVcmds, n+1);
string sPretty = llList2String(g_lRLVcmds, n+2);
string desc = llList2String(g_lRLVcmds, n+3);
integer iIndex = llListFindList(g_lSettings, [sCmd]);
if (iIndex == -1) {
//if this cmd not set, then give button to enable
lButtons += [TURNOFF + " " + sPretty];
sPrompt += "\n" + sPretty + " = Enabled (" + desc + ")";
} else {
//else this cmd is set, then show in prompt, and make button do opposite
//get value of setting
string sValue = llList2String(g_lSettings, iIndex + 1);
if (sValue == "y") {
lButtons += [TURNOFF + " " + sPretty];
sPrompt += "\n" + sPretty + " = Enabled (" + desc + ")";
} else if (sValue == "n") {
lButtons += [TURNON + " " + sPretty];
sPrompt += "\n" + sPretty + " = Disabled (" + desc + ")";
}
}
}
}
//add immediate commands
iStop = llGetListLength(g_lIdmtCmds);
for (n = 0; n < iStop; n = n + g_lIdmtCmds_stride) {
if (llList2String(g_lIdmtCmds, n)==sMenuName){
lButtons += [llList2String(g_lIdmtCmds, n + 2)];
sPrompt += "\n" + llList2String(g_lIdmtCmds, n + 2) + " = " + llList2String(g_lIdmtCmds, n + 3);
}
}
//give an Allow All button
lButtons += [TURNON + " All"];
lButtons += [TURNOFF + " All"];
Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth, sMenuName);
}
string GetSetting(string sCategory, string sParam) {
integer iIndex = llListFindList(g_lSettings, [sCategory,sParam]);
return llList2String(g_lSettings, iIndex + 2);
}
SetSetting(string sCategory, string sOption, string sValue){
integer iIndex=llListFindList(g_lSettings,[sCategory,sOption]);
if (~iIndex) g_lSettings=llListReplaceList(g_lSettings, [sCategory, sOption, sValue], iIndex, iIndex+2); //there is already a setting, change it
else g_lSettings+=[sCategory, sOption, sValue]; //no setting exists.. add one
if (! ~llListFindList(g_lChangedCategories,[sCategory])) g_lChangedCategories+=sCategory; //if there are no previous changes for thi category, add the category to the list of changed ones
}
UpdateSettings() { //build one big string from the settings list, and send to to the viewer to reset rlv settings
//llOwnerSay("TP settings: " + llDumpList2String(lSettings, ","));
integer iSettingsLength = llGetListLength(g_lSettings);
//Debug("Applying "+(string)(iSettingsLength/3)+" settings");
if (iSettingsLength > 0) {
list lTempSettings;
string sTempRLVSetting;
string sTempRLVValue;
integer n;
list lNewList;
for (n = 0; n < iSettingsLength; n = n + 3) {
sTempRLVSetting=llList2String(g_lSettings, n+1);
sTempRLVValue=llList2String(g_lSettings, n + 2);
lNewList += [ sTempRLVSetting+ "=" + sTempRLVValue];
if (sTempRLVValue!="y")lTempSettings+=[sTempRLVSetting,sTempRLVValue];
if (sTempRLVSetting=="unsit" && sTempRLVValue=="n") { //permission to unsit revoked
llSetTimerEvent(1.0); //do timer event now to store name of seat, and start monitoring sitting
g_iRestoreCount = 20;
g_iSitMode=TRUE;
//Debug("Got deny unsit command, re-sit if necessary");
}
}
//output that string to viewer
llMessageLinked(LINK_SET, RLV_CMD, llDumpList2String(lNewList, ","), NULL_KEY);
}
}
SaveSettings() { //save to DB
list lCategorySettings;
while (llGetListLength(g_lChangedCategories)){
lCategorySettings=[];
integer numSettings=llGetListLength(g_lSettings);
while (numSettings){ //go through the list of all settings, and pull out any belonging to this category, store in temp list.
numSettings -= 3;
string sCategory=llList2String(g_lSettings,numSettings);
if (sCategory==llList2String(g_lChangedCategories,-1)){
lCategorySettings+=[llList2String(g_lSettings,numSettings+1),llList2String(g_lSettings,numSettings+2)];
}
}
if (llGetListLength(lCategorySettings)>0) llMessageLinked(LINK_SET, LM_SETTING_SAVE, llList2String(g_lChangedCategories,-1) + "List=" + llDumpList2String(lCategorySettings, ","), "");
else llMessageLinked(LINK_SET, LM_SETTING_DELETE, llList2String(g_lChangedCategories,-1) + "List", "");
g_lChangedCategories=llDeleteSubList(g_lChangedCategories,-1,-1);
}
}
ClearSettings(string _category) { //clear local settings list, delte from settings db
integer numSettings=llGetListLength(g_lSettings);
while (numSettings){
numSettings-=3;
string sCategory=llList2String(g_lSettings,numSettings);
if (sCategory==_category || _category==""){
g_lSettings=llDeleteSubList(g_lSettings,numSettings,numSettings+2);
if (! ~llListFindList(g_lChangedCategories,[sCategory])) g_lChangedCategories+=sCategory; //if there are no previous changes for thi category, add the category to the list of changed ones
}
}
SaveSettings();
//main RLV script will take care of sending @clear to viewer
}
UserCommand(integer iNum, string sStr, key kID, string fromMenu) {
if (iNum > COMMAND_WEARER) return; //nothing for lower than wearer here
sStr=llStringTrim(sStr,STRING_TRIM);
string sStrLower=llToLower(sStr);
if (sStrLower == "sitmenu" || sStrLower == "menu sit") Menu(kID, iNum, "rlvsit_");
else if (sStrLower == "rlvtp" || sStrLower == "menu travel") Menu(kID, iNum, "rlvtp_");
else if (sStrLower == "rlvtalk" || sStrLower == "menu talk") Menu(kID, iNum, "rlvtalk_");
else if (sStrLower == "rlvtouch" || sStrLower == "menu touch") Menu(kID, iNum, "rlvtouch_");
else if (sStrLower == "rlvmisc" || sStrLower == "menu misc") Menu(kID, iNum, "rlvmisc_");
else if (sStrLower == "rlvview" || sStrLower == "menu view") Menu(kID, iNum, "rlvview_");
else if (sStrLower == "sitnow") {
if (!g_iRLVOn) {
Notify(kID, "RLV features are now disabled in this " + CTYPE + ". You can enable those in RLV submenu. Opening it now.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu RLV", kID);
} else {
//give menu of nearby objects that have scripts in them
//this assumes that all the objects you may want to force your sub to sit on
//have scripts in them
string sName="FindSeatMenu";
key kMenuID = llGenerateKey();
llMessageLinked(LINK_THIS, SENSORDIALOG, (string)kID + "|Pick the object on which you want the sub to sit. If it's not in the list, have the sub move closer and try again.\n|0|``"+(string)(SCRIPTED|PASSIVE)+"`"+(string)g_fScanRange+"`"+(string)PI + "|BACK|" + (string)iNum, kMenuID);
integer iIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iIndex) g_lMenuIDs = llListReplaceList(g_lMenuIDs, [kID, kMenuID, sName], iIndex, iIndex + g_iMenuStride - 1); //we've alread given a menu to this user. overwrite their entry
else g_lMenuIDs += [kID, kMenuID, sName]; //we've not already given this user a menu. append to list
}
} else {
//do simple pass through for chat commands
//since more than one RLV command can come on the same line, loop through them
list lItems = llParseString2List(sStr, [","], []);
integer n;
integer iStop = llGetListLength(lItems);
list lChange; //list containing the categories with changed settings
for (n = 0; n < iStop; n++) {
//split off the parameters (anything after a : or =)
//and see if the thing being set concerns us
string sThisItem = llList2String(lItems, n);
string sBehavior = llList2String(llParseString2List(sThisItem, ["="], []), 0);
integer iBehaviourIndex=llListFindList(g_lRLVcmds, [sBehavior]);
if (sStr == "standnow") {
if (iNum == COMMAND_WEARER) llOwnerSay("Sorry, but RLV commands may only be given by owner, secowner, or group (if set).");
else {
sStr = "unsit=force";
if (GetSetting("rlvsit_","unsit")=="n") sStr = "unsit=y,unsit=force,unsit=n";
g_sSitTarget="";
//Debug("Removing tracked sit target");
llMessageLinked(LINK_SET, RLV_CMD, sStr, NULL_KEY);
}
}
else if (~iBehaviourIndex) {
string sCategory=llList2String(g_lRLVcmds,iBehaviourIndex-1);
if (llGetSubString(sCategory,-1,-1)=="_"){ //
//Debug(sBehavior+" is a behavior that we handle, from the "+sCategory+" category.");
//filter commands from wearer, if wearer is not owner
if (iNum == COMMAND_WEARER) llOwnerSay("Sorry, but RLV commands may only be given by owner, secowner, or group (if set).");
else {
string sOption = llList2String(llParseString2List(sThisItem, ["="], []), 0);
string sValue = llList2String(llParseString2List(sThisItem, ["="], []), 1);
integer iIndex = llListFindList(g_lSettings, [sCategory,sOption]);
SetSetting(sCategory, sOption, sValue);
}
}
} else if (~llListFindList(g_lIdmtCmds,[llList2String(llParseString2List(sThisItem,[":","="],[]),0)])) {
//Debug(sBehavior+" is an immediate command that we handle");
//filter commands from wearer, if wearer is not owner
if (iNum == COMMAND_WEARER) llOwnerSay("Sorry, but RLV commands may only be given by owner, secowner, or group (if set).");
else llMessageLinked(LINK_SET, RLV_CMD, sStr, NULL_KEY);
}
else if (sBehavior == "clear" && iNum == COMMAND_OWNER) ClearSettings("");
//else Debug("We don't handle "+sBehavior);
}
if (llGetListLength(g_lChangedCategories)) {
UpdateSettings();
SaveSettings();
}
if (fromMenu!="") Menu(kID, iNum, fromMenu);
}
}
default {
on_rez(integer iParam) {
llSetTimerEvent(0.0); //timer will be called by recieved settings as necessary
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
//llSetTimerEvent(1.0); //timer will be called by recieved settings as necessary
//Debug("Starting");
}
timer() {
if (!g_iRLVOn) return; // Nothing to do if RLV isn't enabled
if (GetSetting("rlvsit_","unsit")!="n") { //we are allowed to stand, so switch off timer and return
llSetTimerEvent(0.0);
g_sSitTarget = "";
//Debug("we are allowed to stand, so switch off timer, remove tracked sit target");
} else { //banned from standing up
key kSitKey = llList2Key(llGetObjectDetails(g_kWearer, [OBJECT_ROOT]), 0);
if (g_iSitMode) { // Restore mode. Find the seat and sit in it
llSetTimerEvent(g_fRestoreDelay);
if (g_sSitTarget == "") { //If we have no seat, go back to monitoring
g_iSitMode = 0;
//Debug("You weren't sitting on anything");
} else if ((string)kSitKey == g_sSitTarget) { //sat in the right seat, go back to monitoring
g_iSitMode = 0;
//Debug("You're in the right seat, go back to monitoring");
} else if (g_iRestoreCount > 0) { // Count down retries...
llOwnerSay("You should be sitting on " + llKey2Name((key)g_sSitTarget));
g_iRestoreCount--;
string sSittpValue = GetSetting("rlvsit_","sittp"); // Save the value of sittp as we need to temporarily enable it for forcesit
llMessageLinked(LINK_THIS, RLV_CMD, "sittp=y,sit:" + g_sSitTarget + "=force,sittp=" + sSittpValue, NULL_KEY);
} else {
llOwnerSay("Couldn't re-seat you on " + llKey2Name((key)g_sSitTarget));
//Debug("Removing tracked sit target");
g_iSitMode = 0;
g_sSitTarget = "";
}
} else { //monitoring the sub's sitting activity
llSetTimerEvent(g_fPollDelay);
if (kSitKey == g_kWearer) { //store "not sitting down"
g_sSitTarget = "";
//Debug("Not sitting down");
} else {
g_sSitTarget = (string)kSitKey; //store ID of your seat.
//Debug("Sitting on " + llKey2Name((key)g_sSitTarget));
}
}
}
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu) {
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|Sit", "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|Travel", "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|Talk", "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|Touch", "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|Misc", "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|View", "");
}
else if (iNum >= COMMAND_OWNER && iNum <= COMMAND_EVERYONE) UserCommand(iNum, sStr, kID, "");
else if (iNum == LM_SETTING_RESPONSE) {
//this is tricky since our db value contains equals signs
//split string on both comma and equals sign
//first see if this is the token we care about
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer iChange = FALSE;
string category=llList2String(llParseString2List(sToken,["_"],[]),0)+"_";
if (~llListFindList(g_lMenuHelpMap,[category])){
//Debug("got settings token: "+category);
sToken=llList2String(llParseString2List(sToken,["_"],[]),1);
if (sToken == "List") {
//throw away first element
//everything else is real settings (should be even number)
ClearSettings(category);
list lNewSettings = llParseString2List(sValue, [","], []);
while (llGetListLength(lNewSettings)){
list lTempSettings=[category,llList2String(lNewSettings,-2),llList2String(lNewSettings,-1)];
//Debug(llDumpList2String(lTempSettings," - "));
g_lSettings+=lTempSettings;
lNewSettings=llDeleteSubList(lNewSettings,-2,-1);
}
UpdateSettings();
}
}
else if (sToken == "Global_CType") CTYPE = sValue;
//else Debug("not my token: "+category);
} else if (iNum == RLV_REFRESH) { //rlvmain just started up. Tell it about our current restrictions
g_iRLVOn = TRUE;
UpdateSettings();
}
else if (iNum == RLV_CLEAR) ClearSettings(""); //clear db and local settings list
else if (iNum == RLV_OFF) g_iRLVOn=FALSE; // rlvoff -> we have to turn the menu off too
else if (iNum == RLV_ON) g_iRLVOn=TRUE; // rlvon -> we have to turn the menu on again
else if (iNum == DIALOG_RESPONSE) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex) { //it's one of our menus
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
string sMenu=llList2String(g_lMenuIDs, iMenuIndex + 1);
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenu == "FindSeatMenu") {
if (sMessage==UPMENU) Menu(kAv, iAuth, "rlvsit_");
else if ((key) sMessage) {
//Debug("Sending \""+"sit:" + sMessage + "=force\" to "+(string)kAv+" with auth "+(string)iAuth);
UserCommand(iAuth, "sit:" + sMessage + "=force", kAv, "rlvsit_");
}
} else {
if (sMessage == UPMENU) llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
else if (sMessage == "SitNow") UserCommand(iAuth, "sitnow", kAv, "rlvsit_");
else if (sMessage == "StandNow") UserCommand(iAuth, "standnow", kAv, "rlvsit_");
else {
//we got a command to enable or disable something, like "Enable LM"
//get the actual command name by looking up the pretty name from the message
list lParams = llParseString2List(sMessage, [" "], []);
string sSwitch = llList2String(lParams, 0);
string sCmd = llDumpList2String(llDeleteSubList(lParams,0,0)," ");
integer iIndex = llListFindList(g_lRLVcmds, [sCmd]);
if (sCmd == "All") {
//handle the "Allow All" and "Forbid All" commands
string ONOFF;
//decide whether we need to switch to "y" or "n"
if (sSwitch == TURNOFF) ONOFF = "n"; //enable all functions (ie, remove all restrictions
else if (sSwitch == TURNON) ONOFF = "y";
//loop through rlvcmds to create list
string sOut;
integer n;
integer iStop = llGetListLength(g_lRLVcmds);
for (n = 0; n < iStop; n+=g_lRLVcmds_stride) {
if (llList2String(g_lRLVcmds,n)==sMenu){
if (sOut != "") sOut += ","; //prefix all but the first value with a comma, so we have a comma-separated list
sOut += llList2String(g_lRLVcmds, n+1) + "=" + ONOFF;
}
}
UserCommand(iAuth, sOut, kAv, sMenu);
} else if ((~iIndex) && llList2String(g_lRLVcmds,iIndex-2)==sMenu) {
string sOut = llList2String(g_lRLVcmds, iIndex-1);
sOut += "=";
if (sSwitch == TURNON) sOut += "y";
else if (sSwitch == TURNOFF) sOut += "n";
//send rlv command out through auth system as though it were a chat command, just to make sure person who said it has proper authority
UserCommand(iAuth, sOut, kAv, sMenu);
}
}
}
}
} else if (iNum == DIALOG_TIMEOUT) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
}
/*
changed(integer iChange)
{
if (iChange & CHANGED_REGION) {
if (g_iProfiled){
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

View File

@@ -0,0 +1,975 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - rlvundress //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//gives menus for clothing and attachment, stripping and locking
//Satomi Ahn, Medea Destiny
string g_sSubMenu = "Un/Dress";
string g_sParentMenu = "RLV";
//list g_lChildren = ["Rem Clothing"]; //,"LockClothing","LockAttachment"];//,"LockClothing","UnlockClothing"];
list g_lSubMenus= [];
string SELECT_CURRENT = "*InFolder";
string SELECT_RECURS= "*Recursively";
list g_lRLVcmds = ["attach","detach","remoutfit", "addoutfit","remattach","addattach"];
integer g_iSmartStrip=FALSE; //use @detachallthis isntead of remove
string SMARTON="☐ SmartStrip";
string SMARTOFF = "☒ SmartStrip";
//string SMARTHELP = "Help";
string g_sSmartHelpCard = "OpenCollar Guide";
string g_sSmartToken="smartstrip";
//key g_kSmartUser; //we store the last person to select if they are not wearer/owner, so that it can be switched on for current user without changing setting.
list g_lSettings;//2-strided list in form of [option, param]
string CTYPE = "collar";
string WEARERNAME;
list LOCK_CLOTH_POINTS = [
"Gloves",
"Jacket",
"Pants",
"Shirt",
"Shoes",
"Skirt",
"Socks",
"Underpants",
"Undershirt",
"Skin",
"Eyes",
"Hair",
"Shape",
"Alpha",
"Tattoo",
"Physics"
];
list DETACH_CLOTH_POINTS = [
"Gloves",
"Jacket",
"Pants",
"Shirt",
"Shoes",
"Skirt",
"Socks",
"Underpants",
"Undershirt",
"xx", //"skin", those are not to be detached, so we ignore them later
"xx", //"eyes", those are not to be detached, so we ignore them later
"xx", //"hair", those are not to be detached, so we ignore them later
"xx", //"shape", those are not to be detached, so we ignore them later
"Alpha",
"Tattoo",
"Physics"
];
list ATTACH_POINTS = [//these are ordered so that their indices in the list correspond to the numbers returned by llGetAttached
"None",
"Chest",
"Skull",
"Left Shoulder",
"Right Shoulder",
"Left Hand",
"Right Hand",
"Left Foot",
"Right Foot",
"Spine",
"Pelvis",
"Mouth",
"Chin",
"Left Ear",
"Right Ear",
"Left Eyeball",
"Right Eyeball",
"Nose",
"R Upper Arm",
"R Forearm",
"L Upper Arm",
"L Forearm",
"Right Hip",
"R Upper Leg",
"R Lower Leg",
"Left Hip",
"L Upper Leg",
"L Lower Leg",
"Stomach",
"Left Pec",
"Right Pec",
"Center 2",
"Top Right",
"Top",
"Top Left",
"Center",
"Bottom Left",
"Bottom",
"Bottom Right",
"Neck",
"Avatar Center"
];
//MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; //RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
string UPMENU = "BACK";
string ALL = " ALL";
string TICKED = "☒ ";
string UNTICKED = "☐ ";
//variables for storing our various dialog ids
key g_kMainID;
key g_kClothID;
key g_kAttachID;
key g_kLockID;
key g_kLockAttachID;
integer g_iRLVTimeOut = 60;
integer g_iClothRLV = 78465;
integer g_iAttachRLV = 78466;
integer g_iListener;
key g_kMenuUser; // id of the avatar who will get the next menu after asynchronous response from RLV
integer g_iMenuAuth; // auth level of that user
integer g_iRLVOn = FALSE;
list g_lLockedItems; // list of locked clothes
list g_lLockedAttach; // list of locked attachmemts
key g_kWearer;
string g_sScript;
integer g_iAllLocked = 0; //1=all clothes are locked on
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
MainMenu(key kID, integer iAuth)
{
//string sPrompt = "\n\nNote: Keep in mind that mesh clothing is worn as attachments and in most cases together with alpha masks which are worn as clothing layers. It is recommended to explore the possibilities of #RLV Folders for a smooth un/dressing experience.\n";
string sPrompt = "\nwww.opencollar.at/undress\n\nNOTE: Many clothes, and almost all mesh, mixes layers and attachments. With a properly set up #RLV folder";
//sPrompt+=" (click "+SMARTHELP+" for info)";
sPrompt+=", the SmartStrip option will allow these to be removed automatically. Otherwise, it is recommended to explore the #RLV Folders menu for a smoother un/dressing experience.";
list lButtons;
if (g_iAllLocked) //are all clothing and attachments locked?
{
sPrompt += "\n all clothes and attachments are currently locked.";
//skip the LockClothing and the LockAttachment buttons
lButtons += ["☒ Lock All"];
}
else
{
lButtons += ["☐ Lock All"];
lButtons += ["Rem Clothing"];
lButtons += ["Lock Clothing"];
}
if(g_iSmartStrip==TRUE)
{
//sPrompt += "\nSmartStrip is on.";
lButtons += SMARTOFF;
}
else
{
lButtons += SMARTON;
//sPrompt += "\nSmartStrip is off.";
}
lButtons += ["Rem Attachment","Lock Attachment"];
//lButtons+=SMARTHELP;
g_kMainID = Dialog(kID, sPrompt, lButtons+g_lSubMenus, [UPMENU], 0, iAuth);
}
QueryClothing(key kAv, integer iAuth)
{ //open listener
g_iListener = llListen(g_iClothRLV, "", g_kWearer, "");
//start timer
llSetTimerEvent(g_iRLVTimeOut);
//send rlvcmd
llMessageLinked(LINK_SET, RLV_CMD, "getoutfit=" + (string)g_iClothRLV, NULL_KEY);
g_kMenuUser = kAv;
g_iMenuAuth = iAuth;
}
ClothingMenu(key kID, string sStr, integer iAuth)
{
//str looks like 0110100001111
//loop through CLOTH_POINTS, look at chaClothingr of str for each
//for each 1, add capitalized button
string sPrompt = "Select an article of clothing to remove.";
list lButtons = [];
integer iStop = llGetListLength(DETACH_CLOTH_POINTS);
integer n;
for (n = 0; n < iStop; n++)
{
integer iWorn = (integer)llGetSubString(sStr, n, n);
list item = [llList2String(DETACH_CLOTH_POINTS, n)];
if (iWorn && llListFindList(g_lLockedItems,item) == -1)
{
if (llList2String(item,0)!="xx")
lButtons += item;
}
}
g_kClothID = Dialog(kID, sPrompt, lButtons, ["Attachments", UPMENU], 0, iAuth);
}
LockMenu(key kID, integer iAuth)
{
string sPrompt = "Select an article of clothing to un/lock.";
list lButtons;
if (llListFindList(g_lLockedItems,[ALL]) == -1)
lButtons += [UNTICKED+ALL];
else lButtons += [TICKED+ALL];
integer iStop = llGetListLength(LOCK_CLOTH_POINTS);
integer n;
for (n = 0; n < iStop; n++)
{
string sCloth = llList2String(LOCK_CLOTH_POINTS, n);
if (llListFindList(g_lLockedItems,[sCloth]) == -1)
lButtons += [UNTICKED+sCloth];
else lButtons += [TICKED+sCloth];
}
g_kLockID = Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
QueryAttachments(key kAv, integer iAuth)
{ //open listener
g_iListener = llListen(g_iAttachRLV, "", g_kWearer, "");
//start timer
llSetTimerEvent(g_iRLVTimeOut);
//send rlvcmd
llMessageLinked(LINK_SET, RLV_CMD, "getattach=" + (string)g_iAttachRLV, NULL_KEY);
g_kMenuUser = kAv;
g_iMenuAuth = iAuth;
}
LockAttachmentMenu(key kID, integer iAuth)
{
string sPrompt = "Select an attachment to un/lock.";
list lButtons;
//put tick marks next to locked things
integer iStop = llGetListLength(ATTACH_POINTS);
integer n;
for (n = 1; n < iStop; n++) //starting at 1 as "None" cannot be locked
{
string sAttach = llList2String(ATTACH_POINTS, n);
if (llListFindList(g_lLockedAttach,[sAttach]) == -1)
lButtons += [UNTICKED+sAttach];
else lButtons += [TICKED+sAttach];
}
g_kLockAttachID = Dialog(kID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
DetachMenu(key kID, string sStr, integer iAuth)
{
//remember not to add button for current object
//str looks like 0110100001111
//loop through CLOTH_POINTS, look at char of str for each
//for each 1, add capitalized button
string sPrompt = "Select an attachment to remove.";
//prevent detaching the collar itself
integer myattachpoint = llGetAttached();
list lButtons;
integer iStop = llGetListLength(ATTACH_POINTS);
integer n;
for (n = 0; n < iStop; n++)
{
if (n != myattachpoint)
{
integer iWorn = (integer)llGetSubString(sStr, n, n);
if (iWorn)
{
lButtons += [llList2String(ATTACH_POINTS, n)];
}
}
}
g_kAttachID = Dialog(kID, sPrompt, lButtons, ["Clothing", UPMENU], 0, iAuth);
}
UpdateSettings()
{ //build one big string from the settings list
//llOwnerSay("TP settings: " + llDumpList2String(g_lSettings, ","));
integer iSettingsLength = llGetListLength(g_lSettings);
if (iSettingsLength > 0)
{
g_lLockedItems=[];
g_lLockedAttach=[];
integer n;
list lNewList;
for (n = 0; n < iSettingsLength; n = n + 2)
{
list sOption=llParseString2List(llList2String(g_lSettings, n),[":"],[]);
string sValue=llList2String(g_lSettings, n + 1);
//Debug(llList2String(g_lSettings, n) + "=" + sValue);
lNewList += [llList2String(g_lSettings, n) + "=" + llList2String(g_lSettings, n + 1)];
if (llGetListLength(sOption)==1 && llList2String(sOption,0)=="remoutfit")
{
if (!~llListFindList(g_lLockedItems, [ALL])) g_lLockedItems += [ALL];
}
else if (llGetListLength(sOption)==2 && ~llSubStringIndex(llList2String(sOption, 0), "outfit"))
{
if (!~llListFindList(g_lLockedItems, [llList2String(sOption, 1)]))
g_lLockedItems += [llList2String(sOption,1)];
}
else if (llGetListLength(sOption)==2 && ~llSubStringIndex(llList2String(sOption, 0), "tach"))
{
if (!~llListFindList(g_lLockedAttach, [llList2String(sOption,1)]))
g_lLockedAttach += [llList2String(sOption,1)];
}
}
//output that string to viewer
llMessageLinked(LINK_SET, RLV_CMD, llDumpList2String(lNewList, ","), NULL_KEY);
//Debug("Loaded locks: Cloth- " + llList2CSV(g_lLockedItems) + ": Attach- " + llList2CSV(g_lLockedAttach));
}
}
ClearSettings()
{ //clear settings list
g_lSettings = [];
//clear the list of locked items
g_lLockedItems = [];
g_lLockedAttach=[];
SaveLockAllFlag(0);
//remove tpsettings from DB
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "List", "");
//main RLV script will take care of sending @clear to viewer
}
SaveLockAllFlag(integer iSetting)
{
if (g_iAllLocked == iSetting)
{
return;
}
g_iAllLocked = iSetting;
if(iSetting > 0)
{
//save the flag to the database
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "LockAll=Y", "");
}
else
{
//delete the flag from the database
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "LockAll", "");
}
}
DoLockAll(key kID)
{
llMessageLinked(LINK_SET, RLV_CMD, "addattach=n,remattach=n,remoutfit=n,addoutfit=n", NULL_KEY);
}
DoUnlockAll(key kID)
{
llMessageLinked(LINK_SET, RLV_CMD, "addattach=y,remattach=y,remoutfit=y,addoutfit=y", NULL_KEY);
}
// returns TRUE if eligible (AUTHED link message number)
integer UserCommand(integer iNum, string sStr, key kID) // here iNum: auth value, sStr: user command, kID: avatar id
{
if (iNum == COMMAND_EVERYONE) return TRUE; // No command for people with no privilege in this plugin.
else if (iNum > COMMAND_EVERYONE || iNum < COMMAND_OWNER) return FALSE; // sanity check
list lParams = llParseString2List(sStr, [":", "=", " "], []);
string sCommand = llList2String(lParams, 0);
//Debug(sStr + " ## " + sCommand);
if (sStr == "menu " + g_sSubMenu)
{//give this plugin's menu to kID
MainMenu(kID, iNum);
}
else if (sCommand == "smartstrip")
{
if(iNum==COMMAND_OWNER || iNum == COMMAND_WEARER)
{
string sOpt=llList2String(lParams,1);
if(sOpt == "on")
{
g_iSmartStrip=TRUE;
llMessageLinked(LINK_SET,LM_SETTING_SAVE, g_sScript + g_sSmartToken +"=1","");
}
else
{
g_iSmartStrip=FALSE;
llMessageLinked(LINK_SET,LM_SETTING_DELETE, g_sScript + g_sSmartToken,"");
}
}
else Notify(kID,"This requires a properly set-up outfit, only wearer or owner can turn it on.", FALSE);
}
else if (sCommand == "strip")
{
string sOpt=llList2String(lParams,1);
if(sOpt=="all")
{
if(g_iSmartStrip==TRUE)
{
integer x=14; //let's not strip tattoos and physics layers;
while(x)
{
if(x==13) x=9; //skip hair,skin,shape,eyes
--x;
string sItem=llToLower(llList2String(DETACH_CLOTH_POINTS,x));
llMessageLinked(LINK_SET, RLV_CMD, "detachallthis:"+ sItem +"=force",NULL_KEY);
}
}
llMessageLinked(LINK_SET, RLV_CMD, "remoutfit=force", NULL_KEY);
return TRUE;
}
sOpt = llToLower(sOpt);
string test=llToUpper(llGetSubString(sOpt,0,0))+llGetSubString(sOpt,1,-1);
if(llListFindList(DETACH_CLOTH_POINTS,[test])==-1) return FALSE;
//send the RLV command to remove it.
if(g_iSmartStrip==TRUE) llMessageLinked(LINK_SET, RLV_CMD , "detachallthis:" + sOpt + "=force", NULL_KEY);
llMessageLinked(LINK_SET, RLV_CMD, "remoutfit:" + sOpt + "=force", NULL_KEY); //yes, this isn't an else. We do it in case the item isn't in #RLV.
}
else if (llListFindList(g_lRLVcmds, [sCommand]) != -1)
{ //we've received an RLV command that we control. only execute if not sub
if (iNum == COMMAND_WEARER)
{
llOwnerSay("Sorry, but RLV commands may only be given by owner, secowner, or group (if set).");
}
else
{
llMessageLinked(LINK_SET, RLV_CMD, sStr, NULL_KEY);
string sOption = llList2String(llParseString2List(sStr, ["="], []), 0);
string sParam = llList2String(llParseString2List(sStr, ["="], []), 1);
integer iIndex = llListFindList(g_lSettings, [sOption]);
string opt1 = llList2String(llParseString2List(sOption, [":"], []), 0);
string opt2 = llList2String(llParseString2List(sOption, [":"], []), 1);
if (sParam == "n")
{
if (iIndex == -1)
{ //we don't alread have this exact setting. add it
g_lSettings += [sOption, sParam];
}
else
{ //we already have a setting for this option. update it.
g_lSettings = llListReplaceList(g_lSettings, [sOption, sParam], iIndex, iIndex + 1);
}
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "List=" + llDumpList2String(g_lSettings, ","), "");
}
else if (sParam == "y")
{
if (iIndex != -1)
{ //we already have a setting for this option. remove it.
g_lSettings = llDeleteSubList(g_lSettings, iIndex, iIndex + 1);
}
if (llGetListLength(g_lSettings)>0)
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + "List=" + llDumpList2String(g_lSettings, ","), "");
else
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript + "List", "");
}
}
}
else if (sStr == "lockclothingmenu")
{
if (!g_iRLVOn)
{
Notify(kID, "RLV features are now disabled in this " + CTYPE + ". You can enable those in RLV submenu. Opening it now.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu RLV", kID);
return TRUE;
}
LockMenu(kID, iNum);
}
else if (sStr == "lockattachmentmenu")
{
if (!g_iRLVOn)
{
Notify(kID, "RLV features are now disabled in this " + CTYPE + ". You can enable those in RLV submenu. Opening it now.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu RLV", kID);
return TRUE;
}
LockAttachmentMenu(kID, iNum);
}
else if (llGetSubString(sStr, 0, 11) == "lockclothing") {
string sMessage = llGetSubString(sStr, 13, -1);
if (iNum == COMMAND_WEARER)
{
Notify(kID, "Sorry you need owner privileges for locking clothes.", FALSE);
}
else if (sMessage==ALL||sStr== "lockclothing")
{
g_lLockedItems += [ALL];
Notify(kID, WEARERNAME+"'s clothing has been locked.", TRUE);
llMessageLinked(LINK_SET, iNum, "remoutfit=n", kID);
llMessageLinked(LINK_SET, iNum, "addoutfit=n", kID);
}
else if (llListFindList(LOCK_CLOTH_POINTS,[sMessage])!=-1)
{
g_lLockedItems += sMessage;
Notify(kID, WEARERNAME+"'s "+sMessage+" has been locked.", TRUE);
llMessageLinked(LINK_SET, iNum, "remoutfit:" + sMessage + "=n", kID);
llMessageLinked(LINK_SET, iNum, "addoutfit:" + sMessage + "=n", kID);
}
else Notify(kID, "Sorry you must either specify a cloth name or not use a parameter (which locks all the clothing layers).", FALSE);
}
else if (llGetSubString(sStr, 0, 13) == "unlockclothing")
{
if (iNum == COMMAND_WEARER)
{
Notify(kID, "Sorry you need owner privileges for unlocking clothes.", FALSE);
}
else
{
string sMessage = llGetSubString(sStr, 15, -1);
if (sMessage==ALL||sStr=="unlockclothing")
{
llMessageLinked(LINK_SET, iNum, "remoutfit=y", kID);
llMessageLinked(LINK_SET, iNum, "addoutfit=y", kID);
Notify(kID, WEARERNAME+"'s clothing has been unlocked.", TRUE);
integer iIndex = llListFindList(g_lLockedItems,[ALL]);
if (iIndex!=-1) g_lLockedItems = llDeleteSubList(g_lLockedItems,iIndex,iIndex);
}
else
{
llMessageLinked(LINK_SET, iNum, "remoutfit:" + sMessage + "=y", kID);
llMessageLinked(LINK_SET, iNum, "addoutfit:" + sMessage + "=y", kID);
Notify(kID, WEARERNAME+"'s "+sMessage+" has been unlocked.", TRUE);
integer iIndex = llListFindList(g_lLockedItems,[sMessage]);
if (iIndex!=-1) g_lLockedItems = llDeleteSubList(g_lLockedItems,iIndex,iIndex);
}
}
}
else if (llGetSubString(sStr, 0, 13) == "lockattachment")
{
string sPoint = llGetSubString(sStr, 15, -1);
if (iNum == COMMAND_WEARER)
{
Notify(kID, "Sorry you need owner privileges for locking attachments.", FALSE);
}
else if (llListFindList(ATTACH_POINTS ,[sPoint])!=-1)
{
if (llListFindList(g_lLockedAttach, [sPoint]) == -1) g_lLockedAttach += [sPoint];
Notify(kID, WEARERNAME+"'s "+sPoint+" attachment point is now locked.", TRUE);
llMessageLinked(LINK_SET, iNum, "detach:" + sPoint + "=n", kID);
}
else
{
Notify(kID, "Sorry you must either specify a attachment name.", FALSE);
}
}
else if (sStr == "lockall")
{
if (iNum == COMMAND_WEARER)
{
Notify(kID, "Sorry you need owner privileges for locking attachments.", FALSE);
}
else
{
DoLockAll(kID); //lock all clothes and attachment points
SaveLockAllFlag(1);
Notify(kID, WEARERNAME+"'s clothing and attachments have been locked.", TRUE);
}
}
else if (sStr == "unlockall")
{
if (iNum == COMMAND_WEARER)
{
Notify(kID, "Sorry you need owner privileges for unlocking attachments.", FALSE);
}
else
{
DoUnlockAll(kID); //unlock all clothes and attachment points
SaveLockAllFlag(0);
Notify(kID, WEARERNAME+"'s clothing and attachments have been unlocked.", TRUE);
}
}
else if (llGetSubString(sStr, 0, 15) == "unlockattachment")
{
if (iNum == COMMAND_WEARER)
{
Notify(kID, "Sorry you need owner privileges for unlocking attachments.", FALSE);
}
else
{
string sMessage = llGetSubString(sStr, 17, -1);
{
llMessageLinked(LINK_SET, iNum, "detach:" + sMessage + "=y", kID);
Notify(kID, WEARERNAME+"'s "+sMessage+" has been unlocked.", TRUE);
integer iIndex = llListFindList(g_lLockedAttach,[sMessage]);
if (iIndex!=-1) g_lLockedAttach = llDeleteSubList(g_lLockedAttach,iIndex,iIndex);
}
}
}
//else if (sStr == "refreshmenu")
//{
// g_lSubMenus = [];
// llMessageLinked(LINK_SET, MENUNAME_REQUEST, g_sSubMenu, "");
//}
else if (sStr == "undress")
{
if (!g_iRLVOn)
{
Notify(kID, "RLV features are now disabled in this " + CTYPE + ". You can enable those in RLV submenu. Opening it now.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu RLV", kID);
return TRUE;
}
MainMenu(kID, iNum);
}
else if (sStr == "clothing")
{
if (!g_iRLVOn)
{
Notify(kID, "RLV features are now disabled in this " + CTYPE + ". You can enable those in RLV submenu. Opening it now.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu RLV", kID);
return TRUE;
}
QueryClothing(kID, iNum);
}
else if (sStr == "attachment")
{
if (!g_iRLVOn)
{
Notify(kID, "RLV features are now disabled in this " + CTYPE + ". You can enable those in RLV submenu. Opening it now.", FALSE);
llMessageLinked(LINK_SET, iNum, "menu RLV", kID);
return TRUE;
}
QueryAttachments(kID, iNum);
}
// rlvoff -> we have to turn the menu off too
else if (iNum>=COMMAND_OWNER && sStr=="rlvoff") g_iRLVOn=FALSE;
return TRUE;
}
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "rlvundress_";
g_kWearer = llGetOwner();
WEARERNAME = llKey2Name(g_kWearer); //quick and dirty default, will get replaced by value from settings
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
//the command was given by either owner, secowner, group member, or wearer
if (UserCommand(iNum, sStr, kID)) return;
// rlvoff -> we have to turn the menu off too
else if (iNum == RLV_OFF) g_iRLVOn=FALSE;
// rlvon -> we have to turn the menu on again
else if (iNum == RLV_ON) g_iRLVOn=TRUE;
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
g_lSubMenus = []; //flush submenu buttons
llMessageLinked(LINK_SET, MENUNAME_REQUEST, g_sSubMenu, "");
}
else if (iNum == LM_SETTING_RESPONSE)
{ //this is tricky since our db value contains equals signs
//split string on both comma and equals sign
//first see if this is the token we care about
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
if (sToken == "LockAll")
{
g_iAllLocked = 1;
DoLockAll(kID);
}
else if (sToken == "List")
{
g_lSettings = llParseString2List(sValue, [","], []);
UpdateSettings();
}
else if (sToken == g_sSmartToken)
{
g_iSmartStrip=TRUE;
}
}
else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken=="Global_WearerName") WEARERNAME=sValue;
}
else if (iNum == RLV_REFRESH)
{//rlvmain just started up. Tell it about our current restrictions
g_iRLVOn = TRUE;
if(g_iAllLocked > 0) //is everything locked?
DoLockAll(kID); //lock everything on a RLV_REFRESH
UpdateSettings();
}
else if (iNum == RLV_CLEAR)
{ //clear db and local settings list
ClearSettings();
}
else if (iNum == MENUNAME_RESPONSE)
{
list lParams = llParseString2List(sStr, ["|"], []);
if (llList2String(lParams, 0)==g_sSubMenu)
{
string child = llList2String(lParams, 1);
//only add submenu if not already present
if (llListFindList(g_lSubMenus, [child]) == -1)
{
g_lSubMenus += [child];
g_lSubMenus = llListSort(g_lSubMenus, 1, TRUE);
}
}
}
else if (iNum == MENUNAME_REMOVE)
{
//sStr should be in form of parentmenu|childmenu
list lParams = llParseString2List(sStr, ["|"], []);
string child = llList2String(lParams, 1);
if (llList2String(lParams, 0)==g_sSubMenu)
{
integer iIndex = llListFindList(g_lSubMenus, [child]);
//only remove if it's there
if (iIndex != -1)
{
g_lSubMenus = llDeleteSubList(g_lSubMenus, iIndex, iIndex);
}
}
}
else if (iNum == DIALOG_RESPONSE)
{
if (llListFindList([g_kMainID, g_kClothID, g_kAttachID, g_kLockID, g_kLockAttachID], [kID]) != -1)
{//it's one of our menus
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (kID == g_kMainID)
{
if (sMessage == UPMENU) llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
else if (sMessage == "Rem Clothing") QueryClothing(kAv, iAuth);
else if (sMessage == "Rem Attachment") QueryAttachments(kAv, iAuth);
else if (sMessage == "Lock Clothing") LockMenu(kAv, iAuth);
else if (sMessage == "Lock Attachment") LockAttachmentMenu(kAv, iAuth);
else if (sMessage == "☐ Lock All") { UserCommand(iAuth, "lockall", kAv); MainMenu(kAv, iAuth); }
else if (sMessage == "☒ Lock All") { UserCommand(iAuth, "unlockall", kAv); MainMenu(kAv, iAuth); }
else if (sMessage == SMARTON) { UserCommand(iAuth, "smartstrip on",kAv); MainMenu(kAv, iAuth);}
else if (sMessage == SMARTOFF) { UserCommand(iAuth, "smartstrip off",kAv); MainMenu(kAv, iAuth);}
else if (sMessage == "Help") { llGiveInventory(kAv,g_sSmartHelpCard); MainMenu(kAv, iAuth);}
else if (llListFindList(g_lSubMenus,[sMessage]) != -1)
{
llMessageLinked(LINK_SET, iAuth, "menu " + sMessage, kAv);
}
else
{
//something went horribly wrong. We got a command that we can't find in the list
}
}
else if (kID == g_kClothID)
{
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else if (sMessage == "Attachments") QueryAttachments(kAv, iAuth);
else if (sMessage == ALL)
// SA:Â we can count ourselves lucky that all people who can see the menu have sufficient privileges for remoutfit commands!
// Note for people looking for the auth check: it would have been here, look no further!
{ //send the RLV command to remove it.
UserCommand(iAuth,"strip all",kAv); //See stuff in UserCommand. If we use smartstrip for all, then we'd jump to that here to save duplication, but otherwise it's a single LM, better to do it here than hit UserCommand.
// llMessageLinked(LINK_SET, RLV_CMD, "remoutfit=force", NULL_KEY);
//Return menu
//sleep fof a sec to let things detach
llSleep(0.5);
QueryClothing(kAv, iAuth);
}
else
{
UserCommand(iAuth,"strip "+sMessage,kAv);
llSleep(0.5);
QueryClothing(kAv, iAuth);
}
/* Moving this to UserCommand to allow "strip" chat command
else
{ //we got a cloth point.
sMessage = llToLower(sMessage);
//send the RLV command to remove it.
if(kAv==g_kSmartUser || g_iSmartStrip==TRUE){
llMessageLinked(LINK_SET, RLV_CMD , "detachallthis:" + sMessage + "=force", NULL_KEY);}
llMessageLinked(LINK_SET, RLV_CMD, "remoutfit:" + sMessage + "=force", NULL_KEY);
//Return menu
//sleep fof a sec to let things detach
llSleep(0.5);
QueryClothing(kAv, iAuth);
}
*/
}
else if (kID == g_kAttachID)
{
if (sMessage == UPMENU) llMessageLinked(LINK_SET, iAuth, "menu " + g_sSubMenu, kAv);
else if (sMessage == "Clothing") QueryClothing(kAv, iAuth);
else //SA: same remark here, people who are able to get the menu happen to be the ones who have the permission to detach
{ //we got an attach point. send a message to detach
sMessage = llToLower(sMessage);
//send the RLV command to remove it.
llMessageLinked(LINK_SET, RLV_CMD, "detach:" + sMessage + "=force", NULL_KEY);
//sleep for a sec to let tihngs detach
llSleep(0.5);
//Return menu
g_kMenuUser = kAv;
QueryAttachments(kAv, iAuth);
}
}
else if (kID == g_kLockID)
{
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else
{ //we got a cloth point.
string cstate = llGetSubString(sMessage,0,llStringLength(TICKED) - 1);
sMessage=llGetSubString(sMessage,llStringLength(TICKED),-1);
if (cstate==UNTICKED)
{
UserCommand(iAuth, "lockclothing "+sMessage, kAv);
}
else if (cstate==TICKED)
{
UserCommand(iAuth, "unlockclothing "+sMessage, kAv);
}
LockMenu(kAv, iAuth);
}
}
else if (kID == g_kLockAttachID)
{
if (sMessage == UPMENU) MainMenu(kAv, iAuth);
else
{ //we got a cloth point.
string cstate = llGetSubString(sMessage,0,llStringLength(TICKED) - 1);
sMessage=llGetSubString(sMessage,llStringLength(TICKED),-1);
if (cstate==UNTICKED)
{
UserCommand(iAuth, "lockattachment "+sMessage, kAv);
}
else if (cstate==TICKED)
{
UserCommand(iAuth, "unlockattachment "+sMessage, kAv);
}
LockAttachmentMenu(kAv, iAuth);
}
}
}
}
}
listen(integer iChan, string sName, key kID, string sMessage)
{
llListenRemove(g_iListener);
llSetTimerEvent(0.0);
if (iChan == g_iClothRLV)
{ // llOwnerSay(sMessage);
ClothingMenu(g_kMenuUser, sMessage, g_iMenuAuth);
}
else if (iChan == g_iAttachRLV)
{
// llOwnerSay(sMessage);
DetachMenu(g_kMenuUser, sMessage, g_iMenuAuth);
}
}
timer()
{//stil needed for rlv listen timeouts, though not dialog timeouts anymore
llListenRemove(g_iListener);
llSetTimerEvent(0.0);
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

View File

@@ -0,0 +1,722 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - settings //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// This script stores settings for other scripts in the collar. In bygone days
// it was responsible for storing them to an online database too. It doesn't
// do that anymore. But so long as plugin scripts are still using central
// storage like this, it's always possible we could bring back an online DB or
// someone could offer a third party one.
//
// Standardized format for settings - this will facilitate concordant AddOn integrations
// ID_Group=Token~Value~Token~Value (etc) in notecard (hard storage)
// Group_Token=Value (Setting storage & script usage)
// where:
// ID_ = collar description's 3rd entry (after the 2nd tilde)
// or "User_" for user customizations
// Group = what script/AddOn these settings are for
// Token = Setting to affect
// Value = set Token to this value
// EX: oc_texture=Base~steel~Ring~stripes (notecard line)
// texture_Base=steel,texture_Ring=stripes (in the scripts)
string PARENT_MENU = "Main";
string SUBMENU = "Options";
string DUMPCACHE = "Dump Cache";
string PREFUSER = "☐ Personal";
string PREFDESI = "☒ Personal"; // yes, I hate cutoff buttons
string STEALTH_OFF = "☐ Stealth"; // show the whole CTYPE
string STEALTH_ON = "☒ Stealth"; // hide the whole CTYPE
string LOADCARD="Load Defaults";
string REFRESH_MENU = "Fix Menus";
string UPMENU = "BACK";
key g_kMenuID;
key g_kWearer;
string g_sScript;
integer STEALTH;
string defaultscard = "defaultsettings";
string split_line; // to parse lines that were split due to lsl constraints
integer defaultsline = 0;
key defaultslineid;
key card_key;
// Message Map
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to settings store
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from store
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the store
integer LM_SETTING_REQUEST_NOCACHE = 2005;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer INTERFACE_CHANNEL;
//string WIKI_URL = "http://www.opencollar.at/user-guide.html";
string DESIGN_ID;
list DESIGN_SETTINGS;
list USER_SETTINGS;
integer USER_PREF = FALSE; // user switch
integer SAY_LIMIT = 1024; // lsl "say" string limit
integer CARD_LIMIT = 255; // lsl card-line string limit
string ESCAPE_CHAR = "\\"; // end of card line, more value left for token
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
DoMenu(key keyID, integer iAuth)
{
string sPrompt = "\n" + DUMPCACHE + " prints current settings to chat.";
sPrompt += "\n" +LOADCARD+" restores the default settings.";
list lButtons = [DUMPCACHE,LOADCARD,REFRESH_MENU];
if (USER_PREF)
{
sPrompt += "\n\nUncheck " + PREFDESI + " to give designer settings priority.\n";
lButtons += [PREFDESI];
}
else
{
sPrompt += "\n\nCheck " + PREFUSER + " to give your personal settings priority.\n";
lButtons += [PREFUSER];
}
if (STEALTH) lButtons += [STEALTH_ON];
else lButtons += [STEALTH_OFF];
sPrompt +="\nwww.opencollar.at/options";
g_kMenuID = Dialog(keyID, sPrompt, lButtons, [UPMENU], 0, iAuth);
}
// Get Group or Token, 0=Group, 1=Token
string SplitToken(string in, integer slot)
{
integer i = llSubStringIndex(in, "_");
if (!slot) return llGetSubString(in, 0, i - 1);
return llGetSubString(in, i + 1, -1);
}
// To add new entries at the end of Groupings
integer GroupIndex(list cache, string token)
{
string group = SplitToken(token, 0);
integer i = llGetListLength(cache) - 1;
// start from the end to find last instance, +2 to get behind the value
for (; ~i ; i -= 2)
{
if (SplitToken(llList2String(cache, i - 1), 0) == group) return i + 1;
}
return -1;
}
integer SettingExists(string token)
{
if (~llListFindList(USER_SETTINGS, [token])) return TRUE;
if (~llListFindList(DESIGN_SETTINGS, [token])) return TRUE;
return FALSE;
}
list SetSetting(list cache, string token, string value)
{
integer idx = llListFindList(cache, [token]);
if (~idx) return llListReplaceList(cache, [value], idx + 1, idx + 1);
idx = GroupIndex(cache, token);
if (~idx) return llListInsertList(cache, [token, value], idx);
return cache + [token, value];
}
// like SetSetting, but only sets the value if there's not one already there.
list AddSetting(list cache, string token, string value)
{
integer i = llListFindList(cache, [token]);
if (~i) return cache;
i = GroupIndex(cache, token);
if (~i) return llListInsertList(cache, [token, value], i);
return cache + [token, value];
}
string GetSetting(string token)
{
integer i = llListFindList(USER_SETTINGS, [token]);
if (USER_PREF && ~i) return llList2String(USER_SETTINGS, i + 1);
integer d = llListFindList(DESIGN_SETTINGS, [token]);
if (~d) return llList2String(DESIGN_SETTINGS, d + 1);
return llList2String(USER_SETTINGS, i + 1);
}
// per = number of entries to put in each bracket
list ListCombineEntries(list in, string add, integer per)
{
list out;
while (llGetListLength(in))
{
list item;
integer i;
for (; i < per; i++) item += llList2List(in, i, i);
out += [llDumpList2String(item, add)];
in = llDeleteSubList(in, 0, per - 1);
}
return out;
}
DumpGroupSettings(string group, key id)
{
list sets;
list out;
string tok;
string val;
integer i;
integer x;
if (!USER_PREF) jump user;
@designer;
for (i = 0; i < llGetListLength(DESIGN_SETTINGS); i += 2)
{
tok = llList2String(DESIGN_SETTINGS, i);
if (SplitToken(tok, 0) == group)
{
tok = SplitToken(tok, 1);
val = llList2String(DESIGN_SETTINGS, i + 1);
x=llListFindList(out, [tok]);
if (~x) out = llListReplaceList(out, [val], x + 1, x + 1);
else out += [tok, val];
}
}
if (!USER_PREF) jump done;
@user;
for (i = 0; i < llGetListLength(USER_SETTINGS); i += 2)
{
tok = llList2String(USER_SETTINGS, i);
if (SplitToken(tok, 0) == group)
{
tok = SplitToken(tok, 1);
val = llList2String(USER_SETTINGS, i + 1);
x=llListFindList(out, [tok]);
if (~x) out = llListReplaceList(out, [val], x + 1, x + 1);
else out += [tok, val];
}
}
if (!USER_PREF) jump designer;
@done;
out = ListCombineEntries(out, "=", 2);
tok = (string)id + "\\" + group+ " settings\\";
while (llGetListLength(out))
{
val = llList2String(out, 0);
if (llStringLength(tok + val) + 2 > SAY_LIMIT)
{
llRegionSayTo(id, 0, tok);
tok = (string)id + "\\" + group + " settings\\" + val;
}
else tok += ";" + val;
out = llDeleteSubList(out, 0, 0);
}
llRegionSayTo(id, INTERFACE_CHANNEL, tok);
}
DelSetting(string token) // we'll only ever delete user settings
{
integer i = llGetListLength(USER_SETTINGS) - 1;
if (SplitToken(token, 1) == "all")
{
token = SplitToken(token, 0);
string var;
for (; ~i; i -= 2)
{
if (SplitToken(llList2String(USER_SETTINGS, i - 1), 0) == token)
USER_SETTINGS = llDeleteSubList(USER_SETTINGS, i - 1, i);
}
return;
}
i = llListFindList(USER_SETTINGS, [token]);
if (~i) USER_SETTINGS = llDeleteSubList(USER_SETTINGS, i, i + 1);
}
// run delimiters & add escape-characters for DumpCache
list Add2OutList(list in)
{
if (!llGetListLength(in)) return [];
string set = DESIGN_ID;
list out = ["#---Designer Defaults---#"];
if (in == USER_SETTINGS)
{
set = "User_";
out = ["#---My Settings---#"];
}
string buffer;
string temp;
string sid;
string pre;
string group;
string tok;
string val;
integer i;
for (i=0 ; i < llGetListLength(in); i += 2)
{
tok = llList2String(in, i);
val = llList2String(in, i + 1);
group = SplitToken(tok, 0);
tok = SplitToken(tok, 1);
integer bIsSplit = FALSE ;
integer iAddedLength = llStringLength(buffer) + llStringLength(val)
+ llStringLength(sid) +llStringLength(set) + 2;
if (group != sid || llStringLength(buffer) == 0 || iAddedLength >= CARD_LIMIT ) // new group
{
// Starting a new group.. flush the buffer to the output.
if ( llStringLength(buffer) ) out += [buffer] ;
sid = group;
pre = "\n" + set + sid + "=";
}
else pre = buffer + "~";
temp = pre + tok + "~" + val;
while (llStringLength(temp))
{
buffer = temp;
if (llStringLength(temp) > CARD_LIMIT)
{
bIsSplit = TRUE ;
buffer = llGetSubString(temp, 0, CARD_LIMIT - 2) + ESCAPE_CHAR;
temp = "\n" + llDeleteSubString(temp, 0, CARD_LIMIT - 2);
}
else temp = "";
if ( bIsSplit )
{
// if this is either a split buffer or one of it's continuation
// line outputs,
out += [buffer];
buffer = "" ;
}
}
}
// If there's anything left in the buffer, flush it to output.
if ( llStringLength(buffer) ) out += [buffer] ;
// Possibly this line was supposed to reallocate the list to keep it from taking too
// much space. Logically, this is a 'do nothing' line - replacing the last item in
// the 'out' list with the last item in the out list, with no changes.
////// out = llListReplaceList(out, [llList2String(out, -1)], -1, -1);
return out;
}
DumpCache(key id)
{
// compile everything into one list, so we can tell the user everything seamlessly
list out;
list say = ["Settings (Designer defaults, followed by User Entries)\n"];
say += ["The below can be copied and pasted to \"defaultsettings\" notecard\n"];
say += ["Replacing old entries, but must include Designer defaults (if present):\n"];
say += Add2OutList(DESIGN_SETTINGS) + ["\n"];
say += Add2OutList(USER_SETTINGS);
string old;
string new;
integer c;
while (llGetListLength(say))
{
new = llList2String(say, 0);
c = llStringLength(old + new) + 2;
if (c > SAY_LIMIT)
{
out += [old];
old = "";
}
old += new;
say = llDeleteSubList(say, 0, 0);
}
out += [old];
while (llGetListLength(out))
{
Notify(id, llList2String(out, 0), TRUE);
out = llDeleteSubList(out, 0, 0);
}
}
SendValues()
{
//Debug("Sending all settings");
//loop through and send all the settings
integer n = 0;
string tok;
list out;
if (USER_PREF) jump DesignSet;
@UserSet;
for (; n < llGetListLength(USER_SETTINGS); n += 2)
{
tok = llList2String(USER_SETTINGS, n) + "=";
tok += llList2String(USER_SETTINGS, n + 1);
if (llListFindList(out, [tok]) == -1) out += [tok];
}
n = 0;
if (USER_PREF) jump done;
@DesignSet;
for (; n < llGetListLength(DESIGN_SETTINGS); n += 2)
{
tok = llList2String(DESIGN_SETTINGS, n) + "=";
tok += llList2String(DESIGN_SETTINGS, n + 1);
if (llListFindList(out, [tok]) == -1) out += [tok];
}
n = 0;
if (USER_PREF) jump UserSet;
@done;
for (; n < llGetListLength(out); n++)
{
llMessageLinked(LINK_SET, LM_SETTING_RESPONSE, llList2String(out, n), "");
}
llMessageLinked(LINK_SET, LM_SETTING_RESPONSE, "settings=sent", "");//tells scripts everything has be sentout
}
integer UserCommand(integer iAuth, string sStr, key kID)
{
if (iAuth != COMMAND_OWNER && iAuth != COMMAND_WEARER) return FALSE;
if (sStr == "menu " + SUBMENU || llToLower(sStr) == llToLower(SUBMENU))
{
DoMenu(kID, iAuth);
return TRUE;
}
if (llToLower(llGetSubString(sStr, 0, 4)) == "dump_")
{
sStr = llToLower(llGetSubString(sStr, 5, -1));
if (sStr == "cache") DumpCache(kID);
else DumpGroupSettings(sStr, kID);
return TRUE;
}
integer i = llSubStringIndex(sStr, " ");
string sid = llToLower(llGetSubString(sStr, 0, i - 1)) + "_";
if (sid != llToLower(g_sScript)) return TRUE;
string C = llToLower(llGetSubString(sStr, i + 1, -1));
if (C == llToLower(PREFUSER))
{
USER_SETTINGS = SetSetting(USER_SETTINGS, g_sScript + "Pref", "User");
USER_PREF = TRUE;
}
else if (C == llToLower(PREFDESI))
{
USER_SETTINGS = SetSetting(USER_SETTINGS, g_sScript + "Pref", "Designer");
USER_PREF = FALSE;
}
else if (C == llToLower(DUMPCACHE))
{
DumpCache(kID);
}
else if (C == llToLower(LOADCARD))
{
defaultsline = 0;
if (llGetInventoryKey(defaultscard)!=NULL_KEY) {
defaultslineid = llGetNotecardLine(defaultscard, defaultsline);
}
}
else if (C == llToLower(REFRESH_MENU))
{
llMessageLinked(LINK_THIS, iAuth,"fixmenus",kID);
}
else if (C == llToLower(STEALTH_OFF))
{
STEALTH = TRUE;
llMessageLinked(LINK_THIS, iAuth,"hide",kID);
}
else if (C == llToLower(STEALTH_ON))
{
STEALTH = FALSE;
llMessageLinked(LINK_THIS, iAuth,"show",kID);
}
else return FALSE;
return TRUE;
}
default {
on_rez(integer iParam) {
// reset the whole lot.
if (g_kWearer == llGetOwner()) { //if owner hasn't changed, resend settings to plugins
llSleep(0.5); // brief wait for others to reset
SendValues();
} else llResetScript(); // else reset completely
// check alpha
if (llGetAlpha(ALL_SIDES) > 0) STEALTH = FALSE;
else STEALTH = TRUE;
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_sScript = "settings_";
// Ensure that settings resets AFTER every other script, so that they don't reset after they get settings
llSleep(0.5);
g_kWearer = llGetOwner();
INTERFACE_CHANNEL = (integer)("0x"+llGetSubString((string)g_kWearer,2,7)) + 1111;
if (INTERFACE_CHANNEL > 0) INTERFACE_CHANNEL *= -1;
if (INTERFACE_CHANNEL > -10000) INTERFACE_CHANNEL -= 30000;
defaultsline = 0;
if (llGetInventoryKey(defaultscard)!=NULL_KEY) {
defaultslineid = llGetNotecardLine(defaultscard, defaultsline);
card_key = llGetInventoryKey(defaultscard);
}
DESIGN_ID = llGetObjectDesc();
integer i = llSubStringIndex(DESIGN_ID, "~");
DESIGN_ID = llGetSubString(DESIGN_ID, i + 1, -1);
i = llSubStringIndex(DESIGN_ID, "~");
DESIGN_ID = llGetSubString(DESIGN_ID, i + 1, -1);
//Debug("Starting");
}
dataserver(key id, string data)
{
if (id == defaultslineid)
{
string sid;
string tok;
string val;
integer i;
if (data == EOF && split_line != "" )
{
data = split_line ;
split_line = "" ;
}
if (data != EOF)
{
// first we can filter out & skip blank lines & remarks
data = llStringTrim(data, STRING_TRIM_HEAD);
if (data == "" || llGetSubString(data, 0, 0) == "#") jump nextline;
// check for "continued" line pieces
if ( llStringLength(split_line) )
{
data = split_line + data ;
split_line = "" ;
}
if ( llGetSubString( data, -1, -1) == ESCAPE_CHAR )
{
split_line = llDeleteSubString( data, -1, -1) ;
jump nextline ;
}
// Next we wish to peel the special settings for this collar
// unique collar id is followed by Script (that settings are for) + "=tok~val~tok~val"
i = llSubStringIndex(data, "_");
id = llGetSubString(data, 0, i);
if (id != DESIGN_ID && id != "User_") jump nextline;
data = llGetSubString(data, i + 1, -1); // shave id off
i = llSubStringIndex(data, "=");
sid = (llGetSubString(data, 0, i - 1)) + "_";
data = llGetSubString(data, i + 1, -1);
list lData = llParseString2List(data, ["~"], []);
for (i = 0; i < llGetListLength(lData); i += 2)
{
tok = llList2String(lData, i);
val = llList2String(lData, i + 1);
if (sid == g_sScript) // a setting for this script
{
if (tok == "Pref" && val == "User") USER_PREF = TRUE;
}
if (id == DESIGN_ID) DESIGN_SETTINGS = SetSetting(DESIGN_SETTINGS, sid + tok, val);
else USER_SETTINGS = SetSetting(USER_SETTINGS, sid + tok, val);
}
@nextline;
defaultsline++;
defaultslineid = llGetNotecardLine(defaultscard, defaultsline);
}
else
{
// wait a sec before sending settings, in case other scripts are
// still resetting.
llSleep(2.0);
SendValues();
}
}
}
link_message(integer sender, integer iNum, string sStr, key id)
{
if (UserCommand(iNum, sStr, id)) return;
if (iNum == LM_SETTING_SAVE)
{
//save the token, value
list params = llParseString2List(sStr, ["="], []);
string token = llList2String(params, 0);
string value = llList2String(params, 1);
// if it's a revert to a designer setting, wipe it from user list
// otherwise, set it to user list
if (~llListFindList(DESIGN_SETTINGS, [token, value])) DelSetting(token);
else USER_SETTINGS = SetSetting(USER_SETTINGS, token, value);
}
else if (iNum == LM_SETTING_REQUEST)
{
//check the cache for the token
if (SettingExists(sStr))
{
llMessageLinked(LINK_SET, LM_SETTING_RESPONSE, sStr + "=" + GetSetting(sStr), "");
}
else
{
llMessageLinked(LINK_SET, LM_SETTING_EMPTY, sStr, "");
}
}
else if (iNum == LM_SETTING_DELETE)
{
DelSetting(sStr);
}
else if (iNum == DIALOG_RESPONSE)
{
if (id == g_kMenuID)
{
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
// request to switch to parent menu
if (sMessage == UPMENU)
{
llMessageLinked(LINK_ROOT, iAuth, "menu "+ PARENT_MENU, kAv);
return;
}
if (iAuth < COMMAND_OWNER || iAuth > COMMAND_WEARER) return;
if(iAuth==COMMAND_OWNER||iAuth==COMMAND_WEARER)
{ //moving everything to UserCommand to save doubling up on code.
UserCommand(iAuth,llGetSubString(g_sScript,0,-2)+" "+sMessage,kAv);
}
else Notify(kAv,"Sorry, only Owners & Wearers may acces this feature.",FALSE);
//if (sMessage == PREFDESI)
//{
// USER_PREF = FALSE;
// USER_SETTINGS = SetSetting(USER_SETTINGS, g_sScript + "Pref", "Designer");
//}
//else if (sMessage == PREFUSER)
//{
// USER_PREF = TRUE;
// USER_SETTINGS = SetSetting(USER_SETTINGS, g_sScript + "Pref", "User");
//}
//else if (sMessage == DUMPCACHE)
//{
// if (iAuth == COMMAND_OWNER || iAuth == COMMAND_WEARER) DumpCache(kAv);
// else Notify(kAv, "Only Owners & Wearer may access this feature.", FALSE);
//}
//else if (sMessage == LOADCARD)
//{
// if(kAv==g_kWearer)
// {
// defaultsline = 0;
// defaultslineid = llGetNotecardLine(defaultscard, defaultsline);
// }
// else Notify(kAv,"Only the collar wearer may reload defaults.",FALSE);
//}
// else if (sMessage == REFRESH_MENU)
//{
// if(iAuth==COMMAND_OWNER||iAuth==COMMAND_WEARER)
// {
// llDialog(kAv, "\n\nRebuilding menu.\n\nThis may take several seconds.", [], -341321);
// llResetOtherScript(g_sMenuScript);
// }
// else Notify(kAv,"Only the collar wearer and owners may refresh menus.",FALSE);
//}
DoMenu(kAv, iAuth);
}
}
//else if (iNum == MENUNAME_REQUEST && sStr == PARENT_MENU)
//{
// llMessageLinked(LINK_SET, MENUNAME_RESPONSE, PARENT_MENU + "|" + SUBMENU, "");
//}
else if (iNum == DIALOG_TIMEOUT)
{
// timeout from menu system, you do not have to react on this, but you can
if (id == g_kMenuID)
{
//Debug("The user was to slow or lazy, we got a timeout!");
}
}
}
changed(integer change)
{
if (change & CHANGED_COLOR)
{
//llSleep(0.1); // not sure for need this sleep...
{
if (llGetAlpha(ALL_SIDES) > 0) STEALTH = FALSE;
else STEALTH = TRUE;
}
}
if (change & CHANGED_OWNER) llResetScript();
if (change & CHANGED_INVENTORY)
{
if (llGetInventoryKey(defaultscard) != card_key)
{
// the defaultsettings card changed. Re-read it.
defaultsline = 0;
if (llGetInventoryKey(defaultscard)!=NULL_KEY) {
defaultslineid = llGetNotecardLine(defaultscard, defaultsline);
card_key = llGetInventoryKey(defaultscard);
}
}
llSleep(1.0); //pause, then send values if inventory changes, in case script was edited and needs its settings again
SendValues();
}
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -0,0 +1,429 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - shininess //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//based on OpenCollar - texture
string g_sParentMenu = "Appearance";
string g_sSubMenu = "Shininess";
string g_sIgnoreType = "noshine" ; // or "notexture" if you don't want use alternate prims descriptions;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;
integer LM_SETTING_REQUEST = 2001;
integer LM_SETTING_RESPONSE = 2002;
integer LM_SETTING_DELETE = 2003;
integer LM_SETTING_EMPTY = 2004;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer TOUCH_REQUEST = -9500;
integer TOUCH_CANCEL = -9501;
integer TOUCH_RESPONSE = -9502;
integer TOUCH_EXPIRE = -9503;
string CTYPE = "collar";
string UPMENU = "BACK";
list g_lShiny = ["none","low","medium","high"];
string ALL = "All" ;
list g_lElements;
list g_lShinySettings;
list g_lButtons;
list g_lMenuIDs;
key g_kTouchID;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
string g_sCurrentElement = "";
key g_kWearer;
string g_sScript ;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_THIS, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
string GetScriptID()
{
// strip away "OpenCollar - " leaving the script's individual name
list parts = llParseString2List(llGetScriptName(), ["-"], []);
return llStringTrim(llList2String(parts, 1), STRING_TRIM) + "_";
}
key TouchRequest(key kRCPT, integer iTouchStart, integer iTouchEnd, integer iAuth)
{
key kID = llGenerateKey();
integer iFlags = 0;
if (iTouchStart) iFlags = iFlags | 0x01;
if (iTouchEnd) iFlags = iFlags | 0x02;
llMessageLinked(LINK_THIS, TOUCH_REQUEST, (string)kRCPT + "|" + (string)iFlags + "|" + (string)iAuth, kID);
return kID;
}
ShinyMenu(key kAv, integer iAuth)
{
string sPrompt = "Pick a Shiny.";
g_lMenuIDs+=[Dialog(kAv, sPrompt, g_lShiny, [UPMENU],0, iAuth)];
}
ElementMenu(key kAv, integer iAuth)
{
string sPrompt = "Pick which part of the "+CTYPE+" you would like to change shiny.\n\nChoose *Touch* if you want to select the part by directly clicking on the "+CTYPE+".";
g_lButtons = llListSort(g_lElements, 1, TRUE) + [ALL] ;
g_lMenuIDs+=[Dialog(kAv, sPrompt, g_lButtons, ["*Touch*", UPMENU],0, iAuth)];
}
string ElementType(integer iLinkNumber)
{
//string sDesc = (string)llGetObjectDetails(llGetLinkKey(iLinkNumber), [OBJECT_DESC]);
string sDesc = llList2String(llGetLinkPrimitiveParams(iLinkNumber, [PRIM_DESC]), 0);
//each prim should have <elementname> in its description, plus "noshiny, if you want the prim to
//not appear in the shiny menu
list lParams = llParseString2List(sDesc, ["~"], []);
if ((~(integer)llListFindList(lParams, [g_sIgnoreType])) || sDesc == "" || sDesc == " " || sDesc == "(No Description)")
{
return g_sIgnoreType;
}
else
{
return llList2String(lParams, 0);
}
}
BuildElementList()
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (n = 2; n <= iLinkCount; n++)
{
string sElement = ElementType(n);
if (!(~llListFindList(g_lElements, [sElement])) && sElement != g_sIgnoreType)
{
g_lElements += [sElement];
}
}
}
SetAllShiny(integer iShiny)
{
integer elements = llGetListLength(g_lElements) ;
integer index = 0 ;
do
{
string sElement = llList2String(g_lElements, index);
SetElementShiny(sElement, iShiny);
index++ ;
}while (index < elements ) ;
}
SetElementShiny(string sElement, integer iShiny)
{
SetElement(sElement, iShiny);
AddShinySettings(sElement, iShiny);
//save to settings DB
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + sElement + "=" + (string)iShiny, "");
}
SetElement(string sElement, integer iShiny)
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
for (n = 2; n <= iLinkCount; n++)
{
if (ElementType(n) == sElement)
{
llSetLinkPrimitiveParamsFast(n,[PRIM_BUMP_SHINY,ALL_SIDES,iShiny,0]);
}
}
}
AddShinySettings(string sElement, integer iShiny)
{
integer i = llListFindList(g_lShinySettings, [sElement]);
if (i == -1)
{
g_lShinySettings += [sElement, iShiny];
}
else
{
g_lShinySettings = llListReplaceList(g_lShinySettings, [iShiny], i+1, i+1);
}
}
UpdateElements()
{
integer elements = llGetListLength(g_lShinySettings) ;
integer i = 0 ;
do
{
string sElement = llList2String(g_lShinySettings, i);
integer iShiny = llList2Integer(g_lShinySettings, i+1);
SetElement(sElement, iShiny);
i+=2 ;
}while (i < elements ) ;
}
// returns TRUE if eligible (AUTHED link message number)
integer UserCommand(integer iNum, string sStr, key kID) // here iNum: auth value, sStr: user command, kID: avatar id
{
if (iNum > COMMAND_WEARER || iNum < COMMAND_OWNER) return FALSE; // sanity check
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
if (sStr == "menu "+ g_sSubMenu || sStr == "shiny")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the shiny.", FALSE);
llMessageLinked(LINK_THIS, iNum, "menu "+g_sParentMenu, kID);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the "+CTYPE+" is locked. You cannot access this menu now!", FALSE);
llMessageLinked(LINK_THIS, iNum, "menu "+g_sParentMenu, kID);
}
else
{
g_sCurrentElement = "";
ElementMenu(kID, iNum);
}
}
if (sCommand == "setshiny")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the shiny.", FALSE);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the "+CTYPE+" is locked. You cannot access this menu now!", FALSE);
}
else
{
string sElement = llList2String(lParams, 1);
integer iShiny = (integer)(llList2String(lParams, 2));
if (sElement == ALL || sElement == "all") SetAllShiny(iShiny);
else SetElementShiny(sElement, iShiny);
}
}
else if (sCommand == "lockappearance")
{
if (iNum == COMMAND_OWNER) g_iAppLock = llList2Integer(lParams, 1);
}
return TRUE;
}
// Get from Group_Token=Value , 0=Group, 1=Token, 2=Value
string SplitTokenValue(string in, integer slot)
{
string out ;
if (slot==0) out = llGetSubString(in, 0, llSubStringIndex(in, "_") );
else if (slot==1) out = llGetSubString(in, llSubStringIndex(in, "_")+1, llSubStringIndex(in, "=")-1);
else if (slot==2) out = llGetSubString(in, llSubStringIndex(in, "=")+1, -1);
return out ;
}
/*
RequestSettings()
{
// restore settings from DB after reset script
llMessageLinked(LINK_THIS, LM_SETTING_REQUEST, g_sAppLockToken, "");
// request settings for all Elements
integer n;
integer iStop = llGetListLength(g_lElements);
for (n = 0; n < iStop; n++)
{
string sElement = llList2String(g_lElements, n);
llMessageLinked(LINK_THIS, LM_SETTING_REQUEST, g_sScript + sElement, "");
}
}
*/
default {
on_rez(integer iParam) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
g_sScript = GetScriptID();
BuildElementList();
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (UserCommand(iNum, sStr, kID)) {return;}
else if (iNum == LM_SETTING_RESPONSE)
{
string sGroup = SplitTokenValue(sStr, 0);
string sToken = SplitTokenValue(sStr, 1);
string sValue = SplitTokenValue(sStr, 2);
if (sGroup == g_sScript) AddShinySettings(sToken, (integer)sValue);
else if (sGroup+sToken == g_sAppLockToken) g_iAppLock = (integer)sValue;
else if (sGroup+sToken == "Global_CType") CTYPE = sValue;
else if (sStr == "settings=sent") UpdateElements();
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == DIALOG_RESPONSE)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
g_lMenuIDs=llDeleteSubList(g_lMenuIDs,iMenuIndex,iMenuIndex);
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
if (g_sCurrentElement == "")
{
//main menu
llMessageLinked(LINK_THIS, iAuth, "menu "+g_sParentMenu, kAv);
}
else
{
g_sCurrentElement = "" ;
ElementMenu(kAv, iAuth);
}
}
else if (sMessage == "*Touch*")
{
Notify(kAv, "Please touch the part of the collar you want to shiny.", FALSE);
g_kTouchID = TouchRequest(kAv, TRUE, FALSE, iAuth);
}
else if (g_sCurrentElement == "")
{
//we just got the element name
g_sCurrentElement = sMessage;
ShinyMenu(kAv, iAuth);
}
else if (~(integer)llListFindList(g_lShiny, [sMessage]))
{
integer iShiny = llListFindList(g_lShiny, [sMessage]);
if(g_sCurrentElement == ALL) SetAllShiny(iShiny);
else SetElementShiny(g_sCurrentElement, iShiny);
ShinyMenu(kAv, iAuth);
}
}
}
else if (iNum == DIALOG_TIMEOUT)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
g_lMenuIDs=llDeleteSubList(g_lMenuIDs,iMenuIndex,iMenuIndex);
}
}
else if (iNum == TOUCH_RESPONSE)
{
if (kID == g_kTouchID)
{
list lParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lParams, 0);
integer iAuth = (integer)llList2String(lParams, 1);
integer iLinkNumber = (integer)llList2String(lParams, 3);
string sElement = ElementType(iLinkNumber);
if (sElement != g_sIgnoreType)
{
g_sCurrentElement = sElement;
ShinyMenu(kAv, iAuth);
Notify(kAv, "You selected \""+sElement+"\".", FALSE);
}
else
{
Notify(kAv, "You selected a prim which is not shiny. You can try again.", FALSE);
ElementMenu(kAv, iAuth);
}
}
}
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

420
LSL/OpenCollar - styles.lsl Normal file
View File

@@ -0,0 +1,420 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - styles //
// version 3.995 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sSubMenu = "Styles";
string g_sParentMenu = "Appearance";
string CTYPE = "collar";
key g_kWearer;
string UPMENU = "BACK";
string DUMP = "Dump Style";
integer COMMAND_OWNER = 500;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer LM_SETTING_SAVE = 2000;
//integer LM_SETTING_REQUEST = 2001;
integer LM_SETTING_RESPONSE = 2002;
//integer LM_SETTING_DELETE = 2003;
//integer LM_SETTING_EMPTY = 2004;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
//script specific variables
list g_lMenuIDs;//3-strided list of avkey, dialogid, menuname
integer g_iMenuStride = 3;
string g_sStyle;
list g_lElementsSettings; // [element_name,"key_texture~vector_color~integer_shine"]
list g_lStyles; // list of style names
list g_lStyleSettings; // list of style settings ["Stylename1", "elementname~keytexture~vectorcolor~integershine", "elementname~keytexture~vectorcolor~integershine", ... "Stylename2",....]
key g_iNotecardId;
key g_kNotecardReadRequest;
string g_sNotecardName=".styles";
integer g_iNotecardLine=0;
string g_sNotecardStyle ;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
integer g_iHasColorScript = FALSE;
integer g_iHasTextureScript = FALSE;
integer g_iHasShineScript = FALSE;
//standard OC functions
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string menuType) {
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
integer iMenuIndex = llListFindList(g_lMenuIDs, [kRCPT]);
list lAddMe = [kRCPT, kID, menuType];
if (iMenuIndex == -1) g_lMenuIDs += lAddMe;
else g_lMenuIDs = llListReplaceList(g_lMenuIDs, lAddMe, iMenuIndex, iMenuIndex + g_iMenuStride - 1);
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)!=ZERO_VECTOR) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
//menu generators
StyleMenu(key kAv, integer iAuth)
{
Dialog(kAv, "\nCurrent Style: "+g_sStyle+"\n\nSelect an style from the list", g_lStyles, [DUMP, UPMENU],0, iAuth, "StyleMenu");
}
SetStyle(string sStyle, integer iAuth, key kAv)
{
if (llListFindList(g_lStyles,[sStyle]) == -1) return; // unknown style
g_sStyle = sStyle;
integer index = llListFindList(g_lStyleSettings,[sStyle]) ;
if (index == -1) return; // no style settings
while (index++ >= 0)
{
string setting = llList2String(g_lStyleSettings,index);
if ((~llListFindList(g_lStyles,[setting])) || setting == "") index = -1;
else
{
list lParams = llParseString2List(setting,["~"],[]);
string sElement = llStringTrim(llList2String(lParams,0),STRING_TRIM);
if (sElement != "")
{
string sTexture = llStringTrim(llList2String(lParams,1),STRING_TRIM);
if (sTexture != "")
{
llMessageLinked(LINK_SET, iAuth, "settexture " + sElement+" "+sTexture, kAv);
if (!g_iHasTextureScript) SetTexture(sElement, sTexture);
}
string sColor = llStringTrim(llList2String(lParams,2),STRING_TRIM);
if (sColor != "")
{
llMessageLinked(LINK_SET, iAuth, "setcolor "+sElement+" "+sColor, kAv);
if (!g_iHasColorScript) SetColor(sElement, (vector)sColor);
}
string sShine = llStringTrim(llList2String(lParams,3),STRING_TRIM);
if (sShine != "")
{
llMessageLinked(LINK_SET, iAuth, "setshiny " + sElement+" "+sShine, kAv);
if (!g_iHasShineScript) SetShine(sElement, (integer)sShine);
}
}
}
}
}
SetTexture(string sElement, string sTex)
{
integer i;
integer n = llGetNumberOfPrims();
for (i = 2; i <= n; i++)
{
if (ElementType(i,"notexture") == sElement)
{
// llSetLinkPrimitiveParamsFast(iLink, [PRIM_TEXTURE,ALL_SIDES,sTex,<1.0,1.0,1.0>,<0.0,0.0,0.0>,0.0] );
// update prim texture for each face with save texture repeats, offsets and rotations
integer iSides = llGetLinkNumberOfSides(i);
integer iFace ;
for (iFace = 0; iFace < iSides; iFace++)
{
list lParams = llGetLinkPrimitiveParams(i, [PRIM_TEXTURE, iFace ]);
lParams = llDeleteSubList(lParams,0,0); // get texture params
llSetLinkPrimitiveParamsFast(i, [PRIM_TEXTURE, iFace, sTex]+lParams);
}
}
}
}
SetColor(string sElement, vector vColor)
{
integer i;
integer n = llGetNumberOfPrims();
for (i = 2; i <= n; i++)
{
if (ElementType(i,"nocolor") == sElement) llSetLinkColor(i, vColor, ALL_SIDES);
}
}
SetShine(string sElement, integer iShine)
{
integer i;
integer n = llGetNumberOfPrims();
for (i = 2; i <= n; i++)
{
if (ElementType(i,"notexture") == sElement) llSetLinkPrimitiveParamsFast(i,[PRIM_BUMP_SHINY,ALL_SIDES,iShine,0]);
}
}
string ElementType(integer iLinkNum, string sType)
{
string sDesc = llList2String(llGetLinkPrimitiveParams(iLinkNum, [PRIM_DESC]),0);
list lParams = llParseString2List(llStringTrim(sDesc,STRING_TRIM), ["~"], []);
if ((~llListFindList(lParams,[sType])) || sDesc == "" || sDesc == "(No Description)") return sType;
else return llList2String(lParams, 0);
}
AddElementSetting(string element, string value, integer n )
{
if (element =="") return ;
string params;
integer i = llListFindList(g_lElementsSettings, [element]);
if (i==-1)
{
if(n==0) params = value+"~ ~ ";
if(n==1) params = " ~"+value+"~ ";
if(n==2) params = " ~ ~"+value;
g_lElementsSettings += [element, params];
}
else
{
string sParams = llList2String(g_lElementsSettings,i+1);
list lParams = llParseString2List(sParams,["~"],[]);
lParams = llListReplaceList(lParams, [value], n, n);
sParams = llDumpList2String(lParams,"~");
g_lElementsSettings = llListReplaceList(g_lElementsSettings, [sParams], i+1, i+1);
}
}
integer UserCommand(integer iAuth, string sStr, key kAv, integer remenu)
{
if (iAuth > COMMAND_WEARER || iAuth < COMMAND_OWNER) return FALSE; // sanity check
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
//string sValue = llList2String(lParams, 1);
if (sStr == "menu "+ g_sSubMenu || llToLower(sStr) == "styles")
{
if (kAv!=g_kWearer && iAuth!=COMMAND_OWNER)
{
Notify(kAv,"You are not allowed to change the "+CTYPE+"'s style.", FALSE);
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else if (g_iAppLock)
{
Notify(kAv, "The appearance of the " + CTYPE + " is locked. You cannot access this menu now!", FALSE);
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else StyleMenu(kAv, iAuth);
}
else if (sCommand == "lockappearance" && iAuth == COMMAND_OWNER)
{
string sValue = llStringTrim(llDeleteSubString(sStr,0,llStringLength(sCommand)),STRING_TRIM);
if (sValue == "0") g_iAppLock = FALSE;
if (sValue == "1") g_iAppLock = TRUE;
}
else if (sCommand == "style" && !g_iAppLock)
{
string sValue = llStringTrim(llDeleteSubString(sStr,0,llStringLength(sCommand)),STRING_TRIM);
if (~llListFindList(g_lStyles,[sValue]))
{
SetStyle(sValue, iAuth, kAv);
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, "styles_style=" + sValue, "");
}
else Notify(kAv,"Unrecognised style: "+sValue+" not in '"+llDumpList2String(g_lStyles,",")+"'",FALSE);
if (remenu) StyleMenu(kAv, iAuth);
}
else if (sStr == "dumpstyle")
{
DumpSettings(kAv,"~");
if (remenu) StyleMenu(kAv, iAuth);
}
return TRUE ;
}
DumpSettings(key kAv, string sep)
{
g_lElementsSettings = llListSort(g_lElementsSettings, 2, TRUE);
string out = "\n# Copy all below into '"+g_sNotecardName+"' notecard and change 'New Style' to own style name:\n\n[ New Style ]\n";
integer i;
for (i = 0; i < llGetListLength(g_lElementsSettings); i += 2)
{
out += llList2String(g_lElementsSettings, i)+sep+llList2String(g_lElementsSettings, i+1)+"\n";
}
Notify(kAv,out,FALSE);
}
CheckScripts()
{
g_iHasTextureScript = g_iHasColorScript = g_iHasShineScript = FALSE;
if (llGetInventoryType("OpenCollar - color") == INVENTORY_SCRIPT) g_iHasColorScript = TRUE;
if (llGetInventoryType("OpenCollar - texture") == INVENTORY_SCRIPT) g_iHasTextureScript = TRUE;
if (llGetInventoryType("OpenCollar - shininess") == INVENTORY_SCRIPT) g_iHasShineScript = TRUE;
// this is for my own script:
//if (llGetInventoryType("OpenCollar - customize") == INVENTORY_SCRIPT) g_iHasTextureScript = g_iHasColorScript = g_iHasShineScript = TRUE;
}
default
{
on_rez(integer param)
{
//llResetScript();
g_lElementsSettings = [] ;
CheckScripts();
}
state_entry()
{
CheckScripts();
g_kWearer = llGetOwner();
g_iNotecardId = llGetInventoryKey(g_sNotecardName);
if(g_iNotecardId)
{
g_iNotecardLine=0;
g_kNotecardReadRequest=llGetNotecardLine(g_sNotecardName,0);
}
//else llOwnerSay(g_sNotecardName+" notecard absent!");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (UserCommand(iNum, sStr, kID, FALSE)) return;
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sGroupToken = llList2String(lParams, 0);
string sGroup = llList2String(llParseString2List(sGroupToken,["_"],[]),0);
string sToken = llList2String(llParseString2List(sGroupToken,["_"],[]),1);
string sValue = llList2String(lParams, 1);
if (sToken == "CType") CTYPE = sValue;
else if (sGroup == "texture") AddElementSetting(sToken, sValue, 0);
else if (sGroup == "color") AddElementSetting(sToken, sValue, 1);
else if (sGroup == "shininess") AddElementSetting(sToken, sValue, 2);
else if (sGroupToken == "styles_style") g_sStyle = sValue; // SetStyle(sValue,COMMAND_WEARER,g_kWearer);
else if (sGroupToken == g_sAppLockToken) g_iAppLock = (integer)sValue;
}
else if (iNum == LM_SETTING_SAVE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sGroupToken = llList2String(lParams, 0);
string sGroup = llList2String(llParseString2List(sGroupToken,["_"],[]),0);
string sToken = llList2String(llParseString2List(sGroupToken,["_"],[]),1);
string sValue = llList2String(lParams, 1);
if (sToken == "CType") CTYPE = sValue;
else if (sGroup == "texture") AddElementSetting(sToken, sValue, 0);
else if (sGroup == "color") AddElementSetting(sToken, sValue, 1);
else if (sGroup == "shininess") AddElementSetting(sToken, sValue, 2);
else if (sGroupToken == g_sAppLockToken) g_iAppLock = (integer)sValue;
}
else if (iNum == DIALOG_RESPONSE)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex)
{ //got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
string sMenuType = llList2String(g_lMenuIDs, iMenuIndex + 1);
//remove stride from g_lMenuIDs
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenuType == "StyleMenu")
{ //lists all elements in the collar
if (sMessage == UPMENU) llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
else if (sMessage == DUMP) UserCommand(iAuth,"dumpstyle", kAv, TRUE);
else UserCommand(iAuth,"style "+sMessage, kAv, TRUE);
}
}
}
else if (iNum == DIALOG_TIMEOUT)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex) { //remove stride from g_lMenuIDs
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
}
}
dataserver(key id, string data){
if (id == g_kNotecardReadRequest){
if (data != EOF){
data = llStringTrim(data,STRING_TRIM);
if (data != "" && llGetSubString(data,0,0) != "#" )
{
if( llGetSubString(data,0,0) == "[" )
{
g_sNotecardStyle = llGetSubString(data,llSubStringIndex(data,"[")+1,llSubStringIndex(data,"]")-1);
g_sNotecardStyle = llStringTrim(g_sNotecardStyle,STRING_TRIM);
g_lStyles += [g_sNotecardStyle];
g_lStyleSettings += [g_sNotecardStyle];
}
else g_lStyleSettings += [data];
}
g_kNotecardReadRequest=llGetNotecardLine(g_sNotecardName,++g_iNotecardLine);
}
}
}
changed (integer change){
if (change & CHANGED_INVENTORY){
if (g_iNotecardId != llGetInventoryKey(g_sNotecardName)){
//Debug("Reading styles card");
g_iNotecardId = llGetInventoryKey(g_sNotecardName);
if(g_iNotecardId){
g_lStyles=[];
g_lStyleSettings=[];
g_iNotecardLine=0;
g_kNotecardReadRequest=llGetNotecardLine(g_sNotecardName,0);
}
//else llOwnerSay(g_sNotecardName+" notecard absent!");
}
CheckScripts();
}
if (change & CHANGED_OWNER) llResetScript();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -0,0 +1,602 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - texture //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//set textures by uuid, and save uuids instead of texture names to DB
//on getting texture command, give menu to choose which element, followed by menu to pick texture
list g_lElements;
string s_CurrentElement = "";
list g_lTextures;
list g_lTextureDefaults;
string g_sParentMenu = "Appearance";
string g_sSubMenu = "Textures";
string CTYPE = "collar";
integer iLength;
list lButtons;
list g_lNewButtons;//is this used? 2010/01/14 Starship
list g_lNotecardTextures;
list g_lNotecardTextureKeys;
integer g_iNotecardLine;
key g_kTextureCardUUID;
string g_sTextureCard="textures";
string g_sDefTextureCard="textures";
key g_kNotecardRead;
//dialog handles
key g_kElementID;
key g_ktextureID;
//touch request handle
key g_kTouchID;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
//MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent when a token has no value in the httpdb
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer TOUCH_REQUEST = -9500;
integer TOUCH_CANCEL = -9501;
integer TOUCH_RESPONSE = -9502;
integer TOUCH_EXPIRE = -9503;
//5000 block is reserved for IM slaves
string UPMENU = "BACK";
key g_kWearer;
string g_sScript;
// texture name element divider, put constant in so can be changed throughout the script with one change.
string SEPARATOR = "~";
// set FALSE to enable basic AND special texture names for all elements, TRUE for ONLY special textures per element.
// TRUE will still use basic textures for a given element WHEN that element has no special textures named in the collar.
integer EXCLUSIVE = TRUE;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
loadNotecardTextures()
{
g_sTextureCard=g_sDefTextureCard+"_custom";
if(llGetInventoryType(g_sTextureCard)!=INVENTORY_NOTECARD) g_sTextureCard=g_sDefTextureCard;
if(llGetInventoryType(g_sTextureCard)!=INVENTORY_NOTECARD)
{
g_kTextureCardUUID=NULL_KEY;
return;
}
g_lNotecardTextures=[];
g_lNotecardTextureKeys=[];
g_iNotecardLine=0;
g_kTextureCardUUID=llGetInventoryKey(g_sTextureCard);
g_kNotecardRead=llGetNotecardLine(g_sTextureCard,g_iNotecardLine);
}
string GetDefaultTexture(string ele)
{
integer i = llListFindList(g_lTextureDefaults, [ele]);
if (~i) return llList2String(g_lTextureDefaults, i + 1);
return NULL_KEY;
}
integer GetIsLeashTex(string sInvName)
{
if (llGetSubString(sInvName, 0, 5) == "leash_") return TRUE;
if (sInvName == "chain" || sInvName == "rope" || sInvName == "!totallytransparent") return TRUE;
return FALSE;
}
string GetShortName(string sTex) // strip all prefixes from a texture name
{
return llList2String(llParseString2List(sTex, [SEPARATOR], []), -1);
}
string GetLongName(string ele, string sTex) // find the full texture name given element + shortname
{
list work = BuildTextureNames(FALSE);
string test;
integer l = 0;
for (; l < llGetListLength(work); l++)
{
test = llList2String(work, l);
if (~llSubStringIndex(test, sTex))
{
//if (!GetElementHasTexs(ele) || ~llSubStringIndex(test, llToLower(ele) + SEPARATOR)) return test;
if (!GetElementHasTexs(ele) || ~llSubStringIndex(test, ele + SEPARATOR)) return test; //KW
}
}
return ""; // this should only happen if chat command is used with invalid texture
}
list BuildTextureNames(integer short) // set short TRUE to lop off all prefixes in return list, FALSE to carry full texture name
{
list out = [];
string name;
integer l = 0;
integer max=llGetInventoryNumber(INVENTORY_TEXTURE);
for (; l < max; l++)
{
name = llGetInventoryName(INVENTORY_TEXTURE, l);
if (!GetIsLeashTex(name)) // we want to ignore particle textures
{
if (short) name = GetShortName(name);
out += [name];
}
}
l=0;
max=llGetListLength(g_lNotecardTextures);
for (; l < max; l++)
{
name=llList2String(g_lNotecardTextures,l);
if (short) name = GetShortName(name);
out += [name];
}
return out;
}
integer GetElementHasTexs(string ele) // check if textures exist with labels for the specified element
{
//ele = llToLower(ele) + SEPARATOR;
ele = ele + SEPARATOR; //KW
integer l = 0;
integer max=llGetInventoryNumber(INVENTORY_TEXTURE);
for (; l < max; l++)
{
if (~llSubStringIndex(llGetInventoryName(INVENTORY_TEXTURE, l), ele)) return TRUE;
}
l=0;
max=llGetListLength(g_lNotecardTextures);
for (; l < max; l++)
{
if (~llSubStringIndex(llList2String(g_lNotecardTextures,l), ele)) return TRUE;
}
return FALSE;
}
list BuildTexButtons()
{
list tex = BuildTextureNames(FALSE);
list out = [];
if (~llListFindList(g_lTextureDefaults, [s_CurrentElement])) out = ["Default"];
//string ele = llToLower(s_CurrentElement) + SEPARATOR;
string ele = s_CurrentElement + SEPARATOR;//KW
string but;
integer l = 0;
for (; l < llGetListLength(tex); l++)
{
but = llList2String(tex, l);
if (EXCLUSIVE && GetElementHasTexs(s_CurrentElement))
{
if (~llSubStringIndex(but, ele)) but = GetShortName(but);
else but = "";
}
else if (~llSubStringIndex(but, SEPARATOR))
{
if (~llSubStringIndex(but, ele)) but = GetShortName(but);
else but = "";
}
if (but != "") out += [but];
}
return out;
}
key TouchRequest(key kRCPT, integer iTouchStart, integer iTouchEnd, integer iAuth)
{
key kID = llGenerateKey();
integer iFlags = 0;
if (iTouchStart) iFlags = iFlags | 0x01;
if (iTouchEnd) iFlags = iFlags | 0x02;
llMessageLinked(LINK_SET, TOUCH_REQUEST, (string)kRCPT + "|" + (string)iFlags + "|" + (string)iAuth, kID);
return kID;
}
TextureMenu(key kID, integer iPage, integer iAuth)
{
string sPrompt = "\nChoose the texture to apply.";
g_ktextureID = Dialog(kID, sPrompt, BuildTexButtons(), [UPMENU], iPage, iAuth);
}
ElementMenu(key kAv, integer iAuth)
{
string sPrompt = "\nChoose the element of the " + CTYPE + " you would like to retexture.\n\nChoose *Touch* if you want to select the part by directly clicking on the " + CTYPE + ".";
lButtons = llListSort(g_lElements, 1, TRUE);
g_kElementID = Dialog(kAv, sPrompt, lButtons, ["*Touch*", UPMENU], 0, iAuth);
}
string ElementType(integer iLinkNum)
{
string sDesc = llList2String(llGetLinkPrimitiveParams(iLinkNum, [PRIM_DESC]),0);
//prim desc will be elementtype~notexture(maybe)
list lParams = llParseString2List(llStringTrim(sDesc,STRING_TRIM), ["~"], []);
if (~llListFindList(lParams,["notexture"]) || sDesc == "" || sDesc == "(No Description)")
{
return "notexture";
}
else
{
return llList2String(lParams, 0);
}
}
SetElementTexture(string sElement, string sTex)
{
integer iLink;
integer iLinkCount = llGetNumberOfPrims();
integer i=llListFindList(g_lNotecardTextures,[sTex]);
if(~i) sTex=llList2String(g_lNotecardTextureKeys,i);
for (iLink = 2; iLink <= iLinkCount; iLink++)
{
if (ElementType(iLink) == sElement)
{
// llSetLinkPrimitiveParamsFast(iLink, [PRIM_TEXTURE,ALL_SIDES,sTex,<1.0,1.0,1.0>,<0.0,0.0,0.0>,0.0] );
// update prim texture for each face with save texture repeats, offsets and rotations
integer iSides = llGetLinkNumberOfSides(iLink);
integer iFace ;
for (iFace = 0; iFace < iSides; iFace++)
{
list lParams = llGetLinkPrimitiveParams(iLink, [PRIM_TEXTURE, iFace ]);
lParams = llDeleteSubList(lParams,0,0); // get texture params
llSetLinkPrimitiveParamsFast(iLink, [PRIM_TEXTURE, iFace, sTex]+lParams);
}
}
}
//change the textures list entry for the current element
integer iIndex = llListFindList(g_lTextures, [sElement]);
if (~iIndex) g_lTextures = llListReplaceList(g_lTextures, [sTex], iIndex + 1, iIndex + 1);
else g_lTextures += [s_CurrentElement, sTex];
//save to settings
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript + sElement + "=" + sTex, "");
}
string DumpSettings(string sep)
{
string out;
integer i = 0;
for (; i < llGetListLength(g_lTextures); i += 2)
{
out += sep + "Texture" + llList2String(g_lTextures, i);
out += "=" + llList2String(g_lTextures, i + 1);
}
return out;
}
integer UserCommand(integer iNum, string sStr, key kID)
{
if (iNum > COMMAND_WEARER || iNum < COMMAND_OWNER) return FALSE; // sanity check
if (sStr == "textures" || sStr == "menu "+g_sSubMenu)
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID, "You are not allowed to change the textures.", FALSE);
if (!llSubStringIndex(sStr, "menu "))
llMessageLinked(LINK_SET, iNum, "menu " + g_sParentMenu, kID);
}
else if (g_iAppLock)
{
Notify(kID, "The appearance of the " + CTYPE + " is locked. You cannot access this menu now!", FALSE);
if (!llSubStringIndex(sStr, "menu "))
llMessageLinked(LINK_SET, iNum, "menu " + g_sParentMenu, kID);
}
else
{
s_CurrentElement = "";
ElementMenu(kID, iNum);
}
}
else if (llGetSubString(sStr,0,13) == "lockappearance")
{
if (iNum == COMMAND_OWNER)
{
if(llGetSubString(sStr, -1, -1) == "0") g_iAppLock = FALSE;
else g_iAppLock = TRUE;
}
}
else if (sStr == "reset" && (iNum == COMMAND_OWNER || kID == g_kWearer))
{
//clear saved settings
//llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sDBToken, "");
llResetScript();
}
else if (kID != g_kWearer && iNum != COMMAND_OWNER) return TRUE;
{
if (sStr == "settings") Notify(kID, "Texture Settings: " + DumpSettings("\n"), FALSE);
else
{
list lParams = llParseString2List(sStr, [" "], []);
if (llToLower(llList2String(lParams,0))=="settexture")
{
if (g_iAppLock)
{
Notify(kID, "The appearance of the " + CTYPE + " is locked. You cannot change textures now!", FALSE);
return TRUE;
}
string sElement = llList2String(lParams, 1);
string sTex = llList2String(lParams, 2);
integer ok;
string test;
integer x=llGetListLength(g_lElements);
while(x)
{
--x;
test=llList2String(g_lElements,x);
if(llToLower(sElement)==llToLower(test))
{
sElement=test;
x=0;
ok=TRUE;
}
}
if(!ok) Notify(kID, "The element " + sElement + " wasn't recognized, please check your command and try again.",FALSE);
else
{
ok=FALSE;
if((key)sTex) ok=TRUE;
else
{
x=llGetInventoryNumber(INVENTORY_TEXTURE);
while(x)
{
--x;
test=llGetInventoryName(INVENTORY_TEXTURE,x);
if(llToLower(sTex)==llToLower(test))
{
ok=TRUE;
sTex=test;
x=0;
}
}
if(!ok)
{
x=llGetListLength(g_lNotecardTextures);
while(x)
{
--x;
test=llList2String(g_lNotecardTextures,x);
if(llToLower(sTex)==llToLower(test) || llToLower(GetShortName(test))==llToLower(sTex))
{
ok=TRUE;
sTex=test;
x=0;
}
}
}
}
if(ok) SetElementTexture(sElement, sTex);
else Notify(kID, "The texture " + sTex + " wasn't found in "+CTYPE+" inventory or the textures notecard, please check your command and try again.",FALSE);
}
}
}
}
return TRUE ;
}
default {
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_kWearer = llGetOwner();
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
loadNotecardTextures();
//loop through non-root prims, build element list
integer n;
integer iLinkCount = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (n = 2; n <= iLinkCount; n++) {
string sElement = ElementType(n);
if (!(~llListFindList(g_lElements, [sElement])) && sElement != "notexture") g_lElements += [sElement];
}
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (UserCommand(iNum, sStr, kID)) return;
//owner, secowner, group, and wearer may currently change colors
if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
integer i = llSubStringIndex(sToken, "_");
if (llGetSubString(sToken, 0, i) == g_sScript)
{
sToken = llGetSubString(sToken, i + 1, -1);
i = llListFindList(g_lTextureDefaults, [sToken]);
if (~i) g_lTextureDefaults = llListReplaceList(g_lTextureDefaults, [sValue], i + 1, i + 1);
else g_lTextureDefaults += [sToken, sValue];
}
else if (sToken == g_sAppLockToken) g_iAppLock = (integer)sValue;
else if (sToken == "Global_CType") CTYPE = sValue;
}
else if (iNum == DIALOG_RESPONSE)
{
if (llListFindList([g_kElementID, g_ktextureID], [kID]) != -1)
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (kID == g_kElementID)
{//they just chose an element, now choose a texture
if (sMessage == UPMENU)
{
//main menu
llMessageLinked(LINK_SET, iAuth, "menu "+g_sParentMenu, kAv);
}
else if (sMessage == "*Touch*")
{
Notify(kAv, "Please touch the part of the " + CTYPE + " you want to retexture. You can press ctr+alt+T to see invisible parts.", FALSE);
g_kTouchID = TouchRequest(kAv, TRUE, FALSE, iAuth);
}
else
{
//we just got the element name
s_CurrentElement = sMessage;
TextureMenu(kAv, iPage, iAuth);
}
}
else if (kID == g_ktextureID)
{
if (sMessage == UPMENU)
{
s_CurrentElement = "";
ElementMenu(kAv, iAuth);
}
else
{
//got a texture name
string sTex = GetLongName(s_CurrentElement, sMessage);
if (sMessage == "Default") sTex = GetDefaultTexture(s_CurrentElement);
SetElementTexture(s_CurrentElement, sTex);
TextureMenu(kAv, iPage, iAuth);
}
}
}
}
else if (iNum == TOUCH_RESPONSE)
{
if (kID == g_kTouchID)
{
list lParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lParams, 0);
integer iAuth = (integer)llList2String(lParams, 1);
integer iLinkNumber = (integer)llList2String(lParams, 3);
string sElement = ElementType(iLinkNumber);
if (sElement != "notexture")
{
TextureMenu(kAv, 0, iAuth);
Notify(kAv, "You selected \""+sElement+"\".", FALSE);
}
else
{
Notify(kAv, "You selected a prim which is not texturable. You can try again.", FALSE);
ElementMenu(kAv, iAuth);
}
}
}
}
dataserver(key kID, string sData)
{
if(kID==g_kNotecardRead)
{
if(sData!=EOF)
{
if(llStringTrim(sData,STRING_TRIM)!="" && llGetSubString(sData,0,1)!="//")
{
list lThisLine=llParseString2List(sData,[","],[]);
key kTextureKey=(key)llStringTrim(llList2String(lThisLine,1),STRING_TRIM);
string sTextureName=llStringTrim(llList2String(lThisLine,0),STRING_TRIM);
if(kTextureKey)
{
if(llStringLength(GetShortName(sTextureName))>23)
{
llOwnerSay("Texture name "+sTextureName+" in textures notecard too long, dropping.");
}
else if(llGetInventoryType(sTextureName)!=INVENTORY_TEXTURE) // let's not add things that are in inventory.
{
g_lNotecardTextures+=sTextureName;
g_lNotecardTextureKeys+=kTextureKey;
}
else llOwnerSay(sTextureName+" in notecard ignored as already found in inventory. If you remove this texture from inventory, edit the textures notecard (add and delete a blank line) then save the card again to re-read it.");
}
else llOwnerSay("Texture key for "+sTextureName+" in textures notecard not recognised, dropping.");
}
++g_iNotecardLine;
g_kNotecardRead=llGetNotecardLine(g_sTextureCard,g_iNotecardLine);
}
}
}
changed(integer change)
{
if(change&CHANGED_LINK) llResetScript();
else if (change & CHANGED_INVENTORY)
{
if(llGetInventoryType(g_sTextureCard)==INVENTORY_NOTECARD && llGetInventoryKey(g_sTextureCard)!=g_kTextureCardUUID) loadNotecardTextures();
}
else if (change&CHANGED_OWNER) llResetScript();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

847
LSL/OpenCollar - timer.lsl Normal file
View File

@@ -0,0 +1,847 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - timer //
// version 3.993 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
list g_lTimes;
integer g_iTimesLength;
integer g_iCurrentTime;
integer g_iOnTime;
integer g_iLastTime;
integer g_iFirstOnTime;
integer g_iFirstRealTime;
integer g_iLastRez;
integer n;//for loops
string g_sMessage;
integer MAX_TIME=0x7FFFFFFF;
integer ATTACHMENT_COMMAND = 602;
integer ATTACHMENT_FORWARD = 610;
//these can change
integer REAL_TIME=1;
integer REAL_TIME_EXACT=5;
integer ON_TIME=3;
integer ON_TIME_EXACT=7;
string CTYPE = "collar";
integer g_iInterfaceChannel;
// end time keeper
string g_sSubMenu = "Timer";
string g_sParentMenu = "Apps";
key g_kMenuID;
key g_kOnMenuID;
key g_kRealMenuID;
key g_kWearer;
list g_lLocalButtons = ["RL","Online"];
list g_lTimeButtons = ["RESET","+00:01","+00:05","+00:30","+03:00","+24:00","-00:01","-00:05","-00:30","-03:00","-24:00"];
integer g_iOnRunning;
integer g_iOnSetTime;
integer g_iOnTimeUpAt;
integer g_iRealRunning;
integer g_iRealSetTime;
integer g_iRealTimeUpAt;
integer g_iCollarLocked;
integer g_iUnlockCollar = 0;
integer g_iClearRLVRestions = 0;
integer g_iUnleash = 0;
integer g_iBoth = 0;
integer g_iWhoCanChangeTime = 504;
integer g_iWhoCanChangeLeash = 504;
integer g_iTimeChange;
list lButtons;
integer COMMAND_OWNER = 500;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_WEARERLOCKEDOUT = 521;
integer LM_SETTING_SAVE = 2000;
integer LM_SETTING_RESPONSE = 2002;
integer LM_SETTING_DELETE = 2003;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
// Added by WhiteFire
integer TIMER_EVENT = -10000; // str = "start" or "end". For start, either "online" or "realtime".
integer WEARERLOCKOUT = 620;
string UPMENU = "BACK";
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
DoMenu(key keyID, integer iAuth)
{
if (keyID)
{
//fnord
}
else
{
return;
}
//Debug("timeremaning:"+(string)(g_iOnTimeUpAt-g_iOnTime));
string sPrompt = "\n A frozen pizza takes ~12 min to bake.\n";
list lMyButtons = g_lLocalButtons + lButtons;
sPrompt += "\n Online Timer: "+Int2Time(g_iOnSetTime);
if (g_iOnRunning==1)
{
sPrompt += "\n Online Timer: "+Int2Time(g_iOnTimeUpAt-g_iOnTime)+" left\n";
}
else
{
sPrompt += "\n Online Timer: not running\n";
}
sPrompt += "\n RL Timer: "+Int2Time(g_iRealSetTime);
if (g_iRealRunning==1)
{
sPrompt += "\n RL Timer: "+Int2Time(g_iRealTimeUpAt-g_iCurrentTime)+" left";
}
else
{
sPrompt += "\n RL Timer: not running";
}
if (g_iBoth)
{
lMyButtons += ["☒ combined"];
}
else
{
lMyButtons += ["☐ combined"];
}
if (g_iUnlockCollar)
{
lMyButtons += ["☒ unlock"];
}
else
{
lMyButtons += ["☐ unlock"];
}
if (g_iUnleash)
{
lMyButtons += ["☒ unleash"];
}
else
{
lMyButtons += ["☐ unleash"];
}
if (g_iClearRLVRestions)
{
lMyButtons += ["☒ clear RLV"];
}
else
{
lMyButtons += ["☐ clear RLV"];
}
if (g_iRealRunning || g_iOnRunning)
{
lMyButtons += ["STOP"];
lMyButtons += ["RESET"];
}
else if (g_iRealSetTime || g_iOnSetTime)
{
lMyButtons += ["START"];
lMyButtons += ["RESET"];
}
sPrompt+="\n\nwww.opencollar.at/timer";
llListSort(g_lLocalButtons, 1, TRUE);
g_kMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
}
DoOnMenu(key keyID, integer iAuth)
{
if (keyID == NULL_KEY) return;
string sPrompt = "\n Online Time Settings\n";
sPrompt += "\n Online Timer: "+Int2Time(g_iOnSetTime);
if (g_iOnRunning)
{
sPrompt += "\n Online Timer: "+Int2Time(g_iOnTimeUpAt-g_iOnTime)+" left";
}
else
{
sPrompt += "\n Online Timer: not running";
}
g_kOnMenuID = Dialog(keyID, sPrompt, g_lTimeButtons, [UPMENU], 0, iAuth);
}
DoRealMenu(key keyID, integer iAuth)
{
if (keyID == NULL_KEY) return;
string sPrompt = "\n RL Time Settings\n";
sPrompt += "\n RL timer: " + Int2Time(g_iRealSetTime);
if (g_iRealRunning)
{
sPrompt += "\n RL Timer: "+Int2Time(g_iRealTimeUpAt-g_iCurrentTime)+" left";
}
else
{
sPrompt += "\n RL Timer: not running";
}
g_kRealMenuID = Dialog(keyID, sPrompt, g_lTimeButtons, [UPMENU], 0, iAuth);
}
string Int2Time(integer sTime)
{
if (sTime<0) sTime=0;
integer iSecs=sTime%60;
sTime = (sTime-iSecs)/60;
integer iMins=sTime%60;
sTime = (sTime-iMins)/60;
integer iHours=sTime%24;
integer iDays = (sTime-iHours)/24;
//this is the onley line that needs changing...
return ( (string)iDays+" days "+
llGetSubString("0"+(string)iHours,-2,-1) + ":"+
llGetSubString("0"+(string)iMins,-2,-1) + ":"+
llGetSubString("0"+(string)iSecs,-2,-1) );
//return (string)iDays+":"+(string)iHours+":"+(string)iMins+":"+(string)iSecs;
}
TimerFinish()
{
if(g_iBoth && (g_iOnRunning == 1 || g_iRealRunning == 1))
{
return;
}
llMessageLinked(LINK_THIS, WEARERLOCKOUT, "off", "");
if(g_iUnlockCollar)
{
llMessageLinked(LINK_THIS, COMMAND_OWNER, "unlock", g_kWearer);
}
if(g_iClearRLVRestions)
{
llMessageLinked(LINK_THIS, COMMAND_OWNER, "clear", g_kWearer);
if(!g_iUnlockCollar && g_iCollarLocked)
{
llSleep(2);
llMessageLinked(LINK_THIS, COMMAND_OWNER, "lock", g_kWearer);
}
}
if(g_iUnleash && g_iWhoCanChangeTime <= g_iWhoCanChangeLeash)
{
llMessageLinked(LINK_THIS, COMMAND_OWNER, "unleash", g_kWearer);
}
g_iUnlockCollar=g_iClearRLVRestions=g_iUnleash=0;
g_iOnSetTime=g_iRealSetTime=0;
g_iOnRunning=g_iRealRunning=0;
g_iOnTimeUpAt=g_iRealTimeUpAt=0;
g_iWhoCanChangeTime=504;
llOwnerSay("Yay! Timer expired!");
llMessageLinked(LINK_THIS, TIMER_EVENT, "end", "");
}
TimerStart(integer perm)
{
// do What has to be Done
g_iWhoCanChangeTime = perm;
if(g_iRealSetTime)
{
g_iRealTimeUpAt=g_iCurrentTime+g_iRealSetTime;
llMessageLinked(LINK_THIS, WEARERLOCKOUT, "on", "");
llMessageLinked(LINK_THIS, TIMER_EVENT, "START", "RL");
g_iRealRunning=1;
}
else
{
g_iRealRunning=3;
}
if(g_iOnSetTime)
{
g_iOnTimeUpAt=g_iOnTime+g_iOnSetTime;
llMessageLinked(LINK_THIS, WEARERLOCKOUT, "on", "");
llMessageLinked(LINK_THIS, TIMER_EVENT, "START", "Online");
g_iOnRunning=1;
}
else
{
g_iOnRunning=3;
}
}
integer UserCommand(integer iNum, string sStr, key kID)
{
if (iNum == COMMAND_EVERYONE) return TRUE;
else if (iNum > COMMAND_EVERYONE || iNum < COMMAND_OWNER) return FALSE;
if (llToLower(sStr) == "timer" || sStr == "menu "+g_sSubMenu) DoMenu(kID, iNum);
else if(llGetSubString(sStr, 0, 5) == "timer ")
{
//Debug(sStr);
string sMsg=llGetSubString(sStr, 6, -1);
//we got a response for something we handle locally
if (sMsg == "RL") DoRealMenu(kID, iNum);
else if (sMsg == "Online") DoOnMenu(kID, iNum);
else if (sMsg == "START")
{
TimerStart(iNum);
if(kID != g_kWearer) DoMenu(kID, iNum);
}
else if (sMsg == "STOP")
{
TimerFinish();
DoMenu(kID, iNum);
}
else if (sMsg == "RESET")
{
g_iRealSetTime=g_iRealTimeUpAt=0;
g_iOnSetTime=g_iOnTimeUpAt=0;
if(g_iRealRunning == 1 || g_iOnRunning == 1){
g_iRealRunning=0;
g_iOnRunning=0;
TimerFinish();
}
DoMenu(kID, iNum);
}
else if (sMsg =="☒ combined")
{
g_iBoth = FALSE;
DoMenu(kID, iNum);
}
else if (sMsg == "☐ combined")
{
g_iBoth = TRUE;
DoMenu(kID, iNum);
}
else if(sMsg=="☒ unlock")
{
if (iNum == COMMAND_OWNER) g_iUnlockCollar=0;
else
{
Notify(kID,"Only the owner can change if the " + CTYPE + " unlocks when the timer runs out.",FALSE);
}
DoMenu(kID, iNum);
}
else if(sMsg=="☐ unlock")
{
if(iNum == COMMAND_OWNER) g_iUnlockCollar=1;
else
{
Notify(kID,"Only the owner can change if the " + CTYPE + " unlocks when the timer runs out.",FALSE);
}
DoMenu(kID, iNum);
}
else if(sMsg=="☒ clear RLV")
{
if(iNum == COMMAND_WEARER)
{
Notify(kID,"You cannot change if the RLV settings are cleared",FALSE);
}
else g_iClearRLVRestions=0;
DoMenu(kID, iNum);
}
else if(sMsg=="☐ clear RLV")
{
if(iNum == COMMAND_WEARER)
{
Notify(kID,"You cannot change if the RLV settings are cleared",FALSE);
}
else g_iClearRLVRestions=1;
DoMenu(kID, iNum);
}
else if(sMsg=="☒ unleash")
{
if(iNum <= g_iWhoCanChangeLeash) g_iUnleash=0;
else
{
Notify(kID,"Only the someone who can leash the sub can change if the " + CTYPE + " unleashes when the timer runs out.",FALSE);
}
DoMenu(kID, iNum);
}
else if(sMsg=="☐ unleash")
{
if(iNum <= g_iWhoCanChangeLeash) g_iUnleash=1;
else
{
Notify(kID,"Only the someone who can leash the sub can change if the " + CTYPE + " unleashes when the timer runs out.",FALSE);
}
DoMenu(kID, iNum);
}
else if(llGetSubString(sMsg, 0, 5) == "Online")
{
sMsg="on" + llStringTrim(llGetSubString(sMsg, 6, -1), STRING_TRIM_HEAD);
}
if(llGetSubString(sMsg, 0, 1) == "on")
{
sMsg=llStringTrim(llGetSubString(sMsg, 2, -1), STRING_TRIM_HEAD);
if (iNum <= g_iWhoCanChangeTime)
{
list lTimes = llParseString2List(llGetSubString(sMsg, 1, -1), [":"], []);
if (sMsg == "RESET")
{
g_iOnSetTime=g_iOnTimeUpAt=0;
if(g_iOnRunning == 1)
{
//unlock
g_iOnRunning=0;
TimerFinish();
}
}
else if (llGetSubString(sMsg, 0, 0) == "+")
{
g_iTimeChange=llList2Integer(lTimes,0)*60*60+llList2Integer(lTimes,1)*60;
g_iOnSetTime += g_iTimeChange;
if (g_iOnRunning==1)
{
g_iOnTimeUpAt += g_iTimeChange;
}
else if(g_iOnRunning==3)
{
g_iOnTimeUpAt=g_iOnTime+g_iOnSetTime;
g_iOnRunning=1;
}
}
else if (llGetSubString(sMsg, 0, 0) == "-")
{
g_iTimeChange=-(llList2Integer(lTimes,0)*60*60+llList2Integer(lTimes,1)*60);
g_iOnSetTime += g_iTimeChange;
if (g_iOnSetTime<0)
{
g_iOnSetTime=0;
}
if (g_iOnRunning==1)
{
g_iOnTimeUpAt += g_iTimeChange;
if (g_iOnTimeUpAt<=g_iOnTime)
{
//unlock
g_iOnRunning=g_iOnSetTime=g_iOnTimeUpAt=0;
TimerFinish();
}
}
}
else if (llGetSubString(sMsg, 0, 0) == "=")
{
g_iTimeChange=llList2Integer(lTimes,0)*60*60+llList2Integer(lTimes,1)*60;
if (g_iTimeChange <= 0) return TRUE; // use clear.
g_iOnSetTime = g_iTimeChange;
if (g_iOnRunning==1)
{
g_iOnTimeUpAt = g_iOnTime + g_iTimeChange;
}
else if(g_iOnRunning==3)
{
g_iOnTimeUpAt=g_iOnTime + g_iTimeChange;
g_iOnRunning=1;
}
}
else
{
return TRUE;
}
}
DoOnMenu(kID, iNum);
}
else if(llGetSubString(sMsg, 0, 7) == "RL")
{
sMsg="real" + llStringTrim(llGetSubString(sMsg, 6, -1), STRING_TRIM_HEAD);
}
if(llGetSubString(sMsg, 0, 3) == "real")
{
sMsg=llStringTrim(llGetSubString(sMsg, 4, -1), STRING_TRIM_HEAD);
list lTimes = llParseString2List(llGetSubString(sMsg, 1, -1), [":"], []);
if (iNum <= g_iWhoCanChangeTime)
{
if (sMsg == "RESET")
{
g_iRealSetTime=g_iRealTimeUpAt=0;
if(g_iRealRunning == 1)
{
//unlock
g_iRealRunning=0;
TimerFinish();
}
}
else if (llGetSubString(sMsg, 0, 0) == "+")
{
g_iTimeChange=llList2Integer(lTimes,0)*60*60+llList2Integer(lTimes,1)*60;
g_iRealSetTime += g_iTimeChange;
if (g_iRealRunning==1) g_iRealTimeUpAt += g_iTimeChange;
else if(g_iRealRunning==3)
{
g_iRealTimeUpAt=g_iCurrentTime+g_iRealSetTime;
g_iRealRunning=1;
}
}
else if (llGetSubString(sMsg, 0, 0) == "-")
{
g_iTimeChange=-(llList2Integer(lTimes,0)*60*60+llList2Integer(lTimes,1)*60);
g_iRealSetTime += g_iTimeChange;
if (g_iRealSetTime<0) g_iRealSetTime=0;
if (g_iRealRunning==1)
{
g_iRealTimeUpAt += g_iTimeChange;
if (g_iRealTimeUpAt<=g_iCurrentTime)
{
//unlock
g_iRealRunning=g_iRealSetTime=g_iRealTimeUpAt=0;
TimerFinish();
}
}
}
else if (llGetSubString(sMsg, 0, 0) == "=")
{
g_iTimeChange=llList2Integer(lTimes,0)*60*60+llList2Integer(lTimes,1)*60;
if (g_iTimeChange <= 0) return TRUE; // Not handled.
g_iRealSetTime = g_iTimeChange;
if (g_iRealRunning==1) g_iRealTimeUpAt = g_iCurrentTime+g_iRealSetTime;
else if(g_iRealRunning==3)
{
g_iRealTimeUpAt=g_iCurrentTime+g_iRealSetTime;
g_iRealRunning=1;
}
}
else return TRUE;
}
DoRealMenu(kID, iNum);
}
}
return TRUE;
}
default {
on_rez(integer iParam) {
g_iLastTime=g_iLastRez=llGetUnixTime();
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "timer|sendtimers");
if (g_iRealRunning == 1 || g_iOnRunning == 1) {
llMessageLinked(LINK_THIS, WEARERLOCKOUT, "on", "");
}
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_iLastTime=llGetUnixTime();
llSetTimerEvent(1);
g_kWearer = llGetOwner();
g_iInterfaceChannel = (integer)("0x" + llGetSubString(g_kWearer,30,-1));
if (g_iInterfaceChannel > 0) g_iInterfaceChannel = -g_iInterfaceChannel;
g_iFirstOnTime=MAX_TIME;
g_iFirstRealTime=MAX_TIME;
llRegionSayTo(g_kWearer, g_iInterfaceChannel, "timer|sendtimers");
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
list info = llParseString2List (sStr, ["|"], []);
if(iNum==ATTACHMENT_FORWARD && llList2String(info, 0)=="timer")//request for us
{
//Debug(sStr);
string sCommand = llList2String(info, 1);
integer type = llList2Integer(info, 2);
if(sCommand=="settimer")
{
//should check values but I am not yet.
if(type==REAL_TIME)
{
integer newtime = llList2Integer(info, 3) +g_iCurrentTime;
g_lTimes=g_lTimes+[REAL_TIME,newtime];
if(g_iFirstRealTime>newtime)
{
g_iFirstRealTime=newtime;
}
g_sMessage="timer|timeis|"+(string)REAL_TIME+"|"+(string)g_iCurrentTime;
}
else if(type==REAL_TIME_EXACT)
{
integer newtime = llList2Integer(info, 3);
g_lTimes=g_lTimes+[REAL_TIME,newtime];
if(g_iFirstRealTime>newtime)
{
g_iFirstRealTime=newtime;
}
}
else if(type==ON_TIME)
{
integer newtime = llList2Integer(info, 3) +g_iOnTime;
g_lTimes=g_lTimes+[ON_TIME,newtime];
if(g_iFirstOnTime>newtime)
{
g_iFirstOnTime=newtime;
}
g_sMessage="timer|timeis|"+(string)ON_TIME+"|"+(string)g_iOnTime;
}
else if(type==ON_TIME_EXACT)
{
integer newtime = llList2Integer(info, 3) +g_iOnTime;
g_lTimes=g_lTimes+[ON_TIME,newtime];
if(g_iFirstOnTime>newtime)
{
g_iFirstOnTime=newtime;
}
}
}
else if(sCommand=="gettime")
{
if(type==REAL_TIME)
{
g_sMessage="timer|timeis|"+(string)REAL_TIME+"|"+(string)g_iCurrentTime;
}
else if(type==ON_TIME)
{
g_sMessage="timer|timeis|"+(string)ON_TIME+"|"+(string)g_iOnTime;
}
}
else
{
return;
//message got sent to us or something went wrong
}
if(iNum==ATTACHMENT_FORWARD)
{
llRegionSayTo(g_kWearer, g_iInterfaceChannel, g_sMessage);
}
}
else if(iNum == COMMAND_WEARERLOCKEDOUT && sStr == "menu")
{
if (g_iOnRunning || g_iRealRunning)
Notify(kID , "You are locked out of the " + CTYPE + " until the timer expires", FALSE);
}
else if (iNum == LM_SETTING_DELETE)
{
if (sStr == "leash_leashedto") g_iWhoCanChangeLeash=504;
else if (sStr == "Global_locked") g_iCollarLocked=0;
}
else if (iNum == LM_SETTING_SAVE)
{
list lParams = llParseString2List(sStr, ["="], []);
string token = llList2String(lParams, 0);
string value = llList2String(lParams, 1);
if (token == "Global_locked" && (integer)value == 1) g_iCollarLocked = 1;
else if (token == "leash_leashedto")
{
integer auth = (integer)llList2String(llParseString2List(value, [","], []), 1);
if (auth < g_iWhoCanChangeLeash)
{
g_iWhoCanChangeLeash = auth;
}
}
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == "Global_locked") g_iCollarLocked=(integer)sValue;
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{ // our parent menu requested to receive buttons, so send ours
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
lButtons = [] ; // flush submenu buttons
llMessageLinked(LINK_THIS, MENUNAME_REQUEST, g_sSubMenu, "");
}
else if (iNum == MENUNAME_RESPONSE) // a button is sned ot be added to a plugin
{
list lParts = llParseString2List(sStr, ["|"], []);
if (llList2String(lParts, 0) == g_sSubMenu)
{//someone wants to stick something in our menu
string sButton = llList2String(lParts, 1);
if (llListFindList(lButtons, [sButton]) == -1)
// if the button isnt in our benu yet, than we add it
{
lButtons = llListSort(lButtons + [sButton], 1, TRUE);
}
}
}
else if (iNum == MENUNAME_REMOVE)
{
integer iIndex;
list lParts = llParseString2List(sStr, ["|"], []);
if (llList2String(lParts, 0) == g_sSubMenu)
{
string sButton = llList2String(lParts, 1);
iIndex = llListFindList(lButtons, [sButton]);
if (iIndex != -1)
{
lButtons = llDeleteSubList(lButtons, iIndex, iIndex);
}
}
}
else if (UserCommand(iNum, sStr, kID)) return;
else if (iNum == DIALOG_RESPONSE)
{
if (llListFindList([g_kMenuID, g_kOnMenuID, g_kRealMenuID], [kID]) != -1)
{//this is one of our menus
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMsg = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (kID == g_kMenuID)
{
if (sMsg == UPMENU)
{
llMessageLinked(LINK_THIS, iAuth, "menu "+g_sParentMenu, kAv);
}
else if (llListFindList(lButtons, [sMsg]))
{
UserCommand(iAuth, "timer " + sMsg, kAv);
}
else if (~llListFindList(lButtons, [sMsg]))
{
llMessageLinked(LINK_THIS, iAuth, "menu "+sMsg, kAv);
}
}
else if (kID == g_kOnMenuID)
{
if (sMsg == UPMENU) DoMenu(kAv, iAuth);
else UserCommand(iAuth, "timer on"+sMsg, kAv);
}
else if (kID == g_kRealMenuID)
{
if (sMsg == UPMENU) DoMenu(kAv, iAuth);
else UserCommand(iAuth, "timer real"+sMsg, kAv);
}
}
}
}
timer()
{
g_iCurrentTime=llGetUnixTime();
if (g_iCurrentTime<(g_iLastRez+60))
{
return;
}
if ((g_iCurrentTime-g_iLastTime)<60)
{
g_iOnTime+=g_iCurrentTime-g_iLastTime;
}
if(g_iOnTime>=g_iFirstOnTime)
{
//could store which is need but if both are trigered it will have to send both anyway I prefer not to check for that.
g_sMessage="timer|timeis|"+(string)ON_TIME+"|"+(string)g_iOnTime;
llRegionSayTo(g_kWearer, g_iInterfaceChannel, g_sMessage);
g_iFirstOnTime=MAX_TIME;
g_iTimesLength=llGetListLength(g_lTimes);
for(n = 0; n < g_iTimesLength; n = n + 2)// send notice and find the next time.
{
if(llList2Integer(g_lTimes, n)==ON_TIME)
{
while(llList2Integer(g_lTimes, n+1)<=g_iOnTime&&llList2Integer(g_lTimes, n)==ON_TIME&&g_lTimes!=[])
{
g_lTimes=llDeleteSubList(g_lTimes, n, n+1);
g_iTimesLength=llGetListLength(g_lTimes);
}
if(llList2Integer(g_lTimes, n)==ON_TIME&&llList2Integer(g_lTimes, n+1)<g_iFirstOnTime)
{
g_iFirstOnTime=llList2Integer(g_lTimes, n+1);
}
}
}
}
if(g_iCurrentTime>=g_iFirstRealTime)
{
//could store which is need but if both are trigered it will have to send both anyway I prefer not to check for that.
g_sMessage="timer|timeis|"+(string)REAL_TIME+"|"+(string)g_iCurrentTime;
llRegionSayTo(g_kWearer, g_iInterfaceChannel, g_sMessage);
g_iFirstRealTime=MAX_TIME;
g_iTimesLength=llGetListLength(g_lTimes);
for(n = 0; n < g_iTimesLength; n = n + 2)// send notice and find the next time.
{
if(llList2Integer(g_lTimes, n)==REAL_TIME)
{
while(llList2Integer(g_lTimes, n+1)<=g_iCurrentTime&&llList2Integer(g_lTimes, n)==REAL_TIME)
{
g_lTimes=llDeleteSubList(g_lTimes, n, n+1);
g_iTimesLength=llGetListLength(g_lTimes);
}
if(llList2Integer(g_lTimes, n)==REAL_TIME&&llList2Integer(g_lTimes, n+1)<g_iFirstRealTime)
{
g_iFirstRealTime=llList2Integer(g_lTimes, n+1);
}
}
}
}
if(g_iOnRunning == 1 && g_iOnTimeUpAt<=g_iOnTime)
{
g_iOnRunning = 0;
TimerFinish();
}
if(g_iRealRunning == 1 && g_iRealTimeUpAt<=g_iCurrentTime)
{
g_iRealRunning = 0;
TimerFinish();
}
g_iLastTime=g_iCurrentTime;
}
/*
changed(integer iChange) {
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
}
*/
}

311
LSL/OpenCollar - titler.lsl Normal file
View File

@@ -0,0 +1,311 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - titler //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// Nandana Singh, Satomi Ahn, Romka Swallowtail, littlemousy, Wendy Starfall
string g_sParentMenu = "Apps";
string g_sFeatureName = "Titler";
string g_sPrimDesc = "FloatText"; //description text of the hovertext prim. Needs to be separated from the menu name.
//MESSAGE MAP
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
//integer UPDATE = 10001;
integer LM_SETTING_SAVE = 2000;
integer LM_SETTING_REQUEST = 2001;
integer LM_SETTING_RESPONSE = 2002;
integer LM_SETTING_DELETE = 2003;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
//integer DIALOG_TIMEOUT = -9002;
integer g_iLastRank = 504; //COMMAND_EVERYONE
integer g_iOn = FALSE;
string g_sText;
vector g_vColor = <1.0,1.0,1.0>; // default white
integer g_iTextPrim;
string g_sScript= "titler_";
key g_kWearer;
key g_kDialogID; //menu handle
key g_kColourDialogID; //menu handle
key g_kTBoxId; //text box handle
string SET = "Set Title" ;
string UP = "↑ Up";
string DN = "↓ Down";
string ON = "☒ Show";
string OFF = "☐ Show";
string UPMENU = "BACK";
float min_z = 0.25 ; // min height
float max_z = 1.0 ; // max height
vector g_vPrimScale = <0.02,0.02,0.5>; // prim size, initial value (z - text offset height)
list g_lColours=[
"Magenta",<1.00000, 0.00000, 0.50196>,
"Pink",<1.00000, 0.14902, 0.50980>,
"Hot Pink",<1.00000, 0.05490, 0.72157>,
"Firefighter",<0.88627, 0.08627, 0.00392>,
"Sun",<1.00000, 1.00000, 0.18039>,
"Flame",<0.92941, 0.43529, 0.00000>,
"Matrix",<0.07843, 1.00000, 0.07843>,
"Electricity",<0.00000, 0.46667, 0.92941>,
"Violet Wand",<0.63922, 0.00000, 0.78824>,
"Black",<0.00000, 0.00000, 0.00000>,
"White",<1.00000, 1.00000, 1.00000>
];
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth){
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
//Debug("Made menu.");
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer){
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
ShowHideText(){
//Debug("ShowHideText");
//llSleep(1.0); // not sure that it should be
if (g_iTextPrim >0){
if (g_sText == "") g_iOn = FALSE;
llSetLinkPrimitiveParamsFast(g_iTextPrim, [PRIM_TEXT,g_sText,g_vColor,(float)g_iOn, PRIM_SIZE,g_vPrimScale, PRIM_SLICE,<0.490,0.51,0.0>]);
}
}
integer UserCommand(integer iAuth, string sStr, key kAv){
if (iAuth < COMMAND_OWNER || iAuth > COMMAND_WEARER) return FALSE;
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llToLower(llList2String(lParams, 0));
if (llToLower(sStr) == "menu titler") {
string ON_OFF ;
string sPrompt;
if (g_iTextPrim == -1) {
sPrompt="\nThis design is missing a FloatText box. Titler disabled.";
sPrompt+= "\n\nwww.opencollar.at/titler";
g_kDialogID = Dialog(kAv, sPrompt, [], [UPMENU],0, iAuth);
} else {
sPrompt = "\nCurrent Title: " + g_sText ;
sPrompt+= "\n\nwww.opencollar.at/titler";
if(g_iOn == TRUE) ON_OFF = ON ;
else ON_OFF = OFF ;
g_kDialogID = Dialog(kAv, sPrompt, [SET,UP,DN,ON_OFF,"Color"], [UPMENU],0, iAuth);
}
} else if (sStr=="menu titlercolor" || sStr=="titlercolor") {
list lColourNames;
integer numColours=llGetListLength(g_lColours)/2;
while (numColours--){
lColourNames+=llList2String(g_lColours,numColours*2);
}
g_kColourDialogID = Dialog(kAv, "\n\nSelect a colour from the list", lColourNames, [UPMENU],0, iAuth);
} else if (sCommand=="titlercolor") {
string sColour= llDumpList2String(llDeleteSubList(lParams,0,0)," ");
integer colourIndex=llListFindList(g_lColours,[sColour]);
if (~colourIndex){
g_vColor=(vector)llList2String(g_lColours,colourIndex+1);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"color="+(string)g_vColor, "");
}
ShowHideText();
} else if (sStr == "runaway" && (iAuth == COMMAND_OWNER || iAuth == COMMAND_WEARER)) {
g_sText = "";
g_iOn = FALSE;
ShowHideText();
llResetScript();
} else if (llSubStringIndex(sCommand,"title")==0) {
if (g_iOn && iAuth > g_iLastRank) { //only change text if commander has smae or greater auth
Notify(kAv,"You currently have not the right to change the Titler settings, someone with a higher rank set it!", FALSE);
} else if (sCommand == "title") {
string sNewText= llDumpList2String(llDeleteSubList(lParams, 0, 0), " ");//pop off the "text" command
g_sText = llDumpList2String(llParseStringKeepNulls(sNewText, ["\\n"], []), "\n");// make it possible to insert line breaks in hover text
if (sNewText == "") {
g_iOn = FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript+"title", "");
} else {
g_iOn = TRUE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"title="+g_sText, "");
}
g_iLastRank=iAuth;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"on="+(string)g_iOn, "");
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"auth="+(string)g_iLastRank, ""); // save lastrank to DB
} else if (sCommand == "titleoff") {
g_iLastRank = COMMAND_EVERYONE;
g_iOn = FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript+"on", "");
llMessageLinked(LINK_SET, LM_SETTING_DELETE, g_sScript+"auth", ""); // del lastrank from DB
} else if (sCommand == "titleon") {
g_iLastRank = iAuth;
g_iOn = TRUE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"on="+(string)g_iOn, "");
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"auth="+(string)g_iLastRank, ""); // save lastrank to DB
} else if (sCommand == "titleup") {
g_vPrimScale.z += 0.05 ;
if(g_vPrimScale.z > max_z) g_vPrimScale.z = max_z ;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"height="+(string)g_vPrimScale.z, "");
} else if (sCommand == "titledown") {
g_vPrimScale.z -= 0.05 ;
if(g_vPrimScale.z < min_z) g_vPrimScale.z = min_z ;
llMessageLinked(LINK_SET, LM_SETTING_SAVE, g_sScript+"height="+(string)g_vPrimScale.z, "");
} else if (sCommand == "titlebox") {
g_kTBoxId = Dialog(kAv, "\n- Submit the new title in the field below.\n- Submit a blank field to go back to " + g_sFeatureName + ".", [], [], 0, iAuth);
}
ShowHideText();
}
return TRUE;
}
default {
on_rez(integer param) {
llResetScript();
}
state_entry() {
//llSetMemoryLimit(65536); //this script needs to be profiled, and its memory limited
g_iTextPrim = -1 ;
// find the text prim
integer linkNumber = llGetNumberOfPrims()+1;
while (linkNumber-- >2){
string desc = llList2String(llGetLinkPrimitiveParams(linkNumber, [PRIM_DESC]),0);
if (llSubStringIndex(desc, g_sPrimDesc) == 0) {
if (llList2Integer(llGetLinkPrimitiveParams(linkNumber,[PRIM_TYPE]),0)==PRIM_TYPE_BOX){
g_iTextPrim = linkNumber;
llSetLinkPrimitiveParamsFast(g_iTextPrim,[PRIM_DESC,g_sPrimDesc+"~notexture~nocolor~nohide"]);
linkNumber = 0 ; // break while cycle
} else {
llSetLinkPrimitiveParamsFast(linkNumber,[PRIM_TEXT,"",<0,0,0>,0]);
}
}
}
g_kWearer = llGetOwner();
if (g_iTextPrim < 0) {
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu + "|" + g_sFeatureName, "");
llRemoveInventory(llGetScriptName());
}
//Debug("Starting");
}
link_message(integer iSender, integer iNum, string sStr, key kID){
//Debug("Link Message Event");
if (UserCommand(iNum, sStr, kID)) return;
if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu) {
llMessageLinked(LINK_ROOT, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sFeatureName, "");
} else if (iNum == LM_SETTING_RESPONSE) {
string sGroup = llGetSubString(sStr, 0, llSubStringIndex(sStr, "_") );
string sToken = llGetSubString(sStr, llSubStringIndex(sStr, "_")+1, llSubStringIndex(sStr, "=")-1);
string sValue = llGetSubString(sStr, llSubStringIndex(sStr, "=")+1, -1);
if (sGroup == g_sScript) {
if(sToken == "title") g_sText = sValue;
if(sToken == "on") g_iOn = (integer)sValue;
if(sToken == "color") g_vColor = (vector)sValue;
if(sToken == "height") g_vPrimScale.z = (float)sValue;
if(sToken == "auth") g_iLastRank = (integer)sValue; // restore lastrank from DB
} else if( sStr == "settings=sent") ShowHideText();
} else if (iNum == DIALOG_RESPONSE) {
if (kID == g_kDialogID) { //response from our main menu
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == SET) {
UserCommand(iAuth, "titlebox", kAv);
} else if (sMessage == "Color") {
UserCommand(iAuth, "menu titlercolor", kAv);
} else if (sMessage == UPMENU) {
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
} else {
if (sMessage == UP) UserCommand(iAuth, "titleup", kAv);
else if (sMessage == DN) UserCommand(iAuth, "titledown", kAv);
else if (sMessage == OFF) UserCommand(iAuth, "titleon", kAv);
else if (sMessage == ON) UserCommand(iAuth, "titleoff", kAv);
UserCommand(iAuth, "menu titler", kAv);
}
} else if (kID == g_kColourDialogID) { //response form the colours menu
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU) {
UserCommand(iAuth, "menu titler", kAv);
} else {
UserCommand(iAuth, "titlercolor "+sMessage, kAv);
UserCommand(iAuth, "menu titlercolor", kAv);
}
} else if (kID == g_kTBoxId) { //response from text box
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if(sMessage != "") UserCommand(iAuth, "title " + sMessage, kAv);
UserCommand(iAuth, "menu " + g_sFeatureName, kAv);
}
}
}
changed(integer iChange){
if (iChange & (CHANGED_OWNER|CHANGED_LINK)) llResetScript();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

42
LSL/OpenCollar License Normal file
View File

@@ -0,0 +1,42 @@
----------------------
OpenCollar License
----------------------
[In-World Notecard Object of the GPLv2]
The OpenCollar scripts are licensed under the GPLv2 (http://www.gnu.org/licenses/gpl-2.0.txt), with the following addendum:
Throughout this license the term "authors" refers to Nandana Singh, Lulu Pink, Garvin Twine, Cleo Collins, Wendy Starfall, Satomi Ahn, Joy Stipe, Medea Destiny, littlemousy and other contributors to OpenCollar - submission set free.
"Full perms" means maintaining the modify, copy, and transfer permissions in Second Life. If the Second Life platform should allow more fine-grained permissions in the future, then "full perms" will mean the most permissive possible set of permissions allowed by the platform.
The OpenCollar scripts are free to be copied, modified, and redistributed, subject to the following conditions:
- If you distribute the OpenCollar scripts, you must leave them full perms. (This includes using the scripts in collars that you make.)
- If you modify the OpenCollar scripts and distribute the modifications, you must also make your modifications full perms.
Custom plugins that are entirely created by you, and which communicate with the OpenCollar scripts only through link messages, are not subject to the above restrictions.
The OpenCollar hug and kiss scripts were originally created by Francis Chung, with only slight modifications by Ilse Mannonen. To the best of our knowledge, they are in the public domain.
To the best of our knowledge, the animations included in OpenCollar which were not created by the authors (which is most of them), may be used without restriction. Animations created by the authors as well as animations created by Marine Kelley which are named arch, bendover, booty, cutie, display and kneel as of version 3.940 must remain full perms. If you created one of the included animations and would like to have it removed, please notify Wendy Starfall.
Likewise, all textures included in the OpenCollar that were not created by the authors are, to the best of our knowledge, free to use for any purpose. The textures included which were created by the authors must remain full perms. If you created one of the included textures and would like to have it removed, please notify Wendy Starfall.
The base OpenCollar object (in which the OpenCollar scripts are placed) must also remain full perms. (If you want to use the OpenCollar scripts in collars that you have made and wish to sell, you can restrict copy or trans permissions on your prims, but you must leave the OpenCollar scripts full perms).
------------------------------
3rd Party Extension Policy
------------------------------
Part of OpenCollar being "open" means that we aim to provide a platform that people can easily integrate with. We encourage people to create their own products, tools, extensions, or services that integrate with OpenCollar. You're even free to charge money for them. There are a few ground rules though:
1. Any scripts containing OpenCollar code must use the GPL license and remain full perms in SL.
2. You must be very very clear that your product/service/whatever is not affiliated with or supported by the OpenCollar project. Users must not be confused about who they're trusting.
3. You must not advertise in the OpenCollar groups. Our groups prohibit all advertising. There is no exception for products that integrate with OpenCollar in some way.
(We may add to those rules if we missed something important or see people trying to pick loopholes in them, but that's it for now.)
We are eager to welcome creators willing to follow these rules. We want to support your creativity by giving you a solid platform to build on, and we want you as part of our community.
For now, violations of these rules will be dealt with through group ejection and public shunning. We may in the future create a directory of third party products and services that we trust. Violators of these rules will be forbidden from being on that list.

View File

@@ -0,0 +1,156 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollarUpdater - BundleGiver //
// version 3.928 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// this script receives DO_BUNDLE messages that contain the uuid of the collar being updated,
// the name of a bundle notecard, the talkchannel on which the collar shim script is listening, and
// the script pin set by the shim. This script then loops over the items listed in the notecard
// and chats with the shim about each one. Items that are already present (as determined by uuid)
// are skipped. Items not present are given to the collar. Items that are present but don't have the
// right uuid are deleted and replaced with the version in the updater. Scripts are loaded with
// llRemoteLoadScriptPin, and are set running immediately.
// once the end of the notecard is reached, this script sends a BUNDLE_DONE message that includes all the same
// stuff it got in DO_BUNDLE (talkchannel, recipient, card, pin).
integer DO_BUNDLE = 98749;
integer BUNDLE_DONE = 98750;
integer talkchannel;
key rcpt;
string card;
integer pin;
string mode;
integer line;
key lineid;
integer listener;
SetStatus(string name) {
// use card name, item type, and item name to set a nice
// text status message
list cardparts = llParseString2List(card, ["_"], []);
string bundle = llList2String(cardparts, 2);
string msg = llDumpList2String([
"Doing Bundle: " + bundle,
"Doing Item: " + name
], "\n");
llSetText(msg, <1,1,1>, 1.0);
}
debug(string msg) {
//llOwnerSay(llGetScriptName() + ": " + msg);
}
default
{
link_message(integer sender, integer num, string str, key id)
{
if (num == DO_BUNDLE)
{
debug("doing bundle: " + str);
// str will be in form talkchannel|uuid|bundle_card_name
list parts = llParseString2List(str, ["|"], []);
talkchannel = (integer)llList2String(parts, 0);
rcpt = (key)llList2String(parts, 1);
card = llList2String(parts, 2);
pin = (integer)llList2String(parts, 3);
mode = llList2String(parts, 4); // either INSTALL or REMOVE
line = 0;
llListenRemove(listener);
listener = llListen(talkchannel, "", rcpt, "");
// get the first line of the card
lineid = llGetNotecardLine(card, line);
}
}
dataserver(key id, string data)
{
if (id == lineid)
{
if (data != EOF)
{
// process bundle line
list parts = llParseString2List(data, ["|"], []);
string type = llList2String(parts, 0);
string name = llList2String(parts, 1);
key uuid;
string msg;
SetStatus(name);
uuid = llGetInventoryKey(name);
msg = llDumpList2String([type, name, uuid, mode], "|");
debug("querying: " + msg);
llRegionSayTo(rcpt, talkchannel, msg);
}
else
{
debug("finished bundle: " + card);
// all done reading the card. send link msg to main script saying we're done.
llListenRemove(listener);
llSetText("", <1,1,1>, 1.0);
llMessageLinked(LINK_SET, BUNDLE_DONE, llDumpList2String([talkchannel, rcpt, card, pin, mode], "|"), "");
}
}
}
listen(integer channel, string name, key id, string msg)
{
debug("heard: " + msg);
// let's live on the edge and assume that we only ever listen with a uuid filter so we know it's safe
// look for msgs in the form <type>|<name>|<cmd>
list parts = llParseString2List(msg, ["|"], []);
if (llGetListLength(parts) == 3)
{
string type = llList2String(parts, 0);
string name = llList2String(parts, 1);
string cmd = llList2String(parts, 2);
if (cmd == "SKIP" || cmd == "OK")
{
// move on to the next item by reading the next notecard line
line++;
lineid = llGetNotecardLine(card, line);
}
else if (cmd == "GIVE")
{
// give the item, and then read the next notecard line.
if (type == "ITEM")
{
llGiveInventory(id, name);
}
else if (type == "SCRIPT")
{
// get the full name, and load it via script pin.
llRemoteLoadScriptPin(id, name, pin, TRUE, 0);
}
line++;
lineid = llGetNotecardLine(card, line);
}
}
}
on_rez(integer num)
{
llResetScript();
}
changed(integer change)
{
if (change & CHANGED_INVENTORY)
{
llResetScript();
}
}
}

View File

@@ -0,0 +1,450 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollarUpdater - Dialog //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//an adaptation of Schmobag Hogfather's SchmoDialog script
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
integer COMMAND_RELAY_SAFEWORD = 511;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer SUBMENU = 3002;
integer MENUNAME_REMOVE = 3003;
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001;//RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002;//RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; //RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer ANIM_START = 7000;//send this with the name of an anim in the string part of the message to play the anim
integer ANIM_STOP = 7001;//send this with the name of an anim in the string part of the message to stop the anim
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer iPagesize = 12;
string MORE = "►";
string PREV = "◄";
string UPMENU = "BACK"; // string to identify the UPMENU button in the utility lButtons
//string SWAPBTN = "swap";
//string SYNCBTN = "sync";
string BLANK = " ";
integer g_iTimeOut = 300;
integer g_iReapeat = 5;//how often the timer will go off, in seconds
list g_lMenus;//9-strided list in form listenChan, dialogid, listener, starttime, recipient, prompt, list buttons, utility buttons, currentpage
//where "list buttons" means the big list of choices presented to the user
//and "page buttons" means utility buttons that will appear on every page, such as one saying "go up one level"
//and "currentpage" is an integer meaning which page of the menu the user is currently viewing
list g_lRemoteMenus;
integer g_iStrideLength = 9;
key g_kWearer;
Notify(key keyID, string sMsg, integer nAlsoNotifyWearer)
{
Debug((string)keyID);
if (keyID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(keyID)) llRegionSayTo(keyID,0,sMsg);
else llInstantMessage(keyID,sMsg);
if (nAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
list CharacterCountCheck(list lIn, key ID)
// checks if any of the times is over 24 characters and removes them if needed
{
list lOut;
string s;
integer i;
integer m=llGetListLength(lIn);
for (i=0;i<m;i++)
{
s=llList2String(lIn,i);
if (llStringLength(s)>24)
{
Notify(ID, "The following button is longer than 24 characters and has been removed (can be caused by the name length of the item in the collars inventory): "+s, TRUE);
}
else
{
lOut+=[s];
}
}
return lOut;
}
integer RandomUniqueChannel()
{
integer iOut = llRound(llFrand(10000000)) + 100000;
if (~llListFindList(g_lMenus, [iOut]))
{
iOut = RandomUniqueChannel();
}
return iOut;
}
Dialog(key kRecipient, string sPrompt, list lMenuItems, list lUtilityButtons, integer iPage, key kID)
{
//string sThisPrompt = " (Timeout in "+ (string)g_iTimeOut +" seconds.)";
string sThisPrompt;
list lButtons;
list lCurrentItems;
integer iNumitems = llGetListLength(lMenuItems);
integer iStart;
integer iMyPageSize = iPagesize - llGetListLength(lUtilityButtons);
//slice the menuitems by page
if (iNumitems > iMyPageSize)
{
iMyPageSize=iMyPageSize-2;//we'll use two slots for the MORE and PREV button, so shrink the page accordingly
iStart = iPage * iMyPageSize;
integer iEnd = iStart + iMyPageSize - 1;
//multi page menu
//lCurrentItems = llList2List(lMenuItems, iStart, iEnd);
lButtons = llList2List(lMenuItems, iStart, iEnd);
sThisPrompt = sThisPrompt + " Page "+(string)(iPage+1)+"/"+(string)(((iNumitems-1)/iMyPageSize)+1);
}
else
{
iStart = 0;
lButtons = lMenuItems;
}
// check promt lenghtes
integer iPromptlen=llStringLength(sPrompt);
if (iPromptlen>511)
{
Notify(kRecipient,"The dialog prompt message is longer than 512 characters. It will be truncated to 512 characters.",TRUE);
sPrompt=llGetSubString(sPrompt,0,510);
sThisPrompt = sPrompt;
}
else if (iPromptlen + llStringLength(sThisPrompt)< 512)
{
sThisPrompt= sPrompt + sThisPrompt;
}
else
{
sThisPrompt= sPrompt;
}
//integer stop = llGetListLength(lCurrentItems);
//integer n;
//for (n = 0; n < stop; n++)
//{
// string sName = llList2String(lMenuItems, iStart + n);
// lButtons += [sName];
//}
lButtons = SanitizeButtons(lButtons);
lUtilityButtons = SanitizeButtons(lUtilityButtons);
integer iChan = RandomUniqueChannel();
integer g_iListener = llListen(iChan, "", kRecipient, "");
llSetTimerEvent(g_iReapeat);
if (iNumitems > iMyPageSize)
{
llDialog(kRecipient, sThisPrompt, PrettyButtons(lButtons, lUtilityButtons,[PREV,MORE]), iChan);
}
else
{
llDialog(kRecipient, sThisPrompt, PrettyButtons(lButtons, lUtilityButtons,[]), iChan);
}
integer ts = llGetUnixTime() + g_iTimeOut;
g_lMenus += [iChan, kID, g_iListener, ts, kRecipient, sPrompt, llDumpList2String(lMenuItems, "|"), llDumpList2String(lUtilityButtons, "|"), iPage];
}
list SanitizeButtons(list lIn)
{
integer iLength = llGetListLength(lIn);
integer n;
for (n = iLength - 1; n >= 0; n--)
{
integer type = llGetListEntryType(lIn, n);
if (llList2String(lIn, n) == "") //remove empty sStrings
{
lIn = llDeleteSubList(lIn, n, n);
}
else if (type != TYPE_STRING) //cast anything else to string
{
lIn = llListReplaceList(lIn, [llList2String(lIn, n)], n, n);
}
}
return lIn;
}
list PrettyButtons(list lOptions, list lUtilityButtons, list iPagebuttons)
{//returns a list formatted to that "options" will start in the top left of a dialog, and "utilitybuttons" will start in the bottom right
list lSpacers;
list lCombined = lOptions + lUtilityButtons + iPagebuttons;
while (llGetListLength(lCombined) % 3 != 0 && llGetListLength(lCombined) < 12)
{
lSpacers += [BLANK];
lCombined = lOptions + lSpacers + lUtilityButtons + iPagebuttons;
}
// check if a UPBUTTON is present and remove it for the moment
integer u = llListFindList(lCombined, [UPMENU]);
if (u != -1)
{
lCombined = llDeleteSubList(lCombined, u, u);
}
list lOut = llList2List(lCombined, 9, 11);
lOut += llList2List(lCombined, 6, 8);
lOut += llList2List(lCombined, 3, 5);
lOut += llList2List(lCombined, 0, 2);
//make sure we move UPMENU to the lower right corner
if (u != -1)
{
lOut = llListInsertList(lOut, [UPMENU], 2);
}
return lOut;
}
list RemoveMenuStrkIDe(list lMenu, integer iIndex)
{
//tell this function the menu you wish to remove, identified by list index
//it will close the listener, remove the menu's entry from the list, and return the new list
//should be called in the listen event, and on menu timeout
integer g_iListener = llList2Integer(lMenu, iIndex + 2);
llListenRemove(g_iListener);
return llDeleteSubList(lMenu, iIndex, iIndex + g_iStrideLength - 1);
}
CleanList()
{
//Debug("cleaning list");
//loop through menus and remove any whose timeouts are in the past
//start at end of list and loop down so that indices don't get messed up as we remove items
integer iLength = llGetListLength(g_lMenus);
integer n;
integer iNow = llGetUnixTime();
for (n = iLength - g_iStrideLength; n >= 0; n -= g_iStrideLength)
{
integer iDieTime = llList2Integer(g_lMenus, n + 3);
//Debug("dietime: " + (string)iDieTime);
if (iNow > iDieTime)
{
Debug("menu timeout");
key kID = llList2Key(g_lMenus, n + 1);
llMessageLinked(LINK_SET, DIALOG_TIMEOUT, "", kID);
g_lMenus = RemoveMenuStrkIDe(g_lMenus, n);
}
}
}
ClearUser(key kRCPT)
{
//find any strides belonging to user and remove them
integer iIndex = llListFindList(g_lMenus, [kRCPT]);
while (~iIndex)
{
Debug("removed stride for " + (string)kRCPT);
g_lMenus = llDeleteSubList(g_lMenus, iIndex - 4, iIndex - 5 + g_iStrideLength);
iIndex = llListFindList(g_lMenus, [kRCPT]);
}
Debug(llDumpList2String(g_lMenus, ","));
}
Debug(string sStr)
{
//llOwnerSay(llGetScriptName() + ": " + sStr);
}
integer InSim(key id)
{
return llKey2Name(id) != "";
}
default
{
state_entry()
{
g_kWearer=llGetOwner();
}
on_rez(integer iParam)
{
llResetScript();
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (iNum == DIALOG)
{//give a dialog with the options on the button labels
//str will be pipe-delimited list with rcpt|prompt|page|backtick-delimited-list-buttons|backtick-delimited-utility-buttons
Debug(sStr);
list lParams = llParseStringKeepNulls(sStr, ["|"], []);
key kRCPT = (key)llList2String(lParams, 0);
integer iIndex = llListFindList(g_lRemoteMenus, [kRCPT]);
if (~iIndex)
{
if (!InSim(kRCPT))
{
llHTTPRequest(llList2String(g_lRemoteMenus, iIndex+1), [HTTP_METHOD, "POST"], sStr+"|"+(string)kID);
return;
}
else
{
g_lRemoteMenus = llListReplaceList(g_lRemoteMenus, [], iIndex, iIndex+1);
}
}
string sPrompt = llList2String(lParams, 1);
integer iPage = (integer)llList2String(lParams, 2);
list lbuttons = CharacterCountCheck(llParseStringKeepNulls(llList2String(lParams, 3), ["`"], []), kRCPT);
list ubuttons = llParseString2List(llList2String(lParams, 4), ["`"], []);
//first clean out any strides already in place for that user. prevents having lots of listens open if someone uses the menu several times while sat
ClearUser(kRCPT);
//now give the dialog and save the new stride
Dialog(kRCPT, sPrompt, lbuttons, ubuttons, iPage, kID);
}
else if (llGetSubString(sStr, 0, 10) == "remotemenu:")
{
if (iNum == COMMAND_OWNER || iNum == COMMAND_SECOWNER)
{
string sCmd = llGetSubString(sStr, 11, -1);
Debug("dialog cmd:" + sCmd);
if (llGetSubString(sCmd, 0, 3) == "url:")
{
integer iIndex = llListFindList(g_lRemoteMenus, [kID]);
if (~iIndex)
{
g_lRemoteMenus = llListReplaceList(g_lRemoteMenus, [kID, llGetSubString(sCmd, 4, -1)], iIndex, iIndex+1);
}
else
{
g_lRemoteMenus += [kID, llGetSubString(sCmd, 4, -1)];
}
llMessageLinked(LINK_SET, iNum, "menu", kID);
}
else if (llGetSubString(sCmd, 0, 2) == "off")
{
integer iIndex = llListFindList(g_lRemoteMenus, [kID]);
if (~iIndex)
{
g_lRemoteMenus = llListReplaceList((g_lRemoteMenus = []) + g_lRemoteMenus, [], iIndex, iIndex+1);
}
}
else if (llGetSubString(sCmd, 0, 8) == "response:")
{
list lParams = llParseString2List(llGetSubString(sCmd, 9, -1), ["|"], []);
//llMessageLinked(LINK_SET, DIALOG_RESPONSE, (string)kAv + "|" + sMessage + "|" + (string)iPage, kMenuID);
llMessageLinked(LINK_SET, DIALOG_RESPONSE, llList2String(lParams, 0) + "|" + llList2String(lParams, 1) + "|" + llList2String(lParams, 2), llList2String(lParams, 3));
}
else if (llGetSubString(sCmd, 0, 7) == "timeout:")
{
llMessageLinked(LINK_SET, DIALOG_TIMEOUT, "", llGetSubString(sCmd, 8, -1));
}
}
}
}
listen(integer iChan, string sName, key kID, string sMessage)
{
integer iMenuIndex = llListFindList(g_lMenus, [iChan]);
if (~iMenuIndex)
{
key kMenuID = llList2Key(g_lMenus, iMenuIndex + 1);
key kAv = llList2Key(g_lMenus, iMenuIndex + 4);
string sPrompt = llList2String(g_lMenus, iMenuIndex + 5);
list items = llParseStringKeepNulls(llList2String(g_lMenus, iMenuIndex + 6), ["|"], []);
list ubuttons = llParseStringKeepNulls(llList2String(g_lMenus, iMenuIndex + 7), ["|"], []);
integer iPage = llList2Integer(g_lMenus, iMenuIndex + 8);
g_lMenus = RemoveMenuStrkIDe(g_lMenus, iMenuIndex);
if (sMessage == MORE)
{
Debug((string)iPage);
//increase the page num and give new menu
iPage++;
integer thisiPagesize = iPagesize - llGetListLength(ubuttons) - 2;
if (iPage * thisiPagesize >= llGetListLength(items))
{
iPage = 0;
}
Dialog(kID, sPrompt, items, ubuttons, iPage, kMenuID);
}
else if (sMessage == PREV)
{
Debug((string)iPage);
//increase the page num and give new menu
iPage--;
if (iPage < 0)
{
integer thisiPagesize = iPagesize - llGetListLength(ubuttons) - 2;
iPage = (llGetListLength(items)-1)/thisiPagesize;
}
Dialog(kID, sPrompt, items, ubuttons, iPage, kMenuID);
}
else if (sMessage == BLANK)
{
//give the same menu back
Dialog(kID, sPrompt, items, ubuttons, iPage, kMenuID);
}
else
{
llMessageLinked(LINK_SET, DIALOG_RESPONSE, (string)kAv + "|" + sMessage + "|" + (string)iPage, kMenuID);
}
}
}
timer()
{
CleanList();
//if list is empty after that, then stop timer
if (!llGetListLength(g_lMenus))
{
Debug("no active dialogs, stopping timer");
llSetTimerEvent(0.0);
}
}
}

View File

@@ -0,0 +1,373 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollarUpdater - Master //
// version 3.988 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// https://github.com/lickx/opencollar-os/tree/oscollar3 //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// This is the master updater script. It complies with the update handshake
// protocol that OC has been using for quite some time, and should therefore be
// compatible with current OC collars. the internals of this script, and the
// the other parts of the new updater, have been completely re-written. Don't
// expect this to work like the old updater. Because we load an update shim
// script right after handshaking, we're free to rewrite everything that comes
// after the handshake.
// In addition to the handshake and shim installation, this script decides
// which bundles should be installed into (or removed from) the collar. It
// loops over each bundle in inventory, telling the BundleGiver script to
// install or remove each.
// This script also does a little bit of magic to ensure that the updater's
// version number always matches the contents of the ".version" card.
key version_line_id;
integer initChannel = -7483214;
integer iSecureChannel;
// store the script pin here when we get it from the collar.
integer iPin;
// the collar's key
key kCollarKey;
// strided list of bundles in the prim and whether they are supposed to be
// installed.
list lBundles;
// here we remember the index of the bundle that's currently being installed/removed
// by the bundlegiver.
integer iBundleIdx;
// handle for our dialogs
key kDialogID;
integer DO_BUNDLE = 98749;
integer BUNDLE_DONE = 98750;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
string BTN_REQUIRED = " ★ ";
string BTN_INSTALL = " ☒ ";
string BTN_UNINSTALL = " ☐ ";
string BTN_DEPRECATED = " ♻ ";
string INSTALL_METHOD = "Standard";
string g_sVersion;
// A wrapper around llSetScriptState to avoid the problem where it says it can't
// find scripts that are already not running.
DisableScript(string name) {
if (llGetInventoryType(name) == INVENTORY_SCRIPT) {
if (llGetScriptState(name) != FALSE) {
llSetScriptState(name, FALSE);
}
}
}
DoBundle() {
// tell bundle slave to load the bundle.
string card = llList2String(lBundles, iBundleIdx);
string mode = llList2String(lBundles, iBundleIdx + 1);
string bundlemsg = llDumpList2String([iSecureChannel, kCollarKey, card, iPin, mode], "|");
llMessageLinked(LINK_SET, DO_BUNDLE, bundlemsg, "");
}
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage) {
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|" + llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`"), kID);
return kID;
}
SetBundleStatus(string bundlename, string status) {
// find the bundle in the list
integer n;
integer stop = llGetListLength(lBundles);
for (n = 0; n < stop; n += 2) {
string card = llList2String(lBundles, n);
list parts = llParseString2List(card, ["_"], []);
string name = llList2String(parts, 2);
if (name == bundlename) {
lBundles = llListReplaceList(lBundles, [status], n + 1, n + 1);
return;
}
}
}
SetInstallmode(string type) {
//user clicked default.. restore Bundle Status
if(type == "Standard") {
lBundles = [];
integer n;
integer stop = llGetInventoryNumber(INVENTORY_NOTECARD);
for (n = 0; n < stop; n++) {
string name = llGetInventoryName(INVENTORY_NOTECARD, n);
if (llSubStringIndex(name, "BUNDLE_") == 0) {
list parts = llParseString2List(name, ["_"], []);
lBundles += [name, llList2String(parts, -1)];
}
}
return;
}
string newstatus;
integer n;
integer stop = llGetListLength(lBundles);
//user clicked Basic.. set Bundle Status
if(type == "Basic")
{
newstatus = "REMOVE";
}
else if (type == "Developer")
{
newstatus = "INSTALL";
}
for (n = 0; n < stop; n += 2)
{
string card = llList2String(lBundles, n);
string status = llList2String(lBundles, n + 1);
if (status != "REQUIRED" && status != "DEPRECATED")
{
lBundles = llListReplaceList(lBundles, [newstatus], n + 1, n + 1);
}
}
}
BundleMenu(integer page) {
// Give the plugin selection/start menu.
string prompt = "\n\nAdd/remove plugins by checking the boxes below.";
prompt += "\n\nClick START when you're ready to update.\n";
// build list of buttons from list of bundles
integer n;
integer stop = llGetListLength(lBundles);
list choices;
for (n = 0; n < stop; n += 2) {
string card = llList2String(lBundles, n);
string status = llList2String(lBundles, n + 1);
list parts = llParseString2List(card, ["_"], []);
string name = llList2String(parts, 2);
if (status == "INSTALL") {
choices += [BTN_INSTALL + " " + name];
} else if (status == "REQUIRED") {
choices += [BTN_REQUIRED + " " + name];
} else if (status == "REMOVE") {
choices += [BTN_UNINSTALL + " " + name];
} else if (status == "DEPRECATED") {
choices += [BTN_DEPRECATED + " " + name];
}
}
kDialogID = Dialog(llGetOwner(), prompt + "\n", choices, ["START"], page);
}
GiveMethodMenu() {
//string prompt = "\n\nStandard: \"The most popular features, RLV and Relay.\"\n";
//prompt += "\nBasic: \"Just the modular core and essential basics.\"\n";
//prompt += "\nCustom: \"Make your own selection of features here.\"\n";
string prompt = "\n\nPlease select Standard or Custom installation.\n\nCustom is recommended if you want to add apps such as Timer and Camera, add extra height scalars or remove standard modules such as RLV or Animations.";
prompt += "\n\nwww.opencollar.at/updates\n";
prompt += "\n\nThe currently selected method is ["+INSTALL_METHOD+"]";
list choices = ["Standard","Custom"];
kDialogID = Dialog(llGetOwner(), prompt, choices, ["START"],0);
}
Debug(string str) {
//llOwnerSay(llGetScriptName() + ": " + str);
}
ReadVersionLine() {
// try to keep object's version in sync with ".version" notecard.
if (llGetInventoryType(".version") == INVENTORY_NOTECARD) {
version_line_id = llGetNotecardLine(".version", 0);
}
}
SetFloatText() {
llSetText("Version "+g_sVersion, <1,1,1>, 1.0);
}
Particles(key target) {
llParticleSystem([
PSYS_PART_FLAGS,
PSYS_PART_INTERP_COLOR_MASK |
PSYS_PART_INTERP_SCALE_MASK |
PSYS_PART_TARGET_POS_MASK |
PSYS_PART_EMISSIVE_MASK,
PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE,
PSYS_SRC_TEXTURE, "aa383f73-8be2-c693-acf0-9b8be8b4a155",
PSYS_SRC_TARGET_KEY, target,
PSYS_PART_START_SCALE, <0.68, 0.64, 0>,
PSYS_PART_END_SCALE, <0.04, 0.04, 0>,
PSYS_PART_START_ALPHA, 0.1,
PSYS_PART_END_ALPHA, 1,
PSYS_SRC_BURST_PART_COUNT, 4,
PSYS_PART_MAX_AGE, 2,
PSYS_SRC_BURST_SPEED_MIN, 0.2,
PSYS_SRC_BURST_SPEED_MAX, 1
]);
}
default {
state_entry() {
ReadVersionLine();
llListen(initChannel, "", "", "");
// set all scripts except self to not running
// also build list of all bundles
integer n;
integer stop = llGetInventoryNumber(INVENTORY_ALL);
for (n = 0; n < stop; n++) {
string name = llGetInventoryName(INVENTORY_ALL, n);
integer type = llGetInventoryType(name);
if (type == INVENTORY_SCRIPT) {
// ignore updater scripts. set others to not running.
if (llSubStringIndex(name, "OpenCollarUpdater") != 0) {
DisableScript(name);
}
} else if (type == INVENTORY_NOTECARD) {
// add card to bundle list if it's a bundle
if (llSubStringIndex(name, "BUNDLE_") == 0) {
list parts = llParseString2List(name, ["_"], []);
lBundles += [name, llList2String(parts, -1)];
}
}
}
SetFloatText();
llParticleSystem([]);
}
listen(integer channel, string name, key id, string msg) {
if (llGetOwnerKey(id) == llGetOwner()) {
Debug(llDumpList2String([name, msg], ", "));
if (channel == initChannel) {
// everything heard on the init channel is stuff that has to
// comply with the existing update kickoff protocol. New stuff
// will be heard on the random secure channel instead.
list parts = llParseString2List(msg, ["|"], []);
string cmd = llList2String(parts, 0);
string param = llList2String(parts, 1);
if (cmd == "UPDATE") {
// someone just clicked the upgrade button on their collar.
llWhisper(initChannel, "get ready");
} else if (cmd == "ready") {
// person clicked "Yes I want to update" on the collar menu.
// the script pin will be in the param
iPin = (integer)param;
kCollarKey = id;
//BundleMenu(0);
GiveMethodMenu();
}
} else if (channel == iSecureChannel) {
if (msg == "reallyready") {
Particles(id);
iBundleIdx = 0;
DoBundle();
}
}
}
}
// when we get a BUNDLE_DONE message, move to the next bundle
link_message(integer sender, integer num, string str, key id) {
if (num == DIALOG_RESPONSE) {
if (id == kDialogID) {
list parts = llParseString2List(str, ["|"], []);
key av = (key)llList2String(parts, 0);
string button = llList2String(parts, 1);
integer page = (integer)llList2String(parts, 2);
if (button == "START") {
// so let's load the shim.
string shim = "OpenCollar - UpdateShim";
iSecureChannel = (integer)llFrand(-2000000000 + 1);
llListen(iSecureChannel, "", kCollarKey, "");
llRemoteLoadScriptPin(kCollarKey, shim, iPin, TRUE, iSecureChannel);
}
//else if (button == "Basic" || button == "Standard" || button == "Developer")
else if (button == "Standard")
{
INSTALL_METHOD = button;
SetInstallmode(button);
GiveMethodMenu();
} else if (button == "Custom") {
BundleMenu(0);
}
/*else if (button == "Help") {
llLoadURL(av, "Confused with the many choices? Find help on our website!","http://www.opencollar.at/updates.html");
}*/
else {
// switch the bundle if appropriate
string status = llGetSubString(button, 0, 2);
string bundlename = llGetSubString(button, 4, -1);
if (status == BTN_REQUIRED) {
llOwnerSay("The " + bundlename + " bundle is required and cannot be removed.");
} else if (status == BTN_DEPRECATED) {
llOwnerSay("The " + bundlename + " bundle is deprecated and must be removed.");
} else if (status == BTN_INSTALL) {
// if the button said +, that means we need to switch it to -
// find the bundle in the list, and set to REMOVE
SetBundleStatus(bundlename, "REMOVE");
llOwnerSay(bundlename + " will be removed if present.");
} else if (status == BTN_UNINSTALL) {
SetBundleStatus(bundlename, "INSTALL");
llOwnerSay(bundlename + " will be updated/installed.");
}
BundleMenu(page);
}
}
} else if (num == BUNDLE_DONE) {
// see if there's another bundle
integer count = llGetListLength(lBundles);
iBundleIdx += 2;
if (iBundleIdx < count) {
DoBundle();
} else {
// tell the shim to restore settings, set version,
// remove the script pin, and delete himself.
string myversion = llList2String(llParseString2List(llGetObjectName(), [" - "], []), 1);
llRegionSayTo(kCollarKey, iSecureChannel, "CLEANUP|" + myversion);
SetFloatText();
llParticleSystem([]);
}
}
}
on_rez(integer param) {
llResetScript();
}
changed(integer change) {
if (change & CHANGED_INVENTORY) {
// Resetting on inventory change ensures that the bundle list is
// kept current, and that the .version card is re-read if it
// changes.
llResetScript();
}
}
dataserver(key id, string data) {
if (id == version_line_id) {
// make sure that object version matches this card.
g_sVersion=data;
SetFloatText();
list nameparts = llParseString2List(llGetObjectName(), [" - "], []);
integer length = llGetListLength(nameparts);
if (length == 2) {
nameparts = llListReplaceList(nameparts, [data], 1, 1);
} else if (length == 1) {
nameparts += [data];
}
llSetObjectName(llDumpList2String(nameparts, " - "));
}
}
}

7
LSL/coupleanims Normal file
View File

@@ -0,0 +1,7 @@
hug|~hug|~hug|0.4|_SELF_ hugs _PARTNER_.
kiss|~kiss|~kiss|0.4|_SELF_ kisses _PARTNER_.
pet|~bottom|~top|0.55|_PARTNER_ pets _SELF_'s head.
subhug|~leg-bottom|~leg-top|0.55|_SELF_ hugs _PARTNER_'s legs.
footkiss|~foot-bottom|~foot-top|1.1|_SELF_ kisses _PARTNER_'s foot.
bootlick|~boot-bottom|~boot-top|1.0|_SELF_ licks _PARTNER_'s boot.
jumphug|~jump-bottom|~jump-top|0.6|_SELF_ jumps into _PARTNER_'s arms.

0
LSL/defaultsettings Normal file
View File

15
LSL/textures Normal file
View File

@@ -0,0 +1,15 @@
Blank,5ab1c02f-22e7-5238-3aec-5cc9c9a83cdd
Brass,403f16e4-85c4-8100-2694-87a9d8bf8e39
Chrome,50aa32a9-3ecc-ff6b-5051-5eb82b29b725
Fur Dark,05678cb0-dd01-5db5-6aae-b6cb14d82a66
Fur Light,7d6f388e-59ea-bbda-6a6c-91ec1b4e881c
Gem,f6e9107a-2e8c-6a82-c71d-037bb115aca8
Gold,7edfa787-ab5f-ca96-0aee-74b452d64654
Grunge,52c97672-709a-2397-9c04-f7f70b7e6b52
Lace,97b6b927-79b0-8821-7e2d-6431e3d05a0d
Leather Dark,49a0e1da-d41c-c96a-3475-06091fb44312
Leather Light,cbef7240-1b40-a457-80e3-7957914b6cb0
Rust,26ece618-e491-d845-e8b6-fb6f4bf2ad42
Silver,6af1a29a-85c0-a6ee-bba0-9de1eec29da0
Snake,f09a761d-0901-294f-3ac4-18bd8fa036fd
Steel,11cf252d-ab74-cbf4-c8a4-a5b0f54a0fe1

1
LSL/~bookmarks Normal file
View File

@@ -0,0 +1 @@
IXstatic~Oaks Woods(8,134,28)

16
LSL/~contact Normal file
View File

@@ -0,0 +1,16 @@
OsCollar is an unofficial port of OpenCollar to OpenSim.
As such, please do not contact the OpenCollar project
with (OpenSim) issues with this port.
Talk to us on OpenCollar friends (Osgrid group):
secondlife:///app/group/1fe0f858-5055-46ea-b016-8bf7c7f6f3a9/about
Report bugs at our issue tracker at:
https://github.com/lickx/opencollar-os/issues
The Adult Metaverse - OpenSim adult community at Google+:
https://plus.google.com/u/0/communities/112812844000583620045

5
LSL/~groups Normal file
View File

@@ -0,0 +1,5 @@
Click one of the links below to join a group!
Support: secondlife:///app/group/1fe0f858-5055-46ea-b016-8bf7c7f6f3a9/about

13
LSL/~news Normal file
View File

@@ -0,0 +1,13 @@
OpenCollar-OS 3.998.3 - Built Jan 21st 2017
* Backported a critical fix for the leash vs couple hug code
* Disable by default this news bulletin you are now seeing
It is strongly recommended to update if you haven't already.
Please be aware this is a legacy collar, active development
is focused on the newer Six collars.
OsGrid local teleport:
secondlife://Oaks Woods/8/134/28
Hypergrid (World Map):
hg.osgrid.org:80:Oaks Woods

5
LSL/~places Normal file
View File

@@ -0,0 +1,5 @@
To visit us click a link down below!
TBD

108
LSL/~styles Normal file
View File

@@ -0,0 +1,108 @@
[ Classic ]
Base~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~0
Bell~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
Hinges~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
Slide~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
Ring~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
[ Rough ]
Base~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~0
Bell~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Hinges~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Slide~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Ring~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
[ Iron ]
Base~1b7fe355-a9b3-4873-a4e5-c351fdc5b033~<1,1,1>~0
Bell~1b7fe355-a9b3-4873-a4e5-c351fdc5b033~<1,1,1>~1
Hinges~1b7fe355-a9b3-4873-a4e5-c351fdc5b033~<1,1,1>~1
Slide~1b7fe355-a9b3-4873-a4e5-c351fdc5b033~<1,1,1>~1
Ring~1b7fe355-a9b3-4873-a4e5-c351fdc5b033~<1,1,1>~1
[ Black ]
Base~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~0
Bell~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~1
Hinges~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~1
Slide~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~1
Ring~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~1
[ White ]
Base~6f8b160f-5c49-4af7-8f4f-d46c707935a9~<1,1,1>~0
Bell~6f8b160f-5c49-4af7-8f4f-d46c707935a9~<1,1,1>~1
Hinges~6f8b160f-5c49-4af7-8f4f-d46c707935a9~<1,1,1>~1
Slide~6f8b160f-5c49-4af7-8f4f-d46c707935a9~<1,1,1>~1
Ring~6f8b160f-5c49-4af7-8f4f-d46c707935a9~<1,1,1>~1
[ Red ]
Base~8eec6e8f-e553-41f6-bfaa-addaddbd47a2~<1,1,1>~0
Bell~8eec6e8f-e553-41f6-bfaa-addaddbd47a2~<1,1,1>~1
Hinges~8eec6e8f-e553-41f6-bfaa-addaddbd47a2~<1,1,1>~1
Slide~8eec6e8f-e553-41f6-bfaa-addaddbd47a2~<1,1,1>~1
Ring~8eec6e8f-e553-41f6-bfaa-addaddbd47a2~<1,1,1>~1
[ Blue ]
Base~708ca932-586a-4a3a-be02-a09442a31247~<1,1,1>~0
Bell~708ca932-586a-4a3a-be02-a09442a31247~<1,1,1>~1
Hinges~708ca932-586a-4a3a-be02-a09442a31247~<1,1,1>~1
Slide~708ca932-586a-4a3a-be02-a09442a31247~<1,1,1>~1
Ring~708ca932-586a-4a3a-be02-a09442a31247~<1,1,1>~1
[ Green ]
Base~c35d4b47-6524-4ece-950c-83dee8d9f1c4~<1,1,1>~0
Bell~c35d4b47-6524-4ece-950c-83dee8d9f1c4~<1,1,1>~1
Hinges~c35d4b47-6524-4ece-950c-83dee8d9f1c4~<1,1,1>~1
Slide~c35d4b47-6524-4ece-950c-83dee8d9f1c4~<1,1,1>~1
Ring~c35d4b47-6524-4ece-950c-83dee8d9f1c4~<1,1,1>~1
[ Yellow ]
Base~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~0
Bell~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~1
Hinges~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~1
Slide~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~1
Ring~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~1
[ Barbie ]
Base~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~0
Bell~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~1
Hinges~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~1
Slide~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~1
Ring~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~1
[ Babygirl ]
Base~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~0
Bell~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
Hinges~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
Slide~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
Ring~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
[ B/W ]
Base~6f8b160f-5c49-4af7-8f4f-d46c707935a9~<1,1,1>~0
Bell~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~1
Hinges~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~1
Slide~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~1
Ring~6f8b160f-5c49-4af7-8f4f-d46c707935a9~<1,1,1>~1
[ BlackMix ]
Base~f3375447-79c0-4b10-b903-2a3763f47f8f~<1,1,1>~0
Bell~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
Hinges~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Slide~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Ring~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
[ RedMix ]
Base~8eec6e8f-e553-41f6-bfaa-addaddbd47a2~<1,1,1>~0
Bell~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
Hinges~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Slide~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Ring~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
[ BlueMix ]
Base~708ca932-586a-4a3a-be02-a09442a31247~<1,1,1>~0
Bell~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
Hinges~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Slide~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
Ring~4a14bf47-ea51-45b4-bbfb-84cf147d5c6f~<1,1,1>~1
[ Fluttershy ]
Base~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~0
Bell~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
Hinges~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
Slide~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
Ring~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~1
[ PinkyPie ]
Base~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~0
Bell~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~1
Hinges~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~1
Slide~049a0e94-f8bc-44bd-ae7b-10542e559b56~<1,1,1>~1
Ring~5ea6eaff-106e-488e-a091-84396d4a0423~<1,1,1>~1
[ Toy ]
Base~8eec6e8f-e553-41f6-bfaa-addaddbd47a2~<1,1,1>~0
Bell~f5c0dd85-f4e9-4018-bbfa-0e9085fb8a45~<1,1,1>~1
Hinges~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~1
Slide~708ca932-586a-4a3a-be02-a09442a31247~<1,1,1>~1
Ring~09588851-428b-4992-811a-fe226bf96a82~<1,1,1>~1

3
LSL/~update Normal file
View File

@@ -0,0 +1,3 @@
No Updater found. Please rez an Updater within 10m and try again. If you need a current Updater, get one free at [http://maps.secondlife.com/secondlife/Boulevard/50/211/23 The Temple of the Collar™] or at our [http://maps.secondlife.com/secondlife/Bondage/208/126/23 Sidekick Temple] or an alternative Updater on the [https://marketplace.secondlife.com/p/Wendys-OpenCollar-Updater/6620453 Marketplace].

1
LSL/~version Normal file
View File

@@ -0,0 +1 @@
3.998.2

View File

@@ -1,40 +1,32 @@
### Welcome to OsCollar
### Welcome to OpenCollar!
OsCollar is a set of gadgets for submission roleplay for use in OpenSim grids
OpenCollar is a set of LSL scripts and all sort of creative content, such as motions, sounds, graphics and 3D models, which can be used to create role play devices for the metaverse. Traditionally such devices would take form as graphical interface worn on the "HUD" or as fashion accessory worn on the avatar herself.
Punk, goth and fetish collars would be the most popular of those and OpenCollar eventually became the basic standard device for this kind of creative role play amongst adults on Second Life®. OpenCollar is [free software](http://www.gnu.org/philosophy/free-sw.html "What is free software?").
#### Finding your way around this repo
```
./oscollar/
#### License Terms and Addendum
> doc: Useful information and documentation
OpenCollar source code and creative resource are covered and protected by strong [copyleft](https://en.wikipedia.org/wiki/Copyleft "What does "copyleft" mean?") licenses.
> res: Resource of creative content.
* LSL scripts are licensed as and must remain under the [GNU General Public License, version 2](http://www.gnu.org/licenses/gpl-2.0).
> anims: Motions and Animations as .bvh and .avm binaries.
> creatorkit: Sample collar for creators to use as a base
> models: 3D Models as .dae and .blend binaries.
> sounds: Sounds as .wav and .aup binaries.
> textures: Images as .png and .xcf binaries.
* Creative content is licensed as and must remain under the [Creative Commons Attribution-ShareAlike 4.0 International Public License](https://creativecommons.org/licenses/by-sa/4.0/).
> src: Source code of the OsCollar role play device.
* Everything else that is shared within the metaverse and where no explicit license was applied is covered by the [License Terms for the OpenCollar Role Play Device](https://raw.githubusercontent.com/OpenCollar/opencollar/master/LICENSE).
> ao: The source code for the animation overrider HUD.
> apps: Fun features you can add to your device
> device: Everything you need for a full featured device
> extensions: Enhanced features that can be added to a device
> installer: The source code for the updater aka patch
> remote: The source code for the Remote HUD.
> spares: Spares and snippets for research and development.
**NOTE:** Please make sure that you have read and understood the full legal text of each license if your interest in OpenCollar goes beyond personal use (i.e. commercial redistribution). For human-readable summaries of various licenses, check out [tl;drLegal](https://tldrlegal.com/)
> web: Files for the updater check within the Help/About menu
```
#### Requirements
#### OpenSim Porting Information
Simulator 0.9.3.1 or newer
We target and test for OpenSim 0.8 (stable) and OpenSim 0.9 (unstable, master)
- Teleporting to a sim running older versions of OpenSim may result in loss of settings (linkset data) and loss of functionality (non-running scripts)
- Teleporting to a hypergrid sim may result in scripts to stop running and/or reset, unless the destination sim is patched
This is the oscollar3 branch, which is a port of OpenCollar 3.99x and considered legacy
Check out the oscollar6 branch for a port based on the modern OpenCollar [six]
To avoid problems, only use this on your home grid meeting the minimal requirements or better.
There are some differences between v3 and v6 collars, for instance v6 is much more optimized thanks to certain scripts being in seperate links (which can be optionally invisible, but you do need them seperate).
If you are looking to directly convert or upgrade existing v3 collars for OpenSim, you can use this oscollar3 branch which should be 100% compatible with the last v3 version in Second Life. We haven't made a transmuter tool yet to convert a v3 collar to v6.
A ready made standard OpenCollar for both branches can be be aquired at the OsGrid Sim ['Kinky Hub'](http://opensimworld.com/hop/77066-Kinky-Hub). Creators can use this standard collar as a technical reference for making new products.

View File

@@ -0,0 +1,328 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - AO Link (lite) //
// version 3.987 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// Based on Medea Destiny's AO interface script for OpenCollar.
// HOW TO: This script is intended to be dropped into ZHAO-2, Vista and Oracul
// AOs that are not already compatible with OpenCollar's AO interface. Just rez
// your existing AO Hud, right-click to open it and drop this script inside!
// This is not a complete replacement of the Sub AO as it cannot allow as complete
// access to the AO as that does, but it should provide most of the functionality
// while being very easy to add to your pre-existing AOs.
// The lite variation of this script is complementary to AntiSlide technology.
integer type;
//If left like this, script will try to determine AO type automatically.
//To force compatibility for a particular type of AO, change to:
// integer type=1; //for Oracul type AOs
// integer type=2; // for ZHAO-II type AOs
// integer type=3; // for Vista type AOs
// integer type=4; // for AKEYO type AOs
// integer type=5; // for Gaeline type AOs
//----------------------------------------------------------------------
//Integer map for above
integer ORACUL=1;
integer ZHAO=2;
integer VISTA=3;
integer AKEYO=4;
integer GAELINE=5;
// OC channel listener for comms from collar
integer g_iAOChannel = -782690;
integer g_iAOListenHandle;
//Menu handler for script's own ZHAO menu
integer g_iMenuHandle;
integer g_iMenuChannel=-23423456; //dummy channel, changed to unique on attach
list g_lMenuUsers; //list of menu users to allow for multiple users of menu
integer g_iMenuTimeout=60;
string g_sOraculstring; //configuration string for Oracul power on/off, 0 prepended for off, 1 prepended for on
//We use these two so that we can return the AO to its previous state. If the AO was already off when the OC tries to switch it off, we shouldn't switch it back on again.
integer g_iAOSwitch=TRUE; //monitor on/off from the AO's own state.
integer g_iOCSwitch=TRUE; //monitor on/off due to collar pauses (FALSE=paused, TRUE=unpaused)
integer g_iSitOverride=TRUE; //monitor AO sit override
determineType() //function to determine AO type.
{
llListenRemove(g_iAOListenHandle);
type=0;
integer x=llGetInventoryNumber(INVENTORY_SCRIPT);
while(x)
{
--x;
string t=llToLower(llGetInventoryName(INVENTORY_SCRIPT,x));
if(~llSubStringIndex(t,"zhao")) //if we find a script with "zhao" in the name.
{
type=ZHAO;
x=0;
llOwnerSay("OC compatibility script configured for Zhao AO. Depending on your AO model, you may sometimes see your AO buttons get out of sync when the AO is accessed via the collar, just toggle a setting to restore it. NOTE! Toggling sit override now is highly recommended, but if you don't know what that means or don't have one, don't worry.");
llMessageLinked(LINK_SET, 0, "ZHAO_AOON", "");
}
else if(~llSubStringIndex(t,"vista")) //if we find a script with "zhao" in the name.
{
type=VISTA;
x=0;
llOwnerSay("OC compatibility script configured for VISTA AO. Support is very experimental since it is unknown how much was changed from ZHAO.");
llMessageLinked(LINK_SET, 0, "ZHAO_AOON", "");
}
else if(~llSubStringIndex(t,"z_ao")) //if we find a script with "z_ao" in the name.
{
type=GAELINE;
x=0;
llOwnerSay("OC compatibility script configured for Gaeline AO. Support is very experimental since it is unknown how much was changed from ZHAO.");
llMessageLinked(LINK_SET, 103, "", "");
}
else if(~llSubStringIndex(t,"oracul")) //if we find a script with "oracul" in the name.
{
type=ORACUL;
x=0;
llOwnerSay("OC compatibility script configured for Oracul AO. IMPORTANT: for proper functioning, you must now switch your AO on (switching it off first if necessary!)");
}
}
if (llSubStringIndex(llGetObjectName(),"AKEYO") >=0) { //AKEYO is not a string in their script name, it is in animations but think the object name is a better test for this AO - Sumi Perl
type = AKEYO;
llOwnerSay("OC compatibility script configured for AKEYO AO. This support is experimental. Please let us know if you notice any problems.");
}
if(type==0) llOwnerSay("Cannot identify AO type. The script:"+llGetScriptName()+" is intended to be dropped into a Zhao2 or Oracul AO hud.");
else
{
g_iAOListenHandle=llListen(g_iAOChannel,"","",""); //We identified type, start script listening!
}
}
AOPause()
{
if(g_iAOSwitch)
{
if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_SET,0,"0"+g_sOraculstring,"ocpause");
else if (type==AKEYO) llMessageLinked(LINK_ROOT, 0, "PAO_AOOFF", "ocpause");
else if(type==GAELINE) llMessageLinked(LINK_THIS, 102, "", "ocpause");
//Note: for ZHAO use LINK_THIS in pause functions, LINK_SET elsewhere. This is because ZHAOs which switch power on buttons by a script in the button reading the link messages are quite common. This avoids toggling the power switch when AO is only paused in those cases.
else if(type>1) llMessageLinked(LINK_THIS, 0, "ZHAO_AOOFF", "ocpause");//we use "ocpause" as a dummy key to identify our own linked messages so we can tell when an on or off comes from the AO rather than from the collar standoff, to sync usage.
}
g_iOCSwitch=FALSE;
}
AOUnPause()
{
if(g_iAOSwitch)
{
if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_SET,0,"1"+g_sOraculstring,"ocpause");
else if(type==AKEYO ) llMessageLinked(LINK_ROOT, 0, "PAO_AOON", "ocpause");
else if(type==GAELINE) llMessageLinked(LINK_THIS, 103, "", "ocpause");
else if(type>1 ) llMessageLinked(LINK_THIS, 0, "ZHAO_AOON", "ocpause");
}
g_iOCSwitch=TRUE;
}
zhaoMenu(key kMenuTo)
{
//script's own menu for some ZHAO features.
//Open listener if no menu users are registered in g_lMenuUsers already, and add
//menu user to list if not already present.
if(!llGetListLength(g_lMenuUsers)) g_iMenuHandle=llListen(g_iMenuChannel,"","","");
if(llListFindList(g_lMenuUsers,[kMenuTo])==-1) g_lMenuUsers+=kMenuTo;
string sSit="AO Sits ON";
if(g_iSitOverride) sSit="AO Sits OFF";
list lButtons=[sSit,"Load Notecard","Done","AO on","AO off","Next Stand"];
llSetTimerEvent(g_iMenuTimeout);
llDialog(kMenuTo,"AO options. Depending on model of AO, some may not work. Use OC Sub AO for more comprehensive control!",lButtons,g_iMenuChannel);
}
default
{
state_entry()
{
if(type==0) determineType();
g_iMenuChannel=-(integer)llFrand(999999)-10000; //randomise menu channel
}
attach(key avatar)
{
if(avatar) //on attach
{
if(type==0) determineType();
g_iMenuChannel=-(integer)llFrand(999999)-10000; //randomise menu channel
}
}
listen(integer iChannel, string sName, key kID, string sMsg)
{
if(iChannel==g_iMenuChannel) // this is for our own limited ZHAO menu.
{
if(sMsg=="Done"||sMsg=="Cancel")
{
integer i=llListFindList(g_lMenuUsers,[kID]);
if(i>-1) g_lMenuUsers=llDeleteSubList(g_lMenuUsers,i,i); //remove user from menu users list.
if(!llGetListLength(g_lMenuUsers)) //remove listener if no menu users left
{
llListenRemove(g_iMenuHandle);
llSetTimerEvent(0);
}
return; // we're done here!
}
else if(sMsg=="Load Notecard") //scan for notecards and provide a dialog to user
{
list lButtons;
integer x=llGetInventoryNumber(INVENTORY_NOTECARD);
while(x)
{
x--;
string t=llGetInventoryName(INVENTORY_NOTECARD,x);
if(llSubStringIndex(llToLower(t),"read me")==-1 && llSubStringIndex(llToLower(t),"help")==-1 && llStringLength(t)<23) lButtons+=t; //we only take notecards without "help" or "read me" in the title and with short enough names to fit on a button.
}
if(llGetListLength(lButtons)>11)
{
llRegionSayTo(kID,0,"Too many notecards found, displaying the first 11"); //ZHAO doesn't bother multi pages, so we won't.
lButtons=llDeleteSubList(lButtons,11,-1);
}
llSetTimerEvent(g_iMenuTimeout);
llDialog(kID,"Pick an AO settings notecard to load, or click Cancel",lButtons+["Cancel"],g_iMenuChannel);
}
else if(sMsg=="AO Sits ON")
{
g_iSitOverride=TRUE; //this will get set by the link message anyway, but set here just in case remenu happens before link message is read.
llMessageLinked(LINK_SET,0,"ZHAO_SITON","");
}
else if(sMsg=="AO Sits OFF")
{
g_iSitOverride=FALSE;
llMessageLinked(LINK_SET,0,"ZHAO_SITOFF","");
}
else if(sMsg=="AO on")
{
if(g_iOCSwitch) llMessageLinked(LINK_SET,0,"ZHAO_AOON",""); // don't switch on AO if we are paused
g_iAOSwitch=TRUE;
}
else if(sMsg=="AO off")
{
llMessageLinked(LINK_SET,0,"ZHAO_AOOFF","");
}
else if(sMsg=="Next Stand")
{
if(type == 2) // ZHAO-II
llMessageLinked(LINK_SET,0,"ZHAO_NEXTSTAND","");
else // VISTA
llMessageLinked(LINK_SET,0,"ZHAO_NEXTPOSE","");
}
//check if sMsg is a notecard picked from Load Notecard menu, and send load command if so.
else if(llGetInventoryType(sMsg)==INVENTORY_NOTECARD) llMessageLinked(LINK_THIS,0,"ZHAO_LOAD|"+sMsg,"");
//resend the menu where it makes sense.
if(sMsg!="Done" && sMsg!="Cancel" && sMsg!="Load Notecard") zhaoMenu(kID);
return;
}
else if(llGetOwnerKey(kID)!=llGetOwner()) return; //reject commands from other sources.
else if (iChannel==g_iAOChannel)
{
if(sMsg=="ZHAO_STANDON") AOUnPause();
else if (sMsg=="ZHAO_STANDOFF") AOPause();
else if (sMsg=="ZHAO_AOOFF")
{
if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_SET,0,"0"+g_sOraculstring,"ocpause");
else if(type==AKEYO ) llMessageLinked(LINK_ROOT, 0, "PAO_AOOFF", "ocpause");
else if(type==GAELINE) llMessageLinked(LINK_THIS, 102, "", "ocpause");
else if(type>1 ) llMessageLinked(LINK_THIS, 0, "ZHAO_AOOFF", "ocpause");
}
else if (sMsg=="ZHAO_AOON")
{
if(g_iOCSwitch)// don't switch on AO if we are paused
{
if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_SET,0,"1"+g_sOraculstring,"ocpause");
else if(type==AKEYO ) llMessageLinked(LINK_ROOT, 0, "PAO_AOON", "ocpause");
else if(type==GAELINE) llMessageLinked(LINK_THIS, 103, "", "ocpause");
else if(type>1 ) llMessageLinked(LINK_SET, 0, "ZHAO_AOON", "ocpause");
}
g_iAOSwitch=TRUE;
}
else if (llGetSubString(sMsg,0,8)=="ZHAO_MENU")
{
key kMenuTo=(key)llGetSubString(sMsg,10,-1);
if(type==ORACUL) llMessageLinked(LINK_SET,4,"",kMenuTo);
else if (type>1) zhaoMenu(kMenuTo);
}
}
}
link_message(integer iPrim, integer iNum, string sMsg, key kID)
{
if (type==ORACUL && iNum==0 && kID!="ocpause") //oracul power command
{
g_sOraculstring=llGetSubString(sMsg,1,-1); //store the config string for Oracul AO.
g_iAOSwitch=(integer)llGetSubString(sMsg,0,1); //store the AO power state.
}
else if(type>1)
{
if (sMsg=="ZHAO_SITON") g_iSitOverride=TRUE;
else if (sMsg=="ZHAO_SITOFF") g_iSitOverride=FALSE;
else if(kID!="ocpause") //ignore pause commands sent by this script, we want to know what the "correct" state is.
{
if(sMsg=="ZHAO_AOON") g_iAOSwitch=TRUE;
else if(sMsg=="ZHAO_AOOFF")
{
g_iAOSwitch=FALSE;
}
}
}
}
timer()
{
llSetTimerEvent(0);
llListenRemove(g_iMenuHandle);
//inform current menu users of listener timeout.
integer x=llGetListLength(g_lMenuUsers);
while(x)
{
x--;
key tKey=llList2Key(g_lMenuUsers,x);
if(llGetAgentSize(tKey)) llRegionSayTo(tKey,0,"AO Menu timed out, try again."); //avoid IM spam by only notifying those in sim.
}
g_lMenuUsers=[]; //clear list
}
changed(integer change)
{
if(change & CHANGED_OWNER) llResetScript();
}
}

View File

@@ -0,0 +1,336 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - AO Link //
// version 0.103 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// BETA VERSION NOTES ---------------------------------------------------
// Medea Destiny's AO interface script for OpenCollar
// This script is intended to be dropped into ZHAO-2, Vista and Oracul
// AOs that are not already compatible with OpenCollar's AO interface.
// Scope: The script tries to identify the AO type by checking script naming. It receives
// the ZHAO ON, ZHAO OFF and ZHAO Menu commands from the collar, and uses link messages to
// send appropriate commands to the AO, depending on the detected collar type. It is not a
// complete replacement of the Sub AO as it cannot allow as complete access to the AO as
// that does, but it should provide most of the functionality while being very easy to add to
// user's pre-existing AOs.
// When the AO is switched on, but the collar sends a command to switch it off, the script
// will take controls and detect for movement. While the avatar is trying to move, the AO will
// told to switch the AO back on again until movement ceases.
// An alternative to this method would be to capture the AO's walk animation and play the animation
// itself as a walk overrider. The disadvantage of that is trying to capture the walk animation
// isn't straightforward, particular when there is more than one walk configured. The disadvantage
// of this method is that it does a lot more AO triggering.
// Comments and bug reports to Medea Destiny, please!
//---------------------------------------------------------------------
integer type;
//If left like this, script will try to determine AO type automatically.
//To force compatibility for a particular type of AO, change to:
// integer type=1; //for Oracul type AOs
// integer type=2; // for ZHAO-II type AOs
// integer type=3; // for Vista type AOs
//----------------------------------------------------------------------
//Integer map for above
integer ORACUL=1;
integer ZHAO=2;
integer VISTA=3;
// OC channel listener for comms from collar
integer g_iAOChannel = -782690;
integer g_iAOListenHandle;
//Menu handler for script's own ZHAO menu
integer g_iMenuHandle;
integer g_iMenuChannel=-23423456; //dummy channel, changed to unique on attach
list g_lMenuUsers; //list of menu users to allow for multiple users of menu
integer g_iMenuTimeout=60;
string g_sOraculstring; //configuration string for Oracul power on/off, 0 prepended for off, 1 prepended for on
//We use these two so that we can return the AO to its previous state. If the AO was already off when the OC tries to switch it off, we shouldn't switch it back on again.
integer g_iAOSwitch=TRUE; //monitor on/off from the AO's own state.
integer g_iOCSwitch=TRUE; //monitor on/off due to collar pauses (FALSE=paused, TRUE=unpaused)
integer g_iSitOverride=TRUE; //monitor AO sit override
integer g_iHasPerm; //Sanity check for permissions. If we have permissions, then script takes controls and restores AO while moving.
determineType() //function to determine AO type.
{
llListenRemove(g_iAOListenHandle);
type=0;
integer x=llGetInventoryNumber(INVENTORY_SCRIPT);
while(x)
{
--x;
string t=llToLower(llGetInventoryName(INVENTORY_SCRIPT,x));
if(~llSubStringIndex(t,"zhao")) //if we find a script with "zhao" in the name.
{
type=ZHAO;
x=0;
llOwnerSay("OC compatibility script configured for Zhao AO. Depending on your AO model, you may sometimes see your AO buttons get out of sync when the AO is accessed via the collar, just toggle a setting to restore it. NOTE! Toggling sit override now is highly recommended, but if you don't know what that means or don't have one, don't worry.");
llMessageLinked(LINK_SET, 0, "ZHAO_AOON", "");
}
else if(~llSubStringIndex(t,"vista")) //if we find a script with "zhao" in the name.
{
type=VISTA;
x=0;
llOwnerSay("OC compatibility script configured for VISTA AO. Support is very experimental since it is unknown how much was changed from ZHAO");
llMessageLinked(LINK_SET, 0, "ZHAO_AOON", "");
}
else if(~llSubStringIndex(t,"oracul")) //if we find a script with "oracul" in the name.
{
type=ORACUL;
x=0;
llOwnerSay("OC compatibility script configured for Oracul AO. IMPORTANT: for proper functioning, you must now switch your AO on (switching it off first if necessary!)");
}
}
if(type==0) llOwnerSay("Cannot identify AO type. The script:"+llGetScriptName()+" is intended to be dropped into a Zhao2 or Oracul AO hud.");
else
{
g_iAOListenHandle=llListen(g_iAOChannel,"","",""); //We identified type, start script listening!
}
}
AOPause()
{
if(g_iAOSwitch)
{
//Note: for ZHAO use LINK_THIS in pause functions, LINK_SET elsewhere. This is because ZHAOs which switch power on buttons by a script in the button reading the link messages are quite common. This avoids toggling the power switch when AO is only paused in those cases.
if(type>1) llMessageLinked(LINK_THIS, 0, "ZHAO_AOOFF", "ocpause");//we use "ocpause" as a dummy key to identify our own linked messages so we can tell when an on or off comes from the AO rather than from the collar standoff, to sync usage.
else if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_SET,0,"0"+g_sOraculstring,"ocpause");
}
g_iOCSwitch=FALSE;
if(g_iAOSwitch==TRUE) llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS);//AO is supposed to be on, so we take controls here to allow it to be switched back on temporarily whilst moving.
}
AOUnPause()
{
if(g_iAOSwitch)
{
if(type>1 ) llMessageLinked(LINK_THIS, 0, "ZHAO_AOON", "ocpause");
else if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_SET,0,"1"+g_sOraculstring,"ocpause");
}
g_iOCSwitch=TRUE;
if(llGetPermissionsKey()) llReleaseControls(); //if we took permissions, release them so the AO can do its own thing now.
}
zhaoMenu(key kMenuTo)
{
//script's own menu for some ZHAO features.
//Open listener if no menu users are registered in g_lMenuUsers already, and add
//menu user to list if not already present.
if(!llGetListLength(g_lMenuUsers)) g_iMenuHandle=llListen(g_iMenuChannel,"","","");
if(llListFindList(g_lMenuUsers,[kMenuTo])==-1) g_lMenuUsers+=kMenuTo;
string sSit="AO Sits ON";
if(g_iSitOverride) sSit="AO Sits OFF";
list lButtons=[sSit,"Load Notecard","Done","AO on","AO off","Next Stand"];
llSetTimerEvent(g_iMenuTimeout);
llDialog(kMenuTo,"AO options. Depending on model of AO, some may not work. Use OC Sub AO for more comprehensive control!",lButtons,g_iMenuChannel);
}
default
{
state_entry()
{
if(type==0) determineType();
g_iMenuChannel=-(integer)llFrand(999999)-10000; //randomise menu channel
}
attach(key avatar)
{
if(avatar) //on attach
{
if(type==0) determineType();
g_iMenuChannel=-(integer)llFrand(999999)-10000; //randomise menu channel
}
}
listen(integer iChannel, string sName, key kID, string sMsg)
{
if(iChannel==g_iMenuChannel) // this is for our own limited ZHAO menu.
{
if(sMsg=="Done"||sMsg=="Cancel")
{
integer i=llListFindList(g_lMenuUsers,[kID]);
if(i>-1) g_lMenuUsers=llDeleteSubList(g_lMenuUsers,i,i); //remove user from menu users list.
if(!llGetListLength(g_lMenuUsers)) //remove listener if no menu users left
{
llListenRemove(g_iMenuHandle);
llSetTimerEvent(0);
}
return; // we're done here!
}
else if(sMsg=="Load Notecard") //scan for notecards and provide a dialog to user
{
list lButtons;
integer x=llGetInventoryNumber(INVENTORY_NOTECARD);
while(x)
{
x--;
string t=llGetInventoryName(INVENTORY_NOTECARD,x);
if(llSubStringIndex(llToLower(t),"read me")==-1 && llSubStringIndex(llToLower(t),"help")==-1 && llStringLength(t)<23) lButtons+=t; //we only take notecards without "help" or "read me" in the title and with short enough names to fit on a button.
}
if(llGetListLength(lButtons)>11)
{
llRegionSayTo(kID,0,"Too many notecards found, displaying the first 11"); //ZHAO doesn't bother multi pages, so we won't.
lButtons=llDeleteSubList(lButtons,11,-1);
}
llSetTimerEvent(g_iMenuTimeout);
llDialog(kID,"Pick an AO settings notecard to load, or click Cancel",lButtons+["Cancel"],g_iMenuChannel);
}
else if(sMsg=="AO Sits ON")
{
g_iSitOverride=TRUE; //this will get set by the link message anyway, but set here just in case remenu happens before link message is read.
llMessageLinked(LINK_SET,0,"ZHAO_SITON","");
}
else if(sMsg=="AO Sits OFF")
{
g_iSitOverride=FALSE;
llMessageLinked(LINK_SET,0,"ZHAO_SITOFF","");
}
else if(sMsg=="AO on")
{
if(g_iOCSwitch) llMessageLinked(LINK_SET,0,"ZHAO_AOON",""); // don't switch on AO if we are paused
else llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS); //AO was switched on while we are paused, so we take permissions to allow unpausing whilst movement
g_iAOSwitch=TRUE;
}
else if(sMsg=="AO off")
{
llMessageLinked(LINK_SET,0,"ZHAO_AOOFF","");
if(llGetPermissions()) llReleaseControls(); //if AO is off, we don't want to be checking controls.
}
else if(sMsg=="Next Stand")
{
if(type == 2) // ZHAO-II
llMessageLinked(LINK_SET,0,"ZHAO_NEXTSTAND","");
else // VISTA
llMessageLinked(LINK_SET,0,"ZHAO_NEXTPOSE","");
}
//check if sMsg is a notecard picked from Load Notecard menu, and send load command if so.
else if(llGetInventoryType(sMsg)==INVENTORY_NOTECARD) llMessageLinked(LINK_THIS,0,"ZHAO_LOAD|"+sMsg,"");
//resend the menu where it makes sense.
if(sMsg!="Done" && sMsg!="Cancel" && sMsg!="Load Notecard") zhaoMenu(kID);
return;
}
else if(llGetOwnerKey(kID)!=llGetOwner()) return; //reject commands from other sources.
else if (iChannel==g_iAOChannel)
{
if(sMsg=="ZHAO_STANDON") AOUnPause();
else if (sMsg=="ZHAO_STANDOFF") AOPause();
else if (sMsg=="ZHAO_AOOFF")
{
if(type>1) llMessageLinked(LINK_SET,0,"ZHAO_AOOFF","");
else llMessageLinked(LINK_SET,0,"0"+g_sOraculstring,"ocpause");
if(llGetPermissions()) llReleaseControls();
}
else if (sMsg=="ZHAO_AOON")
{
if(g_iOCSwitch)// don't switch on AO if we are paused
{
if(type>1) llMessageLinked(LINK_SET,0,"ZHAO_AOON","");
else llMessageLinked(LINK_SET,0,"1"+g_sOraculstring,"");
}
else llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS); //AO was switched on while we are paused, so we take permissions to allow unpausing whilst moving.
g_iAOSwitch=TRUE;
}
else if (llGetSubString(sMsg,0,8)=="ZHAO_MENU")
{
key kMenuTo=(key)llGetSubString(sMsg,10,-1);
if(type==ORACUL) llMessageLinked(LINK_SET,4,"",kMenuTo);
else if (type>1) zhaoMenu(kMenuTo);
}
}
}
link_message(integer iPrim, integer iNum, string sMsg, key kID)
{
if (type==ORACUL && iNum==0 && kID!="ocpause") //oracul power command
{
g_sOraculstring=llGetSubString(sMsg,1,-1); //store the config string for Oracul AO.
g_iAOSwitch=(integer)llGetSubString(sMsg,0,1); //store the AO power state.
if(!g_iAOSwitch && llGetPermissions()) llReleaseControls(); //stop checking controls if taken.
}
else if(type>1)
{
if (sMsg=="ZHAO_SITON") g_iSitOverride=TRUE;
else if (sMsg=="ZHAO_SITOFF") g_iSitOverride=FALSE;
else if(kID!="ocpause") //ignore pause commands sent by this script, we want to know what the "correct" state is.
{
if(sMsg=="ZHAO_AOON") g_iAOSwitch=TRUE;
else if(sMsg=="ZHAO_AOOFF")
{
g_iAOSwitch=FALSE;
if(llGetPermissions()) llReleaseControls(); //stop checking controls if taken.
}
}
}
}
run_time_permissions(integer perms)
{
//we want to monitor for movement while the AO is temporarily off, so we can temporarily switch it back on again while a movement button is held.
if(perms&PERMISSION_TAKE_CONTROLS) llTakeControls(CONTROL_FWD|CONTROL_BACK|CONTROL_LEFT|CONTROL_RIGHT,TRUE,TRUE);
}
control(key id, integer level, integer edge)
{
if(!g_iAOSwitch||g_iOCSwitch) //if AO is turned off or OC hasn't requested a pause, we're not meant to be here.
{
llReleaseControls();
return;
}
if(level&edge) //movement button pressed
{
if(type>1) llMessageLinked(LINK_THIS, 0, "ZHAO_AOON", "ocpause");
else if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_THIS,0,"1"+g_sOraculstring,"ocpause");
}
else if((!level)&edge) //movement button released
{
if(type>1) llMessageLinked(LINK_THIS, 0, "ZHAO_AOOFF", "ocpause");
else if (type==ORACUL && g_sOraculstring!="") llMessageLinked(LINK_THIS,0,"0"+g_sOraculstring,"ocpause");
}
}
timer()
{
llSetTimerEvent(0);
llListenRemove(g_iMenuHandle);
//inform current menu users of listener timeout.
integer x=llGetListLength(g_lMenuUsers);
while(x)
{
x--;
key tKey=llList2Key(g_lMenuUsers,x);
if(llGetAgentSize(tKey)) llRegionSayTo(tKey,0,"AO Menu timed out, try again."); //avoid IM spam by only notifying those in sim.
}
g_lMenuUsers=[]; //clear list
}
changed(integer change)
{
if(change & CHANGED_OWNER) llResetScript();
}
}

View File

@@ -0,0 +1,162 @@
//////////////////////////////////////////////////////////////////////////////////////
// Original development by Joy Stipe for OpenCollar Project //
//////////////////////////////////////////////////////////////////////////////////////
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
//////////////////////////////////////////////////////////////////////////////////////
// Drop this script into an attachment to have that attachment make leash(es) //
// See the first code line for the entry to use in the DESCRIPTION field of //
// links/prims where leash should come from; setting no link descriptsions to //
// that will result in only the prim that contains this script being the //
// emitter. //
//////////////////////////////////////////////////////////////////////////////////////
// the description of a prim that identifies it as where to leash
string sEMITTER = "leashpoint";
integer HUD_CHANNEL;
key kWEARER;
key kTARGET;
list lPARTICLES;
list lLINKS;
debug(string sText)
{
//llOwnerSay(llGetScriptName() + " DEBUG: " + sText);
}
integer GetIsInteger(string in)
{
integer i;
if (llGetSubString(in, 0, 0) == "-")
{
if (llStringLength(in) < 2) return FALSE;
i = 1;
}
list n = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
for (; i < llStringLength(in); i++)
{
if (!~llListFindList(n, [llGetSubString(in, i, i)])) return FALSE;
}
return TRUE;
}
integer GetIsFloat(string in)
{
list check = llParseString2List(in, ["."], []);
if (llGetListLength(check) != 2) return FALSE;
integer i;
for (; i < 2; i++)
{
if (!GetIsInteger(llList2String(check, i))) return FALSE;
}
return TRUE;
}
integer GetIsVec(string in)
{
if (llGetSubString(in, 0, 0) != "<") return FALSE;
if (llGetSubString(in, -1, -1) != ">") return FALSE;
in = llGetSubString(in, 1, -2);
list check = llParseString2List(in, [","], []);
if (llGetListLength(check) != 3) return FALSE;
integer i;
for (; i < 3; i ++)
{
string d = llStringTrim(llList2String(check, i), STRING_TRIM);
if (!GetIsInteger(d) && !GetIsFloat(d)) return FALSE;
}
return TRUE;
}
integer GetIsKey(string in)
{
if ((key)in) return TRUE;
if ((key)in == NULL_KEY) return TRUE;
return FALSE;
}
StartParticles()
{
integer i;
for (; i < llGetListLength(lLINKS); i++)
{
llLinkParticleSystem(llList2Integer(lLINKS, i), []);
llLinkParticleSystem(llList2Integer(lLINKS, i), lPARTICLES);
}
}
StopParticles()
{
integer i;
for (; i < llGetListLength(lLINKS); i++)
{
llLinkParticleSystem(llList2Integer(lLINKS, i), []);
}
kTARGET = NULL_KEY;
lPARTICLES = [];
}
default
{
state_entry()
{
lLINKS = [];
integer i;
for (; i <= llGetNumberOfPrims(); i++)
{
list d = llParseString2List(llList2String(llGetLinkPrimitiveParams(i, [28]), 0), ["~"], []);
if (llList2String(d, 0) == sEMITTER) lLINKS += [i];
}
if (!llGetListLength(lLINKS)) lLINKS = [llGetLinkNumber()];
StopParticles();
llSleep(0.001);
kWEARER = llGetOwner();
HUD_CHANNEL = (integer)("0x" + llGetSubString((string)kWEARER, 2, 7)) + 1111;
if (HUD_CHANNEL > 0) HUD_CHANNEL *= -1;
if (HUD_CHANNEL > -10000) HUD_CHANNEL -= 30000;
llListen(HUD_CHANNEL, "", "", "");
if (kTARGET != NULL_KEY)
{
debug ("entry leash targeted");
StartParticles();
}
}
on_rez(integer iRez)
{
llResetScript();
}
listen(integer c, string n, key k, string s)
{
if (c == HUD_CHANNEL)
{
list parts = llParseString2List(s, ["\\"], []);
key tar = (key)llList2String(parts, 0);
string com = llList2String(parts, 1);
string val = llList2String(parts, 2);
if (com == "LeashUp")
{
kTARGET = tar;
integer i;
parts = llCSV2List(val);
lPARTICLES = [];
for (; i < llGetListLength(parts); i++)
{
string bit = llList2String(parts, i);
if (GetIsInteger(bit)) lPARTICLES += [(integer)bit];
else if (GetIsFloat(bit)) lPARTICLES += [(float)bit];
else if (GetIsVec(bit)) lPARTICLES += [(vector)bit];
else if (GetIsKey(bit)) lPARTICLES += [(key)bit];
else lPARTICLES += [bit];
}
StartParticles();
}
else if (com == "Unleash")
{
StopParticles();
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,231 @@
//tempowner demo app
string SUBMENU_BUTTON = "Capture"; // Name of the submenu
string COLLAR_PARENT_MENU = "Apps"; // name of the menu, where the menu plugs in, should be usually Addons. Please do not use the mainmenu anymore
key g_kMenuID; // menu handler
key g_kWearer; // key of the current wearer to reset only on owner changes
string g_sScript="capture_"; // part of script name used for settings
string CTYPE = "collar"; // designer can set in notecard to appropriate word for their item
list g_lTempOwners;
integer g_iCaptureOn=FALSE;
// OpenCollar MESSAGE MAP
// messages for authenticating users
// integer COMMAND_NOAUTH = 0; // for reference, but should usually not be in use inside plugins
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
integer COMMAND_RELAY_SAFEWORD = 511;
integer COMMAND_BLACKLIST = 520;
// added for timer so when the sub is locked out they can use postions
integer COMMAND_WEARERLOCKEDOUT = 521;
integer ATTACHMENT_REQUEST = 600;
integer ATTACHMENT_RESPONSE = 601;
integer ATTACHMENT_FORWARD = 610;
integer WEARERLOCKOUT = 620; // turns on and off wearer lockout
// integer SEND_IM = 1000; deprecated. each script should send its own IMs now.
// This is to reduce even the tiny bit of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
// messages for storing and retrieving values from settings store
integer LM_SETTING_SAVE = 2000; // scripts send messages on this channel to have settings saved to settings store
// str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001; // when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002; // the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003; // delete token from settings store
integer LM_SETTING_EMPTY = 2004; // sent by settings script when a token has no value in the settings store
integer LM_SETTING_REQUEST_NOCACHE = 2005;
// messages for creating OC menu structure
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
// messages for RLV commands
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001; // RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002; // RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; // RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer RLV_QUERY = 6102; //query from a script asking if RLV is currently functioning
integer RLV_RESPONSE = 6103; //reply to RLV_QUERY, with "ON" or "OFF" as the message
// messages for poses and couple anims
integer ANIM_START = 7000; // send this with the name of an anim in the string part of the message to play the anim
integer ANIM_STOP = 7001; // send this with the name of an anim in the string part of the message to stop the anim
integer CPLANIM_PERMREQUEST = 7002; // id should be av's key, str should be cmd name "hug", "kiss", etc
integer CPLANIM_PERMRESPONSE = 7003; // str should be "1" for got perms or "0" for not. id should be av's key
integer CPLANIM_START = 7004; // str should be valid anim name. id should be av
integer CPLANIM_STOP = 7005; // str should be valid anim name. id should be av
// messages to the dialog helper
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer FIND_AGENT = -9005; // to look for agent(s) in region with a (optional) search string
key REQUEST_KEY;
integer TIMER_EVENT = -10000; // str = "start" or "end". For start, either "online" or "realtime".
integer UPDATE = 10001; // for child prim scripts (currently none in 3.8, thanks to LSL new functions)
// For other things that want to manage showing/hiding keys.
integer KEY_VISIBLE = -10100;
integer KEY_INVISIBLE = -10100;
integer COMMAND_PARTICLE = 20000;
integer COMMAND_LEASH_SENSOR = 20001;
//chain systems
integer LOCKMEISTER = -8888;
integer LOCKGUARD = -9119;
//rlv relay chan
integer RLV_RELAY_CHANNEL = -1812221819;
// menu option to go one step back in menustructure
string UPMENU = "BACK"; // when your menu hears this, give the parent menu
//Debug(string sMsg) { llOwnerSay(llGetScriptName() + " [DEBUG]: " + sMsg);}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer){
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
return kID;
}
DoMenu(key keyID, integer iAuth) {
string sPrompt = "\nCapture";
list lMyButtons = ["Reset"];
//fill in your button list and additional prompt here
if (g_iCaptureOn){
lMyButtons += "OFF";
} else {
lMyButtons += "ON";
}
// and dispay the menu
g_kMenuID = Dialog(keyID, "\n\nCapture\n", lMyButtons, [UPMENU], 0, iAuth);
}
integer UserCommand(integer iNum, string sStr, key kID, integer remenu) {
sStr=llToLower(sStr);
//Debug("Got user command "+sStr);
if (!(iNum >= COMMAND_OWNER && iNum <= COMMAND_EVERYONE)) {
return FALSE;
} else if (sStr == "capture" || sStr == "menu capture") {
// an authorized user requested the plugin menu by typing the menus chat command
DoMenu(kID, iNum);
} else if (sStr == "capture you" && g_iCaptureOn) {
//add kID to the temp owner list, if they're not already there
if (g_kWearer != llGetOwnerKey(kID) && iNum != COMMAND_OWNER ) { //owners, tempowners and wearer can't be tempowner
Notify(kID,llKey2Name(g_kWearer)+" has been captured by "+llKey2Name(kID),TRUE);
g_lTempOwners+=[kID,llKey2Name(kID)];
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "auth_tempowner="+llDumpList2String(g_lTempOwners,","), "");
llMessageLinked(LINK_SET, LM_SETTING_RESPONSE, "auth_tempowner="+llDumpList2String(g_lTempOwners,","), "");
} else {
Notify(kID,llKey2Name(g_kWearer)+" cannot be captured by "+llKey2Name(kID),TRUE);
}
} else if (sStr == "capture reset" && iNum==COMMAND_OWNER ) {
Notify(kID,"Temp owners list has been purged.",TRUE);
g_lTempOwners=[];
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "auth_tempowner", "");
llMessageLinked(LINK_SET, LM_SETTING_EMPTY, "auth_tempowner", "");
} else if (sStr == "capture on" && iNum==COMMAND_OWNER && ! g_iCaptureOn) {
Notify(kID,"Capture game is ON!",TRUE);
g_iCaptureOn=TRUE;
llWhisper(0,"You can own "+llKey2Name(g_kWearer)+" for a while by sending the command 'capture you' to their collar, if you know their prefix");
} else if (sStr == "capture off" && iNum==COMMAND_OWNER && g_iCaptureOn) {
Notify(kID,"Capture game is OFF!",TRUE);
g_iCaptureOn=FALSE;
}
if (remenu) {
DoMenu(kID, iNum);
}
return TRUE;
}
default {
state_entry()
{
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
g_kWearer = llGetOwner();
}
on_rez(integer iParam) {
if (llGetOwner()!=g_kWearer) llResetScript();
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
if (iNum == MENUNAME_REQUEST && sStr == COLLAR_PARENT_MENU) {
// our parent menu requested to receive buttons, so send ours
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
} else if (iNum == LM_SETTING_RESPONSE) {
// response from setting store have been received, parse the answer
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
// and check if any values for use are received
if (sToken == "auth_tempowner") {
list lTempOwners = llParseString2List(sValue, [","], []); //store tempowners list
}
else if (sToken == "Global_CType") CTYPE = sValue;
}
else if (UserCommand(iNum, sStr, kID, FALSE)) {
// do nothing more if TRUE
}
else if (iNum == COMMAND_SAFEWORD) {
// Safeword has been received, release any restricitions that should be released
Notify(g_kWearer,"Capture game is OFF!",TRUE);
g_iCaptureOn=FALSE;
Notify(g_kWearer,"Temp owners list has been purged.",TRUE);
g_lTempOwners=[];
llMessageLinked(LINK_SET, LM_SETTING_EMPTY, "auth_tempowner", "");
}
else if (iNum == DIALOG_RESPONSE) {
if (kID == g_kMenuID) {
//got a menu response meant for us, extract the values
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
// request to switch to parent menu
if (sMessage == UPMENU) {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu "+COLLAR_PARENT_MENU, kAv);
} else {
UserCommand(iAuth, "capture "+sMessage, kAv, TRUE);
}
}
}
}
}

View File

@@ -1,35 +1,28 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - customizer //
// version 3.995 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2014 - 2016 Romka Swallowtail et al.
//
// This script is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation, version 2.
//
// This script is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this script; if not, see www.gnu.org/licenses/gpl-2.0
//
// Debug(string sStr) { llOwnerSay("Debug ["+llGetScriptName()+"]: " + sStr); }
string g_sParentMenu = "Apps";
string g_sParentMenu = "Appearance";
string g_sSubMenu = "Customizer";
//MESSAGE MAP
integer CMD_OWNER = 500;
//integer CMD_TRUSTED = 501;
//integer CMD_GROUP = 502;
integer CMD_WEARER = 503;
string CTYPE = "collar";
integer NOTIFY = 1002;
integer LINK_DIALOG = 3;
integer LINK_SAVE = 5;
integer LINK_UPDATE = -10;
integer REBOOT = -1000;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
@@ -44,13 +37,7 @@ string SAVE = "SAVE";
string REMOVE = "REMOVE";
string RESET = "RESET";
key g_kWearer = NULL_KEY;
integer g_iTexture = FALSE;
integer g_iColor = FALSE;
integer g_iHide = FALSE;
integer g_iShine = FALSE;
integer g_iGlow = FALSE;
key g_kWearer;
list g_lElementsList;
list g_lParams;
@@ -61,10 +48,30 @@ list g_lCurrentParam ;
list g_lMenuIDs;//3-strided list of kAv, dialogid, menuname
integer g_iMenuStride = 3;
integer g_iTexture = FALSE;
integer g_iColor = FALSE;
integer g_iHide = FALSE;
integer g_iShine = FALSE;
integer g_iGlow = FALSE;
/*
integer g_iProfiled=TRUE;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string sMenuType)
{
key kMenuID = llGenerateKey();
llMessageLinked(LINK_DIALOG, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kMenuID);
integer iMenuIndex = llListFindList(g_lMenuIDs, [kRCPT]);
@@ -73,14 +80,41 @@ Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer i
else g_lMenuIDs = llListReplaceList(g_lMenuIDs, lAddMe, iMenuIndex, iMenuIndex + g_iMenuStride - 1);
}
Notify(key kAv, string sMsg, integer iAlsoNotifyWearer)
{
if (kAv == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kAv) != ZERO_VECTOR) llRegionSayTo(kAv,0,sMsg);
else llInstantMessage(kAv, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
ElementMenu(key kAv, integer iPage, integer iAuth)
{
BuildElementsList();
string sPrompt = "\nChange the Elements descriptions, %DEVICETYPE%.\nSelect an element from the list";
string sPrompt = "\nChange the Elements descriptions, "+CTYPE+".\nSelect an element from the list";
list lButtons = llListSort(g_lElementsList, 1, TRUE);
Dialog(kAv, sPrompt, lButtons, [REMOVE,RESET,UPMENU], iPage, iAuth, "ElementMenu");
}
GetParam(list params)
{
if ( ~llListFindList(params,["notexture"]) ) g_iTexture = FALSE;
else g_iTexture = TRUE;
if ( ~llListFindList(params,["nocolor"]) ) g_iColor = FALSE;
else g_iColor = TRUE;
if ( ~llListFindList(params,["nohide"]) ) g_iHide = FALSE;
else g_iHide = TRUE;
if ( ~llListFindList(params,["noshine"]) ) g_iShine = FALSE;
else g_iShine = TRUE;
if ( ~llListFindList(params,["noglow"]) ) g_iGlow = FALSE;
else g_iGlow = TRUE;
}
CustomMenu(key kAv, integer iPage, integer iAuth)
{
string sPrompt = "\nSelect an option for element '"+g_sCurrentElement+"':";
@@ -99,42 +133,27 @@ CustomMenu(key kAv, integer iPage, integer iAuth)
Dialog(kAv, sPrompt, lButtons, [SAVE, UPMENU], iPage, iAuth, "CustomMenu");
}
GetParam(list params)
{
if ( ~llListFindList(params,["notexture"]) ) g_iTexture = FALSE;
else g_iTexture = TRUE;
if ( ~llListFindList(params,["nocolor"]) ) g_iColor = FALSE;
else g_iColor = TRUE;
if ( ~llListFindList(params,["noshine"]) ) g_iShine = FALSE;
else g_iShine = TRUE;
if ( ~llListFindList(params,["noglow"]) ) g_iGlow = FALSE;
else g_iGlow = TRUE;
if ( ~llListFindList(params,["nohide"]) ) g_iHide = FALSE;
else g_iHide = TRUE;
}
string ChangeParam(list params)
{
integer i;
i = llListFindList(params,["notexture"]);
if (g_iTexture && i!=-1) params = llDeleteSubList(params,i,i);
else if (!g_iTexture && i==-1) params += ["notexture"];
integer iTexture = llListFindList(params,["notexture"]);
if (g_iTexture && iTexture!=-1) params = llDeleteSubList(params,iTexture,iTexture);
else if (!g_iTexture && iTexture==-1) params += ["notexture"];
i = llListFindList(params,["nocolor"]);
if (g_iColor && i!=-1) params = llDeleteSubList(params,i,i);
else if (!g_iColor && i==-1) params += ["nocolor"];
integer iColor = llListFindList(params,["nocolor"]);
if (g_iColor && iColor!=-1) params = llDeleteSubList(params,iColor,iColor);
else if (!g_iColor && iColor==-1) params += ["nocolor"];
i = llListFindList(params,["noshine"]);
if (g_iShine && i!=-1) params = llDeleteSubList(params,i,i);
else if (!g_iShine && i==-1) params += ["noshine"];
integer iHide = llListFindList(params,["nohide"]);
if (g_iHide && iHide!=-1) params = llDeleteSubList(params,iHide,iHide);
else if (!g_iHide && iHide==-1) params += ["nohide"];
i = llListFindList(params,["noglow"]);
if (g_iGlow && i!=-1) params = llDeleteSubList(params,i,i);
else if (!g_iGlow && i==-1) params += ["noglow"];
integer iShine = llListFindList(params,["noshine"]);
if (g_iShine && iShine!=-1) params = llDeleteSubList(params,iShine,iShine);
else if (!g_iShine && iShine==-1) params += ["noshine"];
i = llListFindList(params,["nohide"]);
if (g_iHide && i!=-1) params = llDeleteSubList(params,i,i);
else if (!g_iHide && i==-1) params += ["nohide"];
integer iGlow = llListFindList(params,["noglow"]);
if (g_iGlow && iGlow!=-1) params = llDeleteSubList(params,iGlow,iGlow);
else if (!g_iGlow && iGlow==-1) params += ["noglow"];
return llDumpList2String(params,"~");
}
@@ -152,7 +171,11 @@ SaveCurrentParam(string sElement)
ResetScripts()
{
if (llGetInventoryType("oc_themes") == INVENTORY_SCRIPT) llResetOtherScript("oc_themes");
if (llGetInventoryType("OpenCollar - hide") == INVENTORY_SCRIPT) llResetOtherScript("OpenCollar - hide");
if (llGetInventoryType("OpenCollar - texture") == INVENTORY_SCRIPT) llResetOtherScript("OpenCollar - texture");
if (llGetInventoryType("OpenCollar - color") == INVENTORY_SCRIPT) llResetOtherScript("OpenCollar - color");
if (llGetInventoryType("OpenCollar - shininess") == INVENTORY_SCRIPT) llResetOtherScript("OpenCollar - shininess");
if (llGetInventoryType("OpenCollar - glow") == INVENTORY_SCRIPT) llResetOtherScript("OpenCollar - glow");
}
BuildElementsList()
@@ -176,23 +199,20 @@ BuildElementsList()
} while (count-- > 2) ;
}
UserCommand(integer iAuth, string sStr, key kID )
UserCommand(integer iAuth, string sStr, key kAv )
{
if (iAuth > CMD_WEARER || iAuth < CMD_OWNER) return ; // sanity check
if (iAuth > COMMAND_WEARER || iAuth < COMMAND_OWNER) return ; // sanity check
if (sStr == "menu " + g_sSubMenu)
{
//someone asked for our menu
//give this plugin's menu to id
if (kID!=g_kWearer && iAuth!=CMD_OWNER)
if (kAv!=g_kWearer && iAuth!=COMMAND_OWNER)
{
llMessageLinked(LINK_DIALOG, NOTIFY, "0%NOACCESS%.", kID);
llMessageLinked(LINK_THIS, iAuth, "menu " + g_sParentMenu, kID);
Notify(kAv,"You are not allowed to change the "+CTYPE+"'s appearance.", FALSE);
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else ElementMenu(kID, 0, iAuth);
} else if (llToLower(sStr) == "rm customizer") {
if (kID!=g_kWearer && iAuth!=CMD_OWNER) llMessageLinked(LINK_DIALOG,NOTIFY,"0"+"%NOACCESS%",kID);
else Dialog(kID, "\nDo you really want to uninstall the "+g_sSubMenu+" App?", ["Yes","No","Cancel"], [], 0, iAuth,"rm"+g_sSubMenu);
else ElementMenu(kAv, 0, iAuth);
}
}
@@ -212,10 +232,10 @@ default
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (iNum <= CMD_WEARER && iNum >= CMD_OWNER) UserCommand(iNum, sStr, kID);
if (iNum <= COMMAND_WEARER && iNum >= COMMAND_OWNER) UserCommand(iNum, sStr, kID);
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(iSender, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == DIALOG_RESPONSE)
{
@@ -228,29 +248,29 @@ default
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
string sMenuType = llList2String(g_lMenuIDs, iMenuIndex+1);
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex-1, iMenuIndex-2+g_iMenuStride);
string sMenuType = llList2String(g_lMenuIDs, iMenuIndex + 1);
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenuType == "ElementMenu")
{
if (sMessage == UPMENU)
{
llMessageLinked(LINK_THIS, iAuth, "menu " + g_sParentMenu, kAv);
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else if (sMessage == RESET)
{
ResetScripts();
llMessageLinked(LINK_SAVE, iAuth, "load", kAv);
llMessageLinked(LINK_THIS, iAuth, "Load Defaults", kID);
g_sCurrentElement = "";
ElementMenu(kAv, iPage, iAuth);
}
else if (sMessage == REMOVE)
{
ResetScripts();
llMessageLinked(LINK_SAVE, iAuth, "load", kAv);
llMessageLinked(LINK_THIS, MENUNAME_REMOVE, g_sParentMenu + "|" + g_sSubMenu, "");
llMessageLinked(LINK_THIS, iAuth, "menu " + g_sParentMenu, kAv);
llMessageLinked(LINK_SET, MENUNAME_REMOVE, g_sParentMenu + "|" + g_sSubMenu, "");
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
llRemoveInventory(llGetScriptName());
}
else if (~llListFindList(g_lElementsList, [sMessage]))
@@ -291,24 +311,18 @@ default
else if (sMessage == "▣ glow") g_iGlow = FALSE;
CustomMenu(kAv, iPage, iAuth);
}
} else if (sMenuType == "rm"+g_sSubMenu) {
if (sMessage == "Yes") {
llMessageLinked(LINK_ROOT, MENUNAME_REMOVE , g_sParentMenu + "|" + g_sSubMenu, "");
llMessageLinked(LINK_DIALOG, NOTIFY, "1"+g_sSubMenu+" App has been removed.", kAv);
if (llGetInventoryType(llGetScriptName()) == INVENTORY_SCRIPT) llRemoveInventory(llGetScriptName());
} else llMessageLinked(LINK_DIALOG, NOTIFY, "0"+g_sSubMenu+" App remains installed.", kAv);
}
}
}
else if (iNum == DIALOG_TIMEOUT)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1) g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex-1, iMenuIndex-2+g_iMenuStride);
}
else if (iNum == LINK_UPDATE)
{
if (sStr == "LINK_DIALOG") LINK_DIALOG = iSender;
else if (sStr == "LINK_SAVE") LINK_SAVE = iSender;
if (iMenuIndex != -1)
{
//remove stride from g_lMenuIDs
//we have to subtract from the index because the dialog id comes in the middle of the stride
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
}
}
@@ -316,5 +330,13 @@ default
{
if (iChange & CHANGED_OWNER) llResetScript();
if (iChange & CHANGED_LINK) BuildElementsList();
/*
if (iChange & CHANGED_REGION) {
if (g_iProfiled) {
llScriptProfiler(1);
Debug("profiling restarted");
}
}
*/
}
}

View File

@@ -0,0 +1,374 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - glow //
// version 3.995 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sParentMenu = "Appearance";
string g_sSubMenu = "Glow";
string g_sIgnoreType = "noglow" ; // or "nocolor" or "noglow" if you want use alternate prims descriptions;
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer SEND_IM = 1000; deprecated. each script should send its own IMs now. This is to reduce even the tiny bt of lag caused by having IM slave scripts
//integer POPUP_HELP = 1001;
//integer LM_SETTING_SAVE = 2000;
//integer LM_SETTING_REQUEST = 2001;
integer LM_SETTING_RESPONSE = 2002;
//integer LM_SETTING_DELETE = 2003;
//integer LM_SETTING_EMPTY = 2004;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer TOUCH_REQUEST = -9500;
integer TOUCH_CANCEL = -9501;
integer TOUCH_RESPONSE = -9502;
integer TOUCH_EXPIRE = -9503;
string CTYPE = "collar";
string UPMENU = "BACK";
list g_lGlowButtons = ["0.00","+0.01","-0.01","0.05","+0.05","-0.05","0.10","+0.10","-0.10","0.20","0.50"];
string ALL = "All" ;
list g_lElements;
list g_lButtons;
list g_lMenuIDs;
key g_kTouchID;
integer g_iAppLock = FALSE;
string g_sAppLockToken = "Appearance_Lock";
string g_sCurrentElement = "";
float g_fCurrentGlow ;
key g_kWearer;
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_THIS, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
return kID;
}
key TouchRequest(key kRCPT, integer iTouchStart, integer iTouchEnd, integer iAuth)
{
key kID = llGenerateKey();
integer iFlags = 0;
if (iTouchStart) iFlags = iFlags | 0x01;
if (iTouchEnd) iFlags = iFlags | 0x02;
llMessageLinked(LINK_THIS, TOUCH_REQUEST, (string)kRCPT + "|" + (string)iFlags + "|" + (string)iAuth, kID);
return kID;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
GlowMenu(key kAv, integer iAuth)
{
g_fCurrentGlow = GetElementGlow(g_sCurrentElement);
string sPrompt = "Change Glow for visible element only.\n";
sPrompt += "\nElement: " + g_sCurrentElement;
sPrompt += "\nGlow: " + llGetSubString((string)g_fCurrentGlow,0,3);
g_lMenuIDs+=[Dialog(kAv, sPrompt, g_lGlowButtons, [UPMENU],0, iAuth)];
}
ElementMenu(key kAv, integer iAuth)
{
string sPrompt = "Pick which part of the "+CTYPE+" you would like to change glow.\n\nChoose *Touch* if you want to select the part by directly clicking on the "+CTYPE+".";
sPrompt += "\n\nOnly visible elements!";
g_lButtons = [ALL] + llListSort(g_lElements, 1, TRUE) ;
g_lMenuIDs+=[Dialog(kAv, sPrompt, g_lButtons, ["*Touch*", UPMENU],0, iAuth)];
}
string ElementType(integer iLinkNumber)
{
// check for invisible prim
list params = llGetLinkPrimitiveParams(iLinkNumber, [PRIM_COLOR, ALL_SIDES]);
if (llList2Float(params,1) == 0 ) return g_sIgnoreType; // prim is invisible
//string sDesc = (string)llGetObjectDetails(llGetLinkKey(iLinkNumber), [OBJECT_DESC]);
string sDesc = llList2String(llGetLinkPrimitiveParams(iLinkNumber, [PRIM_DESC]), 0);
//each prim should have <elementname> in its description, plus "noshiny, if you want the prim to
//not appear in the shiny menu
list lParams = llParseString2List(sDesc, ["~"], []);
if ((~(integer)llListFindList(lParams, [g_sIgnoreType])) || sDesc == "" || sDesc == " " || sDesc == "(No Description)")
return g_sIgnoreType;
else return llList2String(lParams, 0);
}
BuildElementList()
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
//root prim is 1, so start at 2
for (n = 2; n <= iLinkCount; n++)
{
string sElement = ElementType(n);
if (!(~llListFindList(g_lElements, [sElement])) && sElement != g_sIgnoreType)
{
g_lElements += [sElement];
}
}
}
SetAllGlow(float fGlow)
{
integer elements = llGetListLength(g_lElements) ;
integer index = 0 ;
do
{
string sElement = llList2String(g_lElements, index);
SetElementGlow(sElement, fGlow);
index++ ;
}while (index < elements ) ;
}
SetElementGlow(string sElement, float fGlow)
{
integer n;
integer iLinkCount = llGetNumberOfPrims();
for (n = 2; n <= iLinkCount; n++)
{
if (ElementType(n) == sElement) llSetLinkPrimitiveParamsFast(n, [PRIM_GLOW, ALL_SIDES, fGlow]);
}
}
float GetElementGlow(string sElement)
{
integer n = 1;
integer iLinkCount = llGetNumberOfPrims();
//root prim is 1, so start at 2
do
{
n++;
} while (ElementType(n) != sElement && n < iLinkCount);
list params = llGetLinkPrimitiveParams(n, [PRIM_GLOW, ALL_SIDES]);
return llList2Float(params, 0) ;
}
// returns TRUE if eligible (AUTHED link message number)
integer UserCommand(integer iNum, string sStr, key kID) // here iNum: auth value, sStr: user command, kID: avatar id
{
if (iNum > COMMAND_WEARER || iNum < COMMAND_OWNER) return FALSE; // sanity check
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
if (sStr == "menu "+ g_sSubMenu || sStr == "glow")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the glow.", FALSE);
llMessageLinked(LINK_THIS, iNum, "menu "+g_sParentMenu, kID);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the "+CTYPE+" is locked. You cannot access this menu now!", FALSE);
llMessageLinked(LINK_THIS, iNum, "menu "+g_sParentMenu, kID);
}
else
{
g_sCurrentElement = "";
ElementMenu(kID, iNum);
}
}
else if (sCommand == "setglow")
{
if (kID!=g_kWearer && iNum!=COMMAND_OWNER)
{
Notify(kID,"You are not allowed to change the glow.", FALSE);
}
else if (g_iAppLock)
{
Notify(kID,"The appearance of the "+CTYPE+" is locked. You cannot access this menu now!", FALSE);
}
else
{
string sElement = llList2String(lParams, 1);
float fGlow = (float)llList2String(lParams, 2);
if (sElement == ALL || sElement == "all") SetAllGlow(fGlow);
else SetElementGlow(sElement, fGlow);
}
}
else if (sCommand == "lockappearance")
{
if (iNum == COMMAND_OWNER) g_iAppLock = llList2Integer(lParams, 1);
}
return TRUE;
}
// Get from Group_Token=Value , 0=Group, 1=Token, 2=Value
string SplitTokenValue(string in, integer slot)
{
string out ;
if (slot==0) out = llGetSubString(in, 0, llSubStringIndex(in, "_") );
else if (slot==1) out = llGetSubString(in, llSubStringIndex(in, "_")+1, llSubStringIndex(in, "=")-1);
else if (slot==2) out = llGetSubString(in, llSubStringIndex(in, "=")+1, -1);
return out ;
}
default
{
on_rez(integer iParam)
{
llResetScript();
}
state_entry()
{
g_kWearer = llGetOwner();
BuildElementList();
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (UserCommand(iNum, sStr, kID)) return;
else if (iNum == LM_SETTING_RESPONSE)
{
list params = llParseString2List(sStr,["="],[]);
string sToken = llList2String(params, 0);
string sValue = llList2String(params, 1);
if (sToken == g_sAppLockToken) g_iAppLock = (integer)sValue;
else if (sToken == "Global_CType") CTYPE = sValue;
}
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == DIALOG_RESPONSE)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
g_lMenuIDs=llDeleteSubList(g_lMenuIDs,iMenuIndex,iMenuIndex);
//got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (sMessage == UPMENU)
{
if (g_sCurrentElement == "")
{
//main menu
llMessageLinked(LINK_THIS, iAuth, "menu "+g_sParentMenu, kAv);
}
else
{
g_sCurrentElement = "" ;
ElementMenu(kAv, iAuth);
}
}
else if (sMessage == "*Touch*")
{
Notify(kAv, "Please touch the part of the collar you want to shiny.", FALSE);
g_kTouchID = TouchRequest(kAv, TRUE, FALSE, iAuth);
}
else if (g_sCurrentElement == "")
{
//we just got the element name
g_sCurrentElement = sMessage;
GlowMenu(kAv, iAuth);
}
else if (~(integer)llListFindList(g_lGlowButtons, [sMessage]))
{
if (sMessage == "0.00") g_fCurrentGlow = 0.0 ;
else if (sMessage == "0.05") g_fCurrentGlow = 0.05 ;
else if (sMessage == "0.10") g_fCurrentGlow = 0.10 ;
else if (sMessage == "0.20") g_fCurrentGlow = 0.20 ;
else if (sMessage == "0.50") g_fCurrentGlow = 0.50 ;
else if (sMessage == "+0.01") g_fCurrentGlow += 0.01 ;
else if (sMessage == "+0.05") g_fCurrentGlow += 0.05 ;
else if (sMessage == "+0.10") g_fCurrentGlow += 0.10 ;
else if (sMessage == "-0.01") g_fCurrentGlow -= 0.01 ;
else if (sMessage == "-0.05") g_fCurrentGlow -= 0.05 ;
else if (sMessage == "-0.10") g_fCurrentGlow -= 0.10 ;
if (g_fCurrentGlow < 0.0) g_fCurrentGlow = 0.0 ;
if (g_fCurrentGlow > 1.0) g_fCurrentGlow = 1.0 ;
if(g_sCurrentElement == ALL) SetAllGlow(g_fCurrentGlow);
else SetElementGlow(g_sCurrentElement, g_fCurrentGlow);
GlowMenu(kAv, iAuth);
}
}
}
else if (iNum == DIALOG_TIMEOUT)
{
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (iMenuIndex != -1)
{
g_lMenuIDs=llDeleteSubList(g_lMenuIDs,iMenuIndex,iMenuIndex);
}
}
else if (iNum == TOUCH_RESPONSE)
{
if (kID == g_kTouchID)
{
list lParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lParams, 0);
integer iAuth = (integer)llList2String(lParams, 1);
integer iLinkNumber = (integer)llList2String(lParams, 3);
string sElement = ElementType(iLinkNumber);
if (sElement != g_sIgnoreType)
{
g_sCurrentElement = sElement;
GlowMenu(kAv, iAuth);
Notify(kAv, "You selected \""+sElement+"\".", FALSE);
}
else
{
Notify(kAv, "You selected a prim which is not shiny. You can try again.", FALSE);
ElementMenu(kAv, iAuth);
}
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,337 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - outfits //
// version 3.980 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string SUBMENU_BUTTON = "Outfits"; // Name of the submenu
string COLLAR_PARENT_MENU = "Apps"; // name of the menu, where the menu plugs in, should be usually Addons. Please do not use the mainmenu anymore
key g_kMenuID; // menu handler
key g_kFolderMenuID; // folder menu
key g_kRemAttachedMenuID; // attachment remove menu
key g_kMultipleMatchMenuID;
key g_kWearer;
key g_kMenuClicker;
integer g_iListener; // key of the current wearer to reset only on owner changes
string g_sScript="Outfits_"; // part of script name used for settings
string CTYPE = "collar"; // designer can set in notecard to appropriate word for their item
integer g_iFolderRLV = 98745923;
integer g_iFolderRLVSearch = 98745925;
integer g_iTimeOut = 30; //timeout on viewer response commands
integer g_iRlvOn = FALSE;
integer g_iRlvaOn = FALSE;
string g_sCurrentPath;
string g_sPathPrefix = ".outfits"; //we look for outfits in here
// OpenCollar MESSAGE MAP
// messages for authenticating users
// integer COMMAND_NOAUTH = 0; // for reference, but should usually not be in use inside plugins
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
integer COMMAND_RELAY_SAFEWORD = 511;
integer COMMAND_BLACKLIST = 520;
integer WEARERLOCKOUT = 620; // turns on and off wearer lockout
// messages for storing and retrieving values from settings store
integer LM_SETTING_SAVE = 2000; // scripts send messages on this channel to have settings saved to settings store
// str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001; // when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002; // the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003; // delete token from settings store
integer LM_SETTING_EMPTY = 2004; // sent by settings script when a token has no value in the settings store
integer LM_SETTING_REQUEST_NOCACHE = 2005;
// messages for creating OC menu structure
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
// messages for RLV commands
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001; // RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002; // RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; // RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer RLV_QUERY = 6102; //query from a script asking if RLV is currently functioning
integer RLV_RESPONSE = 6103; //reply to RLV_QUERY, with "ON" or "OFF" as the message
integer RLVA_VERSION = 6004;
// messages to the dialog helper
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer FIND_AGENT = -9005; // to look for agent(s) in region with a (optional) search string
key REQUEST_KEY;
integer TIMER_EVENT = -10000; // str = "start" or "end". For start, either "online" or "realtime".
integer UPDATE = 10001; // for child prim scripts (currently none in 3.8, thanks to LSL new functions)
// For other things that want to manage showing/hiding keys.
integer KEY_VISIBLE = -10100;
integer KEY_INVISIBLE = -10100;
integer COMMAND_PARTICLE = 20000;
integer COMMAND_LEASH_SENSOR = 20001;
//chain systems
integer LOCKMEISTER = -8888;
integer LOCKGUARD = -9119;
//rlv relay chan
integer RLV_RELAY_CHANNEL = -1812221819;
// menu option to go one step back in menustructure
string UPMENU = "BACK"; // when your menu hears this, give the parent menu
string BACKMENU = "⏎";
//Debug(string sMsg) { llOwnerSay(llGetScriptName() + " [DEBUG]: " + sMsg);}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer){
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
return kID;
}
DoMenu(key keyID, integer iAuth) {
list lMyButtons;
string sPrompt = "\nOutfits ";
if (!g_iRlvOn) {
sPrompt += "\nYou need to enable RLV to use this plugin";
}
else {
lMyButtons += ["Browse"];
}
g_kMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
}
FolderMenu(key keyID, integer iAuth,string sFolders) {
string sPrompt = "\nOutfits ";
sPrompt = "\n\nCurrent Path = "+g_sCurrentPath;
list lMyButtons;
lMyButtons += llParseString2List(sFolders,[","],[""]);
// and dispay the menu
if (g_sCurrentPath == g_sPathPrefix+"/") { //If we're at root, don't bother with BACKMENU
g_kFolderMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
} else {
if (sFolders == "") {
g_kFolderMenuID = Dialog(keyID, sPrompt, lMyButtons, ["WEAR",UPMENU,BACKMENU], 0, iAuth);
} else {
g_kFolderMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU,BACKMENU], 0, iAuth);
}
}
}
RemAttached(key keyID, integer iAuth,string sFolders) {
string sPrompt = "\nOutfits ";
sPrompt = "\n\nRemove Attachment by Name";
list lMyButtons;
lMyButtons += llParseString2List(sFolders,[","],[""]);
// and dispay the menu
g_kRemAttachedMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
}
integer UserCommand(integer iNum, string sStr, key kID, integer remenu) {
sStr=llToLower(sStr);
if (!(iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)) {
return FALSE;
} else if (sStr == "outfits" || sStr == "menu outfits") {
// an authorized user requested the plugin menu by typing the menus chat command
DoMenu(kID, iNum);
} else if (llSubStringIndex(sStr,"outfits ") == 0) {
sStr = llDeleteSubString(sStr,0,llStringLength("outfits ")-1);
if (sStr) { //we have a folder to try find...
llSetTimerEvent(g_iTimeOut);
g_iListener = llListen(g_iFolderRLVSearch, "", llGetOwner(), "");
g_kMenuClicker = kID;
if (g_iRlvaOn) {
llOwnerSay("@findfolders:"+sStr+"="+(string)g_iFolderRLVSearch);
}
else {
llOwnerSay("@findfolder:"+sStr+"="+(string)g_iFolderRLVSearch);
}
}
}
if (remenu) {
DoMenu(kID, iNum);
}
return TRUE;
}
string WearFolder (string sStr) { //function grabs g_sCurrentPath, and splits out the final directory path, attaching .alwaysadd directories and passes RLV commands
string sOutput;
string sPrePath;
list lTempSplit = llParseString2List(sStr,["/"],[]);
lTempSplit = llList2List(lTempSplit,0,llGetListLength(lTempSplit) -2);
sPrePath = llDumpList2String(lTempSplit,"/");
if (g_sPathPrefix + "/" == sPrePath) { //
sOutput = "@remoutfit=force,detach=force,attachallover:"+sStr+"=force,attachallover:"+g_sPathPrefix+"/.alwaysadd/=force";
}
else {
sOutput = "@remoutfit=force,detach=force,attachallover:"+sStr+"=force,attachallover:"+g_sPathPrefix+"/.alwaysadd/=force,attachallover:"+sPrePath+"/.alwaysadd/=force";
}
// llOwnerSay("rlv:"+sOutput);
return sOutput;
}
default {
state_entry()
{
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
g_kWearer = llGetOwner();
}
timer()
{
llListenRemove(g_iListener);
llSetTimerEvent(0.0);
}
on_rez(integer iParam) {
if (llGetOwner()!=g_kWearer) llResetScript();
}
listen(integer iChan, string sName, key kID, string sMsg) {
//llListenRemove(g_iListener);
llSetTimerEvent(0.0);
//llOwnerSay((string)iChan+"|"+sName+"|"+(string)kID+"|"+sMsg);
if (iChan == g_iFolderRLV) { //We got some folders to process
FolderMenu(g_kMenuClicker,COMMAND_OWNER,sMsg); //we use g_kMenuClicker to respond to the person who asked for the menu
}
else if (iChan == g_iFolderRLVSearch) {
if (sMsg == "") {
Notify(kID,"That outfit cannot be found in #RLV/"+g_sPathPrefix,FALSE);
} else { // we got a match
if (llSubStringIndex(sMsg,",") < 0) {
llOwnerSay(WearFolder(sMsg));
g_sCurrentPath = sMsg;
//llOwnerSay("@attachallover:"+g_sPathPrefix+"/.alwaysadd/=force");
Notify(kID,"Loading outfit #RLV/"+sMsg,FALSE);
} else {
string sPrompt = "Multiple folders found. Please select from the following list...";
list lFolderMatches = llParseString2List(sMsg,[","],[]);
g_kMultipleMatchMenuID = Dialog(g_kMenuClicker, sPrompt, lFolderMatches, [UPMENU], 0, COMMAND_OWNER);
}
}
}
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
// llOwnerSay(sStr+" | "+(string)iNum);
if (iNum == MENUNAME_REQUEST && sStr == COLLAR_PARENT_MENU) {
// our parent menu requested to receive buttons, so send ours
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
}
/* else if (iNum == LM_SETTING_RESPONSE) {
// response from setting store have been received, parse the answer
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
// and check if any values for use are received
// if (sToken == "test") {
// if (sValue == (string)1) { g_iCaptureOn = TRUE; }
// }
if (sToken == "Global_CType") CTYPE = sValue;
}
*/
else if (iNum == RLV_ON) {
g_iRlvOn = TRUE;
}
else if (iNum == RLVA_VERSION) {
g_iRlvaOn = TRUE;
}
else if (iNum == COMMAND_SAFEWORD) {
// Safeword has been received, release any restricitions that should be released
}
else if (UserCommand(iNum, sStr, kID, FALSE)) {
// do nothing more if TRUE
}
else if (iNum == DIALOG_RESPONSE) {
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
if (kID == g_kMenuID) {
//got a menu response meant for us, extract the values
// request to switch to parent menu
if (sMessage == UPMENU) {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu "+COLLAR_PARENT_MENU, kAv);
}
else if (sMessage == "Browse") {
g_kMenuClicker = kAv; //on our listen response, we need to know who to pop a dialog for
g_sCurrentPath = g_sPathPrefix + "/";
llSetTimerEvent(g_iTimeOut);
g_iListener = llListen(g_iFolderRLV, "", llGetOwner(), "");
llOwnerSay("@getinv:"+g_sCurrentPath+"="+(string)g_iFolderRLV);
}
}
if (kID == g_kFolderMenuID || kID == g_kMultipleMatchMenuID) {
g_kMenuClicker = kAv;
if (sMessage == UPMENU) {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu "+SUBMENU_BUTTON, kAv);
}
else if (sMessage == BACKMENU) {
list lTempSplit = llParseString2List(g_sCurrentPath,["/"],[]);
lTempSplit = llList2List(lTempSplit,0,llGetListLength(lTempSplit) -2);
g_sCurrentPath = llDumpList2String(lTempSplit,"/") + "/";
llSetTimerEvent(g_iTimeOut);
g_iListener = llListen(g_iFolderRLV, "", llGetOwner(), "");
llOwnerSay("@getinv:"+g_sCurrentPath+"="+(string)g_iFolderRLV);
}
else if (sMessage == "WEAR") {
llOwnerSay(WearFolder(g_sCurrentPath));
//llOwnerSay("@attachallover:"+g_sPathPrefix+"/.alwaysadd/=force");
}
else if (sMessage != "") {
g_sCurrentPath += sMessage + "/";
if (kID == g_kMultipleMatchMenuID) g_sCurrentPath = sMessage;
llSetTimerEvent(g_iTimeOut);
g_iListener = llListen(g_iFolderRLV, "", llGetOwner(), "");
llOwnerSay("@getinv:"+g_sCurrentPath+"="+(string)g_iFolderRLV);
}
}
}
}
}

View File

@@ -0,0 +1,398 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - paint //
// version 3.980 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string g_sSubMenu = "Paint";
string g_sParentMenu = "Main";
string CTYPE = "collar";
key g_kWearer;
string UPMENU = "BACK";
integer COMMAND_OWNER = 500;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
//script specific variables
list g_lMenuIDs;//3-strided list of avkey, dialogid, menuname
integer g_iMenuStride = 3;
integer g_iAllAlpha = 1 ; //whole collar hide state
list g_lElementTypes; //list of element types
list g_lElementTypesUnHideable; //llist of hideable state for g_lElementTypes
list g_lAlphaSettings; //list of currently hidden state of g_lElementTypes
list g_lElementTypesLower; //lower case names, for chat command access
list g_lTexturesCard;
key g_iTexturesCardId;
key g_kNotecardReadRequest;
string g_sTexturesNotecardName="~paint";
integer g_iTexturesNotecardLine=0;
//standard OC functions
Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth, string menuType) {
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
integer iMenuIndex = llListFindList(g_lMenuIDs, [kRCPT]);
list lAddMe = [kRCPT, kID, menuType];
if (iMenuIndex == -1) g_lMenuIDs += lAddMe;
else g_lMenuIDs = llListReplaceList(g_lMenuIDs, lAddMe, iMenuIndex, iMenuIndex + g_iMenuStride - 1);
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
Debug(string sStr){llOwnerSay(llGetScriptName() + ": " + sStr);}
//menu generators
ElementsMenu(key kAv, integer iAuth) {
list lButtons;
if (g_iAllAlpha) lButtons=["Invisible"];
else lButtons=["Visible"];
integer numElementTypes=llGetListLength(g_lElementTypes);
while (numElementTypes--) lButtons += llList2String(g_lElementTypes,numElementTypes);
Dialog(kAv, "\nSelect an element from the list", lButtons, [UPMENU],0, iAuth, "ElementsMenu");
}
ElementMenu(key kAv, integer iAuth, string sMessage){
list lButtons;
integer elementIndex=llListFindList(g_lElementTypesLower,[sMessage]);
if (! llList2Integer(g_lElementTypesUnHideable,elementIndex)){
if (llList2Integer(g_lAlphaSettings,elementIndex)) lButtons=["Invisible"];
else lButtons=["Visible"];
}
integer numFields=llGetListLength(g_lTexturesCard);
while(numFields){
numFields -= 4;
string elementType=llToLower(llList2String(g_lTexturesCard,(numFields)+0));
if (elementType==llToLower(sMessage)) {
lButtons += llList2String(g_lTexturesCard,(numFields)+1);
}
}
Dialog(kAv, "\nSelect a style for the '"+llList2String(g_lElementTypes,elementIndex)+"' elements", lButtons, [UPMENU], 0, iAuth, "element "+sMessage);
}
//script specific functions
buildElementTypes(){ //builds three lists, one of element names, matching one of nohide status for the element group, and a matching currentlyHidden list
g_lElementTypes=[];
g_lElementTypesLower=[];
g_lElementTypesUnHideable=[];
g_lAlphaSettings=[];
integer iLinkCount = llGetNumberOfPrims();
while (iLinkCount-- > 2) {
string description=llStringTrim(llList2String(llGetLinkPrimitiveParams(iLinkCount,[PRIM_DESC]),0),STRING_TRIM);
list descriptionParts=llParseStringKeepNulls(description,["~"],[]);
string type=llList2String(descriptionParts,0);
if ( (llListFindList(descriptionParts,["nocolor"])==-1 || llListFindList(descriptionParts,["notexture"])==-1 || llListFindList(descriptionParts,["nohide"])==-1 ) && ( type != "" || type != "(No Description)") ) {
integer elementIndex=llListFindList(g_lElementTypes,[type]);
if (! ~elementIndex ){ //new element type, make list entries and set element index
elementIndex=llGetListLength(g_lElementTypes);
g_lElementTypes+=type;
g_lElementTypesLower+=llToLower(type);
g_lElementTypesUnHideable+=TRUE;
g_lAlphaSettings+=TRUE;
}
if (llList2Integer(g_lElementTypesUnHideable,elementIndex)){ //all of this element type so far have been unhideable. If this one is too, the element stays unhideable
if (! ~llListFindList(descriptionParts, ["nohide"])){ //this element is hideable, therefore the element type as a whole is not unhideable
g_lElementTypesUnHideable=llListReplaceList(g_lElementTypesUnHideable,[FALSE],elementIndex,elementIndex);
}
}
}
}
}
setElementStyle(string elementType,string sMessage){
//Debug("Setting style of "+elementType+" to "+sMessage);
integer styleIndex=llListFindList(g_lTexturesCard,[elementType,sMessage]);
//Debug("styleIndex "+(string)styleIndex);
if (~styleIndex){
key textureKey=llList2Key(g_lTexturesCard,styleIndex+2);
vector color=(vector)llList2String(g_lTexturesCard,styleIndex+3);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "texture_"+elementType + "=" + (string)sMessage, "");
integer numElements = llGetNumberOfPrims();
while (numElements-- > 2) {
string sDesc = llList2String(llGetLinkPrimitiveParams(numElements, [PRIM_DESC]),0);
list descriptionParts = llParseString2List(sDesc, ["~"], []);
string thisElementType=llList2String(descriptionParts, 0);
if (elementType==llToLower(thisElementType)) { //if this element is the type we're looking for
//calculate and set new texture key
list params ;
if ((key)textureKey){
if (! ~llListFindList(descriptionParts,["notexture"])){
//Debug("Setting texture to "+(string)textureKey);
params += [PRIM_TEXTURE,ALL_SIDES,textureKey, <1.0,1.0,1.0>, <0.0,0.0,0.0>, 0.0] ;
}
}
if (! ~llListFindList(descriptionParts, ["nocolor"]) ){
list oldColourParams=llGetLinkPrimitiveParams(numElements,[PRIM_COLOR,ALL_SIDES]); //get current prim params
float alpha=llList2Float(oldColourParams,1); //calculate the old alpha to re-apply
params += [PRIM_COLOR, ALL_SIDES, color, alpha];
}
if (llGetListLength(params) > 3) llSetLinkPrimitiveParamsFast(numElements, params);
}
}
} else {
//Debug("Can't do "+elementType+" to "+sMessage);
}
}
ApplyElementAlpha(string element_to_set, integer iAlpha) {
integer iLinkCount = llGetNumberOfPrims();
//Debug(element_to_set+" "+ (string)iAlpha);
while (iLinkCount-- > 2) {
string sDesc = llList2String(llGetLinkPrimitiveParams(iLinkCount, [PRIM_DESC]),0);
list descriptionParts = llParseString2List(sDesc, ["~"], []);
string elementType=llToLower(llList2String(descriptionParts, 0));
if (elementType==llToLower(element_to_set) || element_to_set=="all"){ //if this element is the type we want to set, or we're hiding everything
//Debug("Changing "+element_to_set);
if (! ~llListFindList(descriptionParts, ["nohide"]) || element_to_set=="all"){ //unless the element is set to nohide, or we're hiding everything
integer elementTypeIndex=llListFindList(g_lElementTypesLower, [elementType]);
integer elementTypeVisible; //flag to say if this element type is currently visible
if (~ elementTypeIndex){
elementTypeVisible=llList2Integer(g_lAlphaSettings,elementTypeIndex);
}
if (iAlpha && g_iAllAlpha && (elementTypeVisible || ~llListFindList(descriptionParts, ["nohide"]))){ //its a show, and collar is globally visible, and this element type is set visible
//Debug("Global visible, so set this element to visible");
llSetLinkAlpha(iLinkCount, (float)iAlpha, ALL_SIDES); //set element visibility
} else { //its a hide, or collar is globally hidden, or this item is set to be hidden
//Debug("Hide this element");
llSetLinkAlpha(iLinkCount, 0.0, ALL_SIDES); //set element visibility
}
} else {
//Debug("Element set to nohide, and we're not setting global visible");
}
} else {
//Debug (elementType + "!="+llToLower(element_to_set));
}
}
}
SetElementAlpha(string element_to_set, integer iAlpha) {
element_to_set=llToLower(element_to_set);
//Debug("Setting alpha for elements of type "+element_to_set+" to "+(string)iAlpha);
//update element in list of settings
if (element_to_set == "all"){ //mark entire collar's visibility
g_iAllAlpha=iAlpha;
} else { //mark element type's visibility
integer elementTypeIndex=llListFindList(g_lElementTypesLower, [element_to_set]);
g_lAlphaSettings = llListReplaceList(g_lAlphaSettings, [iAlpha], elementTypeIndex, elementTypeIndex);
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "hide_"+element_to_set + "=" + (string)iAlpha, "");
}
ApplyElementAlpha(element_to_set,iAlpha);
}
integer UserCommand(integer iAuth, string sStr, key kAv, integer remenu) {
if (iAuth > COMMAND_WEARER || iAuth < COMMAND_OWNER) return FALSE; // sanity check
//Debug(sStr);
sStr=llToLower(sStr);
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (iAuth == COMMAND_WEARER && sStr == "runaway") {
SetElementAlpha("all",1);
} else if (sStr == "menu paint" || sStr == "menu appearance" || sStr == "paint" || sStr == "appearance") {
if (kAv!=g_kWearer && iAuth!=COMMAND_OWNER) {
Notify(kAv,"You are not allowed to change the "+CTYPE+"'s appearance.", FALSE);
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
}
else ElementsMenu(kAv, iAuth);
} else if (sCommand == "paint"){
if (sValue=="invisible") {
SetElementAlpha("all",0);
if (remenu) ElementsMenu(kAv,iAuth);
} else if (sValue == "visible") {
SetElementAlpha("all",1);
if (remenu) ElementsMenu(kAv,iAuth);
} else if (~llListFindList(g_lElementTypesLower+"all",[sValue])){ //sValue is name of an element or "all"
string sValue2=llToLower(llDumpList2String(llDeleteSubList(lParams, 0, 1)," "));
if (sValue2==""){ //if they just name an element with no texture, then give them the menu
ElementMenu(kAv,iAuth, sValue);
} else { //sValue2 == styleName, "show", "hide" sValue == elementType
if (sValue2 == "visible"){
SetElementAlpha(sValue,1);
if (remenu) ElementMenu(kAv,iAuth, sValue);
} else if (sValue2 == "invisible"){
SetElementAlpha(sValue,0);
if (remenu) ElementMenu(kAv,iAuth, sValue);
} else { //sValue2 == styleName
//Debug("Got texture "+sValue2);
setElementStyle(sValue,sValue2);
if (remenu) ElementMenu(kAv,iAuth, sValue);
}
}
} else { //not the name of an element, or show, or hide, or all
Notify(kAv,"Unrecognised command: "+sValue+" not in '"+llDumpList2String(g_lElementTypesLower,",")+"'",FALSE);
}
}
return TRUE ;
}
default {
state_entry() {
g_kWearer = llGetOwner();
g_iAllAlpha=0;
if (llGetAlpha(ALL_SIDES)>0) g_iAllAlpha=1;
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, "Appearance", "");
buildElementTypes();
if (llGetInventoryKey(g_sTexturesNotecardName)) {
g_iTexturesCardId = llGetInventoryKey(g_sTexturesNotecardName);
g_iTexturesNotecardLine=0;
g_kNotecardReadRequest=llGetNotecardLine(g_sTexturesNotecardName,0);
}
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
if (UserCommand(iNum, sStr, kID, FALSE)) return;
if (iNum == LM_SETTING_RESPONSE) {
list lParams = llParseString2List(sStr, ["="], []);
string sGroupToken = llList2String(lParams, 0);
string sGroup = llList2String(llParseString2List(sGroupToken,["_"],[]),0);
string sToken = llList2String(llParseString2List(sGroupToken,["_"],[]),1);
string sValue = llList2String(lParams, 1);
if (sToken == "CType") {
CTYPE = sValue;
} else if (sGroup == "invisible") {
SetElementAlpha(sToken, (integer)sValue);
} else if (sGroup == "colour") {
setElementStyle(sToken, sValue);
} else if (sGroup == "texture") {
setElementStyle(sToken, sValue);
}
} else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu) {
llMessageLinked(LINK_SET, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
} else if (iNum == LM_SETTING_SAVE) {
//if we see a hide for something saved that we think is not currently hidden, then hide it, and store the new setting locally
if (llSubStringIndex(sStr,"hide_")==0){
list lSettingParts=llParseString2List(llGetSubString(sStr,5,-1),["="],[]);
string element_to_set=llToLower(llList2String(lSettingParts,0));
integer iAlpha=llList2Integer(lSettingParts,1);
integer elementTypeIndex=llListFindList(g_lElementTypesLower,[element_to_set]);
if (~elementTypeIndex){ //if its an element we recognise
if (llList2Integer(g_lAlphaSettings,elementTypeIndex)!=iAlpha){ //if the setting is not what we already know
//Debug("setting "+element_to_set+" to "+(string)iAlpha);
g_lAlphaSettings = llListReplaceList(g_lAlphaSettings, [iAlpha], elementTypeIndex, elementTypeIndex);
ApplyElementAlpha(element_to_set,iAlpha); //apply new setting to collar prims
//Debug(element_to_set+" now set to "+(string)llList2Integer(g_lAlphaSettings,elementTypeIndex));
} else {
//Debug(element_to_set+" already set to "+(string)iAlpha);
}
} else {
//Debug("unknown element"+element_to_set);
}
} else {
//Debug("something saved setting "+sStr);
}
} else if (iNum == DIALOG_RESPONSE) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex) { //got a menu response meant for us. pull out values
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
string sMenuType = llList2String(g_lMenuIDs, iMenuIndex + 1);
//remove stride from g_lMenuIDs
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
if (sMenuType == "ElementsMenu") { //lists all elements in the collar
if (sMessage == UPMENU) { //give kID the parent menu
llMessageLinked(LINK_SET, iAuth, "menu " + g_sParentMenu, kAv);
} else UserCommand(iAuth,"paint "+sMessage, kAv, TRUE);
} else if (llSubStringIndex(sMenuType,"element ")==0){ //lists show/hide/themes for this element
string elementType=llGetSubString(sMenuType,8,-1);
if (sMessage == UPMENU){
ElementsMenu(kAv,iAuth);
} else UserCommand(iAuth,"paint "+elementType+" "+sMessage, kAv, TRUE);
}
}
} else if (iNum == DIALOG_TIMEOUT) {
integer iMenuIndex = llListFindList(g_lMenuIDs, [kID]);
if (~iMenuIndex) { //remove stride from g_lMenuIDs
g_lMenuIDs = llDeleteSubList(g_lMenuIDs, iMenuIndex - 1, iMenuIndex - 2 + g_iMenuStride);
}
}
}
dataserver(key id, string data){
if (id == g_kNotecardReadRequest){
if (data != EOF){
data = llStringTrim(data,STRING_TRIM);
if (data != ""){
list parts=llParseStringKeepNulls(data,["~",",","<",">"],[]);
string element=llList2String(parts,0);
string name=llList2String(parts,1);
key texKey=llList2Key(parts,2);
vector colour;
if (llGetListLength(parts) < 6){
colour=<1.0,1.0,1.0>;
} else {
colour=(vector)("<"+llList2String(parts,4)+","+llList2String(parts,5)+","+llList2String(parts,6)+">");
}
g_lTexturesCard+=[llToLower(element),llToLower(name),texKey,colour];
}
g_kNotecardReadRequest=llGetNotecardLine(g_sTexturesNotecardName,++g_iTexturesNotecardLine);
}
}
}
changed (integer change){
if (change & CHANGED_INVENTORY){
if (g_iTexturesCardId != llGetInventoryKey(g_sTexturesNotecardName)){
//Debug("Reading textures card");
g_iTexturesCardId = llGetInventoryKey(g_sTexturesNotecardName);
g_lTexturesCard=[];
g_iTexturesNotecardLine=0;
g_kNotecardReadRequest=llGetNotecardLine(g_sTexturesNotecardName,0);
}
}
}
}

View File

@@ -1,21 +1,16 @@
// Copyright (c) 2008 - 2015 Satomi Ahn, Nandana Singh, Joy Stipe,
// Wendy Starfall, Sumi Perl, littlemousy, Romka Swallowtail et al.
//
// This script is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation, version 2.
//
// This script is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this script; if not, see www.gnu.org/licenses/gpl-2.0
//
// Debug(string sStr) { llOwnerSay("Debug ["+llGetScriptName()+"]: " + sStr); }
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - rlvcmd //
// version 3.980 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free. //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
//RLV Commands (from RLVa sourcecode - rlvhandler.h v1.4.10)
// @getstatus:[<option>][;<separator>] * Examples : @getstatus=123 ; @getstatus:tp=123 ; @getstatus:tp;|=123 ; @getstatus:;|=123
@@ -23,18 +18,18 @@
//****Actions****//
// @unsit=force - Checked: 2010-03-18 (RLVa-1.2.0c) | Modified: RLVa-0.2.0g
// @unsit=force - Checked: 2010-03-18 (RLVa-1.2.0c) | Modified: RLVa-0.2.0g
// @remattach=force - force detach all attachments points
// @detachme=force <--pulls off collar - Checked: 2010-09-04 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
// @detachme=force <--pulls off collar - Checked: 2010-09-04 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
//****Actions w/ textbox****//
// @setgroup:<uuid|name>=force - Checked: 2011-03-28 (RLVa-1.4.1a) | Added: RLVa-1.3.0f
// @setgroup:<uuid|name>=force - Checked: 2011-03-28 (RLVa-1.4.1a) | Added: RLVa-1.3.0f
// @sit:<option>=force
// @tpto:<option>=force - Checked: 2011-03-28 (RLVa-1.3.0f) | Modified: RLVa-1.3.0f
// @tpto:<option>=force - Checked: 2011-03-28 (RLVa-1.3.0f) | Modified: RLVa-1.3.0f
//****Wearables****//
// @remattach:<attachpt>=force - force detach single attachment point
// @detach:<attachpt>=n|y - RLV_LOCK_ADD and RLV_LOCK_REMOVE locks an attachment *point*
// @detach[:<option>]=force - Checked: 2010-08-30 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
// @remattach:<attachpt>=force - force detach single attachment point
// @detach:<attachpt>=n|y - RLV_LOCK_ADD and RLV_LOCK_REMOVE locks an attachment *point*
// @detach[:<option>]=force - Checked: 2010-08-30 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
// @remattach[:<option>]=force
// @remoutfit[:<option>]=force
//****Wearables w/ textbox****//
@@ -54,16 +49,16 @@
// @getinvworn[:<path>]=<channel>
//****Info Gather****//
// @getgroup=<channel> - Checked: 2011-03-28 (RLVa-1.4.1a) | Added: RLVa-1.3.0f
// @getsitid=<channel> - Checked: 2010-03-09 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
// @getstatus=<channel> - Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f
// @getstatusall=<channel> - Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f
// @version=<channel> - Checked: 2010-03-27 (RLVa-1.4.0a)
// @versionnew=<channel> - Checked: 2010-03-27 (RLVa-1.4.0a) | Added: RLVa-1.2.0b
// @versionnum=<channel> - Checked: 2010-03-27 (RLVa-1.4.0a) | Added: RLVa-1.0.4b
// @getgroup=<channel> - Checked: 2011-03-28 (RLVa-1.4.1a) | Added: RLVa-1.3.0f
// @getsitid=<channel> - Checked: 2010-03-09 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
// @getstatus=<channel> - Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f
// @getstatusall=<channel> - Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f
// @version=<channel> - Checked: 2010-03-27 (RLVa-1.4.0a)
// @versionnew=<channel> - Checked: 2010-03-27 (RLVa-1.4.0a) | Added: RLVa-1.2.0b
// @versionnum=<channel> - Checked: 2010-03-27 (RLVa-1.4.0a) | Added: RLVa-1.0.4b
//****Commandline Search****//
// @getcommand:<option>=<channel> - Checked: 2010-12-11 (RLVa-1.2.2c) | Added: RLVa-1.2.2c
// @getcommand:<option>=<channel> - Checked: 2010-12-11 (RLVa-1.2.2c) | Added: RLVa-1.2.2c
@@ -216,29 +211,28 @@ list g_lChat = [
list g_lDisabled; //we will log our disabled here
string g_lOwnerSpecifics;
string g_sSubMenu = "RLVcmd"; // Name of the submenu
string g_sParentMenu = "Apps"; // name of the menu, where the menu plugs in, should be usually Addons. Please do not use the mainmenu anymore
string g_sScript = "RLVcmd_"; // part of script name used for settings
key g_kMenuID = NULL_KEY; // menu handler
key g_kMenuIDEnablements = NULL_KEY; // menu handler
key g_kMenuIDOther = NULL_KEY;
key g_kWearer = NULL_KEY; // key of the current wearer to reset only on owner changes
key g_kClicker = NULL_KEY; //capture clicker IDs
string SUBMENU_BUTTON = "RLVcmd"; // Name of the submenu
string COLLAR_PARENT_MENU = "Apps"; // name of the menu, where the menu plugs in, should be usually Addons. Please do not use the mainmenu anymore
key g_kMenuID; // menu handler
key g_kMenuIDEnablements; // menu handler
key g_kMenuIDOther;
key g_kWearer; // key of the current wearer to reset only on owner changes
key g_kClicker; //capture clicker IDs
string g_sScript = "RLVcmd_"; // part of script name used for settings
string CTYPE = "collar"; // designer can set in notecard to appropriate word for their item
integer g_iRlvOn = FALSE;
integer g_iRlvaOn = FALSE;
integer g_iListenerHandle;
list g_lListeners;
key g_kRlvCommand = NULL_KEY;
key g_kRlvCommand;
key g_kRlvTextboxCommand = NULL_KEY; //textbox handler in case we need more information
key g_kRlvTextboxCommand; //textbox handler in case we need more information
list g_lStoredCommand = []; //and a list to queue stored commands (these expire)
list g_lRlvCommandHistory; //history of commands
integer g_iListenerChannel;
string WEARERNAME;
integer g_iExceptionsChannel = 98726392; //channel to listen for exceptions
string TICKED = "☒ ";
@@ -247,133 +241,139 @@ string UNTICKED = "☐ ";
// OpenCollar MESSAGE MAP
// messages for authenticating users
integer CMD_OWNER = 500;
//integer CMD_TRUST = 501;
//integer CMD_GROUP = 502;
integer CMD_WEARER = 503;
//integer CMD_EVERYONE = 504;
//integer CMD_RLV_RELAY = 507;
integer CMD_SAFEWORD = 510;
//integer CMD_RELAY_SAFEWORD = 511;
//integer CMD_BLACKLIST = 520;
// integer COMMAND_NOAUTH = 0; // for reference, but should usually not be in use inside plugins
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
//integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
//integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
//integer COMMAND_RELAY_SAFEWORD = 511;
//integer COMMAND_BLACKLIST = 520;
// added for timer so when the sub is locked out they can use postions
//integer CMD_WEARERLOCKEDOUT = 521;
//integer COMMAND_WEARERLOCKEDOUT = 521;
//integer ATTACHMENT_REQUEST = 600;
//integer ATTACHMENT_RESPONSE = 601;
//integer ATTACHMENT_FORWARD = 610;
//integer ATTACHMENT_REQUEST = 600;
//integer ATTACHMENT_RESPONSE = 601;
//integer ATTACHMENT_FORWARD = 610;
//integer WEARERLOCKOUT = 620; // turns on and off wearer lockout
//integer WEARERLOCKOUT = 620; // turns on and off wearer lockout
// integer SEND_IM = 1000; deprecated. each script should send its own IMs now.
// This is to reduce even the tiny bit of lag caused by having IM slave scripts
//integer POPUP_HELP = 1001;
// messages for storing and retrieving values from settings store
//integer LM_SETTING_SAVE = 2000; // scripts send messages on this channel to have settings saved to settings store
//integer LM_SETTING_SAVE = 2000; // scripts send messages on this channel to have settings saved to settings store
// str must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001; // when startup, scripts send requests for settings on this channel
//integer LM_SETTING_RESPONSE = 2002; // the settings script will send responses on this channel
//integer LM_SETTING_DELETE = 2003; // delete token from settings store
//integer LM_SETTING_EMPTY = 2004; // sent by settings script when a token has no value in the settings store
//integer LM_SETTING_REQUEST = 2001; // when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002; // the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003; // delete token from settings store
//integer LM_SETTING_EMPTY = 2004; // sent by settings script when a token has no value in the settings store
//integer LM_SETTING_REQUEST_NOCACHE = 2005;
// messages for creating OC menu structure
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
//integer MENUNAME_REMOVE = 3003;
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
// messages for RLV commands
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001; // RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002; // RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; // RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLVA_VERSION = 6004;
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer RLV_QUERY = 6102; //query from a script asking if RLV is currently functioning
integer RLV_RESPONSE = 6103; //reply to RLV_QUERY, with "ON" or "OFF" as the message
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001; // RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002; // RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; // RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLVA_VERSION = 6004;
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer RLV_QUERY = 6102; //query from a script asking if RLV is currently functioning
integer RLV_RESPONSE = 6103; //reply to RLV_QUERY, with "ON" or "OFF" as the message
// messages for poses and couple anims
//integer ANIM_START = 7000; // send this with the name of an anim in the string part of the message to play the anim
//integer ANIM_STOP = 7001; // send this with the name of an anim in the string part of the message to stop the anim
//integer CPLANIM_PERMREQUEST = 7002; // id should be av's key, str should be cmd name "hug", "kiss", etc
//integer CPLANIM_PERMRESPONSE = 7003; // str should be "1" for got perms or "0" for not. id should be av's key
//integer CPLANIM_START = 7004; // str should be valid anim name. id should be av
//integer CPLANIM_STOP = 7005; // str should be valid anim name. id should be av
//integer ANIM_START = 7000; // send this with the name of an anim in the string part of the message to play the anim
//integer ANIM_STOP = 7001; // send this with the name of an anim in the string part of the message to stop the anim
//integer CPLANIM_PERMREQUEST = 7002; // id should be av's key, str should be cmd name "hug", "kiss", etc
//integer CPLANIM_PERMRESPONSE = 7003; // str should be "1" for got perms or "0" for not. id should be av's key
//integer CPLANIM_START = 7004; // str should be valid anim name. id should be av
//integer CPLANIM_STOP = 7005; // str should be valid anim name. id should be av
// messages to the dialog helper
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
//integer FIND_AGENT = -9005; // to look for agent(s) in region with a (optional) search string
//integer FIND_AGENT = -9005; // to look for agent(s) in region with a (optional) search string
//key REQUEST_KEY;
//integer TIMER_EVENT = -10000; // str = "start" or "end". For start, either "online" or "realtime".
//integer TIMER_EVENT = -10000; // str = "start" or "end". For start, either "online" or "realtime".
//integer UPDATE = 10001; // for child prim scripts (currently none in 3.8, thanks to LSL new functions)
//integer UPDATE = 10001; // for child prim scripts (currently none in 3.8, thanks to LSL new functions)
// For other things that want to manage showing/hiding keys.
//integer KEY_VISIBLE = -10100;
//integer KEY_INVISIBLE = -10100;
//integer KEY_VISIBLE = -10100;
//integer KEY_INVISIBLE = -10100;
//integer CMD_PARTICLE = 20000;
//integer CMD_LEASH_SENSOR = 20001;
//integer COMMAND_PARTICLE = 20000;
//integer COMMAND_LEASH_SENSOR = 20001;
//chain systems
//integer LOCKMEISTER = -8888;
//integer LOCKGUARD = -9119;
//integer LOCKMEISTER = -8888;
//integer LOCKGUARD = -9119;
//rlv relay chan
//integer RLV_RELAY_CHANNEL = -1812221819;
//integer RLV_RELAY_CHANNEL = -1812221819;
// menu option to go one step back in menustructure
string UPMENU = "BACK"; // when your menu hears this, give the parent menu
string UPMENU = "BACK"; // when your menu hears this, give the parent menu
integer NOTIFY = 1002;
integer REBOOT = -1000;
integer LINK_DIALOG = 3;
integer LINK_RLV = 4;
integer LINK_SAVE = 5;
integer LINK_UPDATE = -10;
Notify(key kID, string sMsg, integer iAlsoNotifyWearer) {
llMessageLinked(LINK_DIALOG,NOTIFY,(string)iAlsoNotifyWearer+sMsg,kID);
//Debug(string sMsg) { llOwnerSay(llGetScriptName() + " [DEBUG]: " + sMsg);}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_DIALOG, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
return kID;
}
integer FindCommandType(string sCommand) //this is really inefficient, need one function to do this
{
integer iToken;
if(llListFindList(g_lChat, [sCommand]) >= 0) {
if(llListFindList(g_lEnablements, [sCommand]) >= 0) {
iToken = llListFindList(g_lEnablements, [sCommand]);
iToken = llList2Integer(g_lEnablements, iToken + 1);
} else if(llListFindList(g_lChat, [sCommand]) >= 0) {
iToken = llListFindList(g_lChat, [sCommand]);
iToken = llList2Integer(g_lChat, iToken + 1);
} else if(llListFindList(g_lGatherInfo, [sCommand]) >= 0) {
} else if(llListFindList(g_lGatherInfo, [sCommand]) >= 0) {
iToken = llListFindList(g_lGatherInfo, [sCommand]);
iToken = llList2Integer(g_lGatherInfo, iToken + 1);
} else if(llListFindList(g_lWearables, [sCommand]) >= 0) {
} else if(llListFindList(g_lWearables, [sCommand]) >= 0) {
iToken = llListFindList(g_lWearables, [sCommand]);
iToken = llList2Integer(g_lWearables, iToken + 1);
} else if(llListFindList(g_lActions, [sCommand]) >= 0) {
} else if(llListFindList(g_lActions, [sCommand]) >= 0) {
iToken = llListFindList(g_lActions, [sCommand]);
iToken = llList2Integer(g_lActions, iToken + 1);
} else {} //TODO - Use GETCOMMAND to match partial string|tpto|
} else {} //TODO - Use GETCOMMAND to match partial string|tpto|
return iToken;
}
DoMenu(key keyID, integer iAuth)
{
string sPrompt = "\n" + g_sSubMenu;
string sPrompt = "\n" + SUBMENU_BUTTON;
list lMyButtons;
if(g_iRlvOn) {
sPrompt += " Enabled. Press CMD to enter a command. Press HELP for a list of commands\n\n" +
@@ -432,30 +432,30 @@ ProcessCommand(key kID, string sCommand, integer iCommandType, string sParam1, s
} else if(iCommandType == 2) {
if(sParam1) { RlvCmd("@" + sCommand + ":" + sParam1 + "=force"); return; } //if we have param1, we're good, if not, pop up textbox
g_kRlvTextboxCommand = Dialog(kID,
"\n@" + sCommand + ":[option]=force\n\n"+sHelp, [], [], 0, CMD_OWNER);
"\n@" + sCommand + ":[option]=force\n\n"+sHelp, [], [], 0, COMMAND_OWNER);
g_lStoredCommand += [(string)kID + "~" + sCommand + "~" + (string)iCommandType + "~" + sParam1 + "~" + sParam2];
} else if(iCommandType == 3) {
if(sParam1) { RlvCmd("@" + sCommand + ":" + sParam1 + "=" + (string)iRandom); return; } //if we have param1, we're good, if not, pop up textbox
g_kRlvTextboxCommand = Dialog(kID,
"\n@" + sCommand + ":[option]=force\n\n"+sHelp, [], [], 0, CMD_OWNER);
"\n@" + sCommand + ":[option]=force\n\n"+sHelp, [], [], 0, COMMAND_OWNER);
g_lStoredCommand += [(string)kID + "~" + sCommand + "~" + (string)iCommandType + "~" + sParam1 + "~" + sParam2];
} else if(iCommandType == 4) {
if((sParam1 != "") && (sParam2 != "")) { RlvCmd("@" + sCommand + ":" + sParam1 + "=" + sParam2); return; } //if we have param1&2, we're good, if not, pop up textbox
g_kRlvTextboxCommand = Dialog(kID,
"\n@" + sCommand + ":[attachpt/option]=[y/n]\n\n"+sHelp+"\n(please enter two words separated by space)", [], [], 0, CMD_OWNER);
"\n@" + sCommand + ":[attachpt/option]=[y/n]\n\n"+sHelp+"\n(please enter two words separated by space)", [], [], 0, COMMAND_OWNER);
g_lStoredCommand += [(string)kID + "~" + sCommand + "~" + (string)iCommandType + "~" + sParam1 + "~" + sParam2];
} else if(iCommandType == 5) {
if((sParam1 != "") && (sParam2 != "")) { RlvCmd("@" + sCommand + ":" + sParam1 + "=" + sParam2); return; } //if we have param1&2, we're good, if not, pop up textbox
g_kRlvTextboxCommand = Dialog(kID,
"\n@" + sCommand + ":[channel]=[y/n]\n\n"+sHelp+"\n(please enter two words separated by space)", [], [], 0, CMD_OWNER);
"\n@" + sCommand + ":[channel]=[y/n]\n\n"+sHelp+"\n(please enter two words separated by space)", [], [], 0, COMMAND_OWNER);
} else if(iCommandType == 6) {
if((sParam1 != "") && (sParam2 != "")) { RlvCmd("@" + sCommand + ":" + sParam1 + "=" + sParam2); return; } //if we have param1&2, we're good, if not, pop up textbox
g_kRlvTextboxCommand = Dialog(kID,
"\n@" + sCommand + ":[params]=[y/n]\n\n"+sHelp+"\n(please enter two words separated by space)", [], [], 0, CMD_OWNER);
"\n@" + sCommand + ":[params]=[y/n]\n\n"+sHelp+"\n(please enter two words separated by space)", [], [], 0, COMMAND_OWNER);
} else if(iCommandType == 7) {
if(sParam1) { RlvCmd("@" + sCommand + ":" + sParam1 + "=force"); return; } //if we have param1, we're good, if not, pop up textbox
g_kRlvTextboxCommand = Dialog(kID,
"\n@" + sCommand + "=[y/n]\n\n"+sHelp, [], [], 0, CMD_OWNER);
"\n@" + sCommand + "=[y/n]\n\n"+sHelp, [], [], 0, COMMAND_OWNER);
g_lStoredCommand += [(string)kID + "~" + sCommand + "~" + (string)iCommandType + "~" + sParam1 + "~" + sParam2];
}
}
@@ -470,17 +470,15 @@ RlvCmd(string sStr)
string sCommand = sStr;
if(llSubStringIndex(sStr, "=") >= 0) {
start = llSubStringIndex(sStr, "=") + 1;
if(llSubStringIndex(sStr, ";") >= 0) end = llSubStringIndex(sStr, ";") - 1;
else end = llStringLength(sStr);
if(llSubStringIndex(sStr, ";") >= 0) {
end = llSubStringIndex(sStr, ";") - 1;
} else { end = llStringLength(sStr); }
}
sStr = llGetSubString(sStr, start, end);
start = 0;
end = llStringLength(sStr) - 1;
for(start; start <= end; ++start) { //run through this number list to make sure each character is numeric
if(isInteger(llGetSubString(sStr, start, start)) != 1) {
OutCommand(sCommand);
return;
} //something left in here isn't an integer, send the full command
if(isInteger(llGetSubString(sStr, start, start)) != 1) { OutCommand(sCommand); return; } //something left in here isn't an integer, send the full command
}
llSetTimerEvent(20);
g_iListenerChannel = (integer)sStr;
@@ -491,62 +489,64 @@ RlvCmd(string sStr)
OutCommand (string sCommand) {
sCommand = llGetSubString(sCommand,1,-1); //strip off @
llMessageLinked(LINK_RLV, RLV_CMD, sCommand, g_kClicker);
llMessageLinked(LINK_SET, RLV_CMD, sCommand, g_kClicker);
}
UserCommand(integer iAuth, string sStr, key kID, integer remenu)
integer UserCommand(integer iNum, string sStr, key kID, integer remenu)
{
if (iAuth != CMD_OWNER) return ;
sStr = llToLower(sStr);
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 1); //rlv command
string sParam1 = llList2String(lParams, 2); //param 1
string sParam2 = llList2String(lParams, 3); //param 2
lParams = []; //clean
string sMainButton = llToLower(g_sSubMenu);
if((g_iRlvOn == FALSE) && (llSubStringIndex(sStr, sMainButton) == 0)) {
Notify(kID, "RLV is off in %WEARERNAME%'s %DEVICETYPE%. Please enable RLV before using this plugin", FALSE);
return ;
string sMainButton = llToLower(SUBMENU_BUTTON);
if(!(iNum >= COMMAND_OWNER && iNum <= COMMAND_OWNER)) {
return FALSE;
} else if((g_iRlvOn == FALSE) && (llSubStringIndex(sStr, sMainButton) == 0)) {
Notify(kID, "RLV is off in " + WEARERNAME + "'s " + CTYPE + ". Please enable RLV before using this plugin", FALSE);
return FALSE;
} else if(sStr == sMainButton || sStr == "menu " + sMainButton) {
//an authorized user requested the plugin menu by typing the menus chat command
DoMenu(kID, iAuth);
} else if(sStr == sMainButton + " reset") {
DoMenu(kID, iNum);
} else if(sStr == sMainButton + " reset") {
llResetScript();
} else if((llSubStringIndex(sStr, sMainButton) == 0) && (llGetSubString(sCommand, 0, 0) == "@")) {
} else if((llSubStringIndex(sStr, sMainButton) == 0) && (llGetSubString(sCommand, 0, 0) == "@")) {
//sStr = llStringTrim(llDeleteSubString(sStr,0,llStringLength(sMainButton)),STRING_TRIM);
//if (llSubStringIndex(sStr,"@") == 0) { //rlv commands need to start with @
Notify(kID, "Sending RLV command " + sCommand + " to %WEARERNAME%'s %DEVICETYPE%", FALSE);
Notify(kID, "Sending RLV command " + sCommand + " to " + WEARERNAME + "'s " + CTYPE, FALSE);
g_lRlvCommandHistory += [sStr];
g_kClicker = kID;
RlvCmd(sStr);
//}
} else if(llSubStringIndex(sStr, sMainButton) == 0) {
} else if(llSubStringIndex(sStr, sMainButton) == 0) {
integer iToken;
if(llListFindList(g_lEnablements, [sCommand]) >= 0) {
iToken = llListFindList(g_lEnablements, [sCommand]);
ProcessCommand(kID, llList2String(g_lEnablements, iToken), 7, sParam1, sParam2);
return ;
} else if(llListFindList(g_lChat, [sCommand]) >= 0) {
return TRUE;
} else if(llListFindList(g_lChat, [sCommand]) >= 0) {
iToken = llListFindList(g_lChat, [sCommand]);
ProcessCommand(kID, llList2String(g_lChat, iToken), llList2Integer(g_lChat, iToken + 1), sParam1, sParam2);
return ;
} else if(llListFindList(g_lGatherInfo, [sCommand]) >= 0) {
return TRUE;
} else if(llListFindList(g_lGatherInfo, [sCommand]) >= 0) {
iToken = llListFindList(g_lGatherInfo, [sCommand]);
ProcessCommand(kID, llList2String(g_lGatherInfo, iToken), llList2Integer(g_lGatherInfo, iToken + 1), sParam1, sParam2);
return ;
} else if(llListFindList(g_lWearables, [sCommand]) >= 0) {
return TRUE;
} else if(llListFindList(g_lWearables, [sCommand]) >= 0) {
iToken = llListFindList(g_lWearables, [sCommand]);
ProcessCommand(kID, llList2String(g_lWearables, iToken), llList2Integer(g_lWearables, iToken + 1), sParam1, sParam2);
return ;
} else if(llListFindList(g_lActions, [sCommand]) >= 0) {
return TRUE;
} else if(llListFindList(g_lActions, [sCommand]) >= 0) {
iToken = llListFindList(g_lActions, [sCommand]);
ProcessCommand(kID, llList2String(g_lActions, iToken), llList2Integer(g_lActions, iToken + 1), sParam1, sParam2);
return ;
} else {Notify(kID, "Invalid command", FALSE);} //TODO - Use GETCOMMAND to match partial string
return TRUE;
} else {Notify(kID, "Invalid command", FALSE);} //TODO - Use GETCOMMAND to match partial string
}
if(remenu) {
DoMenu(kID, iNum);
}
if(remenu) DoMenu(kID, iAuth);
return TRUE;
}
string StringHistorySnippet()
@@ -567,11 +567,14 @@ string StringHistorySnippet()
default {
state_entry() {
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
g_kWearer = llGetOwner();
WEARERNAME = llGetDisplayName(g_kWearer);
if(WEARERNAME == "???" || WEARERNAME == "") { WEARERNAME = llKey2Name(g_kWearer); } //sanity check, fallback if necessary
}
on_rez(integer iParam) {
if(llGetOwner() != g_kWearer) llResetScript();
if(llGetOwner() != g_kWearer) { llResetScript(); }
}
listen(integer iChan, string sName, key kID, string sMsg) {
@@ -586,7 +589,7 @@ default {
}
}
lStatus = [];
DoMenuEnablements(g_kClicker, CMD_OWNER);
DoMenuEnablements(g_kClicker, COMMAND_OWNER);
} else if(iChan == g_iListenerChannel) {
Notify(g_kClicker, sMsg, FALSE);
}
@@ -604,25 +607,41 @@ default {
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
if(iNum >= CMD_OWNER && iNum <= CMD_WEARER) UserCommand(iNum, sStr, kID, FALSE);
else if(iNum == MENUNAME_REQUEST && sStr == g_sParentMenu) {
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
// llOwnerSay(sStr+" | "+(string)iNum+ "|"+(string)kID);
if(iNum == MENUNAME_REQUEST && sStr == COLLAR_PARENT_MENU) {
// our parent menu requested to receive buttons, so send ours
llMessageLinked(iSender, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
} else if(iNum == RLV_ON) g_iRlvOn = TRUE;
else if(iNum == RLV_OFF) g_iRlvOn = FALSE;
else if(iNum == RLVA_VERSION) g_iRlvaOn = TRUE;
else if(iNum == CMD_SAFEWORD) {
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
} else if(iNum == RLV_ON) {
g_iRlvOn = TRUE;
} else if(iNum == RLV_OFF) {
g_iRlvOn = FALSE;
} else if(iNum == RLVA_VERSION) {
g_iRlvaOn = TRUE;
} else if((iNum == LM_SETTING_RESPONSE || iNum == LM_SETTING_DELETE)
&& llSubStringIndex(sStr, "Global_WearerName") == 0) {
integer iInd = llSubStringIndex(sStr, "=");
string sValue = llGetSubString(sStr, iInd + 1, -1);
//We have a broadcasted change to WEARERNAME to work with
if(iNum == LM_SETTING_RESPONSE) { WEARERNAME = sValue; }
else {
g_kWearer = llGetOwner();
WEARERNAME = llGetDisplayName(g_kWearer);
if(WEARERNAME == "???" || WEARERNAME == "") { WEARERNAME == llKey2Name(g_kWearer); }
}
} else if(iNum == COMMAND_SAFEWORD) {
// Safeword has been received, release any restricitions that should be released
} else if(UserCommand(iNum, sStr, kID, FALSE)) {
// do nothing more if TRUE
} else if(iNum == DIALOG_RESPONSE) {
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
//integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
if(kID == g_kMenuID) {
if(sMessage == UPMENU) {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu " + g_sParentMenu, kAv);
llMessageLinked(LINK_THIS, iAuth, "menu " + COLLAR_PARENT_MENU, kAv);
} else if(sMessage == "CMD") {
g_kClicker = kAv;
g_kRlvCommand = Dialog(kAv, StringHistorySnippet(), [], [], 0, iAuth);
@@ -645,7 +664,7 @@ default {
} else if(llSubStringIndex(sMessage, "@") == 0) {
sMessage = llStringTrim(sMessage, STRING_TRIM);
g_lRlvCommandHistory += [sMessage];
Notify(kAv, "Sending RLV command " + sMessage + " to %WEARERNAME%'s %DEVICETYPE%", FALSE);
Notify(kAv, "Sending RLV command " + sMessage + " to " + WEARERNAME + "'s " + CTYPE, FALSE);
g_kClicker = kAv;
RlvCmd(sMessage);
g_kRlvCommand = Dialog(kAv, StringHistorySnippet(), [], [], 0, iAuth);
@@ -655,54 +674,47 @@ default {
}
} else if(kID == g_kMenuIDEnablements) {
if(sMessage == UPMENU) {
DoMenu(kAv, iAuth);
} else {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu " + COLLAR_PARENT_MENU, kAv);
} else if(llSubStringIndex(sMessage, UNTICKED) >= 0) {
string sStr = llGetSubString(sMessage, llStringLength(UNTICKED), llStringLength(sMessage));
g_kClicker = kAv;
string sStr;
if (llSubStringIndex(sMessage, UNTICKED) >= 0) {
sStr = llGetSubString(sMessage,llStringLength(UNTICKED),llStringLength(sMessage))+"=n" ;
} else if(llSubStringIndex(sMessage, TICKED) >= 0) {
sStr = llGetSubString(sMessage, llStringLength(TICKED), llStringLength(sMessage))+"=y";
}
RlvCmd("@" + sStr);
llSetTimerEvent(20);
g_iListenerHandle = llListen(g_iExceptionsChannel, "", llGetOwner(), "");
OutCommand("@getstatusall" + "=" + (string)g_iExceptionsChannel);
g_lListeners += [g_iListenerHandle];
RlvCmd("@" + sStr + "=n");
} else if(llSubStringIndex(sMessage, TICKED) >= 0) {
string sStr = llGetSubString(sMessage, llStringLength(TICKED), llStringLength(sMessage));
g_kClicker = kAv;
RlvCmd("@" + sStr + "=y");
}
DoMenu(kAv, iAuth);
} else if(kID == g_kRlvTextboxCommand) {
if((sMessage == UPMENU) || (llStringTrim(sMessage, STRING_TRIM) == "")) {
DoMenu(kAv, iAuth);
} else if(sMessage == "") DoMenu(kAv, iAuth);
else {
list lParams = llParseString2List(sMessage, [" "], []);
integer i = 0;
integer x = llGetListLength(g_lStoredCommand) - 1;
for(; x >= i; --x) {
if(llSubStringIndex(llList2String(g_lStoredCommand, x), (string)kAv) >= 0) {
list lPieces = llParseStringKeepNulls(llList2String(g_lStoredCommand, x), ["~"], []);
ProcessCommand( //ProcessCommand(key kID,string sCommand,integer iCommandType,string sParam1,string sParam2) {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu " + COLLAR_PARENT_MENU, kAv);
}
if(sMessage == "") { DoMenu(kAv, iAuth); return; }
list lParams = llParseString2List(sMessage, [" "], []);
integer i = 0;
integer x = llGetListLength(g_lStoredCommand) - 1;
for(; x >= i; --x) {
if(llSubStringIndex(llList2String(g_lStoredCommand, x), (string)kAv) >= 0) {
list lPieces = llParseStringKeepNulls(llList2String(g_lStoredCommand, x), ["~"], []);
ProcessCommand( //ProcessCommand(key kID,string sCommand,integer iCommandType,string sParam1,string sParam2) {
llList2Key(lPieces, 0),
llList2String(lPieces, 1),
llList2Integer(lPieces, 2),
llList2String(lParams, 0), //from our message box
llList2String(lParams, 1)
); //
}
); //
}
DoMenu(kAv, iAuth);
}
DoMenu(kAv, iAuth);
} else if(kID == g_kMenuIDOther) {
if((sMessage == UPMENU) || (llStringTrim(sMessage, STRING_TRIM) == "")) {
DoMenu(kAv, iAuth);
} else {
ProcessCommand(kAv, sMessage, FindCommandType(sMessage), "", "");
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu " + COLLAR_PARENT_MENU, kAv);
}
ProcessCommand(kAv, sMessage, FindCommandType(sMessage), "", "");
}
} else if (iNum == LINK_UPDATE) {
if (sStr == "LINK_DIALOG") LINK_DIALOG = iSender;
else if (sStr == "LINK_RLV") LINK_RLV = iSender;
else if (sStr == "LINK_SAVE") LINK_SAVE = iSender;
} else if (iNum == REBOOT && sStr == "reboot") llResetScript();
}
}
}

View File

@@ -1,27 +1,24 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - safezone //
// version 3.980 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2014 - 2015 Sumi Perl et. al
//
// This script is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
// by the Free Software Foundation, version 2.
//
// This script is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this script; if not, see www.gnu.org/licenses/gpl-2.0
//
// Debug(string sStr) { llOwnerSay("Debug ["+llGetScriptName()+"]: " + sStr); }
string SUBMENU_BUTTON = "SafeZone"; // Name of the submenu
string COLLAR_PARENT_MENU = "Apps"; // name of the menu, where the menu plugs in, should be usually Addons. Please do not use the mainmenu anymore
string g_sAppName = "safezone"; //used to change the name of the app itself (and setting prefixes)
key g_kMenuID = NULL_KEY; // menu handler
key g_kMenuRemoveID = NULL_KEY; // remove menu handler
key g_kWearer = NULL_KEY; // key of the current wearer to reset only on owner changes
key g_kMenuID; // menu handler
key g_kMenuRemoveID; // remove menu handler
key g_kWearer; // key of the current wearer to reset only on owner changes
string g_sScript = "SafeZone_"; // part of script name used for settings
integer g_iSafeZoneOn = FALSE;
@@ -70,6 +67,9 @@ integer DIALOG_TIMEOUT = -9002;
// menu option to go one step back in menustructure
string UPMENU = "BACK"; // when your menu hears this, give the parent menu
//Debug(string sMsg) { llOwnerSay(llGetScriptName() + " [DEBUG]: " + sMsg);}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer){
if (kID == g_kWearer) llOwnerSay(sMsg);
else {

View File

@@ -0,0 +1,342 @@
//OpenCollar - shocker
//Licensed under the GPLv2, with the additional requirement that these scripts remain "full perms" in Second Life. See "OpenCollar License" for details.
string g_sSubMenu = "Shocker";
string g_sParentMenu = "Apps";
//MESSAGE MAP
integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_SAFEWORD = 510; // new for safeword
//integer POPUP_HELP = 1001;
integer LM_SETTING_SAVE = 2000;//scripts send messages on this channel to have settings saved to httpdb
//str must be in form of "token=value"
//integer LM_SETTING_REQUEST = 2001;//when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002;//the httpdb script will send responses on this channel
integer LM_SETTING_DELETE = 2003;//delete token from DB
//integer LM_SETTING_EMPTY = 2004;//sent by httpdb script when a token has no value in the db
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
//integer RLV_CMD = 6000;
integer ANIM_START = 7000;
integer ANIM_STOP = 7001;
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
// menu buttons
string UPMENU = "BACK";
string HELP = "Quick Help";
string DEFAULT = "Default" ;
list g_lButtons = ["1 sec.","3 sec.","5 sec.","10 sec.","15 sec.","30 sec.","1 min.","Stop"];
list g_lTime = [1,3,5,10,15,30,60,0];
string g_sSetAnim = "Set Anim";
string g_sSetSound = "Set Sound";
string g_sDefaultAnim = "~shock";
//string g_sDefaultSound = "011ef7f4-40e8-28fe-4ea5-f2fda0883707";
string g_sDefaultSound = "4546cdc8-8682-6763-7d52-2c1e67e8257d";
string g_sNoSound = "silent" ;
string g_sShockAnim ;
string g_sShockSound;
string CTYPE = "collar";
string WEARERNAME;
string g_sScript = "shocker_";
key g_kWearer;
key g_kDialog;
key g_kAnimDialog;
key g_kSoundDialog;
integer g_iShock = FALSE ;
/*
integer g_iProfiled;
Debug(string sStr) {
//if you delete the first // from the preceeding and following lines,
// profiling is off, debug is off, and the compiler will remind you to
// remove the debug calls from the code, we're back to production mode
if (!g_iProfiled){
g_iProfiled=1;
llScriptProfiler(1);
}
llOwnerSay(llGetScriptName() + "(min free:"+(string)(llGetMemoryLimit()-llGetSPMaxMemory())+")["+(string)llGetFreeMemory()+"] :\n" + sStr);
}
*/
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_THIS, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
return kID;
}
DialogShocker(key kID, integer iAuth)
{
string sText = "Shocker!\n Your pet is naughty? Just punish him/her.\n";
sText += "- Chose time to start punishment.\n" ;
sText += "- 'Quick Help' will give you a brief help how to use shocker.\n";
g_kDialog = Dialog(kID, sText, g_lButtons, [HELP,g_sSetAnim, g_sSetSound,UPMENU],0,iAuth);
}
DialogSelectAnim(key kID, integer iAuth)
{
list lAnimList = [DEFAULT];
integer iMax = llGetInventoryNumber(INVENTORY_ANIMATION);
integer i;
string sName;
for (i=0;i<iMax;i++)
{
sName=llGetInventoryName(INVENTORY_ANIMATION, i);
//check here if the anim start with ~ or for some reason does not get a name returned (spares to check that all again in the menu ;)
if (sName != "" && llGetSubString(sName, 0, 0) != "~") lAnimList += [sName];
}
string sText = "Current punishment animation is: "+g_sShockAnim+"\n\n";
sText += "Select a new animation to use as a punishment.\n\n";
g_kAnimDialog = Dialog(kID, sText, lAnimList, [UPMENU],0, iAuth);
}
DialogSelectSound(key kID, integer iAuth)
{
list lSoundList = [DEFAULT];
integer iMax = llGetInventoryNumber(INVENTORY_SOUND);
integer i;
string sName;
for (i=0;i<iMax;i++)
{
sName=llGetInventoryName(INVENTORY_SOUND, i);
//check here if the anim start with ~ or for some reason does not get a name returned (spares to check that all again in the menu ;)
if (sName != "" && llGetSubString(sName, 0, 0) != "~") lSoundList += [sName];
}
lSoundList+=[g_sNoSound];
string sText = "Current sound is: "+g_sShockSound+"\n\n";
sText += "Select a new sound to use.\n\n";
g_kSoundDialog = Dialog(kID, sText, lSoundList, [UPMENU],0, iAuth);
}
DialogHelp(key kID, integer iAuth)
{
string sMessage = "Usage of Shocker.\n";
sMessage += "Put in front of each command your subs prefix then use them as followed:\n";
sMessage += "shock <seconds> where <seconds> is time in seconds to punish you pet.\n";
sMessage += "shock 0/stop/off , is stop to punish you pet immediately.\n";
sMessage += "shockanim <anim name> , make sure the animation is inside the collar.\n";
sMessage += "shocksound <sound name> , make sure the sound is inside the collar.";
g_kDialog = Dialog(kID, sMessage, ["Ok"], [], 0, iAuth);
Notify(kID, sMessage, FALSE) ;
}
string right(string sSrc, string sDivider)
{
integer iIndex = llSubStringIndex( sSrc, sDivider );
if(~iIndex) return llDeleteSubString( sSrc, 0, iIndex + llStringLength(sDivider) - 1);
return sSrc;
}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer)
{
if (kID == g_kWearer) llOwnerSay(sMsg);
else
{
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
Shock(integer time, key kID)
{
if (time > 0)
{
Notify(kID, WEARERNAME+" now shocked for "+(string)time+" seconds.", TRUE);
if (g_sShockSound != g_sNoSound)
{
if (g_sShockSound == DEFAULT) llLoopSound( g_sDefaultSound, 1.0 );
else llLoopSound( g_sShockSound, 1.0 );
}
g_iShock = TRUE ;
llMessageLinked(LINK_THIS, ANIM_START, g_sShockAnim, "");
llResetTime();
llSetTimerEvent(time);
}
else if (g_iShock == TRUE)
{
Notify(kID, "shocker off.", TRUE);
llSetTimerEvent(0);
Stop();
}
}
Stop()
{
if (g_iShock)
{
if (g_sShockSound != g_sNoSound) llStopSound( );
llMessageLinked(LINK_THIS, ANIM_STOP, g_sShockAnim, "");
g_iShock = FALSE ;
}
}
integer UserCommand(integer iAuth, string sStr, key kID) // here iNum: auth value, sStr: user command, kID: avatar id
{
if (iAuth > COMMAND_WEARER || iAuth < COMMAND_OWNER) return FALSE; // sanity check
if (sStr == "menu "+g_sSubMenu || sStr == "shocker")
{
if (iAuth == COMMAND_OWNER) DialogShocker(kID, iAuth);
else Notify(kID, "Sorry, only the Owner can punish pet.",FALSE);
return TRUE;
}
else if (iAuth == COMMAND_OWNER)
{
list lParams = llParseString2List(sStr, [" "], []);
string sCommand = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sStr == "shocker help") DialogHelp(kID, iAuth);
else if (sCommand == "shock")
{
if (sValue == "off" || sValue == "stop") Shock(0,kID);
else Shock((integer)sValue,kID);
}
else if (sCommand == "shockanim")
{
//Get all text after the command, strip spaces from start and end
string sAnim = right(sStr, sCommand);
sAnim = llStringTrim(sAnim, STRING_TRIM);
if (sAnim == DEFAULT) sAnim = g_sDefaultAnim;
if (llGetInventoryType(sAnim) == INVENTORY_ANIMATION)
{
Stop();
g_sShockAnim = sAnim;
llMessageLinked(LINK_THIS, LM_SETTING_SAVE, g_sScript + "anim=" + g_sShockAnim, "");
Notify(kID, "Punishment anim for shocker is now '" + g_sShockAnim + "'.",FALSE);
}
else Notify(kID, sAnim + " is not a valid animation name.",FALSE);
}
else if (sCommand == "shocksound")
{
//Get all text after the command, strip spaces from start and end
string sSound = right(sStr, sCommand);
sSound = llStringTrim(sSound, STRING_TRIM);
if (sSound == g_sNoSound) Notify(kID, "Punishment will be silently.",FALSE);
else if (llGetInventoryType(sSound) != INVENTORY_SOUND)
{
Notify(kID, sSound + " is not a valid sound name.",FALSE);
sSound = DEFAULT ;
}
g_sShockSound = sSound;
llMessageLinked(LINK_THIS,LM_SETTING_SAVE,g_sScript+"sound="+g_sShockSound, "");
Notify(kID, "Punishment sound for shocker is now '"+g_sShockSound+"'.",FALSE);
}
}
return TRUE;
}
string GetName(key uuid)
{
string name = llGetDisplayName(uuid);
if (name == "???" || name == "") name = llKey2Name(uuid);
return name;
}
default
{
on_rez(integer iParam)
{
llResetScript();
}
state_entry()
{
g_kWearer = llGetOwner();
WEARERNAME = GetName(g_kWearer);
g_sScript = "shocker_";
g_sShockAnim = g_sDefaultAnim;
g_sShockSound = DEFAULT ;
}
link_message(integer iSender, integer iNum, string sStr, key kID)
{
if (UserCommand(iNum, sStr, kID)) return;
else if (iNum == LM_SETTING_DELETE && sStr == "Global_WearerName")
{
WEARERNAME = GetName(g_kWearer);
}
else if (iNum == LM_SETTING_RESPONSE)
{
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
if (sToken == g_sScript+"anim") g_sShockAnim = sValue;
else if (sToken == g_sScript+"sound") g_sShockSound = sValue;
else if (sToken == "Global_CType") CTYPE = sValue;
else if (sToken == "Global_WearerName") WEARERNAME = sValue;
}
else if (iNum == COMMAND_SAFEWORD) Shock(0,kID);
else if (iNum == MENUNAME_REQUEST && sStr == g_sParentMenu)
{
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, g_sParentMenu + "|" + g_sSubMenu, "");
}
else if (iNum == DIALOG_RESPONSE && (kID==g_kDialog || kID==g_kAnimDialog || kID==g_kSoundDialog))
{
list lMenuParams = llParseString2List(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0);
string sMessage = llList2String(lMenuParams, 1);
integer iPage = (integer)llList2String(lMenuParams, 2);
integer iAuth = (integer)llList2String(lMenuParams, 3);
if (kID == g_kDialog)
{
if (sMessage == "Ok") DialogShocker(kAv,iAuth);
else if (sMessage == g_sSetAnim) DialogSelectAnim(kAv,iAuth);
else if (sMessage == g_sSetSound) DialogSelectSound(kAv,iAuth);
else if (sMessage == UPMENU) llMessageLinked(LINK_THIS, iAuth, "menu "+g_sParentMenu, kAv);
else if (sMessage == HELP) DialogHelp(kAv,iAuth);
else
{
integer index = llListFindList(g_lButtons, [sMessage]);
if (index != -1)
{
integer shocktime = llList2Integer(g_lTime,index);
Shock(shocktime,kAv);
DialogShocker(kAv,iAuth);
}
}
}
else if (kID == g_kAnimDialog)
{
if (sMessage != "") UserCommand(iAuth,"shockanim " + sMessage,kAv);
DialogShocker(kAv,iAuth);
}
else if (kID == g_kSoundDialog)
{
if (sMessage != "") UserCommand(iAuth,"shocksound " + sMessage,kAv);
DialogShocker(kAv,iAuth);
}
}
}
timer()
{
llSetTimerEvent(0);
Stop();
}
}

View File

@@ -0,0 +1,423 @@
////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------ //
// OpenCollar - takeme //
// version 3.980 //
// ------------------------------------------------------------------------------ //
// Licensed under the GPLv2 with additional requirements specific to Second Life® //
// and other virtual metaverse environments. -> www.opencollar.at/license.html //
// ------------------------------------------------------------------------------ //
// © 2008 - 2014 Individual Contributors and OpenCollar - submission set free™ //
// ------------------------------------------------------------------------------ //
// github.com/OpenCollar/OpenCollarUpdater //
// ------------------------------------------------------------------------------ //
////////////////////////////////////////////////////////////////////////////////////
string SUBMENU_BUTTON = "TakeMe"; // Name of the submenu
string COLLAR_PARENT_MENU = "Apps"; // name of the menu, where the menu plugs in, should be usually Addons. Please do not use the mainmenu anymore
key g_kMenuID; // menu handler
key g_kWearer; // key of the current wearer to reset only on owner changes
key g_kClicker; //capture clicker IDs
string g_sScript ="TakeMe_"; // part of script name used for settings
string CTYPE = "collar"; // designer can set in notecard to appropriate word for their item
list g_lTempOwners;
integer g_iLimitDistance = 3; //meters away from the wearer before they can be captured
integer g_iTakeMeForce = FALSE;
integer g_iCaptureOn=FALSE;
list g_lRequests; //list of requests coming in
list g_lRequests_Names; //And their names
string WEARERNAME;
string TICKED = "☒ ";
string UNTICKED = "☐ ";
// OpenCollar MESSAGE MAP
// messages for authenticating users
// integer COMMAND_NOAUTH = 0; // for reference, but should usually not be in use inside plugins
//integer COMMAND_NOAUTH = 0;
integer COMMAND_OWNER = 500;
integer COMMAND_SECOWNER = 501;
integer COMMAND_GROUP = 502;
integer COMMAND_WEARER = 503;
integer COMMAND_EVERYONE = 504;
integer COMMAND_RLV_RELAY = 507;
integer COMMAND_SAFEWORD = 510;
integer COMMAND_RELAY_SAFEWORD = 511;
integer COMMAND_BLACKLIST = 520;
// added for timer so when the sub is locked out they can use postions
integer COMMAND_WEARERLOCKEDOUT = 521;
integer ATTACHMENT_REQUEST = 600;
integer ATTACHMENT_RESPONSE = 601;
integer ATTACHMENT_FORWARD = 610;
integer WEARERLOCKOUT = 620; // turns on and off wearer lockout
// integer SEND_IM = 1000; deprecated. each script should send its own IMs now.
// This is to reduce even the tiny bit of lag caused by having IM slave scripts
integer POPUP_HELP = 1001;
// messages for storing and retrieving values from settings store
integer LM_SETTING_SAVE = 2000; // scripts send messages on this channel to have settings saved to settings store
// str must be in form of "token=value"
integer LM_SETTING_REQUEST = 2001; // when startup, scripts send requests for settings on this channel
integer LM_SETTING_RESPONSE = 2002; // the settings script will send responses on this channel
integer LM_SETTING_DELETE = 2003; // delete token from settings store
integer LM_SETTING_EMPTY = 2004; // sent by settings script when a token has no value in the settings store
integer LM_SETTING_REQUEST_NOCACHE = 2005;
// messages for creating OC menu structure
integer MENUNAME_REQUEST = 3000;
integer MENUNAME_RESPONSE = 3001;
integer MENUNAME_REMOVE = 3003;
// messages for RLV commands
integer RLV_CMD = 6000;
integer RLV_REFRESH = 6001; // RLV plugins should reinstate their restrictions upon receiving this message.
integer RLV_CLEAR = 6002; // RLV plugins should clear their restriction lists upon receiving this message.
integer RLV_VERSION = 6003; // RLV Plugins can recieve the used rl viewer version upon receiving this message..
integer RLV_OFF = 6100; // send to inform plugins that RLV is disabled now, no message or key needed
integer RLV_ON = 6101; // send to inform plugins that RLV is enabled now, no message or key needed
integer RLV_QUERY = 6102; //query from a script asking if RLV is currently functioning
integer RLV_RESPONSE = 6103; //reply to RLV_QUERY, with "ON" or "OFF" as the message
// messages for poses and couple anims
integer ANIM_START = 7000; // send this with the name of an anim in the string part of the message to play the anim
integer ANIM_STOP = 7001; // send this with the name of an anim in the string part of the message to stop the anim
integer CPLANIM_PERMREQUEST = 7002; // id should be av's key, str should be cmd name "hug", "kiss", etc
integer CPLANIM_PERMRESPONSE = 7003; // str should be "1" for got perms or "0" for not. id should be av's key
integer CPLANIM_START = 7004; // str should be valid anim name. id should be av
integer CPLANIM_STOP = 7005; // str should be valid anim name. id should be av
// messages to the dialog helper
integer DIALOG = -9000;
integer DIALOG_RESPONSE = -9001;
integer DIALOG_TIMEOUT = -9002;
integer FIND_AGENT = -9005; // to look for agent(s) in region with a (optional) search string
key REQUEST_KEY;
integer TIMER_EVENT = -10000; // str = "start" or "end". For start, either "online" or "realtime".
integer UPDATE = 10001; // for child prim scripts (currently none in 3.8, thanks to LSL new functions)
// For other things that want to manage showing/hiding keys.
integer KEY_VISIBLE = -10100;
integer KEY_INVISIBLE = -10100;
integer COMMAND_PARTICLE = 20000;
integer COMMAND_LEASH_SENSOR = 20001;
//chain systems
integer LOCKMEISTER = -8888;
integer LOCKGUARD = -9119;
//rlv relay chan
integer RLV_RELAY_CHANNEL = -1812221819;
// menu option to go one step back in menustructure
string UPMENU = "BACK"; // when your menu hears this, give the parent menu
//Debug(string sMsg) { llOwnerSay(llGetScriptName() + " [DEBUG]: " + sMsg);}
Notify(key kID, string sMsg, integer iAlsoNotifyWearer){
if (kID == g_kWearer) llOwnerSay(sMsg);
else {
if (llGetAgentSize(kID)) llRegionSayTo(kID,0,sMsg);
else llInstantMessage(kID, sMsg);
if (iAlsoNotifyWearer) llOwnerSay(sMsg);
}
}
key Dialog(key kRCPT, string sPrompt, list lChoices, list lUtilityButtons, integer iPage, integer iAuth)
{
key kID = llGenerateKey();
llMessageLinked(LINK_SET, DIALOG, (string)kRCPT + "|" + sPrompt + "|" + (string)iPage + "|"
+ llDumpList2String(lChoices, "`") + "|" + llDumpList2String(lUtilityButtons, "`") + "|" + (string)iAuth, kID);
return kID;
}
DoMenu(key keyID, integer iAuth) {
string sPrompt = "\n"+SUBMENU_BUTTON;
list lMyButtons;
if (g_iCaptureOn){
sPrompt += "ON";
lMyButtons += "OFF";
} else {
lMyButtons += "ON";
sPrompt += "OFF";
}
if (g_iLimitDistance) {
lMyButtons += TICKED+"LimitDistance";
} else {
lMyButtons += UNTICKED+"LimitDistance";
}
if (g_iTakeMeForce) {
lMyButtons += TICKED+"ForceTake";
} else {
lMyButtons += UNTICKED+"ForceTake";
}
if (llGetListLength(g_lRequests) > 0) {
sPrompt += "\nThere are "+ (string)llGetListLength(g_lRequests) +" requests for capture...\n\n";
}
if (llGetListLength(g_lTempOwners) > 0) {
sPrompt += "\nCurrent Temp Owners: ";
integer i;
integer x = llGetListLength(g_lTempOwners);
for (i=1;i<=x;++i){
sPrompt+=llList2String(g_lTempOwners,i) + ", ";
++i;
}
lMyButtons += ["Reset"];
}
//fill in your button list and additional prompt here
if (llGetListLength(g_lRequests) > 0) {
sPrompt += "\n"+llList2String(g_lRequests_Names,0) +" wants to capture you...";
lMyButtons += ["Allow","Reject"];
}
// and dispay the menu
g_kMenuID = Dialog(keyID, sPrompt, lMyButtons, [UPMENU], 0, iAuth);
}
DoMenuAlt(key keyID, integer iAuth) { //This is for force (outsider) capture dialogs
string sPrompt = "\n"+SUBMENU_BUTTON;
sPrompt += "\nDo you want to capture "+WEARERNAME+"?";
list lMyButtons;
lMyButtons += ["Yes","No"];
// and dispay the menu
g_kMenuID = Dialog(keyID, sPrompt, lMyButtons, [], 0, iAuth);
}
integer UserCommand(integer iNum, string sStr, key kID, integer remenu) {
sStr=llToLower(sStr);
if (!(iNum >= COMMAND_OWNER && iNum <= COMMAND_WEARER)) {
return FALSE;
} else if (sStr == "takeme" || sStr == "menu takeme") {
// an authorized user requested the plugin menu by typing the menus chat command
DoMenu(kID, iNum);
} else if (sStr == "takeme reset" ) {
Notify(kID,"Temp owners list has been purged.",TRUE);
g_lTempOwners=[];
llMessageLinked(LINK_SET, LM_SETTING_DELETE, "auth_tempowner", "");
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "auth_tempowner", "");
} else if (sStr == "takeme on") {
Notify(kID,"takeme game is ON!",TRUE);
g_iCaptureOn=TRUE;
llMessageLinked(LINK_SET, LM_SETTING_SAVE,g_sScript+ "takeme=1", "");
} else if (sStr == "takeme off") {
Notify(kID,"takeme game is OFF!",TRUE);
g_iCaptureOn=FALSE;
llMessageLinked(LINK_SET, LM_SETTING_DELETE,g_sScript+ "takeme", "");
} else if (sStr == "takeme limitdistance off") {
llMessageLinked(LINK_SET, LM_SETTING_DELETE,g_sScript+ "limitdistance", "");
g_iLimitDistance = FALSE;
Notify(kID,"TakeMe limit distance disabled!",TRUE);
} else if (sStr == "takeme limitdistance on") {
llMessageLinked(LINK_SET, LM_SETTING_SAVE,g_sScript+ "limitdistance=3", "");
g_iLimitDistance = 3;
Notify(kID,"TakeMe limit distance now set to 3 meters!",TRUE);
} else if (llSubStringIndex(sStr,"takeme limitdistance ") >= 0) {
integer iTest = llList2Integer(llParseString2List(sStr,[" "],[]),2);
if (iTest > 0) { //lets make sure we have a real number here (zero is not valid)
Notify(kID,"TakeMe limit distance now set to "+(string)iTest+" meters!",TRUE);
llMessageLinked(LINK_SET, LM_SETTING_SAVE,g_sScript+ "limitdistance="+(string)iTest, "");
g_iLimitDistance = iTest;
}
else {
Notify(kID,"<prefix>takeme limitdistance <distance in meters>",TRUE);
}
} else if (sStr == "takeme force on") {
llMessageLinked(LINK_SET, LM_SETTING_SAVE,g_sScript+ "force=1", "");
g_iTakeMeForce = TRUE;
Notify(kID,"TakeMe will allow you to be forcefully captured!",TRUE);
} else if (sStr == "takeme force off") {
llMessageLinked(LINK_SET, LM_SETTING_DELETE,g_sScript+ "force", "");
g_iTakeMeForce = FALSE;
Notify(kID,"TakeMe will prompt you for all capture requests!",TRUE);
}
if (remenu) {
DoMenu(kID, iNum);
}
return TRUE;
}
default {
state_entry()
{
g_sScript = llStringTrim(llList2String(llParseString2List(llGetScriptName(), ["-"], []), 1), STRING_TRIM) + "_";
g_kWearer = llGetOwner();
WEARERNAME = llGetDisplayName(g_kWearer);
if (WEARERNAME == "???" || WEARERNAME == "") WEARERNAME = llKey2Name(g_kWearer); //sanity check, fallback if necessary
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "auth", "tempowner");
}
on_rez(integer iParam) {
if (llGetOwner()!=g_kWearer) llResetScript();
}
touch_start(integer num_detected)
{
key kToucher = llDetectedKey(0);
if (kToucher == llGetOwner()) {return;}
if (g_iLimitDistance) {
float fDistance=llVecDist(llDetectedPos(0),llGetPos());
if (fDistance > (float)g_iLimitDistance) {
Notify(kToucher,"You are not close enough to "+WEARERNAME+" to take control of their "+CTYPE,FALSE);
return;
}
}
llMessageLinked(LINK_SET,0,"TempOwner~"+llDetectedName(0)+"~"+(string)kToucher,kToucher);
}
link_message(integer iSender, integer iNum, string sStr, key kID) {
// llOwnerSay(sStr+" | "+(string)iNum+ "|"+(string)kID);
if (iNum == MENUNAME_REQUEST && sStr == COLLAR_PARENT_MENU) {
// our parent menu requested to receive buttons, so send ours
llMessageLinked(LINK_THIS, MENUNAME_RESPONSE, COLLAR_PARENT_MENU + "|" + SUBMENU_BUTTON, "");
}
else if ((iNum == LM_SETTING_RESPONSE || iNum == LM_SETTING_DELETE)
&& llSubStringIndex(sStr, "Global_WearerName") == 0 ) {
integer iInd = llSubStringIndex(sStr, "=");
string sValue = llGetSubString(sStr, iInd + 1, -1);
//We have a broadcasted change to WEARERNAME to work with
if (iNum == LM_SETTING_RESPONSE) WEARERNAME = sValue;
else {
g_kWearer = llGetOwner();
WEARERNAME = llGetDisplayName(g_kWearer);
if (WEARERNAME == "???" || WEARERNAME == "") WEARERNAME == llKey2Name(g_kWearer);
}
}
else if (iNum == LM_SETTING_RESPONSE) {
// response from setting store have been received, parse the answer
list lParams = llParseString2List(sStr, ["="], []);
string sToken = llList2String(lParams, 0);
string sValue = llList2String(lParams, 1);
// and check if any values for use are received
if (sToken == g_sScript+"takeme") {
if (sValue == (string)1) { g_iCaptureOn = TRUE; }
}
else if (sToken == g_sScript+"limitdistance") {
g_iLimitDistance = (integer)sValue;
}
else if (sToken == g_sScript+"force") {
g_iTakeMeForce = (integer)sValue;
}
else if (sToken == "auth_tempowner") {
g_lTempOwners = llParseString2List(sValue, [","], []); //store tempowners list
}
else if (sToken == "Global_CType") CTYPE = sValue;
}
else if (iNum == COMMAND_SAFEWORD) {
// Safeword has been received, release any restricitions that should be released
UserCommand(COMMAND_OWNER,"takeme reset",g_kWearer,FALSE);
UserCommand(COMMAND_OWNER,"takeme off",g_kWearer,FALSE);
}
else if (UserCommand(iNum, sStr, kID, FALSE)) {
// do nothing more if TRUE
}
else if (iNum == COMMAND_EVERYONE && g_iCaptureOn) {
if (llSubStringIndex(sStr,"TempOwner") == 0) {
list lSplit = llParseString2List(sStr, ["~"], []);
string sName = llList2String(lSplit,1);
key kKey = llList2Key(lSplit,2);
// llOwnerSay(sName + " " +(string)kKey);
if (llListFindList(g_lRequests,llList2List(lSplit,2,2)) >=0) {
//do nothing
} else {
g_lRequests += llList2List(lSplit,2,2);
g_lRequests_Names += llList2List(lSplit,1,1);
if (g_iTakeMeForce) {
DoMenuAlt(kID,COMMAND_EVERYONE);
}
else {
DoMenu(g_kWearer,COMMAND_WEARER);
}
}
}
}
else if (iNum == DIALOG_RESPONSE) {
if (kID == g_kMenuID) {
//got a menu response meant for us, extract the values
list lMenuParams = llParseStringKeepNulls(sStr, ["|"], []);
key kAv = (key)llList2String(lMenuParams, 0); // avatar using the menu
string sMessage = llList2String(lMenuParams, 1); // button label
integer iPage = (integer)llList2String(lMenuParams, 2); // menu page
integer iAuth = (integer)llList2String(lMenuParams, 3); // auth level of avatar
// request to switch to parent menu
if (sMessage == UPMENU) {
//give av the parent menu
llMessageLinked(LINK_THIS, iAuth, "menu "+COLLAR_PARENT_MENU, kAv);
}
else if (sMessage == "Allow" || sMessage == "Yes") {
if (g_iCaptureOn) {
if (g_iTakeMeForce) { //this is coming from a captor, so lets find them in our queue
integer iRequestIndex = llListFindList(g_lRequests,[(string)kAv]);
if (iRequestIndex < 0) return; //we failed somehow...
Notify(llList2Key(g_lRequests,iRequestIndex),llList2String(g_lRequests_Names,iRequestIndex)+" has captured "+WEARERNAME,TRUE);
g_lTempOwners+=[llList2Key(g_lRequests,iRequestIndex),llList2String(g_lRequests_Names,iRequestIndex)];
g_lRequests = llDeleteSubList(g_lRequests,iRequestIndex,iRequestIndex); //remove this from queue
g_lRequests_Names = llDeleteSubList(g_lRequests_Names,iRequestIndex,iRequestIndex); //remove from queue
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "auth_tempowner="+llDumpList2String(g_lTempOwners,","), "");
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "auth_tempowner", "");
} else {
Notify(llList2Key(g_lRequests,0),llList2String(g_lRequests_Names,0)+" has captured "+WEARERNAME,TRUE);
g_lTempOwners+=[llList2Key(g_lRequests,0),llList2String(g_lRequests_Names,0)];
g_lRequests = llDeleteSubList(g_lRequests,0,0); //remove this from queue
g_lRequests_Names = llDeleteSubList(g_lRequests_Names,0,0); //remove from queue
llMessageLinked(LINK_SET, LM_SETTING_SAVE, "auth_tempowner="+llDumpList2String(g_lTempOwners,","), "");
llMessageLinked(LINK_SET, LM_SETTING_REQUEST, "auth_tempowner", "");
DoMenu(g_kWearer,iAuth);
}
}
}
else if (sMessage == "Reject" || sMessage == "No") {
if (g_iCaptureOn) {
if (g_iTakeMeForce) {
Notify(kAv,"You have decided to neglect the poor soul of "+WEARERNAME+". Shame on you...",FALSE);
integer iRequestIndex = llListFindList(g_lRequests,[(string)kAv]);
g_lRequests = llDeleteSubList(g_lRequests,iRequestIndex,iRequestIndex); //remove this from queue
g_lRequests_Names = llDeleteSubList(g_lRequests_Names,iRequestIndex,iRequestIndex); //remove from queue
return;
}
Notify(kAv,"You have rejected temporary ownership by "+llList2String(g_lRequests_Names,0),FALSE);
g_lRequests = llDeleteSubList(g_lRequests,0,0); //remove this from queue
g_lRequests_Names = llDeleteSubList(g_lRequests_Names,0,0); //remove from queue
DoMenu(g_kWearer,iAuth);
}
}
else if (sMessage == "OFF") {
UserCommand(iAuth,"takeme reset",kAv,FALSE);
UserCommand(iAuth,"takeme off",kAv,TRUE);
}
else if (sMessage == "ON") {
UserCommand(iAuth,"takeme on",kAv,TRUE);
}
else if (sMessage == "Reset") {
UserCommand(iAuth,"takeme reset",kAv,TRUE);
}
else if (sMessage == TICKED+"LimitDistance") {
UserCommand(iAuth,"takeme limitdistance off",kAv,TRUE);
}
else if (sMessage == UNTICKED+"LimitDistance") {
UserCommand(iAuth,"takeme limitdistance on",kAv,TRUE);
}
else if (sMessage == TICKED+"ForceTake") {
UserCommand(iAuth,"takeme force off",kAv,TRUE);
}
else if (sMessage == UNTICKED+"ForceTake") {
UserCommand(iAuth,"takeme force on",kAv,TRUE);
}
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

View File

@@ -1,88 +0,0 @@
Collar first steps:
------------------
To tke advantage of all the functions of your new collar, make sure your RLV is turned on on your viewer.
For example in Firestorm go to the menu Advanced and select the option RestrainedLove API, then restart the viewer.
(If you don't see the menu Advanced, go to preferences (Ctrl P) tab Advanced and check "Show Advanced Menu").
The Beginning:
1. Adjusting the collar to your avatar:
---------------------------------------
Wear the collar, right click on it and adjust the position and size to match your avatar, when you're satisfied, take it off and put it on again.
2. Adding an owner/trusted/blocked people:
------------------------------------------
Now you can add an owner, trusted person or even block people from using your collar, to do so you need to invoke the menu.
To do so type the first two letters of your name followed by "menu", for example if your name is Jane Doe type "jamenu" or "ja menu", alternatively simply click on the collar.
Click on the option Access and to add an owner just click on the button "+ Owner". Make sure the person you select as owner is near you in the same sim.
The name of the owner candidate will appear listed on the menu, just click on the name to register him/her as owner and allow access and control of your collar.
Same procedure with trusted people and to manage the block list.
If you wish to own your own collar instead just pick your name from the list.
3. Setting up the poses:
------------------------
The collar comes with a series of poses, you may need to adjust them for the height of your avatar.
Call the menu and select Animations, then Pose, for the following steps remove your shoes and layer shoes, and turn off your AO.
Press on BeautyStand, your avatar will assume the position, check your feet, if you're sunk in the ground or floating above it you will need to adjust it, to do so simply press the up or down arrow untiliN your feet are just on the ground.
Click on the next animation and repeat the process, at the end of the list you will also find animations that start with a curly symbol "~" those are for different plugins and functions of your collar, you can adjust the height of those animations in the same way.
Once you cycled on the whole list you're done! Now it's time to save the settings.
Call the menu again go to Settings and Save.
(to save your settings make sure you're in a sim that allows to use such ossl function, if you get an error just press Settings and Print t get your settings list ready to be copied to a notecard.
4. Setting up the Label:
------------------------
If you're already owned this must be performed by your owner, if you're not owned then you can do it yourself.
The label is a text that will appear on the side of the collar, depending on the model it can be bigger text or smaller and it's appearance may change.
Invoke the menu, press Apps and then Label, then press Set Label and input the text you want, depending on the collar model you have a limit of 8 to ~16 characters available. After you're done press Submit.
To make the new text visible press on "Show", you can also change the font, colours and set the text to scroll from this menu.
5. Setting up the Titler:
-------------------------
The titler is another app, this one can be setup by the collar wearer. The titler is an hovertext that will appear on top of the head of the collar wearer.
Invoke the menu and press Apps and then Titler.
Press Set Title to input your text, then press Submit. To make it appear press "Show", you may need to adjust the height of the text, you can do so by pressing the arrows up and down on the menu, by default the title may be too close inside the head of the collar wearer and so you need to move it up by pressing the up button several times.
You can also change the colour of the text from this menu.
6. Setting up the leash:
------------------------
The leash by default is the rope (ribbon type of particles), by invoking the menu and then option Leash -> Configure you can switch the particle type by select "Chain" instead, you can also change the colour and characteristics of the leash from this menu.
Your owner or trustees can click on the Leash menu too and press on the Give Holder button to get a leash holder they can wear. The chain/rope then will attach to the holder for a pleasing visuals.
_________________________________________________________________________________________
That's it! If you read so far congratulations you will have a highly personalized collar that will cover your needs
For more information about all the available commands, invoke your menu and then select Help/About and press the button Help. You'll receive a notecard with all the commands the collar has and the descriptions for all the functions.

View File

@@ -1,502 +0,0 @@
=========================
OsCollar Help Card
=========================
This is only a short version of the manual, explaining the basic usage and lists all chat commands.
==============================
A word about OpenSim and script state loss
==============================
Due to OpenSim bug #8366 (http://opensimulator.org/mantis/view.php?id=8366)
scripts (so also this collar) can lose state in two ways:
1 Teleport from a YEngine region to a XEngine region
2 Teleport to a hypergrid region
** BE SURE TO SAVE YOUR SETTINGS CARD AFTER ANY CHANGE OF SETTINGS!!! **
That way the collar can recover after a script reset.
To save settings (easy):
-> Open the collar menu, Click Settings, Click Save.
If saving is not supported in this region (advanced):
-> Open the collar menu, click Unlock (if locked), click Settings, click Print
-> Select and copy the settings below the cutline from local chat
-> Edit the collar, and select the Settings link/prim
(cycle between links with with Ctrl-. and Ctrl-, )
-> Open the ".settings" notecard within and replace what's on the notecard
(Ctrl-A followed by Ctrl-V)
-> Save the notecard
==========
The Very Basics
==========
Making use of the many, many features in your collar can be done by touching your neck, by touching your collar directly, by using a remote or with individual chat commands.
-------------
The Prefix:
-------------
Your [prefix] are the first two letters of your username, not of your displayname
John Doe's prefix is: jo
Loki (silvia.blep)'s prefix is: si
Your prefix is used to issue commands in the Nearby Chat.
[prefix] menu
[prefix] kneel
[prefix] stop
If you dont like your prefix, you can change it. Only the owner can change the prefix, and the wearer if there is no owner set.
ws prefix wen
wr prefix we
js prefix sex
There are two special prefixes. * issues commands to everyone nearby and # issues commands to everyone except yourself.
*trauma
#grab
------------
Channels:
------------
You can also issue commands on channel 1.
/1 [prefix] menu
Or if you dont like channel 1 set a different channel.
[prefix] channel 2
[prefix] channel 3
[prefix] channel 69
[prefix] channel 9001
If you are considerate about lag, you can also turn off the Nearby Chat listener.
[prefix] channel -1
Too much hassle to always type a slash after all?
/1 [prefix] channel 0
------------
Safeword:
------------
Your collar also has a safeword which you simply type in the nearby chat. This will lift all RLV restrictions, unpose and unleash you. It will also send your Owner a message to check for your well being. RED in capital letters is the default safeword.
RED
/1RED
((RED))
If thats too hard to remember you can easily change it.
[prefix] safeword Mayday!
[prefix] safeword taxi
[prefix] safeword BANANA
This works only if your RLV relay is NOT in helpless mode. (Main Menu -> RLV -> Relay -> Helpless) if Helpless mode is on the safeword option will be disabled.
===============
List of Chat Commands
===============
Alright, many asked for this and here it is, the ultimate list of nerdy chat commands for those of you who prefer them over menus, touch or HUDs! Assumed here is that you know what a prefix is. We will indicate each prefix with a hash key. Why hash key? Cause waffles!
NOTE: Wearers have to use the first two letters of their username instead of the hash key.
-----------------------
General Commands:
-----------------------
# menu
# lock
# unlock
# apps
# channel [positive number]
# channel -1
# channel 0
# prefix [custom prefix]
RED
/1RED
((RED))
# safeword [custom safeword]
CustomSafeword
/1CustomSafeword
((CustomSafeword))
--------------
Bookmarks:
--------------
# bookmarks
# tp
# tp [name of bookmark]
# tp save
# tp print
# tp remove
-------
Titler:
-------
# menu titler
# title [a fancy title]
# title on
# title off
# title color <x, y, z>
------
Bell:
------
# menu bell
# bell on
# bell off
# bell show
# bell hide
----------------------------------
Label (selected models only):
----------------------------------
# menu label
# label box
# label [a fancy label]
# label on
# label off
# label scroll on
# label scroll off
# label font
--------------
Animations:
--------------
# animations
# posture on
# posture off
# ao menu
# ao on
# ao off
# antislide
# antislide on
# antislide off
# mv anims
# rm pose [name of pose]
----------------------------
Poses (stock selection):
----------------------------
# pose
# BeautyStand
# Bendover
# Bracelets
# Cutie
# Display
# Doggie
# Nadu
# NaduWide
# Plead
# Shy
# Sleep
# Squirm
# Submit
# Table
# Tower
(The following animations prefixed with a curly symbol ~ are animations used by the couples or plugins,
they're listed here to allow you to adjust the height for your avatar, so when the couple pose is called
it will display properly for you)
# ~crawl (used when the collar wearer is on a kneel pose and starts to walk or is dragged by the leash)
# ~good (submissive part of the "Pet" couple animation)
# ~jump-botto (submissive part of the "Jump" couple animation)
# ~jump-top (dominant part of the "Jump" couple animation)
# ~pet (dominant part of the "Pet" couple animation)
# ~run (used when the collar wearer is on a pose and start running)
# ~shock (used by the shocker plugin)
# ~stiff (used to freeze the neck for posture collars)
-------------------------------------------
Couple Animations (stock selection):
-------------------------------------------
# couples
# Pet
# Jump
# stop couples
----------
Capture:
----------
# capture
# capture on
# capture off
# capture risky on
# capture risky off
# capture info on
# capture info off
# capture release
-------
Leash:
-------
# menu leash
# leash
# grab
# yank
# unleash
# Give Holder Will give a leash holder to owners and trusted or everyone if the "Public" option is enabled.
# follow
# beckon Chat option only, it doesn't have a menu button.
# unfollow Chat option only, it doesn't have a menu button.
# stay Chat option only, it doesn't have a menu button.
# move Chat option only, it doesn't have a menu button.
# anchor
# park This will rez a balloon and leash the collar wearer to it, it's a command line option only.
# pass
# length
# leash configure
-----
RLV:
-----
# rlv
# rlv on
# rlv off
# rlv handshakes
# terminal
# clear
-----------
Force Sit:
-----------
# sit
# stand
# forbid stand
# allow stand
---------
Outfits:
---------
# outfits
# wear [name of the outfit]
---------------
Restrictions:
---------------
# restrictions
# allow sendim
# forbid sendim
# allow readim
# forbid readim
# allow hear
# forbid hear
# allow touch
# forbid touch
# allow stray
# forbid stray
# allow talk
# forbid talk
# allow rummage
# forbid rummage
# allow dress
# forbid dress
# dazzle
# undazzle
# daze
# undaze
--------------
RLV Folders:
--------------
# folders
#+ foldername (wears it)
#++ foldername (wears it and its subfolders)
#& foldername (adds it)
#&& foldername (adds it and its subfolders)
#- foldername (removes it)
#-- foldername (removes it and its subfolders)
# history
--------
Relay:
--------
# relay trusted
# relay ask
# relay auto
# relay off
# relay lite on
# relay lite off
# relay smart on
# relay smart off
# relay land on
# relay land off
# relay pending
# relay access
# relay helpless on
# relay helpless off
# relay safeword
---------
Access:
---------
# access
# add owner [UUID or name]
# rm owner [name]
# add trust [UUID or name]
# rm trust [name]
# add block [UUID or name]
# rm block [name]
# public on
# public off
# flavor
# vanilla on
# vanilla off
# runaway
----------
Settings:
----------
# settings
# print settings
# load url [url]
# fix
# verify
# stealth
# themes
# looks
--------------
Help/About:
--------------
# about
# help
# license
# news
# news on
# news off
# version
# info
# update
# reboot
--------------
Commands without menu buttons:
--------------
# heeloffset [number] This will change the shoe height compensator for the poses and couple anims.
Example: aaheeloffset -0.2
# heeloffset reset Will reset to the default offset of -0.1
# park It'll rez a baloon and automatically leash the collar owner to it.
# rm [Name of Plugin] Removes the plugin script from the collar.

View File

@@ -1,18 +0,0 @@
Recommended patches for OpenSim
Often we get a "bug report" for what is actually a known bug in OpenSim itself. Unfortunately the core devs don't see the urgency to address these problems, so you'll have to patch the OpenSim sourcecode yourself!
Alternatively, run my own [OpenSim fork](https://github.com/lickx/opensim-lickx) in which this all is fixed
[Mantis 8366](http://opensimulator.org/mantis/view.php?id=8366)
This fixes state being lost or even non-working scripts for any hypergrid visitors you receive at your sim. If you have been wondering why your collar (and other scripted attachments) lost any and all settings when hypergridding, this is it. The destination sim will have to apply these patches.
[Mantis 8366](http://opensimulator.org/mantis/view.php?id=8366) and [Mantis 9052](http://opensimulator.org/mantis/view.php?id=9052)
After a TP to the hypergrid, your attachments won't be set to the active group tag for that grid, which is needed if you allow access from that group on the collar. The destination sim will have to apply these patches.
[Mantis 6311](http://opensimulator.org/mantis/view.php?id=6311)
This affects RLVa, when declining a folder given to your shared #RLV folder by a scripted object/trap. Accepting works since OpenSim 0.9.2, decline will only work correctly after a patch is applied. Basically the object url in a inventory offer message HAS to start with http://slurl because RLVa is hardcoded like that. http://slurl.yourgrid.com is fine for example.
[Mantis 8250](http://opensimulator.org/mantis/view.php?id=8250)
If your leashed sub has been bunny hopping or is stuck when walking up or down a hill, stairs, or other kind of slope, this patch fixes that leash weirdness.

18
news.md Normal file
View File

@@ -0,0 +1,18 @@
Final Release 3.998 - Built 160730.1
Hello, a release is finally ready!
OsGrid local teleport:
secondlife://Oaks Woods/8/134/28
Hop teleport:
hop://hg.osgrid.org:80/Oaks%20Woods/8/134/28
Hypergrid teleport:
secondlife://hg.osgrid.org:80/Oaks Woods/8/134/28
V3 Hypergrid teleport:
secondlife://http|!!hg.osgrid.org|80+Oaks+Woods
Manual (World Map):
hg.osgrid.org:80:Oaks Woods

View File

@@ -1,21 +0,0 @@
## Animations
###### In this place we are going to collaborate on animations.
For collaboration native QAvimator files (AVM) are preferred.
The final format for animations will be Biovision Hierarchy (BVH).
Free software to create animations:
* [Blender](http://www.blender.org/)
* [QAvimator](http://qavimator.org/)
Free software for in-depth BVH Editing:
* [bvhacker](http://www.bvhacker.com/)
Tutorials:
* Qavimator for Beginners
* [Part 1](http://www.youtube.com/watch?v=pOulVwCePxw)
* [Part 2](http://www.youtube.com/watch?v=GQZDG0Wmcwc)
License:
* All animations and binaries contributed to this repository are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International Public License](https://creativecommons.org/licenses/by-sa/4.0/)

View File

@@ -1,482 +0,0 @@
HIERARCHY
ROOT mPelvis
{
OFFSET 0.000000 1.067000 -0.000000
CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation
JOINT mTorso
{
OFFSET 0.000000 0.084000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mChest
{
OFFSET 0.000000 0.205000 -0.015000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mNeck
{
OFFSET 0.000000 0.251000 -0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mHead
{
OFFSET 0.000000 0.076000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mSkull
{
OFFSET 0.000000 0.079000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT mEyeRight
{
OFFSET -0.036000 0.079000 0.098000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT mEyeLeft
{
OFFSET 0.036000 0.079000 0.098000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT HEAD
{
OFFSET 0.000000 0.070000 0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT NECK
{
OFFSET 0.000000 0.020000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mCollarLeft
{
OFFSET 0.085000 0.165000 -0.021000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mShoulderLeft
{
OFFSET 0.079000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mElbowLeft
{
OFFSET 0.248000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mWristLeft
{
OFFSET 0.205000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT L_HAND
{
OFFSET 0.050000 0.000000 0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_LOWER_ARM
{
OFFSET 0.100000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_UPPER_ARM
{
OFFSET 0.120000 0.010000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_CLAVICLE
{
OFFSET 0.000000 0.020000 0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mCollarRight
{
OFFSET -0.085000 0.165000 -0.021000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mShoulderRight
{
OFFSET -0.079000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mElbowRight
{
OFFSET -0.248000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mWristRight
{
OFFSET -0.205000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT R_HAND
{
OFFSET -0.050000 0.000000 0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_LOWER_ARM
{
OFFSET -0.100000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_UPPER_ARM
{
OFFSET -0.120000 0.010000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_CLAVICLE
{
OFFSET 0.000000 0.020000 0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT CHEST
{
OFFSET 0.000000 0.070000 0.028000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT LEFT_PEC
{
OFFSET 0.082000 0.042000 0.119000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
JOINT RIGHT_PEC
{
OFFSET -0.082000 0.042000 0.119000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
JOINT UPPER_BACK
{
OFFSET 0.000000 0.017253 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT BELLY
{
OFFSET 0.000000 0.040000 0.028000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT LOWER_BACK
{
OFFSET 0.000000 0.022848 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mHipRight
{
OFFSET -0.129000 -0.041000 0.034000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mKneeRight
{
OFFSET 0.049000 -0.491000 -0.001000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mAnkleRight
{
OFFSET -0.000000 -0.468000 -0.029000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mFootRight
{
OFFSET 0.000000 -0.061000 0.112000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mToeRight
{
OFFSET 0.000000 0.000000 0.109000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT R_FOOT
{
OFFSET 0.000000 -0.041000 0.077000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_LOWER_LEG
{
OFFSET -0.000000 -0.200000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT R_UPPER_LEG
{
OFFSET 0.050000 -0.220000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mHipLeft
{
OFFSET 0.127000 -0.041000 0.034000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mKneeLeft
{
OFFSET -0.046000 -0.491000 -0.001000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mAnkleLeft
{
OFFSET 0.001000 -0.468000 -0.029000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mFootLeft
{
OFFSET 0.000000 -0.061000 0.112000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mToeLeft
{
OFFSET 0.000000 0.000000 0.109000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT L_FOOT
{
OFFSET 0.000000 -0.041000 0.077000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_LOWER_LEG
{
OFFSET -0.000000 -0.200000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT L_UPPER_LEG
{
OFFSET -0.050000 -0.220000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT PELVIS
{
OFFSET -0.000000 -0.020000 -0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT BUTT
{
OFFSET -0.000000 -0.100000 -0.060000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
MOTION
Frames: 112
Frame Time: 0.022222
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.555755 -0.057458 -84.096424 -0.000000 0.000000 0.000001 0.879869 -0.033829 -4.403510 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -1.541243 15.193717 82.081778 0.000002 0.000000 0.000001 1.046036 0.047842 5.237183 -0.000001 -0.000001 -0.000000 0.000001 0.000000 0.000001 -0.000001 0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.145395 -0.000000 -0.000000 0.100395 -0.000000 -0.000000 0.000002 0.000022 -179.999991 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.157401 0.000000 -0.555755 -0.057458 -84.096424 -0.000000 0.000000 0.000000 0.879869 -0.033829 -4.403510 0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 -0.000000 0.000000 -0.178437 -0.000000 -1.541243 15.193717 82.081778 0.000002 -0.000000 0.000001 1.210449 0.064107 6.063092 0.000002 0.000000 -0.000000 0.000002 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.559283 -0.000000 -0.000000 0.386135 -0.000000 -0.000000 0.000002 0.000022 -179.999991 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.605468 0.000000 -0.555755 -0.057458 -84.096417 -0.000000 0.000000 0.000000 0.879869 -0.033829 -4.403510 0.000000 0.000001 0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.686428 -0.000000 -1.541243 15.193715 82.081778 0.000001 -0.000000 -0.000001 1.356350 0.080549 6.797052 0.000004 -0.000001 0.000000 -0.000001 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 1.208283 -0.000000 -0.000000 0.834054 -0.000000 -0.000000 0.000002 0.000022 -179.999991 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 1.308064 0.000000 -0.555755 -0.057458 -84.096424 0.000000 -0.000000 0.000000 0.879869 -0.033829 -4.403511 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -1.483108 -0.000000 -1.541243 15.193718 82.081778 -0.000001 0.000000 -0.000000 1.484851 0.096603 7.444351 0.000001 0.000001 -0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 2.059028 -0.000000 -0.000000 1.420976 -0.000000 -0.000000 0.000003 0.000022 -179.999991 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 2.229064 0.000000 -0.555755 -0.057458 -84.096424 0.000000 -0.000000 0.000000 0.879869 -0.033830 -4.403510 -0.000000 -0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -2.527640 -0.000000 -1.541244 15.193718 82.081778 -0.000001 -0.000000 -0.000000 1.597061 0.111829 8.010352 -0.000001 -0.000000 0.000000 -0.000000 0.000000 0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 3.078094 -0.000000 -0.000001 2.123713 -0.000000 -0.000000 0.000002 0.000022 -179.999991 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 3.332272 0.000000 -0.555755 -0.057458 -84.096424 0.000000 -0.000000 0.000000 0.879869 -0.033829 -4.403510 0.000000 -0.000001 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -3.779076 -0.000000 -1.541243 15.193713 82.081778 -0.000000 -0.000000 -0.000001 1.694116 0.125909 8.500500 -0.000002 -0.000002 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 4.231947 -0.000001 -0.000001 2.919066 -0.000000 -0.000001 0.000002 0.000022 -179.999991 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 4.581364 0.000001 -0.555755 -0.057459 -84.096424 -0.000001 -0.000000 0.000000 0.879869 -0.033829 -4.403510 -0.000000 -0.000003 -0.000000 -0.000000 -0.000000 0.000001 -0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -5.196270 -0.000000 -1.541243 15.193715 82.081778 -0.000000 0.000000 0.000001 1.777143 0.138631 8.920283 0.000001 0.000003 -0.000000 0.000001 -0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 5.486930 -0.000001 -0.000001 3.783815 -0.000000 -0.000001 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 5.939883 0.000001 -0.555755 -0.057459 -84.096424 -0.000000 -0.000000 0.000000 0.879869 -0.033829 -4.403510 0.000001 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000001 -6.737860 -0.000000 -1.541243 15.193715 82.081778 0.000001 0.000000 -0.000000 1.847269 0.149859 9.275211 -0.000001 -0.000000 -0.000000 0.000001 0.000000 -0.000001 0.000001 0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 6.809296 -0.000001 -0.000001 4.694758 -0.000001 -0.000001 0.000002 0.000022 -179.999991 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000001 7.371267 0.000001 -0.555755 -0.057459 -84.096424 0.000001 -0.000000 0.000000 0.879869 -0.033829 -4.403510 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000001 -8.362298 -0.000000 -1.541244 15.193717 82.081778 -0.000000 0.000000 0.000001 1.905624 0.159544 9.570815 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 8.165248 -0.000001 -0.000002 5.628710 -0.000001 -0.000001 0.000002 0.000022 -179.999991 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 8.838926 0.000001 -0.555755 -0.057458 -84.096424 0.000002 -0.000000 -0.000000 0.879869 -0.033830 -4.403510 0.000000 -0.000001 0.000000 0.000002 -0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000001 -10.027969 -0.000000 -1.541244 15.193715 82.081778 0.000000 -0.000000 0.000000 1.953325 0.167691 9.812632 -0.000000 0.000001 -0.000000 0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 9.521022 -0.000001 -0.000002 6.562546 -0.000001 -0.000001 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000001 10.306330 0.000002 -0.555755 -0.057458 -84.096424 -0.000000 -0.000000 0.000000 0.879869 -0.033831 -4.403510 -0.000001 -0.000001 -0.000000 0.000000 -0.000000 0.000001 -0.000001 -0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000001 -11.693313 -0.000000 -1.541244 15.193718 82.081778 0.000000 -0.000000 0.000002 1.991484 0.174357 10.006199 0.000000 0.000002 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000002 -0.000000 0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 10.842970 -0.000002 -0.000002 7.473206 -0.000001 -0.000001 0.000000 0.000022 -179.999991 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 11.737109 0.000002 -0.555755 -0.057459 -84.096424 -0.000001 -0.000000 0.000001 0.879869 -0.033829 -4.403510 0.000000 0.000001 -0.000000 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000001 -13.316980 -0.000000 -1.541244 15.193717 82.081778 0.000000 0.000000 0.000001 2.021206 0.179641 10.157052 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000001 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 12.097618 -0.000002 -0.000002 8.337726 -0.000001 -0.000002 0.000002 0.000022 -179.999991 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000001 13.095140 0.000002 -0.555755 -0.057459 -84.096424 -0.000000 -0.000000 0.000000 0.879869 -0.033829 -4.403510 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000001 -14.857951 -0.000000 -1.541244 15.193715 82.081778 0.000000 -0.000000 -0.000000 2.043589 0.183674 10.270695 0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 13.251708 -0.000002 -0.000002 9.133227 -0.000001 -0.000002 0.000000 0.000022 -179.999991 -0.000002 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000001 14.344587 0.000002 -0.555755 -0.057459 -84.096424 -0.000000 0.000000 -0.000000 0.879867 -0.033829 -4.403510 0.000001 -0.000001 -0.000001 -0.000001 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000001 -16.275624 -0.000000 -1.541243 15.193713 82.081778 -0.000000 -0.000000 -0.000001 2.059728 0.186612 10.352665 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 14.272214 -0.000002 -0.000003 9.836911 -0.000001 -0.000002 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000001 15.449905 0.000002 -0.555755 -0.057459 -84.096424 -0.000001 0.000000 0.000000 0.879868 -0.033830 -4.403509 -0.000000 -0.000001 -0.000001 0.000002 -0.000000 0.000001 -0.000001 0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000001 -17.529797 -0.000000 -1.541243 15.193715 82.081778 -0.000000 -0.000000 -0.000001 2.070710 0.188623 10.408452 0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 0.000000 -0.000002 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 15.126282 -0.000002 -0.000003 10.426032 -0.000001 -0.000002 0.000002 0.000022 -179.999991 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000002 16.375761 0.000003 -0.555755 -0.057459 -84.096424 -0.000001 0.000000 -0.000000 0.879871 -0.033830 -4.403511 -0.000002 -0.000001 -0.000000 0.000002 0.000000 -0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000001 -18.580602 -0.000000 -1.541243 15.193715 82.081778 0.000000 0.000000 -0.000001 2.077619 0.189892 10.443552 0.000000 0.000004 -0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000004 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 15.781130 -0.000002 -0.000003 10.877821 -0.000001 -0.000002 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000002 17.086878 0.000003 -0.555755 -0.057459 -84.096424 -0.000003 0.000000 0.000000 0.879868 -0.033829 -4.403510 0.000001 -0.000001 -0.000000 0.000000 0.000000 0.000000 -0.000002 0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000001 -19.388286 -0.000000 -1.541244 15.193711 82.081778 -0.000001 -0.000000 -0.000001 2.081535 0.190617 10.463454 0.000000 0.000002 0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 0.000000 -0.000002 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 16.203878 -0.000002 -0.000003 11.169445 -0.000002 -0.000002 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000002 17.547866 0.000003 -0.555755 -0.057459 -84.096424 -0.000001 -0.000000 0.000000 0.879870 -0.033831 -4.403510 -0.000002 -0.000004 -0.000000 0.000002 0.000000 0.000001 -0.000001 -0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000001 -19.912952 -0.000000 -1.541243 15.193711 82.081778 -0.000001 -0.000000 -0.000001 2.083540 0.190988 10.473643 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 -0.000000 -0.000002 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 16.361360 -0.000002 -0.000003 11.277867 -0.000001 -0.000002 0.000000 0.000022 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000002 17.722907 0.000003 -0.555755 -0.057461 -84.096424 0.000001 -0.000000 -0.000000 0.879870 -0.033831 -4.403510 -0.000002 -0.000000 0.000000 0.000002 -0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000001 -20.114142 -0.000000 -1.541244 15.193713 82.081778 -0.000001 -0.000000 0.000000 2.084716 0.191203 10.479613 -0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 -0.000005 0.000000 -0.000000 -0.000008 0.000017 -0.000027 0.000000 -0.000000 -0.000000 -0.000010 0.000016 -0.000028 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000003 0.000002 -0.000001 0.000009 -0.000013 0.000025 0.000000 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 0.999411 0.025898 0.020936 -0.000000 -0.000000 0.049707 -0.000268 -0.003627 -0.049322 0.000077 0.001964 16.264545 0.060169 -0.016577 11.243543 0.122438 -0.034831 -0.000000 0.000022 -179.999991 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.077782 17.654506 0.088358 -0.694010 -0.159613 -83.860598 -0.000001 -0.235233 0.000000 0.612298 -0.046123 -4.473096 -0.000001 -0.000002 0.000000 0.000002 -0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000001 -0.000000 -0.003820 -19.985420 -0.058732 -1.595238 15.300204 81.855009 0.000000 0.260436 0.000000 1.831409 0.169994 10.533784 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000002 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000000 -0.045435 -0.004534 0.000082 0.276731 0.001023 -0.016981 0.191858 -0.001432 -0.020876 -0.000011 0.000015 -0.000034 -0.000000 0.000000 0.000000 -0.000011 0.000015 -0.000032 -0.000002 0.000000 0.000000 -0.000000 0.000003 0.000136 -0.044687 0.004186 0.000101 0.276321 0.001608 -0.017157 0.194092 0.016564 -0.004384 0.000013 -0.000014 0.000023 0.000000 0.000000 0.000000 0.000012 -0.000014 0.000021 -0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 0.802788 0.101237 0.081843 -0.000000 -0.000000 0.194771 -0.001064 -0.014212 -0.192821 0.000293 0.007677 15.956365 0.235660 -0.064334 11.126557 0.479377 -0.135836 0.000003 0.000022 -179.999991 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.303555 17.416241 0.345022 -1.095706 -0.461453 -83.172682 0.000001 -0.921478 0.000000 -0.169404 -0.080175 -4.676689 -0.000003 -0.000001 -0.000000 0.000001 -0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.013609 -19.560613 -0.229875 -1.750568 15.612370 81.192706 -0.000001 1.020779 -0.000000 1.089470 0.106786 10.680561 0.000000 0.000001 0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000000 0.000000 -0.000002 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.177621 -0.017727 0.000300 1.085128 0.003528 -0.067010 0.751531 -0.005317 -0.081327 -0.000009 0.000016 -0.000030 -0.000000 -0.000000 0.000000 -0.000011 0.000015 -0.000030 -0.000001 0.000001 0.000000 -0.000000 0.000003 0.000136 -0.174696 0.016365 0.000415 1.083510 0.005828 -0.067028 0.760186 0.064764 -0.017853 0.000007 -0.000013 0.000027 0.000000 0.000000 -0.000000 0.000009 -0.000013 0.000025 -0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 0.486347 0.222487 0.179865 -0.000000 -0.000000 0.429131 -0.002409 -0.031307 -0.423813 0.000610 0.016874 15.451163 0.519243 -0.139520 10.933550 1.055652 -0.297212 0.000001 0.000022 -179.999991 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000000 -0.000000 -0.664790 17.017478 0.756310 -1.740355 -0.961868 -82.059894 0.000001 -2.031872 -0.000001 -1.437733 -0.129499 -5.007892 0.000000 -0.000002 -0.000001 0.000002 -0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.025644 -18.858554 -0.505580 -1.994904 16.122091 80.118638 0.000000 2.252860 -0.000001 -0.113530 0.001050 10.913204 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000001 -0.000000 -0.000001 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.390387 -0.038962 0.000588 2.396570 0.006089 -0.148231 1.656465 -0.011521 -0.178204 -0.000009 0.000014 -0.000031 0.000001 0.000000 0.000000 -0.000011 0.000014 -0.000031 -0.000001 0.000001 0.000000 -0.000000 0.000002 0.000135 -0.383966 0.035967 0.000979 2.392956 0.011176 -0.148040 1.675327 0.142349 -0.041332 0.000006 -0.000010 0.000022 -0.000001 0.000000 -0.000000 0.000007 -0.000010 0.000020 0.000000 0.000000 0.000000 0.000000 0.000002 -0.000100 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
0.000000 0.059306 0.386114 0.312150 -0.000000 -0.000000 0.746736 -0.004342 -0.054466 -0.735632 0.000979 0.029291 14.763252 0.903966 -0.237506 10.671604 1.836469 -0.512544 0.000001 0.000022 -179.999991 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -1.147683 16.466674 1.307378 -2.605896 -1.665984 -80.547492 -0.000000 -3.541816 0.000001 -3.169161 -0.184959 -5.461512 -0.000000 -0.000001 -0.000000 -0.000001 -0.000001 0.000001 -0.000001 -0.000000 0.000002 -0.000000 -0.000001 0.000000 -0.034932 -17.897732 -0.877803 -2.312978 16.824115 78.653030 0.000000 3.931758 0.000000 -1.752703 -0.149685 11.224572 0.000000 -0.000003 0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000001 0.000000 -0.000002 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.677577 -0.067627 0.000850 4.186522 0.006584 -0.259138 2.885427 -0.020439 -0.308461 -0.000006 0.000011 -0.000023 0.000000 -0.000000 0.000000 -0.000004 0.000011 -0.000024 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000136 -0.666448 0.062424 0.001852 4.180115 0.015486 -0.258762 2.917927 0.246998 -0.076221 0.000005 -0.000010 0.000024 0.000000 -0.000000 -0.000000 0.000006 -0.000010 0.000023 0.000001 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
0.000000 -0.469118 0.588589 0.475846 -0.000000 -0.000000 1.141547 -0.006925 -0.083239 -1.121620 0.001342 0.044665 13.906955 1.382986 -0.353013 10.348064 2.807178 -0.775004 0.000004 0.000022 -179.999991 0.000003 -0.000000 0.000000 0.000003 -0.000000 0.000000 0.000003 -0.000000 0.000000 0.000000 0.000000 -0.000000 -1.737536 15.771837 1.982568 -3.668028 -2.583324 -78.659962 0.000001 -5.427957 -0.000000 -5.342414 -0.235117 -6.032780 -0.000001 -0.000001 0.000000 -0.000002 0.000000 0.000001 0.000001 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.035625 -16.696626 -1.338511 -2.686637 17.714808 76.813591 0.000000 6.034404 -0.000001 -3.804570 -0.349298 11.606886 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -1.033037 -0.103107 0.000977 6.432838 0.002304 -0.398255 4.417858 -0.032817 -0.469091 -0.000010 0.000014 -0.000027 0.000000 -0.000000 -0.000000 -0.000011 0.000013 -0.000025 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 -1.016101 0.095165 0.003115 6.422817 0.016006 -0.397807 4.467106 0.376241 -0.124265 0.000008 -0.000009 0.000023 0.000001 -0.000000 0.000000 0.000010 -0.000010 0.000021 0.000001 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 -1.089710 0.826379 0.668098 -0.000000 -0.000000 1.607526 -0.010228 -0.117175 -1.575120 0.001636 0.062730 12.896617 1.949414 -0.480336 9.970401 3.953065 -1.077546 0.000001 0.000022 -179.999991 -0.000002 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000001 -0.000000 -0.000000 -2.419109 14.940858 2.765736 -4.899507 -3.725922 -76.422112 -0.000001 -7.667173 -0.000002 -7.936749 -0.266569 -6.716485 -0.000002 -0.000001 0.000000 -0.000001 0.000001 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 -0.000001 0.000000 -0.021397 -15.273963 -1.879885 -3.094876 18.790911 74.616408 -0.000000 8.538199 -0.000002 -6.245806 -0.602501 12.051452 0.000000 0.000000 -0.000000 0.000000 0.000001 0.000001 0.000000 0.000000 -0.000001 0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -1.450615 -0.144788 0.000845 9.114081 -0.009938 -0.563932 6.233357 -0.049620 -0.657057 -0.000002 0.000009 -0.000020 0.000000 0.000000 0.000000 -0.000002 0.000010 -0.000020 -0.000001 0.000001 -0.000000 -0.000000 0.000003 0.000135 -1.426881 0.133619 0.004853 9.099590 0.009504 -0.563635 6.302150 0.527390 -0.187431 0.000010 -0.000006 0.000017 0.000000 0.000000 -0.000000 0.000010 -0.000007 0.000017 0.000000 0.000000 0.000000 0.000000 0.000002 -0.000100 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
0.000000 -1.793252 1.095952 0.886053 -0.000000 -0.000000 2.138630 -0.014330 -0.155820 -2.089463 0.001797 0.083221 11.746667 2.596163 -0.613547 9.546057 5.259170 -1.413063 0.000002 0.000023 -179.999991 -0.000001 0.000001 0.000000 -0.000001 0.000001 0.000000 -0.000001 0.000001 0.000000 -0.000001 -0.000000 0.000000 -3.176959 13.981889 3.640569 -6.269573 -5.106282 -73.859999 -0.000001 -10.235633 -0.000001 -10.930245 -0.264363 -7.506136 -0.000000 -0.000003 0.000003 -0.000001 0.000000 0.000002 -0.000001 -0.000001 -0.000001 -0.000000 -0.000001 -0.000000 0.014232 -13.649021 -2.494485 -3.513798 20.048227 72.076609 -0.000001 11.419680 0.000000 -9.052016 -0.914304 12.548424 -0.000000 -0.000001 0.000000 -0.000000 -0.000003 -0.000000 -0.000000 -0.000000 0.000001 -0.000000 0.000001 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -1.924151 -0.192051 0.000326 12.207874 -0.033676 -0.754142 8.311125 -0.071896 -0.869206 -0.000002 0.000007 -0.000016 0.000004 0.000000 0.000000 -0.000004 0.000007 -0.000016 -0.000001 0.000001 0.000000 -0.000000 0.000003 0.000136 -1.892740 0.177212 0.007158 12.188035 -0.007611 -0.754343 8.401947 0.697477 -0.267766 0.000007 -0.000004 0.000014 -0.000002 0.000000 0.000000 0.000003 -0.000004 0.000014 0.000001 0.000001 0.000000 0.000000 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 -2.570529 1.393778 1.126858 -0.000000 -0.000000 2.728806 -0.019308 -0.198717 -2.657970 0.001761 0.105871 10.471607 3.315834 -0.746688 9.082324 6.710120 -1.774543 -0.000000 0.000021 -179.999991 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000000 -0.000000 0.000000 -3.995757 12.903634 4.590875 -7.743584 -6.735202 -71.001490 -0.000000 -13.107913 0.000000 -14.298175 -0.212590 -8.393135 -0.000002 0.000002 0.000001 0.000001 0.000001 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000002 -0.000000 0.077614 -11.841830 -3.175368 -3.916768 21.480340 69.209105 0.000001 14.653264 -0.000004 -12.196671 -1.289359 13.086663 0.000000 0.000002 -0.000001 -0.000000 -0.000001 0.000002 0.000002 -0.000000 -0.000002 0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -2.447474 -0.244276 -0.000700 15.689298 -0.072618 -0.966300 10.629488 -0.100621 -1.102264 0.000003 0.000006 -0.000014 -0.000001 -0.000000 0.000000 0.000001 0.000006 -0.000015 -0.000002 -0.000000 0.000000 -0.000000 0.000003 0.000137 -2.407619 0.225369 0.010118 15.663207 -0.039121 -0.967475 10.744508 0.883214 -0.367293 0.000008 -0.000005 0.000012 -0.000003 0.000000 -0.000000 0.000007 -0.000004 0.000010 0.000001 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 -3.412322 1.716325 1.387655 -0.000000 -0.000000 3.371981 -0.025235 -0.245405 -3.273937 0.001467 0.130409 9.086061 4.100623 -0.873967 8.586254 8.290011 -2.155185 -0.000002 0.000022 -179.999991 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 0.000001 -0.000000 0.000000 -4.860565 11.715602 5.600841 -9.283065 -8.619437 -67.876508 0.000001 -16.256275 -0.000000 -18.011479 -0.095181 -9.366042 -0.000001 -0.000001 0.000001 0.000001 0.000001 -0.000003 -0.000000 -0.000001 0.000000 -0.000000 -0.000002 -0.000000 0.174751 -9.873368 -3.916150 -4.274705 23.077345 66.029105 -0.000000 18.210112 -0.000002 -15.650142 -1.731298 13.653703 -0.000000 0.000003 -0.000001 0.000003 -0.000001 0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000002 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -3.014406 -0.300840 -0.002351 19.529427 -0.130428 -1.197102 13.165471 -0.136585 -1.352771 0.000002 0.000002 -0.000007 0.000005 0.000000 -0.000000 0.000000 0.000002 -0.000007 -0.000002 0.000000 -0.000000 -0.000000 0.000003 0.000138 -2.965444 0.277509 0.013813 19.496194 -0.088788 -1.199861 13.306588 1.080961 -0.487814 0.000001 -0.000003 0.000003 -0.000003 0.000000 -0.000000 0.000008 -0.000003 0.000003 -0.000001 0.000000 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 -4.309415 2.060061 1.665591 -0.000000 -0.000000 4.062069 -0.032177 -0.295421 -3.930644 0.000865 0.156566 7.604764 4.942260 -0.989937 8.064584 9.982360 -2.548509 0.000001 0.000021 -179.999991 0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 -5.757102 10.428251 6.655262 -10.846188 -10.759406 -64.516847 -0.000004 -19.650085 -0.000001 -22.035623 0.103044 -10.410117 -0.000000 -0.000005 -0.000001 0.000000 0.000002 -0.000002 -0.000000 0.000001 0.000002 -0.000000 -0.000001 -0.000000 0.311116 -7.765630 -4.711030 -4.556674 24.824753 62.552655 0.000001 22.057290 0.000001 -19.379026 -2.242071 14.235918 -0.000001 0.000006 -0.000001 0.000001 -0.000002 0.000000 -0.000001 0.000001 0.000003 0.000000 0.000001 0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 -3.618750 -0.361115 -0.004727 23.694135 -0.210447 -1.442438 15.894602 -0.180248 -1.617101 0.000017 0.000001 0.000000 0.000003 0.000000 0.000000 0.000010 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000000 0.000003 0.000137 -3.560126 0.333052 0.018310 23.652875 -0.160077 -1.447514 16.063311 1.286753 -0.630834 0.000007 -0.000003 0.000005 -0.000005 -0.000000 0.000000 0.000005 -0.000003 0.000003 -0.000001 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 -5.252592 2.421454 1.957808 -0.000000 -0.000000 4.792961 -0.040185 -0.348300 -4.621344 -0.000093 0.184067 6.042577 5.831996 -1.089671 7.523669 11.770013 -2.948423 0.000001 0.000020 -179.999991 -0.000001 -0.000002 0.000000 -0.000001 -0.000002 0.000000 -0.000001 -0.000002 0.000000 0.000000 0.000000 -0.000000 -6.671925 9.053103 7.739742 -12.388734 -13.147106 -60.955607 0.000001 -23.255471 -0.000001 -26.329806 0.395143 -11.507152 0.000001 0.000000 -0.000003 0.000001 0.000003 -0.000001 0.000001 -0.000001 -0.000001 -0.000000 0.000000 0.000000 0.491508 -5.541652 -5.554741 -4.730778 26.702645 58.797110 -0.000001 26.157044 -0.000004 -23.345759 -2.821321 14.818896 -0.000001 -0.000000 -0.000000 -0.000002 0.000002 -0.000005 -0.000002 -0.000002 -0.000002 -0.000000 -0.000001 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -4.254297 -0.424470 -0.007911 28.143180 -0.315375 -1.697378 18.790591 -0.231620 -1.891494 0.000008 -0.000000 0.000003 0.000006 0.000000 0.000000 0.000010 -0.000000 0.000002 0.000002 0.000000 0.000000 -0.000000 0.000002 0.000136 -4.185560 0.391412 0.023661 28.093077 -0.255847 -1.705622 18.988049 1.496335 -0.797353 0.000002 0.000000 0.000002 -0.000005 -0.000000 0.000000 0.000002 -0.000000 0.000001 -0.000002 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 -6.232636 2.796974 2.261449 -0.000000 -0.000000 5.558533 -0.049298 -0.403575 -5.339270 -0.001440 0.212638 4.414510 6.760621 -1.168920 6.969483 13.635240 -3.349301 0.000002 0.000024 -179.999991 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -7.592625 7.602790 8.840813 -13.865484 -15.764584 -57.226289 -0.000001 -27.035190 -0.000005 -30.846852 0.790696 -12.635773 -0.000001 -0.000003 0.000001 0.000002 0.000005 0.000001 -0.000001 0.000001 -0.000002 -0.000000 0.000001 0.000000 0.719941 -3.225466 -6.442466 -4.765475 28.685306 54.781723 -0.000004 30.466684 0.000001 -27.508597 -3.465875 15.387982 -0.000000 0.000005 -0.000001 -0.000001 -0.000001 0.000000 -0.000002 -0.000002 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -4.914822 -0.490272 -0.011964 32.829871 -0.446955 -1.956304 21.825402 -0.290166 -2.172119 0.000007 -0.000005 0.000008 -0.000003 -0.000000 0.000000 0.000007 -0.000006 0.000009 -0.000004 0.000001 0.000000 0.000000 0.000002 0.000135 -4.835622 0.452004 0.029899 32.770199 -0.378025 -1.968646 22.052299 1.705265 -0.987820 0.000004 0.000003 -0.000001 -0.000002 -0.000000 -0.000000 0.000006 0.000003 -0.000003 0.000001 0.000001 0.000000 0.000001 0.000002 -0.000099 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
-0.000000 -7.240330 3.183088 2.573655 -0.000000 -0.000000 6.352636 -0.059528 -0.460776 -6.077633 -0.003198 0.242002 2.735712 7.718507 -1.224257 6.407574 15.559716 -3.746010 0.000002 0.000021 -179.999991 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000001 -0.000000 -8.507932 6.090996 9.946055 -15.231885 -18.583155 -53.361836 0.000000 -30.948916 0.000001 -35.533595 1.294643 -13.772275 0.000001 0.000000 -0.000001 0.000000 -0.000001 0.000000 -0.000001 0.000000 0.000003 -0.000001 0.000000 -0.000000 0.999546 -0.841945 -7.369706 -4.631200 30.741254 50.528264 -0.000001 34.938740 -0.000006 -31.821944 -4.169460 15.929055 -0.000001 0.000000 -0.000000 -0.000000 -0.000002 -0.000001 -0.000000 -0.000001 -0.000004 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -5.594094 -0.557888 -0.016924 37.701241 -0.605679 -2.213129 24.969331 -0.354708 -2.455144 0.000019 -0.000009 0.000015 -0.000003 -0.000000 0.000000 0.000016 -0.000009 0.000015 -0.000001 0.000000 0.000000 -0.000001 0.000003 0.000136 -5.504174 0.514239 0.037030 37.631412 -0.527315 -2.230545 25.225801 1.909031 -1.201983 0.000002 0.000007 -0.000010 0.000001 0.000000 0.000000 0.000000 0.000006 -0.000010 -0.000006 0.000001 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -8.266456 3.576265 2.891570 -0.000000 -0.000001 7.169109 -0.070873 -0.519435 -6.829630 -0.005378 0.271883 1.021477 8.695714 -1.253197 5.843105 17.524662 -4.133937 0.000003 0.000024 -179.999991 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.000001 0.000000 0.000000 -9.407760 4.532388 11.044117 -16.445958 -21.563715 -49.393681 0.000003 -34.953602 -0.000007 -40.332182 1.906323 -14.891810 0.000001 0.000002 -0.000000 -0.000003 0.000003 -0.000001 0.000002 0.000001 -0.000002 0.000000 0.000000 0.000000 1.332477 1.583407 -8.332133 -4.302399 32.834143 46.061932 0.000001 39.521612 -0.000002 -36.237080 -4.922672 16.429342 0.000001 0.000005 0.000002 0.000002 -0.000001 0.000000 0.000001 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 -0.000000 -6.285864 -0.626680 -0.022798 42.698928 -0.790599 -2.461665 28.191097 -0.423391 -2.736873 0.000015 -0.000011 0.000019 -0.000002 0.000000 -0.000000 0.000015 -0.000011 0.000019 -0.000000 0.000001 -0.000000 -0.000000 0.000003 0.000137 -6.185067 0.577533 0.045039 42.618485 -0.702987 -2.485121 28.476724 2.103204 -1.438861 -0.000004 0.000009 -0.000014 0.000000 0.000000 -0.000000 -0.000003 0.000008 -0.000016 0.000001 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -9.301800 3.972974 3.212338 -0.000000 -0.000001 8.001787 -0.083303 -0.579086 -7.588450 -0.007975 0.302002 -0.712749 9.682090 -1.254295 5.280864 19.510949 -4.509021 0.000001 0.000024 -179.999991 -0.000001 0.000004 -0.000000 -0.000001 0.000004 -0.000000 -0.000001 0.000004 -0.000000 -0.000000 -0.000001 0.000000 -10.283280 2.942473 12.124762 -17.470155 -24.658095 -45.351230 -0.000002 -39.004284 -0.000006 -45.181708 2.619002 -15.970043 0.000001 -0.000001 0.000000 0.000000 -0.000001 0.000001 -0.000000 0.000001 -0.000001 0.000001 -0.000000 -0.000001 1.719829 4.024713 -9.325379 -3.759782 34.924137 41.412332 0.000002 44.160691 -0.000005 -40.703187 -5.713312 16.878306 0.000001 0.000000 -0.000000 0.000001 0.000000 0.000001 -0.000000 -0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -6.983886 -0.696016 -0.029567 47.760538 -0.999254 -2.696026 31.458383 -0.493659 -3.013857 0.000016 -0.000013 0.000028 -0.000001 -0.000000 0.000001 0.000015 -0.000013 0.000028 0.000000 0.000001 -0.000000 0.000000 0.000003 0.000136 -6.872143 0.641298 0.053883 47.669260 -0.902797 -2.726431 31.772025 2.283584 -1.696752 -0.000002 0.000012 -0.000021 -0.000000 -0.000000 -0.000000 -0.000000 0.000011 -0.000019 0.000002 0.000001 -0.000000 0.000001 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -10.337144 4.369683 3.533099 -0.000000 -0.000001 8.844494 -0.096764 -0.639268 -8.347271 -0.010970 0.332085 -2.451367 10.667397 -1.227207 4.725317 21.499264 -4.867738 0.000003 0.000020 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 -11.126868 1.337423 13.178788 -18.273114 -27.811456 -41.261661 -0.000001 -43.054965 -0.000001 -50.020361 3.420123 -16.984814 0.000002 0.000001 0.000000 -0.000000 0.000001 -0.000000 -0.000001 0.000005 0.000001 -0.000000 -0.000000 -0.000001 2.161540 6.456028 -10.344848 -2.992623 36.969956 36.614855 0.000003 48.799789 -0.000006 -45.168461 -6.526909 17.268282 -0.000000 0.000004 -0.000001 0.000000 -0.000000 -0.000001 0.000003 -0.000001 -0.000001 0.000000 -0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -7.681911 -0.765263 -0.037180 52.821623 -1.227767 -2.911078 34.738124 -0.562298 -3.283006 0.000014 -0.000016 0.000027 -0.000000 -0.000001 0.000000 0.000012 -0.000017 0.000031 0.000002 0.000001 0.000000 -0.000000 0.000003 0.000137 -7.559239 0.704954 0.063490 52.719467 -1.123073 -2.949225 35.077857 2.446411 -1.973253 -0.000001 0.000013 -0.000019 -0.000000 -0.000000 -0.000000 -0.000001 0.000013 -0.000018 -0.000000 0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -11.363271 4.762860 3.851000 -0.000000 -0.000001 9.691054 -0.111177 -0.699519 -9.099262 -0.014331 0.361856 -4.178629 11.641466 -1.172729 4.180660 23.470198 -5.207103 0.000002 0.000020 -179.999991 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 0.000001 -0.000000 -11.932060 -0.266093 14.197978 -18.831305 -30.965387 -37.150693 0.000000 -47.059652 -0.000006 -54.787481 4.292048 -17.917675 -0.000000 -0.000002 0.000001 0.000001 0.000000 0.000000 0.000000 0.000004 -0.000000 0.000001 0.000000 -0.000002 2.656292 8.851669 -11.385460 -2.000939 38.931324 31.711783 0.000001 53.382655 -0.000014 -49.581538 -7.347586 17.595049 0.000002 0.000002 -0.000000 -0.000001 0.000000 -0.000002 0.000003 0.000005 -0.000004 0.000000 0.000001 -0.000002 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 -8.373690 -0.833791 -0.045556 57.817811 -1.471106 -3.102812 37.997022 -0.625480 -3.541677 0.000020 -0.000019 0.000032 -0.000000 -0.000000 0.000001 0.000018 -0.000019 0.000033 0.000001 0.000001 0.000000 -0.000001 0.000003 0.000137 -8.240183 0.767919 0.073764 57.704956 -1.358948 -3.149334 38.360105 2.588467 -2.265372 -0.000005 0.000015 -0.000024 -0.000000 -0.000000 -0.000000 -0.000004 0.000014 -0.000024 0.000002 0.000001 -0.000000 0.000001 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -12.370965 5.148974 4.163186 -0.000001 -0.000001 10.535289 -0.126435 -0.759387 -9.837620 -0.018013 0.391042 -5.878637 12.594323 -1.092792 3.650869 25.404458 -5.524673 0.000002 0.000020 -179.999991 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 0.000001 -0.000000 -12.693479 -1.851135 15.175014 -19.130417 -34.061272 -33.043461 -0.000003 -50.973388 -0.000008 -59.425535 5.213397 -18.754998 -0.000000 -0.000002 0.000003 -0.000002 0.000000 -0.000000 0.000000 0.000001 0.000000 -0.000001 0.000000 -0.000001 3.201407 11.186541 -12.441445 -0.797040 40.771585 26.753322 0.000006 57.854708 -0.000012 -53.892535 -8.158962 17.858016 -0.000003 -0.000002 -0.000000 -0.000000 -0.000002 0.000001 0.000002 0.000001 -0.000002 -0.000001 -0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000000 -9.052988 -0.900978 -0.054586 62.686930 -1.723459 -3.268609 41.202160 -0.678878 -3.787768 0.000018 -0.000022 0.000036 0.000000 0.000000 0.000000 0.000017 -0.000021 0.000037 0.000003 0.000002 -0.000000 0.000001 0.000002 0.000136 -8.908828 0.829621 0.084579 62.563713 -1.604728 -3.323938 41.584910 2.707215 -2.569663 -0.000008 0.000016 -0.000026 0.000001 0.000000 -0.000000 -0.000006 0.000016 -0.000027 0.000001 0.000001 0.000000 0.000001 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -13.351008 5.524494 4.466805 -0.000001 -0.000001 11.371060 -0.142407 -0.818429 -10.555533 -0.021951 0.419372 -7.535352 13.516301 -0.990428 3.139793 27.283016 -5.818518 0.000002 0.000021 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000000 -13.406729 -3.400658 16.103358 -19.166646 -37.043674 -28.966474 -0.000004 -54.753102 -0.000008 -63.881530 6.160630 -19.488582 0.000001 -0.000003 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 3.792744 13.436435 -13.506106 0.593713 42.460090 21.798036 0.000002 62.164345 -0.000015 -58.054217 -8.945067 18.060108 -0.000000 0.000003 0.000000 0.000001 -0.000001 -0.000001 0.000000 0.000003 -0.000001 0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -9.713570 -0.966204 -0.064131 67.370889 -1.978652 -3.407346 44.321323 -0.717785 -4.019729 0.000018 -0.000024 0.000043 -0.000002 0.000000 0.000001 0.000017 -0.000025 0.000043 0.000000 0.000001 -0.000000 -0.000000 0.000003 0.000137 -9.559009 0.889493 0.095786 67.237844 -1.854317 -3.471700 44.719209 2.800869 -2.882395 -0.000008 0.000021 -0.000034 0.000000 -0.000000 -0.000000 -0.000004 0.000021 -0.000036 0.000001 -0.000000 -0.000000 -0.000001 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -14.294186 5.885888 4.759009 -0.000001 -0.000001 12.192217 -0.158939 -0.876206 -11.246227 -0.026074 0.446579 -9.132625 14.398172 -0.869700 2.651197 29.087170 -6.087205 0.000003 0.000024 -179.999991 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000001 -0.000000 -14.068291 -4.897686 16.977108 -18.947682 -39.863030 -24.949455 -0.000005 -58.358489 -0.000007 -68.108051 7.109719 -20.115710 0.000001 -0.000002 0.000002 -0.000000 -0.000000 -0.000001 -0.000000 0.000003 -0.000000 0.000000 0.000000 0.000002 4.424607 15.578263 -14.571590 2.133464 43.974124 16.912310 0.000005 66.264105 -0.000019 -62.022762 -9.691110 18.207353 -0.000002 0.000002 -0.000001 -0.000001 -0.000004 -0.000001 0.000002 0.000003 -0.000003 0.000000 -0.000000 0.000001 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000002 -0.000001 0.000000 -0.000001 -0.000000 -0.000000 -10.349223 -1.028859 -0.074024 71.816973 -2.230596 -3.519350 47.323580 -0.737188 -4.236566 0.000019 -0.000025 0.000044 -0.000001 0.000000 0.000000 0.000021 -0.000025 0.000042 0.000000 0.000001 -0.000000 0.000000 0.000003 0.000136 -10.184596 0.946975 0.107209 71.674796 -2.101630 -3.592712 47.731097 2.868409 -3.199733 -0.000007 0.000019 -0.000030 -0.000001 0.000000 0.000000 -0.000008 0.000018 -0.000032 0.000000 0.000001 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -15.191278 6.229623 5.036946 -0.000001 -0.000001 12.992646 -0.175848 -0.932292 -11.902918 -0.030298 0.472399 -10.654174 15.231184 -0.735606 2.188864 30.798658 -6.329773 0.000003 0.000021 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 -0.000001 0.000001 -0.000000 -14.675353 -6.325439 17.790889 -18.493516 -42.477701 -21.027588 -0.000008 -61.752287 -0.000008 -72.063345 8.037509 -20.638521 -0.000002 -0.000001 0.000005 -0.000000 -0.000001 -0.000000 0.000001 0.000005 0.000001 0.000001 0.000000 -0.000002 5.089664 17.590259 -15.628735 3.773736 45.299942 12.168782 0.000006 70.111263 -0.000014 -65.758124 -10.384030 18.308363 0.000001 -0.000000 0.000002 -0.000001 -0.000003 0.000000 -0.000000 0.000002 0.000000 0.000000 -0.000003 0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000001 -0.000000 -10.953746 -1.088337 -0.084078 75.978847 -2.473622 -3.606197 50.179419 -0.731933 -4.437760 0.000013 -0.000025 0.000047 0.000000 -0.000001 -0.000000 0.000011 -0.000025 0.000046 -0.000000 0.000001 0.000001 0.000000 0.000003 0.000135 -10.779448 1.001512 0.118653 75.828303 -2.340968 -3.688338 50.590193 2.909570 -3.517887 -0.000007 0.000019 -0.000035 -0.000004 -0.000000 0.000001 -0.000005 0.000018 -0.000036 -0.000003 0.000001 -0.000000 -0.000000 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -16.033073 6.552170 5.297772 -0.000001 -0.000001 13.766258 -0.192934 -0.986271 -12.518869 -0.034530 0.496572 -12.083681 16.007151 -0.593935 1.756624 32.399737 -6.545716 0.000002 0.000021 -179.999991 0.000000 -0.000003 -0.000001 0.000000 -0.000003 -0.000001 0.000000 -0.000003 -0.000001 0.000000 -0.000000 -0.000000 -15.225731 -7.667484 18.539734 -17.836650 -44.855119 -17.243253 -0.000010 -64.900649 -0.000012 -75.711383 8.922844 -21.063293 -0.000003 0.000000 0.000003 -0.000001 -0.000002 0.000001 -0.000000 0.000001 0.000000 0.000002 0.000001 -0.000003 5.778956 19.452128 -16.666915 5.458481 46.433108 7.643803 0.000004 73.668139 -0.000023 -69.224322 -11.012771 18.373535 -0.000002 0.000003 -0.000001 -0.000000 0.000000 0.000000 0.000001 -0.000001 -0.000000 0.000002 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000002 0.000000 0.000000 -11.520960 -1.144044 -0.094080 79.816484 -2.702733 -3.670446 52.861122 -0.696785 -4.623189 0.000020 -0.000028 0.000048 -0.000005 -0.000000 0.000000 0.000016 -0.000028 0.000049 0.000003 0.000002 -0.000000 -0.000001 0.000003 0.000136 -11.337457 1.052558 0.129901 79.658434 -2.567261 -3.760940 53.267969 2.924755 -3.833326 -0.000011 0.000020 -0.000033 0.000001 -0.000000 -0.000000 -0.000010 0.000020 -0.000033 0.000001 0.000001 0.000000 -0.000001 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -16.810349 6.849995 5.538640 -0.000001 -0.000001 14.506992 -0.209976 -1.037736 -13.087358 -0.038666 0.518840 -13.404719 16.718370 -0.451127 1.358449 33.873155 -6.734907 0.000002 0.000021 -179.999991 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000001 -0.000000 0.000000 -15.717659 -8.907746 19.218901 -17.021784 -46.972092 -13.647260 -0.000013 -67.772928 -0.000015 -79.021129 9.747187 -21.399242 0.000003 -0.000001 -0.000001 -0.000000 0.000005 -0.000002 -0.000000 0.000002 -0.000000 0.000003 0.000000 0.000003 6.481869 21.144980 -17.673970 7.127920 47.377665 3.414274 0.000009 76.901708 -0.000025 -72.389207 -11.568302 18.414397 -0.000000 -0.000004 -0.000001 0.000001 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 0.000001 -0.000001 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000003 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -12.044693 -1.195388 -0.103805 83.295899 -2.913730 -3.715315 55.342701 -0.626488 -4.792982 0.000019 -0.000025 0.000045 0.000002 -0.000001 -0.000001 0.000016 -0.000024 0.000044 0.000001 0.000002 -0.000000 -0.000001 0.000002 0.000136 -11.852528 1.099577 0.140725 83.131243 -2.776200 -3.813559 55.737615 2.914945 -4.142829 -0.000011 0.000020 -0.000032 -0.000002 -0.000000 0.000001 -0.000008 0.000020 -0.000034 0.000003 0.000002 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -17.513891 7.119570 5.756707 -0.000001 -0.000001 15.208806 -0.226735 -1.086291 -13.601698 -0.042598 0.538952 -14.600909 17.357666 -0.314079 0.998456 35.202173 -6.897551 0.000002 0.000023 -179.999991 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 -0.000000 -16.149697 -10.030578 19.823808 -16.104488 -48.814146 -10.299004 -0.000017 -70.341407 -0.000021 -81.965603 10.494797 -21.657485 -0.000003 -0.000003 -0.000002 0.000000 -0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000001 -0.000001 0.000000 7.186308 22.651368 -18.636246 8.722409 48.144614 -0.445362 0.000012 79.783207 -0.000030 -75.224002 -12.043372 18.442861 0.000001 -0.000004 -0.000001 -0.000000 -0.000000 -0.000002 -0.000001 -0.000001 0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.000000 -0.000004 -0.000001 0.000000 -0.000005 -0.000001 -0.000000 -12.518801 -1.241787 -0.113013 86.388253 -3.103208 -3.744367 57.599860 -0.515817 -4.947379 0.000008 -0.000024 0.000047 -0.000003 0.000000 0.000000 0.000006 -0.000024 0.000047 -0.000001 0.000001 0.000000 -0.000001 0.000003 0.000136 -12.318583 1.142034 0.150882 86.217895 -2.964258 -3.849618 57.974099 2.881576 -4.443644 -0.000007 0.000018 -0.000030 -0.000004 -0.000001 -0.000000 -0.000008 0.000018 -0.000032 0.000000 0.000001 0.000000 0.000001 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -18.134481 7.357359 5.949129 -0.000001 -0.000001 15.865703 -0.242960 -1.131550 -14.055183 -0.046215 0.556654 -15.655825 17.918236 -0.189966 0.680972 36.370443 -7.034115 0.000002 0.000023 -179.999991 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000001 0.000001 0.000000 -0.000000 -16.520503 -11.020730 20.349843 -15.148876 -50.374219 -7.265631 -0.000025 -72.580623 -0.000021 -84.520797 11.152602 -21.849907 -0.000002 -0.000003 0.000002 0.000003 -0.000001 0.000000 0.000001 -0.000001 -0.000001 0.000000 0.000001 -0.000003 7.878873 23.955068 -19.538702 10.185709 48.749806 -3.865522 0.000027 82.286998 -0.000038 -77.702650 -12.432117 18.470694 0.000000 -0.000002 -0.000000 -0.000000 -0.000002 0.000000 0.000003 -0.000002 0.000000 -0.000000 -0.000001 0.000001 -0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -12.937133 -1.282662 -0.121457 89.068583 -3.268480 -3.761236 59.609786 -0.359578 -5.086504 0.000011 -0.000027 0.000050 0.000002 0.000000 -0.000000 0.000015 -0.000027 0.000050 0.000001 0.000002 -0.000000 -0.000001 0.000002 0.000137 -12.729546 1.179401 0.160125 88.893416 -3.128614 -3.872632 59.953946 2.826413 -4.733490 -0.000015 0.000021 -0.000035 -0.000004 -0.000001 0.000000 -0.000011 0.000021 -0.000035 -0.000001 0.000001 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -18.662907 7.559834 6.113064 -0.000001 -0.000001 16.471694 -0.258387 -1.173135 -14.441149 -0.049404 0.571697 -16.553095 18.393556 -0.086019 0.410496 37.361975 -7.145203 0.000003 0.000024 -179.999991 0.000001 0.000001 -0.000001 0.000001 0.000001 -0.000001 0.000001 0.000001 -0.000001 -0.000000 0.000002 -0.000000 -16.828739 -11.863304 20.792332 -14.224361 -51.650867 -4.620067 -0.000008 -74.466759 -0.000019 -86.664521 11.709786 -21.988283 -0.000000 -0.000000 0.000002 0.000000 -0.000001 0.000001 0.000001 0.000002 0.000002 0.000001 -0.000000 -0.000000 8.545181 25.040824 -20.365123 11.467158 49.211704 -6.782747 0.000033 84.389644 -0.000066 -79.801021 -12.729521 18.508974 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000001 -0.000000 -0.000001 -0.000000 0.000000 -0.000002 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000002 0.000000 0.000001 -0.000001 0.000000 -13.293560 -1.317438 -0.128886 91.314411 -3.407424 -3.769398 61.350917 -0.152567 -5.210202 0.000016 -0.000027 0.000048 0.000001 0.000000 0.000000 0.000011 -0.000026 0.000049 0.000002 0.000002 -0.000000 -0.000000 0.000003 0.000137 -13.079362 1.211155 0.168204 91.135323 -3.267018 -3.885983 61.654854 2.751401 -5.010621 -0.000008 0.000020 -0.000033 -0.000003 -0.000000 0.000001 -0.000006 0.000019 -0.000035 0.000001 0.000001 -0.000001 0.000001 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -19.089951 7.723461 6.245668 -0.000001 -0.000001 17.020826 -0.272746 -1.210676 -14.752958 -0.052053 0.583834 -17.276468 18.777242 -0.009300 0.191712 38.160923 -7.231421 0.000003 0.000024 -179.999991 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000001 -0.000001 0.000000 -17.072843 -12.543700 21.146361 -13.401547 -52.645681 -2.438088 -0.000020 -75.976716 -0.000028 -88.375039 12.157203 -22.083436 -0.000001 0.000002 0.000000 0.000003 -0.000000 -0.000001 -0.000000 -0.000002 -0.000000 0.000001 0.000000 0.000000 9.170324 25.894068 -21.098470 12.522637 49.548897 -9.139731 0.000066 86.068539 -0.000101 -81.495761 -12.930830 18.567757 -0.000000 0.000004 -0.000000 -0.000002 -0.000001 0.000000 0.000003 0.000001 -0.000000 -0.000000 0.000000 -0.000001 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000002 0.000000 0.000000 -13.581959 -1.345542 -0.135055 93.104180 -3.518303 -3.771992 62.802380 0.110448 -5.317809 0.000016 -0.000028 0.000047 0.000000 -0.000001 -0.000000 0.000015 -0.000027 0.000049 0.000001 0.000002 0.000000 0.000001 0.000003 0.000136 -13.361990 1.236773 0.174872 92.922053 -3.377619 -3.892734 63.055350 2.658584 -5.273803 -0.000006 0.000021 -0.000035 -0.000006 -0.000000 0.000000 -0.000008 0.000020 -0.000034 0.000001 0.000001 -0.000000 0.000001 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -19.406389 7.844710 6.344093 -0.000001 -0.000001 17.507129 -0.285762 -1.243806 -14.983946 -0.054059 0.592816 -17.809729 19.062812 0.033525 0.029418 38.751553 -7.293232 0.000001 0.000026 -179.999991 -0.000001 0.000002 0.000000 -0.000001 0.000002 0.000000 -0.000001 0.000002 0.000000 0.000000 0.000001 -0.000000 -17.250867 -13.047484 21.406655 -12.747808 -53.360631 -0.795168 -0.000025 -77.087093 -0.000026 -89.629704 12.486692 -22.144554 -0.000003 0.000000 -0.000002 -0.000001 -0.000005 0.000001 0.000000 -0.000001 -0.000001 0.000000 0.000002 -0.000002 9.739395 26.500424 -21.721349 13.314299 49.777968 -10.884059 0.000096 87.300596 -0.000140 -82.763444 -13.030871 18.655760 -0.000000 -0.000000 -0.000001 -0.000000 0.000001 0.000001 -0.000000 -0.000001 -0.000000 0.000000 -0.000002 -0.000001 0.000002 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000003 0.000000 -0.000000 0.000002 -0.000000 -0.000000 -13.796179 -1.366396 -0.139729 94.415631 -3.599562 -3.771690 63.943671 0.434808 -5.407905 0.000010 -0.000026 0.000043 -0.000001 -0.000000 -0.000000 0.000009 -0.000025 0.000045 0.000001 0.000003 0.000000 -0.000000 0.000002 0.000136 -13.571366 1.255730 0.179894 94.231325 -3.458762 -3.895486 64.134172 2.549980 -5.522285 -0.000009 0.000020 -0.000033 -0.000001 -0.000000 0.000000 -0.000010 0.000019 -0.000032 0.000000 0.000001 0.000000 0.000001 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.603014 7.920051 6.405492 -0.000001 -0.000001 17.924670 -0.297162 -1.272163 -15.127438 -0.055323 0.598391 -18.136838 19.243522 0.036449 -0.071517 39.117897 -7.330731 0.000002 0.000023 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000002 -0.000002 0.000000 -17.360251 -13.360312 21.567530 -12.322636 -53.795082 0.237035 -0.000015 -77.773329 -0.000030 -90.403776 12.690425 -22.178575 -0.000002 -0.000003 0.000000 0.000001 0.000001 0.000001 -0.000001 -0.000002 -0.000001 0.000001 0.000001 -0.000001 10.238136 26.845309 -22.216502 13.809692 49.911420 -11.966378 0.000141 88.060960 -0.000189 -83.579188 -13.023441 18.780051 0.000001 0.000004 -0.000000 0.000001 0.000001 0.000001 -0.000001 -0.000000 0.000000 -0.000002 0.000002 0.000000 0.000001 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 0.000002 -0.000001 -0.000000 -13.930080 -1.379422 -0.142691 95.224107 -3.649641 -3.770576 64.754032 0.825954 -5.478057 0.000009 -0.000026 0.000047 -0.000000 -0.000000 -0.000000 0.000009 -0.000028 0.000048 0.000001 0.000001 -0.000000 0.000000 0.000003 0.000136 -13.701451 1.267497 0.183048 95.038483 -3.508806 -3.896257 64.869851 2.427511 -5.755743 -0.000016 0.000019 -0.000032 -0.000002 0.000000 0.000000 -0.000017 0.000017 -0.000031 0.000000 0.000001 0.000001 -0.000001 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 6.427008 -0.000001 -0.000001 18.267472 -0.306676 -1.295383 -15.176755 -0.055761 0.600307 -18.241900 19.312145 -0.005607 -0.106232 39.243702 -7.343457 0.000003 0.000018 -179.999991 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 0.000000 0.000000 -0.000000 -17.397641 -13.467812 21.622673 -12.173119 -53.942652 0.593892 -0.000023 -78.008567 -0.000012 -90.668876 12.760272 -22.189580 -0.000001 -0.000003 -0.000002 0.000003 0.000002 -0.000000 -0.000001 -0.000001 0.000002 -0.000001 0.000000 0.000001 10.653656 26.913309 -22.567375 13.980522 49.955737 -12.338072 0.000039 88.321395 -0.000124 -83.915636 -12.900645 18.945729 -0.000000 -0.000000 -0.000001 -0.000000 -0.000001 -0.000000 0.000002 0.000000 0.000000 -0.000000 -0.000001 -0.000001 -0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000001 0.000000 -0.000001 -0.000000 0.000000 -13.977470 -1.384030 -0.143751 95.500873 -3.666780 -3.770031 65.211859 1.289493 -5.524522 0.000014 -0.000027 0.000050 -0.000001 -0.000000 0.000000 0.000013 -0.000028 0.000051 0.000001 0.000001 0.000000 0.000001 0.000003 0.000136 -13.746159 1.271528 0.184142 95.314791 -3.525937 -3.896358 65.240041 2.292975 -5.974295 -0.000010 0.000019 -0.000032 0.000001 0.000000 -0.000000 -0.000009 0.000018 -0.000031 0.000001 0.000001 0.000000 0.000002 0.000002 -0.000099 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -19.670601 7.945948 6.339260 0.006938 0.311401 18.344976 -0.325047 -1.648091 -15.176757 -0.055761 0.600307 -18.218037 19.321468 -0.071658 -0.106232 39.243702 -7.343460 0.000004 0.000018 -179.999991 0.000001 -0.000002 0.000001 0.000001 -0.000002 0.000001 0.000001 -0.000002 0.000001 0.000001 -0.000001 -0.000000 -17.397643 -13.467815 21.622673 -12.173115 -53.942642 0.593891 -0.000031 -78.008567 -0.000016 -90.668876 12.760268 -22.189577 -0.000002 0.000005 0.000001 0.000001 -0.000002 0.000002 -0.000001 0.000000 0.000001 -0.000001 0.000002 -0.000002 11.024400 26.832326 -22.834033 13.980521 49.955734 -12.338068 0.000081 88.302325 -0.000123 -83.989948 -12.726649 19.159487 -0.000001 0.000003 0.000002 -0.000002 -0.000001 0.000002 0.000002 -0.000001 0.000000 0.000001 -0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -13.888155 -1.366537 -0.489479 95.500873 -3.666779 -3.770031 65.469160 1.780270 -5.545077 0.000007 -0.000024 0.000045 0.000002 0.000000 0.000000 0.000006 -0.000024 0.000044 0.000001 0.000001 0.000000 -0.000001 0.000003 0.000136 -13.655079 1.268625 -0.028850 95.314791 -3.525937 -3.896359 65.406602 2.144349 -6.180046 -0.000009 0.000019 -0.000032 -0.000001 -0.000000 -0.000001 -0.000009 0.000019 -0.000034 0.000001 0.000001 -0.000000 0.000001 0.000002 -0.000099 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 6.251457 0.013400 0.622884 18.422385 -0.343901 -2.000874 -15.176757 -0.055760 0.600307 -18.170055 19.329471 -0.137808 -0.106233 39.243706 -7.343459 0.000003 0.000020 -179.999991 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 0.000001 -0.000003 -0.000000 -17.397639 -13.467817 21.622676 -12.173117 -53.942642 0.593889 -0.000031 -78.008574 -0.000018 -90.668876 12.760270 -22.189577 0.000001 0.000003 0.000000 0.000003 0.000001 0.000001 -0.000002 -0.000001 0.000001 -0.000000 -0.000001 0.000001 11.395702 26.741639 -23.087008 13.980519 49.955734 -12.338079 0.000093 88.246823 -0.000133 -84.040410 -12.571417 19.423038 -0.000000 -0.000001 0.000001 -0.000001 0.000000 -0.000002 0.000002 -0.000000 0.000000 -0.000001 0.000002 -0.000002 -0.000001 0.000000 -0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000000 -0.000000 -13.798713 -1.349578 -0.835326 95.500873 -3.666777 -3.770031 65.693989 2.249817 -5.541668 0.000010 -0.000020 0.000036 -0.000003 -0.000000 -0.000000 0.000013 -0.000021 0.000038 0.000000 0.000001 0.000000 0.000001 0.000002 0.000138 -13.563997 1.265384 -0.241860 95.314791 -3.525938 -3.896358 65.547898 1.979626 -6.375102 -0.000010 0.000023 -0.000043 0.000001 -0.000000 0.000000 -0.000006 0.000023 -0.000043 0.000000 0.000000 0.000000 0.000001 0.000002 -0.000102 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 6.163602 0.019387 0.934440 18.499694 -0.363235 -2.353724 -15.176759 -0.055760 0.600307 -18.099711 19.336184 -0.203895 -0.106233 39.243712 -7.343459 0.000004 0.000020 -179.999991 0.000000 -0.000001 0.000002 0.000000 -0.000001 0.000002 0.000000 -0.000001 0.000002 0.000000 -0.000001 0.000000 -17.397639 -13.467818 21.622676 -12.173119 -53.942645 0.593892 -0.000027 -78.008574 -0.000018 -90.668876 12.760272 -22.189580 -0.000001 0.000003 -0.000001 0.000003 -0.000000 -0.000000 -0.000000 -0.000002 0.000001 -0.000001 0.000000 -0.000002 11.766521 26.642118 -23.326462 13.980520 49.955737 -12.338071 0.000055 88.157532 -0.000086 -84.068618 -12.434021 19.732300 -0.000000 0.000004 -0.000000 -0.000001 0.000000 -0.000003 -0.000001 0.000000 0.000000 -0.000002 0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 0.000000 -13.709146 -1.333155 -1.181287 95.500873 -3.666779 -3.770031 65.887918 2.698801 -5.515615 0.000009 -0.000018 0.000033 -0.000002 0.000000 0.000000 0.000008 -0.000019 0.000033 0.000001 0.000001 -0.000000 0.000001 0.000003 0.000137 -13.472924 1.261804 -0.454887 95.314791 -3.525937 -3.896359 65.665357 1.800403 -6.559807 -0.000015 0.000025 -0.000043 0.000002 -0.000000 0.000000 -0.000013 0.000025 -0.000046 0.000001 0.000001 -0.000000 0.000001 0.000002 -0.000100 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 6.075700 0.024897 1.246066 18.576906 -0.383049 -2.706633 -15.176757 -0.055760 0.600307 -18.008745 19.341636 -0.269758 -0.106233 39.243712 -7.343458 0.000003 0.000020 -179.999991 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000001 -0.000001 -0.000000 -17.397641 -13.467812 21.622673 -12.173118 -53.942648 0.593889 -0.000019 -78.008567 -0.000012 -90.668876 12.760272 -22.189577 0.000003 0.000003 0.000000 0.000001 0.000001 0.000001 -0.000001 0.000002 0.000002 0.000000 0.000002 -0.000003 12.135832 26.534660 -23.552574 13.980519 49.955734 -12.338072 0.000027 88.036992 -0.000131 -84.076111 -12.313472 20.083224 -0.000000 -0.000001 -0.000001 -0.000000 -0.000000 -0.000003 -0.000002 0.000000 -0.000001 -0.000000 0.000002 -0.000001 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000003 0.000000 0.000000 -0.000003 0.000000 -0.000000 -13.619460 -1.317269 -1.527352 95.500873 -3.666777 -3.770032 66.052492 3.127804 -5.468284 0.000009 -0.000013 0.000023 0.000002 -0.000000 0.000000 0.000009 -0.000013 0.000025 0.000001 0.000001 -0.000000 0.000001 0.000003 0.000138 -13.381855 1.257886 -0.667929 95.314784 -3.525937 -3.896360 65.760324 1.608255 -6.734529 -0.000011 0.000021 -0.000037 0.000002 -0.000000 -0.000000 -0.000010 0.000021 -0.000039 0.000001 0.000001 0.000001 -0.000000 0.000002 -0.000100 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000
-0.000000 -19.670601 7.945948 5.987752 0.029929 1.557754 18.654012 -0.403344 -3.059594 -15.176759 -0.055760 0.600307 -17.898914 19.345877 -0.335235 -0.106233 39.243709 -7.343458 0.000003 0.000020 -179.999991 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000001 -0.000001 -0.000000 -17.397641 -13.467816 21.622675 -12.173116 -53.942652 0.593889 -0.000039 -78.008567 -0.000018 -90.668883 12.760270 -22.189577 -0.000001 0.000001 0.000001 -0.000001 0.000000 -0.000000 -0.000001 -0.000000 0.000001 -0.000000 -0.000001 -0.000002 12.502642 26.420155 -23.765551 13.980526 49.955741 -12.338072 0.000042 87.887855 -0.000098 -84.064377 -12.208739 20.471750 0.000000 -0.000000 -0.000002 0.000001 0.000001 0.000001 0.000003 -0.000001 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000001 0.000000 -13.529662 -1.301922 -1.873514 95.500873 -3.666779 -3.770031 66.189266 3.537328 -5.401063 0.000008 -0.000010 0.000016 0.000001 0.000000 -0.000000 0.000007 -0.000010 0.000016 0.000001 0.000001 0.000000 -0.000000 0.000003 0.000136 -13.290793 1.253628 -0.880982 95.314791 -3.525938 -3.896360 65.834213 1.404714 -6.899618 -0.000019 0.000025 -0.000048 0.000004 0.000001 0.000000 -0.000017 0.000027 -0.000048 0.000000 0.000002 0.000000 0.000001 0.000002 -0.000100 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000
-0.000000 -19.670601 7.945948 5.899764 0.034484 1.869499 18.730998 -0.424118 -3.412597 -15.176754 -0.055760 0.600307 -17.771966 19.348944 -0.400158 -0.106233 39.243712 -7.343457 0.000003 0.000020 -179.999991 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 -0.000000 -0.000000 -17.397643 -13.467816 21.622675 -12.173120 -53.942648 0.593892 -0.000019 -78.008574 -0.000014 -90.668876 12.760274 -22.189577 0.000002 -0.000000 -0.000002 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000001 -0.000000 0.000000 -0.000001 12.865972 26.299512 -23.965623 13.980526 49.955737 -12.338071 0.000039 87.712681 -0.000123 -84.034898 -12.118765 20.893854 -0.000000 -0.000003 0.000001 -0.000000 0.000001 -0.000003 0.000007 -0.000000 -0.000001 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 -13.439759 -1.287115 -2.219768 95.500873 -3.666779 -3.770031 66.299813 3.927821 -5.315383 -0.000003 -0.000010 0.000017 -0.000000 -0.000000 0.000000 -0.000002 -0.000010 0.000019 0.000000 0.000000 -0.000000 0.000000 0.000002 0.000137 -13.199741 1.249031 -1.094046 95.314784 -3.525937 -3.896358 65.888369 1.191292 -7.055424 -0.000010 0.000028 -0.000048 0.000004 0.000001 0.000000 -0.000010 0.000027 -0.000051 0.000001 0.000001 -0.000001 0.000002 0.000002 -0.000100 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000
-0.000000 -19.670601 7.945948 5.811742 0.038560 2.181296 18.807875 -0.445369 -3.765638 -15.176757 -0.055760 0.600307 -17.629652 19.350891 -0.464363 -0.106233 39.243716 -7.343459 0.000003 0.000022 -179.999991 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000001 -0.000002 -0.000000 -17.397643 -13.467815 21.622678 -12.173114 -53.942648 0.593893 -0.000023 -78.008567 -0.000018 -90.668876 12.760270 -22.189580 0.000001 -0.000002 -0.000003 0.000003 -0.000000 0.000001 -0.000001 0.000002 0.000001 0.000003 0.000001 -0.000001 13.224844 26.173599 -24.153038 13.980521 49.955737 -12.338071 0.000006 87.514080 -0.000073 -83.989136 -12.042500 21.345516 -0.000000 0.000002 -0.000000 -0.000001 0.000000 -0.000001 0.000004 -0.000001 0.000000 -0.000000 0.000004 -0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000004 0.000000 0.000000 -0.000004 0.000000 -0.000000 -13.349748 -1.272849 -2.566101 95.500873 -3.666778 -3.770031 66.385682 4.299668 -5.212712 0.000001 -0.000005 0.000008 -0.000001 -0.000000 -0.000000 -0.000001 -0.000005 0.000010 0.000001 -0.000001 -0.000000 -0.000000 0.000002 0.000137 -13.108696 1.244096 -1.307117 95.314791 -3.525938 -3.896359 65.924207 0.969499 -7.202291 -0.000020 0.000029 -0.000055 0.000005 0.000000 -0.000000 -0.000018 0.000030 -0.000055 0.000001 0.000001 0.000000 0.000001 0.000002 -0.000100 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.723687 0.042158 2.493139 18.884631 -0.467096 -4.118708 -15.176755 -0.055760 0.600307 -17.473724 19.351765 -0.527681 -0.106233 39.243712 -7.343460 0.000002 0.000020 -179.999991 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000001 -0.000000 -17.397643 -13.467812 21.622673 -12.173117 -53.942645 0.593891 -0.000027 -78.008567 -0.000020 -90.668876 12.760271 -22.189577 0.000000 0.000001 0.000001 -0.000001 -0.000002 0.000002 -0.000001 -0.000002 0.000001 0.000002 0.000001 -0.000002 13.578330 26.043342 -24.328077 13.980520 49.955737 -12.338072 0.000069 87.294660 -0.000103 -83.928524 -11.978862 21.822721 -0.000001 0.000000 -0.000000 -0.000000 0.000001 -0.000002 0.000002 -0.000001 -0.000001 -0.000001 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -13.259642 -1.259124 -2.912512 95.500873 -3.666778 -3.770031 66.448479 4.653206 -5.094551 0.000006 -0.000002 0.000003 0.000000 0.000000 0.000000 0.000006 -0.000001 0.000002 -0.000000 -0.000000 -0.000000 0.000001 0.000002 0.000138 -13.017666 1.238821 -1.520192 95.314791 -3.525938 -3.896360 65.943038 0.740785 -7.340562 -0.000015 0.000031 -0.000057 0.000003 0.000001 0.000000 -0.000014 0.000032 -0.000057 0.000001 0.000002 -0.000000 0.000000 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.635603 0.045276 2.805022 18.961261 -0.489300 -4.471798 -15.176755 -0.055761 0.600307 -17.305918 19.351630 -0.589946 -0.106233 39.243709 -7.343459 0.000003 0.000020 -179.999991 0.000001 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000000 0.000002 -0.000000 -17.397641 -13.467813 21.622678 -12.173123 -53.942652 0.593896 -0.000027 -78.008567 -0.000010 -90.668876 12.760274 -22.189577 -0.000001 -0.000001 -0.000001 0.000002 0.000000 0.000000 -0.000001 0.000001 0.000003 0.000000 0.000000 0.000000 13.925478 25.909621 -24.491025 13.980520 49.955734 -12.338072 0.000022 87.057011 -0.000070 -83.854478 -11.926789 22.321441 -0.000000 0.000003 0.000001 -0.000000 -0.000000 -0.000001 0.000003 -0.000000 -0.000000 -0.000003 -0.000001 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000001 -0.000001 -0.000000 0.000001 -0.000001 -0.000000 -13.169439 -1.245943 -3.258987 95.500873 -3.666779 -3.770032 66.489815 4.988744 -4.962437 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000001 -0.000001 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000003 0.000137 -12.926656 1.233208 -1.733271 95.314791 -3.525938 -3.896358 65.946296 0.506640 -7.470559 -0.000016 0.000032 -0.000055 0.000004 -0.000001 0.000000 -0.000015 0.000031 -0.000058 0.000001 0.000002 -0.000001 -0.000001 0.000002 -0.000098 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.547493 0.047916 3.116939 19.037773 -0.511979 -4.824902 -15.176754 -0.055761 0.600307 -17.127990 19.350536 -0.650989 -0.106233 39.243712 -7.343459 0.000002 0.000023 -179.999991 -0.000000 0.000003 0.000002 -0.000000 0.000003 0.000002 -0.000000 0.000003 0.000002 0.000000 0.000000 -0.000000 -17.397638 -13.467813 21.622678 -12.173118 -53.942645 0.593891 -0.000015 -78.008567 -0.000012 -90.668876 12.760271 -22.189574 -0.000000 0.000000 0.000001 0.000002 0.000002 -0.000000 -0.000002 0.000001 0.000002 0.000000 0.000001 -0.000002 14.265385 25.773338 -24.642206 13.980524 49.955737 -12.338072 0.000013 86.803734 -0.000056 -83.768432 -11.885234 22.837685 0.000001 0.000005 -0.000000 0.000001 0.000001 -0.000003 0.000002 -0.000000 0.000000 0.000001 -0.000000 -0.000002 -0.000003 0.000000 0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 0.000000 -0.000001 0.000000 -0.000000 0.000004 -0.000000 0.000000 0.000004 -0.000000 -0.000000 -13.079153 -1.233306 -3.605525 95.500873 -3.666779 -3.770031 66.511317 5.306528 -4.817950 -0.000004 0.000005 -0.000011 0.000001 0.000000 0.000000 -0.000008 0.000005 -0.000009 0.000000 -0.000001 -0.000000 0.000001 0.000003 0.000137 -12.835659 1.227256 -1.946351 95.314791 -3.525937 -3.896360 65.935299 0.268509 -7.592591 -0.000016 0.000036 -0.000062 0.000002 0.000000 0.000001 -0.000015 0.000035 -0.000063 0.000000 0.000002 -0.000000 0.000001 0.000002 -0.000098 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 5.459367 0.050076 3.428885 19.114138 -0.535130 -5.178011 -15.176755 -0.055760 0.600307 -16.941711 19.348572 -0.710642 -0.106233 39.243712 -7.343457 0.000002 0.000023 -179.999991 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 0.000000 -0.000002 0.000001 -17.397636 -13.467811 21.622673 -12.173118 -53.942648 0.593891 -0.000027 -78.008567 -0.000006 -90.668876 12.760270 -22.189580 -0.000000 -0.000001 0.000001 0.000002 -0.000001 0.000001 -0.000001 0.000001 0.000003 0.000000 0.000001 -0.000002 14.597149 25.635389 -24.781960 13.980520 49.955734 -12.338071 0.000033 86.537418 -0.000059 -83.671819 -11.853163 23.367431 0.000001 0.000004 -0.000000 -0.000000 0.000001 -0.000002 0.000000 0.000000 0.000000 -0.000003 0.000001 -0.000001 -0.000001 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 -0.000001 -0.000000 -0.000001 -0.000000 0.000000 -12.988781 -1.221214 -3.952114 95.500873 -3.666779 -3.770031 66.514602 5.606807 -4.662689 -0.000004 0.000006 -0.000011 0.000000 -0.000000 0.000000 -0.000007 0.000006 -0.000011 -0.000000 -0.000001 -0.000000 -0.000001 0.000002 0.000137 -12.744682 1.220966 -2.159429 95.314791 -3.525938 -3.896359 65.911421 0.027846 -7.706964 -0.000014 0.000035 -0.000057 0.000005 0.000001 0.000001 -0.000013 0.000034 -0.000063 0.000001 0.000001 -0.000000 0.000001 0.000002 -0.000100 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.371222 0.051756 3.740854 19.190364 -0.558753 -5.531121 -15.176759 -0.055761 0.600307 -16.748816 19.345799 -0.768736 -0.106233 39.243706 -7.343459 0.000002 0.000023 -179.999991 -0.000001 0.000002 0.000001 -0.000001 0.000002 0.000001 -0.000001 0.000002 0.000001 -0.000000 -0.000001 0.000000 -17.397641 -13.467814 21.622675 -12.173113 -53.942645 0.593895 -0.000031 -78.008567 -0.000022 -90.668876 12.760272 -22.189574 0.000001 0.000001 0.000001 0.000003 -0.000001 0.000001 -0.000001 -0.000002 0.000000 0.000001 -0.000000 0.000001 14.919870 25.496657 -24.910615 13.980519 49.955737 -12.338074 0.000043 86.260692 -0.000054 -83.566080 -11.829591 23.906683 0.000000 0.000001 0.000001 -0.000000 0.000001 -0.000001 0.000004 0.000000 0.000000 -0.000000 0.000002 -0.000001 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000004 -0.000001 -0.000000 -0.000003 -0.000001 -0.000000 -12.898327 -1.209668 -4.298747 95.500873 -3.666779 -3.770031 66.501345 5.889790 -4.498317 -0.000010 0.000013 -0.000024 -0.000001 -0.000000 0.000000 -0.000012 0.000013 -0.000024 -0.000000 -0.000002 -0.000000 0.000001 0.000002 0.000137 -12.653725 1.214338 -2.372502 95.314791 -3.525938 -3.896359 65.876041 -0.213912 -7.813943 -0.000021 0.000035 -0.000062 0.000006 -0.000000 0.000000 -0.000020 0.000035 -0.000064 0.000002 0.000002 -0.000001 0.000002 0.000002 -0.000099 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 5.283066 0.052956 4.052840 19.266458 -0.582849 -5.884219 -15.176754 -0.055760 0.600307 -16.551051 19.342298 -0.825103 -0.106233 39.243712 -7.343459 0.000002 0.000023 -179.999991 0.000000 -0.000001 0.000001 0.000000 -0.000001 0.000001 0.000000 -0.000001 0.000001 -0.000001 0.000003 0.000001 -17.397641 -13.467815 21.622676 -12.173113 -53.942648 0.593891 -0.000035 -78.008567 -0.000020 -90.668876 12.760269 -22.189577 0.000002 0.000003 0.000003 0.000002 -0.000001 0.000002 -0.000001 0.000000 0.000000 0.000002 0.000002 -0.000002 15.232667 25.358040 -25.028571 13.980515 49.955737 -12.338074 0.000040 85.976140 -0.000057 -83.452665 -11.813533 24.451444 -0.000001 -0.000000 -0.000000 0.000000 0.000000 -0.000004 0.000002 -0.000000 -0.000000 -0.000002 -0.000001 -0.000001 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000002 -0.000000 0.000000 -0.000003 -0.000001 0.000000 -12.807805 -1.198669 -4.645414 95.500873 -3.666781 -3.770032 66.473211 6.155673 -4.326507 -0.000008 0.000015 -0.000026 -0.000001 -0.000000 0.000000 -0.000008 0.000015 -0.000026 -0.000000 -0.000002 -0.000000 0.000001 0.000003 0.000136 -12.562798 1.207371 -2.585569 95.314791 -3.525938 -3.896359 65.830504 -0.455328 -7.913799 -0.000020 0.000036 -0.000066 0.000004 0.000000 -0.000001 -0.000019 0.000036 -0.000066 0.000001 0.000002 -0.000000 -0.000000 0.000002 -0.000099 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 5.194902 0.053676 4.364837 19.342402 -0.607412 -6.237306 -15.176759 -0.055760 0.600307 -16.350175 19.338154 -0.879578 -0.106233 39.243716 -7.343458 0.000002 0.000021 -179.999991 -0.000000 -0.000002 0.000001 -0.000000 -0.000002 0.000001 -0.000000 -0.000002 0.000001 -0.000000 0.000002 0.000000 -17.397641 -13.467814 21.622678 -12.173116 -53.942648 0.593894 -0.000023 -78.008567 -0.000030 -90.668876 12.760276 -22.189579 0.000002 -0.000003 0.000001 0.000000 0.000000 -0.000001 -0.000000 -0.000001 -0.000002 0.000000 0.000001 -0.000002 15.534664 25.220409 -25.136199 13.980520 49.955737 -12.338075 0.000009 85.686369 -0.000058 -83.333007 -11.804077 24.997695 0.000002 0.000010 0.000001 -0.000000 -0.000000 -0.000002 0.000002 -0.000000 -0.000001 -0.000000 0.000002 -0.000001 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000002 -0.000001 0.000000 -0.000001 -0.000001 0.000000 -12.717212 -1.188217 -4.992116 95.500873 -3.666779 -3.770032 66.431950 6.404648 -4.148994 -0.000013 0.000015 -0.000030 -0.000000 0.000000 -0.000000 -0.000015 0.000016 -0.000029 -0.000001 -0.000001 -0.000000 -0.000001 0.000003 0.000136 -12.471888 1.200066 -2.798630 95.314791 -3.525937 -3.896359 65.776190 -0.694951 -8.006776 -0.000021 0.000041 -0.000067 0.000005 0.000000 -0.000000 -0.000020 0.000039 -0.000069 0.000001 0.000002 0.000000 0.000002 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.106734 0.053916 4.676840 19.418195 -0.632445 -6.590366 -15.176759 -0.055761 0.600307 -16.147935 19.333462 -0.931995 -0.106233 39.243712 -7.343457 0.000002 0.000021 -179.999991 0.000000 -0.000002 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000002 -0.000001 0.000001 0.000003 0.000000 -17.397641 -13.467816 21.622678 -12.173120 -53.942645 0.593888 -0.000027 -78.008567 -0.000014 -90.668876 12.760272 -22.189574 0.000000 -0.000003 0.000000 0.000003 0.000002 -0.000001 0.000000 0.000000 0.000001 0.000001 0.000000 -0.000002 15.825002 25.084640 -25.233908 13.980517 49.955727 -12.338071 0.000019 85.394003 -0.000038 -83.208622 -11.800323 25.541458 0.000001 0.000009 0.000003 -0.000000 -0.000001 -0.000002 0.000001 0.000000 0.000000 -0.000000 -0.000001 -0.000001 0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000000 0.000000 -12.626556 -1.178313 -5.338837 95.500873 -3.666779 -3.770032 66.379207 6.636882 -3.967522 -0.000009 0.000018 -0.000033 -0.000002 0.000000 -0.000000 -0.000010 0.000018 -0.000032 -0.000001 -0.000002 -0.000000 0.000001 0.000003 0.000137 -12.381007 1.192423 -3.011678 95.314791 -3.525937 -3.896361 65.714445 -0.931352 -8.093101 -0.000025 0.000038 -0.000068 0.000002 0.000000 0.000001 -0.000023 0.000040 -0.000071 0.000001 0.000002 0.000001 -0.000001 0.000002 -0.000098 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.018565 0.053676 4.988843 19.493835 -0.657942 -6.943392 -15.176757 -0.055760 0.600307 -15.946082 19.328298 -0.982185 -0.106232 39.243712 -7.343459 0.000002 0.000022 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000001 -0.000000 -17.397638 -13.467817 21.622676 -12.173117 -53.942642 0.593887 -0.000027 -78.008567 -0.000014 -90.668876 12.760273 -22.189572 -0.000001 0.000001 0.000000 0.000002 0.000002 -0.000000 -0.000001 -0.000000 0.000002 0.000001 0.000000 -0.000002 16.102811 24.951612 -25.322108 13.980520 49.955734 -12.338071 0.000028 85.101637 -0.000031 -83.080973 -11.801441 26.078743 0.000000 0.000002 0.000001 0.000001 0.000000 -0.000000 0.000003 0.000000 0.000001 -0.000002 0.000002 -0.000001 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -12.535847 -1.168958 -5.685572 95.500873 -3.666779 -3.770032 66.316786 6.852557 -3.783884 -0.000010 0.000019 -0.000037 -0.000004 -0.000000 -0.000000 -0.000012 0.000020 -0.000036 -0.000001 -0.000002 -0.000000 -0.000002 0.000003 0.000136 -12.290159 1.184442 -3.224714 95.314791 -3.525937 -3.896360 65.646676 -1.163087 -8.172972 -0.000019 0.000037 -0.000067 0.000003 0.000000 0.000000 -0.000020 0.000038 -0.000067 0.000002 0.000003 0.000000 -0.000000 0.000002 -0.000098 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.930401 0.052956 5.300842 19.569308 -0.683905 -7.296379 -15.176757 -0.055761 0.600307 -15.746366 19.322766 -1.029986 -0.106233 39.243709 -7.343458 0.000002 0.000022 -179.999991 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000002 -0.000000 0.000000 0.000000 -17.397638 -13.467814 21.622673 -12.173119 -53.942645 0.593892 -0.000031 -78.008574 -0.000026 -90.668876 12.760276 -22.189580 0.000000 -0.000004 -0.000002 0.000002 0.000002 -0.000002 -0.000001 0.000000 -0.000001 -0.000001 0.000001 -0.000002 16.367249 24.822174 -25.401231 13.980521 49.955737 -12.338068 0.000027 84.811880 -0.000043 -82.951589 -11.806608 26.605562 0.000001 0.000006 -0.000003 -0.000000 0.000001 -0.000002 0.000004 0.000001 -0.000000 -0.000000 0.000005 -0.000002 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 0.000000 0.000000 -0.000004 -0.000001 0.000000 -0.000004 -0.000001 0.000000 -12.445079 -1.160152 -6.032312 95.500873 -3.666780 -3.770031 66.246415 7.051860 -3.599902 -0.000010 0.000024 -0.000044 -0.000002 -0.000000 0.000000 -0.000013 0.000024 -0.000043 -0.000001 -0.000002 -0.000000 0.000001 0.000002 0.000137 -12.199340 1.176124 -3.437733 95.314791 -3.525937 -3.896360 65.574228 -1.388714 -8.246575 -0.000020 0.000042 -0.000069 0.000003 -0.000000 -0.000001 -0.000021 0.000040 -0.000070 0.000001 0.000002 0.000000 -0.000000 0.000002 -0.000098 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.842246 0.051756 5.612828 19.644623 -0.710332 -7.649320 -15.176755 -0.055760 0.600307 -15.550541 19.316969 -1.075235 -0.106234 39.243712 -7.343458 0.000002 0.000022 -179.999991 -0.000001 -0.000001 -0.000000 -0.000001 -0.000001 -0.000000 -0.000001 -0.000001 0.000000 -0.000001 -0.000000 0.000000 -17.397639 -13.467812 21.622671 -12.173115 -53.942652 0.593891 -0.000035 -78.008567 -0.000022 -90.668876 12.760273 -22.189577 -0.000001 0.000000 0.000000 0.000000 0.000002 -0.000000 -0.000001 0.000000 -0.000000 0.000002 0.000001 -0.000002 16.617435 24.697179 -25.471698 13.980521 49.955737 -12.338073 0.000003 84.527334 -0.000041 -82.821938 -11.815093 27.117946 0.000002 0.000003 0.000000 -0.000001 0.000000 -0.000003 0.000002 0.000001 -0.000001 -0.000002 0.000002 -0.000001 -0.000001 0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 0.000000 0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000000 -0.000000 -12.354266 -1.151895 -6.379053 95.500873 -3.666778 -3.770031 66.169896 7.234963 -3.417433 -0.000018 0.000027 -0.000049 0.000001 -0.000000 0.000000 -0.000019 0.000028 -0.000049 -0.000001 -0.000004 -0.000000 0.000000 0.000002 0.000137 -12.108553 1.167468 -3.650738 95.314791 -3.525937 -3.896360 65.498482 -1.606784 -8.314086 -0.000025 0.000047 -0.000083 0.000003 0.000000 0.000001 -0.000022 0.000046 -0.000085 0.000001 0.000002 0.000000 0.000002 0.000002 -0.000098 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670599 7.945948 4.754100 0.050076 5.924795 19.719769 -0.737222 -8.002210 -15.176752 -0.055759 0.600307 -15.360348 19.311016 -1.117771 -0.106233 39.243712 -7.343458 0.000002 0.000024 -179.999991 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000001 0.000001 0.000000 -17.397641 -13.467816 21.622675 -12.173113 -53.942645 0.593889 -0.000035 -78.008567 -0.000024 -90.668883 12.760271 -22.189580 0.000001 -0.000000 0.000001 0.000003 0.000003 0.000001 -0.000002 -0.000001 -0.000000 0.000001 -0.000000 -0.000004 16.852559 24.577509 -25.533981 13.980524 49.955737 -12.338079 0.000007 84.250602 -0.000035 -82.693599 -11.826200 27.611924 0.000001 0.000004 -0.000000 -0.000000 0.000000 -0.000001 0.000003 -0.000000 0.000000 -0.000002 0.000002 -0.000001 0.000001 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 -12.263411 -1.144189 -6.725784 95.500873 -3.666780 -3.770031 66.088986 7.402073 -3.238351 -0.000017 0.000028 -0.000053 -0.000002 0.000000 0.000000 -0.000020 0.000029 -0.000051 -0.000001 -0.000002 -0.000000 -0.000000 0.000003 0.000136 -12.017804 1.158475 -3.863720 95.314791 -3.525937 -3.896360 65.420809 -1.815844 -8.375643 -0.000019 0.000043 -0.000078 0.000003 -0.000001 -0.000001 -0.000020 0.000044 -0.000080 0.000002 0.000002 0.000001 -0.000001 0.000002 -0.000097 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.665972 0.047916 6.236742 19.794737 -0.764569 -8.355031 -15.176755 -0.055760 0.600307 -15.177531 19.305000 -1.157433 -0.106234 39.243712 -7.343459 0.000002 0.000024 -179.999991 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 0.000001 0.000000 -17.397638 -13.467811 21.622676 -12.173121 -53.942648 0.593894 -0.000015 -78.008567 -0.000026 -90.668876 12.760276 -22.189577 -0.000001 -0.000000 0.000003 0.000001 0.000001 -0.000001 -0.000000 -0.000002 -0.000001 0.000002 0.000001 -0.000001 17.071749 24.463969 -25.588506 13.980519 49.955737 -12.338071 0.000023 83.984300 -0.000037 -82.568128 -11.839248 28.083550 0.000003 0.000000 -0.000002 0.000000 0.000001 -0.000004 0.000003 0.000000 -0.000000 -0.000003 0.000001 -0.000001 -0.000001 0.000001 -0.000000 -0.000002 0.000001 -0.000000 -0.000002 0.000001 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 -0.000001 0.000000 -0.000001 -0.000001 0.000000 -12.172516 -1.137034 -7.072497 95.500873 -3.666781 -3.770032 66.005521 7.553375 -3.064559 -0.000019 0.000033 -0.000060 0.000001 0.000000 0.000000 -0.000020 0.000033 -0.000060 -0.000001 -0.000002 -0.000000 0.000000 0.000002 0.000136 -11.927089 1.149145 -4.076681 95.314791 -3.525937 -3.896360 65.342623 -2.014446 -8.431373 -0.000023 0.000046 -0.000082 0.000004 0.000000 -0.000000 -0.000023 0.000044 -0.000085 0.000001 0.000002 0.000000 0.000000 0.000002 -0.000098 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 4.577865 0.045277 6.548659 19.869536 -0.792377 -8.707791 -15.176757 -0.055759 0.600307 -15.003848 19.299032 -1.194060 -0.106234 39.243712 -7.343457 0.000002 0.000026 -179.999991 0.000000 0.000002 0.000001 0.000000 0.000002 0.000001 0.000000 0.000002 0.000002 -0.000000 0.000002 0.000000 -17.397639 -13.467812 21.622673 -12.173117 -53.942645 0.593894 -0.000027 -78.008567 -0.000018 -90.668883 12.760271 -22.189574 0.000000 -0.000002 -0.000001 0.000004 0.000002 -0.000000 0.000000 -0.000001 0.000001 0.000001 -0.000000 -0.000002 17.274156 24.357404 -25.635725 13.980522 49.955737 -12.338072 0.000006 83.731016 -0.000031 -82.447063 -11.853626 28.528875 0.000001 0.000006 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 0.000000 -0.000002 0.000004 -0.000002 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000001 -0.000002 0.000001 -0.000001 -12.081590 -1.130428 -7.419187 95.500873 -3.666780 -3.770031 65.921325 7.689087 -2.897982 -0.000024 0.000036 -0.000066 0.000000 -0.000001 -0.000000 -0.000025 0.000035 -0.000067 -0.000002 -0.000004 -0.000000 -0.000000 0.000003 0.000136 -11.836421 1.139479 -4.289617 95.314791 -3.525936 -3.896361 65.265306 -2.201125 -8.481406 -0.000023 0.000046 -0.000083 0.000004 -0.000001 0.000000 -0.000023 0.000045 -0.000085 0.000001 0.000002 -0.000000 0.000000 0.000002 -0.000096 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.489782 0.042158 6.860541 19.944151 -0.820639 -9.060470 -15.176757 -0.055760 0.600307 -14.841040 19.293232 -1.227496 -0.106233 39.243709 -7.343457 0.000002 0.000024 -179.999991 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000001 -0.000001 -0.000002 0.000000 -17.397639 -13.467814 21.622676 -12.173120 -53.942645 0.593889 -0.000035 -78.008574 -0.000022 -90.668876 12.760270 -22.189580 -0.000001 -0.000001 -0.000001 0.000000 0.000001 0.000001 -0.000001 -0.000002 -0.000000 -0.000000 0.000000 -0.000000 17.458945 24.258650 -25.676121 13.980515 49.955734 -12.338069 0.000017 83.493359 -0.000034 -82.331988 -11.868739 28.943961 -0.000000 -0.000001 0.000000 -0.000000 0.000001 -0.000006 0.000003 0.000000 -0.000000 -0.000000 0.000002 -0.000001 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000001 0.000000 0.000000 -0.000000 -0.000000 -11.990631 -1.124373 -7.765846 95.500873 -3.666782 -3.770031 65.838208 7.809441 -2.740580 -0.000025 0.000038 -0.000073 -0.000000 -0.000001 -0.000000 -0.000027 0.000039 -0.000073 -0.000001 -0.000003 -0.000000 0.000000 0.000002 0.000135 -11.745787 1.129476 -4.502529 95.314791 -3.525937 -3.896360 65.190194 -2.374417 -8.525831 -0.000020 0.000051 -0.000089 0.000001 0.000001 0.000001 -0.000019 0.000050 -0.000093 0.000002 0.000002 -0.000001 0.000002 0.000002 -0.000098 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.401725 0.038560 7.172383 20.018578 -0.849358 -9.413067 -15.176755 -0.055759 0.600307 -14.690856 19.287703 -1.257582 -0.106233 39.243712 -7.343459 0.000002 0.000023 -179.999991 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000001 -0.000000 0.000003 -0.000000 -17.397639 -13.467816 21.622678 -12.173117 -53.942645 0.593891 -0.000023 -78.008567 -0.000016 -90.668876 12.760273 -22.189577 -0.000001 0.000001 0.000003 0.000003 0.000003 -0.000001 -0.000000 -0.000004 0.000001 0.000001 0.000001 -0.000002 17.625247 24.168522 -25.710116 13.980526 49.955730 -12.338063 0.000017 83.273940 -0.000036 -82.224454 -11.884039 29.324871 -0.000000 -0.000004 -0.000002 -0.000000 0.000000 -0.000003 0.000002 0.000001 -0.000001 -0.000001 -0.000001 0.000001 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000003 0.000000 0.000000 -0.000002 0.000000 0.000000 -11.899659 -1.118870 -8.112468 95.500873 -3.666782 -3.770031 65.758008 7.914656 -2.594298 -0.000026 0.000043 -0.000081 0.000002 -0.000001 -0.000000 -0.000024 0.000042 -0.000079 -0.000002 -0.000003 -0.000000 -0.000000 0.000003 0.000136 -11.655194 1.119137 -4.715407 95.314791 -3.525937 -3.896359 65.118764 -2.532854 -8.564745 -0.000027 0.000052 -0.000095 0.000003 -0.000001 0.000000 -0.000023 0.000053 -0.000093 0.000001 0.000003 -0.000000 0.000002 0.000002 -0.000098 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.313703 0.034484 7.484181 20.092815 -0.878528 -9.765570 -15.176757 -0.055760 0.600307 -14.555031 19.282563 -1.284162 -0.106233 39.243709 -7.343456 0.000002 0.000023 -179.999991 0.000000 -0.000001 -0.000001 0.000000 -0.000001 -0.000001 0.000000 -0.000001 0.000000 0.000000 0.000001 0.000001 -17.397636 -13.467817 21.622680 -12.173124 -53.942645 0.593889 -0.000031 -78.008574 -0.000014 -90.668883 12.760271 -22.189575 0.000002 -0.000001 0.000000 0.000001 0.000002 0.000001 0.000001 0.000001 0.000002 0.000000 0.000001 -0.000003 17.772212 24.087832 -25.738186 13.980522 49.955730 -12.338075 0.000020 83.075345 -0.000035 -82.126099 -11.898990 29.667705 0.000000 0.000003 -0.000001 -0.000000 0.000000 -0.000002 0.000000 0.000001 -0.000001 0.000001 0.000001 -0.000001 -0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000001 -0.000000 0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000004 -0.000000 -0.000000 -11.808665 -1.113918 -8.459035 95.500873 -3.666782 -3.770031 65.682596 8.004991 -2.461112 -0.000028 0.000044 -0.000082 0.000002 0.000000 0.000000 -0.000028 0.000043 -0.000080 -0.000002 -0.000003 -0.000000 -0.000000 0.000002 0.000135 -11.564651 1.108463 -4.928259 95.314791 -3.525937 -3.896361 65.052354 -2.674962 -8.598223 -0.000020 0.000053 -0.000094 0.000001 0.000000 0.000001 -0.000022 0.000052 -0.000096 0.000002 0.000004 0.000001 0.000000 0.000002 -0.000097 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 4.225715 0.029929 7.795926 20.166864 -0.908149 -10.117978 -15.176757 -0.055760 0.600307 -14.435326 19.277915 -1.307080 -0.106233 39.243716 -7.343458 0.000003 0.000022 -179.999991 0.000001 -0.000003 -0.000001 0.000001 -0.000003 -0.000001 0.000001 -0.000003 -0.000001 0.000000 0.000001 0.000000 -17.397643 -13.467813 21.622673 -12.173117 -53.942648 0.593894 -0.000003 -78.008567 -0.000014 -90.668883 12.760275 -22.189577 0.000001 0.000002 0.000003 0.000002 0.000001 0.000001 -0.000001 0.000000 0.000001 0.000001 0.000001 -0.000001 17.898982 24.017375 -25.760772 13.980528 49.955737 -12.338071 0.000019 82.900171 -0.000031 -82.038440 -11.913090 29.968534 0.000002 0.000003 -0.000003 -0.000001 -0.000001 0.000001 0.000003 -0.000000 0.000000 -0.000000 0.000004 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -11.717661 -1.109518 -8.805552 95.500873 -3.666783 -3.770032 65.613782 8.080693 -2.343008 -0.000032 0.000048 -0.000089 0.000001 -0.000000 -0.000000 -0.000035 0.000047 -0.000089 -0.000002 -0.000004 -0.000000 -0.000001 0.000003 0.000134 -11.474155 1.097453 -5.141076 95.314791 -3.525937 -3.896360 64.992358 -2.799268 -8.626350 -0.000029 0.000055 -0.000099 0.000002 -0.000000 0.000001 -0.000026 0.000053 -0.000102 0.000002 0.000003 0.000000 0.000001 0.000002 -0.000096 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001
-0.000000 -19.670601 7.945948 4.137767 0.024897 8.107614 20.240714 -0.938219 -10.470275 -15.176757 -0.055760 0.600307 -14.333466 19.273872 -1.326180 -0.106233 39.243712 -7.343457 0.000001 0.000022 -179.999991 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 0.000000 0.000001 -17.397636 -13.467813 21.622678 -12.173126 -53.942652 0.593884 -0.000035 -78.008567 -0.000018 -90.668876 12.760274 -22.189574 0.000002 -0.000002 0.000001 0.000003 0.000002 -0.000000 -0.000001 0.000001 0.000001 0.000000 0.000000 -0.000004 18.004679 23.957971 -25.778314 13.980521 49.955730 -12.338071 0.000006 82.751034 -0.000017 -81.963151 -11.925816 30.223454 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000004 0.000002 -0.000000 0.000001 0.000001 0.000001 -0.000002 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000005 0.000000 0.000000 0.000005 0.000001 0.000000 -11.626647 -1.105667 -9.152004 95.500873 -3.666784 -3.770032 65.553396 8.142036 -2.241961 -0.000026 0.000047 -0.000088 0.000001 0.000000 0.000000 -0.000027 0.000047 -0.000089 -0.000002 -0.000004 -0.000000 -0.000001 0.000002 0.000134 -11.383706 1.086108 -5.353855 95.314791 -3.525937 -3.896360 64.940182 -2.904294 -8.649186 -0.000027 0.000054 -0.000094 0.000002 0.000000 -0.000000 -0.000027 0.000053 -0.000093 0.000001 0.000003 0.000001 0.000001 0.000002 -0.000096 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001
-0.000000 -19.670601 7.945948 4.049863 0.019387 8.419239 20.314362 -0.968737 -10.822462 -15.176757 -0.055761 0.600307 -14.251208 19.270545 -1.341307 -0.106234 39.243712 -7.343458 0.000002 0.000023 -179.999991 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000001 -0.000001 0.000000 -17.397641 -13.467813 21.622675 -12.173121 -53.942652 0.593890 -0.000023 -78.008567 -0.000018 -90.668883 12.760274 -22.189580 0.000002 0.000001 0.000003 -0.000001 -0.000000 0.000001 -0.000001 -0.000001 0.000001 -0.000001 -0.000000 -0.000002 18.088450 23.910399 -25.791254 13.980521 49.955737 -12.338072 0.000022 82.630508 -0.000033 -81.901796 -11.936671 30.428547 -0.000000 -0.000003 0.000001 0.000000 -0.000001 0.000001 0.000004 0.000000 -0.000000 -0.000001 0.000001 -0.000002 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000001 0.000000 0.000000 -0.000001 0.000000 -11.535638 -1.102368 -9.498390 95.500873 -3.666786 -3.770033 65.503297 8.189282 -2.159952 -0.000027 0.000051 -0.000094 -0.000002 -0.000000 -0.000000 -0.000027 0.000050 -0.000090 -0.000002 -0.000004 -0.000000 0.000000 0.000003 0.000133 -11.293312 1.074428 -5.566598 95.314791 -3.525936 -3.896360 64.897186 -2.988553 -8.666801 -0.000029 0.000056 -0.000102 0.000004 0.000001 -0.000000 -0.000031 0.000058 -0.000101 0.000002 0.000003 0.000000 -0.000000 0.000002 -0.000096 -0.000001 0.000000 0.000001 -0.000001 0.000000 0.000001
-0.000000 -19.670601 7.945948 3.962010 0.013401 8.730798 20.387802 -0.999698 -11.174523 -15.176757 -0.055761 0.600307 -14.190291 19.268051 -1.352307 -0.106233 39.243709 -7.343457 0.000002 0.000023 -179.999991 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000000 0.000002 0.000000 -17.397638 -13.467811 21.622673 -12.173117 -53.942652 0.593889 -0.000023 -78.008567 -0.000022 -90.668883 12.760268 -22.189574 0.000001 0.000000 0.000001 0.000001 -0.000002 0.000002 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 18.149389 23.875452 -25.800000 13.980521 49.955730 -12.338069 0.000009 82.541211 -0.000023 -81.855992 -11.945124 30.579898 -0.000000 0.000000 -0.000003 -0.000001 -0.000001 -0.000002 -0.000000 -0.000000 0.000000 0.000001 -0.000001 -0.000002 0.000001 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 0.000000 0.000001 0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000002 -0.000001 -0.000000 -11.444627 -1.099620 -9.844693 95.500873 -3.666784 -3.770032 65.465294 8.222701 -2.098957 -0.000033 0.000052 -0.000097 0.000002 -0.000000 -0.000000 -0.000032 0.000053 -0.000098 -0.000002 -0.000003 -0.000000 0.000001 0.000002 0.000135 -11.202970 1.062414 -5.779301 95.314791 -3.525936 -3.896361 64.864797 -3.050570 -8.679275 -0.000025 0.000058 -0.000102 0.000001 -0.000001 0.000001 -0.000025 0.000058 -0.000103 0.000002 0.000004 0.000000 0.000001 0.000002 -0.000096 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 3.874207 0.006938 9.042280 20.461032 -1.031101 -11.526464 -15.176757 -0.055761 0.600307 -14.152463 19.266478 -1.359022 -0.106233 39.243716 -7.343457 0.000001 0.000026 -179.999991 -0.000000 0.000003 0.000000 -0.000000 0.000003 0.000000 -0.000000 0.000003 0.000000 -0.000000 0.000001 0.000000 -17.397641 -13.467814 21.622678 -12.173119 -53.942648 0.593890 -0.000023 -78.008567 -0.000026 -90.668883 12.760270 -22.189579 -0.000002 0.000000 0.000003 0.000000 -0.000003 0.000002 -0.000001 0.000002 -0.000001 0.000001 0.000001 -0.000002 18.186613 23.853910 -25.804960 13.980526 49.955737 -12.338072 0.000012 82.485702 -0.000026 -81.827326 -11.950635 30.673594 -0.000001 -0.000000 -0.000001 0.000000 0.000000 -0.000005 -0.000002 -0.000000 0.000000 0.000001 -0.000000 -0.000002 0.000001 0.000001 0.000000 -0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000001 -0.000001 0.000000 -11.353625 -1.097423 -10.190915 95.500873 -3.666785 -3.770032 65.441197 8.242557 -2.060935 -0.000036 0.000058 -0.000105 0.000001 0.000000 0.000000 -0.000037 0.000057 -0.000104 -0.000003 -0.000005 -0.000000 0.000000 0.000003 0.000133 -11.112678 1.050066 -5.991963 95.314791 -3.525936 -3.896361 64.844368 -3.088864 -8.686687 -0.000028 0.000061 -0.000106 0.000003 -0.000001 -0.000000 -0.000031 0.000060 -0.000109 0.000001 0.000003 0.000000 0.000000 0.000002 -0.000095 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 3.786460 -0.000000 9.353680 20.534050 -1.062945 -11.878268 -15.176755 -0.055761 0.600307 -14.139467 19.265935 -1.361296 -0.106233 39.243709 -7.343458 0.000002 0.000024 -179.999991 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000003 0.000001 -17.397641 -13.467816 21.622678 -12.173115 -53.942648 0.593889 -0.000027 -78.008567 -0.000012 -90.668876 12.760273 -22.189575 0.000002 0.000002 0.000001 0.000001 0.000002 -0.000000 -0.000001 -0.000001 0.000002 0.000001 -0.000000 -0.000001 18.199222 23.846557 -25.806533 13.980526 49.955734 -12.338068 0.000002 82.466625 -0.000036 -81.817429 -11.952617 30.705710 0.000000 0.000001 -0.000000 0.000000 -0.000001 -0.000001 -0.000001 0.000000 -0.000001 -0.000000 -0.000003 0.000001 -0.000001 -0.000000 -0.000000 -0.000001 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000001 -0.000000 0.000000 -0.000003 -0.000001 0.000000 -0.000005 -0.000001 0.000001 -11.262637 -1.095775 -10.537043 95.500873 -3.666787 -3.770032 65.432755 8.249123 -2.047835 -0.000036 0.000060 -0.000112 -0.000001 -0.000000 -0.000000 -0.000040 0.000061 -0.000112 -0.000002 -0.000005 -0.000000 -0.000001 0.000003 0.000132 -11.022449 1.037385 -6.204579 95.314791 -3.525936 -3.896361 64.837251 -3.101958 -8.689132 -0.000024 0.000062 -0.000109 0.000004 -0.000000 0.000000 -0.000026 0.000062 -0.000108 0.000001 0.000003 -0.000000 0.000001 0.000002 -0.000095 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001
-0.000000 -19.670601 7.945948 3.874207 0.006938 9.042280 20.461032 -1.031101 -11.526464 -15.176755 -0.055760 0.600307 -14.152827 19.266230 -1.356886 -0.106233 39.243712 -7.343459 0.000002 0.000024 -179.999991 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 -0.000000 -17.397641 -13.467815 21.622678 -12.173118 -53.942648 0.593890 -0.000039 -78.008567 -0.000034 -90.668883 12.760272 -22.189579 -0.000001 0.000002 0.000003 -0.000001 0.000001 0.000001 0.000001 0.000000 -0.000002 0.000001 0.000001 -0.000002 18.175265 23.857151 -25.796841 13.980524 49.955734 -12.338074 0.000012 82.485702 -0.000023 -81.823890 -11.956362 30.667584 -0.000000 -0.000001 -0.000000 -0.000000 0.000002 -0.000004 0.000003 -0.000000 0.000000 -0.000000 0.000001 -0.000003 0.000001 0.000001 0.000000 -0.000001 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000001 0.000001 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -11.353625 -1.097422 -10.190915 95.500873 -3.666785 -3.770032 65.432727 8.226439 -2.059197 -0.000033 0.000056 -0.000104 0.000001 -0.000000 -0.000000 -0.000036 0.000056 -0.000104 -0.000003 -0.000005 -0.000000 -0.000000 0.000003 0.000133 -11.112678 1.050066 -5.991963 95.314791 -3.525936 -3.896361 64.838965 -3.084413 -8.680210 -0.000024 0.000060 -0.000102 0.000000 -0.000000 -0.000000 -0.000025 0.000058 -0.000105 0.000001 0.000004 0.000000 0.000000 0.000002 -0.000095 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 3.962010 0.013401 8.730798 20.387802 -0.999698 -11.174523 -15.176757 -0.055761 0.600307 -14.191704 19.267096 -1.344059 -0.106233 39.243709 -7.343457 0.000002 0.000027 -179.999991 -0.000001 0.000003 0.000001 -0.000001 0.000003 0.000001 -0.000001 0.000003 0.000001 -0.000000 0.000000 0.000000 -17.397638 -13.467811 21.622673 -12.173117 -53.942652 0.593889 -0.000023 -78.008567 -0.000022 -90.668883 12.760268 -22.189574 0.000001 0.000000 0.000001 0.000001 -0.000002 0.000002 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 18.105534 23.887950 -25.768629 13.980529 49.955737 -12.338072 0.000002 82.541211 -0.000026 -81.842721 -11.967267 30.556641 0.000000 0.000004 0.000000 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000001 0.000001 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 0.000000 0.000001 0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000002 -0.000001 -0.000000 -11.444627 -1.099621 -9.844693 95.500873 -3.666784 -3.770032 65.432604 8.160459 -2.092253 -0.000031 0.000054 -0.000101 -0.000002 -0.000000 0.000000 -0.000035 0.000054 -0.000100 -0.000002 -0.000003 -0.000000 0.000001 0.000002 0.000135 -11.202970 1.062414 -5.779301 95.314791 -3.525936 -3.896361 64.843985 -3.033382 -8.654265 -0.000024 0.000057 -0.000101 -0.000000 -0.000001 -0.000000 -0.000023 0.000057 -0.000102 0.000002 0.000004 0.000000 0.000001 0.000002 -0.000096 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.049863 0.019387 8.419238 20.314362 -0.968736 -10.822462 -15.176757 -0.055761 0.600307 -14.254273 19.268471 -1.323412 -0.106232 39.243706 -7.343457 0.000002 0.000024 -179.999991 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -17.397641 -13.467813 21.622675 -12.173121 -53.942652 0.593890 -0.000027 -78.008567 -0.000018 -90.668883 12.760270 -22.189579 -0.000000 0.000005 0.000002 0.000001 0.000000 0.000003 -0.000002 -0.000001 0.000001 -0.000001 -0.000000 -0.000002 17.993252 23.937455 -25.723111 13.980520 49.955734 -12.338078 -0.000008 82.630502 -0.000036 -81.873075 -11.984740 30.378065 0.000003 0.000001 -0.000000 -0.000000 0.000000 -0.000001 -0.000001 0.000001 -0.000001 -0.000001 0.000002 -0.000004 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000002 -0.000001 0.000000 0.000000 -0.000001 0.000000 -11.535638 -1.102368 -9.498390 95.500873 -3.666786 -3.770033 65.432338 8.054262 -2.145446 -0.000027 0.000050 -0.000095 0.000001 -0.000000 -0.000000 -0.000029 0.000050 -0.000094 -0.000002 -0.000004 -0.000000 0.000000 0.000003 0.000132 -11.293312 1.074428 -5.566598 95.314791 -3.525936 -3.896360 64.852004 -2.951250 -8.612507 -0.000025 0.000055 -0.000098 0.000005 -0.000001 -0.000000 -0.000022 0.000054 -0.000098 0.000002 0.000003 0.000001 -0.000000 0.000002 -0.000096 -0.000001 -0.000000 0.000001 -0.000001 -0.000000 0.000001
-0.000000 -19.670601 7.945948 4.137767 0.024897 8.107614 20.240714 -0.938219 -10.470275 -15.176757 -0.055760 0.600307 -14.338710 19.270294 -1.295547 -0.106233 39.243712 -7.343457 0.000002 0.000024 -179.999991 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 -0.000002 0.000000 -17.397636 -13.467813 21.622678 -12.173126 -53.942652 0.593884 -0.000035 -78.008567 -0.000018 -90.668876 12.760274 -22.189574 0.000002 -0.000002 0.000001 0.000003 0.000002 -0.000000 -0.000001 0.000001 0.000001 0.000000 0.000000 -0.000004 17.841557 24.004135 -25.661478 13.980524 49.955737 -12.338072 -0.000001 82.751034 -0.000040 -81.914145 -12.008168 30.136997 -0.000000 0.000001 -0.000006 0.000000 0.000000 -0.000004 -0.000001 -0.000000 -0.000001 -0.000001 0.000002 -0.000002 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000005 0.000000 0.000000 0.000005 0.000001 0.000000 -11.626647 -1.105667 -9.152004 95.500873 -3.666784 -3.770032 65.431805 7.910942 -2.217217 -0.000028 0.000048 -0.000089 -0.000000 -0.000000 -0.000000 -0.000029 0.000048 -0.000089 -0.000002 -0.000004 -0.000000 -0.000001 0.000002 0.000134 -11.383706 1.086108 -5.353855 95.314791 -3.525937 -3.896360 64.862741 -2.840391 -8.556181 -0.000027 0.000057 -0.000103 0.000003 -0.000001 -0.000000 -0.000026 0.000055 -0.000102 0.000001 0.000003 0.000001 0.000001 0.000002 -0.000096 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001
-0.000000 -19.670601 7.945948 4.225715 0.029929 7.795927 20.166864 -0.908149 -10.117978 -15.176757 -0.055761 0.600307 -14.443203 19.272495 -1.261060 -0.106233 39.243712 -7.343457 0.000002 0.000024 -179.999991 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 -0.000000 0.000002 0.000000 -17.397643 -13.467812 21.622671 -12.173116 -53.942648 0.593894 -0.000027 -78.008567 -0.000022 -90.668876 12.760274 -22.189579 0.000001 -0.000001 -0.000001 -0.000001 0.000000 0.000000 -0.000001 -0.000001 -0.000000 0.000001 0.000001 -0.000001 17.653628 24.086447 -25.584902 13.980515 49.955737 -12.338077 0.000002 82.900164 -0.000038 -81.965125 -12.036944 29.838576 -0.000002 -0.000000 0.000003 0.000001 -0.000001 -0.000003 -0.000001 0.000001 -0.000002 -0.000002 0.000004 -0.000002 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000001 -0.000000 -0.000000 -11.717661 -1.109518 -8.805550 95.500873 -3.666783 -3.770032 65.430904 7.733570 -2.305998 -0.000032 0.000048 -0.000089 -0.000000 -0.000000 -0.000000 -0.000034 0.000049 -0.000087 -0.000002 -0.000004 -0.000000 -0.000001 0.000003 0.000134 -11.474155 1.097453 -5.141075 95.314791 -3.525937 -3.896359 64.875869 -2.703193 -8.486511 -0.000026 0.000055 -0.000096 0.000003 -0.000001 -0.000000 -0.000023 0.000054 -0.000098 0.000002 0.000003 0.000000 0.000002 0.000002 -0.000097 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001
-0.000000 -19.670601 7.945948 4.313703 0.034484 7.484181 20.092815 -0.878528 -9.765570 -15.176757 -0.055760 0.600307 -14.565923 19.275002 -1.220553 -0.106234 39.243709 -7.343457 0.000002 0.000022 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000001 -0.000000 0.000001 0.000000 -17.397636 -13.467817 21.622680 -12.173124 -53.942645 0.593889 -0.000031 -78.008574 -0.000014 -90.668883 12.760271 -22.189575 0.000002 -0.000001 0.000000 0.000001 0.000002 0.000001 0.000001 0.000001 0.000002 0.000000 0.000001 -0.000003 17.432586 24.182838 -25.494528 13.980519 49.955734 -12.338072 0.000013 83.075352 -0.000028 -82.025197 -12.070403 29.487955 0.000002 0.000007 -0.000001 0.000000 0.000001 -0.000006 0.000002 -0.000000 0.000000 -0.000002 0.000002 -0.000002 -0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000001 -0.000000 0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000004 -0.000000 -0.000000 -11.808665 -1.113918 -8.459035 95.500873 -3.666782 -3.770031 65.429490 7.525251 -2.410237 -0.000025 0.000043 -0.000079 -0.000001 -0.000000 0.000000 -0.000025 0.000044 -0.000080 -0.000002 -0.000003 -0.000000 -0.000000 0.000002 0.000135 -11.564651 1.108463 -4.928259 95.314791 -3.525937 -3.896361 64.891073 -2.542032 -8.404732 -0.000022 0.000052 -0.000093 0.000004 0.000001 0.000001 -0.000023 0.000050 -0.000093 0.000002 0.000004 0.000001 0.000000 0.000002 -0.000097 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 4.401725 0.038560 7.172383 20.018578 -0.849358 -9.413067 -15.176755 -0.055759 0.600307 -14.705059 19.277751 -1.174620 -0.106233 39.243716 -7.343457 0.000002 0.000022 -179.999991 0.000000 -0.000001 -0.000001 0.000000 -0.000001 -0.000001 0.000000 -0.000001 0.000000 0.000000 0.000002 0.000000 -17.397639 -13.467816 21.622678 -12.173117 -53.942645 0.593891 -0.000023 -78.008567 -0.000016 -90.668876 12.760273 -22.189577 -0.000001 0.000001 0.000003 0.000003 0.000003 -0.000001 -0.000000 -0.000004 0.000001 0.000001 0.000001 -0.000002 17.181580 24.291735 -25.391489 13.980513 49.955734 -12.338072 0.000021 83.273933 -0.000029 -82.093594 -12.107920 29.090271 -0.000001 0.000002 0.000001 -0.000000 -0.000001 -0.000002 0.000003 -0.000000 0.000000 -0.000002 0.000002 -0.000003 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000003 0.000000 0.000000 -0.000002 0.000000 0.000000 -11.899659 -1.118870 -8.112468 95.500873 -3.666782 -3.770031 65.427434 7.289064 -2.528365 -0.000026 0.000042 -0.000078 0.000001 0.000000 0.000000 -0.000026 0.000042 -0.000076 -0.000002 -0.000003 -0.000000 -0.000000 0.000003 0.000136 -11.655194 1.119137 -4.715407 95.314791 -3.525937 -3.896359 64.908053 -2.359296 -8.312085 -0.000032 0.000053 -0.000094 0.000003 -0.000000 -0.000000 -0.000033 0.000053 -0.000093 0.000001 0.000003 -0.000000 0.000002 0.000002 -0.000098 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.489782 0.042158 6.860543 19.944151 -0.820639 -9.060470 -15.176757 -0.055760 0.600307 -14.858783 19.280659 -1.123863 -0.106234 39.243712 -7.343458 0.000002 0.000020 -179.999991 -0.000000 -0.000004 -0.000001 -0.000000 -0.000004 -0.000001 -0.000000 -0.000004 0.000000 -0.000000 0.000000 0.000000 -17.397639 -13.467814 21.622676 -12.173120 -53.942645 0.593889 -0.000035 -78.008574 -0.000022 -90.668876 12.760270 -22.189580 -0.000001 -0.000001 -0.000001 0.000000 0.000001 0.000001 -0.000001 -0.000002 -0.000000 -0.000000 0.000000 -0.000000 16.903723 24.411574 -25.276918 13.980520 49.955734 -12.338071 0.000006 83.493359 -0.000034 -82.169464 -12.148825 28.650666 0.000002 0.000004 -0.000002 0.000001 0.000001 -0.000003 0.000001 0.000000 0.000001 -0.000002 0.000001 -0.000002 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -11.990631 -1.124373 -7.765845 95.500873 -3.666782 -3.770031 65.424586 7.028093 -2.658830 -0.000025 0.000041 -0.000074 0.000000 -0.000000 0.000000 -0.000025 0.000042 -0.000074 -0.000001 -0.000003 -0.000000 0.000000 0.000002 0.000135 -11.745787 1.129476 -4.502528 95.314791 -3.525936 -3.896360 64.926440 -2.157358 -8.209800 -0.000025 0.000049 -0.000088 0.000001 0.000000 0.000001 -0.000023 0.000051 -0.000089 0.000002 0.000002 -0.000000 0.000002 0.000002 -0.000098 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.577865 0.045277 6.548659 19.869536 -0.792376 -8.707791 -15.176757 -0.055759 0.600307 -15.025281 19.283668 -1.068883 -0.106234 39.243706 -7.343458 0.000002 0.000023 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000001 -0.000000 0.000003 0.000000 -17.397639 -13.467812 21.622673 -12.173117 -53.942645 0.593894 -0.000027 -78.008567 -0.000018 -90.668883 12.760271 -22.189574 0.000000 -0.000002 -0.000001 0.000004 0.000002 -0.000000 0.000000 -0.000001 0.000001 0.000001 0.000000 -0.000002 16.602180 24.540798 -25.151979 13.980521 49.955737 -12.338072 0.000003 83.731002 -0.000035 -82.252075 -12.192502 28.174327 0.000001 0.000000 0.000003 0.000000 -0.000000 0.000001 -0.000001 -0.000000 -0.000000 -0.000002 -0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000002 0.000000 -0.000000 -12.081590 -1.130428 -7.419187 95.500873 -3.666780 -3.770031 65.420829 6.745431 -2.800069 -0.000021 0.000036 -0.000067 0.000000 -0.000000 0.000000 -0.000024 0.000037 -0.000068 -0.000002 -0.000004 -0.000000 -0.000000 0.000003 0.000136 -11.836421 1.139479 -4.289617 95.314791 -3.525936 -3.896361 64.945947 -1.938606 -8.099097 -0.000025 0.000048 -0.000085 0.000002 -0.000000 0.000001 -0.000023 0.000046 -0.000084 0.000001 0.000002 -0.000000 0.000000 0.000002 -0.000096 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.665972 0.047916 6.236741 19.794737 -0.764569 -8.355032 -15.176755 -0.055761 0.600307 -15.202727 19.286707 -1.010278 -0.106234 39.243712 -7.343458 0.000002 0.000023 -179.999991 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000001 -0.000001 0.000002 0.000001 -17.397638 -13.467811 21.622678 -12.173121 -53.942648 0.593894 -0.000011 -78.008567 -0.000026 -90.668876 12.760276 -22.189577 -0.000001 -0.000000 0.000003 0.000002 0.000001 -0.000001 0.000000 -0.000001 -0.000001 0.000001 0.000001 -0.000001 16.280108 24.677868 -25.017856 13.980517 49.955734 -12.338075 -0.000001 83.984300 -0.000033 -82.340512 -12.238307 27.666412 0.000001 0.000005 0.000001 0.000001 0.000001 -0.000001 0.000001 -0.000000 0.000000 -0.000000 0.000003 -0.000002 -0.000001 0.000001 -0.000000 -0.000002 0.000001 -0.000000 -0.000002 0.000001 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 -0.000001 0.000000 -0.000001 -0.000001 0.000000 -12.172516 -1.137033 -7.072497 95.500873 -3.666781 -3.770032 65.416055 6.444185 -2.950548 -0.000019 0.000032 -0.000061 0.000000 0.000000 0.000000 -0.000019 0.000032 -0.000060 -0.000001 -0.000002 -0.000000 0.000000 0.000002 0.000136 -11.927089 1.149145 -4.076681 95.314791 -3.525937 -3.896360 64.966287 -1.705431 -7.981220 -0.000022 0.000046 -0.000079 0.000004 0.000000 0.000000 -0.000020 0.000045 -0.000080 0.000001 0.000002 0.000000 0.000000 0.000002 -0.000098 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
-0.000000 -19.670599 7.945948 4.754100 0.050076 5.924795 19.719769 -0.737222 -8.002210 -15.176752 -0.055759 0.600307 -15.389302 19.289716 -0.948649 -0.106233 39.243709 -7.343457 0.000002 0.000021 -179.999991 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000001 -0.000001 0.000002 0.000001 -17.397641 -13.467816 21.622675 -12.173113 -53.942645 0.593889 -0.000035 -78.008567 -0.000024 -90.668883 12.760271 -22.189580 0.000001 -0.000000 0.000001 0.000003 0.000003 0.000001 -0.000002 -0.000001 -0.000000 0.000001 -0.000000 -0.000004 15.940707 24.821256 -24.875768 13.980520 49.955737 -12.338071 0.000016 84.250602 -0.000035 -82.433990 -12.285656 27.132121 0.000001 0.000005 0.000003 0.000000 0.000001 -0.000003 0.000002 0.000001 0.000000 0.000001 0.000001 -0.000001 0.000001 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 -12.263411 -1.144189 -6.725784 95.500873 -3.666780 -3.770031 65.410188 6.127445 -3.108696 -0.000020 0.000029 -0.000054 -0.000000 0.000000 -0.000000 -0.000020 0.000029 -0.000054 -0.000001 -0.000002 -0.000000 -0.000000 0.000003 0.000136 -12.017804 1.158475 -3.863719 95.314791 -3.525937 -3.896360 64.987133 -1.460215 -7.857377 -0.000015 0.000044 -0.000079 0.000001 -0.000000 0.000000 -0.000015 0.000042 -0.000080 0.000002 0.000002 0.000001 -0.000001 0.000002 -0.000097 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.842246 0.051756 5.612828 19.644623 -0.710332 -7.649320 -15.176755 -0.055760 0.600307 -15.583181 19.292645 -0.884598 -0.106233 39.243712 -7.343457 0.000002 0.000022 -179.999991 -0.000000 -0.000001 -0.000001 -0.000000 -0.000001 -0.000001 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -17.397639 -13.467812 21.622671 -12.173115 -53.942652 0.593891 -0.000035 -78.008567 -0.000022 -90.668876 12.760273 -22.189577 -0.000001 0.000000 0.000000 0.000000 0.000002 -0.000000 -0.000001 0.000000 -0.000000 0.000002 0.000001 -0.000002 15.587170 24.969425 -24.726936 13.980521 49.955744 -12.338074 0.000007 84.527334 -0.000041 -82.531641 -12.333958 26.576650 0.000001 -0.000000 0.000002 -0.000000 0.000001 -0.000003 -0.000000 0.000000 0.000000 -0.000001 0.000002 -0.000000 -0.000001 0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 0.000000 0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000000 -0.000000 -12.354266 -1.151895 -6.379054 95.500873 -3.666778 -3.770031 65.403146 5.798314 -3.272976 -0.000018 0.000026 -0.000048 -0.000001 0.000000 0.000000 -0.000020 0.000025 -0.000049 -0.000001 -0.000003 -0.000000 0.000000 0.000002 0.000137 -12.108553 1.167468 -3.650737 95.314791 -3.525937 -3.896360 65.008245 -1.205357 -7.728794 -0.000021 0.000045 -0.000077 0.000003 0.000000 -0.000000 -0.000020 0.000046 -0.000078 0.000001 0.000002 0.000000 0.000002 0.000002 -0.000098 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 4.930401 0.052956 5.300842 19.569308 -0.683905 -7.296379 -15.176757 -0.055761 0.600307 -15.782535 19.295443 -0.818727 -0.106233 39.243716 -7.343457 0.000002 0.000022 -179.999991 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000002 -0.000001 0.000002 0.000001 -17.397638 -13.467814 21.622675 -12.173119 -53.942645 0.593892 -0.000031 -78.008574 -0.000026 -90.668876 12.760276 -22.189580 0.000000 -0.000004 -0.000002 0.000002 0.000002 -0.000002 -0.000001 0.000000 -0.000001 -0.000001 0.000001 -0.000002 15.222764 25.120937 -24.572668 13.980526 49.955737 -12.338072 0.000012 84.811880 -0.000048 -82.632564 -12.382666 26.005237 -0.000000 -0.000003 0.000001 -0.000001 -0.000000 -0.000004 0.000000 -0.000000 -0.000001 -0.000001 0.000001 -0.000003 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 0.000000 0.000000 -0.000004 -0.000001 0.000000 -0.000004 -0.000001 0.000000 -12.445079 -1.160152 -6.032313 95.500873 -3.666780 -3.770031 65.394936 5.459902 -3.441856 -0.000016 0.000022 -0.000042 -0.000002 0.000000 0.000000 -0.000016 0.000022 -0.000042 -0.000001 -0.000002 -0.000000 0.000001 0.000002 0.000137 -12.199340 1.176124 -3.437733 95.314791 -3.525937 -3.896360 65.029330 -0.943247 -7.596684 -0.000022 0.000045 -0.000079 0.000002 -0.000000 0.000000 -0.000021 0.000045 -0.000081 0.000001 0.000002 0.000000 -0.000000 0.000002 -0.000098 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.018565 0.053676 4.988843 19.493835 -0.657942 -6.943392 -15.176757 -0.055760 0.600307 -15.985547 19.298069 -0.751639 -0.106233 39.243712 -7.343457 0.000002 0.000024 -179.999991 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000002 0.000000 -17.397638 -13.467817 21.622676 -12.173117 -53.942642 0.593887 -0.000027 -78.008567 -0.000014 -90.668876 12.760273 -22.189572 -0.000001 0.000001 0.000000 0.000002 0.000002 -0.000000 -0.000001 -0.000000 0.000002 0.000001 0.000000 -0.000002 14.850740 25.274304 -24.414289 13.980520 49.955737 -12.338072 0.000008 85.101644 -0.000046 -82.735885 -12.431258 25.423117 0.000001 0.000002 0.000003 0.000001 0.000001 -0.000003 0.000004 -0.000000 -0.000000 -0.000000 0.000002 -0.000001 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -12.535847 -1.168958 -5.685572 95.500873 -3.666779 -3.770032 65.385538 5.115305 -3.613779 -0.000017 0.000022 -0.000040 0.000002 0.000000 0.000000 -0.000016 0.000023 -0.000043 -0.000001 -0.000002 -0.000000 -0.000002 0.000003 0.000136 -12.290159 1.184442 -3.224714 95.314791 -3.525937 -3.896360 65.050203 -0.676287 -7.462266 -0.000021 0.000044 -0.000077 0.000001 0.000001 0.000000 -0.000021 0.000043 -0.000077 0.000002 0.000003 0.000000 -0.000000 0.000002 -0.000098 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.106734 0.053916 4.676840 19.418195 -0.632445 -6.590365 -15.176759 -0.055761 0.600306 -16.190393 19.300492 -0.683938 -0.106232 39.243712 -7.343458 0.000003 0.000025 -179.999991 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000000 0.000003 0.000000 -17.397641 -13.467816 21.622678 -12.173120 -53.942645 0.593888 -0.000027 -78.008567 -0.000020 -90.668876 12.760273 -22.189577 0.000002 0.000000 0.000001 0.000000 0.000002 0.000000 -0.000001 -0.000000 0.000000 0.000001 0.000000 -0.000002 14.474417 25.428091 -24.253153 13.980521 49.955737 -12.338072 0.000027 85.394017 -0.000044 -82.840639 -12.479235 24.835541 0.000002 0.000005 0.000001 0.000000 0.000000 -0.000006 0.000000 0.000001 -0.000000 0.000001 0.000003 -0.000001 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000002 -0.000000 -0.000000 -12.626556 -1.178313 -5.338837 95.500873 -3.666779 -3.770032 65.375026 4.767642 -3.787222 -0.000011 0.000016 -0.000030 0.000001 -0.000000 0.000000 -0.000010 0.000017 -0.000030 -0.000001 -0.000002 -0.000000 0.000001 0.000003 0.000137 -12.381007 1.192423 -3.011678 95.314791 -3.525937 -3.896361 65.070632 -0.406877 -7.326750 -0.000021 0.000038 -0.000069 0.000003 0.000000 0.000001 -0.000021 0.000038 -0.000070 0.000001 0.000002 0.000001 -0.000001 0.000002 -0.000098 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.194902 0.053676 4.364837 19.342402 -0.607412 -6.237306 -15.176759 -0.055760 0.600307 -16.395239 19.302683 -0.616226 -0.106233 39.243709 -7.343457 0.000001 0.000024 -179.999991 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -17.397641 -13.467814 21.622678 -12.173116 -53.942648 0.593894 -0.000023 -78.008567 -0.000030 -90.668876 12.760276 -22.189579 0.000002 -0.000003 0.000001 0.000000 0.000000 -0.000001 -0.000000 -0.000001 -0.000002 0.000000 0.000001 -0.000002 14.097136 25.580926 -24.090702 13.980521 49.955734 -12.338071 0.000041 85.686376 -0.000053 -82.945927 -12.526172 24.247762 -0.000001 -0.000003 -0.000000 0.000000 0.000000 -0.000002 -0.000000 -0.000000 -0.000000 -0.000002 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000002 -0.000001 0.000000 -0.000001 -0.000001 0.000000 -12.717212 -1.188217 -4.992116 95.500873 -3.666779 -3.770032 65.363449 4.420002 -3.960637 -0.000009 0.000017 -0.000031 0.000001 0.000000 0.000000 -0.000011 0.000016 -0.000030 -0.000001 -0.000001 -0.000000 -0.000001 0.000003 0.000136 -12.471888 1.200066 -2.798630 95.314791 -3.525938 -3.896359 65.090405 -0.137415 -7.191323 -0.000022 0.000038 -0.000066 0.000000 0.000000 0.000000 -0.000021 0.000037 -0.000067 0.000001 0.000002 0.000001 0.000002 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.283066 0.052956 4.052840 19.266458 -0.582848 -5.884219 -15.176754 -0.055761 0.600307 -16.598273 19.304637 -0.549110 -0.106233 39.243709 -7.343460 0.000003 0.000020 -179.999991 0.000001 -0.000002 -0.000000 0.000001 -0.000002 -0.000000 0.000001 -0.000002 -0.000001 -0.000001 -0.000000 0.000000 -17.397641 -13.467815 21.622676 -12.173111 -53.942645 0.593891 -0.000027 -78.008567 -0.000020 -90.668876 12.760271 -22.189582 0.000003 0.000005 0.000003 0.000002 -0.000005 0.000003 -0.000000 0.000003 0.000000 0.000002 0.000002 -0.000002 13.722278 25.731445 -23.928405 13.980522 49.955737 -12.338067 0.000028 85.976133 -0.000050 -83.050756 -12.571644 23.665060 0.000000 -0.000000 0.000001 0.000000 -0.000001 0.000004 -0.000000 -0.000000 0.000000 0.000001 0.000002 -0.000001 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000002 -0.000000 0.000000 -0.000003 -0.000000 0.000000 -12.807805 -1.198669 -4.645415 95.500873 -3.666781 -3.770032 65.350943 4.075506 -4.132503 -0.000005 0.000013 -0.000026 0.000003 0.000000 -0.000000 -0.000009 0.000012 -0.000024 -0.000000 -0.000002 -0.000000 0.000001 0.000003 0.000136 -12.562798 1.207371 -2.585570 95.314791 -3.525937 -3.896359 65.109386 0.129683 -7.057196 -0.000017 0.000039 -0.000066 0.000002 0.000000 0.000001 -0.000018 0.000039 -0.000067 0.000001 0.000002 -0.000000 -0.000000 0.000002 -0.000099 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 5.371222 0.051756 3.740854 19.190364 -0.558753 -5.531121 -15.176759 -0.055761 0.600307 -16.797655 19.306325 -0.483193 -0.106233 39.243702 -7.343458 0.000003 0.000022 -179.999991 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 -0.000000 0.000000 0.000000 0.000000 -17.397641 -13.467814 21.622675 -12.173113 -53.942645 0.593895 -0.000031 -78.008567 -0.000022 -90.668876 12.760272 -22.189574 0.000001 0.000001 0.000001 0.000003 -0.000001 0.000001 -0.000001 -0.000002 0.000000 0.000001 -0.000000 0.000001 13.353238 25.878306 -23.767754 13.980519 49.955734 -12.338077 0.000030 86.260686 -0.000048 -83.154193 -12.615277 23.092699 -0.000000 0.000000 -0.000002 0.000000 -0.000001 -0.000001 -0.000001 -0.000001 0.000000 0.000001 0.000005 -0.000003 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000004 -0.000001 -0.000000 -0.000003 -0.000001 -0.000000 -12.898327 -1.209668 -4.298747 95.500873 -3.666779 -3.770031 65.337665 3.737255 -4.301282 -0.000006 0.000010 -0.000020 0.000001 0.000000 -0.000000 -0.000007 0.000010 -0.000020 -0.000000 -0.000002 -0.000000 0.000001 0.000002 0.000137 -12.653725 1.214338 -2.372502 95.314791 -3.525938 -3.896359 65.127404 0.392026 -6.925568 -0.000018 0.000032 -0.000060 0.000002 0.000001 -0.000000 -0.000015 0.000033 -0.000059 0.000002 0.000002 -0.000001 0.000002 0.000002 -0.000099 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 5.459367 0.050076 3.428885 19.114138 -0.535130 -5.178011 -15.176755 -0.055760 0.600307 -16.991567 19.307772 -0.419078 -0.106233 39.243712 -7.343459 0.000002 0.000022 -179.999991 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000002 0.000000 -17.397636 -13.467810 21.622675 -12.173117 -53.942648 0.593894 -0.000023 -78.008567 -0.000006 -90.668876 12.760267 -22.189580 -0.000001 0.000001 0.000001 0.000004 -0.000001 0.000001 0.000002 0.000002 0.000003 0.000000 0.000002 -0.000001 12.993473 26.020243 -23.610332 13.980519 49.955737 -12.338072 0.000022 86.537411 -0.000052 -83.255184 -12.656734 22.535956 -0.000001 -0.000001 0.000000 -0.000000 -0.000001 -0.000002 0.000003 0.000000 0.000000 -0.000002 0.000002 -0.000002 -0.000001 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -12.988781 -1.221214 -3.952113 95.500873 -3.666779 -3.770031 65.323793 3.408338 -4.465429 -0.000005 0.000006 -0.000011 0.000001 -0.000000 -0.000000 -0.000006 0.000005 -0.000011 -0.000000 -0.000001 -0.000000 -0.000001 0.000002 0.000137 -12.744682 1.220966 -2.159429 95.314791 -3.525938 -3.896359 65.144384 0.647189 -6.797630 -0.000018 0.000033 -0.000060 -0.000001 0.000001 -0.000000 -0.000016 0.000033 -0.000062 0.000001 0.000001 -0.000001 0.000001 0.000002 -0.000100 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.547493 0.047916 3.116938 19.037771 -0.511979 -4.824902 -15.176754 -0.055761 0.600307 -17.178187 19.308965 -0.357373 -0.106232 39.243712 -7.343457 0.000002 0.000018 -179.999991 -0.000001 -0.000002 0.000000 -0.000001 -0.000002 0.000000 -0.000001 -0.000002 -0.000000 0.000000 -0.000001 0.000000 -17.397638 -13.467813 21.622678 -12.173118 -53.942645 0.593890 -0.000015 -78.008567 -0.000012 -90.668876 12.760271 -22.189574 -0.000000 0.000000 0.000001 0.000002 0.000002 -0.000000 -0.000002 0.000001 0.000002 0.000000 0.000001 -0.000002 12.646439 26.155977 -23.457725 13.980517 49.955734 -12.338074 0.000013 86.803727 -0.000064 -83.352780 -12.695724 22.000099 0.000000 0.000001 -0.000002 -0.000002 -0.000001 -0.000002 0.000005 -0.000000 -0.000000 -0.000002 0.000002 -0.000001 -0.000003 0.000000 0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000004 -0.000000 0.000000 0.000004 -0.000000 0.000000 -13.079153 -1.233306 -3.605525 95.500873 -3.666779 -3.770031 65.309559 3.091864 -4.623415 -0.000002 0.000003 -0.000007 0.000002 0.000000 -0.000000 -0.000001 0.000003 -0.000006 0.000000 -0.000001 -0.000000 0.000001 0.000003 0.000137 -12.835659 1.227256 -1.946351 95.314791 -3.525937 -3.896360 65.160169 0.892786 -6.674583 -0.000018 0.000032 -0.000057 0.000003 -0.000000 -0.000000 -0.000016 0.000033 -0.000058 0.000000 0.000002 -0.000000 0.000001 0.000002 -0.000098 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
-0.000000 -19.670601 7.945948 5.635603 0.045276 2.805022 18.961261 -0.489300 -4.471798 -15.176755 -0.055761 0.600307 -17.355688 19.309923 -0.298679 -0.106233 39.243709 -7.343458 0.000002 0.000019 -179.999991 -0.000001 -0.000001 0.000001 -0.000001 -0.000001 0.000001 -0.000001 -0.000001 0.000001 -0.000000 -0.000001 -0.000000 -17.397641 -13.467813 21.622676 -12.173123 -53.942652 0.593896 -0.000027 -78.008567 -0.000010 -90.668876 12.760274 -22.189577 -0.000001 -0.000001 -0.000001 0.000002 0.000000 0.000000 -0.000001 0.000001 0.000003 0.000000 0.000000 0.000000 12.315660 26.284308 -23.311584 13.980521 49.955730 -12.338069 0.000022 87.056997 -0.000078 -83.445937 -12.731973 21.490395 0.000000 0.000008 -0.000000 -0.000001 -0.000001 0.000000 0.000004 -0.000001 -0.000000 -0.000002 0.000001 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000001 -0.000001 -0.000000 0.000001 -0.000001 -0.000000 -13.169438 -1.245943 -3.258988 95.500873 -3.666779 -3.770032 65.295208 2.790923 -4.773696 -0.000007 0.000001 -0.000005 0.000001 0.000000 0.000000 -0.000005 0.000002 -0.000004 -0.000000 0.000000 0.000000 -0.000000 0.000003 0.000137 -12.926656 1.233208 -1.733271 95.314791 -3.525938 -3.896358 65.174669 1.126394 -6.557600 -0.000020 0.000033 -0.000054 0.000001 0.000001 0.000000 -0.000018 0.000033 -0.000057 0.000001 0.000002 -0.000001 -0.000001 0.000002 -0.000098 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.723687 0.042158 2.493139 18.884631 -0.467097 -4.118708 -15.176755 -0.055760 0.600307 -17.522244 19.310666 -0.243602 -0.106232 39.243709 -7.343459 0.000002 0.000021 -179.999991 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000000 0.000001 0.000000 -0.000000 -17.397643 -13.467812 21.622673 -12.173117 -53.942645 0.593891 -0.000027 -78.008567 -0.000020 -90.668876 12.760271 -22.189577 0.000000 0.000001 0.000001 -0.000001 -0.000002 0.000002 -0.000001 -0.000002 0.000001 0.000002 0.000001 -0.000002 12.004629 26.404017 -23.173551 13.980520 49.955730 -12.338075 0.000033 87.294660 -0.000067 -83.533658 -12.765250 21.012111 0.000001 0.000005 -0.000000 -0.000001 -0.000000 -0.000001 0.000000 -0.000000 0.000000 -0.000002 0.000000 -0.000004 -0.000000 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -13.259642 -1.259124 -2.912512 95.500873 -3.666778 -3.770031 65.281036 2.508592 -4.914734 0.000001 -0.000002 0.000001 0.000002 -0.000000 0.000000 0.000002 -0.000002 0.000001 -0.000000 -0.000000 -0.000000 0.000001 0.000002 0.000138 -13.017666 1.238821 -1.520192 95.314791 -3.525938 -3.896360 65.187865 1.345616 -6.447876 -0.000018 0.000028 -0.000051 -0.000001 -0.000001 -0.000000 -0.000019 0.000028 -0.000053 0.000001 0.000002 -0.000000 0.000000 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.811742 0.038560 2.181296 18.807875 -0.445369 -3.765638 -15.176757 -0.055761 0.600307 -17.676026 19.311218 -0.192746 -0.106233 39.243712 -7.343457 0.000002 0.000019 -179.999991 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 0.000000 0.000000 -0.000000 -17.397643 -13.467815 21.622678 -12.173114 -53.942648 0.593893 -0.000023 -78.008567 -0.000018 -90.668876 12.760270 -22.189580 0.000001 -0.000002 -0.000003 0.000003 -0.000000 0.000001 -0.000001 0.000002 0.000001 0.000003 0.000001 -0.000001 11.716894 26.513934 -23.045350 13.980520 49.955737 -12.338068 0.000026 87.514094 -0.000083 -83.614875 -12.795316 20.570488 -0.000000 0.000000 0.000001 -0.000001 -0.000001 -0.000002 0.000002 0.000001 0.000000 -0.000002 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000004 0.000000 0.000000 -0.000004 0.000000 0.000000 -13.349748 -1.272849 -2.566101 95.500873 -3.666778 -3.770031 65.267348 2.247967 -5.044981 -0.000000 -0.000006 0.000010 0.000003 -0.000000 0.000000 0.000001 -0.000007 0.000011 0.000001 -0.000001 -0.000000 -0.000000 0.000002 0.000137 -13.108696 1.244096 -1.307117 95.314791 -3.525938 -3.896359 65.199681 1.548043 -6.346611 -0.000013 0.000028 -0.000048 0.000001 0.000000 0.000001 -0.000011 0.000027 -0.000050 0.000001 0.000001 0.000000 0.000001 0.000002 -0.000100 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 5.899764 0.034484 1.869499 18.730998 -0.424118 -3.412596 -15.176754 -0.055760 0.600307 -17.815222 19.311609 -0.146714 -0.106233 39.243712 -7.343459 0.000003 0.000021 -179.999991 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 0.000000 0.000001 -0.000000 -17.397641 -13.467817 21.622675 -12.173125 -53.942648 0.593890 -0.000027 -78.008574 -0.000012 -90.668876 12.760272 -22.189574 0.000002 -0.000001 0.000001 0.000004 -0.000000 0.000001 0.000001 -0.000001 0.000002 -0.000000 0.000001 -0.000003 11.456009 26.612924 -22.928691 13.980515 49.955734 -12.338067 0.000039 87.712681 -0.000080 -83.688580 -12.822006 20.170787 0.000000 0.000006 -0.000000 -0.000002 -0.000000 -0.000002 0.000002 0.000001 0.000000 -0.000001 0.000001 -0.000002 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -13.439759 -1.287115 -2.219768 95.500873 -3.666779 -3.770031 65.254439 2.012114 -5.162896 -0.000001 -0.000006 0.000011 0.000001 0.000000 0.000000 -0.000003 -0.000007 0.000011 0.000000 0.000000 -0.000000 0.000000 0.000002 0.000137 -13.199741 1.249031 -1.094047 95.314784 -3.525937 -3.896358 65.210049 1.731275 -6.254992 -0.000014 0.000028 -0.000046 0.000001 0.000000 -0.000000 -0.000015 0.000026 -0.000048 0.000001 0.000001 -0.000001 0.000002 0.000002 -0.000100 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000
-0.000000 -19.670601 7.945948 5.987752 0.029929 1.557754 18.654013 -0.403345 -3.059593 -15.176759 -0.055760 0.600307 -17.938001 19.311863 -0.106110 -0.106232 39.243712 -7.343458 0.000003 0.000022 -179.999991 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000001 -0.000000 -0.000000 -17.397641 -13.467817 21.622673 -12.173115 -53.942652 0.593890 -0.000031 -78.008567 -0.000020 -90.668883 12.760270 -22.189580 -0.000001 0.000001 0.000001 0.000000 -0.000001 0.000001 -0.000001 0.000001 0.000000 0.000001 -0.000000 -0.000002 11.225536 26.699838 -22.825290 13.980520 49.955737 -12.338071 0.000060 87.887869 -0.000110 -83.753760 -12.845128 19.818234 -0.000000 0.000004 -0.000000 -0.000001 0.000000 -0.000003 0.000003 0.000000 0.000000 -0.000002 0.000003 -0.000001 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 0.000000 -13.529662 -1.301922 -1.873514 95.500873 -3.666779 -3.770031 65.242643 1.804129 -5.266930 0.000007 -0.000013 0.000024 0.000000 0.000000 0.000000 0.000008 -0.000014 0.000024 0.000001 0.000001 0.000000 -0.000000 0.000003 0.000136 -13.290793 1.253628 -0.880983 95.314791 -3.525938 -3.896360 65.218956 1.892899 -6.174187 -0.000018 0.000027 -0.000050 0.000001 0.000000 -0.000000 -0.000016 0.000027 -0.000050 0.000000 0.000002 -0.000000 0.000001 0.000002 -0.000100 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000
-0.000000 -19.670601 7.945948 6.075700 0.024897 1.246066 18.576906 -0.383049 -2.706633 -15.176757 -0.055760 0.600307 -18.042546 19.312015 -0.071536 -0.106233 39.243712 -7.343458 0.000003 0.000022 -179.999991 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000000 0.000001 0.000001 0.000001 -0.000001 -0.000000 -17.397641 -13.467812 21.622673 -12.173118 -53.942648 0.593889 -0.000019 -78.008567 -0.000012 -90.668876 12.760272 -22.189577 0.000003 0.000003 0.000000 0.000001 0.000001 0.000001 -0.000001 0.000002 0.000002 0.000000 0.000002 -0.000003 11.029031 26.773534 -22.736885 13.980519 49.955737 -12.338068 0.000058 88.036992 -0.000106 -83.809351 -12.864504 19.518066 0.000001 0.000006 0.000001 -0.000000 -0.000001 -0.000001 0.000006 -0.000001 0.000000 0.000001 0.000002 -0.000001 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000003 0.000000 -0.000000 -13.619460 -1.317269 -1.527353 95.500873 -3.666777 -3.770032 65.232323 1.627057 -5.355527 0.000004 -0.000016 0.000028 0.000002 -0.000000 0.000000 0.000007 -0.000016 0.000028 0.000001 0.000001 -0.000000 0.000001 0.000003 0.000138 -13.381855 1.257886 -0.667929 95.314784 -3.525938 -3.896360 65.226374 2.030526 -6.105413 -0.000009 0.000025 -0.000040 -0.000003 0.000001 -0.000000 -0.000008 0.000023 -0.000040 0.000001 0.000001 0.000001 -0.000000 0.000002 -0.000100 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000
-0.000000 -19.670601 7.945948 6.163602 0.019387 0.934440 18.499694 -0.363235 -2.353723 -15.176759 -0.055760 0.600307 -18.127030 19.312104 -0.043596 -0.106234 39.243702 -7.343458 0.000004 0.000021 -179.999991 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 0.000001 -0.000001 0.000000 -17.397639 -13.467818 21.622676 -12.173117 -53.942645 0.593893 -0.000019 -78.008574 -0.000020 -90.668876 12.760272 -22.189580 -0.000001 0.000003 -0.000001 0.000003 -0.000000 -0.000000 0.000000 -0.000001 0.000001 -0.000000 0.000001 -0.000002 10.870063 26.832904 -22.665196 13.980520 49.955737 -12.338072 0.000075 88.157532 -0.000113 -83.854362 -12.879948 19.275506 -0.000000 -0.000002 -0.000000 -0.000001 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000001 -0.000001 -0.000001 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000001 -0.000000 0.000000 -13.709146 -1.333155 -1.181287 95.500873 -3.666779 -3.770031 65.223764 1.483990 -5.427136 0.000006 -0.000018 0.000032 0.000000 0.000000 0.000001 0.000006 -0.000019 0.000034 0.000001 0.000001 0.000000 0.000001 0.000003 0.000137 -13.472924 1.261804 -0.454887 95.314791 -3.525937 -3.896359 65.232241 2.141746 -6.049839 -0.000015 0.000021 -0.000039 -0.000000 0.000000 0.000001 -0.000013 0.000023 -0.000039 0.000001 0.000001 -0.000000 0.000001 0.000002 -0.000099 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 6.251457 0.013400 0.622884 18.422385 -0.343901 -2.000873 -15.176759 -0.055760 0.600307 -18.189630 19.312129 -0.022894 -0.106233 39.243712 -7.343457 0.000003 0.000021 -179.999991 0.000000 0.000002 0.000003 0.000000 0.000002 0.000003 0.000000 0.000002 0.000002 0.000001 0.000000 0.000000 -17.397641 -13.467817 21.622675 -12.173116 -53.942642 0.593889 -0.000039 -78.008567 -0.000022 -90.668876 12.760270 -22.189577 0.000002 0.000001 0.000000 -0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000001 10.752161 26.876772 -22.611941 13.980522 49.955737 -12.338072 0.000051 88.246830 -0.000119 -83.887741 -12.891267 19.095783 -0.000000 -0.000007 -0.000000 -0.000001 -0.000001 -0.000003 -0.000002 0.000001 0.000000 0.000001 0.000003 -0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -13.798713 -1.349578 -0.835326 95.500873 -3.666777 -3.770031 65.217330 1.377985 -5.480207 0.000007 -0.000022 0.000038 0.000000 0.000000 -0.000000 0.000011 -0.000022 0.000039 -0.000000 0.000001 -0.000000 0.000001 0.000002 0.000138 -13.563997 1.265384 -0.241859 95.314791 -3.525938 -3.896358 65.236523 2.224162 -6.008670 -0.000010 0.000020 -0.000033 -0.000003 -0.000000 -0.000000 -0.000009 0.000019 -0.000034 0.000000 0.000000 0.000000 0.000001 0.000002 -0.000102 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
-0.000000 -19.670601 7.945948 6.339260 0.006938 0.311401 18.344976 -0.325047 -1.648091 -15.176757 -0.055761 0.600307 -18.228528 19.312145 -0.010029 -0.106232 39.243712 -7.343457 0.000004 0.000021 -179.999991 0.000001 0.000001 -0.000001 0.000001 0.000001 -0.000001 0.000001 0.000001 -0.000002 0.000001 -0.000001 -0.000000 -17.397643 -13.467815 21.622673 -12.173115 -53.942642 0.593891 -0.000031 -78.008567 -0.000016 -90.668876 12.760268 -22.189577 -0.000002 0.000005 0.000001 0.000001 -0.000002 0.000002 -0.000001 0.000000 0.000001 -0.000001 0.000002 -0.000002 10.678862 26.903975 -22.578789 13.980526 49.955737 -12.338074 0.000053 88.302318 -0.000123 -83.908505 -12.898252 18.984116 -0.000001 0.000000 0.000001 -0.000001 -0.000000 -0.000001 -0.000001 0.000000 0.000000 -0.000001 0.000002 -0.000002 -0.000000 0.000001 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -13.888154 -1.366537 -0.489479 95.500873 -3.666779 -3.770031 65.213273 1.312131 -5.513185 0.000011 -0.000024 0.000044 -0.000001 0.000000 0.000000 0.000011 -0.000024 0.000043 0.000001 0.000001 0.000000 -0.000001 0.000003 0.000136 -13.655079 1.268625 -0.028851 95.314791 -3.525937 -3.896359 65.239153 2.275369 -5.983086 -0.000013 0.000019 -0.000030 -0.000002 0.000000 -0.000000 -0.000013 0.000018 -0.000030 0.000001 0.000001 -0.000000 0.000001 0.000002 -0.000099 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
-0.000000 -19.670601 7.945948 6.427008 -0.000001 -0.000001 18.267472 -0.306676 -1.295383 -15.176755 -0.055761 0.600307 -18.241900 19.312145 -0.005607 -0.106232 39.243702 -7.343457 0.000003 0.000018 -179.999991 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 0.000000 0.000000 -0.000000 -17.397641 -13.467812 21.622673 -12.173119 -53.942652 0.593892 -0.000023 -78.008567 -0.000012 -90.668876 12.760272 -22.189580 -0.000001 -0.000003 -0.000002 0.000003 0.000002 -0.000000 -0.000001 -0.000001 0.000002 -0.000001 0.000000 0.000001 10.653656 26.913309 -22.567375 13.980522 49.955737 -12.338072 0.000039 88.321395 -0.000124 -83.915636 -12.900645 18.945729 -0.000000 -0.000000 -0.000001 -0.000000 -0.000001 -0.000000 0.000002 0.000000 0.000000 -0.000000 -0.000001 -0.000001 -0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000001 0.000000 -0.000001 -0.000000 0.000000 -13.977470 -1.384030 -0.143751 95.500873 -3.666780 -3.770031 65.211859 1.289493 -5.524522 0.000014 -0.000027 0.000050 -0.000001 -0.000000 0.000000 0.000013 -0.000028 0.000051 0.000001 0.000001 0.000000 0.000001 0.000003 0.000136 -13.746159 1.271528 0.184142 95.314791 -3.525937 -3.896358 65.240041 2.292975 -5.974295 -0.000010 0.000019 -0.000032 0.000001 0.000000 -0.000000 -0.000009 0.000018 -0.000031 0.000001 0.000001 0.000000 0.000002 0.000002 -0.000099 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
-0.000000 -19.670601 7.945948 116.950460 -0.000022 -0.000000 18.267476 -0.306676 -1.295382 -15.176754 -0.055762 0.600307 -18.241900 19.312143 -0.005607 -0.106233 39.243712 -7.343459 0.000002 0.000022 -179.999991 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000000 0.000001 -0.000001 -0.000000 -17.397638 -13.467812 21.622678 -12.173119 -53.942645 0.593893 -0.000015 -78.008567 -0.000012 -90.668883 12.760272 -22.189577 -0.000000 0.000002 -0.000001 -0.000001 -0.000000 -0.000000 0.000002 -0.000001 -0.000000 -0.000000 0.000002 -0.000001 10.653656 26.913309 -22.567384 13.980526 49.955730 -12.338071 0.000111 88.321395 -0.000066 -83.915636 -12.900644 18.945727 -0.000000 0.000003 -0.000000 0.000002 -0.000000 -0.000002 0.000001 -0.000000 0.000002 0.000002 -0.000001 -0.000000 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000001 0.000000 0.000003 -0.000001 0.000000 -92.820365 -5.802719 -5.873975 95.500873 -3.666784 -3.770033 65.211873 1.289492 -5.524520 0.000008 -0.000013 0.000023 0.000000 0.000000 0.000000 0.000007 -0.000013 0.000024 -0.000001 0.000001 0.000000 -0.000003 0.000002 0.000135 -92.575742 5.213340 5.719398 95.314784 -3.525937 -3.896360 65.240041 2.292974 -5.974298 -0.000007 0.000012 -0.000019 -0.000000 -0.000000 -0.000000 -0.000005 0.000010 -0.000022 0.000002 -0.000001 0.000000 -0.000001 0.000002 -0.000100 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000

View File

@@ -1,482 +0,0 @@
HIERARCHY
ROOT mPelvis
{
OFFSET 0.000000 1.067000 -0.000000
CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation
JOINT mTorso
{
OFFSET 0.000000 0.084000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mChest
{
OFFSET 0.000000 0.205000 -0.015000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mNeck
{
OFFSET 0.000000 0.251000 -0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mHead
{
OFFSET 0.000000 0.076000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mSkull
{
OFFSET 0.000000 0.079000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT mEyeRight
{
OFFSET -0.036000 0.079000 0.098000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT mEyeLeft
{
OFFSET 0.036000 0.079000 0.098000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT HEAD
{
OFFSET 0.000000 0.060000 0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT NECK
{
OFFSET 0.000000 0.015000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mCollarLeft
{
OFFSET 0.085000 0.165000 -0.021000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mShoulderLeft
{
OFFSET 0.079000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mElbowLeft
{
OFFSET 0.248000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mWristLeft
{
OFFSET 0.205000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT L_HAND
{
OFFSET 0.050000 0.000000 0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_LOWER_ARM
{
OFFSET 0.100000 -0.005000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_UPPER_ARM
{
OFFSET 0.120000 0.000000 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_CLAVICLE
{
OFFSET 0.000000 0.020000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mCollarRight
{
OFFSET -0.085000 0.165000 -0.021000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mShoulderRight
{
OFFSET -0.079000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mElbowRight
{
OFFSET -0.248000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mWristRight
{
OFFSET -0.205000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT R_HAND
{
OFFSET -0.050000 0.000000 0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_LOWER_ARM
{
OFFSET -0.100000 -0.005000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_UPPER_ARM
{
OFFSET -0.120000 0.000000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_CLAVICLE
{
OFFSET 0.000000 0.020000 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT CHEST
{
OFFSET 0.000000 0.060000 -0.002000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT LEFT_PEC
{
OFFSET 0.052000 0.052000 0.127000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT RIGHT_PEC
{
OFFSET -0.052000 0.052000 0.127000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT UPPER_BACK
{
OFFSET 0.000000 0.017253 0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT BELLY
{
OFFSET 0.000000 0.060000 -0.002000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT LOWER_BACK
{
OFFSET 0.000000 0.022848 -0.000000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mHipRight
{
OFFSET -0.129000 -0.041000 0.034000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mKneeRight
{
OFFSET 0.049000 -0.491000 -0.001000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mAnkleRight
{
OFFSET -0.000000 -0.468000 -0.029000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mFootRight
{
OFFSET 0.000000 -0.061000 0.112000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mToeRight
{
OFFSET 0.000000 0.000000 0.109000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT R_FOOT
{
OFFSET 0.000000 -0.041000 0.077000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT R_LOWER_LEG
{
OFFSET -0.000000 -0.200000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT R_UPPER_LEG
{
OFFSET 0.050000 -0.220000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT mHipLeft
{
OFFSET 0.127000 -0.041000 0.034000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mKneeLeft
{
OFFSET -0.046000 -0.491000 -0.001000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mAnkleLeft
{
OFFSET 0.001000 -0.468000 -0.029000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mFootLeft
{
OFFSET 0.000000 -0.061000 0.112000
CHANNELS 3 Xrotation Yrotation Zrotation
JOINT mToeLeft
{
OFFSET 0.000000 0.000000 0.109000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT L_FOOT
{
OFFSET 0.000000 -0.041000 0.077000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET 0.000000 -0.100000 0.000000
}
}
}
JOINT L_LOWER_LEG
{
OFFSET -0.000000 -0.200000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT L_UPPER_LEG
{
OFFSET -0.050000 -0.220000 -0.020000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
JOINT PELVIS
{
OFFSET -0.000000 -0.020000 -0.010000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
JOINT BUTT
{
OFFSET -0.000000 -0.100000 -0.060000
CHANNELS 3 Xrotation Yrotation Zrotation
End Site
{
OFFSET -0.000000 -0.100000 0.000000
}
}
}
MOTION
Frames: 112
Frame Time: 0.022222
0.000000 1.067000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000001 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000137 -0.000000 -0.000001 0.000000 -0.000002 0.000017 -0.000034 0.000000 -0.000000 -0.000000 -0.000003 0.000017 -0.000032 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 0.000000 0.000000 0.000002 -0.000102 -0.000000 0.000002 -0.000000 0.000012 -0.000012 0.000028 -0.000000 0.000000 0.000000 0.000010 -0.000012 0.000026 -0.000000 0.000001 0.000000 0.000000 0.000002 -0.000102 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000001 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000137 -0.000000 -0.000001 0.000000 -0.000002 0.000017 -0.000034 0.000000 -0.000000 -0.000000 -0.000003 0.000017 -0.000032 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 0.000000 0.000000 0.000002 -0.000102 -0.000000 0.000002 -0.000000 0.000012 -0.000012 0.000028 -0.000000 0.000000 0.000000 0.000010 -0.000012 0.000026 -0.000000 0.000001 0.000000 0.000000 0.000002 -0.000102 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.000080 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000003 0.000004 -78.829932 -0.000000 -5.381533 0.000000 2.084715 -0.191204 -10.479614 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000001 0.000006 78.829932 -0.000000 5.381532 -0.000000 2.084716 0.191204 10.479615 0.000000 0.000001 -0.000000 0.000000 -0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000137 -0.000000 -0.000001 0.000000 -0.000002 0.000017 -0.000034 0.000000 -0.000000 -0.000000 -0.000003 0.000017 -0.000032 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.000000 0.000000 0.000000 0.000000 0.000002 -0.000102 -0.000000 0.000002 -0.000000 0.000012 -0.000012 0.000028 -0.000000 0.000000 0.000000 0.000010 -0.000012 0.000026 -0.000000 0.000001 0.000000 0.000000 0.000002 -0.000102 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.000316 -0.000718 0.000000 0.000000 0.005924 -0.000032 -0.000432 -0.013010 0.000021 0.000518 -0.008624 0.000000 -0.000000 0.000244 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.052602 0.283906 -0.608567 -80.324964 -0.000000 -10.113599 -0.000000 1.478424 -0.242106 -10.449810 0.000000 -0.000002 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.035349 0.017752 0.004584 -0.004154 0.052280 78.780986 0.000000 9.739604 0.000000 2.527328 0.296271 12.974199 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000008 0.000007 -0.004059 -0.001538 -0.000004 0.000231 0.000002 0.000001 -0.000003 -0.000009 0.000016 -0.000029 0.000000 -0.000000 -0.000000 -0.000008 0.000016 -0.000029 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.007394 0.078920 0.000156 -0.002946 -0.000015 0.000081 0.032866 -0.000052 0.005120 0.000007 -0.000014 0.000024 0.000000 0.000000 -0.000000 0.000007 -0.000014 0.000024 -0.000001 0.000000 0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.000702 -0.002833 0.000000 0.000000 0.022784 -0.000123 -0.001663 -0.050036 0.000079 0.001992 -0.033169 0.000000 -0.000000 0.001950 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.202568 1.091277 -2.395169 -81.359936 -0.000000 -14.309028 -0.000001 -0.298112 -0.388571 -10.227155 0.000001 0.000002 -0.000000 0.000000 0.000001 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000000 -0.139432 0.070017 0.018145 -0.016131 0.206272 78.636842 0.000000 13.914490 -0.000001 2.861470 0.422135 15.401942 -0.000000 -0.000004 -0.000000 0.000000 -0.000002 0.000001 0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000032 0.000029 -0.016007 -0.006063 -0.000021 0.000511 0.000003 -0.000000 0.000000 -0.000007 0.000017 -0.000029 -0.000000 -0.000000 0.000000 -0.000007 0.000017 -0.000029 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000136 0.028437 0.303559 0.000543 -0.011574 -0.000066 0.000613 0.126411 -0.000192 0.019692 0.000010 -0.000012 0.000026 -0.000000 -0.000000 -0.000000 0.000010 -0.000013 0.000024 -0.000001 -0.000000 0.000000 0.000000 0.000002 -0.000102 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.001229 -0.006284 0.000000 0.000000 0.049212 -0.000265 -0.003591 -0.108079 0.000168 0.004303 -0.071644 -0.000000 -0.000000 0.006580 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.438137 2.377584 -5.283631 -81.914220 0.000000 -17.999218 -0.000001 -3.141461 -0.636896 -9.835040 -0.000000 0.000001 -0.000000 0.000001 0.000001 0.000001 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.309343 0.155301 0.040484 -0.034864 0.457898 78.401447 0.000000 17.907293 -0.000001 3.089319 0.561206 17.761345 0.000001 0.000003 0.000000 -0.000001 0.000003 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000072 0.000065 -0.035502 -0.013448 -0.000049 0.000968 -0.000001 -0.000002 0.000002 -0.000000 0.000016 -0.000029 -0.000000 -0.000000 0.000000 -0.000001 0.000016 -0.000028 -0.000002 0.000000 0.000000 -0.000000 0.000003 0.000136 0.061429 0.655752 0.000984 -0.025571 -0.000150 0.001476 0.273059 -0.000363 0.042539 0.000009 -0.000016 0.000028 -0.000000 -0.000000 -0.000000 0.000010 -0.000016 0.000027 -0.000001 0.000000 0.000000 0.000000 0.000002 -0.000102 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.001893 -0.011009 0.000000 0.000000 0.083844 -0.000453 -0.006118 -0.184133 0.000280 0.007331 -0.122059 0.000000 0.000000 0.015596 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.747549 4.127859 -9.169473 -81.945598 -0.000002 -21.219151 -0.000000 -6.945349 -0.999926 -9.301992 -0.000000 0.000001 0.000000 0.000001 -0.000002 0.000001 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.542216 0.272099 0.071503 -0.058883 0.803247 78.078597 0.000001 21.720681 -0.000001 3.213759 0.706481 20.051373 -0.000001 -0.000004 0.000001 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000126 0.000114 -0.062200 -0.023562 -0.000088 0.001594 -0.000000 -0.000001 0.000002 -0.000000 0.000014 -0.000023 0.000000 -0.000000 0.000000 -0.000003 0.000014 -0.000023 -0.000002 -0.000000 0.000000 -0.000000 0.000003 0.000136 0.104669 1.117339 0.001255 -0.044620 -0.000264 0.002652 0.465216 -0.000503 0.072488 0.000011 -0.000015 0.000032 0.000000 0.000000 0.000000 0.000009 -0.000014 0.000030 -0.000001 0.000000 0.000000 0.000000 0.000003 -0.000102 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.002687 -0.016948 0.000000 0.000000 0.125308 -0.000679 -0.009144 -0.275199 0.000411 0.010956 -0.182427 0.000000 0.000000 0.030461 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -1.119040 6.357499 -13.911636 -81.393479 -0.000001 -24.005335 0.000000 -11.591583 -1.491953 -8.662840 0.000000 -0.000006 0.000000 0.000001 0.000001 -0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.835226 0.418891 0.111195 -0.086376 1.238532 77.672003 0.000000 25.358549 -0.000001 3.238284 0.851602 22.271398 -0.000001 -0.000001 0.000001 -0.000000 0.000001 0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.000194 0.000176 -0.095758 -0.036275 -0.000137 0.002380 0.000000 0.000001 -0.000001 -0.000007 0.000016 -0.000029 -0.000000 -0.000000 0.000000 -0.000009 0.000016 -0.000027 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.156462 1.670151 0.001121 -0.068407 -0.000408 0.004120 0.695320 -0.000531 0.108334 0.000013 -0.000017 0.000034 0.000000 0.000000 -0.000000 0.000013 -0.000017 0.000033 -0.000001 0.000001 0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.003603 -0.024041 0.000000 0.000000 0.172244 -0.000939 -0.012568 -0.378273 0.000550 0.015061 -0.250753 0.000001 0.000000 0.052637 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000001 -1.540845 9.112635 -19.324934 -80.180158 -0.000001 -26.394366 -0.000000 -16.942767 -2.123422 -7.958770 0.000001 0.000002 0.000001 0.000001 -0.000002 -0.000001 -0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000000 -1.185572 0.594143 0.159621 -0.115240 1.760046 77.185249 0.000000 28.825755 -0.000001 3.166882 0.990874 24.421078 0.000002 0.000000 0.000000 -0.000001 0.000002 -0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000000 -0.000275 0.000250 -0.135834 -0.051456 -0.000196 0.003319 0.000003 -0.000001 0.000002 -0.000002 0.000014 -0.000025 -0.000000 0.000000 -0.000000 -0.000004 0.000013 -0.000023 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000137 0.215120 2.295991 0.000366 -0.096616 -0.000579 0.005861 0.955776 -0.000391 0.148914 0.000013 -0.000020 0.000036 -0.000000 0.000000 -0.000000 0.000013 -0.000020 0.000035 -0.000001 0.000001 0.000000 0.000000 0.000002 -0.000102 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.004635 -0.032227 0.000000 0.000000 0.223278 -0.001224 -0.016292 -0.490353 0.000694 0.019524 -0.325050 -0.000000 0.000000 0.083586 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -2.001197 12.468550 -25.177194 -78.211731 0.000000 -28.422091 0.000001 -22.838621 -2.895662 -7.235482 0.000000 -0.000003 0.000001 0.000003 -0.000001 -0.000001 0.000001 0.000001 0.000001 0.000000 -0.000000 -0.000000 -1.590479 0.796304 0.216897 -0.143131 2.364114 76.621834 0.000002 32.127875 -0.000002 3.003950 1.119276 26.500292 -0.000001 -0.000004 -0.000000 -0.000000 0.000002 -0.000001 0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000368 0.000335 -0.182085 -0.068976 -0.000264 0.004402 0.000001 0.000000 0.000001 -0.000004 0.000014 -0.000026 0.000000 0.000000 -0.000000 -0.000006 0.000014 -0.000026 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.278958 2.976635 -0.001184 -0.128934 -0.000775 0.007855 1.238997 -0.000033 0.193043 0.000015 -0.000022 0.000043 0.000000 0.000000 -0.000000 0.000015 -0.000023 0.000042 -0.000000 0.000000 0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.005776 -0.041445 0.000000 0.000000 0.277047 -0.001528 -0.020214 -0.608438 0.000836 0.024226 -0.403328 0.000000 0.000000 0.124769 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 -2.488331 16.523221 -31.194444 -75.382681 0.000002 -30.123170 0.000000 -29.097224 -3.797041 -6.538988 -0.000001 0.000001 -0.000000 -0.000001 -0.000001 0.000001 0.000001 -0.000000 0.000000 0.000000 0.000000 -0.000000 -2.047184 1.023809 0.283180 -0.167503 3.047044 75.985144 0.000001 35.270889 -0.000005 2.754200 1.232424 28.509099 -0.000000 -0.000005 -0.000000 0.000000 -0.000004 0.000001 -0.000000 -0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000473 0.000431 -0.234168 -0.088705 -0.000342 0.005624 -0.000001 0.000000 -0.000001 -0.000003 0.000014 -0.000028 -0.000000 -0.000000 0.000000 -0.000004 0.000014 -0.000026 -0.000002 -0.000000 0.000000 -0.000000 0.000003 0.000138 0.346292 3.693828 -0.003640 -0.165044 -0.000996 0.010084 1.537404 0.000581 0.239533 0.000013 -0.000020 0.000039 -0.000000 -0.000000 -0.000000 0.000011 -0.000021 0.000040 -0.000001 -0.000000 -0.000000 0.000000 0.000003 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.007021 -0.051634 0.000000 0.000000 0.332184 -0.001844 -0.024236 -0.729525 0.000973 0.029048 -0.483595 -0.000000 0.000000 0.177650 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 -2.990485 21.380736 -37.076261 -71.589822 -0.000008 -31.530892 -0.000001 -35.521454 -4.801722 -5.909852 0.000000 -0.000001 0.000000 0.000001 -0.000001 -0.000000 -0.000002 -0.000000 -0.000001 0.000000 0.000000 0.000000 -2.552933 1.275072 0.358649 -0.185665 3.805084 75.278486 -0.000001 38.261152 -0.000002 2.422585 1.326652 30.447665 -0.000001 -0.000003 0.000001 0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000590 0.000537 -0.291740 -0.110512 -0.000428 0.006971 0.000001 -0.000001 0.000002 -0.000002 0.000015 -0.000024 -0.000000 -0.000000 0.000000 -0.000003 0.000015 -0.000024 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000136 0.415437 4.429293 -0.007039 -0.204634 -0.001241 0.012525 1.843398 0.001463 0.287202 0.000020 -0.000024 0.000042 -0.000000 -0.000000 -0.000000 0.000020 -0.000024 0.000045 -0.000002 -0.000002 -0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.008361 -0.062734 0.000000 0.000000 0.387320 -0.002164 -0.028258 -0.850611 0.001098 0.033871 -0.563863 0.000000 0.000000 0.243691 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -3.495903 27.116416 -42.521110 -66.764457 -0.000006 -32.677271 0.000001 -41.909207 -5.871762 -5.377324 0.000001 -0.000001 0.000001 0.000001 0.000000 -0.000000 -0.000002 -0.000001 0.000001 0.000000 0.000000 -0.000000 -3.104975 1.548489 0.443501 -0.194808 4.634384 74.505049 0.000002 41.105141 -0.000003 2.014227 1.398858 32.316231 -0.000001 -0.000002 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 0.000000 0.000001 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000716 0.000652 -0.354459 -0.134270 -0.000522 0.008440 -0.000001 -0.000001 0.000002 -0.000006 0.000014 -0.000026 0.000000 0.000000 0.000000 -0.000007 0.000015 -0.000024 -0.000002 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.484698 5.164745 -0.011334 -0.247387 -0.001505 0.015163 2.149390 0.002600 0.334867 0.000022 -0.000028 0.000049 -0.000000 0.000000 -0.000000 0.000021 -0.000027 0.000048 -0.000001 -0.000000 -0.000000 0.000000 0.000003 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.009791 -0.074684 0.000000 0.000000 0.441088 -0.002480 -0.032179 -0.968694 0.001210 0.038574 -0.642140 0.000000 0.000000 0.324354 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -3.992840 33.717359 -47.260428 -60.929754 0.000002 -33.593135 0.000000 -48.064946 -6.962088 -4.955319 -0.000000 0.000001 0.000002 -0.000001 0.000000 -0.000000 0.000002 0.000001 0.000001 0.000000 0.000000 0.000000 -3.700555 1.842434 0.537927 -0.192053 5.530946 73.667955 0.000002 43.809311 -0.000001 1.534362 1.446581 34.115084 -0.000003 -0.000003 0.000000 0.000001 -0.000002 0.000000 0.000001 0.000000 0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000852 0.000777 -0.421980 -0.159846 -0.000625 0.010022 0.000001 0.000001 -0.000001 0.000000 0.000013 -0.000022 0.000000 0.000000 -0.000000 -0.000002 0.000014 -0.000022 -0.000002 0.000000 0.000000 -0.000000 0.000003 0.000137 0.552374 5.881906 -0.016387 -0.292988 -0.001790 0.017976 2.447790 0.003953 0.381343 0.000023 -0.000028 0.000054 -0.000000 -0.000000 -0.000000 0.000026 -0.000029 0.000052 -0.000001 -0.000001 -0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.011304 -0.087423 0.000000 0.000000 0.492124 -0.002782 -0.035901 -1.080774 0.001308 0.043038 -0.716437 0.000000 0.000000 0.421101 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -4.469562 41.006618 -51.098527 -54.274517 -0.000003 -34.308382 0.000001 -53.809576 -8.026709 -4.641385 -0.000001 -0.000001 0.000001 0.000001 0.000001 0.000000 0.000001 -0.000001 0.000001 -0.000000 -0.000000 -0.000000 -4.336911 2.155264 0.642107 -0.174490 6.490612 72.770222 0.000002 46.380092 -0.000004 0.988288 1.467925 35.844570 0.000002 0.000001 -0.000000 0.000002 -0.000001 0.000000 0.000001 0.000000 0.000001 -0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.000997 0.000911 -0.493962 -0.187112 -0.000734 0.011707 0.000002 0.000000 0.000003 -0.000005 0.000011 -0.000023 0.000000 -0.000000 0.000000 -0.000008 0.000013 -0.000023 -0.000001 0.000001 0.000000 -0.000000 0.000003 0.000136 0.616745 6.562511 -0.021977 -0.341123 -0.002092 0.020947 2.731014 0.005463 0.425444 0.000023 -0.000029 0.000058 0.000000 -0.000000 0.000000 0.000024 -0.000029 0.000057 -0.000001 0.000001 0.000000 0.000000 0.000003 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.012894 -0.100891 0.000000 0.000000 0.539059 -0.003064 -0.039324 -1.183849 0.001391 0.047144 -0.784764 0.000001 0.000000 0.535395 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000001 -4.914358 48.592059 -53.950824 -47.203140 0.000001 -34.852246 0.000001 -58.986340 -9.024194 -4.418788 0.000001 0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000003 0.000001 0.000001 0.000000 0.000000 0.000000 -5.011262 2.485317 0.756197 -0.139209 7.509018 71.814781 0.000004 48.823749 -0.000004 0.381319 1.461540 37.505033 -0.000000 -0.000001 0.000004 -0.000002 0.000000 -0.000001 0.000002 0.000000 0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.001150 0.001052 -0.570061 -0.215937 -0.000851 0.013490 0.000003 -0.000000 0.000002 -0.000003 0.000012 -0.000019 0.000000 -0.000000 0.000000 -0.000002 0.000011 -0.000017 -0.000001 0.000001 0.000000 -0.000000 0.000003 0.000137 0.676076 7.188336 -0.027805 -0.391477 -0.002414 0.024052 2.991465 0.007044 0.465991 0.000023 -0.000032 0.000064 0.000000 -0.000001 -0.000000 0.000024 -0.000033 0.000063 -0.000001 -0.000001 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.014553 -0.115026 0.000000 0.000000 0.580524 -0.003315 -0.042348 -1.274917 0.001457 0.050772 -0.845131 0.000000 0.000000 0.668697 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -5.315515 55.900631 -55.863895 -40.300292 0.000001 -35.253461 0.000000 -63.462061 -9.920800 -4.260615 -0.000001 -0.000000 0.000001 0.000002 -0.000001 -0.000000 0.000003 0.000001 0.000001 -0.000000 0.000000 0.000000 -5.720816 2.830914 0.880316 -0.083349 8.581574 70.804514 0.000002 51.146294 -0.000002 -0.281255 1.426583 39.096846 0.000000 0.000003 0.000002 -0.000000 0.000000 -0.000000 0.000001 -0.000001 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.001310 0.001200 -0.649935 -0.246192 -0.000974 0.015362 0.000000 -0.000000 -0.000001 -0.000002 0.000010 -0.000019 -0.000000 0.000000 -0.000000 -0.000004 0.000010 -0.000019 -0.000002 -0.000000 -0.000000 -0.000000 0.000003 0.000138 0.728612 7.741180 -0.033505 -0.443735 -0.002749 0.027276 3.221558 0.008594 0.501812 0.000029 -0.000033 0.000063 0.000000 -0.000001 0.000000 0.000026 -0.000034 0.000063 -0.000002 -0.000001 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.016275 -0.129769 0.000000 0.000000 0.615154 -0.003526 -0.044873 -1.350978 0.001509 0.053801 -0.895549 -0.000000 0.000000 0.822470 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -5.661339 62.310641 -56.999240 -34.198163 -0.000002 -35.540579 0.000001 -67.123691 -10.690951 -4.134499 -0.000000 -0.000001 0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000001 0.000001 -0.000000 0.000000 -0.000000 -6.462753 3.190360 1.014538 -0.004121 9.703464 69.742201 0.000001 53.353531 -0.000001 -0.994191 1.362679 40.620416 0.000001 -0.000002 -0.000001 0.000000 0.000003 -0.000000 -0.000000 -0.000001 0.000004 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.001477 0.001355 -0.733241 -0.277745 -0.001104 0.017312 0.000003 0.000000 0.000001 0.000001 0.000010 -0.000019 0.000000 0.000000 0.000000 -0.000000 0.000010 -0.000017 -0.000001 0.000001 0.000000 -0.000000 0.000003 0.000137 0.772585 8.202880 -0.038662 -0.497582 -0.003094 0.030595 3.413719 0.009999 0.531720 0.000032 -0.000035 0.000065 -0.000000 -0.000000 -0.000000 0.000031 -0.000036 0.000063 -0.000002 -0.000001 -0.000000 0.000000 0.000003 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.018053 -0.145058 0.000000 0.000000 0.641583 -0.003688 -0.046800 -1.409028 0.001545 0.056114 -0.934027 0.000000 0.000000 0.998176 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000001 0.000000 -5.940133 67.297335 -57.580646 -29.430414 -0.000001 -35.742073 -0.000001 -69.871326 -11.315307 -4.006797 -0.000000 -0.000000 -0.000003 0.000002 -0.000001 -0.000001 0.000001 -0.000003 -0.000001 0.000000 -0.000000 0.000000 -7.234231 3.561950 1.158881 0.101145 10.869630 68.630588 0.000003 55.450983 -0.000010 -1.752325 1.269873 42.076158 -0.000001 0.000005 0.000000 0.000000 0.000000 -0.000000 -0.000001 -0.000001 -0.000001 0.000001 -0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.001650 0.001516 -0.819634 -0.310469 -0.001240 0.019336 -0.000000 -0.000000 0.000000 -0.000004 0.000011 -0.000019 0.000000 0.000000 0.000000 -0.000004 0.000011 -0.000017 -0.000002 -0.000000 -0.000000 -0.000000 0.000003 0.000138 0.806213 8.555298 -0.042845 -0.552703 -0.003455 0.033995 3.560360 0.011134 0.554540 0.000030 -0.000035 0.000069 0.000000 -0.000001 -0.000000 0.000030 -0.000035 0.000068 -0.000002 -0.000004 -0.000000 0.000000 0.000003 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.019881 -0.160833 0.000000 0.000000 0.658443 -0.003792 -0.048029 -1.446067 0.001567 0.057589 -0.958575 0.000001 0.000000 1.197274 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000001 0.000001 -6.140197 70.490073 -57.828548 -26.374673 -0.000002 -35.886514 0.000001 -71.609076 -11.777328 -3.845803 -0.000001 0.000003 0.000002 0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -8.032366 3.943972 1.313301 0.234956 12.074767 67.472454 -0.000001 57.443851 -0.000008 -2.550582 1.148632 43.464534 0.000002 -0.000000 -0.000000 0.000004 0.000002 -0.000001 -0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.001828 0.001682 -0.908773 -0.344232 -0.001381 0.021423 0.000003 -0.000001 0.000000 -0.000001 0.000009 -0.000018 0.000000 0.000000 0.000000 -0.000002 0.000008 -0.000018 -0.000001 0.000000 -0.000000 -0.000000 0.000002 0.000137 0.827712 8.780294 -0.045627 -0.608784 -0.003826 0.037452 3.653901 0.011893 0.569097 0.000027 -0.000038 0.000068 0.000000 0.000000 -0.000000 0.000026 -0.000037 0.000067 -0.000002 -0.000002 -0.000000 -0.000000 0.000000 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.021753 -0.177032 0.000000 0.000000 0.664366 -0.003829 -0.048461 -1.459094 0.001575 0.058108 -0.967204 -0.000000 0.000000 1.421226 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000001 -0.000000 -6.249805 71.627169 -57.904404 -25.297574 -0.000003 -36.002665 0.000000 -72.234318 -12.058886 -3.624198 -0.000000 -0.000002 0.000001 -0.000000 -0.000001 0.000000 -0.000002 -0.000004 0.000001 0.000000 -0.000000 -0.000000 -8.854259 4.334715 1.477682 0.399628 13.313357 66.270470 0.000004 59.337016 -0.000007 -3.384018 0.999762 44.786100 -0.000002 0.000001 0.000002 0.000001 0.000002 0.000000 0.000001 -0.000002 0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.002010 0.001853 -1.000315 -0.378905 -0.001528 0.023567 0.000003 -0.000000 0.000002 -0.000003 0.000010 -0.000018 0.000000 -0.000000 -0.000000 -0.000005 0.000009 -0.000017 -0.000000 0.000001 0.000000 -0.000000 0.000003 0.000138 0.835300 8.859727 -0.046629 -0.665509 -0.004202 0.040948 3.686765 0.012163 0.574209 0.000028 -0.000038 0.000068 -0.000000 0.000000 -0.000000 0.000028 -0.000037 0.000067 -0.000002 -0.000001 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.023660 -0.193596 0.000000 0.000000 0.664366 -0.003829 -0.048461 -1.413824 0.001548 0.056305 -0.911376 0.000000 0.000000 1.720455 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.142217 0.014926 -6.307872 71.613304 -57.924273 -25.362944 -0.000001 -36.115964 -0.000002 -72.027698 -12.245589 -3.286686 -0.000001 0.000000 0.000002 -0.000001 -0.000001 0.000000 -0.000001 0.000000 -0.000001 0.000000 0.000000 -0.000000 -9.696970 4.732464 1.651827 0.597250 14.579640 65.027376 0.000011 61.135131 -0.000011 -4.247792 0.824398 46.041383 -0.000001 0.000002 -0.000002 0.000000 -0.000001 0.000000 0.000003 -0.000001 -0.000000 0.000001 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000001 0.000001 -0.000000 0.000001 0.000001 -0.000000 -0.002197 0.002028 -1.093914 -0.414357 -0.001679 0.025757 0.000000 -0.000001 0.000002 -0.000002 0.000006 -0.000013 -0.000000 0.000000 0.000000 -0.000003 0.000006 -0.000012 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.835380 8.860240 -0.033083 -0.722592 -0.004585 0.044467 3.686762 0.012164 0.574209 0.000031 -0.000037 0.000068 0.000000 -0.000000 -0.000000 0.000032 -0.000036 0.000066 -0.000002 -0.000002 -0.000000 0.000000 0.000003 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.025598 -0.210464 0.000000 0.000000 0.664366 -0.003829 -0.048461 -1.282081 0.001463 0.051057 -0.748931 0.000000 0.000000 2.138493 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.556406 0.058657 -6.361210 71.511971 -57.942851 -25.571552 0.000000 -36.232914 -0.000001 -71.363346 -12.434078 -2.796823 -0.000000 0.000001 -0.000001 -0.000001 0.000000 0.000000 0.000000 -0.000001 0.000000 -0.000000 0.000000 -0.000000 -10.557510 5.135518 1.835459 0.829625 15.867687 63.745964 0.000002 62.842440 -0.000013 -5.137192 0.623962 47.231062 -0.000000 -0.000003 0.000002 0.000003 0.000000 -0.000001 0.000002 0.000004 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.002386 0.002207 -1.189232 -0.450458 -0.001834 0.027989 -0.000003 -0.000002 0.000002 0.000002 0.000007 -0.000011 0.000000 -0.000000 0.000000 0.000001 0.000007 -0.000011 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.835505 8.860619 0.006341 -0.779856 -0.004973 0.047995 3.686766 0.012163 0.574213 0.000025 -0.000034 0.000068 0.000000 -0.000001 0.000000 0.000025 -0.000036 0.000067 -0.000002 -0.000001 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.027559 -0.227574 0.000000 0.000000 0.664366 -0.003829 -0.048461 -1.070003 0.001299 0.042609 -0.487420 0.000000 0.000000 2.666502 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -1.224309 0.129593 -6.409615 71.328888 -57.959073 -25.914122 -0.000001 -36.353894 -0.000001 -70.264751 -12.616533 -2.159601 -0.000000 0.000002 0.000000 -0.000001 -0.000000 -0.000000 0.000001 -0.000002 0.000000 -0.000000 -0.000000 0.000001 -11.432874 5.542191 2.028210 1.098248 17.171440 62.429124 -0.000002 64.462957 -0.000009 -6.047659 0.400125 48.355888 0.000000 0.000003 0.000000 0.000003 0.000000 0.000001 -0.000000 0.000001 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.002578 0.002388 -1.285921 -0.487081 -0.001993 0.030252 0.000004 -0.000001 0.000002 0.000001 0.000007 -0.000011 -0.000000 -0.000000 0.000000 -0.000000 0.000006 -0.000012 -0.000001 0.000000 -0.000000 -0.000000 0.000003 0.000137 0.835673 8.860880 0.069799 -0.837154 -0.005365 0.051527 3.686766 0.012167 0.574209 0.000032 -0.000036 0.000069 0.000000 0.000000 0.000000 0.000030 -0.000037 0.000068 -0.000002 -0.000001 -0.000000 0.000000 0.000003 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.029536 -0.244867 0.000000 0.000000 0.664366 -0.003829 -0.048461 -0.783720 0.001029 0.031207 -0.134369 -0.000000 -0.000000 3.295680 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -2.128070 0.226079 -6.452567 71.069921 -57.971599 -26.381264 -0.000003 -36.479303 -0.000001 -68.752834 -12.782418 -1.379662 -0.000001 0.000000 0.000003 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 0.000001 -12.320002 5.950818 2.229622 1.404252 18.484683 61.079827 0.000011 66.000364 -0.000014 -6.974749 0.154779 49.416685 0.000001 0.000003 -0.000002 -0.000000 0.000000 -0.000000 0.000002 0.000002 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.002772 0.002572 -1.383640 -0.524093 -0.002155 0.032541 -0.000001 -0.000001 0.000000 0.000001 0.000006 -0.000010 -0.000000 0.000000 0.000000 -0.000000 0.000006 -0.000008 -0.000002 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.835879 8.861023 0.155445 -0.894334 -0.005759 0.055050 3.686769 0.012165 0.574212 0.000031 -0.000036 0.000064 0.000000 -0.000002 0.000000 0.000032 -0.000036 0.000065 -0.000001 -0.000000 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.031524 -0.262280 0.000000 0.000000 0.664366 -0.003829 -0.048461 -0.429354 0.000617 0.017095 0.302705 -0.000000 -0.000000 4.017224 -0.000000 -0.000000 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -3.250022 0.346376 -6.489320 70.741062 -57.978935 -26.963425 -0.000001 -36.609500 -0.000002 -66.847246 -12.918826 -0.462049 0.000000 -0.000004 0.000001 -0.000000 -0.000001 -0.000000 0.000000 -0.000004 -0.000001 -0.000000 0.000000 -0.000001 -13.215790 6.359761 2.439138 1.748368 19.801166 59.701222 0.000001 67.458056 -0.000017 -7.914134 -0.110004 50.414384 0.000001 0.000002 -0.000003 0.000006 -0.000001 -0.000000 -0.000002 -0.000001 -0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.002967 0.002757 -1.482045 -0.561364 -0.002320 0.034845 0.000002 -0.000001 0.000002 -0.000003 0.000005 -0.000009 -0.000000 0.000000 -0.000000 -0.000004 0.000005 -0.000009 -0.000000 0.000000 0.000000 -0.000000 0.000003 0.000137 0.836121 8.861060 0.261433 -0.951252 -0.006154 0.058556 3.686765 0.012168 0.574206 0.000028 -0.000036 0.000069 0.000000 0.000000 -0.000000 0.000027 -0.000035 0.000068 -0.000002 -0.000001 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.033514 -0.279755 0.000000 0.000000 0.664365 -0.003829 -0.048461 -0.013029 0.000020 0.000519 0.816287 -0.000000 -0.000000 4.822313 -0.000001 -0.000000 -179.999991 -0.000044 0.000003 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000000 -0.000000 -4.572483 0.488640 -6.518979 70.348490 -57.979495 -27.650947 -0.000002 -36.744881 -0.000001 -64.567513 -13.010894 0.587063 -0.000001 0.000000 -0.000000 -0.000000 -0.000002 -0.000000 0.000000 -0.000003 0.000000 -0.000000 0.000000 -0.000000 -14.117122 6.767424 2.656112 2.130891 21.114611 58.296675 0.000020 68.839182 -0.000016 -8.861654 -0.391994 51.350011 -0.000000 0.000001 0.000003 0.000004 -0.000002 -0.000004 0.000001 -0.000002 0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.003162 0.002944 -1.580794 -0.598766 -0.002487 0.037156 -0.000000 0.000000 0.000001 0.000003 0.000001 -0.000000 0.000000 -0.000000 -0.000000 0.000002 0.000001 0.000001 -0.000000 0.000001 -0.000000 -0.000000 0.000003 0.000136 0.836395 8.861000 0.385915 -1.007755 -0.006550 0.062038 3.686763 0.012162 0.574212 0.000024 -0.000031 0.000064 0.000000 0.000000 -0.000000 0.000026 -0.000033 0.000061 -0.000002 -0.000003 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.035502 -0.297230 0.000000 0.000000 0.664366 -0.003829 -0.048461 0.459122 -0.000801 -0.018274 1.398848 -0.000000 -0.000000 5.702079 -0.000001 -0.000000 -179.999991 -0.000044 0.000003 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -6.077570 0.650899 -6.540558 69.898544 -57.971586 -28.433949 0.000001 -36.885839 -0.000001 -61.934441 -13.042296 1.759552 -0.000000 -0.000003 -0.000001 -0.000000 0.000000 -0.000000 0.000001 0.000001 -0.000000 -0.000000 0.000000 -0.000001 -15.020824 7.172246 2.879794 2.551628 22.418805 56.869825 0.000017 70.146630 -0.000009 -9.813235 -0.688845 52.224736 0.000001 0.000004 -0.000000 -0.000000 0.000000 0.000000 0.000002 -0.000003 0.000003 0.000001 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.003357 0.003131 -1.679541 -0.636167 -0.002655 0.039467 0.000000 -0.000002 0.000002 0.000005 0.000003 -0.000004 0.000000 0.000000 -0.000000 0.000005 0.000004 -0.000004 -0.000002 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.836699 8.860846 0.527044 -1.063698 -0.006947 0.065484 3.686768 0.012164 0.574207 0.000027 -0.000034 0.000062 0.000001 0.000001 0.000000 0.000029 -0.000034 0.000061 -0.000002 -0.000003 -0.000000 0.000000 0.000002 -0.000100 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
0.000000 1.067000 0.037479 -0.314644 0.000000 0.000000 0.664366 -0.003829 -0.048461 0.980960 -0.001890 -0.039036 2.042838 0.000000 -0.000000 6.647603 -0.000001 -0.000000 -179.999991 -0.000044 0.000003 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -7.747052 0.831032 -6.553089 69.397755 -57.953561 -29.302318 -0.000000 -37.032760 -0.000001 -58.971170 -12.995909 3.044659 -0.000000 0.000001 0.000003 0.000001 0.000001 -0.000000 -0.000000 -0.000003 0.000000 -0.000000 -0.000000 0.000000 -15.923684 7.572720 3.109344 3.009859 23.707634 55.424554 0.000009 71.383024 -0.000010 -10.764923 -0.998107 53.039854 0.000001 -0.000002 -0.000002 -0.000004 -0.000000 -0.000002 0.000005 0.000002 0.000003 0.000001 -0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.003550 0.003317 -1.777948 -0.673438 -0.002824 0.041771 0.000005 -0.000002 0.000004 -0.000000 0.000004 -0.000007 0.000000 -0.000000 0.000000 -0.000003 0.000003 -0.000006 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.837029 8.860615 0.682970 -1.118932 -0.007339 0.068886 3.686763 0.012165 0.574210 0.000027 -0.000033 0.000062 -0.000000 0.000001 0.000000 0.000027 -0.000033 0.000061 -0.000001 -0.000000 -0.000000 0.000000 0.000004 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.039440 -0.331936 0.000000 0.000000 0.664366 -0.003829 -0.048461 1.546321 -0.003284 -0.061517 2.740680 -0.000000 -0.000000 7.649884 -0.000001 -0.000001 -179.999991 -0.000044 0.000003 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 -9.562214 1.026768 -6.555662 68.852938 -57.923843 -30.245816 0.000004 -37.186022 -0.000001 -55.704195 -12.854653 4.428378 -0.000002 -0.000006 0.000001 0.000002 0.000000 -0.000000 0.000003 -0.000002 0.000000 0.000001 -0.000000 0.000000 -16.822479 7.967396 3.343829 3.504308 24.975113 53.965130 0.000028 72.550761 -0.000028 -11.712852 -1.317287 53.796745 0.000000 -0.000002 0.000000 -0.000003 -0.000002 0.000000 0.000003 0.000003 -0.000003 -0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.003743 0.003503 -1.875667 -0.710450 -0.002994 0.044058 -0.000000 -0.000001 0.000002 -0.000001 0.000002 -0.000001 0.000000 -0.000000 0.000000 -0.000001 0.000002 0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000002 0.000137 0.837382 8.860303 0.851843 -1.173306 -0.007732 0.072235 3.686770 0.012164 0.574211 0.000028 -0.000032 0.000060 0.000001 0.000002 -0.000000 0.000026 -0.000032 0.000060 -0.000002 -0.000002 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.041378 -0.349046 0.000000 0.000000 0.664366 -0.003829 -0.048461 2.149037 -0.005013 -0.085467 3.484763 0.000000 -0.000000 8.699859 -0.000001 -0.000001 -179.999991 -0.000044 0.000002 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000000 -11.503818 1.235688 -6.547515 68.270992 -57.880949 -31.253928 -0.000003 -37.346054 -0.000001 -52.164139 -12.602466 5.893106 -0.000001 -0.000001 0.000000 0.000002 0.000000 0.000000 0.000001 -0.000001 0.000000 -0.000001 0.000000 0.000000 -17.713932 8.354871 3.582219 4.033112 26.215530 52.496192 0.000009 73.652020 -0.000014 -12.653268 -1.643821 54.496925 0.000001 -0.000001 -0.000000 -0.000002 0.000001 0.000000 0.000003 -0.000000 0.000001 0.000001 -0.000001 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.003932 0.003686 -1.972356 -0.747072 -0.003163 0.046320 -0.000002 -0.000000 0.000000 0.000004 0.000002 0.000002 -0.000000 -0.000000 0.000000 0.000001 0.000001 0.000001 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.837755 8.859929 1.031813 -1.226674 -0.008119 0.075521 3.686767 0.012164 0.574211 0.000020 -0.000029 0.000052 0.000000 0.000002 -0.000000 0.000020 -0.000028 0.000052 -0.000001 -0.000002 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.043285 -0.365914 0.000000 0.000000 0.664367 -0.003829 -0.048461 2.782909 -0.007103 -0.110635 4.267443 -0.000000 -0.000000 9.788394 -0.000001 -0.000001 -179.999991 -0.000044 0.000003 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -13.552004 1.455236 -6.528098 67.659089 -57.823548 -32.316033 0.000001 -37.513209 -0.000002 -48.386126 -12.225502 7.417673 -0.000001 0.000002 -0.000001 0.000002 -0.000001 -0.000000 0.000002 -0.000002 -0.000000 0.000001 0.000000 -0.000000 -18.594753 8.733818 3.823408 4.593791 27.423425 51.022842 0.000011 74.688788 -0.000009 -13.582483 -1.975154 55.142071 0.000002 -0.000001 -0.000000 -0.000002 0.000000 0.000001 0.000001 0.000002 0.000002 -0.000001 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.004119 0.003868 -2.067673 -0.783174 -0.003331 0.048552 0.000002 -0.000002 0.000004 -0.000000 0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000002 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.838146 8.859497 1.221029 -1.278887 -0.008499 0.078735 3.686766 0.012166 0.574210 0.000029 -0.000028 0.000051 -0.000000 0.000000 0.000000 0.000024 -0.000027 0.000049 -0.000002 -0.000003 -0.000000 0.000000 0.000004 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.045157 -0.382478 0.000000 0.000000 0.664366 -0.003829 -0.048461 3.441733 -0.009570 -0.136766 5.081046 -0.000001 -0.000000 10.906268 -0.000001 -0.000001 -179.999991 -0.000044 0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -15.686371 1.682758 -6.497118 67.024489 -57.750527 -33.421345 0.000002 -37.687901 -0.000001 -44.409603 -11.713331 8.977676 0.000002 -0.000006 0.000003 0.000003 -0.000001 -0.000000 0.000002 -0.000000 0.000000 0.000000 0.000000 -0.000000 -19.461608 9.102976 4.066199 5.183232 28.593665 49.550560 0.000003 75.662841 -0.000017 -14.496865 -2.308712 55.733893 -0.000002 0.000000 -0.000000 -0.000001 0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.004302 0.004047 -2.161273 -0.818626 -0.003498 0.050743 0.000001 -0.000001 0.000002 0.000005 0.000001 0.000000 -0.000000 -0.000000 0.000000 0.000004 0.000002 -0.000000 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000138 0.838551 8.859017 1.417639 -1.329795 -0.008873 0.081870 3.686765 0.012162 0.574213 0.000023 -0.000028 0.000049 0.000000 0.000001 -0.000000 0.000024 -0.000028 0.000048 -0.000002 -0.000002 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.046985 -0.398678 0.000000 0.000000 0.664366 -0.003829 -0.048461 4.119276 -0.012420 -0.163609 5.917872 -0.000001 -0.000000 12.044226 -0.000002 -0.000001 -179.999991 -0.000044 0.000003 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000000 -0.000000 0.000000 -17.885969 1.915535 -6.454604 66.374508 -57.660962 -34.559029 0.000001 -37.870541 -0.000001 -40.277919 -11.060029 10.546387 -0.000000 0.000003 -0.000001 0.000001 0.000001 -0.000001 0.000003 -0.000003 0.000001 0.000000 -0.000000 -0.000000 -20.311178 9.461142 4.309330 5.797669 29.721500 48.085389 0.000002 76.575805 -0.000026 -15.392856 -2.641978 56.274263 -0.000001 0.000002 0.000000 -0.000000 -0.000002 -0.000003 0.000003 -0.000002 -0.000002 0.000000 0.000001 0.000001 0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 -0.004481 0.004222 -2.252814 -0.853298 -0.003662 0.052884 -0.000001 -0.000002 0.000002 0.000006 0.000001 0.000001 -0.000000 -0.000000 0.000000 0.000004 0.000001 0.000000 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.838966 8.858492 1.619792 -1.379253 -0.009241 0.084913 3.686767 0.012163 0.574214 0.000021 -0.000028 0.000051 0.000000 -0.000000 -0.000000 0.000020 -0.000027 0.000050 -0.000001 -0.000002 -0.000000 0.000000 0.000001 -0.000102 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.048763 -0.414452 0.000000 0.000000 0.664366 -0.003829 -0.048461 4.809308 -0.015650 -0.190910 6.770185 -0.000001 -0.000001 13.192956 -0.000002 -0.000001 -179.999991 -0.000044 0.000003 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 0.000001 0.000000 0.000000 -20.129430 2.150832 -6.400933 65.716604 -57.554200 -35.718215 0.000004 -38.061502 -0.000002 -36.037086 -10.265110 12.095984 0.000002 0.000002 -0.000000 0.000002 -0.000002 -0.000001 0.000002 0.000000 -0.000000 0.000000 -0.000000 0.000000 -21.140093 9.807206 4.551465 6.432706 30.802569 46.633793 0.000014 77.429101 -0.000016 -16.266930 -2.972452 56.765139 0.000001 -0.000000 -0.000000 -0.000001 -0.000001 -0.000003 0.000002 0.000000 0.000001 -0.000001 0.000001 0.000001 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.004655 0.004392 -2.341954 -0.887062 -0.003823 0.054970 -0.000000 -0.000003 0.000005 0.000003 0.000001 -0.000002 -0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000001 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000137 0.839389 8.857937 1.825637 -1.427108 -0.009597 0.087859 3.686765 0.012162 0.574212 0.000021 -0.000027 0.000046 0.000000 0.000001 -0.000000 0.000022 -0.000028 0.000046 -0.000002 -0.000003 -0.000000 0.000000 0.000004 -0.000102 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.050485 -0.429741 0.000000 0.000000 0.664366 -0.003829 -0.048461 5.505581 -0.019242 -0.218417 7.630247 -0.000001 -0.000001 14.343112 -0.000002 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -22.395089 2.385960 -6.336851 65.058071 -57.429822 -36.888059 0.000001 -38.261183 -0.000002 -31.734633 -9.333963 13.599042 0.000000 -0.000003 0.000000 0.000002 0.000003 -0.000001 0.000003 -0.000001 -0.000000 0.000001 -0.000000 0.000000 -21.944988 10.140102 4.791206 7.083322 31.832985 45.202807 0.000015 78.224080 -0.000013 -17.115593 -3.297702 57.208589 -0.000001 0.000000 -0.000001 -0.000002 -0.000002 -0.000002 -0.000000 0.000002 0.000002 -0.000003 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.004823 0.004558 -2.428348 -0.919784 -0.003981 0.056991 0.000003 0.000001 -0.000001 0.000003 -0.000001 0.000004 0.000000 0.000000 -0.000000 0.000002 -0.000001 0.000004 -0.000001 0.000000 0.000000 -0.000000 0.000003 0.000137 0.839815 8.857353 2.033320 -1.473212 -0.009946 0.090697 3.686764 0.012162 0.574211 0.000018 -0.000027 0.000046 0.000000 -0.000001 -0.000000 0.000019 -0.000026 0.000045 -0.000002 -0.000003 -0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.052144 -0.444484 0.000000 0.000000 0.664366 -0.003829 -0.048461 6.201847 -0.023168 -0.245878 8.490306 -0.000000 -0.000001 15.485350 -0.000002 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -24.661081 2.618325 -6.263476 64.406116 -57.287713 -38.057879 -0.000000 -38.470026 -0.000002 -27.417867 -8.277919 15.030130 0.000000 0.000002 0.000003 0.000002 0.000001 -0.000000 0.000003 -0.000002 -0.000000 0.000001 0.000000 -0.000000 -22.722479 10.458850 5.027103 7.743895 32.809285 43.799882 -0.000002 78.961877 -0.000014 -17.935370 -3.615363 57.606744 -0.000001 0.000003 -0.000001 0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000002 -0.000002 -0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 -0.004985 0.004718 -2.511652 -0.951338 -0.004134 0.058941 0.000001 -0.000000 0.000000 0.000006 -0.000001 0.000003 -0.000000 0.000000 0.000000 0.000006 -0.000002 0.000002 -0.000001 -0.000000 -0.000000 -0.000000 0.000002 0.000137 0.840243 8.856748 2.240992 -1.517422 -0.010280 0.093417 3.686767 0.012163 0.574211 0.000020 -0.000024 0.000046 -0.000000 0.000000 -0.000000 0.000021 -0.000024 0.000048 -0.000001 -0.000002 -0.000001 0.000000 0.000003 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.053734 -0.458619 0.000000 0.000000 0.664366 -0.003829 -0.048461 6.891850 -0.027386 -0.273043 9.342605 -0.000001 -0.000001 16.610325 -0.000002 -0.000001 -179.999991 -0.000044 0.000003 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 0.000000 0.000000 -26.905582 2.845490 -6.182301 63.767889 -57.127982 -39.217133 -0.000001 -38.688404 -0.000002 -23.132519 -7.113712 16.367276 -0.000001 0.000002 0.000001 0.000002 0.000002 0.000000 -0.000001 -0.000001 -0.000001 -0.000000 -0.000000 -0.000000 -23.469191 10.762533 5.257664 8.408249 33.728475 42.432977 0.000017 79.643564 -0.000010 -18.722788 -3.923162 57.961812 -0.000001 0.000003 0.000001 -0.000003 0.000000 -0.000005 -0.000000 -0.000002 0.000003 -0.000001 -0.000002 -0.000001 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.005140 0.004871 -2.591526 -0.981593 -0.004281 0.060810 0.000001 -0.000000 0.000000 0.000003 -0.000003 0.000005 -0.000000 -0.000000 0.000000 0.000003 -0.000002 0.000006 -0.000001 0.000000 -0.000000 -0.000000 0.000003 0.000137 0.840668 8.856139 2.446801 -1.559582 -0.010602 0.096012 3.686770 0.012160 0.574212 0.000017 -0.000022 0.000042 0.000000 0.000001 -0.000000 0.000017 -0.000022 0.000042 -0.000001 -0.000002 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.055247 -0.472087 0.000000 0.000000 0.664366 -0.003829 -0.048461 7.569352 -0.031848 -0.299664 10.179413 -0.000001 -0.000001 17.708703 -0.000002 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000001 -0.000000 0.000000 -29.106909 3.065219 -6.095133 63.150167 -56.951019 -40.355524 0.000001 -38.916727 -0.000003 -18.921460 -5.862560 17.593118 -0.000007 -0.000001 0.000000 0.000002 -0.000001 -0.000002 0.000002 -0.000001 -0.000001 0.000002 -0.000000 0.000000 -24.181735 11.050284 5.481356 9.069714 34.587996 41.110410 0.000038 80.270091 -0.000041 -19.474389 -4.218897 58.276076 0.000001 0.000000 -0.000000 -0.000001 0.000003 0.000001 0.000000 -0.000002 -0.000002 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.005288 0.005018 -2.667626 -1.010418 -0.004423 0.062591 0.000001 -0.000000 -0.000002 0.000008 -0.000003 0.000007 -0.000000 -0.000000 0.000000 0.000007 -0.000002 0.000007 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000137 0.841085 8.855525 2.648900 -1.599548 -0.010907 0.098471 3.686765 0.012162 0.574213 0.000021 -0.000021 0.000041 -0.000000 0.000001 -0.000000 0.000019 -0.000021 0.000040 -0.000002 -0.000003 -0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.056677 -0.484826 0.000000 0.000000 0.664367 -0.003829 -0.048461 8.228116 -0.036486 -0.325497 10.992985 -0.000001 -0.000001 18.771195 -0.000002 -0.000001 -179.999991 -0.000044 0.000002 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000001 -0.000000 -0.000000 -31.243635 3.275511 -6.004089 62.559560 -56.757438 -41.463077 0.000001 -39.155432 -0.000001 -14.823761 -4.548837 18.695572 -0.000001 -0.000003 0.000002 0.000002 -0.000002 -0.000002 0.000001 0.000001 0.000001 -0.000002 -0.000000 0.000000 -24.856723 11.321311 5.696622 9.721196 35.385728 39.840958 0.000013 80.842310 -0.000033 -20.186709 -4.500487 58.551865 0.000001 -0.000002 0.000001 -0.000000 -0.000002 0.000001 0.000001 -0.000002 0.000000 -0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.005427 0.005157 -2.739606 -1.037683 -0.004557 0.064274 0.000003 -0.000001 0.000002 0.000009 -0.000004 0.000008 -0.000000 -0.000000 0.000000 0.000005 -0.000004 0.000009 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 0.841493 8.854918 2.845437 -1.637170 -0.011197 0.100787 3.686768 0.012163 0.574213 0.000018 -0.000020 0.000034 0.000000 -0.000001 0.000000 0.000018 -0.000019 0.000033 -0.000001 -0.000002 -0.000000 0.000000 0.000002 -0.000099 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.058017 -0.496776 0.000000 0.000000 0.664366 -0.003829 -0.048461 8.861920 -0.041230 -0.350299 11.775638 -0.000001 -0.000001 19.788588 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000003 -0.000000 -0.000000 -0.000003 -0.000000 -0.000000 -0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -33.294826 3.474629 -5.911533 62.002265 -56.548103 -42.530133 0.000002 -39.404936 -0.000002 -10.874247 -3.198651 19.668086 -0.000001 0.000003 -0.000002 0.000002 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -25.490788 11.574860 5.901881 10.355257 36.119949 38.633623 0.000031 81.361043 -0.000036 -20.856269 -4.765931 58.791529 -0.000001 0.000000 -0.000001 -0.000003 -0.000002 -0.000000 0.000002 -0.000002 0.000001 -0.000002 -0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.005558 0.005287 -2.807129 -1.063260 -0.004684 0.065853 -0.000000 -0.000001 0.000002 0.000007 -0.000005 0.000014 -0.000000 -0.000000 -0.000000 0.000006 -0.000005 0.000015 -0.000001 -0.000000 -0.000000 -0.000000 0.000002 0.000136 0.841887 8.854324 3.034564 -1.672301 -0.011469 0.102948 3.686770 0.012164 0.574212 0.000015 -0.000017 0.000031 0.000000 -0.000000 0.000000 0.000014 -0.000018 0.000032 -0.000001 -0.000001 0.000000 0.000000 0.000001 -0.000099 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.059262 -0.507876 0.000000 0.000000 0.664366 -0.003829 -0.048461 9.464554 -0.045994 -0.373832 12.519685 -0.000001 -0.000001 20.751691 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 -0.000000 0.000000 0.000002 -0.000000 0.000000 0.000002 -0.000000 -0.000000 -0.000002 0.000000 -0.000000 -35.240020 3.661103 -5.820023 61.484086 -56.324001 -43.547428 0.000002 -39.665661 -0.000002 -7.103435 -1.838469 20.509424 0.000001 -0.000003 0.000000 0.000001 -0.000001 -0.000001 0.000002 -0.000001 -0.000000 0.000000 0.000000 -0.000000 -26.080539 11.810205 6.095543 10.964170 36.789229 37.497687 0.000039 81.826978 -0.000032 -21.479509 -5.013352 58.997460 0.000000 0.000003 -0.000000 -0.000002 -0.000000 0.000002 -0.000001 0.000001 0.000002 -0.000002 -0.000001 0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.005679 0.005408 -2.869847 -1.087017 -0.004803 0.067323 0.000001 -0.000002 0.000002 0.000009 -0.000005 0.000010 -0.000000 -0.000000 0.000000 0.000007 -0.000006 0.000011 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.842262 8.853750 3.214433 -1.704790 -0.011721 0.104947 3.686765 0.012164 0.574209 0.000015 -0.000020 0.000033 0.000000 -0.000001 0.000000 0.000016 -0.000018 0.000031 -0.000001 -0.000002 -0.000001 0.000000 0.000003 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.060403 -0.518065 0.000000 0.000000 0.664366 -0.003829 -0.048461 10.029835 -0.050687 -0.395859 13.217491 -0.000002 -0.000001 21.651396 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000003 -0.000000 0.000000 0.000003 -0.000000 0.000000 0.000003 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -37.059374 3.833724 -5.732257 61.010603 -56.086331 -44.506083 -0.000002 -39.938035 -0.000001 -3.537689 -0.493779 21.223061 0.000001 0.000001 -0.000000 0.000001 -0.000002 0.000000 -0.000001 0.000001 0.000001 -0.000000 0.000000 -0.000001 -26.622628 12.026676 6.276019 11.540097 37.392478 36.442625 0.000041 82.240839 -0.000040 -22.052924 -5.240963 59.172053 0.000003 -0.000003 -0.000000 -0.000002 -0.000004 -0.000001 0.000000 -0.000002 -0.000001 -0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.005790 0.005520 -2.927419 -1.108825 -0.004913 0.068670 -0.000001 -0.000001 -0.000000 0.000013 -0.000007 0.000011 0.000000 -0.000000 0.000000 0.000011 -0.000007 0.000010 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000138 0.842616 8.853208 3.383201 -1.734490 -0.011952 0.106773 3.686766 0.012163 0.574209 0.000011 -0.000017 0.000029 0.000000 -0.000001 -0.000001 0.000014 -0.000018 0.000030 -0.000001 -0.000003 -0.000000 0.000000 0.000003 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.061435 -0.527283 0.000000 0.000000 0.664366 -0.003829 -0.048461 10.551590 -0.055213 -0.416148 13.861442 -0.000002 -0.000001 22.478663 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -38.733552 3.991505 -5.651013 60.586783 -55.836370 -45.397628 -0.000003 -40.222509 -0.000003 -0.199746 0.811758 21.816423 -0.000001 -0.000001 -0.000001 0.000002 0.000002 0.000001 -0.000000 -0.000002 -0.000001 0.000001 -0.000000 0.000000 -27.113674 12.223586 6.441722 12.075121 37.928751 35.477895 0.000050 82.603317 -0.000062 -22.572908 -5.447069 59.317679 0.000001 -0.000001 0.000000 -0.000003 -0.000003 -0.000000 -0.000003 -0.000001 -0.000002 0.000001 -0.000002 0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.005891 0.005621 -2.979501 -1.128553 -0.005012 0.069886 0.000000 -0.000003 0.000003 0.000004 -0.000005 0.000007 0.000000 0.000000 0.000000 0.000004 -0.000006 0.000009 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000137 0.842943 8.852695 3.539017 -1.761253 -0.012163 0.108419 3.686763 0.012164 0.574210 0.000012 -0.000017 0.000033 0.000000 -0.000001 -0.000000 0.000012 -0.000017 0.000033 -0.000001 -0.000001 0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.062351 -0.535469 0.000000 0.000000 0.664367 -0.003829 -0.048461 11.023660 -0.059466 -0.434470 14.443974 -0.000002 -0.000001 23.224501 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 -0.000000 -0.000000 0.000002 -0.000000 -0.000000 0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -40.243864 4.133658 -5.579118 60.217372 -55.575467 -46.213921 0.000001 -40.519530 -0.000000 2.890671 2.056975 22.299968 -0.000001 0.000002 0.000002 0.000001 -0.000001 0.000001 0.000001 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -27.550374 12.400305 6.591089 12.561383 38.397268 34.613001 0.000010 82.915006 -0.000065 -23.035831 -5.630100 59.436750 0.000003 -0.000002 -0.000003 0.000001 -0.000001 0.000001 0.000000 -0.000001 -0.000002 -0.000001 -0.000001 0.000000 0.000001 0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.005980 0.005710 -3.025752 -1.146073 -0.005100 0.070969 0.000001 -0.000002 0.000002 0.000007 -0.000007 0.000010 0.000000 -0.000000 0.000000 0.000004 -0.000007 0.000011 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000138 0.843240 8.852230 3.680040 -1.784928 -0.012349 0.109876 3.686764 0.012164 0.574211 0.000012 -0.000019 0.000030 0.000000 -0.000001 -0.000000 0.000012 -0.000018 0.000029 -0.000001 -0.000001 -0.000001 0.000000 0.000002 -0.000100 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.063145 -0.542562 0.000000 0.000000 0.664367 -0.003829 -0.048461 11.439914 -0.063341 -0.450595 14.957522 -0.000002 -0.000001 23.880008 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000004 -0.000000 0.000000 -0.000004 -0.000000 0.000000 -0.000004 -0.000000 0.000000 -0.000000 0.000000 0.000000 -41.571998 4.259525 -5.519398 59.906688 -55.305032 -46.947302 0.000002 -40.829590 -0.000000 5.716148 3.223467 22.686224 0.000000 0.000001 0.000000 0.000003 0.000000 0.000000 0.000001 0.000001 0.000001 0.000000 -0.000000 -0.000000 -27.929333 12.556145 6.722568 12.991196 38.797223 33.857350 0.000004 83.176637 -0.000067 -23.438043 -5.788556 59.531539 -0.000001 0.000005 -0.000001 0.000001 -0.000005 -0.000001 -0.000002 -0.000001 -0.000002 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.006057 0.005788 -3.065829 -1.161255 -0.005178 0.071907 0.000001 -0.000000 0.000000 0.000008 -0.000006 0.000010 0.000000 -0.000000 0.000000 0.000007 -0.000006 0.000010 -0.000000 0.000000 0.000000 -0.000000 0.000003 0.000137 0.843503 8.851813 3.804426 -1.805370 -0.012509 0.111132 3.686767 0.012164 0.574213 0.000014 -0.000015 0.000027 -0.000000 -0.000001 -0.000001 0.000013 -0.000015 0.000024 -0.000001 -0.000002 -0.000001 0.000000 0.000003 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.063809 -0.548501 0.000000 0.000000 0.664366 -0.003829 -0.048461 11.794224 -0.066732 -0.464298 15.394568 -0.000002 -0.000001 24.436267 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 -42.700055 4.368509 -5.474624 59.658642 -55.026418 -47.590340 -0.000002 -41.153116 -0.000002 8.260910 4.295556 22.988982 0.000003 -0.000004 0.000003 0.000002 0.000001 -0.000002 -0.000002 0.000000 -0.000000 -0.000002 -0.000000 0.000000 -28.247258 12.690427 6.834650 13.357143 39.127777 33.220152 0.000048 83.388864 -0.000077 -23.775772 -5.921027 59.604390 -0.000000 0.000002 -0.000002 -0.000000 -0.000003 -0.000002 0.000001 -0.000002 -0.000003 -0.000001 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.006122 0.005853 -3.099387 -1.173967 -0.005243 0.072692 0.000004 -0.000002 0.000002 0.000007 -0.000007 0.000014 0.000000 -0.000000 0.000000 0.000005 -0.000007 0.000014 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.843727 8.851460 3.910330 -1.822427 -0.012645 0.112182 3.686763 0.012163 0.574211 0.000012 -0.000017 0.000028 0.000000 -0.000001 -0.000000 0.000012 -0.000015 0.000027 -0.000001 -0.000002 -0.000001 0.000000 0.000001 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.064337 -0.553227 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.080454 -0.069533 -0.475353 15.747597 -0.000002 -0.000001 24.884391 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000000 -0.000000 0.000000 -43.610314 4.460009 -5.447526 59.476987 -54.740947 -48.135946 0.000004 -41.490606 -0.000002 10.510121 5.260077 23.222479 -0.000002 -0.000000 0.000006 0.000004 0.000002 -0.000001 0.000001 0.000002 -0.000000 -0.000001 0.000000 0.000000 -28.500851 12.802441 6.925865 13.652193 39.387864 32.710319 0.000042 83.552454 -0.000071 -24.045269 -6.026181 59.657461 0.000002 -0.000002 0.000001 0.000001 -0.000001 0.000002 -0.000001 0.000000 -0.000003 -0.000001 0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.006173 0.005905 -3.126085 -1.184080 -0.005294 0.073317 0.000003 -0.000001 0.000002 0.000010 -0.000006 0.000011 -0.000000 0.000000 -0.000000 0.000008 -0.000006 0.000011 -0.000000 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.843909 8.851170 3.995910 -1.835953 -0.012752 0.113013 3.686768 0.012162 0.574211 0.000011 -0.000012 0.000026 -0.000000 0.000000 0.000000 0.000012 -0.000012 0.000028 -0.000001 -0.000002 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.064722 -0.556677 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.292503 -0.071643 -0.483534 16.009084 -0.000002 -0.000001 25.215542 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 0.000000 0.000000 -44.284983 4.533317 -5.440725 59.364999 -54.449817 -48.577347 -0.000004 -41.842572 -0.000003 12.449154 6.105877 23.400728 0.000004 -0.000000 -0.000002 0.000002 0.000000 0.000000 -0.000002 0.000001 -0.000001 0.000001 -0.000001 0.000001 -28.686788 12.891407 6.994794 13.869835 39.576141 32.336414 0.000043 83.668144 -0.000065 -24.242638 -6.102757 59.692937 0.000001 0.000001 -0.000002 0.000001 0.000001 -0.000000 -0.000002 0.000001 -0.000003 -0.000002 0.000000 0.000001 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.006211 0.005943 -3.145579 -1.191465 -0.005332 0.073773 0.000005 -0.000001 0.000000 0.000007 -0.000006 0.000010 -0.000000 -0.000000 0.000000 0.000004 -0.000007 0.000010 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.844043 8.850952 4.059321 -1.845797 -0.012830 0.113619 3.686763 0.012160 0.574214 0.000009 -0.000013 0.000023 0.000000 -0.000001 0.000000 0.000009 -0.000015 0.000023 -0.000001 -0.000004 -0.000000 0.000000 0.000003 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.064958 -0.558792 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.424240 -0.072971 -0.488612 16.171535 -0.000002 -0.000001 25.420810 -0.000003 -0.000001 -180.000005 -0.000043 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000003 -0.000000 0.000000 -44.706156 4.587533 -5.456738 59.325889 -54.154060 -48.907863 0.000002 -42.209527 -0.000002 14.062881 6.823296 23.536986 -0.000001 0.000001 0.000003 0.000002 0.000000 0.000002 0.000006 0.000000 -0.000000 0.000001 -0.000000 0.000000 -28.801798 12.956502 7.040082 14.004149 39.690858 32.106599 0.000027 83.736862 -0.000058 -24.364004 -6.149548 59.712820 0.000004 0.000003 -0.000001 -0.000001 -0.000002 -0.000001 -0.000000 -0.000001 0.000000 -0.000003 0.000002 0.000000 0.000002 0.000000 -0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.006233 0.005966 -3.157526 -1.195991 -0.005355 0.074052 0.000003 -0.000001 0.000002 0.000007 -0.000007 0.000012 0.000000 -0.000000 0.000000 0.000006 -0.000007 0.000012 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.844127 8.850819 4.098721 -1.851813 -0.012879 0.113988 3.686765 0.012164 0.574214 0.000011 -0.000010 0.000022 -0.000000 0.000001 -0.000001 0.000010 -0.000011 0.000020 -0.000001 -0.000002 -0.000001 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.065038 -0.559510 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491236 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000003 0.000000 -0.000000 -0.000003 0.000000 -0.000000 -0.000003 0.000000 -0.000000 -0.000004 0.000000 0.000000 -44.855389 4.621465 -5.497951 59.362608 -53.854498 -49.121033 0.000003 -42.591977 0.000001 15.335021 7.403495 23.643279 -0.000001 0.000003 0.000002 0.000004 0.000000 -0.000001 -0.000000 -0.000001 -0.000001 -0.000001 -0.000000 0.000000 -28.842577 12.996797 7.060441 14.049924 39.729701 32.028403 0.000114 83.759559 -0.000121 -24.405366 -6.165400 59.719035 0.000001 -0.000000 0.000001 -0.000000 -0.000006 -0.000004 -0.000001 0.000001 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -1.197529 -0.005363 0.074147 0.000002 -0.000001 0.000000 0.000008 -0.000009 0.000014 0.000000 -0.000000 0.000000 0.000007 -0.000009 0.000015 -0.000000 -0.000001 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -1.853852 -0.012895 0.114110 3.686764 0.012164 0.574211 0.000009 -0.000011 0.000022 -0.000000 -0.000002 -0.000000 0.000009 -0.000012 0.000020 -0.000000 -0.000001 0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.064986 -0.559064 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469514 -0.073430 -0.490356 16.227362 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 -0.000000 -0.000004 -0.000000 0.000000 -44.861874 4.643234 -5.557225 59.465341 -53.556172 -49.233195 0.000001 -42.990075 0.000001 16.397846 7.894723 23.716929 0.000001 0.000001 0.000002 -0.000001 -0.000002 0.000000 -0.000001 0.000001 -0.000000 -0.000001 0.000000 -0.000000 -28.806490 13.027199 7.058772 13.969171 39.663404 32.172261 0.000105 83.673294 -0.000119 -24.405364 -6.165400 59.719035 0.000001 -0.000001 0.000001 0.000002 -0.000003 -0.000003 0.000000 0.000000 -0.000002 -0.000000 0.000001 0.000001 -0.000001 0.000001 -0.000000 -0.000001 0.000000 -0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000001 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.006240 0.005974 -3.161587 -1.196542 -0.005358 0.074085 0.000002 -0.000002 0.000004 0.000005 -0.000008 0.000012 -0.000000 -0.000000 0.000000 0.000005 -0.000007 0.000014 -0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850768 4.112264 -1.852324 -0.012881 0.114017 3.686766 0.012163 0.574211 0.000009 -0.000015 0.000026 0.000000 0.000001 -0.000001 0.000009 -0.000014 0.000024 -0.000001 -0.000002 0.000000 0.000000 0.000001 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.064833 -0.557745 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227363 -0.000002 -0.000001 25.491238 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000004 -0.000000 -0.000000 -44.867468 4.662063 -5.625427 59.618939 -53.263892 -49.269272 0.000003 -43.402307 0.000001 17.397513 8.351381 23.750711 0.000002 0.000000 -0.000003 -0.000001 0.000001 0.000000 0.000000 -0.000002 -0.000001 0.000002 -0.000001 0.000000 -28.696569 13.062960 7.039558 13.735732 39.469512 32.589623 0.000086 83.422216 -0.000115 -24.405357 -6.165396 59.719028 0.000001 -0.000000 0.000001 -0.000002 -0.000001 -0.000001 -0.000001 -0.000002 -0.000002 -0.000001 0.000001 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 -0.006240 0.005974 -3.161587 -1.193626 -0.005343 0.073906 0.000000 -0.000002 0.000004 0.000005 -0.000006 0.000013 0.000000 0.000000 0.000000 0.000006 -0.000007 0.000013 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112265 -1.847811 -0.012848 0.113739 3.686766 0.012162 0.574213 0.000010 -0.000013 0.000023 -0.000000 -0.000001 0.000000 0.000009 -0.000012 0.000023 -0.000000 -0.000003 -0.000001 0.000000 0.000001 -0.000102 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.064582 -0.555583 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469516 -0.073430 -0.490356 16.227363 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000002 -0.000000 0.000000 -44.872198 4.678104 -5.701786 59.818168 -52.977812 -49.235620 -0.000001 -43.826841 0.000000 18.336997 8.774185 23.748392 0.000002 0.000001 -0.000001 -0.000003 0.000003 -0.000002 -0.000001 0.000001 -0.000001 0.000000 -0.000000 0.000001 -28.518007 13.103538 7.003936 13.364682 39.154264 33.257687 0.000102 83.017944 -0.000108 -24.405362 -6.165400 59.719035 0.000004 0.000002 -0.000000 0.000002 -0.000001 0.000001 0.000001 -0.000003 -0.000002 -0.000001 0.000000 -0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161586 -1.188846 -0.005319 0.073609 -0.000000 -0.000000 -0.000001 0.000006 -0.000007 0.000010 0.000000 0.000000 0.000000 0.000003 -0.000007 0.000010 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000136 0.844156 8.850769 4.112264 -1.840412 -0.012788 0.113284 3.686766 0.012162 0.574213 0.000010 -0.000012 0.000022 -0.000000 0.000000 -0.000000 0.000010 -0.000012 0.000023 -0.000001 -0.000004 -0.000001 0.000000 0.000003 -0.000101 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.064236 -0.552608 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469514 -0.073429 -0.490356 16.227360 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 0.000000 -44.876122 4.691512 -5.785536 60.058120 -52.698068 -49.138338 0.000001 -44.261695 -0.000001 19.219092 9.164042 23.713510 0.000002 -0.000002 0.000000 0.000005 0.000001 -0.000002 -0.000001 -0.000000 -0.000002 -0.000002 0.000000 0.000000 -28.276027 13.148381 6.953051 12.873080 38.722682 34.152237 0.000075 82.471816 -0.000113 -24.405359 -6.165399 59.719028 -0.000000 -0.000001 -0.000000 -0.000000 -0.000002 -0.000002 -0.000001 -0.000001 -0.000002 -0.000000 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -1.182272 -0.005285 0.073204 -0.000000 0.000000 -0.000002 0.000011 -0.000006 0.000013 0.000000 0.000000 -0.000000 0.000012 -0.000006 0.000016 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.830234 -0.012706 0.112659 3.686767 0.012160 0.574212 0.000009 -0.000012 0.000019 -0.000000 0.000000 -0.000000 0.000009 -0.000012 0.000020 -0.000000 -0.000004 -0.000001 0.000000 0.000003 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.063799 -0.548849 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469517 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 0.000000 0.000000 -44.879284 4.702443 -5.875914 60.333998 -52.424697 -48.983364 -0.000004 -44.705043 0.000002 20.046358 9.521950 23.649421 0.000003 -0.000006 0.000001 0.000001 -0.000001 0.000000 -0.000003 0.000001 0.000000 0.000001 0.000000 -0.000000 -27.975801 13.196873 6.888021 12.279294 38.179084 35.247963 0.000099 81.795313 -0.000091 -24.405359 -6.165397 59.719035 0.000002 -0.000003 -0.000000 0.000001 -0.000000 0.000001 -0.000003 -0.000003 -0.000001 -0.000000 -0.000000 0.000000 0.000002 0.000000 -0.000000 0.000002 -0.000000 -0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161586 -1.173966 -0.005243 0.072691 -0.000000 -0.000000 -0.000001 0.000010 -0.000007 0.000015 -0.000000 -0.000000 0.000000 0.000009 -0.000007 0.000018 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000136 0.844156 8.850769 4.112264 -1.817377 -0.012605 0.111868 3.686762 0.012163 0.574209 0.000007 -0.000014 0.000026 -0.000000 0.000000 0.000000 0.000006 -0.000015 0.000025 -0.000001 -0.000004 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.063274 -0.544336 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227356 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -44.881733 4.711044 -5.972144 60.641281 -52.157705 -48.776512 0.000004 -45.154930 0.000002 20.821169 9.849011 23.559254 0.000004 0.000000 0.000002 0.000003 0.000001 -0.000001 -0.000000 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -27.622555 13.248389 6.809980 11.602500 37.527634 36.519010 0.000068 80.999787 -0.000089 -24.405359 -6.165398 59.719028 0.000001 0.000001 0.000000 -0.000002 -0.000003 -0.000001 -0.000002 0.000001 -0.000002 0.000000 -0.000000 0.000000 -0.000001 0.000001 -0.000000 -0.000002 0.000000 -0.000000 -0.000001 0.000001 -0.000000 -0.000002 0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -1.163999 -0.005192 0.072076 0.000004 -0.000000 -0.000001 0.000008 -0.000007 0.000016 -0.000000 0.000000 -0.000000 0.000007 -0.000007 0.000014 0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -1.801947 -0.012483 0.110918 3.686766 0.012160 0.574212 0.000009 -0.000011 0.000019 -0.000000 0.000001 -0.000000 0.000009 -0.000012 0.000020 -0.000001 -0.000004 -0.000001 0.000000 0.000001 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.062665 -0.539098 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073430 -0.490356 16.227356 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 -0.000000 0.000000 -44.883543 4.717475 -6.073463 60.975510 -51.897092 -48.523371 0.000002 -45.609456 0.000002 21.545743 10.146401 23.445990 0.000000 -0.000003 0.000000 0.000003 -0.000002 -0.000001 -0.000001 -0.000000 -0.000001 -0.000002 -0.000000 0.000000 -27.221449 13.302287 6.720061 10.862073 36.772707 37.939338 0.000052 80.096693 -0.000070 -24.405359 -6.165400 59.719028 -0.000001 -0.000000 -0.000000 -0.000000 -0.000002 -0.000001 -0.000001 -0.000002 0.000000 0.000000 -0.000001 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000001 0.000000 -0.000002 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -1.152434 -0.005133 0.071361 0.000002 -0.000001 0.000000 0.000008 -0.000007 0.000013 -0.000000 0.000000 0.000000 0.000007 -0.000007 0.000016 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850768 4.112264 -1.784044 -0.012341 0.109818 3.686765 0.012164 0.574211 0.000017 -0.000014 0.000020 -0.000000 0.000000 -0.000001 0.000017 -0.000013 0.000021 -0.000001 -0.000004 -0.000000 -0.000000 0.000001 -0.000100 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.061976 -0.533164 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -44.884745 4.721887 -6.179101 61.332558 -51.642872 -48.229417 0.000001 -46.066720 0.000002 22.222131 10.415384 23.312448 0.000003 -0.000000 -0.000002 -0.000002 0.000002 -0.000002 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -26.777734 13.357948 6.619417 10.077078 35.919302 39.483251 0.000034 79.097552 -0.000055 -24.405360 -6.165400 59.719035 0.000001 -0.000002 -0.000001 -0.000001 -0.000002 -0.000001 -0.000002 -0.000002 0.000002 0.000001 0.000000 0.000001 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -1.139339 -0.005066 0.070553 0.000003 -0.000001 0.000002 0.000007 -0.000007 0.000013 0.000000 -0.000000 0.000000 0.000006 -0.000008 0.000016 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -1.763773 -0.012183 0.108571 3.686767 0.012163 0.574209 0.000011 -0.000013 0.000021 0.000000 -0.000000 -0.000000 0.000011 -0.000014 0.000022 -0.000002 -0.000003 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.061208 -0.526565 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073430 -0.490356 16.227356 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000002 -0.000000 0.000000 -44.885374 4.724432 -6.288288 61.708266 -51.395060 -47.899990 0.000006 -46.524773 0.000002 22.852300 10.657236 23.161334 -0.000002 0.000001 0.000001 0.000002 0.000002 0.000000 -0.000000 0.000001 0.000000 -0.000001 -0.000001 0.000000 -26.296590 13.414728 6.509217 9.265823 34.973362 41.125672 0.000043 78.013977 -0.000041 -24.405359 -6.165397 59.719028 -0.000001 0.000001 0.000001 -0.000001 -0.000001 -0.000002 -0.000001 0.000002 0.000003 0.000000 -0.000001 -0.000000 -0.000001 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.006240 0.005974 -3.161587 -1.124780 -0.004993 0.069653 0.000003 -0.000001 0.000000 0.000009 -0.000008 0.000015 0.000000 0.000000 0.000000 0.000006 -0.000009 0.000016 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.741235 -0.012005 0.107185 3.686768 0.012161 0.574210 0.000006 -0.000011 0.000021 0.000000 -0.000000 -0.000000 0.000008 -0.000011 0.000022 -0.000001 -0.000003 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.060367 -0.519331 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469515 -0.073430 -0.490356 16.227358 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.885503 4.725267 -6.400251 62.098769 -51.153722 -47.540203 -0.000001 -46.981716 0.000001 23.438054 10.873308 22.995225 -0.000000 -0.000001 -0.000001 0.000001 -0.000002 0.000000 -0.000002 -0.000001 -0.000000 -0.000002 -0.000000 0.000000 -25.783293 13.472024 6.390638 8.445382 33.941983 42.842601 0.000036 76.857742 -0.000045 -24.405364 -6.165399 59.719035 0.000000 0.000002 0.000001 -0.000001 -0.000000 -0.000001 0.000001 0.000000 0.000002 0.000001 -0.000001 -0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.006240 0.005974 -3.161587 -1.108824 -0.004913 0.068668 0.000001 -0.000002 0.000002 0.000012 -0.000008 0.000017 -0.000000 0.000000 -0.000000 0.000009 -0.000007 0.000016 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -1.716535 -0.011813 0.105664 3.686769 0.012163 0.574211 0.000006 -0.000012 0.000026 -0.000000 0.000001 -0.000000 0.000006 -0.000012 0.000026 -0.000001 -0.000004 -0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.059456 -0.511489 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469514 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491238 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -44.885186 4.724541 -6.514228 62.500288 -50.918968 -47.155162 0.000008 -47.435606 0.000003 23.981113 11.064958 22.816554 -0.000001 0.000001 0.000002 -0.000002 0.000001 0.000001 0.000002 0.000000 0.000001 0.000003 -0.000000 0.000001 -25.243095 13.529257 6.264898 7.631256 32.833498 44.611251 0.000022 75.640677 -0.000034 -24.405359 -6.165397 59.719028 -0.000000 0.000003 -0.000001 -0.000000 0.000001 -0.000002 -0.000001 0.000002 0.000002 -0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161586 -1.091538 -0.004826 0.067600 0.000001 0.000001 -0.000001 0.000005 -0.000007 0.000014 -0.000000 -0.000000 0.000000 0.000004 -0.000007 0.000017 -0.000000 0.000000 -0.000000 -0.000000 0.000003 0.000136 0.844156 8.850769 4.112264 -1.689776 -0.011603 0.104020 3.686766 0.012163 0.574211 0.000007 -0.000012 0.000020 -0.000000 0.000000 0.000000 0.000004 -0.000012 0.000022 -0.000001 -0.000002 -0.000000 0.000000 0.000002 -0.000100 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.058478 -0.503072 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 -0.000000 -0.000001 -0.000000 0.000000 -44.884445 4.722416 -6.629447 62.909191 -50.690966 -46.749745 0.000001 -47.884489 0.000003 24.483117 11.233563 22.627729 -0.000003 -0.000001 0.000001 -0.000001 0.000001 -0.000001 -0.000001 0.000000 0.000001 0.000001 -0.000000 0.000001 -24.681249 13.585879 6.133226 6.837085 31.657548 46.410394 0.000027 74.374804 -0.000034 -24.405366 -6.165396 59.719035 0.000000 0.000003 -0.000000 0.000001 -0.000002 -0.000002 -0.000001 0.000003 0.000001 0.000001 -0.000002 -0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161586 -1.072988 -0.004733 0.066454 0.000002 -0.000000 0.000000 0.000009 -0.000009 0.000014 0.000000 0.000000 0.000000 0.000007 -0.000008 0.000015 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000136 0.844156 8.850769 4.112264 -1.661058 -0.011381 0.102254 3.686765 0.012161 0.574210 0.000009 -0.000013 0.000023 -0.000000 0.000001 -0.000000 0.000009 -0.000013 0.000023 -0.000001 -0.000003 0.000000 0.000000 0.000002 -0.000099 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.057435 -0.494106 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227356 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000001 -0.000000 0.000000 -44.883369 4.719041 -6.745137 63.321926 -50.469958 -46.328797 -0.000002 -48.326416 0.000001 24.945630 11.380556 22.431048 0.000001 -0.000002 0.000001 -0.000001 0.000000 -0.000001 -0.000002 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -24.103089 13.641379 5.996875 6.074487 30.425061 48.220425 0.000037 73.072205 -0.000028 -24.405364 -6.165397 59.719028 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000002 -0.000001 0.000000 -0.000000 -0.000001 -0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -1.053240 -0.004635 0.065235 0.000001 -0.000001 0.000000 0.000004 -0.000008 0.000011 -0.000000 0.000000 0.000000 0.000004 -0.000008 0.000013 -0.000000 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -1.630487 -0.011145 0.100372 3.686766 0.012164 0.574211 0.000007 -0.000014 0.000028 -0.000000 0.000000 -0.000001 0.000007 -0.000014 0.000028 -0.000000 -0.000002 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.056333 -0.484623 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000001 -0.000000 0.000000 -44.882006 4.714576 -6.860531 63.735111 -50.256231 -45.896986 0.000002 -48.759440 0.000001 25.370179 11.507360 22.228728 0.000000 -0.000002 -0.000001 -0.000001 0.000003 -0.000002 -0.000000 -0.000001 -0.000000 -0.000004 0.000000 -0.000000 -23.513913 13.695295 5.857123 5.352931 29.148088 50.023363 0.000030 71.745072 -0.000040 -24.405366 -6.165397 59.719035 -0.000000 0.000001 -0.000000 0.000000 -0.000003 -0.000001 0.000001 0.000001 -0.000003 0.000001 -0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.006240 0.005974 -3.161587 -1.032360 -0.004531 0.063945 0.000000 0.000000 -0.000002 0.000011 -0.000007 0.000013 -0.000000 0.000000 -0.000000 0.000008 -0.000006 0.000014 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850771 4.112264 -1.598166 -0.010896 0.098384 3.686770 0.012163 0.574213 0.000010 -0.000011 0.000026 -0.000000 0.000001 0.000000 0.000008 -0.000011 0.000023 -0.000002 -0.000002 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.055174 -0.474653 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000001 0.000000 0.000000 -44.880357 4.709169 -6.974865 64.145489 -50.050158 -45.458922 -0.000001 -49.181586 0.000001 25.758199 11.615387 22.022944 -0.000000 0.000002 0.000003 -0.000002 0.000001 0.000001 -0.000001 -0.000000 -0.000000 -0.000002 -0.000000 0.000000 -22.919055 13.747215 5.715279 4.679743 27.839703 51.802904 0.000022 70.405651 -0.000029 -24.405362 -6.165396 59.719035 -0.000000 -0.000003 0.000000 -0.000001 0.000000 0.000000 0.000002 -0.000000 -0.000002 0.000001 -0.000001 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 -0.006240 0.005974 -3.161586 -1.010417 -0.004423 0.062589 -0.000000 -0.000000 0.000000 0.000010 -0.000007 0.000012 0.000000 0.000000 -0.000000 0.000007 -0.000008 0.000013 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000136 0.844156 8.850769 4.112264 -1.564196 -0.010637 0.096295 3.686765 0.012162 0.574208 0.000009 -0.000014 0.000022 -0.000000 0.000001 -0.000000 0.000009 -0.000013 0.000022 -0.000001 -0.000004 -0.000001 0.000000 0.000002 -0.000100 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000
0.000000 1.067000 0.053962 -0.464223 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469519 -0.073430 -0.490356 16.227358 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000001 0.000000 0.000000 -44.878502 4.702978 -7.087362 64.549884 -49.852147 -45.019047 0.000001 -49.590913 0.000002 26.111154 11.706112 21.815850 0.000000 -0.000001 -0.000001 0.000001 0.000001 -0.000002 -0.000001 0.000001 0.000000 0.000000 -0.000000 -0.000000 -22.323859 13.796764 5.572657 4.060172 26.513761 53.544278 0.000018 69.066210 -0.000034 -24.405360 -6.165397 59.719035 0.000000 0.000000 -0.000000 -0.000002 0.000000 0.000001 -0.000001 0.000000 -0.000002 0.000001 -0.000002 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000000 -0.006240 0.005974 -3.161586 -0.987476 -0.004310 0.061172 0.000002 -0.000000 0.000000 0.000010 -0.000007 0.000012 0.000000 0.000000 0.000000 0.000007 -0.000006 0.000012 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000136 0.844156 8.850768 4.112264 -1.528682 -0.010366 0.094109 3.686766 0.012162 0.574211 0.000008 -0.000014 0.000024 0.000000 0.000001 -0.000000 0.000007 -0.000014 0.000023 -0.000000 -0.000003 0.000000 0.000000 0.000000 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.052700 -0.453365 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227360 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 -0.000000 0.000000 -44.876488 4.696159 -7.197261 64.945175 -49.662743 -44.581761 0.000007 -49.985428 0.000002 26.430402 11.780963 21.609515 0.000002 -0.000002 0.000002 0.000000 0.000001 0.000000 0.000003 -0.000002 0.000000 -0.000001 -0.000000 -0.000000 -21.733676 13.843638 5.430597 3.497519 25.184707 55.234083 0.000006 67.739098 -0.000035 -24.405359 -6.165394 59.719028 -0.000001 -0.000004 -0.000000 -0.000003 0.000002 -0.000000 0.000001 0.000001 -0.000003 0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.963603 -0.004194 0.059698 -0.000000 -0.000001 0.000000 0.000007 -0.000007 0.000014 -0.000000 0.000000 0.000000 0.000008 -0.000007 0.000015 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -1.491725 -0.010086 0.091833 3.686767 0.012164 0.574211 0.000012 -0.000012 0.000024 -0.000000 0.000002 -0.000000 0.000012 -0.000013 0.000025 -0.000001 -0.000002 -0.000001 0.000000 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.051391 -0.442107 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469516 -0.073430 -0.490356 16.227362 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000004 0.000000 0.000000 -44.874367 4.688869 -7.303794 65.328437 -49.482508 -44.151384 0.000001 -50.363158 0.000003 26.717347 11.841397 21.406004 -0.000001 -0.000003 0.000000 0.000002 0.000001 0.000001 0.000001 0.000000 0.000000 0.000002 0.000000 0.000000 -21.153859 13.887568 5.290457 2.993304 23.867321 56.860164 0.000021 66.436485 -0.000037 -24.405362 -6.165397 59.719028 0.000001 -0.000000 0.000001 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 -0.000003 0.000001 -0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000001 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.938865 -0.004073 0.058171 0.000001 -0.000000 0.000000 0.000008 -0.000008 0.000016 -0.000000 0.000000 -0.000000 0.000007 -0.000009 0.000015 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -1.453430 -0.009794 0.089477 3.686765 0.012162 0.574213 0.000008 -0.000012 0.000024 -0.000000 0.000000 0.000000 0.000007 -0.000013 0.000020 -0.000001 -0.000001 0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.050039 -0.430480 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073429 -0.490356 16.227356 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000004 0.000000 0.000000 -44.872164 4.681264 -7.406203 65.696741 -49.312074 -43.732144 0.000005 -50.722132 0.000003 26.973339 11.888855 21.207350 -0.000001 -0.000000 0.000002 0.000003 0.000003 0.000001 -0.000000 -0.000000 0.000001 -0.000004 0.000000 -0.000001 -20.589774 13.928359 5.153606 2.547479 22.576538 58.411347 0.000029 65.170598 -0.000019 -24.405355 -6.165399 59.719028 -0.000001 0.000002 -0.000000 -0.000005 0.000000 0.000000 0.000004 0.000001 0.000003 0.000002 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000001 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -0.913329 -0.003950 0.056592 -0.000000 -0.000001 0.000000 0.000006 -0.000009 0.000014 0.000000 -0.000000 -0.000000 0.000002 -0.000009 0.000015 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.413899 -0.009499 0.087043 3.686762 0.012163 0.574211 0.000010 -0.000014 0.000025 -0.000000 0.000001 -0.000000 0.000010 -0.000015 0.000023 -0.000000 -0.000001 -0.000001 0.000000 0.000003 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.048648 -0.418512 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000002 0.000000 0.000000 -44.869944 4.673496 -7.503710 66.047219 -49.152138 -43.328138 0.000003 -51.060346 0.000003 27.199751 11.924790 21.015580 -0.000001 -0.000000 0.000003 0.000000 -0.000004 -0.000001 0.000000 0.000001 0.000001 0.000001 -0.000000 -0.000000 -20.046779 13.965834 5.021415 2.158664 21.327233 59.877318 0.000013 63.953554 -0.000029 -24.405355 -6.165400 59.719028 -0.000001 -0.000003 -0.000000 0.000002 -0.000001 -0.000003 0.000004 0.000003 -0.000003 -0.000001 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.887061 -0.003823 0.054970 0.000003 -0.000001 -0.000002 0.000006 -0.000005 0.000016 0.000000 0.000000 0.000000 0.000005 -0.000005 0.000015 -0.000001 -0.000001 0.000001 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.373234 -0.009194 0.084541 3.686765 0.012162 0.574212 0.000012 -0.000013 0.000023 0.000000 0.000000 -0.000000 0.000011 -0.000013 0.000024 -0.000002 -0.000004 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.047221 -0.406234 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469519 -0.073430 -0.490356 16.227358 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 0.000001 0.000000 0.000000 -44.867714 4.665724 -7.595552 66.377185 -49.003452 -42.943503 0.000001 -51.375839 0.000001 27.397926 11.950651 20.832688 -0.000002 -0.000002 0.000000 0.000002 0.000002 -0.000002 -0.000001 0.000001 -0.000000 0.000001 -0.000000 -0.000000 -19.530221 13.999883 4.895269 1.824383 20.134074 61.248335 0.000016 62.797312 -0.000020 -24.405364 -6.165396 59.719028 0.000002 -0.000000 -0.000000 -0.000001 0.000000 -0.000001 0.000004 0.000000 0.000001 0.000000 -0.000001 -0.000000 -0.000001 0.000001 0.000000 -0.000002 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.860128 -0.003695 0.053306 -0.000001 -0.000001 0.000000 0.000009 -0.000007 0.000013 0.000000 0.000000 0.000000 0.000007 -0.000007 0.000014 -0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.331539 -0.008888 0.081974 3.686765 0.012163 0.574211 0.000006 -0.000011 0.000020 -0.000000 -0.000000 0.000000 0.000008 -0.000012 0.000021 -0.000001 -0.000004 -0.000001 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.045761 -0.393674 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469514 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 0.000001 -0.000000 0.000000 -44.865566 4.658106 -7.680971 66.683854 -48.866817 -42.582251 0.000006 -51.666570 0.000001 27.569246 11.967869 20.660682 -0.000002 0.000000 0.000001 0.000000 0.000000 0.000000 0.000003 0.000000 -0.000000 0.000001 -0.000000 -0.000001 -19.045457 14.030441 4.776558 1.541308 19.011401 62.515116 0.000023 61.713730 -0.000020 -24.405364 -6.165397 59.719028 0.000003 0.000001 0.000001 0.000001 0.000000 -0.000001 0.000002 -0.000001 0.000002 -0.000001 -0.000001 0.000000 -0.000001 0.000000 -0.000000 -0.000002 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.832596 -0.003564 0.051604 0.000001 -0.000001 0.000002 0.000010 -0.000009 0.000015 0.000000 0.000000 0.000000 0.000010 -0.000008 0.000016 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000136 0.844156 8.850769 4.112264 -1.288916 -0.008573 0.079350 3.686767 0.012161 0.574210 0.000011 -0.000014 0.000025 0.000000 0.000000 -0.000000 0.000012 -0.000014 0.000023 -0.000001 -0.000004 -0.000001 0.000000 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.044272 -0.380864 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469514 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000001 -0.000000 0.000000 -44.863524 4.650799 -7.759202 66.964602 -48.743051 -42.248405 0.000002 -51.930615 0.000002 27.715087 11.977870 20.501520 0.000000 0.000001 0.000001 0.000001 0.000001 -0.000001 0.000001 -0.000001 0.000000 -0.000002 0.000001 -0.000000 -18.597811 14.057452 4.666667 1.305520 17.973112 63.668551 0.000018 60.714590 -0.000014 -24.405360 -6.165399 59.719035 -0.000001 0.000001 -0.000000 0.000004 -0.000000 -0.000003 -0.000000 0.000000 0.000003 -0.000000 0.000001 0.000000 0.000001 0.000000 0.000000 0.000002 -0.000000 -0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.804531 -0.003432 0.049871 0.000001 -0.000002 0.000002 0.000009 -0.000007 0.000014 -0.000000 0.000000 0.000000 0.000006 -0.000007 0.000015 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.245471 -0.008255 0.076675 3.686765 0.012162 0.574212 0.000011 -0.000016 0.000028 0.000001 -0.000001 -0.000000 0.000011 -0.000015 0.000026 -0.000001 -0.000003 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.042757 -0.367831 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073430 -0.490356 16.227360 -0.000002 -0.000001 25.491248 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000001 0.000000 0.000000 -44.861605 4.643955 -7.829473 67.216752 -48.633034 -41.945940 0.000005 -52.165911 0.000002 27.836837 11.982069 20.357217 0.000001 0.000003 -0.000004 0.000003 0.000000 -0.000002 0.000002 0.000001 0.000000 -0.000003 0.000000 -0.000001 -18.192624 14.080905 4.566984 1.112739 17.032668 64.699691 0.000024 59.811488 -0.000021 -24.405359 -6.165397 59.719035 -0.000003 0.000001 -0.000000 0.000001 0.000001 0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000001 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.006240 0.005974 -3.161587 -0.776001 -0.003298 0.048108 0.000003 -0.000001 0.000002 0.000009 -0.000007 0.000013 0.000000 0.000000 -0.000000 0.000006 -0.000007 0.000013 -0.000000 -0.000000 0.000001 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.201305 -0.007932 0.073956 3.686765 0.012163 0.574209 0.000013 -0.000014 0.000023 -0.000000 0.000000 -0.000001 0.000012 -0.000013 0.000024 -0.000001 -0.000003 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.041220 -0.354607 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073430 -0.490356 16.227355 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 -0.000000 0.000000 0.000002 -0.000000 0.000000 0.000002 -0.000000 -0.000000 0.000001 -0.000000 0.000000 -44.859866 4.637736 -7.891035 67.437641 -48.537595 -41.678822 0.000004 -52.370503 0.000003 27.935878 11.981879 20.229724 -0.000001 -0.000000 -0.000002 0.000002 0.000001 -0.000002 -0.000001 -0.000000 0.000001 -0.000003 -0.000000 -0.000000 -17.835217 14.100805 4.478891 0.958591 16.203135 65.599500 0.000020 59.015956 -0.000015 -24.405359 -6.165393 59.719035 -0.000001 -0.000003 -0.000002 0.000001 0.000001 -0.000003 -0.000003 -0.000002 0.000001 -0.000000 -0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 -0.000000 -0.000000 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.747072 -0.003163 0.046321 0.000001 -0.000002 0.000002 0.000008 -0.000007 0.000012 0.000000 0.000000 -0.000000 0.000006 -0.000007 0.000013 -0.000000 -0.000001 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -1.156520 -0.007610 0.071198 3.686762 0.012165 0.574206 0.000012 -0.000016 0.000027 -0.000000 -0.000000 -0.000001 0.000012 -0.000015 0.000028 -0.000001 -0.000003 -0.000001 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.039664 -0.341219 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073430 -0.490356 16.227362 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000001 -0.000000 -0.000000 -44.858374 4.632297 -7.943110 67.624610 -48.457665 -41.451069 0.000008 -52.542371 0.000001 28.013650 11.978679 20.121022 -0.000001 -0.000001 -0.000001 -0.000001 0.000000 -0.000001 0.000001 -0.000001 -0.000000 -0.000004 -0.000000 -0.000000 -17.530905 14.117149 4.403763 0.838845 15.497127 66.358689 0.000014 58.339453 -0.000015 -24.405357 -6.165398 59.719035 -0.000002 -0.000001 -0.000000 0.000003 0.000001 0.000000 -0.000002 -0.000000 0.000001 -0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.717809 -0.003028 0.044513 0.000004 -0.000001 0.000000 0.000013 -0.000007 0.000012 0.000000 0.000000 -0.000000 0.000011 -0.000008 0.000011 0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850769 4.112264 -1.111219 -0.007286 0.068408 3.686769 0.012164 0.574209 0.000007 -0.000015 0.000024 -0.000000 -0.000001 -0.000000 0.000006 -0.000015 0.000022 -0.000001 -0.000003 0.000001 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.038092 -0.327698 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469516 -0.073430 -0.490356 16.227356 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 -0.000000 0.000000 -44.857121 4.627793 -7.984944 67.774956 -48.394083 -41.266695 -0.000001 -52.679531 0.000002 28.071593 11.973865 20.033073 -0.000001 0.000000 -0.000002 0.000000 0.000001 0.000002 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 -17.284980 14.129947 4.342974 0.749667 14.926979 66.967669 0.000014 57.793352 -0.000014 -24.405359 -6.165397 59.719035 0.000004 0.000001 0.000000 0.000000 0.000002 -0.000001 -0.000001 -0.000000 0.000003 -0.000000 0.000001 -0.000000 -0.000001 0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 0.000001 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.688282 -0.002892 0.042688 0.000002 0.000000 -0.000001 0.000009 -0.000008 0.000016 0.000000 0.000000 0.000000 0.000006 -0.000008 0.000018 -0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -1.065508 -0.006957 0.065592 3.686769 0.012163 0.574207 0.000011 -0.000013 0.000025 -0.000000 0.000000 -0.000001 0.000011 -0.000014 0.000023 -0.000002 -0.000004 -0.000001 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.036508 -0.314074 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227358 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 0.000001 0.000000 0.000000 -44.856178 4.624381 -8.015772 67.885940 -48.347702 -41.129777 0.000002 -52.779976 0.000005 28.111144 11.968774 19.967848 -0.000001 0.000000 -0.000001 0.000003 0.000001 -0.000001 -0.000002 0.000000 0.000001 -0.000000 0.000000 -0.000000 -17.102760 14.139179 4.297883 0.687903 14.504810 67.416371 0.000022 57.389053 -0.000018 -24.405359 -6.165397 59.719035 0.000003 0.000000 -0.000001 0.000001 0.000002 0.000001 0.000002 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000001 0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 0.000000 -0.006240 0.005974 -3.161587 -0.658553 -0.002757 0.040851 0.000004 -0.000001 0.000002 0.000006 -0.000007 0.000011 -0.000000 0.000000 0.000000 0.000005 -0.000006 0.000012 -0.000000 -0.000000 0.000001 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -1.019486 -0.006632 0.062758 3.686767 0.012163 0.574209 0.000010 -0.000016 0.000025 -0.000000 0.000001 -0.000000 0.000012 -0.000016 0.000027 -0.000001 -0.000002 -0.000001 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.034916 -0.300376 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073430 -0.490356 16.227363 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.855591 4.622221 -8.034829 67.954713 -48.319333 -41.044485 0.000001 -52.841700 0.000004 28.133802 11.964757 19.927294 -0.000000 0.000001 -0.000002 0.000000 0.000002 -0.000002 -0.000002 0.000001 0.000001 0.000001 0.000000 -0.000001 -16.989539 14.144795 4.269844 0.651355 14.242648 67.694100 0.000013 57.138009 -0.000016 -24.405359 -6.165399 59.719035 0.000004 -0.000001 0.000002 0.000002 0.000001 0.000002 -0.000000 -0.000001 0.000003 -0.000000 -0.000001 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000000 -0.006240 0.005974 -3.161587 -0.628693 -0.002621 0.039006 0.000006 -0.000000 0.000000 0.000005 -0.000006 0.000011 -0.000000 0.000000 -0.000000 0.000006 -0.000005 0.000013 -0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850769 4.112264 -0.973260 -0.006307 0.059909 3.686766 0.012162 0.574211 0.000008 -0.000013 0.000024 -0.000000 -0.000000 -0.000000 0.000008 -0.000013 0.000026 -0.000001 -0.000003 -0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.033319 -0.286634 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227363 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 0.000000 -44.855372 4.621464 -8.041348 67.978311 -48.309720 -41.015088 -0.000002 -52.862714 0.000003 28.141013 11.963127 19.913352 0.000000 -0.000002 0.000002 0.000004 0.000001 -0.000001 -0.000001 0.000001 0.000001 -0.000001 -0.000000 -0.000001 -16.950617 14.146691 4.260199 0.639118 14.152564 67.789382 0.000007 57.051730 -0.000016 -24.405359 -6.165396 59.719028 0.000003 -0.000000 -0.000001 0.000002 0.000003 0.000001 -0.000001 -0.000000 0.000002 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.598765 -0.002487 0.037156 0.000004 0.000000 0.000000 0.000006 -0.000006 0.000011 0.000000 0.000000 0.000000 0.000007 -0.000006 0.000011 -0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.926929 -0.005983 0.057055 3.686768 0.012160 0.574210 0.000008 -0.000013 0.000025 -0.000000 0.000001 -0.000001 0.000006 -0.000013 0.000024 -0.000001 -0.000004 -0.000001 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.031719 -0.272877 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073429 -0.490356 16.227362 -0.000003 -0.000001 25.491246 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000003 0.000000 0.000000 -0.000003 0.000000 0.000000 -0.000003 0.000000 -0.000000 -0.000001 -0.000000 0.000000 -44.855382 4.621465 -8.033061 67.953771 -48.328930 -41.037931 0.000006 -52.829283 0.000001 28.098572 11.949704 19.927219 -0.000001 -0.000002 0.000000 0.000002 0.000001 0.000002 0.000004 -0.000001 -0.000001 -0.000002 -0.000001 -0.000000 -16.989486 14.143883 4.269699 0.653451 14.246123 67.693431 0.000011 57.138016 -0.000008 -24.452057 -6.244162 59.256850 0.000001 0.000000 -0.000000 0.000002 0.000002 -0.000001 0.000001 -0.000000 0.000004 -0.000000 -0.000001 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.568838 -0.002353 0.035306 0.000004 -0.000001 0.000002 0.000009 -0.000007 0.000013 -0.000000 -0.000000 -0.000000 0.000007 -0.000006 0.000014 -0.000001 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -0.880599 -0.005662 0.054200 3.686764 0.012163 0.574207 0.000012 -0.000015 0.000028 0.000000 -0.000000 0.000000 0.000012 -0.000014 0.000027 -0.000002 -0.000002 -0.000000 0.000000 0.000003 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.030122 -0.259134 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -44.855372 4.621464 -8.008944 67.882300 -48.384777 -41.104488 -0.000001 -52.732028 0.000003 27.975147 11.910584 19.967466 -0.000000 -0.000000 0.000001 0.000002 0.000001 0.000000 -0.000002 0.000000 0.000001 0.000003 -0.000000 0.000001 -17.102560 14.135670 4.297321 0.695948 14.518073 67.413817 0.000011 57.389053 -0.000014 -24.587882 -6.465326 57.946259 0.000003 -0.000003 0.000001 -0.000001 0.000001 -0.000001 -0.000001 -0.000001 0.000003 -0.000001 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -0.538977 -0.002221 0.033461 0.000005 0.000001 -0.000001 0.000005 -0.000005 0.000010 0.000000 -0.000000 0.000000 0.000004 -0.000005 0.000012 0.000000 -0.000001 0.000001 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -0.834372 -0.005346 0.051352 3.686767 0.012162 0.574213 0.000011 -0.000013 0.000026 -0.000001 -0.000001 -0.000000 0.000008 -0.000013 0.000022 -0.000001 -0.000003 -0.000000 0.000000 0.000002 -0.000099 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000
0.000000 1.067000 0.028530 -0.245436 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073430 -0.490356 16.227358 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 -44.855382 4.621464 -7.970139 67.766897 -48.474563 -41.211982 0.000001 -52.575490 0.000002 27.776556 11.847440 20.032069 0.000001 -0.000000 0.000000 0.000002 0.000000 -0.000003 0.000001 0.000001 0.000001 -0.000004 0.000000 0.000000 -17.284533 14.122337 4.341743 0.767089 14.955394 66.962095 0.000016 57.793359 -0.000016 -24.810201 -6.804362 55.897390 0.000002 -0.000000 0.000001 0.000005 0.000002 0.000003 -0.000000 0.000000 0.000002 -0.000001 -0.000001 -0.000000 0.000001 0.000000 0.000000 0.000002 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.509249 -0.002090 0.031624 0.000003 -0.000000 -0.000001 0.000006 -0.000008 0.000011 0.000000 -0.000000 0.000000 0.000004 -0.000008 0.000012 0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.788351 -0.005031 0.048516 3.686767 0.012162 0.574211 0.000007 -0.000013 0.000026 -0.000000 0.000002 -0.000000 0.000005 -0.000015 0.000026 -0.000001 -0.000005 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.026946 -0.231812 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469519 -0.073429 -0.490356 16.227355 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000001 0.000000 0.000000 -44.855369 4.621464 -7.917768 67.610403 -48.595485 -41.357796 -0.000003 -52.364216 0.000001 27.508679 11.761866 20.118903 -0.000001 0.000005 -0.000001 0.000004 0.000004 -0.000001 -0.000004 0.000001 0.000001 -0.000004 0.000000 -0.000001 -17.530121 14.104125 4.401628 0.868696 15.545079 66.348929 0.000013 58.339460 -0.000018 -25.118726 -7.234591 53.219065 0.000002 0.000001 -0.000001 0.000005 -0.000000 -0.000002 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 -0.000001 -0.000001 0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -0.479721 -0.001961 0.029798 0.000005 -0.000001 0.000002 0.000009 -0.000007 0.000013 0.000000 -0.000000 0.000000 0.000007 -0.000008 0.000014 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -0.742639 -0.004721 0.045698 3.686765 0.012162 0.574213 0.000009 -0.000014 0.000025 0.000000 0.000000 -0.000001 0.000009 -0.000013 0.000025 -0.000001 -0.000003 -0.000001 0.000000 0.000002 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.025374 -0.218291 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073428 -0.490356 16.227356 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 -0.000000 -0.000000 -44.855375 4.621464 -7.852962 67.415593 -48.744786 -41.539438 0.000006 -52.102729 0.000001 27.177430 11.655390 20.225773 0.000001 -0.000000 0.000000 -0.000001 0.000001 0.000001 0.000002 -0.000001 0.000001 0.000000 0.000000 -0.000000 -17.834035 14.081249 4.475629 1.003568 16.274029 65.584433 0.000011 59.015963 -0.000017 -25.512534 -7.727597 50.022827 -0.000001 0.000000 0.000001 0.000003 0.000000 0.000000 0.000001 -0.000002 0.000002 -0.000000 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.450460 -0.001834 0.027990 0.000000 0.000001 -0.000001 0.000011 -0.000008 0.000013 -0.000000 0.000000 -0.000000 0.000009 -0.000009 0.000014 0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.697339 -0.004415 0.042905 3.686766 0.012164 0.574210 0.000016 -0.000012 0.000026 -0.000000 -0.000001 -0.000000 0.000015 -0.000013 0.000027 -0.000001 -0.000001 0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.023818 -0.204904 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469514 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000001 -0.000000 0.000000 -44.855379 4.621464 -7.776851 67.185101 -48.919608 -41.754446 0.000004 -51.795568 -0.000001 26.788697 11.529535 20.350473 -0.000001 -0.000001 0.000002 0.000002 0.000004 -0.000002 0.000001 -0.000002 -0.000001 -0.000000 -0.000000 0.000000 -18.190966 14.053887 4.562385 1.175196 17.128905 64.678148 0.000005 59.811488 -0.000018 -25.987541 -8.254167 46.425848 -0.000001 0.000002 0.000003 0.000004 0.000001 0.000001 -0.000001 -0.000002 0.000002 -0.000000 -0.000001 -0.000001 0.000002 0.000000 -0.000000 0.000003 0.000000 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.421529 -0.001710 0.026201 -0.000001 -0.000002 0.000002 0.000010 -0.000008 0.000012 -0.000000 0.000000 -0.000000 0.000008 -0.000007 0.000012 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -0.652553 -0.004115 0.040146 3.686768 0.012164 0.574211 0.000016 -0.000014 0.000027 -0.000000 0.000000 0.000000 0.000014 -0.000015 0.000026 -0.000001 -0.000003 -0.000000 0.000000 0.000003 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.022281 -0.191679 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073429 -0.490356 16.227358 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.855382 4.621465 -7.690567 66.921592 -49.117137 -42.000435 0.000002 -51.447297 0.000001 26.348394 11.385807 20.490766 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 -0.000000 -0.000000 0.000001 0.000000 0.000000 -0.000001 -18.595593 14.022222 4.660535 1.387449 18.096062 63.639379 0.000010 60.714590 -0.000021 -26.534595 -8.785620 42.552143 -0.000000 0.000000 -0.000001 0.000004 0.000002 -0.000003 0.000002 0.000000 -0.000002 -0.000000 0.000000 -0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.392999 -0.001588 0.024438 0.000002 -0.000000 0.000000 0.000005 -0.000008 0.000013 0.000000 0.000000 0.000000 0.000005 -0.000008 0.000013 0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -0.608386 -0.003823 0.037422 3.686769 0.012162 0.574211 0.000010 -0.000012 0.000022 0.000001 0.000001 -0.000000 0.000010 -0.000012 0.000025 -0.000001 -0.000003 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.020766 -0.178646 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073430 -0.490356 16.227362 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -180.000005 -0.000044 0.000003 -0.000003 0.000000 -0.000000 -0.000003 0.000000 -0.000000 -0.000003 0.000000 -0.000000 -0.000001 -0.000000 -0.000000 -44.855379 4.621464 -7.595237 66.627689 -49.334521 -42.274991 0.000005 -51.062446 0.000003 25.862446 11.225739 20.644411 0.000001 0.000000 -0.000000 0.000002 0.000003 0.000000 0.000003 0.000001 0.000001 0.000002 -0.000000 -0.000001 -19.042629 13.986452 4.768716 1.644309 19.161447 62.477175 0.000017 61.713723 -0.000023 -27.138508 -9.295770 38.532263 -0.000002 -0.000003 0.000001 -0.000000 0.000002 -0.000003 0.000002 0.000000 -0.000002 -0.000001 -0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.006240 0.005974 -3.161587 -0.364934 -0.001469 0.022702 0.000003 0.000001 -0.000001 0.000005 -0.000006 0.000013 0.000000 -0.000000 -0.000000 0.000003 -0.000006 0.000013 0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000136 0.844156 8.850770 4.112264 -0.564941 -0.003536 0.034745 3.686769 0.012163 0.574211 0.000014 -0.000015 0.000027 0.000000 0.000001 0.000000 0.000014 -0.000015 0.000029 -0.000002 -0.000002 0.000001 0.000000 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.019277 -0.165836 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227356 -0.000002 -0.000001 25.491248 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 -44.855375 4.621465 -7.491996 66.306083 -49.568933 -42.575708 0.000002 -50.645556 0.000001 25.336766 11.050884 20.809208 0.000000 -0.000000 0.000003 0.000000 0.000001 0.000000 0.000001 0.000001 0.000000 -0.000000 -0.000000 -0.000001 -19.526722 13.946776 4.885556 1.949592 20.310573 61.200578 0.000027 62.797299 -0.000028 -27.778092 -9.762797 34.501403 -0.000000 0.000003 0.000003 -0.000002 0.000000 0.000001 0.000005 0.000001 -0.000002 -0.000000 -0.000000 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.337403 -0.001353 0.021000 0.000002 -0.000001 0.000000 0.000007 -0.000005 0.000012 -0.000000 -0.000000 -0.000000 0.000005 -0.000006 0.000013 -0.000000 -0.000001 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850771 4.112264 -0.522319 -0.003257 0.032116 3.686770 0.012161 0.574212 0.000011 -0.000013 0.000024 -0.000000 -0.000002 -0.000000 0.000011 -0.000013 0.000022 -0.000002 -0.000004 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.017817 -0.153277 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073428 -0.490356 16.227360 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 -0.000000 -0.000000 -44.855382 4.621464 -7.381968 65.959519 -49.817549 -42.900029 0.000001 -50.201197 0.000003 24.777283 10.862857 20.982975 -0.000000 -0.000001 0.000002 0.000002 0.000000 -0.000001 -0.000003 -0.000000 0.000001 -0.000003 -0.000000 0.000001 -20.042572 13.903433 5.009695 2.306691 21.528497 59.818742 0.000008 63.953541 -0.000027 -28.427148 -10.170822 30.596396 0.000002 0.000000 0.000006 0.000003 0.000000 -0.000003 0.000000 0.000002 -0.000003 -0.000000 -0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000001 0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 0.000000 -0.006240 0.005974 -3.161587 -0.310469 -0.001240 0.019336 -0.000000 -0.000000 0.000000 0.000007 -0.000008 0.000011 -0.000000 -0.000000 -0.000000 0.000007 -0.000009 0.000013 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850771 4.112264 -0.480622 -0.002987 0.029545 3.686765 0.012163 0.574211 0.000013 -0.000014 0.000028 0.000000 -0.000000 0.000000 0.000010 -0.000015 0.000026 -0.000001 -0.000002 0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.016390 -0.140998 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469519 -0.073430 -0.490356 16.227356 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000001 -0.000000 0.000000 -44.855372 4.621464 -7.266289 65.590805 -50.077584 -43.245377 0.000002 -49.733944 -0.000001 24.189892 10.663326 21.163570 0.000001 0.000006 -0.000000 0.000005 0.000000 -0.000002 -0.000003 -0.000001 -0.000001 -0.000002 -0.000000 -0.000001 -20.584819 13.856688 5.139779 2.718307 22.799906 58.341188 0.000012 65.170598 -0.000023 -29.056243 -10.510706 26.952519 -0.000000 0.000003 -0.000000 -0.000000 -0.000002 0.000000 0.000003 0.000003 -0.000002 0.000001 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.006240 0.005974 -3.161587 -0.284200 -0.001131 0.017712 0.000000 -0.000002 0.000002 0.000002 -0.000005 0.000014 -0.000000 0.000000 -0.000001 0.000002 -0.000006 0.000012 -0.000000 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850771 4.112264 -0.439958 -0.002722 0.027038 3.686767 0.012163 0.574209 0.000009 -0.000014 0.000028 -0.000000 0.000000 0.000000 0.000008 -0.000014 0.000029 -0.000001 -0.000003 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.014999 -0.129031 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000002 0.000000 0.000000 -0.000001 -0.000000 -0.000000 -44.855375 4.621465 -7.146089 65.202912 -50.346274 -43.609026 0.000003 -49.248345 0.000001 23.580492 10.454039 21.348958 -0.000001 0.000001 0.000002 -0.000001 -0.000002 0.000000 0.000003 -0.000001 0.000000 0.000001 -0.000000 -0.000001 -21.148137 13.806842 5.274453 3.186153 24.109176 56.777983 0.000017 66.436492 -0.000018 -29.634671 -10.779737 23.700714 -0.000002 0.000003 -0.000002 -0.000002 -0.000001 0.000000 0.000003 0.000001 0.000000 0.000001 -0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 -0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 -0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.258665 -0.001026 0.016131 -0.000000 0.000000 0.000001 0.000003 -0.000007 0.000012 -0.000000 -0.000000 -0.000000 0.000003 -0.000008 0.000015 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000136 0.844156 8.850769 4.112264 -0.400426 -0.002470 0.024600 3.686768 0.012161 0.574212 0.000008 -0.000011 0.000022 0.000000 0.000000 -0.000000 0.000008 -0.000012 0.000023 -0.000001 -0.000003 -0.000001 0.000000 0.000003 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.013647 -0.117403 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073429 -0.490356 16.227358 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 -44.855375 4.621465 -7.022495 64.798988 -50.620905 -43.988095 0.000003 -48.748990 0.000001 22.954895 10.236789 21.537087 0.000001 0.000001 -0.000000 0.000003 0.000002 -0.000002 -0.000001 -0.000000 0.000000 0.000000 0.000000 0.000000 -21.727170 13.754242 5.412382 3.710738 25.440532 55.139861 0.000012 67.739098 -0.000023 -30.132069 -10.980404 20.966207 -0.000001 -0.000001 0.000002 0.000001 0.000000 0.000003 -0.000001 0.000001 -0.000003 0.000000 -0.000001 -0.000001 0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.233926 -0.000924 0.014603 -0.000000 -0.000001 -0.000000 0.000005 -0.000006 0.000011 0.000000 -0.000000 0.000000 0.000003 -0.000006 0.000012 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -0.362130 -0.002228 0.022238 3.686769 0.012163 0.574210 0.000009 -0.000015 0.000024 0.000000 0.000001 -0.000000 0.000009 -0.000016 0.000025 -0.000001 -0.000003 0.000001 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.012338 -0.106146 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073430 -0.490356 16.227360 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 -0.000000 0.000000 0.000002 -0.000000 0.000000 0.000002 -0.000000 -0.000000 -0.000002 0.000000 0.000000 -44.855375 4.621464 -6.896638 64.382265 -50.898809 -44.379537 0.000005 -48.240451 0.000000 22.318963 10.013474 21.726075 -0.000001 0.000001 0.000000 0.000003 0.000002 -0.000002 0.000001 -0.000003 -0.000001 0.000001 0.000000 -0.000000 -22.316590 13.699285 5.552247 4.291062 26.778211 53.438594 0.000005 69.066217 -0.000032 -30.519666 -11.118243 18.868749 0.000001 -0.000002 -0.000001 -0.000002 -0.000002 -0.000001 -0.000000 0.000005 -0.000001 0.000001 -0.000001 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.210054 -0.000827 0.013127 0.000003 -0.000002 0.000002 0.000004 -0.000005 0.000009 0.000000 -0.000000 -0.000000 0.000004 -0.000006 0.000010 -0.000001 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850772 4.112264 -0.325174 -0.001991 0.019958 3.686767 0.012162 0.574209 0.000015 -0.000014 0.000028 0.000001 0.000000 -0.000000 0.000014 -0.000014 0.000026 -0.000001 -0.000004 -0.000001 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.011076 -0.095287 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469514 -0.073429 -0.490356 16.227360 -0.000002 -0.000001 25.491238 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 -0.000000 0.000000 0.000002 -0.000000 0.000000 0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -44.855372 4.621464 -6.769649 63.956184 -51.177361 -44.780144 0.000004 -47.727340 0.000001 21.678483 9.786064 21.914081 -0.000000 0.000000 -0.000001 0.000003 0.000001 -0.000001 0.000001 0.000001 0.000000 -0.000001 0.000000 0.000000 -22.911047 13.642415 5.692744 4.924403 28.106691 51.687050 0.000023 70.405638 -0.000040 -30.770552 -11.199154 17.524626 -0.000001 -0.000001 -0.000001 -0.000003 0.000000 -0.000002 0.000003 0.000001 -0.000004 0.000001 0.000001 0.000000 -0.000001 0.000000 0.000000 0.000000 -0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000001 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -0.187113 -0.000734 0.011708 0.000002 -0.000002 0.000002 0.000009 -0.000008 0.000013 0.000000 0.000000 -0.000000 0.000008 -0.000008 0.000014 -0.000000 -0.000001 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850771 4.112264 -0.289659 -0.001769 0.017768 3.686769 0.012162 0.574213 0.000012 -0.000015 0.000026 0.000000 0.000002 -0.000000 0.000011 -0.000016 0.000025 -0.000001 -0.000004 0.000000 0.000000 0.000001 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.009864 -0.084858 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227360 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000002 -0.000000 0.000000 -44.855372 4.621464 -6.642664 63.524407 -51.454018 -45.186479 0.000006 -47.214232 0.000001 21.039189 9.556601 22.099379 -0.000002 -0.000003 0.000000 0.000002 0.000000 0.000000 0.000002 -0.000001 -0.000001 0.000002 0.000000 -0.000000 -23.505220 13.584142 5.832594 5.606081 29.410873 49.899538 0.000030 71.745072 -0.000029 -30.859553 -11.226326 17.050184 0.000002 0.000002 0.000008 0.000001 -0.000000 -0.000001 -0.000001 -0.000001 0.000001 -0.000000 -0.000001 -0.000001 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.165169 -0.000646 0.010351 0.000003 0.000000 -0.000001 0.000007 -0.000008 0.000010 0.000000 0.000000 -0.000000 0.000005 -0.000008 0.000012 -0.000001 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850771 4.112264 -0.255689 -0.001555 0.015672 3.686767 0.012164 0.574211 0.000012 -0.000013 0.000027 0.000000 0.000001 -0.000001 0.000011 -0.000013 0.000027 -0.000001 -0.000002 0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.008705 -0.074887 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227362 -0.000002 -0.000001 25.491238 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000003 0.000000 -0.000000 0.000003 0.000000 -0.000000 0.000003 0.000000 -0.000000 0.000001 -0.000000 -0.000000 -44.855382 4.621464 -6.516806 63.090765 -51.726317 -45.594979 0.000001 -46.705680 0.000000 20.406807 9.327200 22.280311 0.000001 -0.000001 -0.000000 0.000001 0.000000 0.000000 0.000001 -0.000002 -0.000001 -0.000001 0.000001 -0.000000 -24.093777 13.524993 5.970535 6.329620 30.676729 48.091765 0.000019 73.072198 -0.000037 -30.744054 -11.190907 17.666141 0.000001 0.000001 -0.000001 -0.000001 0.000000 0.000000 0.000000 -0.000001 -0.000001 0.000001 0.000000 0.000000 -0.000001 0.000000 0.000000 -0.000002 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.144290 -0.000562 0.009061 -0.000000 -0.000000 0.000000 0.000007 -0.000006 0.000013 -0.000000 -0.000000 -0.000000 0.000008 -0.000006 0.000014 0.000000 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.223367 -0.001356 0.013678 3.686768 0.012164 0.574211 0.000008 -0.000014 0.000024 0.000000 -0.000000 -0.000000 0.000008 -0.000014 0.000024 -0.000001 -0.000004 -0.000000 0.000000 0.000001 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.007603 -0.065404 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073428 -0.490357 16.227356 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 -0.000000 0.000000 0.000002 -0.000000 0.000000 0.000002 -0.000000 0.000000 0.000003 0.000000 -0.000000 -44.855379 4.621465 -6.393213 62.659315 -51.991800 -46.001730 0.000007 -46.206346 0.000002 19.786981 9.100046 22.455350 0.000000 0.000000 -0.000001 -0.000001 0.000001 -0.000001 0.000003 -0.000000 0.000000 0.000001 0.000000 0.000001 -24.671413 13.465581 6.105338 7.087656 31.892284 46.280392 0.000027 74.374804 -0.000041 -30.421731 -11.084905 19.396206 0.000001 0.000002 0.000003 -0.000001 -0.000001 -0.000001 -0.000002 0.000002 -0.000001 0.000002 -0.000001 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.124541 -0.000483 0.007840 0.000002 -0.000000 0.000000 0.000009 -0.000007 0.000014 0.000000 0.000000 -0.000000 0.000007 -0.000007 0.000015 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.192796 -0.001167 0.011792 3.686765 0.012162 0.574213 0.000012 -0.000013 0.000028 0.000000 0.000001 -0.000000 0.000013 -0.000013 0.000028 -0.000001 -0.000002 -0.000001 0.000000 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.006561 -0.056439 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073428 -0.490357 16.227358 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000002 -0.000000 -0.000000 0.000002 -0.000000 -0.000000 0.000002 -0.000000 -0.000000 0.000001 0.000000 0.000000 -44.855375 4.621465 -6.273011 62.234368 -52.248167 -46.402758 0.000001 -45.720747 0.000001 19.185337 8.877395 22.623046 0.000002 -0.000000 0.000004 0.000000 0.000001 -0.000002 -0.000003 0.000001 0.000001 -0.000003 0.000000 -0.000000 -25.232841 13.406543 6.235792 7.871102 33.046842 44.483516 0.000019 75.640677 -0.000037 -29.930695 -10.902462 22.067011 0.000000 0.000000 0.000000 -0.000000 -0.000001 -0.000004 -0.000003 -0.000001 0.000001 -0.000000 -0.000001 0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.105991 -0.000410 0.006692 0.000003 -0.000001 0.000000 0.000005 -0.000007 0.000011 0.000000 -0.000000 0.000000 0.000004 -0.000008 0.000013 0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -0.164079 -0.000989 0.010020 3.686765 0.012160 0.574211 0.000013 -0.000012 0.000028 0.000000 0.000001 -0.000001 0.000013 -0.000014 0.000027 -0.000001 -0.000004 -0.000000 -0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.005582 -0.048021 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469518 -0.073428 -0.490356 16.227356 -0.000002 -0.000001 25.491248 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 0.000003 -0.000000 -0.000000 0.000003 -0.000000 -0.000000 0.000003 -0.000000 -0.000000 0.000001 0.000000 0.000000 -44.855372 4.621466 -6.157332 61.820315 -52.493115 -46.793804 0.000001 -45.253487 0.000000 18.607425 8.661536 22.782062 0.000004 0.000001 0.000001 0.000004 0.000002 -0.000001 0.000001 -0.000000 -0.000000 -0.000003 0.000000 -0.000000 -25.772790 13.348567 6.360721 8.668906 34.130879 42.720672 0.000054 76.857742 -0.000030 -29.312146 -10.634634 25.503445 0.000001 -0.000000 0.000001 -0.000003 -0.000001 -0.000001 0.000001 -0.000001 0.000003 0.000001 -0.000001 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.088705 -0.000342 0.005623 0.000000 -0.000000 0.000000 0.000010 -0.000007 0.000013 0.000000 -0.000000 -0.000000 0.000008 -0.000008 0.000013 -0.000000 -0.000001 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.137319 -0.000827 0.008370 3.686765 0.012162 0.574212 0.000014 -0.000015 0.000027 0.000000 0.000002 -0.000000 0.000013 -0.000014 0.000027 -0.000001 -0.000003 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.004671 -0.040180 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469519 -0.073430 -0.490356 16.227363 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.855382 4.621465 -6.047306 61.421828 -52.724453 -47.170424 0.000004 -44.809125 0.000000 18.058793 8.454832 22.931138 0.000001 -0.000002 0.000001 0.000002 -0.000003 0.000001 0.000002 -0.000002 -0.000000 0.000000 -0.000000 -0.000000 -26.286009 13.292376 6.478963 9.468131 35.135982 41.012916 0.000027 78.013963 -0.000037 -28.610269 -10.275119 29.522827 0.000001 0.000000 0.000002 0.000002 0.000000 0.000000 -0.000000 -0.000001 0.000002 0.000000 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 -0.000001 0.000000 0.000001 -0.000001 0.000000 -0.006240 0.005974 -3.161587 -0.072748 -0.000279 0.004636 0.000000 -0.000001 -0.000002 0.000009 -0.000009 0.000012 0.000000 0.000000 -0.000000 0.000009 -0.000009 0.000015 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 -0.112619 -0.000677 0.006845 3.686765 0.012162 0.574210 0.000012 -0.000016 0.000024 -0.000000 0.000001 -0.000000 0.000009 -0.000017 0.000024 -0.000001 -0.000002 0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.003830 -0.032945 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469515 -0.073429 -0.490356 16.227363 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 0.000000 -0.000002 -0.000000 0.000000 -0.000002 -0.000000 0.000000 0.000001 0.000000 0.000000 -44.855382 4.621466 -5.944064 61.043737 -52.940048 -47.528039 0.000004 -44.392248 0.000002 17.544898 8.259656 23.069066 0.000001 0.000000 0.000003 0.000002 0.000000 -0.000001 0.000003 -0.000000 0.000000 -0.000001 -0.000000 0.000000 -26.767247 13.238725 6.589392 10.254224 36.054991 39.382587 0.000034 79.097538 -0.000064 -27.870891 -9.824980 33.932660 -0.000001 -0.000002 0.000001 -0.000002 -0.000001 0.000001 -0.000000 -0.000004 -0.000002 0.000000 -0.000001 -0.000000 0.000002 0.000001 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000001 -0.000000 0.000002 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -0.058190 -0.000222 0.003737 0.000002 -0.000001 0.000000 0.000008 -0.000006 0.000012 0.000000 0.000000 -0.000000 0.000007 -0.000007 0.000012 -0.000000 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850771 4.112264 -0.090081 -0.000539 0.005454 3.686765 0.012162 0.574213 0.000010 -0.000015 0.000026 -0.000001 0.000001 -0.000000 0.000011 -0.000014 0.000026 -0.000002 -0.000004 0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.003062 -0.026346 0.000000 0.000000 0.664365 -0.003829 -0.048461 12.469521 -0.073429 -0.490356 16.227355 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 0.000002 0.000000 0.000000 -0.000001 0.000000 0.000000 -44.855375 4.621466 -5.848735 60.691005 -53.137827 -47.861885 0.000003 -44.007401 0.000001 17.071216 8.078429 23.194759 -0.000001 -0.000003 -0.000002 -0.000001 -0.000001 0.000001 0.000001 -0.000000 -0.000000 0.000003 -0.000000 0.000000 -27.211294 13.188398 6.690895 11.011213 36.881854 37.853124 0.000052 80.096693 -0.000065 -27.138517 -9.295774 38.532256 0.000001 0.000000 0.000000 -0.000001 -0.000002 0.000000 -0.000001 -0.000002 -0.000002 0.000001 -0.000001 -0.000000 -0.000001 0.000000 0.000000 -0.000001 -0.000000 0.000000 0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.045096 -0.000171 0.002926 0.000002 -0.000001 0.000002 0.000004 -0.000005 0.000012 0.000000 0.000000 -0.000000 0.000000 -0.000006 0.000013 0.000000 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850771 4.112264 -0.069809 -0.000417 0.004203 3.686770 0.012164 0.574209 0.000014 -0.000014 0.000028 -0.000000 -0.000000 -0.000000 0.000013 -0.000016 0.000027 -0.000001 -0.000001 -0.000000 0.000000 0.000002 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.002373 -0.020413 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469521 -0.073430 -0.490356 16.227355 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000002 0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.855375 4.621464 -5.762447 60.368695 -53.315743 -48.167105 -0.000001 -43.659109 0.000001 16.643151 7.913573 23.307139 -0.000001 0.000001 -0.000000 -0.000001 -0.000001 -0.000001 0.000002 0.000000 0.000001 -0.000003 0.000000 -0.000000 -27.612959 13.142198 6.782376 11.722125 37.611557 36.448830 0.000063 80.999794 -0.000078 -26.452541 -8.710431 43.117581 0.000000 0.000000 -0.000000 -0.000002 -0.000005 -0.000003 0.000001 0.000000 -0.000001 0.000001 0.000001 -0.000000 -0.000001 0.000001 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000001 -0.000000 -0.000001 0.000001 -0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.033530 -0.000127 0.002211 0.000004 -0.000001 0.000000 0.000009 -0.000007 0.000013 0.000000 0.000000 -0.000000 0.000009 -0.000007 0.000013 -0.000000 -0.000001 -0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.051906 -0.000308 0.003099 3.686769 0.012163 0.574211 0.000010 -0.000015 0.000025 0.000000 -0.000000 0.000000 0.000007 -0.000014 0.000022 -0.000000 -0.000003 0.000000 0.000000 0.000002 -0.000099 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.001764 -0.015174 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469517 -0.073430 -0.490356 16.227358 -0.000002 -0.000001 25.491241 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.855375 4.621465 -5.686339 60.081998 -53.471816 -48.438773 -0.000002 -43.351969 0.000001 16.266094 7.767516 23.405146 0.000000 -0.000003 0.000003 -0.000001 0.000003 0.000000 -0.000001 0.000000 0.000000 -0.000004 0.000000 0.000001 -27.967043 13.100941 6.862761 12.369369 38.239927 35.194472 0.000045 81.795299 -0.000091 -25.843967 -8.101989 47.487351 -0.000001 -0.000002 0.000001 -0.000003 0.000001 0.000002 -0.000000 0.000000 -0.000002 0.000001 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.023562 -0.000088 0.001594 0.000003 -0.000000 0.000000 0.000004 -0.000007 0.000013 0.000000 -0.000000 0.000000 0.000002 -0.000007 0.000011 -0.000000 -0.000001 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850769 4.112264 -0.036475 -0.000216 0.002147 3.686766 0.012163 0.574209 0.000011 -0.000011 0.000025 -0.000000 -0.000000 -0.000000 0.000010 -0.000011 0.000023 -0.000001 -0.000002 -0.000001 0.000000 0.000001 -0.000100 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000
0.000000 1.067000 0.001239 -0.010661 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469519 -0.073429 -0.490356 16.227358 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000002 -0.000000 0.000000 -44.855375 4.621465 -5.621532 59.836098 -53.604045 -48.671870 -0.000001 -43.090475 0.000001 15.945437 7.642685 23.487786 -0.000001 -0.000004 0.000000 0.000001 0.000001 -0.000001 -0.000000 0.000000 0.000001 0.000001 -0.000000 0.000000 -28.268374 13.065438 6.930973 12.935170 38.763260 34.114985 0.000075 82.471816 -0.000113 -25.333481 -7.510489 51.448694 0.000001 -0.000000 0.000000 -0.000001 -0.000002 -0.000002 -0.000000 0.000000 -0.000004 -0.000001 0.000001 -0.000000 -0.000001 0.000001 -0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.006240 0.005974 -3.161587 -0.015258 -0.000056 0.001081 0.000005 -0.000002 0.000004 0.000006 -0.000006 0.000013 -0.000000 -0.000000 -0.000000 0.000002 -0.000005 0.000011 0.000000 0.000000 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850769 4.112264 -0.023619 -0.000140 0.001353 3.686768 0.012161 0.574212 0.000009 -0.000016 0.000027 -0.000000 0.000001 -0.000000 0.000010 -0.000016 0.000026 -0.000001 -0.000003 0.000000 -0.000000 0.000001 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.000802 -0.006902 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227360 -0.000002 -0.000001 25.491239 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 0.000000 -0.000000 -44.855382 4.621464 -5.569160 59.636192 -53.710453 -48.861476 0.000001 -42.879193 0.000001 15.686590 7.541500 23.554008 0.000000 -0.000000 -0.000002 0.000002 -0.000002 0.000000 -0.000000 -0.000001 0.000000 -0.000001 0.000000 -0.000000 -28.511783 13.036501 6.985937 13.402059 39.178037 33.235089 0.000060 83.017944 -0.000108 -24.931878 -6.979204 54.820208 -0.000000 -0.000003 0.000000 0.000003 -0.000002 0.000000 -0.000001 -0.000000 -0.000003 0.000001 0.000001 -0.000000 -0.000001 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.006240 0.005974 -3.161587 -0.008682 -0.000030 0.000674 -0.000000 -0.000002 0.000002 0.000004 -0.000008 0.000010 -0.000000 -0.000000 -0.000000 0.000002 -0.000006 0.000009 -0.000000 -0.000000 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850769 4.112264 -0.013440 -0.000076 0.000725 3.686767 0.012166 0.574209 0.000011 -0.000011 0.000025 -0.000000 0.000000 -0.000000 0.000013 -0.000013 0.000027 -0.000001 -0.000003 -0.000000 0.000000 0.000002 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000
0.000000 1.067000 0.000456 -0.003927 0.000000 0.000000 0.664367 -0.003829 -0.048461 12.469516 -0.073428 -0.490356 16.227360 -0.000002 -0.000001 25.491243 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000002 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.855382 4.621466 -5.530355 59.487335 -53.789055 -49.002670 0.000002 -42.722669 0.000001 15.494933 7.466356 23.602782 0.000002 -0.000002 0.000000 0.000001 0.000000 -0.000001 0.000001 -0.000000 0.000000 0.000001 0.000001 -0.000000 -28.692078 13.014914 7.026574 13.753393 39.480519 32.578858 0.000048 83.422223 -0.000122 -24.642605 -6.551296 57.431441 0.000002 0.000003 0.000000 0.000001 -0.000004 -0.000000 0.000001 0.000002 -0.000005 0.000000 0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 0.000000 -0.000000 0.000001 -0.000000 -0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.003903 -0.000012 0.000379 -0.000000 -0.000002 0.000002 0.000007 -0.000005 0.000011 0.000000 0.000000 -0.000000 0.000006 -0.000005 0.000012 -0.000000 -0.000001 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850770 4.112264 -0.006042 -0.000034 0.000268 3.686766 0.012162 0.574211 0.000013 -0.000015 0.000027 0.000000 -0.000001 0.000000 0.000010 -0.000014 0.000026 -0.000000 -0.000005 -0.000001 0.000000 0.000001 -0.000101 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.000205 -0.001765 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227358 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000001 0.000000 0.000000 -44.855382 4.621465 -5.506240 59.394546 -53.837778 -49.090718 0.000002 -42.625401 0.000000 15.375920 7.419583 23.632939 -0.000000 0.000001 -0.000000 0.000003 -0.000002 0.000000 -0.000000 0.000001 -0.000000 -0.000003 0.000001 -0.000000 -28.804079 13.001436 7.051784 13.973835 39.666286 32.169412 0.000035 83.673294 -0.000104 -24.466108 -6.267585 59.118948 0.000001 0.000002 0.000002 -0.000001 -0.000001 -0.000002 -0.000000 0.000001 -0.000002 0.000001 -0.000000 -0.000000 0.000001 0.000001 -0.000000 0.000002 0.000000 -0.000000 0.000002 0.000001 -0.000000 0.000002 0.000001 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.006240 0.005974 -3.161587 -0.000987 -0.000001 0.000199 0.000003 -0.000001 0.000000 0.000006 -0.000004 0.000011 0.000000 0.000000 -0.000000 0.000003 -0.000005 0.000013 -0.000001 -0.000001 0.000000 -0.000000 0.000003 0.000138 0.844156 8.850771 4.112264 -0.001528 -0.000005 -0.000010 3.686769 0.012163 0.574209 0.000011 -0.000011 0.000025 0.000000 0.000000 -0.000000 0.000009 -0.000012 0.000025 -0.000001 -0.000004 -0.000000 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 0.000052 -0.000446 0.000000 0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073429 -0.490356 16.227360 -0.000002 -0.000001 25.491244 -0.000003 -0.000001 -179.999991 -0.000044 0.000003 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000002 -0.000000 0.000000 -44.855379 4.621466 -5.497951 59.362602 -53.854501 -49.121027 0.000008 -42.591980 0.000002 15.335021 7.403497 23.643282 -0.000001 -0.000001 0.000003 0.000003 0.000002 0.000002 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -28.842571 12.996796 7.060443 14.049927 39.729704 32.028410 0.000090 83.759559 -0.000129 -24.405364 -6.165397 59.719042 0.000001 -0.000003 0.000003 -0.000000 -0.000002 0.000000 -0.000001 0.000001 -0.000003 0.000001 0.000001 0.000001 -0.000001 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000001 0.000000 -0.000000 -0.000001 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 0.000000 0.000003 0.000138 0.000002 0.000000 0.000001 0.000008 -0.000007 0.000013 -0.000000 -0.000000 -0.000000 0.000006 -0.000007 0.000012 0.000000 0.000000 0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 0.000000 0.000001 -0.000100 3.686767 0.012163 0.574211 0.000010 -0.000014 0.000027 -0.000000 0.000000 -0.000001 0.000010 -0.000016 0.000028 -0.000001 -0.000003 -0.000001 0.000000 0.000001 -0.000100 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000
0.000000 1.067000 -0.000000 -0.000000 -0.000000 -0.000000 0.664366 -0.003829 -0.048461 12.469516 -0.073428 -0.490356 16.227360 -0.000002 -0.000001 25.491246 -0.000003 -0.000001 -179.999991 -0.000044 0.000002 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000001 0.000000 0.000000 -44.855375 4.621465 -5.497951 59.362608 -53.854501 -49.121033 0.000002 -42.591974 0.000002 15.335025 7.403498 23.643277 0.000001 -0.000000 -0.000002 0.000002 0.000000 -0.000001 -0.000002 -0.000000 0.000000 -0.000003 0.000000 0.000000 -28.842567 12.996796 7.060444 14.049929 39.729704 32.028410 0.000122 83.759552 -0.000145 -24.405357 -6.165397 59.719035 0.000004 -0.000003 0.000000 0.000001 -0.000002 -0.000001 -0.000000 -0.000001 -0.000004 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000001 -0.000000 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 -0.000000 0.000000 0.000001 -0.000000 0.000000 0.000001 -0.000000 -0.006240 0.005974 -3.161587 -0.000000 0.000003 0.000138 0.000002 0.000000 -0.000002 0.000007 -0.000007 0.000014 -0.000000 -0.000000 -0.000000 0.000005 -0.000007 0.000014 -0.000000 -0.000000 -0.000000 -0.000000 0.000003 0.000137 0.844156 8.850770 4.112264 0.000000 0.000003 -0.000101 3.686766 0.012163 0.574209 0.000011 -0.000012 0.000024 -0.000001 -0.000001 -0.000000 0.000012 -0.000012 0.000025 -0.000000 -0.000004 -0.000001 0.000000 0.000003 -0.000101 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000

View File

@@ -1,9 +0,0 @@
## Couples
###### This space is for couple animations.
To prevent the collar from listing an animation in the pose menu, we can add a tilde in front of the pose name.
* i.e. ~hug.bvh
We will add further description in the readme here.

Some files were not shown because too many files have changed in this diff Show More