hideandseek.txt 15 KB

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