xs_brain.lsl 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. // :CATEGORY:XS Pet
  2. // :NAME:XS Pet Xundra Snowpaw Original Quail
  3. // :AUTHOR:Xundra Snowpaw
  4. // :CREATED:2013-09-06
  5. // :EDITED:2013-09-18 15:39:10
  6. // :ID:989
  7. // :NUM:1472
  8. // :REV:1
  9. // :WORLD:Second Life, Opensim
  10. // :DESCRIPTION:
  11. // Original Pet Quail
  12. // :CODE:
  13. float VERSION = 0.22;
  14. string SECRET_PASSWORD = "top secret";
  15. integer SECRET_NUMBER = 99999;
  16. key YOUR_UUID = "00000000-0000-0000-0000-000000000000";
  17. integer FOOD_CHANNEL = -999191;
  18. integer ANIMAL_CHANNEL = -999192;
  19. integer EGG_CHANNEL = -999193;
  20. float FOOD_BOWL_SCAN_INTERVAL = 1800.0;
  21. integer HOME_CHANNEL = -999194;
  22. integer BOX_CHANNEL = -999195;
  23. integer ACC_CHANNEL = -999196;
  24. integer UPDATE_CHANNEL = -999197;
  25. // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)
  26. integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^31
  27. integer xtea_num_rounds = 6;
  28. list xtea_key = [0, 0, 0, 0];
  29. integer hex2int(string hex) {
  30. if(llGetSubString(hex,0,1) == "0x")
  31. return (integer)hex;
  32. if(llGetSubString(hex,0,0) == "x")
  33. return (integer)("0"+hex);
  34. return(integer)("0x"+hex);
  35. }
  36. // Convers any string to a 32 char MD5 string and then to a list of
  37. // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific
  38. // 128 bit key is generated for any string passed.
  39. list xtea_key_from_string( string str )
  40. {
  41. str = llMD5String(str,0); // Use Nonce = 0
  42. return [ hex2int(llGetSubString( str, 0, 7)),
  43. hex2int(llGetSubString( str, 8, 15)),
  44. hex2int(llGetSubString( str, 16, 23)),
  45. hex2int(llGetSubString( str, 24, 31))];
  46. }
  47. // Encipher two integers and return the result as a 12-byte string
  48. // containing two base64-encoded integers.
  49. string xtea_encipher( integer v0, integer v1 )
  50. {
  51. integer num_rounds = xtea_num_rounds;
  52. integer sum = 0;
  53. do {
  54. // LSL does not have unsigned integers, so when shifting right we
  55. // have to mask out sign-extension bits.
  56. v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));
  57. sum += XTEA_DELTA;
  58. v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));
  59. } while( num_rounds = ~-num_rounds );
  60. //return only first 6 chars to remove "=="'s and compact encrypted text.
  61. return llGetSubString(llIntegerToBase64(v0),0,5) +
  62. llGetSubString(llIntegerToBase64(v1),0,5);
  63. }
  64. // Decipher two base64-encoded integers and return the FIRST 30 BITS of
  65. // each as one 10-byte base64-encoded string.
  66. string xtea_decipher( integer v0, integer v1 )
  67. {
  68. integer num_rounds = xtea_num_rounds;
  69. integer sum = XTEA_DELTA*xtea_num_rounds;
  70. do {
  71. // LSL does not have unsigned integers, so when shifting right we
  72. // have to mask out sign-extension bits.
  73. v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));
  74. sum -= XTEA_DELTA;
  75. v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));
  76. } while ( num_rounds = ~-num_rounds );
  77. return llGetSubString(llIntegerToBase64(v0), 0, 4) +
  78. llGetSubString(llIntegerToBase64(v1), 0, 4);
  79. }
  80. // Encrypt a full string using XTEA.
  81. string xtea_encrypt_string( string str )
  82. {
  83. // encode string
  84. str = llStringToBase64(str);
  85. // remove trailing =s so we can do our own 0 padding
  86. integer i = llSubStringIndex( str, "=" );
  87. if ( i != -1 )
  88. str = llDeleteSubString( str, i, -1 );
  89. // we don't want to process padding, so get length before adding it
  90. integer len = llStringLength(str);
  91. // zero pad
  92. str += "AAAAAAAAAA=";
  93. string result;
  94. i = 0;
  95. do {
  96. // encipher 30 (5*6) bits at a time.
  97. result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));
  98. i+=10;
  99. } while ( i < len );
  100. return result;
  101. }
  102. // Decrypt a full string using XTEA
  103. string xtea_decrypt_string( string str ) {
  104. integer len = llStringLength(str);
  105. integer i=0;
  106. string result;
  107. //llOwnerSay(str);
  108. do {
  109. integer v0;
  110. integer v1;
  111. v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");
  112. i+= 6;
  113. v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");
  114. i+= 6;
  115. result += xtea_decipher(v0, v1);
  116. } while ( i < len );
  117. // Replace multiple trailing zeroes with a single one
  118. i = llStringLength(result) - 1;
  119. while ( llGetSubString(result, i - 1, i) == "AA" ){
  120. result = llDeleteSubString(result, i, i);
  121. i--;
  122. }
  123. i = llStringLength(result) - 1;
  124. // while (llGetSubString(result, i, i + 1) == "A" ) {
  125. // i--;
  126. // }
  127. result = llGetSubString(result, 0, i+1);
  128. i = llStringLength(result);
  129. integer mod = i%4; //Depending on encoded length diffrent appends are needed
  130. if(mod == 1) result += "A==";
  131. else if(mod == 2 ) result += "==";
  132. else if(mod == 3) result += "=";
  133. return llBase64ToString(result);
  134. }
  135. integer food_left;
  136. integer random_number;
  137. integer random_number2;
  138. //list food_bowl_keys;
  139. //list food_bowl_locations;
  140. integer hunger_amount;
  141. vector colour1;
  142. vector colour2;
  143. integer sex;
  144. integer shine;
  145. float glow;
  146. integer gen;
  147. integer age;
  148. vector mcolour1;
  149. vector mcolour2;
  150. integer mshine;
  151. float mglow;
  152. integer mgen;
  153. vector home_loc;
  154. key new_egg_key;
  155. integer glow_gene;
  156. string special;
  157. integer mglow_gene;
  158. integer locked;
  159. integer pregnancy_time;
  160. default
  161. {
  162. state_entry()
  163. {
  164. if (llGetOwner() != YOUR_UUID) {
  165. // someone not the creator reset the script. Thats naughty.
  166. state dead;
  167. }
  168. llSetText("", <1,1,1>, 1.0);
  169. random_number = 0;
  170. random_number2 = 0;
  171. hunger_amount = 0;
  172. locked = 0;
  173. xtea_key = xtea_key_from_string(SECRET_PASSWORD);
  174. llListen(ANIMAL_CHANNEL, "", "", "");
  175. }
  176. changed(integer change)
  177. {
  178. if (change & CHANGED_ALLOWED_DROP) {
  179. if (llGetInventoryType("Quail") != INVENTORY_NONE && llGetInventoryType("XS Egg") != INVENTORY_NONE) {
  180. llAllowInventoryDrop(FALSE);
  181. }
  182. }
  183. if (change & CHANGED_INVENTORY) {
  184. if (llGetOwner() != YOUR_UUID) {
  185. integer inventory_count = llGetInventoryNumber(INVENTORY_ALL);
  186. integer extras = 3;
  187. if (llGetInventoryType("xs_ager") == INVENTORY_NONE || !llGetScriptState("xs_ager")) {
  188. state dead;
  189. }
  190. if (llGetInventoryType("xs_infomatic") == INVENTORY_NONE || !llGetScriptState("xs_infomatic")) {
  191. state dead;
  192. }
  193. if (llGetInventoryType("xs_breeding") == INVENTORY_NONE || !llGetScriptState("xs_breeding")) {
  194. state dead;
  195. }
  196. if (llGetInventoryType("xs_eater") == INVENTORY_NONE || !llGetScriptState("xs_eater")) {
  197. state dead;
  198. }
  199. if (llGetInventoryType("xs_movement") == INVENTORY_NONE || !llGetScriptState("xs_movement")) {
  200. state dead;
  201. }
  202. if (llGetInventoryType("bird_sound") == INVENTORY_NONE) {
  203. state dead;
  204. }
  205. if (llGetInventoryType("xs_special") == INVENTORY_NONE) {
  206. extras--;
  207. }
  208. if (llGetInventoryType("XS Egg") == INVENTORY_NONE) {
  209. extras--;
  210. }
  211. if (llGetInventoryType("Quail") == INVENTORY_NONE) {
  212. extras--;
  213. }
  214. if (llGetInventoryType("XS Home Object") == INVENTORY_NONE) {
  215. state dead;
  216. }
  217. if (8 + extras != inventory_count) {
  218. state dead;
  219. }
  220. }
  221. }
  222. }
  223. timer()
  224. {
  225. llMessageLinked(LINK_SET, 920, "", "");
  226. // llWhisper(0, "Scanning for food bowls.");
  227. random_number = (integer)(llFrand(10000.0) + 1);
  228. llSay(FOOD_CHANNEL, xtea_encrypt_string("XSPET^FOOD_LOCATION^" + (string)random_number + "^" + (string)llGetKey()));
  229. llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));
  230. }
  231. listen(integer channel, string name, key id, string message)
  232. {
  233. if (channel == ANIMAL_CHANNEL) {
  234. list data = llParseString2List(xtea_decrypt_string(message), ["^"], []);
  235. if (llList2String(data, 0) == "XSPET") {
  236. if (llList2String(data, 1) == "FOOD_LOCATION") {
  237. llMessageLinked(LINK_SET, 921, llList2String(data, 3), id);
  238. } else
  239. if (llList2String(data, 1) == "FOOD_CONSUME") {
  240. if (llList2Integer(data, 2) == random_number2 && llList2Key(data, 3) == llGetKey()) {
  241. hunger_amount--;
  242. llMessageLinked(LINK_SET, 901, "", "");
  243. random_number2 = 0;
  244. if (llList2Integer(data, 4) == 1 && glow_gene < 10) {
  245. glow_gene ++;
  246. }
  247. }
  248. } else
  249. if (llList2String(data, 1) == "HOME_LOCATION") {
  250. vector n_home_loc = (vector)llList2String(data, 2);
  251. float home_dis = llList2Float(data, 3);
  252. vector my_loc = llGetPos();
  253. // llOwnerSay((string)llVecDist(home_loc, my_loc) + " " + (string)my_loc + (string)home_loc + (string)home_dis + llList2String(data, 2));
  254. if (llVecDist(n_home_loc, my_loc) <= home_dis && llFabs(llFabs(n_home_loc.z) - llFabs(my_loc.z)) < 1) {
  255. if (llGetOwnerKey(id) == llGetOwner()) {
  256. home_loc = n_home_loc;
  257. llMessageLinked(LINK_SET, 910, (string)n_home_loc + "^" + (string)home_dis, "");
  258. }
  259. }
  260. } else
  261. if (llList2String(data, 1) == "CONFIG" && llList2Key(data, 2) == llGetKey()) {
  262. colour1 = (vector)llList2String(data, 3);;
  263. colour2 = (vector)llList2String(data, 4);
  264. sex = llList2Integer(data, 5);
  265. shine = llList2Integer(data, 6);
  266. glow = llList2Float(data, 7);
  267. gen = llList2Integer(data, 8);
  268. integer mage = llList2Integer(data, 9);
  269. integer hamount = llList2Integer(data, 10);
  270. string myname = llList2String(data, 11);
  271. glow_gene = llList2Integer(data, 12);
  272. special = llList2String(data, 13);
  273. llSetLinkPrimitiveParams(5, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  274. llSetLinkPrimitiveParams(1, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  275. // llSetLinkColor(8, colour1, ALL_SIDES);
  276. // llSetLinkColor(1, colour1, ALL_SIDES);
  277. llSetLinkPrimitiveParams(7, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  278. llSetLinkPrimitiveParams(4, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  279. llSetLinkPrimitiveParams(9, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  280. // llSetLinkColor(3, colour2, ALL_SIDES);
  281. // llSetLinkColor(2, colour2, ALL_SIDES);
  282. // llSetLinkColor(7, colour2, ALL_SIDES);
  283. llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));
  284. llMessageLinked(LINK_SET, 930, (string)colour1, "");
  285. llMessageLinked(LINK_SET, 931, (string)colour2, "");
  286. llMessageLinked(LINK_SET, 932, (string)sex, "");
  287. llMessageLinked(LINK_SET, 933, (string)shine, "");
  288. llMessageLinked(LINK_SET, 934, (string)glow, "");
  289. llMessageLinked(LINK_SET, 935, (string)gen, "");
  290. llMessageLinked(LINK_SET, 940, (string)mage, "");
  291. if (hamount > 0) {
  292. llMessageLinked(LINK_SET, 904, (string)hamount, "");
  293. }
  294. if (name != "Quail") {
  295. llSetObjectName(myname);
  296. }
  297. llSetObjectDesc("XS Quail v" + (string)VERSION + " (c) 2010 Xundra Snowpaw");
  298. llMessageLinked(LINK_SET, 1010, special, "");
  299. llMessageLinked(LINK_SET, 941, "", "");
  300. llSay(HOME_CHANNEL, "XSPET_PING_HOME");
  301. llSetText("", <1,1,1>, 1.0);
  302. } else
  303. if (llList2String(data, 1) == "UPDATE_CONFIG" && llList2Key(data, 2) == llGetKey()) {
  304. colour1 = (vector)llList2String(data, 3);;
  305. colour2 = (vector)llList2String(data, 4);
  306. sex = llList2Integer(data, 5);
  307. shine = llList2Integer(data, 6);
  308. glow = llList2Float(data, 7);
  309. gen = llList2Integer(data, 8);
  310. integer mage = llList2Integer(data, 9);
  311. integer hamount = llList2Integer(data, 10);
  312. string myname = llList2String(data, 11);
  313. glow_gene = llList2Integer(data, 12);
  314. special = llList2String(data, 13);
  315. mcolour1 = (vector)llList2String(data, 14);
  316. mcolour2 = (vector)llList2String(data, 15);
  317. mshine = llList2Integer(data, 16);
  318. mglow = llList2Float(data, 17);
  319. mgen = llList2Integer(data, 18);
  320. mglow_gene = llList2Integer(data, 19);
  321. pregnancy_time = llList2Integer(data, 20);
  322. llSetLinkPrimitiveParams(5, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  323. llSetLinkPrimitiveParams(1, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  324. // llSetLinkColor(8, colour1, ALL_SIDES);
  325. // llSetLinkColor(1, colour1, ALL_SIDES);
  326. llSetLinkPrimitiveParams(7, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  327. llSetLinkPrimitiveParams(4, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  328. llSetLinkPrimitiveParams(9, [PRIM_COLOR, ALL_SIDES, colour2, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE, PRIM_GLOW, ALL_SIDES, glow]);
  329. // llSetLinkColor(3, colour2, ALL_SIDES);
  330. // llSetLinkColor(2, colour2, ALL_SIDES);
  331. // llSetLinkColor(7, colour2, ALL_SIDES);
  332. llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));
  333. llMessageLinked(LINK_SET, 930, (string)colour1, "");
  334. llMessageLinked(LINK_SET, 931, (string)colour2, "");
  335. if (sex == 1) {
  336. llMessageLinked(LINK_SET, 932, (string)sex, "");
  337. } else {
  338. llMessageLinked(LINK_SET, 5000, (string)pregnancy_time, "");
  339. }
  340. llMessageLinked(LINK_SET, 933, (string)shine, "");
  341. llMessageLinked(LINK_SET, 934, (string)glow, "");
  342. llMessageLinked(LINK_SET, 935, (string)gen, "");
  343. llMessageLinked(LINK_SET, 940, (string)mage, "");
  344. if (hamount > 0) {
  345. llMessageLinked(LINK_SET, 904, (string)hamount, "");
  346. }
  347. if (name != "Quail") {
  348. llSetObjectName(myname);
  349. }
  350. llSetObjectDesc("XS Quail v" + (string)VERSION + " (c) 2010 Xundra Snowpaw");
  351. llMessageLinked(LINK_SET, 1010, special, "");
  352. llMessageLinked(LINK_SET, 941, "", "");
  353. llSay(HOME_CHANNEL, "XSPET_PING_HOME");
  354. llSetText("", <1,1,1>, 1.0);
  355. } else
  356. if (llList2String(data, 1) == "CRATE_PONG" && llList2Key(data, 2) == llGetKey()) {
  357. if (llList2Float(data, 3) >= VERSION && locked == 0) {
  358. locked = 1;
  359. 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));
  360. }
  361. } else
  362. if (llList2String(data, 1) == "CRATE_DIE" && llList2Key(data, 2) == llGetKey()) {
  363. llDie();
  364. } else
  365. if (llList2String(data, 1) == "MALE_BREED_CALL") {
  366. llMessageLinked(LINK_SET, 961, "", "");
  367. } else
  368. if (llList2String(data, 1) == "FEMALE_ELIGIBLE" && home_loc == (vector)llList2String(data, 2)) {
  369. llMessageLinked(LINK_SET, 963, "", id);
  370. } else
  371. if (llList2String(data, 1) == "MALE_ON_THE_WAY" && llList2Key(data, 2) == llGetKey()) {
  372. llMessageLinked(LINK_SET, 965, "", id);
  373. llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^FEMALE_LOC^" + (string)id + "^" + (string)llGetPos()));
  374. } else
  375. if (llList2String(data, 1) == "FEMALE_LOC" && llList2String(data, 2) == llGetKey())
  376. {
  377. llMessageLinked(LINK_SET, 966, llList2String(data, 3), "");
  378. } else
  379. if (llList2String(data, 1) == "MALE_INFO" && llList2Key(data, 2) == llGetKey()){
  380. // pregnant
  381. mcolour1 = (vector)llList2String(data, 3);
  382. mcolour2 = (vector)llList2String(data, 4);
  383. mshine = llList2Integer(data, 5);
  384. mglow = llList2Float(data, 6);
  385. mgen = llList2Integer(data, 7);
  386. mglow_gene = llList2Integer(data, 8);
  387. pregnancy_time = llGetUnixTime();
  388. llMessageLinked(LINK_SET, 972, "", "");
  389. } else
  390. if (llList2String(data, 1) == "BREEDING_FAIL" && llList2String(data, 2) == llGetKey())
  391. {
  392. llMessageLinked(LINK_SET, 969, "", "");
  393. } else
  394. if (llList2String(data, 1) == "EGG_READY" && id == new_egg_key)
  395. {
  396. llGiveInventory(id, "XS Egg");
  397. llGiveInventory(id, "Quail");
  398. 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));
  399. } else
  400. if (llList2String(data, 1) == "SHINE_GOO" && llList2String(data, 2) == llGetKey()) {
  401. if (shine == 0) {
  402. shine = 1;
  403. llMessageLinked(LINK_SET, 933, (string)shine, "");
  404. llSay(ACC_CHANNEL, xtea_encrypt_string("XSPET^" + (string)id + "^SHINE_GOO_DIE"));
  405. llSetLinkPrimitiveParams(5, [PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);
  406. llSetLinkPrimitiveParams(1, [PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);
  407. // llSetLinkColor(8, colour1, ALL_SIDES);
  408. // llSetLinkColor(1, colour1, ALL_SIDES);
  409. llSetLinkPrimitiveParams(7, [PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);
  410. llSetLinkPrimitiveParams(4, [PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);
  411. llSetLinkPrimitiveParams(9, [PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);
  412. if (sex == 1) {
  413. llWhisper(0, "Look out ladies, Mr Slick has arrived!");
  414. } else {
  415. llWhisper(0, "Look out gentlemen! Miss Slick has arrived!");
  416. }
  417. } else {
  418. llWhisper(0, "I'm already shiny!");
  419. llSay(ACC_CHANNEL, xtea_encrypt_string("XSPET^" + (string)id + "^SHINE_GOO_FAIL"));
  420. }
  421. } else
  422. if (llList2String(data, 1) == "DIE" && llList2String(data, 2) == llGetKey()) {
  423. llDie();
  424. } else
  425. if (llList2String(data, 1) == "VERSION" && VERSION < llList2Float(data, 2) && llGetOwnerKey(id) == llGetOwner()) {
  426. llShout(UPDATE_CHANNEL, "VERSION^" + (string)VERSION);
  427. } else
  428. if (llList2String(data, 1) == "UPDATE" && llList2String(data, 2) == llGetKey() && llGetOwnerKey(id) == llGetOwner()) {
  429. state update;
  430. }
  431. }
  432. }
  433. }
  434. link_message(integer sender, integer num, string str, key id)
  435. {
  436. if (num == 903 || num == 904) {
  437. hunger_amount = (integer)str;
  438. if (hunger_amount > 30) {
  439. state dead;
  440. }
  441. } else
  442. if (num == 900) {
  443. random_number2 = (integer)(llFrand(10000.0) + 1);
  444. llSay(FOOD_CHANNEL, xtea_encrypt_string("XSPET^FOOD_CONSUME^" + (string)id + "^" + (string)random_number2 + "^" + (string)llGetKey()));
  445. } else
  446. if (num == 940) {
  447. age += (integer)str;
  448. } else
  449. if (num == 950) {
  450. llWhisper(0, "Looking for a cryo-crate...");
  451. llSay(BOX_CHANNEL, xtea_encrypt_string("XSPET^" + (string)llGetKey() + "^CRATE_PING^" + (string)VERSION));
  452. } else
  453. if (num == 960) {
  454. llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^MALE_BREED_CALL^" + (string)llGetKey()));
  455. } else
  456. if (num == 962) {
  457. llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^FEMALE_ELIGIBLE^" + (string)home_loc));
  458. } else
  459. if (num == 964) {
  460. llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^MALE_ON_THE_WAY^" + (string)id));
  461. } else
  462. if (num == 968) {
  463. llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^MALE_INFO^" + (string)id + "^" + (string)colour1 + "^" + (string)colour2 + "^" + (string)shine + "^" + (string)glow + "^" + (string)gen + "^" + (string)glow_gene));
  464. llMessageLinked(LINK_SET, 969, "", "");
  465. } else
  466. if (num == 970) {
  467. // lay an egg
  468. pregnancy_time = 0;
  469. llRezObject("XS Egg", llGetPos() + <0.0, 0.0, 0.25>, ZERO_VECTOR, ZERO_ROTATION, SECRET_NUMBER);
  470. } else
  471. if (num == 971) {
  472. llSay(ANIMAL_CHANNEL, xtea_encrypt_string("XSPET^BREEDING_FAIL^" + (string)id));
  473. pregnancy_time = 0;
  474. } else
  475. if (num == 990) {
  476. llSetLinkPrimitiveParams(3, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);
  477. llSetLinkPrimitiveParams(8, [PRIM_COLOR, ALL_SIDES, colour1, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, shine, PRIM_BUMP_NONE]);
  478. } else
  479. if (num == 991) {
  480. llSetLinkPrimitiveParams(3, [PRIM_COLOR, ALL_SIDES, <0,0,0>, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, 1, PRIM_BUMP_NONE]);
  481. llSetLinkPrimitiveParams(8, [PRIM_COLOR, ALL_SIDES, <0,0,0>, 1.0, PRIM_BUMP_SHINY, ALL_SIDES, 1, PRIM_BUMP_NONE]);
  482. } else
  483. if (num == 9999) {
  484. state dead;
  485. } else
  486. if (num == 8000) {
  487. llSetTimerEvent(llFrand(60.0) + (FOOD_BOWL_SCAN_INTERVAL - 30.0));
  488. }
  489. }
  490. object_rez(key id)
  491. {
  492. new_egg_key = id;
  493. }
  494. on_rez(integer param)
  495. {
  496. if (param == SECRET_NUMBER) {
  497. llSetText("Rezzing...", <1,0,0>, 1.0);
  498. llMessageLinked(LINK_SET, 800, "", "");
  499. llSleep(5.0);
  500. if (llGetOwner() != YOUR_UUID) {
  501. llAllowInventoryDrop(TRUE);
  502. }
  503. llSay(EGG_CHANNEL, xtea_encrypt_string("XSPET^READY^" + (string)llGetKey() + "^XSPET"));
  504. llSay(BOX_CHANNEL, xtea_encrypt_string("XSPET^READY^" + (string)llGetKey() + "^XSPET"));
  505. } else {
  506. llOwnerSay("I died in your inventory, please use a cryo-crate next time.");
  507. state dead;
  508. }
  509. }
  510. }
  511. state dead
  512. {
  513. state_entry()
  514. {
  515. llSetText("Dead", <1,0,0>, 1.0);
  516. llRemoveInventory("xs_ager");
  517. llRemoveInventory("xs_breeding");
  518. llRemoveInventory("xs_eater");
  519. llRemoveInventory("xs_infomatic");
  520. llRemoveInventory("xs_movement");
  521. if (llGetInventoryType("xs_special") != INVENTORY_NONE) {
  522. llRemoveInventory("xs_special");
  523. }
  524. llListen(ANIMAL_CHANNEL, "", "", "");
  525. }
  526. touch_start(integer number)
  527. {
  528. llWhisper(0, "I've died. You could re-animate me with a jar of Xtra Strong Mojo");
  529. if (llDetectedKey(0) == llGetOwner()) {
  530. 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));
  531. }
  532. }
  533. listen(integer channel, string name, key id, string message) {
  534. list data = llParseString2List(xtea_decrypt_string(message), ["^"], []);
  535. if (llList2String(data, 0) == "XSPET") {
  536. if (llList2String(data, 1) == "STRONG_MOJO_DIE" && llList2Key(data, 2) == llGetKey()) {
  537. llDie();
  538. }
  539. }
  540. }
  541. }
  542. state update
  543. {
  544. state_entry()
  545. {
  546. llSetText("Updating.", <1,0,0>, 1.0);
  547. llRemoveInventory("Quail");
  548. llRemoveInventory("XS Egg");
  549. llAllowInventoryDrop(TRUE);
  550. llShout(UPDATE_CHANNEL, "UPDATE_READY");
  551. }
  552. changed(integer change)
  553. {
  554. if (change & CHANGED_ALLOWED_DROP) {
  555. if (llGetInventoryType("Quail") != INVENTORY_NONE && llGetInventoryType("XS Egg") != INVENTORY_NONE) {
  556. llAllowInventoryDrop(FALSE);
  557. llRezObject("Quail", llGetPos() + <0.0, 0.0, 0.25>, ZERO_VECTOR, ZERO_ROTATION, SECRET_NUMBER);
  558. }
  559. }
  560. }
  561. object_rez(key id)
  562. {
  563. llListen(BOX_CHANNEL, "", id, "");
  564. }
  565. listen(integer channel, string name, key id, string msg)
  566. {
  567. if (channel == BOX_CHANNEL) {
  568. list data = llParseString2List(xtea_decrypt_string(msg), ["^"], []);
  569. if (llList2String(data, 0) == "XSPET" && llList2String(data, 1) == "READY") {
  570. llGiveInventory(id, "XS Egg");
  571. llGiveInventory(id, "Quail");
  572. 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));
  573. llDie();
  574. }
  575. }
  576. }
  577. }