343 lines
No EOL
11 KiB
Text
343 lines
No EOL
11 KiB
Text
#include "Common.lsl"
|
|
|
|
integer g_iLastFillTime;
|
|
integer g_iTotalWater;
|
|
integer g_iWellChannel;
|
|
integer g_iWellListener;
|
|
string WATER_TEXTURE = "333d2eb0-f8c3-2c2e-3371-43df880ad2bf";
|
|
vector WATER_PARTICLE = <0.20,0.36,0.79>;
|
|
string API_SERVER="nset";
|
|
key g_kAv=NULL_KEY;
|
|
float g_fEmpty = -1.142;
|
|
float g_fFull = -0.202;
|
|
integer g_iRequestTime = 0;
|
|
string WATER_WELL_NAME = "WoodStoneWaterWell";
|
|
string VERSION = "1.0.3";
|
|
integer g_iWaterPrim;
|
|
integer g_iRoofPrim;
|
|
integer g_iDestroyed = 0;
|
|
|
|
|
|
float getScaledValue(integer percentage) {
|
|
// Ensure the percentage is within the range 0-100
|
|
if (percentage < 0) percentage = 0;
|
|
if (percentage > 100) percentage = 100;
|
|
|
|
// Calculate the scaled value
|
|
float scaledValue = g_fEmpty + ((g_fFull - g_fEmpty) * (percentage / 100.0));
|
|
return scaledValue;
|
|
}
|
|
|
|
setText() {
|
|
llSetText("Water Well\nFill Level: " +(string)g_iTotalWater + "%", <1,1,1>, 1);
|
|
}
|
|
|
|
updateLevel() {
|
|
llSetLinkPrimitiveParams(2, [PRIM_POS_LOCAL, <0,0,getScaledValue(g_iTotalWater)>]);
|
|
}
|
|
|
|
SCAN() {
|
|
integer i;
|
|
integer end = llGetNumberOfPrims();
|
|
for(i=LINK_ROOT;i<=end;i++){
|
|
string sName = llGetLinkName(i);
|
|
if(sName == "water") g_iWaterPrim = i;
|
|
if(sName == "roof") g_iRoofPrim = i;
|
|
}
|
|
|
|
if(!g_iWaterPrim || !g_iRoofPrim) {
|
|
llSay(0, "Something is wrong, either the water of roof was not detected");
|
|
}
|
|
}
|
|
|
|
integer g_iDevListener;
|
|
integer g_iWaitDelivery = 0;
|
|
string g_sCallbackURL;
|
|
key g_kCallbackURLRequest;
|
|
|
|
|
|
|
|
particles(key kTarget) {
|
|
if(kTarget == NULL_KEY) llParticleSystem([]);
|
|
else {
|
|
llParticleSystem(
|
|
[
|
|
// texture parameters:
|
|
PSYS_SRC_TEXTURE , "",
|
|
PSYS_PART_START_SCALE , <0.67,0.58,0.00>, PSYS_PART_END_SCALE , <0.09,0.09,0.00>,
|
|
PSYS_PART_START_COLOR , WATER_PARTICLE, PSYS_PART_END_COLOR , <0.16,0.71,0.83>,
|
|
PSYS_PART_START_ALPHA , (float)1.00, PSYS_PART_END_ALPHA , (float)1.00,
|
|
// production parameters:
|
|
PSYS_SRC_BURST_PART_COUNT , 16,
|
|
PSYS_SRC_BURST_RATE , (float)0.10,
|
|
PSYS_PART_MAX_AGE , (float)6.54,
|
|
PSYS_SRC_MAX_AGE , (float)0.18,
|
|
// placement parameters:
|
|
PSYS_SRC_PATTERN , 2,
|
|
PSYS_SRC_BURST_SPEED_MIN , (float)1.00, PSYS_SRC_BURST_SPEED_MAX , (float)1.00,
|
|
PSYS_SRC_BURST_RADIUS , (float)0.00,
|
|
// placement parameters (for angles only):
|
|
PSYS_SRC_ANGLE_BEGIN , (float)0.00,
|
|
PSYS_SRC_ANGLE_END , (float)0.00,
|
|
PSYS_SRC_OMEGA , <0.00,0.00,0.00>,
|
|
// after-effects & influences:
|
|
PSYS_SRC_ACCEL , <0.00,0.00,0.00>,
|
|
PSYS_SRC_TARGET_KEY , kTarget,
|
|
PSYS_PART_FLAGS , ( 0 // texture & influence options:
|
|
// | PSYS_PART_INTERP_COLOR_MASK
|
|
| PSYS_PART_INTERP_SCALE_MASK
|
|
// | PSYS_PART_BOUNCE_MASK
|
|
// | PSYS_PART_WIND_MASK
|
|
// | PSYS_PART_FOLLOW_SRC_MASK
|
|
| PSYS_PART_FOLLOW_VELOCITY_MASK
|
|
| PSYS_PART_TARGET_POS_MASK
|
|
// | PSYS_PART_TARGET_LINEAR_MASK
|
|
| PSYS_PART_EMISSIVE_MASK
|
|
)] );
|
|
}
|
|
}
|
|
|
|
default
|
|
{
|
|
state_entry()
|
|
{
|
|
llLinksetDataReset();
|
|
XteaKey(PSK);
|
|
PROTECT();
|
|
llSay(0, "Scanning for needed linked prims...");
|
|
SCAN();
|
|
llSay(0, "Scan completed");
|
|
|
|
llSay(0, "Ready to be packaged");
|
|
global_ingredients = getIngredientChannel(NULL_KEY);
|
|
llListen(global_ingredients, "", "", "");
|
|
g_iTotalWater = 100;
|
|
|
|
updateLevel();
|
|
setText();
|
|
|
|
g_iDevListener = llListen(99, "", "", "");
|
|
|
|
}
|
|
|
|
listen(integer c,string n,key i,string m) {
|
|
if(c==99) {
|
|
if(m == "devmode_off") {
|
|
g_iTotalWater=100;
|
|
llSetTimerEvent(1);
|
|
g_iLastFillTime=llGetUnixTime();
|
|
if(g_iWellChannel != 0) {
|
|
llListenRemove(g_iWellListener);
|
|
}
|
|
g_iWellChannel = (integer)("0x" + llGetSubString(llGetKey(), 0, 5));
|
|
g_iWellListener = llListen(g_iWellChannel, "", "", "");
|
|
|
|
setText();
|
|
} else if(m == "empty") {
|
|
g_iTotalWater = 0;
|
|
setText();
|
|
}else if(m == "freeze") {
|
|
llSetTimerEvent(0);
|
|
} else if(m == "reset") {
|
|
llResetScript();
|
|
}
|
|
return;
|
|
}
|
|
string sJson = xtea_decrypt_string(m);
|
|
if(llJsonGetValue(sJson, ["cmd"]) == "alive" && llJsonGetValue(sJson, ["type"]) == "Bucket") {
|
|
|
|
if(g_kAv != NULL_KEY) {
|
|
|
|
g_iTotalWater--;
|
|
g_iLastFillTime = llGetUnixTime();
|
|
llSetTimerEvent(1);
|
|
g_kAv = NULL_KEY;
|
|
|
|
|
|
integer iChannel = getIngredientChannel(i);
|
|
llSleep(2);
|
|
llRegionSayTo(i, iChannel, xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "init"])));
|
|
llSleep(1);
|
|
|
|
llRegionSayTo(i, iChannel, xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "deposit", "type", "Water", "amount", 4, "texture", WATER_TEXTURE, "particle", WATER_PARTICLE, "dies", 1])));
|
|
|
|
setText();
|
|
updateLevel();
|
|
}
|
|
} else if(llJsonGetValue(sJson, ["cmd"]) == "query" && llJsonGetValue(sJson, ["product"]) == "water well") {
|
|
llRegionSayTo(i,c,xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "reply", "ingredient", "Water", "id", llGetKey()])));
|
|
|
|
} else if(llJsonGetValue(sJson, ["cmd"]) == "use" && llJsonGetValue(sJson, ["id"]) == llGetKey()) {
|
|
particles(i);
|
|
if(g_iTotalWater == 0)
|
|
{
|
|
llRegionSayTo(i,global_ingredients,llList2Json(JSON_OBJECT, ["cmd", "use_reply", "id", NULL_KEY, "amount", 0]));
|
|
return;
|
|
}
|
|
|
|
g_iTotalWater--;
|
|
updateLevel();
|
|
setText();
|
|
|
|
llSetTimerEvent(1);
|
|
|
|
|
|
llRegionSayTo(i,global_ingredients,llList2Json(JSON_OBJECT, ["cmd", "use_reply", "id", llGetKey(), "amount", 4, "ingredient", "Water"]));
|
|
}
|
|
}
|
|
|
|
on_rez(integer t) {
|
|
// Start the timer
|
|
g_iLastFillTime = llGetUnixTime();
|
|
llSetTimerEvent(1);
|
|
|
|
if(g_iWellChannel != 0) {
|
|
llListenRemove(g_iWellListener);
|
|
}
|
|
g_iWellChannel = (integer)("0x" + llGetSubString(llGetKey(), 0, 5));
|
|
g_iWellListener = llListen(g_iWellChannel, "", "", "");
|
|
|
|
setText();
|
|
}
|
|
|
|
link_message(integer s,integer n,string m,key i) {
|
|
if(n == 0x004f) {
|
|
API_SERVER = DecipherService(m, "api") + "/zni";
|
|
}
|
|
}
|
|
|
|
changed(integer c) {
|
|
if(c & CHANGED_OWNER) {
|
|
// pre-fill water
|
|
g_iTotalWater = 100;
|
|
} else if(c & CHANGED_REGION_START) {
|
|
// Check for a product update
|
|
llHTTPRequest(API_SERVER + "/Modify_Product_V2.php", [HTTP_MIMETYPE, "application/json", HTTP_METHOD, "POST"], llList2Json(JSON_OBJECT, ["psk", SERVER_PSK, "op", "get", "name", WATER_WELL_NAME]));
|
|
}
|
|
}
|
|
|
|
timer() {
|
|
if(g_iWaitDelivery) {
|
|
g_iWaitDelivery--;
|
|
|
|
if(g_iWaitDelivery == 1) {
|
|
// Failed, request by fallback
|
|
llReleaseURL(g_sCallbackURL);
|
|
llHTTPRequest(API_SERVER + "/Get_Server_URL.php?NAME=Farming", [], "");
|
|
}
|
|
|
|
|
|
if(g_iTotalWater >= 100 && !g_iWaitDelivery) {
|
|
llSetTimerEvent(0);
|
|
return;
|
|
}
|
|
}
|
|
if(llGetUnixTime() > (g_iLastFillTime + 60)) {
|
|
g_iLastFillTime = llGetUnixTime();
|
|
g_iTotalWater ++;
|
|
|
|
updateLevel();
|
|
|
|
if(g_iTotalWater >= 100) {
|
|
g_iTotalWater = 100;
|
|
llSetTimerEvent(0);
|
|
llLinksetDataWrite("water", (string)g_iTotalWater);
|
|
}
|
|
|
|
setText();
|
|
}
|
|
}
|
|
|
|
touch_start(integer t) {
|
|
if(!llSameGroup(llDetectedKey(0))) {
|
|
llRegionSayTo(llDetectedKey(0), 0, "/!\\ WARNING /!\\\n\n> You are not wearing the required group tag. All products in the Aria's Creations Farm System require you to wear the correct group tag for security reasons.");
|
|
return;
|
|
}
|
|
|
|
if(g_iDestroyed) {
|
|
llSay(0, "The well appears to have sustained a lot of damage. You'll need to construct a new one.");
|
|
return;
|
|
}
|
|
if(g_iTotalWater == 0) {
|
|
llSay(0, "The well is currently empty. Come back later");
|
|
return;
|
|
}
|
|
|
|
if(API_SERVER == "nset") {
|
|
llWhisper(0, "Still waiting for API Server...");
|
|
llMessageLinked(LINK_SET, -1, "", "");
|
|
return;
|
|
}
|
|
|
|
if(g_kAv == NULL_KEY) {
|
|
|
|
g_kAv = llDetectedKey(0);
|
|
g_iRequestTime = llGetUnixTime();
|
|
//llRezObject("Water Bucket [AC]", llGetPos() + <2,0,0>, ZERO_VECTOR, ZERO_ROTATION, g_iWellChannel);
|
|
llHTTPRequest(API_SERVER + "/Get_Server_ID.php?NAME=Farming", [], "");
|
|
|
|
llWhisper(0, "Requesting a bucket...");
|
|
llSetText("BUSY", <1,0,0>,1);
|
|
} else {
|
|
if(llGetAgentSize(g_kAv) == ZERO_VECTOR) {
|
|
llWhisper(0, "I was previously in use, the person seems to have left the region. Try again now");
|
|
g_kAv = NULL_KEY;
|
|
setText();
|
|
}else {
|
|
llWhisper(0, "I am currently in use, please be patient");
|
|
|
|
if(llGetUnixTime() > g_iRequestTime + 120) {
|
|
llWhisper(0, "2 minutes have passed, clearing busy status");
|
|
g_kAv = NULL_KEY;
|
|
g_iRequestTime = 0;
|
|
setText();
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
http_request(key kID, string sMethod, string sBody)
|
|
{
|
|
if(kID == g_kCallbackURLRequest) {
|
|
if(sMethod == URL_REQUEST_GRANTED) {
|
|
requestProductForDelivery("Water Bucket [AC]", g_kAv, sBody);
|
|
g_sCallbackURL = sBody;
|
|
|
|
g_iWaitDelivery = 30;
|
|
llSetTimerEvent(1);
|
|
}
|
|
} else {
|
|
llHTTPResponse(kID, 200, "");
|
|
llReleaseURL(g_sCallbackURL);
|
|
}
|
|
}
|
|
|
|
http_response(key kID, integer iStatus, list lMeta, string sBody) {
|
|
list lParams = llParseString2List(sBody, [";", ";;"], []);
|
|
string sScript = llList2String(lParams,0);
|
|
|
|
//llSay(0, sBody);
|
|
|
|
if(sScript == "GetServerID") {
|
|
string sJson = llList2String(lParams,1);
|
|
g_sServerID = llJsonGetValue(sJson, ["id"]);
|
|
g_kCallbackURLRequest = llRequestURL();
|
|
} else if(sScript == "Get_Server_URL") {
|
|
altRequestDelivery(llList2String(lParams, 2), g_kAv, "Water Bucket [AC]");
|
|
} else if(sScript == "Modify_ProductV2") {
|
|
// Gives the version information
|
|
string sJson = llList2String(lParams,1);
|
|
if(llJsonGetValue(sJson, ["status"]) == "ok") {
|
|
// We now have the effective version, check it
|
|
if(llJsonGetValue(sJson, ["version"]) != VERSION) {
|
|
// Do what needs doing
|
|
llSetLinkTexture(g_iRoofPrim, TEXTURE_TRANSPARENT, ALL_SIDES);
|
|
llSetLinkTexture(g_iWaterPrim, TEXTURE_TRANSPARENT, ALL_SIDES);
|
|
|
|
g_iDestroyed=1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |