Преглед на файлове

save 1 year old changes and new minigame dontgetangry

mloeschenkohl преди 1 година
родител
ревизия
ef43e8bd13

+ 13 - 45
Jan/fractalspleef.txt

@@ -40,48 +40,21 @@ function outofrange(loc){
 	return false;
 }
 
-function complex(a,b){
-	c = array.new(2);
-	c[0] = a;
-	c[1] = b;
-	return c;
-}
-
-function complex_mult(a,b){
-	c = array.new(2);
-	c[0] = a[0]*b[0] - a[1]*b[1];
-	c[1] = a[0]*b[1] + a[1]*b[0];
-	return c;
-}
-
-function complex_add(a,b){
-	a[0] += b[0];
-	a[1] += b[1];
-	return a;
-}
-
-function complex_abs(a){
-	return math.abs(a[0]) + math.abs(a[1]);
-}
-
 function Mandelbrot(){
 	Mandelbrot_array = array.new($size, $size);
 	for(i = 0; i < $size; i++){
 		c1 = 4*i/$size-2;
+		waitfor(2);
 		for(j = 0; j < $size; j++){
-			
-			if(j%50 == 0){
-				waitfor(2);
-			}
-			
 			c2 = 4*j/$size-2;
-			c = complex(c1,c2);
-			z = complex(0,0);
-			count = 0;
+			z1 = 0;
+			z2 = 0;
+			count = $iterations;
 			for(k = 0; k < $iterations; k++){
-				z = complex_add(complex_mult(z,z),c);
-				count++;
-				if(complex_abs(z) > 4){
+				z1 = math.pow(z1,2) - math.pow(z2,2) + c1;
+				z2 = 2*z1*z2 + c2;
+				if(math.pow(z1,2)+math.pow(z2,2) > 4){
+					count = k;
 					break;
 				}
 			}
@@ -104,18 +77,13 @@ function JuliaSet(block){
 		z1 = 4*i/$size-2;
 		for(j = 0; j < $size; j++){
 			
-			if(j%50 == 0){
-				waitfor(2);
-			}
-			
 			z2 = 4*j/$size-2;
-			z = complex(z1,z2);
-			c = complex(p1,p2);
-			count = 0;
+			count = $iterations;
 			for(k = 0; k < $iterations; k++){
-				z = complex_add(complex_mult(z,z),c);
-				count++;
-				if(complex_abs(z) > 4){
+				z1 = math.pow(z1,2) - math.pow(z2,2) + p1;
+				z2 = 2*z1*z2 + p2;
+				if(math.pow(z1,2)+math.pow(z2,2) > 4){
+					count = k;
 					break;
 				}
 			}

+ 1 - 2
challenges/all_damage_types.txt

@@ -124,7 +124,6 @@ if(!world.isSurvName(world_name)) {
 	goto("wait");
 }
 damage_type = string.toUpperCase(damage.getType(damage_source));
-snuvi.debug(damage_type);
 if(!isNextDamageType(player, damage_type)) {
 	goto("wait");
 }
@@ -141,7 +140,7 @@ if(new_type == null) {
 	player.setADTChallengeAmounts(player, player.getADTChallengeAmounts(player) + 1);
 	goto("wait");
 }
-saveDoneEntity(player, entity_type);
+saveDoneDamageType(player, entity_type);
 stage = setNextEntity(player, new_type);
 msg.prefix(player, prefix_challenge, string.concat("Entity killed. Next entity: ", new_type));
 challenge.display(player, sb_id, challenge_name, new_type, stage, all_stages);

+ 843 - 0
minigames/dontgetangry/dontgetangry.txt

@@ -0,0 +1,843 @@
+rankingtable = "dgaranks";
+gamename = "§cDontGetAngry";
+game_short = "dga";
+game_tab = "§cDGA";
+minigame.setSpecificLobbyHandling(true);
+minigame.setIndivStartCheck(true);
+
+air_mat = material.getAir();
+
+player_team = map.new(); //player_uuid -> team
+team_player = map.new(); //team -> player_uuid
+active_teams = list.new(); //to see which team is next in row
+token_no_possible_move = set.new(); //to count the amount of tokens with no possible move. if the sum is 4, it's the next players turn
+rule_jump_over_tokens_in_target = false;
+amount_ai_players = 0;
+
+resetRuleSigns();
+
+minigame.initStart();
+goto("simplelobby");
+
+@specificLobbyHandling
+if(event == "block_click") {
+	if(block.getLocation(block) == rule_1_loc) {
+		rule_jump_over_tokens_in_target = !rule_jump_over_tokens_in_target;
+		if(rule_jump_over_tokens_in_target) {
+			s = "§aTrue";
+		} else {
+			s = "§cFalse";
+		}
+		sign.setString(block, 3, s);
+		return;
+	}
+	if(block.getLocation(block) == rule_2_loc) {
+		amount_ai_players++;
+		if(amount_ai_players >= minigame.getMaxPlayers()) {
+			amount_ai_players = 0;
+		}
+		sign.setString(block, 3, string.number(amount_ai_players));
+		if(!minigame.isStarting()) {
+			goto("startcountdown");
+		}
+	}
+}
+return;
+
+function minigame.canStartIndiv() {
+	player_list = minigame.getPlayers($script_id);
+	p_amount = list.getSize(player_list) + $amount_ai_players;
+	return p_amount >= minigame.getMinPlayers();
+}
+
+@finalstart
+player_list = minigame.getPlayers(script_id);
+minigame.speakAll(gamename, "The game has started.");
+
+resetGameField();
+
+dice_item = read.item("{Count:1b,id:'minecraft:player_head',tag:{SkullOwner:{Id:[I;-635467755,-1356247480,-1843761069,-673139483],Properties:{textures:[{Signature:'ZVj07KMc/Ia0e34lkmfkiih1dUvgS+tfO3ciWhHv6rVOnVfeKkasYKSMi3He6kgF/q+wn7ksdvelHfjictleX8XSrAtFHPuVhZPEbJtku2w+RKHWnhkP1wnMLZZugKu44cct8nPl5StQ+UHl1IxQ9cFndC6qOhyLsW5zrySgDtyw6qacB4uNqoXCHyMxXlXntkgFCPv98CjB1GAHWvg7f+qIDbTYfZzinpePJvA1cxqX9bsO1tVkmecg9MW4HdNhptbL9UyrnON3o5hIBxNTyZ2bAqfGuuneTzMCgHbfBNS6EYXidMpBAem22nf8j16P6j1NBJV/UtekAL30BF9sdcJqEcosQZRIZ9z5S9RGQqBVr7YcWbPgJHAZDUroPeXIsJo0hyWg/5X6R1oeSgazaav/KxE/rduABhdXWp9bvJpcvUY4ivJ1m4tNggSGWX9SzYTIFhovnPFvBIGIjP3naPGUrcZc6sJuJYXT3ZLvpn+WnEQs19LMQOpmBTkeN9H5/SzZTm3PgfkZIhvWuX++Hj7wDn0FEya1dZBJgbcKQTCA6WUw0ymYdMwz86Ceau8Qo+2uxY00DFXlu9q5juybgAVU9K590Rzn3GRGF2x19jSt/uMxbrbuDUvKjATBgaAoS27iVCgEuQOcn7I9SuulL8xmhMLxDJrJZGvflF70zig=',Value:'eyJ0aW1lc3RhbXAiOjE1MTE0Njc0NDEzOTEsInByb2ZpbGVJZCI6ImRhMWY4ODE1YWYyOTRlNDg5MjFhNzA1M2Q3ZTBiNGU1IiwicHJvZmlsZU5hbWUiOiJBekJhbmRpdDIwMDAiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFmYTk2MDUwYTQ4M2JiODhhMWVkYmVhZDRkOWMxZGIzMWY3NTY3YjA3NjVkZTQ3ODk3YzU3MjI5MmZkZDcxYjEifX19'}]}}}}");
+amount_players = list.getSize(player_list);
+for(i = 0; i < amount_players; i++) {
+	//prepare players
+	p = player.get(list.getIndex(player_list, i));
+	entity.teleport(p, map.get($tploc, i));
+	player.setFly(p, true);
+	player.giveItem(p, dice_item);
+	//assign team
+	p_uuid = player.getUuid(p);
+	map.add(player_team, p_uuid, i);
+	map.add(team_player, i, p_uuid);
+	list.add(active_teams, i);
+	color = map.get(colorcode, i);
+	minigame.setTabName(p, game_tab, color);
+}
+
+if(amount_players + amount_ai_players > minigame.getMaxPlayers()) {
+	amount_ai_players  = minigame.getMaxPlayers() - amount_players;
+}
+for(h = 0; h < amount_ai_players; h++) {
+	//assign team
+	team = h + i;
+	map.add(team_player, team, "AI");
+	list.add(active_teams, team);
+}
+
+/* There are two phases.
+Phase 0: player needs to roll the dice
+Phase 1: player needs to move a token
+*/
+
+setNextTeam(false);
+
+@wait
+wait();
+if(event == "entity_damage") {
+	if(!isPlayer(entity)) {
+		goto("wait");
+	}
+	player = entity;
+}
+if(player.hasMinigameId(player, script_id)) {
+	ignoreGoto(event);
+}
+goto("wait");
+
+@block_click
+if(slot.isOffHand(hand)) {
+	goto("wait");
+}
+team = getTeamFromPlayer(player);
+if(action == "RIGHT_CLICK_BLOCK") {
+	if(!isNextTeam(player)) {
+		msgTeam(team, "It's not your turn.");
+		goto("wait");
+	}
+	block_loc = block.getLocation(block);
+	//Phase 0
+	item = living.getHand(player);
+	own_mat = getTokenMat(team);
+	if((block_loc == dice_loc || item.isType(item, "PLAYER_HEAD")) && block.getType(block) != own_mat) {
+		if(phase != 0) {
+			msgTeam(team, "Already diced. Move a token.");
+			goto("wait");
+		}
+		rollDice(team);
+		goto("wait");
+	}
+	//Phase 1
+	if(phase != 1) {
+		msgTeam(team, "Roll the dice first. Then choose a token to move.");
+		goto("wait");
+	}
+	if(!isOwnToken(team, block)) {
+		msgTeam(team, "Choose one of your tokens to move.");
+		goto("wait");
+	}
+	tokens_in_stable = getTokensInOwnStable(team);
+	if(isOwnStartBlockedByOwnToken(team) && tokens_in_stable > 0) {
+		start_block = getOwnStartBlock(team);
+		if(block_loc != block.getLocation(start_block)) {
+			msgTeam(team, "You need to move with your token at the start block.");
+			goto("wait");
+		}
+	}
+	if(isTokenInOwnStable(block_loc, team)) {
+		if(diced_dots != 6) {
+			msgTeam(team, "You need a 6 to move a token out of the stable.");
+			goto("wait");
+		}
+		to_block = getOwnStartBlock(team);
+		doMove(team, block, to_block);
+		goto("wait");
+	}
+	if(isTokenInOwnTarget(block_loc, team)) {
+		to_block = getTargetBlockStartingInTarget(team, block);
+		goto("checkmove");
+	}
+	//token on route is clicked
+	if(diced_dots == 6) {
+		if(tokens_in_stable > 0 && !isOwnStartBlockedByOwnToken(team)) {
+			msgTeam(team, "You diced 6. Choose a token from the stable.");
+			goto("wait");
+		}
+	}
+	to_block = getTargetBlockStartingOnRoute(team, block);
+	goto("checkmove");
+}
+if(action == "RIGHT_CLICK_AIR") {
+	item = living.getHand(player);
+	if(item.isType(item, "PLAYER_HEAD")) {
+		if(!isNextTeam(player)) {
+			msgTeam(team, "It's not your turn.");
+			goto("wait");
+		}
+		if(phase != 0) {
+			msgTeam(team, "Already diced. Move a token.");
+			goto("wait");
+		}
+		rollDice(team);
+	}
+	goto("wait");
+}
+goto("wait");
+
+@checkmove
+if(to_block != null) {
+	doMove(team, block, to_block);
+	goto("wait");
+}
+set.add(token_no_possible_move, block_loc);
+if(getTotalBlockedTokens() != 4) {
+	msgTeam(team, "Move not possible. Choose another token.");
+	goto("wait");
+}
+nomovepossible(team);
+goto("wait");
+
+//all 4 tokens cannot do a possible move
+function nomovepossible(team) {
+	team_name = getTeamName(team);
+	$phase = 0;
+	if($diced_dots == 6) {
+		$dice_count--;
+		minigame.speakAll($gamename, string.concat("No move possible but diced a 6. Dice again ", team_name, "§r."));
+		if(isTeamAi(team)) {
+			rollDice(team);
+		}
+		return;
+	}
+	if($totalblocked == 4) {
+		minigame.speakAll($gamename, string.concat("No move possible. Dice again ", team_name, "§r."));
+		if(isTeamAi(team)) {
+			rollDice(team);
+		}
+		return;
+	}
+	minigame.speakAll($gamename, string.concat("No move possible. Next player."));
+	setNextTeam(false);
+}
+
+@block_break
+@block_place
+@entity_damage
+cancel = true;
+goto("wait");
+
+function isTeamAi(team) {
+	return getPlayerFromTeam(team) == "AI";
+}
+
+function msgTeam(team, message) {
+	if(isTeamAi(team)) {
+		return;
+	}
+	player = getPlayerFromTeam(team);
+	msg.prefix(player, $gamename, message);
+}
+
+function getTargetBlockStartingOnRoute(team, from_block) {
+	from_loc = block.getLocation(from_block);
+	route_index = array.getIndexOf($route, from_loc);
+	new_route_index = route_index + $diced_dots;
+	
+	//if target index is passed, follow target route (but don't overjump in target)
+	if(isTargetIndexPassed(team, route_index, new_route_index)) {
+		target_index = getOwnTargetIndex(team);
+		rest_count = $diced_dots - (target_index - route_index);
+		to_index = rest_count - 1;
+		if(to_index > 3) {
+			return null;
+		}
+		if(isWayToTargetOverjumped(team, 0, to_index)) {
+			return null;
+		}
+		target_locs = getTargetLocs(team);
+		target_loc = target_locs[to_index];
+	} else {
+		route_size = array.getSize($route);
+		if(new_route_index >= route_size) {
+			new_route_index -= route_size;
+		}
+		target_loc = $route[new_route_index];
+	}
+	target_block = block.get(target_loc);
+	
+	//check if target is free
+	if(isBlockOccupiedByOwnToken(target_block, team)) {
+		return null;
+	}
+	return target_block;
+}
+
+function getTargetBlockStartingInTarget(team, from_block) {
+	target_locs = getTargetLocs(team);
+	from_loc = block.getLocation(from_block);
+	from_index = array.getIndexOf(target_locs, from_loc);
+	to_index = from_index + $diced_dots;
+	if(to_index > 3) {
+		return null;
+	}
+	if(isWayToTargetOverjumped(team, from_index + 1, to_index)) {
+		return null;
+	}
+	target_block = block.get(target_locs[to_index]);
+	if(isBlockOccupiedByOwnToken(target_block, team)) {
+		return null;
+	}
+	return target_block;
+}
+
+function isWayToTargetOverjumped(team, from_index, to_index) {
+	if(!$rule_jump_over_tokens_in_target) {
+		return false;
+	}
+	target_locs = getTargetLocs(team);
+	for(i = from_index; i < to_index; i++) {
+		b = block.get(target_locs[i]);
+		if(!block.isAir(b)) {
+			return true;
+		}
+	}
+	return false;
+}
+
+function doMove(team, from_block, to_block) {
+	//if block is occupied, throw token out of game. the condition to check if target is occupied by own token is checked earlier
+	if(!block.isAir(to_block)) {
+		token_mat = block.getType(to_block);
+		opp_team = getTeamFromToken(token_mat);
+		free_block = getFreeBlockInStable(opp_team);
+		block.setMaterial(free_block, token_mat);
+		minigame.speakAll($gamename, string.concat("A token from ", getTeamName(opp_team), " §rteam was thrown."));
+	}
+	
+	//do move
+	block.setMaterial(from_block, $air_mat);
+	own_mat = getTokenMat(team);
+	block.setMaterial(to_block, own_mat);
+	
+	if(isTargetFull(team)) {
+		list.remove($active_teams, team);
+		finished(team);
+		setNextTeam(true);
+		return;
+	}
+	
+	if($diced_dots == 6) {
+		$phase = 0;
+		$dice_count = 0;
+		minigame.speakAll($gamename, string.concat(getTeamName(team), " §rdiced a 6 and can dice again."));
+		if(isTeamAi(team)) {
+			rollDice(team);
+		}
+		return;
+	}
+	
+	setNextTeam(false);
+}
+
+function finished(team) {
+	if($first_finish == null) {
+		$first_finish = team;
+		minigame.speakAll($gamename, string.concat(getTeamName(team), " §rhas won."));
+	}
+	
+	size = list.getSize($active_teams);
+	if(size == 1) {
+		script = script.getFromId($script_id);
+		for(i = 0; i < list.getSize($player_list); i++) {
+			p = player.get(list.getIndex($player_list, i));
+			t = getTeamFromPlayer(p);
+			if(t == $first_finish) {
+				showstats(p, true);
+			} else {
+				showstats(p, false);
+			}
+			player.setFly(p, false);
+		}
+		minigame.kickAllPlayers(script);
+		minigame.term(script, $gamesignloc);
+		term();
+	}
+}
+
+@player_quit
+@player_giveup
+team = getTeamFromPlayer(player);
+if(first_finish != null && team == first_finish) {
+	showstats(p, true);
+	goto("wait");
+}
+team = getTeamFromPlayer(player);
+minigame.speakAll(gamename, string.concat(getTeamName(team), " §ehas left the game."));
+player.setFly(player, false);
+showstats(player, false);
+script = script.getFromId(script_id);
+minigame.kickPlayer(script, player);
+
+//comment this block out to test the game with AI. start the game, set 2 or more AI players and then leave to run the game quickly through with AI
+if(list.getSize(player_list) == 0) {
+	minigame.term(script, $gamesignloc);
+	term();
+}
+//-------
+
+removeTeam(team);
+goto("wait");
+
+function removeSpecificToken(team) {
+	token_mat = getTokenMat(team);
+	for(i = 0; i < array.getSize($route); i++) {
+		b = block.get($route[i]);
+		if(block.getType(b) == token_mat) {
+			block.setMaterial(b, $air_mat);
+		}
+	}
+}
+
+function showstats(player, won) { //Player player, Boolean won
+	player_id = player.getId(player);
+	last_record = ranking.getPoints($rankingtable, player_id);
+	team = getTeamFromPlayer(player);
+	finished_tokens = getTokensInOwnTarget(team);
+	new_record = last_record + finished_tokens;
+	ranking.setPoints($rankingtable, player_id, new_record);
+	
+	won_games = minigame.getWon(player_id, $game_short);
+	if(won) {
+		won_games++;
+		minigame.setWon(player_id, $game_short, won_games);
+	}
+	played_games = minigame.getPlayed(player_id, $game_short) + 1;
+	minigame.setPlayed(player_id, $game_short, played_games);
+	
+	minigame.statsHeader(player, $gamename, "§e");
+	minigame.statsLine(player, "§e", "Finished tokens", string.number(new_record));
+	minigame.statsLine(player, "§e", "Won games", string.number(won_games));
+	minigame.statsLine(player, "§e", "Played games", string.number(played_games));
+	if(played_games != 0) {
+		minigame.statsLine(player, "§e", "Win ratio", string.concat(string.number(math.roundComma((won_games / played_games) * 100, 2)), "%"));
+	}
+}
+
+function getFreeBlockInStable(team) {
+	stable_locs = getStableLocs(team);
+	for(i = 0; i < array.getSize(stable_locs); i++) {
+		b = block.get(stable_locs[i]);
+		if(block.isAir(b)) {
+			return b;
+		}
+	}
+	return null;
+}
+
+function isTargetIndexPassed(team, from_route_index, to_route_index) {
+	target_index = getOwnTargetIndex(team);
+	if(from_route_index > target_index) {
+		return false;
+	}
+	return to_route_index > target_index;
+}
+
+function getOwnStartBlock(team) {
+	index = map.get($startindexes, team);
+	return block.get($route[index]);
+}
+
+function getOwnStartIndex(team) {
+	return map.get($startindexes, team);
+}
+
+function getOwnTargetIndex(team) {
+	return map.get($targetindexes, team);
+}
+
+function isOwnToken(team, block) {
+	own_mat = getTokenMat(team);
+	block_mat = block.getType(block);
+	return own_mat == block_mat;
+}
+
+function getStableLocs(team) {
+	return map.get($stables, team);
+}
+
+function getTargetLocs(team) {
+	return map.get($target_routes, team);
+}
+
+function isTargetFull(team) {
+	target_locs = getTargetLocs(team);
+	for(i = 0; i < array.getSize(target_locs); i++) {
+		b = block.get(target_locs[i]);
+		if(block.isAir(b)) {
+			return false;
+		}
+	}
+	return true;
+}
+
+function isTokenInOwnStable(token_loc, team) {
+	stable_locs = getStableLocs(team);
+	return array.contains(stable_locs, token_loc);
+}
+
+function isTokenInOwnTarget(token_loc, team) {
+	target_locs = getTargetLocs(team);
+	return array.contains(target_locs, token_loc);
+}
+
+function getTeamFromToken(token_mat) {
+	return map.get($tokens_team, token_mat);
+}
+
+function getTeamFromPlayer(player) {
+	return map.get($player_team, player.getUuid(player));
+}
+
+function getPlayerFromTeam(team) {
+	p_uuid = map.get($team_player, team);
+	if(p_uuid == "AI") {
+		return p_uuid;
+	}
+	return player.get(p_uuid);
+}
+
+/* Conzept of active team list
+next_team_index: team x
+0: team 0
+1: team 1
+2: team 3
+*/
+
+function setNextTeam(bool_actual_team_removed) {
+	$phase = 0;
+	$dice_count = 0;
+	amount_active_teams = list.getSize($active_teams);
+	if($next_team == null) {
+		//init at start
+		$next_team_index = math.random(0, amount_active_teams - 1);
+		$next_team = list.getIndex($active_teams, $next_team_index);
+	} else {
+		//set next during game
+		if(!bool_actual_team_removed) {
+			$next_team_index++;
+		}
+		if($next_team_index >= amount_active_teams) {
+			$next_team_index = 0;
+		}
+		$next_team = list.getIndex($active_teams, $next_team_index);
+	}
+	
+	//announce
+	next_team_name = getTeamName($next_team);
+	if(string.endsWith(next_team_name, "s")) {
+		minigame.speakAll($gamename, string.concat("It's ", next_team_name, "' §rturn."));
+	} else {
+		minigame.speakAll($gamename, string.concat("It's ", next_team_name, "'s §rturn."));
+	}
+	if(isTeamAi($next_team)) {
+		rollDice($next_team);
+		return;
+	}
+	next_player = getPlayerFromTeam($next_team);
+	sound.spawnForPlayer(next_player, $pling_sound, $sound_category_ambient);
+}
+
+function removeTeam(team) {
+	list.remove($active_teams, team);
+	size = list.getSize($active_teams);
+	if(size == 1) {
+		last_team = list.getIndex($active_teams, 0);
+		finished(last_team);
+	}
+	removeSpecificToken(team);
+	if(team == $next_team) {
+		setNextTeam(true);
+	}
+}
+
+function isNextTeam(player) {
+	return getTeamFromPlayer(player) == $next_team;
+}
+
+function getColorCode(team) {
+	return map.get($colorcode, team);
+}
+
+function resetRuleSigns() {
+	sign.setString(block.get($rule_1_loc), 3, "§cFalse");
+	sign.setString(block.get($rule_2_loc), 3, "0");
+}
+
+function resetGameField() {
+	//reset route
+	for(i = 0; i < array.getSize($route); i++) {
+		b = block.get($route[i]);
+		block.setMaterial(b, $air_mat);
+	}
+	
+	for(team = 0; team < minigame.getMaxPlayers(); team++) {
+		//reset target routes
+		target_locs = getTargetLocs(team);
+		for(i = 0; i < array.getSize(target_locs); i++) {
+			b = block.get(target_locs[i]);
+			block.setMaterial(b, $air_mat);
+		}
+		
+		//reset stables
+		stable_locs = getStableLocs(team);
+		for(i = 0; i < array.getSize(stable_locs); i++) {
+			b = block.get(stable_locs[i]);
+			token = getTokenMat(team);
+			block.setMaterial(b, token);
+		}
+	}
+}
+
+function getTeamName(team) {
+	color = getColorCode(team);
+	if(isTeamAi(team)) {
+		return string.concat(color, "AI");
+	}
+	p_name = player.getName(getPlayerFromTeam(team));
+	return string.concat(color, p_name);
+}
+
+function rollDice(team) {
+	tokens_in_stable = getTokensInOwnStable(team);
+	
+	//if a token is at start block and other tokens are in the stable (there is the need to move with this token), the dice will throw only possible moves
+	if(isOwnStartBlockedByOwnToken(team) && tokens_in_stable > 0) {
+		poss_dots = getPossibleDots(team); //e.g. 2,3,5
+		r = math.random(0, list.getSize(poss_dots) - 1); //e.g. 1
+		$diced_dots = list.getIndex(poss_dots, r); //e.g. 3
+	} else {
+		$diced_dots = math.random(1, 6);
+	}
+	$dice_count++;
+	
+	//announce
+	team_name = getTeamName(team);
+	minigame.speakAll($gamename, string.concat(team_name, " §rdiced §c", string.number($diced_dots), "§r."));
+	if(!isTeamAi(team)) {
+		player = getPlayerFromTeam(team);
+		title.send(player, text.new(string.concat("§c", string.number($diced_dots))));
+	}
+	
+	//check if with this dice a move is possible
+	if($diced_dots != 6) {
+		not_movable_tokens = tokens_in_stable + getFinishedTokensInOwnTarget(team);
+		if(not_movable_tokens == 4) {
+			if($dice_count == 3) {
+				minigame.speakAll($gamename, string.concat("No move possible for 3 times. Next player."));
+				setNextTeam(false);
+				return;
+			}
+			minigame.speakAll($gamename, string.concat("No move possible. Dice again ", team_name, "§r."));
+			if(isTeamAi(team)) {
+				rollDice(team);
+			}
+			return;
+		}
+	}
+	
+	$phase = 1;
+	$totalblocked = recountTotalBlockedTokens(team);
+	msgTeam(team, "Choose a token to move.");
+	if(isTeamAi(team)) {
+		a = calculateAiMove(team);
+		if(a == null) {
+			return;
+		}
+		doMove(team, a[0], a[1]);
+	}
+}
+
+function calculateAiMove(team) {
+	a = array.new(2);
+	
+	//zugzwang from start block
+	tokens_in_stable = getTokensInOwnStable(team);
+	if(isOwnStartBlockedByOwnToken(team) && tokens_in_stable > 0) {
+		a[0] = getOwnStartBlock(team);
+		a[1] = getTargetBlockStartingOnRoute(team, a[0]);
+		return a;
+	}
+	
+	//zugzwang from stable
+	if($diced_dots == 6 && tokens_in_stable > 0) {
+		stable_locs = getStableLocs(team);
+		for(i = 0; i < array.getSize(stable_locs); i++) {
+			loc = stable_locs[i];
+			from_block = block.get(loc);
+			if(!block.isAir(from_block)) {
+				a[0] = from_block;
+				a[1] = getOwnStartBlock(team);
+				return a;
+			}
+		}
+	}
+	
+	//throw other tokens if possible
+	token_locs = getOwnTokenLocsOnRoute(team);
+	for(i = 0; i < list.getSize(token_locs); i++) {
+		from_block = block.get(list.getIndex(token_locs, i));
+		target_block = getTargetBlockStartingOnRoute(team, from_block);
+		if(target_block != null) {
+			if(!block.isAir(target_block) && !isOwnToken(team, target_block)) {
+				a[0] = from_block;
+				a[1] = target_block;
+				return a;
+			}
+		}
+	}
+	
+	//do progress in target if possible
+	target_locs = getTargetLocs(team);
+	for(i = array.getSize(target_locs) - 1; i > -1; i--) {
+		from_block = block.get(target_locs[i]);
+		if(!block.isAir(from_block)) {
+			target_block = getTargetBlockStartingInTarget(team, from_block);
+			if(target_block != null) {
+				a[0] = from_block;
+				a[1] = target_block;
+				return a;
+			}
+		}
+	}
+	
+	//choose token with most progress on route
+	for(i = list.getSize(token_locs) - 1; i > -1; i--) {
+		from_block = block.get(list.getIndex(token_locs, i));
+		target_block = getTargetBlockStartingOnRoute(team, from_block);
+		if(target_block != null) {
+			a[0] = from_block;
+			a[1] = target_block;
+			return a;
+		}
+	}
+	
+	nomovepossible(team);
+	return null;
+}
+
+//sorted by progress ascending
+function getOwnTokenLocsOnRoute(team) {
+	token_locs = list.new();
+	start_index = getOwnStartIndex(team);
+	target_index = getOwnTargetIndex(team);
+	own_mat = getTokenMat(team);
+	route_size = array.getSize($route);
+	for(i = 0; i < route_size; i++) {
+		route_index = start_index + i;
+		if(route_index >= route_size) {
+			route_index -= route_size;
+		}
+		loc = $route[route_index];
+		b = block.get(loc);
+		if(block.getType(b) == own_mat) {
+			list.add(token_locs, loc);
+		}
+	}
+	return token_locs;
+}
+
+function getPossibleDots(team) {
+	poss_dots = list.new();
+	own_mat = getTokenMat(team);
+	s_index = getOwnStartIndex(team);
+	for(i = 1; i < 7; i++) {
+		b = block.get($route[s_index + i]);
+		if(block.getType(b) != own_mat) {
+			list.add(poss_dots, i);
+		}
+	}
+	return poss_dots;
+}
+
+function recountTotalBlockedTokens(team) {
+	//clear
+	set.clear($token_no_possible_move);
+	//stable
+	if($diced_dots != 6) {
+		stable_locs = getStableLocs(team);
+		for(i = 0; i < array.getSize(stable_locs); i++) {
+			loc = stable_locs[i];
+			b = block.get(loc);
+			if(!block.isAir(b)) {
+				set.add($token_no_possible_move, loc);
+			}
+		}
+	}
+	//target
+	target_locs = getTargetLocs(team);
+	for(i = array.getSize(target_locs) - 1; i > -1; i--) {
+		loc = target_locs[i];
+		b = block.get(loc);
+		if(!block.isAir(b)) {
+			set.add($token_no_possible_move, loc);
+		}
+	}
+	return set.getSize($token_no_possible_move);
+}
+
+function getTotalBlockedTokens() {
+	return set.getSize($token_no_possible_move);
+}
+
+function getTokenMat(team) {
+	return map.get($tokens, team);
+}
+
+function isBlockOccupiedByOwnToken(block, team) {
+	own_mat = getTokenMat(team);
+	mat = block.getType(block);
+	return mat == own_mat;
+}
+
+function isOwnStartBlockedByOwnToken(team) {
+	return isBlockOccupiedByOwnToken(getOwnStartBlock(team), team);
+}
+
+function getTokensInOwnTarget(team) {
+	counter = 0;
+	target_locs = getTargetLocs(team);
+	for(i = 0; i < array.getSize(target_locs); i++) {
+		loc = target_locs[i];
+		b = block.get(loc);
+		if(!block.isAir(b)) {
+			counter++;
+		}
+	}
+	return counter;
+}
+
+function getTokensInOwnStable(team) {
+	counter = 0;
+	stable_locs = getStableLocs(team);
+	for(i = 0; i < array.getSize(stable_locs); i++) {
+		loc = stable_locs[i];
+		b = block.get(loc);
+		if(!block.isAir(b)) {
+			counter++;
+		}
+	}
+	return counter;
+}
+
+//a finished token is a token which reached its final position in the stable
+function getFinishedTokensInOwnTarget(team) {
+	counter = 0;
+	target_locs = getTargetLocs(team);
+	for(i = array.getSize(target_locs) - 1; i > -1; i--) {
+		loc = target_locs[i];
+		b = block.get(loc);
+		if(block.isAir(b)) {
+			break;
+		}
+		counter++;
+	}
+	return counter;
+}

+ 136 - 0
minigames/dontgetangry/dontgetangry_map1.txt

@@ -0,0 +1,136 @@
+minplayers = 2;
+maxplayers = 4;
+gamesignloc = minigame.getSignLoc("dontgetangrysign1");
+gamesworld = world.getGames();
+lobbyspawnloc = loc.new(gamesworld, -1000, 95, 1000);
+dice_loc = loc.new(gamesworld, -1000, 101, 1000);
+mapname = "Default 4x1";
+
+rule_1_loc = loc.new(gamesworld, -999, 96, 1005); //jump over tokens in target
+rule_2_loc = loc.new(gamesworld, -1000, 96, 1005); //amount ai players
+
+route = array.new(40);
+route[0] = loc.new(gamesworld, -1001, 101, 1005);
+route[1] = loc.new(gamesworld, -1001, 101, 1004);
+route[2] = loc.new(gamesworld, -1001, 101, 1003);
+route[3] = loc.new(gamesworld, -1001, 101, 1002);
+route[4] = loc.new(gamesworld, -1001, 101, 1001);
+route[5] = loc.new(gamesworld, -1002, 101, 1001);
+route[6] = loc.new(gamesworld, -1003, 101, 1001);
+route[7] = loc.new(gamesworld, -1004, 101, 1001);
+route[8] = loc.new(gamesworld, -1005, 101, 1001);
+route[9] = loc.new(gamesworld, -1005, 101, 1000);
+route[10] = loc.new(gamesworld, -1005, 101, 999);
+route[11] = loc.new(gamesworld, -1004, 101, 999);
+route[12] = loc.new(gamesworld, -1003, 101, 999);
+route[13] = loc.new(gamesworld, -1002, 101, 999);
+route[14] = loc.new(gamesworld, -1001, 101, 999);
+route[15] = loc.new(gamesworld, -1001, 101, 998);
+route[16] = loc.new(gamesworld, -1001, 101, 997);
+route[17] = loc.new(gamesworld, -1001, 101, 996);
+route[18] = loc.new(gamesworld, -1001, 101, 995);
+route[19] = loc.new(gamesworld, -1000, 101, 995);
+route[20] = loc.new(gamesworld, -999, 101, 995);
+route[21] = loc.new(gamesworld, -999, 101, 996);
+route[22] = loc.new(gamesworld, -999, 101, 997);
+route[23] = loc.new(gamesworld, -999, 101, 998);
+route[24] = loc.new(gamesworld, -999, 101, 999);
+route[25] = loc.new(gamesworld, -998, 101, 999);
+route[26] = loc.new(gamesworld, -997, 101, 999);
+route[27] = loc.new(gamesworld, -996, 101, 999);
+route[28] = loc.new(gamesworld, -995, 101, 999);
+route[29] = loc.new(gamesworld, -995, 101, 1000);
+route[30] = loc.new(gamesworld, -995, 101, 1001);
+route[31] = loc.new(gamesworld, -996, 101, 1001);
+route[32] = loc.new(gamesworld, -997, 101, 1001);
+route[33] = loc.new(gamesworld, -998, 101, 1001);
+route[34] = loc.new(gamesworld, -999, 101, 1001);
+route[35] = loc.new(gamesworld, -999, 101, 1002);
+route[36] = loc.new(gamesworld, -999, 101, 1003);
+route[37] = loc.new(gamesworld, -999, 101, 1004);
+route[38] = loc.new(gamesworld, -999, 101, 1005);
+route[39] = loc.new(gamesworld, -1000, 101, 1005);
+
+colorcode = map.new();
+map.add(colorcode, 0, "§9");
+map.add(colorcode, 1, "§e");
+map.add(colorcode, 2, "§2");
+map.add(colorcode, 3, "§c");
+
+startindexes = map.new();
+map.add(startindexes, 0, 0);
+map.add(startindexes, 1, 20);
+map.add(startindexes, 2, 10);
+map.add(startindexes, 3, 30);
+
+targetindexes = map.new();
+map.add(targetindexes, 0, 39);
+map.add(targetindexes, 1, 19);
+map.add(targetindexes, 2, 9);
+map.add(targetindexes, 3, 29);
+
+tploc = map.new();
+map.add(tploc, 0, loc.new(gamesworld, -1001.5, 101, 1005.5,-180,0));
+map.add(tploc, 1, loc.new(gamesworld, -997.5, 101, 995.5,0.0001,0));
+map.add(tploc, 2, loc.new(gamesworld, -1004.5, 101, 998.5,-90,0));
+map.add(tploc, 3, loc.new(gamesworld, -994.5, 101, 1002.5,90,0));
+
+tokens = map.new();
+map.add(tokens, 0, material.get("BLUE_BANNER"));
+map.add(tokens, 1, material.get("YELLOW_BANNER"));
+map.add(tokens, 2, material.get("GREEN_BANNER"));
+map.add(tokens, 3, material.get("RED_BANNER"));
+
+tokens_team = map.new();
+map.add(tokens_team, material.get("BLUE_BANNER"), 0);
+map.add(tokens_team, material.get("YELLOW_BANNER"), 1);
+map.add(tokens_team, material.get("GREEN_BANNER"), 2);
+map.add(tokens_team, material.get("RED_BANNER"), 3);
+
+stables = map.new();
+target_routes = map.new();
+for(i = 0; i < maxplayers; i++) {
+	stable = array.new(4);
+	target = array.new(4);
+
+	if(i == 0) {
+		stable[0] = loc.new(gamesworld, -1004, 101, 1005);
+		stable[1] = loc.new(gamesworld, -1004, 101, 1004);
+		stable[2] = loc.new(gamesworld, -1005, 101, 1005);
+		stable[3] = loc.new(gamesworld, -1005, 101, 1004);
+		target[0] = loc.new(gamesworld, -1000, 101, 1004);
+		target[1] = loc.new(gamesworld, -1000, 101, 1003);
+		target[2] = loc.new(gamesworld, -1000, 101, 1002);
+		target[3] = loc.new(gamesworld, -1000, 101, 1001);
+	} elseif(i == 1) {
+		stable[0] = loc.new(gamesworld, -996, 101, 995);
+		stable[1] = loc.new(gamesworld, -996, 101, 996);
+		stable[2] = loc.new(gamesworld, -995, 101, 995);
+		stable[3] = loc.new(gamesworld, -995, 101, 996);
+		target[0] = loc.new(gamesworld, -1000, 101, 996);
+		target[1] = loc.new(gamesworld, -1000, 101, 997);
+		target[2] = loc.new(gamesworld, -1000, 101, 998);
+		target[3] = loc.new(gamesworld, -1000, 101, 999);
+	} elseif(i == 2) {
+		stable[0] = loc.new(gamesworld, -1005, 101, 996);
+		stable[1] = loc.new(gamesworld, -1004, 101, 996);
+		stable[2] = loc.new(gamesworld, -1005, 101, 995);
+		stable[3] = loc.new(gamesworld, -1004, 101, 995);
+		target[0] = loc.new(gamesworld, -1004, 101, 1000);
+		target[1] = loc.new(gamesworld, -1003, 101, 1000);
+		target[2] = loc.new(gamesworld, -1002, 101, 1000);
+		target[3] = loc.new(gamesworld, -1001, 101, 1000);
+	} elseif(i == 3) {
+		stable[0] = loc.new(gamesworld, -995, 101, 1004);
+		stable[1] = loc.new(gamesworld, -996, 101, 1004);
+		stable[2] = loc.new(gamesworld, -995, 101, 1005);
+		stable[3] = loc.new(gamesworld, -996, 101, 1005);
+		target[0] = loc.new(gamesworld, -996, 101, 1000);
+		target[1] = loc.new(gamesworld, -997, 101, 1000);
+		target[2] = loc.new(gamesworld, -998, 101, 1000);
+		target[3] = loc.new(gamesworld, -999, 101, 1000);
+	}
+	
+	map.add(stables, i, stable);
+	map.add(target_routes, i, target);
+}

+ 2 - 0
minigames/gamecenter.txt

@@ -97,6 +97,7 @@ minigame.addSign("s_sign_4D_1", true, loc.new(gamesworld, -396, 156, -50), "mini
 minigame.addSign("portal_1", true, loc.new(gamesworld, -401, 158, -73), "minigames/puzzle/portal/portal_core", "minigames/puzzle/portal/portal_map1", true);
 minigame.addSign("gravity_1", true, loc.new(gamesworld, -401, 158, -72), "minigames/puzzle/gravity/gravity_core", "minigames/puzzle/gravity/gravity_map1", true);
 minigame.addSign("snake_1", true, loc.new(gamesworld, -401, 158, -71), "minigames/snake/snake_core", "minigames/snake/snake_map1", true);
+minigame.addSign("dontgetangrysign1", true, loc.new(gamesworld, -401, 157, -73), "minigames/dontgetangry/dontgetangry", "minigames/dontgetangry/dontgetangry_map1", false);
 setScriptVar("gamesigns", gamesignsmap);
 
 amongus_head = read.item("{Count:1b,id:'minecraft:player_head',tag:{SkullOwner:{Id:[I;1974515746,1982350500,-1169583430,618614082],Properties:{textures:[{Signature:'RO9IGJ16KwIM79JS04eY82CRaWXDEkIqtz4xA8odVaP0Uk4Ox1sHRa69Hh1V2Zo5KRGJ1dDNECvf0XHmzFn9xcDwXmGsk9HC/t2Ndxe2jLebtJk7Ytl3/kFsNQgluS/TikWkF1MgPnucQ/M0ftggu4B1c6SE4Hat0HAIGuhgC8+2jwrTcgDxWeKy9uO4ibopjDR8+S89XzYAPqqqf2CZtZnUP28DNR7pa2uJIT5+/kP3y6euRN+VOOAdTKLUnlfiCZTOxanIkDnC20tVvQQz5lPIGH18rq+9YIF/jok0G3zqWXCgiWk24QogYQErRa9h040sg7ganrC5A5iHBwzHmvzN8k9T/XXu2gDyKih5mzb2EAOxV+pe9HfG1qIZHDhjH8+2vLsUzUDpUINQPorYJ+Qk/YnWPc38EwW4H6byneDGP1xSHmcd5SnTeGYuyXHgHs9I55u5wxTxhZref3/BkS4vIL7w5tkc4YWHOU5HbEmdillLnc0Pepk7JxYLBcnSCcRdhvRPZ3ajGEPKfDwx0RgeZsah4+MFOWi8lXOcpBwnaqpNUYRNgLAahMpuyAUUHZ17Urd6hEadbrWttDFuTO+oHBH45Ueu0vD4pgdXjP1SHZWyPvQVVKRph4eF7xVtobHGkQeJk0u7DFx2Yn+XiPmflQWBGa/oYfitYayO4Kw=',Value:'ewogICJ0aW1lc3RhbXAiIDogMTYwMzk4NTQxMjIxNCwKICAicHJvZmlsZUlkIiA6ICIwNjEzY2I1Y2QxYjg0M2JjYjI4OTk1NWU4N2QzMGEyYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJicmVhZGxvYWZzcyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9kNWEzNjhlNGI1MTc3NTljNTZhN2Q0ZDUxMWU1YmM5ZTNkOWVlNDA1Yzc5ZGFiNzZlY2IwMDdhYjBjYTg3ODc4IgogICAgfQogIH0KfQ=='}]}}}}");
@@ -124,6 +125,7 @@ minigame.addCompass(17, item.create("minecraft:grass_block", 1, "§fSammelfieber
 minigame.addCompass(18, item.create("minecraft:green_terracotta", 1, "§fSnake", null), loc.new(gamesworld, -402.5, 156, -70.5, -90, -20));
 minigame.addCompass(19, item.create("minecraft:iron_block", 1, "§fPortal", null), loc.new(gamesworld, -402.5, 156, -72.5, -90, -20));
 minigame.addCompass(20, item.create("minecraft:heavy_weighted_pressure_plate", 1, "§fGravity", null), loc.new(gamesworld, -402.5, 156, -71.5, -90, -20));
+minigame.addCompass(21, item.create("minecraft:red_banner", 1, "§fDon't get angry", null), loc.new(gamesworld, -402.5, 156, -72.5, -90, 0));
 
 modTimer(-500);
 iter = map.iterator(gamemappaths);

+ 2 - 2
minigames/parcour/parcour.txt

@@ -52,8 +52,8 @@ overall_record = ranking.getPointsFromRank(rankingtable, 1, "ASC", null);
 player.setGamemode(player, "SURVIVAL");
 player.setFly(player, false);
 sb.add(player, 99, gamename);
-sb.add(player, 98, "Server Record: §e", string.number(math.roundDown(overall_record / 1000 / 60)), ":", string.number(math.round(overall_record / 1000 % 60)), ".", string.number(overall_record % 1000));
-sb.add(player, 97, "Your Record: §e", string.number(math.roundDown(record_time / 1000 / 60)), ":", string.number(math.round(record_time / 1000 % 60)), ".", string.number(record_time % 1000));
+sb.add(player, 98, string.concat("Server Record: §e", string.number(math.roundDown(overall_record / 1000 / 60)), ":", string.number(math.round(overall_record / 1000 % 60)), ".", string.number(overall_record % 1000)));
+sb.add(player, 97, string.concat("Your Record: §e", string.number(math.roundDown(record_time / 1000 / 60)), ":", string.number(math.round(record_time / 1000 % 60)), ".", string.number(record_time % 1000)));
 sb.add(player, 96, string.concat("Checkpoints: §e", string.number(jumpstage), "/", string.number(list.getSize(checkpoints) - 1)));
 sb.add(player, 95, string.concat("§rTime: §e0:00"));
 sb.add(player, 94, sb.getSpacer());

+ 47 - 7
minigames/ragemode/ragemode.txt

@@ -47,9 +47,17 @@ list.add(lore_list, text.new("§7Kill your enimies with the help of Thor."));
 list.add(lore_list, text.new("§rPrice: §a30 Emeralds"));
 item.setLore(lightning, lore_list);
 
-shopmenu = inv.new("220000000", text.new("§8Shop"));
+glowing = item.new(material.get("glow_berries"));
+item.setName(glowing, text.new("§eGlowing"));
+lore_list = list.new();
+list.add(lore_list, text.new("§7Give your opponents a glowing effect for 10 seconds."));
+list.add(lore_list, text.new("§rPrice: §a4 Emeralds"));
+item.setLore(glowing, lore_list);
+
+shopmenu = inv.new("222000000", text.new("§8Shop"));
 inv.setItem(shopmenu, 0, speed);
 inv.setItem(shopmenu, 1, lightning);
+inv.setItem(shopmenu, 2, glowing);
 
 goto("simplelobby");
 
@@ -111,10 +119,20 @@ wither_sound = sound.get("ENTITY_WITHER_SPAWN");
 sound_harp = sound.get("BLOCK_NOTE_BLOCK_HARP");
 ambient_sound_category = sound.getCategory("AMBIENT");
 
+p_amount = list.getSize(player_list);
+goal_points = p_amount * 5;
+if(goal_points > 25) {
+	goal_points = 25;
+}
+if(p_amount == 2) {
+	max_play_time = 10; //minutes
+} else {
+	max_play_time = 15;
+}
 minigame.displayAll(99, gamename);
-minigame.displayAll(98, "§aGoal: §r25");
+minigame.displayAll(98, string.concat("§aGoal: §r", string.number(goal_points)));
 id = 97;
-for(i = 0; i < list.getSize(player_list); i++) {
+for(i = 0; i < p_amount; i++) {
 	for_p = player.get(list.getIndex(player_list, i));
 	for_pname = player.getName(for_p);
 	msg.prefix(for_p, gamename, "The game has started.");
@@ -156,8 +174,10 @@ for(i = 0; i < list.getSize(player_list); i++) {
 	map.add(emeralds, for_pname, 0);
 }
 minigame.displayAll(id, "Emeralds: §a0");
-sgoto(16800, "lastminute");
-sgoto(18000, "endgame");
+ticks_to_end = max_play_time * 1200;
+ticks_to_last_min = ticks_to_end - 1200;
+sgoto(ticks_to_last_min, "lastminute");
+sgoto(ticks_to_end, "endgame");
 
 minigame.clearItems(middleloc, radius);
 
@@ -282,7 +302,9 @@ if(item != null) {
 			minigame.speakAll(gamename, string.concat("§8", player_name, "§e used Speed."));
 			inv.close(player);
 		}
-	} elseif(inv_slot == 1) {
+		goto("wait");
+	}
+	if(inv_slot == 1) {
 		if(map.get(emeralds, player_name) >= 30) {
 			minigame.speakAll(gamename, string.concat("§8", player_name, "§e used Thors Hand."));
 			inv.close(player);
@@ -302,6 +324,24 @@ if(item != null) {
 			}
 			no_emerald = false;
 		}
+		goto("wait");
+	}
+	if(inv_slot == 2) {
+		if(map.get(emeralds, player_name) >= 4) {
+			for(i = 0; i < list.getSize(player_list); i++) {
+				puuid = list.getIndex(player_list, i);
+				if(puuid == player.getUuid(player)) {
+					continue;
+				}
+				p = player.get(puuid);
+				living.addEffect(p, "GLOWING", 200, 0);
+			}
+			map.add(emeralds, player_name, map.get(emeralds, player_name) - 4);
+			sb.add(player, emeraldid, "Emeralds: §a", string.number(map.get(emeralds, player_name)));
+			minigame.speakAll(gamename, string.concat("§8", player_name, "§e used Glowing."));
+			inv.close(player);
+		}
+		goto("wait");
 	}
 }
 goto("wait");
@@ -381,7 +421,7 @@ if(action == "axeHit") {
 action = null;
 map.add(times, position, time.getMillis());
 
-if(getTheoreticKills(attacker_name) >= 25) {
+if(getTheoreticKills(attacker_name) >= goal_points) {
 	winner_name = attacker_name;
 	goto("wincore");
 }

+ 3 - 2
startscript.txt

@@ -60,9 +60,10 @@ script.startNamed("TicTacToe", "utils/u_error", "minigames/tictactoe/tictactoe",
 script.startNamed("TipLoop", "utils/u_error", "system/tiploop", "utils/u_general");
 script.startNamed("Scheduler", "utils/u_error", "system/scheduler", "utils/u_general");
 
-whitelist.disable();
+//whitelist.disable();
 //setMOTD("§d§k# §eMundus Crassus §d§k# §f-  [§d1.18.2§f]\n§cMentorMentos §7- §bCommunity Server");
-setMOTD("§d§k# §eMundus Crassus §d§k# §f-  [§d1.18.2§f]\n§cNew: §a§lCHALLENGES");
+//setMOTD("§d§k# §eMundus Crassus §d§k# §f-  [§d1.18.2§f]\n§cNew: §a§lCHALLENGES");
+setMOTD("§eMundus Crassus §f- [§d1.18.2§f]\n§cPrivate");
 
 error.setConsolePrint(false);
 term();

+ 1 - 1
story/admont/anna_in_trouble.txt

@@ -38,7 +38,7 @@ if(event == "living_death") {
 	if(entity_type == "spider") {
 		mob_killed = true;
 		msg.prefix(player, "§dAnna", "Thank you! Now I can fall asleep again calmly.");
-		msg(player, text.new("§dQuest finished. Reward: 1 snuvis!"));
+		msg.string(player, "§dQuest finished. Reward: 1 snuvis!");
 		money.addBoost(player, 1);
 		quest.finish(script, player);
 	}

+ 13 - 9
story/admont/core.txt

@@ -15,8 +15,9 @@ inv.setItem(dieter_inv, 0, item.create("minecraft:enchanted_book", 1, "§fGaumen
 mageguard_inv = inv.new("333333333", text.new("Quests: Mage Guard"));
 inv.setItem(mageguard_inv, 0, item.create("minecraft:enchanted_book", 1, "§fMage", null));
 
-farmer_inv = inv.new("200000000", text.new("Quests: Farmer"));
+farmer_inv = inv.new("220000000", text.new("Quests: Farmer"));
 inv.setItem(farmer_inv, 0, item.create("minecraft:enchanted_book", 1, "§fFirst Date", null));
+inv.setItem(farmer_inv, 1, item.create("minecraft:enchanted_book", 1, "§fHarvest Season", null));
 //inv.setItem(farmer_inv, 1, item.create("minecraft:enchanted_book", 1, "§fNeue Hose", null));
 
 anna_inv = inv.new("200000000", text.new("Quests: Anna"));
@@ -39,11 +40,10 @@ kunibert_inv = inv.new("333333333", text.new("Quests: Kunibert"));
 inv.setItem(kunibert_inv, 0, item.create("minecraft:enchanted_book", 1, "§fKräutermeister", null));
 
 bauer_inv = inv.new("333333333", text.new("Quests: Bauer"));
-inv.setItem(bauer_inv, 0, item.create("minecraft:enchanted_book", 1, "§fErntezeit", null));
-inv.setItem(bauer_inv, 1, item.create("minecraft:enchanted_book", 1, "§fSpezialwunsch", null));
+inv.setItem(bauer_inv, 0, item.create("minecraft:enchanted_book", 1, "§fSpezialwunsch", null));
 
-ulf_inv = inv.new("333333333", text.new("Quests: Ulf"));
-inv.setItem(ulf_inv, 0, item.create("minecraft:enchanted_book", 1, "§fIn Eile", null));
+baker_inv = inv.new("200000000", text.new("Quests: Baker"));
+inv.setItem(baker_inv, 0, item.create("minecraft:enchanted_book", 1, "§fIn Haste", null));
 
 isabell_inv = inv.new("333333333", text.new("Quests: Isabell"));
 inv.setItem(isabell_inv, 0, item.create("minecraft:enchanted_book", 1, "§fFür die Wissenschaft!", null));
@@ -105,8 +105,8 @@ if(item == quest_book) {
 		inv.open(kunibert_inv, player);
 	} elseif(entity_name == "Bauer") {
 		inv.open(bauer_inv, player);
-	} elseif(entity_name == "Ulf") {
-		inv.open(ulf_inv, player);
+	} elseif(title_string == "Baker") {
+		inv.open(baker_inv, player);
 	} elseif(entity_name == "Isabell") {
 		inv.open(isabell_inv, player);
 	} elseif(entity_name == "Olaf") {
@@ -155,6 +155,10 @@ if(title_string == "Quests: Farmer") {
 		quest.start(player, "story/admont/first_date");
 		goto("main");
 	}
+	if(inv_slot == 1) {
+		quest.start(player, "story/admont/harvest_season");
+		goto("main");
+	}
 	if(inv_slot == 1) {
 		//quest.start(player, "story/admont/neue_hose");
 		goto("main");
@@ -222,9 +226,9 @@ if(title_string == "Quests: Bauer") {
 	}
 	goto("main");
 }
-if(title_string == "Quests: Ulf") {
+if(title_string == "Quests: Baker") {
 	if(inv_slot == 0) {
-		quest.start(player, "story/admont/in_eile");
+		quest.start(player, "story/admont/in_haste");
 		goto("main");
 	}
 	goto("main");

+ 0 - 106
story/admont/erntezeit.txt

@@ -1,106 +0,0 @@
-event.load("quest_start");
-event.load("quest_term");
-event.load("block_drop");
-event.load("block_break");
-event.load("entity_click");
-
-stage = 0;
-all_stages = 3;
-quest_name = "Erntezeit";
-
-wheat_needed = 64;
-carrots_needed = 10;
-wheat_harvestet = 0;
-carrots_harvestet = 0;
-
-@wait
-wait();
-if(event == "block_drop") {
-	if(!isPlayer(entity)) {
-		goto("wait");
-	}
-	player = entity;
-}
-if(event == "living_death") {
-	player = player.getFromDamageSource(damage_source);
-	if(player == null) {
-		goto("wait");
-	}
-}
-if(!player.isQuester(player, script)) {
-	goto("wait");
-}
-if(event == "quest_term") {
-	//Hier Code einfügen...
-	wait(); //Script wird von außen terminiert
-}
-if(event == "quest_start") {
-	quest.display(player, quest_name, stage, all_stages);
-	msg.prefix(player, "§dBauer", "Gut, dass du vorbeischaust. Hilf mir doch bei der Ernte und hole mir 64 Weizen vom Feld.");
-	scheduler.msgPrefix(30, player, "§dBauer", "Wenn du damit fertig bist, bräuchte ich noch 10 Karotten. Diese solltest du auf dem offenen Felde hinter der Mühle finden.");
-	goto("wait");
-}
-label = concat("stage", text.number(stage));
-goto(label);
-
-@stage0
-@stage1
-@stage2
-if(event == "block_drop") {
-	if(block_type == "km:rwheat") {
-		list.clear(drops);
-		list.add(drops, read.item("minecraft:wheat"));
-	}
-	goto("wait");
-}
-if(event == "block_break") {
-	if(block_type == "km:rwheat") {
-		cancel = false;
-		scheduler.setBlock(60, block_loc, "km:rwheat[age=7]", false);
-		wheat_harvestet++;
-		if(t == wheat_needed) {
-			stage.increase(player);
-		}
-	}
-	if(block_type == "km:rcarrots") {
-		item.drop(block_loc, read.item("minecraft:carrot"));
-		cancel = true;
-		carrots_harvestet++;
-		if(carrots_harvestet == carrots_needed) {
-			stage.increase(player);
-		}
-	}
-	goto("wait");
-}
-if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
-	entity_name = entity.getName(entity);
-	if(entity_name == "Bauer") {
-		item = living.getEquip(player, "hand");
-		item_type = item.getType(item);
-		if(item_type == "minecraft:wheat") {
-			if(wheat_needed > 0) {
-				rest_amount = human.giveItem(entity_name, player, item_type, wheat_needed);
-				if(rest_amount == 0) {
-					msg.prefix(player, "§dBauer", "Danke für das Weizen.");
-				}
-				wheat_needed = rest_amount;
-			}
-		}
-		if(item_type == "minecraft:carrot") {
-			if(carrots_needed > 0) {
-				rest_amount = human.giveItem(entity_name, player, item_type, carrots_needed);
-				if(rest_amount == 0) {
-					msg.prefix(player, "§dBauer", "Danke für die Karotten.");
-				}
-				carrots_needed = rest_amount;
-			}
-		}
-		if(wheat_needed == 0 && carrots_needed == 0) {
-			msg.prefix(player, "§dBauer", "Vielen Dank für deine Hilfe!");
-			msg(player, "§dQuest abgeschlossen. Belohnung: 18 Snuvis!");
-			money.addBoost(player, 18);
-			quest.finish(script, player);
-		}
-	}
-}
-goto("wait");

+ 119 - 0
story/admont/harvest_season.txt

@@ -0,0 +1,119 @@
+event.load("quest_start");
+event.load("quest_term");
+event.load("block_drop");
+event.load("block_click");
+event.load("block_break");
+event.load("entity_click");
+
+stage = 0;
+all_stages = 3;
+quest_name = "Harvest Season";
+
+wheat_needed = 15;
+carrots_needed = 8;
+wheat_harvestet = 0;
+carrots_harvestet = 0;
+wheat_mat = material.get("WHEAT");
+carrot_mat_block = material.get("CARROTS");
+carrot_mat_item = material.get("CARROT");
+
+@wait
+wait();
+if(!player.isQuester(player, script)) {
+	goto("wait");
+}
+if(event == "quest_term") {
+	//Hier Code einfügen...
+	wait(); //Script wird von außen terminiert
+}
+if(event == "quest_start") {
+	quest.display(player, quest_name, stage, all_stages);
+	msg.prefix(player, "§dFarmer", "Good of you to look in. Why don't you help me with the harvest and get me 15 wheat from the field?.");
+	scheduler.msgPrefix(30, player, "§dFarmer", "When you're done with that, I'd need 8 more carrots.");
+	goto("wait");
+}
+label = string.concat("stage", string.number(stage));
+goto(label);
+
+@stage0
+@stage1
+@stage2
+if(event == "block_drop") {
+	block_type = block.getType(block);
+	if(block_type == wheat_mat) {
+		item_entity = list.getIndex(drops, 0);
+		item.entity.set(item_entity, item.new(wheat_mat));
+		list.clear(drops);
+		list.add(drops, item_entity);
+		goto("wait");
+	}
+	if(block_type == carrot_mat_block) {
+		item_entity = list.getIndex(drops, 0);
+		item.entity.set(item_entity, item.new(carrot_mat_item));
+		list.clear(drops);
+		list.add(drops, item_entity);
+	}
+	goto("wait");
+}
+if(event == "block_click") {
+	if(block == null) {
+		goto("wait");
+	}
+	block_type = block.getType(block);
+	if(block_type == wheat_mat || block_type == carrot_mat_block) {
+		cancel = false;
+	}
+	goto("wait");
+}
+if(event == "block_break") {
+	block_type = block.getType(block);
+	if(block_type == wheat_mat) {
+		cancel = false;
+		scheduler.setBlockData(60, block, read.blockData("minecraft:wheat[age=7]"), false);
+		wheat_harvestet++;
+		if(wheat_harvestet == wheat_needed) {
+			stage.increase(player);
+		}
+	}
+	if(block_type == carrot_mat_block) {
+		cancel = false;
+		scheduler.setBlockData(60, block, read.blockData("minecraft:carrots[age=7]"), false);
+		carrots_harvestet++;
+		if(carrots_harvestet == carrots_needed) {
+			stage.increase(player);
+		}
+	}
+	goto("wait");
+}
+if(event == "entity_click" && slot.isHand(hand) && entity.isHuman(entity)) {
+	entity_name = human.getName(entity);
+	if(entity_name == "Farmer") {
+		item = living.getHand(player);
+		item_type = item.getType(item);
+		if(item_type == wheat_mat) {
+			if(wheat_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, wheat_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dFarmer", "Thanks for the wheat.");
+				}
+				wheat_needed = rest_amount;
+			}
+		}
+		if(item_type == carrot_mat_item) {
+			if(carrots_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, carrots_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dFarmer", "Thanks for the carrots.");
+				}
+				carrots_needed = rest_amount;
+			}
+		}
+		if(wheat_needed == 0 && carrots_needed == 0) {
+			msg.prefix(player, "§dFarmer", "Thank you for your help!");
+			msg.string(player, "§dQuest finished. Reward: 4 snuvis!");
+			money.addBoost(player, 4);
+			quest.finish(script, player);
+		}
+	}
+}
+goto("wait");

+ 0 - 87
story/admont/in_eile.txt

@@ -1,87 +0,0 @@
-event.load("quest_start");
-event.load("quest_term");
-event.load("block_break");
-event.load("entity_click");
-event.load("block_drop");
-
-stage = 0;
-all_stages = 2;
-quest_name = "In Eile";
-
-bread_needed = 21;
-wheat_needed = 63;
-wheat_harvestet = 0;
-
-@wait
-wait();
-if(event == "block_drop") {
-	if(!isPlayer(entity)) {
-		goto("wait");
-	}
-	player = entity;
-}
-if(event == "living_death") {
-	player = player.getFromDamageSource(damage_source);
-	if(player == null) {
-		goto("wait");
-	}
-}
-if(!player.isQuester(player, script)) {
-	goto("wait");
-}
-if(event == "quest_term") {
-	//Hier Code einfügen...
-	wait(); //Script wird von außen terminiert
-}
-if(event == "quest_start") {
-	quest.display(player, quest_name, stage, all_stages);
-	msg.prefix(player, "§dUlf", concat("Hey ", player.getName(player), "! Ich erwarte ziemlich viel Kundschaft und ich bin nicht mal annähernd mit der Zubereitung fertig."));
-	scheduler.msgPrefix(30, player, "§dUlf", "50 Brote haben sie bestellt… Das ist unschaffbar! Ich habe erst 29 Brote gebacken.");
-	scheduler.msgPrefix(60, player, concat("§5", player.getName(player)), "Die letzten 21 Brote kann ich übernehmen!");
-	scheduler.msgPrefix(90, player, "§dUlf", "Super! Dann geh doch zum Weizenfeld, hol dir die nötigen Ressourcen und verarbeite sie zu Brot.");
-	goto("wait");
-}
-if(event == "block_drop") {
-	if(block_type == "km:rwheat") {
-		list.clear(drops);
-		list.add(drops, read.item("minecraft:wheat"));
-	}
-	goto("wait");
-}
-if(event == "block_break") {
-	if(block_type == "km:rwheat") {
-		cancel = false;
-		scheduler.setBlock(60, block_loc, "km:rwheat[age=7]", false);
-	}
-}
-label = concat("stage", text.number(stage));
-goto(label);
-
-@stage0
-if(event == "block_break") {
-	if(block_type == "km:rwheat") {
-		wheat_harvestet++;
-		if(wheat_harvestet == wheat_needed) {
-			stage.increase(player);
-		}
-	}
-}
-goto("wait");
-
-@stage1
-if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
-	entity_name = entity.getName(entity);
-	if(entity_name == "Ulf") {
-		rest_amount = human.giveItem(entity_name, player, "minecraft:bread", bread_needed);
-		if(rest_amount == 0) {
-			msg.prefix(player, "§dBauer", "Du kommst gerade rechtzeitig, die Kunden sind eben eingetroffen! Hier eine Belohnung.");
-			player.giveItem(player, read.item("km:berry_work"));
-			msg(player, "§dQuest abgeschlossen. Belohnung: 15 Snuvis!");
-			money.addBoost(player, 15);
-			quest.finish(script, player);
-		} else {
-			bread_needed = rest_amount;
-		}
-	}
-}
-goto("wait");

+ 91 - 0
story/admont/in_haste.txt

@@ -0,0 +1,91 @@
+event.load("quest_start");
+event.load("quest_term");
+event.load("block_break");
+event.load("entity_click");
+event.load("block_click");
+event.load("block_drop");
+
+stage = 0;
+all_stages = 2;
+quest_name = "In Eile";
+
+bread_needed = 21;
+wheat_needed = 63;
+wheat_harvestet = 0;
+wheat_mat = material.get("WHEAT");
+bread_mat = material.get("BREAD");
+
+@wait
+wait();
+if(!player.isQuester(player, script)) {
+	goto("wait");
+}
+if(event == "quest_term") {
+	//Hier Code einfügen...
+	wait(); //Script wird von außen terminiert
+}
+if(event == "quest_start") {
+	quest.display(player, quest_name, stage, all_stages);
+	msg.prefix(player, "§dBaker", string.concat("Hey ", player.getName(player), "! I'm expecting quite a lot of customers and I'm not even close to finishing the preparation."));
+	scheduler.msgPrefix(30, player, "§dBaker", "They ordered 50 breads... That's impossible! I have only made 29 breads.");
+	scheduler.msgPrefix(60, player, string.concat("§5", player.getName(player)), "I can take the last 21 breads!");
+	scheduler.msgPrefix(90, player, "§dBaker", "Great! Then go to the wheat field, get the resources you need and process them into bread.");
+	goto("wait");
+}
+if(event == "block_drop") {
+	block_type = block.getType(block);
+	if(block_type == wheat_mat) {
+		item_entity = list.getIndex(drops, 0);
+		item.entity.set(item_entity, item.new(wheat_mat));
+		list.clear(drops);
+		list.add(drops, item_entity);
+	}
+	goto("wait");
+}
+if(event == "block_click") {
+	if(block == null) {
+		goto("wait");
+	}
+	block_type = block.getType(block);
+	if(block_type == wheat_mat) {
+		cancel = false;
+	}
+	goto("wait");
+}
+if(event == "block_break") {
+	block_type = block.getType(block);
+	if(block_type == wheat_mat) {
+		cancel = false;
+		scheduler.setBlockData(60, block, read.blockData("minecraft:wheat[age=7]"), false);
+	}
+}
+label = string.concat("stage", string.number(stage));
+goto(label);
+
+@stage0
+if(event == "block_break") {
+	block_type = block.getType(block);
+	if(block_type == wheat_mat) {
+		wheat_harvestet++;
+		if(wheat_harvestet == wheat_needed) {
+			stage.increase(player);
+		}
+	}
+}
+goto("wait");
+
+@stage1
+if(event == "entity_click" && slot.isHand(hand) && entity.isHuman(entity)) {
+	entity_name = human.getName(entity);
+	if(entity_name == "Baker") {
+		rest_amount = human.giveItem(entity_name, player, bread_mat, bread_needed);
+		if(rest_amount == 0) {
+			msg.prefix(player, "§dBaker", "You're just in time, the customers have just arrived! Here is a reward.");
+			msg.string(player, "§dQuest finished. Reward: 4 snuvis!");
+			money.addBoost(player, 4);
+			quest.finish(script, player);
+		}
+		bread_needed = rest_amount;
+	}
+}
+goto("wait");

+ 0 - 1
system/chat.txt

@@ -11,7 +11,6 @@ if(config.exists(config)) {
 crash = config.getBool(config, "crash", false);
 
 joinNews.createTable();
-//joinNews.insert("One time join news", time.getMillis());
 
 cookie_time = 0;
 cookie = item.new(material.get("minecraft:cookie"));

+ 1 - 1
system/humans.txt

@@ -12,7 +12,7 @@ anna_inv = createMainMenu("Anna", false, true, false, false);
 farmer_inv = createMainMenu("Farmer", true, true, false, false);
 fisher_inv = createMainMenu("Fisher", true, false, false, false);
 miner_inv = createMainMenu("Miner", true, true, false, false);
-baker_inv = createMainMenu("Baker", true, false, false, false);
+baker_inv = createMainMenu("Baker", true, true, false, false);
 alena_inv = createMainMenu("Alena", true, false, false, false);
 mason_inv = createMainMenu("Mason", true, false, false, false);
 priest_inv = createMainMenu("Priest", true, false, false, false);

+ 55 - 2
system/market.txt

@@ -3,6 +3,8 @@ config.load(stock);
 mainHand = read.slot("HAND");
 openMarkets = set.new();
 
+resetTime = 6 * 60 * 60 * 20;
+
 // Miner
 miner = inv.new("222222222222222222", text.new("Miner"));
 inv.setItem(miner, 0, newItem(material.get("DIAMOND")));
@@ -276,7 +278,9 @@ function newItem(material) {
 function updateItem(inv, slot, material) {
     calculatePrices(material);
     inv.setItem(inv, slot, newItem(material));
-}   
+}
+
+sgoto(40, "consume");   
 
 msg.string("dev", "§bMarket §rloaded.");
 @loop
@@ -284,6 +288,55 @@ wait();
 ignoreGoto(event);
 goto("loop");
 
+function reduceInventory(inv) {
+    size = inv.getSize(inv);
+    for(i = 0; i < size; i++) {
+        item = inv.getItem(inv, i);
+        if(item == null) {
+            continue;
+        }
+        lore = item.getLore(item);
+        if(lore == null || list.getSize(lore) == 0) {
+            continue;
+        } elseif(list.getSize(lore) == 1) {
+            continue;
+        }
+        m = item.getType(item);
+        amount = config.getDouble($stock, m, 0);
+        if(amount > 128) {
+            config.set($stock, m, math.round(amount * 0.99));
+        } elseif(amount < 0) {
+            config.set($stock, m, 0);
+        }
+        updateItem(inv, i, m);
+    }
+}
+
+@consume
+time = config.getDouble($stock, "time", 0);
+if(time + resetTime - 1000 >= time.getMillis()) {
+    msg("dev", text.new("§6Skipping market reduce"));
+} else {
+    config.set($stock, "time", time.getMillis());
+
+    reduceInventory(miner);
+    reduceInventory(farmer);
+    reduceInventory(fisher);
+    reduceInventory(baker);
+    reduceInventory(tavern);
+    reduceInventory(priest);
+    reduceInventory(mason);
+    reduceInventory(mage);
+    reduceInventory(lumberjack);
+    reduceInventory(butcher);
+    reduceInventory(librarian);
+    reduceInventory(nether);
+    reduceInventory(diver);
+    save();
+}
+sgoto(resetTime, "consume"); 
+goto("loop");
+
 @save
 config.saveAsync(stock);
 //print("save");
@@ -455,4 +508,4 @@ if(gotSnuvis > 0) {
     updateItem(inv, inv_slot, material);
     save();
 }
-goto("loop");
+goto("loop");

+ 1 - 0
system/ranklist.txt

@@ -34,6 +34,7 @@ ranking.add("§e", "ShoppingChaos", "sc", "shoppingranks", "Max Items", "DESC",
 ranking.add("§e", "MengerRun", "mr", "mrranks", "Wins", "DESC", null);
 ranking.add("§c", "AmongUs", "among_us", "among_us_ranks", "Time", "ASC", null);
 ranking.add("§2", "Snake", "snake", "snakeranks", "Size Record", "DESC", null);
+ranking.add("§c", "DontGetAngry", "dga", "dgaranks", "Finished tokens", "DESC", null);
 
 ranking.register("invertranks5x5");
 ranking.register("invertranks7x7");

+ 7 - 0
system/scheduler.txt

@@ -71,6 +71,13 @@ while(hasNext(iter)) {
 			item = a[3];
 			player.giveSingleItem(player, item);
 		}
+		//SetBlockData
+		if(action == 10) {
+			block = a[2];
+			blockdata = a[3];
+			block_update = a[4];
+			block.setData(block, blockdata, block_update);
+		}
 		remove(iter);
 	}
 }

+ 4 - 0
test3.txt

@@ -0,0 +1,4 @@
+p = read.player("kajetanjohannes");
+i = item.new(material.get("IRON_SWORD"));
+item.addDefaultTags(i);
+player.giveItem(p, i);

+ 2 - 0
utils/u_cmdhelp.txt

@@ -264,6 +264,8 @@ function setCommandHelps() {
 	addStatsGameHelp(help, "Halma");
 	addStatsGameHelp(help, "ShoppingChaos");
 	addStatsGameHelp(help, "MengerRun");
+	addStatsGameHelp(help, "Snake");
+	addStatsGameHelp(help, "DontGetAngry");
 	command.addHelp(help);
 	
 	help = command.newHelp("setspawn", "setspawn");

+ 7 - 12
utils/u_games.txt

@@ -1,4 +1,5 @@
 @simplelobby
+ignoreGoto("checklobby");
 wait();
 if(event == "entity_damage") {
 	if(!isPlayer(entity)) {
@@ -74,13 +75,6 @@ if(!minigame.canStart()) {
 	minigame.waiting();
 	goto("simplelobby");
 }
-if(minigame.hasIndivStartCheck()) {
-	if(!minigame.canStartIndiv()) {
-		noticetime = minigame.getLobbyCounter();
-		ignoreGoto("checklobby");
-		goto("simplelobby");
-	}
-}
 minigame.setStarting(true);
 if(noticetime == 5) {
 	minigame.titleAll(gamename, mapname, 20, 60, 20);
@@ -110,7 +104,6 @@ for(i = 0; i < p_amount; i++) {
 	p = player.get(list.getIndex(player_list, i));
 	sound.spawnForPlayer(p, join_sound, sound_category_ambient);
 }
-ignoreGoto("checklobby");
 goto("simplelobby");
 
 @lobbycore
@@ -195,11 +188,10 @@ function minigame.setPlayerResetInCore(bool) {
 }
 
 function minigame.doPlayerResetInCore() {
-	bool = !$no_core_reset;
-	if(bool == null) {
-		bool = true;
+	if($no_core_reset == null) {
+		$no_core_reset = false;
 	}
-	return bool;
+	return !$no_core_reset;
 }
 
 function minigame.setManualStart(bool) {
@@ -294,6 +286,9 @@ function minigame.waiting() {
 }
 
 function minigame.canStart() {
+	if(minigame.hasIndivStartCheck()) {
+		return minigame.canStartIndiv();
+	}
 	player_list = minigame.getPlayers($script_id);
 	p_amount = list.getSize(player_list);
 	return p_amount >= minigame.getMinPlayers();

+ 28 - 0
utils/u_general.txt

@@ -84,6 +84,24 @@ function array.sort(my_array, ascending) {
 	return my_array;
 }
 
+function array.contains(array, element) {
+	for(i = 0; i < array.getSize(array); i++) {
+		if(array[i] == element) {
+			return true;
+		}
+	}
+	return false;
+}
+
+function array.getIndexOf(array, element) {
+	for(i = 0; i < array.getSize(array); i++) {
+		if(array[i] == element) {
+			return i;
+		}
+	}
+	return -1;
+}
+
 function map.sort(map, ascending) {
 	size = map.getSize(map);
 	my_array = array.new(size, 2);
@@ -4153,6 +4171,16 @@ function scheduler.giveSingleItem(ticks, player, item) {
 	scheduler.add(a);
 }
 
+function scheduler.setBlockData(ticks, block, blockdata, block_update) {
+	a = array.new(5);
+	a[0] = 10;
+	a[1] = ticks;
+	a[2] = block;
+	a[3] = blockdata;
+	a[4] = block_update;
+	scheduler.add(a);
+}
+
 //--------------------------------------------------
 //Icon-Utils
 //--------------------------------------------------

+ 1 - 0
utils/u_questerror.txt

@@ -3,6 +3,7 @@ snuvi.debug("Error Handler activated");
 if(player != null) {
 	msg.string(player, "§cThere was an error in the quest.");
 	quest.removePlayer(player);
+	quest.removeDisplay(player);
 }
 snuvi.debug("Script terminated (Quest).");
 term();