Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- integer UNITS_OF_FOOD = 999999999999;
- string SECRET_PASSWORD = "Poneez Rule";
- key YOUR_UUID = "a8da4525-987f-4676-bcb2-99a0cd872751";
- integer FOOD_CHANNEL = -999191;
- integer ANIMAL_CHANNEL = -999192;
- integer FOOD_TYPE = 0;
- integer XTEA_DELTA = 0x9E3779B9;
- integer xtea_num_rounds = 6;
- list xtea_key = [0, 0, 0, 0];
- integer hex2int(string hex)
- {
- if(llGetSubString(hex,0,1) == "0x")
- return (integer)hex;
- if(llGetSubString(hex,0,0) == "x")
- return (integer)("0"+hex);
- return(integer)("0x"+hex);
- }
- list xtea_key_from_string( string str )
- {
- str = llMD5String(str,0); // Use Nonce = 0
- return [ hex2int(llGetSubString( str, 0, 7)),
- hex2int(llGetSubString( str, 8, 15)),
- hex2int(llGetSubString( str, 16, 23)),
- hex2int(llGetSubString( str, 24, 31))];
- }
- string xtea_encipher( integer v0, integer v1 )
- {
- integer num_rounds = xtea_num_rounds;
- integer sum = 0;
- do
- {
- v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));
- sum += XTEA_DELTA;
- v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));
- } while( num_rounds = ~-num_rounds );
- return llGetSubString(llIntegerToBase64(v0),0,5) + llGetSubString(llIntegerToBase64(v1),0,5);
- }
- string xtea_decipher( integer v0, integer v1 )
- {
- integer num_rounds = xtea_num_rounds;
- integer sum = XTEA_DELTA*xtea_num_rounds;
- do
- {
- v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));
- sum -= XTEA_DELTA;
- v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));
- }while ( num_rounds = ~-num_rounds );
- return llGetSubString(llIntegerToBase64(v0), 0, 4) + llGetSubString(llIntegerToBase64(v1), 0, 4);
- }
- string xtea_encrypt_string( string str )
- {
- str = llStringToBase64(str);
- integer i = llSubStringIndex( str, "=" );
- if ( i != -1 )
- str = llDeleteSubString( str, i, -1 );
- integer len = llStringLength(str);
- str += "AAAAAAAAAA=";
- string result;
- i = 0;
- do
- {
- result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));
- i+=10;
- }while ( i < len );
- return result;
- }
- string xtea_decrypt_string( string str )
- {
- integer len = llStringLength(str);
- integer i=0;
- string result;
- do
- {
- integer v0;
- integer v1;
- v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");
- i+= 6;
- v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");
- i+= 6;
- result += xtea_decipher(v0, v1);
- }while ( i < len );
- i = llStringLength(result) - 1;
- while ( llGetSubString(result, i - 1, i) == "AA" ){
- result = llDeleteSubString(result, i, i);
- i--;
- }
- i = llStringLength(result) - 1;
- result = llGetSubString(result, 0, i+1);
- i = llStringLength(result);
- integer mod = i%4;
- if(mod == 1) result += "A==";
- else if(mod == 2 ) result += "==";
- else if(mod == 3) result += "=";
- return llBase64ToString(result);
- }
- string base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- integer food_left;
- string callsign = "SBPONEE";
- default
- {
- state_entry()
- {
- llSetText("", <1,1,1>, 1.0);
- xtea_key = xtea_key_from_string(SECRET_PASSWORD);
- food_left = UNITS_OF_FOOD;
- llListen(FOOD_CHANNEL, "", "", "");
- }
- touch_start(integer total_number)
- {
- llSetTimerEvent(20.0);
- llSetText((string)food_left + " servings remaining.", <1,1,1>, 1.0);
- }
- timer()
- {
- llSetTimerEvent(0.0);
- llSetText("", <1,1,1>, 1.0);
- }
- listen(integer channel, string name, key id, string message)
- {
- list data = llParseString2List(xtea_decrypt_string(message), ["^"] , []);
- if (llList2String(data, 0) == callsign)
- {
- if (llList2String(data, 1) == "FOOD_LOCATION")
- {
- integer random_key = llList2Integer(data, 2);
- key animal_key = llList2Key(data, 3);
- llSay(ANIMAL_CHANNEL, xtea_encrypt_string(callsign+"^FOOD_LOCATION^" + (string)random_key + "^" + (string)llGetPos() + "^" + (string)animal_key));
- }
- if (llList2String(data, 1) == "FOOD_CONSUME")
- {
- if (llList2Key(data, 2) == llGetKey())
- {
- integer random_key = llList2Integer(data, 3);
- key animal_key = llList2Key(data, 4);
- llSay(ANIMAL_CHANNEL, xtea_encrypt_string(callsign+"^FOOD_CONSUME^" + (string)random_key + "^" + (string)animal_key + "^" + (string)FOOD_TYPE));
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment