Ver código fonte

new skills, skill settings, bugfixes and other changes

Marvin Löschenkohl 3 anos atrás
pai
commit
e0ab3ea51c

+ 7 - 2
minigames/among_us/among_us.txt

@@ -3388,6 +3388,7 @@ function tpAllMiddle(reporter) {
 	$meeting = true;
 	$reactor_used = false;
 	removeDeadBodies();
+	amongus.clearAdminTable();
 	for(i = 0; i < list.getSize($player_list); i++) {
 		p_uuid = list.getIndex($player_list, i);
 		p = player.get(p_uuid);
@@ -3830,7 +3831,6 @@ function killCrewmate(killer, crewmate) {
 	inv.close(crewmate);
 	sabotage.closedInv(crewmate);
 	player.setSpeed(crewmate, $move_speed * 1.5);
-	amongus.removeFromAdminTable(crewmate);
 	//Leiche an Mord-Location platzieren
 	ent = entity.spawn("zombie", loc, "{IsBaby:0}");
 	list.add($dead_bodies, ent);
@@ -3843,6 +3843,11 @@ function killCrewmate(killer, crewmate) {
 	amongus.forceEquip(ent, color);
 }
 
+function amongus.clearAdminTable() {
+	map.clear($admin_table_map);
+	map.clear($admin_table_map_2);
+}
+
 function amongus.removeFromAdminTable(player) {
 	player_uuid = player.getUuid(player);
 	room_id = map.get($admin_table_map, player_uuid);
@@ -5297,7 +5302,7 @@ function createVoteInv(player, reporter_uuid) {
 		head = player.getHead(p_uuid, p_name);
 		if(player.isGhost(p_uuid)) {
 			item.setName(head, concat("§r", amongus.getPlayerColorCode(p_uuid), p_name));
-			inv.setItem(inv, index - 1, zombie_head);
+			inv.setItem(inv, index - 1, $zombie_head);
 		} else {
 			item.setName(head, concat("§rVote for ", amongus.getPlayerColorCode(p_uuid), p_name));
 			if(p_uuid == reporter_uuid) {

+ 3 - 0
minigames/inverting/inverting.txt

@@ -24,6 +24,8 @@ if(!player.hasMinigameId(player, script_id)) {
 if(event == "player_join") {
 	entity.teleport(player, tploc);
 	resetplayer(player);
+	player.setGamemode(player, "survival");
+	player.setFly(player, true);
 	display.add(player, 0, gamename);
 	display.add(player, 1, "Swaps:");
 	clicked = 0;
@@ -35,6 +37,7 @@ if(event == "player_join") {
 	goto("wait");
 }
 if(event == "player_giveup" || event == "player_logout") {
+	player.setFly(player, false);
 	script = script.getFromId(script_id);
 	minigame.kickPlayer(script, player);
 	minigame.term(script, gamesignloc);

+ 0 - 1
startscript.txt

@@ -25,7 +25,6 @@ script.startNamed("Survival", "system/survival", "utils/u_general");
 script.startNamed("Gamecenter", "system/gamecenter", "utils/u_general", "utils/u_games");
 script.startNamed("Ranklist", "system/ranklist", "utils/u_general", "utils/u_games");
 script.startNamed("Story", "system/story", "utils/u_general");
-script.startNamed("QuestsSpawn", "story/spawn/core", "utils/u_general");
 script.startNamed("QuestsAdmont", "story/admont/core", "utils/u_general");
 script.startNamed("Gamerules", "system/gamerules");
 script.startNamed("Scheduler", "system/scheduler", "utils/u_general");

+ 1 - 1
story/admont/core.txt

@@ -52,7 +52,7 @@ if(entity_name == "Zauberlehrling") {
 }
 if(entity_name == "Felsmagier") {
 	if(time.getMillis() - map.getOrDefault(timestamp, player.getUuid(player), 0) < 120000) { //2 Minutes
-		skill.showShop(player, "Subcutaneous Inventory", "Head Hunter", null, null, null, null, null, null, null);
+		skill.showShop(player, "Subcutaneous Inventory", "Comeback", "Head Hunter", "Mobheads", "Fly 10min", null, null, null, null);
 	} else {
 		msg.prefix(player, "§dFelsmagier", "Du musst zuerst ein paar Aufgaben für mich erledigen. Finde meinen Zauberlehrling, der hilft dir weiter.");
 	}

+ 3 - 1
story/admont/erstes_date.txt

@@ -9,6 +9,7 @@ stage = 0;
 all_stages = 2;
 quest_name = "Erstes Date";
 tulips = 0;
+book_chest_loc = loc.new(world.getStory(), -1626, 57, 23);
 
 @wait
 wait();
@@ -82,7 +83,8 @@ if(option == "A") {
 				goto("wait");
 			}
 			if(item_type == "minecraft:written_book" && removeFormat(item.getName(item)) == "Für Merle") {
-				player.removeItem2(player, read.item("minecraft:written_book"));
+				block.addItem(book_chest_loc, item.clone(item));
+				entity.setEquip(player, "hand", read.item("minecraft:air"));
 				msg.prefix(player, "§dPeter", "Vielen Dank!");
 				msg(player, "§dQuest abgeschlossen. Belohnung: 8 Snuvis!");
 				addMoney(player, 8);

+ 1 - 0
story/admont/felsmagier.txt

@@ -308,6 +308,7 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 			map = script.getVar(admont_script, "timestamp");
 			map.add(map, player.getUuid(player), time.getMillis());
 			msg(player, "§dQuest abgeschlossen. Belohnung: 30 Snuvis!");
+			msg(player, text.click("§r [§cclick§r] §f[§bTeleport§f] zum Story-Spawn.", "/story"));
 			addMoney(player, 30);
 			quest.finish(script, player);
 		}

+ 93 - 26
story/admont/kraeutermeister.txt

@@ -3,10 +3,12 @@ event.load("quest_term");
 event.load("block_click");
 event.load("block_break");
 event.load("entity_click");
+event.load("item_air_click");
 
 stage = 0;
 all_stages = 9;
 quest_name = "Kräutermeister";
+age_prop_3 = block.getProperty("age_0_3");
 
 brown_mushroom = 0;
 red_mushroom = 0;
@@ -17,6 +19,15 @@ crimson_fungus = 0;
 warped_roots = 0;
 crimson_roots = 0;
 
+brown_mushroom_needed = 5;
+red_mushroom_needed = 5;
+nether_wart_needed = 10;
+twisting_vines_needed = 3;
+warped_fungus_needed = 1;
+crimson_fungus_needed = 1;
+warped_roots_needed = 2;
+crimson_roots_needed = 2;
+
 brown_mushroom_given = 0;
 red_mushroom_given = 0;
 nether_wart_given = 0;
@@ -61,12 +72,67 @@ if(event == "quest_start") {
 	player.giveSingleItem(player, ingredients, true);
 	goto("wait");
 }
+if(event == "item_air_click") {
+	if(hand == "OFF_HAND") {
+		goto("wait");
+	}
+	item = entity.getEquip(player, "hand");
+	item_type = item.getType(item);
+	if(item_type == "minecraft:paper") {
+		c = 0;
+		msg(player, "§5Noch zu sammelnde Zutaten für Kunibert:");
+		diff = brown_mushroom_needed - brown_mushroom;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " braune Pilze");
+		}
+		diff = red_mushroom_needed - red_mushroom;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " rote Pilze");
+		}
+		diff = nether_wart_needed - nether_wart;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " Netherwarzen");
+		}
+		diff = crimson_roots_needed - crimson_roots;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " Karmesinwurzeln");
+		}
+		diff = warped_fungus_needed - warped_fungus;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " Wirrpilz");
+		}
+		diff = warped_roots_needed - warped_roots;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " Wirrwurzeln");
+		}
+		diff = twisting_vines_needed - twisting_vines;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " Wirbelranken");
+		}
+		diff = crimson_fungus_needed - crimson_fungus;
+		if(diff > 0) {
+			c++;
+			msg(player, "§5 - §r", text.number(diff), " Karmesinpilz");
+		}
+		if(c == 0) {
+			msg(player, "§5 - §rAlles gesammelt.");
+		}
+	}
+	goto("wait");
+}
 if(event == "block_break") {
 	if(block_type == "minecraft:brown_mushroom") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, block_type, false);
 		brown_mushroom++;
-		if(brown_mushroom == 5) {
+		if(brown_mushroom == brown_mushroom_needed) {
 			stage.increase(player);
 		}
 	}
@@ -74,15 +140,16 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, block_type, false);
 		red_mushroom++;
-		if(red_mushroom == 5) {
+		if(red_mushroom == red_mushroom_needed) {
 			stage.increase(player);
 		}
 	}
 	if(block_type == "minecraft:nether_wart") {
 		cancel = false;
-		scheduler.setBlock(5, block_loc, block_type, false);
+		age = block.getState(block_loc, age_prop_3);
+		scheduler.setBlock(5, block_loc, concat(block_type, "[age=", text.number(age), "]"), false);
 		nether_wart++;
-		if(nether_wart == 10) {
+		if(nether_wart == nether_wart_needed) {
 			stage.increase(player);
 		}
 	}
@@ -90,7 +157,7 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, block_type, false);
 		crimson_roots++;
-		if(crimson_roots == 2) {
+		if(crimson_roots == crimson_roots_needed) {
 			stage.increase(player);
 		}
 	}
@@ -98,7 +165,7 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, block_type, false);
 		crimson_fungus++;
-		if(crimson_fungus == 1) {
+		if(crimson_fungus == crimson_fungus_needed) {
 			stage.increase(player);
 		}
 	}
@@ -106,7 +173,7 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, block_type, false);
 		warped_roots++;
-		if(warped_roots == 2) {
+		if(warped_roots == warped_roots_needed) {
 			stage.increase(player);
 		}
 	}
@@ -114,7 +181,7 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, block_type, false);
 		warped_fungus++;
-		if(warped_fungus == 1) {
+		if(warped_fungus == warped_fungus_needed) {
 			stage.increase(player);
 		}
 	}
@@ -125,7 +192,7 @@ if(event == "block_break") {
 			cancel = false;
 			scheduler.setBlock(5, block_loc, block_type, false);
 			twisting_vines++;
-			if(twisting_vines == 3) {
+			if(twisting_vines == twisting_vines_needed) {
 				stage.increase(player);
 			}
 		}
@@ -146,88 +213,88 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 			goto("wait");
 		}
 		elseif(item_type == "minecraft:brown_mushroom") {
-			if(brown_mushroom_given >= 5) {
+			if(brown_mushroom_given >= brown_mushroom_needed) {
 				goto("wait");
 			}
 			brown_mushroom_given++;
 			player.removeItem(player, read.item(item_type));
-			if(brown_mushroom_given == 5) {
+			if(brown_mushroom_given == brown_mushroom_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für die braunen Pilze.");
 			}
 		}
 		elseif(item_type == "minecraft:red_mushroom") {
-			if(red_mushroom_given >= 5) {
+			if(red_mushroom_given >= red_mushroom_needed) {
 				goto("wait");
 			}
 			red_mushroom_given++;
 			player.removeItem(player, read.item(item_type));
-			if(red_mushroom_given == 5) {
+			if(red_mushroom_given == red_mushroom_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für die roten Pilze.");
 			}
 		}
 		elseif(item_type == "minecraft:nether_wart") {
-			if(nether_wart_given >= 10) {
+			if(nether_wart_given >= nether_wart_needed) {
 				goto("wait");
 			}
 			nether_wart_given++;
 			player.removeItem(player, read.item(item_type));
-			if(nether_wart_given == 10) {
+			if(nether_wart_given == nether_wart_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für die Netherwarzen.");
 			}
 		}
 		elseif(item_type == "minecraft:crimson_roots") {
-			if(crimson_roots_given >= 2) {
+			if(crimson_roots_given >= crimson_roots_needed) {
 				goto("wait");
 			}
 			crimson_roots_given++;
 			player.removeItem(player, read.item(item_type));
-			if(crimson_roots_given == 2) {
+			if(crimson_roots_given == crimson_roots_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für die Karmesinwurzeln.");
 			}
 		}
 		elseif(item_type == "minecraft:crimson_fungus") {
-			if(crimson_fungus_given >= 1) {
+			if(crimson_fungus_given >= crimson_fungus_needed) {
 				goto("wait");
 			}
 			crimson_fungus_given++;
 			player.removeItem(player, read.item(item_type));
-			if(crimson_fungus_given == 1) {
+			if(crimson_fungus_given == crimson_fungus_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für den Karmesinpilz.");
 			}
 		}
 		elseif(item_type == "minecraft:warped_roots") {
-			if(warped_roots_given >= 2) {
+			if(warped_roots_given >= warped_roots_needed) {
 				goto("wait");
 			}
 			warped_roots_given++;
 			player.removeItem(player, read.item(item_type));
-			if(warped_roots_given == 2) {
+			if(warped_roots_given == warped_roots_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für die Wirrwurzeln.");
 			}
 		}
 		elseif(item_type == "minecraft:warped_fungus") {
-			if(warped_fungus_given >= 1) {
+			if(warped_fungus_given >= warped_fungus_needed) {
 				goto("wait");
 			}
 			warped_fungus_given++;
 			player.removeItem(player, read.item(item_type));
-			if(warped_fungus_given == 1) {
+			if(warped_fungus_given == warped_fungus_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für den Wirrpilz.");
 			}
 		}
 		elseif(item_type == "minecraft:twisting_vines") {
-			if(twisting_vines_given >= 3) {
+			if(twisting_vines_given >= twisting_vines_needed) {
 				goto("wait");
 			}
 			twisting_vines_given++;
 			player.removeItem(player, read.item(item_type));
-			if(twisting_vines_given == 3) {
+			if(twisting_vines_given == twisting_vines_needed) {
 				msg.prefix(player, "§dKunibert", "Danke für die Zwirbelranken.");
 			}
 		} else {
 			msg.prefix(player, "§dKunibert", "Das kann ich nicht gebrauchen.");
 		}
-		if(brown_mushroom_given >= 5 && red_mushroom_given >= 5 && nether_wart_given >= 10 && crimson_roots_given >= 2 && crimson_fungus_given >= 1 && warped_roots_given >= 2 && warped_fungus_given >= 1 && twisting_vines_given >= 3) {
+		if(brown_mushroom_given >= brown_mushroom_needed && red_mushroom_given >= red_mushroom_needed && nether_wart_given >= nether_wart_needed && crimson_roots_given >= crimson_roots_needed && crimson_fungus_given >= crimson_fungus_needed && warped_roots_given >= warped_roots_needed && warped_fungus_given >= warped_fungus_needed && twisting_vines_given >= twisting_vines_needed) {
 			msg.prefix(player, "§dKunibert", "Damit kann ich einiges anstellen. Vielen Dank!");
 			addMoney(player, 12);
 			msg(player, "§dQuest abgeschlossen. Belohnung: 12 Snuvis!");

+ 3 - 3
system/chestshops.txt

@@ -42,7 +42,7 @@ if(!isAChest(chestloc1)) {
 if(inv_slot == 3) { //Buy
 	//Check players money
 	if(!hasEnoughMoney(player, buy_price)) {
-		msg.prefix(player, prefix_shop, "You've not enough money.");
+		msg.prefix(player, prefix_shop, "You do not have enough money.");
 		goto("wait");
 	}
 	if(!adminshop) {
@@ -93,13 +93,13 @@ if(inv_slot == 3) { //Buy
 			goto("wait");
 		}
 		if(!hasEnoughMoney(owner_player_id, sell_price)) {
-			msg.prefix(player, prefix_shop, "Shop owner has not enough money.");
+			msg.prefix(player, prefix_shop, "Shop owner does not have enough money.");
 			goto("wait");
 		}
 	}
 	//Items des Spielers checken
 	if(player.getItemAmount(player, false, itemstack) < item.getAmount(itemstack)) {
-		msg.prefix(player, prefix_shop, "You've not enough items.");
+		msg.prefix(player, prefix_shop, "You do not have enough items.");
 		goto("wait");
 	}
 	//Platz in der Kiste checken

+ 155 - 20
system/commands.txt

@@ -113,6 +113,7 @@ command.register("stopadventure", "Stops an adventure");
 command.register("story", "Teleports to story-spawn");
 command.register("teleport", "Teleports a player to a player");
 command.register("tempban", "Bans a player temporarly");
+command.register("tempfly", "Let a player temporarly fly");
 command.register("ticket", "Ticket-Commands");
 command.register("time", "Time-Commands");
 command.register("tip", "Tip-Commands");
@@ -181,6 +182,7 @@ prefix_datatools = "§6DataTools";
 prefix_human = "§6Human";
 prefix_plot = "§dPlots";
 prefix_party = "§5Party";
+prefix_skill = "§2Skill";
 
 party_ids = getScriptVar("party_ids");
 if(party_ids == null) {
@@ -252,7 +254,7 @@ for(i = 0; i < size; i++) {
 	p = list.getIndex(online_list, i);
 	if(showcoords.get(p)) {
 		coords_loop_active = true;
-		sgoto(30, "coordsloop");
+		sgoto(10, "coordsloop");
 		break;
 	}
 }
@@ -424,6 +426,7 @@ inv.setItem(jailmenu, 8, ironbars);
 
 consoleCommands = set.new();
 set.add(consoleCommands, "ban");
+set.add(consoleCommands, "tempfly");
 set.add(consoleCommands, "silentban");
 set.add(consoleCommands, "tempban");
 set.add(consoleCommands, "unban");
@@ -466,6 +469,7 @@ event.load("block_break");
 event.load("block_click");
 event.load("player_login");
 event.load("player_logout");
+event.load("player_data_tick");
 
 msg("dev", "§bCommands §rloaded.");
 @wait
@@ -634,7 +638,7 @@ if(event == "missing_command") {
 if(event == "player_login") {
 	if(showCoords.get(player)) {
 		if(!coords_loop_active) {
-			sgoto(30, "coordsloop");
+			sgoto(10, "coordsloop");
 		}
 	}
 	goto("wait");
@@ -691,7 +695,50 @@ if(event == "inv_click") {
 		inv.setItem(inv, inv_slot, read.item("minecraft:air"));
 		inv.update(player);
 	}
-	//settings
+	if(inv_name == "Skills") {
+		if(item.getType(item) == "minecraft:air") {
+			goto("wait");
+		}
+		skill_name = item.getName(item);
+		tech_name = skill.getTechName(skill_name);
+		//Toggle skill
+		if(skill.isToggleable(skill_name)) {
+			if(skill.isActivated(player, tech_name)) {
+				skill.setActivated(player, tech_name, false);
+			} else {
+				skill.setActivated(player, tech_name, true);
+			}
+			inv.setItem(inv, inv_slot, skill.getShopItem(player, skill_name));
+			inv.update(player);
+			goto("wait");
+		}
+		//Activate skill
+		if(skill.isActive(skill_name)) {
+			world_name = world.getName(loc.getWorld(entity.getLocation(player)));
+			if(!isSurvWorldName(world_name)) {
+				msg.prefix(player, prefix_skill, "You won't use this in this world.");
+				goto("wait");
+			}
+			if(tech_name == "skill.fly10min") {
+				duration = data.getTimer(player, "fly");
+				if(duration > 0) {
+					msg.prefix(player, prefix_skill, "Skill already active.");
+					goto("wait");
+				}
+				fly_amount = skill.getAmount(player, "skill.fly10min");
+				if(fly_amount > 0) {
+					status.addTimed(player, 50, 12000, "Fly");
+					data.setTimer(player, "fly", 12000);
+					player.setFly(player, true);
+					new_fly_amount = fly_amount - 1;
+					skill.setAmount(player, "skill.fly10min", new_fly_amount);
+					msg.prefix(player, prefix_skill, concat("Used Fly 10min. New amount: ", text.number(new_fly_amount)));
+				}
+				goto("wait");
+			}
+		}
+		goto("wait");
+	}
 	if(inv_name == "§8Settings") {
 		if(inv_slot == 0) {
 			new_value = !player.getAutoCloseDoor(player);
@@ -709,7 +756,7 @@ if(event == "inv_click") {
 			inv.setItem(inv, inv_slot, read.item("minecraft:compass", 1, "§fShow Coords", new_value));
 			if(new_value) {
 				if(!coords_loop_active) {
-					sgoto(30, "coordsloop");
+					sgoto(10, "coordsloop");
 				}
 			} else {
 				display.remove(player, 30);
@@ -747,9 +794,20 @@ if(event == "function_key") {
 		inv.setItem(inv, 3, read.item("minecraft:oak_stairs", 1, "§fStair-Sitting", player.hasSittingActivated(player)));
 		inv.setItem(inv, 4, read.item("minecraft:iron_sword", 1, "§fPvP", hasPvpOn(player)));
 		inv.open(inv, player, "§8Settings");
+		goto("wait");
+	}
+	if(key == 2) {
+		skill.showAll(player);
+		goto("wait");
 	}
 	goto("wait");
 }
+if(event == "player_data_tick") {
+	if(var == "fly") {
+		tpBottom(player);
+		player.setFly(player, false);
+	}
+}
 goto("wait");
 
 @skills
@@ -1376,25 +1434,43 @@ goto("wait");
 
 @voxel
 if(size < 1) {
+	@voxelhelp
 	msg.prefix(player, prefix_commands, "/voxel <radius:1-5>");
+	msg.prefix(player, prefix_commands, "/voxel block");
 	goto("wait");
 }
-radius = list.getIndex(args,  0);
-if(!isDouble(radius)) {
-	msg.prefix(player, prefix_commands, "§rZahl erwartet");
+arg0 = list.getIndex(args,  0);
+if(isDouble(arg0)) {
+	radius = arg0;
+	if(radius < 1) {
+		radius = 1;
+	}
+	if(radius > 5) {
+		radius = 5;
+	}
+	script = script.get("Voxel");
+	map = script.getVar(script, "radius_per_player");
+	map.add(map, player.getUuid(player), radius);
+	script.setVar(script, "radius_per_player", map);
+	msg.prefix(player, prefix_commands, concat("Set radius to ", text.number(radius), "."));
 	goto("wait");
 }
-if(radius < 1) {
-	radius = 1;
-}
-if(radius > 5) {
-	radius = 5;
+if(arg0 == "block") {
+	item = entity.getEquip(player, "hand");
+	item_type = item.getType(item);
+	if(item_type == "minecraft:air") {
+		msg.prefix(player, prefix_commands, "You have to hold an item in your mainhand.");
+		goto("wait");
+	}
+	state = block.newState(item_type);
+	script = script.get("Voxel");
+	map = script.getVar(script, "state_per_player");
+	map.add(map, player.getUuid(player), state);
+	script.setVar(script, "state_per_player", map);
+	msg.prefix(player, prefix_commands, concat("Set block to ", item_type, "."));
+	goto("wait");
 }
-map = script.getVar(script.get("Voxel"), "radius_per_player");
-map.add(map, player.getUuid(player), radius);
-script.setVar(script.get("Voxel"), "radius_per_player", map);
-msg.prefix(player, prefix_commands, concat("Set radius to ", text.number(radius), "."));
-goto("wait");
+goto("voxelhelp");
 
 @setservermessage
 if(size < 1) {
@@ -1646,7 +1722,7 @@ for(i = 0; i < size; i++) {
 }
 if(size > 0) {
 	coords_loop_active = true;
-	sgoto(30, "coordsloop");
+	sgoto(10, "coordsloop");
 } else {
 	coords_loop_active = false;
 }
@@ -2464,7 +2540,7 @@ if(arg0 == "ai") {
 	script.startNamed("Ai", "system/ai", "utils/u_general");
 }
 elseif(arg0 == "commands") {
-	script = script.startNamed("Commands", "startcommands");
+	script = script.startNamed("Commands", "system/commands", "utils/u_general", "utils/u_games");
 	if(script == null) {
 		snuvi.debug("Old commands script still active due to error in new script");
 		goto("wait");
@@ -5818,6 +5894,39 @@ player.setSaturation(affectedplayer, 5);
 msg.prefix(affectedplayer, prefix_commands, "Dein Hunger wurde gestillt.");
 goto("wait");
 
+@tempfly
+if(size < 2) {
+	msg.prefix(sender, prefix_commands, "/tempfly <player> <sec>");
+	goto("wait");
+}
+p_name = list.getIndex(args, 0);
+if(!checkIfEverOnline(p_name)) {
+	msg.prefix(sender, prefix_commands, "This player has never been online.");
+	goto("wait");
+}
+p = read.player(p_name);
+if(p == null) {
+	msg.prefix(sender, prefix_commands, "This player is not online.");
+	goto("wait");
+}
+p_name = player.getName(player.getUuid(p_name));
+if(player.hasMinigame(p)) {
+	msg(player, "This player can't fly now.");
+	goto("wait");
+}
+sec = list.getIndex(args, 1);
+if(!isDouble(sec) || sec < 0) {
+	msg.prefix(sender, prefix_commands, "Positive number expected.");
+	goto("wait");
+}
+msg.prefix(sender, prefix_commands, concat(p_name, " can now fly for ", text.number(sec), " seconds."));
+msg.prefix(p, prefix_commands, concat("You can now fly for ", text.number(sec), " seconds."));
+player.setFly(p, true);
+duration = sec * 20;
+data.setTimer(p, "fly", duration);
+status.addTimed(player, 50, duration, "Fly");
+goto("wait");
+
 @fly
 if(size > 2) {
 	msg.prefix(player, prefix_commands, "/fly [player] [on/off]");
@@ -5835,6 +5944,14 @@ if(size >= 1) {
 		goto("wait");
 	}
 }
+if(player.hasMinigame(affectedplayer)) {
+	if(size == 2) {
+		msg(player, "This player can't fly now.");
+	} else {
+		msg(player, "You can't fly now.");
+	}
+	goto("wait");
+}
 if(size == 2) {
 	boolean = list.getIndex(args, 1);
 	if(boolean == "on") {
@@ -7614,6 +7731,7 @@ function setCommandHelps() {
 	
 	help = command.newHelp("voxel", "voxel");
 	command.addHelpChild(help, command.newHelpInt("radius", 1, 5));
+	command.addHelpChild(help, command.newHelpLiteral("block"));
 	command.addHelp(help);
 	
 	help = command.newHelp("help", "help");
@@ -7626,6 +7744,12 @@ function setCommandHelps() {
 	command.addHelp(help);
 	addCommandAlias(help, "suicide", "kill");
 	
+	help = command.newHelp("tempfly", "tempfly");
+	helpArg0 = command.newHelpSpecial("Player", "player");
+	command.addHelpChild(helpArg0, command.newHelpInt("seconds", 1, 10000));
+	command.addHelpChild(help, helpArg0);
+	command.addHelp(help);
+	
 	help = command.newHelp("tempban", "tempban");
 	helpArg0 = command.newHelpSpecial("Player", "player");
 	helpArg1 = command.newHelpInt("days", 1, 100);
@@ -8767,4 +8891,15 @@ if(list.getSize(plot_list) == 0) {
 	list.add(check_for_plot_list, player_uuid);
 	sgoto(100, "checkForPlot");
 }
-goto("wait");
+goto("wait");
+
+function tpBottom(player) {
+	player_loc = entity.getLocation(player);
+	y = loc.getY(player_loc);
+	while(block.isAir(player_loc)) {
+		loc.setY(player_loc, y);
+		y--;
+	}					
+	loc.addY(player_loc, 1);
+	entity.teleport(player, player_loc);
+}

+ 17 - 6
system/herobrine.txt

@@ -1,17 +1,28 @@
 event.load("block_break");
+event.load("human_hurt");
 herobrines = list.new();
 
 msg("dev", "§bHerobrine §rloaded.");
 @wait
 wait();
-player_loc = entity.getLocation(player);
-world_name = world.getName(loc.getWorld(player_loc));
-if(!isSurvWorldName(world_name)) {
+if(event == "human_hurt") {
+	entity_name = entity.getName(human);
+	if(list.contains(herobrines, human)) {
+		entity.damage(entity, 10, damage.get("thorns", human));
+	}
 	goto("wait");
 }
-r = math.random(1, 1000);
-if(r == 1) {
-	spawnHerobrine(player);
+if(event == "block_break") {
+	player_loc = entity.getLocation(player);
+	world_name = world.getName(loc.getWorld(player_loc));
+	if(!isSurvWorldName(world_name)) {
+		goto("wait");
+	}
+	r = math.random(1, 500);
+	if(r == 1) {
+		spawnHerobrine(player);
+	}
+	goto("wait");
 }
 goto("wait");
 

+ 2 - 0
system/perms.txt

@@ -151,6 +151,7 @@ perm.registerGroup(2, "speed");
 perm.registerGroup(2, "iteminfo");
 perm.registerGroup(2, "speed.other");
 perm.registerGroup(2, "home.other");
+perm.registerGroup(2, "tempfly");
 perm.registerGroup(2, "fly");
 perm.registerGroup(2, "fly.other");
 perm.registerGroup(2, "ass");
@@ -383,6 +384,7 @@ perm.registerGroup(12, "adminshop");
 perm.registerGroup(12, "startgame.jump");
 perm.registerGroup(12, "user.other");
 perm.registerGroup(12, "gamerule");
+perm.registerGroup(12, "tempfly");
 perm.registerGroup(12, "fly");
 perm.registerGroup(12, "fly.other");
 perm.registerGroup(12, "plot.other");

+ 1 - 2
system/ranklist.txt

@@ -131,8 +131,7 @@ if(event == "custom_command") {
 					minigame.setWon(p_id, "fb", 0);
 				} elseif(table == "knockranks") {
 					minigame.setWon(p_id, "knock", 0);
-				} 
-				p_id = player.getId(p_uuid);
+				}
 				ranking.removePlayer(p_id, table);
 				msg.prefix(player, stats_prefix, concat("§e", p_name, "§r from statistic removed."));
 				goto("wait");

+ 6 - 0
system/story.txt

@@ -6,6 +6,7 @@ event.load("player_post_respawn");
 story_world = world.getStory();
 move_id_to_spawn = event.addMoveData(loc.new(story_world, -1501.5, 59, -35.5), loc.new(story_world, -1499, 62.5, -33), 5, -1);
 story_respawn = set.new();
+age_prop_3 = block.getProperty("age_0_3");
 
 bread_loc = loc.new(story_world, -1568, 67, -66);
 bread = read.item("minecraft:bread");
@@ -36,6 +37,11 @@ if(block_loc == bread_loc) {
 	} else {
 		msg.prefix(player, "§6FoodGiver", concat("Please wait for ", text.number(math.round(bread_wait_time - diff_time)), " seconds."));
 	}
+	goto("wait");
+}
+if(block_type == "minecraft:sweet_berry_bush") {
+	scheduler.setBlock(5, block_loc, concat("minecraft:sweet_berry_bush[age=3]"), false);
+	goto("wait");
 }
 goto("wait");
 

+ 52 - 11
system/survival.txt

@@ -11,8 +11,11 @@ event.load("pre_explosion");
 event.load("mob_griefing");
 
 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 20% chance if you kill a player (5% if a teamler is killed)", 100, true);
+skill.add("Subcutaneous Inventory", "skill.subcu_inv", "minecraft:chest", "Keeps the inventory on death", 40, false, false, true);
+skill.add("Comeback", "skill.comeback", "km:skill55", "Respawn at your death location", 40, false, false, true);
+skill.add("Head Hunter", "skill.head_human", "minecraft:player_head", "Drops a player's head with a 20% chance if you kill a player (5% if a teamler is killed)", 400, true, false, false);
+skill.add("Mobheads", "skill.head_monster", "minecraft:zombie_head", "Drops a mobs's head with a 20% chance (zombie / skeleton / creeper)", 200, true, false, false);
+skill.add("Fly 10min", "skill.fly10min", "minecraft:elytra", "You can fly for 10 minutes", 300, false, true, false);
 
 clan.loadData();
 
@@ -21,6 +24,7 @@ recipe_site_map = map.new();
 tp_list = list.new();
 tp_map = map.new();
 afk_loop_map = map.new();
+death_loc_map = map.new();
 
 overworld = world.getOverWorld();
 moveid_storyspawn = event.addMoveData(loc.new(overworld, 167, 70, 241), loc.new(overworld, 169, 72, 243), 5, -1);
@@ -34,6 +38,7 @@ lottery_loc_1 = loc.new(overworld, 186, 69, 227);
 lottery_loc_2 = loc.new(overworld, 186, 69, 223);
 gambler_loc = loc.new(overworld, 185, 68, 225);
 prefix_money = "§2Money";
+prefix_skill = "§2Skill";
 
 max_ench_lvl = map.new();
 map.add(max_ench_lvl, enchantment.get("efficiency"), 10);
@@ -230,9 +235,6 @@ msg("dev", "§bSurvival §rloaded.");
 wait();
 if(event == "player_move") {
 	if(id == moveid_storyspawn) {
-		if(!perm.has(player, "isTeam")) {
-			goto("wait");
-		}
 		player.setBackPosLoc(player, world.getServerSpawn());
 		player.teleport(player, world.getStorySpawn(), false);
 		goto("wait");
@@ -945,13 +947,13 @@ goto("wait");
 @living_death
 if(isPlayer(living_entity)) {
 	player = living_entity;
-	player.setBackPos(player);
+	setDeathLoc(player);
 	loc = entity.getLocation(player);
-	subcu_amount = skill.getAmount(player, "skill.subcu_inv");
-	if(subcu_amount > 0) {
-		new_subcu_amount = subcu_amount - 1;
-		skill.setAmount(player, "skill.subcu_inv", new_subcu_amount);
-		msg.prefix(player, "§2Skill", concat("Used Subcutaneous Inventory. New amount: ", text.number(new_subcu_amount)));
+	amount = skill.getAmount(player, "skill.subcu_inv");
+	if(skill.isActivated(player, "skill.subcu_inv") && amount > 0) {
+		new_amount = amount - 1;
+		skill.setAmount(player, "skill.subcu_inv", new_amount);
+		msg.prefix(player, prefix_skill, concat("Used Subcutaneous Inventory. New amount: ", text.number(new_amount)));
 	} else {
 		player.dropInventory(player, loc);
 	}
@@ -969,6 +971,29 @@ if(isPlayer(living_entity)) {
 			}
 		}
 	}
+	goto("wait");
+}
+killer = player.getFromDamageSource(damage_source);
+if(isPlayer(killer)) {
+	r = math.random(1, 20);
+	if(r == 1) {
+		amount = skill.getAmount(killer, "skill.head_monster");
+		if(amount >= 1) {
+			entity_type = entity.getType(living_entity);
+			if(entity_type == "creeper") {
+				item.drop(loc, read.item("minecraft:creeper_head"));
+				goto("wait");
+			}
+			if(entity_type == "zombie") {
+				item.drop(loc, read.item("minecraft:zombie_head"));
+				goto("wait");
+			}
+			if(entity_type == "skeleton") {
+				item.drop(loc, read.item("minecraft:skeleton_skull"));
+				goto("wait");
+			}
+		}
+	}
 }
 goto("wait");
 
@@ -976,6 +1001,14 @@ goto("wait");
 if(player.isOnAdventure(player)) {
 	tp_loc = player.getAdventureStart(player);
 	entity.teleport(player, tp_loc);
+	goto("wait");
+}
+amount = skill.getAmount(player, "skill.comeback");
+if(skill.isActivated(player, "skill.comeback") && amount > 0) {
+	new_amount = amount - 1;
+	skill.setAmount(player, "skill.comeback", new_amount);
+	msg.prefix(player, prefix_skill, concat("Used Comeback. New amount: ", text.number(new_amount)));
+	entity.teleport(player, getDeathLoc(player));
 }
 goto("wait");
 
@@ -1115,4 +1148,12 @@ function recipe.setPage(player, menu, page) {
 		}
 	}
 	inv.update(player);
+}
+
+function setDeathLoc(player) {
+	map.add($death_loc_map, player.getUuid(player), entity.getLocation(player));
+}
+
+function getDeathLoc(player) {
+	return map.getOrDefault($death_loc_map, player.getUuid(player), world.getServerSpawn());
 }

+ 7 - 4
system/voxel.txt

@@ -2,9 +2,11 @@ event.load("item_air_click");
 event.load("left_click_air");
 event.load("block_break");
 
-stone_state = block.newState("minecraft:stone");
+default_state = block.newState("minecraft:stone");
+block_state = default_state;
 air_state = block.newState("minecraft:air");
 radius_per_player = map.new();
+state_per_player = map.new();
 
 msg("dev", "§bVoxel §rwurde geladen");
 @wait
@@ -16,7 +18,8 @@ if(event == "left_click_air" || event == "block_break") {
 	state = air_state;
 	last = false;
 } elseif(event == "item_air_click") {
-	state = stone_state;
+	state = map.getOrDefault(state_per_player, player.getUuid(player), default_state);
+	block_state = state;
 	last = true;
 } else {
 	goto("wait");
@@ -115,7 +118,7 @@ for(k = 0; k < 5; k++) {
 		if(neighbours <= 8) {
 			block.setState(smooth_loc, air_state, true);
 		} elseif(neighbours >= 12) {
-			block.setState(smooth_loc, stone_state, true);
+			block.setState(smooth_loc, block_state, true);
 		}
 	}
 }
@@ -202,7 +205,7 @@ for(k = 0; k < 5; k++) {
 		if(neighbours <= 9) {
 			block.setState(smooth_loc, air_state, true);
 		} elseif(neighbours >= 11) {
-			block.setState(smooth_loc, stone_state, true);
+			block.setState(smooth_loc, block_state, true);
 		}
 	}
 }

+ 0 - 23
test.txt

@@ -1,23 +0,0 @@
-msg("dev", "started");
-entity = read.player("kajetanjohannes");
-c = 0;
-c_max = 200;
-
-@loop
-//entity.throw(entity, 0.2185, 0, 0);
-//entity.throw(entity, 0.2185 * 1.3, 0, 0);
-y = loc.getY(entity.getLocation(entity)) - 57;
-if(y != 0) {
-	y = math.roundDown(y * 10000);
-	msg("dev", text.number(math.roundDown(y / 10000)), ".", text.number(math.roundDown(y % 10000)));
-}
-c++;
-if(c >= c_max) {
-	msg("dev", "stopped");
-	term();
-}
-sgoto(2, "loop");
-wait();
-
-//a = entity.getMotion(entity);
-//msg("dev", a[0], " ", math.roundComma(a[1], 7), " ", a[2]);

+ 66 - 11
utils/u_general.txt

@@ -369,6 +369,11 @@ function player.changeInv(player, from_world, to_world) {
 			player.setGamemode(player, gm);
 		}
 	}
+	if(isSurvWorldName(to_world_name)) {
+		if(player.hasFly(player)) {
+			scheduler.addFly(1, player, true);
+		}
+	}
 }
 
 function inv.saveForPlayer(sec_player, for_player_or_id, world) {
@@ -1526,6 +1531,7 @@ function player.showDebug(player, boolean) {
 function player.showDefaultStacks(player) {
 	stacks.clear(player);
 	stacks.set(player, 0, "km:gear");
+	stacks.set(player, 1, "km:golden_scepter");
 }
 
 function player.setSpeed(player, speed) {
@@ -2432,14 +2438,26 @@ function skill.addAmount(player_or_id, tech_name, amount) {
 	config.saveAsync(config);
 }
 
-function skill.add(skill_name, tech_name, item, description, cost, permanent) {
-	skill = array.new(6);
+function skill.isActivated(player_or_id, tech_name) {
+	config = playerdata.getSurvival(player_or_id);
+	return config.getBool(config, concat(tech_name, ".active"), true);
+}
+
+function skill.setActivated(player_or_id, tech_name, bool) {
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, concat(tech_name, ".active"), bool);
+}
+
+function skill.add(skill_name, tech_name, item, description, cost, permanent, active, toggleable) {
+	skill = array.new(8);
 	skill[0] = skill_name;
 	skill[1] = tech_name;
 	skill[2] = item;
 	skill[3] = description;
 	skill[4] = cost;
 	skill[5] = permanent;
+	skill[6] = active;
+	skill[7] = toggleable;
 	list.add(getScriptVar("skills"), skill);
 }
 
@@ -2459,20 +2477,35 @@ function skill.getShopItem(player, skill_name) {
 		return read.item("minecraft:air");
 	}
 	skill = skill.get(skill_name);
-	config = playerdata.getSurvival(player);
-	amount = config.getDouble(config, skill[1], 0);
-	if(skill[5]) {
-		prop = "Permanent";
+	tech_name = skill[1];
+	amount = skill.getAmount(player, tech_name);
+	permanent = skill[5];
+	if(permanent) {
 		if(amount == 0) {
-			text = concat("Bought: No");
+			text_property = concat("Bought: No (Permanent)");
+		} else {
+			text_property = concat("Bought: Yes (Permanent)");
+		}
+	} else {
+		text_property = concat("Amount you have: ", text.number(amount));
+	}
+	active = skill[6];
+	if(active) {
+		type = "Active skill";
+	} else {
+		type = "Passive skill";
+	}
+	toggleable = skill[7];
+	if(toggleable) {
+		if(skill.isActivated(player, tech_name)) {
+			tog = "Toggleable: Active";
 		} else {
-			text = concat("Bought: Yes");
+			tog = "Toggleable: Inactive";
 		}
 	} else {
-		prop = "Stackable";
-		text = concat("Amount you have: ", text.number(amount));
+		tog = "Not toggleable";
 	}
-	item = read.item(skill[2], 1, skill_name, concat("Cost: ", text.number(skill[4])), skill[3], prop, text);
+	item = read.item(skill[2], 1, skill_name, concat("Cost: ", text.number(skill[4])), skill[3], type, tog, text_property);
 	return item;
 }
 
@@ -2531,6 +2564,28 @@ function skill.isPermanent(skill_name) {
 	}
 }
 
+function skill.isActive(skill_name) {
+	skill_list = getScriptVar("skills");
+	for(i = 0; i < list.getSize(skill_list); i++) {
+		array = list.getIndex(skill_list, i);
+		temp_skill_name = array[0];
+		if(temp_skill_name == skill_name) {
+			return array[6];
+		}
+	}
+}
+
+function skill.isToggleable(skill_name) {
+	skill_list = getScriptVar("skills");
+	for(i = 0; i < list.getSize(skill_list); i++) {
+		array = list.getIndex(skill_list, i);
+		temp_skill_name = array[0];
+		if(temp_skill_name == skill_name) {
+			return array[7];
+		}
+	}
+}
+
 function skill.showShop(player, skill_name1, skill_name2, skill_name3, skill_name4, skill_name5, skill_name6, skill_name7, skill_name8, skill_name9) {
 	inv = inv.new("333333333");
 	inv.setItem(inv, 0, skill.getShopItem(player, skill_name1));