halma.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. rankingtable = "halmaranks";
  2. game_short = "halma";
  3. game_tab = "§eHalma";
  4. teams = map.new();
  5. pointed_block = block.get(loc.new(gamesworld, 0, 0, 0)); //Default-Wert, um Error zu verhindern
  6. gamename = "§eHalma";
  7. minigame.setSpecificLobbyHandling(true);
  8. minigame.setPlayerResetInCore(false);
  9. air_mat = material.getAir();
  10. minigame.initStart();
  11. goto("simplelobby");
  12. @specificLobbyHandling
  13. if(event == "minigame_join") {
  14. living.cleareffects(player);
  15. living.setHealth(player, 20);
  16. player.setHunger(player, 20);
  17. player.setSaturation(player, 5);
  18. player.clearInventory(player);
  19. }
  20. return;
  21. @finalstart
  22. player_list = minigame.getPlayers(script_id);
  23. minigame.speakAll(gamename, "The game has started.");
  24. //Sechseck leeren
  25. iter = iterator(center_locs);
  26. while(hasNext(iter)) {
  27. entry = next(iter);
  28. block.setMaterial(entry, air_mat);
  29. }
  30. //Start-Felder leeren
  31. map_iter = map.iterator(start_locs);
  32. while(hasNext(map_iter)) {
  33. list = map.getValue(next(map_iter));
  34. iter = iterator(list);
  35. while(hasNext(iter)) {
  36. entry = next(iter);
  37. block.setMaterial(entry, air_mat);
  38. }
  39. }
  40. //Ziel-Felder leeren
  41. map_iter = map.iterator(aim_locs);
  42. while(hasNext(map_iter)) {
  43. list = map.getValue(next(map_iter));
  44. iter = iterator(list);
  45. while(hasNext(iter)) {
  46. entry = next(iter);
  47. block.setMaterial(entry, air_mat);
  48. }
  49. }
  50. for(i = 0; i < list.getSize(player_list); i++) {
  51. player = player.get(list.getIndex(player_list, i));
  52. entity.teleport(player, spawn_loc);
  53. player.setGamemode(player, "SURVIVAL");
  54. player.setFly(player, true);
  55. //Team-Zuweisung
  56. map.add(teams, player, i);
  57. //Start-Feld bestücken
  58. list = map.get(start_locs, i);
  59. banner_type = map.get(tokens_map, i);
  60. rotation = map.get(rotations_map, i);
  61. iter = iterator(list);
  62. while(hasNext(iter)) {
  63. entry = next(iter);
  64. block.setData(entry, read.blockData(string.concat(banner_type, "[rotation=", rotation, "]")));
  65. }
  66. color = map.get(colors_map, i);
  67. minigame.setTabName(player, game_tab, color);
  68. }
  69. next_player = player.get(list.getIndex(player_list, math.random(0, list.getSize(player_list) - 1)));
  70. setNextPlayer(next_player);
  71. jump_moves = false;
  72. @wait
  73. wait();
  74. if(event == "entity_damage") {
  75. if(!isPlayer(entity)) {
  76. goto("wait");
  77. }
  78. player = entity;
  79. }
  80. if(event == "custom_command") {
  81. if(!isPlayer(sender)) {
  82. goto("wait");
  83. }
  84. player = sender;
  85. }
  86. if(player.hasMinigameId(player, script_id)) {
  87. ignoreGoto(event);
  88. }
  89. goto("wait");
  90. @block_click
  91. if(slot.isOffHand(hand)) {
  92. goto("wait");
  93. }
  94. if(action != "RIGHT_CLICK_BLOCK") {
  95. goto("wait");
  96. }
  97. //Korrekter Spieler?
  98. if(player != next_player) {
  99. msg.prefix(player, gamename, "It´s not your turn.");
  100. goto("wait");
  101. }
  102. //Spielfigur ausgewählt?
  103. block_type = block.getType(block);
  104. block_loc = block.getLocation(block);
  105. if(map.contains(tokens_map2, block_type)) {
  106. //Spielfigur der eigenen Farbe ausgewählt?
  107. if(map.get(tokens_map2, block_type) == map.get(teams, player)) {
  108. //Zuletzt ausgewählte Spielfigur der eigenen Farbe speichern, wenn nicht bereits gezogen (gesprungen) wurde
  109. if(jump_moves) {
  110. msg.prefix(player, gamename, "Already moved with another game piece.");
  111. goto("wait");
  112. }
  113. token_loc = block_loc;
  114. block.setMaterial(pointed_block, basic_block);
  115. pointed_block = block.mod(block, 0, -1, 0);
  116. block.setMaterial(pointed_block, point_block);
  117. } else {
  118. msg.prefix(player, gamename, "Not your game piece.");
  119. }
  120. goto("wait");
  121. }
  122. //Wurde am Spielbrett ein gültiges Feld angeklickt?
  123. if(block_type == basic_block) {
  124. //Wurde bereits eine Spielfigur der eigenen Farbe ausgewählt?
  125. if(token_loc != null) {
  126. //Ist der Zug gültig? Ziehen / Springen,
  127. diff_x = loc.getX(block_loc) - loc.getX(token_loc);
  128. diff_z = loc.getZ(block_loc) - loc.getZ(token_loc);
  129. possible_move = false;
  130. for(i = 0; i < list.getSize(possible_move_differences); i++) {
  131. a = list.getIndex(possible_move_differences, i);
  132. x = a[0];
  133. z = a[1];
  134. //Passt der Vektor des Zuges?
  135. if(math.abs(diff_x) == x && math.abs(diff_z) == z) {
  136. possible_move = true;
  137. move_type = "drag";
  138. if(i >= jumping_index) {
  139. //Sprung. Checken, ob sich eine Spielfigur auf halber Strecke befindet
  140. middle_block = block.get(loc.mod(token_loc, diff_x / 2, 0, diff_z / 2));
  141. if(!map.contains(tokens_map2, block.getType(middle_block))) {
  142. msg.prefix(player, gamename, "Invalid move.");
  143. goto("wait");
  144. }
  145. move_type = "jump";
  146. }
  147. //Ist der Zielblock belegt?
  148. aim_block = block.mod(block, 0, 1, 0);
  149. if(block.getType(aim_block) != air_mat) {
  150. goto("wait");
  151. }
  152. //Die Spielfigur kann nicht gezogen werden, wenn bereits gesprungen wurde
  153. if(move_type == "drag" && jump_moves) {
  154. msg.prefix(player, gamename, "Move not possible. Already overjumped a game piece.");
  155. goto("wait");
  156. }
  157. //Zug der Spielfigur
  158. team = map.get(teams, player);
  159. banner_type = map.get(tokens_map, team);
  160. rotation = map.get(rotations_map, team);
  161. block.setMaterial(block.get(token_loc), air_mat);
  162. block.setData(aim_block, read.blockData(string.concat(banner_type, "[rotation=", rotation, "]")));
  163. token_loc = block.getLocation(aim_block);
  164. block.setMaterial(pointed_block, basic_block);
  165. if(move_type == "drag") {
  166. goto("nextplayer");
  167. }
  168. jump_moves = true;
  169. pointed_block = block;
  170. block.setMaterial(pointed_block, point_block);
  171. }
  172. }
  173. if(!possible_move) {
  174. msg.prefix(player, gamename, "Invalid move.");
  175. goto("wait");
  176. }
  177. }
  178. }
  179. goto("wait");
  180. @nextplayer
  181. //Gewonnen?
  182. team = map.get(teams, player);
  183. token = map.get(tokens_mat_map, team);
  184. list = map.get(aim_locs, team);
  185. iter = iterator(list);
  186. won = true;
  187. while(hasNext(iter)) {
  188. entry = next(iter);
  189. if(block.getType(entry) != token) {
  190. won = false;
  191. }
  192. }
  193. if(won) {
  194. winner = player;
  195. for(i = 0; i < list.getSize(player_list); i++) {
  196. p = player.get(list.getIndex(player_list, i));
  197. if(p == winner) {
  198. money.addBoost(p, 128);
  199. } else {
  200. money.addBoost(p, 32);
  201. }
  202. }
  203. goto("win");
  204. }
  205. token_loc = null;
  206. jump_moves = false;
  207. //Nächsten Spieler setzen
  208. index = list.getIndexOf(player_list, player.getUuid(next_player)) + 1;
  209. if(index >= list.getSize(player_list)) {
  210. index = 0;
  211. }
  212. next_player = player.get(list.getIndex(player_list, index));
  213. setNextPlayer(next_player);
  214. block.setMaterial(pointed_block, basic_block);
  215. goto("wait");
  216. @custom_command
  217. if(command == "nextplayer") {
  218. if(player == next_player) {
  219. goto("nextplayer");
  220. }
  221. }
  222. goto("wait");
  223. @block_break
  224. @block_place
  225. @entity_damage
  226. cancel = true;
  227. goto("wait");
  228. @win
  229. script = script.getFromId(script_id);
  230. minigame.speakAll(gamename, string.concat("§6", player.getName(winner), " §rhas won."));
  231. for(i = 0; i < list.getSize(player_list); i++) {
  232. p = player.get(list.getIndex(player_list, i));
  233. if(p == winner) {
  234. showstats(p, true);
  235. } else {
  236. showstats(p, false);
  237. }
  238. player.setFly(p, false);
  239. }
  240. minigame.kickAllPlayers(script);
  241. minigame.term(script, gamesignloc);
  242. term();
  243. @player_quit
  244. @player_giveup
  245. minigame.speakAll(gamename, string.concat("§8", player.getName(player), " §ehas left the game."));
  246. player.setFly(player, false);
  247. showstats(player, false);
  248. script = script.getFromId(script_id);
  249. minigame.kickPlayer(script, player);
  250. size = list.getSize(player_list);
  251. if(size < minplayers) {
  252. block.setMaterial(pointed_block, basic_block);
  253. winner = player.get(list.getIndex(player_list, 0));
  254. goto("win");
  255. }
  256. team = map.get(teams, player);
  257. token = map.get(tokens_mat_map, team);
  258. removeSpecificToken(token);
  259. goto("wait");
  260. function setNextPlayer(next_player) {
  261. team = map.get($teams, next_player);
  262. color = map.get($colors_map, team);
  263. next_player_name = player.getName(next_player);
  264. if(string.endsWith(next_player_name, "s")) {
  265. minigame.speakAll($gamename, string.concat("It´s ", color, next_player_name, "' §rturn."));
  266. } else {
  267. minigame.speakAll($gamename, string.concat("It´s ", color, next_player_name, "'s §rturn."));
  268. }
  269. sound.spawnForPlayer(next_player, $pling_sound, $sound_category_ambient);
  270. msg(next_player, string.getClickText("§r[§eEnd turn§r]", "/nextplayer"));
  271. }
  272. function removeSpecificToken(token) {
  273. //Sechseck nach festgelegter Spielfigur leeren
  274. iter = iterator($center_locs);
  275. while(hasNext(iter)) {
  276. entry = next(iter);
  277. if(block.getType(entry) == token) {
  278. block.setMaterial(entry, air_mat);
  279. }
  280. }
  281. //Ziel-Felder nach festgelegter Spielfigur leeren
  282. map_iter = map.iterator($aim_locs);
  283. while(hasNext(map_iter)) {
  284. list = map.getValue(next(map_iter));
  285. iter = iterator(list);
  286. while(hasNext(iter)) {
  287. entry = next(iter);
  288. if(block.getType(entry) == token) {
  289. block.setMaterial(entry, air_mat);
  290. }
  291. }
  292. }
  293. //Start-Felder nach festgelegter Spielfigur leeren
  294. map_iter = map.iterator($start_locs);
  295. while(hasNext(map_iter)) {
  296. list = map.getValue(next(map_iter));
  297. iter = iterator(list);
  298. while(hasNext(iter)) {
  299. entry = next(iter);
  300. if(block.getType(entry) == token) {
  301. block.setMaterial(entry, air_mat);
  302. }
  303. }
  304. }
  305. }
  306. function showstats(player, won) { //Player player, Boolean won
  307. player_id = player.getId(player);
  308. last_record = ranking.getPoints($rankingtable, player_id);
  309. if(won) {
  310. last_record++;
  311. }
  312. playedgames = minigame.getPlayed(player_id, $game_short) + 1;
  313. minigame.setPlayed(player_id, $game_short, playedgames);
  314. ranking.setPoints($rankingtable, player_id, last_record);
  315. minigame.statsHeader(player, $gamename, "§e");
  316. minigame.statsLine(player, "§e", "Won games", string.number(last_record));
  317. minigame.statsLine(player, "§e", "Played games", string.number(playedgames));
  318. if(playedgames != 0) {
  319. minigame.statsLine(player, "§e", "Win ratio", string.concat(string.number(math.roundComma((last_record / playedgames) * 100, 2)), "%"));
  320. }
  321. }
  322. function getPair(a, b) {
  323. c = array.new(2);
  324. c[0] = a;
  325. c[1] = b;
  326. return c;
  327. }
  328. function createFieldNorth(north_loc, ox, oz) {
  329. list = list.new();
  330. north_block = block.get(north_loc);
  331. list.add(list, north_block);
  332. list.add(list, block.mod(north_block, -ox, 0, oz));
  333. list.add(list, block.mod(north_block, ox, 0, oz));
  334. list.add(list, block.mod(north_block, -2*ox, 0, 2*oz));
  335. list.add(list, block.mod(north_block, 0, 0, 2*oz));
  336. list.add(list, block.mod(north_block, 2*ox, 0, 2*oz));
  337. list.add(list, block.mod(north_block, -3*ox, 0, 3*oz));
  338. list.add(list, block.mod(north_block, -ox, 0, 3*oz));
  339. list.add(list, block.mod(north_block, ox, 0, 3*oz));
  340. list.add(list, block.mod(north_block, 3*ox, 0, 3*oz));
  341. list.add(list, block.mod(north_block, -4*ox, 0, 4*oz));
  342. list.add(list, block.mod(north_block, -2*ox, 0, 4*oz));
  343. list.add(list, block.mod(north_block, 0, 0, 4*oz));
  344. list.add(list, block.mod(north_block, 2*ox, 0, 4*oz));
  345. list.add(list, block.mod(north_block, 4*ox, 0, 4*oz));
  346. return list;
  347. }
  348. function createFieldSouth(south_loc, ox, oz) {
  349. list = list.new();
  350. south_block = block.get(south_loc);
  351. list.add(list, south_block);
  352. list.add(list, block.mod(south_block, -ox, 0, -oz));
  353. list.add(list, block.mod(south_block, ox, 0, -oz));
  354. list.add(list, block.mod(south_block, -2*ox, 0, -2*oz));
  355. list.add(list, block.mod(south_block, 0, 0, -2*oz));
  356. list.add(list, block.mod(south_block, 2*ox, 0, -2*oz));
  357. list.add(list, block.mod(south_block, -3*ox, 0, -3*oz));
  358. list.add(list, block.mod(south_block, -ox, 0, -3*oz));
  359. list.add(list, block.mod(south_block, ox, 0, -3*oz));
  360. list.add(list, block.mod(south_block, 3*ox, 0, -3*oz));
  361. list.add(list, block.mod(south_block, -4*ox, 0, -4*oz));
  362. list.add(list, block.mod(south_block, -2*ox, 0, -4*oz));
  363. list.add(list, block.mod(south_block, 0, 0, -4*oz));
  364. list.add(list, block.mod(south_block, 2*ox, 0, -4*oz));
  365. list.add(list, block.mod(south_block, 4*ox, 0, -4*oz));
  366. return list;
  367. }
  368. function createFieldCenter(loc, ox, oz) {
  369. list = list.new();
  370. block = block.get(loc);
  371. list.add(list, block);
  372. list.add(list, block.mod(block, 2*ox, 0, 0));
  373. list.add(list, block.mod(block, 4*ox, 0, 0));
  374. list.add(list, block.mod(block, 6*ox, 0, 0));
  375. list.add(list, block.mod(block, -ox, 0, oz));
  376. list.add(list, block.mod(block, ox, 0, oz));
  377. list.add(list, block.mod(block, 3*ox, 0, oz));
  378. list.add(list, block.mod(block, 5*ox, 0, oz));
  379. list.add(list, block.mod(block, 7*ox, 0, oz));
  380. list.add(list, block.mod(block, -2*ox, 0, 2*oz));
  381. list.add(list, block.mod(block, 0, 0, 2*oz));
  382. list.add(list, block.mod(block, 2*ox, 0, 2*oz));
  383. list.add(list, block.mod(block, 4*ox, 0, 2*oz));
  384. list.add(list, block.mod(block, 6*ox, 0, 2*oz));
  385. list.add(list, block.mod(block, 8*ox, 0, 2*oz));
  386. list.add(list, block.mod(block, -3*ox, 0, 3*oz));
  387. list.add(list, block.mod(block, -ox, 0, 3*oz));
  388. list.add(list, block.mod(block, ox, 0, 3*oz));
  389. list.add(list, block.mod(block, 3*ox, 0, 3*oz));
  390. list.add(list, block.mod(block, 5*ox, 0, 3*oz));
  391. list.add(list, block.mod(block, 7*ox, 0, 3*oz));
  392. list.add(list, block.mod(block, 9*ox, 0, 3*oz));
  393. list.add(list, block.mod(block, -2*ox, 0, 4*oz));
  394. list.add(list, block.mod(block, 0, 0, 4*oz));
  395. list.add(list, block.mod(block, 2*ox, 0, 4*oz));
  396. list.add(list, block.mod(block, 4*ox, 0, 4*oz));
  397. list.add(list, block.mod(block, 6*ox, 0, 4*oz));
  398. list.add(list, block.mod(block, 8*ox, 0, 4*oz));
  399. list.add(list, block.mod(block, -ox, 0, 5*oz));
  400. list.add(list, block.mod(block, ox, 0, 5*oz));
  401. list.add(list, block.mod(block, 3*ox, 0, 5*oz));
  402. list.add(list, block.mod(block, 5*ox, 0, 5*oz));
  403. list.add(list, block.mod(block, 7*ox, 0, 5*oz));
  404. list.add(list, block.mod(block, 0, 0, 6*oz));
  405. list.add(list, block.mod(block, 2*ox, 0, 6*oz));
  406. list.add(list, block.mod(block, 4*ox, 0, 6*oz));
  407. list.add(list, block.mod(block, 6*ox, 0, 6*oz));
  408. return list;
  409. }