hideandseek.txt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. rankingtable = "fncranks";
  2. cooldown_map = map.new();
  3. brokenblocks = map.new();
  4. placedblocks = list.new();
  5. points = map.new();
  6. times = map.new();
  7. seekerlist = list.new();
  8. escaperlist = list.new();
  9. winpoints = 30; //Punkte für Win
  10. gamename = "§9Hide and Seek";
  11. seeker_skills = list.new();
  12. hider_skills = list.new();
  13. addSeekerSkill("Speed", 20, "km:skill54", 5, 2, false, "speed");
  14. addSeekerSkill("JumpBoost", 12, "km:skill15", 3, 5, false, "jump_boost");
  15. addSeekerSkill("Haste", 25, "km:skill50", 7, 3, false, "haste");
  16. addSeekerSkill("Slowness", 25, "km:skill53", 3, 1, true, "slowness");
  17. addSeekerSkill("Glowing", 50, "km:skill3", 2, 1, true, "glowing");
  18. addHiderSkill("Invisibility", 45, "km:skill47", 10, 1, false, "invisibility");
  19. addHiderSkill("Haste", 25, "km:skill50", 7, 3, false, "haste");
  20. addHiderSkill("Slowness", 25, "km:skill53", 3, 1, true, "slowness");
  21. addHiderSkill("Blindness", 25, "km:skill55", 3, 1, true, "blindness");
  22. addHiderSkill("Nausea", 25, "km:skill36", 10, 10, true, "nausea");
  23. gosub("setstart");
  24. spawnprotect = list.new();
  25. list.add(spawnprotect, middleloc);
  26. list.add(spawnprotect, loc.mod(middleloc, 0, 1, 0));
  27. list.add(spawnprotect, loc.mod(middleloc, -1, 0, 0));
  28. list.add(spawnprotect, loc.mod(middleloc, -1, 1, 0));
  29. list.add(spawnprotect, loc.mod(middleloc, 1, 0, 0));
  30. list.add(spawnprotect, loc.mod(middleloc, 1, 1, 0));
  31. list.add(spawnprotect, loc.mod(middleloc, 0, 0, 1));
  32. list.add(spawnprotect, loc.mod(middleloc, 0, 1, 1));
  33. list.add(spawnprotect, loc.mod(middleloc, 0, 0, -1));
  34. list.add(spawnprotect, loc.mod(middleloc, 0, 1, -1));
  35. list.add(spawnprotect, escaper_spawn_loc);
  36. list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, 0));
  37. list.add(spawnprotect, loc.mod(escaper_spawn_loc, -1, 0, 0));
  38. list.add(spawnprotect, loc.mod(escaper_spawn_loc, -1, 1, 0));
  39. list.add(spawnprotect, loc.mod(escaper_spawn_loc, 1, 0, 0));
  40. list.add(spawnprotect, loc.mod(escaper_spawn_loc, 1, 1, 0));
  41. list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 0, 1));
  42. list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, 1));
  43. list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 0, -1));
  44. list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, -1));
  45. list.add(spawnprotect, seeker_spawn_loc);
  46. list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, 0));
  47. list.add(spawnprotect, loc.mod(seeker_spawn_loc, -1, 0, 0));
  48. list.add(spawnprotect, loc.mod(seeker_spawn_loc, -1, 1, 0));
  49. list.add(spawnprotect, loc.mod(seeker_spawn_loc, 1, 0, 0));
  50. list.add(spawnprotect, loc.mod(seeker_spawn_loc, 1, 1, 0));
  51. list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 0, 1));
  52. list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, 1));
  53. list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 0, -1));
  54. list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, -1));
  55. escaper_spawn_loc = loc.mod(escaper_spawn_loc, 0.5, 0, 0.5);
  56. seeker_spawn_loc = loc.mod(seeker_spawn_loc, 0.5, 0, 0.5);
  57. goto("simplelobby");
  58. @finalstart
  59. player_list = minigame.getPlayers(script_id);
  60. event.load("player_post_respawn");
  61. event.load("function_key");
  62. //Temp-Kopie von player_list erstellen
  63. templist = list.new();
  64. for(i = 0; i < list.getSize(player_list); i++) {
  65. p_uuid = list.getIndex(player_list, i);
  66. p = player.get(p_uuid);
  67. speakPrefix(p, gamename, "The game has started.");
  68. list.add(templist, p_uuid);
  69. map.add(points, p_uuid, 0);
  70. player.setGamemode(p, "survival");
  71. player.setFly(p, false);
  72. }
  73. diapickaxe = read.item("{id:\"minecraft:diamond_pickaxe\",Count:1b,tag:{Enchantments:[{lvl:1s,id:\"minecraft:efficiency\"}]}}");
  74. blocks512 = read.item("minecraft:cut_sandstone", 512);
  75. stick = read.item("{id:\"minecraft:stick\",Count:1b,tag:{HideFlags:2,Enchantments:[{lvl:1s,id:\"minecraft:knockback\"}],display:{Name:'{\"text\":\"§bKnüppel\"}'},AttributeModifiers:[{UUIDMost:1,UUIDLeast:1,Amount:100.0d,Slot:\"mainhand\",AttributeName:\"generic.attackSpeed\",Operation:0,Name:\"modifier\"}]}}");
  76. ironpickaxe = read.item("minecraft:iron_pickaxe");
  77. blocks64 = read.item("minecraft:cut_sandstone", 64);
  78. for(i = 0; i < seeker_amount; i++) {
  79. p_uuid = list.getIndex(templist, math.random(0, list.getSize(templist) - 1));
  80. p = player.get(p_uuid);
  81. list.remove(templist, p_uuid);
  82. setSeeker(p);
  83. speakPrefix(p, gamename, "Catch other players!");
  84. }
  85. for(i = 0; i < list.getSize(templist); i++) {
  86. p_uuid = list.getIndex(templist, i);
  87. p = player.get(p_uuid);
  88. setEscaper(p);
  89. speakPrefix(p, gamename, "Run away!!!");
  90. }
  91. sgoto(20, "loop");
  92. gosub("updatedisplay");
  93. @checkgame
  94. wait();
  95. if(event == "living_pre_hurt") {
  96. if(!isPlayer(living_entity)) {
  97. goto("checkgame");
  98. }
  99. player = living_entity;
  100. }
  101. if(player.hasMinigameId(player, script_id)) {
  102. ignoreGoto(event);
  103. }
  104. goto("checkgame");
  105. @function_key
  106. if(list.contains(seekerlist, player.getUuid(player))) {
  107. skills_list = seeker_skills;
  108. type = "seeker";
  109. } else {
  110. skills_list = hider_skills;
  111. type = "hider";
  112. }
  113. if(key > list.getSize(skills_list)) {
  114. goto("checkgame");
  115. }
  116. skill = list.getIndex(skills_list, key - 1);
  117. skill_name = skill[0];
  118. needed_cooldown = skill[1];
  119. effecttime = skill[3] * 20;
  120. amplifier = skill[4];
  121. offensive = skill[5];
  122. tech_name = skill[6];
  123. last_exe_time = getCatchLastExeTime(player, skill_name);
  124. diff_time = math.roundUp((time.getMillis() - last_exe_time) / 1000);
  125. if(diff_time < needed_cooldown) {
  126. player.action(player, concat("§a", text.number(needed_cooldown - diff_time), "s cooldown left"));
  127. goto("checkgame");
  128. }
  129. if(offensive) {
  130. if(type == "seeker") {
  131. iter = list.iterator(escaperlist);
  132. while(hasNext(iter)) {
  133. p = player.get(next(iter));
  134. entity.addEffect(p, tech_name, effecttime, amplifier, false);
  135. }
  136. } else {
  137. iter = list.iterator(seekerlist);
  138. while(hasNext(iter)) {
  139. p = player.get(next(iter));
  140. entity.addEffect(p, tech_name, effecttime, amplifier, false);
  141. }
  142. }
  143. } else {
  144. entity.addEffect(player, tech_name, effecttime, amplifier, false);
  145. }
  146. setCatchLastExeTime(player, skill_name);
  147. status.addTimed(player, key, needed_cooldown * 20, concat("CD ", skill_name));
  148. minigame.speakAll(gamename, concat("§6", player.getName(player), "§r used §2", skill_name, "."));
  149. goto("checkgame");
  150. @living_pre_hurt
  151. defender = player;
  152. attacker = player.getFromDamageSource(damage_source);
  153. if(attacker == null) {
  154. goto("checkgame");
  155. }
  156. defender_uuid = player.getUuid(defender);
  157. if(!list.contains(player_list, defender_uuid)) {
  158. cancel = true;
  159. speakPrefix(attacker, gamename, "§eIllegal player in game.");
  160. goto("checkgame");
  161. }
  162. if(!player.hasMinigameId(attacker, script_id)) {
  163. goto("checkgame");
  164. }
  165. attacker_uuid = player.getUuid(attacker);
  166. if(defender_uuid == attacker_uuid) {
  167. goto("checkgame");
  168. }
  169. if(!list.contains(player_list, attacker_uuid)) {
  170. speakPrefix(defender, gamename, "§eIllegal player in game.");
  171. goto("checkgame");
  172. }
  173. if(list.contains(seekerlist, attacker_uuid) && list.contains(escaperlist, defender_uuid)) {
  174. setSeeker(defender);
  175. speakPrefix(defender, gamename, "Catch other players!");
  176. setEscaper(attacker);
  177. speakPrefix(attacker, gamename, "Run away!!!");
  178. gosub("updatedisplay");
  179. }
  180. goto("checkgame");
  181. @player_post_respawn
  182. if(list.contains(escaperlist, player.getUuid(player))) {
  183. //Random-Seeker zum Escaper machen
  184. p_uuid = list.getIndex(seekerlist, math.random(0, list.getSize(seekerlist) - 1));
  185. p = player.get(p_uuid);
  186. setEscaper(p);
  187. speakPrefix(p, gamename, "Run away!!!");
  188. //Escaper wird zum Seeker
  189. setSeeker(player);
  190. speakPrefix(player, gamename, "Catch other players!");
  191. gosub("updatedisplay");
  192. } else {
  193. player.clearInventory(player);
  194. giveSeekerItems(player);
  195. entity.teleport(player, seeker_spawn_loc);
  196. }
  197. goto("checkgame");
  198. @block_break
  199. cancel = true;
  200. if(list.contains(spawnprotect, block_loc)) {
  201. inv.update(player);
  202. goto("checkgame");
  203. }
  204. if(list.contains(placedblocks, block_loc)) {
  205. cancel = false;
  206. list.remove(placedblocks, block_loc);
  207. goto("checkgame");
  208. }
  209. if(set.contains(allowed_breaks, block_type)) {
  210. cancel = false;
  211. map.add(brokenblocks, block_loc, block_type);
  212. goto("checkgame");
  213. }
  214. if(block_type == "minecraft:diamond_block") {
  215. player_uuid = player.getUuid(player);
  216. if(list.contains(escaperlist, player_uuid)) {
  217. cancel = false;
  218. temp = map.get(points, player_uuid) + 1;
  219. map.add(points, player_uuid, temp);
  220. if(temp >= winpoints) {
  221. winner_uuid = player_uuid;
  222. goto("win");
  223. }
  224. sgoto(60, "replacedia");
  225. goto("checkgame");
  226. }
  227. }
  228. goto("checkgame");
  229. @block_place
  230. if(list.contains(spawnprotect, block_loc)) {
  231. cancel = true;
  232. inv.update(player);
  233. goto("checkgame");
  234. }
  235. if(block_type == "minecraft:diamond_block") {
  236. cancel = true;
  237. inv.update(player);
  238. goto("checkgame");
  239. }
  240. list.add(placedblocks, block_loc);
  241. goto("checkgame");
  242. @replacedia
  243. block.set(dia_loc, "minecraft:diamond_block");
  244. goto("checkgame");
  245. @loop
  246. //Zeit wird nur Escapern angezeigt
  247. for(i = 0; i < list.getSize(escaperlist); i++) {
  248. p_uuid = list.getIndex(escaperlist, i);
  249. seconds = map.get(times, p_uuid) - 1;
  250. if(seconds <= 0) {
  251. seconds = 30;
  252. temp = map.get(points, p_uuid) + 2;
  253. map.add(points, p_uuid, temp);
  254. if(temp >= winpoints) {
  255. winner_uuid = p_uuid;
  256. goto("win");
  257. }
  258. }
  259. map.add(times, p_uuid, seconds);
  260. }
  261. sgoto(20, "loop");
  262. gosub("updatedisplay");
  263. goto("checkgame");
  264. @updatedisplay
  265. minigame.displayResetAll();
  266. displayindex = 0;
  267. minigame.displayAll(displayindex++, "§6Catcher");
  268. for(i = 0; i < list.getSize(seekerlist); i++) {
  269. minigame.displayAll(displayindex++, player.getName(list.getIndex(seekerlist, i)));
  270. }
  271. minigame.displayAll(displayindex++, "");
  272. minigame.displayAll(displayindex++, concat("§6Points §r(Goal: ", text.number(winpoints), ")"));
  273. for(i = 0; i < list.getSize(player_list); i++) {
  274. p_uuid = list.getIndex(player_list, i);
  275. minigame.displayAll(displayindex++, concat(text.number(map.get(points, p_uuid)), " ", player.getName(p_uuid)));
  276. }
  277. for(i = 0; i < list.getSize(escaperlist); i++) {
  278. p_uuid = list.getIndex(escaperlist, i);
  279. p = player.get(p_uuid);
  280. display.add(p, displayindex++, "");
  281. display.add(p, displayindex++, "§6Counter");
  282. display.add(p, displayindex++, concat(text.number(map.get(times, p_uuid))));
  283. }
  284. return;
  285. function setSeeker(player) {
  286. setStackIcons(player, $seeker_skills);
  287. player_uuid = player.getUuid(player);
  288. entity.setHealth(player, 20);
  289. player.setHunger(player, 20);
  290. player.setSaturation(player, 5);
  291. entity.clearEffects(player);
  292. player.clearInventory(player);
  293. list.add($seekerlist, player_uuid);
  294. list.remove($escaperlist, player_uuid);
  295. giveSeekerItems(player);
  296. entity.teleport(player, $seeker_spawn_loc);
  297. entity.addEffect(player, "slowness", $slowtime, 6);
  298. entity.addEffect(player, "jump_boost", $slowtime, 128);
  299. }
  300. function setEscaper(player) {
  301. setStackIcons(player, $hider_skills);
  302. player_uuid = player.getUuid(player);
  303. entity.setHealth(player, 20);
  304. player.setHunger(player, 20);
  305. player.setSaturation(player, 5);
  306. entity.clearEffects(player);
  307. player.clearInventory(player);
  308. list.add($escaperlist, player_uuid);
  309. list.remove($seekerlist, player_uuid);
  310. player.giveItem(player, $diapickaxe);
  311. player.giveItem(player, $stick);
  312. player.giveItem(player, $blocks512);
  313. map.add($times, player_uuid, 30);
  314. entity.teleport(player, $escaper_spawn_loc);
  315. }
  316. function giveSeekerItems(player) {
  317. player.giveItem(player, $ironpickaxe);
  318. player.giveItem(player, $blocks64);
  319. }
  320. function setCatchLastExeTime(player, skill_name) {
  321. player_uuid = player.getUuid(player);
  322. player_map = map.getOrDefault($cooldown_map, player_uuid, map.new());
  323. map.add(player_map, skill_name, time.getMillis());
  324. map.add($cooldown_map, player_uuid, player_map);
  325. }
  326. function getCatchLastExeTime(player, skill_name) {
  327. player_map = map.get($cooldown_map, player.getUuid(player));
  328. if(player_map == null) {
  329. return 0;
  330. }
  331. return map.getOrDefault(player_map, skill_name, 0);
  332. }
  333. function setStackIcons(player, skills_list) {
  334. stacks.clear(player);
  335. for(h = 0; h < list.getSize(skills_list); h++) {
  336. skill = list.getIndex(skills_list, h);
  337. icon = skill[2];
  338. stacks.set(player, h, icon);
  339. }
  340. stacks.setActive(player, true);
  341. }
  342. function addSeekerSkill(skill_name, cooldown, icon, effecttime, amplifier, offensive, tech_name) {
  343. skill = array.new(7);
  344. skill[0] = skill_name;
  345. skill[1] = cooldown; //s
  346. skill[2] = icon;
  347. skill[3] = effecttime; //s
  348. skill[4] = amplifier;
  349. skill[5] = offensive;
  350. skill[6] = tech_name;
  351. list.add($seeker_skills, skill);
  352. }
  353. function addHiderSkill(skill_name, cooldown, icon, effecttime, amplifier, offensive, tech_name) {
  354. skill = array.new(7);
  355. skill[0] = skill_name;
  356. skill[1] = cooldown; //s
  357. skill[2] = icon;
  358. skill[3] = effecttime; //s
  359. skill[4] = amplifier;
  360. skill[5] = offensive;
  361. skill[6] = tech_name;
  362. list.add($hider_skills, skill);
  363. }
  364. @player_logout
  365. @player_giveup
  366. minigame.speakAll(gamename, concat("§6", player.getName(player), " §rhas left the game."));
  367. script = script.getFromId(script_id);
  368. minigame.kickPlayer(script, player);
  369. player_uuid = player.getUuid(player);
  370. map.remove(points, player_uuid);
  371. list.remove(seekerlist, player_uuid);
  372. list.remove(escaperlist, player_uuid);
  373. if(list.getSize(player_list) < minplayers) {
  374. minplayers--;
  375. if(--seeker_amount == 0) {
  376. winner_uuid = list.getIndex(player_list, 0);
  377. goto("win");
  378. }
  379. }
  380. if(list.contains(seekerlist, player_uuid)) {
  381. //Ersatz-Sucher erstellen
  382. p = player.get(list.getIndex(escaperlist, math.random(0, list.getSize(escaperlist) - 1)));
  383. setSeeker(p);
  384. speakPrefix(p, gamename, "A catcher has left. You are a catcher now.");
  385. gosub("updatedisplay");
  386. }
  387. goto("checkgame");
  388. @win
  389. winnername = player.getName(winner_uuid);
  390. for(i = 0; i < list.getSize(player_list); i++) {
  391. p_uuid = list.getIndex(player_list, i);
  392. p = player.get(p_uuid);
  393. speakPrefix(p, gamename, concat("§6", winnername, "§r has won."));
  394. player.tpGamesLobby(p);
  395. resetplayer(p);
  396. p_id = player.getId(p);
  397. last_record = getPoints(rankingtable, p_id);
  398. if(p_uuid == winner_uuid) {
  399. last_record++;
  400. }
  401. playedgames = getPlayedGames(rankingtable, p_id) + 1;
  402. setRanking(rankingtable, p_id, last_record, playedgames);
  403. minigame.statsHeader(p, gamename, "§e");
  404. minigame.statsLine(p, "§e", "Played games", text.number(playedgames));
  405. minigame.statsLine(p, "§e", "Won games", text.number(last_record));
  406. if(playedgames != 0) {
  407. minigame.statsLine(p, "§e", "Win ratio", concat(text.number(math.roundComma((last_record / playedgames) * 100, 2)), "%"));
  408. }
  409. iter = list.iterator(placedblocks);
  410. while(hasNext(iter)) {
  411. block.set(next(iter), "minecraft:air");
  412. }
  413. iter = map.iterator(brokenblocks);
  414. while(hasNext(iter)) {
  415. element = next(iter);
  416. loc = map.getKey(element);
  417. type = map.getValue(element);
  418. block.set(loc, type);
  419. }
  420. block.set(dia_loc, "minecraft:diamond_block");
  421. entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
  422. }
  423. script = script.getFromId(script_id);
  424. minigame.kickAllPlayers(script);
  425. minigame.term(script, gamesignloc);
  426. term();