Update board to current code
This commit is contained in:
parent
a1a93ea994
commit
ed7b3b5d15
15 changed files with 924 additions and 898 deletions
|
@ -18,7 +18,7 @@ MainMenu(key kAv)
|
|||
if(g_kLeasedTo == NULL){
|
||||
lAppend += ["Lease"];
|
||||
}else if(g_kLeasedTo == kAv || iAdmin || g_kOwner == kAv){
|
||||
lAppend += ["End Lease", "Renew", "Set Picture", "Set Owner", "TransferLease", "Set Name", Checkbox(g_iWhiteFrame, "White Frame"), Checkbox(g_iLogo, "Logo"), Checkbox(g_iCustomTextColor, "CustomTxt"), "SetTxtC", "*RESET*"];
|
||||
lAppend += ["End Lease", sSetor((g_iFlags&4)," ", "Renew"), "Set Picture", "Set Owner", sSetor ((g_iFlags & 2),"TransferLease", " "), "Set Name", Checkbox(bool(g_iMask & MASK_WHITEFRAME), "White Frame"), Checkbox(bool(g_iMask & MASK_LOGO), "Logo"), Checkbox(bool(g_iMask & MASK_CUSTOM_TEXT_COLOR), "CustomTxt"), "SetTxtC", "*RESET*"];
|
||||
|
||||
sAppend += "\n* CustomTxt, and SetTxtC relate to custom text colors.";
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ MainMenu(key kAv)
|
|||
|
||||
Menu(g_kAuthorized, MAIN_MENU_TEXT+sAppend, MAIN_MENU_BUTTONS+lAppend, "menu~main");
|
||||
}
|
||||
|
||||
Menu(key kAv, string sText, list lButtons, string sIdent)
|
||||
{
|
||||
llMessageLinked(LINK_THIS, LINK_MENU_DISPLAY, llDumpList2String([sIdent, "TRUE", sText, llDumpList2String(lButtons, "~")], "|"), kAv);
|
||||
|
@ -50,8 +51,11 @@ string StripResident(string a)
|
|||
return llDumpList2String(lParam, " ");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Text(){
|
||||
string sColor = GetColorStr(g_iWhiteFrame);
|
||||
string sColor = GetColorStr(bool(g_iMask & MASK_WHITEFRAME));
|
||||
g_sName = StripResident(g_sName);
|
||||
if(g_sPreferredName == ""){
|
||||
if(g_sDisplayName != g_sName)
|
||||
|
@ -63,7 +67,7 @@ Text(){
|
|||
|
||||
CleanInventory()
|
||||
{
|
||||
list lDefaults = ["Board [ZNI]", "Dialog Module", "Text", "FFF Stall Board Flash Drive [ZNI]", "Update Module [ZNI]"];
|
||||
list lDefaults = ["Board [ZNI]", "Board Menu [ZNI]", "Dialog Module", "Text", "Stall Board Flash Drive [ZNI]", "Update Module [ZNI]", "Board Notifier [ZNI]"];
|
||||
integer i=0;
|
||||
integer end = llGetInventoryNumber(INVENTORY_ALL);
|
||||
for(i=0;i<end;i++){
|
||||
|
@ -93,4 +97,76 @@ string GetColorStr(integer iWhite)
|
|||
if(iWhite)return "0,0,0.5";
|
||||
else return "white"; // black frame
|
||||
}
|
||||
}
|
||||
|
||||
GetOnline()
|
||||
{
|
||||
UpdateDSRequest(NULL, llRequestAgentData(g_kLeasedTo, DATA_ONLINE), SetDSMeta(["online"]));
|
||||
}
|
||||
|
||||
GetName()
|
||||
{
|
||||
UpdateDSRequest(NULL, llRequestUsername(g_kLeasedTo), SetDSMeta(["name"]));
|
||||
}
|
||||
GetDisplayName()
|
||||
{
|
||||
UpdateDSRequest(NULL, llRequestDisplayName(g_kLeasedTo), SetDSMeta(["displayname"]));
|
||||
}
|
||||
|
||||
SetLease(key i)
|
||||
{
|
||||
|
||||
g_kLeasedTo = i;
|
||||
g_iExpireAt = llGetUnixTime() + THIRTY_DAYS;
|
||||
llSay(0, "Leased! You will need to set the texture after reboot finishes");
|
||||
SavePayload();
|
||||
llSleep(2);
|
||||
g_iState = mask(SET, g_iState, STATE_REBOOT_PENDING);
|
||||
}
|
||||
|
||||
SavePayload(){
|
||||
|
||||
llLinksetDataWrite("lease", (string)g_kLeasedTo);
|
||||
llLinksetDataWrite("texture", (string)g_kTexture);
|
||||
llLinksetDataWrite("expire", (string)g_iExpireAt);
|
||||
llLinksetDataWrite("owner", (string)g_kOwner);
|
||||
llLinksetDataWrite("notif", (string)g_iNotification);
|
||||
llLinksetDataWrite("name", g_sPreferredName);
|
||||
llLinksetDataWrite("transfer", (string)g_kTransferID);
|
||||
llLinksetDataWrite("transfer_expire", (string)g_iTransferTimeout);
|
||||
llLinksetDataWrite("customtxtcolor", (string)g_vCustomColorText);
|
||||
llLinksetDataWrite("mask", (string)g_iMask);
|
||||
|
||||
}
|
||||
|
||||
DeletePayload()
|
||||
{
|
||||
llLinksetDataReset();
|
||||
}
|
||||
|
||||
|
||||
RestoreFromKVP()
|
||||
{
|
||||
g_kLeasedTo = llLinksetDataRead("lease");
|
||||
if(g_kLeasedTo==""){
|
||||
g_kLeasedTo=NULL;
|
||||
return;
|
||||
}
|
||||
g_kTexture = llLinksetDataRead("texture");
|
||||
g_iExpireAt = (integer)llLinksetDataRead("expire");
|
||||
g_kOwner = llLinksetDataRead("owner");
|
||||
g_iMask = (integer)llLinksetDataRead("mask");
|
||||
g_iNotification = (integer)llLinksetDataRead("notif");
|
||||
g_sPreferredName = llLinksetDataRead("name");
|
||||
g_kTransferID = llLinksetDataRead("transfer");
|
||||
g_iTransferTimeout = (integer)llLinksetDataRead("transfer_expire");
|
||||
g_vCustomColorText = (vector)llLinksetDataRead("customtxtcolor");
|
||||
|
||||
|
||||
//state rebootfast;
|
||||
}
|
||||
|
||||
RESET()
|
||||
{
|
||||
llLinksetDataReset();
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
|
||||
integer g_iWaitFor = 0;
|
||||
key FFF_CIRCLE_LOGO = "f063237e-429b-5e02-dbfb-8a2a69535cdc";
|
||||
key CIRCLE_LOGO = "f063237e-429b-5e02-dbfb-8a2a69535cdc";
|
||||
key OFFLINE_TEXTURE = "62f26398-4d32-15fb-38d8-d59e31dd0a86";
|
||||
key ONLINE_TEXTURE = "69fdb503-d13b-8b21-98c9-70011db399d3";
|
||||
#if DEVELOPER == 0
|
||||
|
@ -41,7 +41,7 @@ integer g_iHaveKVP = 0;
|
|||
integer g_iLastKVPTry;
|
||||
|
||||
|
||||
string HEADER = "FFF Stall Board\n[By ZNI Creations]\nVersion 3.9.0430220029 (Apr 30, 2022)\n \n";
|
||||
string HEADER = "Stall Board\n[By ZNI Creations]\nVersion 4.0.1114220156 (Nov 14, 2022)\n \n";
|
||||
|
||||
|
||||
integer g_iAuthorized;
|
||||
|
@ -76,4 +76,24 @@ integer g_iNotifFlags; // (may be incompatible!)
|
|||
|
||||
|
||||
string g_sLeasedTo;
|
||||
key g_kTransferDest=NULL_KEY;
|
||||
key g_kTransferDest=NULL_KEY;
|
||||
|
||||
|
||||
integer SERVER_CHANNEL = 0x9F1C;
|
||||
|
||||
integer g_iState;
|
||||
|
||||
|
||||
integer g_iFlags;
|
||||
integer g_iPricePerDay;
|
||||
|
||||
integer g_iBoot;
|
||||
integer g_iMask = 1;
|
||||
|
||||
integer MASK_LOGO = 1;
|
||||
integer MASK_CUSTOM_TEXT_COLOR = 2;
|
||||
integer MASK_WHITEFRAME = 4;
|
||||
|
||||
integer STATE_REBOOT_PENDING =1;
|
||||
integer STATE_REBOOT_FAST =2;
|
||||
|
||||
|
|
|
@ -5,24 +5,64 @@ default
|
|||
{
|
||||
state_entry()
|
||||
{
|
||||
g_lCheckboxes = ["[ ]", "[X]"];
|
||||
if(llGetObjectDesc()==""||llGetObjectDesc()=="(No Description)"){
|
||||
llSay(0, "Please wait - Requesting assignment of a unique datastorage ID from ZNI Creations");
|
||||
THIRTY_DAYS=ONE_DAY*30;
|
||||
if(llGetObjectDesc() == "" || llGetObjectDesc() == "(No Description)")
|
||||
{
|
||||
llSetObjectDesc((string)llGenerateKey());
|
||||
|
||||
llSay(0, "ID assigned. Please note : If you are moving a board, without using a Memory Stick, simply set the object description to match that of the old board and reset my scripts.");
|
||||
RESET();
|
||||
llSay(0, "First boot completed");
|
||||
llResetScript();
|
||||
}
|
||||
CleanInventory();
|
||||
MAIN_MENU_TEXT = HEADER+"Please choose from the following options";
|
||||
IMPORT_MENU_TEXT = HEADER+"Enter the ID of the Flash Module which contains the data you wish to import from\n* Flash Module must be of protocol 0x2110b or newer";
|
||||
|
||||
|
||||
llMessageLinked(LINK_SET,0,"","fw_reset");
|
||||
|
||||
llListen (SERVER_CHANNEL, "", "", "");
|
||||
g_lAdminTag = [];
|
||||
g_lManagerTag = [];
|
||||
CIRCLE_LOGO = "";
|
||||
OFFLINE_TEXTURE = "";
|
||||
ONLINE_TEXTURE = "";
|
||||
AVAILABLE = "";
|
||||
NO_TEXTURE = "";
|
||||
}
|
||||
|
||||
listen(integer c,string n,key i,string m)
|
||||
{
|
||||
//llSay(0, m);
|
||||
if(llJsonGetValue(m,["op"]) == "set_admins")
|
||||
{
|
||||
g_lAdminTag = llJson2List(llJsonGetValue(m,["adm"]));
|
||||
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "get_managers"]));
|
||||
}else if(llJsonGetValue(m,["op"]) == "set_managers")
|
||||
{
|
||||
g_lManagerTag = llJson2List(llJsonGetValue(m,["mgr"]));
|
||||
llRegionSayTo(i,c, llList2Json(JSON_OBJECT, ["op", "get_flags"]));
|
||||
} else if(llJsonGetValue(m,["op"]) == "set_flags")
|
||||
{
|
||||
g_iFlags = (integer)llJsonGetValue(m,["flag"]);
|
||||
if(g_iFlags&4)llMessageLinked(LINK_SET,0x3E,llList2Json(JSON_OBJECT,["op","money_enabled"]), "");
|
||||
g_iPricePerDay = (integer)llJsonGetValue(m,["ppd"]);
|
||||
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "get_textures"]));
|
||||
}else if(llJsonGetValue(m,["op"]) == "set_textures")
|
||||
{
|
||||
string sTmp = llJsonGetValue(m,["txt"]);
|
||||
CIRCLE_LOGO = llJsonGetValue(sTmp, ["logo"]);
|
||||
OFFLINE_TEXTURE = llJsonGetValue(sTmp, ["offline"]);
|
||||
ONLINE_TEXTURE = llJsonGetValue(sTmp, ["online"]);
|
||||
AVAILABLE = llJsonGetValue(sTmp, ["available"]);
|
||||
NO_TEXTURE = llJsonGetValue(sTmp, ["none"]);
|
||||
|
||||
llMessageLinked(LINK_SET,0,"<!c=0,0.5,0>[SYNCDONE] Admins", "fw_data");
|
||||
llSleep(1);
|
||||
llSetTimerEvent(1);
|
||||
//llSay(0, "Administrative server synchronized");
|
||||
g_iBoot=1;
|
||||
}
|
||||
}
|
||||
link_message(integer s,integer n,string m,key i){
|
||||
if(i == "fw_ready")
|
||||
{
|
||||
llMessageLinked(LINK_SET, 0, "Please Wait", "fw_data");
|
||||
llRegionSay(SERVER_CHANNEL, llList2Json(JSON_OBJECT, ["op", "get_admins"]));
|
||||
llMessageLinked(LINK_SET, 0, "<!c=1,0,1>Sync Admin Server...", "fw_data");
|
||||
llSetLinkTexture(LINK_ROOT, TEXTURE_BLANK, 3);
|
||||
llSetLinkTexture(LINK_ROOT, TEXTURE_BLANK, 4);
|
||||
llSetLinkTexture(LINK_ROOT, TEXTURE_TRANSPARENT, 2);
|
||||
|
@ -32,19 +72,27 @@ default
|
|||
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 0);
|
||||
llMessageLinked(LINK_SET, 0, "c="+GetColorStr(FALSE)+"; f=03812794-535b-f546-6171-6bec5bf399be", "fw_conf");
|
||||
#if DEVELOPER == 1
|
||||
g_iWaitFor=llRound(llFrand(20));
|
||||
g_iWaitFor=llRound(llFrand(20))+4;
|
||||
#else
|
||||
g_iWaitFor = llRound(llFrand(120));
|
||||
g_iWaitFor = llRound(llFrand(120))+4;
|
||||
#endif
|
||||
llSetTimerEvent(1);
|
||||
//llSetTimerEvent(1);
|
||||
}
|
||||
}
|
||||
timer(){
|
||||
|
||||
timer()
|
||||
{
|
||||
if(g_iState & STATE_REBOOT_FAST)
|
||||
{
|
||||
g_iState=mask(UNSET, g_iState, STATE_REBOOT_FAST);
|
||||
|
||||
state boot;
|
||||
}
|
||||
g_iWaitFor--;
|
||||
|
||||
llMessageLinked(LINK_SET,0,"Startup in : "+(string)g_iWaitFor, "fw_data");
|
||||
llMessageLinked(LINK_SET,0,"<!c=1,0,1>Startup in : "+(string)g_iWaitFor, "fw_data");
|
||||
if(g_iWaitFor == -1){
|
||||
llMessageLinked(LINK_SET,0,"Starting up", "fw_data");
|
||||
llMessageLinked(LINK_SET,0,"<!c=0,0.5,0>Starting up", "fw_data");
|
||||
llSetTimerEvent(0);
|
||||
state boot;
|
||||
}
|
||||
|
@ -57,8 +105,8 @@ default
|
|||
on_rez(integer i){
|
||||
state reboot;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
state off{
|
||||
state_entry(){
|
||||
llMessageLinked(LINK_SET, 0, "<!c=red>Currently Offline", "fw_data");
|
||||
|
@ -78,18 +126,23 @@ state reboot
|
|||
state default;
|
||||
}
|
||||
}
|
||||
state boot
|
||||
{
|
||||
state_entry(){
|
||||
if(g_iLogo){
|
||||
state boot{
|
||||
state_entry()
|
||||
{
|
||||
if(g_iHaveKVP)RestoreFromKVP(); // solve some issues related to the bitmasks
|
||||
if(!g_iBoot)
|
||||
{
|
||||
llSay(0, "FATAL ERROR: Initial synchronization did not occur");
|
||||
llResetScript();
|
||||
}
|
||||
if(g_iMask & MASK_LOGO){
|
||||
|
||||
llSetLinkTexture(LINK_ROOT,FFF_CIRCLE_LOGO,2);
|
||||
llSetLinkTexture(LINK_ROOT,CIRCLE_LOGO,2);
|
||||
llSetLinkColor(LINK_ROOT, <1,1,1>,2);
|
||||
}else {
|
||||
llSetLinkTexture(LINK_ROOT,TEXTURE_TRANSPARENT,2);
|
||||
}
|
||||
|
||||
initBasicSupport();
|
||||
//llSetLinkTexture(LINK_ROOT, OFFLINE_TEXTURE, 3);
|
||||
//llSetLinkColor(LINK_ROOT, <1,1,1>, 3);
|
||||
llSetLinkPrimitiveParams(LINK_SET, [PRIM_FULLBRIGHT, ALL_SIDES, TRUE]); // Set the entire linkset to fullbright.. this will help with night time lighting problems.
|
||||
|
@ -100,23 +153,21 @@ state boot
|
|||
|
||||
llListen(0x9f, "", "", "");
|
||||
llListen(70, "", "", ""); // old group server channels
|
||||
llListen(0x99f9, "", "", "");
|
||||
//llListen(0x99f9, "", "", "");
|
||||
llListen(5, "", "", ""); //chat commands
|
||||
|
||||
g_sDate = llGetDate();
|
||||
g_iLastKVPTry = llGetUnixTime();
|
||||
|
||||
|
||||
if(g_kLeasedTo!=NULL){
|
||||
if(g_kTexture!=NULL && g_kTexture != "")
|
||||
llSetLinkTexture(LINK_ROOT, g_kTexture, 4);
|
||||
else llSetLinkTexture(LINK_ROOT,NO_TEXTURE,4);
|
||||
|
||||
GetName();
|
||||
|
||||
llSetTimerEvent(600);
|
||||
GetOnline();
|
||||
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get", "name", "var", g_kLeasedTo]));
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get", "displayname", "var", g_kLeasedTo]));
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get", "online", "var", g_kLeasedTo]));
|
||||
llAllowInventoryDrop(FALSE);
|
||||
}else {
|
||||
llAllowInventoryDrop(TRUE);
|
||||
|
@ -125,148 +176,68 @@ state boot
|
|||
#else
|
||||
llMessageLinked(LINK_SET,0,(string)llGetFreeMemory()+" bytes free", "fw_data");
|
||||
#endif
|
||||
|
||||
RestoreFromKVP();
|
||||
}
|
||||
|
||||
if(g_iWhiteFrame){
|
||||
if(g_iMask & MASK_WHITEFRAME){
|
||||
llMessageLinked(LINK_SET, 0, "c="+GetColorStr(TRUE)+"; f=03812794-535b-f546-6171-6bec5bf399be", "fw_conf");
|
||||
llSetLinkColor(LINK_ROOT, <1,1,1>, 0);
|
||||
}
|
||||
|
||||
checkSupport();
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.dev/zni/Get_Support.php", [], ""), "get_sup");
|
||||
|
||||
if(g_kLeasedTo==NULL){
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request","get","kvp_get", "var", "$.FFF."+llGetObjectDesc()]));
|
||||
if(g_kLeasedTo==NULL && !g_iHaveKVP){
|
||||
//llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request","get","kvp_get", "var", "$.FFF."+llGetObjectDesc()]));
|
||||
g_iHaveKVP=0;
|
||||
g_iLastKVPTry=llGetUnixTime();
|
||||
RestoreFromKVP();
|
||||
}else g_iHaveKVP = 1;
|
||||
}
|
||||
|
||||
timer()
|
||||
{
|
||||
if(g_sPreferredName == ""){
|
||||
if(llGetDate() != g_sDate){
|
||||
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get","name", "var", g_kLeasedTo]));
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get","displayname", "var", g_kLeasedTo]));
|
||||
llSetTimerEvent(5);
|
||||
|
||||
g_sDate = llGetDate();
|
||||
SavePayload();
|
||||
}
|
||||
}
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get","online", "var", g_kLeasedTo]));
|
||||
|
||||
if(llGetUnixTime() > (g_iLastKVPTry+30) && !g_iHaveKVP){
|
||||
g_iLastKVPTry=llGetUnixTime();
|
||||
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op", "request", "get", "kvp_get", "var", "$.FFF."+llGetObjectDesc()]));
|
||||
}
|
||||
|
||||
|
||||
if(g_iExpireAt != -1){
|
||||
integer Diff = (g_iExpireAt - llGetUnixTime());
|
||||
if(Diff!=0){
|
||||
// OK
|
||||
integer Days = Diff/ONE_DAY;
|
||||
|
||||
// NOW - Check days remaining
|
||||
if(!(g_iNotification & 1)){
|
||||
if(Days <= 7){
|
||||
llInstantMessage(g_kLeasedTo, "/!\\ ATTENTION /!\\\n \n [ 7 days remain on your stall ]");
|
||||
g_iNotification+=1;
|
||||
SavePayload();
|
||||
}
|
||||
}
|
||||
if(!(g_iNotification & 2)){
|
||||
if(Days <= 6){
|
||||
llInstantMessage(g_kLeasedTo, "/!\\ ATTENTION /!\\\n \n [ 6 days remain on your stall ]");
|
||||
g_iNotification+=2;
|
||||
SavePayload();
|
||||
}
|
||||
}
|
||||
|
||||
if(!(g_iNotification & 4)){
|
||||
if(Days <= 3){
|
||||
llInstantMessage(g_kLeasedTo, "/!\\ ATTENTION /!\\\n \n [ 3 days remaining on your stall, please renew soon ]");
|
||||
g_iNotification += 4;
|
||||
SavePayload();
|
||||
}
|
||||
}
|
||||
|
||||
if(!(g_iNotification & 8)){
|
||||
if(Days <= 2){
|
||||
llInstantMessage(g_kLeasedTo, "/!\\ ATTENTION /!\\\n \n [ 2 days remaining on your stall, please renew soon ]");
|
||||
g_iNotification += 8;
|
||||
SavePayload();
|
||||
}
|
||||
}
|
||||
|
||||
if(!(g_iNotification & 16)){
|
||||
if(Days <= 1){
|
||||
llInstantMessage(g_kLeasedTo, "/!\\ ATTENTION /!\\\n \n [ Your lease will expire within 24 hours ]");
|
||||
g_iNotification += 16;
|
||||
SavePayload();
|
||||
}
|
||||
}
|
||||
|
||||
if(!(g_iNotification & 32))
|
||||
{
|
||||
if(Days <= 14)
|
||||
{
|
||||
llInstantMessage(g_kLeasedTo, "/!\\ ATTENTION /!\\\n \n [ Your lease will expire in less than 14 ]");
|
||||
g_iNotification += 32;
|
||||
SavePayload();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(llGetUnixTime()>=g_iExpireAt){
|
||||
llMessageLinked(LINK_SET, 0, "<!c=red>Lease Expired","fw_data");
|
||||
llInstantMessage(g_kLeasedTo, "Your lease has expired!");
|
||||
DeletePayload();
|
||||
llSleep(30);
|
||||
llResetScript();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(g_iTransferTimeout && llGetUnixTime()>g_iTransferTimeout){
|
||||
g_iTransferTimeout = 0;
|
||||
llInstantMessage(g_kTransferID, "The transfer operation has expired.");
|
||||
llInstantMessage(g_kLeasedTo, "Transfer cancelled due to timeout");
|
||||
g_kTransferID = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
changed(integer t){
|
||||
if(t&CHANGED_REGION_START){
|
||||
state reboot;
|
||||
}
|
||||
if(t&(CHANGED_INVENTORY|CHANGED_ALLOWED_DROP))
|
||||
if(g_iFlags & 4)
|
||||
{
|
||||
llSetPayPrice(g_iPricePerDay, [g_iPricePerDay * 2, g_iPricePerDay * 7, g_iPricePerDay * 14, g_iPricePerDay * 30]);
|
||||
} else llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);
|
||||
}
|
||||
|
||||
money( key id, integer amount )
|
||||
{
|
||||
integer days = amount/g_iPricePerDay;
|
||||
integer expect = g_iPricePerDay * days;
|
||||
integer diff = amount-expect;
|
||||
if(diff<0)diff *= -1;
|
||||
if(diff!= 0 || !(g_iFlags & 4))
|
||||
{
|
||||
if(!(g_iFlags&4))diff=amount;
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op","pay","L", diff]), id);
|
||||
if(!(g_iFlags&4))return; // terminate!
|
||||
}
|
||||
|
||||
if(days > 0)
|
||||
{
|
||||
g_iNotification=0; // Reset the notification mask
|
||||
// Add days to lease
|
||||
if(g_kLeasedTo == NULL)
|
||||
{
|
||||
// We are assigning a lease
|
||||
if(llGetInventoryNumber(INVENTORY_TEXTURE)>0){
|
||||
g_iExpireAt = llGetUnixTime()+THIRTY_DAYS;
|
||||
g_kTexture=llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE,0));
|
||||
llMessageLinked(LINK_SET,0,"Touch me now", "fw_data");
|
||||
llSay(0, "Touch this board now to finalize the lease");
|
||||
llSetLinkTexture(LINK_ROOT,TEXTURE_BLANK, 4);
|
||||
}
|
||||
} else {
|
||||
// Update picture
|
||||
if(llGetInventoryNumber(INVENTORY_TEXTURE)>0){
|
||||
g_kTexture=llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE,0));
|
||||
state rebootfast;
|
||||
}
|
||||
SetLease(id);
|
||||
g_iExpireAt = llGetUnixTime() + (days*ONE_DAY);
|
||||
}else {
|
||||
// add time
|
||||
g_iExpireAt += (days * ONE_DAY);
|
||||
}
|
||||
SavePayload();
|
||||
llRegionSayTo(id, 0, (string)days+" days added to the lease");
|
||||
g_iState = mask(SET,g_iState,STATE_REBOOT_PENDING);
|
||||
}
|
||||
}
|
||||
on_rez(integer i){
|
||||
state reboot;
|
||||
|
||||
state_exit()
|
||||
{
|
||||
g_iState = mask(UNSET, g_iState, STATE_REBOOT_PENDING);
|
||||
g_iState = mask(SET, g_iState, STATE_REBOOT_FAST);
|
||||
}
|
||||
|
||||
|
||||
listen(integer c,string n,key i,string m){
|
||||
if(c==0x9f)
|
||||
{
|
||||
|
@ -279,12 +250,12 @@ state boot
|
|||
g_kOwner = (key)llJsonGetValue(sPayload, ["owner"]);
|
||||
if(g_kOwner == "NONE")g_kOwner = NULL_KEY;
|
||||
g_kTransferID=NULL_KEY;
|
||||
g_iLogo=1;
|
||||
g_iMask = mask(SET, 0, MASK_LOGO);
|
||||
|
||||
SavePayload();
|
||||
|
||||
//llSay(0, "Data has been imported! Rebooting...");
|
||||
state reboot;
|
||||
llSay(0, "Data has been imported! Rebooting...");
|
||||
llResetScript();
|
||||
}
|
||||
} else if(c == 5){
|
||||
if(m == "shutdown"){
|
||||
|
@ -315,109 +286,48 @@ state boot
|
|||
g_iAuthorized = 1;
|
||||
g_kAuthorized = kAv;
|
||||
//llSay(0, "authorization discovered");
|
||||
MainMenu(g_kAuthorized);
|
||||
llMessageLinked(LINK_SET, 0x1D, llList2Json(JSON_ARRAY, g_lSupport),"");
|
||||
llSleep(1);
|
||||
llMessageLinked(LINK_SET, 0x2E1D, "", g_kAuthorized);
|
||||
//MainMenu(g_kAuthorized);
|
||||
}else {
|
||||
//llSay(0, "authorization rejected");
|
||||
}
|
||||
}
|
||||
} else if(c == 0x99f9){
|
||||
//llSay(0, m);
|
||||
if(llJsonGetValue(m,["op"])=="reply")
|
||||
}
|
||||
}
|
||||
changed(integer t){
|
||||
if(t&CHANGED_REGION_START){
|
||||
state reboot;
|
||||
}
|
||||
if(t&(CHANGED_INVENTORY|CHANGED_ALLOWED_DROP))
|
||||
{
|
||||
if(g_kLeasedTo == NULL)
|
||||
{
|
||||
if(g_kLeasedTo==NULL_KEY)return;
|
||||
if(llJsonGetValue(m,["var"])=="name"){
|
||||
g_sName = llJsonGetValue(m,["val"]);
|
||||
Text();
|
||||
} else if(llJsonGetValue(m,["var"])=="displayname"){
|
||||
g_sDisplayName = llJsonGetValue(m,["val"]);
|
||||
Text();
|
||||
} else if(llJsonGetValue(m,["var"]) == "online"){
|
||||
integer iOnline = (integer)llJsonGetValue(m,["val"]);
|
||||
llSetLinkColor(LINK_ROOT, <1,1,1>, 3);
|
||||
if(iOnline){
|
||||
llSetLinkTexture(LINK_ROOT, ONLINE_TEXTURE, 3);
|
||||
}else {
|
||||
llSetLinkTexture(LINK_ROOT, OFFLINE_TEXTURE, 3);
|
||||
if(g_iFlags & 1)
|
||||
{
|
||||
// We are assigning a lease
|
||||
if(llGetInventoryNumber(INVENTORY_TEXTURE)>0){
|
||||
g_iExpireAt = llGetUnixTime()+THIRTY_DAYS;
|
||||
g_kTexture=llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE,0));
|
||||
llMessageLinked(LINK_SET,0,"Touch me now", "fw_data");
|
||||
llSay(0, "Touch this board now to finalize the lease");
|
||||
llSetLinkTexture(LINK_ROOT,TEXTURE_BLANK, 4);
|
||||
}
|
||||
} else if(llJsonGetValue(m,["var"])=="owner"){
|
||||
g_kOwner = (key)llJsonGetValue(m,["val"]);
|
||||
SavePayload();
|
||||
} else if(llJsonGetValue(m,["var"])=="transfer"){
|
||||
g_kTransferID = (key)llJsonGetValue(m,["val"]);
|
||||
llSay(0, "Lease transfer has been initiated. secondlife:///app/agent/"+(string)g_kTransferID+"/about has 48 hours to touch this board to finalize the transfer process");
|
||||
llInstantMessage(g_kTransferID, "A lease is being transfered to you. To confirm, you must click this board within 48 hours. My position is : "+(string)llGetPos());
|
||||
g_iTransferTimeout = llGetUnixTime()+(2*ONE_DAY);
|
||||
}else CleanInventory();
|
||||
} else {
|
||||
// Update picture
|
||||
if(llGetInventoryNumber(INVENTORY_TEXTURE)>0){
|
||||
g_kTexture=llGetInventoryKey(llGetInventoryName(INVENTORY_TEXTURE,0));
|
||||
g_iState = mask(SET, g_iState, STATE_REBOOT_FAST);
|
||||
state reboot;
|
||||
}
|
||||
} else if(llJsonGetValue(m,["op"])=="kvp_no"){
|
||||
// Stay as we are!
|
||||
llMessageLinked(LINK_SET, 0, "No Restore Info", "fw_data");
|
||||
llSleep(6);
|
||||
g_iHaveKVP=1;
|
||||
|
||||
#if DEVELOPER == 0
|
||||
llMessageLinked(LINK_SET, 0, "<!c=green>Vacant - Available","fw_data");
|
||||
#else
|
||||
llMessageLinked(LINK_SET,0,(string)llGetFreeMemory()+" bytes free", "fw_data");
|
||||
#endif
|
||||
} else if(llJsonGetValue(m,["op"])=="kvp_reply"){
|
||||
|
||||
string sPayload = llJsonGetValue(m,["value"]);
|
||||
g_kLeasedTo = (key)llJsonGetValue(sPayload, ["lease"]);
|
||||
g_kTexture = (key)llJsonGetValue(sPayload, ["texture"]);
|
||||
g_iExpireAt = (integer)llJsonGetValue(sPayload, ["expire"]);
|
||||
g_kOwner = (key)llJsonGetValue(sPayload, ["owner"]);
|
||||
g_iNotification = (integer)llJsonGetValue(sPayload, ["notif"]);
|
||||
g_sPreferredName = llJsonGetValue(sPayload, ["name"]);
|
||||
g_iWhiteFrame = (integer)llJsonGetValue(sPayload, ["whiteframe"]);
|
||||
g_iLogo=(integer)llJsonGetValue(sPayload, ["logo"]);
|
||||
g_kTransferID=(key)llJsonGetValue(sPayload,["transfer"]);
|
||||
g_iTransferTimeout = (integer)llJsonGetValue(sPayload, ["transfer_timeout"]);
|
||||
g_vCustomColorText = (vector)llJsonGetValue(sPayload, ["customtxtcolor"]);
|
||||
g_iCustomTextColor = (integer)llJsonGetValue(sPayload, ["usecustomtxt"]);
|
||||
|
||||
integer iChange=0;
|
||||
|
||||
g_iHaveKVP=1;
|
||||
|
||||
if(g_kLeasedTo == NULL_KEY){
|
||||
DeletePayload();
|
||||
llSleep(10);
|
||||
llResetScript();
|
||||
return;
|
||||
}
|
||||
|
||||
if(g_kTexture == ""){
|
||||
g_kTexture = NULL_KEY;
|
||||
iChange++;
|
||||
}
|
||||
if(g_kTransferID == ""){
|
||||
g_kTransferID=NULL_KEY;
|
||||
g_iTransferTimeout=0;
|
||||
iChange++;
|
||||
}
|
||||
|
||||
if(llStringLength(g_kOwner) != 36){
|
||||
if(g_kOwner == ""){
|
||||
g_kOwner = NULL_KEY;
|
||||
iChange++;
|
||||
}else {
|
||||
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get","owner", "var", g_kOwner]));
|
||||
}
|
||||
}
|
||||
|
||||
if(iChange){
|
||||
SavePayload();
|
||||
}
|
||||
|
||||
llMessageLinked(LINK_SET, 0, "<!c=red>Restored Information", "fw_data");
|
||||
llSleep(10);
|
||||
|
||||
state rebootfast;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
on_rez(integer i){
|
||||
state reboot;
|
||||
}
|
||||
touch_start(integer i)
|
||||
{
|
||||
if(!g_iHaveKVP){
|
||||
|
@ -444,246 +354,106 @@ state boot
|
|||
g_sPreferredName="";
|
||||
SavePayload();
|
||||
llSleep(10);
|
||||
state rebootfast;
|
||||
|
||||
g_iState = mask(SET, g_iState, STATE_REBOOT_PENDING);
|
||||
|
||||
return;
|
||||
}
|
||||
llRegionSay(70, llDumpList2String(["checkgroup", "menu", llDetectedKey(0)], "%"));
|
||||
}
|
||||
|
||||
link_message(integer s,integer n,string m,key i)
|
||||
|
||||
timer()
|
||||
{
|
||||
if(n == LINK_MENU_TIMEOUT)
|
||||
{
|
||||
llInstantMessage(i, "Menu Timed out!");
|
||||
if(i==g_kInvLoad){
|
||||
llAllowInventoryDrop(FALSE);
|
||||
#if DEVELOPER == 1
|
||||
llSetText("BITMASK: "+(string)g_iMask+"\nMASK_LOGO "+(string)MASK_LOGO+"\nMASK_WHITEFRAME "+(string)MASK_WHITEFRAME+"\nMASK_CUSTOM_TEXT_COLOR "+(string)MASK_CUSTOM_TEXT_COLOR +"\n\n STATE "+(string)g_iState, <1,1,1>, 1);
|
||||
#else
|
||||
llSetText("",ZERO_VECTOR,0);
|
||||
#endif
|
||||
|
||||
if(g_iState & STATE_REBOOT_PENDING) state reboot;
|
||||
|
||||
if(g_kLeasedTo == NULL)return;
|
||||
|
||||
if(g_sPreferredName == ""){
|
||||
if(llGetDate() != g_sDate){
|
||||
|
||||
GetName();
|
||||
|
||||
g_sDate = llGetDate();
|
||||
SavePayload();
|
||||
}
|
||||
} else if(n == LINK_MENU_RETURN)
|
||||
}
|
||||
GetOnline();
|
||||
|
||||
if(!g_iHaveKVP){
|
||||
RestoreFromKVP();
|
||||
}
|
||||
|
||||
if(g_iExpireAt != -1)
|
||||
{
|
||||
list returnMenu = llParseString2List(m,["|"],[]);
|
||||
string sIdent = llList2String(returnMenu,0);
|
||||
string sButton = llList2String(returnMenu,1);
|
||||
switch(sIdent)
|
||||
integer Diff = (g_iExpireAt - llGetUnixTime());
|
||||
if(Diff!=0){
|
||||
// OK
|
||||
integer Days = Diff/ONE_DAY;
|
||||
|
||||
llMessageLinked(LINK_SET, 0x4C9F, llList2Json(JSON_OBJECT, ["days", Days, "mask", g_iNotification]), g_kLeasedTo);
|
||||
|
||||
llSetTimerEvent(120);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(g_iTransferTimeout && llGetUnixTime()>g_iTransferTimeout){
|
||||
g_iTransferTimeout = 0;
|
||||
llInstantMessage(g_kTransferID, "The transfer operation has expired.");
|
||||
llInstantMessage(g_kLeasedTo, "Transfer cancelled due to timeout");
|
||||
g_kTransferID = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
dataserver(key kID, string sData)
|
||||
{
|
||||
if(HasDSRequest(kID) != -1)
|
||||
{
|
||||
list lMeta = GetMetaList(kID);
|
||||
if(llList2String(lMeta,0) == "online")
|
||||
{
|
||||
case "menu~main":{
|
||||
switch(sButton){
|
||||
case "Import":{
|
||||
GetArbitraryData(i, IMPORT_MENU_TEXT, "main~import");
|
||||
break;
|
||||
}
|
||||
case "-exit-":{
|
||||
llInstantMessage(i, "Menu Closed!");
|
||||
llMessageLinked(LINK_THIS, LINK_MENU_REMOVE, "", i);
|
||||
break;
|
||||
}
|
||||
case "Export":{
|
||||
llWhisper(5, llList2Json(JSON_OBJECT,["cmd","set_memstick","leasee",g_kLeasedTo,"expire_time",g_iExpireAt,"texture",g_kTexture,"owner",g_kOwner]));
|
||||
break;
|
||||
}
|
||||
case "Lease":{
|
||||
// Set
|
||||
g_kLeasedTo = i;
|
||||
g_iExpireAt = llGetUnixTime() + THIRTY_DAYS;
|
||||
llSay(0, "Leased! You will need to set the texture after reboot finishes");
|
||||
SavePayload();
|
||||
llSleep(2);
|
||||
state rebootfast;
|
||||
break;
|
||||
}
|
||||
case "End Lease":{
|
||||
DeletePayload();
|
||||
llInstantMessage(g_kLeasedTo, "Your lease has been terminated by secondlife:///app/agent/"+(string)i+"/about");
|
||||
llSleep(10);
|
||||
llResetScript();
|
||||
break;
|
||||
}
|
||||
case "Renew":{
|
||||
if(g_iExpireAt == -1)
|
||||
{
|
||||
llInstantMessage(g_kLeasedTo, "Your lease timer has been restarted and is no longer indefinite");
|
||||
}
|
||||
g_iExpireAt = llGetUnixTime() + THIRTY_DAYS;
|
||||
g_iNotification=0;
|
||||
SavePayload();
|
||||
llInstantMessage(i, "Renew complete!");
|
||||
break;
|
||||
}
|
||||
case "Set Picture":{
|
||||
GetArbitraryData(i, HEADER+"Please input the texture UUID, or you can drag and drop a full permission texture into my inventory by holding CTRL", "menu~settxt");
|
||||
llAllowInventoryDrop(TRUE);
|
||||
g_kInvLoad=i;
|
||||
break;
|
||||
}
|
||||
case "WhoLeased":{
|
||||
if(g_kLeasedTo == NULL){
|
||||
llSay(0, "Vacant - This board is available to be leased");
|
||||
}else{
|
||||
llSay(0, "Leased by : secondlife:///app/agent/"+(string)g_kLeasedTo+"/about");
|
||||
if(g_kOwner != NULL)llSay(0, "The pony's owner is : secondlife:///app/agent/"+(string)g_kOwner+"/about");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "PermaLease":{
|
||||
g_iExpireAt = -1;
|
||||
SavePayload();
|
||||
llInstantMessage(g_kLeasedTo, "Your lease is now set to not expire");
|
||||
llInstantMessage(i, "Action Successful");
|
||||
break;
|
||||
}
|
||||
case "*RESET*":{
|
||||
llResetScript();
|
||||
break;
|
||||
}
|
||||
case "TimeRemain":{
|
||||
if(g_iExpireAt == -1){
|
||||
llSay(0, "No Expiration is set");
|
||||
}else {
|
||||
integer iDifference = g_iExpireAt - llGetUnixTime();
|
||||
integer Days = iDifference/ONE_DAY;
|
||||
iDifference -= (ONE_DAY*Days);
|
||||
integer Hours = iDifference/60/60;
|
||||
iDifference -= (Hours*60*60);
|
||||
integer Minutes = iDifference/60;
|
||||
iDifference -= (Minutes*60);
|
||||
|
||||
llSay(0, "Time Remaining: "+(string)Days+" days, "+(string)Hours+" hours, "+(string)Minutes+" minutes, "+(string)iDifference+" seconds");
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "Set Owner":{
|
||||
GetArbitraryData(i, HEADER+"What is the owner's secondlife name?", "main~owner");
|
||||
break;
|
||||
}
|
||||
case "MemStick":{
|
||||
llGiveInventory(i,"FFF Stall Board Flash Drive [ZNI]");
|
||||
break;
|
||||
}
|
||||
case "TransferLease":{
|
||||
GetArbitraryData(i, HEADER+"Enter the username of the person you want to transfer this lease to", "main~leasetrans");
|
||||
break;
|
||||
}
|
||||
case "Set Name":{
|
||||
GetArbitraryData(i, HEADER+"Enter the name you want displayed on the panel. This is useful when Unicode is showing as question marks. Please only input ASCII.\n \n* To clear the current preference, submit the leave the box empty and hit submit.", "main~name");
|
||||
break;
|
||||
}
|
||||
case Checkbox(g_iWhiteFrame, "White Frame"):{
|
||||
g_iWhiteFrame = 1- g_iWhiteFrame;
|
||||
SavePayload();
|
||||
llSleep(5);
|
||||
state rebootfast;
|
||||
break;
|
||||
}
|
||||
case "Reboot":{
|
||||
SavePayload();
|
||||
llMessageLinked(LINK_SET,0,"*REBOOTING*","fw_data");
|
||||
llSleep(10);
|
||||
state rebootfast;
|
||||
break;
|
||||
}
|
||||
case Checkbox(g_iLogo,"Logo"):{
|
||||
g_iLogo=1-g_iLogo;
|
||||
SavePayload();
|
||||
if(g_iLogo){
|
||||
llSetLinkTexture(LINK_ROOT,FFF_CIRCLE_LOGO,2);
|
||||
llSetLinkColor(LINK_ROOT,<1,1,1>,2);
|
||||
}else{
|
||||
llSetLinkTexture(LINK_ROOT,TEXTURE_TRANSPARENT,2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Checkbox(g_iCustomTextColor, "CustomTxt"):
|
||||
{
|
||||
g_iCustomTextColor=1-g_iCustomTextColor;
|
||||
SavePayload();
|
||||
Text();
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
case "SetTxtC":
|
||||
{
|
||||
Menu(i, "Pick a color, or enter a custom one", ["colormenu"], "CTxt");
|
||||
break;
|
||||
}
|
||||
default:{
|
||||
MainMenu(i);
|
||||
llSay(0, "Button : "+sButton+" not implemented");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "main~import":{
|
||||
llMessageLinked(LINK_SET, 0, "Importing Data", "fw_data");
|
||||
llRegionSayTo((key)sButton, 0x9f, llList2Json(JSON_OBJECT, ["cmd","retrieve"]));
|
||||
break;
|
||||
}
|
||||
case "main~name":{
|
||||
g_sPreferredName = sButton;
|
||||
SavePayload();
|
||||
Text();
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
case "CTxt":
|
||||
integer iOn = (integer)sData;
|
||||
llSetLinkColor(LINK_ROOT, <1,1,1>, 3);
|
||||
DeleteDSReq(kID);
|
||||
|
||||
if(iOn)
|
||||
{
|
||||
g_vCustomColorText = (vector)sButton;
|
||||
SavePayload();
|
||||
Text();
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
case "menu~settxt":{
|
||||
if(sButton == ""){
|
||||
g_kTexture = NULL_KEY;
|
||||
SavePayload();
|
||||
}else {
|
||||
g_kTexture = (key)sButton;
|
||||
SavePayload();
|
||||
|
||||
}
|
||||
state rebootfast;
|
||||
break;
|
||||
}
|
||||
case "main~owner":{
|
||||
if(sButton == ""){
|
||||
g_kOwner=NULL_KEY;
|
||||
SavePayload();
|
||||
MainMenu(i);
|
||||
return;
|
||||
}
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get","owner", "var", sButton]));
|
||||
|
||||
//UpdateDSRequest(NULL, llRequestUserKey(sButton), SetDSMeta(["set_owner"]));
|
||||
//g_kOwner = (key)sButton;
|
||||
//SavePayload();
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
case "main~leasetrans":{
|
||||
if(sButton == ""){
|
||||
// Cancel transfer
|
||||
if(g_kTransferID != NULL_KEY){
|
||||
g_sPreferredName="";
|
||||
SavePayload();
|
||||
Text();
|
||||
}
|
||||
g_kTransferID=NULL_KEY;
|
||||
g_iTransferTimeout=-1;
|
||||
|
||||
MainMenu(i);
|
||||
return;
|
||||
}
|
||||
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get", "transfer", "var", sButton]));
|
||||
g_sPreferredName="<!c=red>*RESERVED*";
|
||||
SavePayload();
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
llSetLinkTexture(LINK_ROOT, ONLINE_TEXTURE, 3);
|
||||
}else llSetLinkTexture(LINK_ROOT, OFFLINE_TEXTURE, 3);
|
||||
} else if(llList2String(lMeta,0) == "name")
|
||||
{
|
||||
g_sName = sData;
|
||||
DeleteDSReq(kID);
|
||||
|
||||
GetDisplayName();
|
||||
} else if(llList2String(lMeta,0) == "displayname")
|
||||
{
|
||||
g_sDisplayName = sData;
|
||||
DeleteDSReq(kID);
|
||||
|
||||
Text();
|
||||
} else if(llList2String(lMeta,0) == "set_owner")
|
||||
{
|
||||
g_kOwner = sData;
|
||||
DeleteDSReq(kID);
|
||||
SavePayload();
|
||||
|
||||
llMessageLinked(LINK_SET, 0x2E1D, "", llList2String(lMeta,1));
|
||||
} else if(llList2String(lMeta,0) == "lease_get")
|
||||
{
|
||||
SetLease(sData);
|
||||
SavePayload();
|
||||
state reboot;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
http_response(key k,integer s,list m,string b){
|
||||
if(HasDSRequest(k)!=-1){
|
||||
list lMeta = GetMetaList(k);
|
||||
|
@ -692,26 +462,69 @@ state boot
|
|||
list lPar = llParseStringKeepNulls(b,[";;"],[]);
|
||||
if(llList2String(lPar,0)=="GetSupport"){
|
||||
g_lSupport = llParseString2List(llList2String(lPar,1), ["~"],[]);
|
||||
llMessageLinked(LINK_SET, 0x1D, llList2Json(JSON_ARRAY, g_lSupport), "");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
state rebootfast
|
||||
{
|
||||
state_entry(){
|
||||
CleanInventory();
|
||||
|
||||
llMessageLinked(LINK_SET, 0, "Please Wait", "fw_data");
|
||||
llSetLinkTexture(LINK_ROOT, TEXTURE_BLANK, 3);
|
||||
llSetLinkTexture(LINK_ROOT, TEXTURE_BLANK, 4);
|
||||
llSetLinkTexture(LINK_ROOT, TEXTURE_TRANSPARENT, 2);
|
||||
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 3);
|
||||
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 4);
|
||||
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 2);
|
||||
llSetLinkColor(LINK_ROOT, ZERO_VECTOR, 0);
|
||||
llMessageLinked(LINK_SET, 0, "c="+GetColorStr(FALSE)+"; f=03812794-535b-f546-6171-6bec5bf399be", "fw_conf");
|
||||
link_message(integer s,integer n,string m,key i)
|
||||
{
|
||||
if(n == 0x4C9F1)
|
||||
{
|
||||
|
||||
integer iNotification = (integer)llJsonGetValue(m,["mask"]);
|
||||
if(iNotification != g_iNotification)
|
||||
llLinksetDataWrite("notif", (string)g_iNotification);
|
||||
|
||||
state boot;
|
||||
}
|
||||
g_iNotification = iNotification;
|
||||
llSetTimerEvent(5);
|
||||
} else if(n == 0x3E)
|
||||
{
|
||||
if(llJsonGetValue(m,["op"]) == "reset")
|
||||
{
|
||||
|
||||
DeletePayload();
|
||||
llSleep(2);
|
||||
llResetScript();
|
||||
} else if(llJsonGetValue(m,["op"]) == "renew")
|
||||
{
|
||||
|
||||
g_iExpireAt = llGetUnixTime() + THIRTY_DAYS;
|
||||
g_iNotification=0;
|
||||
SavePayload();
|
||||
|
||||
} else if(llJsonGetValue(m,["op"]) == "pic")
|
||||
{
|
||||
|
||||
llAllowInventoryDrop(TRUE);
|
||||
g_kInvLoad=i;
|
||||
} else if(llJsonGetValue(m,["op"])=="nopic")
|
||||
{
|
||||
|
||||
llAllowInventoryDrop(FALSE);
|
||||
g_kInvLoad = NULL;
|
||||
} else if(llJsonGetValue(m,["op"]) == "perma")
|
||||
{
|
||||
g_iExpireAt = -1;
|
||||
SavePayload();
|
||||
llInstantMessage(g_kLeasedTo, "Your lease is now set to not expire");
|
||||
llInstantMessage(i, "Action Successful");
|
||||
|
||||
} else if(llJsonGetValue(m,["op"]) == "reboot")
|
||||
{
|
||||
g_iState = mask(SET, g_iState, STATE_REBOOT_PENDING);
|
||||
} else if(llJsonGetValue(m,["op"]) == "lease")
|
||||
{
|
||||
SetLease(i);
|
||||
}else if(llJsonGetValue(m,["op"]) == "actlease")
|
||||
{
|
||||
|
||||
UpdateDSRequest(NULL, llRequestUserKey(i), SetDSMeta(["lease_get", i]));
|
||||
} else if(llJsonGetValue(m,["op"]) == "setowner")
|
||||
{
|
||||
UpdateDSRequest(NULL, llRequestUserKey(i), SetDSMeta(["set_owner", llJsonGetValue(m,["id"])]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
#include "variables.lsl"
|
||||
#include "functions.lsl"
|
||||
|
||||
integer g_iTotalKeys;
|
||||
integer g_iProcessedKeys;
|
||||
|
||||
integer Percent(integer I, integer M)
|
||||
{
|
||||
return I*100/M;
|
||||
}
|
||||
|
||||
string Progress(integer iProg){
|
||||
// 64 chars max, must account for the brackets, percent sign, and the numbers.
|
||||
integer iMax = 32;
|
||||
iMax -= 2; // Brackets
|
||||
iMax -= 6; // Numbers, spaces, % sign
|
||||
|
||||
integer i=0;
|
||||
string sFinal = "[";
|
||||
|
||||
float fProg = (float)("0."+(string)iProg);
|
||||
if(iProg>=100)fProg=1.0;
|
||||
if(iProg<10)fProg=(float)("0.0"+(string)iProg);
|
||||
|
||||
integer pos = llFloor(iMax * fProg);
|
||||
for(i=0;i<=iMax;i++){
|
||||
if(i < pos) sFinal += "█";
|
||||
else if(i == pos)sFinal += ">";
|
||||
else sFinal += "░";
|
||||
}
|
||||
sFinal += "] "+(string)iProg+"%";
|
||||
return sFinal;
|
||||
}
|
||||
|
||||
SET_HOVER()
|
||||
{
|
||||
|
||||
llSetText("* BACKING UP *\n"+(string)g_iProcessedKeys+"/"+(string)g_iTotalKeys+"\n"+Progress(Percent(g_iProcessedKeys, g_iTotalKeys)), <1,0,0>,1);
|
||||
}
|
||||
|
||||
string g_sLastDate;
|
||||
default
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
llSetTimerEvent(60);
|
||||
}
|
||||
dataserver(key kID, string sData)
|
||||
{
|
||||
if(HasDSRequest(kID)!=-1)
|
||||
{
|
||||
list lMeta = GetMetaList(kID);
|
||||
if(llList2String(lMeta,0) == "count")
|
||||
{
|
||||
g_iTotalKeys = (integer)llGetSubString(sData,2,-1);
|
||||
g_iProcessedKeys = 0;
|
||||
SET_HOVER();
|
||||
|
||||
llSleep(0.25);
|
||||
UpdateDSRequest(kID, llKeysKeyValue(g_iProcessedKeys, 1), "get_key_name");
|
||||
}else if(llList2String(lMeta,0) == "get_key_name")
|
||||
{
|
||||
llSleep(0.25);
|
||||
UpdateDSRequest(kID, llReadKeyValue(llGetSubString(sData,2,-1)), SetDSMeta(["read_value", llGetSubString(sData,2,-1)]));
|
||||
} else if(llList2String(lMeta,0) == "read_value"){
|
||||
string sKey = llList2String(lMeta,1);
|
||||
string sValue = llStringToBase64(llGetSubString(sData,2,-1));
|
||||
DeleteDSReq(kID);
|
||||
|
||||
llSleep(0.5);
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.com/zni/SLKVPStore.php", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT,["op","set", "id", sKey, "val", sValue])), "sv");
|
||||
g_iProcessedKeys++;
|
||||
SET_HOVER();
|
||||
llSleep(0.5);
|
||||
if(g_iProcessedKeys <= g_iTotalKeys-1)
|
||||
UpdateDSRequest(NULL, llKeysKeyValue(g_iProcessedKeys,1), "get_key_name");
|
||||
else {
|
||||
llSleep(10);
|
||||
//DeleteDSReq(kID);
|
||||
llSetText("** Daily Backup **\nLast Completed: "+g_sLastDate, <0,1,0>, 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
timer()
|
||||
{
|
||||
if(llGetDate()!=g_sLastDate)
|
||||
{
|
||||
g_sLastDate = llGetDate();
|
||||
llRegionSay(5, "backup");
|
||||
llSleep(30);
|
||||
llRegionSay(5, "restore9f");
|
||||
|
||||
llSetText("Please Stand By\nPerforming daily KVP store backup",<1,0,0>,1);
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.com/zni/SLKVPStore.php", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT,["op","clear"])), "sv");
|
||||
|
||||
llSleep(10);
|
||||
UpdateDSRequest(NULL, llKeyCountKeyValue(), "count");
|
||||
}
|
||||
}
|
||||
http_response(key k,integer s,list m,string b)
|
||||
{
|
||||
if(HasDSRequest(k)!=-1){
|
||||
DeleteDSReq(k);
|
||||
list lTmp = llParseString2List(b,[";;",";"],[]);
|
||||
if(llList2String(lTmp,1) != "OK"){
|
||||
llSay(0, "ERROR ("+(string)s+"): "+b);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,112 +0,0 @@
|
|||
#include "variables.lsl"
|
||||
#include "functions.lsl"
|
||||
|
||||
|
||||
integer g_iTotalKeys;
|
||||
integer g_iProcessedKeys;
|
||||
|
||||
integer Percent(integer I, integer M)
|
||||
{
|
||||
return I*100/M;
|
||||
}
|
||||
|
||||
string Progress(integer iProg){
|
||||
// 64 chars max, must account for the brackets, percent sign, and the numbers.
|
||||
integer iMax = 32;
|
||||
iMax -= 2; // Brackets
|
||||
iMax -= 6; // Numbers, spaces, % sign
|
||||
|
||||
integer i=0;
|
||||
string sFinal = "[";
|
||||
|
||||
float fProg = (float)("0."+(string)iProg);
|
||||
if(iProg>=100)fProg=1.0;
|
||||
if(iProg<10)fProg=(float)("0.0"+(string)iProg);
|
||||
|
||||
integer pos = llFloor(iMax * fProg);
|
||||
for(i=0;i<=iMax;i++){
|
||||
if(i < pos) sFinal += "█";
|
||||
else if(i == pos)sFinal += ">";
|
||||
else sFinal += "░";
|
||||
}
|
||||
sFinal += "] "+(string)iProg+"%";
|
||||
return sFinal;
|
||||
}
|
||||
|
||||
SET_HOVER()
|
||||
{
|
||||
|
||||
llSetText("* BACKING UP TEST *\n"+(string)g_iProcessedKeys+"/"+(string)g_iTotalKeys+"\n"+Progress(Percent(g_iProcessedKeys, g_iTotalKeys)), <1,0,0>,1);
|
||||
}
|
||||
|
||||
string g_sLastDate;
|
||||
default
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
llSetTimerEvent(60);
|
||||
}
|
||||
dataserver(key kID, string sData)
|
||||
{
|
||||
if(HasDSRequest(kID)!=-1)
|
||||
{
|
||||
list lMeta = GetMetaList(kID);
|
||||
if(llList2String(lMeta,0) == "count")
|
||||
{
|
||||
g_iTotalKeys = (integer)llGetSubString(sData,2,-1);
|
||||
g_iProcessedKeys = 0;
|
||||
SET_HOVER();
|
||||
|
||||
llSleep(0.25);
|
||||
UpdateDSRequest(kID, llKeysKeyValue(g_iProcessedKeys, 1), "get_key_name");
|
||||
}else if(llList2String(lMeta,0) == "get_key_name")
|
||||
{
|
||||
llSleep(0.25);
|
||||
UpdateDSRequest(kID, llReadKeyValue(llGetSubString(sData,2,-1)), SetDSMeta(["read_value", llGetSubString(sData,2,-1)]));
|
||||
} else if(llList2String(lMeta,0) == "read_value"){
|
||||
string sKey = llList2String(lMeta,1);
|
||||
string sValue = llStringToBase64(llGetSubString(sData,2,-1));
|
||||
DeleteDSReq(kID);
|
||||
|
||||
llSleep(0.5);
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.com/zni/SLKVPStoreTesting.php", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT,["op","set", "id", sKey, "val", sValue])), "sv");
|
||||
g_iProcessedKeys++;
|
||||
SET_HOVER();
|
||||
llSleep(0.5);
|
||||
if(g_iProcessedKeys <= g_iTotalKeys-1)
|
||||
UpdateDSRequest(NULL, llKeysKeyValue(g_iProcessedKeys,1), "get_key_name");
|
||||
else {
|
||||
llSleep(10);
|
||||
//DeleteDSReq(kID);
|
||||
llSetText("** Daily Backup Testing **\nLast Completed: "+g_sLastDate, <0,1,0>, 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
timer()
|
||||
{
|
||||
if(llGetDate()!=g_sLastDate)
|
||||
{
|
||||
g_sLastDate = llGetDate();
|
||||
llRegionSay(5, "backup");
|
||||
llSleep(30);
|
||||
llRegionSay(5, "restore9f");
|
||||
|
||||
llSetText("Please Stand By\nPerforming daily KVP store backup",<1,0,0>,1);
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.com/zni/SLKVPStoreTesting.php", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT,["op","clear"])), "sv");
|
||||
|
||||
llSleep(10);
|
||||
UpdateDSRequest(NULL, llKeyCountKeyValue(), "count");
|
||||
}
|
||||
}
|
||||
http_response(key k,integer s,list m,string b)
|
||||
{
|
||||
if(HasDSRequest(k)!=-1){
|
||||
DeleteDSReq(k);
|
||||
list lTmp = llParseString2List(b,[";;",";"],[]);
|
||||
if(llList2String(lTmp,1) != "OK"){
|
||||
llSay(0, "ERROR ("+(string)s+"): "+b);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,163 +0,0 @@
|
|||
#include "variables.lsl"
|
||||
#include "functions.lsl"
|
||||
|
||||
string g_sDate;
|
||||
integer g_iTotal = 0;
|
||||
integer g_iTotalDB;
|
||||
integer g_iProcessed = 0;
|
||||
GetKVP(integer iOffset)
|
||||
{
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.com/zni/SLKVPStore.php", [HTTP_METHOD,"POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT,["op","get","offset",iOffset])), SetDSMeta(["get", iOffset]));
|
||||
}
|
||||
|
||||
integer Percent(integer I, integer M)
|
||||
{
|
||||
return I*100/M;
|
||||
}
|
||||
|
||||
string Progress(integer iProg){
|
||||
// 64 chars max, must account for the brackets, percent sign, and the numbers.
|
||||
integer iMax = 32;
|
||||
iMax -= 2; // Brackets
|
||||
iMax -= 6; // Numbers, spaces, % sign
|
||||
|
||||
integer i=0;
|
||||
string sFinal = "[";
|
||||
|
||||
float fProg = (float)("0."+(string)iProg);
|
||||
if(iProg>=100)fProg=1.0;
|
||||
if(iProg<10)fProg=(float)("0.0"+(string)iProg);
|
||||
|
||||
integer pos = llFloor(iMax * fProg);
|
||||
for(i=0;i<=iMax;i++){
|
||||
if(i < pos) sFinal += "█";
|
||||
else if(i == pos)sFinal += ">";
|
||||
else sFinal += "░";
|
||||
}
|
||||
sFinal += "] "+(string)iProg+"%";
|
||||
return sFinal;
|
||||
}
|
||||
text(){
|
||||
llSetText("Downloading KVP from ZNI\n \n"+Progress(Percent(g_iProcessed,g_iTotal)), <0,1,0>,1);
|
||||
}
|
||||
|
||||
bootstrap()
|
||||
{
|
||||
llSleep(2);
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.com/zni/SLKVPStore.php", [HTTP_METHOD,"POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT,["op", "get", "offset", g_iProcessed])), SetDSMeta(["download"]));
|
||||
}
|
||||
default
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
llSetText("ZNI KVP Restore Terminal", <0,1,1>,1);
|
||||
}
|
||||
|
||||
touch_start(integer total_number)
|
||||
{
|
||||
if(llGetOwner()!=llDetectedKey(0))return;
|
||||
llListen(929, "", llGetOwner(), "");
|
||||
llTextBox(llGetOwner(), "What date to restore?", 929);
|
||||
}
|
||||
listen(integer c,string n,key i,string m){
|
||||
g_sDate = m;
|
||||
llSay(0, "Preparing to restore date: "+g_sDate);
|
||||
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.com/zni/SLKVPStore.php", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/json"], llList2Json(JSON_OBJECT,["op", "restore", "date", g_sDate])), SetDSMeta(["restore"]));
|
||||
}
|
||||
http_response(key k, integer s,list m,string b){
|
||||
if(HasDSRequest(k)!=-1){
|
||||
//llSay(0, "["+(string)s+"]: "+b);
|
||||
list lMeta = GetMetaList(k);
|
||||
DeleteDSReq(k);
|
||||
string sOp = llList2String(lMeta,0);
|
||||
list lParam = llParseStringKeepNulls(b,[";;",";"],[]);
|
||||
//llSay(0, "HTTP Response: "+b);
|
||||
if(sOp == "restore"){
|
||||
if(llList2String(lParam,1) == "OK"){
|
||||
g_iTotalDB = (integer)llList2String(lParam,2);
|
||||
llSay(0, "Restore from file to database, successful, preparing to download.\n \n[ Total KVP in database: "+(string)g_iTotalDB+" ]");
|
||||
llSay(0, "Preparing to delete all data...");
|
||||
UpdateDSRequest(NULL, llKeyCountKeyValue(), SetDSMeta(["count"]));
|
||||
}else {
|
||||
llSay(0, "Fatal: Data could not be restored");
|
||||
}
|
||||
}else if(sOp == "download")
|
||||
{
|
||||
g_iProcessed++;
|
||||
text();
|
||||
string sJson = llList2String(lParam,2);
|
||||
//llSay(0, "SERVER: "+sJson);
|
||||
/*if(llJsonGetValue(sJson,["expire"])!="-1" && llJsonValueType(sJson,["expire"]) == JSON_NUMBER){
|
||||
|
||||
integer newExpireTime = llGetUnixTime();
|
||||
newExpireTime = (newExpireTime+((60*60*24)*30));
|
||||
sJson = llJsonSetValue(sJson, ["expire"], (string)newExpireTime);
|
||||
//llSay(0, "Record is a stallboard, resetting expiretimer");
|
||||
//llSay(0, "NEW: "+sJson);
|
||||
}*/
|
||||
//llSay(0, "Set Key ["+llList2String(lParam,1)+"] with value: "+sJson);
|
||||
llUpdateKeyValue(llList2String(lParam,1), sJson, FALSE, "");
|
||||
if(g_iProcessed>=g_iTotal){
|
||||
llSay(0, "Finished restoring all data from ZNI Central control. Cooling down before resetting scripts!");
|
||||
llSleep(120);
|
||||
llRegionSay(5, "restore9f");
|
||||
llSay(0, "Completed!\n \n[ Have a nice day ]");
|
||||
llResetScript();
|
||||
return;
|
||||
}
|
||||
bootstrap();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
dataserver(key kID, string sData)
|
||||
{
|
||||
if(HasDSRequest(kID)!=-1)
|
||||
{
|
||||
list lMeta = GetMetaList(kID);
|
||||
DeleteDSReq(kID);
|
||||
string sValue = llGetSubString(sData,2,-1);
|
||||
llSleep(1);
|
||||
if(llList2String(lMeta,0)=="count"){
|
||||
g_iTotal = (integer)sValue;
|
||||
if(g_iTotal == 0){
|
||||
g_iTotal = 1;
|
||||
g_iProcessed=1;
|
||||
llSetText("Erasing KVP Storage\n \n"+Progress(Percent(g_iProcessed,g_iTotal)), <1,0,0>,1);
|
||||
llRegionSay(5, "restore9f");
|
||||
llSay(0, "No Database keys\n \n[ Downloading backup from ZNI KVP Server ]");
|
||||
llSleep(30);
|
||||
g_iTotal = g_iTotalDB;
|
||||
g_iProcessed=0;
|
||||
|
||||
text();
|
||||
bootstrap();
|
||||
return;
|
||||
}
|
||||
g_iProcessed = 0;
|
||||
|
||||
llSetText("Erasing SL KVP Storage\n \n"+Progress(Percent(g_iProcessed,g_iTotal)), <1,0,0>,1);
|
||||
UpdateDSRequest(NULL, llKeysKeyValue(0, 1), SetDSMeta(["getkey", 0]));
|
||||
} else if(llList2String(lMeta,0) == "getkey"){
|
||||
integer iKVP = (integer)llList2String(lMeta,1);
|
||||
iKVP++;
|
||||
UpdateDSRequest(NULL, llDeleteKeyValue(sValue), SetDSMeta(["delkey", iKVP]));
|
||||
} else if(llList2String(lMeta,0) == "delkey"){
|
||||
integer iKVP = (integer)llList2String(lMeta,1);
|
||||
g_iProcessed=iKVP;
|
||||
llSleep(1);
|
||||
llDeleteKeyValue(sValue);
|
||||
if(g_iProcessed >= g_iTotal)
|
||||
{
|
||||
llSetText("Erasing SL KVP Storage\n \n"+Progress(Percent(g_iProcessed,g_iTotal)), <1,0,0>,1);
|
||||
llSay(0, "Finished SL erasing all data\n \n[ Rechecking KVP ]");
|
||||
|
||||
UpdateDSRequest(NULL, llKeyCountKeyValue(), SetDSMeta(["count"]));
|
||||
return;
|
||||
}
|
||||
llSetText("Erasing SL KVP Storage\n \n"+Progress(Percent(g_iProcessed,g_iTotal)), <1,0,0>,1);
|
||||
UpdateDSRequest(NULL, llKeysKeyValue(0, 1), SetDSMeta(["getkey", iKVP]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
299
LSL/raw/Menu.lsl
Executable file
299
LSL/raw/Menu.lsl
Executable file
|
@ -0,0 +1,299 @@
|
|||
#include "variables.lsl"
|
||||
#include "functions.lsl"
|
||||
|
||||
|
||||
default
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
g_lCheckboxes = ["[ ]", "[X]"];
|
||||
|
||||
MAIN_MENU_TEXT = HEADER+"Please choose from the following options";
|
||||
IMPORT_MENU_TEXT = HEADER+"Enter the ID of the Flash Module which contains the data you wish to import from\n* Flash Module must be of protocol 0x2110b or newer";
|
||||
}
|
||||
|
||||
|
||||
link_message(integer s,integer n,string m,key i)
|
||||
{
|
||||
//llSay(0, llDumpList2String([n,m,i], " ~ "));
|
||||
if(n == 0x2E1D)
|
||||
{
|
||||
g_iAuthorized=1;
|
||||
g_kAuthorized=i;
|
||||
|
||||
RestoreFromKVP();
|
||||
MainMenu(i);
|
||||
|
||||
} else if(n == 0x1D)
|
||||
{
|
||||
g_lSupport = llJson2List(m);
|
||||
}else if(n == LINK_MENU_TIMEOUT)
|
||||
{
|
||||
llInstantMessage(i, "Menu Timed out!");
|
||||
if(i==g_kInvLoad){
|
||||
g_kInvLoad=NULL;
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "nopic"]),"");
|
||||
}
|
||||
} else if(n == LINK_MENU_RETURN)
|
||||
{
|
||||
list returnMenu = llParseString2List(m,["|"],[]);
|
||||
string sIdent = llList2String(returnMenu,0);
|
||||
string sButton = llList2String(returnMenu,1);
|
||||
switch(sIdent)
|
||||
{
|
||||
case "menu~main":{
|
||||
switch(sButton){
|
||||
case "Import":{
|
||||
GetArbitraryData(i, IMPORT_MENU_TEXT, "main~import");
|
||||
break;
|
||||
}
|
||||
case "-exit-":{
|
||||
llInstantMessage(i, "Menu Closed!");
|
||||
llMessageLinked(LINK_THIS, LINK_MENU_REMOVE, "", i);
|
||||
break;
|
||||
}
|
||||
case "Export":{
|
||||
llWhisper(5, llList2Json(JSON_OBJECT,["cmd","set_memstick","leasee",g_kLeasedTo,"expire_time",g_iExpireAt,"texture",g_kTexture,"owner",g_kOwner]));
|
||||
break;
|
||||
}
|
||||
case "Lease":{
|
||||
// Set
|
||||
if(g_iFlags&1)
|
||||
{
|
||||
llMessageLinked(LINK_SET,0x3E, llList2Json(JSON_OBJECT, ["op", "lease"]), i);
|
||||
}else {
|
||||
GetArbitraryData(i, "Who should the board be leased to? \nAccepts: [SLURL, Username, UUID]", "main~adminlease");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "End Lease":{
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reset"]), "");
|
||||
|
||||
llInstantMessage(g_kLeasedTo, "Your lease has been terminated by secondlife:///app/agent/"+(string)i+"/about");
|
||||
llResetScript();
|
||||
break;
|
||||
}
|
||||
case "Renew":{
|
||||
if(g_iExpireAt == -1)
|
||||
{
|
||||
llInstantMessage(g_kLeasedTo, "Your lease timer has been restarted and is no longer indefinite");
|
||||
}
|
||||
llInstantMessage(i, "Renew complete!");
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "renew"]), "");
|
||||
break;
|
||||
}
|
||||
case "Set Picture":{
|
||||
GetArbitraryData(i, HEADER+"Please input the texture UUID, or you can drag and drop a full permission texture into my inventory by holding CTRL", "menu~settxt");
|
||||
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "pic"]), i);
|
||||
g_kInvLoad=i;
|
||||
|
||||
break;
|
||||
}
|
||||
case "WhoLeased":{
|
||||
if(g_kLeasedTo == NULL){
|
||||
llSay(0, "Vacant - This board is available to be leased");
|
||||
}else{
|
||||
llSay(0, "Leased by : secondlife:///app/agent/"+(string)g_kLeasedTo+"/about");
|
||||
if(g_kOwner != NULL)llSay(0, "The pony's owner is : secondlife:///app/agent/"+(string)g_kOwner+"/about");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "PermaLease":{
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "perma"]), "");
|
||||
break;
|
||||
}
|
||||
case "*RESET*":{
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reset"]), "");
|
||||
llResetScript();
|
||||
break;
|
||||
}
|
||||
case "TimeRemain":{
|
||||
if(g_iExpireAt == -1){
|
||||
llSay(0, "No Expiration is set");
|
||||
}else {
|
||||
integer iDifference = g_iExpireAt - llGetUnixTime();
|
||||
integer Days = iDifference/ONE_DAY;
|
||||
iDifference -= (ONE_DAY*Days);
|
||||
integer Hours = iDifference/60/60;
|
||||
iDifference -= (Hours*60*60);
|
||||
integer Minutes = iDifference/60;
|
||||
iDifference -= (Minutes*60);
|
||||
|
||||
llSay(0, "Time Remaining: "+(string)Days+" days, "+(string)Hours+" hours, "+(string)Minutes+" minutes, "+(string)iDifference+" seconds");
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "Set Owner":{
|
||||
GetArbitraryData(i, HEADER+"What is the owner's secondlife name?", "main~owner");
|
||||
break;
|
||||
}
|
||||
case "MemStick":{
|
||||
llGiveInventory(i,"Stall Board Flash Drive [ZNI]");
|
||||
break;
|
||||
}
|
||||
case "TransferLease":{
|
||||
GetArbitraryData(i, HEADER+"Enter the username of the person you want to transfer this lease to", "main~leasetrans");
|
||||
break;
|
||||
}
|
||||
case "Set Name":{
|
||||
GetArbitraryData(i, HEADER+"Enter the name you want displayed on the panel. This is useful when Unicode is showing as question marks. Please only input ASCII.\n \n* To clear the current preference, submit the leave the box empty and hit submit.", "main~name");
|
||||
break;
|
||||
}
|
||||
case Checkbox(bool(g_iMask & MASK_WHITEFRAME), "White Frame"):{
|
||||
g_iMask = mask(TOGGLE, g_iMask, MASK_WHITEFRAME);
|
||||
|
||||
llLinksetDataWrite("mask", (string)g_iMask);
|
||||
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
|
||||
break;
|
||||
}
|
||||
case "Reboot":{
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
break;
|
||||
}
|
||||
case Checkbox(bool(g_iMask & MASK_LOGO),"Logo"):{
|
||||
g_iMask = mask(TOGGLE, g_iMask, MASK_LOGO);
|
||||
|
||||
llLinksetDataWrite("mask", (string)g_iMask);
|
||||
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
|
||||
break;
|
||||
}
|
||||
case Checkbox(bool((g_iMask & MASK_CUSTOM_TEXT_COLOR)), "CustomTxt"):
|
||||
{
|
||||
g_iMask = mask(TOGGLE, g_iMask, MASK_CUSTOM_TEXT_COLOR);
|
||||
|
||||
llLinksetDataWrite("mask", (string)g_iMask);
|
||||
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
break;
|
||||
}
|
||||
case "SetTxtC":
|
||||
{
|
||||
Menu(i, "Pick a color, or enter a custom one", ["colormenu"], "CTxt");
|
||||
break;
|
||||
}
|
||||
default:{
|
||||
MainMenu(i);
|
||||
llSay(0, "Button : "+sButton+" not implemented");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "main~import":{
|
||||
llMessageLinked(LINK_SET, 0, "Importing Data", "fw_data");
|
||||
llRegionSayTo((key)sButton, 0x9f, llList2Json(JSON_OBJECT, ["cmd","retrieve"]));
|
||||
break;
|
||||
}
|
||||
case "main~name":{
|
||||
llLinksetDataWrite("name", sButton);
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
case "main~adminlease":
|
||||
{
|
||||
key kTemp = "";
|
||||
if(IsLikelyAvatarID(sButton))
|
||||
{
|
||||
// Avatar ID.
|
||||
kTemp = sButton;
|
||||
}else {
|
||||
// Determine if this is a SLURL
|
||||
|
||||
list lTemp = llParseString2List(sButton, ["/"],[]);
|
||||
if(llList2String(lTemp,0) == "secondlife:")
|
||||
{
|
||||
kTemp = llList2String(lTemp,3);
|
||||
}else {
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "actlease"]), sButton);
|
||||
}
|
||||
}
|
||||
|
||||
if(kTemp != "")
|
||||
{
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "lease"]), kTemp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "CTxt":
|
||||
{
|
||||
llLinksetDataWrite("customtxtcolor", sButton);
|
||||
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
case "menu~settxt":{
|
||||
if(sButton == ""){
|
||||
g_kTexture = NULL_KEY;
|
||||
}else {
|
||||
g_kTexture = (key)sButton;
|
||||
|
||||
}
|
||||
llLinksetDataWrite("texture", (string)g_kTexture);
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
|
||||
break;
|
||||
}
|
||||
case "main~owner":{
|
||||
if(sButton == ""){
|
||||
g_kOwner=NULL_KEY;
|
||||
llLinksetDataWrite("owner", (string)g_kOwner);
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
MainMenu(i);
|
||||
return;
|
||||
}
|
||||
|
||||
llMessageLinked(LINK_SET, 0x3E, llList2Json(JSON_OBJECT, ["op", "setowner", "id", i]), sButton);
|
||||
//UpdateDSRequest(NULL, llRequestUserKey(sButton), SetDSMeta(["set_owner"]));
|
||||
//g_kOwner = (key)sButton;
|
||||
//SavePayload();
|
||||
//MainMenu(i);
|
||||
break;
|
||||
}
|
||||
case "main~leasetrans":{
|
||||
if(sButton == ""){
|
||||
// Cancel transfer
|
||||
if(g_kTransferID != NULL_KEY){
|
||||
llLinksetDataWrite("name", "");
|
||||
}
|
||||
g_kTransferID=NULL_KEY;
|
||||
g_iTransferTimeout=-1;
|
||||
|
||||
llLinksetDataWrite("transfer", g_kTransferID);
|
||||
llLinksetDataWrite("transfer_expire", (string)g_iTransferTimeout);
|
||||
|
||||
llMessageLinked(LINK_SET,0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
|
||||
MainMenu(i);
|
||||
return;
|
||||
}
|
||||
//llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op","request", "get", "transfer", "var", sButton]));
|
||||
g_sPreferredName="<!c=red>*RESERVED*";
|
||||
g_iTransferTimeout = llGetUnixTime()+(2*ONE_DAY);
|
||||
|
||||
llLinksetDataWrite("name", g_sPreferredName);
|
||||
g_kTransferID=sButton;
|
||||
llLinksetDataWrite("transfer", sButton);
|
||||
llLinksetDataWrite("transfer_expire", (string)g_iTransferTimeout);
|
||||
llMessageLinked(LINK_SET,0x3E, llList2Json(JSON_OBJECT, ["op", "reboot"]), "");
|
||||
|
||||
|
||||
llSay(0, "Lease transfer has been initiated. secondlife:///app/agent/"+(string)g_kTransferID+"/about has 48 hours to touch this board to finalize the transfer process");
|
||||
llInstantMessage(g_kTransferID, "A lease is being transfered to you. To confirm, you must click this board within 48 hours. My position is : "+(string)llGetPos());
|
||||
|
||||
MainMenu(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
73
LSL/raw/Notifier.lsl
Executable file
73
LSL/raw/Notifier.lsl
Executable file
|
@ -0,0 +1,73 @@
|
|||
#include "variables.lsl"
|
||||
#include "functions.lsl"
|
||||
|
||||
|
||||
default
|
||||
{
|
||||
link_message(integer s,integer n,string m,key i){
|
||||
if(n == 0x4C9F)
|
||||
{
|
||||
integer iDays = (integer)llJsonGetValue(m,["days"]);
|
||||
integer iMask = (integer)llJsonGetValue(m,["mask"]);
|
||||
|
||||
// NOW - Check days remaining
|
||||
if(!(iMask & 32))
|
||||
{
|
||||
if(iDays <= 14)
|
||||
{
|
||||
llInstantMessage(i, "/!\\ ATTENTION /!\\\n \n [ 14 days remain on your stall ]");
|
||||
iMask += 32;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(iMask & 1)){
|
||||
if(iDays <= 7){
|
||||
llInstantMessage(i, "/!\\ ATTENTION /!\\\n \n [ 7 days remain on your stall ]");
|
||||
iMask+=1;
|
||||
}
|
||||
}
|
||||
if(!(iMask & 2)){
|
||||
if(iDays <= 6){
|
||||
llInstantMessage(i, "/!\\ ATTENTION /!\\\n \n [ 6 days remain on your stall ]");
|
||||
iMask+=2;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(iMask & 4)){
|
||||
if(iDays <= 3){
|
||||
llInstantMessage(i, "/!\\ ATTENTION /!\\\n \n [ 3 days remaining on your stall, please renew soon ]");
|
||||
iMask += 4;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(iMask & 8)){
|
||||
if(iDays <= 2){
|
||||
llInstantMessage(i, "/!\\ ATTENTION /!\\\n \n [ 2 days remaining on your stall, please renew soon ]");
|
||||
iMask += 8;
|
||||
}
|
||||
}
|
||||
|
||||
if(!(iMask & 16)){
|
||||
if(iDays <= 1){
|
||||
llInstantMessage(i, "/!\\ ATTENTION /!\\\n \n [ Your lease will expire within 24 hours ]");
|
||||
iMask += 16;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
llMessageLinked(LINK_SET, 0x4C9F1, llList2Json(JSON_OBJECT, ["mask", iMask]), i);
|
||||
} else if(n == 0x3E)
|
||||
{
|
||||
if(llJsonGetValue(m,["op"]) == "pay")
|
||||
{
|
||||
integer L = (integer)llJsonGetValue(m,["L"]);
|
||||
llGiveMoney(i, L);
|
||||
} else if(llJsonGetValue(m,["op"]) == "money_enabled")
|
||||
{
|
||||
// OK
|
||||
if(!(llGetPermissions()&PERMISSION_DEBIT))
|
||||
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
112
LSL/raw/Server.lsl
Executable file
112
LSL/raw/Server.lsl
Executable file
|
@ -0,0 +1,112 @@
|
|||
#include "Common.lsl"
|
||||
#include "ZNICommon.lsl"
|
||||
|
||||
integer SERVER_CHANNEL = 0x9F1C;
|
||||
|
||||
list g_lAdminTag;
|
||||
list g_lManagerTag;
|
||||
|
||||
string g_sTextureSet;
|
||||
integer g_iFlags;
|
||||
integer g_iPricePerDay;
|
||||
|
||||
default
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
llListen(SERVER_CHANNEL, "", "", "");
|
||||
|
||||
UpdateDSRequest(NULL, llGetNotecardLine("config", 0), SetDSMeta(["read",0]));
|
||||
}
|
||||
|
||||
listen(integer c,string n,key i,string m)
|
||||
{
|
||||
if(llJsonGetValue(m,["op"]) == "get_admins")
|
||||
{
|
||||
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "set_admins", "adm", llList2Json(JSON_ARRAY, g_lAdminTag)]));
|
||||
} else if(llJsonGetValue(m,["op"]) == "get_managers")
|
||||
{
|
||||
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "set_managers", "mgr", llList2Json(JSON_ARRAY, g_lManagerTag)]));
|
||||
} else if(llJsonGetValue(m,["op"]) == "get_flags")
|
||||
{
|
||||
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "set_flags", "flag", g_iFlags, "ppd", g_iPricePerDay]));
|
||||
} else if(llJsonGetValue(m,["op"]) == "get_textures")
|
||||
{
|
||||
llRegionSayTo(i,c,llList2Json(JSON_OBJECT, ["op", "set_textures", "txt", g_sTextureSet]));
|
||||
}
|
||||
}
|
||||
|
||||
changed(integer c){
|
||||
if(c & CHANGED_INVENTORY)
|
||||
{
|
||||
llResetScript();
|
||||
}
|
||||
}
|
||||
|
||||
dataserver( key queryid, string data )
|
||||
{
|
||||
if(HasDSRequest(queryid) != -1)
|
||||
{
|
||||
list lMeta = GetMetaList(queryid);
|
||||
|
||||
if(llList2String(lMeta,0) == "read")
|
||||
{
|
||||
if(data==EOF)
|
||||
{
|
||||
DeleteDSReq(queryid);
|
||||
llSay(0, "Server is now ready");
|
||||
}else{
|
||||
integer iLine = (integer)llList2String(lMeta,1);
|
||||
|
||||
if(data=="" || llGetSubString(data,0,0)=="#")jump next;
|
||||
|
||||
list lTmp = llParseStringKeepNulls(data,[" = "], []);
|
||||
if(llList2String(lTmp,0) == "Admin")
|
||||
{
|
||||
g_lAdminTag += [llList2String(lTmp,1)];
|
||||
}else if(llList2String(lTmp,0) == "Manager")
|
||||
{
|
||||
g_lManagerTag += [llList2String(lTmp,1)];
|
||||
} else if(llList2String(lTmp,0) == "TextureLogo")
|
||||
{
|
||||
g_sTextureSet = llJsonSetValue(g_sTextureSet, ["logo"], llList2String(lTmp,1));
|
||||
} else if(llList2String(lTmp,0) == "TextureOffline")
|
||||
{
|
||||
g_sTextureSet = llJsonSetValue(g_sTextureSet, ["offline"], llList2String(lTmp,1));
|
||||
} else if(llList2String(lTmp,0) == "TextureOnline")
|
||||
{
|
||||
g_sTextureSet = llJsonSetValue(g_sTextureSet, ["online"], llList2String(lTmp,1));
|
||||
} else if(llList2String(lTmp,0) == "TextureAvailable")
|
||||
{
|
||||
g_sTextureSet = llJsonSetValue(g_sTextureSet, ["available"], llList2String(lTmp,1));
|
||||
} else if(llList2String(lTmp,0) == "TextureAvailDeveloper")
|
||||
{
|
||||
g_sTextureSet = llJsonSetValue(g_sTextureSet, ["dev"], llList2String(lTmp,1));
|
||||
}else if(llList2String(lTmp,0) == "NoTexture")
|
||||
{
|
||||
g_sTextureSet = llJsonSetValue(g_sTextureSet, ["none"], llList2String(lTmp,1));
|
||||
} else if(llList2String(lTmp,0) == "SelfLease")
|
||||
{
|
||||
integer iEnabled = (integer)llList2String(lTmp,1);
|
||||
g_iFlags = mask(iEnabled, g_iFlags, 1);
|
||||
} else if(llList2String(lTmp,0) == "AllowTransferLeases")
|
||||
{
|
||||
integer iEnabled = (integer)llList2String(lTmp,1);
|
||||
g_iFlags = mask(iEnabled, g_iFlags, 2);
|
||||
}else if(llList2String(lTmp,0) == "LeaseRequiresPayment")
|
||||
{
|
||||
integer iEnabled = (integer)llList2String(lTmp,1);
|
||||
g_iFlags = mask(iEnabled, g_iFlags, 4);
|
||||
} else if(llList2String(lTmp,0) == "LeasePricePerDay")
|
||||
{
|
||||
g_iPricePerDay = (integer)llList2String(lTmp,1);
|
||||
}
|
||||
|
||||
@next;
|
||||
iLine++;
|
||||
UpdateDSRequest(queryid, llGetNotecardLine("config", iLine), SetDSMeta(["read", iLine]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
22
LSL/raw/server_config.conf
Executable file
22
LSL/raw/server_config.conf
Executable file
|
@ -0,0 +1,22 @@
|
|||
|
||||
Admin = BPF Stable Mistress
|
||||
Admin = BPF Stable Master
|
||||
Admin = BPF Manager
|
||||
|
||||
Manager = BPF Trainer
|
||||
Manager = BPF Senior Trainer
|
||||
|
||||
TextureLogo = 8dcd4a48-2d37-4909-9f78-f7a9eb4ef903
|
||||
TextureOffline = 62f26398-4d32-15fb-38d8-d59e31dd0a86
|
||||
TextureOnline = 69fdb503-d13b-8b21-98c9-70011db399d3
|
||||
TextureAvailable = c4ec7078-575f-a6d2-55b3-374d20434873
|
||||
TextureAvailDeveloper = c4ec7078-575f-a6d2-55b3-374d20434873
|
||||
NoTexture = a67ed6f6-dca8-4ce4-a338-13ac5f32e9d0
|
||||
|
||||
|
||||
# Admin or Manager must lease the object to the person
|
||||
SelfLease = 0
|
||||
AllowTransferLeases = 0
|
||||
|
||||
LeaseRequiresPayment = 0
|
||||
LeasePricePerDay = 1
|
|
@ -1,11 +0,0 @@
|
|||
#include "variables.lsl"
|
||||
#include "functions.lsl"
|
||||
|
||||
|
||||
default
|
||||
{
|
||||
state_entry()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
4
LSL/src/Board Menu [ZNI].lsl
Normal file
4
LSL/src/Board Menu [ZNI].lsl
Normal file
|
@ -0,0 +1,4 @@
|
|||
#include "../external/CommonLSL/variables.lsl"
|
||||
#include "../external/CommonLSL/functions.lsl"
|
||||
|
||||
#include "../raw/Menu.lsl"
|
4
LSL/src/Board Notifier [ZNI].lsl
Normal file
4
LSL/src/Board Notifier [ZNI].lsl
Normal file
|
@ -0,0 +1,4 @@
|
|||
#include "../external/CommonLSL/variables.lsl"
|
||||
#include "../external/CommonLSL/functions.lsl"
|
||||
|
||||
#include "../raw/Notifier.lsl"
|
|
@ -1,4 +1,4 @@
|
|||
#include "../external/CommonLSL/variables.lsl"
|
||||
#include "../external/CommonLSL/functions.lsl"
|
||||
|
||||
#include "../raw/Board.lsl"
|
||||
#include "../raw/Logic.lsl"
|
Binary file not shown.
Before Width: | Height: | Size: 1.3 MiB |
Loading…
Add table
Add a link
Reference in a new issue