Переглянути джерело

updated sammelfieber and hide and seek

Marvin Löschenkohl 4 роки тому
батько
коміт
b441361b55

+ 1 - 1
docu_minecraft.php

@@ -168,7 +168,7 @@
     </table>
 	<table>
         <tr>
-            <th class="command">living_is_attacked</th>
+            <th class="command">living_pre_hurt</th>
             <th class="desc">an entity gets hurt (event is thrown before living_hurt and cancels damage-animation and knockback)</th>
         </tr>
         <tr>

+ 6 - 6
global/gamecenter.txt

@@ -43,8 +43,8 @@ addGameSign("rmmaploc2", true, loc.new(gamesworld, -396, 158, -56), "minigames/r
 addGameSign("rmmaploc3", true, loc.new(gamesworld, -396, 158, -55), "minigames/ragemode/ragemode", "minigames/ragemode/region_rmmap3", false);
 addGameSign("rmmaploc4", true, loc.new(gamesworld, -396, 157, -57), "minigames/ragemode/ragemode", "minigames/ragemode/region_rmmap4", false);
 addGameSign("rmmaploc4", true, loc.new(gamesworld, -396, 157, -57), "minigames/ragemode/ragemode", "minigames/ragemode/region_rmmap4", false);
-addGameSign("sfsign1", true, loc.new(gamesworld, -398, 158, -47), "minigames/sammelfieber/sammelfieber", "minigames/sammelfieber/sfmap1", true);
-addGameSign("sfsign2", true, loc.new(gamesworld, -398, 157, -47), "minigames/sammelfieber/sammelfieber", "minigames/sammelfieber/sfmap2", true);
+addGameSign("sfsign1", true, loc.new(gamesworld, -398, 158, -47), "minigames/sammelfieber/sfranked", "minigames/sammelfieber/sfmap1", true);
+addGameSign("sfsign2", true, loc.new(gamesworld, -398, 157, -47), "minigames/sammelfieber/sfranked", "minigames/sammelfieber/sfmap2", true);
 addGameSign("sfsign3", true, loc.new(gamesworld, -399, 158, -47), "minigames/sammelfieber/sammelfieber", "minigames/sammelfieber/sfmap3", false);
 addGameSign("buttonssign1", true, loc.new(gamesworld, -399, 158, -65), "minigames/buttons/buttons", "minigames/buttons/buttonsmap1", true);
 addGameSign("buttonssign2", true, loc.new(gamesworld, -398, 158, -65), "minigames/buttons/buttons", "minigames/buttons/buttonsmap2", true);
@@ -69,8 +69,8 @@ addGameSign("fastbridgesign1", true, loc.new(gamesworld, -405, 158, -75), "minig
 addGameSign("fastbridgesign2", true, loc.new(gamesworld, -404, 158, -75), "minigames/fastbridge/fastbridge", "minigames/fastbridge/region_fastbridgemap2", false);
 addGameSign("rebuildsign1", true, loc.new(gamesworld, -423, 158, -42), "minigames/rebuild/rebuild", "minigames/rebuild/rebuildmap1", false);
 addGameSign("rebuildsign2", true, loc.new(gamesworld, -423, 158, -43), "minigames/rebuild/rebuild", "minigames/rebuild/rebuildmap2", false);
-addGameSign("catchsign1", false, loc.new(gamesworld, -434, 158, -49), "minigames/catch/catch", "minigames/catch/catchmap1", false);
-addGameSign("catchsign2", false, loc.new(gamesworld, -434, 158, -50), "minigames/catch/catch", "minigames/catch/catchmap2", false);
+addGameSign("hideandseeksign1", true, loc.new(gamesworld, -434, 158, -49), "minigames/hideandseek/hideandseek", "minigames/hideandseek/hideandseekmap1", false);
+addGameSign("hideandseeksign2", true, loc.new(gamesworld, -434, 158, -50), "minigames/hideandseek/hideandseek", "minigames/hideandseek/hideandseekmap2", false);
 addGameSign("leapfrogsign1", true, loc.new(gamesworld, -401, 158, -71), "minigames/leapfrog/leapfrog", "minigames/leapfrog/leapfrogmap1", true);
 addGameSign("parcoursign1", true, loc.new(gamesworld, -413, 157, -40), "minigames/parcour/parcour", "minigames/parcour/parcour_map1", true);
 addGameSign("snowsign1", true, loc.new(gamesworld, -401, 158, -72), "minigames/snowgame/snowgame", "minigames/snowgame/region_snowmap1", false);
@@ -197,7 +197,7 @@ script_id = map.get(script_ids, block_loc);
 if(script_id == null) {
 	@startnewgame
 	if(pfad2 != null) {
-		if(pfad2 == "minigames/sammelfieber/sammelfieber") {
+		if(pfad2 == "minigames/sammelfieber/sammelfieber" || pfad2 == "minigames/sammelfieber/sfranked") {
 			script = script.start(pfad, "minigames/sammelfieber/sammelfieberitems", pfad2, "utils/u_games", "utils/u_party", "utils/u_general");
 		} else {
 			script = script.start(pfad, pfad2, "utils/u_games", "utils/u_party", "utils/u_general");
@@ -210,7 +210,7 @@ if(script_id == null) {
 	script = script.getFromId(script_id);
 }
 if(script == null) {
-	msg("dev", "Should not happen. Error on game_join ", script_ids);
+	msg("dev", "Error on game_join ", script_ids);
 	map.remove(script_ids, block_loc);
 	goto("startnewgame");
 }

+ 2 - 26
global/ranklist.txt

@@ -9,10 +9,6 @@ list.add(inverting_list, "5x5cl");
 list.add(inverting_list, "7x7cl");
 list.add(inverting_list, "10x10cl");
 
-sf_list = list.new();
-list.add(sf_list, "sfsingle");
-list.add(sf_list, "sfmulti2");
-
 colorcodes = map.new();
 games = list.new();
 labels = map.new();
@@ -29,7 +25,7 @@ addRanking("§6", "SnowGame", "snowranks", "Kills", "snowstats", false);
 addRanking("§6", "TJR", "tjrranks", "Modulen", "tjrstats", false);
 addRanking("§b", "IJR", "icejrranks", "Checkpoints", "icejrstats", false);
 addRanking("§d", "Letters", "letterranks", "Zeit", "lestats", true);
-addRanking("§a", "Sammelfieber", "sfranks", "Items", "sfstats", false);
+addRanking("§a", "Sammelfieber", "sfsingle", "Items", "sfstats", false);
 addRanking("§2", "Buttons", "buttonranks", "Klicks", "bustats", false);
 addRanking("§9", "Catch", "fncranks", "Wins", "fncstats", false);
 addRanking("§9", "Inverting", "invertranks", "Klicks", "invertstats", true);
@@ -40,8 +36,6 @@ addRanking("§6", "Parcour", "parcourranks1", "Zeit", "parcourstats", true);
 addRanking("§e", "Halma", "halmaranks", "Wins", "halmastats", false);
 addRanking("§e", "ShoppingChaos", "shoppingranks", "Wins", "scstats", false);
 
-registerRanking("sfsingle");
-registerRanking("sfmulti2");
 registerRanking("invertranks5x5");
 registerRanking("invertranks7x7");
 registerRanking("invertranks10x10");
@@ -93,12 +87,6 @@ if(event == "custom_command") {
 					printClick(player, "Inverting Classic 10x10", "/topinvstats 10x10cl");
 					goto("wait");
 				}
-				if(gamename == "Sammelfieber") {
-					speakPrefix(player, concat(color, gamename), "Click for Top Ten");
-					printClick(player, "Sammelfieber Single", "/topsfstats sfsingle");
-					printClick(player, "Sammelfieber Multi 2", "/topsfstats sfmulti2");
-					goto("wait");
-				}
 				table = map.get(rankingtables, gamename);
 				showTopStats(player, gamename, table);
 				goto("wait");
@@ -134,12 +122,6 @@ if(event == "custom_command") {
 					printClick(player, "Inverting Classic 7x7", concat("/removeinvstats ", p_name, " 7x7cl"));
 					printClick(player, "Inverting Classic 10x10", concat("/removeinvstats ", p_name, " 10x10cl"));
 					goto("wait");
-				} elseif(table == "sfranks") {
-					color = map.get(colorcodes, gamename);
-					speakPrefix(player, concat(color, gamename), concat("Click for stats from §s", p_name));
-					printClick(player, "Sammelfieber Single", concat("/removesfstats ", p_name, " sfsingle"));
-					printClick(player, "Sammelfieber Multi 2", concat("/removesfstats ", p_name, " sfmulti2"));
-					goto("wait");
 				}
 				p_uuid = player.getUuid(p_name);
 				if(table == "rmranks") {
@@ -284,12 +266,6 @@ function playerStatsCore(player, gamename, p_name) {
 		printClick(player, "Inverting Classic 10x10", concat("/invstats ", p_name, " 10x10cl"));
 		return;
 	}
-	if(gamename == "Sammelfieber") {
-		speakPrefix(player, concat(color, gamename), concat("Click for stats from §s", p_name));
-		printClick(player, "Sammelfieber Single", concat("/sfstats ", p_name, " sfsingle"));
-		printClick(player, "Sammelfieber Multi 2", concat("/sfstats ", p_name, " sfmulti2"));
-		return;
-	}
 	table = map.get($rankingtables, gamename);
 	message = map.get($messages, gamename);
 	speakPrefix(player, concat(color, gamename), concat("§eWertung nach: §r", message));
@@ -364,7 +340,7 @@ function addRanking(colorcode, name, rankingtable, message, label, ascending) {
 	if(ascending) {
 		set.add($ascendingGames, name);
 	}
-	if(rankingtable == "sfranks" || rankingtable == "invertranks") {
+	if(rankingtable == "invertranks") {
 		return;
 	}
 	registerRanking(rankingtable);

+ 0 - 337
minigames/catch/catch.txt

@@ -1,337 +0,0 @@
-rankingtable = "fncranks";
-registerRanking(rankingtable);
-
-list.new(all);
-gamesworldloc = read.location(ggv("SERVER", "gamesspawn"));
-aimpoints = 40; //Punkte für Win
-gamename = "§9Catch";
-
-gosub("setstart");
-
-list.new(spawnprotect);
-list.add(spawnprotect, middleloc);
-list.add(spawnprotect, loc.mod(middleloc, 0, 1, 0));
-list.add(spawnprotect, loc.mod(middleloc, -1, 0, 0));
-list.add(spawnprotect, loc.mod(middleloc, -1, 1, 0));
-list.add(spawnprotect, loc.mod(middleloc, 1, 0, 0));
-list.add(spawnprotect, loc.mod(middleloc, 1, 1, 0));
-list.add(spawnprotect, loc.mod(middleloc, 0, 0, 1));
-list.add(spawnprotect, loc.mod(middleloc, 0, 1, 1));
-list.add(spawnprotect, loc.mod(middleloc, 0, 0, -1));
-list.add(spawnprotect, loc.mod(middleloc, 0, 1, -1));
-
-list.add(spawnprotect, escaper_spawn_loc);
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, 0));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, -1, 0, 0));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, -1, 1, 0));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, 1, 0, 0));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, 1, 1, 0));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 0, 1));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, 1));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 0, -1));
-list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, -1));
-
-list.add(spawnprotect, seeker_spawn_loc);
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, 0));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, -1, 0, 0));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, -1, 1, 0));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, 1, 0, 0));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, 1, 1, 0));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 0, 1));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, 1));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 0, -1));
-list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, -1));
-
-escaper_spawn_loc = loc.mod(escaper_spawn_loc, 0.5, 0, 0.5);
-seeker_spawn_loc = loc.mod(seeker_spawn_loc, 0.5, 0, 0.5);
-
-player = script.getLeader();
-player_name = player.getName(player);
-
-gosub("lobbycore");
-goto("simplelobby");
-
-@lobby
-return;
-
-@leavelobby
-return;
-
-@finalstart
-player.speak("all", gamename, "§rDas Spiel läuft.");
-block.setSign(gamesignloc, 2, concat(text.number(list.getSize(all)), "/", text.number(maxplayers)));
-block.setSign(gamesignloc, 3, "§6Läuft");
-
-event.load("player_death");
-event.load("player_post_respawn");
-event.load("player_hurt");
-
-//Temp-Kopie von all erstellen
-list.new(templist);
-map.new(points);
-map.new(times);
-for(i = 0; i < list.getSize(all); i++) {
-	p = list.getIndex(all, i);
-	p_name = player.getName(p);
-	list.add(templist, p);
-	map.add(points, p_name, 0);
-	if(player.isCreative(p)) {
-		player.setGamemode(p, "survival");
-	}
-	if(player.hasFly(p)) {
-		player.setFly(p, false);
-	}
-}
-
-diapickaxe = read.item("{id:\"minecraft:diamond_pickaxe\",Count:1b,tag:{Enchantments:[{lvl:1s,id:\"minecraft:efficiency\"}]}}");
-blocks512 = read.item("minecraft:cut_sandstone", 512);
-stick = read.item("{id:\"minecraft:stick\",Count:1b,tag:{HideFlags:2,Enchantments:[{lvl:1s,id:\"minecraft:knockback\"}],display:{Name:'{\"text\":\"§bKnüppel\"}'},AttributeModifiers:[{UUIDMost:1,UUIDLeast:1,Amount:100.0d,Slot:\"mainhand\",AttributeName:\"generic.attackSpeed\",Operation:0,Name:\"modifier\"}]}}");
-ironpickaxe = read.item("minecraft:iron_pickaxe");
-blocks64 = read.item("minecraft:cut_sandstone", 64);
-web2 = read.item("minecraft:cobweb", 2);
-dia_block_type = "minecraft:diamond_block";
-
-list.new(seekerlist);
-list.new(escaperlist);
-for(i = 0; i < seeker_amount; i++) {
-	p = list.getIndex(templist, math.random(0, list.getSize(templist) - 1));
-	list.remove(templist, p);
-	setSeeker(p);
-	player.speak(p, gamename, "§rDu bist nun Fänger");
-}
-
-for(i = 0; i < list.getSize(templist); i++) {
-	p = list.getIndex(templist, i);
-	setEscaper(p);
-	player.speak(p, gamename, "§rLauf weg!!!");
-}
-
-sgoto(20, "loop");
-gosub("updatedisplay");
-
-@checkgame
-wait();
-iGoto(event);
-goto("checkgame");
-
-@player_hurt
-if(player_involved) {
-	cancel = true;
-	if(list.contains(seekerlist, sec_player_name) && list.contains(escaperlist, player_name)) {
-		setSeeker(player);
-		player.speak(player, gamename, "§rDu bist nun Fänger");
-		setEscaper(sec_player);
-		player.speak(sec_player, gamename, "§rLauf weg!!!");
-		gosub("updatedisplay");
-	}
-}
-goto("checkgame");
-
-@player_death
-clear = true;
-player.respawn(player);
-goto("checkgame");
-
-@player_post_respawn
-if(list.contains(escaperlist, player_name)) {
-	//Random-Seeker zum Escaper machen
-	pname = list.getIndex(seekerlist, math.random(0, list.getSize(seekerlist) - 1));
-	p = read.player(pname);
-	setEscaper(p);
-	player.speak(p, gamename, "§rLauf weg!!!");
-	//Escaper wird zum Seeker
-	setSeeker(player);
-	player.speak(player, gamename, "§rDu bist nun Fänger");
-	gosub("updatedisplay");
-} else {
-	giveSeekerItems(player);
-	entity.addEffect(player, "glowing", 32760, 0);
-	entity.teleport(player, seeker_spawn_loc);
-}
-goto("checkgame");
-
-@block_break
-@block_place
-if(list.contains(spawnprotect, block_loc)) {
-	cancel = true;
-	inv.update(player);
-	goto("checkgame");
-}
-if(block_type == "minecraft:cobweb") {
-	cancel = false;
-	goto("checkgame");
-}
-if(block_type == dia_block_type) {
-	if(event == "block_place") {
-		cancel = true;
-		inv.update(player);
-		goto("checkgame");
-	}
-	if(list.contains(escaperlist, player_name)) {
-		cancel = false;
-		temp = map.get(points, player_name) + 1;
-		map.add(points, player_name, temp);
-		if(temp >= aimpoints) {
-			winner = player;
-			winnername = player_name;
-			goto("win");
-		}
-		sgoto(60, "replacedia");
-		goto("checkgame");
-	}
-}
-if(block_type == "minecraft:cut_sandstone") {
-	cancel = false;
-	goto("checkgame");
-}
-cancel = true;
-goto("checkgame");
-
-@replacedia
-block.set(dia_loc, dia_block_type);
-goto("checkgame");
-
-@loop
-//Zeit wird nur Escapern angezeigt
-for(i = 0; i < list.getSize(escaperlist); i++) {
-	p_name = list.getIndex(escaperlist, i);
-	p = read.player(p_name, escaperlist);
-	seconds = map.get(times, p_name) - 1;
-	if(seconds <= 0) {
-		seconds = 30;
-		temp = map.get(points, p_name) + 2;
-		map.add(points, p_name, temp);
-		if(temp >= aimpoints) {
-			winner = p;
-			winnername = p_name;
-			goto("win");
-		}
-	}
-	map.add(times, p_name, seconds);
-	gosub("updatedisplay");
-}
-sgoto(20, "loop");
-goto("checkgame");
-
-@updatedisplay
-display.reset("all");
-displayindex = 0;
-display.add("all", displayindex++, "§6Fänger");
-for(i = 0; i < list.getSize(seekerlist); i++) {
-	display.add("all", displayindex++, list.getIndex(seekerlist, i));
-}
-display.add("all", displayindex++, "");
-display.add("all", displayindex++, concat("§6Punkte §r(Ziel: ", text.number(aimpoints), ")"));
-for(i = 0; i < list.getSize(all); i++) {
-	p = list.getIndex(all, i);
-	p_name = player.getName(p);
-	display.add("all", displayindex++, concat(text.number(map.get(points, p_name)), " ", p_name));
-}
-for(i = 0; i < list.getSize(escaperlist); i++) {
-	p_name = list.getIndex(escaperlist, i);
-	display.add(p_name, displayindex++, "");
-	display.add(p_name, displayindex++, "§6Counter");
-	display.add(p_name, displayindex++, concat(text.number(map.get(times, p_name))));
-}
-return;
-
-function setSeeker(player) {
-	player_name = player.getName(player);
-	entity.setHealth(player, 20);
-	player.setHunger(player, 20);
-	player.setSaturation(player, 5);
-	entity.clearEffects(player);
-	player.clearInventory(player);
-	list.add($seekerlist, player_name);
-	list.remove($escaperlist, player_name);
-	giveSeekerItems(player);
-	entity.teleport(player, $seeker_spawn_loc);
-	player.setSpawn(player, $seeker_spawn_loc);
-	entity.addEffect(player, "glowing", 32760, 0);
-	entity.addEffect(player, "slowness", $slowtime, 6);
-	entity.addEffect(player, "jump_boost", $slowtime, 128);
-	return;
-}
-
-function setEscaper(player) {
-	player_name = player.getName(player);
-	entity.setHealth(player, 20);
-	player.setHunger(player, 20);
-	player.setSaturation(player, 5);
-	entity.clearEffects(player);
-	player.clearInventory(player);
-	list.add($escaperlist, player_name);
-	list.remove($seekerlist, player_name);
-	player.giveItem(player, $diapickaxe);
-	player.giveItem(player, $stick);
-	player.giveItem(player, $web2);
-	player.giveItem(player, $blocks512);
-	map.add($times, player_name, 30);
-	entity.teleport(player, $escaper_spawn_loc);
-	player.setSpawn(player, $escaper_spawn_loc);
-	return;
-}
-
-function giveSeekerItems(player) {
-	player.giveItem(player, $ironpickaxe);
-	player.giveItem(player, $blocks64);
-	return;
-}
-
-@player_logout
-@player_giveup
-player.speak("all", gamename, concat("§6", player_name, " §rhat das Spiel verlassen"));
-kickplayer(player);
-map.remove(points, player_name);
-list.remove(seekerlist, player_name);
-list.remove(escaperlist, player_name);
-if(list.getSize(all) < minplayers) {
-	minplayers--;
-	if(--seeker_amount == 0) {
-		winner = list.getIndex(all, 0);
-		winnername = player.getName(winner);
-		goto("win");
-	}
-}
-if(list.contains(seekerlist, player_name)) {
-	//Ersatz-Sucher erstellen
-	p = read.player(list.getIndex(escaperlist, math.random(0, list.getSize(escaperlist) - 1)));
-	setSeeker(p);
-	player.speak(p, gamename, "§rEin Fänger ist geleavt. Nun bist du einer.");
-	gosub("updatedisplay");
-}
-goto("checkgame");
-
-@win
-player.speak("all", gamename, "§6", winnername, "§r hat gewonnen");
-for(i = 0; i < list.getSize(all); i++) {
-	p = list.getIndex(all, i);
-	p_name = player.getName(p);
-	p = read.player(p_name);
-	tptogameslobby(p);
-	resetplayer(p);
-	
-	p_id = player.getId(p);
-	last_record = getPoints(rankingtable, p_id);
-	if(p == winner) {
-		last_record++;
-	}
-	playedgames = getPlayedGames(rankingtable, p_id) + 1;
-	setRanking(rankingtable, p_id, last_record, playedgames);
-	
-	player.speak(p, gamename, "§r---= §eStatistik §r=---");
-	player.speak(p, gamename, concat("§eGespielte Spiele: §r", text.number(playedgames)));
-	player.speak(p, gamename, concat("§eGewonnene Spiele: §r", text.number(last_record)));
-	
-	for(x = 0; x <= 50; x++) {
-		for(z = 0; z <= 50; z++) {
-			for(y = 0; y <= 71; y++) {
-				block.clone(loc.mod(resetfromloc, x, y, z), loc.mod(resettoloc, x, y, z));
-			}
-		}
-	}
-	entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
-}
-block.setSign(gamesignloc, 2, concat("0/", text.number(maxplayers)));
-block.setSign(gamesignloc, 3, "§2Wartet");
-term();

+ 468 - 0
minigames/hideandseek/hideandseek.txt

@@ -0,0 +1,468 @@
+rankingtable = "fncranks";
+
+cooldown_map = map.new();
+brokenblocks = map.new();
+placedblocks = list.new();
+points = map.new();
+times = map.new();
+seekerlist = list.new();
+escaperlist = list.new();
+winpoints = 30; //Punkte für Win
+gamename = "§9Catch";
+
+seeker_skills = list.new();
+hider_skills = list.new();
+addSeekerSkill("Speed", 20, 183, 5, 2, false, "speed");
+addSeekerSkill("JumpBoost", 12, 118, 3, 5, false, "jump_boost");
+addSeekerSkill("Haste", 25, 179, 7, 3, false, "haste");
+addSeekerSkill("Slowness", 25, 182, 3, 1, true, "slowness");
+addSeekerSkill("Glowing", 50, 106, 2, 1, true, "glowing");
+
+addHiderSkill("Invisibility", 45, 176, 10, 1, false, "invisibility");
+addHiderSkill("Haste", 25, 179, 7, 3, false, "haste");
+addHiderSkill("Slowness", 25, 182, 3, 1, true, "slowness");
+addHiderSkill("Blindness", 25, 184, 3, 1, true, "blindness");
+addHiderSkill("Nausea", 25, 152, 10, 10, true, "nausea");
+
+gosub("setstart");
+
+spawnprotect = list.new();
+list.add(spawnprotect, middleloc);
+list.add(spawnprotect, loc.mod(middleloc, 0, 1, 0));
+list.add(spawnprotect, loc.mod(middleloc, -1, 0, 0));
+list.add(spawnprotect, loc.mod(middleloc, -1, 1, 0));
+list.add(spawnprotect, loc.mod(middleloc, 1, 0, 0));
+list.add(spawnprotect, loc.mod(middleloc, 1, 1, 0));
+list.add(spawnprotect, loc.mod(middleloc, 0, 0, 1));
+list.add(spawnprotect, loc.mod(middleloc, 0, 1, 1));
+list.add(spawnprotect, loc.mod(middleloc, 0, 0, -1));
+list.add(spawnprotect, loc.mod(middleloc, 0, 1, -1));
+
+list.add(spawnprotect, escaper_spawn_loc);
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, 0));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, -1, 0, 0));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, -1, 1, 0));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, 1, 0, 0));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, 1, 1, 0));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 0, 1));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, 1));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 0, -1));
+list.add(spawnprotect, loc.mod(escaper_spawn_loc, 0, 1, -1));
+
+list.add(spawnprotect, seeker_spawn_loc);
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, 0));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, -1, 0, 0));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, -1, 1, 0));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, 1, 0, 0));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, 1, 1, 0));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 0, 1));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, 1));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 0, -1));
+list.add(spawnprotect, loc.mod(seeker_spawn_loc, 0, 1, -1));
+
+escaper_spawn_loc = loc.mod(escaper_spawn_loc, 0.5, 0, 0.5);
+seeker_spawn_loc = loc.mod(seeker_spawn_loc, 0.5, 0, 0.5);
+
+goto("simplelobby");
+
+@finalstart
+player_list = minigame.getPlayers(script_id);
+
+event.load("player_post_respawn");
+event.load("function_key");
+
+//Temp-Kopie von player_list erstellen
+templist = list.new();
+for(i = 0; i < list.getSize(player_list); i++) {
+	p_uuid = list.getIndex(player_list, i);
+	p = player.get(p_uuid);
+	speakPrefix(p, gamename, "The game has started.");
+	list.add(templist, p_uuid);
+	map.add(points, p_uuid, 0);
+	player.setGamemode(p, "survival");
+	player.setFly(p, false);
+}
+
+diapickaxe = read.item("{id:\"minecraft:diamond_pickaxe\",Count:1b,tag:{Enchantments:[{lvl:1s,id:\"minecraft:efficiency\"}]}}");
+blocks512 = read.item("minecraft:cut_sandstone", 512);
+stick = read.item("{id:\"minecraft:stick\",Count:1b,tag:{HideFlags:2,Enchantments:[{lvl:1s,id:\"minecraft:knockback\"}],display:{Name:'{\"text\":\"§bKnüppel\"}'},AttributeModifiers:[{UUIDMost:1,UUIDLeast:1,Amount:100.0d,Slot:\"mainhand\",AttributeName:\"generic.attackSpeed\",Operation:0,Name:\"modifier\"}]}}");
+ironpickaxe = read.item("minecraft:iron_pickaxe");
+blocks64 = read.item("minecraft:cut_sandstone", 64);
+
+for(i = 0; i < seeker_amount; i++) {
+	p_uuid = list.getIndex(templist, math.random(0, list.getSize(templist) - 1));
+	p = player.get(p_uuid);
+	list.remove(templist, p_uuid);
+	setSeeker(p);
+	speakPrefix(p, gamename, "Catch other players!");
+}
+
+for(i = 0; i < list.getSize(templist); i++) {
+	p_uuid = list.getIndex(templist, i);
+	p = player.get(p_uuid);
+	setEscaper(p);
+	speakPrefix(p, gamename, "Run away!!!");
+}
+
+sgoto(20, "loop");
+gosub("updatedisplay");
+
+@checkgame
+wait();
+if(event == "living_pre_hurt") {
+	if(!isPlayer(living_entity)) {
+		goto("checkgame");
+	}
+	player = living_entity;
+}
+if(player.hasMinigameId(player, script_id)) {
+	ignoreGoto(event);
+}
+goto("checkgame");
+
+@function_key
+if(list.contains(seekerlist, player.getUuid(player))) {
+	skills_list = seeker_skills;
+	type = "seeker";
+} else {
+	skills_list = hider_skills;
+	type = "hider";
+}
+if(key > list.getSize(skills_list)) {
+	goto("checkgame");
+}
+skill = list.getIndex(skills_list, key - 1);
+skill_name = skill[0];
+needed_cooldown = skill[1];
+effecttime = skill[3] * 20;
+amplifier = skill[4];
+offensive = skill[5];
+tech_name = skill[6];
+last_exe_time = getCatchLastExeTime(player, skill_name);
+diff_time = math.roundUp((time.getMillis() - last_exe_time) / 1000);
+if(diff_time < needed_cooldown) {
+	player.action(player, concat("§a", text.number(needed_cooldown - diff_time), "s cooldown left"));
+	goto("checkgame");
+}
+if(offensive) {
+	if(type == "seeker") {
+		iter = list.iterator(escaperlist);
+		while(hasNext(iter)) {
+			p = player.get(next(iter));
+			entity.addEffect(p, tech_name, effecttime, amplifier, false);
+		}
+	} else {
+		iter = list.iterator(seekerlist);
+		while(hasNext(iter)) {
+			p = player.get(next(iter));
+			entity.addEffect(p, tech_name, effecttime, amplifier, false);
+		}
+	}
+} else {
+	entity.addEffect(player, tech_name, effecttime, amplifier, false);
+}
+setCatchLastExeTime(player, skill_name);
+status.addTimed(player, key, needed_cooldown * 20, concat("CD ", skill_name));
+minigame.speakAll(gamename, concat("§6", player.getName(player), "§r used §2", skill_name, "."));
+goto("checkgame");
+
+@living_pre_hurt
+defender = player;
+attacker = getPlayerFromDamageSource(damage_source);
+if(attacker == null) {
+	goto("checkgame");
+}
+defender_uuid = player.getUuid(defender);
+if(!list.contains(player_list, defender_uuid)) {
+	cancel = true;
+	speakPrefix(attacker, gamename, "§eIllegal player in game.");
+	goto("checkgame");
+}
+if(!player.hasMinigameId(attacker, script_id)) {
+	goto("checkgame");
+}
+attacker_uuid = player.getUuid(attacker);
+if(defender_uuid == attacker_uuid) {
+	goto("checkgame");
+}
+if(!list.contains(player_list, attacker_uuid)) {
+	speakPrefix(defender, gamename, "§eIllegal player in game.");
+	goto("checkgame");
+}
+if(list.contains(seekerlist, attacker_uuid) && list.contains(escaperlist, defender_uuid)) {
+	setSeeker(defender);
+	speakPrefix(defender, gamename, "Catch other players!");
+	setEscaper(attacker);
+	speakPrefix(attacker, gamename, "Run away!!!");
+	gosub("updatedisplay");
+}
+goto("checkgame");
+
+@player_post_respawn
+if(list.contains(escaperlist, player.getUuid(player))) {
+	//Random-Seeker zum Escaper machen
+	p_uuid = list.getIndex(seekerlist, math.random(0, list.getSize(seekerlist) - 1));
+	p = player.get(p_uuid);
+	setEscaper(p);
+	speakPrefix(p, gamename, "Run away!!!");
+	//Escaper wird zum Seeker
+	setSeeker(player);
+	speakPrefix(player, gamename, "Catch other players!");
+	gosub("updatedisplay");
+} else {
+	giveSeekerItems(player);
+	entity.teleport(player, seeker_spawn_loc);
+}
+goto("checkgame");
+
+@block_break
+cancel = true;
+if(list.contains(spawnprotect, block_loc)) {
+	inv.update(player);
+	goto("checkgame");
+}
+if(list.contains(placedblocks, block_loc)) {
+	cancel = false;
+	list.remove(placedblocks, block_loc);
+	goto("checkgame");
+}
+if(set.contains(allowed_breaks, block_type)) {
+	cancel = false;
+	map.add(brokenblocks, block_loc, block_type);
+	goto("checkgame");
+}
+if(block_type == "minecraft:diamond_block") {
+	player_uuid = player.getUuid(player);
+	if(list.contains(escaperlist, player_uuid)) {
+		cancel = false;
+		temp = map.get(points, player_uuid) + 1;
+		map.add(points, player_uuid, temp);
+		if(temp >= winpoints) {
+			winner_uuid = player_uuid;
+			goto("win");
+		}
+		sgoto(60, "replacedia");
+		goto("checkgame");
+	}
+}
+goto("checkgame");
+
+@block_place
+if(list.contains(spawnprotect, block_loc)) {
+	cancel = true;
+	inv.update(player);
+	goto("checkgame");
+}
+if(block_type == "minecraft:diamond_block") {
+	cancel = true;
+	inv.update(player);
+	goto("checkgame");
+}
+list.add(placedblocks, block_loc);
+goto("checkgame");
+
+@replacedia
+block.set(dia_loc, "minecraft:diamond_block");
+goto("checkgame");
+
+@loop
+//Zeit wird nur Escapern angezeigt
+for(i = 0; i < list.getSize(escaperlist); i++) {
+	p_uuid = list.getIndex(escaperlist, i);
+	seconds = map.get(times, p_uuid) - 1;
+	if(seconds <= 0) {
+		seconds = 30;
+		temp = map.get(points, p_uuid) + 2;
+		map.add(points, p_uuid, temp);
+		if(temp >= winpoints) {
+			winner_uuid = p_uuid;
+			goto("win");
+		}
+	}
+	map.add(times, p_uuid, seconds);
+	gosub("updatedisplay");
+}
+sgoto(20, "loop");
+goto("checkgame");
+
+@updatedisplay
+minigame.displayResetAll();
+displayindex = 0;
+minigame.displayAll(displayindex++, "§6Catcher");
+for(i = 0; i < list.getSize(seekerlist); i++) {
+	minigame.displayAll(displayindex++, player.getName(list.getIndex(seekerlist, i)));
+}
+minigame.displayAll(displayindex++, "");
+minigame.displayAll(displayindex++, concat("§6Points §r(Ziel: ", text.number(winpoints), ")"));
+for(i = 0; i < list.getSize(player_list); i++) {
+	p_uuid = list.getIndex(player_list, i);
+	minigame.displayAll(displayindex++, concat(text.number(map.get(points, p_uuid)), " ", player.getName(p_uuid)));
+}
+for(i = 0; i < list.getSize(escaperlist); i++) {
+	p_uuid = list.getIndex(escaperlist, i);
+	p = player.get(p_uuid);
+	display.add(p, displayindex++, "");
+	display.add(p, displayindex++, "§6Counter");
+	display.add(p, displayindex++, concat(text.number(map.get(times, p_uuid))));
+}
+return;
+
+function setSeeker(player) {
+	setStackIcons(player, $seeker_skills);
+	player_uuid = player.getUuid(player);
+	entity.setHealth(player, 20);
+	player.setHunger(player, 20);
+	player.setSaturation(player, 5);
+	entity.clearEffects(player);
+	player.clearInventory(player);
+	list.add($seekerlist, player_uuid);
+	list.remove($escaperlist, player_uuid);
+	giveSeekerItems(player);
+	entity.teleport(player, $seeker_spawn_loc);
+	player.setSpawn(player, $seeker_spawn_loc);
+	entity.addEffect(player, "slowness", $slowtime, 6);
+	entity.addEffect(player, "jump_boost", $slowtime, 128);
+	return;
+}
+
+function setEscaper(player) {
+	setStackIcons(player, $hider_skills);
+	player_uuid = player.getUuid(player);
+	entity.setHealth(player, 20);
+	player.setHunger(player, 20);
+	player.setSaturation(player, 5);
+	entity.clearEffects(player);
+	player.clearInventory(player);
+	list.add($escaperlist, player_uuid);
+	list.remove($seekerlist, player_uuid);
+	player.giveItem(player, $diapickaxe);
+	player.giveItem(player, $stick);
+	player.giveItem(player, $blocks512);
+	map.add($times, player_uuid, 30);
+	entity.teleport(player, $escaper_spawn_loc);
+	player.setSpawn(player, $escaper_spawn_loc);
+	return;
+}
+
+function giveSeekerItems(player) {
+	player.giveItem(player, $ironpickaxe);
+	player.giveItem(player, $blocks64);
+	return;
+}
+
+function setCatchLastExeTime(player, skill_name) {
+	player_uuid = player.getUuid(player);
+	player_map = map.getOrDefault($cooldown_map, player_uuid, map.new());
+	map.add(player_map, skill_name, time.getMillis());
+	map.add($cooldown_map, player_uuid, player_map);
+}
+
+function getCatchLastExeTime(player, skill_name) {
+	player_map = map.get($cooldown_map, player.getUuid(player));
+	if(player_map == null) {
+		return 0;
+	}
+	return map.getOrDefault(player_map, skill_name, 0);
+}
+
+function setStackIcons(player, skills_list) {
+	stacks.clear(player);
+	for(h = 0; h < list.getSize(skills_list); h++) {
+		skill = list.getIndex(skills_list, h);
+		icon_id = skill[2];
+		stacks.set(player, h, icon_id, 0);
+	}
+	stacks.setActive(player, true);
+}
+
+function addSeekerSkill(skill_name, cooldown, icon_id, effecttime, amplifier, offensive, tech_name) {
+	skill = array.new(7);
+	skill[0] = skill_name;
+	skill[1] = cooldown; //s
+	skill[2] = icon_id;
+	skill[3] = effecttime; //s
+	skill[4] = amplifier;
+	skill[5] = offensive;
+	skill[6] = tech_name;
+	list.add($seeker_skills, skill);
+}
+
+function addHiderSkill(skill_name, cooldown, icon_id, effecttime, amplifier, offensive, tech_name) {
+	skill = array.new(7);
+	skill[0] = skill_name;
+	skill[1] = cooldown; //s
+	skill[2] = icon_id;
+	skill[3] = effecttime; //s
+	skill[4] = amplifier;
+	skill[5] = offensive;
+	skill[6] = tech_name;
+	list.add($hider_skills, skill);
+}
+
+@player_logout
+@player_giveup
+minigame.speakAll(gamename, concat("§6", player.getName(player), " §rhas left the game."));
+script = script.getFromId(script_id);
+minigame.kickPlayer(script, player);
+player_uuid = player.getUuid(player);
+map.remove(points, player_uuid);
+list.remove(seekerlist, player_uuid);
+list.remove(escaperlist, player_uuid);
+if(list.getSize(player_list) < minplayers) {
+	minplayers--;
+	if(--seeker_amount == 0) {
+		winner_uuid = list.getIndex(player_list, 0);
+		goto("win");
+	}
+}
+if(list.contains(seekerlist, player_uuid)) {
+	//Ersatz-Sucher erstellen
+	p = player.get(list.getIndex(escaperlist, math.random(0, list.getSize(escaperlist) - 1)));
+	setSeeker(p);
+	speakPrefix(p, gamename, "A catcher has left. You are a catcher now.");
+	gosub("updatedisplay");
+}
+goto("checkgame");
+
+@win
+winnername = player.getName(winner_uuid);
+for(i = 0; i < list.getSize(player_list); i++) {
+	p_uuid = list.getIndex(player_list, i);
+	p = player.get(p_uuid);
+	speakPrefix(p, gamename, concat("§6", winnername, "§r has won."));
+	player.tpGamesLobby(p);
+	resetplayer(p);
+	
+	p_id = player.getId(p);
+	last_record = getPoints(rankingtable, p_id);
+	if(p_uuid == winner_uuid) {
+		last_record++;
+	}
+	playedgames = getPlayedGames(rankingtable, p_id) + 1;
+	setRanking(rankingtable, p_id, last_record, playedgames);
+	
+	minigame.statsHeader(p, gamename, "§e");
+	minigame.statsLine(p, "§e", "Played games", text.number(playedgames));
+	minigame.statsLine(p, "§e", "Won games", text.number(last_record));
+	if(playedgames != 0) {
+		minigame.statsLine(p, "§e", "Win ratio", concat(text.number(math.roundComma((last_record / playedgames) * 100, 2)), "%"));
+	}
+	
+	iter = list.iterator(placedblocks);
+	while(hasNext(iter)) {
+		block.set(next(iter), "minecraft:air");
+	}
+	iter = map.iterator(brokenblocks);
+	while(hasNext(iter)) {
+		element = next(iter);
+		loc = map.getKey(element);
+		type = map.getValue(element);
+		block.set(loc, type);
+	}
+	block.set(dia_loc, "minecraft:diamond_block");
+	entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
+}
+script = script.getFromId(script_id);
+minigame.kickAllPlayers(script);
+minigame.term(script, gamesignloc);
+term();

+ 6 - 4
minigames/catch/catchmap1.txt → minigames/hideandseek/hideandseekmap1.txt

@@ -10,8 +10,10 @@ middleloc = loc.new(gamesworld, 4000, 100, 2000);
 
 seeker_amount = 2;
 dia_loc = loc.new(gamesworld, 4000, 96, 2000);
-escaper_spawn_loc = loc.new(gamesworld, 4000, 100, 1992);
-seeker_spawn_loc = loc.new(gamesworld, 4000, 100, 2008);
-resettoloc = loc.new(gamesworld, 3975, 49, 1975);
-resetfromloc = loc.new(gamesworld, 4499, 99, 1950);
+escaper_spawn_loc = loc.new(gamesworld, 4000, 100, 1992, 0.0001, 0.0001);
+seeker_spawn_loc = loc.new(gamesworld, 4000, 100, 2008, 180, 0.0001);
 slowtime = 200; //Zeit in Ticks, wie lange Seeker slowness haben
+
+allowed_breaks = set.new();
+set.add(allowed_breaks, "minecraft:cut_sandstone");
+set.add(allowed_breaks, "minecraft:sandstone");

+ 6 - 4
minigames/catch/catchmap2.txt → minigames/hideandseek/hideandseekmap2.txt

@@ -10,8 +10,10 @@ middleloc = loc.new(gamesworld, 3526, 102, 2017);
 
 seeker_amount = 1;
 dia_loc = loc.new(gamesworld, 3526, 98, 2017);
-escaper_spawn_loc = loc.new(gamesworld, 3526, 102, 2009);
-seeker_spawn_loc = loc.new(gamesworld, 3526, 102, 2025);
-resettoloc = loc.new(gamesworld, 3501, 51, 1992);
-resetfromloc = loc.new(gamesworld, 4499, 99, 1950);
+escaper_spawn_loc = loc.new(gamesworld, 3526, 102, 2009, 0.0001, 0.0001);
+seeker_spawn_loc = loc.new(gamesworld, 3526, 102, 2025, 180, 0.0001);
 slowtime = 200; //Zeit in Ticks, wie lange Seeker slowness haben
+
+allowed_breaks = set.new();
+set.add(allowed_breaks, "minecraft:cut_sandstone");
+set.add(allowed_breaks, "minecraft:sandstone");

+ 13 - 5
minigames/knockfight/knockfight.txt

@@ -2,7 +2,9 @@ rankingtable = "knockranks";
 
 event.load("player_toss");
 event.load("function_key");
-event.load("living_is_attacked");
+event.load("living_hurt");
+event.load("player_pre_respawn");
+event.load("player_post_respawn");
 
 kf_skills = list.new();
 addKnockfightSkill("Speed", "km:skill44", 30, 173);
@@ -57,7 +59,7 @@ cancel = true;
 player.giveItem(player, item);
 goto("checkgame");
 
-@living_is_attacked
+@living_hurt
 if(!isPlayer(living_entity)) {
 	goto("checkgame");
 }
@@ -83,7 +85,7 @@ if(damage_type == "outOfWorld") {
 	new_lifes = map.get(lifes, player_uuid) - 1;
 	map.add(lifes, player_uuid, new_lifes);
 	gosub("updatedisplay");
-	entity.teleport(player, list.getIndex(startlocs, math.random(0, list.getSize(startlocs) - 1)));
+	entity.damage(player, 1000);
 	if(lastdamager_uuid == null) {
 		minigame.speakAll(gamename, concat("§6", player_name, " §rfelt."));
 	} else {
@@ -97,6 +99,14 @@ if(damage_type == "outOfWorld") {
 }
 goto("checkgame");
 
+@player_post_respawn
+player.giveItem(player, stick);
+goto("checkgame");
+
+@player_pre_respawn
+player.setSpawn(player, list.getIndex(startlocs, math.random(0, list.getSize(startlocs) - 1)));
+goto("checkgame");
+
 @block_break
 @block_place
 cancel = true;
@@ -116,8 +126,6 @@ if(diff_time < needed_cooldown) {
 	player.action(player, concat("§a", text.number(needed_cooldown - diff_time), "s cooldown left"));
 	goto("checkgame");
 }
-item = skill[1];
-icon_id = skill[3];
 if(key == 1) {
 	entity.addEffect(player, "speed", 200, 1);
 } elseif(key == 2) {

+ 83 - 59
minigames/sammelfieber/sammelfieber.txt

@@ -1,7 +1,9 @@
 carved_pumpkin = read.item("carved_pumpkin");
 leaves_tag = block.getTag("minecraft:leaves");
+double_block_half_property = block.getProperty("double_block_half");
+
 gosub("setstart");
-stufe = 1;
+step = 1;
 gamename = "§aSammelfieber";
 
 templist = list.new();
@@ -13,39 +15,70 @@ 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");
+			minigame.speakAll(item_type);
+			minigame.speakAll("False Item found. Game termed. Inform marvinius.");
 			term();
 		}
 	}
 }
+goto("simplelobby");
 
-if(maxplayers == 1) {
-	rankingtable = "sfsingle";
-	sign.started(gamesignloc);
-	wait(); //block_click beim Betreten des Spiels
-	wait(); //player_join des SinglePlayers
-	goto("finalstart");
+@specificLobbyHandling
+if(event == "player_join") {
+	if(init_signs == null) {
+		block.setSign(sign_min_loc, 2, text.number(min));
+		block.setSign(sign_amount_loc, 2, text.number(amount_nextitems));
+		init_signs = true;
+	}
+	return;
 }
-
-rankingtable = concat("sfmulti", text.number(maxplayers));
-goto("simplelobby");
+if(event == "block_click") {
+	if(hand == "offhand") {
+		return;
+	}
+	if(block_loc == plus_min_loc) {
+		if(min < max_mins) {
+			min++;
+		}
+		block.setSign(sign_min_loc, 2, text.number(min));
+		return;
+	}
+	if(block_loc == minus_min_loc) {
+		if(min > 1) {
+			min--;
+		}
+		block.setSign(sign_min_loc, 2, text.number(min));
+		return;
+	}
+	if(block_loc == plus_amount_loc) {
+		if(amount_nextitems < max_nextitems) {
+			amount_nextitems++;
+		}
+		block.setSign(sign_amount_loc, 2, text.number(amount_nextitems));
+		return;
+	}
+	if(block_loc == minus_amount_loc) {
+		if(amount_nextitems > 1) {
+			amount_nextitems--;
+		}
+		block.setSign(sign_amount_loc, 2, text.number(amount_nextitems));
+		return;
+	}
+}
+return;
 
 @finalstart
 player_list = minigame.getPlayers(script_id);
 minigame.speakAll(gamename, "The game has started.");
-double_block_half_property = block.getProperty("double_block_half");
 
-min = 16;
-sec = 0;
+whole_secs = min * 60 + sec;
+time_phase_1 = whole_secs / 4 * 3;
+time_phase_2 = whole_secs / 4 * 2;
+time_phase_3 = whole_secs / 4;
+
 timer_string = concat("§bTimer: §r", text.number(min), " min 0", text.number(sec), " s");
 
 iter = list.iterator(player_list);
@@ -59,7 +92,7 @@ while(hasNext(iter)) {
 	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);
+	entity.addEffect(player, "speed", min * 60 * 20, 1);
 }
 
 event.load("bucket_use");
@@ -72,14 +105,14 @@ 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");
+player_blocks = set.new();
+set.add(player_blocks, "minecraft:crafting_table");
+set.add(player_blocks, "minecraft:furnace");
+set.add(player_blocks, "minecraft:chest");
 	
 nextitems = list.new();
 founditems = list.new();
-workbenches = set.new();
+player_blocks_placed = set.new();
 resetlist_type = list.new();
 resetlist_loc = list.new();
 resetlistdouble_type = list.new();
@@ -88,7 +121,7 @@ resetlistdouble_loc2 = list.new();
 
 sgoto(1, "tick");
 
-for(h = 0; h < 3; h++) {
+for(h = 0; h < amount_nextitems; h++) {
 	gosub("newitem");
 }
 
@@ -104,7 +137,7 @@ goto("wait");
 
 @block_click
 if(action == "right") {
-	if(set.contains(workbench_types, block_type)) {
+	if(set.contains(player_blocks, block_type)) {
 		goto("wait");
 	}
 	if(hand == "MAIN_HAND") {
@@ -113,7 +146,7 @@ if(action == "right") {
 		hand = "offhand";
 	}
 	item_type = item.getType(entity.getEquip(player, hand));
-	if(set.contains(workbench_types, item_type)) {
+	if(set.contains(player_blocks, item_type)) {
 		goto("wait");
 	}
 	cancel = true;
@@ -130,7 +163,7 @@ if(isPlayer(living_entity)) {
 goto("wait");
 
 @block_break
-if(set.contains(workbench_types, block_type)) {
+if(set.contains(player_blocks, block_type)) {
 	goto("wait");
 }
 if(block.hasTag(leaves_tag, block.get(block_loc))) {
@@ -177,9 +210,9 @@ goto("wait");
 
 @block_place
 cancel = true;
-if(set.contains(workbench_types, block_type)) {
+if(set.contains(player_blocks, block_type)) {
 	cancel = false;
-	set.add(workbenches, block_loc);
+	set.add(player_blocks_placed, block_loc);
 }
 goto("wait");
 
@@ -245,36 +278,41 @@ if(list.contains(nextitems, itype)) {
 goto("wait");
 
 @newitem
-if(min < 12) {
-	if(stufe == 1) {
+atm_time = min * 60 + sec;
+if(atm_time < time_phase_1) {
+	if(step == 1) {
 		for(i = 0; i < list.getSize(items2); i++) {
 			list.add(items1, list.getIndex(items2, i));
 		}
-		stufe = 2;
+		step = 2;
 	}
-	if(min < 8) {
-		if(stufe == 2) {
+	if(atm_time < time_phase_2) {
+		if(step == 2) {
 			for(i = 0; i < list.getSize(items3); i++) {
 				list.add(items1, list.getIndex(items3, i));
 			}
-			stufe = 3;
+			step = 3;
 		}
-		if(min < 4) {
-			if(stufe == 3) {
+		if(atm_time < time_phase_3) {
+			if(step == 3) {
 				for(i = 0; i < list.getSize(items4); i++) {
 					list.add(items1, list.getIndex(items4, i));
 				}
-				stufe = 4;
+				step = 4;
 			}
 		}
 	}
 }
-randomitemstring = list.getIndex(items1, math.random(0, list.getSize(items1) - 1));
+items1_size = list.getSize(items1);
+if(items1_size == 0) {
+	return;
+}
+randomitemstring = list.getIndex(items1, math.random(0, items1_size - 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));
+	minigame.displayAll(5 + i, text.replace(type, "minecraft:", ""));
 }
 return;
 
@@ -293,29 +331,15 @@ 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));
-	minigame.addElo(player, yetfound * 2);
 }
 @endcore
-iter = set.iterator(workbenches);
+iter = set.iterator(player_blocks_placed);
 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();
+term();

+ 1 - 329
minigames/sammelfieber/sammelfieberitems.txt

@@ -326,332 +326,4 @@ list.add(items4, "minecraft:diamond_chestplate");
 list.add(items4, "minecraft:diamond_leggings");
 list.add(items4, "minecraft:diamond_boots");
 list.add(items4, "minecraft:diamond_hoe");
-list.add(items4, "minecraft:golden_hoe");
-
-map.new(items);
-//items1
-map.add(items, "minecraft:wheat", "Weizen");
-map.add(items, "minecraft:bread", "Brot");
-map.add(items, "minecraft:dirt", "Erde");
-map.add(items, "minecraft:coarse_dirt", "Grobe Erde");
-map.add(items, "minecraft:sand", "Sand");
-map.add(items, "minecraft:red_sand", "Roter Sand");
-map.add(items, "minecraft:stone", "Stein");
-map.add(items, "minecraft:granite", "Granit");
-map.add(items, "minecraft:polished_granite", "Polierter Granit");
-map.add(items, "minecraft:diorite", "Diorit");
-map.add(items, "minecraft:polished_diorite", "Polierter Diorit");
-map.add(items, "minecraft:andesite", "Andesit");
-map.add(items, "minecraft:polished_andesite", "Polierter Andesit");
-map.add(items, "minecraft:cobblestone", "Bruchstein");
-map.add(items, "minecraft:oak_planks", "Eichenholzbretter");
-map.add(items, "minecraft:spruce_planks", "Fichtenholzbretter");
-map.add(items, "minecraft:birch_planks", "Birkenholzbretter");
-map.add(items, "minecraft:jungle_planks", "Tropenholzbretter");
-map.add(items, "minecraft:acacia_planks", "Akazienholzbretter");
-map.add(items, "minecraft:dark_oak_planks", "Schwarzeichenholzbretter");
-map.add(items, "minecraft:oak_sapling", "Eichensetzling");
-map.add(items, "minecraft:spruce_sapling", "Fichtensetzling");
-map.add(items, "minecraft:birch_sapling", "Birkensetzling");
-map.add(items, "minecraft:jungle_sapling", "Tropenbaumsetzling");
-map.add(items, "minecraft:acacia_sapling", "Akaziensetzling");
-map.add(items, "minecraft:dark_oak_sapling", "Schwarzeichensetzling");
-map.add(items, "minecraft:gravel", "Kies");
-map.add(items, "minecraft:oak_log", "Eichenstamm");
-map.add(items, "minecraft:spruce_log", "Fichtenstamm");
-map.add(items, "minecraft:birch_log", "Birkenstamm");
-map.add(items, "minecraft:jungle_log", "Tropenbaumstamm");
-map.add(items, "minecraft:acacia_log", "Akazienstamm");
-map.add(items, "minecraft:dark_oak_log", "Schwarzeichenstamm");
-map.add(items, "minecraft:dandelion", "Löwenzahn");
-map.add(items, "minecraft:poppy", "Mohn");
-map.add(items, "minecraft:blue_orchid", "blaue Orchidee");
-map.add(items, "minecraft:allium", "Sternlauch");
-map.add(items, "minecraft:azure_bluet", "Porzellansternchen");
-map.add(items, "minecraft:red_tulip", "rote Tulpe");
-map.add(items, "minecraft:orange_tulip", "orange Tulpe");
-map.add(items, "minecraft:white_tulip", "weiße Tulpe");
-map.add(items, "minecraft:pink_tulip", "rosa Tulpe");
-map.add(items, "minecraft:oxeye_daisy", "Margerite");
-map.add(items, "minecraft:sandstone", "Sandstein");
-map.add(items, "minecraft:red_sandstone", "Roter Sandstein");
-map.add(items, "minecraft:grass", "Gras");
-map.add(items, "minecraft:brown_mushroom", "Brauner Pilz");
-map.add(items, "minecraft:red_mushroom", "Roter Pilz");
-map.add(items, "minecraft:crafting_table", "Werkbank");
-map.add(items, "minecraft:furnace", "Ofen");
-map.add(items, "minecraft:cactus", "Kaktus");
-map.add(items, "minecraft:pumpkin", "Kürbis");
-map.add(items, "minecraft:stick", "Stock");
-map.add(items, "minecraft:wooden_sword", "Holzschwert");
-map.add(items, "minecraft:wooden_shovel", "Holzschaufel");
-map.add(items, "minecraft:wooden_pickaxe", "Holzspitzhacke");
-map.add(items, "minecraft:stone_sword", "Steinschwert");
-map.add(items, "minecraft:stone_shovel", "Steinschaufel");
-map.add(items, "minecraft:stone_pickaxe", "Steinspitzhacke");
-map.add(items, "minecraft:stone_axe", "Steinaxt");
-map.add(items, "minecraft:red_dye", "roter Farbstoff");
-map.add(items, "minecraft:cocoa_beans", "Kakaobohnen");
-map.add(items, "minecraft:light_gray_dye", "hellgrauer Farbstoff");
-map.add(items, "minecraft:pink_dye", "rosa Farbstoff");
-map.add(items, "minecraft:yellow_dye", "gelber Farbstoff");
-map.add(items, "minecraft:light_blue_dye", "hellblauer Farbstoff");
-map.add(items, "minecraft:magenta_dye", "magenta Farbstoff");
-map.add(items, "minecraft:orange_dye", "oranger Farbstoff");
-map.add(items, "minecraft:sugar", "Zucker");
-map.add(items, "minecraft:melon", "Melone");
-map.add(items, "minecraft:melon_slice", "Melonenscheibe");
-map.add(items, "minecraft:pumpkin_seeds", "Kürbissamen");
-map.add(items, "minecraft:melon_seeds", "Melonenkerne");
-map.add(items, "minecraft:carrot", "Karotte");
-map.add(items, "minecraft:potato", "Kartoffel");
-map.add(items, "minecraft:poisonous_potato", "Giftige Kartoffel");
-map.add(items, "minecraft:oak_trapdoor", "Eichenfalltür");
-map.add(items, "minecraft:oak_button", "Eichenholzknopf");
-map.add(items, "minecraft:sugar_cane", "Zuckerrohr");
-//items2
-map.add(items, "minecraft:white_wool", "weiße Wolle");
-map.add(items, "minecraft:bowl", "Schüssel");
-map.add(items, "minecraft:paper", "Papier");
-map.add(items, "minecraft:fishing_rod", "Angel");
-map.add(items, "minecraft:iron_ore", "Eisenerz");
-map.add(items, "minecraft:iron_ingot", "Eisenbarren");
-map.add(items, "minecraft:glass", "Glas");
-map.add(items, "minecraft:chiseled_sandstone", "Gemeißelter Sandstein");
-map.add(items, "minecraft:cut_sandstone", "Geschnittener Sandstein");
-map.add(items, "minecraft:smooth_sandstone", "Glatter Sandstein");
-map.add(items, "minecraft:chiseled_red_sandstone", "Gemeißelter roter Sandstein");
-map.add(items, "minecraft:smooth_red_sandstone", "Glatter roter Sandstein");
-map.add(items, "minecraft:cut_red_sandstone", "Geschnittener roter Sandstein");
-map.add(items, "minecraft:red_sandstone_stairs", "Rote Sandsteintreppe");
-map.add(items, "minecraft:red_sandstone_slab", "Rote Sandsteinstufe");
-map.add(items, "minecraft:stone_slab", "Steinstufe");
-map.add(items, "minecraft:sandstone_slab", "Sandsteinstufe");
-map.add(items, "minecraft:cobblestone_slab", "Bruchsteinstufe");
-map.add(items, "minecraft:stone_brick_slab", "Steinziegelstufe");
-map.add(items, "minecraft:mossy_cobblestone", "Bemooster Bruchstein");
-map.add(items, "minecraft:chest", "Truhe");
-map.add(items, "minecraft:ladder", "Leiter");
-map.add(items, "minecraft:lever", "Hebel");
-map.add(items, "minecraft:oak_pressure_plate", "Eichenholzdruckplatte");
-map.add(items, "minecraft:spruce_pressure_plate", "Fichtenholzdruckplatte");
-map.add(items, "minecraft:birch_pressure_plate", "Birkenholzdruckplatte");
-map.add(items, "minecraft:jungle_pressure_plate", "Tropenholzdruckplatte");
-map.add(items, "minecraft:acacia_pressure_plate", "Akazienholzdruckplatte");
-map.add(items, "minecraft:dark_oak_pressure_plate", "Schwarzeichenholzdruckplatte");
-map.add(items, "minecraft:snow_block", "Schneeblock");
-map.add(items, "minecraft:snowball", "Schneeball");
-map.add(items, "minecraft:oak_fence", "Eichenholzzaun");
-map.add(items, "minecraft:bow", "Bogen");
-map.add(items, "minecraft:coal", "Kohle");
-map.add(items, "minecraft:charcoal", "Holzkohle");
-map.add(items, "minecraft:oak_stairs", "Eichenholztreppe");
-map.add(items, "minecraft:spruce_stairs", "Fichtentreppe");
-map.add(items, "minecraft:birch_stairs", "Birkentreppe");
-map.add(items, "minecraft:jungle_stairs", "Tropenholztreppe");
-map.add(items, "minecraft:acacia_stairs", "Akazienholztreppe");
-map.add(items, "minecraft:dark_oak_stairs", "Schwarzeichenholztreppe");
-map.add(items, "minecraft:stone_stairs", "Steintreppe");
-map.add(items, "minecraft:cobblestone_stairs", "Bruchsteintreppe");
-map.add(items, "minecraft:clay_ball", "Tonklumpen");
-map.add(items, "minecraft:oak_fence_gate", "Eichenholzzauntor");
-map.add(items, "minecraft:spruce_fence_gate", "Fichtenholzzauntor");
-map.add(items, "minecraft:birch_fence_gate", "Birkenholzzauntor");
-map.add(items, "minecraft:jungle_fence_gate", "Tropenholzzauntor");
-map.add(items, "minecraft:dark_oak_fence_gate", "Schwarzeichenholzzauntor");
-map.add(items, "minecraft:acacia_fence_gate", "Akazienholzzauntor");
-map.add(items, "minecraft:spruce_fence", "Fichtenholzzaun");
-map.add(items, "minecraft:birch_fence", "Birkenholzzaun");
-map.add(items, "minecraft:jungle_fence", "Tropenholzzaun");
-map.add(items, "minecraft:dark_oak_fence", "Schwarzeichenholzzaun");
-map.add(items, "minecraft:acacia_fence", "Akazienholzzaun");
-map.add(items, "minecraft:orange_stained_glass", "oranges Glas");
-map.add(items, "minecraft:magenta_stained_glass", "magenta Glas");
-map.add(items, "minecraft:light_blue_stained_glass", "hellblaues Glas");
-map.add(items, "minecraft:yellow_stained_glass", "gelbes Glas");
-map.add(items, "minecraft:pink_stained_glass", "rosa Glas");
-map.add(items, "minecraft:light_gray_stained_glass", "hellgraues Glas");
-map.add(items, "minecraft:brown_stained_glass", "braunes Glas");
-map.add(items, "minecraft:red_stained_glass", "rotes Glas");
-map.add(items, "minecraft:orange_stained_glass_pane", "orange Glasscheibe");
-map.add(items, "minecraft:magenta_stained_glass_pane", "magenta Glasscheibe");
-map.add(items, "minecraft:light_blue_stained_glass_pane", "hellblaue Glasscheibe");
-map.add(items, "minecraft:yellow_stained_glass_pane", "gelbe Glasscheibe");
-map.add(items, "minecraft:pink_stained_glass_pane", "rosa Glasscheibe");
-map.add(items, "minecraft:light_gray_stained_glass_pane", "hellgraue Glasscheibe");
-map.add(items, "minecraft:brown_stained_glass_pane", "braune Glasscheibe");
-map.add(items, "minecraft:red_stained_glass_pane", "rote Glasscheibe");
-map.add(items, "minecraft:white_carpet", "weißer Teppich");
-map.add(items, "minecraft:orange_carpet", "oranger Teppich");
-map.add(items, "minecraft:magenta_carpet", "magenta Teppich");
-map.add(items, "minecraft:light_blue_carpet", "hellblauer Teppich");
-map.add(items, "minecraft:yellow_carpet", "gelber Teppich");
-map.add(items, "minecraft:pink_carpet", "rosa Teppich");
-map.add(items, "minecraft:light_gray_carpet", "hellgrauer Teppich");
-map.add(items, "minecraft:brown_carpet", "brauner Teppich");
-map.add(items, "minecraft:red_carpet", "roter Teppich");
-map.add(items, "minecraft:green_dye", "grüner Farbstoff");
-map.add(items, "minecraft:stone_bricks", "Steinziegel");
-map.add(items, "minecraft:glass_pane", "Glasscheibe");
-map.add(items, "minecraft:oak_slab", "Eichenholzstufe");
-map.add(items, "minecraft:spruce_slab", "Fichtenholzstufe");
-map.add(items, "minecraft:birch_slab", "Birkenholzstufe");
-map.add(items, "minecraft:jungle_slab", "Tropenholzstufe");
-map.add(items, "minecraft:acacia_slab", "Akazienholzstufe");
-map.add(items, "minecraft:dark_oak_slab", "Schwarzeichenholzstufe");
-map.add(items, "minecraft:sandstone_stairs", "Sandsteintreppe");
-map.add(items, "minecraft:cobblestone_wall", "Bruchsteinmauer");
-map.add(items, "minecraft:spruce_door", "Fichtenholztür");
-map.add(items, "minecraft:birch_door", "Birkenholztür");
-map.add(items, "minecraft:jungle_door", "Tropenholztür");
-map.add(items, "minecraft:acacia_door", "Akazienholztür");
-map.add(items, "minecraft:dark_oak_door", "Schwarzeichenholztür");
-map.add(items, "minecraft:red_bed", "rotes Bett");
-map.add(items, "minecraft:cookie", "Kekse");
-map.add(items, "minecraft:shears", "Schere");
-map.add(items, "minecraft:string", "Faden");
-map.add(items, "minecraft:wooden_hoe", "Holzhacke");
-map.add(items, "minecraft:stone_hoe", "Steinhacke");
-map.add(items, "minecraft:flint", "Feuerstein");
-map.add(items, "minecraft:painting", "Gemälde");
-map.add(items, "minecraft:oak_sign", "Eichenholzschild");
-map.add(items, "minecraft:oak_door", "Eichenholztür");
-map.add(items, "minecraft:oak_boat", "Eichenholzboot");
-map.add(items, "minecraft:shield", "Schild");
-//items3
-map.add(items, "minecraft:bucket", "Eimer");
-map.add(items, "minecraft:minecart", "Lore");
-map.add(items, "minecraft:iron_door", "Eisentür");
-map.add(items, "minecraft:redstone", "Redstone");
-map.add(items, "minecraft:coal_block", "Kohleblock");
-map.add(items, "minecraft:iron_block", "Eisenblock");
-map.add(items, "minecraft:gold_ore", "Golderz");
-map.add(items, "minecraft:gold_ingot", "Goldbarren");
-map.add(items, "minecraft:oak_leaves", "Eichenholzblätter");
-map.add(items, "minecraft:spruce_leaves", "Fichtenholzblätter");
-map.add(items, "minecraft:birch_leaves", "Birkenholzblätter");
-map.add(items, "minecraft:jungle_leaves", "Tropenholzblätter");
-map.add(items, "minecraft:acacia_leaves", "Akazienblätter");
-map.add(items, "minecraft:dark_oak_leaves", "Schwarzeichenblätter");
-map.add(items, "minecraft:lapis_block", "Lapislazuliblock");
-map.add(items, "minecraft:brick_slab", "Ziegelstufe");
-map.add(items, "minecraft:torch", "Fackel");
-map.add(items, "minecraft:stone_button", "Steinknopf");
-map.add(items, "minecraft:stone_pressure_plate", "Steindruckplatte");
-map.add(items, "minecraft:redstone_torch", "Redstonefackel");
-map.add(items, "minecraft:iron_shovel", "Eisenschaufel");
-map.add(items, "minecraft:iron_pickaxe", "Eisenspitzhacke");
-map.add(items, "minecraft:iron_axe", "Eisenaxt");
-map.add(items, "minecraft:iron_sword", "Eisenschwert");
-map.add(items, "minecraft:flint_and_steel", "Feuerzeug");
-map.add(items, "minecraft:diamond", "Diamant");
-map.add(items, "minecraft:clay", "Ton");
-map.add(items, "minecraft:jack_o_lantern", "Kürbislaterne");
-map.add(items, "minecraft:green_stained_glass", "grünes Glas");
-map.add(items, "minecraft:green_stained_glass_pane", "grüne Glasscheibe");
-map.add(items, "minecraft:green_carpet", "grüner Teppich");
-map.add(items, "minecraft:lapis_lazuli", "Lapislazuli");
-map.add(items, "minecraft:purple_dye", "violetter Farbstoff");
-map.add(items, "minecraft:cyan_dye", "türkiser Farbstoff");
-map.add(items, "minecraft:cracked_stone_bricks", "rissige Steinziegel");
-map.add(items, "minecraft:chiseled_stone_bricks", "gemeißelte Steinziegel");
-map.add(items, "minecraft:iron_bars", "Eisengitter");
-map.add(items, "minecraft:tripwire_hook", "Haken");
-map.add(items, "minecraft:mossy_cobblestone_wall", "bemooste Bruchsteinmauer");
-map.add(items, "minecraft:light_weighted_pressure_plate", "Feinwägeplatte");
-map.add(items, "minecraft:iron_trapdoor", "Eisenfalltür");
-map.add(items, "minecraft:iron_helmet", "Eisenhelm");
-map.add(items, "minecraft:iron_chestplate", "Eisenbrustplatte");
-map.add(items, "minecraft:iron_leggings", "Eisenhose");
-map.add(items, "minecraft:iron_boots", "Eisenschuhe");
-map.add(items, "minecraft:iron_hoe", "Eisenhacke");
-map.add(items, "minecraft:mushroom_stew", "Pilzsuppe");
-map.add(items, "minecraft:gold_nugget", "Goldklumpen");
-map.add(items, "minecraft:glass_bottle", "Glasflasche");
-map.add(items, "minecraft:cauldron", "Kessel");
-map.add(items, "minecraft:map", "Karte");
-map.add(items, "minecraft:baked_potato", "Gebratene Kartoffel");
-map.add(items, "minecraft:carrot_on_a_stick", "Karottenrute");
-map.add(items, "minecraft:armor_stand", "Rüstungsständer");
-map.add(items, "minecraft:flower_pot", "Blumentopf");
-map.add(items, "minecraft:orange_wool", "orange Wolle");
-map.add(items, "minecraft:magenta_wool", "magenta Wolle");
-map.add(items, "minecraft:light_blue_wool", "hellblaue Wolle");
-map.add(items, "minecraft:yellow_wool", "gelbe Wolle");
-map.add(items, "minecraft:pink_wool", "rosa Wolle");
-map.add(items, "minecraft:light_gray_wool", "hellgraue Wolle");
-map.add(items, "minecraft:brown_wool", "braune Wolle");
-map.add(items, "minecraft:green_wool", "grüne Wolle");
-map.add(items, "minecraft:red_wool", "rote Wolle");
-//items4
-map.add(items, "minecraft:glistering_melon_slice", "Glitzernde Melonenscheibe");
-map.add(items, "minecraft:chest_minecart", "Kistenlore");
-map.add(items, "minecraft:furnace_minecart", "Ofenlore");
-map.add(items, "minecraft:compass", "Kompass");
-map.add(items, "minecraft:golden_carrot", "Goldene Karotte");
-map.add(items, "minecraft:hopper_minecart", "Trichterlore");
-map.add(items, "minecraft:repeater", "Redstone Verstärker");
-map.add(items, "minecraft:golden_helmet", "Goldhelm");
-map.add(items, "minecraft:golden_chestplate", "Goldbrustplatte");
-map.add(items, "minecraft:golden_leggings", "Goldhose");
-map.add(items, "minecraft:golden_boots", "Goldschuhe");
-map.add(items, "minecraft:golden_sword", "Goldschwert");
-map.add(items, "minecraft:golden_shovel", "Goldschaufel");
-map.add(items, "minecraft:golden_pickaxe", "Goldspitzhacke");
-map.add(items, "minecraft:golden_axe", "Goldaxt");
-map.add(items, "minecraft:gold_block", "Goldblock");
-map.add(items, "minecraft:dispenser", "Werfer");
-map.add(items, "minecraft:noteblock", "Notenblock");
-map.add(items, "minecraft:rail", "Schiene");
-map.add(items, "minecraft:golden_rail", "Antriebsschiene");
-map.add(items, "minecraft:detector_rail", "Sensorschiene");
-map.add(items, "minecraft:piston", "Kolben");
-map.add(items, "minecraft:obsidian", "Obsidian");
-map.add(items, "minecraft:diamond_block", "Diamantblock");
-map.add(items, "minecraft:cyan_wool", "türkise Wolle");
-map.add(items, "minecraft:purple_wool", "violette Wolle");
-map.add(items, "minecraft:blue_wool", "blaue Wolle");
-map.add(items, "minecraft:diamond_sword", "Diamantschwert");
-map.add(items, "minecraft:diamond_shovel", "Diamantschaufel");
-map.add(items, "minecraft:diamond_pickaxe", "Diamantspitzhacke");
-map.add(items, "minecraft:diamond_axe", "Diamantaxt");
-map.add(items, "minecraft:bricks", "Ziegelsteine");
-map.add(items, "minecraft:jukebox", "Plattenspieler");
-map.add(items, "minecraft:cyan_stained_glass_pane", "türkise Glasscheibe");
-map.add(items, "minecraft:purple_stained_glass_pane", "violette Glasscheibe");
-map.add(items, "minecraft:blue_stained_glass_pane", "blaue Glasscheibe");
-map.add(items, "minecraft:cyan_stained_glass", "türkises Glas");
-map.add(items, "minecraft:purple_stained_glass", "violettes Glas");
-map.add(items, "minecraft:blue_stained_glass", "blaues Glas");
-map.add(items, "minecraft:terracotta", "Keramik");
-map.add(items, "minecraft:orange_terracotta", "orange Keramik");
-map.add(items, "minecraft:magenta_terracotta", "magenta Keramik");
-map.add(items, "minecraft:light_blue_terracotta", "hellblaue Keramik");
-map.add(items, "minecraft:yellow_terracotta", "gelbe Keramik");
-map.add(items, "minecraft:pink_terracotta", "rosa Keramik");
-map.add(items, "minecraft:light_gray_terracotta", "hellgraue Keramik");
-map.add(items, "minecraft:cyan_terracotta", "türkise Keramik");
-map.add(items, "minecraft:purple_terracotta", "violette Keramik");
-map.add(items, "minecraft:blue_terracotta", "blaue Keramik");
-map.add(items, "minecraft:brown_terracotta", "braune Keramik");
-map.add(items, "minecraft:green_terracotta", "grüne Keramik");
-map.add(items, "minecraft:red_terracotta", "rote Keramik");
-map.add(items, "minecraft:cyan_carpet", "türkiser Teppich");
-map.add(items, "minecraft:purple_carpet", "violetter Teppich");
-map.add(items, "minecraft:blue_carpet", "blauer Teppich");
-map.add(items, "minecraft:brick_stairs", "Ziegeltreppe");
-map.add(items, "minecraft:stone_brick_stairs", "Steinziegeltreppe");
-map.add(items, "minecraft:emerald_block", "Smaragdblock");
-map.add(items, "minecraft:anvil", "Amboss");
-map.add(items, "minecraft:trapped_chest", "Redstonetruhe");
-map.add(items, "minecraft:heavy_weighted_pressure_plate", "Grobwägeplatte");
-map.add(items, "minecraft:redstone_block", "Redstoneblock");
-map.add(items, "minecraft:hopper", "Trichter");
-map.add(items, "minecraft:activator_rail", "Aktivierungsschiene");
-map.add(items, "minecraft:dropper", "Spender");
-map.add(items, "minecraft:diamond_helmet", "Diamanthelm");
-map.add(items, "minecraft:diamond_chestplate", "Diamantbrustplatte");
-map.add(items, "minecraft:diamond_leggings", "Diamanthose");
-map.add(items, "minecraft:diamond_boots", "Diamantschuhe");
-map.add(items, "minecraft:diamond_hoe", "Diamanthacke");
-map.add(items, "minecraft:golden_hoe", "Goldhacke");
+list.add(items4, "minecraft:golden_hoe");

+ 18 - 4
minigames/sammelfieber/sfmap3.txt

@@ -1,10 +1,24 @@
+specific_lobby_handling = true;
 gamesworld = world.get("games");
 spawn_loc = loc.new(gamesworld, -6897, 63, -111, -90, 0);
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "sfsign3");
 radius = 200;
 middleloc = loc.new(gamesworld, -6897, 63, -111);
-mapname = "Multiplayer";
-lobbyspawnloc = loc.new(gamesworld, 1013.5, 85, 991.5);
-minplayers = 2;
-maxplayers = 2;
+mapname = "Free Settings";
+lobbyspawnloc = loc.new(gamesworld, 1013.5, 85, 991.5, 180, 0.0001);
+minplayers = 1;
+maxplayers = 4;
+min = 16;
+sec = 0;
+max_mins = 30;
+amount_nextitems = 3;
+max_nextitems = 10;
+
+plus_min_loc = loc.new(gamesworld, 1012, 86, 985);
+minus_min_loc = loc.new(gamesworld, 1012, 84, 985);
+sign_min_loc = loc.new(gamesworld, 1012, 85, 985);
+
+plus_amount_loc = loc.new(gamesworld, 1013, 86, 985);
+minus_amount_loc = loc.new(gamesworld, 1013, 84, 985);
+sign_amount_loc = loc.new(gamesworld, 1013, 85, 985);

+ 306 - 0
minigames/sammelfieber/sfranked.txt

@@ -0,0 +1,306 @@
+carved_pumpkin = read.item("carved_pumpkin");
+leaves_tag = block.getTag("minecraft:leaves");
+double_block_half_property = block.getProperty("double_block_half");
+
+gosub("setstart");
+step = 1;
+gamename = "§aSammelfieber";
+rankingtable = "sfsingle";
+sign.started(gamesignloc);
+
+event.load("bucket_use");
+event.load("player_pickup");
+event.load("craft");
+
+min = 16;
+sec = 0;
+timer_string = concat("§bTimer: §r", text.number(min), " min 0", text.number(sec), " s");
+
+farmtypes = list.new();
+list.add(farmtypes, "minecraft:carrots");
+list.add(farmtypes, "minecraft:melon_stem");
+list.add(farmtypes, "minecraft:potatoes");
+list.add(farmtypes, "minecraft:wheat");
+
+player_blocks = set.new();
+set.add(player_blocks, "minecraft:crafting_table");
+set.add(player_blocks, "minecraft:furnace");
+set.add(player_blocks, "minecraft:chest");
+	
+nextitems = list.new();
+founditems = list.new();
+player_blocks_placed = 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");
+
+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");
+
+@player_join
+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);
+		try {
+			item = read.item(item_type);
+		} catch {
+			minigame.speakAll(item_type);
+			minigame.speakAll("False Item found. Game termed. Inform marvinius.");
+			term();
+		}
+	}
+}
+
+player_list = minigame.getPlayers(script_id);
+minigame.speakAll(gamename, "The game has started.");
+
+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);
+}
+
+for(h = 0; h < 3; h++) {
+	gosub("newitem");
+}
+goto("wait");
+
+@block_click
+if(action == "right") {
+	if(set.contains(player_blocks, block_type)) {
+		goto("wait");
+	}
+	if(hand == "MAIN_HAND") {
+		hand = "hand";
+	} else {
+		hand = "offhand";
+	}
+	item_type = item.getType(entity.getEquip(player, hand));
+	if(set.contains(player_blocks, 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(player_blocks, 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(player_blocks, block_type)) {
+	cancel = false;
+	set.add(player_blocks_placed, 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);
+	minigame.displayAll(3, concat("§bFound Items: §r", text.number(list.getSize(founditems))));
+	gosub("newitem");
+}
+goto("wait");
+
+@newitem
+if(min < 12) {
+	if(step == 1) {
+		for(i = 0; i < list.getSize(items2); i++) {
+			list.add(items1, list.getIndex(items2, i));
+		}
+		step = 2;
+	}
+	if(min < 8) {
+		if(step == 2) {
+			for(i = 0; i < list.getSize(items3); i++) {
+				list.add(items1, list.getIndex(items3, i));
+			}
+			step = 3;
+		}
+		if(min < 4) {
+			if(step == 3) {
+				for(i = 0; i < list.getSize(items4); i++) {
+					list.add(items1, list.getIndex(items4, i));
+				}
+				step = 4;
+			}
+		}
+	}
+}
+
+items1_size = list.getSize(items1);
+if(items1_size == 0) {
+	return;
+}
+randomitemstring = list.getIndex(items1, math.random(0, items1_size - 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, text.replace(type, "minecraft:", ""));
+}
+return;
+
+@endgame
+yetfound = list.getSize(founditems);
+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));
+	minigame.addElo(player, yetfound * 2);
+}
+@player_logout
+@player_giveup
+script = script.getFromId(script_id);
+iter = set.iterator(player_blocks_placed);
+while(hasNext(iter)) {
+	block.set(next(iter), "minecraft:air");
+}
+entity.removeAll("net.minecraft.entity.item.ItemEntity", middleloc, radius);
+minigame.kickplayer(script, player);
+minigame.term(script, gamesignloc);
+term();

+ 2 - 2
minigames/shoppingchaos/shoppingchaos.txt

@@ -71,7 +71,7 @@ slime_ball = "minecraft:slime_ball";
 blaze_rod = "minecraft:blaze_rod";
 sugar_cane = "minecraft:sugar_cane";
 sugar = "minecraft:sugar";
-milk = "minecraft:milk";
+milk = "minecraft:milk_bucket";
 egg = "minecraft:egg";
 white_wool= "minecraft:white_wool";
 wheat = "minecraft:wheat";
@@ -585,7 +585,7 @@ goto("checkgame");
 
 @player_logout
 @player_giveup
-minigame.speakAll(gamename, concat("§8", player_name, " §rhas left the game."));
+minigame.speakAll(gamename, concat("§8", player.getName(player), " §rhas left the game."));
 showstats(player, false);
 player_uuid = player.getUuid(player);
 //Building-Perms wieder geben

+ 2 - 3
startscript.txt

@@ -2,7 +2,7 @@ clearscriptvars();
 
 setMOTD("§6Highlight of the year! §c/wusi");
 		
-//script.start("system/limits");
+script.start("system/limits");
 script.start("system/svars");
 script.start("system/player_data", "utils/u_general");
 script.start("system/perms", "utils/u_general");
@@ -14,7 +14,6 @@ script.start("global/copyisland");
 script.start("global/friends", "utils/u_general");
 script.start("system/damage");
 script.start("system/playtime");
-script.start("system/explosions", "utils/u_general");
 script.start("global/pumpkin");
 script.start("global/voxel");
 script.start("global/ticketsystem", "utils/u_general");
@@ -25,6 +24,6 @@ script.start("global/gamecenter", "utils/u_general", "utils/u_games", "utils/u_p
 script.start("global/ranklist", "utils/u_general", "utils/u_games");
 script.startNamed("SpawnQuests", "storydorf/spawn/core", "utils/u_general");
 
-error.setConsolePrint(false);
+error.setConsolePrint(true);
 debug.setConsolePrint(true);
 term();

+ 5 - 2
storydorf/spawn/core.txt

@@ -76,7 +76,7 @@ if(entity_name == "Mentos") {
 }
 if(entity_name == "Stone Mage") {
 	if(time.getMillis() - map.getOrDefault(timestamp, player.getUuid(player), 0) < 120000) { //2 Minutes
-		skill.showShop(player, "Subcutaneous Inventory", null, null, null, null, null, null, null, null);
+		skill.showShop(player, "Subcutaneous Inventory", "Head Hunter", null, null, null, null, null, null, null);
 	} else {
 		msg.quest(player, entity_name, 1, 1, "You have to finish some tasks first. Mentos knows more about it.");
 	}
@@ -93,7 +93,10 @@ if(item.getType(item) == "minecraft:air") {
 }
 skill_name = item.getName(item);
 if(skill.isPermanent(skill_name)) {
-	goto("wait");
+	amount = skill.getAmount(player, skill.getTechName(skill_name));
+	if(amount >= 1) {	
+		goto("wait");
+	}
 }
 cost = skill.getCost(skill_name);
 if(!hasEnoughMoney(player, cost)) {

+ 10 - 6
storydorf/spawn/stonemage.txt

@@ -126,12 +126,12 @@ if(entity_name == "Mage's apprentice") {
 }
 if(entity_name == "Stone Mage") {
 	if(stage == 20) {
-		msg.quest(player, entity_name, 1, 6, "Please give me the Tower Key.");
+		msg.quest(player, entity_name, 1, 10, "Please give me the Tower Key.");
 		stage.increase(player);
 	} elseif(stage == 21) {
 		hand_item = entity.getEquip(player, "hand");
 		if(item.getType(hand_item) == "km:golden_key" && item.getName(hand_item) == "Tower Key") {
-			msg.quest(player, entity_name, 2, 6, "Before offering you skills you have to finish some tasks for me.");
+			msg.quest(player, entity_name, 2, 10, "Before offering you skills you have to finish some tasks for me.");
 			player.removeItem(player, key);
 			stage.increase(player);
 			talk_no = 3;
@@ -141,11 +141,13 @@ if(entity_name == "Stone Mage") {
 		if(active_quest) {
 			hand_item = entity.getEquip(player, "hand");
 			if(i == 3 && item.getType(hand_item) == "minecraft:nether_wart" && warts_harvested >= 4) {
+				msg.quest(player, entity_name, talk_no++, 10, "Thank you.");
 				player.removeItem(player, read.item("minecraft:nether_wart", warts_harvested));
 				stage.increase(player);
 				active_quest = false;
 			}
 			if(i == 4 && item.getType(hand_item) == "km:mushroom_stick_cooked" && furnace_clicked) {
+				msg.quest(player, entity_name, talk_no++, 10, "Thank you.");
 				player.removeItem(player, read.item("km:mushroom_stick_cooked"));
 				stage.increase(player);
 				active_quest = false;
@@ -155,19 +157,19 @@ if(entity_name == "Stone Mage") {
 		active_quest = true;
 		i = list.getIndex(rnd_list, quest_no++);
 		if(i == 1) {
-			msg.quest(player, entity_name, talk_no++, 6, "A spider has nested in my attic. Please go up and kill it.");
+			msg.quest(player, entity_name, talk_no++, 10, "A spider has nested in my attic. Please go up and kill it.");
 			entity.spawn("cave_spider", cave_spider_loc);
 			stage.increase(player);
 		} elseif(i == 2) {
-			msg.quest(player, entity_name, talk_no++, 6, "Take this bucket, fill it with water and then pour it into the cauldron.");
+			msg.quest(player, entity_name, talk_no++, 10, "Take this bucket, fill it with water and then pour it into the cauldron.");
 			safeGiveItemPlayer(player, read.item("minecraft:bucket"));
 			block.set(cauldron_loc, "minecraft:cauldron[level=0]");
 			stage.increase(player);
 		} elseif(i == 3) {
-			msg.quest(player, entity_name, talk_no++, 6, "Go upstairs, pick some nether warts there and then give me all you have harvested!");
+			msg.quest(player, entity_name, talk_no++, 10, "Go upstairs, pick some nether warts there and then give me all you have harvested!");
 			stage.increase(player);
 		} elseif(i == 4) {
-			msg.quest(player, entity_name, talk_no++, 6, "Please go downstairs and cook this for me.");
+			msg.quest(player, entity_name, talk_no++, 10, "Please go downstairs and cook this for me.");
 			safeGiveItemPlayer(player, read.item("minecraft:coal"));
 			safeGiveItemPlayer(player, read.item("km:mushroom_stick_raw"));
 			stage.increase(player);
@@ -191,6 +193,7 @@ if(hand == "OFF_HAND") {
 hand_item = entity.getEquip(player, "hand");
 if(stage >= 22) {
 	if(i == 2 && bucket_filled && !cauldron_filled && block.getType(block_loc) == "minecraft:cauldron" && item.getType(hand_item) == "minecraft:water_bucket") {
+		msg.quest(player, entity_name, talk_no++, 10, "Well done. Come back to me.");
 		active_quest = false;
 		cauldron_filled = true;
 		stage.increase(player);
@@ -320,6 +323,7 @@ if(stage == 18 && entity_type == "witch") {
 	stage.increase(player);
 }
 if(stage >= 22 && i == 1 && entity_type == "cave_spider" && !cave_spider_killed) {
+	msg.quest(player, entity_name, talk_no++, 10, "Great job. Come back to me.");
 	stage.increase(player);
 	cave_spider_killed = true;
 	active_quest = false;

+ 37 - 24
survival/survival.txt

@@ -8,12 +8,13 @@ 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");
+event.load("pre_explosion");
 
 setScriptVar("skills", list.new());
 skill.add("Subcutaneous Inventory", "skill.subcu_inv", "minecraft:chest", "Keeps the inventory on death", 20, false);
+skill.add("Head Hunter", "skill.head_human", "minecraft:player_head", "Drops a player's head with a 5% chance if you kill a player (0,5% if a teamler is killed)", 100, true);
 
 tp_list = list.new();
 tp_map = map.new();
@@ -22,6 +23,7 @@ player_data_map = map.new();
 crops_tag = block.getTag("minecraft:crops");
 hoe_tag = item.getTag("km:hoe");
 stairs_tag = block.getTag("minecraft:stairs");
+beds_tag = block.getTag("minecraft:beds");
 half_property = block.getProperty("half");
 
 overworld = world.get("overworld");
@@ -110,10 +112,12 @@ if(event == "player_move") {
 	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") {
+if(event == "living_death" || event == "living_pre_hurt" || event == "living_experience_drop") {
 	loc = entity.getLocation(living_entity);
 } elseif(event == "block_drop") {
 	loc = location;
+} elseif(event == "pre_explosion") {
+	loc = location;
 } elseif(event == "entity_mount") {
 	loc = entity.getLocation(rider);
 } else {
@@ -125,6 +129,20 @@ if(isSurvWorldName(world_name)) {
 }
 goto("wait");
 
+@pre_explosion
+plot_list = plot.get(location);
+for(i = 0; i < list.getSize(plot_list); i++) {
+	plot = list.getIndex(plot_list, i);
+	if(plot.hasFlags(plot, 64)) { //Explosion-Flag
+		cancel = false;
+	}
+}
+//Kein Grundstück existiert
+if(i == 0) {
+	cancel = false;
+}
+goto("wait");
+
 @player_toss
 target_loc = player.getTarget(player, 5);
 block_type = block.getType(target_loc);
@@ -209,7 +227,6 @@ goto("wait");
 
 @player_logout
 setAfk(player, false);
-setPvp(player, "off");
 goto("wait");
 
 @player_login
@@ -323,6 +340,12 @@ if(inv_id == bankinvid) { //Bankmenü
 goto("wait");
 
 @block_click
+if(block.hasTag(beds_tag, block)) {
+	if(action == "right") {
+		cancel = true;
+		goto("wait");
+	}
+}
 if(hand == "OFF_HAND") {
 	goto("wait");
 }
@@ -685,23 +708,10 @@ 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;
+	setBackPos(player);
 	loc = entity.getLocation(player);
 	subcu_amount = skill.getAmount(player, "skill.subcu_inv");
 	if(subcu_amount > 0) {
@@ -713,13 +723,16 @@ if(isPlayer(living_entity)) {
 	}
 	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));
+		amount = skill.getAmount(player, "skill.head_human");
+		if(amount >= 1) {
+			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));
+			}
 		}
 	}
 }

+ 139 - 84
system/commands.txt

@@ -1,3 +1,4 @@
+error(true);
 waitfor(1);
 setCommandHelps();
 waitfor(1);
@@ -115,7 +116,9 @@ command.register("tppos", "Teleport zu Koordinaten");
 command.register("tptoggle", "Toggled den Erhalt von Teleportanfragen");
 command.register("unban", "Entbannt einen Spieler");
 command.register("unjail", "Lässt einen Spieler aus dem Gefängnis frei");
+command.register("user", "Returns infos about a user");
 command.register("uuid", "Gibt die Uuid eines Spielers im Chat aus");
+command.register("vanish", "Vanishes a player");
 command.register("var", "Liest Variablen aus Scripts aus");
 command.register("voxel", "Radius für Voxel verändern");
 command.register("warn", "Warnt einen Spieler");
@@ -129,13 +132,11 @@ waitfor(1);
 event.load("inv_click");
 event.load("missing_perm");
 event.load("missing_command");
-event.load("command");
 event.load("custom_command");
 event.load("block_click");
 event.load("block_place");
 event.load("block_break");
 event.load("portal");
-event.load("living_death");
 event.load("player_logout");
 
 command.registerAlias("itemdb", "iteminfo");
@@ -159,6 +160,7 @@ command.registerAlias("dt", "datatools");
 command.registerAlias("f", "friend");
 command.registerAlias("suicide", "kill");
 command.registerAlias("l", "leave");
+command.registerAlias("v", "vanish");
 command.registerAlias("hub", "leave");
 command.registerAlias("fuckit", "giveup");
 command.registerAlias("ram", "memory");
@@ -342,9 +344,6 @@ afk_loop_active = false;
 msg("dev", "§bCommands §rloaded.");
 @wait
 wait();
-if(event == "command") {
-	goto("wait");
-}
 if(event == "custom_command") {
 	//Permission-Check
 	command = text.toLowerCase(command);
@@ -367,6 +366,7 @@ if(event == "custom_command") {
 	sender = player;
 	sender_name = player.getName(player);
 	affectedname = player.getName(player);
+	player_name = player.getName(player);
 	affectedplayer = player;
 	if(command != "leave") {
 		tjr = ggv(player, "tjr");
@@ -487,13 +487,6 @@ if(event == "block_click") {
 	}
 	goto("wait");
 }
-if(event == "living_death") {
-	if(isPlayer(living_entity)) {
-		player = living_entity;
-		setBackPos(player);
-	}
-	goto("wait");
-}
 if(event == "missing_command") {
 	if(sender_name == "SERVER") {
 		player = "SERVER";
@@ -556,6 +549,80 @@ if(event == "inv_close") {
 }
 goto("wait");
 
+@vanish
+if(size < 1 || size > 2) {
+	speakPrefix(player, "§6Commands", "§r/vanish <on/off> [player]");
+	goto("wait");
+}
+if(size == 2) {
+	affectedname = list.getIndex(args, 1);
+	affectedplayer = read.player(affectedname);
+	affectedname = player.getName(affectedplayer);
+	if(affectedplayer == null) {
+		speakPrefix(player, "§6Commands", "This player is not online.");
+		goto("wait");
+	}
+}
+arg0 = list.getIndex(args, 0);
+if(arg0 == "on") {
+	if(affectedname != player_name) {
+		speakPrefix(player, "§6Commands", concat(affectedname, " has been vanished."));
+		speakPrefix(affectedplayer, "§6Commands", concat("You have been vanished by ", player_name, "."));
+	} else {
+		speakPrefix(affectedplayer, "§6Commands", "You are vanished.");
+	}
+	player.hide(affectedplayer);
+} elseif(arg0 == "off") {
+	if(affectedname != player_name) {
+		speakPrefix(player, "§6Commands", concat(affectedname, " is no longer vanished."));
+		speakPrefix(affectedplayer, "§6Commands", concat("You are no longer vanished caused by ", player_name, "."));
+	} else {
+		speakPrefix(affectedplayer, "§6Commands", "You are no longer vanished.");
+	}
+	player.show(affectedplayer);
+} else {
+	speakPrefix(player, "§6Commands", "§r/vanish <on/off> [player]");
+}
+goto("wait");
+
+@user
+if(size != 1) {
+	speakPrefix(player, "§6Commands", "§r/user <player>");
+	goto("wait");
+}
+p_name = list.getIndex(args, 0);
+if(!checkIfEverOnline(p_name)) {
+	speakPrefix(player, "§6Commands", "This player has never been online.");
+	goto("wait");
+}
+p_uuid = player.getUuid(p_name);
+p_name = player.getName(p_uuid);
+if(player.getUuid(player) != p_uuid) {
+	if(!perm.has(player, "user.other")) {
+		perm.no(player, "user.other");
+		goto("wait");
+	}
+}
+p = read.player(p_name);
+p_id = player.getId(p_uuid);
+if(p == null) {
+	p_or_id = p_id;
+} else {
+	p_or_id = p;
+}
+msg(player, "User data about: ", p_name);
+msg(player, "Playtime: ", text.number(math.roundDown(player.getTotalPlaytime(p_or_id) / 60)));
+msg(player, "Joins: ", text.number(player.getJoins(p_or_id)));
+msg(player, "First Join: ", getDateString(player.getFirstJoin(p_or_id)));
+msg(player, "Last Join: ", getDateString(player.getLastJoin(p_or_id)));
+msg(player, "UUID: ", p_uuid);
+msg(player, "ID: ", text.number(p_id));
+msg(player, "Rank: ", getRank(p_or_id));
+msg(player, "PvP: ", hasPvpOn(p_or_id));
+msg(player, "Quests: ", text.number(quest.getCounter(p_or_id)));
+msg(player, "Elo: ", text.number(minigame.getElo(p_or_id)));
+goto("wait");
+
 @link
 link = text.concatList(args, " ", 0, size - 1);
 sendOnlineMessage(player, text.link(link, link));
@@ -899,9 +966,8 @@ if(teleportPlayer(affectedplayer, serverspawn, true)) {
 goto("wait");
 
 @rank
-player_id = player.getId(player);
 msg(player, getSpacer());
-rank = getRank(player_id);
+rank = getRank(player);
 msg(player, concat("§6Aktueller Rang: §r[", rank, "§r]"));
 msg(player, "Wähle einen Rang:");
 //Team-Ränge
@@ -930,7 +996,7 @@ if(perm.has(player, "isSponsor")) {
 	msg(player, text.click("[§5Sponsor§r]", concat("/setrank ", player_name, " &5Sponsor")));
 }
 //Spielzeit
-playtime = getTotalPlaytime(player_id);
+playtime = player.getTotalPlaytime(player);
 if(playtime > 12000) { //200 Stunden
 	msg(player, text.click("[§6Stammgast§r]", concat("/setrank ", player_name, " &6Stammgast")));
 }
@@ -966,43 +1032,43 @@ if(size < 2) {
 }
 p_name = list.getIndex(args, 0);
 if(!checkIfEverOnline(p_name)) {
-	player.speak(player, "§6Commands", "§rDieser Spieler war noch nie online");
+	speakPrefix(player, "§6Commands", "This player has never been online.");
 	goto("wait");
 }
-if(!isOnline(p_name)) {
-	player.speak(player, "§6Commands", "§rDieser Spieler ist nicht online");
+p = read.player(p_name);
+if(p == null) {
+	speakPrefix(player, "§6Commands", "This player is not online.");
 	goto("wait");
 }
-if(player_name != p_name) {
-	if(!perm.has(player, "setrank.other")) {
+p_name = player.getName(p);
+rank = text.concatList(args, " ",  1, size - 1);
+if(!perm.has(player, "setrank.other")) {
+	if(player_name != p_name) {
 		perm.no(player, "setrank.other");
 		goto("wait");
 	}
-}
-rank = text.concatList(args, " ",  1, size - 1);
-if(!perm.has(player, "setrank.other")) {
 	noperm = true;
-	if(rank == "&4Owner" && perm.has(player, "isOwner")) {
+	if(rank == "&4Owner" && perm.has(p, "isOwner")) {
 		noperm = false;
-	} elseif(rank == "&cAdmin" && perm.has(player, "isAdmin")) {
+	} elseif(rank == "&cAdmin" && perm.has(p, "isAdmin")) {
 		noperm = false;
-	} elseif(rank == "&9Mod" && perm.has(player, "isMod")) {
+	} elseif(rank == "&9Mod" && perm.has(p, "isMod")) {
 		noperm = false;
-	} elseif(rank == "&bSupport" && perm.has(player, "isSupporter")) {
+	} elseif(rank == "&bSupport" && perm.has(p, "isSupporter")) {
 		noperm = false;
-	} elseif(rank == "&5Dev" && perm.has(player, "isDev")) {
+	} elseif(rank == "&5Dev" && perm.has(p, "isDev")) {
 		noperm = false;
-	} elseif(rank == "&5VIP" && perm.has(player, "isVIP")) {
+	} elseif(rank == "&5VIP" && perm.has(p, "isVIP")) {
 		noperm = false;
-	} elseif(rank == "&5YT" && perm.has(player, "isYT")) {
+	} elseif(rank == "&5YT" && perm.has(p, "isYT")) {
 		noperm = false;
-	} elseif(rank == "&5Sponsor" && perm.has(player, "isSponsor")) {
+	} elseif(rank == "&5Sponsor" && perm.has(p, "isSponsor")) {
 		noperm = false;
-	} elseif(rank == "&bUser" && perm.has(player, "isUser")) {
+	} elseif(rank == "&bUser" && perm.has(p, "isUser")) {
 		noperm = false;
 	}
 	//Spielzeit
-	playtime = getTotalPlaytime(player_id);
+	playtime = player.getTotalPlaytime(p);
 	if(rank == "&6Stammgast") {
 		if(playtime > 12000) { //200 Stunden
 			noperm = false;
@@ -1014,12 +1080,12 @@ if(!perm.has(player, "setrank.other")) {
 	}
 	//Abenteuer
 	if(rank == "&eAbenteurer") {
-		onadventure = ggv(player, "onadventure");
+		onadventure = ggv(p, "onadventure");
 		if(onadventure != null || onadventure) {
 			noperm = false;
 		}
 	}
-	adventures = ggv(player, "adventures");
+	adventures = ggv(p, "adventures");
 	if(rank == "&6Entdecker" || rank == "&eAbenteurer") {
 		if(adventures != null && adventures >= 1) {
 			noperm = false;
@@ -1032,7 +1098,7 @@ if(!perm.has(player, "setrank.other")) {
 	}
 	if(noperm) {
 		rank = text.replace(rank, "&", "§");
-		player.speak(player, "§zPerms", "You have no permission for ", rank, "§r.");
+		speakPrefix(player, "§zPerms", concat("You have no permission for ", rank, "§r."));
 		goto("wait");
 	}
 }
@@ -1041,12 +1107,9 @@ if(text.length(rank) >= 20) {
 	goto("wait");
 }
 rank = text.replace(rank, "&", "§");
-p_uuid = player.getUuid(p_name);
-p = player.get(p_uuid);
 setRank(p, rank);
 //Tabliste
-nicknames = getScriptVar("nicknames");
-nickname = map.getOrDefault(nicknames, p_uuid, p_name);
+nickname = player.getNickname(p);
 if(isAfk(p)) {
 	tab_name = concat("§7§m", nickname);
 } else {
@@ -1257,7 +1320,7 @@ goto("wait");
 
 @kill
 if(size < 0 || size > 1) {
-	player.speak(player, "§6Commands", "§r/kill [player]");
+	speakPrefix(player, "§6Commands", "§r/kill [player]");
 	goto("wait");
 }
 if(size == 1) {
@@ -1268,16 +1331,16 @@ if(size == 1) {
 	affectedname = list.getIndex(args, 0);
 	affectedplayer = read.player(affectedname);
 	if(affectedplayer == null) {
-		player.speak(player, "§6Commands", "This player is not online.");
+		speakPrefix(player, "§6Commands", "This player is not online.");
 		goto("wait");
 	}
 }
 if(affectedplayer != player) {
 	affectedname = player.getName(affectedplayer);
-	player.speak(player, "§6Commands", affectedname, " wurde getötet.");
-	player.speak(affectedplayer, "§6Commands", "Du wurdest von ", player_name, " getötet.");
+	speakPrefix(player, "§6Commands", concat(affectedname, " has been killed."));
+	speakPrefix(affectedplayer, "§6Commands", concat("You have been killed by ", player_name, "."));
 } else {
-	player.speak(affectedplayer, "§6Commands", "Du hast dich getötet.");
+	speakPrefix(affectedplayer, "§6Commands", "You killed yourself.");
 }
 entity.damage(affectedplayer, 1000);
 goto("wait");
@@ -4540,13 +4603,13 @@ if(size != 0) {
 	goto("wait");
 }
 msg(player, getSpacer());
-showTablesStatement = databank.prepare("SHOW TABLES");
-result = databank.execute(showTablesStatement);
+stmt = databank.prepare("SHOW TABLES");
+result = databank.execute(stmt);
 while(databank.next(result)) {
     msg(player, databank.getString(result, 1));
 }
 databank.close(result);
-databank.close(showTablesStatement);
+databank.close(stmt);
 goto("wait");
 
 @showfields
@@ -4556,25 +4619,25 @@ if(size != 1) {
 }
 table = list.getIndex(args, 0);
 set.clear(fields);
-showTablesStatement = databank.prepare("SHOW TABLES");
-result = databank.execute(showTablesStatement);
+stmt = databank.prepare("SHOW TABLES");
+result = databank.execute(stmt);
 while(databank.next(result)) {
     set.add(fields, databank.getString(result, 1));
 }
 databank.close(result);
-databank.close(showTablesStatement);
+databank.close(stmt);
 if(!set.contains(fields, table)) {
-	player.speak(player, "§6Commands", "Kein existierendes Table");
+	player.speak(player, "§6Commands", "This in no existing table.");
 	goto("wait");
 }
 msg(player, getSpacer());
-showFieldsStament = databank.prepare(concat("SHOW FIELDS FROM ", table, ";"));
-result = databank.execute(showFieldsStament);
+stmt2 = databank.prepare(concat("SHOW FIELDS FROM ", table, ";"));
+result = databank.execute(stmt2);
 while(databank.next(result)) {
     msg(player, databank.getString(result, 1));
 }
 databank.close(result);
-databank.close(showFieldsStament);
+databank.close(stmt2);
 goto("wait");
 
 @seen
@@ -4909,7 +4972,7 @@ if(size != 1) {
 p_name = list.getIndex(args, 0);
 p_uuid = player.getUuid(p_name);
 if(p_uuid == null) {
-	player.speak(player, "§6Commands", "§rDieser Spieler war noch nie online");
+	speakPrefix(player, "§6Commands", "This player has never been online.");
 	goto("wait");
 }
 p = read.player(p_name);
@@ -5112,7 +5175,7 @@ if(hasNext(iter)) {
 	script_id = next(iter);
 	script = script.getFromId(script_id);
 	if(script == null) {
-		msg("dev", "Should not happen. Error on /leave ", set);
+		msg("dev", "Error on /leave ", set);
 		player.resetMinigames(player);
 		entity.teleport(player, gamesspawn);
 		goto("wait");
@@ -5340,8 +5403,12 @@ function getTimeString(time) {
 	} else {
 		minute = text.number(minute);
 	}
-	timestring = concat(text.number(time.getDay(calendar)), ".", text.number(time.getMonth(calendar)), ".", text.number(time.getYear(calendar)), " ", text.number(time.getHour(calendar)), ":", minute);
-	return timestring;
+	return concat(text.number(time.getDay(calendar)), ".", text.number(time.getMonth(calendar)), ".", text.number(time.getYear(calendar)), " ", text.number(time.getHour(calendar)), ":", minute);
+}
+
+function getDateString(time) {
+	calendar = time.new(time);
+	return concat(text.number(time.getDay(calendar)), ".", text.number(time.getMonth(calendar)), ".", text.number(time.getYear(calendar)));
 }
 
 function hasTpaRequest(player_uuid, aim_uuid) {
@@ -5363,31 +5430,6 @@ function addTpaRequest(player_uuid, aim_uuid) {
 	return;
 }
 
-function getTotalPlaytime(player_id) {
-	//Online seit
-	since_minutes = 0;
-	if(isOnline(player.getNameFromId(player_id))) {
-		onlineSinceStatement = databank.prepare("SELECT join_time FROM playtime WHERE player_id = ? AND leave_time IS NULL;");
-		databank.setInt(onlineSinceStatement, 1, player_id);
-		result = databank.execute(onlineSinceStatement);
-		while(databank.next(result)) {
-			since_minutes = (time.getMillis() - databank.getLong(result, 1)) / 1000 / 60;
-		}
-		databank.close(result);
-		databank.close(onlineSinceStatement);
-	}
-	//Spielzeit gesamt
-	playtimeStatement = databank.prepare("SELECT SUM(leave_time - join_time) FROM playtime WHERE player_id = ?;");
-	databank.setInt(playtimeStatement, 1, player_id);
-	result = databank.execute(playtimeStatement);
-	while(databank.next(result)) {
-		minutes = databank.getLong(result, 1) / 1000 / 60 + since_minutes;
-	}
-	databank.close(result);
-	databank.close(playtimeStatement);
-	return minutes;
-}
-
 function setCommandHelps() {
 	command.clearHelp();
 	command.clearIgnored();
@@ -5430,6 +5472,7 @@ function setCommandHelps() {
 	addCommandHelpChildPlayer("uuid");
 	addCommandHelpChildPlayer("heal");
 	addCommandHelpChildPlayer("feed");
+	addCommandHelpChildPlayer("user");
 	
 	help = addCommandHelp("color");
 	addCommandAlias(help, "colour", "color");
@@ -5449,6 +5492,18 @@ function setCommandHelps() {
 	help = addCommandHelp("giveup");
 	addCommandAlias(help, "fuckit", "giveup");
 	
+	help = command.newHelp("vanish", "vanish");
+	//vanish on [player]
+	helpArg0 = command.newHelpLiteral("on");
+	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player"));
+	command.addHelpChild(help, helpArg0);
+	//vanish off [player]
+	helpArg0 = command.newHelpLiteral("off");
+	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player"));
+	command.addHelpChild(help, helpArg0);
+	command.addHelp(help);
+	addCommandAlias(help, "v", "vanish");
+	
 	help = command.newHelp("start", "start");
 	command.addHelpChild(help, command.newHelpLiteral("chat"));
 	command.addHelpChild(help, command.newHelpLiteral("commands"));

+ 0 - 26
system/explosions.txt

@@ -1,26 +0,0 @@
-event.load("pre_explosion");
-
-msg("dev", "§bExplosions §rloaded.");
-@wait
-wait();
-world_name = world.getName(loc.getWorld(location));
-if(isSurvWorldName(world_name)) {
-	world_name = "survival";
-}
-if(world_name == "desert") {
-	cancel = false;
-}
-if(world_name == "survival") {
-	plot_list = plot.get(location);
-	for(i = 0; i < list.getSize(plot_list); i++) {
-		plot = list.getIndex(plot_list, i);
-		if(plot.hasFlags(plot, 64)) { //Explosion-Flag
-			cancel = false;
-		}
-	}
-	//Kein Grundstück existiert
-	if(i == 0) {
-		cancel = false;
-	}
-}
-goto("wait");

+ 3 - 0
system/limits.txt

@@ -1,5 +1,8 @@
 //wusi
 limit.clear();
+limit.set("pillager", 10);
+term();
+
 limit.set("ghast", 4);
 limit.set("husk", 10);
 limit.set("blaze", 10);

+ 3 - 7
system/perms.txt

@@ -46,7 +46,6 @@ perm.registerGroup(0, "mail");
 perm.registerGroup(0, "ticket");
 perm.registerGroup(0, "plot");
 perm.registerGroup(0, "mayo");
-perm.registerGroup(0, "marco");
 perm.registerGroup(0, "leave");
 perm.registerGroup(0, "home");
 perm.registerGroup(0, "rank");
@@ -74,12 +73,7 @@ perm.registerGroup(0, "help");
 perm.registerGroup(0, "spawn");
 perm.registerGroup(0, "server");
 perm.registerGroup(0, "playerinfo");
-perm.registerGroup(0, "gilde");
 perm.registerGroup(0, "pay");
-perm.registerGroup(0, "slots");
-perm.registerGroup(0, "group");
-perm.registerGroup(0, "placearte");
-perm.registerGroup(0, "arte");
 perm.registerGroup(0, "friend");
 perm.registerGroup(0, "money");
 perm.registerGroup(0, "party");
@@ -100,8 +94,8 @@ perm.registerGroup(0, "stopadventure");
 perm.registerGroup(0, "warp");
 perm.registerGroup(0, "nextplayer");
 perm.registerGroup(0, "compass");
-perm.registerGroup(0, "arte");
 perm.registerGroup(0, "shout");
+perm.registerGroup(0, "user");
 
 //Admin-Rechte
 perm.registerGroup(2, "isAdmin");
@@ -191,6 +185,7 @@ perm.registerGroup(2, "invsee");
 perm.registerGroup(2, "op");
 perm.registerGroup(2, "deop");
 perm.registerGroup(2, "xp");
+perm.registerGroup(2, "vanish");
 perm.registerGroup(2, "silentkick");
 perm.registerGroup(2, "kick");
 perm.registerGroup(2, "warn");
@@ -216,6 +211,7 @@ perm.registerGroup(2, "error");
 perm.registerGroup(2, "debug");
 perm.registerGroup(2, "errordebug");
 perm.registerGroup(2, "invignore");
+perm.registerGroup(2, "user.other");
 
 //Builder-Rechte
 perm.registerGroup(3, "isBuilder");

+ 93 - 2
utils/u_general.txt

@@ -412,7 +412,7 @@ function quest.addCounter(player_or_id, amount) {
 }
 
 function quest.finish(script, player) {
-	addCounter(player, 1);
+	quest.addCounter(player, 1);
 	quest.term(script, player);
 }
 
@@ -1076,6 +1076,91 @@ function loadData(player_or_id, map, name) {
 	}
 }
 
+//--------------------------------------------------
+//Player-Utils
+//--------------------------------------------------
+
+function player.getJoins(player_or_id) {
+	if(isPlayer(player_or_id)) {
+		player_id = player.getId(player_or_id);
+	} else {
+		player_id = player_or_id;
+	}
+	stmt = databank.prepare("SELECT COUNT(join_time) FROM playtime WHERE player_id = ?;");
+	databank.setInt(stmt, 1, player_id);
+	result = databank.execute(stmt);
+	if(databank.next(result)) {
+		amount = databank.getLong(result, 1);
+	}
+	databank.close(result);
+	databank.close(stmt);
+	return amount;
+}
+
+function player.getTotalPlaytime(player_or_id) {
+	if(isPlayer(player_or_id)) {
+		player_id = player.getId(player_or_id);
+	} else {
+		player_id = player_or_id;
+	}
+	//Online seit
+	since_minutes = 0;
+	if(isOnline(player.getNameFromId(player_id))) {
+		stmt = databank.prepare("SELECT join_time FROM playtime WHERE player_id = ? AND leave_time IS NULL;");
+		databank.setInt(stmt, 1, player_id);
+		result = databank.execute(stmt);
+		while(databank.next(result)) {
+			since_minutes = (time.getMillis() - databank.getLong(result, 1)) / 1000 / 60;
+		}
+		databank.close(result);
+		databank.close(stmt);
+	}
+	//Spielzeit gesamt
+	stmt2 = databank.prepare("SELECT SUM(leave_time - join_time) FROM playtime WHERE player_id = ?;");
+	databank.setInt(stmt2, 1, player_id);
+	result = databank.execute(stmt2);
+	while(databank.next(result)) {
+		minutes = databank.getLong(result, 1) / 1000 / 60 + since_minutes;
+	}
+	databank.close(result);
+	databank.close(stmt2);
+	return minutes;
+}
+
+function player.getFirstJoin(player_or_id) {
+	if(isPlayer(player_or_id)) {
+		player_id = player.getId(player_or_id);
+	} else {
+		player_id = player_or_id;
+	}
+	stmt = databank.prepare("SELECT MIN(join_time) FROM playtime WHERE player_id = ?;");
+	databank.setInt(stmt, 1, player_id);
+	result = databank.execute(stmt);
+	if(databank.next(result)) {
+		time = databank.getLong(result, 1);
+	}
+	databank.close(result);
+	databank.close(stmt);
+	return time;
+}
+
+function player.getLastJoin(player_or_id) {
+	if(isPlayer(player_or_id)) {
+		player_id = player.getId(player_or_id);
+	} else {
+		player_id = player_or_id;
+	}
+	stmt = databank.prepare("SELECT MAX(join_time) FROM playtime WHERE player_id = ?;");
+	databank.setInt(stmt, 1, player_id);
+	result = databank.execute(stmt);
+	if(databank.next(result)) {
+		time = databank.getLong(result, 1);
+	}
+	databank.close(result);
+	databank.close(stmt);
+	return time;
+}
+
 //--------------------------------------------------
 //Money-Utils
 //--------------------------------------------------
@@ -1189,10 +1274,16 @@ function skill.getShopItem(player, skill_name) {
 	amount = config.getDouble(config, skill[1], 0);
 	if(skill[5]) {
 		prop = "Permanent";
+		if(amount == 0) {
+			text = concat("Bought: No");
+		} else {
+			text = concat("Bought: Yes");
+		}
 	} else {
 		prop = "Levelable";
+		text = concat("Amount you have: ", text.number(amount));
 	}
-	item = read.item(skill[2], 1, skill_name, concat("Cost:", text.number(skill[4])), skill[3], prop, concat("Amount you have: ", text.number(amount)));
+	item = read.item(skill[2], 1, skill_name, concat("Cost: ", text.number(skill[4])), skill[3], prop, text);
 	return item;
 }
 

+ 3 - 0
utils/u_quest.txt

@@ -1,4 +1,7 @@
 function stage.increase(player) {
 	$stage++;
 	quest.display(player, $quest_name, $stage, $all_stages);
+	//sound = sound.get("entity.experience_orb.pickup");
+	//category = sound.getCategory("master");
+	//sound.spawnForPlayer(player, sound, category);
 }