Autor: Luí­s Miguel Sequeira

More imagemap goodness!

Chuck Norris rocks!
Imagemap alt target=''" /> target=''" /> target=''" />
Pellentesque nec sem orci. Nulla velit quam, dictum vel tincidunt ut, venenatis sed risus.

Mauris a neque eu neque viverra dictum. Fusce vel nisi id magna ultricies luctus. Vivamus odio augue, cursus venenatis semper in, cursus molestie nisi. Nunc bibendum, est faucibus porttitor consectetur, orci velit hendrerit odio, sit amet pretium nisl diam vel elit. Nullam pretium, libero a interdum elementum, nisl tellus ullamcorper dui, a faucibus velit magna in mauris.

Nulla iaculis massa sed sapien imperdiet eget fermentum sapien facilisis. Nam interdum odio quis metus vulputate in ornare libero commodo. Integer viverra aliquet nisi, non varius dolor pellentesque eu. Fusce pharetra lacinia velit id molestie. Morbi pretium auctor lorem, et mattis enim rhoncus at. Sed molestie pellentesque ullamcorper.

Nullam ut risus sit amet sapien mollis vulputate. Maecenas bibendum, magna eget tempor elementum, tellus felis lacinia metus, vel elementum odio ante ac lacus. In pharetra egestas neque quis semper. Aenean justo quam, egestas sollicitudin sagittis vel, laoreet ut risus. Praesent ante tellus, condimentum vitae placerat eget, dictum quis nibh. Nam mollis tempus nibh, quis fringilla lacus congue quis. Nulla libero nibh, dignissim sit amet eleifend in, venenatis non mauris. Sed placerat nisi vel purus varius ultricies. Nullam consequat orci quis sapien ornare euismod. Donec vel ligula sit amet lorem rhoncus eleifend id at dui. Aliquam feugiat porttitor enim, vitae volutpat nulla malesuada in.

Testing imagemaps!

Imagemap alt Home Testing imagemap ALRAM

Pellentesque nec sem orci. Nulla velit quam, dictum vel tincidunt ut, venenatis sed risus. Mauris a neque eu neque viverra dictum.

Imagemap alt Moon Feet of moon

Fusce vel nisi id magna ultricies luctus. Vivamus odio augue, cursus venenatis semper in, cursus molestie nisi. Nunc bibendum, est faucibus porttitor consectetur, orci velit hendrerit odio, sit amet pretium nisl diam vel elit. Nullam pretium, libero a interdum elementum, nisl tellus ullamcorper dui, a faucibus velit magna in mauris. Nulla iaculis massa sed sapien imperdiet eget fermentum sapien facilisis. Nam interdum odio quis metus vulputate in ornare libero commodo.

Integer viverra aliquet nisi, non varius dolor pellentesque eu. Fusce pharetra lacinia velit id molestie. Morbi pretium auctor lorem, et mattis enim rhoncus at. Sed molestie pellentesque ullamcorper.

Nullam ut risus sit amet sapien mollis vulputate. Maecenas bibendum, magna eget tempor elementum, tellus felis lacinia metus, vel elementum odio ante ac lacus. In pharetra egestas neque quis semper. Aenean justo quam, egestas sollicitudin sagittis vel, laoreet ut risus. Praesent ante tellus, condimentum vitae placerat eget, dictum quis nibh. Nam mollis tempus nibh, quis fringilla lacus congue quis. Nulla libero nibh, dignissim sit amet eleifend in, venenatis non mauris. Sed placerat nisi vel purus varius ultricies. Nullam consequat orci quis sapien ornare euismod. Donec vel ligula sit amet lorem rhoncus eleifend id at dui. Aliquam feugiat porttitor enim, vitae volutpat nulla malesuada in.

Um script de LSL

// Handles registration with the external database
// Accepts remote calls to trigger animations, send IMs to people etc

string registrationURL = "http://botmover.betatechnologies.info/inworld/registerPosition.php";
string externalURL; // this is what we'll get from SL to get incoming connections
string webServerURLupdateInventory = "http://botmover.betatechnologies.info/inworld/updateInventory.php";
key registrationRequest;	// used to track down the request for registration
key serverKey;
key httpRequestKey;

default
{
	state_entry()
	{
		llSetText("", <1.0,1.0,1.0>, 1.0);
	}

	on_rez(integer what)
	{
		llWhisper(0, "Registering position...");
		llRequestSecureURL();
	}

	touch_start(integer total_number)
	{
		llInstantMessage(llDetectedKey(0), "Registering position...");
		llRequestSecureURL();
	}

	http_response(key request_id, integer status, list metadata, string body)
	{
		if (request_id == registrationRequest)
		{
			if (status == 200)
			{
				llOwnerSay(body);
				// switch to inventory reading
				state read_inventory;
			}
			else
			{
				llOwnerSay("Error " +(string)status + ": " + body);
			}
		}
	}
	http_request(key id, string method, string body)
	{
		if (method == URL_REQUEST_GRANTED)
		{
			externalURL = body;
			string myTimestamp = llGetTimestamp();
			registrationRequest = llHTTPRequest(registrationURL, [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"],
			"permURL=" + llEscapeURL(externalURL)
			+ "&timestamp=" + myTimestamp
			+ "&signature=" + llMD5String((string)llGetKey() + myTimestamp, 9876));

			llSetTimerEvent(3600.0);	// if the registration fails, try later

		}
		else if (method == URL_REQUEST_DENIED)
		{
			llOwnerSay("Something went wrong, no url. " + body);
		}
		else if (method == "POST" || method == "GET")
		{
			// incoming request for refunds or IMs
			//llOwnerSay(body);

			list params = llParseStringKeepNulls(body, ["&", "="], []);
			string VoucherID;
			string Type;
			string AvatarName;
			key AvatarUUID;
			string ItemName;
			string ItemRef;
			integer Value;

			//llOwnerSay("List parsed: " + (string) params);

			if (llList2String(params, 0) == "VoucherID")
				VoucherID = llList2String(params, 1);
			if (llList2String(params, 2) == "Type")
				Type = llList2String(params, 3);
			if (llList2String(params, 4) == "AvatarName")
				AvatarName = llUnescapeURL(llList2String(params, 5));
			if (llList2String(params, 6) == "AvatarUUID")
				AvatarUUID = llList2Key(params, 7);
			if (llList2String(params, 8) == "ItemName")
				ItemName = llUnescapeURL(llList2String(params, 9));
			if (llList2String(params, 10) == "ItemRef")
				ItemRef = llUnescapeURL(llList2String(params, 11));
			if (llList2String(params, 12) == "Value")
				Value = llList2Integer(params, 13);

			//llOwnerSay("Incoming message: VoucherID=" + VoucherID
			//	  + ", Type=" + Type
			//	  + ", AvatarName=" + AvatarName
			//	  + ", AvatarUUID=" + (string)AvatarUUID
			//	  + ", ItemName=" + ItemName
			//	  + ", ItemRef=" + ItemRef
			//	  + ", Value=" + (string)Value + ".");

			if (Type == "STAMP-VENDOR")
			{
				// Process refund
				llGiveMoney(AvatarUUID, Value);
				llInstantMessage(AvatarUUID, AvatarName + ", here goes your refund of L$" +	 (string)Value + " for item '" + ItemName + "' (ref #" + ItemRef + ")");
				llOwnerSay("Processed refund for " + AvatarName + ". Amount of L$" +  (string)Value + " for item '" + ItemName + "' (ref #" + ItemRef + ")");
				llHTTPResponse(id, 200, "OK");
			}
			else
			{
				llHTTPResponse(id, 405, "Unknown Type: " + Type);
			}
		}
		else
		{
			llHTTPResponse(id, 405, "Method unsupported");
		}
	}

	changed(integer c)
	{
		// Region changed, get a new PermURL
		if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )
		{
			llRequestSecureURL();
		}
		// Deal with inventory changes
		else if (c & CHANGED_INVENTORY)
			state read_inventory;
	}

	timer()
	{
		llSetTimerEvent(0.0);
		llRequestSecureURL();
	}
}

state read_inventory
{
	state_entry()
	{
		llSetText("Sending to webserver - 0%", <0.3, 0.7, 0.2>, 1.0);
				// now prepare this line for sending to web server

		string httpBody;
		string itemName;
		string myTimeStamp;
		integer i;
		integer length = llGetInventoryNumber(INVENTORY_ALL);
		serverKey = llGetKey();

		llSetTimerEvent(360.00); // timeout if the web server is too slow in responding

		// Now add the new items.
		// This needs two passes: on the first one, we'll skip textures
		// The second pass will add them later

		for (i = 0; i < length; i++)
		{
			itemName = llGetInventoryName(INVENTORY_ALL, i);

			if (llGetInventoryType(itemName) != INVENTORY_SCRIPT && llGetInventoryType(itemName) != INVENTORY_TEXTURE) // skip script, skip textures
			{
				myTimeStamp = llGetTimestamp();

				httpBody =	"name=" + llEscapeURL(itemName) +
							"&timestamp=" + myTimeStamp +
							"&permissions=" + (string) llGetInventoryPermMask(itemName, MASK_NEXT) +
							"&itemType=" + (string) llGetInventoryType(itemName) +
							"&signature=" + llMD5String((string)serverKey + myTimeStamp, 9876);
				llSleep(1.0);

				httpRequestKey = llHTTPRequest(webServerURLupdateInventory,
								[HTTP_METHOD, "POST",
								 HTTP_MIMETYPE,"application/x-www-form-urlencoded"],
								httpBody);
				//llOwnerSay("Object " + (string) i + ": " + httpBody);
				if (httpRequestKey == NULL_KEY)
					llOwnerSay("Error contacting webserver on item #" + (string)i);

				llSetText("Sending to webserver - " + (string) ((integer)((float)i/(float)length*100)) + "%", <0.3, 0.7, 0.2>, 1.0);
			}
		}
		state default;
	}

	http_response(key request_id, integer status, list metadata, string body)
	{
		if (request_id == httpRequestKey)
		{
			if (status != 200)
			{
				llOwnerSay("HTTP Error " + (string)status + ": " + body);
			}
			else
			{
				llOwnerSay("Web-server reply: " + body);
				if (body == "closed")
					state default;

			}
		}
	}

	timer()
	{
		// HTTP server does not work, go to default state for now
		llOwnerSay("Web server did not reply after 3 minutes - not updated - try again later");
	}
}

Isto é só para testar mais um nível de menus

Pellentesque nec sem orci. Nulla velit quam, dictum vel tincidunt ut, venenatis sed risus. Mauris a neque eu neque viverra dictum. Fusce vel nisi id magna ultricies luctus. Vivamus odio augue, cursus venenatis semper in, cursus molestie nisi. Nunc bibendum, est faucibus porttitor consectetur, orci velit hendrerit odio, sit amet pretium nisl diam vel elit. Nullam pretium, libero a interdum elementum, nisl tellus ullamcorper dui, a faucibus velit magna in mauris. Nulla iaculis massa sed sapien imperdiet eget fermentum sapien facilisis. Nam interdum odio quis metus vulputate in ornare libero commodo. Integer viverra aliquet nisi, non varius dolor pellentesque eu. Fusce pharetra lacinia velit id molestie. Morbi pretium auctor lorem, et mattis enim rhoncus at. Sed molestie pellentesque ullamcorper.

Nullam ut risus sit amet sapien mollis vulputate. Maecenas bibendum, magna eget tempor elementum, tellus felis lacinia metus, vel elementum odio ante ac lacus. In pharetra egestas neque quis semper. Aenean justo quam, egestas sollicitudin sagittis vel, laoreet ut risus. Praesent ante tellus, condimentum vitae placerat eget, dictum quis nibh. Nam mollis tempus nibh, quis fringilla lacus congue quis. Nulla libero nibh, dignissim sit amet eleifend in, venenatis non mauris. Sed placerat nisi vel purus varius ultricies. Nullam consequat orci quis sapien ornare euismod. Donec vel ligula sit amet lorem rhoncus eleifend id at dui. Aliquam feugiat porttitor enim, vitae volutpat nulla malesuada in.