Browse Source

snuvi docu update V3.1

Marvin Löschenkohl 3 years ago
parent
commit
de3ad740b0

+ 3 - 177
Archiv/bedwars warp feature.txt

@@ -1,4 +1,3 @@
-<!--<img src='icons.jpg' style='width: 200px'></a>-->
 <section id="Event-List">
 	<table>
         <tr>
@@ -15,7 +14,7 @@
         </tr>
         <tr>
             <td class="bold">receiver</td>
-            <td>"all" / "dev" / "online" / "SERVER" / player_name / player</td>
+            <td>"dev" / "online" / "SERVER" / player</td>
         </tr>
     </table>
     <table>
@@ -119,16 +118,6 @@
             <td>rider<br>entity<br>mounting as boolean<br>*cancel</td>
         </tr>
     </table>
-    <table>
-        <tr>
-            <th class="command">player_join</th>
-            <th class="desc">a player is added to an existing script</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player<br>player_name<br>*cancel</td>
-        </tr>
-    </table>
     <table>
         <tr>
             <th class="command">player_login</th>
@@ -176,26 +165,6 @@
             <td class="bold">Info</td>
             <td>devs can refill the inventory on this event</td>
         </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">player_hurt (deprecated)</th>
-            <th class="desc">a player gets hurt</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player (= injured player)<br>player_name<br>player_involved<br>*sec_player (= attacker)<br>*sec_player_name<br>*player_damage as number<br>player_damage_cause as damagesource<br>player_killed<br>*cancel</td>
-        </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">player_is_attacked (deprecated)</th>
-            <th class="desc">a player gets hurt (event is thrown before player_hurt and cancels damage-animation and knockback)</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player (= injured player)<br>player_name<br>player_involved<br>*sec_player (= attacker)<br>*sec_player_name<br>player_damage_cause as damagesource<br>player_killed<br>*cancel</td>
-        </tr>
     </table>
 	<table>
         <tr>
@@ -277,46 +246,6 @@
             <td>player<br>player_name<br>id</td>
         </tr>
     </table>
-    <table>
-        <tr>
-            <th class="command">player_death (deprecated)</th>
-            <th class="desc">a player dies</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player<br>player_name<br>*sec_player<br>*sec_player_name<br>clear as boolean (true clears the inventory)<br>player_damage_cause as damagesource</td>
-        </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">player_giveup</th>
-            <th class="desc">a player uses /giveup</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player<br>player_name<br>*cancel</td>
-        </tr>
-    </table>
-	<table>
-        <tr>
-            <th class="command">player_no_script</th>
-            <th class="desc">a player uses /giveup and has no script</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player<br>player_name<br>*cancel</td>
-        </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">player_kicked</th>
-            <th class="desc">another script removes a player from this script</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player<br>player_name</td>
-        </tr>
-    </table>
     <table>
         <tr>
             <th class="command">block_break</th>
@@ -347,15 +276,6 @@
             <td>player<br>player_name<br>block as object<br>block_loc<br>block_type<br>action ("left", "right")<br>hand ("MAIN_HAND", "OFF_HAND")<br>*cancel</td>
         </tr>
     </table>
-	<table>
-        <tr>
-            <th class="command">block_harvest</th>
-            <th class="desc">a block is broken</th>
-        </tr>
-        <tr>
-            <td class="bold">Variablen</td>
-            <td>player<br>player_name<br>location<br>*drop_chance as double<br>*drops with itemstacks as list<br>fortune as double<br>silktouch as boolean</td>
-        </tr>
     <table>
         <tr>
             <th class="command">bucket_use</th>
@@ -2796,88 +2716,14 @@
 		<tr>
         </tr>
     </table>
-    <table>
-        <tr>
-            <th class="command">script.join (deprecated)</th>
-            <th class="desc">Fügt einen Spieler einem Script hinzu</th>
-        </tr>
-        <tr>
-            <td class="bold">Format</td>
-            <td>script.join(Script, Player)</td>
-        </tr>
-        <tr>
-            <td class="bold">Arguments</td>
-            <td>Objekt Script / Objekt Player</td>
-        </tr>
-        <tr>
-            <td class="bold">Returns</td>
-            <td>true/false</td>
-        </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">script.kick (deprecated)</th>
-            <th class="desc">kicks a player from a script</th>
-        </tr>
-        <tr>
-            <td class="bold">Format</td>
-            <td>script.kick(Player)</td>
-        </tr>
-        <tr>
-            <td class="bold">Returns</td>
-            <td>true if successfull, false if player is in no script, null if script has no players</td>
-        </tr>
-        <tr>
-            <td class="bold">Info</td>
-            <td>terms the script if the last player has been kicked</td>
-        </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">script.getPlayerAmount (deprecated)</th>
-            <th class="desc">Gibt die Anzahl der Spieler eines Scripts zurück</th>
-        </tr>
-        <tr>
-            <td class="bold">Format</td>
-            <td>script.getPlayerAmount(Script)</td>
-        </tr>
-        <tr>
-            <td class="bold">Arguments</td>
-            <td>Objekt Script</td>
-        </tr>
-        <tr>
-            <td class="bold">Returns</td>
-            <td>Zahl</td>
-        </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">script.playersToList (deprecated)</th>
-            <th class="desc">returns a list with all players from a script</th>
-        </tr>
-        <tr>
-            <td class="bold">Format</td>
-            <td>script.playersToList()</td>
-        </tr>
-    </table>
-    <table>
-        <tr>
-            <th class="command">script.getLeader (deprecated)</th>
-            <th class="desc">Gibt den ersten Spieler in der Liste eines Scripts zurück</th>
-        </tr>
-        <tr>
-            <td class="bold">Format</td>
-            <td>script.getLeader()</td>
-        </tr>
-    </table>
     <table>
         <tr>
             <th class="command">script.callEvent</th>
-            <th class="desc">calls an event to a script</th>
+            <th class="desc">calls an event</th>
         </tr>
         <tr>
             <td class="bold">Format</td>
-            <td>script.callEvent(event, script)</td>
+            <td>script.callEvent(event, [script])</td>
         </tr>
     </table>
 </section>
@@ -3395,16 +3241,6 @@
             <td>an empty slot is null<br>changes effects the player inventory directly</td>
         </tr>
     </table>
-    <table>
-        <tr>
-            <th class="command">player.kick</th>
-            <th class="desc">kicks the player out a script</th>
-        </tr>
-        <tr>
-            <td class="bold">Format</td>
-            <td>player.kick(player)</td>
-        </tr>
-    </table>
     <table>
         <tr>
             <th class="command">player.getName</th>
@@ -3539,16 +3375,6 @@
             <td>player.getSaturation(player)</td>
         </tr>
     </table>
-    <table>
-        <tr>
-            <th class="command">player.hasScript</th>
-            <th class="desc">returns true if the player is bound to a script</th>
-        </tr>
-        <tr>
-            <td class="bold">Format</td>
-            <td>player.hasScript(player)</td>
-        </tr>
-    </table>
     <table>
         <tr>
             <th class="command">player.setGamemode</th>

+ 92 - 50
gildenpvp/gpvp.txt

@@ -6,43 +6,21 @@ event.load("block_break");
 event.load("block_place");
 
 präfix = "§vShop";
-airitemstring = "minecraft:air";
 wall_signs_tag = block.getTag("minecraft:wall_signs");
-cheststring = "minecraft:chest";
 chest_prop = block.getProperty("chest_type");
-airitem = read.item(airitemstring);
 
 if(ggv("SERVER", "shopid") == null) {
 	sgv("SERVER", "shopid", 0); //Fortlaufende Var für IDs der ChestShops
 }
 
-invid_to_shopid = map.new();
-gamesworld = world.get("games");
-skyblockworld = world.get("skyblock");
-gpvpworld = world.get("gpvp");
-overworld = world.get("overworld");
-the_nether = world.get("the_nether");
-the_end = world.get("the_end");
-
-set.new(shopworlds);
-set.add(shopworlds, overworld);
-set.add(shopworlds, the_nether);
-set.add(shopworlds, the_end);
-set.add(shopworlds, skyblockworld);
-set.add(shopworlds, gpvpworld);
+all_shops = list.new();
 
-msg("dev", "§bChestShops §rwurden geladen");
+invid_to_shopid = map.new();
 
+msg("dev", "§bChestShops §rloaded.");
 @wait
 wait();
-if(player == null) {
-	goto("wait");
-}
-player_loc = entity.getLocation(player);
-world = loc.getWorld(player_loc);
-if(set.contains(shopworlds, world)) {
-	ignoreGoto(event);
-}
+ignoreGoto(event);
 goto("wait");
 
 @inv_click
@@ -97,7 +75,7 @@ if(shopid != null) {
 		//Items ins Inventar geben oder droppen
 		notgiven = player.giveItem(player, itemstack);
 		if(notgiven != null) {
-			item.drop(player_loc, notgiven);
+			item.drop(entity.getLocation(player), notgiven);
 		}
 		//In einem AdminShop werden keine Items abgelegt
 		if(!adminshop) {
@@ -128,11 +106,11 @@ if(shopid != null) {
 		if(!adminshop) {
 			//Versuche den ganzen ItemStack in der 1.Kiste unterzubringen
 			notinchest1 = block.addItem(chestloc1, itemstack);
-			if(item.getType(notinchest1) != airitemstring) {
+			if(item.getType(notinchest1) != "minecraft:air") {
 				itemstack = read.item(gdmap.get("chestshops", shopid, "itemstack"));
 				//Versuche den Rest des ItemStack in der 2.Kiste unterzubringen
 				notinchest2 = block.addItem(chestloc2, notinchest1);
-				if(item.getType(notinchest1) != airitemstring) {
+				if(item.getType(notinchest1) != "minecraft:air") {
 					//Entferne die ItemStacks wieder
 					player.speak(player, präfix, "§rDie Kiste ist voll");
 					block.subItem(chestloc1, itemstack);
@@ -156,6 +134,9 @@ map.remove(invid_to_shopid, inv_id);
 goto("wait");
 
 @custom_command
+if(player == null) {
+	goto("wait");
+}
 if(command == "shop") {
 	size = list.getSize(args);
 	if(size == 0) {
@@ -193,7 +174,7 @@ if(command == "shop") {
 			}
 			//ItemStack in Hand nehmen
 			itemstack = entity.getEquip(player, "hand");
-			if(item.getType(itemstack) == airitemstring) {
+			if(item.getType(itemstack) == "minecraft:air") {
 				player.speak(player, präfix, "§rNimm einen Itemstapel mit genauer Stückzahl in die Hand");
 				goto("wait");
 			}
@@ -244,7 +225,7 @@ if(command == "shop") {
 			gmap.add("loctoshopid", text.location(chestloc1), shopid);
 			gmap.add("loctoshopid", text.location(signloc), shopid);
 			//Schild beschreiben
-			block.setSign(signloc, 0, concat("§c", player_name));
+			block.setSign(signloc, 0, concat("§c", player.getName(player)));
 			block.setSign(signloc, 1, concat("§2B ", text.number(buyprice), "§r : §s", text.number(sellprice), " S"));
 			text.split(splitlist, ":", item.getType(itemstack));
 			block.setSign(signloc, 2, list.getIndex(splitlist, 1));
@@ -271,7 +252,7 @@ if(command == "shop") {
 			}
 			//Kontrolle ob Besitzer
 			if(!perm.has(player, "adminshop")) {
-				if(!isShopOwner(player, shopid)) {
+				if(!shop.isOwner(player, shopid)) {
 					player.speak(player, präfix, "§rDu bist nicht der Owner");
 					goto("wait");
 				}
@@ -333,7 +314,7 @@ if(command == "shop") {
 			}
 			//Kontrolle ob Besitzer
 			if(!perm.has(player, "adminshop")) {
-				if(!isShopOwner(player, shopid)) {
+				if(!shop.isOwner(player, shopid)) {
 					player.speak(player, präfix, "§rDu bist nicht der Owner");
 					goto("wait");
 				}
@@ -518,7 +499,7 @@ if(command == "shop") {
 			}
 			//Kontrolle ob Besitzer
 			if(!perm.has(player, "adminshop")) {
-				if(!isShopOwner(player, shopid)) {
+				if(!shop.isOwner(player, shopid)) {
 					player.speak(player, präfix, "§rDu bist nicht der Owner");
 					goto("wait");
 				}
@@ -553,7 +534,7 @@ if(isAChest(block_loc)) {
 		goto("wait");
 	}
 	//Kontrolle ob Besitzer
-	if(isShopOwner(player, shopid)) {
+	if(shop.isOwner(player, shopid)) {
 		goto("wait");
 	}
 	cancel = true;
@@ -602,7 +583,7 @@ if(isAWallSign(block_loc) || isAChest(block_loc)) {
 goto("wait");
 
 @block_place
-if(block_type == cheststring) {
+if(block_type == "minecraft:chest") {
 	chestloc2 = block_loc;
 	chestloc1 = block.getSecChest(chestloc2);
 	//Kontrolle ob ChestShop
@@ -613,7 +594,7 @@ if(block_type == cheststring) {
 	}
 	//Kontrolle ob Besitzer
 	if(!perm.has(player, "adminshop")) {
-		if(!isShopOwner(player, shopid)) {
+		if(!shop.isOwner(player, shopid)) {
 			cancel = true;
 			player.speak(player, präfix, "§rDu bist nicht der Owner");
 			goto("wait");
@@ -622,27 +603,88 @@ if(block_type == cheststring) {
 	//Kiste zum ChestShop hinzufügen
 	gdmap.add("chestshops", shopid, "chestloc2", text.location(chestloc2));
 	gmap.add("loctoshopid", text.location(chestloc2), shopid);
-	player.speak(player, präfix, "§rShop erweitert");
+	speakPrefix(player, präfix, "§rShop extended");
 }
 goto("wait");
 
 function isAChest(location) {
-	if(block.getType(location) == $cheststring) {
-		return true;
-	}
-	return false;
+	return block.getType(location) == "minecraft:chest";
 }
 
 function isAWallSign(location) {
-	if(block.hasTag($wall_signs_tag, block.get(location))) {
-		return true;
-	}
-	return false;
+	return block.hasTag($wall_signs_tag, block.get(location));
 }
 
-function isShopOwner(player, shopid) {
-	if(gdmap.get("chestshops", shopid, "owner") == player.getId(player)) {
-		return true;
+function shop.isOwner(player, shopid) {
+	return gdmap.get("chestshops", shopid, "owner") == player.getId(player);
+}
+/*
+databank.workerExecute(databank.prepare("
+CREATE TABLE IF NOT EXISTS chestshops (
+shop_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
+world_name VARCHAR(20) NOT NULL
+chest1_x INT NOT NULL
+chest1_y INT NOT NULL
+chest1_z INT NOT NULL
+chest2_x INT
+chest2_y INT
+chest2_z INT
+sign_x INT NOT NULL
+sign_y INT NOT NULL
+sign_z INT NOT NULL
+owner VARCHAR(20) NOT NULL
+buyprice INT NOT NULL
+sellprice INT NOT NULL
+itemstack VARCHAR(255) NOT NULL
+);"));
+
+
+function shop.cache() {
+	all_shops
+	stmt = databank.prepare("SELECT * FROM chestshops;");
+	result = databank.execute(stmt);
+	while(databank.next(result)) {
+		tipp_value = databank.getString(result, 1);
 	}
-	return false;
+	databank.close(result);
+	databank.close(stmt);
+	return tipp_value;
 }
+
+function shop.create() { 
+	stmt = databank.prepare("INSERT INTO chestshops (tipp_key, tipp_value) VALUES (?,?)");
+	databank.setString(stmt, 1, tipp_key);
+	databank.setString(stmt, 2, tipp_value);
+	databank.workerExecute(stmt);
+}
+
+function shop.delete() {
+
+
+Kiste
+- Verkaufkisten: beinhalten Ware die Verkauft wird
+- Ankaufkisten: beinhalten Ware, die abgekauft werden soll, im ersten Slot
+
+Schild
+
+- 1: [Admin Shop] / [Shop]
+- 2: "Buy 5 for 65"
+- 3: "Sell 5 for 20"
+​​​​​​​- 4: Falls Shop: player_id
+
+/shop create
+=> setzt Zeile 1 und 4
+
+/shop admin
+=> setzt Zeile 1 und löscht 4
+
+/shop buy AMOUNT PRICE
+=> setzt Zeile 2
+
+/shop sell AMOUNT PRICE
+=> setzt Zeile 3
+
+/shop remove <buy/sell>
+
+
+}*/

+ 3 - 3
global/gamecenter.txt

@@ -1,4 +1,4 @@
-event.load("living_is_attacked");
+event.load("living_pre_hurt");
 event.load("player_login");
 event.load("player_move");
 event.load("player_pre_respawn");
@@ -243,7 +243,7 @@ if(loc.isInGamesWorld(player_loc)) {
 }
 goto("wait");
 
-@living_is_attacked
+@living_pre_hurt
 if(!isPlayer(living_entity)) {
 	goto("wait");
 }
@@ -334,4 +334,4 @@ function minigame.partyJoin(script, party_leader, party_list) {
 		}
 		minigame.joinPlayer(script, p);
 	}
-}
+}

+ 3 - 3
global/hunter.txt

@@ -351,7 +351,7 @@ for(i = 0; i < list.getSize(player_list); i++) {
 
 @checkgame
 wait();
-if(event == "living_is_attacked" || event == "living_death" || event == "living_drop") {
+if(event == "living_pre_hurt" || event == "living_death" || event == "living_drop") {
 	if(!isPlayer(living_entity)) {
 		goto("wait");
 	}
@@ -780,7 +780,7 @@ if(!checkPlayability(tempteam)) {
 }
 goto("checkgame");
 
-@living_is_attacked
+@living_pre_hurt
 if(!isPlayer(living_entity)) {
 	goto("checkgame");
 }
@@ -1072,4 +1072,4 @@ function setShopmenu9(shopmenu) {
 	inv.setItem(shopmenu, 33, read.item("km:coin_gold", 40));
 	inv.setItem(shopmenu, 34, read.item("km:coin_gold", 3));
 	inv.setItem(shopmenu, 35, read.item("km:coin_silver", 3));
-}
+}

+ 304 - 304
minigames/bedwars/region_bwmap6.txt

@@ -1,304 +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);
-}
+//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_pre_hurt
+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);
+}

+ 8 - 5
minigames/dame/dame_map1.txt

@@ -98,10 +98,13 @@ goto("checkgame");
 player.setSpawn(player, map.get(spawn_locs, player));
 goto("checkgame");
 
-@player_is_attacked
-player_damage_cause_string = damage.getType(player_damage_cause);
-if(player_damage_cause_string == "player") {
-	cancel = true;
+@living_pre_hurt
+if(isPlayer(living_entity)) {
+	player = living_entity;
+	damage_type = damage.getType(damage_source);
+	if(damage_type == "player") {
+		cancel = true;
+	}
 }
 goto("checkgame");
 
@@ -267,4 +270,4 @@ function getNumber(player_uuid) {
 			return array[1];
 		}
 	}
-}
+}

+ 394 - 394
minigames/fastbridge/region_fastbridgemap2.txt

@@ -1,394 +1,394 @@
-rankingtable = "halmaranks";
-
-teams = map.new();
-block_click_catcher = set.new();
-pointed_loc = loc.new(gamesworld, 0, 0, 0); //Default-Wert, um Error zu verhindern
-gamename = "§eHalma";
-
-gosub("setstart");
-goto("simplelobby");
-
-@finalstart
-player_list = minigame.getPlayers(script_id);
-minigame.speakAll(gamename, "The game has started.");
-
-//Sechseck leeren
-iter = list.iterator(center_locs);
-while(hasNext(iter)) {
-	entry = next(iter);
-	block.set(entry, "minecraft:air");
-}
-//Start-Felder 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);
-		block.set(entry, "minecraft:air");
-	}
-}
-//Ziel-Felder 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);
-		block.set(entry, "minecraft:air");
-	}
-}
-
-for(i = 0; i < list.getSize(player_list); i++) {
-	player = player.get(list.getIndex(player_list, i));
-	entity.teleport(player, spawn_loc);
-	player.setGamemode(player, "survival");
-	player.setFly(player, true);
-	//Team-Zuweisung
-	map.add(teams, player, i);
-	//Start-Feld bestücken
-	list = map.get(start_locs, i);
-	banner_type = map.get(tokens_map, i);
-	rotation = map.get(rotations_map, i);
-	iter = list.iterator(list);
-	while(hasNext(iter)) {
-		entry = next(iter);
-		block.set(entry, concat(banner_type, "[rotation=", rotation, "]"));
-	}
-}
-
-next_player = player.get(list.getIndex(player_list, math.random(0, list.getSize(player_list) - 1)));
-setNextPlayer(next_player);
-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 != next_player) {
-	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)) {
-		//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);
-				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);
-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, player.getUuid(next_player)) + 1;
-if(index >= list.getSize(player_list)) {
-	index = 0;
-}
-next_player = player.get(list.getIndex(player_list, index));
-setNextPlayer(next_player);
-block.set(pointed_loc, basic_block);
-goto("wait");
-
-@custom_command
-if(command == "nextplayer") {
-	if(player == next_player) {
-		goto("nextplayer");
-	}
-}
-goto("wait");
-
-@block_break
-@block_place
-@living_is_attacked
-cancel = true;
-goto("wait");
-
-@win
-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);
-	token = map.get(tokens_map, team);
-	removeSpecificToken(token);
-}
-goto("wait");
-
-function setNextPlayer(next_player) {
-	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[§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 getPair(a, b) {
-      c = array.new(2);
-      c[0] = a;
-      c[1] = b;
-      return c;
-}
-
-function createFieldNorth(north_loc, ox, oz) {
-	list = list.new();
-	list.add(list, north_loc);
-	list.add(list, loc.mod(north_loc, -ox, 0, oz));
-	list.add(list, loc.mod(north_loc, ox, 0, oz));
-	list.add(list, loc.mod(north_loc, -2*ox, 0, 2*oz));
-	list.add(list, loc.mod(north_loc, 0, 0, 2*oz));
-	list.add(list, loc.mod(north_loc, 2*ox, 0, 2*oz));
-	list.add(list, loc.mod(north_loc, -3*ox, 0, 3*oz));
-	list.add(list, loc.mod(north_loc, -ox, 0, 3*oz));
-	list.add(list, loc.mod(north_loc, ox, 0, 3*oz));
-	list.add(list, loc.mod(north_loc, 3*ox, 0, 3*oz));
-	list.add(list, loc.mod(north_loc, -4*ox, 0, 4*oz));
-	list.add(list, loc.mod(north_loc, -2*ox, 0, 4*oz));
-	list.add(list, loc.mod(north_loc, 0, 0, 4*oz));
-	list.add(list, loc.mod(north_loc, 2*ox, 0, 4*oz));
-	list.add(list, loc.mod(north_loc, 4*ox, 0, 4*oz));
-	return list;
-}
-
-function createFieldSouth(south_loc, ox, oz) {
-	list = list.new();
-	list.add(list, south_loc);
-	list.add(list, loc.mod(south_loc, -ox, 0, -oz));
-	list.add(list, loc.mod(south_loc, ox, 0, -oz));
-	list.add(list, loc.mod(south_loc, -2*ox, 0, -2*oz));
-	list.add(list, loc.mod(south_loc, 0, 0, -2*oz));
-	list.add(list, loc.mod(south_loc, 2*ox, 0, -2*oz));
-	list.add(list, loc.mod(south_loc, -3*ox, 0, -3*oz));
-	list.add(list, loc.mod(south_loc, -ox, 0, -3*oz));
-	list.add(list, loc.mod(south_loc, ox, 0, -3*oz));
-	list.add(list, loc.mod(south_loc, 3*ox, 0, -3*oz));
-	list.add(list, loc.mod(south_loc, -4*ox, 0, -4*oz));
-	list.add(list, loc.mod(south_loc, -2*ox, 0, -4*oz));
-	list.add(list, loc.mod(south_loc, 0, 0, -4*oz));
-	list.add(list, loc.mod(south_loc, 2*ox, 0, -4*oz));
-	list.add(list, loc.mod(south_loc, 4*ox, 0, -4*oz));
-	return list;
-}
-
-function createFieldCenter(loc, ox, oz) {
-	list = list.new();
-	list.add(list, loc);
-	list.add(list, loc.mod(loc, 2*ox, 0, 0));
-	list.add(list, loc.mod(loc, 4*ox, 0, 0));
-	list.add(list, loc.mod(loc, 6*ox, 0, 0));
-	list.add(list, loc.mod(loc, -ox, 0, oz));
-	list.add(list, loc.mod(loc, ox, 0, oz));
-	list.add(list, loc.mod(loc, 3*ox, 0, oz));
-	list.add(list, loc.mod(loc, 5*ox, 0, oz));
-	list.add(list, loc.mod(loc, 7*ox, 0, oz));
-	list.add(list, loc.mod(loc, -2*ox, 0, 2*oz));
-	list.add(list, loc.mod(loc, 0, 0, 2*oz));
-	list.add(list, loc.mod(loc, 2*ox, 0, 2*oz));
-	list.add(list, loc.mod(loc, 4*ox, 0, 2*oz));
-	list.add(list, loc.mod(loc, 6*ox, 0, 2*oz));
-	list.add(list, loc.mod(loc, 8*ox, 0, 2*oz));
-	list.add(list, loc.mod(loc, -3*ox, 0, 3*oz));
-	list.add(list, loc.mod(loc, -ox, 0, 3*oz));
-	list.add(list, loc.mod(loc, ox, 0, 3*oz));
-	list.add(list, loc.mod(loc, 3*ox, 0, 3*oz));
-	list.add(list, loc.mod(loc, 5*ox, 0, 3*oz));
-	list.add(list, loc.mod(loc, 7*ox, 0, 3*oz));
-	list.add(list, loc.mod(loc, 9*ox, 0, 3*oz));
-	list.add(list, loc.mod(loc, -2*ox, 0, 4*oz));
-	list.add(list, loc.mod(loc, 0, 0, 4*oz));
-	list.add(list, loc.mod(loc, 2*ox, 0, 4*oz));
-	list.add(list, loc.mod(loc, 4*ox, 0, 4*oz));
-	list.add(list, loc.mod(loc, 6*ox, 0, 4*oz));
-	list.add(list, loc.mod(loc, 8*ox, 0, 4*oz));
-	list.add(list, loc.mod(loc, -ox, 0, 5*oz));
-	list.add(list, loc.mod(loc, ox, 0, 5*oz));
-	list.add(list, loc.mod(loc, 3*ox, 0, 5*oz));
-	list.add(list, loc.mod(loc, 5*ox, 0, 5*oz));
-	list.add(list, loc.mod(loc, 7*ox, 0, 5*oz));
-	list.add(list, loc.mod(loc, 0, 0, 6*oz));
-	list.add(list, loc.mod(loc, 2*ox, 0, 6*oz));
-	list.add(list, loc.mod(loc, 4*ox, 0, 6*oz));
-	list.add(list, loc.mod(loc, 6*ox, 0, 6*oz));
-	return list;
-}
+rankingtable = "halmaranks";
+
+teams = map.new();
+block_click_catcher = set.new();
+pointed_loc = loc.new(gamesworld, 0, 0, 0); //Default-Wert, um Error zu verhindern
+gamename = "§eHalma";
+
+gosub("setstart");
+goto("simplelobby");
+
+@finalstart
+player_list = minigame.getPlayers(script_id);
+minigame.speakAll(gamename, "The game has started.");
+
+//Sechseck leeren
+iter = list.iterator(center_locs);
+while(hasNext(iter)) {
+	entry = next(iter);
+	block.set(entry, "minecraft:air");
+}
+//Start-Felder 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);
+		block.set(entry, "minecraft:air");
+	}
+}
+//Ziel-Felder 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);
+		block.set(entry, "minecraft:air");
+	}
+}
+
+for(i = 0; i < list.getSize(player_list); i++) {
+	player = player.get(list.getIndex(player_list, i));
+	entity.teleport(player, spawn_loc);
+	player.setGamemode(player, "survival");
+	player.setFly(player, true);
+	//Team-Zuweisung
+	map.add(teams, player, i);
+	//Start-Feld bestücken
+	list = map.get(start_locs, i);
+	banner_type = map.get(tokens_map, i);
+	rotation = map.get(rotations_map, i);
+	iter = list.iterator(list);
+	while(hasNext(iter)) {
+		entry = next(iter);
+		block.set(entry, concat(banner_type, "[rotation=", rotation, "]"));
+	}
+}
+
+next_player = player.get(list.getIndex(player_list, math.random(0, list.getSize(player_list) - 1)));
+setNextPlayer(next_player);
+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 != next_player) {
+	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)) {
+		//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);
+				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);
+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, player.getUuid(next_player)) + 1;
+if(index >= list.getSize(player_list)) {
+	index = 0;
+}
+next_player = player.get(list.getIndex(player_list, index));
+setNextPlayer(next_player);
+block.set(pointed_loc, basic_block);
+goto("wait");
+
+@custom_command
+if(command == "nextplayer") {
+	if(player == next_player) {
+		goto("nextplayer");
+	}
+}
+goto("wait");
+
+@block_break
+@block_place
+@living_pre_hurt
+cancel = true;
+goto("wait");
+
+@win
+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);
+	token = map.get(tokens_map, team);
+	removeSpecificToken(token);
+}
+goto("wait");
+
+function setNextPlayer(next_player) {
+	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[§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 getPair(a, b) {
+      c = array.new(2);
+      c[0] = a;
+      c[1] = b;
+      return c;
+}
+
+function createFieldNorth(north_loc, ox, oz) {
+	list = list.new();
+	list.add(list, north_loc);
+	list.add(list, loc.mod(north_loc, -ox, 0, oz));
+	list.add(list, loc.mod(north_loc, ox, 0, oz));
+	list.add(list, loc.mod(north_loc, -2*ox, 0, 2*oz));
+	list.add(list, loc.mod(north_loc, 0, 0, 2*oz));
+	list.add(list, loc.mod(north_loc, 2*ox, 0, 2*oz));
+	list.add(list, loc.mod(north_loc, -3*ox, 0, 3*oz));
+	list.add(list, loc.mod(north_loc, -ox, 0, 3*oz));
+	list.add(list, loc.mod(north_loc, ox, 0, 3*oz));
+	list.add(list, loc.mod(north_loc, 3*ox, 0, 3*oz));
+	list.add(list, loc.mod(north_loc, -4*ox, 0, 4*oz));
+	list.add(list, loc.mod(north_loc, -2*ox, 0, 4*oz));
+	list.add(list, loc.mod(north_loc, 0, 0, 4*oz));
+	list.add(list, loc.mod(north_loc, 2*ox, 0, 4*oz));
+	list.add(list, loc.mod(north_loc, 4*ox, 0, 4*oz));
+	return list;
+}
+
+function createFieldSouth(south_loc, ox, oz) {
+	list = list.new();
+	list.add(list, south_loc);
+	list.add(list, loc.mod(south_loc, -ox, 0, -oz));
+	list.add(list, loc.mod(south_loc, ox, 0, -oz));
+	list.add(list, loc.mod(south_loc, -2*ox, 0, -2*oz));
+	list.add(list, loc.mod(south_loc, 0, 0, -2*oz));
+	list.add(list, loc.mod(south_loc, 2*ox, 0, -2*oz));
+	list.add(list, loc.mod(south_loc, -3*ox, 0, -3*oz));
+	list.add(list, loc.mod(south_loc, -ox, 0, -3*oz));
+	list.add(list, loc.mod(south_loc, ox, 0, -3*oz));
+	list.add(list, loc.mod(south_loc, 3*ox, 0, -3*oz));
+	list.add(list, loc.mod(south_loc, -4*ox, 0, -4*oz));
+	list.add(list, loc.mod(south_loc, -2*ox, 0, -4*oz));
+	list.add(list, loc.mod(south_loc, 0, 0, -4*oz));
+	list.add(list, loc.mod(south_loc, 2*ox, 0, -4*oz));
+	list.add(list, loc.mod(south_loc, 4*ox, 0, -4*oz));
+	return list;
+}
+
+function createFieldCenter(loc, ox, oz) {
+	list = list.new();
+	list.add(list, loc);
+	list.add(list, loc.mod(loc, 2*ox, 0, 0));
+	list.add(list, loc.mod(loc, 4*ox, 0, 0));
+	list.add(list, loc.mod(loc, 6*ox, 0, 0));
+	list.add(list, loc.mod(loc, -ox, 0, oz));
+	list.add(list, loc.mod(loc, ox, 0, oz));
+	list.add(list, loc.mod(loc, 3*ox, 0, oz));
+	list.add(list, loc.mod(loc, 5*ox, 0, oz));
+	list.add(list, loc.mod(loc, 7*ox, 0, oz));
+	list.add(list, loc.mod(loc, -2*ox, 0, 2*oz));
+	list.add(list, loc.mod(loc, 0, 0, 2*oz));
+	list.add(list, loc.mod(loc, 2*ox, 0, 2*oz));
+	list.add(list, loc.mod(loc, 4*ox, 0, 2*oz));
+	list.add(list, loc.mod(loc, 6*ox, 0, 2*oz));
+	list.add(list, loc.mod(loc, 8*ox, 0, 2*oz));
+	list.add(list, loc.mod(loc, -3*ox, 0, 3*oz));
+	list.add(list, loc.mod(loc, -ox, 0, 3*oz));
+	list.add(list, loc.mod(loc, ox, 0, 3*oz));
+	list.add(list, loc.mod(loc, 3*ox, 0, 3*oz));
+	list.add(list, loc.mod(loc, 5*ox, 0, 3*oz));
+	list.add(list, loc.mod(loc, 7*ox, 0, 3*oz));
+	list.add(list, loc.mod(loc, 9*ox, 0, 3*oz));
+	list.add(list, loc.mod(loc, -2*ox, 0, 4*oz));
+	list.add(list, loc.mod(loc, 0, 0, 4*oz));
+	list.add(list, loc.mod(loc, 2*ox, 0, 4*oz));
+	list.add(list, loc.mod(loc, 4*ox, 0, 4*oz));
+	list.add(list, loc.mod(loc, 6*ox, 0, 4*oz));
+	list.add(list, loc.mod(loc, 8*ox, 0, 4*oz));
+	list.add(list, loc.mod(loc, -ox, 0, 5*oz));
+	list.add(list, loc.mod(loc, ox, 0, 5*oz));
+	list.add(list, loc.mod(loc, 3*ox, 0, 5*oz));
+	list.add(list, loc.mod(loc, 5*ox, 0, 5*oz));
+	list.add(list, loc.mod(loc, 7*ox, 0, 5*oz));
+	list.add(list, loc.mod(loc, 0, 0, 6*oz));
+	list.add(list, loc.mod(loc, 2*ox, 0, 6*oz));
+	list.add(list, loc.mod(loc, 4*ox, 0, 6*oz));
+	list.add(list, loc.mod(loc, 6*ox, 0, 6*oz));
+	return list;
+}

+ 189 - 190
minigames/halma/halma_map1.txt

@@ -1,190 +1,189 @@
-rankingtable = "icejrranks";
-maxplayers = 1;
-gamesignsmap = getScriptVar("gamesigns");
-gamesignloc = map.get(gamesignsmap, "icejrsign");
-
-event.load("command");
-event.load("player_join");
-event.load("player_move");
-event.load("player_is_attacked");
-event.load("player_death");
-event.load("player_pre_respawn");
-event.load("player_toss");
-event.load("player_logout");
-event.load("player_giveup");
-event.load("entity_click");
-event.load("block_break");
-event.load("block_place");
-event.load("block_click");
-
-list.new(notallowed);
-list.add(notallowed, "fly");
-list.add(notallowed, "gm");
-list.add(notallowed, "gamemode");
-list.add(notallowed, "tp");
-list.add(notallowed, "teleport");
-list.add(notallowed, "tppos");
-list.add(notallowed, "top");	
-list.add(notallowed, "j");	
-list.add(notallowed, "jumpto");	
-
-gamesworld = world.get("games");
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
-sign_tag = block.getTag("minecraft:signs");
-
-list.new(checkpoints);
-//1.Etage
-list.add(checkpoints, loc.new(gamesworld, 1000, 20, -2000)); //Spawn
-list.add(checkpoints, loc.new(gamesworld, 987, 24, -1997));
-list.add(checkpoints, loc.new(gamesworld, 990, 28, -1998));
-list.add(checkpoints, loc.new(gamesworld, 988, 27, -1985));
-list.add(checkpoints, loc.new(gamesworld, 1006, 24, -1985));
-list.add(checkpoints, loc.new(gamesworld, 1015, 25, -2010));
-list.add(checkpoints, loc.new(gamesworld, 999, 35, -2013));
-//2.Etage
-list.add(checkpoints, loc.new(gamesworld, 1001, 41, -2002));
-list.add(checkpoints, loc.new(gamesworld, 1000, 46, -2004));
-list.add(checkpoints, loc.new(gamesworld, 985, 51, -2003));
-list.add(checkpoints, loc.new(gamesworld, 986, 50, -2000));
-list.add(checkpoints, loc.new(gamesworld, 989, 50, -1985));
-list.add(checkpoints, loc.new(gamesworld, 988, 49, -1991));
-list.add(checkpoints, loc.new(gamesworld, 1012, 52, -1998));
-//3.Etage
-list.add(checkpoints, loc.new(gamesworld, 998, 57, -2004));
-list.add(checkpoints, loc.new(gamesworld, 997, 61, -1989));
-list.add(checkpoints, loc.new(gamesworld, 1000, 60, -2014));
-list.add(checkpoints, loc.new(gamesworld, 994, 66, -1985));
-//4.Etage
-list.add(checkpoints, loc.new(gamesworld, 1000, 75, -2002));
-list.add(checkpoints, loc.new(gamesworld, 985, 88, -1987));
-list.add(checkpoints, loc.new(gamesworld, 990, 81, -2001));
-//5.Etage
-list.add(checkpoints, loc.new(gamesworld, 1000, 94, -2003));
-list.add(checkpoints, loc.new(gamesworld, 1000, 103, -2010));
-list.add(checkpoints, loc.new(gamesworld, 1007, 100, -2013));
-list.add(checkpoints, loc.new(gamesworld, 1012, 101, -1993));
-list.add(checkpoints, loc.new(gamesworld, 986, 100, -1995));
-//Finish
-list.add(checkpoints, loc.new(gamesworld, 1000, 108, -1988));
-
-
-list.new(spawnlocs);
-for(i = 0; i < list.getSize(checkpoints); i++) {
-	location1 = list.getIndex(checkpoints, i);
-	location2 = loc.mod(location1, 1, 1, 1);
-	event.addMoveData(location1, location2, -1, -1);
-	
-	list.add(spawnlocs, loc.mod(location1, 0.5, 0, 0.5));
-}
-
-@wait
-wait();
-ignoreGoto(event);
-goto("wait");
-
-@player_join
-starttime = time.getMillis();
-sgv(player, "jr", true);
-jumpstage = getPoints(rankingtable, player.getId(player));
-if(jumpstage == 0) {
-    sgv(player, "icejumptime", 0);
-}
-entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
-player.clearInventory(player);
-entity.addEffect(player, "minecraft:night_vision", 32760, 0);
-
-gosub("stage_specific");
-player.setGamemode(player, "adventure");
-player.setFly(player, false);
-sgoto(1, "loop");
-goto("wait");
-
-@block_click
-if(block.hasTag(sign_tag, block)) {
-	if(block.getSign(block_loc, 2) == "Checkpoint") {
-		entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
-	}
-}
-goto("wait");
-
-@command
-if(list.contains(notallowed, toLowerCase(command))) {
-	cancel = true;
-	player.speak(player, "§6Commands", "§rDie wichtigste Regel im Wettkampf: Sabotage!");
-}
-goto("wait");
-
-@player_toss
-entity.setEquip(player, "hand", item);
-cancel = true;
-goto("wait");
-
-@entity_click
-@block_break
-@block_place
-cancel = true;
-goto("wait");
-
-@player_death
-player.respawn(player);
-goto("wait");
-
-@player_pre_respawn
-player.setSpawn(player, list.getIndex(spawnlocs, jumpstage));
-goto("wait");
-
-@player_is_attacked
-player_damage_cause_string = damage.getType(player_damage_cause);
-if(player_damage_cause_string == "fall") {
-	cancel = true;
-	goto("wait");
-}
-if(player_damage_cause_string == "arrow") {
-	cancel = true;
-	goto("wait");
-}
-goto("wait");
-
-@player_move
-player_loc = entity.getLocation(player);
-x = loc.getCoord(player_loc, "bx");
-y = loc.getCoord(player_loc, "by");
-z = loc.getCoord(player_loc, "bz");
-loc = loc.new(gamesworld, x, y, z);
-index = list.getIndexOf(checkpoints, loc);
-if(index > jumpstage) {
-	player.action(player, "§aCheckpoint gesetzt");
-	player.speak(player, "§6Commands", "§r", text.number(index), ".Checkpoint erreicht");
-	jumpstage = index;
-	gosub("stage_specific");
-}
-goto("wait");
-
-@stage_specific
-return;
-
-@loop
-player.setHunger(player, 20);
-player.setSaturation(player, 5);
-sgoto(200, "loop");
-goto("wait");
-
-@player_logout
-@player_giveup
-player.setGamemode(player, "survival");
-sgv(player, "jr", false);
-endtime = time.getMillis();
-time = endtime - starttime;
-newtime = ggv(player, "icejumptime") + time;
-sgv(player, "icejumptime", newtime);
-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));
-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();
+rankingtable = "icejrranks";
+maxplayers = 1;
+gamesignsmap = getScriptVar("gamesigns");
+gamesignloc = map.get(gamesignsmap, "icejrsign");
+
+event.load("command");
+event.load("player_join");
+event.load("player_move");
+event.load("living_pre_hurt");
+event.load("player_pre_respawn");
+event.load("player_toss");
+event.load("player_logout");
+event.load("player_giveup");
+event.load("entity_click");
+event.load("block_break");
+event.load("block_place");
+event.load("block_click");
+
+list.new(notallowed);
+list.add(notallowed, "fly");
+list.add(notallowed, "gm");
+list.add(notallowed, "gamemode");
+list.add(notallowed, "tp");
+list.add(notallowed, "teleport");
+list.add(notallowed, "tppos");
+list.add(notallowed, "top");	
+list.add(notallowed, "j");	
+list.add(notallowed, "jumpto");	
+
+gamesworld = world.get("games");
+gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
+sign_tag = block.getTag("minecraft:signs");
+
+list.new(checkpoints);
+//1.Etage
+list.add(checkpoints, loc.new(gamesworld, 1000, 20, -2000)); //Spawn
+list.add(checkpoints, loc.new(gamesworld, 987, 24, -1997));
+list.add(checkpoints, loc.new(gamesworld, 990, 28, -1998));
+list.add(checkpoints, loc.new(gamesworld, 988, 27, -1985));
+list.add(checkpoints, loc.new(gamesworld, 1006, 24, -1985));
+list.add(checkpoints, loc.new(gamesworld, 1015, 25, -2010));
+list.add(checkpoints, loc.new(gamesworld, 999, 35, -2013));
+//2.Etage
+list.add(checkpoints, loc.new(gamesworld, 1001, 41, -2002));
+list.add(checkpoints, loc.new(gamesworld, 1000, 46, -2004));
+list.add(checkpoints, loc.new(gamesworld, 985, 51, -2003));
+list.add(checkpoints, loc.new(gamesworld, 986, 50, -2000));
+list.add(checkpoints, loc.new(gamesworld, 989, 50, -1985));
+list.add(checkpoints, loc.new(gamesworld, 988, 49, -1991));
+list.add(checkpoints, loc.new(gamesworld, 1012, 52, -1998));
+//3.Etage
+list.add(checkpoints, loc.new(gamesworld, 998, 57, -2004));
+list.add(checkpoints, loc.new(gamesworld, 997, 61, -1989));
+list.add(checkpoints, loc.new(gamesworld, 1000, 60, -2014));
+list.add(checkpoints, loc.new(gamesworld, 994, 66, -1985));
+//4.Etage
+list.add(checkpoints, loc.new(gamesworld, 1000, 75, -2002));
+list.add(checkpoints, loc.new(gamesworld, 985, 88, -1987));
+list.add(checkpoints, loc.new(gamesworld, 990, 81, -2001));
+//5.Etage
+list.add(checkpoints, loc.new(gamesworld, 1000, 94, -2003));
+list.add(checkpoints, loc.new(gamesworld, 1000, 103, -2010));
+list.add(checkpoints, loc.new(gamesworld, 1007, 100, -2013));
+list.add(checkpoints, loc.new(gamesworld, 1012, 101, -1993));
+list.add(checkpoints, loc.new(gamesworld, 986, 100, -1995));
+//Finish
+list.add(checkpoints, loc.new(gamesworld, 1000, 108, -1988));
+
+
+list.new(spawnlocs);
+for(i = 0; i < list.getSize(checkpoints); i++) {
+	location1 = list.getIndex(checkpoints, i);
+	location2 = loc.mod(location1, 1, 1, 1);
+	event.addMoveData(location1, location2, -1, -1);
+	
+	list.add(spawnlocs, loc.mod(location1, 0.5, 0, 0.5));
+}
+
+@wait
+wait();
+ignoreGoto(event);
+goto("wait");
+
+@player_join
+starttime = time.getMillis();
+sgv(player, "jr", true);
+jumpstage = getPoints(rankingtable, player.getId(player));
+if(jumpstage == 0) {
+    sgv(player, "icejumptime", 0);
+}
+entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
+player.clearInventory(player);
+entity.addEffect(player, "minecraft:night_vision", 32760, 0);
+
+gosub("stage_specific");
+player.setGamemode(player, "adventure");
+player.setFly(player, false);
+sgoto(1, "loop");
+goto("wait");
+
+@block_click
+if(block.hasTag(sign_tag, block)) {
+	if(block.getSign(block_loc, 2) == "Checkpoint") {
+		entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
+	}
+}
+goto("wait");
+
+@command
+if(list.contains(notallowed, toLowerCase(command))) {
+	cancel = true;
+	player.speak(player, "§6Commands", "§rDie wichtigste Regel im Wettkampf: Sabotage!");
+}
+goto("wait");
+
+@player_toss
+entity.setEquip(player, "hand", item);
+cancel = true;
+goto("wait");
+
+@entity_click
+@block_break
+@block_place
+cancel = true;
+goto("wait");
+
+@player_pre_respawn
+player.setSpawn(player, list.getIndex(spawnlocs, jumpstage));
+goto("wait");
+
+@living_pre_hurt
+if(!isPlayer(living_entity)) {
+	goto("wait");
+}
+player = living_entity;
+damage_type = damage.getType(damage_source);
+if(damage_type == "fall") {
+	cancel = true;
+	goto("wait");
+}
+if(damage_type == "arrow") {
+	cancel = true;
+	goto("wait");
+}
+goto("wait");
+
+@player_move
+player_loc = entity.getLocation(player);
+x = loc.getCoord(player_loc, "bx");
+y = loc.getCoord(player_loc, "by");
+z = loc.getCoord(player_loc, "bz");
+loc = loc.new(gamesworld, x, y, z);
+index = list.getIndexOf(checkpoints, loc);
+if(index > jumpstage) {
+	player.action(player, "§aCheckpoint gesetzt");
+	player.speak(player, "§6Commands", "§r", text.number(index), ".Checkpoint erreicht");
+	jumpstage = index;
+	gosub("stage_specific");
+}
+goto("wait");
+
+@stage_specific
+return;
+
+@loop
+player.setHunger(player, 20);
+player.setSaturation(player, 5);
+sgoto(200, "loop");
+goto("wait");
+
+@player_logout
+@player_giveup
+player.setGamemode(player, "survival");
+sgv(player, "jr", false);
+endtime = time.getMillis();
+time = endtime - starttime;
+newtime = ggv(player, "icejumptime") + time;
+sgv(player, "icejumptime", newtime);
+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));
+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();

+ 3 - 3
minigames/jumpnrun/jumpnrun.txt

@@ -1,4 +1,4 @@
-event.load("living_is_attacked");
+event.load("living_pre_hurt");
 event.load("player_move");
 event.load("player_logout");
 event.load("block_click");
@@ -208,7 +208,7 @@ entity.teleport(player, loc.mod(startblock, 0.5, 1, 0.5));
 previousblock = startblock;
 goto("newblock");
 
-@living_is_attacked
+@living_pre_hurt
 if(!isPlayer(living_entity)) {
 	goto("wait");
 }
@@ -277,4 +277,4 @@ gosub("resetcore");
 script = script.getFromId(script_id);
 minigame.kickPlayer(script, player);
 minigame.term(script, gamesignloc);
-term();
+term();

+ 11 - 12
minigames/jumpnrun/todesjumpnrun.txt

@@ -7,8 +7,7 @@ lavacounter = 0;
 event.load("command");
 event.load("player_join");
 event.load("player_move");
-event.load("player_is_attacked");
-event.load("player_death");
+event.load("living_pre_hurt");
 event.load("player_pre_respawn");
 event.load("player_toss");
 event.load("player_logout");
@@ -237,17 +236,17 @@ goto("wait");
 cancel = true;
 goto("wait");
 
-@player_death
-player.respawn(player);
-goto("wait");
-
 @player_pre_respawn
 player.setSpawn(player, list.getIndex(spawnlocs, jumpstage - 1));
 goto("wait");
 
-@player_is_attacked
-player_damage_cause_string = damage.getType(player_damage_cause);
-if(player_damage_cause_string == "lava") {
+@living_pre_hurt
+if(!isPlayer(living_entity)) {
+	goto("wait");
+}
+player = living_entity;
+damage_type = damage.getType(damage_source);
+if(damage_type == "lava") {
 	++lavacounter;
 	if(lavacounter == 8) {
 		entity.damage(player, 100);
@@ -255,14 +254,14 @@ if(player_damage_cause_string == "lava") {
 	}
 	goto("wait");
 }
-if(player_damage_cause_string == "fall") {
+if(damage_type == "fall") {
 	if(jumpstage == 11 || jumpstage == 13) {
 		goto("wait");
 	}
 	cancel = true;
 	goto("wait");
 }
-if(player_damage_cause_string == "arrow") {
+if(damage_type == "arrow") {
 	cancel = true;
 	goto("wait");
 }
@@ -343,4 +342,4 @@ minigame.statsLine(player, "§e", "Time", concat(hours, "h ", minutes, "min"));
 script = script.getFromId(script_id);
 minigame.kickPlayer(script, player);
 minigame.term(script, gamesignloc);
-term();
+term();

+ 3 - 4
minigames/knockfight/knockfight.txt

@@ -2,7 +2,7 @@ rankingtable = "knockranks";
 
 event.load("player_toss");
 event.load("function_key");
-event.load("living_hurt");
+event.load("living_is_attacked");
 
 kf_skills = list.new();
 addKnockfightSkill("Speed", "km:skill44", 30, 173);
@@ -57,7 +57,7 @@ cancel = true;
 player.giveItem(player, item);
 goto("checkgame");
 
-@living_hurt
+@living_is_attacked
 if(!isPlayer(living_entity)) {
 	goto("checkgame");
 }
@@ -72,8 +72,7 @@ if(damage_type == "player") {
 	if(!player.hasMinigameId(sec_player, script_id)) {
 		goto("checkgame");
 	}
-	sec_player_uuid = player.getUuid(sec_player);
-	map.add(lastdamage, player_uuid, sec_player_uuid);
+	map.add(lastdamage, player_uuid, player.getUuid(sec_player));
 	list.add(resetlist, player_uuid);
 	sgoto(resettime, "resetdamager");
 	goto("checkgame");

+ 205 - 205
minigames/parcour/parcour.txt

@@ -1,205 +1,205 @@
-gamename = "§6Parcour";
-maxplayers = 1;
-
-event.load("command");
-event.load("player_move");
-event.load("living_is_attacked");
-event.load("player_pre_respawn");
-event.load("player_toss");
-event.load("player_logout");
-event.load("player_giveup");
-event.load("player_join");
-event.load("entity_click");
-event.load("block_break");
-event.load("block_place");
-event.load("block_click");
-
-notallowed = list.new();
-list.add(notallowed, "fly");
-list.add(notallowed, "gm");
-list.add(notallowed, "gamemode");
-list.add(notallowed, "tp");
-list.add(notallowed, "teleport");
-list.add(notallowed, "tppos");
-list.add(notallowed, "top");	
-list.add(notallowed, "j");	
-list.add(notallowed, "jumpto");	
-
-sign_tag = block.getTag("minecraft:signs");
-delayed_tp = false;
-
-minutes = 0;
-seconds = 0;
-jumpstage = 0;
-starttime = time.getMillis();
-
-@wait
-wait();
-if(player.hasMinigameId(player, script_id)) {
-	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);
-	event.addMoveData(location1, location2, -1, -1, player);
-	
-	list.add(spawnlocs, loc.mod(location1, 0.5, 0, 0.5));
-}
-
-sgv(player, "jr", true);
-entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
-player.clearInventory(player);
-record_time = getPoints(rankingtable, player.getId(player));
-overall_record = getPointsFromRank(rankingtable, 1, "ASC");
-
-player.setGamemode(player, "survival");
-player.setFly(player, false);
-display.add(player, 1, gamename);
-display.add(player, 2, "Server Record: ", text.number(math.roundDown(overall_record / 60)), " min ", text.number(math.roundComma(overall_record % 60, 2)), " s");
-display.add(player, 3, "Your Record: ", text.number(math.roundDown(record_time / 60)), " min ", text.number(math.roundComma(record_time % 60, 2)), " s");
-display.add(player, 4, concat(text.number(jumpstage), "/", text.number(list.getSize(checkpoints) - 1)));
-display.add(player, 5, concat("§rTime: 0:00"));
-gosub("stage_specific");
-sgoto(1, "loop");
-goto("wait");
-
-@block_click
-if(block.hasTag(sign_tag, block)) {
-	if(block.getSign(block_loc, 2) == "Checkpoint") {
-		entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
-	}
-}
-goto("wait");
-
-@command
-if(list.contains(notallowed, toLowerCase(command))) {
-	cancel = true;
-	player.speak(player, "§6Commands", "§rDie wichtigste Regel im Wettkampf: Sabotage!");
-}
-goto("wait");
-
-@player_toss
-entity.setEquip(player, "hand", item);
-cancel = true;
-goto("wait");
-
-@entity_click
-@block_break
-@block_place
-cancel = true;
-goto("wait");
-
-@player_pre_respawn
-player.setSpawn(player, list.getIndex(spawnlocs, jumpstage));
-goto("wait");
-
-@living_is_attacked
-if(!isPlayer(living_entity)) {
-	goto("wait");
-}
-if(delayed_tp) {
-	goto("wait");
-}
-player = living_entity;
-damage_source_type = damage.getType(damage_source);
-if(damage_source_type == "hotFloor") {
-	goto("delayedTeleport");
-}
-if(damage_source_type == "outOfWorld") {
-	cancel = true;
-	goto("delayedTeleport");
-}
-if(damage_source_type == "fall") {
-	cancel = true;
-	if(jumpstage == 7) {
-		goto("delayedTeleport");
-	}
-	goto("wait");
-}
-if(damage_source_type == "arrow") {
-	cancel = true;
-}
-goto("wait");
-
-@delayedTeleport
-delayed_tp = true;
-sgoto(1, "delayedTeleport2");
-goto("wait");
-
-@delayedTeleport2
-delayed_tp = false;
-entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
-goto("wait");
-
-@player_move
-player_loc = entity.getLocation(player);
-x = loc.getCoord(player_loc, "bx");
-y = loc.getCoord(player_loc, "by");
-z = loc.getCoord(player_loc, "bz");
-loc = loc.new(gamesworld, x, y, z);
-index = list.getIndexOf(checkpoints, loc);
-if(index > jumpstage) {
-	player.action(player, "§aCheckpoint gesetzt");
-	if(seconds < 10) {
-		player.speak(player, gamename, "§r", text.number(index), ".Checkpoint erreicht §e", text.number(minutes), ":0", text.number(seconds));
-	} else {
-		player.speak(player, gamename, "§r", text.number(index), ".Checkpoint erreicht §e", text.number(minutes), ":", text.number(seconds));
-	}
-	jumpstage = index;
-	display.add(player, 4, concat(text.number(jumpstage), "/", text.number(list.getSize(checkpoints) - 1)));
-	if(jumpstage == list.getSize(checkpoints) - 1) {
-		player.speak(player, gamename, "§rZiel erreicht");
-		endtime = time.getMillis();
-		time = (endtime - starttime) / 1000; //in Sekunden
-		if(record_time == 0 || time < record_time) {
-			if(record_time != 0) {
-				diff = record_time - time;
-				player.speak(player, gamename, concat("§eEigenen Rekord um §r", text.number(math.roundDown(diff)), "§e s übertroffen"));
-			}
-			record_time = time;
-		}
-		setRanking(rankingtable, player.getId(player), record_time, -1);
-
-		msg(player, "§b---= Deine Statistik =---");
-		minutes = math.roundDown(record_time / 60);
-		seconds = math.roundComma(record_time % 60, 2);
-		minutes2 = math.roundDown(time / 60);
-		seconds2 = math.roundComma(time % 60, 2);
-		msg(player, concat("§eZeit: §r", text.number(minutes2), " min ", text.number(seconds2), " s"));
-		msg(player, concat("§eEigener Rekord: §r", text.number(minutes), " min ", text.number(seconds), " s"));
-		goto("player_logout");
-	}
-	gosub("stage_specific");
-}
-goto("wait");
-
-@stage_specific
-return;
-
-@loop
-seconds++;
-if(seconds == 60) {
-    minutes++;
-	seconds = 0;
-}
-if(seconds < 10) {
-	display.add(player, 5, concat("Time: ", text.number(minutes), ":0", text.number(seconds)));
-} else {
-    display.add(player, 5, concat("Time: ", text.number(minutes), ":", text.number(seconds)));
-}
-player.setHunger(player, 20);
-player.setSaturation(player, 5);
-sgoto(20, "loop");
-goto("wait");
-
-@player_logout
-@player_giveup
-sgv(player, "jr", false);
-script = script.getFromId(script_id);
-minigame.kickPlayer(script, player);
-minigame.term(script, gamesignloc);
-term();
+gamename = "§6Parcour";
+maxplayers = 1;
+
+event.load("command");
+event.load("player_move");
+event.load("living_pre_hurt");
+event.load("player_pre_respawn");
+event.load("player_toss");
+event.load("player_logout");
+event.load("player_giveup");
+event.load("player_join");
+event.load("entity_click");
+event.load("block_break");
+event.load("block_place");
+event.load("block_click");
+
+notallowed = list.new();
+list.add(notallowed, "fly");
+list.add(notallowed, "gm");
+list.add(notallowed, "gamemode");
+list.add(notallowed, "tp");
+list.add(notallowed, "teleport");
+list.add(notallowed, "tppos");
+list.add(notallowed, "top");	
+list.add(notallowed, "j");	
+list.add(notallowed, "jumpto");	
+
+sign_tag = block.getTag("minecraft:signs");
+delayed_tp = false;
+
+minutes = 0;
+seconds = 0;
+jumpstage = 0;
+starttime = time.getMillis();
+
+@wait
+wait();
+if(player.hasMinigameId(player, script_id)) {
+	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);
+	event.addMoveData(location1, location2, -1, -1, player);
+	
+	list.add(spawnlocs, loc.mod(location1, 0.5, 0, 0.5));
+}
+
+sgv(player, "jr", true);
+entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
+player.clearInventory(player);
+record_time = getPoints(rankingtable, player.getId(player));
+overall_record = getPointsFromRank(rankingtable, 1, "ASC");
+
+player.setGamemode(player, "survival");
+player.setFly(player, false);
+display.add(player, 1, gamename);
+display.add(player, 2, "Server Record: ", text.number(math.roundDown(overall_record / 60)), " min ", text.number(math.roundComma(overall_record % 60, 2)), " s");
+display.add(player, 3, "Your Record: ", text.number(math.roundDown(record_time / 60)), " min ", text.number(math.roundComma(record_time % 60, 2)), " s");
+display.add(player, 4, concat(text.number(jumpstage), "/", text.number(list.getSize(checkpoints) - 1)));
+display.add(player, 5, concat("§rTime: 0:00"));
+gosub("stage_specific");
+sgoto(1, "loop");
+goto("wait");
+
+@block_click
+if(block.hasTag(sign_tag, block)) {
+	if(block.getSign(block_loc, 2) == "Checkpoint") {
+		entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
+	}
+}
+goto("wait");
+
+@command
+if(list.contains(notallowed, toLowerCase(command))) {
+	cancel = true;
+	player.speak(player, "§6Commands", "§rDie wichtigste Regel im Wettkampf: Sabotage!");
+}
+goto("wait");
+
+@player_toss
+entity.setEquip(player, "hand", item);
+cancel = true;
+goto("wait");
+
+@entity_click
+@block_break
+@block_place
+cancel = true;
+goto("wait");
+
+@player_pre_respawn
+player.setSpawn(player, list.getIndex(spawnlocs, jumpstage));
+goto("wait");
+
+@living_pre_hurt
+if(!isPlayer(living_entity)) {
+	goto("wait");
+}
+if(delayed_tp) {
+	goto("wait");
+}
+player = living_entity;
+damage_source_type = damage.getType(damage_source);
+if(damage_source_type == "hotFloor") {
+	goto("delayedTeleport");
+}
+if(damage_source_type == "outOfWorld") {
+	cancel = true;
+	goto("delayedTeleport");
+}
+if(damage_source_type == "fall") {
+	cancel = true;
+	if(jumpstage == 7) {
+		goto("delayedTeleport");
+	}
+	goto("wait");
+}
+if(damage_source_type == "arrow") {
+	cancel = true;
+}
+goto("wait");
+
+@delayedTeleport
+delayed_tp = true;
+sgoto(1, "delayedTeleport2");
+goto("wait");
+
+@delayedTeleport2
+delayed_tp = false;
+entity.teleport(player, list.getIndex(spawnlocs, jumpstage));
+goto("wait");
+
+@player_move
+player_loc = entity.getLocation(player);
+x = loc.getCoord(player_loc, "bx");
+y = loc.getCoord(player_loc, "by");
+z = loc.getCoord(player_loc, "bz");
+loc = loc.new(gamesworld, x, y, z);
+index = list.getIndexOf(checkpoints, loc);
+if(index > jumpstage) {
+	player.action(player, "§aCheckpoint gesetzt");
+	if(seconds < 10) {
+		player.speak(player, gamename, "§r", text.number(index), ".Checkpoint erreicht §e", text.number(minutes), ":0", text.number(seconds));
+	} else {
+		player.speak(player, gamename, "§r", text.number(index), ".Checkpoint erreicht §e", text.number(minutes), ":", text.number(seconds));
+	}
+	jumpstage = index;
+	display.add(player, 4, concat(text.number(jumpstage), "/", text.number(list.getSize(checkpoints) - 1)));
+	if(jumpstage == list.getSize(checkpoints) - 1) {
+		player.speak(player, gamename, "§rZiel erreicht");
+		endtime = time.getMillis();
+		time = (endtime - starttime) / 1000; //in Sekunden
+		if(record_time == 0 || time < record_time) {
+			if(record_time != 0) {
+				diff = record_time - time;
+				player.speak(player, gamename, concat("§eEigenen Rekord um §r", text.number(math.roundDown(diff)), "§e s übertroffen"));
+			}
+			record_time = time;
+		}
+		setRanking(rankingtable, player.getId(player), record_time, -1);
+
+		msg(player, "§b---= Deine Statistik =---");
+		minutes = math.roundDown(record_time / 60);
+		seconds = math.roundComma(record_time % 60, 2);
+		minutes2 = math.roundDown(time / 60);
+		seconds2 = math.roundComma(time % 60, 2);
+		msg(player, concat("§eZeit: §r", text.number(minutes2), " min ", text.number(seconds2), " s"));
+		msg(player, concat("§eEigener Rekord: §r", text.number(minutes), " min ", text.number(seconds), " s"));
+		goto("player_logout");
+	}
+	gosub("stage_specific");
+}
+goto("wait");
+
+@stage_specific
+return;
+
+@loop
+seconds++;
+if(seconds == 60) {
+    minutes++;
+	seconds = 0;
+}
+if(seconds < 10) {
+	display.add(player, 5, concat("Time: ", text.number(minutes), ":0", text.number(seconds)));
+} else {
+    display.add(player, 5, concat("Time: ", text.number(minutes), ":", text.number(seconds)));
+}
+player.setHunger(player, 20);
+player.setSaturation(player, 5);
+sgoto(20, "loop");
+goto("wait");
+
+@player_logout
+@player_giveup
+sgv(player, "jr", false);
+script = script.getFromId(script_id);
+minigame.kickPlayer(script, player);
+minigame.term(script, gamesignloc);
+term();

+ 3 - 3
minigames/parcour/parcour_map1.txt

@@ -155,7 +155,7 @@ entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
 
 @wait
 wait();
-if(event == "living_is_attacked") {
+if(event == "living_pre_hurt") {
 	if(!isPlayer(living_entity)) {
 		goto("wait");
 	}
@@ -210,7 +210,7 @@ if(player_item_type == "minecraft:chest") {
 }
 goto("wait");
 
-@living_is_attacked
+@living_pre_hurt
 cancel = true;
 defender = player;
 defender_name = player.getName(defender);
@@ -580,4 +580,4 @@ function saveRmInventory(player, inv) {
 	map = getScriptVar("rmInventories");
 	map.add(map, player.getUuid(player), inv);
 	setScriptVar("rmInventories", map);
-}
+}

+ 320 - 318
minigames/ragemode/region_rmmap4.txt

@@ -1,318 +1,320 @@
-carved_pumpkin = read.item("carved_pumpkin");
-leaves_tag = block.getTag("minecraft:leaves");
-gosub("setstart");
-stufe = 1;
-gamename = "§aSammelfieber";
-
-templist = list.new();
-list.add(templist, items1);
-list.add(templist, items2);
-list.add(templist, items3);
-list.add(templist, items4);
-for(h = 0; h < list.getSize(templist); h++) {
-	list = list.getIndex(templist, h);
-	for(i = 0; i < list.getSize(list); i++) {
-		item_type = list.getIndex(list, i);
-		if(!map.contains(items, item_type)) {
-			msg(player, item_type);
-			msg(player, "#1 Falsches Item entdeckt. Script beendet. marvinius informieren");
-			term();
-		}
-		try {
-			item = read.item(item_type);
-		} catch {
-			msg(player, item_type);
-			msg(player, "#2 Falsches Item entdeckt. Script beendet. marvinius informieren");
-			term();
-		}
-	}
-}
-
-if(maxplayers == 1) {
-	rankingtable = "sfsingle";
-	sign.started(gamesignloc);
-	wait(); //block_click beim Betreten des Spiels
-	wait(); //player_join des SinglePlayers
-	goto("finalstart");
-}
-
-rankingtable = concat("sfmulti", text.number(maxplayers));
-goto("simplelobby");
-
-@finalstart
-player_list = minigame.getPlayers(script_id);
-minigame.speakAll(gamename, "The game has started.");
-double_block_half_property = block.getProperty("double_block_half");
-
-min = 0;
-sec = 6;
-timer_string = concat("§bTimer: §r", text.number(min), " min 0", text.number(sec), " s");
-
-iter = list.iterator(player_list);
-while(hasNext(iter)) {
-	player = player.get(next(iter));
-	entity.teleport(player, spawn_loc);
-	player.setGamemode(player, "survival");
-	player.setFly(player, false);
-	resetplayer(player);
-	display.add(player, 1, gamename);
-	display.add(player, 2, timer_string);
-	display.add(player, 3, "§bFound Items: §r0");
-	display.add(player, 4, "§bNext Items:"); 
-	entity.addEffect(player, "speed", 19200, 1);
-}
-
-event.load("bucket_use");
-event.load("player_pickup");
-event.load("craft");
-
-farmtypes = list.new();
-list.add(farmtypes, "minecraft:carrots");
-list.add(farmtypes, "minecraft:melon_stem");
-list.add(farmtypes, "minecraft:potatoes");
-list.add(farmtypes, "minecraft:wheat");
-
-workbench_types = set.new();
-set.add(workbench_types, "minecraft:crafting_table");
-set.add(workbench_types, "minecraft:furnace");
-set.add(workbench_types, "minecraft:chest");
-	
-nextitems = list.new();
-founditems = list.new();
-workbenches = set.new();
-resetlist_type = list.new();
-resetlist_loc = list.new();
-resetlistdouble_type = list.new();
-resetlistdouble_loc = list.new();
-resetlistdouble_loc2 = list.new();
-
-sgoto(1, "tick");
-
-for(h = 0; h < 3; h++) {
-	gosub("newitem");
-}
-
-minigame.speakAll(gamename, "Collect as many shown items as you can.");
-minigame.speakAll(gamename, "Drop and collect not counted items again.");
-
-@wait
-wait();
-if(player.hasMinigameId(player, script_id)) {
-	ignoreGoto(event);
-}
-goto("wait");
-
-@block_click
-if(action == "right") {
-	if(set.contains(workbench_types, block_type)) {
-		goto("wait");
-	}
-	if(hand == "MAIN_HAND") {
-		hand = "hand";
-	} else {
-		hand = "offhand";
-	}
-	item_type = item.getType(entity.getEquip(player, hand));
-	if(set.contains(workbench_types, item_type)) {
-		goto("wait");
-	}
-	cancel = true;
-	if(block_type == "minecraft:pumpkin" && item_type == "minecraft:shears") {
-		item.drop(block_loc, carved_pumpkin);
-	}
-}
-goto("wait");
-
-@player_is_attacked
-cancel = true;
-goto("wait");
-
-@block_break
-if(set.contains(workbench_types, block_type)) {
-	goto("wait");
-}
-if(block.hasTag(leaves_tag, block.get(block_loc))) {
-	split_list = text.split("_", block_type);
-	drop_type = concat(text.concatList(split_list, "_", 0, list.getSize(split_list) - 2), "_sapling");
-	item.drop(block_loc, read.item(drop_type));
-}
-state = block.getState(block_loc, double_block_half_property);
-if(state != null) {
-	if(state == "lower") {
-		loc = block_loc;
-		loc2 = loc.mod(block_loc, 0, 1, 0);
-	} else {
-		loc = loc.mod(block_loc, 0, -1, 0);
-		loc2 = block_loc;
-	}
-	list.add(resetlistdouble_type, block_type);
-	list.add(resetlistdouble_loc, loc);
-	list.add(resetlistdouble_loc2, loc2);
-	sgoto(1, "doubleresetblock");
-	goto("wait");
-}
-if(block_type == "minecraft:vine") {
-	cancel = true;
-	goto("wait");
-}
-if(block_type == "minecraft:sugar_cane") {
-	cancel = true;
-	item.drop(block_loc, read.item("sugar_cane"));
-	goto("wait");
-}
-if(block_type == "minecraft:farmland") {
-	cancel = true;
-	goto("wait");
-}
-list.add(resetlist_type, block_type);
-list.add(resetlist_loc, block_loc);
-sgoto(1, "resetblock");
-goto("wait");
-
-@bucket_use
-cancel = true;
-goto("wait");
-
-@block_place
-cancel = true;
-if(set.contains(workbench_types, block_type)) {
-	cancel = false;
-	set.add(workbenches, block_loc);
-}
-goto("wait");
-
-@doubleresetblock
-btype = list.getIndex(resetlistdouble_type, 0);
-loc = list.getIndex(resetlistdouble_loc, 0);
-loc2 = list.getIndex(resetlistdouble_loc2, 0);
-list.removeIndex(resetlistdouble_type, 0);
-list.removeIndex(resetlistdouble_loc, 0);
-list.removeIndex(resetlistdouble_loc2, 0);
-block.set(loc, concat(btype, "[half=lower]"));
-block.set(loc2, concat(btype, "[half=upper]"));
-goto("wait");
-
-@resetblock
-btype = list.getIndex(resetlist_type, 0);
-bloc = list.getIndex(resetlist_loc, 0);
-list.removeIndex(resetlist_type, 0);
-list.removeIndex(resetlist_loc, 0);
-if(list.contains(farmtypes, btype)) {
-	block.set(bloc, concat(btype, "[age=7]"));
-} else {
-	block.set(bloc, btype);
-}
-goto("wait");
-
-@tick
-if(sec == 0) {
-	sec = 59;
-	min--;
-	if(min == -1) {
-		goto("endgame");
-	}
-} else {
-	sec--;
-	if(sec < 10) {
-		minigame.displayAll(2, concat("§bTimer: §r", text.number(min), " min 0", text.number(sec), " s"));
-	} else {
-		minigame.displayAll(2, concat("§bTimer: §r", text.number(min), " min ", text.number(sec), " s"));
-	}
-	if(min == 0) {
-		if(sec == 30) {
-			minigame.speakAll(gamename, "30 seconds left!");
-		} elseif(sec == 10) {
-			minigame.speakAll(gamename, "10 seconds left!");
-		} elseif(sec == 5) {
-			minigame.speakAll(gamename, "5 seconds left!");
-		}
-	}
-}
-sgoto(20, "tick");
-goto("wait");
-
-@player_pickup
-@craft
-itype = item.getType(item);
-if(list.contains(nextitems, itype)) {
-	list.add(founditems, itype);
-	list.remove(nextitems, itype);
-	display.add("all", 3, concat("§bGefundene Items: §r", text.number(list.getSize(founditems))));
-	gosub("newitem");
-}
-goto("wait");
-
-@newitem
-if(min < 12) {
-	if(stufe == 1) {
-		for(i = 0; i < list.getSize(items2); i++) {
-			list.add(items1, list.getIndex(items2, i));
-		}
-		stufe = 2;
-	}
-	if(min < 8) {
-		if(stufe == 2) {
-			for(i = 0; i < list.getSize(items3); i++) {
-				list.add(items1, list.getIndex(items3, i));
-			}
-			stufe = 3;
-		}
-		if(min < 4) {
-			if(stufe == 3) {
-				for(i = 0; i < list.getSize(items4); i++) {
-					list.add(items1, list.getIndex(items4, i));
-				}
-				stufe = 4;
-			}
-		}
-	}
-}
-randomitemstring = list.getIndex(items1, math.random(0, list.getSize(items1) - 1));
-list.remove(items1, randomitemstring);
-list.add(nextitems, randomitemstring);
-for(i = 0; i < list.getSize(nextitems); i++) {
-	type = list.getIndex(nextitems, i);
-	minigame.displayAll(5 + i, map.get(items, type));
-}
-return;
-
-@player_logout
-@player_giveup
-script = script.getFromId(script_id);
-minigame.kickplayer(script, player);
-if(list.getSize(player_list) == 0) {
-	goto("endcore");
-}
-goto("wait");
-
-@endgame
-yetfound = list.getSize(founditems);
-script = script.getFromId(script_id);
-iter = list.iterator(player_list);
-while(hasNext(iter)) {
-	player = player.get(next(iter));
-	player_id = player.getId(player);
-	playedgames = getPlayedGames(rankingtable, player_id) + 1;
-	last_record = getPoints(rankingtable, player_id);
-	if(last_record < yetfound) {
-		diff = yetfound - last_record;
-		last_record = yetfound;
-	}
-	setRanking(rankingtable, player_id, last_record, playedgames);
-	
-	minigame.statsHeader(player, $gamename, "§e");
-	minigame.statsLine(player, "§e", "Found Items", text.number(yetfound));
-	if(diff != null) {
-		msg(player, " §e- §rBeat own record by §e", text.number(diff));
-	}
-	minigame.statsLine(player, "§e", "Played games", text.number(playedgames));
-}
-@endcore
-iter = set.iterator(workbenches);
-while(hasNext(iter)) {
-	block.set(next(iter), "minecraft:air");
-}
-entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
-minigame.kickAllPlayers(script);
-minigame.term(script, gamesignloc);
-term();
+carved_pumpkin = read.item("carved_pumpkin");
+leaves_tag = block.getTag("minecraft:leaves");
+gosub("setstart");
+stufe = 1;
+gamename = "§aSammelfieber";
+
+templist = list.new();
+list.add(templist, items1);
+list.add(templist, items2);
+list.add(templist, items3);
+list.add(templist, items4);
+for(h = 0; h < list.getSize(templist); h++) {
+	list = list.getIndex(templist, h);
+	for(i = 0; i < list.getSize(list); i++) {
+		item_type = list.getIndex(list, i);
+		if(!map.contains(items, item_type)) {
+			msg(player, item_type);
+			msg(player, "#1 Falsches Item entdeckt. Script beendet. marvinius informieren");
+			term();
+		}
+		try {
+			item = read.item(item_type);
+		} catch {
+			msg(player, item_type);
+			msg(player, "#2 Falsches Item entdeckt. Script beendet. marvinius informieren");
+			term();
+		}
+	}
+}
+
+if(maxplayers == 1) {
+	rankingtable = "sfsingle";
+	sign.started(gamesignloc);
+	wait(); //block_click beim Betreten des Spiels
+	wait(); //player_join des SinglePlayers
+	goto("finalstart");
+}
+
+rankingtable = concat("sfmulti", text.number(maxplayers));
+goto("simplelobby");
+
+@finalstart
+player_list = minigame.getPlayers(script_id);
+minigame.speakAll(gamename, "The game has started.");
+double_block_half_property = block.getProperty("double_block_half");
+
+min = 0;
+sec = 6;
+timer_string = concat("§bTimer: §r", text.number(min), " min 0", text.number(sec), " s");
+
+iter = list.iterator(player_list);
+while(hasNext(iter)) {
+	player = player.get(next(iter));
+	entity.teleport(player, spawn_loc);
+	player.setGamemode(player, "survival");
+	player.setFly(player, false);
+	resetplayer(player);
+	display.add(player, 1, gamename);
+	display.add(player, 2, timer_string);
+	display.add(player, 3, "§bFound Items: §r0");
+	display.add(player, 4, "§bNext Items:"); 
+	entity.addEffect(player, "speed", 19200, 1);
+}
+
+event.load("bucket_use");
+event.load("player_pickup");
+event.load("craft");
+
+farmtypes = list.new();
+list.add(farmtypes, "minecraft:carrots");
+list.add(farmtypes, "minecraft:melon_stem");
+list.add(farmtypes, "minecraft:potatoes");
+list.add(farmtypes, "minecraft:wheat");
+
+workbench_types = set.new();
+set.add(workbench_types, "minecraft:crafting_table");
+set.add(workbench_types, "minecraft:furnace");
+set.add(workbench_types, "minecraft:chest");
+	
+nextitems = list.new();
+founditems = list.new();
+workbenches = set.new();
+resetlist_type = list.new();
+resetlist_loc = list.new();
+resetlistdouble_type = list.new();
+resetlistdouble_loc = list.new();
+resetlistdouble_loc2 = list.new();
+
+sgoto(1, "tick");
+
+for(h = 0; h < 3; h++) {
+	gosub("newitem");
+}
+
+minigame.speakAll(gamename, "Collect as many shown items as you can.");
+minigame.speakAll(gamename, "Drop and collect not counted items again.");
+
+@wait
+wait();
+if(player.hasMinigameId(player, script_id)) {
+	ignoreGoto(event);
+}
+goto("wait");
+
+@block_click
+if(action == "right") {
+	if(set.contains(workbench_types, block_type)) {
+		goto("wait");
+	}
+	if(hand == "MAIN_HAND") {
+		hand = "hand";
+	} else {
+		hand = "offhand";
+	}
+	item_type = item.getType(entity.getEquip(player, hand));
+	if(set.contains(workbench_types, item_type)) {
+		goto("wait");
+	}
+	cancel = true;
+	if(block_type == "minecraft:pumpkin" && item_type == "minecraft:shears") {
+		item.drop(block_loc, carved_pumpkin);
+	}
+}
+goto("wait");
+
+@living_pre_hurt
+if(isPlayer(living_entity)) {
+	cancel = true;
+}
+goto("wait");
+
+@block_break
+if(set.contains(workbench_types, block_type)) {
+	goto("wait");
+}
+if(block.hasTag(leaves_tag, block.get(block_loc))) {
+	split_list = text.split("_", block_type);
+	drop_type = concat(text.concatList(split_list, "_", 0, list.getSize(split_list) - 2), "_sapling");
+	item.drop(block_loc, read.item(drop_type));
+}
+state = block.getState(block_loc, double_block_half_property);
+if(state != null) {
+	if(state == "lower") {
+		loc = block_loc;
+		loc2 = loc.mod(block_loc, 0, 1, 0);
+	} else {
+		loc = loc.mod(block_loc, 0, -1, 0);
+		loc2 = block_loc;
+	}
+	list.add(resetlistdouble_type, block_type);
+	list.add(resetlistdouble_loc, loc);
+	list.add(resetlistdouble_loc2, loc2);
+	sgoto(1, "doubleresetblock");
+	goto("wait");
+}
+if(block_type == "minecraft:vine") {
+	cancel = true;
+	goto("wait");
+}
+if(block_type == "minecraft:sugar_cane") {
+	cancel = true;
+	item.drop(block_loc, read.item("sugar_cane"));
+	goto("wait");
+}
+if(block_type == "minecraft:farmland") {
+	cancel = true;
+	goto("wait");
+}
+list.add(resetlist_type, block_type);
+list.add(resetlist_loc, block_loc);
+sgoto(1, "resetblock");
+goto("wait");
+
+@bucket_use
+cancel = true;
+goto("wait");
+
+@block_place
+cancel = true;
+if(set.contains(workbench_types, block_type)) {
+	cancel = false;
+	set.add(workbenches, block_loc);
+}
+goto("wait");
+
+@doubleresetblock
+btype = list.getIndex(resetlistdouble_type, 0);
+loc = list.getIndex(resetlistdouble_loc, 0);
+loc2 = list.getIndex(resetlistdouble_loc2, 0);
+list.removeIndex(resetlistdouble_type, 0);
+list.removeIndex(resetlistdouble_loc, 0);
+list.removeIndex(resetlistdouble_loc2, 0);
+block.set(loc, concat(btype, "[half=lower]"));
+block.set(loc2, concat(btype, "[half=upper]"));
+goto("wait");
+
+@resetblock
+btype = list.getIndex(resetlist_type, 0);
+bloc = list.getIndex(resetlist_loc, 0);
+list.removeIndex(resetlist_type, 0);
+list.removeIndex(resetlist_loc, 0);
+if(list.contains(farmtypes, btype)) {
+	block.set(bloc, concat(btype, "[age=7]"));
+} else {
+	block.set(bloc, btype);
+}
+goto("wait");
+
+@tick
+if(sec == 0) {
+	sec = 59;
+	min--;
+	if(min == -1) {
+		goto("endgame");
+	}
+} else {
+	sec--;
+	if(sec < 10) {
+		minigame.displayAll(2, concat("§bTimer: §r", text.number(min), " min 0", text.number(sec), " s"));
+	} else {
+		minigame.displayAll(2, concat("§bTimer: §r", text.number(min), " min ", text.number(sec), " s"));
+	}
+	if(min == 0) {
+		if(sec == 30) {
+			minigame.speakAll(gamename, "30 seconds left!");
+		} elseif(sec == 10) {
+			minigame.speakAll(gamename, "10 seconds left!");
+		} elseif(sec == 5) {
+			minigame.speakAll(gamename, "5 seconds left!");
+		}
+	}
+}
+sgoto(20, "tick");
+goto("wait");
+
+@player_pickup
+@craft
+itype = item.getType(item);
+if(list.contains(nextitems, itype)) {
+	list.add(founditems, itype);
+	list.remove(nextitems, itype);
+	display.add("all", 3, concat("§bGefundene Items: §r", text.number(list.getSize(founditems))));
+	gosub("newitem");
+}
+goto("wait");
+
+@newitem
+if(min < 12) {
+	if(stufe == 1) {
+		for(i = 0; i < list.getSize(items2); i++) {
+			list.add(items1, list.getIndex(items2, i));
+		}
+		stufe = 2;
+	}
+	if(min < 8) {
+		if(stufe == 2) {
+			for(i = 0; i < list.getSize(items3); i++) {
+				list.add(items1, list.getIndex(items3, i));
+			}
+			stufe = 3;
+		}
+		if(min < 4) {
+			if(stufe == 3) {
+				for(i = 0; i < list.getSize(items4); i++) {
+					list.add(items1, list.getIndex(items4, i));
+				}
+				stufe = 4;
+			}
+		}
+	}
+}
+randomitemstring = list.getIndex(items1, math.random(0, list.getSize(items1) - 1));
+list.remove(items1, randomitemstring);
+list.add(nextitems, randomitemstring);
+for(i = 0; i < list.getSize(nextitems); i++) {
+	type = list.getIndex(nextitems, i);
+	minigame.displayAll(5 + i, map.get(items, type));
+}
+return;
+
+@player_logout
+@player_giveup
+script = script.getFromId(script_id);
+minigame.kickplayer(script, player);
+if(list.getSize(player_list) == 0) {
+	goto("endcore");
+}
+goto("wait");
+
+@endgame
+yetfound = list.getSize(founditems);
+script = script.getFromId(script_id);
+iter = list.iterator(player_list);
+while(hasNext(iter)) {
+	player = player.get(next(iter));
+	player_id = player.getId(player);
+	playedgames = getPlayedGames(rankingtable, player_id) + 1;
+	last_record = getPoints(rankingtable, player_id);
+	if(last_record < yetfound) {
+		diff = yetfound - last_record;
+		last_record = yetfound;
+	}
+	setRanking(rankingtable, player_id, last_record, playedgames);
+	
+	minigame.statsHeader(player, $gamename, "§e");
+	minigame.statsLine(player, "§e", "Found Items", text.number(yetfound));
+	if(diff != null) {
+		msg(player, " §e- §rBeat own record by §e", text.number(diff));
+	}
+	minigame.statsLine(player, "§e", "Played games", text.number(playedgames));
+}
+@endcore
+iter = set.iterator(workbenches);
+while(hasNext(iter)) {
+	block.set(next(iter), "minecraft:air");
+}
+entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
+minigame.kickAllPlayers(script);
+minigame.term(script, gamesignloc);
+term();

+ 869 - 869
minigames/sammelfieber/sammelfieberitems.txt

@@ -1,869 +1,869 @@
-rankingtable = "shoppingranks";
-specific_lobby_handling = true;
-
-air = "minecraft:air";
-air_item = read.item(air);
-emerald = read.item("minecraft:emerald");
-emerald10 = read.item("minecraft:emerald", 10);
-gamename = "§eShoppingChaos";
-start_sound = sound.get("minecraft:block.note_block.harp");
-wall_signs_tag = block.getTag("minecraft:wall_signs");
-facing_prop = block.getProperty("horizontal_facing");
-
-players = map.new(); //Alle player_uuids mit Verweis auf die Team-Nr
-playersinteam = map.new(); //Anzahl der Spieler im Team
-teamidtolist = map.new(); //Team-Nr mit Verweis auf die Spielerlisten
-allteams = list.new(); //Alle Teams, die noch im Spiel sind
-items_list = list.new(); //Array-List: Alle Items mit Rezepten
-points = map.new(); //Punktestand der Teams
-sales_map = map.new(); //Key Entity. Value Item
-recipe_menus = map.new(); //Rezept-Menüs für jeden Spieler
-removed_perms = list.new(); //Spieler-Uuids, denen Building-Perms entfernt wurden
-waiters = list.new(); //Spieler in der Lobby ohne Teamzugehörigkeit
-
-forbidden_items = list.new();
-list.add(forbidden_items, "minecraft:item_frame");
-list.add(forbidden_items, "minecraft:painting");
-
-colorcodes = map.new();
-map.add(colorcodes, 0, "§9");
-map.add(colorcodes, 1, "§c");
-map.add(colorcodes, 2, "§z");
-map.add(colorcodes, 3, "§p");
-
-teamcolortext = map.new();
-map.add(teamcolortext, 0, "§9blue");
-map.add(teamcolortext, 1, "§cred");
-map.add(teamcolortext, 2, "§zyellow");
-map.add(teamcolortext, 3, "§pgreen");
-
-teamcolortext2 = map.new();
-map.add(teamcolortext2, 0, "§9Blue");
-map.add(teamcolortext2, 1, "§cRed");
-map.add(teamcolortext2, 2, "§zYellow");
-map.add(teamcolortext2, 3, "§pGreen");
-
-iron_block = "minecraft:iron_block";
-iron_ingot = "minecraft:iron_ingot";
-gold_ingot = "minecraft:gold_ingot";
-diamond = "minecraft:diamond";
-ink_sac = "minecraft:ink_sac";
-book = "minecraft:book";
-stick = "minecraft:stick";
-oak_planks = "minecraft:oak_planks";
-quartz_block = "minecraft:quartz_block";
-glass = "minecraft:glass";
-apple = "minecraft:apple";
-cobble = "minecraft:cobblestone";
-redstone = "minecraft:redstone";
-glowstone = "minecraft:glowstone";
-gold_nugget = "minecraft:gold_nugget";
-obsidian = "minecraft:obsidian";
-melon_slice = "minecraft:melon_slice";
-carrot = "minecraft:carrot";
-chest = "minecraft:chest";
-coal = "minecraft:coal";
-string = "minecraft:string";
-furnace = "minecraft:furnace";
-compass = "minecraft:compass";
-blaze_powder = "minecraft:blaze_powder";
-slime_ball = "minecraft:slime_ball";
-blaze_rod = "minecraft:blaze_rod";
-sugar_cane = "minecraft:sugar_cane";
-sugar = "minecraft:sugar";
-milk = "minecraft:milk";
-egg = "minecraft:egg";
-white_wool= "minecraft:white_wool";
-wheat = "minecraft:wheat";
-gunpowder = "minecraft:gunpowder";
-sand = "minecraft:sand";
-ender_pearl = "minecraft:ender_pearl";
-leather = "minecraft:leather";
-stone = "minecraft:stone";
-smooth_stone = "minecraft:smooth_stone";
-bow = "minecraft:bow";
-flint = "minecraft:flint";
-feather = "minecraft:feather";
-pumpkin = "minecraft:pumpkin";
-sugar = "minecraft:sugar";
-egg = "minecraft:egg";
-beef = "minecraft:beef";
-porkchop  = "minecraft:porkchop";
-paper = "minecraft:paper";
-brown_mushroom = "minecraft:brown_mushroom";
-red_mushroom = "minecraft:red_mushroom";
-bowl = "minecraft:bowl";
-redstone_torch = "minecraft:redstone_torch";
-quartz = "minecraft:quartz";
-oak_slab = "minecraft:oak_slab";
-cod = "minecraft:cod";
-piston = "minecraft:piston";
-tnt = "minecraft:tnt";
-minecart = "minecraft:minecart";
-stone_bricks = "minecraft:stone_bricks";
-stone_pressure_plate = "minecraft:stone_pressure_plate";
-
-addItem("minecraft:rail", iron_ingot, air, iron_ingot, iron_ingot, stick, iron_ingot, iron_ingot, air, iron_ingot);
-addItem("minecraft:oak_fence", air, air, air, oak_planks, stick, oak_planks, oak_planks, stick, oak_planks);
-addItem("minecraft:glass_bottle", glass, air, glass, air, glass, air, air, air, air);
-addItem("minecraft:dropper", cobble, cobble, cobble, cobble, air, cobble, cobble, redstone, cobble);
-addItem("minecraft:iron_sword", air, iron_ingot, air, air, iron_ingot, air, air, stick, air);
-addItem("minecraft:ladder", stick, air, stick, stick, stick, stick, stick, air, stick);
-addItem("minecraft:minecart", air, air, air, iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
-addItem("minecraft:hopper", iron_ingot, air, iron_ingot, iron_ingot, chest, iron_ingot, air, iron_ingot, air);
-addItem("minecraft:redstone_torch", air, air, air, air, redstone, air, air, stick, air);
-
-addItem("minecraft:torch", air, air, air, air, coal, air, air, stick, air);
-addItem("minecraft:bow", air, stick, string, stick, air, string, air, stick, string);
-addItem("minecraft:cobblestone_wall", air, air, air, cobble, cobble, cobble, cobble, cobble, cobble);
-addItem("minecraft:stone", air, air, air, furnace, cobble, air, air, air, air);
-addItem("minecraft:oak_door", oak_planks, oak_planks, air, oak_planks, oak_planks, air, oak_planks, oak_planks, air);
-addItem("minecraft:oak_fence_gate", air, air, air, stick, oak_planks, stick, stick, oak_planks, stick);
-addItem("minecraft:stone_pressure_plate", air, air, air, stone, stone, air, air, air, air);
-addItem("minecraft:oak_pressure_plate", air, air, air, oak_planks, oak_planks, air, air, air, air);
-addItem("minecraft:oak_trapdoor", air, air, air, oak_planks, oak_planks, oak_planks, oak_planks, oak_planks, oak_planks);
-
-addItem("minecraft:bucket", iron_ingot, air, iron_ingot, air, iron_ingot, air, air, air, air);
-addItem("minecraft:iron_bars", iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, air, air);
-addItem("minecraft:oak_sign", oak_planks, oak_planks, oak_planks, oak_planks, oak_planks, oak_planks, air, stick, air);
-addItem("minecraft:shears", air, iron_ingot, air, iron_ingot, air, air, air, air, air);
-addItem("minecraft:fishing_rod", air, air, stick, air, stick, string, stick, air, string);
-addItem("minecraft:compass", air, iron_ingot, air, iron_ingot, redstone, iron_ingot, air, iron_ingot, air);
-addItem("minecraft:oak_boat", oak_planks, air, oak_planks, oak_planks, oak_planks, oak_planks, air, air, air);
-addItem("minecraft:bowl", oak_planks, air, oak_planks, air, oak_planks, air, air, air, air);
-addItem("minecraft:white_wool", string, string, air, string, string, air, air, air, air);
-
-addItem("minecraft:wooden_sword", air, oak_planks, air, air, oak_planks, air, air, stick, air);
-addItem("minecraft:tripwire_hook", air, iron_ingot, air, air, stick, air, air, oak_planks, air);
-addItem("minecraft:chest_minecart", air, chest, air, air, minecart, air, air, air, air);
-addItem("minecraft:iron_door", iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air);
-addItem("minecraft:smooth_stone_slab", smooth_stone, smooth_stone, smooth_stone, air, air, air, air, air, air);
-addItem("minecraft:activator_rail", iron_ingot, stick, iron_ingot, iron_ingot, redstone_torch, iron_ingot, iron_ingot, stick, iron_ingot);
-addItem("minecraft:detector_rail", iron_ingot, air, iron_ingot, iron_ingot, stone_pressure_plate, iron_ingot, iron_ingot, redstone, iron_ingot);
-addItem("minecraft:dispenser", cobble, cobble, cobble, cobble, bow, cobble, cobble, redstone, cobble);
-addItem("minecraft:piston", oak_planks, oak_planks, oak_planks, cobble, iron_ingot, cobble, cobble, redstone, cobble);
-
-addItem("minecraft:repeater", redstone_torch, redstone, redstone_torch, stone, stone, stone, air, air, air);
-addItem("minecraft:comparator", air, redstone_torch, air, redstone_torch, quartz, redstone_torch, stone, stone, stone);
-addItem("minecraft:heavy_weighted_pressure_plate", air, air, air, iron_ingot, iron_ingot, air, air, air, air);
-addItem("minecraft:arrow", air, flint, air, air, stick, air, air, feather, air);
-addItem("minecraft:bookshelf", oak_planks, oak_planks, oak_planks, paper, paper, paper, oak_planks, oak_planks, oak_planks);
-addItem("minecraft:mushroom_stew", brown_mushroom, red_mushroom, bowl, air, air, air, air, air, air);
-addItem("minecraft:pumpkin_pie", pumpkin, sugar, egg, air, air, air, air, air, air);
-addItem("minecraft:cooked_beef", air, air, air, furnace, beef, air, air, air, air);
-addItem("minecraft:cooked_porkchop", air, air, air, furnace, porkchop, air, air, air, air);
-//Page2
-addItem("minecraft:book", paper, paper, paper, leather, air, air, air, air, air);
-addItem("minecraft:map", paper, paper, paper, paper, compass, paper, paper, paper, paper);
-addItem("minecraft:ender_eye", ender_pearl, blaze_powder, air, air, air, air, air, air, air);
-addItem("minecraft:lead", air, string, string, air, slime_ball, string, string, air, air);
-addItem("minecraft:stone_brick_slab", stone_bricks, stone_bricks, stone_bricks, air, air, air, air, air, air);
-addItem("minecraft:brewing_stand", air, air, air, air, blaze_rod, air, cobble, cobble, cobble);
-addItem("minecraft:leather_helmet", leather, leather, leather, leather, air, leather, air, air, air);
-addItem("minecraft:leather_chestplate", leather, air, leather, leather, leather, leather, leather, leather, leather);
-addItem("minecraft:leather_leggings", leather, leather, leather, leather, air, leather, leather, air, leather);
-
-addItem("minecraft:leather_boots", air, air, air, leather, air, leather, leather, air, leather);
-addItem("minecraft:cauldron", iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
-addItem("minecraft:clock", air, gold_ingot, air, gold_ingot, redstone, gold_ingot, air, gold_ingot, air);
-addItem("minecraft:paper", sugar_cane, sugar_cane, sugar_cane, air, air, air, air, air, air);
-addItem("minecraft:tnt", gunpowder, sand, gunpowder, sand, gunpowder, sand, gunpowder, sand, gunpowder);
-addItem("minecraft:magma_cream", air, air, air, slime_ball, blaze_powder, air, air, air, air);
-addItem("minecraft:bread", air, air, air, wheat, wheat, wheat, air, air, air);
-addItem("minecraft:white_bed", air, air, air, white_wool, white_wool, white_wool, oak_planks, oak_planks, oak_planks);
-addItem("minecraft:cake", milk, milk, milk, sugar, egg, sugar, wheat, wheat, wheat);
-
-addItem("minecraft:cooked_cod", air, air, air, furnace, cod, air, air, air, air);
-addItem("minecraft:tnt_minecart", air, air, air, air, tnt, air, air, minecart, air);
-addItem("minecraft:melon", melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice);
-addItem("minecraft:hay_block", wheat, wheat, wheat, wheat, wheat, wheat, wheat, wheat, wheat);
-addItem("minecraft:ender_chest", obsidian, obsidian, obsidian, obsidian, ender_eye, obsidian, obsidian, obsidian, obsidian);
-addItem("minecraft:sticky_piston", air, air, air, air, slime_ball, air, air, piston, air);
-addItem("minecraft:daylight_detector", glass, glass, glass, quartz, quartz, quartz, oak_slab, oak_slab, oak_slab);
-addItem("minecraft:golden_apple", gold_ingot, gold_ingot, gold_ingot, gold_ingot, apple, gold_ingot, gold_ingot, gold_ingot, gold_ingot);
-addItem("minecraft:jukebox", oak_planks, oak_planks, oak_planks, oak_planks, diamond, oak_planks, oak_planks, oak_planks, oak_planks);
-
-addItem("minecraft:anvil", iron_block, iron_block, iron_block, air, iron_ingot, air, iron_ingot, iron_ingot, iron_ingot);
-addItem("minecraft:quartz_stairs", quartz_block, air, air, quartz_block, quartz_block, air, quartz_block, quartz_block, quartz_block);
-addItem("minecraft:enchanting_table", air, book, air, diamond, obsidian, diamond, obsidian, obsidian, obsidian);
-addItem("minecraft:golden_carrot", gold_nugget, gold_nugget, gold_nugget, gold_nugget, carrot, gold_nugget, gold_nugget, gold_nugget, gold_nugget);
-addItem("minecraft:glistering_melon_slice", gold_nugget, gold_nugget, gold_nugget, gold_nugget, melon_slice, gold_nugget, gold_nugget, gold_nugget, gold_nugget);
-addItem("minecraft:redstone_lamp", air, redstone, air, redstone, glowstone, redstone, air, redstone, air);
-addItem("minecraft:writable_book", book, feather, ink_sac, air, air, air, air, air, air);
-addItem("minecraft:powered_rail", gold_ingot, air, gold_ingot, gold_ingot, stick, gold_ingot, gold_ingot, redstone, gold_ingot);
-addItem("minecraft:stick", air, iron_ingot, air, air, iron_ingot, air, air, air, air);
-
-addItem("minecraft:wooden_pickaxe", oak_planks, oak_planks, oak_planks, air, stick, air, air, stick, air);
-addItem("minecraft:iron_pickaxe", iron_ingot, iron_ingot, iron_ingot, air, stick, air, air, stick, air);
-addItem("minecraft:golden_pickaxe", gold_ingot, gold_ingot, gold_ingot, air, stick, air, air, stick, air);
-addItem("minecraft:wooden_hoe", oak_planks, oak_planks, air, air, stick, air, air, stick, air);
-addItem("minecraft:diamond_hoe", diamond, diamond, air, air, stick, air, air, stick, air);
-addItem("minecraft:golden_hoe", gold_ingot, gold_ingot, air, air, stick, air, air, stick, air);
-addItem("minecraft:diamond_chestplate", diamond, air, diamond, diamond, diamond, diamond, diamond, diamond, diamond);
-addItem("minecraft:iron_chestplate", iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
-addItem("minecraft:golden_boots", air, air, air, gold_ingot, air, gold_ingot, gold_ingot, air, gold_ingot);
-
-//Page3
-addItem("minecraft:diamond_boots", air, air, air, diamond, air, diamond, diamond, air, diamond);
-addItem("minecraft:iron_helmet", iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, iron_ingot, air, air, air);
-addItem("minecraft:iron_leggings", iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot);
-addItem("minecraft:iron_boots", air, air, air, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot);
-addItem("minecraft:golden_leggings", iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot);
-addItem("minecraft:golden_helmet", iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, air, air);
-addItem("minecraft:golden_chestplate", iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
-		
-gosub("setstart");
-
-for(team = 0; team < numberofteams; team++) {
-	map.add(playersinteam, team, 0);
-	map.add(teamidtolist, team, list.new());
-}
-
-goto("simplelobby");
-
-@specificLobbyHandling
-if(event == "player_join") {
-	list.add(waiters, player.getUuid(player));
-	display.add(player, 0, gamename);
-	display.add(player, 1, "§7Map:");
-	display.add(player, 2, "§3", mapname);
-	return;
-}
-if(event == "player_giveup" || event == "player_logout") {
-	list.remove(waiters, player.getUuid(player));
-	return;
-}
-if(event == "block_click") {
-	player_uuid = player.getUuid(player);
-	if(map.contains(join_blocks, block_loc)) {
-		newteam = map.get(join_blocks, block_loc);
-		newteamlist = map.get(teamidtolist, newteam);
-		if(list.contains(newteamlist, player_uuid)) {
-			speakPrefix(player, gamename, "You already choosed a team.");
-			return;
-		}
-		if(list.getSize(newteamlist) >= teamsize) {
-			speakPrefix(player, gamename, "Not enough space in this team.");
-			return;
-		}
-		list.remove(waiters, player_uuid);
-		yetteam = map.get(players, player_uuid);
-		if(yetteam != null) {
-			yetteamlist = map.get(teamidtolist, yetteam);
-			list.remove(yetteamlist, player_uuid);
-			map.add(playersinteam, yetteam, map.get(playersinteam, yetteam) - 1);
-		}
-		map.add(playersinteam, newteam, map.get(playersinteam, newteam) + 1);
-		list.add(newteamlist, player_uuid);
-		map.add(players, player_uuid, newteam);
-		speakPrefix(player, gamename, concat("You joined the ", map.get(teamcolortext, newteam), " §rteam."));
-		entity.setName(player, concat(map.get(colorcodes, newteam), player.getName(player)));
-	}
-}
-return;
-
-@finalstart
-player_list = minigame.getPlayers(script_id);
-entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
-
-while(list.getSize(waiters) != 0) {
-	team = getTeamWithLowestPeople(teamidtolist, numberofteams);
-	teamlist = map.get(teamidtolist, team);
-	p_uuid = list.getIndex(waiters, 0);
-	map.add(playersinteam, team, map.get(playersinteam, team) + 1);
-	list.add(teamlist, p_uuid);
-	list.remove(waiters, p_uuid);
-	map.add(players, p_uuid, team);
-	entity.setName(player.get(p_uuid), concat(map.get(colorcodes, team), player.getName(p_uuid)));
-}
-
-event.load("player_post_respawn");
-event.load("item_air_click");
-event.load("craft");
-event.load("entity_click");
-event.load("inv_click");
-event.load("human_hurt");
-
-for(i = 0; i < list.getSize(player_list); i++) {
-	p_uuid = list.getIndex(player_list, i);
-	team = map.get(players, p_uuid);
-	p = player.get(p_uuid);
-	speakPrefix(p, gamename, "The game has started.");
-	entity.teleport(p, map.get(spawn_locs, team));
-	//Recipe-Menus für jeden Spieler erstellen
-	menu = inv.new("222222222222222222222222222222222222222222222000000022");
-	map.add(recipe_menus, p_uuid, menu);
-	//Gamemode und Fly deaktivieren
-	if(player.isSurvival(p)) {
-		if(player.isAdventure(p)) {
-			player.setGamemode(p, "survival");
-		}
-	} else {
-		player.setGamemode(p, "survival");
-	}
-	if(player.hasFly(p)) {
-		player.setFly(p, false);
-	}
-	player.clearInventory(p);
-	//Building-Perms entfernen
-	if(perm.has(p, "plot.bypass")) {
-		perm.unregisterPlayer(p_uuid, 1);
-		perm.unregisterPlayer(p_uuid, 15);
-		list.add(removed_perms, p_uuid);
-	}
-}
-
-humans_list = getAllEntites();
-resetSigns();
-resetFrames();
-resetContainers();
-
-for(team = 0; team < numberofteams; team++) {
-	teamsize = map.get(playersinteam, team);
-	if(teamsize != 0) {
-		list.add(allteams, team);
-		map.add(points, team, 0);
-	}
-}
-
-//Sales erstellen
-for(i = 0; i < list.getSize(allteams); i++) {
-	team = list.getIndex(allteams, i);
-	step = list.getSize(sell_frame_locs) / numberofteams;
-	index = team * step;
-	direction = map.get(sell_frame_directions, team);
-	frame_loc = list.getIndex(sell_frame_locs, index);
-	entity = list.getIndex(humans_list, index);
-	entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", frame_loc, 1.5);
-	item = getItem(getRandomIndex());
-	entity.spawnItemFrame(frame_loc, direction, item);
-	map.add(sales_map, entity, item);
-	time = math.random(30, 60);
-	entity.setName(entity, text.number(time));
-}
-updateDisplay();
-
-if(list.getSize(allteams) == 1) {
-	singleteam = true;
-	for(i = 0; i < list.getSize(player_list); i++) {
-		p = player.get(list.getIndex(player_list, i));
-		title.setSub(p, "Not ranked");
-		title.send(p, "§eSingleteam");
-	}
-} else {
-	singleteam = false;
-}
-
-@loop
-if(--seconds < 0) {
-	minutes--;
-	seconds = 59;
-}
-if(seconds < 10) {
-	minigame.displayAll(1, concat("§aTime left: §r", text.number(minutes), ":0", text.number(seconds)));  
-} else {
-	minigame.displayAll(1, concat("§aTime left: §r", text.number(minutes), ":", text.number(seconds)));
-}
-if(minutes == 0 && seconds == 30) {
-	minigame.speakAll(gamename, "The shops are closing in 30 seconds.");
-	for(i = 0; i < list.getSize(player_list); i++) {
-		p = player.get(list.getIndex(player_list, i));
-		sound.spawnForPlayer(p, join_sound, sound_category_ambient);
-	}
-} elseif(minutes == 0 && seconds == 10) {
-	minigame.speakAll(gamename, "The shops are closing in 10 seconds.");
-	for(i = 0; i < list.getSize(player_list); i++) {
-		p = player.get(list.getIndex(player_list, i));
-		sound.spawnForPlayer(p, join_sound, sound_category_ambient);
-	}
-} elseif(minutes == 0 && seconds <= 3) {
-	for(i = 0; i < list.getSize(player_list); i++) {
-		p = player.get(list.getIndex(player_list, i));
-		sound.spawnForPlayer(p, join_sound, sound_category_ambient);
-	}
-}
-if(minutes == 0 && seconds == 0) {
-	max = -1;
-	minigame.msgAll(getSpacer());
-	for(i = 0; i < list.getSize(allteams); i++) {
-		team = list.getIndex(allteams, i);
-		teampoints = map.get(points, team);
-		if(teampoints > max) {
-			max = teampoints;
-			winning_team = team;
-			winner_list = map.get(teamidtolist, winning_team);
-		}
-		teamlist = map.get(teamidtolist, team);
-		team_string = "";
-		for(h = 0; h < list.getSize(teamlist); h++) {
-			if(team_string == "") {
-				team_string = player.getName(list.getIndex(teamlist, h));
-			} else {
-				team_string = concat(team_string, " ", player.getName(list.getIndex(teamlist, h)));
-			}
-		}
-		minigame.speakAll(gamename, concat(text.number(teampoints), map.get(colorcodes, team), " (", team_string, ")"));
-	}
-	minigame.msgAll(getSpacer());
-	goto("win");
-}
-iter = map.iterator(sales_map);
-while(hasNext(iter)) {
-	iter_element = next(iter);
-	key = map.getKey(iter_element);
-	time = read.number(entity.getName(key)) - 1;
-	if(time > 0) {
-		entity.setName(key, text.number(time));
-	} else {
-		index = list.getIndexOf(humans_list, key);
-		location = list.getIndex(sell_frame_locs, index);
-		entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", location, 1.5);
-		step = list.getSize(sell_frame_locs) / numberofteams;
-		team = math.roundDown(index / step);
-		direction = map.get(sell_frame_directions, team);
-		item = getItem(getRandomIndex());
-		entity.spawnItemFrame(location, direction, item);
-		map.add(sales_map, key, item);
-		time = math.random(30, 60);
-		entity.setName(key, text.number(time));
-	}
-}
-sgoto(20, "loop");
-
-@checkgame
-wait();
-if(event == "living_is_attacked") {
-	if(!isPlayer(living_entity)) {
-		goto("checkgame");
-	}
-	player = living_entity;
-} elseif(event == "human_hurt") {
-	if(!isPlayer(entity)) {
-		goto("checkgame");
-	}
-	player = entity;
-}
-if(player.hasMinigameId(player, script_id)) {
-	ignoreGoto(event);
-}
-goto("checkgame");
-
-@block_click
-if(block.hasTag(wall_signs_tag, block)) {
-	if(block.getSign(block_loc, 0) == "Click here") {
-		if(player.getItemAmount(player, false, emerald) >= 10) {
-			direction = block.getState(block_loc, facing_prop);
-			block.set(block_loc, air);
-			item = getItem(getRandomIndex());
-			entity.spawnItemFrame(block_loc, direction, item);
-			entity = list.getIndex(humans_list, list.getIndexOf(sell_frame_locs, block_loc));
-			map.add(sales_map, entity, item);
-			time = math.random(30, 60);
-			entity.setName(entity, text.number(time));
-			player.removeItem(player, emerald10);
-		} else {
-			speakPrefix(player, gamename, "You need 10 emeralds.");
-		}
-	}
-}
-goto("checkgame");
-
-@living_is_attacked
-if(isPlayer(living_entity)) {
-	cancel = true;
-}
-goto("checkgame");
-
-@block_break
-@block_place
-cancel = true;
-goto("checkgame");
-
-@human_hurt
-if(isPlayer(entity)) {
-	player = entity;
-	if(map.contains(sales_map, human)) {
-		hand_item = entity.getEquip(player, "hand");
-		aim_item = map.get(sales_map, human);
-		if(item.getType(hand_item) == item.getType(aim_item)) {
-			player_uuid = player.getUuid(player);
-			team = map.get(players, player_uuid);
-			direction = map.get(sell_frame_directions, team);
-			item = getItem(getRandomIndex());
-			location = list.getIndex(sell_frame_locs, list.getIndexOf(humans_list, human));
-			entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", location, 1.5);
-			entity.spawnItemFrame(location, direction, item);
-			map.add(sales_map, human, item);
-			time = math.random(30, 60);
-			entity.setName(human, text.number(time));
-			player.giveItem(player, emerald);
-			player.removeItem(player, aim_item);
-			map.add(points, team, map.get(points, team) + 1);
-			updateDisplay();
-			speakPrefix(player, gamename, "Thank you §e+§r1 §aSmaragd");
-		} else {
-			speakPrefix(player, gamename, "Wrong item in your mainhand.");
-		}
-	}
-} else {
-	if(entity.getName(human) != "Rezepte") {
-		speakPrefix(player, gamename, "Shop not unlocked.");
-	}
-}
-goto("checkgame");
-
-@inv_click
-if(inv_name == "Rezepte") {
-	player_uuid = player.getUuid(player);
-	team = map.get(players, player_uuid);
-	item_type = item.getType(item);
-	if(item_type == air) {
-		goto("checkgame");
-	}
-	if(item_type == paper) {
-		name = item.getName(item);
-		if(text.contains(name, "<<") || text.contains(name, ">>")) {
-			page = removeFormat(name);
-			page = text.replace(page, "<<", "");
-			page = text.replace(page, ">>", "");
-			page = read.number(page);
-			if(inv_slot == 45) {
-				setRecipePage(player, inv, page);
-			}
-			if(inv_slot == 46) {
-				setRecipePage(player, inv, page);
-			}
-			goto("checkgame");
-		}
-	}
-	index = getIndexFromItemType(item_type);
-	if(index == null) {
-		goto("checkgame");
-	}
-	setItemFrames(team, index);
-}
-goto("checkgame");
-
-@entity_click
-if(entity.getType(entity) == "human") {
-	if(entity.getName(entity) == "Rezepte") {
-		player_uuid = player.getUuid(player);
-		menu = map.get(recipe_menus, player_uuid);
-		setRecipePage(player, menu, 1);
-		inv.open(menu, player, "Rezepte");
-	}
-	goto("checkgame");
-}
-human = entity;
-entity = player;
-goto("human_hurt");
-
-@player_post_respawn
-player_uuid = player.getUuid(player);
-team = map.get(players, player_uuid);
-location = map.get(spawn_locs, team);
-entity.teleport(player, location);
-goto("checkgame");
-
-@item_air_click
-if(hand == "MAIN_HAND") {
-	item = entity.getEquip(player, "hand");
-} else {
-	item = entity.getEquip(player, "offhand");
-}
-if(item.getType(item) == "minecraft:ender_pearl") {
-	cancel = true;
-}
-goto("checkgame");
-
-@craft
-if(list.contains(forbidden_items, item.getType(item))) {
-	cancel = true;
-	speakPrefix(player, gamename, "Nope, preventing a bug.");
-}
-goto("checkgame");
-
-@player_logout
-@player_giveup
-minigame.speakAll(gamename, concat("§8", player_name, " §rhas left the game."));
-showstats(player, false);
-player_uuid = player.getUuid(player);
-//Building-Perms wieder geben
-if(list.contains(removed_perms, player_uuid)) {
-	list.remove(removed_perms, player_uuid);
-	perm.registerPlayer(player_uuid, 1);
-	perm.registerPlayer(player_uuid, 15);
-}
-if(singleteam) {
-	script = script.getFromId(script_id);
-	minigame.kickPlayer(script, player);
-	minigame.term(script, gamesignloc);
-	term();
-}
-team = map.get(players, player_uuid);
-map.remove(players, player_uuid);
-script = script.getFromId(script_id);
-minigame.kickPlayer(script, player);
-amount = map.get(playersinteam, team) - 1;
-map.add(playersinteam, team, amount);
-if(amount <= 0) {
-	list.remove(allteams, team);
-	if(list.getSize(allteams) == 1) {
-		winning_team = list.getIndex(allteams, 0);
-		winner_list = map.get(teamidtolist, winning_team);
-		goto("win");
-	}
-}
-minigame.displayRemoveAll(2 + team);
-goto("checkgame");
-
-@win
-team_string = "";
-for(h = 0; h < list.getSize(winner_list); h++) {
-	if(team_string == "") {
-		team_string = player.getName(list.getIndex(winner_list, h));
-	} else {
-		team_string = concat(team_string, " ", player.getName(list.getIndex(winner_list, h)));
-	}
-}
-if(!singleteam) {
-	minigame.speakAll( gamename, concat("Team ", map.get(colorcodes, winning_team), "(", team_string, ") §rhas won."));
-}
-for(i = 0; i < list.getSize(player_list); i++) {
-	player_uuid = list.getIndex(player_list, i);
-	p = player.get(player_uuid);
-	team = map.get(players, player_uuid);
-	if(team == winning_team) {
-		showstats(p, true);
-	} else {
-		showstats(p, false);
-	}
-	script = script.getFromId(script_id);
-	minigame.kickPlayer(script, p);
-}
-//Building-Perms wieder geben
-for(i = 0; i < list.getSize(removed_perms); i++) {
-	player_uuid = list.getIndex(removed_perms, i);
-	perm.registerPlayer(player_uuid, 1);
-	perm.registerPlayer(player_uuid, 15);
-}
-minigame.term(script, gamesignloc);
-term();
-
-function showstats(player, won) { //Player player, Boolean won
-	if($singleteam) {
-		return;
-	}
-	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 updateDisplay() {
-	minigame.displayAll(0, $gamename);
-	for(i = 0; i < list.getSize($allteams); i++) {
-		team = list.getIndex($allteams, i);
-		minigame.displayAll(2 + team, concat(map.get($teamcolortext2, team), ": §r", text.number(map.get($points, team))));
-	}
-}
-
-function addItem(item, item1, item2, item3, item4, item5, item6, item7, item8, item9) {
-	array = array.new(10);
-	array[0] = item;
-	array[1] = item1;
-	array[2] = item2;
-	array[3] = item3;
-	array[4] = item4;
-	array[5] = item5;
-	array[6] = item6;
-	array[7] = item7;
-	array[8] = item8;
-	array[9] = item9;
-	list.add($items_list, array);
-}
-
-function getRandomIndex() {
-	return math.random(0, list.getSize($items_list) - 1);
-}
-
-function getIndexFromItemType(item_type) {
-	for(i = 0; i < list.getSize($items_list); i++) {
-		array = list.getIndex($items_list, i);
-		if(array[0] == item_type) {
-			return i;
-		}
-	}
-}
-
-function getItem(index) {
-	array = list.getIndex($items_list, index);
-	return read.item(array[0]);
-}
-
-function setItemFrames(team, index) {
-	loc = list.getIndex($frame_locs, team);
-	entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", loc, 3.5);
-	direction = map.get($frame_directions, team);
-	array = list.getIndex($items_list, index);
-	entity.spawnItemFrame(loc, direction, read.item(array[0]));
-	if(direction == "north") {
-		entity.spawnItemFrame(loc.mod(loc, 1, -1, 0), direction, read.item(array[1]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
-		entity.spawnItemFrame(loc.mod(loc, -1, -1, 0), direction, read.item(array[3]));
-		entity.spawnItemFrame(loc.mod(loc, 1, -2, 0), direction, read.item(array[4]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
-		entity.spawnItemFrame(loc.mod(loc, -1, -2, 0), direction, read.item(array[6]));
-		entity.spawnItemFrame(loc.mod(loc, 1, -3, 0), direction, read.item(array[7]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
-		entity.spawnItemFrame(loc.mod(loc, -1, -3, 0), direction, read.item(array[9]));
-	} elseif(direction == "east") {
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, -1), direction, read.item(array[1]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, 1), direction, read.item(array[3]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, -1), direction, read.item(array[4]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, 1), direction, read.item(array[6]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, -1), direction, read.item(array[7]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, 1), direction, read.item(array[9]));
-	} elseif(direction == "south") {
-		entity.spawnItemFrame(loc.mod(loc, -1, -1, 0), direction, read.item(array[1]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
-		entity.spawnItemFrame(loc.mod(loc, 1, -1, 0), direction, read.item(array[3]));
-		entity.spawnItemFrame(loc.mod(loc, -1, -2, 0), direction, read.item(array[4]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
-		entity.spawnItemFrame(loc.mod(loc, 1, -2, 0), direction, read.item(array[6]));
-		entity.spawnItemFrame(loc.mod(loc, -1, -3, 0), direction, read.item(array[7]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
-		entity.spawnItemFrame(loc.mod(loc, 1, -3, 0), direction, read.item(array[9]));
-	} elseif(direction == "west") {
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, 1), direction, read.item(array[1]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, -1), direction, read.item(array[3]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, 1), direction, read.item(array[4]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, -1), direction, read.item(array[6]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, 1), direction, read.item(array[7]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, -1), direction, read.item(array[9]));
-	}
-}
-
-function resetSigns() {
-	step = list.getSize($sell_frame_locs) / $numberofteams;
-	team = 0;
-	counter = 0;
-	for(i = 0; i < list.getSize($sell_frame_locs); i++) {
-		if(counter != 0) { //Erste Locs werden übersprungen. Kein Schild platzieren = Freigeschalteter Shop
-			loc = list.getIndex($sell_frame_locs, i);
-			entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", loc, 1.5);
-			direction = map.get($sell_frame_directions, team);
-			block.set(loc, concat("minecraft:oak_wall_sign[facing=", direction, "]"));
-			block.setSign(loc, 0, "Click here");
-			block.setSign(loc, 1, "to unlock for");
-			block.setSign(loc, 2, "§a10 §rEmerald");
-			block.setSign(loc, 3, ">> >> >>");
-		}
-		if(++counter == step) {
-			counter = 0;
-			team++;
-		}
-	}
-}
-
-function resetFrames() {
-	for(i = 0; i < list.getSize($frame_locs); i++) {
-		loc = list.getIndex($frame_locs, i);
-		entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", loc, 3.5);
-		direction = map.get($frame_directions, i);
-		entity.spawnItemFrame(loc, direction, $air_item);
-		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, $air_item);
-		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, $air_item);
-		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, $air_item);
-		if(direction == "north" || direction == "south") {
-			entity.spawnItemFrame(loc.mod(loc, 1, -1, 0), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, -1, -1, 0), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, 1, -2, 0), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, -1, -2, 0), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, 1, -3, 0), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, -1, -3, 0), direction, $air_item);
-		}
-		if(direction == "east" || direction == "west") {
-			entity.spawnItemFrame(loc.mod(loc, 0, -1, 1), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, 0, -1, -1), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, 0, -2, 1), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, 0, -2, -1), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, 0, -3, 1), direction, $air_item);
-			entity.spawnItemFrame(loc.mod(loc, 0, -3, -1), direction, $air_item);
-		}
-	}
-}
-
-function resetContainers() {
-	//1.Kiste
-	for(i = 0; i < list.getSize($chest_locs1); i++) {
-		loc = list.getIndex($chest_locs1, i);
-		block.clone(loc.mod(loc, 0, -3, 0), loc);
-	}
-	//2.Kiste
-	for(i = 0; i < list.getSize($chest_locs2); i++) {
-		loc = list.getIndex($chest_locs2, i);
-		block.clone(loc.mod(loc, 0, -3, 0), loc);
-	}
-	//Ofen
-	for(i = 0; i < list.getSize($furnace_locs); i++) {
-		loc = list.getIndex($furnace_locs, i);
-		block.clone(loc.mod(loc, 0, -3, 0), loc);
-	}
-}
-
-function setRecipePage(player, menu, page) {
-	size = list.getSize($items_list);
-	max_page = math.roundUp(size / 45);
-	if(page > max_page) {
-		return;
-	}
-	if(page > 1) {
-		inv.setItem(menu, 45, read.item("minecraft:paper", 1, concat("§e", text.number(page - 1), " <<")));
-	} else {
-		inv.setItem(menu, 45, $air_item);
-	}
-	if(page < max_page) {
-		inv.setItem(menu, 46, read.item("minecraft:paper", 1, concat("§e>> ", text.number(page + 1))));
-	} else {
-		inv.setItem(menu, 46, $air_item);
-	}
-	max_index = size - 1;
-	for(i = 0; i < 45; i++) {
-		list_index = i + 45 * (page - 1);
-		if(list_index > max_index) {
-			inv.setItem(menu, i, $air_item);
-		} else {
-			array = list.getIndex($items_list, list_index);
-			inv.setItem(menu, i, read.item(array[0]));
-		}
-	}
-	inv.update(player);
-}
-
-function getAllEntites() {
-	humans_list = list.new();
-	for(i = 0; i < list.getSize($humans_locs); i++) {
-		location = list.getIndex($humans_locs, i);
-		entity = entity.get(location, 10, "me.km.entities.EntityHuman");
-		list.add(humans_list, entity);
-		entity.setName(entity, "Shop");
-	}
-	return humans_list;
-}
+rankingtable = "shoppingranks";
+specific_lobby_handling = true;
+
+air = "minecraft:air";
+air_item = read.item(air);
+emerald = read.item("minecraft:emerald");
+emerald10 = read.item("minecraft:emerald", 10);
+gamename = "§eShoppingChaos";
+start_sound = sound.get("minecraft:block.note_block.harp");
+wall_signs_tag = block.getTag("minecraft:wall_signs");
+facing_prop = block.getProperty("horizontal_facing");
+
+players = map.new(); //Alle player_uuids mit Verweis auf die Team-Nr
+playersinteam = map.new(); //Anzahl der Spieler im Team
+teamidtolist = map.new(); //Team-Nr mit Verweis auf die Spielerlisten
+allteams = list.new(); //Alle Teams, die noch im Spiel sind
+items_list = list.new(); //Array-List: Alle Items mit Rezepten
+points = map.new(); //Punktestand der Teams
+sales_map = map.new(); //Key Entity. Value Item
+recipe_menus = map.new(); //Rezept-Menüs für jeden Spieler
+removed_perms = list.new(); //Spieler-Uuids, denen Building-Perms entfernt wurden
+waiters = list.new(); //Spieler in der Lobby ohne Teamzugehörigkeit
+
+forbidden_items = list.new();
+list.add(forbidden_items, "minecraft:item_frame");
+list.add(forbidden_items, "minecraft:painting");
+
+colorcodes = map.new();
+map.add(colorcodes, 0, "§9");
+map.add(colorcodes, 1, "§c");
+map.add(colorcodes, 2, "§z");
+map.add(colorcodes, 3, "§p");
+
+teamcolortext = map.new();
+map.add(teamcolortext, 0, "§9blue");
+map.add(teamcolortext, 1, "§cred");
+map.add(teamcolortext, 2, "§zyellow");
+map.add(teamcolortext, 3, "§pgreen");
+
+teamcolortext2 = map.new();
+map.add(teamcolortext2, 0, "§9Blue");
+map.add(teamcolortext2, 1, "§cRed");
+map.add(teamcolortext2, 2, "§zYellow");
+map.add(teamcolortext2, 3, "§pGreen");
+
+iron_block = "minecraft:iron_block";
+iron_ingot = "minecraft:iron_ingot";
+gold_ingot = "minecraft:gold_ingot";
+diamond = "minecraft:diamond";
+ink_sac = "minecraft:ink_sac";
+book = "minecraft:book";
+stick = "minecraft:stick";
+oak_planks = "minecraft:oak_planks";
+quartz_block = "minecraft:quartz_block";
+glass = "minecraft:glass";
+apple = "minecraft:apple";
+cobble = "minecraft:cobblestone";
+redstone = "minecraft:redstone";
+glowstone = "minecraft:glowstone";
+gold_nugget = "minecraft:gold_nugget";
+obsidian = "minecraft:obsidian";
+melon_slice = "minecraft:melon_slice";
+carrot = "minecraft:carrot";
+chest = "minecraft:chest";
+coal = "minecraft:coal";
+string = "minecraft:string";
+furnace = "minecraft:furnace";
+compass = "minecraft:compass";
+blaze_powder = "minecraft:blaze_powder";
+slime_ball = "minecraft:slime_ball";
+blaze_rod = "minecraft:blaze_rod";
+sugar_cane = "minecraft:sugar_cane";
+sugar = "minecraft:sugar";
+milk = "minecraft:milk";
+egg = "minecraft:egg";
+white_wool= "minecraft:white_wool";
+wheat = "minecraft:wheat";
+gunpowder = "minecraft:gunpowder";
+sand = "minecraft:sand";
+ender_pearl = "minecraft:ender_pearl";
+leather = "minecraft:leather";
+stone = "minecraft:stone";
+smooth_stone = "minecraft:smooth_stone";
+bow = "minecraft:bow";
+flint = "minecraft:flint";
+feather = "minecraft:feather";
+pumpkin = "minecraft:pumpkin";
+sugar = "minecraft:sugar";
+egg = "minecraft:egg";
+beef = "minecraft:beef";
+porkchop  = "minecraft:porkchop";
+paper = "minecraft:paper";
+brown_mushroom = "minecraft:brown_mushroom";
+red_mushroom = "minecraft:red_mushroom";
+bowl = "minecraft:bowl";
+redstone_torch = "minecraft:redstone_torch";
+quartz = "minecraft:quartz";
+oak_slab = "minecraft:oak_slab";
+cod = "minecraft:cod";
+piston = "minecraft:piston";
+tnt = "minecraft:tnt";
+minecart = "minecraft:minecart";
+stone_bricks = "minecraft:stone_bricks";
+stone_pressure_plate = "minecraft:stone_pressure_plate";
+
+addItem("minecraft:rail", iron_ingot, air, iron_ingot, iron_ingot, stick, iron_ingot, iron_ingot, air, iron_ingot);
+addItem("minecraft:oak_fence", air, air, air, oak_planks, stick, oak_planks, oak_planks, stick, oak_planks);
+addItem("minecraft:glass_bottle", glass, air, glass, air, glass, air, air, air, air);
+addItem("minecraft:dropper", cobble, cobble, cobble, cobble, air, cobble, cobble, redstone, cobble);
+addItem("minecraft:iron_sword", air, iron_ingot, air, air, iron_ingot, air, air, stick, air);
+addItem("minecraft:ladder", stick, air, stick, stick, stick, stick, stick, air, stick);
+addItem("minecraft:minecart", air, air, air, iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
+addItem("minecraft:hopper", iron_ingot, air, iron_ingot, iron_ingot, chest, iron_ingot, air, iron_ingot, air);
+addItem("minecraft:redstone_torch", air, air, air, air, redstone, air, air, stick, air);
+
+addItem("minecraft:torch", air, air, air, air, coal, air, air, stick, air);
+addItem("minecraft:bow", air, stick, string, stick, air, string, air, stick, string);
+addItem("minecraft:cobblestone_wall", air, air, air, cobble, cobble, cobble, cobble, cobble, cobble);
+addItem("minecraft:stone", air, air, air, furnace, cobble, air, air, air, air);
+addItem("minecraft:oak_door", oak_planks, oak_planks, air, oak_planks, oak_planks, air, oak_planks, oak_planks, air);
+addItem("minecraft:oak_fence_gate", air, air, air, stick, oak_planks, stick, stick, oak_planks, stick);
+addItem("minecraft:stone_pressure_plate", air, air, air, stone, stone, air, air, air, air);
+addItem("minecraft:oak_pressure_plate", air, air, air, oak_planks, oak_planks, air, air, air, air);
+addItem("minecraft:oak_trapdoor", air, air, air, oak_planks, oak_planks, oak_planks, oak_planks, oak_planks, oak_planks);
+
+addItem("minecraft:bucket", iron_ingot, air, iron_ingot, air, iron_ingot, air, air, air, air);
+addItem("minecraft:iron_bars", iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, air, air);
+addItem("minecraft:oak_sign", oak_planks, oak_planks, oak_planks, oak_planks, oak_planks, oak_planks, air, stick, air);
+addItem("minecraft:shears", air, iron_ingot, air, iron_ingot, air, air, air, air, air);
+addItem("minecraft:fishing_rod", air, air, stick, air, stick, string, stick, air, string);
+addItem("minecraft:compass", air, iron_ingot, air, iron_ingot, redstone, iron_ingot, air, iron_ingot, air);
+addItem("minecraft:oak_boat", oak_planks, air, oak_planks, oak_planks, oak_planks, oak_planks, air, air, air);
+addItem("minecraft:bowl", oak_planks, air, oak_planks, air, oak_planks, air, air, air, air);
+addItem("minecraft:white_wool", string, string, air, string, string, air, air, air, air);
+
+addItem("minecraft:wooden_sword", air, oak_planks, air, air, oak_planks, air, air, stick, air);
+addItem("minecraft:tripwire_hook", air, iron_ingot, air, air, stick, air, air, oak_planks, air);
+addItem("minecraft:chest_minecart", air, chest, air, air, minecart, air, air, air, air);
+addItem("minecraft:iron_door", iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air);
+addItem("minecraft:smooth_stone_slab", smooth_stone, smooth_stone, smooth_stone, air, air, air, air, air, air);
+addItem("minecraft:activator_rail", iron_ingot, stick, iron_ingot, iron_ingot, redstone_torch, iron_ingot, iron_ingot, stick, iron_ingot);
+addItem("minecraft:detector_rail", iron_ingot, air, iron_ingot, iron_ingot, stone_pressure_plate, iron_ingot, iron_ingot, redstone, iron_ingot);
+addItem("minecraft:dispenser", cobble, cobble, cobble, cobble, bow, cobble, cobble, redstone, cobble);
+addItem("minecraft:piston", oak_planks, oak_planks, oak_planks, cobble, iron_ingot, cobble, cobble, redstone, cobble);
+
+addItem("minecraft:repeater", redstone_torch, redstone, redstone_torch, stone, stone, stone, air, air, air);
+addItem("minecraft:comparator", air, redstone_torch, air, redstone_torch, quartz, redstone_torch, stone, stone, stone);
+addItem("minecraft:heavy_weighted_pressure_plate", air, air, air, iron_ingot, iron_ingot, air, air, air, air);
+addItem("minecraft:arrow", air, flint, air, air, stick, air, air, feather, air);
+addItem("minecraft:bookshelf", oak_planks, oak_planks, oak_planks, paper, paper, paper, oak_planks, oak_planks, oak_planks);
+addItem("minecraft:mushroom_stew", brown_mushroom, red_mushroom, bowl, air, air, air, air, air, air);
+addItem("minecraft:pumpkin_pie", pumpkin, sugar, egg, air, air, air, air, air, air);
+addItem("minecraft:cooked_beef", air, air, air, furnace, beef, air, air, air, air);
+addItem("minecraft:cooked_porkchop", air, air, air, furnace, porkchop, air, air, air, air);
+//Page2
+addItem("minecraft:book", paper, paper, paper, leather, air, air, air, air, air);
+addItem("minecraft:map", paper, paper, paper, paper, compass, paper, paper, paper, paper);
+addItem("minecraft:ender_eye", ender_pearl, blaze_powder, air, air, air, air, air, air, air);
+addItem("minecraft:lead", air, string, string, air, slime_ball, string, string, air, air);
+addItem("minecraft:stone_brick_slab", stone_bricks, stone_bricks, stone_bricks, air, air, air, air, air, air);
+addItem("minecraft:brewing_stand", air, air, air, air, blaze_rod, air, cobble, cobble, cobble);
+addItem("minecraft:leather_helmet", leather, leather, leather, leather, air, leather, air, air, air);
+addItem("minecraft:leather_chestplate", leather, air, leather, leather, leather, leather, leather, leather, leather);
+addItem("minecraft:leather_leggings", leather, leather, leather, leather, air, leather, leather, air, leather);
+
+addItem("minecraft:leather_boots", air, air, air, leather, air, leather, leather, air, leather);
+addItem("minecraft:cauldron", iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
+addItem("minecraft:clock", air, gold_ingot, air, gold_ingot, redstone, gold_ingot, air, gold_ingot, air);
+addItem("minecraft:paper", sugar_cane, sugar_cane, sugar_cane, air, air, air, air, air, air);
+addItem("minecraft:tnt", gunpowder, sand, gunpowder, sand, gunpowder, sand, gunpowder, sand, gunpowder);
+addItem("minecraft:magma_cream", air, air, air, slime_ball, blaze_powder, air, air, air, air);
+addItem("minecraft:bread", air, air, air, wheat, wheat, wheat, air, air, air);
+addItem("minecraft:white_bed", air, air, air, white_wool, white_wool, white_wool, oak_planks, oak_planks, oak_planks);
+addItem("minecraft:cake", milk, milk, milk, sugar, egg, sugar, wheat, wheat, wheat);
+
+addItem("minecraft:cooked_cod", air, air, air, furnace, cod, air, air, air, air);
+addItem("minecraft:tnt_minecart", air, air, air, air, tnt, air, air, minecart, air);
+addItem("minecraft:melon", melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice, melon_slice);
+addItem("minecraft:hay_block", wheat, wheat, wheat, wheat, wheat, wheat, wheat, wheat, wheat);
+addItem("minecraft:ender_chest", obsidian, obsidian, obsidian, obsidian, ender_eye, obsidian, obsidian, obsidian, obsidian);
+addItem("minecraft:sticky_piston", air, air, air, air, slime_ball, air, air, piston, air);
+addItem("minecraft:daylight_detector", glass, glass, glass, quartz, quartz, quartz, oak_slab, oak_slab, oak_slab);
+addItem("minecraft:golden_apple", gold_ingot, gold_ingot, gold_ingot, gold_ingot, apple, gold_ingot, gold_ingot, gold_ingot, gold_ingot);
+addItem("minecraft:jukebox", oak_planks, oak_planks, oak_planks, oak_planks, diamond, oak_planks, oak_planks, oak_planks, oak_planks);
+
+addItem("minecraft:anvil", iron_block, iron_block, iron_block, air, iron_ingot, air, iron_ingot, iron_ingot, iron_ingot);
+addItem("minecraft:quartz_stairs", quartz_block, air, air, quartz_block, quartz_block, air, quartz_block, quartz_block, quartz_block);
+addItem("minecraft:enchanting_table", air, book, air, diamond, obsidian, diamond, obsidian, obsidian, obsidian);
+addItem("minecraft:golden_carrot", gold_nugget, gold_nugget, gold_nugget, gold_nugget, carrot, gold_nugget, gold_nugget, gold_nugget, gold_nugget);
+addItem("minecraft:glistering_melon_slice", gold_nugget, gold_nugget, gold_nugget, gold_nugget, melon_slice, gold_nugget, gold_nugget, gold_nugget, gold_nugget);
+addItem("minecraft:redstone_lamp", air, redstone, air, redstone, glowstone, redstone, air, redstone, air);
+addItem("minecraft:writable_book", book, feather, ink_sac, air, air, air, air, air, air);
+addItem("minecraft:powered_rail", gold_ingot, air, gold_ingot, gold_ingot, stick, gold_ingot, gold_ingot, redstone, gold_ingot);
+addItem("minecraft:stick", air, iron_ingot, air, air, iron_ingot, air, air, air, air);
+
+addItem("minecraft:wooden_pickaxe", oak_planks, oak_planks, oak_planks, air, stick, air, air, stick, air);
+addItem("minecraft:iron_pickaxe", iron_ingot, iron_ingot, iron_ingot, air, stick, air, air, stick, air);
+addItem("minecraft:golden_pickaxe", gold_ingot, gold_ingot, gold_ingot, air, stick, air, air, stick, air);
+addItem("minecraft:wooden_hoe", oak_planks, oak_planks, air, air, stick, air, air, stick, air);
+addItem("minecraft:diamond_hoe", diamond, diamond, air, air, stick, air, air, stick, air);
+addItem("minecraft:golden_hoe", gold_ingot, gold_ingot, air, air, stick, air, air, stick, air);
+addItem("minecraft:diamond_chestplate", diamond, air, diamond, diamond, diamond, diamond, diamond, diamond, diamond);
+addItem("minecraft:iron_chestplate", iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
+addItem("minecraft:golden_boots", air, air, air, gold_ingot, air, gold_ingot, gold_ingot, air, gold_ingot);
+
+//Page3
+addItem("minecraft:diamond_boots", air, air, air, diamond, air, diamond, diamond, air, diamond);
+addItem("minecraft:iron_helmet", iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, iron_ingot, air, air, air);
+addItem("minecraft:iron_leggings", iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot);
+addItem("minecraft:iron_boots", air, air, air, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot);
+addItem("minecraft:golden_leggings", iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, iron_ingot, iron_ingot, air, iron_ingot);
+addItem("minecraft:golden_helmet", iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot, air, air, air);
+addItem("minecraft:golden_chestplate", iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot, iron_ingot);
+		
+gosub("setstart");
+
+for(team = 0; team < numberofteams; team++) {
+	map.add(playersinteam, team, 0);
+	map.add(teamidtolist, team, list.new());
+}
+
+goto("simplelobby");
+
+@specificLobbyHandling
+if(event == "player_join") {
+	list.add(waiters, player.getUuid(player));
+	display.add(player, 0, gamename);
+	display.add(player, 1, "§7Map:");
+	display.add(player, 2, "§3", mapname);
+	return;
+}
+if(event == "player_giveup" || event == "player_logout") {
+	list.remove(waiters, player.getUuid(player));
+	return;
+}
+if(event == "block_click") {
+	player_uuid = player.getUuid(player);
+	if(map.contains(join_blocks, block_loc)) {
+		newteam = map.get(join_blocks, block_loc);
+		newteamlist = map.get(teamidtolist, newteam);
+		if(list.contains(newteamlist, player_uuid)) {
+			speakPrefix(player, gamename, "You already choosed a team.");
+			return;
+		}
+		if(list.getSize(newteamlist) >= teamsize) {
+			speakPrefix(player, gamename, "Not enough space in this team.");
+			return;
+		}
+		list.remove(waiters, player_uuid);
+		yetteam = map.get(players, player_uuid);
+		if(yetteam != null) {
+			yetteamlist = map.get(teamidtolist, yetteam);
+			list.remove(yetteamlist, player_uuid);
+			map.add(playersinteam, yetteam, map.get(playersinteam, yetteam) - 1);
+		}
+		map.add(playersinteam, newteam, map.get(playersinteam, newteam) + 1);
+		list.add(newteamlist, player_uuid);
+		map.add(players, player_uuid, newteam);
+		speakPrefix(player, gamename, concat("You joined the ", map.get(teamcolortext, newteam), " §rteam."));
+		entity.setName(player, concat(map.get(colorcodes, newteam), player.getName(player)));
+	}
+}
+return;
+
+@finalstart
+player_list = minigame.getPlayers(script_id);
+entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
+
+while(list.getSize(waiters) != 0) {
+	team = getTeamWithLowestPeople(teamidtolist, numberofteams);
+	teamlist = map.get(teamidtolist, team);
+	p_uuid = list.getIndex(waiters, 0);
+	map.add(playersinteam, team, map.get(playersinteam, team) + 1);
+	list.add(teamlist, p_uuid);
+	list.remove(waiters, p_uuid);
+	map.add(players, p_uuid, team);
+	entity.setName(player.get(p_uuid), concat(map.get(colorcodes, team), player.getName(p_uuid)));
+}
+
+event.load("player_post_respawn");
+event.load("item_air_click");
+event.load("craft");
+event.load("entity_click");
+event.load("inv_click");
+event.load("human_hurt");
+
+for(i = 0; i < list.getSize(player_list); i++) {
+	p_uuid = list.getIndex(player_list, i);
+	team = map.get(players, p_uuid);
+	p = player.get(p_uuid);
+	speakPrefix(p, gamename, "The game has started.");
+	entity.teleport(p, map.get(spawn_locs, team));
+	//Recipe-Menus für jeden Spieler erstellen
+	menu = inv.new("222222222222222222222222222222222222222222222000000022");
+	map.add(recipe_menus, p_uuid, menu);
+	//Gamemode und Fly deaktivieren
+	if(player.isSurvival(p)) {
+		if(player.isAdventure(p)) {
+			player.setGamemode(p, "survival");
+		}
+	} else {
+		player.setGamemode(p, "survival");
+	}
+	if(player.hasFly(p)) {
+		player.setFly(p, false);
+	}
+	player.clearInventory(p);
+	//Building-Perms entfernen
+	if(perm.has(p, "plot.bypass")) {
+		perm.unregisterPlayer(p_uuid, 1);
+		perm.unregisterPlayer(p_uuid, 15);
+		list.add(removed_perms, p_uuid);
+	}
+}
+
+humans_list = getAllEntites();
+resetSigns();
+resetFrames();
+resetContainers();
+
+for(team = 0; team < numberofteams; team++) {
+	teamsize = map.get(playersinteam, team);
+	if(teamsize != 0) {
+		list.add(allteams, team);
+		map.add(points, team, 0);
+	}
+}
+
+//Sales erstellen
+for(i = 0; i < list.getSize(allteams); i++) {
+	team = list.getIndex(allteams, i);
+	step = list.getSize(sell_frame_locs) / numberofteams;
+	index = team * step;
+	direction = map.get(sell_frame_directions, team);
+	frame_loc = list.getIndex(sell_frame_locs, index);
+	entity = list.getIndex(humans_list, index);
+	entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", frame_loc, 1.5);
+	item = getItem(getRandomIndex());
+	entity.spawnItemFrame(frame_loc, direction, item);
+	map.add(sales_map, entity, item);
+	time = math.random(30, 60);
+	entity.setName(entity, text.number(time));
+}
+updateDisplay();
+
+if(list.getSize(allteams) == 1) {
+	singleteam = true;
+	for(i = 0; i < list.getSize(player_list); i++) {
+		p = player.get(list.getIndex(player_list, i));
+		title.setSub(p, "Not ranked");
+		title.send(p, "§eSingleteam");
+	}
+} else {
+	singleteam = false;
+}
+
+@loop
+if(--seconds < 0) {
+	minutes--;
+	seconds = 59;
+}
+if(seconds < 10) {
+	minigame.displayAll(1, concat("§aTime left: §r", text.number(minutes), ":0", text.number(seconds)));  
+} else {
+	minigame.displayAll(1, concat("§aTime left: §r", text.number(minutes), ":", text.number(seconds)));
+}
+if(minutes == 0 && seconds == 30) {
+	minigame.speakAll(gamename, "The shops are closing in 30 seconds.");
+	for(i = 0; i < list.getSize(player_list); i++) {
+		p = player.get(list.getIndex(player_list, i));
+		sound.spawnForPlayer(p, join_sound, sound_category_ambient);
+	}
+} elseif(minutes == 0 && seconds == 10) {
+	minigame.speakAll(gamename, "The shops are closing in 10 seconds.");
+	for(i = 0; i < list.getSize(player_list); i++) {
+		p = player.get(list.getIndex(player_list, i));
+		sound.spawnForPlayer(p, join_sound, sound_category_ambient);
+	}
+} elseif(minutes == 0 && seconds <= 3) {
+	for(i = 0; i < list.getSize(player_list); i++) {
+		p = player.get(list.getIndex(player_list, i));
+		sound.spawnForPlayer(p, join_sound, sound_category_ambient);
+	}
+}
+if(minutes == 0 && seconds == 0) {
+	max = -1;
+	minigame.msgAll(getSpacer());
+	for(i = 0; i < list.getSize(allteams); i++) {
+		team = list.getIndex(allteams, i);
+		teampoints = map.get(points, team);
+		if(teampoints > max) {
+			max = teampoints;
+			winning_team = team;
+			winner_list = map.get(teamidtolist, winning_team);
+		}
+		teamlist = map.get(teamidtolist, team);
+		team_string = "";
+		for(h = 0; h < list.getSize(teamlist); h++) {
+			if(team_string == "") {
+				team_string = player.getName(list.getIndex(teamlist, h));
+			} else {
+				team_string = concat(team_string, " ", player.getName(list.getIndex(teamlist, h)));
+			}
+		}
+		minigame.speakAll(gamename, concat(text.number(teampoints), map.get(colorcodes, team), " (", team_string, ")"));
+	}
+	minigame.msgAll(getSpacer());
+	goto("win");
+}
+iter = map.iterator(sales_map);
+while(hasNext(iter)) {
+	iter_element = next(iter);
+	key = map.getKey(iter_element);
+	time = read.number(entity.getName(key)) - 1;
+	if(time > 0) {
+		entity.setName(key, text.number(time));
+	} else {
+		index = list.getIndexOf(humans_list, key);
+		location = list.getIndex(sell_frame_locs, index);
+		entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", location, 1.5);
+		step = list.getSize(sell_frame_locs) / numberofteams;
+		team = math.roundDown(index / step);
+		direction = map.get(sell_frame_directions, team);
+		item = getItem(getRandomIndex());
+		entity.spawnItemFrame(location, direction, item);
+		map.add(sales_map, key, item);
+		time = math.random(30, 60);
+		entity.setName(key, text.number(time));
+	}
+}
+sgoto(20, "loop");
+
+@checkgame
+wait();
+if(event == "living_pre_hurt") {
+	if(!isPlayer(living_entity)) {
+		goto("checkgame");
+	}
+	player = living_entity;
+} elseif(event == "human_hurt") {
+	if(!isPlayer(entity)) {
+		goto("checkgame");
+	}
+	player = entity;
+}
+if(player.hasMinigameId(player, script_id)) {
+	ignoreGoto(event);
+}
+goto("checkgame");
+
+@block_click
+if(block.hasTag(wall_signs_tag, block)) {
+	if(block.getSign(block_loc, 0) == "Click here") {
+		if(player.getItemAmount(player, false, emerald) >= 10) {
+			direction = block.getState(block_loc, facing_prop);
+			block.set(block_loc, air);
+			item = getItem(getRandomIndex());
+			entity.spawnItemFrame(block_loc, direction, item);
+			entity = list.getIndex(humans_list, list.getIndexOf(sell_frame_locs, block_loc));
+			map.add(sales_map, entity, item);
+			time = math.random(30, 60);
+			entity.setName(entity, text.number(time));
+			player.removeItem(player, emerald10);
+		} else {
+			speakPrefix(player, gamename, "You need 10 emeralds.");
+		}
+	}
+}
+goto("checkgame");
+
+@living_pre_hurt
+if(isPlayer(living_entity)) {
+	cancel = true;
+}
+goto("checkgame");
+
+@block_break
+@block_place
+cancel = true;
+goto("checkgame");
+
+@human_hurt
+if(isPlayer(entity)) {
+	player = entity;
+	if(map.contains(sales_map, human)) {
+		hand_item = entity.getEquip(player, "hand");
+		aim_item = map.get(sales_map, human);
+		if(item.getType(hand_item) == item.getType(aim_item)) {
+			player_uuid = player.getUuid(player);
+			team = map.get(players, player_uuid);
+			direction = map.get(sell_frame_directions, team);
+			item = getItem(getRandomIndex());
+			location = list.getIndex(sell_frame_locs, list.getIndexOf(humans_list, human));
+			entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", location, 1.5);
+			entity.spawnItemFrame(location, direction, item);
+			map.add(sales_map, human, item);
+			time = math.random(30, 60);
+			entity.setName(human, text.number(time));
+			player.giveItem(player, emerald);
+			player.removeItem(player, aim_item);
+			map.add(points, team, map.get(points, team) + 1);
+			updateDisplay();
+			speakPrefix(player, gamename, "Thank you §e+§r1 §aSmaragd");
+		} else {
+			speakPrefix(player, gamename, "Wrong item in your mainhand.");
+		}
+	}
+} else {
+	if(entity.getName(human) != "Rezepte") {
+		speakPrefix(player, gamename, "Shop not unlocked.");
+	}
+}
+goto("checkgame");
+
+@inv_click
+if(inv_name == "Rezepte") {
+	player_uuid = player.getUuid(player);
+	team = map.get(players, player_uuid);
+	item_type = item.getType(item);
+	if(item_type == air) {
+		goto("checkgame");
+	}
+	if(item_type == paper) {
+		name = item.getName(item);
+		if(text.contains(name, "<<") || text.contains(name, ">>")) {
+			page = removeFormat(name);
+			page = text.replace(page, "<<", "");
+			page = text.replace(page, ">>", "");
+			page = read.number(page);
+			if(inv_slot == 45) {
+				setRecipePage(player, inv, page);
+			}
+			if(inv_slot == 46) {
+				setRecipePage(player, inv, page);
+			}
+			goto("checkgame");
+		}
+	}
+	index = getIndexFromItemType(item_type);
+	if(index == null) {
+		goto("checkgame");
+	}
+	setItemFrames(team, index);
+}
+goto("checkgame");
+
+@entity_click
+if(entity.getType(entity) == "human") {
+	if(entity.getName(entity) == "Rezepte") {
+		player_uuid = player.getUuid(player);
+		menu = map.get(recipe_menus, player_uuid);
+		setRecipePage(player, menu, 1);
+		inv.open(menu, player, "Rezepte");
+	}
+	goto("checkgame");
+}
+human = entity;
+entity = player;
+goto("human_hurt");
+
+@player_post_respawn
+player_uuid = player.getUuid(player);
+team = map.get(players, player_uuid);
+location = map.get(spawn_locs, team);
+entity.teleport(player, location);
+goto("checkgame");
+
+@item_air_click
+if(hand == "MAIN_HAND") {
+	item = entity.getEquip(player, "hand");
+} else {
+	item = entity.getEquip(player, "offhand");
+}
+if(item.getType(item) == "minecraft:ender_pearl") {
+	cancel = true;
+}
+goto("checkgame");
+
+@craft
+if(list.contains(forbidden_items, item.getType(item))) {
+	cancel = true;
+	speakPrefix(player, gamename, "Nope, preventing a bug.");
+}
+goto("checkgame");
+
+@player_logout
+@player_giveup
+minigame.speakAll(gamename, concat("§8", player_name, " §rhas left the game."));
+showstats(player, false);
+player_uuid = player.getUuid(player);
+//Building-Perms wieder geben
+if(list.contains(removed_perms, player_uuid)) {
+	list.remove(removed_perms, player_uuid);
+	perm.registerPlayer(player_uuid, 1);
+	perm.registerPlayer(player_uuid, 15);
+}
+if(singleteam) {
+	script = script.getFromId(script_id);
+	minigame.kickPlayer(script, player);
+	minigame.term(script, gamesignloc);
+	term();
+}
+team = map.get(players, player_uuid);
+map.remove(players, player_uuid);
+script = script.getFromId(script_id);
+minigame.kickPlayer(script, player);
+amount = map.get(playersinteam, team) - 1;
+map.add(playersinteam, team, amount);
+if(amount <= 0) {
+	list.remove(allteams, team);
+	if(list.getSize(allteams) == 1) {
+		winning_team = list.getIndex(allteams, 0);
+		winner_list = map.get(teamidtolist, winning_team);
+		goto("win");
+	}
+}
+minigame.displayRemoveAll(2 + team);
+goto("checkgame");
+
+@win
+team_string = "";
+for(h = 0; h < list.getSize(winner_list); h++) {
+	if(team_string == "") {
+		team_string = player.getName(list.getIndex(winner_list, h));
+	} else {
+		team_string = concat(team_string, " ", player.getName(list.getIndex(winner_list, h)));
+	}
+}
+if(!singleteam) {
+	minigame.speakAll( gamename, concat("Team ", map.get(colorcodes, winning_team), "(", team_string, ") §rhas won."));
+}
+for(i = 0; i < list.getSize(player_list); i++) {
+	player_uuid = list.getIndex(player_list, i);
+	p = player.get(player_uuid);
+	team = map.get(players, player_uuid);
+	if(team == winning_team) {
+		showstats(p, true);
+	} else {
+		showstats(p, false);
+	}
+	script = script.getFromId(script_id);
+	minigame.kickPlayer(script, p);
+}
+//Building-Perms wieder geben
+for(i = 0; i < list.getSize(removed_perms); i++) {
+	player_uuid = list.getIndex(removed_perms, i);
+	perm.registerPlayer(player_uuid, 1);
+	perm.registerPlayer(player_uuid, 15);
+}
+minigame.term(script, gamesignloc);
+term();
+
+function showstats(player, won) { //Player player, Boolean won
+	if($singleteam) {
+		return;
+	}
+	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 updateDisplay() {
+	minigame.displayAll(0, $gamename);
+	for(i = 0; i < list.getSize($allteams); i++) {
+		team = list.getIndex($allteams, i);
+		minigame.displayAll(2 + team, concat(map.get($teamcolortext2, team), ": §r", text.number(map.get($points, team))));
+	}
+}
+
+function addItem(item, item1, item2, item3, item4, item5, item6, item7, item8, item9) {
+	array = array.new(10);
+	array[0] = item;
+	array[1] = item1;
+	array[2] = item2;
+	array[3] = item3;
+	array[4] = item4;
+	array[5] = item5;
+	array[6] = item6;
+	array[7] = item7;
+	array[8] = item8;
+	array[9] = item9;
+	list.add($items_list, array);
+}
+
+function getRandomIndex() {
+	return math.random(0, list.getSize($items_list) - 1);
+}
+
+function getIndexFromItemType(item_type) {
+	for(i = 0; i < list.getSize($items_list); i++) {
+		array = list.getIndex($items_list, i);
+		if(array[0] == item_type) {
+			return i;
+		}
+	}
+}
+
+function getItem(index) {
+	array = list.getIndex($items_list, index);
+	return read.item(array[0]);
+}
+
+function setItemFrames(team, index) {
+	loc = list.getIndex($frame_locs, team);
+	entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", loc, 3.5);
+	direction = map.get($frame_directions, team);
+	array = list.getIndex($items_list, index);
+	entity.spawnItemFrame(loc, direction, read.item(array[0]));
+	if(direction == "north") {
+		entity.spawnItemFrame(loc.mod(loc, 1, -1, 0), direction, read.item(array[1]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
+		entity.spawnItemFrame(loc.mod(loc, -1, -1, 0), direction, read.item(array[3]));
+		entity.spawnItemFrame(loc.mod(loc, 1, -2, 0), direction, read.item(array[4]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
+		entity.spawnItemFrame(loc.mod(loc, -1, -2, 0), direction, read.item(array[6]));
+		entity.spawnItemFrame(loc.mod(loc, 1, -3, 0), direction, read.item(array[7]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
+		entity.spawnItemFrame(loc.mod(loc, -1, -3, 0), direction, read.item(array[9]));
+	} elseif(direction == "east") {
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, -1), direction, read.item(array[1]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, 1), direction, read.item(array[3]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, -1), direction, read.item(array[4]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, 1), direction, read.item(array[6]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, -1), direction, read.item(array[7]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, 1), direction, read.item(array[9]));
+	} elseif(direction == "south") {
+		entity.spawnItemFrame(loc.mod(loc, -1, -1, 0), direction, read.item(array[1]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
+		entity.spawnItemFrame(loc.mod(loc, 1, -1, 0), direction, read.item(array[3]));
+		entity.spawnItemFrame(loc.mod(loc, -1, -2, 0), direction, read.item(array[4]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
+		entity.spawnItemFrame(loc.mod(loc, 1, -2, 0), direction, read.item(array[6]));
+		entity.spawnItemFrame(loc.mod(loc, -1, -3, 0), direction, read.item(array[7]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
+		entity.spawnItemFrame(loc.mod(loc, 1, -3, 0), direction, read.item(array[9]));
+	} elseif(direction == "west") {
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, 1), direction, read.item(array[1]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, read.item(array[2]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, -1), direction, read.item(array[3]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, 1), direction, read.item(array[4]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, read.item(array[5]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, -1), direction, read.item(array[6]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, 1), direction, read.item(array[7]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, read.item(array[8]));
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, -1), direction, read.item(array[9]));
+	}
+}
+
+function resetSigns() {
+	step = list.getSize($sell_frame_locs) / $numberofteams;
+	team = 0;
+	counter = 0;
+	for(i = 0; i < list.getSize($sell_frame_locs); i++) {
+		if(counter != 0) { //Erste Locs werden übersprungen. Kein Schild platzieren = Freigeschalteter Shop
+			loc = list.getIndex($sell_frame_locs, i);
+			entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", loc, 1.5);
+			direction = map.get($sell_frame_directions, team);
+			block.set(loc, concat("minecraft:oak_wall_sign[facing=", direction, "]"));
+			block.setSign(loc, 0, "Click here");
+			block.setSign(loc, 1, "to unlock for");
+			block.setSign(loc, 2, "§a10 §rEmerald");
+			block.setSign(loc, 3, ">> >> >>");
+		}
+		if(++counter == step) {
+			counter = 0;
+			team++;
+		}
+	}
+}
+
+function resetFrames() {
+	for(i = 0; i < list.getSize($frame_locs); i++) {
+		loc = list.getIndex($frame_locs, i);
+		entity.removeAll("net.minecraft.entity.item.ItemFrameEntity", loc, 3.5);
+		direction = map.get($frame_directions, i);
+		entity.spawnItemFrame(loc, direction, $air_item);
+		entity.spawnItemFrame(loc.mod(loc, 0, -1, 0), direction, $air_item);
+		entity.spawnItemFrame(loc.mod(loc, 0, -2, 0), direction, $air_item);
+		entity.spawnItemFrame(loc.mod(loc, 0, -3, 0), direction, $air_item);
+		if(direction == "north" || direction == "south") {
+			entity.spawnItemFrame(loc.mod(loc, 1, -1, 0), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, -1, -1, 0), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, 1, -2, 0), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, -1, -2, 0), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, 1, -3, 0), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, -1, -3, 0), direction, $air_item);
+		}
+		if(direction == "east" || direction == "west") {
+			entity.spawnItemFrame(loc.mod(loc, 0, -1, 1), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, 0, -1, -1), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, 0, -2, 1), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, 0, -2, -1), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, 0, -3, 1), direction, $air_item);
+			entity.spawnItemFrame(loc.mod(loc, 0, -3, -1), direction, $air_item);
+		}
+	}
+}
+
+function resetContainers() {
+	//1.Kiste
+	for(i = 0; i < list.getSize($chest_locs1); i++) {
+		loc = list.getIndex($chest_locs1, i);
+		block.clone(loc.mod(loc, 0, -3, 0), loc);
+	}
+	//2.Kiste
+	for(i = 0; i < list.getSize($chest_locs2); i++) {
+		loc = list.getIndex($chest_locs2, i);
+		block.clone(loc.mod(loc, 0, -3, 0), loc);
+	}
+	//Ofen
+	for(i = 0; i < list.getSize($furnace_locs); i++) {
+		loc = list.getIndex($furnace_locs, i);
+		block.clone(loc.mod(loc, 0, -3, 0), loc);
+	}
+}
+
+function setRecipePage(player, menu, page) {
+	size = list.getSize($items_list);
+	max_page = math.roundUp(size / 45);
+	if(page > max_page) {
+		return;
+	}
+	if(page > 1) {
+		inv.setItem(menu, 45, read.item("minecraft:paper", 1, concat("§e", text.number(page - 1), " <<")));
+	} else {
+		inv.setItem(menu, 45, $air_item);
+	}
+	if(page < max_page) {
+		inv.setItem(menu, 46, read.item("minecraft:paper", 1, concat("§e>> ", text.number(page + 1))));
+	} else {
+		inv.setItem(menu, 46, $air_item);
+	}
+	max_index = size - 1;
+	for(i = 0; i < 45; i++) {
+		list_index = i + 45 * (page - 1);
+		if(list_index > max_index) {
+			inv.setItem(menu, i, $air_item);
+		} else {
+			array = list.getIndex($items_list, list_index);
+			inv.setItem(menu, i, read.item(array[0]));
+		}
+	}
+	inv.update(player);
+}
+
+function getAllEntites() {
+	humans_list = list.new();
+	for(i = 0; i < list.getSize($humans_locs); i++) {
+		location = list.getIndex($humans_locs, i);
+		entity = entity.get(location, 10, "me.km.entities.EntityHuman");
+		list.add(humans_list, entity);
+		entity.setName(entity, "Shop");
+	}
+	return humans_list;
+}

+ 2 - 2
minigames/snowgame/snowgame.txt

@@ -226,7 +226,7 @@ if(isPlayer(living_entity)) {
 }
 goto("checkgame");
 
-@living_is_attacked
+@living_pre_hurt
 if(!isPlayer(living_entity)) {
 	goto("checkgame");
 }
@@ -358,4 +358,4 @@ function equipPlayer(player, team) {
 		entity.setEquip(player, "legs", read.item(concat("{id:'minecraft:leather_leggings',Count:1b,tag:{display:{color:", color, "}}}")));
 		entity.setEquip(player, "feet", read.item(concat("{id:'minecraft:leather_boots',Count:1b,tag:{display:{color:", color, "}}}")));
 	}
-}
+}

+ 2 - 2
minigames/spleef/spleef.txt

@@ -31,7 +31,7 @@ if(player.hasMinigameId(player, script_id)) {
 }
 goto("checkgame");
 
-@living_is_attacked
+@living_pre_hurt
 if(isPlayer(living_entity)) {
 	cancel = true;
 	player_damage_cause_string = damage.getType(damage_source);
@@ -101,4 +101,4 @@ function showstats(player, won) { //Player player, Boolean won
 	if(playedgames != 0) {
 		minigame.statsLine(player, "§e", "Win ratio", concat(text.number(math.roundComma((last_record / playedgames) * 100, 2)), "%"));
 	}
-}
+}

+ 834 - 834
minigames/spleef/spleefmap2.txt

@@ -1,834 +1,834 @@
-event.load("entity_click");
-event.load("inv_click");
-event.load("player_post_respawn");
-event.load("player_login");
-event.load("player_logout");
-event.load("player_move");
-event.load("block_click");
-event.load("block_drop");
-event.load("entity_mount");
-event.load("living_death");
-event.load("living_drop");
-event.load("living_is_attacked");
-event.load("player_toss");
-
-tp_list = list.new();
-tp_map = map.new();
-sitting = map.new();
-player_data_map = map.new();
-crops_tag = block.getTag("minecraft:crops");
-hoe_tag = item.getTag("km:hoe");
-stairs_tag = block.getTag("minecraft:stairs");
-half_property = block.getProperty("half");
-
-gamesworld = world.get("games");
-moveidsurvival = event.addMoveData(loc.new(gamesworld, -399, 89, 110), loc.new(gamesworld, -400, 91, 114), 5, -1);
-config = getScriptVar("server_config");
-survival_spawn = read.location(config.getString(config, "surv_spawn", "games:0:0:0"));
-overworld = world.get("overworld");
-adventure_chest_loc = loc.new(overworld, 240, 80, 234);
-adventure_aim_loc = loc.new(overworld, 237, 76, 237);
-moneyname = "survmoney";
-money_präfix = "§2Money";
-
-max_ench_lvl = map.new();
-map.add(max_ench_lvl, enchantment.get("efficiency"), 10);
-
-par = particle.get("minecraft:witch");
-piston_sound = sound.get("block.piston.extend");
-sound_category_ambient = sound.getCategory("ambient");
-
-day_index = 0;
-days_list = list.new();
-list.add(days_list, "Montag");
-list.add(days_list, "Dienstag");
-list.add(days_list, "Mittwoch");
-list.add(days_list, "Donnerstag");
-list.add(days_list, "Freitag");
-list.add(days_list, "Samstag");
-list.add(days_list, "Sonntag");
-
-auto_farm_set = set.new();
-set.add(auto_farm_set, "minecraft:wheat_seeds");
-set.add(auto_farm_set, "minecraft:pumpkin_seeds");
-set.add(auto_farm_set, "minecraft:carrot");
-set.add(auto_farm_set, "minecraft:potato");
-set.add(auto_farm_set, "minecraft:beetroot_seeds");
-set.add(auto_farm_set, "minecraft:melon_seeds");
-
-bank_human_name = "Bänker";
-adv_human_name = "Adventure";
-bankmenu = inv.new("233302332233302332");
-bankinvid = inv.getID(bankmenu);
-coin_gold = read.item("km:coin_gold");
-coin_silver = read.item("km:coin_silver");
-coin_silver64 = read.item("km:coin_silver", 64);
-coin_copper = read.item("km:coin_copper");
-coin_copper64 = read.item("km:coin_copper", 64);
-arrow_left = read.item("km:arrow_left", 1, "§rwechseln zu");
-arrow_right = read.item("km:arrow_right", 1, "§rwechseln zu");
-plus_green = read.item("km:plus_green", 1, "§rEinzahlung");
-minus_red = read.item("km:minus_red", 1, "§rAuszahlung");
-inv.setItem(bankmenu, 0, plus_green);
-inv.setItem(bankmenu, 1, coin_copper);
-inv.setItem(bankmenu, 2, coin_silver);
-inv.setItem(bankmenu, 3, coin_gold);
-inv.setItem(bankmenu, 4, coin_copper64);
-inv.setItem(bankmenu, 5, arrow_left);
-inv.setItem(bankmenu, 6, arrow_right);
-inv.setItem(bankmenu, 7, coin_silver);
-inv.setItem(bankmenu, 8, minus_red);
-inv.setItem(bankmenu, 9, coin_copper);
-inv.setItem(bankmenu, 10, coin_silver);
-inv.setItem(bankmenu, 11, coin_gold);
-inv.setItem(bankmenu, 12, coin_silver64);
-inv.setItem(bankmenu, 13, arrow_left);
-inv.setItem(bankmenu, 14, arrow_right);
-inv.setItem(bankmenu, 15, coin_gold);
-
-pvp_set = getScriptVar("pvp_set");
-if(pvp_set == null) {
-	pvp_set = set.new();
-	setScriptVar("pvp_set", pvp_set);
-} else {
-	//Alle Spieler, die PvP an hatten, wieder registrieren
-	iter = set.iterator(pvp_set);
-	while(hasNext(iter)) {
-		player = player.get(next(iter));
-		if(player != null) {
-			setPvp(player, "on");
-		}
-	}
-}
-
-//Minecraft-Zeit auf Real-Zeit syncen
-calendar = time.new(time.getMillis());
-min = time.getMinute(calendar);
-sec = time.getSecond(calendar);
-while(min >= 20) {
-	min -= 20;
-}
-real_time = min * 60 + sec;
-new_time = real_time * 24000 / 1200;
-world.setTime(world.get("overworld"), new_time);
-
-sgoto(1200, "timerloop");
-
-msg("dev", "§bSurvival §rwurde geladen");
-@wait
-wait();
-if(event == "player_move") {
-	if(id == moveidsurvival) {
-		teleportPlayer(player, survival_spawn, false);
-	}
-	goto("wait");
-}
-//Wenn Event aus Survival-Welten, dann wird er verarbeitet
-if(event == "living_death" || event == "living_drop" || event == "living_is_attacked" || event == "living_experience_drop") {
-	loc = entity.getLocation(living_entity);
-} elseif(event == "block_drop") {
-	loc = location;
-} elseif(event == "entity_mount") {
-	loc = entity.getLocation(rider);
-} else {
-	loc = entity.getLocation(player);
-}
-world_name = world.getName(loc.getWorld(loc));
-if(isSurvWorldName(world_name)) {
-	ignoreGoto(event);
-}
-goto("wait");
-
-@player_toss
-target_loc = player.getTarget(player, 5);
-block_type = block.getType(target_loc);
-if(block_type == "minecraft:lectern") {
-	cancel = true;
-	item.entity.spawn(item.entity.new(loc.mod(target_loc, 0.5, 1.5, 0.5), item));
-}
-goto("wait");
-
-@player_login
-onadventure = ggv(player, "onadventure");
-if(onadventure != null) {
-	if(onadventure) {
-		addAdventureDisplay(player, adventure_aim_loc);
-	}
-}
-goto("wait");
-
-@living_is_attacked
-if(!isPlayer(living_entity)) {
-	goto("wait");
-}
-player = living_entity;
-damager = getPlayerFromDamageSource(damage_source);
-if(!isPlayer(damager)) {
-	goto("wait");
-}
-if(player == damager) {
-	goto("wait");
-}
-if(!hasPvpOn(damager)) {
-	cancel = true;
-	player.speak(damager, "§5PvP", "Du hast Pvp aus.");
-	goto("wait");
-}
-if(!hasPvpOn(player)) {
-	cancel = true;
-	player.speak(damager, "§5PvP", player.getName(player), " hat Pvp aus.");
-	goto("wait");
-}
-goto("wait");
-
-@entity_click
-if(hand == "OFF_HAND") {
-	goto("wait");
-}
-if(entity.getType(entity) == "human") {
-	entity_name = entity.getName(entity);
-	if(entity_name == bank_human_name) {
-		inv.open(bankmenu, player, "Bänker");
-		goto("wait");
-	}
-	if(entity_name == adv_human_name) {
-		onadventure = ggv(player, "onadventure");
-		if(onadventure == null) {
-			player.speak(player, "§5Adventure", "§rDu bist auf keinem Abenteuer.");
-			goto("wait");
-		}
-		if(!onadventure) {
-			player.speak(player, "§5Adventure", "§rDu bist auf keinem Abenteuer.");
-			goto("wait");
-		}
-		sgv(player, "onadventure", "false");
-		adventures = ggv(player, "adventures");
-		if(adventures == null) {
-			adventures = 0;
-		}
-		sgv(player, "adventures", ++adventures);
-		player.speak(player, "§5Adventure", "§rGlückwunsch, du hast dein Abenteuer beendet. Hier hast du deine Belohnung!");
-		if(adventures >= 1) {
-			offerRank(player, "§6Entdecker");
-		}
-		if(adventures >= 10) {
-			offerRank(player, "§2Pionier");
-		}
-		removeAdventureDisplay(player);
-		safeGiveItemPlayer(player, coin_silver);
-		goto("wait");
-	}
-}
-goto("wait");
-
-@player_logout
-setAfk(player, false);
-setPvp(player, "off");
-goto("wait");
-
-@player_login
-joinSurvWorld(player);
-goto("wait");
-
-@inv_click
-cancel = true;
-if(inv_id == bankinvid) { //Bankmenü
-	gold_inv = player.getItemAmount(player, true, coin_gold);
-	silver_inv = player.getItemAmount(player, true, coin_silver);
-	copper_inv = player.getItemAmount(player, true, coin_copper);
-	//Wechseln
-	if(inv_slot == 5 || inv_slot == 6 || inv_slot == 13 || inv_slot == 14)  {
-		if(inv_slot == 5) {
-			//1 Silbermünze --> 64 Kupfermünzen
-			amount1 = 1;
-			item1 = coin_silver;
-			amount2 = 64;
-			item2 = coin_copper64;
-			message = "Keine Silbermünze im Inventar.";
-			item_type = "km:coin_copper";
-			coin_inv = silver_inv;
-		}
-		elseif(inv_slot == 6) {
-			//64 Kupfermünzen --> 1 Silbermünze
-			amount1 = 64;
-			item1 = coin_copper64;
-			amount2 = 1;
-			item2 = coin_silver;
-			message = "Nicht genug Kupfermünzen im Inventar.";
-			item_type = "km:coin_silver";
-			coin_inv = copper_inv;
-		}
-		elseif(inv_slot == 13) {
-			//1 Goldmünze --> 64 Silbermünzen
-			amount1 = 1;
-			item1 = coin_gold;
-			amount2 = 64;
-			item2 = coin_silver64;
-			message = "Keine Goldmünze im Inventar.";
-			item_type = "km:coin_silver";
-			coin_inv = gold_inv;
-		}
-		elseif(inv_slot == 14) {
-			//64 Silbermünzen --> 1 Goldmünze
-			amount1 = 64;
-			item1 = coin_silver64;
-			amount2 = 1;
-			item2 = coin_gold;
-			message = "Nicht genug Silbermünzen im Inventar.";
-			item_type = "km:coin_gold";
-			coin_inv = silver_inv;
-		}
-		if(coin_inv < amount1) {
-			player.speak(player, money_präfix, message);
-			goto("wait");
-		}
-		player.removeItem(player, item1);
-		notgiven = player.giveItem(player, item2);
-		if(item.getType(notgiven) != "minecraft:air") {
-			amount = item.getAmount(notgiven);
-			player.removeItem(player, read.item(item_type, amount2 - amount));
-			player.giveItem(player, item1);
-			player.speak(player, money_präfix, "Nicht genug Platz im Inventar.");
-			goto("wait");
-		}
-		inv.update(player);
-		player.speak(player, money_präfix, "Wechseln erfolgreich.");
-		goto("wait");
-	}
-	//Kontobewegungen
-	if(inv_slot == 1 || inv_slot == 9) {
-		betrag = 1;
-		coin_inv = copper_inv;
-	}
-	elseif(inv_slot == 2 || inv_slot == 10) {
-		betrag = 64;
-		coin_inv = silver_inv;
-	}
-	elseif(inv_slot == 3 || inv_slot == 11) {
-		betrag = 4096;
-		coin_inv = gold_inv;
-	}
-	//Einzahlen
-	if(inv_slot > 0 && inv_slot < 4) {
-		player_id = player.getId(player);
-		if(coin_inv < 1) {
-			player.speak(player, money_präfix, "§rMünze nicht im Inventar.");
-		} else {
-			addSurvMoney(player, betrag);
-			player.removeItem(player, inv.getItem(bankmenu, inv_slot));
-			inv.update(player);
-			player.speak(player, money_präfix, "§rTransaktion erfolgreich.");
-		}
-		goto("wait");
-	}
-	//Auszahlen
-	if(inv_slot > 8 && inv_slot < 12) {
-		player_id = player.getId(player);
-		if(!hasEnoughMoney(player_id, moneyname, betrag)) {
-			player.speak(player, money_präfix, "§rNicht genug Gold am Konto.");
-		} else {
-			subSurvMoney(player, betrag);
-			player.giveItem(player, inv.getItem(bankmenu, inv_slot));
-			inv.update(player);
-			player.speak(player, money_präfix, "§rTransaktion erfolgreich.");
-		}
-		goto("wait");
-	}
-	goto("wait");
-}
-goto("wait");
-
-@block_click
-if(hand == "OFF_HAND") {
-	goto("wait");
-}
-if(block.hasTag(stairs_tag, block)) {
-	goto("sitting");
-}
-if(block_type == "minecraft:lectern") {
-	if(action == "right") {
-		itementity = entity.get(loc.mod(block_loc, 0.5, 0.9, 0.5), 0.2, "net.minecraft.entity.item.ItemEntity");
-		if(itementity == null) {
-			goto("wait");
-		}
-		list = entity.near(itementity, 0.2);
-		list.add(list, itementity);
-		if(list.getSize(list) < 2) {
-			//Zu wenig Items am Lesepult
-			goto("wait");
-		}
-		a = array.new(2, 6); //0 = item, 1 = itementity, 2 = enchantments, 3 = enchanted, 4 = enchanted_book, 5 = book
-		size = 0;
-		for(i = 0; i < list.getSize(list); i++) {
-			entity = list.getIndex(list, i);
-			item = item.entity.get(entity);
-			size += item.getAmount(item);
-			if(size > 2) {
-				//Zu viele Items am Lesepult
-				goto("wait");
-			}
-			map = enchantment.readFromItem(item);
-			a[i, 0] = item;
-			a[i, 1] = entity;
-			a[i, 2] = map;
-			a[i, 4] = false;
-			a[i, 5] = false;
-			if(map.getSize(map) > 0) {
-				//Verzauberte Items
-				a[i, 3] = true;
-				if(item.getType(item) == "minecraft:enchanted_book") {
-					a[i, 4] = true;
-				}
-			} else {
-				//Nicht verzauberte Items
-				a[i, 3] = false;
-				if(item.getType(item) == "minecraft:book") {
-					a[i, 5] = true;
-				}
-			}
-		}
-		lectern_action = null;
-		if(a[0, 4] == true && a[1, 4] == true) {
-			//Beide Items sind verzauberte Bücher
-			lectern_action = 0;
-		}
-		elseif(a[0, 5] == true || a[1, 5] == true) {
-			//Eines der beiden Items ist ein normales Buch
-			if(a[0, 4] == true || a[1, 4] == true) {
-				//Eines der beiden Items ist ein verzaubertes Buch
-				lectern_action = 1;
-			} elseif(a[0, 3] == true || a[1, 3] == true) {
-				//Eines der beiden Items ist ein verzaubertes Item
-				lectern_action = 2;
-			}
-		}
-		elseif(a[0, 4] == true || a[1, 4] == true) {
-			lectern_action = 3;
-		}
-		if(lectern_action == null) {
-			goto("wait");
-		}
-		
-		if(lectern_action == 0) {
-			//Verzauberungsbücher mergen
-			item1 = a[0, 0];
-			item_entity1 = a[0, 1];
-			item_entity2 = a[1, 1];
-			map1 = a[0, 2];
-			map2 = a[1, 2];
-			map_size1 = map.getSize(map1);
-			map_size2 = map.getSize(map2);
-			iter = map.iterator(map2);
-			betrag = 0;
-			extra = 0;
-			while(hasNext(iter)) {
-				element = next(iter);
-				key = map.getKey(element);
-				level1 = map.getValue(element);
-				level2 = map.getOrDefault(map1, key, 0);
-				if(level1 == level2) {
-					max_lvl = map.get(max_ench_lvl, key);
-					//max_lvl = map.getOrDefault(max_ench_lvl, key, enchantment.getMaxLevel(key));
-					if(max_lvl != null) {
-						if(level1 < max_lvl) {
-							extra += 40;
-							level1++;
-						}
-					}
-				}
-				if(level2 > level1) {
-					level1 = level2;
-				}
-				map.add(map1, key, level1);
-			}
-			if(map_size1 > map_size2) {
-				map = map1;
-			} else {
-				map = map2;
-			}
-			iter = map.iterator(map);
-			while(hasNext(iter)) {
-				element = next(iter);
-				level = map.getValue(element);
-				betrag += level * 20 + extra;
-			}
-			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
-				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
-				goto("wait");
-			}
-			subSurvMoney(player, betrag);
-			
-			enchantment.writeToItem(map1, item1);
-			item.entity.set(item_entity1, item.clone(item1));
-			entity.remove(item_entity2);
-		} elseif(lectern_action == 1) {
-			//Verzauberungsbuch kopieren
-			if(a[0, 5]) {
-				book_index = 0;
-				other_index = 1;
-			} else {
-				book_index = 1;
-				other_index = 0;
-			}
-			item1 = a[book_index, 0];
-			item_entity1 = a[book_index, 1];
-			item2 = a[other_index, 0];
-			item_entity2 = a[other_index, 1];
-			map2 = a[other_index, 2];
-			
-			map_size = map.getSize(map2);
-			betrag = 20 * map_size;
-			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
-				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
-				goto("wait");
-			}
-			subSurvMoney(player, betrag);
-			
-			item1 = read.item("minecraft:enchanted_book");
-			enchantment.writeToItem(map2, item1);
-			item.entity.set(item_entity1, item1);
-			item.entity.set(item_entity2, item.clone(item2));
-		} elseif(lectern_action == 2) {
-			//Einzelne Verzauberung herunterziehen
-			if(a[0, 5]) {
-				book_index = 0;
-				other_index = 1;
-			} else {
-				book_index = 1;
-				other_index = 0;
-			}
-			item_entity1 = a[book_index, 1];
-			map1 = map.new();
-			item2 = a[other_index, 0];
-			item_entity2 = a[other_index, 1];
-			map2 = a[other_index, 2];
-
-			item1 = read.item("minecraft:enchanted_book");
-			element = next(map.iterator(map2));
-			key = map.getKey(element);
-			value = map.getValue(element);
-			map.add(map1, key, value);
-			map.remove(map2, key);
-			
-			betrag = 20 * value;
-			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
-				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
-				goto("wait");
-			}
-			subSurvMoney(player, betrag);
-			
-			enchantment.writeToItem(map1, item1);
-			enchantment.writeToItem(map2, item2);
-			item.entity.set(item_entity1, item1);
-			item.entity.set(item_entity2, item.clone(item2));
-		} elseif(lectern_action == 3) {
-			//Alle Verzauberungen vom Buch auf das Item übertragen
-			betrag = 0;
-			if(a[0, 4]) {
-				ench_book_index = 0;
-				other_index = 1;
-			} else {
-				ench_book_index = 1;
-				other_index = 0;
-			}
-			item1 = a[ench_book_index, 0];
-			item_entity1 = a[ench_book_index, 1];
-			map1 = a[ench_book_index, 2];
-			item2 = a[other_index, 0];
-			item_entity2 = a[other_index, 1];
-			map2 = a[other_index, 2];
-			map_size1 = map.getSize(map1);
-			map_size2 = map.getSize(map2);
-			
-			iter = map.iterator(map1);
-			while(hasNext(iter)) {
-				element = next(iter);
-				key = map.getKey(element);
-				value = map.getValue(element);
-				value2 = map.getOrDefault(map2, key, 0);
-				if(value2 > value) {
-					value = value2;
-				}
-				map.add(map2, key, value);
-			}
-			
-			if(map_size1 > map_size2) {
-				map = map1;
-			} else {
-				map = map2;
-			}
-			iter = map.iterator(map);
-			while(hasNext(iter)) {
-				element = next(iter);
-				level = map.getValue(element);
-				betrag += level * 20;
-			}
-			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
-				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
-				goto("wait");
-			}
-			subSurvMoney(player, betrag);
-			
-			enchantment.writeToItem(map2, item2);
-			item.entity.set(item_entity2, item.clone(item2));
-			entity.remove(item_entity1);
-			
-		}
-		entity.throw(item_entity1, 0, 0.3, 0);
-		entity.throw(item_entity2, 0, 0.3, 0);
-		particle.spawn(loc.mod(block_loc, 0.5, 1.4, 0.5), par, 20, 0, 0.25, 0.25, 0.25);
-		player.speak(player, money_präfix, "Das hat 20 Gold gekostet.");
-	}
-	goto("wait");
-}
-if(block_type == "minecraft:chest") {
-	if(isATpReceiver(block_loc)) {
-		tp_item = read.item("km:gear", 1, "§rTeleport");
-		list = list.new();
-		list.add(list, world.getName(loc.getWorld(block_loc)));
-		list.add(list, text.number(loc.getX(block_loc)));
-		list.add(list, text.number(loc.getY(block_loc)));
-		list.add(list, text.number(loc.getZ(block_loc)));
-		item.setLore(tp_item, list);
-		player.giveItem(player, tp_item);
-		goto("wait");
-	}
-	if(isATpTransmitter(block_loc)) {
-		player_uuid = player.getUuid(player);
-		clicked = map.getOrDefault(tp_map, player_uuid, 0);
-		now_time = time.getMillis();
-		if(now_time - clicked < 5000) {
-			player.speak(player, "§jTeleport", "Warte 5 Sekunden!");
-			goto("wait");
-		}
-		map.add(tp_map, player_uuid, now_time);
-		//Abenteuer-Teleport
-		if(block_loc == adventure_chest_loc) {
-			onadventure = ggv(player, "onadventure");
-			if(onadventure != null) {
-				if(!onadventure) {
-					alpha = math.random(0, 360);
-					alpha *= math.pi() / 180;
-					x = math.sin(alpha) * 8000 + 0.5;
-					z = math.cos(alpha) * 8000 + 0.5;
-					y = 255;
-					overworld = world.get("overworld");
-					tp_loc = loc.new(overworld, x, y, z);
-					loc.setY(tp_loc, y);
-					while(!block.isSolid(tp_loc)) {
-						loc.setY(tp_loc, y--);
-					}
-					loc.setY(tp_loc, y++);
-					wall_type = "minecraft:lime_stained_glass";
-					setWalls(block_loc, wall_type);
-					sound.spawn(block_loc, piston_sound, sound_category_ambient);
-					array = array.new(4);
-					array[0] = player;
-					array[1] = block_loc;
-					array[2] = tp_loc;
-					array[3] = true;
-					list.add(tp_list, array);
-					sgoto(30, "tp_ticker");
-				}
-			}
-			goto("wait");
-		}
-		//Normaler Teleport
-		
-		temp = false;
-		inv = block.getInv(block_loc);
-		inv_size = inv.getSize(inv);
-		for(i = 0; i < inv_size; i++) {
-			item = inv.getItem(inv, i);
-			if(item.getType(item) == "km:gear") {
-				if(item.getName(item) == "§rTeleport") {
-					temp = true;
-					break;
-				}
-			}
-		}
-		if(!temp) {
-			goto("wait");
-		}
-		
-		lore_list = item.getLore(item);
-		if(list.getSize(lore_list) != 4) {
-			goto("wait");
-		}
-		world = world.get(list.getIndex(lore_list, 0));
-		x = read.number(list.getIndex(lore_list, 1));
-		y = read.number(list.getIndex(lore_list, 2));
-		z = read.number(list.getIndex(lore_list, 3));
-		tp_loc = loc.new(world, x, y, z);
-		if(!isATpReceiver(tp_loc)) {
-			goto("wait");
-		}
-		loc.modCoords(tp_loc, 0.5, -3, 0.5);
-		
-		wall_type = "minecraft:lime_stained_glass";
-		setWalls(block_loc, wall_type);
-		sound.spawn(block_loc, piston_sound, sound_category_ambient);
-		array = array.new(4);
-		array[0] = player;
-		array[1] = block_loc;
-		array[2] = tp_loc;
-		array[3] = false;
-		list.add(tp_list, array);
-		sgoto(30, "tp_ticker");
-		goto("wait");
-	}
-}
-goto("wait");
-
-@sitting
-if(action == "left") {
-	goto("wait");
-}
-if(block.getState(block_loc, half_property) != "bottom") {
-	goto("wait");
-}
-if(item.getType(entity.getEquip(player, "hand")) != "minecraft:air") {
-	goto("wait");
-}
-if(!loc.isAir(loc.mod(block_loc, 0, 1, 0))) {
-	goto("wait");
-}
-if(map.contains(sitting, player)) {
-	goto("wait");
-}
-entity = entity.spawn("km:nobody", loc.mod(block_loc, 0.5, 0, 0.5), "{NoGravity:true}");
-map.add(sitting, player, entity);
-entity.mount(player, entity);
-goto("wait");
-
-@living_drop
-if(isPlayer(living_entity)) {
-	goto("wait");
-}
-size = list.getSize(drops);
-for(i = 0; i < size; i++) {
-	item_entity = list.getIndex(drops, i);
-	item = item.entity.get(item_entity);
-	if(item.getMaxAmount(item) > 1) {
-		item.setAmount(item, item.getAmount(item) * 2);
-	}
-}
-goto("wait");
-
-@living_death
-if(isPlayer(living_entity)) {
-	player = living_entity;
-	loc = entity.getLocation(player);
-	player.dropInventory(player, loc);
-	killer = getPlayerFromDamageSource(damage_source);
-	if(isPlayer(killer)) {
-		if(perm.has(player, "isTeam")) {
-			temp = math.random(1, 200);
-		} else {
-			temp = math.random(1, 20);
-		}
-		if(temp == 1) {
-			item.drop(loc, player.getHead(player.getUuid(player), player_name));
-		}
-	}
-}
-goto("wait");
-
-@block_drop
-if(player == null || item == null) {
-	goto("wait");
-}
-if(!block.hasTag(crops_tag, block)) {
-	goto("wait");
-}
-if(!item.hasTag(hoe_tag, item)) {
-	goto("wait");
-}
-for(i = 0; i < list.getSize(drops); i++) {
-	drop_item = list.getIndex(drops, i);
-	if(set.contains(auto_farm_set, item.getType(drop_item))) {
-		amount = item.getAmount(drop_item);
-		if(amount > 0) {
-			item.setAmount(drop_item, amount - 1);
-		}
-	}
-}
-block.set(location, concat(block_type, "[age=0]"));
-player.damageItem(player, 1);
-goto("wait");
-
-@entity_mount
-if(isPlayer(rider)) {
-	player = rider;
-	if(map.contains(sitting, player)) {
-		entity.remove(map.get(sitting, player));
-		map.remove(sitting, player);
-	}
-}
-goto("wait");
-
-@player_post_respawn
-onadventure = ggv(player, "onadventure");
-if(onadventure != null) {
-	if(onadventure) {
-		tploc = read.location(ggv(player, "adventureloc"));
-		entity.teleport(player, tploc);
-	}
-}
-//player.setLevel(player, 0);
-//player.setExp(player, 0);
-//player.addTotalExp(player, original_experience);
-goto("wait");
-
-@tp_ticker
-array = list.getIndex(tp_list, 0);
-list.removeIndex(tp_list, 0);
-block_loc = array[1];
-list.add(tp_list, array);
-sound.spawn(block_loc, piston_sound, sound_category_ambient);
-sgoto(30, "tp_final");
-goto("wait");
-
-@tp_final
-array = list.getIndex(tp_list, 0);
-list.removeIndex(tp_list, 0);
-player = array[0];
-block_loc = array[1];
-tp_loc = array[2];
-bool = array[3];
-sound.spawn(block_loc, piston_sound, sound_category_ambient);
-setWalls(block_loc, "minecraft:air");
-teleportPlayer(player, tp_loc, false);
-if(bool) {
-	sgv(player, "onadventure", "true");
-	sgv(player, "adventureloc", text.location(tp_loc));
-	addAdventureDisplay(player, adventure_aim_loc);
-	title.reset(player);
-	title.setSub(player, "Have fun!");
-	title.send(player, "§cAdventure");
-	player.speak(player, "§5Adventure", "§rLaufe zum Survival-Spawn um dein Abenteuer zu beenden. Du kannst dich nicht teleportieren. Stirbst du, startest du wieder von vorne!");
-	offerRank(player, "§eAbenteurer");
-}
-goto("wait");
-
-@timerloop //Minutentakt. Code ausführen, wenn eine bestimmte Uhrzeit überschritten wurde
-now_time = time.getMillis();
-now_cal = time.new(now_time);
-now_day = time.getDay(now_cal);
-now_min = time.getMinute(now_cal);
-now_sec = time.getSecond(now_cal);
-//Tagesanzeige
-if(now_min == 0 || now_min == 20 || now_min == 40) {
-	day = list.getIndex(days_list, day_index);
-	message = concat("§9Es ist der Tag ", day, " angebrochen!");
-	sendMessageToWorld(world.get("overworld"), message);
-	if(day_index == 6) {
-		day_index = 0;
-	} else {
-		day_index++;
-	}
-}
-//Timer auf volle Minuten synchronisieren
-time = (60 - now_sec) * 20;
-sgoto(time, "timerloop");
-goto("wait");
+event.load("entity_click");
+event.load("inv_click");
+event.load("player_post_respawn");
+event.load("player_login");
+event.load("player_logout");
+event.load("player_move");
+event.load("block_click");
+event.load("block_drop");
+event.load("entity_mount");
+event.load("living_death");
+event.load("living_drop");
+event.load("living_pre_hurt");
+event.load("player_toss");
+
+tp_list = list.new();
+tp_map = map.new();
+sitting = map.new();
+player_data_map = map.new();
+crops_tag = block.getTag("minecraft:crops");
+hoe_tag = item.getTag("km:hoe");
+stairs_tag = block.getTag("minecraft:stairs");
+half_property = block.getProperty("half");
+
+gamesworld = world.get("games");
+moveidsurvival = event.addMoveData(loc.new(gamesworld, -399, 89, 110), loc.new(gamesworld, -400, 91, 114), 5, -1);
+config = getScriptVar("server_config");
+survival_spawn = read.location(config.getString(config, "surv_spawn", "games:0:0:0"));
+overworld = world.get("overworld");
+adventure_chest_loc = loc.new(overworld, 240, 80, 234);
+adventure_aim_loc = loc.new(overworld, 237, 76, 237);
+moneyname = "survmoney";
+money_präfix = "§2Money";
+
+max_ench_lvl = map.new();
+map.add(max_ench_lvl, enchantment.get("efficiency"), 10);
+
+par = particle.get("minecraft:witch");
+piston_sound = sound.get("block.piston.extend");
+sound_category_ambient = sound.getCategory("ambient");
+
+day_index = 0;
+days_list = list.new();
+list.add(days_list, "Montag");
+list.add(days_list, "Dienstag");
+list.add(days_list, "Mittwoch");
+list.add(days_list, "Donnerstag");
+list.add(days_list, "Freitag");
+list.add(days_list, "Samstag");
+list.add(days_list, "Sonntag");
+
+auto_farm_set = set.new();
+set.add(auto_farm_set, "minecraft:wheat_seeds");
+set.add(auto_farm_set, "minecraft:pumpkin_seeds");
+set.add(auto_farm_set, "minecraft:carrot");
+set.add(auto_farm_set, "minecraft:potato");
+set.add(auto_farm_set, "minecraft:beetroot_seeds");
+set.add(auto_farm_set, "minecraft:melon_seeds");
+
+bank_human_name = "Bänker";
+adv_human_name = "Adventure";
+bankmenu = inv.new("233302332233302332");
+bankinvid = inv.getID(bankmenu);
+coin_gold = read.item("km:coin_gold");
+coin_silver = read.item("km:coin_silver");
+coin_silver64 = read.item("km:coin_silver", 64);
+coin_copper = read.item("km:coin_copper");
+coin_copper64 = read.item("km:coin_copper", 64);
+arrow_left = read.item("km:arrow_left", 1, "§rwechseln zu");
+arrow_right = read.item("km:arrow_right", 1, "§rwechseln zu");
+plus_green = read.item("km:plus_green", 1, "§rEinzahlung");
+minus_red = read.item("km:minus_red", 1, "§rAuszahlung");
+inv.setItem(bankmenu, 0, plus_green);
+inv.setItem(bankmenu, 1, coin_copper);
+inv.setItem(bankmenu, 2, coin_silver);
+inv.setItem(bankmenu, 3, coin_gold);
+inv.setItem(bankmenu, 4, coin_copper64);
+inv.setItem(bankmenu, 5, arrow_left);
+inv.setItem(bankmenu, 6, arrow_right);
+inv.setItem(bankmenu, 7, coin_silver);
+inv.setItem(bankmenu, 8, minus_red);
+inv.setItem(bankmenu, 9, coin_copper);
+inv.setItem(bankmenu, 10, coin_silver);
+inv.setItem(bankmenu, 11, coin_gold);
+inv.setItem(bankmenu, 12, coin_silver64);
+inv.setItem(bankmenu, 13, arrow_left);
+inv.setItem(bankmenu, 14, arrow_right);
+inv.setItem(bankmenu, 15, coin_gold);
+
+pvp_set = getScriptVar("pvp_set");
+if(pvp_set == null) {
+	pvp_set = set.new();
+	setScriptVar("pvp_set", pvp_set);
+} else {
+	//Alle Spieler, die PvP an hatten, wieder registrieren
+	iter = set.iterator(pvp_set);
+	while(hasNext(iter)) {
+		player = player.get(next(iter));
+		if(player != null) {
+			setPvp(player, "on");
+		}
+	}
+}
+
+//Minecraft-Zeit auf Real-Zeit syncen
+calendar = time.new(time.getMillis());
+min = time.getMinute(calendar);
+sec = time.getSecond(calendar);
+while(min >= 20) {
+	min -= 20;
+}
+real_time = min * 60 + sec;
+new_time = real_time * 24000 / 1200;
+world.setTime(world.get("overworld"), new_time);
+
+sgoto(1200, "timerloop");
+
+msg("dev", "§bSurvival §rwurde geladen");
+@wait
+wait();
+if(event == "player_move") {
+	if(id == moveidsurvival) {
+		teleportPlayer(player, survival_spawn, false);
+	}
+	goto("wait");
+}
+//Wenn Event aus Survival-Welten, dann wird er verarbeitet
+if(event == "living_death" || event == "living_drop" || event == "living_pre_hurt" || event == "living_experience_drop") {
+	loc = entity.getLocation(living_entity);
+} elseif(event == "block_drop") {
+	loc = location;
+} elseif(event == "entity_mount") {
+	loc = entity.getLocation(rider);
+} else {
+	loc = entity.getLocation(player);
+}
+world_name = world.getName(loc.getWorld(loc));
+if(isSurvWorldName(world_name)) {
+	ignoreGoto(event);
+}
+goto("wait");
+
+@player_toss
+target_loc = player.getTarget(player, 5);
+block_type = block.getType(target_loc);
+if(block_type == "minecraft:lectern") {
+	cancel = true;
+	item.entity.spawn(item.entity.new(loc.mod(target_loc, 0.5, 1.5, 0.5), item));
+}
+goto("wait");
+
+@player_login
+onadventure = ggv(player, "onadventure");
+if(onadventure != null) {
+	if(onadventure) {
+		addAdventureDisplay(player, adventure_aim_loc);
+	}
+}
+goto("wait");
+
+@living_pre_hurt
+if(!isPlayer(living_entity)) {
+	goto("wait");
+}
+player = living_entity;
+damager = getPlayerFromDamageSource(damage_source);
+if(!isPlayer(damager)) {
+	goto("wait");
+}
+if(player == damager) {
+	goto("wait");
+}
+if(!hasPvpOn(damager)) {
+	cancel = true;
+	player.speak(damager, "§5PvP", "Du hast Pvp aus.");
+	goto("wait");
+}
+if(!hasPvpOn(player)) {
+	cancel = true;
+	player.speak(damager, "§5PvP", player.getName(player), " hat Pvp aus.");
+	goto("wait");
+}
+goto("wait");
+
+@entity_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(entity.getType(entity) == "human") {
+	entity_name = entity.getName(entity);
+	if(entity_name == bank_human_name) {
+		inv.open(bankmenu, player, "Bänker");
+		goto("wait");
+	}
+	if(entity_name == adv_human_name) {
+		onadventure = ggv(player, "onadventure");
+		if(onadventure == null) {
+			player.speak(player, "§5Adventure", "§rDu bist auf keinem Abenteuer.");
+			goto("wait");
+		}
+		if(!onadventure) {
+			player.speak(player, "§5Adventure", "§rDu bist auf keinem Abenteuer.");
+			goto("wait");
+		}
+		sgv(player, "onadventure", "false");
+		adventures = ggv(player, "adventures");
+		if(adventures == null) {
+			adventures = 0;
+		}
+		sgv(player, "adventures", ++adventures);
+		player.speak(player, "§5Adventure", "§rGlückwunsch, du hast dein Abenteuer beendet. Hier hast du deine Belohnung!");
+		if(adventures >= 1) {
+			offerRank(player, "§6Entdecker");
+		}
+		if(adventures >= 10) {
+			offerRank(player, "§2Pionier");
+		}
+		removeAdventureDisplay(player);
+		safeGiveItemPlayer(player, coin_silver);
+		goto("wait");
+	}
+}
+goto("wait");
+
+@player_logout
+setAfk(player, false);
+setPvp(player, "off");
+goto("wait");
+
+@player_login
+joinSurvWorld(player);
+goto("wait");
+
+@inv_click
+cancel = true;
+if(inv_id == bankinvid) { //Bankmenü
+	gold_inv = player.getItemAmount(player, true, coin_gold);
+	silver_inv = player.getItemAmount(player, true, coin_silver);
+	copper_inv = player.getItemAmount(player, true, coin_copper);
+	//Wechseln
+	if(inv_slot == 5 || inv_slot == 6 || inv_slot == 13 || inv_slot == 14)  {
+		if(inv_slot == 5) {
+			//1 Silbermünze --> 64 Kupfermünzen
+			amount1 = 1;
+			item1 = coin_silver;
+			amount2 = 64;
+			item2 = coin_copper64;
+			message = "Keine Silbermünze im Inventar.";
+			item_type = "km:coin_copper";
+			coin_inv = silver_inv;
+		}
+		elseif(inv_slot == 6) {
+			//64 Kupfermünzen --> 1 Silbermünze
+			amount1 = 64;
+			item1 = coin_copper64;
+			amount2 = 1;
+			item2 = coin_silver;
+			message = "Nicht genug Kupfermünzen im Inventar.";
+			item_type = "km:coin_silver";
+			coin_inv = copper_inv;
+		}
+		elseif(inv_slot == 13) {
+			//1 Goldmünze --> 64 Silbermünzen
+			amount1 = 1;
+			item1 = coin_gold;
+			amount2 = 64;
+			item2 = coin_silver64;
+			message = "Keine Goldmünze im Inventar.";
+			item_type = "km:coin_silver";
+			coin_inv = gold_inv;
+		}
+		elseif(inv_slot == 14) {
+			//64 Silbermünzen --> 1 Goldmünze
+			amount1 = 64;
+			item1 = coin_silver64;
+			amount2 = 1;
+			item2 = coin_gold;
+			message = "Nicht genug Silbermünzen im Inventar.";
+			item_type = "km:coin_gold";
+			coin_inv = silver_inv;
+		}
+		if(coin_inv < amount1) {
+			player.speak(player, money_präfix, message);
+			goto("wait");
+		}
+		player.removeItem(player, item1);
+		notgiven = player.giveItem(player, item2);
+		if(item.getType(notgiven) != "minecraft:air") {
+			amount = item.getAmount(notgiven);
+			player.removeItem(player, read.item(item_type, amount2 - amount));
+			player.giveItem(player, item1);
+			player.speak(player, money_präfix, "Nicht genug Platz im Inventar.");
+			goto("wait");
+		}
+		inv.update(player);
+		player.speak(player, money_präfix, "Wechseln erfolgreich.");
+		goto("wait");
+	}
+	//Kontobewegungen
+	if(inv_slot == 1 || inv_slot == 9) {
+		betrag = 1;
+		coin_inv = copper_inv;
+	}
+	elseif(inv_slot == 2 || inv_slot == 10) {
+		betrag = 64;
+		coin_inv = silver_inv;
+	}
+	elseif(inv_slot == 3 || inv_slot == 11) {
+		betrag = 4096;
+		coin_inv = gold_inv;
+	}
+	//Einzahlen
+	if(inv_slot > 0 && inv_slot < 4) {
+		player_id = player.getId(player);
+		if(coin_inv < 1) {
+			player.speak(player, money_präfix, "§rMünze nicht im Inventar.");
+		} else {
+			addSurvMoney(player, betrag);
+			player.removeItem(player, inv.getItem(bankmenu, inv_slot));
+			inv.update(player);
+			player.speak(player, money_präfix, "§rTransaktion erfolgreich.");
+		}
+		goto("wait");
+	}
+	//Auszahlen
+	if(inv_slot > 8 && inv_slot < 12) {
+		player_id = player.getId(player);
+		if(!hasEnoughMoney(player_id, moneyname, betrag)) {
+			player.speak(player, money_präfix, "§rNicht genug Gold am Konto.");
+		} else {
+			subSurvMoney(player, betrag);
+			player.giveItem(player, inv.getItem(bankmenu, inv_slot));
+			inv.update(player);
+			player.speak(player, money_präfix, "§rTransaktion erfolgreich.");
+		}
+		goto("wait");
+	}
+	goto("wait");
+}
+goto("wait");
+
+@block_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(block.hasTag(stairs_tag, block)) {
+	goto("sitting");
+}
+if(block_type == "minecraft:lectern") {
+	if(action == "right") {
+		itementity = entity.get(loc.mod(block_loc, 0.5, 0.9, 0.5), 0.2, "net.minecraft.entity.item.ItemEntity");
+		if(itementity == null) {
+			goto("wait");
+		}
+		list = entity.near(itementity, 0.2);
+		list.add(list, itementity);
+		if(list.getSize(list) < 2) {
+			//Zu wenig Items am Lesepult
+			goto("wait");
+		}
+		a = array.new(2, 6); //0 = item, 1 = itementity, 2 = enchantments, 3 = enchanted, 4 = enchanted_book, 5 = book
+		size = 0;
+		for(i = 0; i < list.getSize(list); i++) {
+			entity = list.getIndex(list, i);
+			item = item.entity.get(entity);
+			size += item.getAmount(item);
+			if(size > 2) {
+				//Zu viele Items am Lesepult
+				goto("wait");
+			}
+			map = enchantment.readFromItem(item);
+			a[i, 0] = item;
+			a[i, 1] = entity;
+			a[i, 2] = map;
+			a[i, 4] = false;
+			a[i, 5] = false;
+			if(map.getSize(map) > 0) {
+				//Verzauberte Items
+				a[i, 3] = true;
+				if(item.getType(item) == "minecraft:enchanted_book") {
+					a[i, 4] = true;
+				}
+			} else {
+				//Nicht verzauberte Items
+				a[i, 3] = false;
+				if(item.getType(item) == "minecraft:book") {
+					a[i, 5] = true;
+				}
+			}
+		}
+		lectern_action = null;
+		if(a[0, 4] == true && a[1, 4] == true) {
+			//Beide Items sind verzauberte Bücher
+			lectern_action = 0;
+		}
+		elseif(a[0, 5] == true || a[1, 5] == true) {
+			//Eines der beiden Items ist ein normales Buch
+			if(a[0, 4] == true || a[1, 4] == true) {
+				//Eines der beiden Items ist ein verzaubertes Buch
+				lectern_action = 1;
+			} elseif(a[0, 3] == true || a[1, 3] == true) {
+				//Eines der beiden Items ist ein verzaubertes Item
+				lectern_action = 2;
+			}
+		}
+		elseif(a[0, 4] == true || a[1, 4] == true) {
+			lectern_action = 3;
+		}
+		if(lectern_action == null) {
+			goto("wait");
+		}
+		
+		if(lectern_action == 0) {
+			//Verzauberungsbücher mergen
+			item1 = a[0, 0];
+			item_entity1 = a[0, 1];
+			item_entity2 = a[1, 1];
+			map1 = a[0, 2];
+			map2 = a[1, 2];
+			map_size1 = map.getSize(map1);
+			map_size2 = map.getSize(map2);
+			iter = map.iterator(map2);
+			betrag = 0;
+			extra = 0;
+			while(hasNext(iter)) {
+				element = next(iter);
+				key = map.getKey(element);
+				level1 = map.getValue(element);
+				level2 = map.getOrDefault(map1, key, 0);
+				if(level1 == level2) {
+					max_lvl = map.get(max_ench_lvl, key);
+					//max_lvl = map.getOrDefault(max_ench_lvl, key, enchantment.getMaxLevel(key));
+					if(max_lvl != null) {
+						if(level1 < max_lvl) {
+							extra += 40;
+							level1++;
+						}
+					}
+				}
+				if(level2 > level1) {
+					level1 = level2;
+				}
+				map.add(map1, key, level1);
+			}
+			if(map_size1 > map_size2) {
+				map = map1;
+			} else {
+				map = map2;
+			}
+			iter = map.iterator(map);
+			while(hasNext(iter)) {
+				element = next(iter);
+				level = map.getValue(element);
+				betrag += level * 20 + extra;
+			}
+			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
+				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
+				goto("wait");
+			}
+			subSurvMoney(player, betrag);
+			
+			enchantment.writeToItem(map1, item1);
+			item.entity.set(item_entity1, item.clone(item1));
+			entity.remove(item_entity2);
+		} elseif(lectern_action == 1) {
+			//Verzauberungsbuch kopieren
+			if(a[0, 5]) {
+				book_index = 0;
+				other_index = 1;
+			} else {
+				book_index = 1;
+				other_index = 0;
+			}
+			item1 = a[book_index, 0];
+			item_entity1 = a[book_index, 1];
+			item2 = a[other_index, 0];
+			item_entity2 = a[other_index, 1];
+			map2 = a[other_index, 2];
+			
+			map_size = map.getSize(map2);
+			betrag = 20 * map_size;
+			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
+				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
+				goto("wait");
+			}
+			subSurvMoney(player, betrag);
+			
+			item1 = read.item("minecraft:enchanted_book");
+			enchantment.writeToItem(map2, item1);
+			item.entity.set(item_entity1, item1);
+			item.entity.set(item_entity2, item.clone(item2));
+		} elseif(lectern_action == 2) {
+			//Einzelne Verzauberung herunterziehen
+			if(a[0, 5]) {
+				book_index = 0;
+				other_index = 1;
+			} else {
+				book_index = 1;
+				other_index = 0;
+			}
+			item_entity1 = a[book_index, 1];
+			map1 = map.new();
+			item2 = a[other_index, 0];
+			item_entity2 = a[other_index, 1];
+			map2 = a[other_index, 2];
+
+			item1 = read.item("minecraft:enchanted_book");
+			element = next(map.iterator(map2));
+			key = map.getKey(element);
+			value = map.getValue(element);
+			map.add(map1, key, value);
+			map.remove(map2, key);
+			
+			betrag = 20 * value;
+			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
+				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
+				goto("wait");
+			}
+			subSurvMoney(player, betrag);
+			
+			enchantment.writeToItem(map1, item1);
+			enchantment.writeToItem(map2, item2);
+			item.entity.set(item_entity1, item1);
+			item.entity.set(item_entity2, item.clone(item2));
+		} elseif(lectern_action == 3) {
+			//Alle Verzauberungen vom Buch auf das Item übertragen
+			betrag = 0;
+			if(a[0, 4]) {
+				ench_book_index = 0;
+				other_index = 1;
+			} else {
+				ench_book_index = 1;
+				other_index = 0;
+			}
+			item1 = a[ench_book_index, 0];
+			item_entity1 = a[ench_book_index, 1];
+			map1 = a[ench_book_index, 2];
+			item2 = a[other_index, 0];
+			item_entity2 = a[other_index, 1];
+			map2 = a[other_index, 2];
+			map_size1 = map.getSize(map1);
+			map_size2 = map.getSize(map2);
+			
+			iter = map.iterator(map1);
+			while(hasNext(iter)) {
+				element = next(iter);
+				key = map.getKey(element);
+				value = map.getValue(element);
+				value2 = map.getOrDefault(map2, key, 0);
+				if(value2 > value) {
+					value = value2;
+				}
+				map.add(map2, key, value);
+			}
+			
+			if(map_size1 > map_size2) {
+				map = map1;
+			} else {
+				map = map2;
+			}
+			iter = map.iterator(map);
+			while(hasNext(iter)) {
+				element = next(iter);
+				level = map.getValue(element);
+				betrag += level * 20;
+			}
+			if(!hasEnoughMoney(player.getId(player), moneyname, betrag)) {
+				player.speak(player, money_präfix, concat("§rNicht genug Gold am Konto. Die Aktion kostet ", text.number(betrag), " Gold."));
+				goto("wait");
+			}
+			subSurvMoney(player, betrag);
+			
+			enchantment.writeToItem(map2, item2);
+			item.entity.set(item_entity2, item.clone(item2));
+			entity.remove(item_entity1);
+			
+		}
+		entity.throw(item_entity1, 0, 0.3, 0);
+		entity.throw(item_entity2, 0, 0.3, 0);
+		particle.spawn(loc.mod(block_loc, 0.5, 1.4, 0.5), par, 20, 0, 0.25, 0.25, 0.25);
+		player.speak(player, money_präfix, "Das hat 20 Gold gekostet.");
+	}
+	goto("wait");
+}
+if(block_type == "minecraft:chest") {
+	if(isATpReceiver(block_loc)) {
+		tp_item = read.item("km:gear", 1, "§rTeleport");
+		list = list.new();
+		list.add(list, world.getName(loc.getWorld(block_loc)));
+		list.add(list, text.number(loc.getX(block_loc)));
+		list.add(list, text.number(loc.getY(block_loc)));
+		list.add(list, text.number(loc.getZ(block_loc)));
+		item.setLore(tp_item, list);
+		player.giveItem(player, tp_item);
+		goto("wait");
+	}
+	if(isATpTransmitter(block_loc)) {
+		player_uuid = player.getUuid(player);
+		clicked = map.getOrDefault(tp_map, player_uuid, 0);
+		now_time = time.getMillis();
+		if(now_time - clicked < 5000) {
+			player.speak(player, "§jTeleport", "Warte 5 Sekunden!");
+			goto("wait");
+		}
+		map.add(tp_map, player_uuid, now_time);
+		//Abenteuer-Teleport
+		if(block_loc == adventure_chest_loc) {
+			onadventure = ggv(player, "onadventure");
+			if(onadventure != null) {
+				if(!onadventure) {
+					alpha = math.random(0, 360);
+					alpha *= math.pi() / 180;
+					x = math.sin(alpha) * 8000 + 0.5;
+					z = math.cos(alpha) * 8000 + 0.5;
+					y = 255;
+					overworld = world.get("overworld");
+					tp_loc = loc.new(overworld, x, y, z);
+					loc.setY(tp_loc, y);
+					while(!block.isSolid(tp_loc)) {
+						loc.setY(tp_loc, y--);
+					}
+					loc.setY(tp_loc, y++);
+					wall_type = "minecraft:lime_stained_glass";
+					setWalls(block_loc, wall_type);
+					sound.spawn(block_loc, piston_sound, sound_category_ambient);
+					array = array.new(4);
+					array[0] = player;
+					array[1] = block_loc;
+					array[2] = tp_loc;
+					array[3] = true;
+					list.add(tp_list, array);
+					sgoto(30, "tp_ticker");
+				}
+			}
+			goto("wait");
+		}
+		//Normaler Teleport
+		
+		temp = false;
+		inv = block.getInv(block_loc);
+		inv_size = inv.getSize(inv);
+		for(i = 0; i < inv_size; i++) {
+			item = inv.getItem(inv, i);
+			if(item.getType(item) == "km:gear") {
+				if(item.getName(item) == "§rTeleport") {
+					temp = true;
+					break;
+				}
+			}
+		}
+		if(!temp) {
+			goto("wait");
+		}
+		
+		lore_list = item.getLore(item);
+		if(list.getSize(lore_list) != 4) {
+			goto("wait");
+		}
+		world = world.get(list.getIndex(lore_list, 0));
+		x = read.number(list.getIndex(lore_list, 1));
+		y = read.number(list.getIndex(lore_list, 2));
+		z = read.number(list.getIndex(lore_list, 3));
+		tp_loc = loc.new(world, x, y, z);
+		if(!isATpReceiver(tp_loc)) {
+			goto("wait");
+		}
+		loc.add(tp_loc, 0.5, -3, 0.5);
+		
+		wall_type = "minecraft:lime_stained_glass";
+		setWalls(block_loc, wall_type);
+		sound.spawn(block_loc, piston_sound, sound_category_ambient);
+		array = array.new(4);
+		array[0] = player;
+		array[1] = block_loc;
+		array[2] = tp_loc;
+		array[3] = false;
+		list.add(tp_list, array);
+		sgoto(30, "tp_ticker");
+		goto("wait");
+	}
+}
+goto("wait");
+
+@sitting
+if(action == "left") {
+	goto("wait");
+}
+if(block.getState(block_loc, half_property) != "bottom") {
+	goto("wait");
+}
+if(item.getType(entity.getEquip(player, "hand")) != "minecraft:air") {
+	goto("wait");
+}
+if(!loc.isAir(loc.mod(block_loc, 0, 1, 0))) {
+	goto("wait");
+}
+if(map.contains(sitting, player)) {
+	goto("wait");
+}
+entity = entity.spawn("km:nobody", loc.mod(block_loc, 0.5, 0, 0.5), "{NoGravity:true}");
+map.add(sitting, player, entity);
+entity.mount(player, entity);
+goto("wait");
+
+@living_drop
+if(isPlayer(living_entity)) {
+	goto("wait");
+}
+size = list.getSize(drops);
+for(i = 0; i < size; i++) {
+	item_entity = list.getIndex(drops, i);
+	item = item.entity.get(item_entity);
+	if(item.getMaxAmount(item) > 1) {
+		item.setAmount(item, item.getAmount(item) * 2);
+	}
+}
+goto("wait");
+
+@living_death
+if(isPlayer(living_entity)) {
+	player = living_entity;
+	loc = entity.getLocation(player);
+	player.dropInventory(player, loc);
+	killer = getPlayerFromDamageSource(damage_source);
+	if(isPlayer(killer)) {
+		if(perm.has(player, "isTeam")) {
+			temp = math.random(1, 200);
+		} else {
+			temp = math.random(1, 20);
+		}
+		if(temp == 1) {
+			item.drop(loc, player.getHead(player.getUuid(player), player_name));
+		}
+	}
+}
+goto("wait");
+
+@block_drop
+if(player == null || item == null) {
+	goto("wait");
+}
+if(!block.hasTag(crops_tag, block)) {
+	goto("wait");
+}
+if(!item.hasTag(hoe_tag, item)) {
+	goto("wait");
+}
+for(i = 0; i < list.getSize(drops); i++) {
+	drop_item = list.getIndex(drops, i);
+	if(set.contains(auto_farm_set, item.getType(drop_item))) {
+		amount = item.getAmount(drop_item);
+		if(amount > 0) {
+			item.setAmount(drop_item, amount - 1);
+		}
+	}
+}
+block.set(location, concat(block_type, "[age=0]"));
+player.damageItem(player, 1);
+goto("wait");
+
+@entity_mount
+if(isPlayer(rider)) {
+	player = rider;
+	if(map.contains(sitting, player)) {
+		entity.remove(map.get(sitting, player));
+		map.remove(sitting, player);
+	}
+}
+goto("wait");
+
+@player_post_respawn
+onadventure = ggv(player, "onadventure");
+if(onadventure != null) {
+	if(onadventure) {
+		tploc = read.location(ggv(player, "adventureloc"));
+		entity.teleport(player, tploc);
+	}
+}
+//player.setLevel(player, 0);
+//player.setExp(player, 0);
+//player.addTotalExp(player, original_experience);
+goto("wait");
+
+@tp_ticker
+array = list.getIndex(tp_list, 0);
+list.removeIndex(tp_list, 0);
+block_loc = array[1];
+list.add(tp_list, array);
+sound.spawn(block_loc, piston_sound, sound_category_ambient);
+sgoto(30, "tp_final");
+goto("wait");
+
+@tp_final
+array = list.getIndex(tp_list, 0);
+list.removeIndex(tp_list, 0);
+player = array[0];
+block_loc = array[1];
+tp_loc = array[2];
+bool = array[3];
+sound.spawn(block_loc, piston_sound, sound_category_ambient);
+setWalls(block_loc, "minecraft:air");
+teleportPlayer(player, tp_loc, false);
+if(bool) {
+	sgv(player, "onadventure", "true");
+	sgv(player, "adventureloc", text.location(tp_loc));
+	addAdventureDisplay(player, adventure_aim_loc);
+	title.reset(player);
+	title.setSub(player, "Have fun!");
+	title.send(player, "§cAdventure");
+	player.speak(player, "§5Adventure", "§rLaufe zum Survival-Spawn um dein Abenteuer zu beenden. Du kannst dich nicht teleportieren. Stirbst du, startest du wieder von vorne!");
+	offerRank(player, "§eAbenteurer");
+}
+goto("wait");
+
+@timerloop //Minutentakt. Code ausführen, wenn eine bestimmte Uhrzeit überschritten wurde
+now_time = time.getMillis();
+now_cal = time.new(now_time);
+now_day = time.getDay(now_cal);
+now_min = time.getMinute(now_cal);
+now_sec = time.getSecond(now_cal);
+//Tagesanzeige
+if(now_min == 0 || now_min == 20 || now_min == 40) {
+	day = list.getIndex(days_list, day_index);
+	message = concat("§9Es ist der Tag ", day, " angebrochen!");
+	sendMessageToWorld(world.get("overworld"), message);
+	if(day_index == 6) {
+		day_index = 0;
+	} else {
+		day_index++;
+	}
+}
+//Timer auf volle Minuten synchronisieren
+time = (60 - now_sec) * 20;
+sgoto(time, "timerloop");
+goto("wait");

+ 2 - 12
system/chat.txt

@@ -1,7 +1,6 @@
 event.load("chat");
 event.load("player_login");
 event.load("player_logout");
-event.load("living_hurt");
 event.load("living_death");
 
 cookie_time = 0;
@@ -12,7 +11,6 @@ executeOnce = databank.prepare("CREATE TABLE IF NOT EXISTS chatranks (player_id
 databank.workerExecute(executeOnce);
 
 forbiddennames = list.new();
-list.add(forbiddennames, "all");
 list.add(forbiddennames, "dev");
 list.add(forbiddennames, "ok");
 list.add(forbiddennames, "admin");
@@ -51,7 +49,6 @@ list.add(leavemeassages, concat(" has left the thick world."));
 list.add(leavemeassages, concat(" came, saw and won."));
 list.add(leavemeassages, concat(" faded in the face of copper."));
 
-damagecauses = map.new();
 nomessageworlds = list.new();
 list.add(nomessageworlds, world.get("games"));
 
@@ -80,7 +77,7 @@ map.add(causetolist, "player", list.new());
 msg("dev", "§bChat §rwurde geladen");
 @wait
 wait();
-if(event == "living_death" || event == "living_hurt") {
+if(event == "living_death") {
 	if(!isPlayer(living_entity)) {
 		goto("wait");
 	}
@@ -213,19 +210,12 @@ if(perm.has(player, "color")) {
 sendOnlineMessage(text.hover(concat(colorcode, nickname), rank), message);
 goto("wait");
 
-@living_hurt
-world = loc.getWorld(entity.getLocation(player));
-if(!list.contains(nomessageworlds, world)) {
-	map.add(damagecauses, player.getUuid(player), damage.getType(damage_source));
-}
-goto("wait");
-
 @living_death
 world = loc.getWorld(entity.getLocation(player));
 if(list.contains(nomessageworlds, world)) {
 	goto("wait");
 }
-damage_type = map.get(damagecauses, player.getUuid(player));
+damage_type = damage.getType(damage_source);
 list = map.getOrDefault(causetolist, damage_type, defaultdeaths);
 if(damage_type == "player") {
 	killer = getPlayerFromDamageSource(damage_source);

+ 50 - 73
system/commands.txt

@@ -49,7 +49,7 @@ command.register("hat", "Setzt ein Item auf den Kopf");
 command.register("head", "Gibt einen Spielerkopf ins Inventar");
 command.register("heal", "Leben auffüllen/Hunger stillen/Effekte entfernen");
 command.register("home", "Home-Befehle");
-command.register("hub", "Aus einem Minigame leaven");
+command.register("leave", "Aus einem Minigame leaven");
 command.register("human", "Human-Befehle");
 command.register("invignore", "Inventar bei Weltwechsel (nicht) behalten");
 command.register("invsee", "Zeigt das Inventar eines Spielers");
@@ -155,6 +155,10 @@ command.registerAlias("coord", "coords");
 command.registerAlias("dt", "datatools");
 command.registerAlias("f", "friend");
 command.registerAlias("suicide", "kill");
+command.registerAlias("l", "leave");
+command.registerAlias("giveup", "leave");
+command.registerAlias("fuckit", "leave");
+command.registerAlias("hub", "leave");
 
 open_prop = block.getproperty("open");
 crops_tag = block.getTag("minecraft:crops");
@@ -360,7 +364,7 @@ if(event == "custom_command") {
 	}
 	affectedname = player_name;
 	affectedplayer = player;
-	if(command != "hub") {
+	if(command != "leave") {
 		tjr = ggv(player, "tjr");
 		if(tjr != null) {
 			if(tjr) {
@@ -369,7 +373,7 @@ if(event == "custom_command") {
 			}
 		}
 	}
-	if(command != "hub") {
+	if(command != "leave") {
 		jr = ggv(player, "jr");
 		if(jr != null) {
 			if(jr) {
@@ -842,7 +846,7 @@ if(size == 1) {
 		goto("wait");
 	}
 }
-if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+if(player.hasMinigame(affectedplayer)) {
 	if(size == 1) {
 		msg(player, "§rDer Spieler ist an ein Script gebunden");
 	} else {
@@ -2071,7 +2075,7 @@ if(size == 1) {
 		goto("wait");
 	}
 }
-if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+if(player.hasMinigame(affectedplayer)) {
 	if(size == 1) {
 		msg(player, "§rDer Spieler ist an ein Script gebunden");
 	} else {
@@ -2112,7 +2116,7 @@ if(size == 1) {
 		goto("wait");
 	}
 }
-if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+if(player.hasMinigame(affectedplayer)) {
 	if(size == 1) {
 		msg(player, "§rDer Spieler ist an ein Script gebunden");
 	} else {
@@ -4333,7 +4337,7 @@ elseif(size == 2) {
 		goto("wait");
 	}
 }
-if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+if(player.hasMinigame(affectedplayer)) {
 	if(size == 2) {
 		msg(player, "§rDer Spieler ist an ein Script gebunden");
 	} else {
@@ -4739,7 +4743,7 @@ if(size == 5) {
 		goto("wait");
 	}
 }
-if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+if(player.hasMinigame(affectedplayer)) {
 	if(size == 5) {
 		msg(player, "§rDer Spieler ist an ein Script gebunden");
 	} else {
@@ -4760,7 +4764,7 @@ if(size > 0) {
 	player.speak(player, "§6Commands", "/back");
 	goto("wait");
 }
-if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+if(player.hasMinigame(affectedplayer)) {
 	msg(player, "§rDu bist an ein Script oder Minigame gebunden.");
 	goto("wait");
 }
@@ -4848,7 +4852,7 @@ if(size == 1) {
 		goto("wait");
 	}
 }
-if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+if(player.hasMinigame(affectedplayer)) {
 	if(size == 1) {
 		msg(player, "§rDer Spieler ist an ein Script gebunden");
 	} else {
@@ -4955,7 +4959,7 @@ if(size > 0 && size < 4) {
 					goto("wait");
 				}
 			}
-			if(player.hasScript(affectedplayer) || player.hasMinigame(affectedplayer)) {
+			if(player.hasMinigame(affectedplayer)) {
 				if(size == 3) {
 					msg(player, "§rDer Spieler ist an ein Script gebunden");
 				} else {
@@ -5077,24 +5081,22 @@ msg(player, "§t - setspawn §rSetzt den Welten-Spawn");
 msg(player, "§t - diffi <world> <diffi> §rSetzt die Schwierigkeit");
 goto("wait");
 
-@hub
-if(command == "hub") {
-	set = player.getMinigameIds(player);
-	iter = set.iterator(set);
-	if(hasNext(iter)) {
-		script_id = next(iter);
-		script = script.getFromId(script_id);
-		if(script == null) {
-			msg("dev", "Should not happen. Error on /hub ", set);
-			player.resetMinigames(player);
-			entity.teleport(player, gamesspawn);
-			goto("wait");
-		}
-		minigame.hub(script, player);
+@leave
+set = player.getMinigameIds(player);
+iter = set.iterator(set);
+if(hasNext(iter)) {
+	script_id = next(iter);
+	script = script.getFromId(script_id);
+	if(script == null) {
+		msg("dev", "Should not happen. Error on /leave ", set);
+		player.resetMinigames(player);
+		entity.teleport(player, gamesspawn);
 		goto("wait");
 	}
-	player.speak(player, "§dScript", "Du bist in keinem Minigame.");
+	minigame.hub(script, player);
+	goto("wait");
 }
+player.speak(player, "§dScript", "Du bist in keinem Minigame.");
 goto("wait");
 
 function minigame.hub(script, player) {
@@ -5297,7 +5299,6 @@ function setCommandHelps() {
 	addCommandHelp("tptoggle");
 	addCommandHelp("top");
 	addCommandHelp("showtables");
-	addCommandHelp("hub");
 	
 	addCommandHelpChildPlayer("tpa");
 	addCommandHelpChildPlayer("tpaccept");
@@ -5309,16 +5310,21 @@ function setCommandHelps() {
 	addCommandHelpChildPlayer("heal");
 	addCommandHelpChildPlayer("feed");
 	
-	addCommandAlias("colour", "color");
-	addCommandAlias("itemdb", "iteminfo");
-	addCommandAlias("leave", "giveup");
-	addCommandAlias("skull", "head");
-	addCommandAlias("l", "giveup");
-	addCommandAlias("fuckit", "giveup");
-	addCommandAlias("ineedhelp", "giveup");
+	help = addCommandHelp("color");
+	addCommandAlias(help, "colour", "color");
+	help = addCommandHelp("iteminfo");
+	addCommandAlias(help, "itemdb", "iteminfo");
+	help = addCommandHelp("head");
+	addCommandAlias(help, "skull", "head");
 	
 	addCommandHelpChildBool("door", "wusi");
 	
+	help = addCommandHelp("leave");
+	addCommandAlias(help, "l", "leave");
+	addCommandAlias(help, "giveup", "leave");
+	addCommandAlias(help, "fuckit", "leave");
+	addCommandAlias(help, "hub", "leave");
+	
 	help = command.newHelp("start", "start");
 	command.addHelpChild(help, command.newHelpLiteral("chat"));
 	command.addHelpChild(help, command.newHelpLiteral("commands"));
@@ -5354,10 +5360,7 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player", "gamemode.other"));
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("gm", "gamemode");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "gm", "gamemode");
 	
 	waitfor(1);
 	
@@ -5462,10 +5465,7 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg0, helpArg1);
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("dt", "datatools");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "dt", "datatools");
 	
 	help = command.newHelp("voxel", "voxel");
 	command.addHelpChild(help, command.newHelpInt("radius", 1, 5));
@@ -5474,18 +5474,12 @@ function setCommandHelps() {
 	help = command.newHelp("help", "help");
 	command.addHelpChild(help, command.newHelpInt("page", 1, 100));
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("mimimi", "help");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "mimimi", "help");
 	
 	help = command.newHelp("kill", "kill");
 	command.addHelpChild(help, command.newHelpSpecial("Player", "player", "kill.other"));
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("suicide", "kill");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "suicide", "kill");
 	
 	help = command.newHelp("tempban", "tempban");
 	helpArg0 = command.newHelpSpecial("Player", "player");
@@ -5578,10 +5572,7 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg0, command.newHelpInt("id", 0, 10000));
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("s", "script");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "s", "script");
 	
 	help = command.newHelp("home", "home");
 	//home set
@@ -5645,10 +5636,7 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg0, command.newHelpInt("anzahl", 1, 1000));
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("p", "plot");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "p", "plot");
 	
 	help = command.newHelp("warp", "warp");
 	//warp set
@@ -5676,10 +5664,7 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "to-player", "teleport.other"));
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("tp", "teleport");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "tp", "teleport");
 	
 	help = command.newHelp("lastseen", "lastseen");
 	command.addHelpChild(help, command.newHelpInt("amount", 1, 100));
@@ -5784,10 +5769,7 @@ function setCommandHelps() {
 	//friend list
 	command.addHelpChild(help, command.newHelpLiteral("list"));
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("f", "friend");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "f", "friend");
 	
 	help = command.newHelp("sign", "sign");
 	helpArg0 = command.newHelpInt("1-4", 1, 4);
@@ -5920,10 +5902,7 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player"));
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
-	//Alias
-	helpAlias = command.newHelp("tip", "tipp");
-	command.addHelpAlias(helpAlias, help);
-	command.addHelp(helpAlias);
+	addCommandAlias(help, "tip", "tipp");
 	
 	//shop create <buyprice> <sellprice>
 	helpArg0 = command.newHelpLiteral("create");
@@ -6014,9 +5993,7 @@ function addCommandHelpChildBool(command, arg0) {
 	return;
 }
 
-function addCommandAlias(alias, command) {
-	help = command.newHelp(command, command);
-	command.addHelp(help);
+function addCommandAlias(help, alias, command) {
 	helpAlias = command.newHelp(alias, command);
 	command.addHelpAlias(helpAlias, help);
 	command.addHelp(helpAlias);

+ 2 - 2
system/damage.txt

@@ -3,7 +3,7 @@
 event.load("custom_command");
 event.load("function_key");
 event.load("living_hurt");
-event.load("living_is_attacked");
+event.load("living_pre_hurt");
 event.load("player_move");
 event.load("player_data_tick");
 event.load("item_hit");
@@ -407,7 +407,7 @@ if(var == "Wiederherstellung") {
 }
 goto("wait");
 
-@living_is_attacked
+@living_pre_hurt
 sec_player = getPlayerFromDamageSource(damage_source);
 if(isPlayer(living_entity)) {
 	player = living_entity;

+ 4 - 8
system/svars.txt

@@ -1,6 +1,6 @@
 @simplelobby
 wait();
-if(event == "living_is_attacked") {
+if(event == "living_pre_hurt") {
 	if(!isPlayer(living_entity)) {
 		goto("simplelobby");
 	}
@@ -161,7 +161,7 @@ function minigame.loadLobbyEvents() {
 	event.load("block_break");
 	event.load("block_place");
 	event.load("block_click");
-	event.load("living_is_attacked");
+	event.load("living_pre_hurt");
 	event.load("custom_command");
 }
 
@@ -488,12 +488,8 @@ function player.hasMinigameId(player, script_id) {
 }
 
 function minigame.term(script, gamesignloc) {
-	//new new new new new new new new new new new new new new new new new new
 	setScriptVar("sign_loc", gamesignloc);
-	//script.callEvent("term_script");
-	//old old old old old old old old old old old old old old old old old old
-	gamecenter_script = script.get("scripts/global/gamecenter.txt");
-	script.callEvent("term_script", gamecenter_script);
+	script.callEvent("term_script");
 	sign.ready(gamesignloc);
 	script.term(script);
 }
@@ -569,4 +565,4 @@ function sign.closed(sign_loc) {
 
 function minigame.isStarted(sign_loc) {
 	return block.getSign(sign_loc, 3) == "§bStarted";
-}
+}

+ 276 - 281
utils/u_general.txt

@@ -31,6 +31,12 @@ function getSpacer() {
 }
 
 function getDirection(yaw) {
+	while(yaw < 0) {
+		yaw += 360;
+	}
+	while(yaw >= 360) {
+		yaw -= 360;
+	}
 	if(yaw > 60 && yaw < 120) {
 		direction = "west";
 	} elseif(yaw > 150 && yaw < 210) {
@@ -185,22 +191,11 @@ function setBlockIfNotAir(location, block) {
 	return false;
 }
 
-function loc.modCoords(loc, mod_x, mod_y, mod_z) {
-	x = loc.getCoord(loc, "x");
-	y = loc.getCoord(loc, "y");
-	z = loc.getCoord(loc, "z");
-	loc.setX(loc, x + mod_x);
-	loc.setY(loc, y + mod_y);
-	loc.setZ(loc, z + mod_z);
-	return loc;
-}
-
 function teleportPlayer(player, location, backPos) {
 	onadventure = ggv(player, "onadventure");
 	if(onadventure != null) {
 		if(onadventure) {
-			player.speak(player, "§5Adventure", "Du bist in einem Abenteuer. Teleport blockiert. ");
-			player.speak(player, "§5Adventure", text.click("[§5Abenteuer abbrechen?§r]", concat("/stopadventure ", player)));
+			msg(player, "[§5Adventure§r] Teleport blocked. ", text.click("[§5Cancel Adenture?§r]", concat("/stopadventure ", player)));
 			return false;
 		}
 	}
@@ -336,276 +331,276 @@ function getSurvivalSpawn() {
 
 function isATpTransmitter(chest_loc) {
 	loc = loc.mod(chest_loc, 0, 0 ,0);
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 2, 0, 0));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, 2, 0, 0);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 2));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, 0, 0, 2);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 2, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 2, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -2));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -2);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -2, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -2, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "minecraft:stone_brick_slab") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "minecraft:stone_brick_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "minecraft:stone_brick_slab") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "minecraft:stone_brick_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "minecraft:stone_brick_slab") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "minecraft:stone_brick_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "minecraft:stone_brick_slab") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "minecraft:stone_brick_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 1, 2));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 1, 2);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 2));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 2);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, -1));
-	if(type != "km:copper_block") {
+	loc.add(loc, 0, 1, -1);
+	if(block.getType(loc) != "km:copper_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:copper_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:copper_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -2, -4, -2));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -2, -4, -2);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 4));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 4);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 4, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 4, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -4));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -4);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -3, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -3, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "minecraft:stone_bricks") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "minecraft:stone_bricks") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -2, 0, 0));
-	if(type != "minecraft:stone_bricks") {
+	loc.add(loc, -2, 0, 0);
+	if(block.getType(loc) != "minecraft:stone_bricks") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 2));
-	if(type != "minecraft:stone_bricks") {
+	loc.add(loc, 0, 0, 2);
+	if(block.getType(loc) != "minecraft:stone_bricks") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 2, 0, 0));
-	if(type != "minecraft:stone_bricks") {
+	loc.add(loc, 2, 0, 0);
+	if(block.getType(loc) != "minecraft:stone_bricks") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
 	return true;
@@ -613,268 +608,268 @@ function isATpTransmitter(chest_loc) {
 
 function isATpReceiver(chest_loc) {
 	loc = loc.mod(chest_loc, 0, 0 ,0);
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 2, 0, 0));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, 2, 0, 0);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 2));
-	if(type != "minecraft:glowstone") {
+	loc.add(loc, 0, 0, 2);
+	if(block.getType(loc) != "minecraft:glowstone") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 2, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 2, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -2));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -2);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -2, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -2, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "minecraft:dark_prismarine_slab") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "minecraft:dark_prismarine_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "minecraft:dark_prismarine_slab") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "minecraft:dark_prismarine_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "minecraft:dark_prismarine_slab") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "minecraft:dark_prismarine_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "minecraft:dark_prismarine_slab") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "minecraft:dark_prismarine_slab") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 1, 2));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 1, 2);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 2));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 2);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -2, -2, -3));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -2, -2, -3);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 4));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 4);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 4, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 4, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -4));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -4);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 1, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 1, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, -3, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, -3, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, 1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 0, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "minecraft:dark_prismarine") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "minecraft:dark_prismarine") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -2, 0, 0));
-	if(type != "minecraft:dark_prismarine") {
+	loc.add(loc, -2, 0, 0);
+	if(block.getType(loc) != "minecraft:dark_prismarine") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 0, 0, 2));
-	if(type != "minecraft:dark_prismarine") {
+	loc.add(loc, 0, 0, 2);
+	if(block.getType(loc) != "minecraft:dark_prismarine") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 2, 0, 0));
-	if(type != "minecraft:dark_prismarine") {
+	loc.add(loc, 2, 0, 0);
+	if(block.getType(loc) != "minecraft:dark_prismarine") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, 1, 0, 0));
-	if(type != "km:bronze_block") {
+	loc.add(loc, 1, 0, 0);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
-	type = block.getType(loc.modCoords(loc, -1, 0, -1));
-	if(type != "km:bronze_block") {
+	loc.add(loc, -1, 0, -1);
+	if(block.getType(loc) != "km:bronze_block") {
 		return false;
 	}
 	return true;
@@ -1281,7 +1276,7 @@ function mail.checkForNew(player) {
 	if(!nextrow) {
 		databank.close(result);
 		databank.close(stmt);
-		goto("wait");
+		return;
 	}
 	newmails = 0;
 	while(nextrow) {

+ 0 - 0
utils/u_party.txt