u_games.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  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.setTabName(player, game_tab, team_color) {
  188. if(team_color == null) {
  189. team_color = "§r";
  190. }
  191. player_name = player.getName(player);
  192. display_name = concat(game_tab, " §7| ", team_color, player_name);
  193. player.setDisplayName(player, display_name);
  194. }
  195. function minigame.loadLobbyEvents() {
  196. event.load("player_join");
  197. event.load("player_logout");
  198. event.load("player_giveup");
  199. event.load("block_break");
  200. event.load("block_place");
  201. event.load("block_click");
  202. event.load("living_pre_hurt");
  203. event.load("custom_command");
  204. }
  205. function minigame.setStarttimesList() {
  206. $starttimes = list.new();
  207. list.add($starttimes, 20);
  208. list.add($starttimes, 15);
  209. list.add($starttimes, 10);
  210. list.add($starttimes, 5);
  211. list.add($starttimes, 4);
  212. list.add($starttimes, 3);
  213. list.add($starttimes, 2);
  214. list.add($starttimes, 1);
  215. list.add($starttimes, 0);
  216. }
  217. function minigame.setupMultiplayer() {
  218. $counterindex = 0;
  219. $started = false;
  220. $sound_category_ambient = sound.getCategory("ambient");
  221. $sound_category_player = sound.getCategory("player");
  222. $join_sound = sound.get("minecraft:block.note_block.bass");
  223. $pling_sound = sound.get("minecraft:block.note_block.pling");
  224. $gamesworldloc = world.getGamesSpawn();
  225. }
  226. function minigame.setLastPos(player) {
  227. map.add(getScriptVar("lobbylastpos"), player.getUuid(player), entity.getLocation(player));
  228. }
  229. function minigame.getLastPos(player) {
  230. return map.getOrDefault(getScriptVar("lobbylastpos"), player.getUuid(player), world.getGamesSpawn());
  231. }
  232. function minigame.isStarted(sign_loc) {
  233. return block.getSign(sign_loc, 3) == "§bStarted";
  234. }
  235. function minigame.getSignLoc(sign_name) {
  236. return map.get(getScriptVar("gamesigns"), sign_name);
  237. }
  238. function minigame.term(script, gamesignloc) {
  239. setScriptVar("sign_loc", gamesignloc);
  240. script.callEvent("term_script");
  241. sign.ready(gamesignloc);
  242. script.term(script);
  243. }
  244. function minigame.speakAll(prefix, 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.prefix(p, prefix, message);
  250. }
  251. }
  252. function minigame.msgAll(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. msg(p, message);
  258. }
  259. }
  260. function minigame.displayAll(line, message) {
  261. iter = list.iterator(minigame.getPlayers($script_id));
  262. while(hasNext(iter)) {
  263. p_uuid = next(iter);
  264. p = player.get(p_uuid);
  265. display.add(p, line, message);
  266. }
  267. }
  268. function minigame.titleAll(title, subtitle, fadeIn, show, fadeOut) {
  269. iter = list.iterator(minigame.getPlayers($script_id));
  270. while(hasNext(iter)) {
  271. p_uuid = next(iter);
  272. p = player.get(p_uuid);
  273. title.setTime(p, fadeIn, show, fadeOut);
  274. title.setSub(p, subtitle);
  275. title.send(p, title);
  276. }
  277. }
  278. function minigame.displayRemoveAll(line) {
  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.remove(p, line);
  284. }
  285. }
  286. function minigame.displayResetAll() {
  287. iter = list.iterator(minigame.getPlayers($script_id));
  288. while(hasNext(iter)) {
  289. p_uuid = next(iter);
  290. p = player.get(p_uuid);
  291. display.reset(p);
  292. }
  293. }
  294. function minigame.statsHeader(player, gamename, colorcode) {
  295. msg(player, concat("[", gamename, "§r] §r---= ", colorcode, "Statistic §r=---"));
  296. }
  297. function minigame.statsLine(player, colorcode, string, value) {
  298. msg(player, concat(colorcode, " -§r ", string, ": ", colorcode, value));
  299. }
  300. function getTeamWithLowestPeople(team_lists, numberofteams) {
  301. teamlist = map.get(team_lists, 0);
  302. lowest = list.getSize(teamlist);
  303. lowestteam = 0;
  304. for(i = 1; i < numberofteams; i++) {
  305. teamlist = map.get(team_lists, i);
  306. size = list.getSize(teamlist);
  307. if(size < lowest) {
  308. lowest = size;
  309. lowestteam = i;
  310. }
  311. }
  312. return lowestteam;
  313. }
  314. function minigame.kickPlayer(script, player) {
  315. resetplayer(player);
  316. player.tpGamesLobby(player);
  317. script_id = script.getId(script);
  318. list = minigame.getPlayers(script_id);
  319. list.remove(list, player.getUuid(player));
  320. sign.players($gamesignloc, list.getSize(list), $maxplayers);
  321. set.remove(player.getMinigameIds(player), script_id);
  322. }
  323. function minigame.kickAllPlayers(script) {
  324. player_list = minigame.getPlayers(script.getId(script));
  325. list = list.new();
  326. //Create copy
  327. iter = list.iterator(player_list);
  328. while(hasNext(iter)) {
  329. list.add(list, next(iter));
  330. }
  331. iter = list.iterator(list);
  332. while(hasNext(iter)) {
  333. minigame.kickPlayer(script, player.get(next(iter)));
  334. }
  335. }
  336. function minigame.getPlayers(script_id) {
  337. map = getScriptVar("script_players");
  338. list = map.get(map, script_id);
  339. if(list == null) {
  340. list = list.new();
  341. map.add(map, script_id, list);
  342. }
  343. return list;
  344. }
  345. function minigame.setWon(player_or_id, game_short, amount) {
  346. config = playerdata.getGames(player_or_id);
  347. config.set(config, concat("won.", game_short), amount);
  348. config.saveAsync(config);
  349. }
  350. function minigame.getWon(player_or_id, game_short) {
  351. config = playerdata.getGames(player_or_id);
  352. return config.getDouble(config, concat("won.", game_short), 0);
  353. }
  354. function minigame.setPlayed(player_or_id, game_short, amount) {
  355. config = playerdata.getGames(player_or_id);
  356. config.set(config, concat("played.", game_short), amount);
  357. config.saveAsync(config);
  358. }
  359. function minigame.getPlayed(player_or_id, game_short) {
  360. config = playerdata.getGames(player_or_id);
  361. return config.getDouble(config, concat("played.", game_short), 0);
  362. }
  363. function minigame.addPlayed(player_or_id, game_short, amount) {
  364. config = playerdata.getGames(player_or_id);
  365. new_amount = config.getDouble(config, concat("played.", game_short), 0) + amount;
  366. config.set(config, concat("played.", game_short), new_amount);
  367. config.saveAsync(config);
  368. }
  369. //--------------------------------------------------
  370. //Player-Utils
  371. //--------------------------------------------------
  372. function player.tpGamesLobby(player) {
  373. modTimer.entityTeleport(player, minigame.getLastPos(player));
  374. inv = player.getInv(player);
  375. inv.setItem(inv, 0, read.item("minecraft:compass"));
  376. }
  377. function player.resetMinigames(player) {
  378. id_set = player.getMinigameIds(player);
  379. set.clear(id_set);
  380. }
  381. function player.hasMinigameId(player, script_id) {
  382. if(player == null) {
  383. return false;
  384. }
  385. if(script_id == null) {
  386. return false;
  387. }
  388. set = player.getMinigameIds(player);
  389. return set.contains(set, script_id);
  390. }
  391. function resetplayer(player) {
  392. entity.cleareffects(player);
  393. living.setHealth(player, 20);
  394. player.setHunger(player, 20);
  395. player.setSaturation(player, 5);
  396. display.reset(player);
  397. player.clearInventory(player);
  398. player.showDefaultStacks(player);
  399. status.reset(player);
  400. entity.setName(player, player.getName(player));
  401. boss.send(player, "REMOVE");
  402. player.setSpeed(player, 1);
  403. entity.setGravity(player, true);
  404. inv.close(player);
  405. displayMoney(player, getMoney(player));
  406. player.setTabName(player);
  407. }
  408. //--------------------------------------------------
  409. //Ranking-Utils
  410. //--------------------------------------------------
  411. //Tabelle in Datenbank registrieren
  412. function ranking.register(rankingtable) {
  413. 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);")));
  414. }
  415. //Setzt die Rekord-Punkte eines Spielers
  416. function ranking.setPoints(rankingtable, player_or_id, points) {
  417. stmt = databank.prepare(concat("INSERT INTO ", rankingtable, " (points, player_id) VALUES (?,?) ON DUPLICATE KEY UPDATE points = ?;"), false);
  418. databank.setInt(stmt, 1, points);
  419. databank.setInt(stmt, 2, player.getValidId(player_or_id));
  420. databank.setInt(stmt, 3, points);
  421. databank.workerExecute(stmt);
  422. }
  423. //Setzt die primären und sekundären Rekord-Punkte eines Spielers
  424. function ranking.setSecPoints(rankingtable, player_or_id, points, sec_points) {
  425. stmt = databank.prepare(concat("INSERT INTO ", rankingtable, " (points, sec_points, player_id) VALUES (?,?,?) ON DUPLICATE KEY UPDATE points = ?, sec_points = ?;"), false);
  426. databank.setInt(stmt, 1, points);
  427. databank.setInt(stmt, 2, sec_points);
  428. databank.setInt(stmt, 3, player.getValidId(player_or_id));
  429. databank.setInt(stmt, 4, points);
  430. databank.setInt(stmt, 5, sec_points);
  431. databank.workerExecute(stmt);
  432. }
  433. //Gibt die gesamte Rangtabelle zurück. Liste mit Arrays
  434. function ranking.getArray(rankingtable, order, order2) {
  435. ranking_list = list.new();
  436. if(order2 == null) {
  437. stmt = databank.prepare(concat("SELECT player_id, points,sec_points FROM ", rankingtable, " ORDER BY points ", order, ";"));
  438. } else {
  439. stmt = databank.prepare(concat("SELECT player_id, points,sec_points FROM ", rankingtable, " ORDER BY points ", order, ", sec_points ", order2, ";"));
  440. }
  441. result = databank.execute(stmt);
  442. while(databank.next(result)) {
  443. a = array.new(3);
  444. a[0] = databank.getInt(result, 1); //player_id
  445. a[1] = databank.getInt(result, 2); //points
  446. a[2] = databank.getInt(result, 3); //sec_points
  447. list.add(ranking_list, a);
  448. }
  449. databank.close(result);
  450. databank.close(stmt);
  451. return ranking_list;
  452. }
  453. //Gibt Daten des Spieler von Platz n als Array zurück
  454. function ranking.getArrayFromRank(rankingtable, rank, order, order2) {
  455. ranking_list = ranking.getArray(rankingtable, order, order2);
  456. list_size = list.getSize(ranking_list);
  457. index = rank - 1;
  458. if(index >= list_size || index < 0) {
  459. return null;
  460. }
  461. a = list.getIndex(ranking_list, index);
  462. return a;
  463. }
  464. //Gibt den Spieler von Platz n zurück
  465. function ranking.getPlayerIdFromRank(rankingtable, rank, order, order2) {
  466. a = ranking.getArrayFromRank(rankingtable, rank, order, order2);
  467. if(a == null) {
  468. return -1;
  469. }
  470. return a[0];
  471. }
  472. //Gibt die Punkte von Platz n zurück
  473. function ranking.getPointsFromRank(rankingtable, rank, order, order2) {
  474. a = ranking.getArrayFromRank(rankingtable, rank, order, order2);
  475. if(a == null) {
  476. return -1;
  477. }
  478. return a[1];
  479. }
  480. //Gibt die Top 10 Spieler eines Spiels zurück
  481. function ranking.getTopTenList(rankingtable, order, order2) {
  482. toptenlist = list.new();
  483. ranking_list = ranking.getArray(rankingtable, order, order2);
  484. list_size = list.getSize(ranking_list);
  485. for(i = 0; i < list_size; i++) {
  486. list.add(toptenlist, list.getIndex(ranking_list, i));
  487. }
  488. return toptenlist;
  489. }
  490. //Gibt die Statistik eines Spiels zurück
  491. function ranking.getPlayerStats(player_id, rankingtable, order, order2) {
  492. ranking_list = ranking.getArray(rankingtable, order, order2);
  493. list_size = list.getSize(ranking_list);
  494. for(i = 0; i < list_size; i++) {
  495. a = list.getIndex(ranking_list, i);
  496. if(a[0] == player_id) {
  497. return a;
  498. }
  499. }
  500. return null;
  501. }
  502. //Gibt den Rang eines Spielers zurück
  503. function ranking.getPlayerRank(player_id, rankingtable, order, order2) {
  504. ranking_list = ranking.getArray(rankingtable, order, order2);
  505. list_size = list.getSize(ranking_list);
  506. for(i = 0; i < list_size; i++) {
  507. a = list.getIndex(ranking_list, i);
  508. if(a[0] == player_id) {
  509. return i + 1;
  510. }
  511. }
  512. return -1;
  513. }
  514. //Entfernt einen Spieler aus der Statistik
  515. function ranking.removePlayer(player_id, rankingtable, game_short) {
  516. stmt = databank.prepare(concat("DELETE FROM ", rankingtable, " WHERE player_id = ?;"));
  517. databank.setInt(stmt, 1, player_id);
  518. databank.workerExecute(stmt);
  519. if(game_short != null) {
  520. if(minigame.getWon(player_id, game_short) != 0) {
  521. minigame.setWon(player_id, game_short, 0);
  522. }
  523. if(minigame.getPlayed(player_id, game_short) != 0) {
  524. minigame.setPlayed(player_id, game_short, 0);
  525. }
  526. }
  527. }
  528. //--------------------------------------------------
  529. //Sign-Utils
  530. //--------------------------------------------------
  531. function sign.players(sign_loc, amount, max) {
  532. return block.setSign(sign_loc, 2, concat(text.number(amount), "/", text.number(max)));
  533. }
  534. function sign.ready(sign_loc) {
  535. return block.setSign(sign_loc, 3, "§2Ready");
  536. }
  537. function sign.started(sign_loc) {
  538. return block.setSign(sign_loc, 3, "§bStarted");
  539. }
  540. function sign.closed(sign_loc) {
  541. return block.setSign(sign_loc, 3, "§cClosed");
  542. }