Add final version of FFF Board scripts

This commit is contained in:
zontreck 2024-08-13 14:58:46 -07:00
commit b1fc57b931
13 changed files with 1539 additions and 0 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "LSL/external/Dialogs"]
path = LSL/external/Dialogs
url = ssh://git@git.zontreck.com:1212/AriasCreations/Dialogs

1
LSL/external/Dialogs vendored Submodule

@ -0,0 +1 @@
Subproject commit a83616b67e6a7c4eba7bfa8dd30536b2b1dcdb9c

874
LSL/raw/Board.lsl Executable file
View file

@ -0,0 +1,874 @@
#include "MasterFile.lsl"
#define DEVELOPER 0
integer g_iWaitFor = 0;
key FFF_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
key AVAILABLE = "8833aa83-b7f1-5c40-f4e8-fdf6d397ef1b";
#else
key AVAILABLE = "8833aa83-b7f1-5c40-f4e8-fdf6d397ef1b";
#endif
key NO_TEXTURE = "a67ed6f6-dca8-4ce4-a338-13ac5f32e9d0";
list g_lAdminTag = ["FFF Stable Mistress", "FFF Stable Master"];
list g_lManagerTag = ["FFF Trainer", "FFF Senior Trainer"];
integer LINK_MENU_DISPLAY = 300;
integer LINK_MENU_REMOVE = 310;
integer LINK_MENU_RETURN = 320;
integer LINK_MENU_TIMEOUT = 330;
string g_sDate;
list MAIN_MENU_BUTTONS = ["Reboot"];
string MAIN_MENU_TEXT = "";
string IMPORT_MENU_TEXT = "";
key g_kInvLoad;
key g_kTransferID=NULL_KEY;
integer g_iTransferTimeout;
integer g_iHaveKVP = 0;
integer g_iLastKVPTry;
#define THIRTY_DAYS (((60*60)*24)*30)
#define ONE_DAY ((60*60)*24)
string HEADER = "FFF Stall Board\n[By ZNI Creations]\nVersion 3.9.0430220029 (Apr 30, 2022)\n \n";
integer g_iAuthorized;
key g_kAuthorized;
key g_kLeasedTo=NULL_KEY;
key g_kTexture=NULL_KEY;
integer g_iExpireAt;
key g_kOwner=NULL_KEY;
string g_sPreferredName;
integer g_iWhiteFrame = FALSE;
integer g_iNotification;
string g_sName;
string g_sDisplayName;
integer g_iOnline;
list g_lSupport = [];
MainMenu(key kAv)
{
list lAppend = [];
// Check against ZNI Support roster
integer iAdmin=0;
string sAppend;
string sTag = llList2String(llGetObjectDetails(kAv,[OBJECT_GROUP_TAG]),0);
if(llListFindList(g_lSupport, [(string)kAv])!=-1 || llListFindList(g_lAdminTag, [sTag])!=-1){
if(g_kLeasedTo!=NULL)lAppend += ["PermaLease"];
iAdmin=1;
lAppend += ["Import", "Export", "MemStick"];
}
if(llListFindList(g_lManagerTag, [sTag])!=-1)iAdmin=1;
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*"];
sAppend += "\n* CustomTxt, and SetTxtC relate to custom text colors.";
}
if(g_kLeasedTo != NULL){
lAppend += ["TimeRemain", "WhoLeased"];
}
if(g_kOwner!=NULL)sAppend+="\nOwner is : secondlife:///app/agent/"+(string)g_kOwner+"/about";
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);
}
GetArbitraryData(key kAv, string sText, string sIdent){
llMessageLinked(LINK_THIS, LINK_MENU_DISPLAY, llDumpList2String([sIdent, "FALSE", sText, ""], "|"), kAv);
}
string StripResident(string a)
{
list lParam = llParseString2List(a,[" ", "."],[]);
if(llGetListLength(lParam)==0 || llGetListLength(lParam)==1)return a;
if(llToLower(llList2String(lParam,1)) == "resident"){
lParam = llDeleteSubList(lParam,1,1);
}else return a;
return llDumpList2String(lParam, " ");
}
Text(){
string sColor = GetColorStr(g_iWhiteFrame);
g_sName = StripResident(g_sName);
if(g_sPreferredName == ""){
if(g_sDisplayName != g_sName)
llMessageLinked(LINK_SET, 0,"<!c="+sColor+">"+ llGetSubString(g_sDisplayName+" ("+g_sName+")",0,23), "fw_data");
else
llMessageLinked(LINK_SET,0,"<!c="+sColor+">"+llGetSubString(g_sName,0,23),"fw_data");
} else llMessageLinked(LINK_SET,0,"<!c="+sColor+">"+g_sPreferredName, "fw_data");
}
CleanInventory()
{
list lDefaults = ["Board [ZNI]", "Dialog Module", "Text", "FFF Stall Board Flash Drive [ZNI]", "Update Module [ZNI]"];
integer i=0;
integer end = llGetInventoryNumber(INVENTORY_ALL);
for(i=0;i<end;i++){
string sName = llGetInventoryName(INVENTORY_ALL,i);
if(llListFindList( lDefaults, [sName] ) == -1) {
llRemoveInventory(sName);
i=-1;
end = llGetInventoryNumber(INVENTORY_ALL);
}
}
}
integer g_iLogo=1;
vector g_vCustomColorText;
integer g_iCustomTextColor=FALSE;
SavePayload(){
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op", "request", "get", "kvp_store", "var", "$.FFF."+llGetObjectDesc(), "val", llList2Json(JSON_OBJECT, ["lease", g_kLeasedTo, "texture", g_kTexture, "expire", g_iExpireAt, "owner", g_kOwner, "notif", g_iNotification, "name", g_sPreferredName, "whiteframe", g_iWhiteFrame, "logo", g_iLogo, "transfer", g_kTransferID, "transfer_expire", g_iTransferTimeout, "customtxtcolor", g_vCustomColorText, "usecustomtxt", g_iCustomTextColor])]));
}
DeletePayload(){
llRegionSay(0x99f9, llList2Json(JSON_OBJECT, ["op", "request", "get", "kvp_del", "var", "$.FFF."+llGetObjectDesc()]));
}
string GetColorStr(integer iWhite)
{
if(g_iCustomTextColor){
return (((string)g_vCustomColorText.x)+","+((string)g_vCustomColorText.y)+","+((string)g_vCustomColorText.z));
}else {
if(iWhite)return "0,0,0.5";
else return "white"; // black frame
}
}
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");
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.");
}
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");
}
link_message(integer s,integer n,string m,key i){
if(i == "fw_ready")
{
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");
#if DEVELOPER == 1
g_iWaitFor=llRound(llFrand(20));
#else
g_iWaitFor = llRound(llFrand(120));
#endif
llSetTimerEvent(1);
}
}
timer(){
g_iWaitFor--;
llMessageLinked(LINK_SET,0,"Startup in : "+(string)g_iWaitFor, "fw_data");
if(g_iWaitFor == -1){
llMessageLinked(LINK_SET,0,"Starting up", "fw_data");
llSetTimerEvent(0);
state boot;
}
}
changed(integer t){
if(t&CHANGED_REGION_START){
state reboot;
}
}
on_rez(integer i){
state reboot;
}
}
state off{
state_entry(){
llMessageLinked(LINK_SET, 0, "<!c=red>Currently Offline", "fw_data");
}
changed(integer t){
if(t&CHANGED_REGION_START){
state reboot;
}
}
on_rez(integer i){
state reboot;
}
}
state reboot
{
state_entry(){
state default;
}
}
state boot
{
state_entry(){
if(g_iLogo){
llSetLinkTexture(LINK_ROOT,FFF_CIRCLE_LOGO,2);
llSetLinkColor(LINK_ROOT, <1,1,1>,2);
}else {
llSetLinkTexture(LINK_ROOT,TEXTURE_TRANSPARENT,2);
}
//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.
llSetLinkPrimitiveParams(LINK_ROOT, [PRIM_FULLBRIGHT, 0, FALSE]); // Eyesore alert
llSetLinkTexture(LINK_ROOT, AVAILABLE, 4);
llSetLinkColor(LINK_ROOT, <1,1,1>,4);
llListen(0x9f, "", "", "");
llListen(70, "", "", ""); // old group server channels
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);
llSetTimerEvent(600);
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);
#if DEVELOPER == 0
llMessageLinked(LINK_SET, 0, "<!c=red>Loading... Patience","fw_data");
#else
llMessageLinked(LINK_SET,0,(string)llGetFreeMemory()+" bytes free", "fw_data");
#endif
}
if(g_iWhiteFrame){
llMessageLinked(LINK_SET, 0, "c="+GetColorStr(TRUE)+"; f=03812794-535b-f546-6171-6bec5bf399be", "fw_conf");
llSetLinkColor(LINK_ROOT, <1,1,1>, 0);
}
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()]));
g_iHaveKVP=0;
g_iLastKVPTry=llGetUnixTime();
}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]));
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_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;
}
}
}
}
on_rez(integer i){
state reboot;
}
listen(integer c,string n,key i,string m){
if(c==0x9f)
{
if(llJsonGetValue(m,["target"]) == (string)llGetKey())
{
string sPayload = llJsonGetValue(m,["payload"]);
g_kLeasedTo = (key)llJsonGetValue(sPayload, ["lease"]);
g_kTexture = (key)llJsonGetValue(sPayload, ["texture"]);
g_iExpireAt = (integer)llJsonGetValue(sPayload, ["expire"]);
g_kOwner = (key)llJsonGetValue(sPayload, ["owner"]);
if(g_kOwner == "NONE")g_kOwner = NULL_KEY;
g_kTransferID=NULL_KEY;
g_iLogo=1;
SavePayload();
//llSay(0, "Data has been imported! Rebooting...");
state reboot;
}
} else if(c == 5){
if(m == "shutdown"){
llSetTimerEvent(0);
} else if(m == "reboot"){
if(g_kLeasedTo!=NULL_KEY)
SavePayload();
llSleep(10);
state reboot;
} else if(m == "restore9f"){
llResetScript(); // immediately shut off and reset the script to initiate a full system restore.
} else if(m == "backup"){
llSleep(llFrand(20));
if(g_kLeasedTo != NULL_KEY)
SavePayload();
} else if(m == "replacedie"){
list lD = llGetObjectDetails(i, [OBJECT_DESC]);
if(llList2String(lD,0)==llGetObjectDesc())llDie();
}
}else if(c == 70)
{
// Parse!
list lP = llParseStringKeepNulls(m,["%"],[]);
key kBoard = (key)llList2String(lP,0);
if(kBoard == llGetKey()){
key kAv = (key)llList2String(lP,2);
if(llList2String(lP,3) == "yg1"){
g_iAuthorized = 1;
g_kAuthorized = kAv;
//llSay(0, "authorization discovered");
MainMenu(g_kAuthorized);
}else {
//llSay(0, "authorization rejected");
}
}
} else if(c == 0x99f9){
//llSay(0, m);
if(llJsonGetValue(m,["op"])=="reply")
{
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);
}
} 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 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;
}
}
}
touch_start(integer i)
{
if(!g_iHaveKVP){
llRegionSayTo(llDetectedKey(0), 0, "/!\\ WARNING: The board is not done loading yet, please be patient");
return;
}
if(g_kTexture!=NULL && g_kLeasedTo == NULL){
if(llSameGroup(llDetectedKey(0))){
g_kLeasedTo = llDetectedKey(0);
state reboot;
return;
}else{
llSay(0, "Group tag is required to lease");
llResetScript(); // refuse to lease
}
}
if(g_kTransferID!=NULL && g_kTransferID == llDetectedKey(0)){
g_kLeasedTo = llDetectedKey(0);
llWhisper(0, "Transfer Completed");
g_kTransferID=NULL;
g_iTransferTimeout = 0;
g_sPreferredName="";
SavePayload();
llSleep(10);
state rebootfast;
return;
}
llRegionSay(70, llDumpList2String(["checkgroup", "menu", llDetectedKey(0)], "%"));
}
link_message(integer s,integer n,string m,key i)
{
if(n == LINK_MENU_TIMEOUT)
{
llInstantMessage(i, "Menu Timed out!");
if(i==g_kInvLoad){
llAllowInventoryDrop(FALSE);
}
} 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
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":
{
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;
}
}
}
}
http_response(key k,integer s,list m,string b){
if(HasDSRequest(k)!=-1){
list lMeta = GetMetaList(k);
DeleteDSReq(k);
list lPar = llParseStringKeepNulls(b,[";;"],[]);
if(llList2String(lPar,0)=="GetSupport"){
g_lSupport = llParseString2List(llList2String(lPar,1), ["~"],[]);
}
}
}
}
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");
state boot;
}
}

109
LSL/raw/KVPDailyBkp.lsl Executable file
View file

@ -0,0 +1,109 @@
#include "MasterFile.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.dev/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.dev/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);
}
}
}
}

109
LSL/raw/KVPDailyBkpTesting.lsl Executable file
View file

@ -0,0 +1,109 @@
#include "MasterFile.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.dev/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.dev/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);
}
}
}
}

162
LSL/raw/KVPRestore.lsl Executable file
View file

@ -0,0 +1,162 @@
#include "MasterFile.lsl"
string g_sDate;
integer g_iTotal = 0;
integer g_iTotalDB;
integer g_iProcessed = 0;
GetKVP(integer iOffset)
{
UpdateDSRequest(NULL, llHTTPRequest("https://api.zontreck.dev/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.dev/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.dev/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]));
}
}
}
}

61
LSL/raw/Restorer.lsl Executable file
View file

@ -0,0 +1,61 @@
#include "MasterFile.lsl"
integer g_iAt;
integer g_iOffset;
integer g_iPass=-1;
integer g_iTotal;
#define IDENTITY "$.FFF."
default
{
link_message(integer s,integer n,string m,key i){
if(n == 918901)
{
g_iOffset = (integer)m;
llWhisper(0, "Please wait - Restoring ID from offset: "+m);
UpdateDSRequest(NULL, llKeyCountKeyValue(), SetDSMeta(["countkeys"]));
}
}
dataserver(key kID, string sData)
{
if(HasDSRequest(kID)!=-1){
list lMeta = GetMetaList(kID);
string sOperation = llList2String(lMeta,0);
list lCSV = llCSV2List(sData);
switch(sOperation)
{
case "countkeys":{
g_iAt=0;
g_iTotal = (integer)llList2String(lCSV,1);
UpdateDSRequest(kID, llKeysKeyValue(g_iAt,1), SetDSMeta(["key"]));
break;
}
case "key":{
g_iAt++;
if(llList2String(lCSV,0) == "0"){
DeleteDSReq(kID);
llSay(0, "FATAL: No ID at offset");
llMessageLinked(LINK_SET, 918902, "", "no_restore");
llSleep(2);
llResetScript();
return;
}
string sKeyName = llList2String(lCSV,1);
if(llGetSubString(sKeyName, 0, llStringLength(IDENTITY)) == IDENTITY){
g_iPass++;
}
if(g_iPass == g_iOffset){
llMessageLinked(LINK_SET, 918902, sKeyName, "zni_restore");
DeleteDSReq(kID);
}else {
UpdateDSRequest(kID, llKeysKeyValue(g_iAt, 1), SetDSMeta(["key"]));
}
break;
}
}
}
}
}

3
README.md Normal file
View file

@ -0,0 +1,3 @@
# Stall Boards
This project originated at the Frilly Filly Farms in Second Life. These boards were in use for several years until a dispute between myself and a Stable Mistress who shall not be named. The final FFF Version is stored in the first two commits, then later alterations to remove FFF specific features and add customization can be seen.

BIN
assets/mesh/stall_board.blend Executable file

Binary file not shown.

217
assets/mesh/stall_board.dae Executable file
View file

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<asset>
<contributor>
<author>Blender User</author>
<authoring_tool>Blender 2.92.0 commit date:2021-02-24, commit time:16:25, hash:02948a2cab44</authoring_tool>
</contributor>
<created>2021-11-25T01:14:16</created>
<modified>2021-11-25T01:14:16</modified>
<unit name="meter" meter="1"/>
<up_axis>Z_UP</up_axis>
</asset>
<library_effects>
<effect id="Material-effect">
<profile_COMMON>
<technique sid="common">
<lambert>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<diffuse>
<color sid="diffuse">0.8 0.8 0.8 1</color>
</diffuse>
<index_of_refraction>
<float sid="ior">1.45</float>
</index_of_refraction>
</lambert>
</technique>
</profile_COMMON>
</effect>
<effect id="Material_001-effect">
<profile_COMMON>
<technique sid="common">
<lambert>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<diffuse>
<color sid="diffuse">0.8 0.8 0.8 1</color>
</diffuse>
<index_of_refraction>
<float sid="ior">1.45</float>
</index_of_refraction>
</lambert>
</technique>
</profile_COMMON>
</effect>
<effect id="Material_002-effect">
<profile_COMMON>
<technique sid="common">
<lambert>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<diffuse>
<color sid="diffuse">0.8 0.8 0.8 1</color>
</diffuse>
<index_of_refraction>
<float sid="ior">1.45</float>
</index_of_refraction>
</lambert>
</technique>
</profile_COMMON>
</effect>
<effect id="Material_003-effect">
<profile_COMMON>
<technique sid="common">
<lambert>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<diffuse>
<color sid="diffuse">0.8 0.8 0.8 1</color>
</diffuse>
<index_of_refraction>
<float sid="ior">1.45</float>
</index_of_refraction>
</lambert>
</technique>
</profile_COMMON>
</effect>
<effect id="Material_004-effect">
<profile_COMMON>
<technique sid="common">
<lambert>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<diffuse>
<color sid="diffuse">0.8 0.8 0.8 1</color>
</diffuse>
<index_of_refraction>
<float sid="ior">1.45</float>
</index_of_refraction>
</lambert>
</technique>
</profile_COMMON>
</effect>
</library_effects>
<library_images/>
<library_materials>
<material id="Material-material" name="Material">
<instance_effect url="#Material-effect"/>
</material>
<material id="Material_001-material" name="Material.001">
<instance_effect url="#Material_001-effect"/>
</material>
<material id="Material_002-material" name="Material.002">
<instance_effect url="#Material_002-effect"/>
</material>
<material id="Material_003-material" name="Material.003">
<instance_effect url="#Material_003-effect"/>
</material>
<material id="Material_004-material" name="Material.004">
<instance_effect url="#Material_004-effect"/>
</material>
</library_materials>
<library_geometries>
<geometry id="Cube_001-mesh" name="Cube.001">
<mesh>
<source id="Cube_001-mesh-positions">
<float_array id="Cube_001-mesh-positions-array" count="198">-0.003791272 1.01136 -0.02694451 -0.003791272 1.005643 0.03110051 -0.003791272 0.9887117 0.08691489 -0.003791272 0.9612172 0.1383537 -0.003791272 0.9242157 0.1834402 -0.003791272 0.8791291 0.2204416 -0.003791272 0.8276903 0.2479362 -0.003791272 0.771876 0.2648673 -0.003791272 0.713831 0.2705843 -0.003791272 0.6557859 0.2648673 -0.003791272 0.5999717 0.2479363 -0.003791272 0.5485329 0.2204416 -0.003791272 0.5034462 0.1834402 -0.003791272 0.4664447 0.1383535 -0.003791272 0.4389501 0.08691477 -0.003791272 0.422019 0.03110039 -0.003791272 0.4163022 -0.02694463 -0.003791272 0.422019 -0.08498966 -0.003791272 0.4389502 -0.1408039 -0.003791332 0.466445 -0.1922428 -0.003791272 0.5034465 -0.2373293 -0.003791272 0.548533 -0.274331 -0.003791272 0.5999718 -0.3018255 -0.003791272 0.6557863 -0.3187566 -0.003791332 0.7138313 -0.3244734 -0.003791272 0.7718763 -0.3187565 -0.003791272 0.8276905 -0.3018252 -0.003791272 0.8791293 -0.2743306 -0.003791272 0.9242158 -0.237329 -0.003791332 0.9612173 -0.1922422 -0.003791272 0.9887118 -0.1408034 -0.003791272 1.005643 -0.08498907 0.06867289 1.031841 2.723685 0.06867289 1.030729 -0.7896439 0.06867289 -2.777734 2.723685 0.06867289 -2.778455 -0.7896439 -0.09035974 1.127053 2.818898 -0.09035974 1.127053 -1.181102 -0.09035974 -2.872946 2.818898 -0.09035974 -2.872946 -1.181102 0.06867289 1.127053 2.818898 0.06867289 1.080717 -1.134765 0.06867289 -2.872946 2.818898 0.06867289 -2.82661 -1.134765 0.06867289 -2.82661 -0.7881438 0.06867289 1.080717 -0.7920448 0.06867289 1.127053 -0.360772 0.06867289 1.127053 -1.181102 0.06867289 -2.872946 -0.353233 0.06867289 -2.872946 -1.181102 0.06867289 -2.777734 -0.3561992 0.06867289 1.031841 -0.3561992 -0.09600841 1.085236 -0.6488488 -0.09600841 1.085236 -1.144588 -0.09600841 0.5894967 -0.6488488 -0.09600841 0.5894967 -1.144588 -0.02319705 1.031841 2.723685 -0.02319705 1.031841 -0.3561992 -0.02319705 -2.777734 2.723685 -0.02319705 -2.777734 -0.3561992 -0.02319705 1.080717 -0.7920448 -0.02319705 1.080717 -1.134765 -0.02319705 -2.82661 -0.7881438 -0.02319705 -2.82661 -1.134765 -0.02319705 -2.778455 -0.7896439 -0.02319705 1.030729 -0.7896439</float_array>
<technique_common>
<accessor source="#Cube_001-mesh-positions-array" count="66" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Cube_001-mesh-normals">
<float_array id="Cube_001-mesh-normals-array" count="135">1 0 0 0 0 1 0 -1 0 -1 0 0 0 0 -1 0 1 0 1 -1.96881e-7 0 1 0 0 1 0 0 1 -1.73957e-7 0 0 -0.03113716 -0.9995151 0 -0.04797363 -0.9988487 1 -5.43499e-7 -2.21027e-7 1 -2.96142e-7 0 1 -7.01636e-7 -4.05114e-7 1 -7.67419e-7 -1.47975e-6 1 2.41556e-7 -8.18538e-7 1 5.435e-7 -2.21026e-7 1 2.36912e-7 -1.3679e-7 1 8.33187e-7 -2.49465e-7 1 0 0 1 5.33051e-7 0 1 -5.13306e-7 -2.10502e-7 1 0 0 1 4.9882e-7 1.60562e-6 1 -4.82364e-7 1.60557e-6 1 5.13308e-7 -2.10502e-7 1 -5.33058e-7 0 1 2.69498e-7 0 1 0 0 1 2.31367e-7 3.57325e-7 1 -1.97329e-7 1.29215e-7 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1.75937e-7 0 1 -1.78471e-7 0 1 0 0 1 0 0 1 0 0 0 -0.03113758 -0.9995151 0 -0.04797381 -0.9988486</float_array>
<technique_common>
<accessor source="#Cube_001-mesh-normals-array" count="45" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Cube_001-mesh-map-0">
<float_array id="Cube_001-mesh-map-0-array" count="528">0.4507547 1.78814e-7 1 0.4507553 0.5492455 1 0.875 0.5 0.625 0.75 0.625 0.5 0.4267418 0.75 0.625 1 0.375 1 0.625 0 0.375 0.25 0.375 0 0.375 0.5 0.125 0.75 0.125 0.5 0.3809508 0.5059508 0.3809508 0.7440492 0.3809508 0.7440492 0.625 0.25 0.625 0.5 0.4262706 0.5 0.6190493 0.5059508 0.4262706 0.5 0.625 0.5 0.6190493 0.5059508 0.625 0.75 0.6190493 0.7440491 0.3961153 0.7440943 0.3953825 0.5060203 0.3953825 0.5060203 0.4267418 0.75 0.6190493 0.7440491 0.625 0.75 0.4107818 0.5028961 0.375 0.5 0.4262706 0.5 0.4108026 0.747104 0.375 0.75 0.3771317 0.747104 0.3771317 0.747104 0.375 0.5 0.3771316 0.5028961 0.3953825 0.5060203 0.3809508 0.7440492 0.3961153 0.7440943 0.4108026 0.747104 0.3809508 0.7440492 0.4267418 0.75 0.4107818 0.5028961 0.3809508 0.5059508 0.3953825 0.5060203 1 1 0 0 1 0 0 1 1 0 1 1 0.9979555 0.01279342 0.9979552 0.9876759 0 1 0.4107818 0.5028961 0.3771316 0.5028961 0.3771316 0.5028961 0.6190493 0.5059508 0.3809508 0.5059508 0.3809508 0.5059508 0.4108026 0.747104 0.3961153 0.7440943 0.3961153 0.7440943 0.3771317 0.747104 0.4108026 0.747104 0.4108026 0.747104 0.3809508 0.7440492 0.6190493 0.7440491 0.6190493 0.7440491 0.3953825 0.5060203 0.4107818 0.5028961 0.4107818 0.5028961 0.3771316 0.5028961 0.3771317 0.747104 0.3771317 0.747104 0.6190493 0.7440491 0.6190493 0.5059508 0.6190493 0.5059508 0.5492455 1 0.4507541 1 0.1812683 0.8883756 0.4507541 1 0.3541551 0.9807854 0.1812683 0.8883756 0.3541551 0.9807854 0.263161 0.9430947 0.1812683 0.8883756 0.1812683 0.8883756 0.1116244 0.8187314 0.05690562 0.7368388 0.05690562 0.7368388 0.01921474 0.6458448 0 0.5492457 0 0.5492457 0 0.4507542 0.01921463 0.3541555 0.01921463 0.3541555 0.05690574 0.2631613 0 0.5492457 0.05690574 0.2631613 0.1116245 0.1812685 0 0.5492457 0.1116245 0.1812685 0.1812688 0.1116245 0.4507547 1.78814e-7 0.1812688 0.1116245 0.2631614 0.05690574 0.4507547 1.78814e-7 0.2631614 0.05690574 0.3541557 0.01921463 0.4507547 1.78814e-7 0.4507547 1.78814e-7 0.5492461 0 0.645845 0.01921504 0.645845 0.01921504 0.7368391 0.05690634 0.4507547 1.78814e-7 0.7368391 0.05690634 0.8187319 0.1116251 0.4507547 1.78814e-7 0.8187319 0.1116251 0.8883758 0.1812691 0.9430947 0.2631617 0.9430947 0.2631617 0.9807856 0.3541563 1 0.4507553 1 0.4507553 1 0.5492467 0.980785 0.6458452 0.980785 0.6458452 0.9430938 0.7368394 0.8883751 0.8187321 0.8883751 0.8187321 0.8187304 0.8883761 0.5492455 1 0.8187304 0.8883761 0.7368379 0.9430948 0.5492455 1 0.7368379 0.9430948 0.6458438 0.9807858 0.5492455 1 0.1812683 0.8883756 0.05690562 0.7368388 0.5492455 1 0.05690562 0.7368388 0 0.5492457 0.5492455 1 0.8187319 0.1116251 0.9430947 0.2631617 1 0.4507553 1 0.4507553 0.980785 0.6458452 0.5492455 1 0.980785 0.6458452 0.8883751 0.8187321 0.5492455 1 0 0.5492457 0.1116245 0.1812685 0.4507547 1.78814e-7 0.4507547 1.78814e-7 0.8187319 0.1116251 1 0.4507553 0.5492455 1 0 0.5492457 0.4507547 1.78814e-7 0.875 0.5 0.875 0.75 0.625 0.75 0.375 1 0.375 0.75 0.4267418 0.75 0.4267418 0.75 0.625 0.75 0.625 1 0.625 0 0.625 0.25 0.375 0.25 0.375 0.5 0.375 0.75 0.125 0.75 0.3809508 0.5059508 0.3809508 0.5059508 0.3809508 0.7440492 0.375 0.5 0.375 0.25 0.4262706 0.5 0.375 0.25 0.625 0.25 0.4262706 0.5 0.6190493 0.5059508 0.3809508 0.5059508 0.4262706 0.5 0.6190493 0.5059508 0.625 0.5 0.625 0.75 0.3961153 0.7440943 0.3961153 0.7440943 0.3953825 0.5060203 0.4267418 0.75 0.3809508 0.7440492 0.6190493 0.7440491 0.4107818 0.5028961 0.3771316 0.5028961 0.375 0.5 0.4108026 0.747104 0.4267418 0.75 0.375 0.75 0.3771317 0.747104 0.375 0.75 0.375 0.5 0.3953825 0.5060203 0.3809508 0.5059508 0.3809508 0.7440492 0.4108026 0.747104 0.3961153 0.7440943 0.3809508 0.7440492 0.4107818 0.5028961 0.4262706 0.5 0.3809508 0.5059508 1 1 0 1 0 0 0 1 0 0 1 0 3.17412e-7 0 0.9946833 0 0.9979555 0.01279342 0.9979552 0.9876759 1 1 0 1 3.17412e-7 0 0.9979555 0.01279342 0 1 0.4107818 0.5028961 0.4107818 0.5028961 0.3771316 0.5028961 0.6190493 0.5059508 0.6190493 0.5059508 0.3809508 0.5059508 0.4108026 0.747104 0.4108026 0.747104 0.3961153 0.7440943 0.3771317 0.747104 0.3771317 0.747104 0.4108026 0.747104 0.3809508 0.7440492 0.3809508 0.7440492 0.6190493 0.7440491 0.3953825 0.5060203 0.3953825 0.5060203 0.4107818 0.5028961 0.3771316 0.5028961 0.3771316 0.5028961 0.3771317 0.747104 0.6190493 0.7440491 0.6190493 0.7440491 0.6190493 0.5059508</float_array>
<technique_common>
<accessor source="#Cube_001-mesh-map-0-array" count="264" stride="2">
<param name="S" type="float"/>
<param name="T" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Cube_001-mesh-vertices">
<input semantic="POSITION" source="#Cube_001-mesh-positions"/>
</vertices>
<triangles material="Material-material" count="50">
<input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
<input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
<p>36 1 3 42 1 4 40 1 5 48 2 6 38 2 7 39 2 8 38 3 9 37 3 10 39 3 11 47 4 12 39 4 13 37 4 14 51 1 15 59 1 16 50 1 17 36 5 18 40 5 19 46 5 20 32 6 21 46 6 22 40 6 23 32 7 24 42 7 25 34 7 26 35 4 27 65 4 28 33 4 29 48 8 30 34 8 31 42 8 32 45 7 33 47 7 34 46 7 35 44 9 36 49 9 37 43 9 38 43 7 39 47 7 40 41 7 41 33 7 42 50 7 43 35 7 44 44 7 45 50 7 46 48 7 47 45 7 48 51 7 49 33 7 50 45 2 60 61 2 61 41 2 62 32 2 63 57 2 64 51 2 65 44 10 66 64 10 67 35 10 68 43 5 69 62 5 70 44 5 71 50 5 72 58 5 73 34 5 74 33 11 75 60 11 76 45 11 77 41 1 78 63 1 79 43 1 80 34 4 81 56 4 82 32 4 83 36 1 171 38 1 172 42 1 173 39 2 174 49 2 175 48 2 176 48 2 177 42 2 178 38 2 179 38 3 180 36 3 181 37 3 182 47 4 183 49 4 184 39 4 185 51 1 186 57 1 187 59 1 188 47 5 189 37 5 190 46 5 191 37 5 192 36 5 193 46 5 194 32 36 195 51 36 196 46 36 197 32 7 198 40 7 199 42 7 200 35 4 201 64 4 202 65 4 203 48 37 204 50 37 205 34 37 206 45 38 207 41 38 208 47 38 209 44 7 210 48 7 211 49 7 212 43 7 213 49 7 214 47 7 215 33 7 216 51 7 217 50 7 218 44 39 219 35 39 220 50 39 221 45 40 222 46 40 223 51 40 224 45 2 240 60 2 241 61 2 242 32 2 243 56 2 244 57 2 245 44 43 246 62 43 247 64 43 248 43 5 249 63 5 250 62 5 251 50 5 252 59 5 253 58 5 254 33 44 255 65 44 256 60 44 257 41 1 258 61 1 259 63 1 260 34 4 261 58 4 262 56 4 263</p>
</triangles>
<triangles material="Material_001-material" count="2">
<input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
<input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
<p>54 3 51 53 3 52 55 3 53 54 3 225 52 3 226 53 3 227</p>
</triangles>
<triangles material="Material_002-material" count="30">
<input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
<input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
<p>16 0 0 24 0 1 0 0 2 0 12 84 1 12 85 4 12 86 1 13 87 2 13 88 4 13 89 2 14 90 3 14 91 4 14 92 4 15 93 5 15 94 6 15 95 6 7 96 7 7 97 8 7 98 8 7 99 9 7 100 10 7 101 10 7 102 11 7 103 8 7 104 11 16 105 12 16 106 8 16 107 12 17 108 13 17 109 16 17 110 13 18 111 14 18 112 16 18 113 14 19 114 15 19 115 16 19 116 16 20 117 17 20 118 18 20 119 18 21 120 19 21 121 16 21 122 19 22 123 20 22 124 16 22 125 20 23 126 21 23 127 22 23 128 22 24 129 23 24 130 24 24 131 24 25 132 25 25 133 26 25 134 26 7 135 27 7 136 28 7 137 28 26 138 29 26 139 0 26 140 29 27 141 30 27 142 0 27 143 30 7 144 31 7 145 0 7 146 4 28 147 6 28 148 0 28 149 6 29 150 8 29 151 0 29 152 20 30 153 22 30 154 24 30 155 24 31 156 26 31 157 0 31 158 26 32 159 28 32 160 0 32 161 8 33 162 12 33 163 16 33 164 16 34 165 20 34 166 24 34 167 0 35 168 8 35 169 16 35 170</p>
</triangles>
<triangles material="Material_003-material" count="4">
<input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
<input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
<p>65 7 57 64 7 58 63 7 59 61 41 231 60 41 232 65 41 233 64 42 234 62 42 235 63 42 236 61 7 237 65 7 238 63 7 239</p>
</triangles>
<triangles material="Material_004-material" count="2">
<input semantic="VERTEX" source="#Cube_001-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cube_001-mesh-normals" offset="1"/>
<input semantic="TEXCOORD" source="#Cube_001-mesh-map-0" offset="2" set="0"/>
<p>56 7 54 59 7 55 57 7 56 56 7 228 58 7 229 59 7 230</p>
</triangles>
</mesh>
</geometry>
</library_geometries>
<library_visual_scenes>
<visual_scene id="Scene" name="Scene">
<node id="Cube_001" name="Cube.001" type="NODE">
<matrix sid="transform">1 0 0 0.01084344 0 1 0 0.8729465 0 0 1 -0.8188977 0 0 0 1</matrix>
<instance_geometry url="#Cube_001-mesh" name="Cube.001">
<bind_material>
<technique_common>
<instance_material symbol="Material-material" target="#Material-material">
<bind_vertex_input semantic="UVMap" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
<instance_material symbol="Material_001-material" target="#Material_001-material">
<bind_vertex_input semantic="UVMap" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
<instance_material symbol="Material_002-material" target="#Material_002-material">
<bind_vertex_input semantic="UVMap" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
<instance_material symbol="Material_003-material" target="#Material_003-material">
<bind_vertex_input semantic="UVMap" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
<instance_material symbol="Material_004-material" target="#Material_004-material">
<bind_vertex_input semantic="UVMap" input_semantic="TEXCOORD" input_set="0"/>
</instance_material>
</technique_common>
</bind_material>
</instance_geometry>
</node>
</visual_scene>
</library_visual_scenes>
<scene>
<instance_visual_scene url="#Scene"/>
</scene>
</COLLADA>

BIN
assets/textures/NOTEXTURE.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

BIN
assets/textures/VACANT.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

BIN
assets/textures/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB