-
Notifications
You must be signed in to change notification settings - Fork 0
/
scavenger_object.lsl
195 lines (166 loc) · 6.41 KB
/
scavenger_object.lsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*
Piriya Saengsuwarn
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
http://creativecommons.org/licenses/by-nc/4.0/
*/
/*v### Scavenger Object Settings - Make Changes Below ###v*/
string TOKEN_NAME = "Calmness"; //VSD Value (Pick valid value from VSD_LIST below if this is not a decoy)
string TRIGGER_ID = "Calmness Token Dispenser"; //Object name - Make sure this matches with the trigger plate/button settings in scavenger_trigger_button.lsl or scavenger_trigger_plate.lsl, meaningful name preferred
integer ALWAYS_VISIBLE = FALSE; //FALSE if there is another object that triggers this object to appear
integer ACTIVATION_TIME = 15; //Time until object disappears (seconds) after being activated (make sure ALWAYS_VISIBLE = FALSE and this matches with the object settings)
float DEACTIVATED_ALPHA = 0.0; //1.0 for fully opaque, 0.0 for fully transparent
integer SHOW_COUNTDOWN = TRUE; //Show floating text countdown
vector COUNTDOWN_COLOR = <1.0, 1.0, 1.0>;
integer ENABLE_PING = TRUE; //Allow object to be ping by HUD
/*^### Scavenger Object Settings - Make Changes Above ###^*/
/*Global Constants*/
string SEPERATOR = "|||";
integer SCAVENGER_HUD_CHANNEL = -498;
integer SCAVENGER_OBJECT_CHANNEL = 498;
string XOR_KEY = "husky498uw!";
list VSD_LIST =
["Accountability", "Autonomy", "Calmness", "Courtesy",
"Educational", "Empirical", "Environmental Stability", "Freedom from Bias",
"Human Welfare", "Identity", "Informed Consent", "Ownership/Property",
"Trust", "Universal Usability", "Exceptional", "Privacy"];
/*Index Constants for Incoming Parameters*/
integer TIME_STAMP = 0;
integer ID = 1;
integer COMMAND = 2;
integer PARAMETER = 3;
/*Global Variables*/
integer listenHandle = 0;
integer timerCounter = 1;
/*Encode & Decode Functions (for security)*/
string Xor(string data, string xorKey)
{
return llXorBase64(llStringToBase64(data), llStringToBase64(xorKey));
}
string Dexor(string data, string xorKey)
{
return llBase64ToString(llXorBase64(data, llStringToBase64(xorKey)));
}
/*Ping Function*/
ReturnPing(key avatarKey)
{
string timeStamp = llGetTimestamp();
string command = "RETURN_PING";
string parameter = "100.0";
list detailRequest = llGetObjectDetails(avatarKey ,[OBJECT_POS]);
if(llGetListLength(detailRequest) != 0)
{
vector avatarPosition = llList2Vector(detailRequest, 0);
parameter = (string)llVecDist(avatarPosition,llGetPos());
string xorParameterList = Xor(timeStamp + SEPERATOR + (string)avatarKey + SEPERATOR + command + SEPERATOR + parameter, XOR_KEY + (string)avatarKey);
llSay(SCAVENGER_HUD_CHANNEL, xorParameterList);
}
}
default
{
state_entry()
{
if(!ALWAYS_VISIBLE)
{
llSetAlpha(DEACTIVATED_ALPHA, ALL_SIDES);
llListenRemove(listenHandle);
listenHandle = llListen(SCAVENGER_OBJECT_CHANNEL, "", "", "");
}
else
{
state activated;
}
}
state_exit()
{
llListenRemove(listenHandle);
}
listen(integer channel, string name, key id, string message)
{
list parameterList = llParseString2List(Dexor(message, XOR_KEY + TRIGGER_ID), [SEPERATOR], [""]);
//If from HUD
if(llGetListLength(parameterList) != 4)
{
parameterList = llParseString2List(Dexor(message, XOR_KEY + (string)llGetOwnerKey(id)), [SEPERATOR], [""]);
}
if(llGetListLength(parameterList) == 4)
{
string timeStamp = llList2Key(parameterList, TIME_STAMP);
string triggerID = llList2String(parameterList, ID); //Avatar Key or Trigger ID
string command = llList2String(parameterList, COMMAND);
string parameter = llList2String(parameterList, PARAMETER);
if(command == "REQUEST_PING" & ENABLE_PING)
{
ReturnPing((key)triggerID);
}
else if(command == "ACTIVATE")
{
state activated;
}
}
}
}
state activated
{
state_entry()
{
llSetAlpha(1.0, ALL_SIDES);
if(!ALWAYS_VISIBLE)
{
if(SHOW_COUNTDOWN)
{
llSetText((string)ACTIVATION_TIME, COUNTDOWN_COLOR, 1.0);
}
timerCounter = 1;
llSetTimerEvent(1.0);
}
llListenRemove(listenHandle);
listenHandle = llListen(SCAVENGER_OBJECT_CHANNEL, "", "", "");
}
state_exit()
{
llSetText("", COUNTDOWN_COLOR, 0.0);
}
touch_end(integer num_detected)
{
string timeStamp = llGetTimestamp();
key avatarKey = llDetectedKey(0);
string command = "ADD_TOKEN";
string parameter = TOKEN_NAME;
string xorParameterList = Xor(timeStamp + SEPERATOR + (string)avatarKey + SEPERATOR + command + SEPERATOR + parameter, XOR_KEY + (string)avatarKey);
llSay(SCAVENGER_HUD_CHANNEL, xorParameterList);
}
timer()
{
if(timerCounter != ACTIVATION_TIME)
{
llSetText((string)(ACTIVATION_TIME - timerCounter), COUNTDOWN_COLOR, 1.0);
timerCounter++;
}
else
{
llSetTimerEvent(0.0);
timerCounter = 1;
state default;
}
}
listen(integer channel, string name, key id, string message)
{
list parameterList = llParseString2List(Dexor(message, XOR_KEY + TRIGGER_ID), [SEPERATOR], [""]);
//Check if Avatar
if(llGetListLength(parameterList) != 4)
{
parameterList = llParseString2List(Dexor(message, XOR_KEY + (string)llGetOwnerKey(id)), [SEPERATOR], [""]);
}
if(llGetListLength(parameterList) == 4)
{
string timeStamp = llList2Key(parameterList, TIME_STAMP);
string triggerID = llList2String(parameterList, ID); //Avatar Key or Trigger ID
string command = llList2String(parameterList, COMMAND);
string parameter = llList2String(parameterList, PARAMETER);
if(command == "REQUEST_PING" & ENABLE_PING)
{
ReturnPing((key)triggerID);
}
}
}
}