// CICP by Arkowitz string cicp_host = "http://glasshouse.greenphosphor.com:8180/CICPProxy"; vector offset = <0,.4,1.7>; integer listen_handle; key curReq; vector layerPos; integer layer = 0; integer newLayer; integer mode = 0; integer dontdie = 0; integer listenForMenu = 0; key http_id; integer iStart; integer iCount; integer gettingMore = 0; integer oldLayer; vector home; vector vparm1; vector vparm2; string strTitle = ""; integer titleOn = FALSE; integer yInd; integer xInd; integer zInd; integer isLegend = FALSE; integer isOrigin = FALSE; integer elevY = FALSE; integer elevX = FALSE; integer elevZ = FALSE; integer elevMe = FALSE; integer elevOn = FALSE; list propList; float height; vector normPos; integer nodeId; list optionList; list menuList; list lineListCell; list lineListAssist; integer wasRoot = 0; float myCell_size; string shapeType; float sphereRad; float normColorR; float normColorG; float normColorB; float highColorR; float highColorG; float highColorB; warpPos ( vector destpos ) { //R&D by Keknehv Psaltery, ~05/25/2006 //with a little pokeing by Strife, and a bit more //some more munging by Talarus Luan //Final cleanup by Keknehv Psaltery vector startpos = llGetPos(); // Limit to max setpos height if (destpos.z > 768) destpos.z = 768; // Compute the number of jumps necessary integer jumps = (integer)(llVecDist(destpos, startpos) / 10.0) + 1; // Try and avoid stack/heap collisions if (jumps > 100 ) jumps = 100; // 1km should be plenty integer count = 2; list rules = [ PRIM_POSITION, destpos ]; //The start for the rules list while (count < jumps) { rules = (rules=[]) + rules + rules; //should tighten memory use. count = count << 1; } llSetPrimitiveParams(rules + llList2List( rules, (count - jumps) << 1, count) ); } getConfig () { string getstr = cicp_host + "?type=cell"; getstr += "&layer=" + (string)layer; vector myPos = llGetPos(); getstr += "&yPos=" + (string)myPos.y + "&xPos=" + (string)myPos.x + "&zPos=" + (string)myPos.z; mode = 3; //llOwnerSay("getConfig: " + getstr); http_id = llHTTPRequest(getstr, [], ""); } getProps () { string propLine = llList2String(lineListCell, 0); //llOwnerSay(propLine); propList = llParseString2List(propLine, [","], []); strTitle = llUnescapeURL(llList2String(propList, 17)); shapeType = llList2String(propList, 0); vparm1 = <(float)llList2String(propList, 1), (float)llList2String(propList, 2), (float)llList2String(propList, 3)>; vparm2 = <(float)llList2String(propList, 4), (float)llList2String(propList, 5), (float)llList2String(propList, 6)>; zInd = (integer)llList2String(propList, 16); yInd = (integer)llList2String(propList, 15); xInd = (integer)llList2String(propList, 14); if ( xInd == 0 && yInd == 0 && zInd == 0 ) isOrigin = TRUE; else if ( (yInd == 0 && xInd == 0) || (yInd == 0 && zInd == 0) || (xInd == 0 && zInd == 0) ) isLegend = TRUE; normColorR = (float)llList2String(propList, 7); normColorG = (float)llList2String(propList, 8); normColorB = (float)llList2String(propList, 9); highColorR = (float)llList2String(propList, 11); highColorG = (float)llList2String(propList, 12); highColorB = (float)llList2String(propList, 13); if ( shapeType == "sph" ) sphereRad = (float)llList2String(propList, 5); myCell_size = (float)llList2String(propList, 4) * 2; height = (float)llList2String(propList, 5); nodeId = (integer)llList2String(propList, 19); optionList = []; menuList = []; integer i = 0; for ( i = 1; i < llGetListLength(lineListCell); i++ ) { string line = llList2String(lineListCell, i); //llOwnerSay(line); list l = llParseString2List(line, [","], []); optionList += llList2Integer(l, 0); string menuLabel = llList2String(l, 2); if ( llStringLength(menuLabel) > 24 ) menuLabel = llUnescapeURL(llGetSubString(menuLabel, 0, 23)); menuList += menuLabel; } optionList += -10; menuList += "exit"; //llOwnerSay("about to call modself"); modSelf(); } modSelf () { if ( height == 0 ) llOwnerSay("got height of 0"); //llDie(); vector sizeVec = llGetScale(); vector myPos = llGetPos(); if ( shapeType == "sph" ) { llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SPHERE, 0, <0.0, 1.0, 0.0>, 0.0, <0.0, 0.0, 0.0>, <0.0, 1.0, 0.0>]); sizeVec.z = sphereRad; sizeVec.y = sphereRad; sizeVec.x = sphereRad; } else if ( shapeType == "lin" ) { llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_CYLINDER, 0, <0.0, 1.0, 0.0>, 0.0, <0.0, 0.0, 0.0>, <1.0, 1.0, 0.0>, <0.0, 0.0, 0.0>]); myPos.z = vparm1.z + ((vparm2.z - vparm1.z) / 2); sizeVec.z = llFabs(vparm1.z - vparm2.z); sizeVec.x = .02; sizeVec.y = .02; } else { //if ( (isLegend || isOrigin) && wasRoot != 0 ) // toggleTitle(); myPos.z += height / 2; if ( height < .01 && height > -.01 ) height = .01; if ( height < 0 ) sizeVec.z = height * -1; else sizeVec.z = height; sizeVec.y = myCell_size; sizeVec.x = myCell_size; } llSetColor(, ALL_SIDES); llSetScale(sizeVec); llSetPos(myPos); llSetObjectDesc(strTitle); normPos = myPos; } reset () { //if ( !isLegend ) { titleOn = FALSE; llSetText("", <0,1,0>, .8); //} //else elevOn = FALSE; elevY = FALSE; elevX = FALSE; elevZ = FALSE; llSetColor(, ALL_SIDES); //llSetPos(normPos); } toggleTitle () { string titleSet; if ( titleOn ) { titleSet = ""; titleOn = FALSE; } else { titleSet = strTitle; titleOn = TRUE; } llSetText(titleSet, <0,1,0>, .8); } upDown ( integer dim ) { if ( dim == 2 ) elevY = !elevY; else if ( dim == 1 ) elevX = !elevX; else if ( dim == 3 ) elevZ = !elevZ; else { if ( elevMe ) toggleTitle(); elevMe = !elevMe; } if ( elevX || elevY || elevZ || elevMe ) { llSetColor(, ALL_SIDES); } else { llSetColor(, ALL_SIDES); } } toggleElev () { if ( elevOn ) { llRegionSay(layer * -1, "delev " + (string)xInd + " " + (string)yInd + " " + (string)zInd); elevOn = FALSE; } else { llRegionSay(layer * -1, "elev " + (string)xInd + " " + (string)yInd + " " + (string)zInd); elevOn = TRUE; } } string escapeLong ( string str ) { integer len = llStringLength(str); integer endPos; integer lastEndPos = 0; string ret = ""; while ( endPos < len - 1 ) { endPos += 50; if ( endPos > len - 1 ) endPos = len - 1; string sub = llGetSubString(str, lastEndPos, endPos); ret += llEscapeURL(sub); lastEndPos = endPos + 1; } return ret; } rezCells () { //llOwnerSay("rezCells with iStart " + (string)iStart + // " and iCount " + (string)iCount); if ( iStart < iCount - 1 ) { string strLine = llList2String(lineListAssist, iStart); iStart++; list coordList = llParseString2List(strLine, [","], []); vector rezV = <(float)llList2String(coordList, 0), (float)llList2String(coordList, 1), (float)llList2String(coordList, 2)>; if ( llVecDist(rezV, llGetPos()) > 10 ) warpPos(rezV); llRezObject("cicp", rezV, <0,0,0>, <0,0,0,0>, newLayer); } else if ( iStart == iCount - 1 ) { string endCom = llList2String(lineListAssist, iCount - 1); if ( endCom == "more" ) { gettingMore = 1; curReq = llHTTPRequest(cicp_host + "?type=chunk&layer=" + (string)newLayer, [], ""); } else if ( newLayer == oldLayer ) llDie(); else warpPos(home); } } msgProxy ( integer menuInd ) { listenForMenu = 0; integer optionId = llList2Integer(optionList, menuInd); if ( optionId == -1 ) { //mode = 1; if ( isLegend ) toggleElev(); upDown(4); } else if ( optionId == -10 ) { mode = 1; toggleTitle(); } else if ( optionId == -2 ) llRegionSay(layer * -1, "totem_reset"); else if ( optionId == -3 ) { llRegionSay(layer * -1, "totem_die"); llDie(); } else { layerPos = llGetPos(); string msg = (string)layer + "," + (string)nodeId + "," + llList2String(optionList, menuInd); gettingMore = 0; curReq = llHTTPRequest(cicp_host + "?type=msg&msg=" + msg + "&layer=" + (string)layer, [], ""); } } default { state_entry () { llOwnerSay( "Green Phosphor Visualization Assistant" ); llSetStatus( 1, FALSE ); // turn Physics off. } touch_start ( integer total_number ) { if ( mode == 0 ) { layerPos = llGetPos(); string msg = "init," + (string)layerPos.x + "," + (string)layerPos.z + "," + (string)layerPos.y; string wholeName = llKey2Name(llDetectedKey(0)); list nameList = llParseString2List(wholeName, [" "], []); string getstr; getstr = "&slf=" + llList2String(nameList, 0); getstr += "&sll=" + llList2String(nameList, 1); curReq = llHTTPRequest(cicp_host + "?type=msg&msg=" + msg + "&layer=0" + getstr, [], ""); } if ( mode == 2 || isOrigin ) { llDialog(llDetectedKey(0), strTitle, menuList, layer * -1); listenForMenu = 1; llSetTimerEvent(10); } else if ( mode == 1 ) { toggleTitle(); mode = 2; } } listen ( integer channel, string name, key id, string message ) { if ( channel == 0 ) { if ( message == "totem_alldie" ) llDie(); } else if ( channel == layer * -1 ) { if ( message == "totem_die" ) { if ( dontdie == 1 ) dontdie = 0; else llDie(); } else if ( message == "totem_reset" ) reset(); else { integer menuInd = -1; if ( listenForMenu == 1 ) menuInd = llListFindList(menuList, [message]); if ( menuInd != -1 ) msgProxy(menuInd); else { list cmdList = llParseString2List(message, [" "], []); if ( llGetListLength(cmdList) < 3 ) return; string cmd = llList2String(cmdList, 0); integer cmdX = (integer)llList2String(cmdList, 1); integer cmdY = (integer)llList2String(cmdList, 2); integer cmdZ = (integer)llList2String(cmdList, 3); if ( !isLegend && !isOrigin && (cmdY == yInd || cmdX == xInd || (cmdZ != 0 && cmdZ == zInd) ) ) { if ( cmd == "elev" || cmd == "delev" ) { if ( cmdY == yInd ) upDown(2); else if ( cmdX == xInd ) upDown(1); else upDown(3); } } } } } } http_response ( key request_id, integer status, list metadata, string body ) { if ( mode == 3 ) { //llOwnerSay("cell mode: " + body); lineListCell = llParseString2List(body, ["\n"], []); llListen(layer * -1, "", "", ""); mode = 1; getProps(); } else { if ( body == "unreg" ) llSay(0, "you have to register at greenphosphor.com"); else { //llOwnerSay("assist mode: " + body); lineListAssist = llParseString2List(body, ["\n"], []); if ( gettingMore == 0 ) { newLayer = (integer)llList2String(lineListAssist, 0); oldLayer = layer; if ( newLayer == layer ) { dontdie = 1; llRegionSay(layer * -1, "totem_die"); } if ( mode != 0 ) { iStart = 1; iCount = llGetListLength(lineListAssist); home = llGetPos(); rezCells(); } else { layer = newLayer; getConfig(); } } else { iStart = 0; iCount = llGetListLength(lineListAssist); rezCells(); } } } } object_rez ( key id ) { //llOwnerSay("got object_rez event"); llGiveInventory(id, "cicp"); rezCells(); } on_rez ( integer in_layer ) { layer = in_layer; //llOwnerSay("on rez got layer " + (string)layer); llListen(0, "", llGetOwner(), ""); if ( layer < 1 ) return; wasRoot = 1; getConfig(); } timer () { listenForMenu = 0; llSetTimerEvent(0); } }