Prechádzať zdrojové kódy

update mailsystem, minigame rebuild

Marvin Löschenkohl 4 rokov pred
rodič
commit
f5f8e3cc92

+ 3 - 3
gildenpvp/gpvp.txt

@@ -3971,7 +3971,7 @@ if(item.getType(item) == "minecraft:ender_pearl") {
 	}
 	entity.damage(player, 100);
 	nachricht = concat(player_name, " starb beim Experimentieren. Enderperlen sind tödlich!");
-	sendMail("marvinius", "eropster", nachricht);
+	mail.send("marvinius", "eropster", nachricht);
 	goto("wait");
 }
 goto("wait");
@@ -3983,7 +3983,7 @@ if(list.contains(forbidden_items, item_type)) {
 	entity.remove(entity);
 	item_type = text.replace(item_type, "minecraft:", "");
 	nachricht = concat(player_name, " war ein böser Bube und hat ", item_type, " aufgesammelt.");
-	sendMail("marvinius", "eropster", nachricht);
+	mail.send("marvinius", "eropster", nachricht);
 	goto("wait");
 }
 if(removeFormat(item.getName(item)) == "Golddrop") {
@@ -4127,7 +4127,7 @@ plot_id = getPlotId(block_loc);
 if(block_type == "km:artefact") {
 	//Illegales Artefakt im Umlauf. Bewusst zulassen und eropster informieren
 	nachricht = concat(player_name, " hat ein illegales Artefakt platziert: ", block_loc);
-	sendMail("marvinius", "eropster", nachricht);
+	mail.send("marvinius", "eropster", nachricht);
 	goto("wait");
 }
 //Platzieren von Blöcken am Kampfgrundstück

+ 5 - 4
global/gamecenter.txt

@@ -63,12 +63,12 @@ addGameSign("spleefsign3", true, loc.new(gamesworld, -421, 158, -40), "minigames
 addGameSign("maednsign1", false, loc.new(gamesworld, -401, 157, -72), "minigames/maedn/maedn", "minigames/maedn/maednmap1", false);
 //addGameSign("ctfsign1", false, loc.new(gamesworld, 13, 75, 64), "minigames/capturetheflag/capturetheflag", "minigames/capturetheflag/ctfmap1", false);
 addGameSign("jrmap", true, loc.new(gamesworld, -413, 158, -40), "minigames/jumpnrun/jumpnrun", "minigames/jumpnrun/jumpnrun", true);
-addGameSign("tjrsign", false, loc.new(gamesworld, -414, 158, -40), "minigames/jumpnrun/todesjumpnrun", "minigames/jumpnrun/todesjumpnrun", true);
-addGameSign("icejrsign", false, loc.new(gamesworld, -415, 158, -40), "minigames/jumpnrun/icejumpnrun", "minigames/jumpnrun/icejumpnrun", true);
+addGameSign("tjrsign", true, loc.new(gamesworld, -414, 158, -40), "minigames/jumpnrun/todesjumpnrun", "minigames/jumpnrun/todesjumpnrun", true);
+addGameSign("icejrsign", true, loc.new(gamesworld, -415, 158, -40), "minigames/jumpnrun/icejumpnrun", "minigames/jumpnrun/icejumpnrun", true);
 addGameSign("fastbridgesign1", true, loc.new(gamesworld, -405, 158, -75), "minigames/fastbridge/fastbridge", "minigames/fastbridge/region_fastbridgemap1", false);
 addGameSign("fastbridgesign2", true, loc.new(gamesworld, -404, 158, -75), "minigames/fastbridge/fastbridge", "minigames/fastbridge/region_fastbridgemap2", false);
-addGameSign("rebuildsign1", false, loc.new(gamesworld, -423, 158, -42), "minigames/rebuild/rebuild", "minigames/rebuild/rebuildmap1", false);
-addGameSign("rebuildsign2", false, loc.new(gamesworld, -423, 158, -43), "minigames/rebuild/rebuild", "minigames/rebuild/rebuildmap2", false);
+addGameSign("rebuildsign1", true, loc.new(gamesworld, -423, 158, -42), "minigames/rebuild/rebuild", "minigames/rebuild/rebuildmap1", false);
+addGameSign("rebuildsign2", true, loc.new(gamesworld, -423, 158, -43), "minigames/rebuild/rebuild", "minigames/rebuild/rebuildmap2", false);
 addGameSign("catchsign1", false, loc.new(gamesworld, -434, 158, -49), "minigames/catch/catch", "minigames/catch/catchmap1", false);
 addGameSign("catchsign2", false, loc.new(gamesworld, -434, 158, -50), "minigames/catch/catch", "minigames/catch/catchmap2", false);
 addGameSign("leapfrogsign1", true, loc.new(gamesworld, -401, 158, -71), "minigames/leapfrog/leapfrog", "minigames/leapfrog/leapfrogmap1", true);
@@ -77,6 +77,7 @@ addGameSign("snowsign1", true, loc.new(gamesworld, -401, 158, -72), "minigames/s
 addGameSign("halmasign1", true, loc.new(gamesworld, -401, 157, -73), "minigames/halma/halma", "minigames/halma/halma_map1", false);
 addGameSign("halmasign2", true, loc.new(gamesworld, -401, 158, -73), "minigames/halma/halma", "minigames/halma/halma_map2", false);
 addGameSign("shoppingsign1", true, loc.new(gamesworld, -411, 158, -44), "minigames/shoppingchaos/shoppingchaos", "minigames/shoppingchaos/shopping_map1", false);
+//addGameSign("damesign1", false, loc.new(gamesworld, -411, 158, -44), "minigames/dame/dame", "minigames/dame/dame_map1", false);
 
 setScriptVar("gamesigns", gamesignsmap);
 

+ 121 - 201
global/mailsystem.txt

@@ -1,18 +1,10 @@
-msg("dev", "§bMailsystem §rwurde geladen");
 event.load("custom_command");
 event.load("player_login");
 
-//executeOnce = databank.prepare("CREATE TABLE IF NOT EXISTS mails (mail_id INT NOT NULL PRIMARY KEY, from INT NOT NULL, to INT NOT NULL, readed TINYINT NOT NULL, time BIGINT NOT NULL, message VARCHAR(255) NOT NULL);");
-//executeOnce2 = databank.prepare("CREATE TABLE IF NOT EXISTS playermails (player_id INT NOT NULL, mail_id INT, PRIMARY KEY(player_id, mail_id), FOREIGN KEY (player_id) REFERENCES minecraft.players(id) ON DELETE RESTRICT);");
-//databank.workerExecute(executeOnce);
-//databank.workerExecute(executeOnce2);
-
-nextmailid = ggv("SERVER", "mailid");
-if(nextmailid == null) {
-	sgv("SERVER", "mailid", 0);
-	nextmailid = 0;
-}
+databank.workerExecute(databank.prepare("CREATE TABLE IF NOT EXISTS mails (mail_id INT NOT NULL PRIMARY KEY, from_id INT NOT NULL, to_id INT NOT NULL, readed TINYINT NOT NULL, time BIGINT NOT NULL, del_time BIGINT, message VARCHAR(255) NOT NULL);"));
+sgoto(200, "timerloop");
 
+msg("dev", "§bMailsystem §rloaded.");
 @wait
 wait();
 ignoreGoto(event);
@@ -22,230 +14,158 @@ goto("wait");
 if(command == "mail") {
 	size = list.getSize(args);
 	if(size == 0) {
-		player.speak(player, "§bMail", "/mail ...");
-		msg(player, "§b - <player> <nachricht> §rSendet eine Mail");
-		msg(player, "§b - new §rZeigt alle ungelesenen Nachrichten");
-		msg(player, "§b - input §rZeigt den Posteingang");
-		msg(player, "§b - output §rZeigt den Postausgang");
-		msg(player, "§b - clear <input/output> §rLeert Postein- und ausgang");
-		msg(player, "§b - show <Mail-ID> §rZeigt die Mail aus Postein- und ausgang");
-		msg(player, "§b - remove <Mail-ID> §rLöscht die Mail aus Postein- und ausgang");
-		if(perm.has(player, "isSnuviMaster")) {
-			msg(player, "§b - reset §rLöscht ALLE Mails ");
+		speakPrefix(player, "§bMail", "/mail ...");
+		msg(player, "§b - <player> <message> §rSends a mail");
+		msg(player, "§b - new §rShows all new mails");
+		msg(player, "§b - inbox §rShows inbox");
+		msg(player, "§b - outbox §rShows outbox");
+		if(perm.has(player, "mail.reset")) {
+			msg(player, "§b - reset §rDeletes ALL mails.");
 		}
 		goto("wait");
 	}
 	arg0 = list.getIndex(args, 0);
 	if(arg0 == "new") {
 		if(size != 1) {
-			player.speak(player, "§bMail", "/mail new");
-			goto("wait");
-		}
-		getMailsStatement = databank.prepare("SELECT seckeyname FROM scriptdualmaps WHERE map = ? AND keyname = ?;");
-		databank.setString(getMailsStatement, 1, "mailin");
-		databank.setString(getMailsStatement, 2, player.getId(player));
-		result = databank.execute(getMailsStatement);
-		nextrow = databank.next(result);
-		if(!nextrow) {
-			player.speak(player, "§bMail", "Du hast keine ungelesenen Mails.");
-			databank.close(result);
-			databank.close(getMailsStatement);
-			goto("wait");
-		}
-		player.speak(player, "§bMail", "§e---= §bNeue Mails §e=---");
-		newmails = 0;
-		while(nextrow) {
-			mailid = read.number(databank.getString(result, 1));
-			readed = gdmap.get("mails", mailid, "readed");
-			if(!readed) {
-				newmails++;
-				from = player.getNameFromId(gdmap.get("mails", mailid, "from"));
-				time = gdmap.get("mails", mailid, "time");
-				message = gdmap.get("mails", mailid, "message");
-				player.speak(player, getTimeString(time), concat("§r (#", text.number(mailid), ") §6", from, " §r", "§l", message));
-				gdmap.add("mails", mailid, "readed", true);
-			}
-			nextrow = databank.next(result);
-		}
-		databank.close(result);
-		databank.close(getMailsStatement);
-		if(newmails == 0) {
-			player.speak(player, "§bMail", "Du hast keine ungelesenen Mails.");
+			speakPrefix(player, "§bMail", "/mail new");
 			goto("wait");
 		}
+		mail.showNew(player);
 		goto("wait");
 	}
-	if(arg0 == "input" || arg0 == "output") {
+	if(arg0 == "inbox" || arg0 == "outbox") {
 		if(size != 1) {
-			player.speak(player, "§bMail", "/mail input/output");
+			speakPrefix(player, "§bMail", "/mail inbox/outbox");
 			goto("wait");
 		}
-		if(arg0 == "input") {
-			map = "mailin";
-			header = "§bPosteingang";
-		} else {
-			map = "mailout";
-			header = "§bPostausgang";
-		}
-		getMailsStatement = databank.prepare("SELECT seckeyname FROM scriptdualmaps WHERE map = ? AND keyname = ? ORDER BY seckeyname ASC;");
-		databank.setString(getMailsStatement, 1, map);
-		databank.setString(getMailsStatement, 2, player.getId(player));
-		result = databank.execute(getMailsStatement);
-		nextrow = databank.next(result);
-		if(!nextrow) {
-			player.speak(player, "§bMail", "Keine Mails vorhanden.");
-			databank.close(result);
-			databank.close(getMailsStatement);
-			goto("wait");
-		}
-		player.speak(player, "§bMail", "§e---= ", header, " §e=---");
-		while(nextrow) {
-			mailid = read.number(databank.getString(result, 1));
-			from = player.getNameFromId(gdmap.get("mails", mailid, "from"));
-			to = player.getNameFromId(gdmap.get("mails", mailid, "to"));
-			readed = gdmap.get("mails", mailid, "readed");
-			time = gdmap.get("mails", mailid, "time");
-			message = gdmap.get("mails", mailid, "message");
-			colorcode = "§r";
-			if(!readed) {
-				colorcode = "§l";
-			}
-			if(arg0 == "input") {
-				player.speak(player, getTimeString(time), concat("§r (#", text.number(mailid), ") §6", from, " §r", colorcode, message));
-				gdmap.add("mails", mailid, "readed", true);
-			} else {
-				player.speak(player, getTimeString(time), concat("§r (#", text.number(mailid), ") §6", to, " §r", colorcode, message));
-			}
-			nextrow = databank.next(result);
-		}
-		databank.close(result);
-		databank.close(getMailsStatement);
+		mail.showBox(player, arg0);
 		goto("wait");
 	}
 	if(arg0 == "reset") {
 		if(size != 1) {
-			player.speak(player, "§bMail", "/mail reset");
-			goto("wait");
-		}
-		if(!perm.has(player, "isSnuviMaster")) {
-			player.speak(player, "§bMail", "Keine Berechtigung.");
-			goto("wait");
-		}
-		gdmap.removeAll("mails");
-		gdmap.removeAll("mailin");
-		gdmap.removeAll("mailout");
-		sgv("SERVER", "mailid", 0);
-		player.speak(player, "§bMail", "Alle Mails resettet");
-		goto("wait");
-	}
-	if(arg0 == "show") {
-		if(size != 2) {
-			player.speak(player, "§bMail", "/mail show <mailid>");
-			goto("wait");
-		}
-		mailid = list.getIndex(args, 1);
-		if(!isDouble(mailid)) {
-			player.speak(player, "§bMail", "Zahl erwartet.");
-			goto("wait");
-		}
-		if(!perm.has(player, "isSnuviMaster")) {
-			if(gdmap.get("mailin", player.getId(player), mailid) == null && gdmap.get("mailout", player.getId(player), mailid) == null) {
-				player.speak(player, "§bMail", "Keine Berechtigung.");
-				goto("wait");
-			}
-		} else {
-			if(gdmap.get("mails", mailid, "from") == null) {
-				player.speak(player, "§bMail", "Mail-ID existiert nicht.");
-				goto("wait");
-			}
-		}
-		from = player.getNameFromId(gdmap.get("mails", mailid, "from"));
-		to = player.getNameFromId(gdmap.get("mails", mailid, "to"));
-		readed = gdmap.get("mails", mailid, "readed");
-		time = gdmap.get("mails", mailid, "time");
-		message = gdmap.get("mails", mailid, "message");
-		colorcode = "§r";
-		if(!readed) {
-			colorcode = "§l";
-		}
-		player.speak(player, getTimeString(time), concat("§r (#", text.number(mailid), ") §6", from, " §r--> §6", to, " §r", colorcode, message));
-		goto("wait");
-	}
-	if(arg0 == "remove") {
-		if(size != 2) {
-			player.speak(player, "§bMail", "/mail remove <mailid>");
+			speakPrefix(player, "§bMail", "/mail reset");
 			goto("wait");
 		}
-		mailid = list.getIndex(args, 1);
-		if(!isDouble(mailid)) {
-			player.speak(player, "§bMail", "Zahl erwartet.");
+		if(!perm.has(player, "mail.reset")) {
+			speakPrefix(player, "§bMail", "No permission.");
 			goto("wait");
 		}
-		gdmap.remove("mailin", player.getId(player), mailid);
-		gdmap.remove("mailout", player.getId(player), mailid);
+		mail.reset();
+		speakPrefix(player, "§bMail", "All mails reset.");
 		goto("wait");
 	}
-	if(arg0 == "clear") {
-		if(size != 2) {
-			player.speak(player, "§bMail", "/mail clear input/output");
-			goto("wait");
-		}
-		arg1 = list.getIndex(args, 1);
-		if(arg1 == "input") {
-			map = "mailin";
-			wort = "Posteingang";
-		}
-		if(arg1 == "output") {
-			map = "mailout";
-			wort = "Postausgang";
-		}
-		gdmap.removeAll(map, player.getId(player));
-		player.speak(player, "§bMail", "Der ", wort, " wurde gelöscht.");
+	//send a mail
+	p_uuid = player.getUuid(arg0);
+	if(p_uuid == null) {
+		speakPrefix(player, "§bMail", "This player has never been online.");
 		goto("wait");
 	}
-	//Eine Mail wird versendet
-	if(!checkIfEverOnline(arg0)) {
-		player.speak(player, "§bMail", "Dieser Spieler war noch nie online.");
-		goto("wait");
-	}
-	nachricht = concatList(args, " ", 1, size - 1);
-	sendMail(player_name, arg0, nachricht);
-	player.speak(player, "§bMail", concat("Mail an ", arg0, " gesendet."));
+	p_name = player.getName(p_uuid);
+	mail.send(player.getName(player), p_name, concatList(args, " ", 1, size - 1));
+	speakPrefix(player, "§bMail", concat("Mail sent to ", p_name, "."));
 }
 goto("wait");
 
 @player_login
-sgoto(1, "checkfornewmails");
+mail.checkForNew(player);
+goto("wait");
+
+@timerloop
+mail.timedReset();
+sgoto(72000, "timerloop"); //Stundentakt
 goto("wait");
 
-@checkfornewmails
-getMailsStatement = databank.prepare("SELECT seckeyname FROM scriptdualmaps WHERE map = ? AND keyname = ?;");
-databank.setString(getMailsStatement, 1, "mailin");
-databank.setString(getMailsStatement, 2, player.getId(player));
-result = databank.execute(getMailsStatement);
-nextrow = databank.next(result);
-if(!nextrow) {
+function mail.showNew(player) {
+	stmt = databank.prepare("SELECT mail_id, from_id, time, message FROM mails WHERE to_id = ? AND readed = false;");
+	to_id = player.getId(player);
+	databank.setInt(stmt, 1, to_id);
+	result = databank.execute(stmt);
+	nextrow = databank.next(result);
+	if(!nextrow) {
+		speakPrefix(player, "§bMail", "You have no new mails.");
+		databank.close(result);
+		databank.close(stmt);
+		return;
+	}
+	msg(player, "[§bMail-Newt§r]");
+	while(nextrow) {
+		mail_id = databank.getInt(result, 1);
+		from = player.getNameFromId(databank.getInt(result, 2));
+		time = databank.getLong(result, 3);
+		message = databank.getString(result, 4);
+		
+		msg(player, " - ", text.hover(concat("§e", from), getTimeString(time)), " §r§l", message);
+		
+		nextrow = databank.next(result);
+	}
 	databank.close(result);
-	databank.close(getMailsStatement);
-	goto("wait");
+	databank.close(stmt);
+	mail.readedAll(to_id);
 }
-newmails = 0;
-while(nextrow) {
-	mailid = read.number(databank.getString(result, 1));
-	readed = gdmap.get("mails", mailid, "readed");
-	if(!readed) {
-		newmails++;
+
+function mail.showBox(player, box) {
+	if(box == "inbox") {
+		header = "[§bMail-Inbox§r]";
+		stmt = databank.prepare("SELECT mail_id, from_id, to_id, readed, time, message FROM mails WHERE to_id = ?;");
+		to_id = player.getId(player);
+		databank.setInt(stmt, 1, to_id);
+	} else {
+		header = "[§bMail-Outbox§r]";
+		stmt = databank.prepare("SELECT mail_id, from_id, to_id, readed, time, message FROM mails WHERE from_id = ?;");
+		from_id = player.getId(player);
+		databank.setInt(stmt, 1, from_id);
 	}
+	result = databank.execute(stmt);
 	nextrow = databank.next(result);
-}
-databank.close(result);
-databank.close(getMailsStatement);
-if(newmails > 0) {
-	player = read.player(player_name);
-	if(newmails > 1) {
-		player.speak(player, "§bMail", concat("§rDu hast §b", text.number(newmails), "§r neue Mails"));
-	} else {
-		player.speak(player, "§bMail", "§rDu hast §b1 §rneue Mail");
+	if(!nextrow) {
+		speakPrefix(player, "§bMail", "You have no mails in this box.");
+		databank.close(result);
+		databank.close(stmt);
+		return;
+	}
+	msg(player, header);
+	while(nextrow) {
+		mail_id = databank.getInt(result, 1);
+		from = player.getNameFromId(databank.getInt(result, 2));
+		to = player.getNameFromId(databank.getInt(result, 3));
+		readed = databank.getBool(result, 4);
+		if(readed) {
+			colorcode = "§r";
+		} else {
+			colorcode = "§l";
+		}
+		time = databank.getLong(result, 5);
+		message = databank.getString(result, 6);
+		if(box == "inbox") {
+			msg(player, " - ", text.hover(concat("§e", from), getTimeString(time)), " §r", colorcode, message);
+		} else {
+			msg(player, " - ", text.hover(concat("§e", to), getTimeString(time)), " §r", colorcode, message);
+		}
+		nextrow = databank.next(result);
+	}
+	databank.close(result);
+	databank.close(stmt);
+	if(box == "inbox") {
+		mail.readedAll(to_id);
 	}
 }
-goto("wait");
+
+function mail.readedAll(player_id) {
+	stmt = databank.prepare("UPDATE mails SET readed = true, del_time = ? WHERE to_id = ? AND readed = false;");
+	databank.setLong(stmt, 1, time.getMillis() + 10209600000); //+2 weeks
+	databank.setInt(stmt, 2, player_id);
+	databank.workerExecute(stmt);
+}
+
+function mail.timedReset() {
+	stmt = databank.prepare("DELETE FROM mails WHERE del_time < ?");
+	databank.setLong(stmt, 1, time.getMillis());
+	databank.workerExecute(stmt);
+}
+
+function mail.reset() {
+	databank.workerExecute(databank.prepare("DELETE FROM mails"));
+	server_config = getScriptVar("server_config");
+	config.set(server_config, "mail_id", 0);
+	config.saveAsync(server_config);
+}

+ 1 - 1
global/skyblock.txt

@@ -250,7 +250,7 @@ for(sbz = -14999; sbz <= 15501; sbz += 250) {
 	}
 }
 player.speak(player, präfix, "§rDie ganze Welt ist mit Grundstücken besetzt; marvinius wurde informiert per Mail");
-sendMail(player_name, "marvinius", "SkyBlock Welt mit Inseln voll");
+mail.send(player_name, "marvinius", "SkyBlock Welt mit Inseln voll");
 return;
 
 @actualizePlotId

+ 1 - 1
global/ticketsystem.txt

@@ -190,7 +190,7 @@ if(command == "ticket") {
 			player.speak(name, präfix, "§rDein Ticket wurde reportet");
 			player.speak(player, präfix, "§rDu hast das Ticket reportet");
 			list.remove(solvingtickets, ticket);
-			sendMail(player.getName(player), "marvinius", concat("Ticket Report: ", name, " / ", nachricht));
+			mail.send(player.getName(player), "marvinius", concat("Ticket Report: ", name, " / ", nachricht));
 		}
 		goto("wait");
 	}

+ 304 - 0
minigames/dame/dame.txt

@@ -0,0 +1,304 @@
+//Schwarz muss IMMER nach Süden schauen!!!
+//Weiß muss IMMER nach Norden schauen!!!
+
+rankingtable = "dameranks";
+
+teams = map.new();
+block_click_catcher = set.new();
+pointed_loc = loc.new(gamesworld, 0, 0, 0); //Default-Wert, um Error zu verhindern
+gamename = "§eDame";
+
+gosub("setstart");
+goto("simplelobby");
+
+@finalstart
+player_list = minigame.getPlayers(script_id);
+minigame.speakAll(gamename, "The game has started.");
+
+black_token = concat("minecraft:wither_skeleton_skull[rotation=8]");
+white_token = concat("minecraft:wither_skeleton_skull[rotation=0]");
+black_token_plus = concat("minecraft:black_banner[rotation=0]");
+white_token_plus = concat("minecraft:white_banner[rotation=8]");
+
+for(i = 0; i < list.getSize(player_list); i++) {
+	player_uuid = list.getIndex(player_list, i);
+	player = player.get(player_uuid);
+	entity.teleport(player, map.get(spawn_locs, i));
+	player.setGamemode(player, "survival");
+	player.setFly(player, true);
+	map.add(teams, player_uuid, i); //Team-Zuweisung
+	
+}
+
+next_player_uuid = list.getIndex(player_list, math.random(0, list.getSize(player_list) - 1));
+setNextPlayer(next_player_uuid);
+jump_moves = false;
+
+@wait
+wait();
+if(player.hasMinigameId(player, script_id)) {
+	ignoreGoto(event);
+}
+goto("wait");
+
+@block_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(action == "left" && set.contains(block_click_catcher, player)) {
+	set.remove(block_click_catcher, player);
+	goto("wait");
+} else {
+	set.add(block_click_catcher, player);
+}
+//Korrekter Spieler?
+if(player.getUUid(player) != next_player_uuid) {
+	speakPrefix(player, gamename, "It´s not your turn.");
+	goto("wait");
+}
+//Spielfigur ausgewählt?
+if(map.contains(tokens_map2, block_type)) {
+	//Spielfigur der eigenen Farbe ausgewählt?
+	if(map.get(tokens_map2, block_type) == map.get(teams, player.getUuid(player))) {
+		//Zuletzt ausgewählte Spielfigur der eigenen Farbe speichern, wenn nicht bereits gezogen (gesprungen) wurde
+		if(jump_moves) {
+			speakPrefix(player, gamename, "Already moved with another game piece.");
+			goto("wait");
+		}
+		token_loc = block_loc;
+		block.set(pointed_loc, basic_block);
+		pointed_loc = loc.mod(block_loc, 0, -1, 0);
+		block.set(pointed_loc, point_block);
+	} else {
+		speakPrefix(player, gamename, "Not your game piece.");
+	}
+	goto("wait");
+}
+//Wurde am Spielbrett ein gültiges Feld angeklickt?
+if(block_type == basic_block) {
+	//Wurde bereits eine Spielfigur der eigenen Farbe ausgewählt?
+	if(token_loc != null) {
+		//Ist der Zug gültig? Ziehen / Springen
+		diff_x = loc.getX(block_loc) - loc.getX(token_loc);
+		diff_z = loc.getZ(block_loc) - loc.getZ(token_loc);
+		possible_move = false;
+		for(i = 0; i < list.getSize(possible_move_differences); i++) {
+			a = list.getIndex(possible_move_differences, i);
+			x = a[0];
+			z = a[1];
+			//Passt der Vektor des Zuges?
+			if(math.abs(diff_x) == x && math.abs(diff_z) == z) {
+				possible_move = true;
+				move_type = "drag";
+				if(i >= jumping_index) {
+					//Sprung. Checken, ob sich eine Spielfigur auf halber Strecke befindet
+					middle_loc = loc.mod(token_loc, diff_x / 2, 0, diff_z / 2);
+					if(!map.contains(tokens_map2, block.getType(middle_loc))) {
+						speakPrefix(player, gamename, "Invalid move.");
+						goto("wait");
+					}
+					move_type = "jump";
+				}
+				//Ist der Zielblock belegt?
+				aim_block = loc.mod(block_loc, 0, 1, 0);
+				if(block.getType(aim_block) != "minecraft:air") {
+					goto("wait");
+				}
+				//Die Spielfigur kann nicht gezogen werden, wenn bereits gesprungen wurde
+				if(move_type == "drag" && jump_moves) {
+					speakPrefix(player, gamename, "Move not possible. Already overjumped a game piece.");
+					goto("wait");
+				}
+				//Zug der Spielfigur
+				team = map.get(teams, player.getUuid(player));
+				banner_type = map.get(tokens_map, team);
+				rotation = map.get(rotations_map, team);
+				block.set(token_loc, "minecraft:air");
+				block.set(aim_block, concat(banner_type, "[rotation=", rotation, "]"));
+				token_loc = aim_block;
+				block.set(pointed_loc, basic_block);
+				if(move_type == "drag") {
+					goto("nextplayer");
+				} else {
+					jump_moves = true;
+					pointed_loc = block_loc;
+					block.set(pointed_loc, point_block);
+				}
+			}
+		}
+		if(!possible_move) {
+			speakPrefix(player, gamename, "Invalid move.");
+			goto("wait");
+		}
+	}
+}
+goto("wait");
+
+@nextplayer
+//Gewonnen?
+team = map.get(teams, player.getUuid(player));
+token = map.get(tokens_map, team);
+list = map.get(aim_locs, team);
+iter = list.iterator(list);
+won = true;
+while(hasNext(iter)) {
+	entry = next(iter);
+	if(block.getType(entry) != token) {
+		won = false;
+	}
+}
+if(won) {
+	winner = player;
+	goto("win");
+}
+token_loc = null;
+jump_moves = false;
+//Nächsten Spieler setzen
+index = list.getIndexOf(player_list, next_player_uuid) + 1;
+if(index >= list.getSize(player_list)) {
+	index = 0;
+}
+next_player_uuid = list.getIndex(player_list, index);
+setNextPlayer(next_player_uuid);
+block.set(pointed_loc, basic_block);
+goto("wait");
+
+@custom_command
+if(command == "nextplayer") {
+	if(player.getUuid(player) == next_player_uuid) {
+		goto("nextplayer");
+	}
+}
+goto("wait");
+
+@block_break
+@block_place
+@living_is_attacked
+cancel = true;
+goto("wait");
+
+@win
+resetField();
+script = script.getFromId(script_id);
+minigame.speakAll(gamename, concat("§6", player.getName(winner), " §rhas won."));
+for(i = 0; i < list.getSize(player_list); i++) {
+	p = player.get(list.getIndex(player_list, i));
+	if(p == winner) {
+		showstats(p, true);
+	} else {
+		showstats(p, false);
+	}
+	player.setFly(p, false);
+}
+minigame.kickAllPlayers(script);
+minigame.term(script, gamesignloc);
+term();
+
+@player_logout
+@player_giveup
+minigame.speakAll(gamename, concat("§8", player.getName(player), " §ehas left the game."));
+player.setFly(player, false);
+showstats(player, false);
+script = script.getFromId(script_id);
+minigame.kickPlayer(script, player);
+size = list.getSize(player_list);
+if(size < minplayers) {
+	block.set(pointed_loc, basic_block);
+	winner = player.get(list.getIndex(player_list, 0));
+	goto("win");
+} else {
+	team = map.get(teams, player.getUuid(player));
+	token = map.get(tokens_map, team);
+	removeSpecificToken(token);
+}
+goto("wait");
+
+function setNextPlayer(next_player_uuid) {
+	team = map.get($teams, next_player_uuid);
+	color = map.get($colors_map, team);
+	next_player_name = player.getName(next_player_uuid);
+	if(text.endsWith(next_player_name, "s")) {
+		minigame.speakAll($gamename, concat("It´s ", color, next_player_name, "' §rturn."));
+	} else {
+		minigame.speakAll($gamename, concat("It´s ", color, next_player_name, "'s §rturn."));
+	}
+	next_player = player.get(next_player_uuid);
+	sound.spawnForPlayer(next_player, $pling_sound, $sound_category_ambient);
+	msg(next_player, text.click("§r[§eEnd turn§r]", "/nextplayer"));
+}
+
+function removeSpecificToken(token) {
+	//Sechseck nach festgelegter Spielfigur leeren
+	iter = list.iterator($center_locs);
+	while(hasNext(iter)) {
+		entry = next(iter);
+		if(block.getType(entry) == token) {
+			block.set(entry, "minecraft:air");
+		}
+	}
+	//Ziel-Felder nach festgelegter Spielfigur leeren
+	map_iter = map.iterator($aim_locs);
+	while(hasNext(map_iter)) {
+		list = map.getValue(next(map_iter));
+		iter = list.iterator(list);
+		while(hasNext(iter)) {
+			entry = next(iter);
+			if(block.getType(entry) == token) {
+				block.set(entry, "minecraft:air");
+			}
+		}
+	}
+	//Start-Felder nach festgelegter Spielfigur leeren
+	map_iter = map.iterator($start_locs);
+	while(hasNext(map_iter)) {
+		list = map.getValue(next(map_iter));
+		iter = list.iterator(list);
+		while(hasNext(iter)) {
+			entry = next(iter);
+			if(block.getType(entry) == token) {
+				block.set(entry, "minecraft:air");
+			}
+		}
+	}
+}
+
+function showstats(player, won) { //Player player, Boolean won
+	player_id = player.getId(player);
+	last_record = getPoints($rankingtable, player_id);
+	if(won) {
+		last_record++;
+	}
+	playedgames = getPlayedGames($rankingtable, player_id) + 1;
+	setRanking($rankingtable, player_id, last_record, playedgames);
+	
+	minigame.statsHeader(player, $gamename, "§e");
+	minigame.statsLine(player, "§e", "Won games", text.hover(text.number(last_record), "Relevant for ranking"));
+	minigame.statsLine(player, "§e", "Played games", text.number(playedgames));
+	if(playedgames != 0) {
+		minigame.statsLine(player, "§e", "Win ratio", concat(text.number(math.roundComma((last_record / playedgames) * 100, 2)), "%"));
+	}
+}
+
+function resetField() {
+	loc = $black_left_front_corner_loc;
+	resetFieldRow(loc, $black_token);
+	loc.add(loc, -1, 0, 1);
+	resetFieldRow(loc, $black_token);
+	loc.add(loc, 1, 0, 1);
+	resetFieldRow(loc, $black_token);
+	loc.add(loc, -1, 0, 3);
+	resetFieldRow(loc, $white_token);
+	loc.add(loc, 1, 0, 1);
+	resetFieldRow(loc, $white_token);
+	loc.add(loc, -1, 0, 1);
+	resetFieldRow(loc, $white_token);
+}
+
+function resetFieldRow(loc, token) {
+	x = 0;
+	for(i = 0; i < 4; i++) {
+		block.set(loc, token);
+		loc.add(loc, -2, 0, 0);
+	}
+	loc.add(loc, 8, 0, 0);
+}

+ 18 - 0
minigames/dame/dame_map1.txt

@@ -0,0 +1,18 @@
+gamesignsmap = getScriptVar("gamesigns");
+gamesignloc = map.get(gamesignsmap, "damesign1");
+gamesworld = world.get("games");
+mapname = "Dame";
+maxplayers = 2;
+minplayers = 2;
+
+black_left_front_corner_loc = loc.new(gamesworld, 3993, 102, -15);
+
+lobbyspawnloc = loc.new(gamesworld, 3990, 102, -11);
+
+spawn_locs = map.new();
+map.add(spawn_locs, 0, loc.new(gamesworld, 3990, 102, -15.5, 0.0001, 0.0001));
+map.add(spawn_locs, 1, loc.new(gamesworld, 3990, 102, -6.5, 180, 0.0001));
+
+colors_map = map.new();
+map.add(colors_map, 0, "§c");
+map.add(colors_map, 1, "§t");

+ 2 - 11
minigames/halma/halma.txt

@@ -186,16 +186,7 @@ if(index >= list.getSize(player_list)) {
 	index = 0;
 }
 next_player = player.get(list.getIndex(player_list, index));
-team = map.get(teams, next_player);
-color = map.get(colors_map, team);
-next_player_name = player.getName(next_player);
-if(text.endsWith(next_player_name, "s")) {
-	minigame.speakAll(gamename, concat("It´s ", color, next_player_name, "' §rturn."));
-} else {
-	minigame.speakAll(gamename, concat("It´s ", color, next_player_name, "'s §rturn."));
-}
-sound.spawnForPlayer(next_player, pling_sound, sound_category_ambient);
-msg(next_player, text.click("§r[§eZug beenden§r]", "/nextplayer"));
+setNextPlayer(next_player);
 block.set(pointed_loc, basic_block);
 goto("wait");
 
@@ -258,7 +249,7 @@ function setNextPlayer(next_player) {
 		minigame.speakAll($gamename, concat("It´s ", color, next_player_name, "'s §rturn."));
 	}
 	sound.spawnForPlayer(next_player, $pling_sound, $sound_category_ambient);
-	msg(next_player, text.click("§r[§eZug beenden§r]", "/nextplayer"));
+	msg(next_player, text.click("§r[§eEnd turn§r]", "/nextplayer"));
 }
 
 function removeSpecificToken(token) {

+ 0 - 1
minigames/halma/halma_map1.txt

@@ -1,4 +1,3 @@
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn")); //Gamesspawn
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "halmasign1");
 mapname = "Sternenhalma";

+ 0 - 1
minigames/halma/halma_map2.txt

@@ -1,4 +1,3 @@
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn")); //Gamesspawn
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "halmasign1");
 mapname = "Sternenhalma";

+ 18 - 28
minigames/jumpnrun/icejumpnrun.txt

@@ -1,12 +1,10 @@
 rankingtable = "icejrranks";
-registerRanking(rankingtable);
-
+maxplayers = 1;
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "icejrsign");
-block.setSign(gamesignloc, 1, "1/1");
-block.setSign(gamesignloc, 3, "§6Läuft");
 
 event.load("command");
+event.load("player_join");
 event.load("player_move");
 event.load("player_is_attacked");
 event.load("player_death");
@@ -79,11 +77,15 @@ for(i = 0; i < list.getSize(checkpoints); i++) {
 	list.add(spawnlocs, loc.mod(location1, 0.5, 0, 0.5));
 }
 
+@wait
+wait();
+ignoreGoto(event);
+goto("wait");
+
+@player_join
 starttime = time.getMillis();
-player = script.getLeader();
 sgv(player, "jr", true);
-player_id = player.getId(player);
-jumpstage = getPoints(rankingtable, player_id);
+jumpstage = getPoints(rankingtable, player.getId(player));
 if(jumpstage == 0) {
     sgv(player, "icejumptime", 0);
 }
@@ -92,19 +94,9 @@ player.clearInventory(player);
 entity.addEffect(player, "minecraft:night_vision", 32760, 0);
 
 gosub("stage_specific");
-
-if(player.isSurvival(player) == true) {
-	if(player.isAdventure(player) == false) {
-		player.setGamemode(player, "adventure");
-	}
-} else {
-	player.setGamemode(player, "adventure");
-}
+player.setGamemode(player, "adventure");
+player.setFly(player, false);
 sgoto(1, "loop");
-
-@wait
-wait();
-ignoreGoto(event);
 goto("wait");
 
 @block_click
@@ -181,20 +173,18 @@ goto("wait");
 @player_giveup
 player.setGamemode(player, "survival");
 sgv(player, "jr", false);
-block.setSign(gamesignloc, 1, "0/1");
-block.setSign(gamesignloc, 3, "§2Bereit");
-resetplayer(player);
-tptogameslobby(player);
 endtime = time.getMillis();
 time = endtime - starttime;
 newtime = ggv(player, "icejumptime") + time;
 sgv(player, "icejumptime", newtime);
-player_id = player.getId(player);
-setRanking(rankingtable, player_id, jumpstage, -1);
-msg(player, "§b---= Deine Statistiken =---");
-msg(player, "§eCheckpoints: §r", text.number(jumpstage));
+setRanking(rankingtable, player.getId(player), jumpstage, -1);
 owntime = newtime / 1000; //in Sekunden
 hours = text.number(math.rounddown(owntime / 3600));
 minutes = text.number(math.round(math.mod(owntime, 3600) / 60));
-msg(player, "§eZeit: §r", hours, "h ", minutes, "min");
+minigame.statsHeader(player, "§7IceJumpnRun", "§e");
+minigame.statsLine(player, "§e", "Checkpoints", text.number(jumpstage));
+minigame.statsLine(player, "§e", "Time", concat(hours, "h ", minutes, "min"));
+script = script.getFromId(script_id);
+minigame.kickPlayer(script, player);
+minigame.term(script, gamesignloc);
 term();

+ 28 - 41
minigames/jumpnrun/todesjumpnrun.txt

@@ -1,13 +1,11 @@
 rankingtable = "tjrranks";
-registerRanking(rankingtable);
-
+maxplayers = 1;
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "tjrsign");
-block.setSign(gamesignloc, 1, "1/1");
-block.setSign(gamesignloc, 3, "§6Läuft");
 lavacounter = 0;
 
 event.load("command");
+event.load("player_join");
 event.load("player_move");
 event.load("player_is_attacked");
 event.load("player_death");
@@ -21,7 +19,7 @@ event.load("block_place");
 event.load("block_click");
 event.load("inv_click");
 
-list.new(notallowed);
+notallowed = list.new();
 list.add(notallowed, "fly");
 list.add(notallowed, "gm");
 list.add(notallowed, "gamemode");
@@ -32,16 +30,13 @@ list.add(notallowed, "top");
 list.add(notallowed, "j");
 list.add(notallowed, "jumpto");
 
-gamesworld = world.get("games");
 angel = read.item("minecraft:fishing_rod");
 arrow = read.item("minecraft:arrow");
 bow = read.item("minecraft:bow");
-air_item_type = "minecraft:air";
-redstone_type = "minecraft:redstone";
 ench = enchantment.get("minecraft:infinity");
 enchantment.add(ench, bow, 1);
 
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
+gamesworld = world.get("games");
 all_modules_loc = loc.new(gamesworld, 3960, 101, -5953);
 
 all_modules_menu = inv.new("22222222222222222222222222222222222222222222222222222");
@@ -99,7 +94,7 @@ inv.setItem(all_modules_menu, 50, read.item("minecraft:slime_block", 1, "Modul 5
 inv.setItem(all_modules_menu, 51, read.item("minecraft:quartz_block", 1, "Modul 52"));
 inv.setItem(all_modules_menu, 52, read.item("minecraft:quartz_block", 1, "Modul 53"));
 
-list.new(checkpoints);
+checkpoints = list.new();
 //1.Modul
 list.add(checkpoints, loc.new(gamesworld, 3924, 62, -5908));
 list.add(checkpoints, loc.new(gamesworld, 3914, 60, -5915));
@@ -162,8 +157,13 @@ list.add(checkpoints, loc.new(gamesworld, 3963, 87, -5952));
 //Finish
 list.add(checkpoints, loc.new(gamesworld, 3965, 101, -5970));
 
-player = script.getLeader();
-list.new(spawnlocs);
+@wait
+wait();
+ignoreGoto(event);
+goto("wait");
+
+@player_join
+spawnlocs = list.new();
 for(i = 0; i < list.getSize(checkpoints); i++) {
 	location1 = list.getIndex(checkpoints, i);
 	location2 = loc.mod(location1, 1, 1, 1);
@@ -174,8 +174,7 @@ for(i = 0; i < list.getSize(checkpoints); i++) {
 
 starttime = time.getMillis();
 sgv(player, "tjr", true);
-player_id = player.getId(player);
-jumpstage = getPoints(rankingtable, player_id);
+jumpstage = getPoints(rankingtable, player.getId(player));
 if(jumpstage == 0) {
 	sgv(player, "todesjumptime", 0);
     entity.teleport(player, loc.new(gamesworld, 3939.5, 52, -5881.5, 180, 0));
@@ -185,19 +184,9 @@ if(jumpstage == 0) {
 player.clearInventory(player);
 
 gosub("stage_specific");
-
-if(player.isSurvival(player) == true) {
-	if(player.isAdventure(player) == false) {
-		player.setGamemode(player, "adventure");
-	}
-} else {
-	player.setGamemode(player, "adventure");
-}
+player.setGamemode(player, "adventure");
+player.setFly(player, false);
 sgoto(1, "loop");
-
-@wait
-wait();
-ignoreGoto(event);
 goto("wait");
 
 @block_click
@@ -222,7 +211,7 @@ goto("wait");
 @command
 if(list.contains(notallowed, toLowerCase(command))) {
 	cancel = true;
-	player.speak(player, "§4Dr. Septimus", "§rHättest du wohl gerne. Aber ich habe vorgesorgt. Muahahaha.");
+	speakPrefix(player, "§4Dr. Septimus", "§rHättest du wohl gerne. Aber ich habe vorgesorgt. Muahahaha.");
 }
 goto("wait");
 
@@ -236,7 +225,7 @@ goto("wait");
 
 @inv_click
 if(inv_name == "Alle Module") {
-	if(item.getType(item) != air_item_type) {
+	if(item.getType(item) != "minecraft:air") {
 		entity.teleport(player, list.getIndex(spawnlocs, inv_slot));
 	}
 }
@@ -291,7 +280,7 @@ if(index + 1 > jumpstage) {
 	if(index == 53) {
 		setRank(player, "§cJ'n'R Gott");
 	} else {
-		player.speak(player, "§4Dr. Septimus", "§rFrohes Scheitern im ", text.number(index + 1), ". Modul");
+		speakPrefix(player, "§4Dr. Septimus", concat("§rFrohes Scheitern im ", text.number(index + 1), ". Modul"));
 	}
 	jumpstage = index + 1;
 	gosub("stage_specific");
@@ -314,8 +303,8 @@ elseif(jumpstage == 6 || jumpstage == 11 || jumpstage == 42 || jumpstage == 49)
 }
 elseif(jumpstage == 28 || jumpstage == 29) {
 	block.set(loc.new(gamesworld, 3944, 122, -5905), "minecraft:lever[powered=false,facing=west,face=wall]");
-	block.set(loc.new(gamesworld, 3946, 122, -5905), air_item_type);
-	block.set(loc.new(gamesworld, 3946, 122, -5905), redstone_type);
+	block.set(loc.new(gamesworld, 3946, 122, -5905), "minecraft:air");
+	block.set(loc.new(gamesworld, 3946, 122, -5905), "minecraft:redstone");
 }
 elseif(jumpstage == 31) {
 	block.addItem(loc.new(gamesworld, 3929, 91, -5936), read.item("minecraft:arrow", 576));
@@ -340,20 +329,18 @@ goto("wait");
 @player_giveup
 player.setGamemode(player, "survival");
 sgv(player, "tjr", false);
-block.setSign(gamesignloc, 1, "0/1");
-block.setSign(gamesignloc, 3, "§2Bereit");
-player.clearInventory(player);
-tptogameslobby(player);
 endtime = time.getMillis();
 time = endtime - starttime;
 newtime = ggv(player, "todesjumptime") + time;
 sgv(player, "todesjumptime", newtime);
-player_id = player.getId(player);
-setRanking(rankingtable, player_id, jumpstage, -1);
-msg(player, "§b---= Deine Statistiken =---");
-msg(player, "§eModule: §r", text.number(jumpstage - 1));
+setRanking(rankingtable, player.getId(player), jumpstage, -1);
 owntime = newtime / 1000; //in Sekunden
 hours = text.number(math.rounddown(owntime / 3600));
 minutes = text.number(math.round(math.mod(owntime, 3600) / 60));
-msg(player, "§eZeit: §r", hours, "h ", minutes, "min");
-term();
+minigame.statsHeader(player, "§4TodesJumpnRun", "§e");
+minigame.statsLine(player, "§e", "Modules", text.number(jumpstage - 1));
+minigame.statsLine(player, "§e", "Time", concat(hours, "h ", minutes, "min"));
+script = script.getFromId(script_id);
+minigame.kickPlayer(script, player);
+minigame.term(script, gamesignloc);
+term();

+ 88 - 94
minigames/rebuild/rebuild.txt

@@ -1,44 +1,30 @@
 rankingtable = "rebuildranks";
-registerRanking(rankingtable);
-
-map.new(solved);
-
 gamename = "§5Rebuild";
-barrier_type = "minecraft:barrier";
-air_item_type = "minecraft:air";
-start_sound = sound.get("minecraft:block.note_block.harp");
-ambient_sound_category = sound.getCategory("ambient");
-
+specific_lobby_handling = true;
 gosub("setstart");
-player = script.getLeader();
-player_name = player.getName(player);
-gosub("lobbycore");
 goto("simplelobby");
 
-@lobby
-map.add(solved, player, 0);
-display.add(player, 1, gamename);
-display.add(player, 2, "§7Map:");
-display.add(player, 3, mapname);
-return;
-
-@leavelobby
-map.remove(solved, player);
+@specificLobbyHandling
+if(event == "player_join") {
+	display.add(player, 1, gamename);
+	display.add(player, 2, "§7Map:");
+	display.add(player, 3, mapname);
+}
 return;
 
 @finalstart
-event.load("block_break");
-event.load("block_place");
-player.speak("all", gamename, "§eDas Spiel beginnt.");
-block.setSign(gamesignloc, 2, concat(text.number(list.getSize(all)), "/", text.number(maxplayers)));
-block.setSign(gamesignloc, 3, "§6Läuft");
-map.new(buildingarea);
+player_list = minigame.getPlayers(script_id);
+buildingarea = map.new();
+solved = map.new();
 
-for(i = 0; i < list.getSize(all); i++) {
-	p = list.getIndex(all, i);
-	map.add(buildingarea, p, list.new());
+for(i = 0; i < list.getSize(player_list); i++) {
+	p_uuid = list.getIndex(player_list, i);
+	p = player.get(p_uuid);
+	map.add(solved, p_uuid, 0);
+	speakPrefix(p, gamename, "The game has started.");
+	list = list.new();
+	map.add(buildingarea, p_uuid, list);
 	edge = list.getIndex(bottom_edge, i);
-	list = map.get(buildingarea, p);
 	for(z = 0; z < picture_length; z++) {
 		for(x = 0; x < picture_length; x++) {
 			list.add(list, loc.mod(edge, x * -1, 0, z));
@@ -46,20 +32,19 @@ for(i = 0; i < list.getSize(all); i++) {
 	}
 }
 
-display.reset("all");
-display.add("all", 1, gamename);
+minigame.displayResetAll();
+minigame.displayAll(1, gamename);
 
 tobuild = list.getIndex(to_build_edges, 0);
-for(i = 0; i < list.getSize(all); i++) {
-	p = list.getIndex(all, i);
+for(i = 0; i < list.getSize(player_list); i++) {
+	p_uuid = list.getIndex(player_list, i);
+	p = player.get(p_uuid);
 	pname = player.getName(p);
-	display.add("all", i + 2, concat("§6", 0, " §c", pname));
+	minigame.displayAll(i + 2, concat("§6", 0, " §c", pname));
 	entity.teleport(p, list.getIndex(spawns, i));
-	sound.spawnForPlayer(p, start_sound, ambient_sound_category);
+	sound.spawnForPlayer(p, pling_sound, sound_category_ambient);
 
-	if(!player.isCreative(p)) {
-		player.setGamemode(p, "creative");
-	}
+	player.setGamemode(p, "creative");
 	
 	title.clear(p);
 	title.setTime(p, 0, 20, 0);
@@ -68,15 +53,15 @@ for(i = 0; i < list.getSize(all); i++) {
 	for(y = 0; y < picture_length; y++) {
 		for(x = 0; x > picture_length * -1; x--) {
 			block.clone(loc.mod(tobuild, x, y, 0), loc.mod(edge, x, y, 0));
-			block.set(loc.mod(edge, x, y, -1), barrier_type);
+			block.set(loc.mod(edge, x, y, -1), "minecraft:barrier");
 		}
 	}
 }
 
 countdown = 5;
 @title
-for(i = 0; i < list.getSize(all); i++) {
-	p = list.getIndex(all, i);
+for(i = 0; i < list.getSize(player_list); i++) {
+	p = player.get(list.getIndex(player_list, i));
 	title.send(p, concat("§c", text.number(countdown)));
 }
 if(countdown == 0) {
@@ -93,14 +78,16 @@ if(event == "block_click") {
 	goto("checkstart");
 }
 if(event == "player_giveup" || event == "player_logout") {
+	minigame.speakAll(gamename, concat("§6", player.getName(player), " §rhas left the game."));
 	player.setGamemode(player, "survival");
-	list = map.get(buildingarea, player);
+	list = map.get(buildingarea, player.getUuid(player));
 	for(i = 0; i < list.getSize(list); i++) {
-		block.set(list.getIndex(list, i), air_item_type);
+		block.set(list.getIndex(list, i), "minecraft:air");
 	}
-	kickplayer(player);
-	if(list.getSize(all) < 2) {
-		p = list.getIndex(all, 0);
+	script = script.getFromId(script_id);
+	minigame.kickplayer(script, player);
+	if(list.getSize(player_list) < 2) {
+		p = player.get(list.getIndex(player_list, 0));
 		wincore(p);
 	}
 }
@@ -108,19 +95,19 @@ goto("checkstart");
 
 @setstarttime
 starttime = time.getMillis();
-for(i = 0; i < list.getSize(all); i++) {
+for(i = 0; i < list.getSize(player_list); i++) {
 	edge = list.getIndex(picture_edge, i);
 	for(y = 0; y < picture_length; y++) {
 		for(x = 0; x > picture_length * -1; x--) {
-			block.set(loc.mod(edge, x, y, -1), air_item_type);
+			block.set(loc.mod(edge, x, y, -1), "minecraft:air");
 		}
 	}
 }
 
-if(list.getSize(all_uuids) == 1) {
+if(list.getSize(player_list) == 1) {
 	singleteam = true;
-	for(i = 0; i < list.getSize(all_uuids); i++) {
-		p = player.get(list.getIndex(all_uuids, i));
+	for(i = 0; i < list.getSize(player_list); i++) {
+		p = player.get(list.getIndex(player_list, i));
 		player.speak(p, gamename, "Singleteam. Not ranked");
 	}
 } else {
@@ -129,26 +116,30 @@ if(list.getSize(all_uuids) == 1) {
 
 @checkgame
 wait();
-ignoreGoto(event);
+if(player.hasMinigameId(player, script_id)) {
+	ignoreGoto(event);
+}
 goto("checkgame");
 
 @player_logout
 @player_giveup
+minigame.speakAll(gamename, concat("§6", player.getName(player), " §rhas left the game."));
 player.setGamemode(player, "survival");
-list = map.get(buildingarea, player);
+list = map.get(buildingarea, player.getUuid(player));
 for(i = 0; i < list.getSize(list); i++) {
-	block.set(list.getIndex(list, i), air_item_type);
+	block.set(list.getIndex(list, i), "minecraft:air");
 }
-kickplayer(player);
-if(list.getSize(all) < 2) {
-	p = list.getIndex(all, 0);
+script = script.getFromId(script_id);
+minigame.kickplayer(script, player);
+if(list.getSize(player_list) < 2) {
+	p = list.getIndex(player_list, 0);
 	wincore(p);
 }
 goto("checkgame");
 
 @block_place
 @block_break
-list = map.get(buildingarea, player);
+list = map.get(buildingarea, player.getUuid(player));
 if(!list.contains(list, block_loc)) {
 	cancel = true;
 }
@@ -157,8 +148,10 @@ goto("checkgame");
 
 @checkpicture
 cancel = false;
-temploc = list.getIndex(bottom_check_edges, map.get(solved, player));
-list = map.get(buildingarea, player);
+p_uuid = player.getUuid(player);
+temp_solved = map.get(solved, p_uuid);
+temploc = list.getIndex(bottom_check_edges, temp_solved);
+list = map.get(buildingarea, p_uuid);
 picture = list.getIndex(list, 0);
 
 for(z = 0; z < picture_length; z++) {
@@ -171,26 +164,25 @@ for(z = 0; z < picture_length; z++) {
 	}
 }
 
-puuid = player.getUuid(player_name);
-map.add(solved, player, map.get(solved, player) + 1);
+temp_solved++;
+map.add(solved, p_uuid, temp_solved);
 player.clearInventory(player);
-for(i = 0; i < list.getSize(all); i++) {
-	p = list.getIndex(all, i);
-	pname = player.getName(p);
-	display.add("all", i + 2, concat("§6", text.number(map.get(solved, p)), "§c ", pname));
+for(i = 0; i < list.getSize(player_list); i++) {
+	p = list.getIndex(player_list, i);
+	minigame.displayAll(i + 2, concat("§6", text.number(temp_solved), "§c ", player.getName(p)));
 }
 
-if(map.get(solved, player) >= solve_to_win) {
+if(temp_solved >= solve_to_win) {
 	wincore(player);
 }
 
-list = map.get(buildingarea, player);
+list = map.get(buildingarea, p_uuid);
 for(i = 0; i < list.getSize(list); i++) {
-	block.set(list.getIndex(list, i), air_item_type);
+	block.set(list.getIndex(list, i), "minecraft:air");
 }
 
-tobuild = list.getIndex(to_build_edges, map.get(solved, player));
-edge = list.getIndex(picture_edge, list.getIndexOf(all, player));
+tobuild = list.getIndex(to_build_edges, temp_solved);
+edge = list.getIndex(picture_edge, list.getIndexOf(player_list, player.getUuid(player)));
 for(y = 0; y < picture_length; y++) {
 	for(x = 0; x > picture_length * -1; x--) {
 		block.clone(loc.mod(tobuild, x, y, 0), loc.mod(edge, x, y, 0));
@@ -201,14 +193,14 @@ goto("checkgame");
 function wincore(winner) {
 	winner_name = player.getName(winner);
 	if(!$singleteam) {
-		player.speak("all", gamename, concat("§b", winner_name, "§r hat gewonnen!"));
+		minigame.speakAll(gamename, concat("§b", winner_name, "§r has won!"));
 	}
 	
-	for(h = 0; h < list.getSize($all); h++) {
-		p = list.getIndex($all, h);
-		list = map.get($buildingarea, p);
+	for(h = 0; h < list.getSize($player_list); h++) {
+		p_uuid = list.getIndex($player_list, h);
+		list = map.get($buildingarea, p_uuid);
 		for(i = 0; i < list.getSize(list); i++) {
-			block.set(list.getIndex(list, i), $air_item_type);
+			block.set(list.getIndex(list, i), "minecraft:air");
 		}
 	}
 
@@ -216,23 +208,22 @@ function wincore(winner) {
 		edge = list.getIndex($picture_edge, i);
 		for(y = 0; y < $picture_length; y++) {
 			for(x = 0; x > $picture_length * -1; x--) {
-				block.set(loc.mod(edge, x, y, 0), $air_item_type);
+				block.set(loc.mod(edge, x, y, 0), "minecraft:air");
 			}
 		}
 	}
 	entity.removeAll("net.minecraft.entity.item.ItemEntity", $middleloc, $radius);
 
-	for(i = 0; i < list.getSize($all); i++) {
-		p = list.getIndex($all, i);
+	for(i = 0; i < list.getSize($player_list); i++) {
+		p_uuid = list.getIndex($player_list, i);
+		p = player.get(p_uuid);
 		p_id = player.getId(p);
-		entity.teleport(p, $gamesworldloc);
-		resetplayer(p);
 		player.setGamemode(p, "survival");
 		
 		if(!$singleteam) {
 			last_record = getPoints($rankingtable, p_id);
 			playedgames = getPlayedGames($rankingtable, p_id) + 1;
-			record = last_record + map.get($solved, p);
+			record = last_record + map.get($solved, p_uuid);
 			setRanking($rankingtable, p_id, record, playedgames);
 			
 			rebuildwon = ggv(p, "rebuildwon");
@@ -245,21 +236,24 @@ function wincore(winner) {
 			sgv(p, "rebuildwon", rebuildwon);
 			
 			msg(p, "");
-		}		
-		player.speak(p, $gamename, "§r---= §eStatistik §r=---");
+		}
+		minigame.statsHeader(p, $gamename, "§e");
 		if($starttime != null) {
 			endtime = time.getMillis();
 			time = (endtime - $starttime) / 1000;
-			player.speak(p, $gamename, concat("§eZeit§8: §r", text.number(math.round(time / 60)), " min ", text.number(math.round(time % 60)), " s"));
+			minigame.statsLine(p, "§e", "Time", concat(text.number(math.round(time / 60)), " min ", text.number(math.round(time % 60)), " s"));
 		}
 		if(!$singleteam) {
-			player.speak(p, "§5Rebuild", concat("§eGelöste Muster§8: §r", text.number(record)));
-			player.speak(p, "§5Rebuild", concat("§eGespielte Spiele§8: §r", text.number(playedgames)));
-			player.speak(p, "§5Rebuild", concat("§eGewonnene Spiele§8: §r", text.number(rebuildwon)));
-			player.speak(p, "§5Rebuild", concat("§eSiegwahrscheinlichkeit§8: §r", text.number(math.roundComma((rebuildwon / playedgames) * 100, 2)), "%"));
+			minigame.statsLine(p, "§e", "Solved Fields", text.hover(text.number(record), "Relevant for ranking"));
+			minigame.statsLine(p, "§e", "Won games", text.number(rebuildwon));
+			minigame.statsLine(p, "§e", "Played games", text.number(playedgames));
+			if(playedgames != 0) {
+				minigame.statsLine(p, "§e", "Win ratio", concat(text.number(math.roundComma((rebuildwon / playedgames) * 100, 2)), "%"));
+			}
 		}
 	}
-	block.setSign($gamesignloc, 2, concat("0/", text.number($maxplayers)));
-	block.setSign($gamesignloc, 3, "§2Bereit");
+	script = script.getFromId($script_id);
+	minigame.kickAllPlayers(script);
+	minigame.term(script, $gamesignloc);
 	term();
-}
+}

+ 10 - 15
minigames/rebuild/rebuildmap1.txt

@@ -1,6 +1,5 @@
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "rebuildsign1");
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
 gamesworld = world.get("games");
 lobbyspawnloc = loc.new(gamesworld, 985, 85, 957);
 mapname  = "§35x5";
@@ -13,21 +12,21 @@ picture_length = 5;
 
 solve_to_win = 10;
 
-list.new(spawns);
+spawns = list.new();
 list.add(spawns, loc.new(gamesworld, 3017.5, 101, 2989.5));
 list.add(spawns, loc.new(gamesworld, 3009.5, 101, 2989.5));
 list.add(spawns, loc.new(gamesworld, 3001.5, 101, 2989.5));
 list.add(spawns, loc.new(gamesworld, 2993.5, 101, 2989.5));
 list.add(spawns, loc.new(gamesworld, 2985.5, 101, 2989.5));
 
-list.new(picture_edge);
+picture_edge = list.new();
 list.add(picture_edge, loc.new(gamesworld, 3019, 102, 2999));
 list.add(picture_edge, loc.new(gamesworld, 3011, 102, 2999));
 list.add(picture_edge, loc.new(gamesworld, 3003, 102, 2999));
 list.add(picture_edge, loc.new(gamesworld, 2995, 102, 2999));
 list.add(picture_edge, loc.new(gamesworld, 2987, 102, 2999));
 
-list.new(bottom_edge);
+bottom_edge = list.new();
 list.add(bottom_edge, loc.new(gamesworld, 3019, 101, 2993));
 list.add(bottom_edge, loc.new(gamesworld, 3011, 101, 2993));
 list.add(bottom_edge, loc.new(gamesworld, 3003, 101, 2993));
@@ -36,9 +35,10 @@ list.add(bottom_edge, loc.new(gamesworld, 2987, 101, 2993));
 
 etagen = 9; //Anzahl der Etagen, auf denen die Vorlagen verteilt sind
 y_diff = 6; //Höhendifferenz zwischen den Etagen
-
-list.new(templates);
 y = 107; //Y-Höhe der obersten Etage
+
+templates = list.new();
+bottom_templates = list.new();
 for(i = 0; i < etagen; i++) {
 	list.add(templates, loc.new(gamesworld, 3016, y, 2973));
 	list.add(templates, loc.new(gamesworld, 3006, y, 2973));
@@ -48,12 +48,7 @@ for(i = 0; i < etagen; i++) {
 	list.add(templates, loc.new(gamesworld, 3006, y, 2963));
 	list.add(templates, loc.new(gamesworld, 2996, y, 2963));
 	list.add(templates, loc.new(gamesworld, 2986, y, 2963));
-	y -= y_diff;
-}
-
-list.new(bottom_templates);
-y = 107; //Y-Höhe der obersten Etage
-for(i = 0; i < etagen; i++) {
+	
 	list.add(bottom_templates, loc.new(gamesworld, 3016, y, 2967));
 	list.add(bottom_templates, loc.new(gamesworld, 3006, y, 2967));
 	list.add(bottom_templates, loc.new(gamesworld, 2996, y, 2967));
@@ -65,8 +60,8 @@ for(i = 0; i < etagen; i++) {
 	y -= y_diff;
 }
 
-list.new(to_build_edges);
-list.new(bottom_check_edges);
+to_build_edges = list.new();
+bottom_check_edges = list.new();
 for(i = 0; i < solve_to_win; i++) {
 	//Random Vorlage auswählen
 	size = list.getSize(templates);
@@ -77,4 +72,4 @@ for(i = 0; i < solve_to_win; i++) {
 	//Random Vorlage aus All-Liste entfernen
 	list.removeIndex(templates, picture_index);
 	list.removeIndex(bottom_templates, picture_index);
-}
+}

+ 8 - 9
minigames/rebuild/rebuildmap2.txt

@@ -1,6 +1,5 @@
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "rebuildsign2");
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
 gamesworld = world.get("games");
 lobbyspawnloc = loc.new(gamesworld, 1003, 85, 957);
 mapname  = "§38x8";
@@ -13,7 +12,7 @@ picture_length = 8;
 
 solve_to_win = 10;
 
-list.new(spawns);
+spawns = list.new();
 list.add(spawns, loc.new(gamesworld, -2008, 101, -2015));
 list.add(spawns, loc.new(gamesworld, -2019, 101, -2015));
 list.add(spawns, loc.new(gamesworld, -2030, 101, -2015));
@@ -25,7 +24,7 @@ list.add(spawns, loc.new(gamesworld, -2085, 101, -2015));
 list.add(spawns, loc.new(gamesworld, -2096, 101, -2015));
 list.add(spawns, loc.new(gamesworld, -2107, 101, -2015));
 
-list.new(picture_edge);
+picture_edge = list.new();
 list.add(picture_edge, loc.new(gamesworld, -2004, 101, -2000));
 list.add(picture_edge, loc.new(gamesworld, -2015, 101, -2000));
 list.add(picture_edge, loc.new(gamesworld, -2026, 101, -2000));
@@ -37,7 +36,7 @@ list.add(picture_edge, loc.new(gamesworld, -2081, 101, -2000));
 list.add(picture_edge, loc.new(gamesworld, -2092, 101, -2000));
 list.add(picture_edge, loc.new(gamesworld, -2103, 101, -2000));
 
-list.new(bottom_edge);
+bottom_edge = list.new();
 list.add(bottom_edge, loc.new(gamesworld, -2004, 101, -2011));
 list.add(bottom_edge, loc.new(gamesworld, -2015, 101, -2011));
 list.add(bottom_edge, loc.new(gamesworld, -2026, 101, -2011));
@@ -53,8 +52,8 @@ etagen = 6; //Anzahl der Etagen, auf denen die Vorlagen verteilt sind
 y_diff = 11; //Höhendifferenz zwischen den Etagen
 y = 90; //Y-Höhe der obersten Etage
 
-list.new(templates);
-list.new(bottom_templates);
+templates = list.new();
+bottom_templates = list.new();
 for(i = 0; i < etagen; i++) {
 	list.add(templates, loc.new(gamesworld, -2004, y, -2000));
 	list.add(templates, loc.new(gamesworld, -2015, y, -2000));
@@ -80,8 +79,8 @@ for(i = 0; i < etagen; i++) {
 	y -= y_diff;
 }
 
-list.new(to_build_edges);
-list.new(bottom_check_edges);
+to_build_edges = list.new();
+bottom_check_edges = list.new();
 for(i = 0; i < solve_to_win; i++) {
 	//Random Vorlage auswählen
 	size = list.getSize(templates);
@@ -92,4 +91,4 @@ for(i = 0; i < solve_to_win; i++) {
 	//Random Vorlage aus All-Liste entfernen
 	list.removeIndex(templates, picture_index);
 	list.removeIndex(bottom_templates, picture_index);
-}
+}

+ 0 - 82
minigames/rebuild/region_rebuild1.txt

@@ -1,82 +0,0 @@
-gamesignsmap = getScriptVar("gamesigns");
-msg("dev", "2 ", gamesignloc);
-gamesignloc = map.get(gamesignsmap, "rebuildsign1");
-msg("dev", "3 ", gamesignloc);
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
-gamesworld = world.get("games");
-lobbyspawnloc = loc.new(gamesworld, 985, 85, 957);
-mapname  = "§35x5";
-middleloc = loc.new(gamesworld, 3017, 101, 2989);
-radius = 100;
-minplayers = 2;
-maxplayers = 5;
-
-picture_length = 5;
-
-solve_to_win = 10;
-
-list.new(spawns);
-list.add(spawns, loc.new(gamesworld, 3017.5, 101, 2989.5));
-list.add(spawns, loc.new(gamesworld, 3009.5, 101, 2989.5));
-list.add(spawns, loc.new(gamesworld, 3001.5, 101, 2989.5));
-list.add(spawns, loc.new(gamesworld, 2993.5, 101, 2989.5));
-list.add(spawns, loc.new(gamesworld, 2985.5, 101, 2989.5));
-
-list.new(picture_edge);
-list.add(picture_edge, loc.new(gamesworld, 3019, 102, 2999));
-list.add(picture_edge, loc.new(gamesworld, 3011, 102, 2999));
-list.add(picture_edge, loc.new(gamesworld, 3003, 102, 2999));
-list.add(picture_edge, loc.new(gamesworld, 2995, 102, 2999));
-list.add(picture_edge, loc.new(gamesworld, 2987, 102, 2999));
-
-list.new(bottom_edge);
-list.add(bottom_edge, loc.new(gamesworld, 3019, 101, 2993));
-list.add(bottom_edge, loc.new(gamesworld, 3011, 101, 2993));
-list.add(bottom_edge, loc.new(gamesworld, 3003, 101, 2993));
-list.add(bottom_edge, loc.new(gamesworld, 2995, 101, 2993));
-list.add(bottom_edge, loc.new(gamesworld, 2987, 101, 2993));
-
-etagen = 9; //Anzahl der Etagen, auf denen die Vorlagen verteilt sind
-y_diff = 6; //Höhendifferenz zwischen den Etagen
-
-list.new(templates);
-y = 107; //Y-Höhe der obersten Etage
-for(i = 0; i < etagen; i++) {
-	list.add(templates, loc.new(gamesworld, 3016, y, 2973));
-	list.add(templates, loc.new(gamesworld, 3006, y, 2973));
-	list.add(templates, loc.new(gamesworld, 2996, y, 2973));
-	list.add(templates, loc.new(gamesworld, 2986, y, 2973));
-	list.add(templates, loc.new(gamesworld, 3016, y, 2963));
-	list.add(templates, loc.new(gamesworld, 3006, y, 2963));
-	list.add(templates, loc.new(gamesworld, 2996, y, 2963));
-	list.add(templates, loc.new(gamesworld, 2986, y, 2963));
-	y -= y_diff;
-}
-
-list.new(bottom_templates);
-y = 107; //Y-Höhe der obersten Etage
-for(i = 0; i < etagen; i++) {
-	list.add(bottom_templates, loc.new(gamesworld, 3016, y, 2967));
-	list.add(bottom_templates, loc.new(gamesworld, 3006, y, 2967));
-	list.add(bottom_templates, loc.new(gamesworld, 2996, y, 2967));
-	list.add(bottom_templates, loc.new(gamesworld, 2986, y, 2967));
-	list.add(bottom_templates, loc.new(gamesworld, 3016, y, 2957));
-	list.add(bottom_templates, loc.new(gamesworld, 3006, y, 2957));
-	list.add(bottom_templates, loc.new(gamesworld, 2996, y, 2957));
-	list.add(bottom_templates, loc.new(gamesworld, 2986, y, 2957));
-	y -= y_diff;
-}
-
-list.new(to_build_edges);
-list.new(bottom_check_edges);
-for(i = 0; i < solve_to_win; i++) {
-	//Random Vorlage auswählen
-	size = list.getSize(templates);
-	picture_index = math.random(0, size - 1);
-	//Random Vorlage zur Liste hinzufügen
-	list.add(to_build_edges, list.getIndex(templates, picture_index));
-	list.add(bottom_check_edges, list.getIndex(bottom_templates, picture_index));
-	//Random Vorlage aus All-Liste entfernen
-	list.removeIndex(templates, picture_index);
-	list.removeIndex(bottom_templates, picture_index);
-}

+ 3 - 3
startscript.txt

@@ -7,14 +7,14 @@ script.start("system/svars");
 script.start("system/player_data");
 script.start("system/perms", "utils/u_general");
 script.start("system/chat", "utils/u_general");
-script.start("system/commands", "utils/u_general", "utils/u_plots", "utils/u_gpvp", "utils/u_survival", "utils/u_games");
-// system/commands utils/u_general utils/u_plots utils/u_gpvp utils/u_survival utils/u_games
+script.start("system/commands", "utils/u_general", "utils/u_plots", "utils/u_survival", "utils/u_games");
+// system/commands utils/u_general utils/u_plots utils/u_survival utils/u_games
 script.start("global/party", "utils/u_general", "utils/u_party");
 script.start("global/copyisland");
 script.start("global/friends", "utils/u_general");
 script.start("system/damage");
 script.start("system/playtime");
-script.start("system/explosions");
+script.start("system/explosions", "utils/u_general");
 script.start("global/pumpkin");
 script.start("global/voxel");
 script.start("global/ticketsystem", "utils/u_general");

+ 12 - 36
system/commands.txt

@@ -1,9 +1,6 @@
 waitfor(1);
-time = time.getMillis();
 setCommandHelps();
 waitfor(1);
-msg("dev", time.getMillis() - time, "ms");
-time = time.getMillis();
 
 command.clear();
 
@@ -125,8 +122,6 @@ command.register("world", "World-Befehle");
 command.register("wusi", "Eastereggs for everyone");
 
 waitfor(1);
-msg("dev", time.getMillis() - time, "ms");
-time = time.getMillis();
 
 event.load("inv_click");
 event.load("missing_perm");
@@ -250,8 +245,6 @@ map.add(permgroupsmap2, 14, "sponsor");
 map.add(permgroupsmap2, 15, "bypass");
 
 waitfor(1);
-msg("dev", time.getMillis() - time, "ms");
-time = time.getMillis();
 
 easter_eggs = list.new();
 list.add(easter_eggs, "kajetan is the founder of wusi in our community.");
@@ -338,8 +331,6 @@ databank.workerExecute(executeOnce3);
 jail_loop_active = false;
 coords_loop_active = false;
 afk_loop_active = false;
-msg("dev", time.getMillis() - time, "ms");
-time = time.getMillis();
 
 msg("dev", "§bCommands §rloaded.");
 @wait
@@ -1907,7 +1898,7 @@ if(size != 1) {
 arg0 = list.getIndex(args, 0);
 if(arg0 == "commands") {
 	script = script.get("scripts/system/commands.txt");
-	script.start("system/commands", "utils/u_general", "utils/u_plots", "utils/u_gpvp", "utils/u_survival", "utils/u_games");
+	script.start("system/commands", "utils/u_general", "utils/u_plots", "utils/u_survival", "utils/u_games");
 	script.term(script);
 }
 elseif(arg0 == "games") {
@@ -1977,14 +1968,6 @@ elseif(arg0 == "shop") {
 	}
 	script.start("global/chestshops", "utils/u_general", "utils/u_survival");
 }
-elseif(arg0 == "skills") {
-	try {
-		script.term(script.get("scripts/system/skills.txt"));
-	} catch {
-		nothing();
-	}
-	script.start("system/skills", "utils/u_general", "utils/u_skills", "utils/u_gpvp", "utils/u_plots");
-}
 elseif(arg0 == "money") {
 	try {
 		script.term(script.get("scripts/global/chestshops.txt"));
@@ -5376,6 +5359,8 @@ function setCommandHelps() {
 	command.addHelpAlias(helpAlias, help);
 	command.addHelp(helpAlias);
 	
+	waitfor(1);
+	
 	help = command.newHelp("fly", "fly");
 	helpArg0 = command.newHelpSpecial("Player", "player", "fly.other");
 	command.addHelpChild(helpArg0, command.newHelpLiteral("on"));
@@ -5684,6 +5669,8 @@ function setCommandHelps() {
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
 	
+	waitfor(1);
+	
 	help = command.newHelp("teleport", "teleport");
 	helpArg0 = command.newHelpSpecial("Player", "player");
 	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "to-player", "teleport.other"));
@@ -5736,25 +5723,12 @@ function setCommandHelps() {
 	command.addHelpChild(help, helpArg0);
 	//mail new
 	command.addHelpChild(help, command.newHelpLiteral("new"));
-	//mail input
-	command.addHelpChild(help, command.newHelpLiteral("input"));
-	//mail output
-	command.addHelpChild(help, command.newHelpLiteral("output"));
-	//mail clear <input/output>
-	helpArg0 = command.newHelpLiteral("clear");
-	command.addHelpChild(helpArg0, command.newHelpLiteral("input"));
-	command.addHelpChild(helpArg0, command.newHelpLiteral("output"));
-	command.addHelpChild(help, helpArg0);
-	//mail show <mailid>
-	helpArg0 = command.newHelpLiteral("show");
-	command.addHelpChild(helpArg0, command.newHelpInt("Mail-ID", 0, 10000));
-	command.addHelpChild(help, helpArg0);
-	//mail remove <mailid>
-	helpArg0 = command.newHelpLiteral("remove");
-	command.addHelpChild(helpArg0, command.newHelpInt("Mail-ID", 0, 10000));
-	command.addHelpChild(help, helpArg0);
+	//mail inbox
+	command.addHelpChild(help, command.newHelpLiteral("inbox"));
+	//mail outbox
+	command.addHelpChild(help, command.newHelpLiteral("outbox"));
 	//mail reset
-	command.addHelpChild(help, command.newHelpLiteral("reset"));
+	command.addHelpChild(help, command.newHelpLiteral("reset", "mail.reset"));
 	command.addHelp(help);
 	
 	help = command.newHelp("playtime", "playtime");
@@ -5888,6 +5862,8 @@ function setCommandHelps() {
 	command.addHelpChild(help, command.newHelpLiteral("close"));
 	command.addHelp(help);
 	
+	waitfor(1);
+	
 	help = command.newHelp("party", "party");
 	//party invite <player>
 	helpArg0 = command.newHelpLiteral("invite");

+ 1 - 1
system/damage.txt

@@ -52,7 +52,7 @@ goto("wait");
 
 function updateEntityName(living_entity) {
 	entity_type = entity.getType(living_entity);
-	if(entity_type == "nobody" || entity_type == "armor_stand") {
+	if(entity_type == "nobody" || entity_type == "armor_stand" || entity_type == "human") {
 		return;
 	}
 

+ 1 - 1
system/explosions.txt

@@ -1,6 +1,6 @@
 event.load("pre_explosion");
 
-msg("dev", "§bExplosions §rwurde geladen");
+msg("dev", "§bExplosions §rloaded.");
 @wait
 wait();
 world_name = world.getName(loc.getWorld(location));

+ 1 - 0
system/perms.txt

@@ -288,6 +288,7 @@ perm.registerGroup(7, "stats.remove");
 perm.registerGroup(7, "sudoku");
 perm.registerGroup(7, "removeinvstats");
 perm.registerGroup(7, "removesfstats");
+perm.registerGroup(7, "mail.reset");
 
 //Perm-Group zur User-Simulation
 perm.registerGroup(8, "pseudoPerm");

+ 14 - 16
test4.txt

@@ -1,16 +1,14 @@
-player.disconnect(read.player("marvinius"), "This is SPARTA.");
-
-/*error(true);
-event.load("craft");
-
-@wait
-
-wait();
-
-msg("online", event);
-msg("online", result);
-
-result = null;
-//enchantment.add(enchantment.get("minecraft:looting"), result, 2);
-
-goto("wait");*/
+p = read.player("kajetanjohannes");
+
+human = entity.get(entity.getLocation(p), 30, "me.km.entities.EntityHuman");
+//print(loc.getYaw(entity.getLocation(p)));
+if(human == null)
+{
+    term();
+}
+loc = entity.getLocation(human);
+loc.setX(loc, -430.5);
+loc.setY(loc, 86);
+loc.setZ(loc, 108.5);
+loc.setYaw(loc, -90);
+entity.teleport(human, loc);

+ 68 - 17
utils/u_general.txt

@@ -22,7 +22,7 @@ function sendmessage(pname, topic, nachricht, boolean) { //Sendet eine Chat-Nach
 		player.speak(p, topic, nachricht);
 	} elseif(boolean) {
 		from_name = player.getName($player);
-		sendMail(from_name, pname, nachricht);
+		mail.send(from_name, pname, nachricht);
 	}
 }
 
@@ -242,7 +242,7 @@ function getBlockLocation(location) {
 	return loc.new(world, bx, by, bz);
 }
 
-function speakPrefix(player, prefix, message) {
+function speakPrefix(player, prefix, message) {;
 	msg(player, "§r[", prefix, "§r] ", message);
 }
 
@@ -273,13 +273,32 @@ function loc.isAir(location) {
 
 function getTimeString(millis) {
 	calendar = time.new(millis);
+	day = time.getDay(calendar);
+	month = time.getMonth(calendar);
+	year = time.getYear(calendar);
+	hour = time.getHour(calendar);
 	minute = time.getMinute(calendar);
+	if(month < 10) {
+		month = concat("0", text.number(month));
+	} else {
+		month = text.number(month);
+	}
+	if(day < 10) {
+		day = concat("0", text.number(day));
+	} else {
+		day = text.number(day);
+	}
+	if(hour < 10) {
+		hour = concat("0", text.number(hour));
+	} else {
+		hour = text.number(hour);
+	}
 	if(minute < 10) {
 		minute = concat("0", text.number(minute));
 	} else {
 		minute = text.number(minute);
 	}
-	timestring = concat(text.number(time.getDay(calendar)), ".", text.number(time.getMonth(calendar)), ".", text.number(time.getYear(calendar)), " ", text.number(time.getHour(calendar)), ":", minute);
+	timestring = concat(day, ".", month, ".", text.number(year), " ", hour, ":", minute);
 	return timestring;
 }
 
@@ -1228,25 +1247,57 @@ function sendMessageToWorld2(world, message1, message2) {
 //Mail-Utils
 //--------------------------------------------------
 
-function sendMail(from_name, to_name, nachricht) { //from, to, message. Sendet eine Mail an einen Spieler
-	sgv("SERVER", "mailid", ggv("SERVER", "mailid") + 1);
-	mail_id = read.number(ggv("SERVER", "mailid"));
-	to_id = player.getId(player.getUuid(to_name));
+function mail.send(from_name, to_name, message) {
+	server_config = getScriptVar("server_config");
+	mail_id = config.getDouble(server_config, "mail_id", 0) + 1;
+	config.set(server_config, "mail_id", mail_id);
+	config.saveAsync(server_config);
+	
 	from_id = player.getId(player.getUuid(from_name));
-	gdmap.add("mails", mail_id, "from", from_id);
-	gdmap.add("mails", mail_id, "to", to_id);
-	gdmap.add("mails", mail_id, "readed", false);
-	gdmap.add("mails", mail_id, "time", time.getMillis());
-	gdmap.add("mails", mail_id, "message", nachricht);
-	gdmap.add("mailin", to_id, mail_id, "wusi");
-	gdmap.add("mailout", from_id, mail_id, "wusi");
+	to_id = player.getId(player.getUuid(to_name));
+	
+	stmt = databank.prepare("INSERT INTO mails (mail_id, from_id, to_id, readed, time, message) VALUES (?, ?, ?, ?, ?, ?);");
+	databank.setInt(stmt, 1, mail_id);
+	databank.setInt(stmt, 2, from_id);
+	databank.setInt(stmt, 3, to_id);
+	databank.setBool(stmt, 4, false);
+	databank.setLong(stmt, 5, time.getMillis());
+	databank.setString(stmt, 6, message);
+	databank.workerExecute(stmt);
+	
 	//Wenn Spieler online, dann Pushmeldung veranlassen
-	if(isOnline(to_name)) {
-		p = read.player(to_name);
-		player.speak(p, "§bMail", concat("§rDu hast eine §bneue Mail §rvon §b", from_name));
+	p = read.player(to_name);
+	if(p != null) {
+		player.speak(p, "§bMail", concat("§rYou´ve got a new mail from §b", from_name, "."));
 	}
 }
 
+function mail.checkForNew(player) {
+	stmt = databank.prepare("SELECT mail_id, from_id, time, message FROM mails WHERE to_id = ? AND readed = false;");
+	to_id = player.getId(player);
+	databank.setInt(stmt, 1, to_id);
+	result = databank.execute(stmt);
+	nextrow = databank.next(result);
+	if(!nextrow) {
+		databank.close(result);
+		databank.close(stmt);
+		goto("wait");
+	}
+	newmails = 0;
+	while(nextrow) {
+		newmails++;
+		nextrow = databank.next(result);
+	}
+	databank.close(result);
+	databank.close(stmt);
+	if(newmails > 0) {
+		if(newmails > 1) {
+			speakPrefix(player, "§bMail", concat("§rYou´ve got §b", text.number(newmails), "§r new mails."));
+		} else {
+			speakPrefix(player, "§bMail", "§rYou´ve got §b1 §rnew mail.");
+		}
+	}
+}
 
 //--------------------------------------------------
 //Friend-Utils

+ 1 - 1
utils/u_gpvp.txt

@@ -967,7 +967,7 @@ function sendGuildMail(from_name, gilden_id, nachricht) { //from, to, message. S
 	list = getGuildPlayers(gilden_id);
 	for(i = 0; i < list.getSize(list); i++) {
 		to_name = player.getNameFromId(list.getIndex(list, i));
-		sendMail(from_name, to_name, nachricht);
+		mail.send(from_name, to_name, nachricht);
 	}
 }