capturetheflag.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. /* --- Game instruction ---
  2. Each team has its own flag in its base.
  3. An opponent team is deleted, when the own flag and the opponent flag is in the own base.
  4. A killed player respawns at his team spawn.
  5. A flag is picked up from a base by clicking it. It can be placed in the own base by placing it on the correct spot.
  6. A player can only carry one flag at once.
  7. The location of a flag is shown in the scoreboard: {color}base | player | location
  8. Friendly Fire is canceled.
  9. */
  10. rankingtable = "ctfranks";
  11. gamename = "§3CTF";
  12. game_short = "ctf";
  13. game_tab = "§3CTF";
  14. minigame.setIndivStartCheck(true);
  15. minigame.setSpecificLobbyHandling(true);
  16. air_mat = material.getAir();
  17. colorcodes = map.new();
  18. map.add(colorcodes, 0, "§9");
  19. map.add(colorcodes, 1, "§c");
  20. map.add(colorcodes, 2, "§e");
  21. map.add(colorcodes, 3, "§2");
  22. map.add(colorcodes, 4, "§6");
  23. map.add(colorcodes, 5, "§5");
  24. map.add(colorcodes, 6, "§d");
  25. map.add(colorcodes, 7, "§0");
  26. teamcolortext = map.new();
  27. map.add(teamcolortext, 0, "§9blue");
  28. map.add(teamcolortext, 1, "§cred");
  29. map.add(teamcolortext, 2, "§eyellow");
  30. map.add(teamcolortext, 3, "§2green");
  31. map.add(teamcolortext, 4, "§6orange");
  32. map.add(teamcolortext, 5, "§5magenta");
  33. map.add(teamcolortext, 6, "§dpink");
  34. map.add(teamcolortext, 7, "§0black");
  35. teamcolortext2 = map.new();
  36. map.add(teamcolortext2, 0, "§9Blue");
  37. map.add(teamcolortext2, 1, "§cRed");
  38. map.add(teamcolortext2, 2, "§eYellow");
  39. map.add(teamcolortext2, 3, "§2Green");
  40. map.add(teamcolortext2, 4, "§6Orange");
  41. map.add(teamcolortext2, 5, "§5Magenta");
  42. map.add(teamcolortext2, 6, "§dPink");
  43. map.add(teamcolortext2, 7, "§0Black");
  44. banner_tag = item.getTag("minecraft:banners");
  45. banner_tag2 = item.getTag("minecraft:banners");
  46. banners = map.new();
  47. map.add(banners, 0, material.get("BLUE_BANNER"));
  48. map.add(banners, 1, material.get("RED_BANNER"));
  49. map.add(banners, 2, material.get("YELLOW_BANNER"));
  50. map.add(banners, 3, material.get("GREEN_BANNER"));
  51. map.add(banners, 4, material.get("ORANGE_BANNER"));
  52. map.add(banners, 5, material.get("PURPLE_BANNER"));
  53. map.add(banners, 6, material.get("PINK_BANNER"));
  54. map.add(banners, 7, material.get("BLACK_BANNER"));
  55. banners2 = map.new();
  56. map.add(banners2, material.get("BLUE_BANNER"), 0);
  57. map.add(banners2, material.get("RED_BANNER"), 1);
  58. map.add(banners2, material.get("YELLOW_BANNER"), 2);
  59. map.add(banners2, material.get("GREEN_BANNER"), 3);
  60. map.add(banners2, material.get("ORANGE_BANNER"), 4);
  61. map.add(banners2, material.get("PURPLE_BANNER"), 5);
  62. map.add(banners2, material.get("PINK_BANNER"), 5);
  63. map.add(banners2, material.get("BLACK_BANNER"), 7);
  64. clothescode = map.new(); //lift of data values for colored clothes
  65. map.add(clothescode, 0, 5592575);
  66. map.add(clothescode, 1, 16733525);
  67. map.add(clothescode, 2, 16777045);
  68. map.add(clothescode, 3, 5635925);
  69. map.add(clothescode, 4, 16755200);
  70. map.add(clothescode, 5, 43690);
  71. map.add(clothescode, 6, 5592405);
  72. map.add(clothescode, 7, 0);
  73. team_lists = map.new(); //Map mit Spielerlisten für jedes Team
  74. map.add(team_lists, 0, list.new());
  75. map.add(team_lists, 1, list.new());
  76. map.add(team_lists, 2, list.new());
  77. map.add(team_lists, 3, list.new());
  78. players = map.new(); //Alle Spieler (key) des Spiels und deren Teamzugehörigkeit (value)
  79. allteams = list.new(); //Alle Teams, die noch im Spiel sind
  80. waiters = list.new(); //Spieler in der Lobby ohne Teamzugehörigkeit
  81. flagcarrier = map.new(); //player_id -> team id of the flag
  82. flag_at = map.new(); //team if of the flag -> base | player | coords
  83. minigame.initStart();
  84. goto("simplelobby");
  85. @specificLobbyHandling
  86. player_name = player.getName(player);
  87. if(event == "minigame_join") {
  88. list.add(waiters, player_name);
  89. living.setHealth(player, 20);
  90. player.setHunger(player, 20);
  91. player.setSaturation(player, 5);
  92. player.clearInventory(player);
  93. sb.add(player, 99, gamename);
  94. sb.add(player, 98, string.concat("Map: ", mapname));
  95. sb.add(player, 97, string.concat(string.number(numberofteams), "x", string.number(teamsize)));
  96. sb.add(player, 96, sb.getSpacer());
  97. return;
  98. }
  99. if(event == "player_quit" || event == "player_giveup") {
  100. list.remove(waiters, player_name);
  101. team = map.get(players, player_name);
  102. if(team != null) {
  103. teamlist = getTeamList(team);
  104. list.remove(teamlist, player_name);
  105. }
  106. map.remove(players, player_name);
  107. return;
  108. }
  109. if(event == "block_click") {
  110. if(slot.isOffHand(hand)) {
  111. return;
  112. }
  113. if(action != "RIGHT_CLICK_BLOCK") {
  114. return;
  115. }
  116. block_loc = block.getLocation(block);
  117. if(list.contains(joinblocks, block_loc)) {
  118. newteam = list.getIndexOf(joinblocks, block_loc);
  119. newteamlist = getTeamList(newteam);
  120. if(list.contains(newteamlist, player_name)) {
  121. msg.prefix(player, gamename, "§eYou are already in this team.");
  122. return;
  123. }
  124. if(list.getSize(newteamlist) >= teamsize) {
  125. msg.prefix(player, gamename, "§eNo space for you in this team.");
  126. return;
  127. }
  128. list.remove(waiters, player_name);
  129. yetteam = map.get(players, player_name);
  130. if(yetteam != null) {
  131. yetteamlist = getTeamList(yetteam);
  132. list.remove(yetteamlist, player_name);
  133. }
  134. list.add(newteamlist, player_name);
  135. map.add(players, player_name, newteam);
  136. msg.prefix(player, gamename, string.concat("§eYou joined the ", map.get(teamcolortext, newteam), " §eteam."));;
  137. entity.setName(player, text.new(string.concat(getColorCode(newteam), player_name)));
  138. if(!minigame.isStarting()) {
  139. goto("startcountdown");
  140. }
  141. }
  142. }
  143. return;
  144. function minigame.canStartIndiv() {
  145. player_list = minigame.getPlayers($script_id);
  146. p_amount = list.getSize(player_list);
  147. if(p_amount < minigame.getMinPlayers()) {
  148. return false;
  149. }
  150. if(p_amount > 0 && list.getSize($waiters) > 0) {
  151. return true;
  152. }
  153. for(i = 0; i < $numberofteams; i++) {
  154. teamlist = getTeamList(i);
  155. team_size = list.getSize(teamlist);
  156. if(team_size == p_amount) {
  157. return false;
  158. }
  159. }
  160. return true;
  161. }
  162. @finalstart
  163. player_list = minigame.getPlayers(script_id);
  164. minigame.speakAll(gamename, "The game has started.");
  165. while(list.getSize(waiters) != 0) {
  166. team = getTeamWithLowestPeople(team_lists, numberofteams);
  167. teamlist = getTeamList(team);
  168. p_name = list.getIndex(waiters, 0);
  169. map.add(players, p_name, team);
  170. list.add(teamlist, p_name);
  171. list.remove(waiters, p_name);
  172. entity.setName(read.player(p_name), text.new(string.concat(getColorCode(team), p_name)));
  173. }
  174. for(i = 0; i < numberofteams; i++) {
  175. teamlist = getTeamList(i);
  176. size = list.getSize(teamlist);
  177. if(size > 0) {
  178. list.add(allteams, i);
  179. map.add(flag_at, i, string.concat(getColorCode(i), "Base"));
  180. }
  181. }
  182. updateDisplay();
  183. resetGameField();
  184. for(i = 0; i < list.getSize(player_list); i++) {
  185. p = player.get(list.getIndex(player_list, i));
  186. team = getTeamFromPlayer(p);
  187. player.setHunger(p, 20);
  188. player.setSaturation(p, 5);
  189. player.setGamemode(p, "SURVIVAL");
  190. player.setFly(p, false);
  191. entity.teleport(p, map.get(spawnlocs, team));
  192. color = getColorCode(team);
  193. player.action(p, text.new(string.concat(color, "Team ", map.get(teamcolortext2, team))));
  194. equipPlayer(p);
  195. minigame.setTabName(p, game_tab, color);
  196. }
  197. sgoto(30, "loop");
  198. event.load("living_pickup");
  199. event.load("living_death");
  200. event.load("player_post_respawn");
  201. event.load("player_drop");
  202. @checkgame
  203. wait();
  204. if(event == "living_death" || event == "living_pickup") {
  205. if(!isPlayer(living_entity)) {
  206. goto("checkgame");
  207. }
  208. player = living_entity;
  209. }
  210. if(event == "entity_damage") {
  211. if(!isPlayer(entity)) {
  212. goto("checkgame");
  213. }
  214. player = entity;
  215. }
  216. if(player.hasMinigameId(player, script_id)) {
  217. player_name = player.getName(player);
  218. ignoreGoto(event);
  219. }
  220. goto("checkgame");
  221. @loop
  222. for(i = 0; i < list.getSize(player_list); i++) {
  223. p = player.get(list.getIndex(player_list, i));
  224. team = getTeamFromPlayer(p);
  225. player.action(p, text.new(string.concat(getColorCode(team), "Team ", map.get(teamcolortext2, team))));
  226. }
  227. sgoto(30, "loop");
  228. goto("checkgame");
  229. @living_pickup
  230. item = item.entity.get(item_entity);
  231. if(!isItemAFlag(item)) {
  232. goto("checkgame");
  233. }
  234. if(isPlayerAFlagCarrier(player)) {
  235. cancel = true;
  236. goto("checkgame");
  237. }
  238. flag_mat = item.getType(item);
  239. flag_team = getTeamFromFlag(flag_mat);
  240. map.add(flagcarrier, player.getId(player), flag_team);
  241. map.add(flag_at, flag_team, string.concat("§3", player.getName(player)));
  242. updateDisplayTeam(flag_team, true);
  243. goto("checkgame");
  244. @living_death
  245. if(isPlayerAFlagCarrier(player)) {
  246. flag_team = getFlagCarried(player);
  247. loc = entity.getLocation(player);
  248. banner = item.new(map.get($banners, flag_team));
  249. item.drop(banner, loc);
  250. map.remove(flagcarrier, player.getId(player));
  251. map.add(flag_at, flag_team, string.concat("§3", loc.getStringRounded(loc, " ")));
  252. updateDisplayTeam(flag_team, true);
  253. }
  254. goto("checkgame");
  255. @player_post_respawn
  256. team = getTeamFromPlayer(player);
  257. entity.setName(player, text.new(string.concat(getColorCode(team), player.getName(player))));
  258. loc = map.get(spawnlocs, team);
  259. entity.teleport(player, loc);
  260. equipPlayer(player);
  261. goto("checkgame");
  262. @player_drop
  263. cancel = true;
  264. goto("checkgame");
  265. @block_click
  266. if(slot.isOffHand(hand)) {
  267. goto("checkgame");
  268. }
  269. if(action != "RIGHT_CLICK_BLOCK") {
  270. goto("checkgame");
  271. }
  272. if(!isBlockAFlag(block)) {
  273. goto("checkgame");
  274. }
  275. if(isPlayerAFlagCarrier(player)) {
  276. msg.prefix(player, gamename, "You can only carry one flag at once.");
  277. goto("checkgame");
  278. }
  279. team = getTeamFromPlayer(player);
  280. l = map.get(flaglocs, team);
  281. if(list.contains(l, block.getLocation(block))) {
  282. msg.prefix(player, gamename, "You cannot pickup flags in your own base.");
  283. goto("checkgame");
  284. }
  285. flag_mat = block.getType(block);
  286. flag_team = getTeamFromFlag(flag_mat);
  287. map.add(flagcarrier, player.getId(player), flag_team);
  288. map.add(flag_at, flag_team, string.concat("§3", player.getName(player)));
  289. updateDisplayTeam(flag_team, true);
  290. block.setMaterial(block, air_mat);
  291. player.giveItem(player, item.new(flag_mat));
  292. goto("checkgame");
  293. @block_break
  294. cancel = true;
  295. goto("checkgame");
  296. @block_place
  297. if(!isBlockAFlag(block)) {
  298. cancel = true;
  299. goto("checkgame");
  300. }
  301. team = getTeamFromPlayer(player);
  302. l = map.get(flaglocs, team);
  303. flag_mat = block.getType(block);
  304. flag_team = getTeamFromFlag(flag_mat);
  305. exp_loc = list.getIndex(l, flag_team);
  306. if(exp_loc != block.getLocation(block)) {
  307. msg.prefix(player, gamename, "Put the flag to the correct spot.");
  308. cancel = true;
  309. goto("checkgame");
  310. }
  311. cancel = false;
  312. map.remove(flagcarrier, player.getId(player));
  313. map.add(flag_at, flag_team, string.concat(getColorCode(team), "Base"));
  314. updateDisplayTeam(flag_team, true);
  315. if(team == flag_team) {
  316. goto("checkgame");
  317. }
  318. if(isOwnFlagInOwnBase(team)) {
  319. teamGameover(flag_team);
  320. }
  321. goto("checkgame");
  322. @entity_damage
  323. attacker = player.getFromDamageSource(damage_source);
  324. if(attacker == null) {
  325. goto("checkgame");
  326. }
  327. if(isSameTeam(attacker, player)) {
  328. cancel = true;
  329. }
  330. goto("checkgame");
  331. @player_giveup
  332. @player_quit
  333. player_name = player.getName(player);
  334. team = getTeamFromPlayer(player);
  335. color = getColorCode(team);
  336. minigame.speakAll(gamename, string.concat(color, player_name, " §ehas left the game."));
  337. teamlist = getTeamList(team);
  338. list.remove(teamlist, player_name);
  339. map.remove(players, player_name);
  340. showstats(player, false);
  341. script = script.getFromId(script_id);
  342. minigame.kickplayer(script, player);
  343. if(list.getSize(teamlist) == 0) {
  344. teamGameover(team);
  345. }
  346. goto("checkgame");
  347. function isOwnFlagInOwnBase(team) {
  348. l = map.get($flaglocs, team);
  349. b = block.get(list.getIndex(l, team));
  350. return !block.isAir(b);
  351. }
  352. function isBlockAFlag(block) {
  353. return block.hasTag(block, $banner_tag2);
  354. }
  355. function isItemAFlag(item) {
  356. return item.hasTag(item, $banner_tag);
  357. }
  358. function isPlayerAFlagCarrier(player) {
  359. team = getFlagCarried(player);
  360. if(team == null) {
  361. return false;
  362. }
  363. return true;
  364. }
  365. function getFlagCarried(player) {
  366. return map.get($flagcarrier, player.getId(player));
  367. }
  368. function isSameTeam(player1, player2) {
  369. return getTeamFromPlayer(player1) == getTeamFromPlayer(player2);
  370. }
  371. function getTeamFromPlayer(player) {
  372. return map.get($players, player.getName(player));
  373. }
  374. function getTeamFromFlag(flag_mat) {
  375. return map.get($banners2, flag_mat);
  376. }
  377. function teamGameover(team) {
  378. tempcolortext = map.get($teamcolortext, team);
  379. minigame.speakAll($gamename, string.concat("§cTeam ", tempcolortext, "§c has been eliminated."));
  380. list.remove($allteams, team);
  381. updateDisplay();
  382. if(list.getSize($allteams) == 1) {
  383. kickteam(team, false);
  384. win_team = list.getIndex($allteams, 0);
  385. tempcolortext = map.get($teamcolortext, win_team);
  386. minigame.speakAll($gamename, string.concat("§cTeam ", tempcolortext, "§c won."));
  387. kickteam(win_team, true);
  388. minigame.clearItems($middleloc, $radius);
  389. script = script.getFromId($script_id);
  390. minigame.term(script, $gamesignloc);
  391. term();
  392. }
  393. kickteam(team, false);
  394. }
  395. function kickteam(team, won) {
  396. teamlist = getTeamList(team);
  397. for(i = 0; i < list.getSize(teamlist); i++) {
  398. p_name = list.getIndex(teamlist, i);
  399. p = read.player(p_name);
  400. showstats(p, won);
  401. script = script.getFromId($script_id);
  402. minigame.kickplayer(script, p);
  403. }
  404. }
  405. function getTeamList(team) {
  406. return map.get($team_lists, team);
  407. }
  408. function showstats(player, won) { //Player player, Boolean won
  409. player_id = player.getId(player);
  410. last_record = ranking.getPoints($rankingtable, player_id);
  411. if(won) {
  412. last_record++;
  413. }
  414. playedgames = minigame.getPlayed(player_id, $game_short) + 1;
  415. minigame.setPlayed(player_id, $game_short, playedgames);
  416. ranking.setPoints($rankingtable, player_id, last_record);
  417. minigame.statsHeader(player, $gamename, "§e");
  418. minigame.statsLine(player, "§e", "Won games", string.number(last_record));
  419. minigame.statsLine(player, "§e", "Played games", string.number(playedgames));
  420. if(playedgames != 0) {
  421. minigame.statsLine(player, "§e", "Win ratio", string.concat(string.number(math.roundComma((last_record / playedgames) * 100, 2)), "%"));
  422. }
  423. }
  424. function equipPlayer(player) {
  425. player.clearInventory(player);
  426. team = getTeamFromPlayer(player);
  427. clothescolor = map.get($clothescode, team);
  428. living.setEquip(player, slot.getChest(), read.item(string.concat("{Count:1b,id:'minecraft:leather_chestplate',tag:{Damage:0,display:{color:", clothescolor, "}}}")));
  429. player.giveItem(player, $sword);
  430. player.giveItem(player, $bow);
  431. player.giveItem(player, $food);
  432. player.giveItem(player, $gapple);
  433. player.giveItem(player, $arrows);
  434. }
  435. function resetGameField() {
  436. //set all locations to air
  437. for(i = 0; i < list.getSize($allteams); i++) {
  438. l = map.get($flaglocs, i);
  439. for(h = 0; h < list.getSize(l); h++) {
  440. block = block.get(list.getIndex(l, h));
  441. block.setMaterial(block, $air_mat);
  442. }
  443. }
  444. //set active team flags
  445. for(i = 0; i < list.getSize($allteams); i++) {
  446. team = list.getIndex($allteams, i);
  447. l = map.get($flaglocs, team);
  448. block = block.get(list.getIndex(l, team));
  449. b_mat = map.get($banners, team);
  450. block.setMaterial(block, b_mat);
  451. }
  452. }
  453. function updateDisplay() {
  454. sb.clearGameAll();
  455. minigame.displayAll(99, $gamename);
  456. for(i = 0; i < list.getSize($allteams); i++) {
  457. team = list.getIndex($allteams, i);
  458. updateDisplayTeam(team, false);
  459. }
  460. minigame.displayAll(98 - i, sb.getSpacer());
  461. }
  462. function updateDisplayTeam(team, announce) {
  463. index = 98 - list.getIndexOf($allteams, team);
  464. color = getColorCode(team);
  465. at = map.get($flag_at, team);
  466. minigame.displayAll(index, string.concat(color, "⚐ ", at));
  467. if(announce) {
  468. tempcolortext = map.get($teamcolortext, team);
  469. minigame.speakAll($gamename, string.concat("The ", color, tempcolortext, " ⚐ §ris at ", at, "§r."));
  470. }
  471. }
  472. function getColorCode(team) {
  473. return map.get($colorcodes, team);
  474. }