diff --git a/LSL/raw/tree.lsl b/LSL/raw/tree.lsl index 4a716ba..c5a9a39 100644 --- a/LSL/raw/tree.lsl +++ b/LSL/raw/tree.lsl @@ -1,13 +1,158 @@ #include "Common.lsl" -integer g_iStartedGrowing; -integer g_iWater; +integer g_iTreeStage; +integer g_iTreeGrowth; +integer g_iTotalWater; + +float g_fMaxTreeSize = 10.0; // Maximum tree size +float g_fMaxGrowth = 150.0; // Maximum growth value +integer g_iLastGrowthStep = 0; + +integer g_iLastUsedWater; + + +integer g_iTree; +integer g_iTreeStump; +integer g_iSapling; + +vector g_vInitialSapling = <0.59996, 0.56265, 1.01659>; +vector g_vInitialTree = <0.77864, 0.90290, 1.38959>; +vector g_vInitialStump = <0.14584, 0.14018, 0.05000>; + + +SCAN() { + integer i=0; + integer end = llGetNumberOfPrims(); + + for(i=LINK_ROOT;i<=end;i++) { + string sName = llGetLinkName(i); + if(sName == "stump") g_iTreeStump = i; + if(sName == "tree") g_iTree = i; + if(sName == "sapling") g_iSapling = i; + } + + if(!g_iTree && !g_iTreeStump && !g_iSapling) { + llSay(0, "Something has gone wrong with the linkset setup"); + + if(!g_iTree) llSay(0, "> Tree Prim"); + if(!g_iTreeStump) llSay(0, "> Stump Prim"); + if(!g_iSapling) llSay(0, "> Sapling Prim"); + + llSay(0, "Disabling script to prevent damage to linkset"); + llSetScriptState(llGetScriptName(), FALSE); + } +} + +InitialAppearance() { + llSetLinkPrimitiveParams(g_iTreeStump, [PRIM_POS_LOCAL, ZERO_VECTOR, PRIM_SIZE, g_vInitialStump]); + llSetLinkPrimitiveParams(g_iTree, [PRIM_POS_LOCAL, <0,-0.035,0.65>, PRIM_SIZE, g_vInitialTree]); + llSetLinkPrimitiveParams(g_iSapling, [PRIM_POS_LOCAL, <0,0.025,0.45>, PRIM_SIZE, g_vInitialSapling]); + llSetLinkPrimitiveParams(LINK_ROOT, [PRIM_SIZE, <0.05,0.05,0.05>]); + + llSetLinkAlpha(g_iTreeStump, 0, ALL_SIDES); + llSetLinkAlpha(g_iTree, 0, ALL_SIDES); + llSetLinkAlpha(g_iSapling, 1, ALL_SIDES); + + llScaleByFactor(0.2); +} + +setText() { + + if(g_iTreeStage == 1 && g_iTreeGrowth == 100) { + llSetText("", ZERO_VECTOR, 1); + }else + llSetText("Water: " + (string)g_iTotalWater+"%\nStage: " + (string)g_iTreeStage + "/1" + "\nProgress: " + (string)g_iTreeGrowth+"%\n \n \n \n \n \n \n \n", <1,1,1>,1); +} default { state_entry() { - g_iStartedGrowing = (integer)llLinksetDataRead("progress"); - g_iWater = (integer)llLinksetDataRead("water"); + llLinksetDataReset(); + XteaKey(PSK); + global_ingredients = getIngredientChannel(NULL_KEY); + llSay(0, "Scanning linkset..."); + SCAN(); + llSay(0, "Checking permissions..."); + PROTECT(); + llSay(0, "Done checking permissions"); + + llSay(0, "Setting scale, and hiding parts.."); + InitialAppearance(); + + llSay(0, "Setting value: I need water"); + g_iTotalWater = 0; + llSay(0, "Tree is now thirsty"); + llSay(0, "Setting growth stage to 0, at 0%"); + g_iTreeGrowth = 0; + g_iTreeStage = 0; + llSay(0, "> Timers are not running, they will be started on next rez"); + llSay(0, "I am now ready to be packaged"); + llListen(global_ingredients, "", "", ""); + + llSay(0, "DEBUG MODE DETECTED.\n\n[ STARTING TIMERS ]"); + llSetTimerEvent(1); + + setText(); + } + + timer() { + if(llGetUnixTime() > g_iLastUsedWater+5) + llWhisper(global_ingredients, xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "query"]))); + + if(llGetUnixTime() > g_iLastGrowthStep + 120) { + + if(g_iTotalWater == 0) return; + + g_iLastGrowthStep = llGetUnixTime(); + integer iRoll = llRound(llFrand(100)); + if((iRoll % 2) == 0) { + // Bump growth + g_iTreeGrowth++; + if(g_iTreeStage) + llSetLinkPrimitiveParams(g_iSapling, [PRIM_SIZE,ZERO_VECTOR]); + + llScaleByFactor(1.0225); + + setText(); + + iRoll = llRound(llFrand(100)); + if((iRoll%2)==0) { + g_iTotalWater--; + + if(g_iTotalWater <= 0) g_iTotalWater = 0; + setText(); + } + + if(g_iTreeGrowth == 100) { + g_iTreeStage++; + g_iTreeGrowth = 0; + llSetLinkAlpha(g_iSapling,0, ALL_SIDES); + llSetLinkAlpha(g_iTree,1,ALL_SIDES); + + llSetLinkPrimitiveParams(g_iSapling, [PRIM_SIZE,ZERO_VECTOR]); + } + + if(g_iTreeStage == 1 && g_iTreeGrowth == 100) { + llSetTimerEvent(0); + } + } + } + } + + listen(integer c,string n,key i,string m) { + string sJson = xtea_decrypt_string(m); + if(llJsonGetValue(sJson, ["cmd"]) == "reply") { + if(llJsonGetValue(sJson, ["ingredient"]) == "Water") { + if(g_iTotalWater <= 75 && llGetUnixTime() > g_iLastUsedWater + 5) { + + g_iTotalWater += 25; + g_iLastUsedWater = llGetUnixTime(); + llRegionSayTo(i, getIngredientChannel(i), xtea_encrypt_string(llList2Json(JSON_OBJECT, ["cmd", "use", "id", llJsonGetValue(sJson, ["id"])]))); + + setText(); + } + } + } } } \ No newline at end of file