u_games.txt 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. @simplelobby
  2. wait();
  3. if(event == "living_pre_hurt") {
  4. if(!isPlayer(living_entity)) {
  5. goto("simplelobby");
  6. }
  7. player = living_entity;
  8. if(!player.hasMinigameId(player, script_id)) {
  9. goto("simplelobby");
  10. }
  11. cancel = true;
  12. if(specific_lobby_handling != null && specific_lobby_handling) {
  13. gosub("specificLobbyHandling");
  14. }
  15. goto("simplelobby");
  16. }
  17. if(event == "entity_mount") {
  18. if(!isPlayer(rider)) {
  19. goto("simplelobby");
  20. }
  21. player = rider;
  22. }
  23. if(!player.hasMinigameId(player, script_id)) {
  24. goto("simplelobby");
  25. }
  26. if(specific_lobby_handling != null && specific_lobby_handling) {
  27. gosub("specificLobbyHandling");
  28. }
  29. if(event == "player_join") {
  30. gosub("lobbycore");
  31. }
  32. elseif(event == "block_break" || event == "block_place") {
  33. cancel = true;
  34. }
  35. elseif(event == "player_logout" || event == "player_giveup") {
  36. gosub("leavelobbycore");
  37. }
  38. elseif(event == "custom_command") {
  39. if(player != null) {
  40. if(command == "startgame") {
  41. if(manual_start != null && manual_start) {
  42. if(started) {
  43. msg.prefix(player, gamename, "Already started.");
  44. goto("simplelobby");
  45. }
  46. counterindex = 3;
  47. goto("startcountdown");
  48. } else {
  49. if(perm.has(player, "startgame.jump")) {
  50. gosub("jumpstart");
  51. } else {
  52. perm.no(player, "startgame.jump");
  53. }
  54. }
  55. }
  56. }
  57. }
  58. goto("simplelobby");
  59. @lobbycore
  60. minigame.speakAll(gamename, concat("§8", player.getNickName(player), "§r joined the game."));
  61. if(no_lobby_tp == null || !no_lobby_tp) {
  62. modTimer.entityTeleport(player, lobbyspawnloc);
  63. }
  64. if(no_core_reset == null || !no_core_reset) {
  65. resetplayer(player);
  66. }
  67. title.setTime(player, 20, 60, 0);
  68. title.setSub(player, mapname);
  69. title.send(player, gamename);
  70. if(manual_start != null && manual_start) {
  71. return;
  72. }
  73. if(!started) {
  74. scriptlist = minigame.getPlayers(script_id);
  75. size = list.getSize(scriptlist);
  76. if(size >= minplayers) {
  77. goto("startcountdown");
  78. }
  79. @waiting
  80. started = false;
  81. counterindex = 0;
  82. if(manual_start != null && manual_start) {
  83. minigame.speakAll(gamename, "Start process stopped.");
  84. return;
  85. }
  86. waitfor = minplayers - size;
  87. if(waitfor == 1) {
  88. minigame.speakAll(gamename, concat("Waiting for §b", text.number(waitfor), " §rplayer."));
  89. } else {
  90. minigame.speakAll(gamename, concat("Waiting for §b", text.number(waitfor), " §rplayers."));
  91. }
  92. }
  93. return;
  94. @startcountdown
  95. scriptlist = minigame.getPlayers(script_id);
  96. size = list.getSize(scriptlist);
  97. if(size < minplayers) {
  98. gosub("waiting");
  99. goto("simplelobby");
  100. }
  101. if(!set.exists(indivstartchecks)) {
  102. indivstartchecks = set.new();
  103. set.add(indivstartchecks, "§3CTF");
  104. set.add(indivstartchecks, "§6SnowGame");
  105. }
  106. if(set.contains(indivstartchecks, gamename)) {
  107. if(!canStartGame()) {
  108. counterindex = 0;
  109. ignoreGoto("checklobby");
  110. goto("simplelobby");
  111. }
  112. }
  113. started = true;
  114. noticetime = list.getIndex(starttimes, counterindex);
  115. if(noticetime == 5) {
  116. for(i = 0; i < size; i++) {
  117. p = player.get(list.getIndex(scriptlist, i));
  118. title.setSub(p, mapname);
  119. title.send(p, gamename);
  120. }
  121. }
  122. if(noticetime == 0) {
  123. sign.started(gamesignloc);
  124. goto("finalstart");
  125. }
  126. noticetime2 = list.getIndex(starttimes, ++counterindex);
  127. if(noticetime == 1) {
  128. minigame.speakAll(gamename, concat("The game starts in §b", text.number(noticetime), " §rsecond."));
  129. } else {
  130. minigame.speakAll(gamename, concat("The game starts in §b", text.number(noticetime), " §rseconds."));
  131. }
  132. stime = (noticetime - noticetime2) * 20;
  133. sgoto(stime, "startcountdown");
  134. for(i = 0; i < size; i++) {
  135. p = player.get(list.getIndex(scriptlist, i));
  136. sound.spawnForPlayer(p, join_sound, sound_category_ambient);
  137. }
  138. ignoreGoto("checklobby");
  139. goto("simplelobby");
  140. @leavelobbycore
  141. minigame.speakAll(gamename, concat("§8", player.getNickName(player), "§r left the game."));
  142. script = script.getFromId(script_id);
  143. if(player.isPartyLeader(player)) {
  144. leader_uuid = player.getUuid(player);
  145. scriptlist = minigame.getPlayers(script_id);
  146. list = party.getList(player.getPartyId(player));
  147. iter = list.iterator(list);
  148. while(hasNext(iter)) {
  149. p_uuid = next(iter);
  150. p = player.get(p_uuid);
  151. if(list.contains(scriptlist, p_uuid)) {
  152. minigame.kickPlayer(script, p);
  153. }
  154. }
  155. } else {
  156. minigame.kickPlayer(script, player);
  157. }
  158. size = list.getSize(minigame.getPlayers(script_id));
  159. if(size == 0) {
  160. minigame.term(script, $gamesignloc);
  161. }
  162. if(size < minplayers) {
  163. gosub("waiting");
  164. goto("simplelobby");
  165. }
  166. return;
  167. @jumpstart
  168. if(started) {
  169. if(counterindex < 5) {
  170. counterindex = 5;
  171. minigame.speakAll(gamename, "Left time reduced to §b5 §rseconds.");
  172. } else {
  173. msg.prefix(player, gamename, "Left time can't be reduced.");
  174. }
  175. } else {
  176. msg.prefix(player, gamename, "Game is not starting.");
  177. }
  178. return;
  179. @setstart
  180. minigame.loadLobbyEvents();
  181. minigame.setStarttimesList();
  182. minigame.setupMultiplayer();
  183. return;
  184. //--------------------------------------------------
  185. //Minigame-Utils
  186. //--------------------------------------------------
  187. function minigame.loadLobbyEvents() {
  188. event.load("player_join");
  189. event.load("player_logout");
  190. event.load("player_giveup");
  191. event.load("block_break");
  192. event.load("block_place");
  193. event.load("block_click");
  194. event.load("living_pre_hurt");
  195. event.load("custom_command");
  196. }
  197. function minigame.setStarttimesList() {
  198. $starttimes = list.new();
  199. list.add($starttimes, 20);
  200. list.add($starttimes, 15);
  201. list.add($starttimes, 10);
  202. list.add($starttimes, 5);
  203. list.add($starttimes, 4);
  204. list.add($starttimes, 3);
  205. list.add($starttimes, 2);
  206. list.add($starttimes, 1);
  207. list.add($starttimes, 0);
  208. }
  209. function minigame.setupMultiplayer() {
  210. $counterindex = 0;
  211. $started = false;
  212. $sound_category_ambient = sound.getCategory("ambient");
  213. $sound_category_player = sound.getCategory("player");
  214. $join_sound = sound.get("minecraft:block.note_block.bass");
  215. $pling_sound = sound.get("minecraft:block.note_block.pling");
  216. $gamesworldloc = world.getGamesSpawn();
  217. }
  218. function minigame.setLastPos(player) {
  219. map.add(getScriptVar("lobbylastpos"), player.getUuid(player), entity.getLocation(player));
  220. }
  221. function minigame.getLastPos(player) {
  222. return map.getOrDefault(getScriptVar("lobbylastpos"), player.getUuid(player), world.getGamesSpawn());
  223. }
  224. function minigame.isStarted(sign_loc) {
  225. return block.getSign(sign_loc, 3) == "§bStarted";
  226. }
  227. function minigame.getSignLoc(sign_name) {
  228. return map.get(getScriptVar("gamesigns"), sign_name);
  229. }
  230. function minigame.term(script, gamesignloc) {
  231. setScriptVar("sign_loc", gamesignloc);
  232. script.callEvent("term_script");
  233. sign.ready(gamesignloc);
  234. script.term(script);
  235. }
  236. function minigame.speakAll(prefix, message) {
  237. iter = list.iterator(minigame.getPlayers($script_id));
  238. while(hasNext(iter)) {
  239. p_uuid = next(iter);
  240. p = player.get(p_uuid);
  241. msg.prefix(p, prefix, message);
  242. }
  243. }
  244. function minigame.msgAll(message) {
  245. iter = list.iterator(minigame.getPlayers($script_id));
  246. while(hasNext(iter)) {
  247. p_uuid = next(iter);
  248. p = player.get(p_uuid);
  249. msg(p, message);
  250. }
  251. }
  252. function minigame.displayAll(line, message) {
  253. iter = list.iterator(minigame.getPlayers($script_id));
  254. while(hasNext(iter)) {
  255. p_uuid = next(iter);
  256. p = player.get(p_uuid);
  257. display.add(p, line, message);
  258. }
  259. }
  260. function minigame.titleAll(title, subtitle, fadeIn, show, fadeOut) {
  261. iter = list.iterator(minigame.getPlayers($script_id));
  262. while(hasNext(iter)) {
  263. p_uuid = next(iter);
  264. p = player.get(p_uuid);
  265. title.setTime(p, fadeIn, show, fadeOut);
  266. title.setSub(p, subtitle);
  267. title.send(p, title);
  268. }
  269. }
  270. function minigame.displayRemoveAll(line) {
  271. iter = list.iterator(minigame.getPlayers($script_id));
  272. while(hasNext(iter)) {
  273. p_uuid = next(iter);
  274. p = player.get(p_uuid);
  275. display.remove(p, line);
  276. }
  277. }
  278. function minigame.displayResetAll() {
  279. iter = list.iterator(minigame.getPlayers($script_id));
  280. while(hasNext(iter)) {
  281. p_uuid = next(iter);
  282. p = player.get(p_uuid);
  283. display.reset(p);
  284. }
  285. }
  286. function minigame.statsHeader(player, gamename, colorcode) {
  287. msg(player, concat("[", gamename, "§r] §r---= ", colorcode, "Statistic §r=---"));
  288. }
  289. function minigame.statsLine(player, colorcode, string, value) {
  290. msg(player, concat(colorcode, " -§r ", string, ": ", colorcode, value));
  291. }
  292. function getTeamWithLowestPeople(team_lists, numberofteams) {
  293. teamlist = map.get(team_lists, 0);
  294. lowest = list.getSize(teamlist);
  295. lowestteam = 0;
  296. for(i = 1; i < numberofteams; i++) {
  297. teamlist = map.get(team_lists, i);
  298. size = list.getSize(teamlist);
  299. if(size < lowest) {
  300. lowest = size;
  301. lowestteam = i;
  302. }
  303. }
  304. return lowestteam;
  305. }
  306. function minigame.kickPlayer(script, player) {
  307. resetplayer(player);
  308. player.tpGamesLobby(player);
  309. script_id = script.getId(script);
  310. list = minigame.getPlayers(script_id);
  311. list.remove(list, player.getUuid(player));
  312. sign.players($gamesignloc, list.getSize(list), $maxplayers);
  313. set.remove(player.getMinigameIds(player), script_id);
  314. }
  315. function minigame.kickAllPlayers(script) {
  316. player_list = minigame.getPlayers(script.getId(script));
  317. list = list.new();
  318. //Create copy
  319. iter = list.iterator(player_list);
  320. while(hasNext(iter)) {
  321. list.add(list, next(iter));
  322. }
  323. iter = list.iterator(list);
  324. while(hasNext(iter)) {
  325. minigame.kickPlayer(script, player.get(next(iter)));
  326. }
  327. }
  328. function minigame.getPlayers(script_id) {
  329. map = getScriptVar("script_players");
  330. list = map.get(map, script_id);
  331. if(list == null) {
  332. list = list.new();
  333. map.add(map, script_id, list);
  334. }
  335. return list;
  336. }
  337. function minigame.setWon(player_or_id, game_short, amount) {
  338. config = playerdata.getGames(player_or_id);
  339. config.set(config, concat("won.", game_short), amount);
  340. config.saveAsync(config);
  341. }
  342. function minigame.getWon(player_or_id, game_short) {
  343. config = playerdata.getGames(player_or_id);
  344. return config.getDouble(config, concat("won.", game_short), 0);
  345. }
  346. function minigame.setPlayed(player_or_id, game_short, amount) {
  347. config = playerdata.getGames(player_or_id);
  348. config.set(config, concat("played.", game_short), amount);
  349. config.saveAsync(config);
  350. }
  351. function minigame.getPlayed(player_or_id, game_short) {
  352. config = playerdata.getGames(player_or_id);
  353. return config.getDouble(config, concat("played.", game_short), 0);
  354. }
  355. function minigame.addPlayed(player_or_id, game_short, amount) {
  356. config = playerdata.getGames(player_or_id);
  357. new_amount = config.getDouble(config, concat("played.", game_short), 0) + amount;
  358. config.set(config, concat("played.", game_short), new_amount);
  359. config.saveAsync(config);
  360. }
  361. //--------------------------------------------------
  362. //Player-Utils
  363. //--------------------------------------------------
  364. function player.tpGamesLobby(player) {
  365. modTimer.entityTeleport(player, minigame.getLastPos(player));
  366. inv = player.getInv(player);
  367. inv.setItem(inv, 0, read.item("minecraft:compass"));
  368. }
  369. function player.resetMinigames(player) {
  370. id_set = player.getMinigameIds(player);
  371. set.clear(id_set);
  372. }
  373. function player.hasMinigameId(player, script_id) {
  374. set = player.getMinigameIds(player);
  375. return set.contains(set, script_id);
  376. }
  377. function resetplayer(player) {
  378. entity.cleareffects(player);
  379. living.setHealth(player, 20);
  380. player.setHunger(player, 20);
  381. player.setSaturation(player, 5);
  382. display.reset(player);
  383. player.clearInventory(player);
  384. player.showDefaultStacks(player);
  385. status.reset(player);
  386. entity.setName(player, player.getName(player));
  387. boss.send(player, "REMOVE");
  388. player.setSpeed(player, 1);
  389. entity.setGravity(player, true);
  390. inv.close(player);
  391. displayMoney(player, getMoney(player));
  392. }
  393. //--------------------------------------------------
  394. //Ranking-Utils
  395. //--------------------------------------------------
  396. //Tabelle in Datenbank registrieren
  397. function ranking.register(rankingtable) {
  398. databank.workerExecute(databank.prepare(concat("CREATE TABLE IF NOT EXISTS ", rankingtable, " (player_id INT NOT NULL PRIMARY KEY, points INT NOT NULL, sec_points INT);")));
  399. }
  400. //Gibt zurück, ob der Spieler bereits im Ranking gelistet ist
  401. function ranking.isPlayerRegisterd(rankingtable, player_id) {
  402. stmt = databank.prepare(concat("SELECT points FROM ", rankingtable, " WHERE player_id = ?;"));
  403. databank.setInt(stmt, 1, player_id);
  404. result = databank.execute(stmt);
  405. if(databank.next(result)) {
  406. registered = true;
  407. } else {
  408. registered = false;
  409. }
  410. databank.close(result);
  411. databank.close(stmt);
  412. return registered;
  413. }
  414. //Setzt die Rekord-Punkte eines Spielers
  415. function ranking.setPoints(rankingtable, player_or_id, points) {
  416. player_id = player.getValidId(player_or_id);
  417. if(ranking.isPlayerRegisterd(rankingtable, player_id)) {
  418. stmt = databank.prepare(concat("UPDATE ", rankingtable, " SET points = ? WHERE player_id = ?;"), false);
  419. } else {
  420. stmt = databank.prepare(concat("INSERT INTO ", rankingtable, " (points, player_id) VALUES (?,?);"), false);
  421. }
  422. databank.setInt(stmt, 1, points);
  423. databank.setInt(stmt, 2, player_id);
  424. databank.workerExecute(stmt);
  425. }
  426. //Setzt die sekundären Rekord-Punkte eines Spielers
  427. function ranking.setSecPoints(rankingtable, player_or_id, points, sec_points) {
  428. player_id = player.getValidId(player_or_id);
  429. if(ranking.isPlayerRegisterd(rankingtable, player_id)) {
  430. stmt = databank.prepare(concat("UPDATE ", rankingtable, " SET points = ?, sec_points = ? WHERE player_id = ?;"), false);
  431. } else {
  432. stmt = databank.prepare(concat("INSERT INTO ", rankingtable, " (points, sec_points, player_id) VALUES (?,?,?);"), false);
  433. }
  434. databank.setInt(stmt, 1, points);
  435. databank.setInt(stmt, 2, sec_points);
  436. databank.setInt(stmt, 3, player_id);
  437. databank.workerExecute(stmt);
  438. }
  439. //Gibt die gesamte Rangtabelle zurück. Liste mit Arrays
  440. function ranking.getArray(rankingtable, order, order2) {
  441. ranking_list = list.new();
  442. if(order2 == null) {
  443. stmt = databank.prepare(concat("SELECT player_id, points,sec_points FROM ", rankingtable, " ORDER BY points ", order, ";"));
  444. } else {
  445. stmt = databank.prepare(concat("SELECT player_id, points,sec_points FROM ", rankingtable, " ORDER BY points ", order, ", sec_points ", order2, ";"));
  446. }
  447. result = databank.execute(stmt);
  448. while(databank.next(result)) {
  449. a = array.new(3);
  450. a[0] = databank.getInt(result, 1); //player_id
  451. a[1] = databank.getInt(result, 2); //points
  452. a[2] = databank.getInt(result, 3); //sec_points
  453. list.add(ranking_list, a);
  454. }
  455. databank.close(result);
  456. databank.close(stmt);
  457. return ranking_list;
  458. }
  459. //Gibt Daten des Spieler von Platz n als Array zurück
  460. function ranking.getArrayFromRank(rankingtable, rank, order, order2) {
  461. ranking_list = ranking.getArray(rankingtable, order, order2);
  462. list_size = list.getSize(ranking_list);
  463. index = rank - 1;
  464. if(index >= list_size || index < 0) {
  465. return null;
  466. }
  467. a = list.getIndex(ranking_list, index);
  468. return a;
  469. }
  470. //Gibt den Spieler von Platz n zurück
  471. function ranking.getPlayerIdFromRank(rankingtable, rank, order, order2) {
  472. a = ranking.getArrayFromRank(rankingtable, rank, order, order2);
  473. if(a == null) {
  474. return -1;
  475. }
  476. return a[0];
  477. }
  478. //Gibt die Punkte von Platz n zurück
  479. function ranking.getPointsFromRank(rankingtable, rank, order, order2) {
  480. a = ranking.getArrayFromRank(rankingtable, rank, order, order2);
  481. if(a == null) {
  482. return -1;
  483. }
  484. return a[1];
  485. }
  486. //Gibt die Top 10 Spieler eines Spiels zurück
  487. function ranking.getTopTenList(rankingtable, order, order2) {
  488. toptenlist = list.new();
  489. ranking_list = ranking.getArray(rankingtable, order, order2);
  490. list_size = list.getSize(ranking_list);
  491. for(i = 0; i < list_size; i++) {
  492. list.add(toptenlist, list.getIndex(ranking_list, i));
  493. }
  494. return toptenlist;
  495. }
  496. //Gibt die Statistik eines Spiels zurück
  497. function ranking.getPlayerStats(player_id, rankingtable, order, order2) {
  498. ranking_list = ranking.getArray(rankingtable, order, order2);
  499. list_size = list.getSize(ranking_list);
  500. for(i = 0; i < list_size; i++) {
  501. a = list.getIndex(ranking_list, i);
  502. if(a[0] == player_id) {
  503. return a;
  504. }
  505. }
  506. return null;
  507. }
  508. //Gibt den Rang eines Spielers zurück
  509. function ranking.getPlayerRank(player_id, rankingtable, order, order2) {
  510. ranking_list = ranking.getArray(rankingtable, order, order2);
  511. list_size = list.getSize(ranking_list);
  512. for(i = 0; i < list_size; i++) {
  513. a = list.getIndex(ranking_list, i);
  514. if(a[0] == player_id) {
  515. return i + 1;
  516. }
  517. }
  518. return -1;
  519. }
  520. //Entfernt einen Spieler aus der Statistik
  521. function ranking.removePlayer(player_id, rankingtable, game_short) {
  522. stmt = databank.prepare(concat("DELETE FROM ", rankingtable, " WHERE player_id = ?;"));
  523. databank.setInt(stmt, 1, player_id);
  524. databank.workerExecute(stmt);
  525. if(game_short != null) {
  526. if(minigame.getWon(player_id, game_short) != 0) {
  527. minigame.setWon(player_id, game_short, 0);
  528. }
  529. if(minigame.getPlayed(player_id, game_short) != 0) {
  530. minigame.setPlayed(player_id, game_short, 0);
  531. }
  532. }
  533. }
  534. //--------------------------------------------------
  535. //Sign-Utils
  536. //--------------------------------------------------
  537. function sign.players(sign_loc, amount, max) {
  538. return block.setSign(sign_loc, 2, concat(text.number(amount), "/", text.number(max)));
  539. }
  540. function sign.ready(sign_loc) {
  541. return block.setSign(sign_loc, 3, "§2Ready");
  542. }
  543. function sign.started(sign_loc) {
  544. return block.setSign(sign_loc, 3, "§bStarted");
  545. }
  546. function sign.closed(sign_loc) {
  547. return block.setSign(sign_loc, 3, "§cClosed");
  548. }