xs Debug 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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:11
  6. // :ID:989
  7. // :NUM:1478
  8. // :REV:1
  9. // :WORLD:Second Life, Opensim
  10. // :DESCRIPTION:
  11. // Original Pet Quail
  12. // :CODE:
  13. integer FOOD_CHANNEL = -999191;
  14. integer ANIMAL_CHANNEL = -999192;
  15. integer HOME_CHANNEL = -999194;
  16. integer BOX_CHANNEL = -999195;
  17. integer ACC_CHANNEL = -999196;
  18. integer UPDATE_CHANNEL = -999197;
  19. integer EGG_CHANNEL = -999193;
  20. list channels = [
  21. "FOOD_CHANNEL" , -999191,
  22. "ANIMAL_CHANNEL" , -999192,
  23. "HOME_CHANNEL" , -999194,
  24. "BOX_CHANNEL" , -999195,
  25. "ACC_CHANNEL" , -999196,
  26. "UPDATE_CHANNEL" , -999197,
  27. "EGG_CHANNEL" , -999193
  28. ];
  29. list messages = [
  30. " LINK_AGE_START " , 800,
  31. " LINK_FOOD_CONSUME " , 900,
  32. " LINK_FOODMINUS " , 901,
  33. " LINK_HUNGRY " , 903,
  34. " LINK_HAMOUNT " , 904,
  35. " LINK_SET_HOME " , 910,
  36. " LINK_MOVER " , 911,
  37. " LINK_FOODIE_CLR " , 920,
  38. " LINK_FOODIE " , 921,
  39. " LINK_COLOR1 " , 930,
  40. " LINK_COLOR2 " , 931,
  41. " LINK_SEX " , 932,
  42. " LINK_SHINE " , 933,
  43. " LINK_GLOW " , 934,
  44. " LINK_GEN " , 935,
  45. " LINK_MAGE " , 940,
  46. " LINK_DAYTIME " , 941,
  47. " LINK_GET_AGE " , 942,
  48. " LINK_PUT_AGE " , 943,
  49. " LINK_PACKAGE " , 950,
  50. " LINK_SEEK_FEMALE " , 960,
  51. " LINK_MALE_BREED_CALL " , 961,
  52. " LINK_SIGNAL_ELIGIBLE" , 962,
  53. " LINK_FEMALE_ELIGIBLE " , 963,
  54. " LINK_CALL_MALE " , 964,
  55. " LINK_MALE_ON_THE_WAY " , 965,
  56. " LINK_FEMALE_LOCATION " , 966,
  57. " LINK_CALL_MALE_INFO " , 968,
  58. " LINK_RQST_BREED ", 967,
  59. " LINK_MALE_INFO " , 969,
  60. " LINK_LAY_EGG " , 970,
  61. " LINK_BREED_FAIL " , 971,
  62. " LINK_PREGNANT " , 972,
  63. " LINK_SLEEPING " , 990,
  64. " LINK_UNSLEEPING " , 991,
  65. " LINK_SOUND " , 1001,
  66. " LINK_SPECIAL " , 1010,
  67. " LINK_PREGNANCY_TIME " , 5000,
  68. " LINK_SLEEP " , 7999,
  69. " LINK_TIMER " , 8000,
  70. " LINK_DIE " , 9999
  71. ];
  72. string SECRET_PASSWORD = "top secret";
  73. integer SECRET_NUMBER = 99999;
  74. // DON'T CHANGE THE FOLLOWING! (Unless you know what you are doing!)
  75. integer XTEA_DELTA = 0x9E3779B9; // (sqrt(5) - 1) * 2^31
  76. integer xtea_num_rounds = 6;
  77. list xtea_key = [0, 0, 0, 0];
  78. integer hex2int(string hex) {
  79. 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. }
  85. // Convers any string to a 32 char MD5 string and then to a list of
  86. // 4 * 32 bit integers = 128 bit Key. MD5 ensures always a specific
  87. // 128 bit key is generated for any string passed.
  88. list xtea_key_from_string( string str )
  89. {
  90. str = llMD5String(str,0); // Use Nonce = 0
  91. return [ hex2int(llGetSubString( str, 0, 7)),
  92. hex2int(llGetSubString( str, 8, 15)),
  93. hex2int(llGetSubString( str, 16, 23)),
  94. hex2int(llGetSubString( str, 24, 31))];
  95. }
  96. // Encipher two integers and return the result as a 12-byte string
  97. // containing two base64-encoded integers.
  98. string xtea_encipher( integer v0, integer v1 )
  99. {
  100. integer num_rounds = xtea_num_rounds;
  101. integer sum = 0;
  102. do {
  103. // LSL does not have unsigned integers, so when shifting right we
  104. // have to mask out sign-extension bits.
  105. v0 += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));
  106. sum += XTEA_DELTA;
  107. v1 += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));
  108. } while( num_rounds = ~-num_rounds );
  109. //return only first 6 chars to remove "=="'s and compact encrypted text.
  110. return llGetSubString(llIntegerToBase64(v0),0,5) +
  111. llGetSubString(llIntegerToBase64(v1),0,5);
  112. }
  113. // Decipher two base64-encoded integers and return the FIRST 30 BITS of
  114. // each as one 10-byte base64-encoded string.
  115. string xtea_decipher( integer v0, integer v1 )
  116. {
  117. integer num_rounds = xtea_num_rounds;
  118. integer sum = XTEA_DELTA*xtea_num_rounds;
  119. do {
  120. // LSL does not have unsigned integers, so when shifting right we
  121. // have to mask out sign-extension bits.
  122. v1 -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));
  123. sum -= XTEA_DELTA;
  124. v0 -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));
  125. } while ( num_rounds = ~-num_rounds );
  126. return llGetSubString(llIntegerToBase64(v0), 0, 4) +
  127. llGetSubString(llIntegerToBase64(v1), 0, 4);
  128. }
  129. // Encrypt a full string using XTEA.
  130. string xtea_encrypt_string( string str )
  131. {
  132. // encode string
  133. str = llStringToBase64(str);
  134. // remove trailing =s so we can do our own 0 padding
  135. integer i = llSubStringIndex( str, "=" );
  136. if ( i != -1 )
  137. str = llDeleteSubString( str, i, -1 );
  138. // we don't want to process padding, so get length before adding it
  139. integer len = llStringLength(str);
  140. // zero pad
  141. str += "AAAAAAAAAA=";
  142. string result;
  143. i = 0;
  144. do {
  145. // encipher 30 (5*6) bits at a time.
  146. result += xtea_encipher(llBase64ToInteger(llGetSubString(str, i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));
  147. i+=10;
  148. } while ( i < len );
  149. return result;
  150. }
  151. // Decrypt a full string using XTEA
  152. string xtea_decrypt_string( string str ) {
  153. integer len = llStringLength(str);
  154. integer i=0;
  155. string result;
  156. //llOwnerSay(str);
  157. do {
  158. integer v0;
  159. integer v1;
  160. v0 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");
  161. i+= 6;
  162. v1 = llBase64ToInteger(llGetSubString(str, i, i + 5) + "==");
  163. i+= 6;
  164. result += xtea_decipher(v0, v1);
  165. } while ( i < len );
  166. // Replace multiple trailing zeroes with a single one
  167. i = llStringLength(result) - 1;
  168. while ( llGetSubString(result, i - 1, i) == "AA" ){
  169. result = llDeleteSubString(result, i, i);
  170. i--;
  171. }
  172. i = llStringLength(result) - 1;
  173. // while (llGetSubString(result, i, i + 1) == "A" ) {
  174. // i--;
  175. // }
  176. result = llGetSubString(result, 0, i+1);
  177. i = llStringLength(result);
  178. integer mod = i%4; //Depending on encoded length diffrent appends are needed
  179. if(mod == 1) result += "A==";
  180. else if(mod == 2 ) result += "==";
  181. else if(mod == 3) result += "=";
  182. return llBase64ToString(result);
  183. }
  184. default
  185. {
  186. state_entry()
  187. {
  188. xtea_key = xtea_key_from_string(SECRET_PASSWORD);
  189. llListen(FOOD_CHANNEL,"","","");
  190. llListen(ANIMAL_CHANNEL,"","","");
  191. llListen(HOME_CHANNEL,"","","");
  192. llListen(BOX_CHANNEL,"","","");
  193. llListen(ACC_CHANNEL,"","","");
  194. llListen(UPDATE_CHANNEL,"","","");
  195. llListen(EGG_CHANNEL,"","","");
  196. }
  197. listen(integer channel,string name, key id, string message)
  198. {
  199. integer index = llListFindList(channels,[channel]); // see if a valid channel
  200. string aname = "unkown";
  201. if (index >= 0)
  202. {
  203. aname = llList2String(channels,index-1);
  204. }
  205. llOwnerSay(llGetObjectName() + ":channel:" + aname + ":" + xtea_decrypt_string(message) );
  206. }
  207. link_message(integer sender_num, integer num, string str, key id)
  208. {
  209. integer index = llListFindList(messages,[num]); // see if a valid channel
  210. string aname = "unkown";
  211. if (index >= 0)
  212. {
  213. aname = llList2String(messages,index-1);
  214. }
  215. llOwnerSay(llGetObjectName() + ":" + aname + " : string:" + str + " : key:" + (string) id);
  216. }
  217. touch_start(integer total_number)
  218. {
  219. llSay(0, "Touched.");
  220. }
  221. }