server.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. $bp_letters = "";
  2. $bp_prints = "";
  3. function buildprint_findprints() {
  4. %tex_chars["0"] = "0";
  5. %tex_chars["1"] = "1";
  6. %tex_chars["2"] = "2";
  7. %tex_chars["3"] = "3";
  8. %tex_chars["4"] = "4";
  9. %tex_chars["5"] = "5";
  10. %tex_chars["6"] = "6";
  11. %tex_chars["7"] = "7";
  12. %tex_chars["8"] = "8";
  13. %tex_chars["9"] = "9";
  14. %tex_chars["A"] = "A";
  15. %tex_chars["B"] = "B";
  16. %tex_chars["C"] = "C";
  17. %tex_chars["D"] = "D";
  18. %tex_chars["E"] = "E";
  19. %tex_chars["F"] = "F";
  20. %tex_chars["G"] = "G";
  21. %tex_chars["H"] = "H";
  22. %tex_chars["I"] = "I";
  23. %tex_chars["J"] = "J";
  24. %tex_chars["K"] = "K";
  25. %tex_chars["L"] = "L";
  26. %tex_chars["M"] = "M";
  27. %tex_chars["N"] = "N";
  28. %tex_chars["O"] = "O";
  29. %tex_chars["P"] = "P";
  30. %tex_chars["Q"] = "Q";
  31. %tex_chars["R"] = "R";
  32. %tex_chars["S"] = "S";
  33. %tex_chars["T"] = "T";
  34. %tex_chars["U"] = "U";
  35. %tex_chars["V"] = "V";
  36. %tex_chars["W"] = "W";
  37. %tex_chars["X"] = "X";
  38. %tex_chars["Y"] = "Y";
  39. %tex_chars["Z"] = "Z";
  40. %tex_chars["-and" ] = "&";
  41. %tex_chars["-apostrophe" ] = "\'";
  42. %tex_chars["-asterisk" ] = "*";
  43. %tex_chars["-at" ] = "@";
  44. %tex_chars["-bang" ] = "!";
  45. %tex_chars["-caret" ] = "^";
  46. %tex_chars["-dollar" ] = "$";
  47. %tex_chars["-equals" ] = "=";
  48. %tex_chars["-greater_than"] = ">";
  49. %tex_chars["-less_than" ] = "<";
  50. %tex_chars["-minus" ] = "-";
  51. %tex_chars["-percent" ] = "%";
  52. %tex_chars["-period" ] = ".";
  53. %tex_chars["-plus" ] = "+";
  54. %tex_chars["-pound" ] = "#";
  55. %tex_chars["-qmark" ] = "?";
  56. %tex_chars["-space" ] = " ";
  57. %tex_chars["-apostrophe2" ] = "\"";
  58. %tex_chars["-colon" ] = ":";
  59. %tex_chars["-comma" ] = ",";
  60. %tex_chars["-curlybracketleft" ] = "}";
  61. %tex_chars["-curlybracketright" ] = "{";
  62. //%tex_chars["-currencysign" ] = "";
  63. //%tex_chars["-euro" ] = "";
  64. //%tex_chars["-onehalf" ] = "";
  65. //%tex_chars["-poundsymbol" ] = "";
  66. %tex_chars["-roundbracketleft" ] = ")";
  67. %tex_chars["-roundbracketright" ] = "(";
  68. %tex_chars["-slashleft" ] = "\\";
  69. %tex_chars["-slashright" ] = "/";
  70. %tex_chars["-squarebracketleft" ] = "]";
  71. %tex_chars["-squarebracketright"] = "[";
  72. %tex_chars["-tilde" ] = "~";
  73. //%tex_chars["-umlaut" ] = "";
  74. %tex_chars["-underscore" ] = "_";
  75. %tex_chars["-verticalbar" ] = "|";
  76. %tex_chars["-backtick" ] = "`";
  77. %tex_chars["-semicolon"] = ";";
  78. %tex_chars["Alcase"] = "a";
  79. %tex_chars["Blcase"] = "b";
  80. %tex_chars["Clcase"] = "c";
  81. %tex_chars["Dlcase"] = "d";
  82. %tex_chars["Elcase"] = "e";
  83. %tex_chars["Flcase"] = "f";
  84. %tex_chars["Glcase"] = "g";
  85. %tex_chars["Hlcase"] = "h";
  86. %tex_chars["Ilcase"] = "i";
  87. %tex_chars["Jlcase"] = "j";
  88. %tex_chars["Klcase"] = "k";
  89. %tex_chars["Llcase"] = "l";
  90. %tex_chars["Mlcase"] = "m";
  91. %tex_chars["Nlcase"] = "n";
  92. %tex_chars["Olcase"] = "o";
  93. %tex_chars["Plcase"] = "p";
  94. %tex_chars["Qlcase"] = "q";
  95. %tex_chars["Rlcase"] = "r";
  96. %tex_chars["Slcase"] = "s";
  97. %tex_chars["Tlcase"] = "t";
  98. %tex_chars["Ulcase"] = "u";
  99. %tex_chars["Vlcase"] = "v";
  100. %tex_chars["Wlcase"] = "w";
  101. %tex_chars["Xlcase"] = "x";
  102. %tex_chars["Ylcase"] = "y";
  103. %tex_chars["Zlcase"] = "z";
  104. %count = getNumPrintTextures();
  105. for(%print_idx = 0; %print_idx < %count; %print_idx++) {
  106. %tex = getPrintTexture(%print_idx);
  107. if(strPos(%tex, "Print_Letters_") != -1) {
  108. // strip path and .png
  109. %tex = getSubStr(%tex, 0, strLen(%tex)-4);
  110. while(%pos = strPos(%tex, "/") != -1) {
  111. %tex = getSubStr(%tex, %pos, strLen(%tex) - %pos);
  112. }
  113. // insert into list
  114. %tc = %tex_chars[%tex];
  115. if(%tc !$= "") {
  116. if(strPos($bp_letters, %tc) == -1) {
  117. $bp_letters = $bp_letters @ %tc;
  118. $bp_prints = $bp_prints SPC %print_idx;
  119. }
  120. }
  121. }
  122. }
  123. // trim leading space off $bp_prints
  124. $bp_prints = trim($bp_prints);
  125. }
  126. schedule(1, 0, buildprint_findprints);
  127. function buildprint_getprint(%letter) {
  128. %cpos = strPos($bp_letters, %letter);
  129. if(%cpos==-1) {
  130. echo("buildprint_getprint: no print for letter " @ %letter);
  131. return "";
  132. } else {
  133. return getWord($bp_prints, %cpos);
  134. }
  135. }
  136. function buildprint_place(%client, %print, %shift) {
  137. %player = %client.player;
  138. if(!isObject(%player)) return;
  139. %player.tempBrick.setPrint(%print);
  140. serverCmdPlantBrick(%client);
  141. serverCmdSuperShiftBrick(%client,
  142. getWord(%shift, 0),
  143. getWord(%shift, 1),
  144. getWord(%shift, 2)
  145. );
  146. }
  147. function buildprint_start(%client, %switchcolor) {
  148. %client.buildprint_color0 = %client.currentColor;
  149. %client.buildprint_color1 = %client.currentColor+%switchcolor;
  150. %client.buildprint_linelen = 0;
  151. }
  152. function buildprint_switchcolor(%client) {
  153. %client.buildprint_coloridx = !%client.buildprint_coloridx;
  154. %color = %client.buildprint_color[%client.buildprint_coloridx];
  155. serverCmdUseSprayCan(%client, %color);
  156. }
  157. function buildprint_buildchar(%client, %letter, %shift, %shiftvert) {
  158. if(%letter $= "\r") {
  159. }else if(%letter $= "\n") {
  160. %len = %client.buildprint_linelen;
  161. serverCmdSuperShiftBrick(%client,
  162. getWord(%shiftvert, 0) - getWord(%shift, 0)*%len,
  163. getWord(%shiftvert, 1) - getWord(%shift, 1)*%len,
  164. getWord(%shiftvert, 2) - getWord(%shift, 2)*%len
  165. );
  166. %client.buildprint_linelen = 0;
  167. buildprint_switchcolor(%client);
  168. } else if(%letter $= "\t") {
  169. %tab_len = 4 - (%client.buildprint_linelen%4);
  170. for(%i=0; %i<%tab_len; %i++) {
  171. buildprint_buildchar(%client, " ", %shift, %shiftvert);
  172. }
  173. } else {
  174. %print = buildprint_getprint(%letter);
  175. if(%print $= "") { %print = buildprint_getprint("?"); }
  176. buildprint_place(%client, %print, %shift);
  177. %client.buildprint_linelen++;
  178. }
  179. }
  180. function serverCmdBp(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20) {
  181. serverCmdBuildPrint(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20);
  182. }
  183. function serverCmdBpV(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20) {
  184. serverCmdBuildPrintVertical(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20);
  185. }
  186. function serverCmdBuildPrint(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20) {
  187. %message = trim(%m1 SPC %m2 SPC %m3 SPC %m4 SPC %m5 SPC %m6 SPC %m7 SPC %m8 SPC %m9 SPC %m10 SPC %m11 SPC %m12 SPC %m13 SPC %m14 SPC %m15 SPC %m16 SPC %m17 SPC %m18 SPC %m19 SPC %m20) @ "\n";
  188. buildprint_start(%client, 0);
  189. serverCmdBuildPrint2(%client, %message, 0);
  190. }
  191. function serverCmdBuildPrintVertical(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20) {
  192. %message = trim(%m1 SPC %m2 SPC %m3 SPC %m4 SPC %m5 SPC %m6 SPC %m7 SPC %m8 SPC %m9 SPC %m10 SPC %m11 SPC %m12 SPC %m13 SPC %m14 SPC %m15 SPC %m16 SPC %m17 SPC %m18 SPC %m19 SPC %m20) @ "\n";
  193. buildprint_start(%client, 0);
  194. serverCmdBuildPrint2(%client, %message, 1);
  195. }
  196. function serverCmdBuildPrintStart(%client, %switchcolor) {
  197. buildprint_start(%client, %switchcolor);
  198. }
  199. function serverCmdBuildPrint2(%client, %message, %topdown) {
  200. if(!isObject(%client.player) || !isObject(%client.player.tempBrick)) { return; }
  201. %vertical = getWord(%client.player.getEyeVector(), 2)>-0.5;
  202. %shift = "0 -1 0";
  203. %shiftvert = %vertical ? "0 0 -1" : "-1 0 0";
  204. if(%topdown) { %s2 = %shift; %shift = %shiftvert; %shiftvert = %s2; }
  205. //talk(%topdown @ ", " @ %shift @ ", " @ %shiftvert);
  206. %len = strLen(%message);
  207. %len_line = 0;
  208. for(%idx=0; %idx<%len; %idx++) {
  209. %letter = getSubStr(%message, %idx, 1);
  210. buildprint_buildchar(%client, %letter, %shift, %shiftvert);
  211. }
  212. }
  213. // Center print command
  214. function serverCmdCp(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20) {
  215. serverCmdCenterPrint(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20);
  216. }
  217. function serverCmdCenterPrint(%client, %m1, %m2, %m3, %m4, %m5, %m6, %m7, %m8, %m9, %m10, %m11, %m12, %m13, %m14, %m15, %m16, %m17, %m18, %m19, %m20) {
  218. %message = trim(%m1 SPC %m2 SPC %m3 SPC %m4 SPC %m5 SPC %m6 SPC %m7 SPC %m8 SPC %m9 SPC %m10 SPC %m11 SPC %m12 SPC %m13 SPC %m14 SPC %m15 SPC %m16 SPC %m17 SPC %m18 SPC %m19 SPC %m20) @ "\n";
  219. serverCmdCenterPrint2(%client, %message);
  220. }
  221. function serverCmdCenterPrint2(%client, %message) {
  222. %message = strReplace(trim(%message), "\n", "<br>");
  223. %player = %client.player;
  224. if(!isObject(%player)) { return; }
  225. %ray = containerRaycast(
  226. %player.getEyePoint(),
  227. vectorAdd(%player.getEyePoint(), vectorScale(%player.getEyeVector(), 20)),
  228. $TypeMasks::FxBrickObjectType,
  229. %player
  230. );
  231. %brick = getWord(%ray, 0);
  232. if(!isObject(%brick) || %brick.getClassName()!$="FxDtsBrick" || getTrustLevel(%brick, %client) < $TrustLevel::WrenchEvents) { return; }
  233. if(%brick.numEvents>1) { return; }
  234. if(%brick.numEvents==1) { %brick.numEvents = 0; }
  235. // %j = %brick.numEvents + 0;
  236. %j = 0;
  237. //%brick.numEvents++;
  238. %brick.numEvents = 1;
  239. %inputName = "onActivate";
  240. %targetName = "Client";
  241. %outputName = "CenterPrint";
  242. %param1 = "<font:times new roman:24><color:ffffff>" @ %message;
  243. %param2 = 3;
  244. %param3 = "";
  245. %param4 = "";
  246. // apply events
  247. %brick.implicitCancelEvents = 0;
  248. %inputIdx = inputEvent_GetInputEventIdx(%inputName);
  249. if(%inputIdx == -1) { warn("LOAD DUP: Input Event not found for name \"" @ %inputName @ "\""); return; }
  250. %targetIdx = inputEvent_GetTargetIndex("FxDtsBrick", %inputIdx, %targetName);
  251. if(%targetName == -1) {
  252. %targetClass = "FxDtsBrick";
  253. } else {
  254. %field = getField($InputEvent_TargetList["FxDtsBrick", %inputIdx], %targetIdx);
  255. %targetClass = getWord(%field, 1);
  256. }
  257. %outputIdx = outputEvent_GetOutputEventIdx(%targetClass, %outputName);
  258. if(%outputIdx == -1) { warn("LOAD DUP: Output Event not found for name \"" @ %outputName @ "\""); return; }
  259. %brick.eventEnabled[%j] = 1;
  260. %brick.eventDelay[%j] = 0;
  261. %brick.eventInput[%j] = %inputName;
  262. %brick.eventInputIdx[%j] = %inputIdx;
  263. %brick.eventTarget[%j] = %targetName;
  264. %brick.eventTargetIdx[%j] = %targetIdx;
  265. %brick.eventOutput[%j] = %outputName;
  266. %brick.eventOutputIdx[%j] = %outputIdx;
  267. %brick.eventOutputParameter[%j, 1] = %param1;
  268. %brick.eventOutputParameter[%j, 2] = %param2;
  269. %brick.eventOutputParameter[%j, 3] = %param3;
  270. %brick.eventOutputParameter[%j, 4] = %param4;
  271. %brick.eventOutputAppendClient[%j] = 1;
  272. }