Want to add a script or a project? Upload it and a half million people will see it and your name here this year.
![]() |
![]() |
||
---|---|---|---|
Category: | Contributor: | Creator | |
XS Pet | Ferd Frederix | XS Pet Xundra Snowpaw Original Quail |
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
Browse the Zip file
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.12 integer age;3 float GROWTH_AMOUNT = 0.10;45 // body6 // x = 0.1247 // y = 0.0828 // z = 0.096910 // head <0.042349,-0.000059,0.055298> 811 // x = 0.08212 // y = 0.08213 // z = 0.0821415 // tail <-0.032043,-0.000061,0.009560> 716 // x = 0.08217 // y = 0.08218 // z = 0.0821920 // left wing <-0.004141,0.034098,0.008184> 321 // x = 0.05822 // y = 0.07923 // z = 0.0232425 // right wing <-0.011113,-0.034257,0.008841> 226 // x = 0.05827 // y = 0.07928 // z = 0.0232930 // left leg <0.009700,0.020261,-0.052318> 931 // x = 0.01032 // y = 0.01033 // z = 0.0643435 // right leg <0.009747,-0.022943,-0.052399> 1036 // x = 0.01037 // y = 0.01038 // z = 0.0643940 // left eye <0.067205,0.018735,0.070143> 541 // x = 0.02442 // y = 0.02443 // z = 0.0244445 // right eye <0.067265,-0.017552,0.070217> 646 // x = 0.02447 // y = 0.02448 // z = 0.0244950 // beak <0.086439,-0.000059,0.049794> 451 // x = 0.04352 // y = 0.04353 // z = 0.0435455 default56 {58 {59 if(num == 800) {60 state running;61 }62 }63 }6465 state running66 {67 state_entry()68 {69 age = 0;70 }7172 timer()73 {74 llMessageLinked(LINK_SET, 940, "1", "");75 }7678 {79 if(num == 942) {81 } else82 if(num == 941) {83 llSetTimerEvent(86400.0); // 86400.084 } else85 if(num == 940) {86 integer prev_age = age;87 integer size_age;8889 age += (integer)str;9091 if(prev_age == 0 && age > 7) {92 size_age = 7;93 } else {94 size_age = age;95 }9697 if(size_age > 0 && size_age <= 7) {98 // grow to the correct proportion100101102 float new_scale = (GROWTH_AMOUNT * size_age) + 1.0;103104 vector new_size;105 vector new_pos;106107 // -> body108109 new_size = <0.124, 0.082, 0.096> * new_scale;110111 llSetPrimitiveParams([PRIM_SIZE, new_size]);112113 // -> body -> tail <-0.032043,-0.000061,0.009560> 9114115 new_size = <0.082, 0.082, 0.082> * new_scale;116 new_pos = <-0.032043,-0.000061,0.009560> * new_scale;118119 // -> body -> left wing <-0.004141,0.034098,0.008184> 7120 new_size = <0.058, 0.079, 0.023> * new_scale;121 new_pos = <-0.004141,0.034098,0.008184> * new_scale;122124125 // -> body -> right wing <-0.011113,-0.034257,0.008841> 4126 new_size = <0.058, 0.079, 0.023> * new_scale;127 new_pos = <-0.011113,-0.034257,0.008841> * new_scale;128130131 // -> body -> left leg <0.009700,0.020261,-0.052318> 6132 new_size = <0.01, 0.01, 0.064> * new_scale;133 new_pos = <0.009700,0.020261,-0.052318> * new_scale;134136137 // -> body -> right leg <0.009747,-0.022943,-0.052399> 10138 new_size = <0.01, 0.01, 0.064> * new_scale;139 new_pos = <0.009747,-0.022943,-0.052399> * new_scale;140142143 // -> body -> head <0.042349,-0.000059,0.055298> 5144 new_size = <0.082, 0.082, 0.082> * new_scale;145 new_pos = <0.042349,-0.000059,0.055298> * new_scale;146148 // -> body -> head -> left eye <0.067205,0.018735,0.070143> 8149 new_size = <0.024, 0.024, 0.024> * new_scale;150 new_pos = <0.067205,0.018735,0.070143> * new_scale;151153154 // -> body -> head -> right eye <0.067265,-0.017552,0.070217> 3155 new_size = <0.024, 0.024, 0.024> * new_scale;156 new_pos = <0.067265,-0.017552,0.070217> * new_scale;157159160 // -> body -> head -> beak <0.086439,-0.000059,0.049794> 2161 new_size = <0.043, 0.043, 0.043> * new_scale;162 new_pos = <0.086439,-0.000059,0.049794> * new_scale;163165166 }167 }168 }169 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.12 float VERSION = 0.22;34 string SECRET_PASSWORD = "top secret";5 integer SECRET_NUMBER = 99999;6 key YOUR_UUID = "00000000-0000-0000-0000-000000000000";7 integer FOOD_CHANNEL = -999191;8 integer ANIMAL_CHANNEL = -999192;9 integer EGG_CHANNEL = -999193;10 float FOOD_BOWL_SCAN_INTERVAL = 1800.0;11 integer HOME_CHANNEL = -999194;12 integer BOX_CHANNEL = -999195;13 integer ACC_CHANNEL = -999196;14 integer UPDATE_CHANNEL = -999197;1516 // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)1718 integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^3119 integer xtea_num_rounds = 6;2123 if(llGetSubString(hex,0,1) == "0x")24 return (integer)hex;25 if(llGetSubString(hex,0,0) == "x")26 return (integer)("0"+hex);27 return(integer)("0x"+hex);28 }293032 // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific35 {36 str = llMD5String(str,0); // Use Nonce = 037 return [ hex2int(llGetSubString( str, 0, 7)),38 hex2int(llGetSubString( str, 8, 15)),39 hex2int(llGetSubString( str, 16, 23)),40 hex2int(llGetSubString( str, 24, 31))];41 }4243 // Encipher two integers and return the result as a 12-byte string44 // containing two base64-encoded integers.46 {47 integer num_rounds = xtea_num_rounds;48 integer sum = 0;49 do {50 // LSL does not have unsigned integers, so when shifting right we51 // have to mask out sign-extension bits.52 v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));53 sum += XTEA_DELTA;54 v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));5556 } while( num_rounds = ~-num_rounds );57 //return only first 6 chars to remove "=="'s and compact encrypted text.58 return llGetSubString(llIntegerToBase64(v0),0,5) +59 llGetSubString(llIntegerToBase64(v1),0,5);60 }6162 // Decipher two base64-encoded integers and return the FIRST 30 BITS of63 // each as one 10-byte base64-encoded string.65 {66 integer num_rounds = xtea_num_rounds;67 integer sum = XTEA_DELTA*xtea_num_rounds;68 do {69 // LSL does not have unsigned integers, so when shifting right we70 // have to mask out sign-extension bits.71 v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));72 sum -= XTEA_DELTA;73 v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));74 } while( num_rounds = ~-num_rounds );7576 return llGetSubString(llIntegerToBase64(v0), 0, 4) +77 llGetSubString(llIntegerToBase64(v1), 0, 4);78 }7980 // Encrypt a full string using XTEA.82 {83 // encode string84 str = llStringToBase64(str);85 // remove trailing =s so we can do our own 0 padding86 integer i = llSubStringIndex( str, "=" );87 if( i != -1 )88 str = llDeleteSubString( str, i, -1 );8990 // we don't want to process padding, so get length before adding it91 integer len = llStringLength(str);9293 // zero pad94 str += "AAAAAAAAAA=";9596 string result;97 i = 0;9899 do {100 // encipher 30 (5*6) bits at a time.101 result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));102 i+=10;103 } while( i < len );104105 return result;106 }107108 // Decrypt a full string using XTEA110 integer len = llStringLength(str);111 integer i=0;112 string result;113 //llOwnerSay(str);114 do {115 integer v0;116 integer v1;117118 v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");119 i+= 6;120 v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");121 i+= 6;122123 result += xtea_decipher(v0, v1);124 } while( i < len );125126 // Replace multiple trailing zeroes with a single one127128 i = llStringLength(result) - 1;129 while( llGetSubString(result, i - 1, i) == "AA" ){130 result = llDeleteSubString(result, i, i);131 i--;132 }133 i = llStringLength(result) - 1;134 // while(llGetSubString(result, i, i + 1) == "A" ) {135 // i--;136 // }137 result = llGetSubString(result, 0, i+1);138 i = llStringLength(result);139 integer mod = i%4; //Depending on encoded length diffrent appends are needed140 if(mod == 1) result += "A==";143144 return llBase64ToString(result);145 }146147148 integer food_left;149 integer random_number;150 integer random_number2;151 //list food_bowl_keys;152 //list food_bowl_locations;153 integer hunger_amount;154 vector colour1;155 vector colour2;156157 integer sex;158159 integer shine;160 float glow;161162 integer gen;163 integer age;164165 vector mcolour1;166 vector mcolour2;167168 integer mshine;169 float mglow;170171 integer mgen;172 vector home_loc;173 key new_egg_key;174175 integer glow_gene;176 string special;177178 integer mglow_gene;179180 integer locked;181182 integer pregnancy_time;183184 default185 {186 state_entry()187 {188 if(llGetOwner() != YOUR_UUID) {189 // someone not the creator reset the script. Thats naughty.190 state dead;191 }192 llSetText("", <1,1,1>, 1.0);193 random_number = 0;194 random_number2 = 0;195 hunger_amount = 0;196 locked = 0;197198 xtea_key = xtea_key_from_string(SECRET_PASSWORD);199 llListen(ANIMAL_CHANNEL, "", "", "");200 }201203 {204205 if(change & CHANGED_ALLOWED_DROP) {206 if(llGetInventoryType("Quail") != INVENTORY_NONE && llGetInventoryType("XS Egg") != INVENTORY_NONE) {207 llAllowInventoryDrop(FALSE);208 }209 }210211 if(change & CHANGED_INVENTORY) {212 if(llGetOwner() != YOUR_UUID) {213215 integer extras = 3;216217219 state dead;220 }222 state dead;223 }225 state dead;226 }228 state dead;229 }231 state dead;232 }234 state dead;235 }236237239 extras--;240 }241243 extras--;244 }245247 extras--;248 }249251 state dead;252 }253254 if(8 + extras != inventory_count) {255 state dead;256 }257258 }259 }260 }261262 timer()263 {264265 llMessageLinked(LINK_SET, 920, "", "");266 // llWhisper(0, "Scanning for food bowls.");268 llSay(FOOD_CHANNEL, xtea_encrypt_string("XSPET^FOOD_LOCATION^" + (string)random_number + "^" + (string)llGetKey()));269 llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));270 }271273 {274 if(channel == ANIMAL_CHANNEL) {275 list data = llParseString2List(xtea_decrypt_string(message), ["^"], []);276 if(llList2String(data, 0) == "XSPET") {277 if(llList2String(data, 1) == "FOOD_LOCATION") {279 } else280 if(llList2String(data, 1) == "FOOD_CONSUME") {282 hunger_amount--;283 llMessageLinked(LINK_SET, 901, "", "");284 random_number2 = 0;285 if(llList2Integer(data, 4) == 1 && glow_gene < 10) {286 glow_gene ++;287 }288 }289 } else290 if(llList2String(data, 1) == "HOME_LOCATION") {292 float home_dis = llList2Float(data, 3);294 // llOwnerSay((string)llVecDist(home_loc, my_loc) + " " + (string)my_loc + (string)home_loc + (string)home_dis + llList2String(data, 2));295 if(llVecDist(n_home_loc, my_loc) <= home_dis && llFabs(llFabs(n_home_loc.z) - llFabs(my_loc.z)) < 1) {297 home_loc = n_home_loc;299 }300 }301 } else303 colour1 = (vector)llList2String(data, 3);;304 colour2 = (vector)llList2String(data, 4);305306 sex = llList2Integer(data, 5);307308 shine = llList2Integer(data, 6);309 glow = llList2Float(data, 7);310311 gen = llList2Integer(data, 8);312 integer mage = llList2Integer(data, 9);313 integer hamount = llList2Integer(data, 10);314 string myname = llList2String(data, 11);315 glow_gene = llList2Integer(data, 12);316 special = llList2String(data, 13);317318 llSetLinkPrimitiveParams(5, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);319 llSetLinkPrimitiveParams(1, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);320321 // llSetLinkColor(8, colour1, ALL_SIDES);322 // llSetLinkColor(1, colour1, ALL_SIDES);323324 llSetLinkPrimitiveParams(7, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);325 llSetLinkPrimitiveParams(4, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);326 llSetLinkPrimitiveParams(9, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);327 // llSetLinkColor(3, colour2, ALL_SIDES);328 // llSetLinkColor(2, colour2, ALL_SIDES);329 // llSetLinkColor(7, colour2, ALL_SIDES);330331 llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));332333340341343344345 if(hamount > 0) {347 }348349 if(name != "Quail") {350 llSetObjectName(myname);351 }352353 llSetObjectDesc("XS Quail v" + (string)VERSION + " (c) 2010 Xundra Snowpaw");354355356 llMessageLinked(LINK_SET, 1010, special, "");357358 llMessageLinked(LINK_SET, 941, "", "");359361362 llSetText("", <1,1,1>, 1.0);363 } else365 colour1 = (vector)llList2String(data, 3);;366 colour2 = (vector)llList2String(data, 4);367368 sex = llList2Integer(data, 5);369370 shine = llList2Integer(data, 6);371 glow = llList2Float(data, 7);372373 gen = llList2Integer(data, 8);374 integer mage = llList2Integer(data, 9);375 integer hamount = llList2Integer(data, 10);376 string myname = llList2String(data, 11);377 glow_gene = llList2Integer(data, 12);378 special = llList2String(data, 13);379 mcolour1 = (vector)llList2String(data, 14);380 mcolour2 = (vector)llList2String(data, 15);381 mshine = llList2Integer(data, 16);382 mglow = llList2Float(data, 17);383 mgen = llList2Integer(data, 18);384 mglow_gene = llList2Integer(data, 19);385 pregnancy_time = llList2Integer(data, 20);386387 llSetLinkPrimitiveParams(5, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);388 llSetLinkPrimitiveParams(1, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);389390 // llSetLinkColor(8, colour1, ALL_SIDES);391 // llSetLinkColor(1, colour1, ALL_SIDES);392393 llSetLinkPrimitiveParams(7, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);394 llSetLinkPrimitiveParams(4, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);395 llSetLinkPrimitiveParams(9, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);396 // llSetLinkColor(3, colour2, ALL_SIDES);397 // llSetLinkColor(2, colour2, ALL_SIDES);398 // llSetLinkColor(7, colour2, ALL_SIDES);399400 llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));401402405406 if(sex == 1) {408 } else {410 }411415416418419420 if(hamount > 0) {422 }423424 if(name != "Quail") {425 llSetObjectName(myname);426 }427428 llSetObjectDesc("XS Quail v" + (string)VERSION + " (c) 2010 Xundra Snowpaw");429430431 llMessageLinked(LINK_SET, 1010, special, "");432433 llMessageLinked(LINK_SET, 941, "", "");434435436438439 llSetText("", <1,1,1>, 1.0);440 } else442 if(llList2Float(data, 3) >= VERSION && locked == 0) {443 locked = 1;444 llSay(BOX_CHANNEL, xtea_encrypt_string("XSPET^" + (string)id + "^" + (string )colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + (string)gen + "^" + (string)sex + "^" + (string)age + "^" + (string)hunger_amount + "^" + llGetObjectName() + "^" + (string)glow_gene + "^" + special));445 }446 } else448 llDie();449 } else450 if(llList2String(data, 1) == "MALE_BREED_CALL") {451 llMessageLinked(LINK_SET, 961, "", "");452 } else454 llMessageLinked(LINK_SET, 963, "", id);455 } else457 llMessageLinked(LINK_SET, 965, "", id);458 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^FEMALE_LOC^" + (string)id + "^" + (string)llGetPos()));459 } else461 {463 } else465 // pregnant466 mcolour1 = (vector)llList2String(data, 3);467 mcolour2 = (vector)llList2String(data, 4);468469 mshine = llList2Integer(data, 5);470 mglow = llList2Float(data, 6);471472 mgen = llList2Integer(data, 7);473 mglow_gene = llList2Integer(data, 8);474 pregnancy_time = llGetUnixTime();475 llMessageLinked(LINK_SET, 972, "", "");476 } else478 {479 llMessageLinked(LINK_SET, 969, "", "");480 } else482 {483 llGiveInventory(id, "XS Egg");484 llGiveInventory(id, "Quail");485486 llSay(EGG_CHANNEL, xtea_encrypt_string("XSPET^" + (string)id + "^BORN^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)gen + "^" + (string)shine + "^" + (string)glow + "^" + (string)glow_gene + "^" + (string)mcolour1 + "^" + (string)mcolour2 + "^" + (string)mgen + "^" + (string)mshine + "^" + (string)mglow + "^" + (string)mglow_gene));487 } else489 if(shine == 0) {490 shine = 1;495496 // llSetLinkColor(8, colour1, ALL_SIDES);497 // llSetLinkColor(1, colour1, ALL_SIDES);498502 if(sex == 1) {503 llWhisper(0, "Look out ladies, Mr Slick has arrived!");504 } else {505 llWhisper(0, "Look out gentlemen! Miss Slick has arrived!");506 }507508509 } else {510 llWhisper(0, "I'm already shiny!");512513 }514 } else516 llDie();517 } else518 if(llList2String(data, 1) == "VERSION" && VERSION < llList2Float(data, 2) && llGetOwnerKey(id) == llGetOwner()) {520 } else521 if(llList2String(data, 1) == "UPDATE" && llList2String(data, 2) == llGetKey() && llGetOwnerKey(id) == llGetOwner()) {522 state update;523 }524 }525 }526 }527529 {530 if(num == 903 || num == 904) {531 hunger_amount = (integer)str;532 if(hunger_amount > 30) {533 state dead;534 }535 } else536 if(num == 900) {538 llSay(FOOD_CHANNEL, xtea_encrypt_string("XSPET^FOOD_CONSUME^" + (string)id + "^" + (string)random_number2 + "^" + (string)llGetKey()));539 } else540 if(num == 940) {541 age += (integer)str;542 } else543 if(num == 950) {544 llWhisper(0, "Looking for a cryo-crate...");545 llSay(BOX_CHANNEL, xtea_encrypt_string("XSPET^" + (string)llGetKey() + "^CRATE_PING^" + (string)VERSION));546 } else547 if(num == 960) {549 } else550 if(num == 962) {552 } else553 if(num == 964) {555 } else556 if(num == 968) {557 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^MALE_INFO^" + (string)id + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + (string)gen + "^" + (string)glow_gene));558 llMessageLinked(LINK_SET, 969, "", "");559 } else560 if(num == 970) {561 // lay an egg562 pregnancy_time = 0;563 llRezObject("XS Egg", llGetPos() + <0.0, 0.0, 0.25>, ZERO_VECTOR, ZERO_ROTATION, SECRET_NUMBER);564 } else565 if(num == 971) {567 pregnancy_time = 0;568 } else569 if(num == 990) {570 llSetLinkPrimitiveParams(3, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);571 llSetLinkPrimitiveParams(8, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);572 } else573 if(num == 991) {574 llSetLinkPrimitiveParams(3, [PRIM_COLOR, ALL_SIDES, <0,0,0>, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, 1, PRIM_BUMP_NONE]);575 llSetLinkPrimitiveParams(8, [PRIM_COLOR, ALL_SIDES, <0,0,0>, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, 1, PRIM_BUMP_NONE]);576 } else577 if(num == 9999) {578 state dead;579 } else580 if(num == 8000) {581 llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));582 }583 }584585 object_rez(key id)586 {587 new_egg_key = id;588 }589591 {592 if(param == SECRET_NUMBER) {593 llSetText("Rezzing...", <1,0,0>, 1.0);594 llMessageLinked(LINK_SET, 800, "", "");595596 llSleep(5.0);597 if(llGetOwner() != YOUR_UUID) {598 llAllowInventoryDrop(TRUE);599 }602 } else {603 llOwnerSay("I died in your inventory, please use a cryo-crate next time.");604 state dead;605 }606 }607 }608609 state dead610 {611 state_entry()612 {613 llSetText("Dead", <1,0,0>, 1.0);614 llRemoveInventory("xs_ager");615 llRemoveInventory("xs_breeding");616 llRemoveInventory("xs_eater");617 llRemoveInventory("xs_infomatic");618 llRemoveInventory("xs_movement");620 llRemoveInventory("xs_special");621 }622 llListen(ANIMAL_CHANNEL, "", "", "");623 }624625 touch_start(integer number)626 {627 llWhisper(0, "I've died. You could re-animate me with a jar of Xtra Strong Mojo");629 llSay(ACC_CHANNEL, xtea_encrypt_string("XSPET^STRONG_MOJO^" + (string)llGetKey() + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + special + "^" + (string)gen + "^" + (string)sex + "^" + (string)age + "^" + (string)glow_gene + (string)VERSION));630631 }632 }633635 list data = llParseString2List(xtea_decrypt_string(message), ["^"], []);636 if(llList2String(data, 0) == "XSPET") {638 llDie();639 }640 }641 }642 }643644 state update645 {646 state_entry()647 {648 llSetText("Updating.", <1,0,0>, 1.0);649 llRemoveInventory("Quail");650 llRemoveInventory("XS Egg");651 llAllowInventoryDrop(TRUE);652 llShout(UPDATE_CHANNEL, "UPDATE_READY");653 }654656 {657 if(change & CHANGED_ALLOWED_DROP) {658 if(llGetInventoryType("Quail") != INVENTORY_NONE && llGetInventoryType("XS Egg") != INVENTORY_NONE) {659 llAllowInventoryDrop(FALSE);661 }662 }663664 }665 object_rez(key id)666 {667 llListen(BOX_CHANNEL, "", id, "");668 }669671 {672 if(channel == BOX_CHANNEL) {673 list data = llParseString2List(xtea_decrypt_string(msg), ["^"], []);675676 llGiveInventory(id, "XS Egg");677 llGiveInventory(id, "Quail");678 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^UPDATE_CONFIG^" + (string)id + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)sex + "^" + (string)shine + "^" + (string)glow + "^" + (string)gen + "^" + (string)age + "^" + (string)hunger_amount + "^" + llGetObjectName() + "^" + (string)glow_gene + "^" + special + "^" + (string)mcolour1 + "^" + (string)mcolour2 + "^" + (string)mshine + "^" + (string)mglow + "^" + (string)mgen + "^" + (string)mglow_gene + "^" + (string)pregnancy_time));679 llDie();680 }681 }682 }683 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.12 integer SECONDS_BETWEEN_FOOD_NORMAL = 14400;3 integer SECONDS_BETWEEN_FOOD_HUNGRY = 3600;45 integer hunger_amount;6 integer seconds_elapsed_normal;7 integer seconds_elapsed_hungry;89 default10 {12 {13 if(num == 800) {14 state running;15 }16 }17 }1819 state running20 {21 state_entry()22 {23 hunger_amount = 0;24 seconds_elapsed_normal = 0;25 seconds_elapsed_hungry = 0;26 llSetTimerEvent(1.0);27 }2829 timer()30 {31 integer do_message = 0;3233 if(hunger_amount > 0) {34 if(seconds_elapsed_hungry == SECONDS_BETWEEN_FOOD_HUNGRY) {35 do_message = 1;36 seconds_elapsed_hungry = 0;37 } else {38 seconds_elapsed_hungry++;39 }40 }4142 if(seconds_elapsed_normal == SECONDS_BETWEEN_FOOD_NORMAL) {43 hunger_amount++;44 seconds_elapsed_normal = 0;45 } else {46 seconds_elapsed_normal++;47 }4849 if(do_message == 1) {51 }52 }5355 {56 if(num == 901) {57 hunger_amount --;58 } else59 if(num == 904) {60 hunger_amount = (integer)str;61 }62 }63 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.13 integer MAXIMUM_HUNGER = 30;4 integer ANIMAL_CHANNEL = -999192;567 integer hunger_amount;8 //integer eaten;910 vector colour1;11 vector colour2;1213 integer sex;1415 integer shine;16 float glow;1718 string pregnant;19 string sleep;2021 integer gen;2223 integer name_listener;24 integer menu_listener;2526 integer age;27 integer play_sounds;28 string special;29 integer menu_expired;30 integer sleep_disabled;3132 say_details()33 {3435 string mysex;36 string myshine;37 if(sex == 1) {38 mysex = "Male";39 } else40 if(sex == 2) {41 mysex = "Female";42 } else {43 mysex = (string)sex;44 }4546 if(shine == 0) {47 myshine = "None";48 } else49 if(shine == 1) {50 myshine = "Low";51 } else52 if(shine == 2) {53 myshine = "Medium";54 } else55 if(shine == 3) {56 myshine = "High";57 }5861 llWhisper(0, "Shine: " + myshine);63 llWhisper(0, "Special: " + special);64 llWhisper(0, "Sex: " + mysex);6768 llSay(API_CHANNEL, "XSQuail^" + (string)llGetKey() + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + special + "^" + (string)gen + "^" + (string)sex + "^" + (string)age + "^XSQuailEnd");69 }7071 default72 {74 {75 if(num == 800) {76 state running;77 }78 }79 }8081 state running82 {83 state_entry()84 {85 hunger_amount = 0;86 age = 0;87 pregnant = "";88 play_sounds = 1;90 }9192 touch_start(integer total_number)93 {94 string mysex;95 if(sex == 1) {96 mysex = "Male";97 } else98 if(sex == 2) {99 mysex = "Female";100 } else {101 mysex = (string)sex;102 }103104 llSetText(llGetObjectName() + "\n" + mysex + " - Age: " + (string)age + " - Gen: " + (string)gen + "\n" + "Hunger: " + (string)hunger_amount + "/" + (string)MAXIMUM_HUNGER + "\n" + pregnant + sleep, <1,1,1>, 1.0);105106 say_details();107108109 menu_expired = 0;110113 llListenRemove(menu_listener);114 menu_listener = llListen(menu_chan, "", llGetOwner(), "");115116117 menu_expired = 1;118119 }120 llSetTimerEvent(30.0);121 }122123 timer()124 {125 llListenRemove(menu_listener);126 llListenRemove(name_listener);127 llSetTimerEvent(0.0);128 llSetText("", <1,1,1>, 1.0);129 if(menu_expired) {130 llWhisper(0, "Menu Expired");131 menu_expired = 0;132 }133 }134136 {137 if(num == 903 || num == 904) {138 hunger_amount = (integer)str;139 } else140 if(num == 901) {141 hunger_amount --;142 //eaten ++;143 } else144 if(num == 930) {145 colour1 = (vector)str;146 } else147 if(num == 931) {148 colour2 = (vector)str;149 } else150 if(num == 932) {151 sex = (integer)str;152 } else153 if(num == 933) {154 shine = (integer)str;155 } else156 if(num == 934) {157 glow = (float)str;158 } else159 if(num == 935) {160 gen = (integer)str;161 } else162 if(num == 940) {163 age += (integer)str;164 } else165 if(num == 972) {166 pregnant = "Pregnant";168 } else169 if(num == 5000) {170 sex = 2;172 pregnant = "Pregnant";173 }174 } else175 if(num == 970) {176 pregnant = "";177 } else178 if(num == 990) {179 sleep = "\nSleeping";180 } else181 if(num == 991) {182 sleep = "";183 } else184 if(num == 1001) {185 if(play_sounds) {186 llPlaySound("bird_sound", 1.0);187 }188 } else189 if(num == 1010) {190 special = str;191 }192 //193 if(num == 910) {194 list data = llParseString2List(str, ["^"], []);195 llSetText("Home Set: " + llList2String(data, 0) + " " + llList2String(data, 1) + "m", <1,1,1>, 1.0);196 llSetTimerEvent(15.0);197 }198 }200 {201 if(channel == 0 && id == llGetOwner()) {202 list name_parts = llParseString2List(msg, [","], []);205206 integer i;207208 for (i=0;i<llStringLength(myname);i++) {209 if(llGetSubString(myname, i, i) == "^") {210 llWhisper(0, "Sorry, cannot have a \"^\" in the name.");211 llListenRemove(name_listener);212 return;213 }214 }215216 llWhisper(0, "My new name is " + myname);217 llSetObjectName(myname);218 llListenRemove(name_listener);219 }221 list data = llParseString2List(msg, ["^"], []);223 llSay(API_CHANNEL, "XSQuail^" + (string)llGetKey() + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + special + "^" + (string)gen + "^" + (string)sex + "^" + (string)age + "^XSQuailEnd");224 }226 llListenRemove(menu_listener);227 menu_expired = 0;228 if(msg == "Name") {229 name_listener = llListen(0, "", llGetOwner(), "");230 llSetTimerEvent(30.0);231 } else232 if(msg == "Package") {233 llMessageLinked(LINK_SET, 950, "", "");234 } else235 if(msg == "Sound") {236 if(play_sounds) {237 llWhisper(0, "Turning sound off.");238 } else {239 llWhisper(0, "Turning sound on.");240 }241 play_sounds = !play_sounds;242 } else243 if(msg == "Home Object") {244 llGiveInventory(llGetOwner(), "XS Home Object");245 } else246 if(msg == "Sleep") {247 if(sleep_disabled) {248 llWhisper(0, "Enabling Sleeping.");249 } else {250 llWhisper(0, "Disabling Sleeping.");251 }252 sleep_disabled = !sleep_disabled;254 }255 }256 }257 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.12 float GROWTH_AMOUNT = 0.10;34 vector home_location;5 float roam_distance;6 list food_bowls;7 list food_bowl_keys;8 list food_bowl_time;910 vector destination;1112 integer sex_dest = 0;13 integer food_dest = 0;14 float tolerance = 0.15;15 float increment = 0.1;16 integer rest;17 integer age;18 float zoffset;19 integer sleep_last_check ;20 integer sound;21 integer sleep_disabled;2223 face_target(vector lookat) {26 rotation rot = llAxes2Rot(fwd,lft,fwd%lft);27 llSetRot(rot);28 }2930 integer sleeping()31 {32 vector sun = llGetSunDirection();33 if(!sleep_disabled) {34 if(sun.z < 0) {35 if(sleep_last_check == 0) {36 // close eyes37 llMessageLinked(LINK_SET, 990, "", "");38 }39 sleep_last_check = 1;40 } else {41 if(sleep_last_check == 1) {42 // open eyes43 llMessageLinked(LINK_SET, 991, "", "");44 }45 sleep_last_check = 0;46 }47 return sleep_last_check;48 } else {49 if(sleep_last_check == 1) {50 llMessageLinked(LINK_SET, 991, "", "");51 sleep_last_check = 0;52 }53 return 0;54 }55 }5657 default58 {60 {61 if(num == 800) {62 state running;63 }64 }65 }6667 state running68 {69 state_entry()70 {71 home_location = <0,0,0>;72 roam_distance = 0;73 destination = <0,0,0>;74 age = 0;75 sleep_last_check = 0;76 sound = 1;77 }787980 timer()81 {82 if(!sleeping()) {83 if(sound) {84 llMessageLinked(LINK_SET, 1001, "", "");85 }86 sound = !sound;878990 if(llVecDist(<destination.x, destination.y, 0>, <my_pos.x, my_pos.y, 0>) <= tolerance || destination == <0,0,0>) {91 // if at food_destination send 900 msg92 if(food_dest > 0) {94 }9596 if(sex_dest > 0) {97 llMessageLinked(LINK_SET, 967, "", "");98 }99100 // pick a new destination101 sex_dest = 0;102 food_dest = 0;103 destination.x = (llFrand(roam_distance * 2) - roam_distance) + home_location.x;104 destination.y = (llFrand(roam_distance * 2) - roam_distance) + home_location.y;105106 destination.z = home_location.z + zoffset;107108 //llOwnerSay("Moving to " + (string)destination + " but first, a rest!");110 // face it111 face_target(destination);112 }113 if(rest == 0) {114 // move towards destination118120123124 if(inc_x > increment) {126 }127 if(inc_y > increment) {129 }130131 if(destination.x > position.x) {132 position.x += inc_x;133 } else {134 position.x -= inc_x;135 }136137 if(destination.y > position.y) {138 position.y += inc_y;139 } else {140 position.y -= inc_y;141 }142143 position.z = home_location.z + zoffset;144145 llSetPos(position);146 } else {147 rest--;148 }149 }150 }151153 {154 if(num == 903) {155 if(sex_dest == 0) {156 // move to food bowl, then send 900157 if(llGetListLength(food_bowl_keys) > 0) {158 if(roam_distance == 0 || home_location == <0,0,0>) {159 llOwnerSay("I'm hungry, but I'm not homed so I can not move! Attempting to use Jedi Mind Powers to teleport food to my belly.");161 } else {162 // find nearest food bowl163 integer i;164 destination = (vector)llList2String(food_bowls, 0);165 for (i=1;i<llGetListLength(food_bowls);i++) {166 if(llVecDist(destination, llGetPos()) > llVecDist((vector)llList2String(food_bowls, i), llGetPos())) {167 destination = (vector)llList2String(food_bowls, i);168 }169 }170 destination.z = home_location.z + zoffset;171 // set destination,172 // face it173 face_target(destination);174 food_dest = (integer)str;175 rest = 0;176 //llMessageLinked(LINK_SET, 900, str, llList2Key(food_bowl_keys, 0));177 }178 } else {179 llOwnerSay("I'm hungry, but I can't seem to find any food bowls at present.");180 }181 }182 } else183 if(num == 910) {184 list values = llParseString2List(str, ["^"], []);185 home_location = (vector)llList2String(values, 0);186 roam_distance = llList2Float(values, 1);188189 food_bowls = [];190 food_bowl_keys = [];191 food_bowl_time = [];192193 destination = <0,0,0>;194 food_dest = 0;195196 llSetPos(<current_loc.x, current_loc.y, home_location.z + zoffset>);197 llSetTimerEvent(5.0);198 } else199 if(num == 911) {201 rest = (integer)str;202 }203 } else204 if(num == 920) {205 food_bowls = [];206 food_bowl_keys = [];207 food_bowl_time = [];208 } else209 if(num == 921) {211212 if(llVecDist(home_location, food_loc) <= roam_distance && llFabs(llFabs(home_location.z) - llFabs(food_loc.z)) < 2) {215 if(id_pos == -1) {216 food_bowls += str;217 food_bowl_keys += id;218 food_bowl_time += llGetUnixTime();219 } else {220 food_bowls = llListReplaceList(food_bowls, [str], id_pos, id_pos);221 food_bowl_time = llListReplaceList(food_bowl_time, [llGetUnixTime()], id_pos, id_pos);222 }223 }224225 integer iter;226227 iter = 0;228229 while(iter<llGetListLength(food_bowls)) {231 food_bowls = llDeleteSubList(food_bowls, iter, iter);232 food_bowl_keys = llDeleteSubList(food_bowl_keys, iter, iter);233 food_bowl_time = llDeleteSubList(food_bowl_time, iter, iter);234 } else {235 iter++;236 }237 }238239 if(llGetListLength(food_bowls) > 0) {240 llMessageLinked(LINK_SET, 8000, "", "");241 }242243 }244 } else245 if(num == 966) {246 destination = (vector)str;247 face_target(destination);248 rest = 0;249 food_dest = 0;250 sex_dest = 1;251 } else252 if(num == 940) {253 integer heightm;254 age += (integer)str;255 heightm = age;256257 if(heightm > 7)258 heightm = 7;259 float new_scale = (GROWTH_AMOUNT * heightm) + 1.0;260261 float legsz = 0.064 * new_scale;262 float legso = 0.052399 * new_scale;263264 zoffset = legsz / 2 + legso;265 } else266 if(num == 7999) {267 sleep_disabled = (integer)str;268 }269 }270 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.12 default3 {5 {6 if(num == 1010) {7 if(str == "Normal") {8 llRemoveInventory("xs_special");9 } else {10 // add states for specific specails11 }12 }13 }14 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.12 integer FOOD_CHANNEL = -999191;3 integer ANIMAL_CHANNEL = -999192;4 integer HOME_CHANNEL = -999194;5 integer BOX_CHANNEL = -999195;6 integer ACC_CHANNEL = -999196;7 integer UPDATE_CHANNEL = -999197;8 integer EGG_CHANNEL = -999193;91011 list channels = [12 "FOOD_CHANNEL" , -999191,13 "ANIMAL_CHANNEL" , -999192,14 "HOME_CHANNEL" , -999194,15 "BOX_CHANNEL" , -999195,16 "ACC_CHANNEL" , -999196,17 "UPDATE_CHANNEL" , -999197,18 "EGG_CHANNEL" , -99919319 ];2021 list messages = [22 " LINK_AGE_START " , 800,23 " LINK_FOOD_CONSUME " , 900,24 " LINK_FOODMINUS " , 901,25 " LINK_HUNGRY " , 903,26 " LINK_HAMOUNT " , 904,27 " LINK_SET_HOME " , 910,28 " LINK_MOVER " , 911,29 " LINK_FOODIE_CLR " , 920,30 " LINK_FOODIE " , 921,31 " LINK_COLOR1 " , 930,32 " LINK_COLOR2 " , 931,33 " LINK_SEX " , 932,34 " LINK_SHINE " , 933,35 " LINK_GLOW " , 934,36 " LINK_GEN " , 935,37 " LINK_MAGE " , 940,38 " LINK_DAYTIME " , 941,39 " LINK_GET_AGE " , 942,40 " LINK_PUT_AGE " , 943,41 " LINK_PACKAGE " , 950,42 " LINK_SEEK_FEMALE " , 960,43 " LINK_MALE_BREED_CALL " , 961,44 " LINK_SIGNAL_ELIGIBLE" , 962,45 " LINK_FEMALE_ELIGIBLE " , 963,46 " LINK_CALL_MALE " , 964,47 " LINK_MALE_ON_THE_WAY " , 965,48 " LINK_FEMALE_LOCATION " , 966,49 " LINK_CALL_MALE_INFO " , 968,50 " LINK_RQST_BREED ", 967,51 " LINK_MALE_INFO " , 969,52 " LINK_LAY_EGG " , 970,53 " LINK_BREED_FAIL " , 971,54 " LINK_PREGNANT " , 972,55 " LINK_SLEEPING " , 990,56 " LINK_UNSLEEPING " , 991,57 " LINK_SOUND " , 1001,58 " LINK_SPECIAL " , 1010,59 " LINK_PREGNANCY_TIME " , 5000,60 " LINK_SLEEP " , 7999,61 " LINK_TIMER " , 8000,62 " LINK_DIE " , 999963 ];6465666768 string SECRET_PASSWORD = "top secret";69 integer SECRET_NUMBER = 99999;707172 // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)7374 integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^3175 integer xtea_num_rounds = 6;7779 if(llGetSubString(hex,0,1) == "0x")80 return (integer)hex;81 if(llGetSubString(hex,0,0) == "x")82 return (integer)("0"+hex);83 return(integer)("0x"+hex);84 }858688 // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific91 {92 str = llMD5String(str,0); // Use Nonce = 093 return [ hex2int(llGetSubString( str, 0, 7)),94 hex2int(llGetSubString( str, 8, 15)),95 hex2int(llGetSubString( str, 16, 23)),96 hex2int(llGetSubString( str, 24, 31))];97 }9899 // Encipher two integers and return the result as a 12-byte string100 // containing two base64-encoded integers.102 {103 integer num_rounds = xtea_num_rounds;104 integer sum = 0;105 do {106 // LSL does not have unsigned integers, so when shifting right we107 // have to mask out sign-extension bits.108 v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));109 sum += XTEA_DELTA;110 v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));111112 } while( num_rounds = ~-num_rounds );113 //return only first 6 chars to remove "=="'s and compact encrypted text.114 return llGetSubString(llIntegerToBase64(v0),0,5) +115 llGetSubString(llIntegerToBase64(v1),0,5);116 }117118 // Decipher two base64-encoded integers and return the FIRST 30 BITS of119 // each as one 10-byte base64-encoded string.121 {122 integer num_rounds = xtea_num_rounds;123 integer sum = XTEA_DELTA*xtea_num_rounds;124 do {125 // LSL does not have unsigned integers, so when shifting right we126 // have to mask out sign-extension bits.127 v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));128 sum -= XTEA_DELTA;129 v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));130 } while( num_rounds = ~-num_rounds );131132 return llGetSubString(llIntegerToBase64(v0), 0, 4) +133 llGetSubString(llIntegerToBase64(v1), 0, 4);134 }135136 // Encrypt a full string using XTEA.138 {139 // encode string140 str = llStringToBase64(str);141 // remove trailing =s so we can do our own 0 padding142 integer i = llSubStringIndex( str, "=" );143 if( i != -1 )144 str = llDeleteSubString( str, i, -1 );145146 // we don't want to process padding, so get length before adding it147 integer len = llStringLength(str);148149 // zero pad150 str += "AAAAAAAAAA=";151152 string result;153 i = 0;154155 do {156 // encipher 30 (5*6) bits at a time.157 result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));158 i+=10;159 } while( i < len );160161 return result;162 }163164 // Decrypt a full string using XTEA166 integer len = llStringLength(str);167 integer i=0;168 string result;169 //llOwnerSay(str);170 do {171 integer v0;172 integer v1;173174 v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");175 i+= 6;176 v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");177 i+= 6;178179 result += xtea_decipher(v0, v1);180 } while( i < len );181182 // Replace multiple trailing zeroes with a single one183184 i = llStringLength(result) - 1;185 while( llGetSubString(result, i - 1, i) == "AA" ){186 result = llDeleteSubString(result, i, i);187 i--;188 }189 i = llStringLength(result) - 1;190 // while(llGetSubString(result, i, i + 1) == "A" ) {191 // i--;192 // }193 result = llGetSubString(result, 0, i+1);194 i = llStringLength(result);195 integer mod = i%4; //Depending on encoded length diffrent appends are needed196 if(mod == 1) result += "A==";199200 return llBase64ToString(result);201 }202203 default204 {205 state_entry()206 {207 xtea_key = xtea_key_from_string(SECRET_PASSWORD);208 llListen(FOOD_CHANNEL,"","","");209 llListen(ANIMAL_CHANNEL,"","","");210 llListen(HOME_CHANNEL,"","","");211 llListen(BOX_CHANNEL,"","","");212 llListen(ACC_CHANNEL,"","","");213 llListen(UPDATE_CHANNEL,"","","");214 llListen(EGG_CHANNEL,"","","");215 }216218 {220 string aname = "unkown";221 if(index >= 0)222 {223 aname = llList2String(channels,index-1);224 }225 llOwnerSay(llGetObjectName() + ":channel:" + aname + ":" + xtea_decrypt_string(message) );226 }227228230 {232 string aname = "unkown";233 if(index >= 0)234 {235 aname = llList2String(messages,index-1);236 }237239240 }241242 touch_start(integer total_number)243 {244 llSay(0, "Touched.");245 }246 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.12 float VERSION = 0.22;356 string SECRET_PASSWORD = "top secret";7 integer SECRET_NUMBER = 99999;8 key YOUR_UUID = "00000000-0000-0000-0000-000000000000";9 integer ANIMAL_CHANNEL = -999192;10 integer EGG_CHANNEL = -999193;11 integer BOX_CHANNEL = -999195;1213 string SPECIAL = "Normal";1415 //integer TIME_TO_HATCH = 7200;1617 // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)1819 integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^3120 integer xtea_num_rounds = 6;2224 if(llGetSubString(hex,0,1) == "0x")25 return (integer)hex;26 if(llGetSubString(hex,0,0) == "x")27 return (integer)("0"+hex);28 return(integer)("0x"+hex);29 }303133 // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific36 {37 str = llMD5String(str,0); // Use Nonce = 038 return [ hex2int(llGetSubString( str, 0, 7)),39 hex2int(llGetSubString( str, 8, 15)),40 hex2int(llGetSubString( str, 16, 23)),41 hex2int(llGetSubString( str, 24, 31))];42 }4344 // Encipher two integers and return the result as a 12-byte string45 // containing two base64-encoded integers.47 {48 integer num_rounds = xtea_num_rounds;49 integer sum = 0;50 do {51 // LSL does not have unsigned integers, so when shifting right we52 // have to mask out sign-extension bits.53 v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));54 sum += XTEA_DELTA;55 v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));5657 } while( num_rounds = ~-num_rounds );58 //return only first 6 chars to remove "=="'s and compact encrypted text.59 return llGetSubString(llIntegerToBase64(v0),0,5) +60 llGetSubString(llIntegerToBase64(v1),0,5);61 }6263 // Decipher two base64-encoded integers and return the FIRST 30 BITS of64 // each as one 10-byte base64-encoded string.66 {67 integer num_rounds = xtea_num_rounds;68 integer sum = XTEA_DELTA*xtea_num_rounds;69 do {70 // LSL does not have unsigned integers, so when shifting right we71 // have to mask out sign-extension bits.72 v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));73 sum -= XTEA_DELTA;74 v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));75 } while( num_rounds = ~-num_rounds );7677 return llGetSubString(llIntegerToBase64(v0), 0, 4) +78 llGetSubString(llIntegerToBase64(v1), 0, 4);79 }8081 // Encrypt a full string using XTEA.83 {84 // encode string85 str = llStringToBase64(str);86 // remove trailing =s so we can do our own 0 padding87 integer i = llSubStringIndex( str, "=" );88 if( i != -1 )89 str = llDeleteSubString( str, i, -1 );9091 // we don't want to process padding, so get length before adding it92 integer len = llStringLength(str);9394 // zero pad95 str += "AAAAAAAAAA=";9697 string result;98 i = 0;99100 do {101 // encipher 30 (5*6) bits at a time.102 result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));103 i+=10;104 } while( i < len );105106 return result;107 }108109 // Decrypt a full string using XTEA111 integer len = llStringLength(str);112 integer i=0;113 string result;114 //llOwnerSay(str);115 do {116 integer v0;117 integer v1;118119 v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");120 i+= 6;121 v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");122 i+= 6;123124 result += xtea_decipher(v0, v1);125 } while( i < len );126127 // Replace multiple trailing zeroes with a single one128129 i = llStringLength(result) - 1;130 while( llGetSubString(result, i - 1, i) == "AA" ){131 result = llDeleteSubString(result, i, i);132 i--;133 }134 i = llStringLength(result) - 1;135 // while(llGetSubString(result, i, i + 1) == "A" ) {136 // i--;137 // }138 result = llGetSubString(result, 0, i+1);139 i = llStringLength(result);140 integer mod = i%4; //Depending on encoded length diffrent appends are needed141 if(mod == 1) result += "A==";144145 return llBase64ToString(result);146 }147148149 string base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";150151 vector colour1;152 vector colour2;153 integer sex;154 integer gen;155 integer shine;156 float glow;157 integer api_listener;158 integer locked;159 integer born_hatched;160 integer owner_touch;161162 integer menu_listener;163165 {166 llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, c2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);167 llSetLinkPrimitiveParams(2, [PRIM_COLOR, ALL_SIDES, c1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);168 }169170 say_details()171 {172173 string myshine;174175 if(shine == 0) {176 myshine = "None";177 } else178 if(shine == 1) {179 myshine = "Low";180 } else181 if(shine == 2) {182 myshine = "Medium";183 } else184 if(shine == 3) {185 myshine = "High";186 }187190 llWhisper(0, "Shine: " + myshine);192 llWhisper(0, "Special: " + SPECIAL);194 llSay(API_CHANNEL, "XSQuail^" + (string)llGetKey() + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + SPECIAL + "^" + (string)gen + "^XSQuailEnd");195 }196197 default198 {199 state_entry()200 {201 llSetText("", <1,1,1>, 1.0);202 llSetColor(<1,1,1>, ALL_SIDES);203 llSetLinkColor(2, <1,1,1>, ALL_SIDES);204 llParticleSystem([]);205 xtea_key = xtea_key_from_string(SECRET_PASSWORD);206 }207209 if(change & CHANGED_ALLOWED_DROP) {210 if(llGetInventoryType("Quail") != INVENTORY_NONE && llGetInventoryType("XS Egg") != INVENTORY_NONE) {211 llAllowInventoryDrop(FALSE);212 }213 }214 }215217 {218 llSetText("Rezzing...", <1,0,0>, 1.0);219220 llSleep(5.0);221222 if(param == 0) {223 if(llGetOwner() == YOUR_UUID) {225 if(colour == 1) {226 colour1 = <1,0,0>;227 colour2 = <1,0,0>;228 } else229 if(colour == 2) {230 colour1 = <1,0,0>;231 colour2 = <0,1,0>;232 } else233 if(colour == 3) {234 colour1 = <1,0,0>;235 colour2 = <0,0,1>;236 } else237 if(colour == 4) {238 colour1 = <0,1,0>;239 colour2 = <1,0,0>;240 } else241 if(colour == 5) {242 colour1 = <0,1,0>;243 colour2 = <0,1,0>;244 } else245 if(colour == 6) {246 colour1 = <0,1,0>;247 colour2 = <0,0,1>;248 } else249 if(colour == 7) {250 colour1 = <0,0,1>;251 colour2 = <1,0,0>;252 } else253 if(colour == 8) {254 colour1 = <0,0,1>;255 colour2 = <0,1,0>;256 } else257 if(colour == 9) {258 colour1 = <0,0,1>;259 colour2 = <0,0,1>;260 }261262263 set_colours(colour1, colour2, shine, glow);264 state rezzed;265 } else {266 llWhisper(0, "Oh no! This egg was broken in your inventory! Please use an egg-cup next time.");267 state dead;268 }269 } else270 if(param == SECRET_NUMBER) {271 menu_listener = llListen(EGG_CHANNEL, "", "", "");272 if(llGetOwner() != YOUR_UUID) {273 llAllowInventoryDrop(TRUE);274 }277 }278 }280 list data = llParseString2List(xtea_decrypt_string(msg), ["^"], []);282 if(llList2String(data, 2) == "UNBOX") {283 colour1 = (vector)llList2String(data, 3);284 colour2 = (vector)llList2String(data, 4);285286 gen = llList2Integer(data,5);287 shine = llList2Integer(data, 6);288 glow = llList2Float(data, 7);289 SPECIAL = llList2String(data, 8);290291 llListenRemove(menu_listener);292293 set_colours(colour1, colour2, shine, glow);294295 state rezzed;296 } else297 if(llList2String(data, 2) == "BORN") {300301 integer fgen = llList2Integer(data,5);302 integer fshine = llList2Integer(data, 6);303 float fglow = llList2Float(data, 7);304 integer fglow_gene = llList2Integer(data, 8);305308309 integer mgen = llList2Integer(data, 11);310 integer mshine = llList2Integer(data, 12);311 float mglow = llList2Float(data, 13);312 integer mglow_gene = llList2Integer(data, 14);313315318319 if(mix == 1) {320 colour1.x = (fcolour1.x / 2 + mcolour1.x / 2) + deviation1;321 colour1.y = (fcolour1.y / 2 + mcolour1.y / 2) + deviation1;322 colour1.z = (fcolour1.z / 2 + mcolour1.z / 2) + deviation1;323324 colour2.x = (fcolour2.x / 2 + mcolour2.x / 2) + deviation2;325 colour2.y = (fcolour2.y / 2 + mcolour2.y / 2) + deviation2;326 colour2.z = (fcolour2.z / 2 + mcolour2.z / 2) + deviation2;327328 } else {329 colour1.x = (fcolour1.x / 2 + mcolour2.x / 2) + deviation1;330 colour1.y = (fcolour1.y / 2 + mcolour2.y / 2) + deviation1;331 colour1.z = (fcolour1.z / 2 + mcolour2.z / 2) + deviation1;332333 colour2.x = (fcolour2.x / 2 + mcolour1.x / 2) + deviation2;334 colour2.y = (fcolour2.y / 2 + mcolour1.y / 2) + deviation2;335 colour2.z = (fcolour2.z / 2 + mcolour1.z / 2) + deviation2;336 }337338 if(colour1.x < 0)339 colour1.x = 0;340341 if(colour1.x > 1)342 colour1.x = 1;343344 if(colour1.y < 0)345 colour1.y = 0;346347 if(colour1.y > 1)348 colour1.y = 1;349350 if(colour1.z < 0)351 colour1.z = 0;352353 if(colour1.z > 1)354 colour1.z = 1;355356 if(colour2.x < 0)357 colour2.x = 0;358359 if(colour2.x > 1)360 colour2.x = 1;361362 if(colour2.y < 0)363 colour2.y = 0;364365 if(colour2.y > 1)366 colour2.y = 1;367368 if(colour2.z < 0)369 colour2.z = 0;370371 if(colour2.z > 1)372 colour2.z = 1;373374375 if(mgen > fgen) {376 gen = mgen + 1;377 } else {378 gen = fgen + 1;379 }380381 // TODO: shine / glow382 shine = 0;383 if(gen > 2) {385 if(fshine == mshine && fshine > 0) {386 if(pos < 25) {387 shine = fshine + 1;388 if(shine > 3) {389 shine = 3;390 }391 }392 } else {393 if(pos < 10) {394 // increase shine395 if(mshine > fshine) {396 shine = mshine + 1;397 } else398 if(fshine > mshine) {399 shine = fshine + 1;400 } else {401 shine = 1;402 }403 if(shine > 3) {404 shine = 3;405 }406 }407 }408 }409 glow = 0.0;410411 if(mglow <= 0.3 && fglow <= 0.3) {412 if(mglow > fglow) {413 glow = mglow - 0.1;415 glow = fglow - 0.1;416 }417 }418419 if(fglow_gene >= 10 && mglow_gene >= 10) {421 if(poss < 25) {422 glow = 0.3;423 }426 if(poss < 10) {427 glow = 0.3;428 }429 }430431432433 llListenRemove(menu_listener);434 born_hatched = 1;435 set_colours(colour1, colour2, shine, glow);436 llSetTimerEvent(1.0);437 }438 }439 }440 timer() {441 if(llGetInventoryType("Quail") != INVENTORY_NONE && llGetInventoryType("XS Egg") != INVENTORY_NONE) {442 state rezzed;443 }444 }445 }446447 state rezzed448 {450 {451 if(llGetOwner() != YOUR_UUID) {452 llWhisper(0, "Oh no! This egg was broken in your inventory! Please use an egg-cup next time.");453 state dead;454 }455 }456457 state_entry()458 {459 if(SPECIAL == "Normal") {460 llSetText("", <1,1,1>, 1.0);461 } else {462 llSetText(SPECIAL, <1,1,1>, 1.0);463 }465 }466467 touch_start(integer num)468 {469 owner_touch = 0;470 say_details();471473 owner_touch = 1;475 menu_listener = llListen(chan, "", llGetOwner(), "");476 llDialog(llGetOwner(), "I'm an egg. What would you like to do with me?", ["Hatch", "Package", "Nothing"], chan);477 }478 llSetTimerEvent(30.0);479 }480481 timer()482 {483 llSetTimerEvent(0);484485 if(owner_touch == 1) {486 llOwnerSay("Menu timeout.");487 llListenRemove(menu_listener);488 owner_touch = 0;489 }490 }491493 {495 list data = llParseString2List(msg, ["^"], []);497 say_details();498 }499 } else {500 if(id == llGetOwner()) {501 llSetTimerEvent(0);502 llListenRemove(menu_listener);503504 if(msg == "Hatch") {505 state hatching;506 } else507 if(msg == "Package") {508 state package;509 }510 }511 }512 }513514 state_exit() {515 llListenRemove(api_listener);516 }517 }518519 state hatching520 {521522 state_entry()523 {525 }526527 object_rez(key id)528 {529 menu_listener = llListen(EGG_CHANNEL, "", id, "");530 }531533 {534 list decrypted = llParseString2List(xtea_decrypt_string(msg), ["^"], []);535536 if(llList2String(decrypted, 0) == "XSPET" && llList2String(decrypted, 1) == "READY" && llList2String(decrypted, 2) == (string)id) {537 llGiveInventory(id, "Quail");538 llGiveInventory(id, "XS Egg");539541542 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^CONFIG^" + (string)id + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)sex + "^" + (string)shine + "^" + (string)glow + "^" + (string)gen + "^0^0^Quail^0^" + SPECIAL));543 llDie();544 }545 }546 }547548 state package549 {550 state_entry() {551 llSetTimerEvent(20.0);552 llWhisper(0, "Looking for an egg cup...");553 menu_listener = llListen(EGG_CHANNEL, "", "", "");554 llSay(BOX_CHANNEL, xtea_encrypt_string("XSPET^" + (string)llGetKey() + "^CUP_PING^" + (string)VERSION));555 }556 timer()557 {558 llListenRemove(menu_listener);559 llSetTimerEvent(0);560561 llWhisper(0, "No egg cup found.");562 state rezzed;563 }564566 {567 list data = llParseString2List(xtea_decrypt_string(msg), ["^"], []);568 if(llList2String(data, 0) == "XSPET" && llList2Key(data, 1) == llGetKey() && llList2String(data, 2) == "CUP_PONG" && llList2Float(data, 3) >= VERSION && locked == 0) {569 llSay(BOX_CHANNEL, xtea_encrypt_string("XSPET^" + (string)id + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + (string)gen + "^" + SPECIAL));570 locked = 1;571 } else572 if(llList2String(data, 0) == "XSPET" && llList2Key(data, 1) == llGetKey() && llList2String(data, 2) == "CUP_DIE") {573 llDie();574 }575 }576 }577578 state dead579 {580 state_entry()581 {582 llSetText("Broken egg.", <1,0,0>, 1.0);583 }584 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.123 default4 {5 state_entry()6 {7 llRezObject("XS Egg",llGetPos() + <0,0,0.5>,<0,0,0>,<0,0,0,1>,1);8 }9 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.123 string SECRET_PASSWORD = "top secret";4 integer UNITS_OF_FOOD = 168;5 key YOUR_UUID = "00000000-0000-0000-0000-000000000000";6 integer FOOD_CHANNEL = -999191;7 integer ANIMAL_CHANNEL = -999192;8 integer FOOD_TYPE = 0;910 // LINK MESSAGE FOOD DECREASE, NUMBER 100, STRING amount11 //1213 // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)1415 integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^3116 integer xtea_num_rounds = 6;1820 if(llGetSubString(hex,0,1) == "0x")21 return (integer)hex;22 if(llGetSubString(hex,0,0) == "x")23 return (integer)("0"+hex);24 return(integer)("0x"+hex);25 }262729 // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific32 {33 str = llMD5String(str,0); // Use Nonce = 034 return [ hex2int(llGetSubString( str, 0, 7)),35 hex2int(llGetSubString( str, 8, 15)),36 hex2int(llGetSubString( str, 16, 23)),37 hex2int(llGetSubString( str, 24, 31))];38 }3940 // Encipher two integers and return the result as a 12-byte string41 // containing two base64-encoded integers.43 {44 integer num_rounds = xtea_num_rounds;45 integer sum = 0;46 do {47 // LSL does not have unsigned integers, so when shifting right we48 // have to mask out sign-extension bits.49 v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));50 sum += XTEA_DELTA;51 v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));5253 } while( num_rounds = ~-num_rounds );54 //return only first 6 chars to remove "=="'s and compact encrypted text.55 return llGetSubString(llIntegerToBase64(v0),0,5) +56 llGetSubString(llIntegerToBase64(v1),0,5);57 }5859 // Decipher two base64-encoded integers and return the FIRST 30 BITS of60 // each as one 10-byte base64-encoded string.62 {63 integer num_rounds = xtea_num_rounds;64 integer sum = XTEA_DELTA*xtea_num_rounds;65 do {66 // LSL does not have unsigned integers, so when shifting right we67 // have to mask out sign-extension bits.68 v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));69 sum -= XTEA_DELTA;70 v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));71 } while( num_rounds = ~-num_rounds );7273 return llGetSubString(llIntegerToBase64(v0), 0, 4) +74 llGetSubString(llIntegerToBase64(v1), 0, 4);75 }7677 // Encrypt a full string using XTEA.79 {80 // encode string81 str = llStringToBase64(str);82 // remove trailing =s so we can do our own 0 padding83 integer i = llSubStringIndex( str, "=" );84 if( i != -1 )85 str = llDeleteSubString( str, i, -1 );8687 // we don't want to process padding, so get length before adding it88 integer len = llStringLength(str);8990 // zero pad91 str += "AAAAAAAAAA=";9293 string result;94 i = 0;9596 do {97 // encipher 30 (5*6) bits at a time.98 result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));99 i+=10;100 } while( i < len );101102 return result;103 }104105 // Decrypt a full string using XTEA107 integer len = llStringLength(str);108 integer i=0;109 string result;110 //llOwnerSay(str);111 do {112 integer v0;113 integer v1;114115 v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");116 i+= 6;117 v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");118 i+= 6;119120 result += xtea_decipher(v0, v1);121 } while( i < len );122123 // Replace multiple trailing zeroes with a single one124125 i = llStringLength(result) - 1;126 while( llGetSubString(result, i - 1, i) == "AA" ){127 result = llDeleteSubString(result, i, i);128 i--;129 }130 i = llStringLength(result) - 1;131 // while(llGetSubString(result, i, i + 1) == "A" ) {132 // i--;133 // }134 result = llGetSubString(result, 0, i+1);135 i = llStringLength(result);136 integer mod = i%4; //Depending on encoded length diffrent appends are needed137 if(mod == 1) result += "A==";140141 return llBase64ToString(result);142 }143144 string base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";145146147 integer food_left;148149 default150 {151 state_entry()152 {153 if(llGetOwner() != YOUR_UUID) {154 // someone not the creator reset the script. Thats naughty.155 state dead;156 }157 llSetText("", <1,1,1>, 1.0);158 xtea_key = xtea_key_from_string(SECRET_PASSWORD);159 food_left = UNITS_OF_FOOD;160 llListen(FOOD_CHANNEL, "", "", "");161 }162163 touch_start(integer total_number)164 {165 llSetTimerEvent(20.0);167 }168169 timer()170 {171 llSetTimerEvent(0.0);172 llSetText("", <1,1,1>, 1.0);173 }174176 {177 list data = llParseString2List(xtea_decrypt_string(message), ["^"] , []);178 if(llList2String(data, 0) == "XSPET") {179 if(llList2String(data, 1) == "FOOD_LOCATION") {182 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^FOOD_LOCATION^" + (string)random_key + "^" + (string)llGetPos() + "^" + (string)animal_key));183 }184 if(llList2String(data, 1) == "FOOD_CONSUME") {188 food_left--;189 llMessageLinked(LINK_SET, 100, "1", "");190 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^FOOD_CONSUME^" + (string)random_key + "^" + (string)animal_key + "^" + (string)FOOD_TYPE));191 if(food_left <= 0) {192 state empty;193 }194 }195 }196 }197 }198 }199200 state dead201 {202 state_entry()203 {204 llSetText("This food bowl has been broken.", <1,0,0>, 1.0);205 }206 }207208 state empty209 {210 state_entry()211 {212 llSetObjectName("XS Food Bowl (Empty)");213 llSetText("Empty", <1,0,0>, 1.0);214 }215 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.1234 integer UNITS_OF_FOOD = 168;56 integer food_left;78 default9 {10 state_entry()11 {12 food_left = UNITS_OF_FOOD;13 }1416 {17 if(number == 100) {18 // its a decrease message2021 food_left = food_left - amount;2223 // do the pie slice thing25 llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_DEFAULT, <0, cut_amount, 0>, 0.0, <0, 0, 0>, <1.0, 1.0, 0.0>, <0,0,0>]);26 }27 }28 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.123 string SECRET_PASSWORD = "top secret";4 integer ANIMAL_CHANNEL = -999192;5 integer HOME_CHANNEL = -999194;67 // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)89 integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^3110 integer xtea_num_rounds = 6;1214 if(llGetSubString(hex,0,1) == "0x")15 return (integer)hex;16 if(llGetSubString(hex,0,0) == "x")17 return (integer)("0"+hex);18 return(integer)("0x"+hex);19 }202123 // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific26 {27 str = llMD5String(str,0); // Use Nonce = 028 return [ hex2int(llGetSubString( str, 0, 7)),29 hex2int(llGetSubString( str, 8, 15)),30 hex2int(llGetSubString( str, 16, 23)),31 hex2int(llGetSubString( str, 24, 31))];32 }3334 // Encipher two integers and return the result as a 12-byte string35 // containing two base64-encoded integers.37 {38 integer num_rounds = xtea_num_rounds;39 integer sum = 0;40 do {41 // LSL does not have unsigned integers, so when shifting right we42 // have to mask out sign-extension bits.43 v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));44 sum += XTEA_DELTA;45 v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));4647 } while( num_rounds = ~-num_rounds );48 //return only first 6 chars to remove "=="'s and compact encrypted text.49 return llGetSubString(llIntegerToBase64(v0),0,5) +50 llGetSubString(llIntegerToBase64(v1),0,5);51 }5253 // Decipher two base64-encoded integers and return the FIRST 30 BITS of54 // each as one 10-byte base64-encoded string.56 {57 integer num_rounds = xtea_num_rounds;58 integer sum = XTEA_DELTA*xtea_num_rounds;59 do {60 // LSL does not have unsigned integers, so when shifting right we61 // have to mask out sign-extension bits.62 v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));63 sum -= XTEA_DELTA;64 v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));65 } while( num_rounds = ~-num_rounds );6667 return llGetSubString(llIntegerToBase64(v0), 0, 4) +68 llGetSubString(llIntegerToBase64(v1), 0, 4);69 }7071 // Encrypt a full string using XTEA.73 {74 // encode string75 str = llStringToBase64(str);76 // remove trailing =s so we can do our own 0 padding77 integer i = llSubStringIndex( str, "=" );78 if( i != -1 )79 str = llDeleteSubString( str, i, -1 );8081 // we don't want to process padding, so get length before adding it82 integer len = llStringLength(str);8384 // zero pad85 str += "AAAAAAAAAA=";8687 string result;88 i = 0;8990 do {91 // encipher 30 (5*6) bits at a time.92 result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));93 i+=10;94 } while( i < len );9596 return result;97 }9899 // Decrypt a full string using XTEA101 integer len = llStringLength(str);102 integer i=0;103 string result;104 //llOwnerSay(str);105 do {106 integer v0;107 integer v1;108109 v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");110 i+= 6;111 v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");112 i+= 6;113114 result += xtea_decipher(v0, v1);115 } while( i < len );116117 // Replace multiple trailing zeroes with a single one118119 i = llStringLength(result) - 1;120 while( llGetSubString(result, i - 1, i) == "AA" ){121 result = llDeleteSubString(result, i, i);122 i--;123 }124 i = llStringLength(result) - 1;125 // while(llGetSubString(result, i, i + 1) == "A" ) {126 // i--;127 // }128 result = llGetSubString(result, 0, i+1);129 i = llStringLength(result);130 integer mod = i%4; //Depending on encoded length diffrent appends are needed131 if(mod == 1) result += "A==";134135 return llBase64ToString(result);136 }137138 string base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";139140141142 default143 {144 state_entry()145 {146 xtea_key = xtea_key_from_string(SECRET_PASSWORD);148 }149150 touch_start(integer total_number)151 {153 vector size = llGetScale();155156 pos.z = pos.z - size.z / 2;157 // llOwnerSay("XSPET^HOME_LOCATION^" + (string)llGetPos() + "^" + llGetObjectDesc());158 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^HOME_LOCATION^" + (string)pos + "^" + llGetObjectDesc()));159 }160 }161163 {164 vector size = llGetScale();166167 pos.z = pos.z - size.z / 2;168 // llOwnerSay("XSPET^HOME_LOCATION^" + (string)llGetPos() + "^" + llGetObjectDesc());169 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^HOME_LOCATION^" + (string)pos + "^" + llGetObjectDesc())); }170 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.1235 float VERSION = 0.22;67 string SECRET_PASSWORD = "top secret";8 integer SECRET_NUMBER = 99999;9 key YOUR_UUID = "00000000-0000-0000-0000-000000000000";10 integer ANIMAL_CHANNEL = -999192;11 integer BOX_CHANNEL = -999195;1213 // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)1415 integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^3116 integer xtea_num_rounds = 6;1820 if(llGetSubString(hex,0,1) == "0x")21 return (integer)hex;22 if(llGetSubString(hex,0,0) == "x")23 return (integer)("0"+hex);24 return(integer)("0x"+hex);25 }262729 // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific32 {33 str = llMD5String(str,0); // Use Nonce = 034 return [ hex2int(llGetSubString( str, 0, 7)),35 hex2int(llGetSubString( str, 8, 15)),36 hex2int(llGetSubString( str, 16, 23)),37 hex2int(llGetSubString( str, 24, 31))];38 }3940 // Encipher two integers and return the result as a 12-byte string41 // containing two base64-encoded integers.43 {44 integer num_rounds = xtea_num_rounds;45 integer sum = 0;46 do {47 // LSL does not have unsigned integers, so when shifting right we48 // have to mask out sign-extension bits.49 v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));50 sum += XTEA_DELTA;51 v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));5253 } while( num_rounds = ~-num_rounds );54 //return only first 6 chars to remove "=="'s and compact encrypted text.55 return llGetSubString(llIntegerToBase64(v0),0,5) +56 llGetSubString(llIntegerToBase64(v1),0,5);57 }5859 // Decipher two base64-encoded integers and return the FIRST 30 BITS of60 // each as one 10-byte base64-encoded string.62 {63 integer num_rounds = xtea_num_rounds;64 integer sum = XTEA_DELTA*xtea_num_rounds;65 do {66 // LSL does not have unsigned integers, so when shifting right we67 // have to mask out sign-extension bits.68 v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));69 sum -= XTEA_DELTA;70 v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));71 } while( num_rounds = ~-num_rounds );7273 return llGetSubString(llIntegerToBase64(v0), 0, 4) +74 llGetSubString(llIntegerToBase64(v1), 0, 4);75 }7677 // Encrypt a full string using XTEA.79 {80 // encode string81 str = llStringToBase64(str);82 // remove trailing =s so we can do our own 0 padding83 integer i = llSubStringIndex( str, "=" );84 if( i != -1 )85 str = llDeleteSubString( str, i, -1 );8687 // we don't want to process padding, so get length before adding it88 integer len = llStringLength(str);8990 // zero pad91 str += "AAAAAAAAAA=";9293 string result;94 i = 0;9596 do {97 // encipher 30 (5*6) bits at a time.98 result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));99 i+=10;100 } while( i < len );101102 return result;103 }104105 // Decrypt a full string using XTEA107 integer len = llStringLength(str);108 integer i=0;109 string result;110 //llOwnerSay(str);111 do {112 integer v0;113 integer v1;114115 v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");116 i+= 6;117 v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");118 i+= 6;119120 result += xtea_decipher(v0, v1);121 } while( i < len );122123 // Replace multiple trailing zeroes with a single one124125 i = llStringLength(result) - 1;126 while( llGetSubString(result, i - 1, i) == "AA" ){127 result = llDeleteSubString(result, i, i);128 i--;129 }130 i = llStringLength(result) - 1;131 // while(llGetSubString(result, i, i + 1) == "A" ) {132 // i--;133 // }134 result = llGetSubString(result, 0, i+1);135 i = llStringLength(result);136 integer mod = i%4; //Depending on encoded length diffrent appends are needed137 if(mod == 1) result += "A==";140141 return llBase64ToString(result);142 }143 string base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";144145 vector colour1;146 vector colour2;147 integer gen;148 integer shine;149 float glow;150 key uuid;151 integer listener;152 integer owner_touch;153 integer sex;154 integer age;155 integer hunger;156 string myname;157 integer glow_gene;158 string special;159160 say_details()161 {162163 string mysex;164 string myshine;165 if(sex == 1) {166 mysex = "Male";167 } else168 if(sex == 2) {169 mysex = "Female";170 } else {171 mysex = (string)sex;172 }173174 if(shine == 0) {175 myshine = "None";176 } else177 if(shine == 1) {178 myshine = "Low";179 } else180 if(shine == 2) {181 myshine = "Medium";182 } else183 if(shine == 3) {184 myshine = "High";185 }186189 llWhisper(0, "Shine: " + myshine);191 llWhisper(0, "Special: " + special);192 llWhisper(0, "Sex: " + mysex);195196 llSay(API_CHANNEL, "XSQuail^" + (string)llGetKey() + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + special + "^" + (string)gen + "^" + (string)sex + "^" + (string)age + "^XSQuailEnd");197 }198200 {201 llSetPrimitiveParams([PRIM_COLOR, 0, c1, 1.0, PRIM_COLOR, 1, c1, 1.0, PRIM_COLOR, 3, c1, 1.0, PRIM_COLOR, 5, c1, 1.0, PRIM_COLOR, 2, c2, 1.0, PRIM_COLOR, 4, c2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);202 }203204 default205 {206 state_entry()207 {208 xtea_key = xtea_key_from_string(SECRET_PASSWORD);209 uuid = NULL_KEY;210 listener = llListen(BOX_CHANNEL, "", "", "");211 }212213 touch_start(integer num)214 {216 }217219 {221 return;222 }223224 list data = llParseString2List(xtea_decrypt_string(msg), ["^"], []);225228 uuid = id;229 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^CRATE_PONG^" + (string)id + "^" + (string)VERSION));230 llSetTimerEvent(15.0);231 }234 llSetTimerEvent(0.0);235 colour1 = (vector)llList2String(data, 2);236 colour2 = (vector)llList2String(data, 3);237 shine = llList2Integer(data, 4);238 glow = llList2Float(data, 5);239 gen = llList2Integer(data, 6);240 sex = llList2Integer(data, 7);241 age = llList2Integer(data, 8);242 hunger = llList2Integer(data, 9);243 myname = llList2String(data, 10);244 glow_gene = llList2Integer(data, 11);245 special = llList2String(data, 12);246 llListenRemove(listener);247 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^CRATE_DIE^" + (string)id + "^" + (string)VERSION));248249 state full;250 } else252 uuid = NULL_KEY;253 }254 }255 }256 timer()257 {258 llSetTimerEvent(0.0);259 uuid = NULL_KEY;260 }261 }262263 state full264 {265 state_entry()266 {267 llSetObjectName("XS Cryo-Crate: " + myname);268 set_colours(colour1, colour2, shine, glow);270 }271272 touch_start(integer num)273 {274 owner_touch = 0;275 say_details();276277279 owner_touch = 1;281 listener = llListen(chan, "", llGetOwner(), "");282283 llDialog(llGetOwner(), "Would you like to unpackage me?", ["Yes", "No"], chan);284 }285 llSetTimerEvent(20.0);286 }287288 timer()289 {290 //llOwnerSay("Menu timeout.");291 if(owner_touch == 1) {292 llListenRemove(listener);293 }294 llSetTimerEvent(0.0);295 }296298 {300 list data = llParseString2List(msg, ["^"], []);302 llSay(API_CHANNEL, "XSQuail^" + (string)llGetKey() + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + special + "^" + (string)gen + "^" + (string)sex + "^" + (string)age + "^XSQuailEnd");303 }304 } else {305 llListenRemove(listener);306 if(msg == "Yes") {307 state unbox;308 }309 }310 }311 }312313 state unbox314 {315 state_entry()316 {318 }319320 object_rez(key id)321 {322 listener = llListen(BOX_CHANNEL, "", id, "");323 }324326 {327 if(channel == BOX_CHANNEL) {328 list data = llParseString2List(xtea_decrypt_string(msg), ["^"], []);330331 llGiveInventory(id, "XS Egg");332 llGiveInventory(id, "Quail");333334 llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^CONFIG^" + (string)id + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)sex + "^" + (string)shine + "^" + (string)glow + "^" + (string)gen + "^" +(string)age + "^" + (string)hunger + "^" + myname + "^" + (string)glow_gene + "^" + special));335 llDie();336 }337 }338 }339 }
Category: XS Pet
By : Ferd Frederix
Created: 2013-09-06 Edited: 2013-09-04
Worlds: Second Life
This script by Ferd Frederix may be used in any manner, modified, and republished. Unless specified otherwise, my scripts are always free and open source. Objects made with these scripts may be sold with no restrictions. All I ask is that you point others to this location should they ask you about it and to not sell this script, unless it is for $0 L. Please help improve my work by reporting bugs and improvements.1 // CATEGORY:XS Pet2 // AUTHOR:Xundra Snowpaw3 // WORLD: Second Life, Opensim4 // DESCRIPTION:5 // Original Pet Quail6 // CODE78 // Revisions:9 //10 // 10/2/201111 // changed all Link messages to these constants in this file in the Quail12 // removed the YOUR_UUID and replaced it with llGetCreator()131415 // INCLUDE //16 // XS_Quail constants1718 ///// GLOBAL LINK CONSTANTS extracted from original source //////19 //20 // if you change any of these constants, change it everywhere and in a list in XS_Debug so it can print them21 //2223 integer LINK_AGE_START = 800; // when quail is rezzed and secret_number, is sent by brain to breeder, eater and informatic get booted up24 integer LINK_FOOD_CONSUME = 900; // from movement to brain when close to food, brain then consumes a random amount up to 1000025 integer LINK_FOODMINUS = 901; // xs_brain receives FOOD_CONSUME, decrement hunger (eat)27 integer LINK_HAMOUNT = 904; // hunger_amount = (integer)str,m updates the hunger amount in scripts29 integer LINK_MOVER = 911; // tell mover to rest for str seconds30 integer LINK_FOODIE_CLR = 920; // clear all food_bowl_keys and contents31 integer LINK_FOODIE = 921; // send FOOD_LOCATION coordinates to movement32 integer LINK_COLOR1 = 930; // colour133 integer LINK_COLOR2 = 931; // colour234 integer LINK_SEX = 932; // sex35 integer LINK_SHINE = 933; // shine36 integer LINK_GLOW = 934; // glow37 integer LINK_GEN = 935; // generation38 integer LINK_MAGE = 940; // xs_brain sends, xs_ager consumes, adds str to age, if older than 7 days, will grow the animal39 integer LINK_DAYTIME = 941; // xs_ager consumes, starts a timer of 86,400 seconds in xs_ager40 integer LINK_GET_AGE = 942; // get age from xs_ager and sent it on channel 94341 integer LINK_PUT_AGE = 943; // print age from xs_ager42 integer LINK_PACKAGE = 950; // look for a cryo_crate43 integer LINK_SEEK_FEMALE = 960; // MALE_BREED_CALL44 integer LINK_MALE_BREED_CALL = 961; // triggered by LINK_SEEK_FEMALE45 integer LINK_SIGNAL_ELIGIBLE = 962; // sent by female when hears LINK_MALE_BREED_CALL46 integer LINK_FEMALE_ELIGIBLE = 963; // sent when it hears in chat FEMALE_ELIGIBLE47 integer LINK_CALL_MALE = 964; // if LINK_FEMALE_ELIGIBLE && looking_for_female48 integer LINK_MALE_ON_THE_WAY = 965; // triggered by LINK_CALL_MALE49 integer LINK_FEMALE_LOCATION = 966; // female location, sends coordinates of a female50 integer LINK_RQST_BREED = 967; // sent when close enough to male/female51 integer LINK_CALL_MALE_INFO = 968; // ****** BUG ***** read, but never sent by anybody!!!!!52 // see line 557 and 636 of xs_brain which make calls and also xs_breeding which receives LINK_MALE_INFO.53 integer LINK_MALE_INFO = 969;54 integer LINK_LAY_EGG = 970; // llRezObject("XS Egg"56 integer LINK_PREGNANT = 972; // chick is preggers59 integer LINK_SOUND = 1001; // plays a sound if enabled60 integer LINK_SPECIAL = 1010; // xs_special, is str = "Normal", removes script61 integer LINK_PREGNANCY_TIME = 5000; // in seconds as str62 integer LINK_SLEEP = 7999; // disable sleep by parameter63 integer LINK_TIMER = 8000; // scan for food bowl about every 1800 seconds64 integer LINK_DIE = 9999; // death656667 ///////// end global Link constants ////////6869 // END //
Back to the Best Free Tools in Second Life and OpenSim.