FarmSystem/LSL/raw/water_well.lsl

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;
}
}
}
}
}