Просмотр исходного кода

skills, quests and much other stuff

Marvin Löschenkohl 4 лет назад
Родитель
Сommit
2e0c74dcef

+ 13 - 11
global/gamecenter.txt

@@ -4,6 +4,7 @@ event.load("player_move");
 event.load("player_pre_respawn");
 event.load("block_click");
 event.load("block_break");
+event.load("entity_click");
 event.load("custom_command");
 event.load("player_logout");
 event.load("term_script");
@@ -21,11 +22,9 @@ singleplayergames = set.new();
 
 party_prefix = "§5Party";
 gamesworld = getGamesWorld();
-serverspawn = getServerSpawn();
-gamesspawnloc = getGamesSpawn();
-moveidfromworldspawn = event.addMoveData(loc.new(gamesworld, -406, 86, 98), loc.new(gamesworld, -402, 88, 99), 5, -1);
 sign_tag = block.getTag("minecraft:wall_signs");
 facing_property = block.getProperty("horizontal_facing");
+marv_loc = loc.new(gamesworld, -410, 161, -60);
 
 addGameSign("bwmapsign1", true, loc.new(gamesworld, -423, 153, -78), "minigames/bedwars/bedwars", "minigames/bedwars/region_bwmap1", false);
 addGameSign("bwmapsign2", true, loc.new(gamesworld, -423, 153, -79), "minigames/bedwars/bedwars", "minigames/bedwars/region_bwmap2", false);
@@ -111,12 +110,6 @@ msg("dev", "§bgamecenter §rloaded.");
 
 @wait
 wait();
-if(event == "player_move") {
-	if(id == moveidfromworldspawn) {
-		teleportPlayer(player, gamesspawnloc, false);
-	}
-	goto("wait");
-}
 ignoreGoto(event);
 goto("wait");
 
@@ -155,6 +148,15 @@ if(command == "game") {
 }
 goto("wait");
 
+@entity_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(loc.distance(marv_loc, entity.getLocation(player)) < 3) {
+	speakPrefix(player, "§cGamerMarv", "Help! Get me a beer or me out of here!");
+}
+goto("wait");
+
 @block_break
 if(set.contains(gamesign_ground_block, block_loc) || map.contains(gamepaths, block_loc)) {
 	cancel = true;
@@ -240,7 +242,7 @@ goto("wait");
 player_loc = entity.getLocation(player);
 if(loc.isInGamesWorld(player_loc)) {
 	resetplayer(player);
-	entity.teleport(player, serverspawn);
+	entity.teleport(player, getServerSpawn());
 }
 goto("wait");
 
@@ -265,7 +267,7 @@ goto("wait");
 @player_pre_respawn
 if(loc.isInGamesWorld(entity.getLocation(player))) {
 	if(!player.hasMinigame(player)) {
-		player.setSpawn(player, gamesspawnloc);
+		player.setSpawn(player, getGamesSpawn());
 	}
 }
 goto("wait");

+ 4 - 12
global/playsounds.txt

@@ -1,5 +1,3 @@
-event.load("player_giveup");
-
 list.new(sounds);
 list.add(sounds, "ambient.cave");
 list.add(sounds, "ambient.underwater.enter");
@@ -664,10 +662,11 @@ list.add(sounds, "ui.toast.out");
 list.add(sounds, "weather.rain");
 list.add(sounds, "weather.rain.above");
 
+waitfor(20);
+
 i = 0;
 category = sound.getCategory("master");
 @play
-player = script.getLeader();
 sound_name = list.getIndex(sounds, i);
 sound = sound.get(sound_name);
 sound.spawnForPlayer(player, sound, category);
@@ -675,13 +674,6 @@ msg(player, sound_name);
 if(++i == list.getSize(sounds)) {
 	term();
 }
-sGoto(100, "play");
-
-@wait
-wait();
-iGoto(event);
-goto("wait");
+sgoto(100, "play");
 
-@player_giveup
-player.speak(player, "§6Commands", "All-Sounds wird nicht mehr fortgesetzt");
-term();
+wait();

+ 8 - 8
global/pumpkin.txt

@@ -3,15 +3,15 @@ event.load("block_click");
 
 times = map.new();
 
-pumpkin = read.item("minecraft:pumpkin_pie", 1, "KürbisMinusEinAchtelKuchen");
+pumpkin = read.item("minecraft:pumpkin_pie", 1, "PumpkinMinusOneEighthCake");
 lore_list = list.new();
-list.add(lore_list, "Ein fast ganzer Kürbiskuchen");
-list.add(lore_list, "bestehend aus sieben Achteln.");
-list.add(lore_list, "Herobrine hat das letzte Achtel.");
+list.add(lore_list, "An almost whole pumpkin pie");
+list.add(lore_list, "consisting of seven eighths.");
+list.add(lore_list, "Herobrine has the last eighth.");
 item.setLore(pumpkin, lore_list);
 
 world = world.get("overworld");
-kürbis_loc = loc.new(world, 207, 70, 245);
+kürbis_loc = loc.new(world, 228, 71, 235);
 
 @wait
 wait();
@@ -21,13 +21,13 @@ if(event == "block_click" && block_loc == kürbis_loc) {
 	}
     id = player.getId(player);
 	if(!map.contains(times, id)) {
-		map.add(times, id, 60000 - time.getMillis());
+		map.add(times, id, 20000 - time.getMillis());
 	}
-	if(time.getMillis() - map.get(times, id) > 60000) {
+	if(time.getMillis() - map.get(times, id) > 20000) {
 		map.add(times, id, time.getMillis());
 		player.giveItem(player, pumpkin);
 	} else {
-		player.speak(player, "§6FoodGiver", "§rBitte warte noch ", text.number(math.round(60 - (time.getMillis() - map.get(times, id)) /  1000)), " Sekunden");
+		player.speak(player, "§6FoodGiver", "Please wait for ", text.number(math.round(20 - (time.getMillis() - map.get(times, id)) /  1000)), " seconds.");
 	}
 }
 goto("wait");

+ 1 - 0
minigames/buttons/buttons.txt

@@ -89,6 +89,7 @@ if(diff != null) {
 	msg(player, " §e- §rBeat own record by §e", text.number(diff));
 }
 minigame.statsLine(player, "§e", "Played games", text.number(playedgames));
+minigame.addElo(player, clicked * 2);
 
 @player_giveup
 @player_logout

+ 1 - 0
minigames/inverting/inverting.txt

@@ -139,6 +139,7 @@ if(diff != null) {
 	msg(player, " §e- §rBeat own record by §e", text.number(diff));
 }
 minigame.statsLine(player, "§e", "Won games", text.number(playedgames));
+minigame.addElo(player, elo);
 
 clicked = 0;
 display.add(player, 2, text.number(clicked));

+ 2 - 1
minigames/inverting/invertingclmap1.txt

@@ -9,4 +9,5 @@ tploc = loc.new(gamesworld, 2003.5, 101, 2016.5);
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "invertingclsign1");
 map = "5x5cl";
-maxplayers = 1;
+maxplayers = 1;
+elo = 10;

+ 2 - 1
minigames/inverting/invertingclmap2.txt

@@ -9,4 +9,5 @@ tploc = loc.new(gamesworld, 1982.5, 101, 2017.5);
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "invertingclsign2");
 map = "7x7cl";
-maxplayers = 1;
+maxplayers = 1;
+elo = 20;

+ 2 - 1
minigames/inverting/invertingclmap3.txt

@@ -9,4 +9,5 @@ tploc = loc.new(gamesworld, 1959, 101, 2018);
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "invertingclsign3");
 map = "10x10cl";
-maxplayers = 1;
+maxplayers = 1;
+elo = 30;

+ 2 - 1
minigames/inverting/invertingmap1.txt

@@ -9,4 +9,5 @@ tploc = loc.new(gamesworld, 2003.5, 101, 1996.5);
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "invertingsign1");
 map = "5x5";
-maxplayers = 1;
+maxplayers = 1;
+elo = 10;

+ 2 - 1
minigames/inverting/invertingmap2.txt

@@ -9,4 +9,5 @@ tploc = loc.new(gamesworld, 1982.5, 101, 1995.5);
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "invertingsign2");
 map = "7x7";
-maxplayers = 1;
+maxplayers = 1;
+elo = 20;

+ 2 - 1
minigames/inverting/invertingmap3.txt

@@ -9,4 +9,5 @@ tploc = loc.new(gamesworld, 1959, 101, 1994);
 gamesignsmap = getScriptVar("gamesigns");
 gamesignloc = map.get(gamesignsmap, "invertingsign3");
 map = "10x10";
-maxplayers = 1;
+maxplayers = 1;
+elo = 30;

+ 1 - 0
minigames/jumpnrun/jumpnrun.txt

@@ -268,6 +268,7 @@ setRanking(rankingtable, player_id, record, playedgames);
 
 minigame.statsLine(player, "§e", "Your Record", text.number(record));
 minigame.statsLine(player, "§e", "Server Record", text.number(overall_record));
+minigame.addElo(player, points);
 return;
 
 @player_giveup

+ 1 - 0
minigames/leapfrog/leapfrog.txt

@@ -177,6 +177,7 @@ if(diff != null) {
 	msg(player, " §e- §rBeat own record by §e", text.number(diff));
 }
 minigame.statsLine(player, "§e", "Record", text.number(record));
+minigame.addElo(player, points * 2);
 
 script = script.getFromId(script_id);
 minigame.kickPlayer(script, player);

+ 4 - 3
minigames/rebuild/rebuild.txt

@@ -132,7 +132,8 @@ for(i = 0; i < list.getSize(list); i++) {
 script = script.getFromId(script_id);
 minigame.kickplayer(script, player);
 if(list.getSize(player_list) < 2) {
-	p = list.getIndex(player_list, 0);
+	p_uuid = list.getIndex(player_list, 0);
+	p = player.get(p_uuid);
 	wincore(p);
 }
 goto("checkgame");
@@ -168,8 +169,8 @@ temp_solved++;
 map.add(solved, p_uuid, temp_solved);
 player.clearInventory(player);
 for(i = 0; i < list.getSize(player_list); i++) {
-	p = list.getIndex(player_list, i);
-	minigame.displayAll(i + 2, concat("§6", text.number(map.get(solved, player.getUuid(p))), "§c ", player.getName(p)));
+	p_uuid = list.getIndex(player_list, i);
+	minigame.displayAll(i + 2, concat("§6", text.number(map.get(solved, p_uuid)), "§c ", player.getName(p_uuid)));
 }
 
 if(temp_solved >= solve_to_win) {

+ 4 - 3
minigames/sammelfieber/sammelfieber.txt

@@ -44,8 +44,8 @@ player_list = minigame.getPlayers(script_id);
 minigame.speakAll(gamename, "The game has started.");
 double_block_half_property = block.getProperty("double_block_half");
 
-min = 0;
-sec = 6;
+min = 16;
+sec = 0;
 timer_string = concat("§bTimer: §r", text.number(min), " min 0", text.number(sec), " s");
 
 iter = list.iterator(player_list);
@@ -239,7 +239,7 @@ itype = item.getType(item);
 if(list.contains(nextitems, itype)) {
 	list.add(founditems, itype);
 	list.remove(nextitems, itype);
-	display.add("all", 3, concat("§bGefundene Items: §r", text.number(list.getSize(founditems))));
+	minigame.displayAll(3, concat("§bFound Items: §r", text.number(list.getSize(founditems))));
 	gosub("newitem");
 }
 goto("wait");
@@ -308,6 +308,7 @@ while(hasNext(iter)) {
 		msg(player, " §e- §rBeat own record by §e", text.number(diff));
 	}
 	minigame.statsLine(player, "§e", "Played games", text.number(playedgames));
+	minigame.addElo(player, yetfound * 2);
 }
 @endcore
 iter = set.iterator(workbenches);

+ 1 - 1
minigames/sammelfieber/sammelfieberitems.txt

@@ -405,7 +405,7 @@ map.add(items, "minecraft:pumpkin_seeds", "Kürbissamen");
 map.add(items, "minecraft:melon_seeds", "Melonenkerne");
 map.add(items, "minecraft:carrot", "Karotte");
 map.add(items, "minecraft:potato", "Kartoffel");
-map.add(items, "minecraft:poisonous_potato", "Giftigige Kartoffel");
+map.add(items, "minecraft:poisonous_potato", "Giftige Kartoffel");
 map.add(items, "minecraft:oak_trapdoor", "Eichenfalltür");
 map.add(items, "minecraft:oak_button", "Eichenholzknopf");
 map.add(items, "minecraft:sugar_cane", "Zuckerrohr");

+ 2 - 3
startscript.txt

@@ -2,7 +2,7 @@ clearscriptvars();
 
 setMOTD("§6Highlight of the year! §c/wusi");
 		
-script.start("system/limits");
+//script.start("system/limits");
 script.start("system/svars");
 script.start("system/player_data", "utils/u_general");
 script.start("system/perms", "utils/u_general");
@@ -20,11 +20,10 @@ script.start("global/voxel");
 script.start("global/ticketsystem", "utils/u_general");
 script.start("global/mailsystem", "utils/u_general");
 script.start("global/chestshops", "utils/u_general", "utils/u_plots");
-//script.start("gildenpvp/gpvp", "utils/u_general", "utils/u_gpvp", "utils/u_plots", "utils/u_skills");
-//script.start("system/skills", "utils/u_general", "utils/u_skills", "utils/u_gpvp", "utils/u_plots");
 script.start("survival/survival", "utils/u_general");
 script.start("global/gamecenter", "utils/u_general", "utils/u_games", "utils/u_plots", "utils/u_party");
 script.start("global/ranklist", "utils/u_general", "utils/u_games");
+script.startNamed("SpawnQuests", "storydorf/spawn/core", "utils/u_general");
 
 error.setConsolePrint(false);
 debug.setConsolePrint(true);

+ 107 - 0
storydorf/spawn/core.txt

@@ -0,0 +1,107 @@
+event.load("human_hurt");
+event.load("entity_click");
+event.load("custom_command");
+event.load("inv_click");
+
+timestamp = map.new(); //TimeStamp for SkillShop
+
+msg("dev", "§bQuests: §rSpawn loaded.");
+@wait
+wait();
+iGoto(event);
+goto("wait");
+
+@human_hurt
+player = entity;
+entity = human;
+goto("human_core");
+
+@entity_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(entity.getType(entity) != "human") {
+	goto("wait");
+}
+goto("human_core");
+
+@human_core
+if(player.hasQuest2(player)) {
+	goto("wait");
+}
+entity_name = entity.getName(entity);
+if(entity_name == "Tutorial") {
+	script = script.start("storydorf/spawn/tutorial", "utils/u_quest", "utils/u_general");
+	if(script == null) {
+		waitfor(1);
+		msg("dev", "quest waitfor");
+	}
+	quest.addPlayer(script, player);
+	script.setVar(script, "player", player);
+	script.setVar(script, "script", script);
+	script.setVar(script, "quest_player_uuid", player.getUuid(player));
+	script.callEvent("quest_start", script);
+	goto("wait");
+}
+if(entity_name == "Marvin") {
+	script = script.start("storydorf/spawn/findmentos", "utils/u_quest", "utils/u_general");
+	if(script == null) {
+		waitfor(1);
+		msg("dev", "quest waitfor");
+	}
+	quest.addPlayer(script, player);
+	script.setVar(script, "player", player);
+	script.setVar(script, "script", script);
+	script.setVar(script, "quest_player_uuid", player.getUuid(player));
+	script.callEvent("quest_start", script);
+	goto("wait");
+}
+if(entity_name == "Mentos") {
+	s = script.get("Stone Mage");
+	if(s != null) {
+		msg.quest(player, entity_name, 1, 1, "Another player is in my dream palace.");
+		goto("wait");
+	}
+	script = script.startNamed("Stone Mage", "storydorf/spawn/stonemage", "utils/u_quest", "utils/u_general");
+	if(script == null) {
+		waitfor(1);
+		msg("dev", "quest waitfor");
+	}
+	quest.addPlayer(script, player);
+	script.setVar(script, "player", player);
+	script.setVar(script, "script", script);
+	script.setVar(script, "quest_player_uuid", player.getUuid(player));
+	script.callEvent("quest_start", script);
+	goto("wait");
+}
+if(entity_name == "Stone Mage") {
+	if(time.getMillis() - map.getOrDefault(timestamp, player.getUuid(player), 0) < 120000) { //2 Minutes
+		skill.showShop(player, "Subcutaneous Inventory", null, null, null, null, null, null, null, null);
+	} else {
+		msg.quest(player, entity_name, 1, 1, "You have to finish some tasks first. Mentos knows more about it.");
+	}
+	goto("wait");
+}
+goto("wait");
+
+@inv_click
+if(inv_name != "Skillshop") {
+	goto("wait");
+}
+if(item.getType(item) == "minecraft:air") {
+	goto("wait");
+}
+skill_name = item.getName(item);
+if(skill.isPermanent(skill_name)) {
+	goto("wait");
+}
+cost = skill.getCost(skill_name);
+if(!hasEnoughMoney(player, cost)) {
+	msg.quest(player, "Stone Mage", 1, 1, "You have not enough money.");
+	goto("wait");
+}
+subMoney(player, cost);
+skill.addAmount(player, skill.getTechName(skill_name), 1);
+inv.setItem(inv, inv_slot, skill.getShopItem(player, skill_name));
+inv.update(player);
+goto("wait");

+ 62 - 0
storydorf/spawn/findmentos.txt

@@ -0,0 +1,62 @@
+event.load("human_hurt");
+event.load("entity_click");
+event.load("custom_command");
+event.load("quest_start");
+event.load("quest_term");
+
+stage = 0;
+all_stages = 4;
+quest_name = "Find Mentos";
+
+@wait
+wait();
+if(event == "human_hurt") {
+	player = entity;
+}
+if(quest_player_uuid == player.getUuid(player)) {
+	ignoreGoto(event);
+}
+goto("wait");
+
+@quest_start
+msg.quest(player, "Marvin", 1, 3, "Have you seen Mentos? He has been missing for days.");
+stage.increase(player);
+goto("wait");
+
+@quest_term
+goto("wait");
+
+@human_hurt
+player = entity;
+entity = human;
+goto("human_core");
+
+@entity_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(entity.getType(entity) != "human") {
+	goto("wait");
+}
+goto("human_core");
+
+@human_core
+entity_name = entity.getName(entity);
+if(entity_name == "Marvin") {
+	if(stage == 1) {
+		msg.quest(player, entity_name, 2, 3, "The last time I saw him he said he was going to hunt a unicorn.");
+		stage.increase(player);
+	} elseif(stage == 2) {
+		msg.quest(player, entity_name, 3, 3, "He told me, that if necessary, he spends the night in a cave near the Stone Mage's tower.");
+		stage.increase(player);
+	}
+	goto("wait");
+}
+if(entity_name == "Mentos") {
+	if(stage == 3) {
+		msg(player, "§dQuest completed. Reward: 5 Coins!");
+		addMoney(player, 5);
+		quest.finish(script, player);
+	}
+}
+goto("wait");

+ 327 - 0
storydorf/spawn/stonemage.txt

@@ -0,0 +1,327 @@
+event.load("human_hurt");
+event.load("entity_click");
+event.load("block_click");
+event.load("custom_command");
+event.load("quest_start");
+event.load("quest_term");
+event.load("living_death");
+event.load("bucket_use");
+event.load("block_break");
+
+quest_no = 0;
+rnd_list = list.new();
+list.add(rnd_list, 1);
+list.add(rnd_list, 2);
+list.add(rnd_list, 3);
+list.add(rnd_list, 4);
+list.shuffle(rnd_list);
+
+furnace_clicked = false;
+bucket_filled = false;
+cauldron_filled = false;
+cave_spider_killed = false;
+warts_harvested = 0;
+mob_killed = 1;
+stage = 0;
+all_stages = 34;
+quest_name = "Stone Mage";
+
+open_prop = block.getproperty("open");
+half_prop = block.getproperty("double_block_half");
+key = read.item("km:golden_key", 1, "Tower Key", "Stone Mage");
+
+world = world.get("overworld");
+zombie_loc = loc.new(world, 288.5, 81, 401.5);
+skeleton_loc = loc.new(world, 282.5, 83, 400.5);
+blaze_loc = loc.new(world, 280.5, 86, 395.5);
+spider_loc = loc.new(world, 289, 91, 398);
+witch_loc = loc.new(world, 285.5, 95, 398.5);
+cauldron_loc = loc.new(world, 285, 108, 404);
+cave_spider_loc = loc.new(world, 284.5, 116, 397.5);
+
+doors_to_close = list.new();
+visited_doors = list.new();
+iron_doors = list.new();
+list.add(iron_doors, loc.new(world, 283, 78, 394));
+list.add(iron_doors, loc.new(world, 284, 80, 401));
+list.add(iron_doors, loc.new(world, 288, 81, 397));
+list.add(iron_doors, loc.new(world, 280, 82, 395));
+list.add(iron_doors, loc.new(world, 288, 86, 396));
+list.add(iron_doors, loc.new(world, 284, 91, 400));
+list.add(iron_doors, loc.new(world, 282, 95, 395));
+list.add(iron_doors, loc.new(world, 282, 97, 398));
+
+@wait
+wait();
+if(event == "human_hurt") {
+	player = entity;
+}
+if(event == "quest_term") {
+	player = player.get(quest_player_uuid);
+}
+if(event == "living_death") {
+	player = getPlayerFromDamageSource(damage_source);
+	if(player == null) {
+		goto("wait");
+	}
+}
+if(quest_player_uuid == player.getUuid(player)) {
+	ignoreGoto(event);
+}
+goto("wait");
+
+@quest_start
+msg.quest(player, "Mentos", 1, 3, "How am I still alive? It must have been a dream.");
+stage.increase(player);
+goto("wait");
+
+@quest_term
+player.removeItem(player, key);
+goto("wait");
+
+@human_hurt
+entity = human;
+goto("human_core");
+
+@entity_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(entity.getType(entity) != "human") {
+	goto("wait");
+}
+goto("human_core");
+
+@human_core
+entity_name = entity.getName(entity);
+if(entity_name == "Mentos") {
+	if(stage == 1) {
+		msg.quest(player, entity_name, 2, 3, "Monsters and a mage are part of it. A mage in a tower.");
+		stage.increase(player);
+	} elseif(stage == 2) {
+		msg.quest(player, entity_name, 3, 3, "Look behind you. There's a door.");
+		stage.increase(player);
+	}
+	goto("wait");
+}
+if(entity_name == "Mage's apprentice") {
+	if(stage == 3) {
+		msg.quest(player, entity_name, 1, 4, "The key to the mage? You can have it if you give me bread.");
+		stage.increase(player);
+	} elseif(stage == 4) {
+		hand_item = entity.getEquip(player, "hand");
+		if(item.getType(hand_item) == "minecraft:bread") {
+			msg.quest(player, entity_name, 2, 4, "Right click doors to open them.");
+			safeGiveItemPlayer(player, key);
+			player.removeItem(player, read.item("minecraft:bread"));
+			stage.increase(player);
+		}
+	} elseif(stage == 5) {
+		msg.quest(player, entity_name, 3, 4, "On your way to the mage, you have to cross several rooms.");
+		stage.increase(player);
+	} elseif(stage == 6) {
+		msg.quest(player, entity_name, 4, 4, "Be aware.");
+		stage.increase(player);
+	}
+}
+if(entity_name == "Stone Mage") {
+	if(stage == 20) {
+		msg.quest(player, entity_name, 1, 6, "Please give me the Tower Key.");
+		stage.increase(player);
+	} elseif(stage == 21) {
+		hand_item = entity.getEquip(player, "hand");
+		if(item.getType(hand_item) == "km:golden_key" && item.getName(hand_item) == "Tower Key") {
+			msg.quest(player, entity_name, 2, 6, "Before offering you skills you have to finish some tasks for me.");
+			player.removeItem(player, key);
+			stage.increase(player);
+			talk_no = 3;
+			active_quest = false;
+		}
+	} elseif(stage >= 22 && stage < 33) {
+		if(active_quest) {
+			hand_item = entity.getEquip(player, "hand");
+			if(i == 3 && item.getType(hand_item) == "minecraft:nether_wart" && warts_harvested >= 4) {
+				player.removeItem(player, read.item("minecraft:nether_wart", warts_harvested));
+				stage.increase(player);
+				active_quest = false;
+			}
+			if(i == 4 && item.getType(hand_item) == "km:mushroom_stick_cooked" && furnace_clicked) {
+				player.removeItem(player, read.item("km:mushroom_stick_cooked"));
+				stage.increase(player);
+				active_quest = false;
+			}
+			goto("wait");
+		}
+		active_quest = true;
+		i = list.getIndex(rnd_list, quest_no++);
+		if(i == 1) {
+			msg.quest(player, entity_name, talk_no++, 6, "A spider has nested in my attic. Please go up and kill it.");
+			entity.spawn("cave_spider", cave_spider_loc);
+			stage.increase(player);
+		} elseif(i == 2) {
+			msg.quest(player, entity_name, talk_no++, 6, "Take this bucket, fill it with water and then pour it into the cauldron.");
+			safeGiveItemPlayer(player, read.item("minecraft:bucket"));
+			block.set(cauldron_loc, "minecraft:cauldron[level=0]");
+			stage.increase(player);
+		} elseif(i == 3) {
+			msg.quest(player, entity_name, talk_no++, 6, "Go upstairs, pick some nether warts there and then give me all you have harvested!");
+			stage.increase(player);
+		} elseif(i == 4) {
+			msg.quest(player, entity_name, talk_no++, 6, "Please go downstairs and cook this for me.");
+			safeGiveItemPlayer(player, read.item("minecraft:coal"));
+			safeGiveItemPlayer(player, read.item("km:mushroom_stick_raw"));
+			stage.increase(player);
+		}
+	} elseif(stage == 33) {
+		spawn_script = script.get("SpawnQuests");
+		map = script.getVar(spawn_script, "timestamp");
+		map.add(map, player.getUuid(player), time.getMillis());
+		msg(player, "§dQuest completed. Reward: 50 Coins!");
+		addMoney(player, 50);
+		quest.finish(script, player);
+	}
+}
+//Mushroomstick braten
+goto("wait");
+
+@block_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+hand_item = entity.getEquip(player, "hand");
+if(stage >= 22) {
+	if(i == 2 && bucket_filled && !cauldron_filled && block.getType(block_loc) == "minecraft:cauldron" && item.getType(hand_item) == "minecraft:water_bucket") {
+		active_quest = false;
+		cauldron_filled = true;
+		stage.increase(player);
+		player.removeItem(player, read.item("minecraft:water_bucket"));
+		block.set(cauldron_loc, "minecraft:cauldron[level=3]");
+		goto("wait");
+	}
+	if(i == 4 && !furnace_clicked && block.getType(block_loc) == "minecraft:furnace") {
+		furnace_clicked = true;
+		stage.increase(player);
+		goto("wait");
+	}
+}
+if(!(item.getType(hand_item) == "km:golden_key" && item.getName(hand_item) == "Tower Key")) {
+	goto("wait");
+}
+if(block.getType(block_loc) == "minecraft:iron_door") {
+	state_open = block.getState(block_loc, open_prop);
+	state_half = block.getState(block_loc, half_prop);
+	if(state_half == "upper") {
+		door_loc = loc.mod(block_loc, 0, -1, 0);
+	} else {
+		door_loc = block_loc;
+	}
+	if(list.contains(visited_doors, door_loc)) {
+		if(!state_open) {
+			opendoor(door_loc);
+			sgoto(60, "closedoor");
+		}
+		goto("wait");
+	}
+	if(list.contains(iron_doors, door_loc)) {
+		if(stage == 7) {
+			stage.increase(player);
+		} elseif(stage == 8) {
+			stage.increase(player);
+			entity.spawn("zombie", zombie_loc);
+		} elseif(stage == 10 && mob_killed == 1) {
+			stage.increase(player);
+		} elseif(stage == 11) {
+			stage.increase(player);
+			entity.spawn("skeleton", skeleton_loc);
+		} elseif(stage == 13 && mob_killed == 1) {
+			stage.increase(player);
+			entity.spawn("blaze", blaze_loc);
+		} elseif(stage == 15 && mob_killed == 1) {
+			stage.increase(player);
+			entity.spawn("spider", spider_loc);
+		} elseif(stage == 17 && mob_killed == 1) {
+			stage.increase(player);
+			entity.spawn("witch", witch_loc);
+		} elseif(stage == 19 && mob_killed == 1) {
+			stage.increase(player);
+		} else {
+			goto("wait");
+		}
+		if(!state_open) {
+			mob_killed = 0;
+			opendoor(door_loc);
+			sgoto(60, "closedoor");
+		}
+	}
+}
+goto("wait");
+
+function opendoor(loc) {
+	block.setDoorStatus(loc, true);
+	list.add($doors_to_close, loc);
+	if(!list.contains($visited_doors, loc)) {
+		list.add($visited_doors, loc);
+	}
+}
+
+@closedoor
+doorloc = list.getIndex(doors_to_close, 0);
+list.removeIndex(doors_to_close, 0);
+if(block.getType(doorloc) == "minecraft:iron_door") {
+	if(block.getDoorStatus(doorloc)) {
+		block.setDoorStatus(doorloc, false);
+	}
+}
+goto("wait");
+
+@bucket_use
+if(stage >= 22 && i == 2 && !bucket_filled) {
+	cancel = false;
+	stage.increase(player);
+	bucket_filled = true;
+}
+goto("wait");
+
+@block_break
+if(stage >= 22 && i == 3) {
+	cancel = true;
+	if(block.getType(block_loc) == "minecraft:nether_wart" && warts_harvested < 4) {
+		cancel = true;
+		amount = math.random(1, 3);
+		item.drop(block_loc, read.item("minecraft:nether_wart", amount));
+		warts_harvested += amount;
+		if(warts_harvested >= 4) {
+			stage.increase(player);
+		}
+	}
+}
+goto("wait");
+
+@living_death
+entity_type = entity.getType(living_entity);
+if(stage == 9 && entity_type == "zombie") {
+	mob_killed = 1;
+	stage.increase(player);
+}
+if(stage == 12 && entity_type == "skeleton") {
+	mob_killed = 1;
+	stage.increase(player);
+}
+if(stage == 14 && entity_type == "blaze") {
+	mob_killed = 1;
+	stage.increase(player);
+}
+if(stage == 16 && entity_type == "spider") {
+	mob_killed = 1;
+	stage.increase(player);
+}
+if(stage == 18 && entity_type == "witch") {
+	mob_killed = 1;
+	stage.increase(player);
+}
+if(stage >= 22 && i == 1 && entity_type == "cave_spider" && !cave_spider_killed) {
+	stage.increase(player);
+	cave_spider_killed = true;
+	active_quest = false;
+}
+goto("wait");

+ 189 - 0
storydorf/spawn/tutorial.txt

@@ -0,0 +1,189 @@
+event.load("human_hurt");
+event.load("entity_click");
+event.load("custom_command");
+event.load("quest_start");
+event.load("quest_term");
+
+stage = 0;
+all_stages = 21;
+quest_name = "Tutorial";
+
+kölsch = read.item("{id:\"minecraft:player_head\",Count:1b,tag:{SkullOwner:{Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDE2OGI5ODA5OGEwYzRhMjllMjA0NjcwNDYzMDkxZGI2MDcwZTc3ZDg2NzY5ZDk4NWY2YmVmNDA3NWU1In19fQ==\"}]},Id:\"c937a96b-cdbc-4fd1-8a19-e3fa9eadf313\"},display:{Name:'{\"text\":\"§r§eKölsch\"}'}}}");
+
+@wait
+wait();
+if(event == "human_hurt") {
+	player = entity;
+}
+if(quest_player_uuid == player.getUuid(player)) {
+	ignoreGoto(event);
+}
+goto("wait");
+
+@quest_start
+msg.quest(player, "Tutorial", 1, 3, "Welcome to our fat world full of chocolate!");
+stage.increase(player);
+goto("wait");
+
+@quest_term
+goto("wait");
+
+@custom_command
+if(command == "questanswer") {
+	number = list.getIndex(args, 0);
+	speaker = list.getIndex(args, 1);
+	if(stage == 5) {
+		if(number == 1000) {
+			msg(player, "[§b2§r/§b5§r] §a", speaker, " §r| §eFirst rule about rules. Don't talk about rules. No joke. There are no rules. But you can read our funny ", text.hover(text.link("§bFake Rules", "https://minecraft.hammerle.me/?site=rules"), "Click me"), ".");
+			stage.increase(player);
+		} elseif(number == 1001) {
+			msg(player, "[§b2§r/§b5§r] §a", speaker, " §r| §eAlways those useless developers! Has he also told you to learn all server rules by heart? Don't trust him! We have no rules. There are just a bunch of funny ", text.hover(text.link("§bFake Rules", "https://minecraft.hammerle.me/?site=rules"), "Click me"), ".");
+			stage.increase(player);
+		}
+		goto("wait");
+	}
+	if(stage == 11) {
+		if(number == 1002) {
+			msg.quest(player, speaker, 2, 3, "There you go. Marvin should enjoy it!");
+			safeGiveItemPlayer(player, kölsch);
+			stage.increase(player);
+		} elseif(number == 1003) {
+			msg.quest(player, speaker, 2, 3, "There you go. You may have heard about Marvin?");
+			safeGiveItemPlayer(player, kölsch);
+			safeGiveItemPlayer(player, kölsch);
+			safeGiveItemPlayer(player, kölsch);
+			safeGiveItemPlayer(player, read.item("minecraft:apple"));
+			stage.increase(player);
+		}
+		goto("wait");
+	}
+	if(stage == 15) {
+		if(number == 1004) {
+			msg.quest(player, speaker, 2, 6, "I see. I see.");
+			player.removeItem(player, kölsch);
+			stage.increase(player);
+		} elseif(number == 1005) {
+			msg.quest(player, speaker, 2, 6, "My friend. My best friend.");
+			player.removeItem(player, kölsch);
+			stage.increase(player);
+		}
+		goto("wait");
+	}
+	if(stage == 18) {
+		if(number == 1006) {
+			msg.quest(player, speaker, 4, 6, "Mmhh. If it has to be. 20x10 plot, there you go.");
+			if(skill.getAmount(player, "skill.freeplotsize") <= 0) {
+				skill.addAmount(player, "skill.freeplotsize", 200);
+			}
+			stage.increase(player);
+		} elseif(number == 1007) {
+			if(player.getItemAmount(player, false, kölsch) >= 1) {
+				msg.quest(player, speaker, 4, 6, "Oh yeah! You know what. You get a free plot for the size of 20x20. But don't tell Kajetan about this.");
+				if(skill.getAmount(player, "skill.freeplotsize") <= 0) {
+					skill.addAmount(player, "skill.freeplotsize", 400);
+				}
+				player.removeItem(player, kölsch);
+				stage.increase(player);
+			} else {
+				msg.quest(player, speaker, 4, 6, "§eUff. We ran out of beer. Doesn't matter. 20x10 plot, there you go.");
+				if(skill.getAmount(player, "skill.freeplotsize") <= 0) {
+					skill.addAmount(player, "skill.freeplotsize", 200);
+				}
+				stage.increase(player);
+			}
+		}
+		goto("wait");
+	}
+}
+goto("wait");
+
+@human_hurt
+player = entity;
+entity = human;
+goto("human_core");
+
+@entity_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(entity.getType(entity) != "human") {
+	goto("wait");
+}
+goto("human_core");
+
+@human_core
+entity_name = entity.getName(entity);
+if(entity_name == "Tutorial") {
+	if(stage == 1) {
+		msg.quest(player, entity_name, 2, 3, "Just a joke. Altough this is modified Minecraft, we have no chocolate.");
+		stage.increase(player);
+	} elseif(stage == 2) {
+		msg.quest(player, entity_name, 3, 3, "Talk to Kajetan. He is a funky guy. But don't believe him every word.");
+		stage.increase(player);
+	}
+	goto("wait");
+}
+if(entity_name == "Kajetan") {
+	if(stage == 3) {
+		msg.quest(player, entity_name, 1, 5, concat("Hello ", player.getName(player), ". I am your owner and the creator of life, the universe and everything."));
+		stage.increase(player);
+	} elseif(stage == 4) {
+		msg(player, "§dOptions of answer:");
+		msg(player, text.click("[§bA§r] §eOkay my lord. What do you want me to do? Should I learn all server rules by heart?", "/questanswer 1000 Kajetan"));
+		msg(player, text.click("[§bB§r] §eSure. Marvin already told me to be aware of you.", "/questanswer 1001 Kajetan"));
+		stage.increase(player);
+	} elseif(stage == 6) {
+		msg.quest(player, player_name, 3, 5, "Fancy, but where can I build my own house?");
+		stage.increase(player);
+	} elseif(stage == 7) {
+		msg.quest(player, entity_name, 4, 5, "Wherever you want to. For protection use §b/plot. §eTalk to Marvin and he will give you a free plot (max. 20x10).");
+		stage.increase(player);
+	} elseif(stage == 8) {
+		msg.quest(player, entity_name, 5, 5, "Please bring him something to drink. This developer only works on 100% when drunk. Alena in the tavern will give you a beer for him.");
+		stage.increase(player);
+	}
+	goto("wait");
+}
+if(entity_name == "Alena") {
+	if(stage == 9) {
+		msg.quest(player, entity_name, 1, 3, "Hello Stranger. What brings you here?");
+		stage.increase(player);
+	} elseif(stage == 10) {
+		msg(player, "§dOptions of answer:");
+		msg(player, text.click("[§bTruth§r] §eI was told to get Marvin a beer.", "/questanswer 1002 Alena"));
+		msg(player, text.click("[§bLie§r] §eKajetan the owner sent me to you. I should bring him three beers and an apple.", "/questanswer 1003 Alena"));
+		stage.increase(player);
+	} elseif(stage == 12) {
+		msg.quest(player, entity_name, 3, 3, "He always codes useful things such as the button over there for free food.");
+		stage.increase(player);
+	}
+	goto("wait");
+}
+if(entity_name == "Marvin") {
+	if(stage == 13) {
+		msg.quest(player, entity_name, 1, 6, "??????");
+		stage.increase(player);
+	} elseif(stage == 14) {
+		msg(player, "§dOptions of answer:");
+		msg(player, text.click("[§bA§r] §eEhmm... I have a beer for you.", "/questanswer 1004 Marvin"));
+		msg(player, text.click("[§bB§r] §eLOL. You are already drunk. Nevertheless I have a beer for you.", "/questanswer 1005 Marvin"));
+		stage.increase(player);
+	} elseif(stage == 16) {
+		msg.quest(player, entity_name, 3, 6, "Go into the cave for minigames.");
+		stage.increase(player);
+	} elseif(stage == 17) {
+		msg(player, "§dOptions of answer:");
+		msg(player, text.click("[§bA§r] §eMaybe later. Kajetan told me you have a free plot for me.", "/questanswer 1006 Marvin"));
+		msg(player, text.click("[§bB§r] §eYeah, great idea. But let us drink another beer together!", "/questanswer 1007 Marvin"));
+		stage.increase(player);
+	} elseif(stage == 19) {
+		msg.quest(player, player_name, 5, 6, "Very nice. Thank you.");
+		stage.increase(player);
+	} elseif(stage == 20) {
+		msg.quest(player, entity_name, 6, 6, "You're welcome.");
+		msg(player, "§dTutorial completed. Reward: 10 Coins!");
+		addMoney(player, 10);
+		quest.finish(script, player);
+	}
+}
+goto("wait");

+ 6 - 8
storydorf/surv_1.txt

@@ -10,9 +10,7 @@ village_plot_id = plot.getId(list.getIndex(plot_list, 0));
 farmer_quest = list.new();
 farmer_inv = inv.new("222222222");
 farmer_inv_id = inv.getId(farmer_inv);
-wheat_item_type = "minecraft:wheat";
-air_item_type = "minecraft:air";
-air_item = read.item(air_item_type);
+air_item = read.item("minecraft:air");
 crops_tag = block.getTag("minecraft:crops");
 age7_property = block.getProperty("age_0_7");
 farm_loc1 = loc.new(overworld, 69, 69, 444);
@@ -26,8 +24,8 @@ goto("wait");
 @entity_click
 entity_name = entity.getName(entity);
 if(entity_name == "Bauer") {
-	if(getGrowPercentage(farm_loc1, farm_loc2, wheat_item_type) >= 80) {
-		inv.setItem(farmer_inv, 0, read.item(wheat_item_type, 1, "Weizenfeld ernten"));
+	if(getGrowPercentage(farm_loc1, farm_loc2, "minecraft:wheat") >= 80) {
+		inv.setItem(farmer_inv, 0, read.item("minecraft:wheat", 1, "Weizenfeld ernten"));
 	} else {
 		inv.setItem(farmer_inv, 0, air_item);
 	}
@@ -36,7 +34,7 @@ if(entity_name == "Bauer") {
 goto("wait");
 
 @inv_click
-if(item.getType(item) != air_item_type) {
+if(item.getType(item) != "minecraft:air") {
 	if(inv_id == farmer_inv_id) {
 		if(inv_slot == 0) {
 			player_uuid = player.getUuid(player);
@@ -56,10 +54,10 @@ player_uuid = player.getUuid(player);
 //Hat der Spieler die Quest "Weizenfeld ernten"?
 if(list.contains(farmer_quest, player_uuid)) {
 	//Baut der Spieler einen Block des Weizenfelds ab?
-	if(loc.isBetween(block_loc, farm_loc1, farm_loc2) && block_type == wheat_item_type) {
+	if(loc.isBetween(block_loc, farm_loc1, farm_loc2) && block_type == "minecraft:wheat") {
 		cancel = false;
 		//Ist das Weizenfeld fertig abgeerntet?
-		if(getGrowPercentage(farm_loc1, farm_loc2, wheat_item_type) == 0) {
+		if(getGrowPercentage(farm_loc1, farm_loc2, "minecraft:wheat") == 0) {
 			//An alle Spieler, die diese Quest haben, eine Erledigung schicken
 			msgQuesters(farmer_quest, "Bauer", "Vielen Dank für das ernten des Weizenfelds! Hier hast du eine Belohnung.");
 			rewardQuesters(farmer_quest, 5, 0, 0);

+ 18 - 24
survival/survival.txt

@@ -12,6 +12,9 @@ event.load("living_drop");
 event.load("living_pre_hurt");
 event.load("player_toss");
 
+setScriptVar("skills", list.new());
+skill.add("Subcutaneous Inventory", "skill.subcu_inv", "minecraft:chest", "Keeps the inventory on death", 20, false);
+
 tp_list = list.new();
 tp_map = map.new();
 sitting = map.new();
@@ -21,11 +24,10 @@ hoe_tag = item.getTag("km:hoe");
 stairs_tag = block.getTag("minecraft:stairs");
 half_property = block.getProperty("half");
 
-gamesworld = world.get("games");
-moveidsurvival = event.addMoveData(loc.new(gamesworld, -399, 89, 110), loc.new(gamesworld, -400, 91, 114), 5, -1);
+overworld = world.get("overworld");
+moveid_gamesspawn = event.addMoveData(loc.new(overworld, 219, 66, 253), loc.new(overworld, 223, 69, 258), 5, -1);
 config = getScriptVar("server_config");
 survival_spawn = read.location(config.getString(config, "surv_spawn", "games:0:0:0"));
-overworld = world.get("overworld");
 adventure_chest_loc = loc.new(overworld, 240, 80, 234);
 adventure_aim_loc = loc.new(overworld, 237, 76, 237);
 money_präfix = "§2Money";
@@ -55,7 +57,7 @@ set.add(auto_farm_set, "minecraft:potato");
 set.add(auto_farm_set, "minecraft:beetroot_seeds");
 set.add(auto_farm_set, "minecraft:melon_seeds");
 
-bank_human_name = "Bänker";
+bank_human_name = "Banker";
 adv_human_name = "Adventure";
 bankmenu = inv.new("233302332233302332");
 bankinvid = inv.getID(bankmenu);
@@ -85,21 +87,6 @@ inv.setItem(bankmenu, 13, arrow_left);
 inv.setItem(bankmenu, 14, arrow_right);
 inv.setItem(bankmenu, 15, coin_gold);
 
-pvp_set = getScriptVar("pvp_set");
-if(pvp_set == null) {
-	pvp_set = set.new();
-	setScriptVar("pvp_set", pvp_set);
-} else {
-	//Alle Spieler, die PvP an hatten, wieder registrieren
-	iter = set.iterator(pvp_set);
-	while(hasNext(iter)) {
-		player = player.get(next(iter));
-		if(player != null) {
-			setPvp(player, "on");
-		}
-	}
-}
-
 //Minecraft-Zeit auf Real-Zeit syncen
 calendar = time.new(time.getMillis());
 min = time.getMinute(calendar);
@@ -113,12 +100,12 @@ world.setTime(world.get("overworld"), new_time);
 
 sgoto(1200, "timerloop");
 
-msg("dev", "§bSurvival §rwurde geladen");
+msg("dev", "§bSurvival §rloaded.");
 @wait
 wait();
 if(event == "player_move") {
-	if(id == moveidsurvival) {
-		teleportPlayer(player, survival_spawn, false);
+	if(id == moveid_gamesspawn) {
+		teleportPlayer(player, getGamesSpawn(), false);
 	}
 	goto("wait");
 }
@@ -187,7 +174,7 @@ if(hand == "OFF_HAND") {
 if(entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == bank_human_name) {
-		inv.open(bankmenu, player, "Bänker");
+		inv.open(bankmenu, player, "Banker");
 		goto("wait");
 	}
 	if(entity_name == adv_human_name) {
@@ -716,7 +703,14 @@ goto("wait");
 if(isPlayer(living_entity)) {
 	player = living_entity;
 	loc = entity.getLocation(player);
-	player.dropInventory(player, loc);
+	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);
+		speakPrefix(player, "§qSkill", concat("Used Subcutaneous Inventory. New amount: ", text.number(new_subcu_amount)));
+	} else {
+		player.dropInventory(player, loc);
+	}
 	killer = getPlayerFromDamageSource(damage_source);
 	if(isPlayer(killer)) {
 		if(perm.has(player, "isTeam")) {

+ 7 - 40
system/chat.txt

@@ -83,10 +83,8 @@ if(event == "living_death") {
 	}
 	player = living_entity;
 }
-player_uuid = player.getUuid(player);
 player_name = player.getName(player);
-nicknames = getScriptVar("nicknames");
-nickname = map.getOrDefault(nicknames, player_uuid, player_name);
+nickname = player.getNickname(player);
 //Wenn der Spieler keinen Nicknamen hat, werden die personalisierten Nachrichten geschickt, falls solche vorhanden sind
 if(removeFormat(nickname) == player_name) {
 	send_personally_messages = true;
@@ -143,26 +141,10 @@ if(players.getAmount() == 1) {
 		}
 	}
 }
-//Showcoords
-show = ggv(player, "showcoords");
-if(show == null) {
-	show = false;
-}
-if(show) {
-	showcoords_list = getScriptVar("showcoords_list");
-	list.add(showcoords_list, player.getUuid(player));
-	setScriptVar("showcoords_list", showcoords_list);
-}
 //Tabliste
-player_uuid = player.getUuid(player);
-nicknames = getScriptVar("nicknames");
-nickname = map.get(nicknames, player_uuid);
-if(nickname == null) {
-	colorcode = text.subString(rank, 0, 2);
-	tab_name = concat(colorcode, player_name);
-} else {
-	tab_name = concat("§b", nickname);
-}
+nickname = player.getNickName(player);
+colorcode = text.subString(rank, 0, 2);
+tab_name = concat(colorcode, nickname);
 player.setDisplayName(player, tab_name);
 goto("wait");
 
@@ -175,13 +157,6 @@ if(map.contains(personalleavemessage, player_id) && send_personally_messages) {
 msg("online", message);
 //Backpos
 dgv(player, "backpos");
-//Showcoords
-showcoords_list = getScriptVar("showcoords_list");
-if(showcoords_list == null) {
-	goto("wait");
-}
-list.remove(showcoords_list, player.getUuid(player));
-setScriptVar("showcoords_list", showcoords_list);
 goto("wait");
 
 @chat
@@ -190,7 +165,7 @@ if(text.startsWith(message, "7", 0)) {
 	space_index = read.number(text.indexOf(message, " ", 1));
 	if(length > 1 && space_index == -1 || length > 1 && space_index > 1) {
 		cancel = true;
-		if(space_index == - 1) {
+		if(space_index == -1) {
 			word = text.subString(message, 1, length);
 		} else {
 			word = text.subString(message, 1, space_index);
@@ -203,11 +178,7 @@ cancel = true;
 if(perm.has(player, "color")) {
 	message = text.replace(message, "&", "§");
 }
-//message = concat(fullname, "§1 | §r", message);
-//world = loc.getWorld(entity.getLocation(player));
-//sendMessageToWorld(world, message);
-//msg("online", message);
-sendOnlineMessage(text.hover(concat(colorcode, nickname), rank), message);
+sendOnlineMessage(player, message);
 goto("wait");
 
 @living_death
@@ -236,8 +207,4 @@ if(damage_type == "player") {
 	message = concat(fullname, list.getIndex(list, math.random(0, list.getSize(list) - 1)));
 }
 sendMessageToWorld(world, message);
-goto("wait");
-
-function sendOnlineMessage(from, message) {
-	msg("online", "[", from, "§r] §r", message);
-}
+goto("wait");

Разница между файлами не показана из-за своего большого размера
+ 243 - 225
system/commands.txt


+ 7 - 7
system/damage.txt

@@ -15,7 +15,7 @@ if(isLiving(entity) && !isPlayer(entity)) {
 goto("wait");
 
 @living_heal
-/*cancel = true;
+cancel = true;
 if(heal_amount <= 0) {
 	goto("wait");
 }
@@ -24,20 +24,20 @@ if(health <= 0) {
 	goto("wait");
 }
 new_health = health + heal_amount;
-entity.setHealth(living_entity, new_health);*/
+entity.setHealth(living_entity, new_health);
 if(!isPlayer(living_entity)) {
 	updateEntityName(living_entity);
 }
 goto("wait");
 
 @living_hurt
-/*cancel = true;
+cancel = true;
 if(!isPlayer(living_entity)) {
-	max_health = getSpecificMaxHealth(living_entity);
+	//max_health = getSpecificMaxHealth(living_entity);
 }
-van_max_health = living.getMaxHealth(living_entity);
-damage_amount = damage_amount * van_max_health / max_health;
-entity.damageDirect(living_entity, damage_amount, damage_source);*/
+//van_max_health = living.getMaxHealth(living_entity);
+//damage_amount = damage_amount * van_max_health / max_health;
+entity.damageDirect(living_entity, damage_amount, damage_source);
 if(!isPlayer(living_entity)) {
 	updateEntityName(living_entity);
 }

+ 2 - 1
system/perms.txt

@@ -31,9 +31,11 @@ map.add(permgroupsmap, "supporter", 9);
 //Default-Rechte
 perm.registerGroup(0, "isUser");
 perm.registerGroup(0, "chat");
+perm.registerGroup(0, "link");
 perm.registerGroup(0, "wusi");
 perm.registerGroup(0, "showcoords");
 perm.registerGroup(0, "hasitem");
+perm.registerGroup(0, "questanswer");
 perm.registerGroup(0, "lock");
 perm.registerGroup(0, "ping");
 perm.registerGroup(0, "door");
@@ -306,7 +308,6 @@ perm.registerGroup(10, "isOwner");
 perm.registerGroup(10, "isTeam");
 
 //Moderator
-perm.registerGroup(12, "isSurvMod");
 perm.registerGroup(12, "isMod");
 perm.registerGroup(12, "isTeam");
 perm.registerGroup(12, "feed");

+ 3 - 0
system/player_data.txt

@@ -8,6 +8,7 @@ event.load("player_login");
 event.load("player_logout");
 
 loadForOnlinePlayers("survival_data");
+loadForOnlinePlayers("games_data");
 
 @wait
 wait();
@@ -16,10 +17,12 @@ goto("wait");
 
 @player_login
 onLogin(player, "survival_data");
+onLogin(player, "games_data");
 goto("wait");
 
 @player_logout
 onLogout(player, "survival_data");
+onLogout(player, "games_data");
 goto("wait");
 
 function loadForOnlinePlayers(name) {

+ 1 - 21
system/svars.txt

@@ -7,24 +7,4 @@ setScriptVar("server_config", config);
 setScriptVar("script_players", map.new());
 setScriptVar("nicknames", map.new());
 setScriptVar("rmInventories", map.new());
-setScriptVar("last_exe_times", map.new());
-setScriptVar("showcoords_list", list.new());
-
-
-belagerungsskills_set = set.new();
-set.add(belagerungsskills_set, "Dietrich");
-set.add(belagerungsskills_set, "Explosiver Pfeil");
-set.add(belagerungsskills_set, "Belagerungsleiter");
-set.add(belagerungsskills_set, "Rammbock");
-set.add(belagerungsskills_set, "Obsidianbrecher");
-set.add(belagerungsskills_set, "Phosphorbombe");
-setScriptVar("belagerungsskills_set", belagerungsskills_set);
-
-list.new(gpvp_classes);
-list.add(gpvp_classes, "Jäger");
-list.add(gpvp_classes, "Schurke");
-list.add(gpvp_classes, "Krieger");
-//list.add(gpvp_classes, "Barbar");
-//list.add(gpvp_classes, "Magier");
-//list.add(gpvp_classes, "Mönch");
-setScriptVar("gpvp_classes", gpvp_classes);
+setScriptVar("quest_ids", map.new());

+ 36 - 0
test2.txt

@@ -0,0 +1,36 @@
+msg("dev", "Death swap gestarted");
+@loop
+waitfor(5800);
+for(i = 0; i < 10; i++) {
+	tell(10 - i);
+	waitfor(20);
+}
+deathswap();
+goto("loop");
+
+
+function tell(time) {
+	try {
+		msg(read.player("MentorMentos"), "§cSwap in ", text.number(time), " seconds");
+		msg(read.player("marvinius"), "§cSwap in ", text.number(time), " seconds");
+	} catch {
+		msg("dev", "Death swap terminiert");
+		term();
+	}
+}
+
+function deathswap() {
+	try {
+		player_name1 = "MentorMentos";
+		player_name2 = "marvinius";
+		player1 = read.player(player_name1);
+		player2 = read.player(player_name2);
+		loc1 = entity.getLocation(player1);
+		loc2 = entity.getLocation(player2);
+		entity.teleport(player1, loc2);
+		entity.teleport(player2, loc1);
+	} catch {
+		msg("dev", "Death swap terminiert");
+		term();
+	}
+}

+ 0 - 6
test3.txt

@@ -1,6 +0,0 @@
-config = config.new("scripts/configs", "server");
-if(config.exists(config)) {
-	config.load(config);
-}
-config.set(config, "serverspawn", ggv("SERVER", "serverspawn"));
-msg("dev", config.save(config));

+ 4 - 3
utils/u_games.txt

@@ -41,7 +41,7 @@ elseif(event == "custom_command") {
 goto("simplelobby");
 
 @lobbycore
-minigame.speakAll(gamename, concat("§8", getNickName(player), "§r joined the game."));
+minigame.speakAll(gamename, concat("§8", player.getNickName(player), "§r joined the game."));
 entity.teleport(player, lobbyspawnloc);
 resetplayer(player);
 title.setTime(player, 20, 60, 0);
@@ -110,7 +110,7 @@ ignoreGoto("checklobby");
 goto("simplelobby");
 
 @leavelobbycore
-minigame.speakAll(gamename, concat("§8", getNickName(player), "§r left the game."));
+minigame.speakAll(gamename, concat("§8", player.getNickName(player), "§r left the game."));
 script = script.getFromId(script_id);
 if(player.isPartyLeader(player)) {
 	scriptlist = minigame.getPlayers(script_id);
@@ -203,6 +203,7 @@ function player.tpGamesLobby(player) {
 	} else {
 		entity.teleport(player, getGamesSpawn());
 	}
+	minigame.displayElo(player, minigame.getElo(player));
 }
 
 //Tabelle in Datenbank registrieren
@@ -565,4 +566,4 @@ function sign.closed(sign_loc) {
 
 function minigame.isStarted(sign_loc) {
 	return block.getSign(sign_loc, 3) == "§bStarted";
-}
+}

+ 294 - 60
utils/u_general.txt

@@ -1,3 +1,14 @@
+function sendOnlineMessage(player, message) {
+	nickname = player.getNickName(player);
+	rank = getRank(player);
+	colorcode = text.subString(rank, 0, 2);
+	msg("online", "[", text.hover(concat(colorcode, nickname), rank), "§r] §r", message);
+}
+
+function perm.no(player, perm) {
+	player.speak(player, "§zPerms", "You have no permission for §c", perm, ".");
+}
+
 function checkIfEverOnline(player_name) {
 	if(player.getUuid(player_name) == null) {
 		return false;
@@ -218,16 +229,14 @@ function teleportPlayer(player, location, backPos) {
 	display.reset(player);
 	entity.setName(player, player.getName(player));
 	world_name = world.getName(world);
-	if(world_name == "gpvp_spawn") {
-		if(!registerGpvpPlayer(player)) {
-			joinGpvpWorld(player);
-		}
+	if(world_name == "games") {
+		joinGamesWorld(player);
 	}
 	if(isSurvWorldName(world_name)) {
 		joinSurvWorld(player);
 	}
 	//Tabliste
-	nickname = map.getOrDefault(getScriptVar("nicknames"), player.getUuid(player), player.getName(player));
+	nickname = player.getNickName(player);
 	if(isAfk(player)) {
 		player.setDisplayName(player, concat("§7§m", nickname));
 	} else {
@@ -239,7 +248,7 @@ function teleportPlayer(player, location, backPos) {
 }
 
 function getBlockLocation(location) {
-	world = world.get(loc.getCoord(location, "w"));
+	world = loc.getWorld(location, "w");
 	bx = loc.getCoord(location, "bx");
 	by = loc.getCoord(location, "by");
 	bz = loc.getCoord(location, "bz");
@@ -334,6 +343,85 @@ function getSurvivalSpawn() {
 	return read.location(config.getString(getScriptVar("server_config"), "surv_spawn", "games:0:0:0"));
 }
 
+//--------------------------------------------------
+//Showcoords-Utils
+//--------------------------------------------------
+
+function showCoords.get(player_or_id) {
+	config = playerdata.getSurvival(player_or_id);
+	return config.getBool(config, "showcoords", false);
+}
+
+function showCoords.set(player_or_id, bool) {
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, "showcoords", bool);
+	config.saveAsync(config);
+}
+
+//--------------------------------------------------
+//Quest-Utils
+//--------------------------------------------------
+
+function msg.quest(player, speaker, line_now, line_max, message) {
+	msg(player, "[§b", text.number(line_now), "§r/§b", text.number(line_max), "§r] §a", speaker, " §r| ", concat("§e", message));
+}
+
+function quest.display(player, quest_name, stage, all_stages) {
+	sb.add(player, 1, concat("§dQuest: ", quest_name, " [", text.number(stage), "/", text.number(all_stages), "]"));
+}
+
+function quest.removeDisplay(player) {
+	sb.remove(player, 1);
+}
+
+function quest.addPlayer(script, player) {
+	quest_ids = getScriptVar("quest_ids");
+	map.add(quest_ids, player.getUuid(player), script.getId(script));
+}
+
+function quest.removePlayer(player) {
+	quest_ids = getScriptVar("quest_ids");
+	map.remove(quest_ids, player.getUuid(player));
+}
+
+function player.hasQuest2(player) {
+	quest_ids = getScriptVar("quest_ids");
+	return map.contains(quest_ids, player.getUuid(player));
+}
+
+function quest.getFromPlayer(player) {
+	quest_ids = getScriptVar("quest_ids");
+	return map.get(quest_ids, player.getUuid(player));
+}
+
+function quest.getCounter(player_or_id) {
+	config = playerdata.getSurvival(player_or_id);
+	return config.getDouble(config, "quests_solved", 0);
+}
+
+function quest.setCounter(player_or_id, amount) {
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, "quests_solved", amount);
+	config.saveAsync(config);
+}
+
+function quest.addCounter(player_or_id, amount) {
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, "quests_solved", config.getDouble(config, "quests_solved", 0) + amount);
+	config.saveAsync(config);
+}
+
+function quest.finish(script, player) {
+	addCounter(player, 1);
+	quest.term(script, player);
+}
+
+function quest.term(script, player) {
+	quest.removeDisplay(player);
+	quest.removePlayer(player);
+	script.term(script);
+}
+
 //--------------------------------------------------
 //Teleporter-Utils
 //--------------------------------------------------
@@ -956,6 +1044,22 @@ function playerdata.getSurvival(player_or_id) {
 	return config;
 }
 
+function playerdata.getGames(player_or_id) {
+	if(isPlayer(player_or_id)) {
+		player_id = player.getId(player_or_id);
+	} else {
+		player_id = player_or_id;
+		loadData(player_id, getScriptVar("games_data"), "games_data");
+	}
+	//On player_login data is needed, but the data isn't loaded yet, so the config can be null at this point
+	config = map.get(getScriptVar("games_data"), player_id);
+	if(config == null) {
+		loadData(player_id, getScriptVar("games_data"), "games_data");
+		config = map.get(getScriptVar("games_data"), player_id);
+	}
+	return config;
+}
+
 function loadData(player_or_id, map, name) {
 	if(isPlayer(player_or_id)) {
 		player_id = player.getId(player_or_id);
@@ -1033,6 +1137,133 @@ function money.split(money) {
 	array[2] = bronze;
 	return array;
 }
+//--------------------------------------------------
+//Skill-Utils
+//--------------------------------------------------
+
+function skill.getAmount(player_or_id, tech_name) {
+	config = playerdata.getSurvival(player_or_id);
+	return config.getDouble(config, tech_name, 0);
+}
+
+function skill.setAmount(player_or_id, tech_name, amount) {
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, tech_name, amount);
+	config.saveAsync(config);
+}
+
+function skill.addAmount(player_or_id, tech_name, amount) {
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, tech_name, config.getDouble(config, tech_name, 0) + amount);
+	config.saveAsync(config);
+}
+
+function skill.add(skill_name, tech_name, item, description, cost, permanent) {
+	skill = array.new(6);
+	skill[0] = skill_name;
+	skill[1] = tech_name;
+	skill[2] = item;
+	skill[3] = description;
+	skill[4] = cost;
+	skill[5] = permanent;
+	list.add(getScriptVar("skills"), skill);
+}
+
+function skill.get(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;
+		}
+	}
+}
+
+function skill.getShopItem(player, skill_name) {
+	if(skill_name == null) {
+		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";
+	} else {
+		prop = "Levelable";
+	}
+	item = read.item(skill[2], 1, skill_name, concat("Cost:", text.number(skill[4])), skill[3], prop, concat("Amount you have: ", text.number(amount)));
+	return item;
+}
+
+function skill.getTechName(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[1];
+		}
+	}
+}
+
+function skill.getItem(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[2];
+		}
+	}
+}
+
+function skill.getDescription(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[3];
+		}
+	}
+}
+
+function skill.getCost(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[4];
+		}
+	}
+}
+
+function skill.isPermanent(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[5];
+		}
+	}
+}
+
+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));
+	inv.setItem(inv, 1, skill.getShopItem(player, skill_name2));
+	inv.setItem(inv, 2, skill.getShopItem(player, skill_name3));
+	inv.setItem(inv, 3, skill.getShopItem(player, skill_name4));
+	inv.setItem(inv, 4, skill.getShopItem(player, skill_name5));
+	inv.setItem(inv, 5, skill.getShopItem(player, skill_name6));
+	inv.setItem(inv, 6, skill.getShopItem(player, skill_name7));
+	inv.setItem(inv, 7, skill.getShopItem(player, skill_name8));
+	inv.setItem(inv, 8, skill.getShopItem(player, skill_name9));
+	inv.open(inv, player, "Skillshop");
+}
 
 //--------------------------------------------------
 //Survival-Utils
@@ -1040,7 +1271,43 @@ function money.split(money) {
 
 function joinSurvWorld(player) {
 	displayMoney(player, getMoney(player));
-	return;
+}
+
+//--------------------------------------------------
+//Games-Utils
+//--------------------------------------------------
+
+function joinGamesWorld(player) {
+	minigame.displayElo(player, minigame.getElo(player));
+}
+
+function minigame.displayElo(player, elo) {
+	display.add(player, 101, concat("§tElo: §r", text.number(elo)));
+}
+
+function minigame.setElo(player_or_id, elo) {
+	config = playerdata.getGames(player_or_id);
+	config.set(config, "game_elo", elo);
+	config.saveAsync(config);
+	if(isPlayer(player_or_id)) {
+		minigame.displayElo(player_or_id, elo);
+	}
+}
+
+function minigame.getElo(player_or_id) {
+	config = playerdata.getGames(player_or_id);
+	return config.getDouble(config, "game_elo", 0);
+}
+
+function minigame.addElo(player_or_id, elo) {
+	config = playerdata.getGames(player_or_id);
+	new_elo = config.getDouble(config, "game_elo", 0) + elo;
+	config.set(config, "game_elo", new_elo);
+	config.saveAsync(config);
+	if(isPlayer(player_or_id)) {
+		minigame.displayElo(player_or_id, new_elo);
+		speakPrefix(player_or_id, "§tElo", concat("§r+§e", text.number(elo)));
+	}
 }
 
 //--------------------------------------------------
@@ -1070,69 +1337,36 @@ function setAfk(player, boolean) {
 //PvP-Utils
 //--------------------------------------------------
 
-function hasPvpOn(player) {
-	player_uuid = player.getUuid(player);
-	pvp_set = getScriptVar("pvp_set");
-	if(set.contains(pvp_set, player_uuid)) {
-		return true;
-	}
-	return false;
+function hasPvpOn(player_or_id) {
+	config = playerdata.getSurvival(player_or_id);
+	return config.getBool(config, "pvp", false);
 }
 
-function setPvp(player, mode) {
-	player_uuid = player.getUuid(player);
-	pvp_set = getScriptVar("pvp_set");
-	if(mode == "on") {
-		set.add(pvp_set, player_uuid);
-	} else {
-		set.remove(pvp_set, player_uuid);
-	}
+function setPvp(player_or_id, bool) {
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, "pvp", bool);
+	config.save(config);
 }
 
 //--------------------------------------------------
 //Rank-Utils
 //--------------------------------------------------
 
-function setRank(player_name, category, rank) {
-	rank = text.replace(rank, "&", "§");
-	stmt = databank.prepare("INSERT INTO chatranks (player_id, category, rank) VALUES (?,?,?) ON DUPLICATE KEY UPDATE chatranks.rank = ?;");
-	player_uuid = player.getUuid(player_name);
-	player_id = player.getId(player_uuid);
-	databank.setInt(stmt, 1, player_id);
-	databank.setString(stmt, 2, category);
-	databank.setString(stmt, 3, rank);
-	databank.setString(stmt, 4, rank);
-	databank.workerExecute(stmt);
+function getRank(player_or_id) {
+	config = playerdata.getSurvival(player_or_id);
+	return config.getString(config, "rank", "§bUser");
 }
 
-function getRank(player_id) {
-	player_name = player.getNameFromId(player_id);
-	player = read.player(player_name);
-	world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-	if(isSurvWorldName(world_name)) {
-		world_name = "survival";
-	}
-	stmt = databank.prepare("SELECT rank FROM chatranks WHERE player_id = ? AND category = ?;");
-	databank.setInt(stmt, 1, player_id);
-	databank.setString(stmt, 2, world_name);
-	result = databank.execute(stmt);
-	if(databank.next(result)) {
-		rank = databank.getString(result, 1);
-	} else {
-		rank = "§bUser";
-	}
-	databank.close(result);
-	databank.close(stmt);
-	return rank;
+function setRank(player_or_id, rank) {
+	rank = text.replace(rank, "&", "§");
+	config = playerdata.getSurvival(player_or_id);
+	config.set(config, "rank", rank);
+	config.save(config);
 }
 
 function offerRank(player, rank) {
 	rank2 = text.replace(rank, "§", "&");
-	world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-	if(isSurvWorldName(world_name)) {
-		world_name = "survival";
-	}
-	player.speak(player, "§6Commands", "Neuer Rang verfügbar: ", text.hover(text.click(concat("[", rank, "§r]"), concat("/setrank ", player.getName(player), " ", world_name, " ", rank2)), "Zum Auswählen klicken"));
+	player.speak(player, "§6Commands", "New rank available: ", text.hover(text.click(concat("[", rank, "§r]"), concat("/setrank ", player.getName(player), " ", rank2)), "Click to set"));
 }
 
 
@@ -1182,7 +1416,7 @@ function removeAllPerms(player_id) {
 }
 
 function isAPermGroup(permstring) {
-	if(list.contains($permgroups, text.toLowerCase(permstring))) {
+	if(map.contains($permgroupsmap, text.toLowerCase(permstring))) {
 		return true;
 	}
 	return false;
@@ -1226,15 +1460,15 @@ function registerAllPerms() {
 //Nickname-Utils
 //--------------------------------------------------
 
-function setNickName(player, nickname) {
+function player.setNickName(player, nickname) {
 	map.add(getScriptVar("nicknames"), player.getUuid(player), nickname);
 }
 
-function getNickName(player) {
+function player.getNickName(player) {
 	return map.getOrDefault(getScriptVar("nicknames"), player.getUuid(player), player.getName(player));
 }
 
-function removeNickName(player) {
+function player.removeNickName(player) {
 	map.remove(getScriptVar("nicknames"), player.getUuid(player));
 }
 

+ 40 - 0
utils/u_plots.txt

@@ -141,6 +141,7 @@ function changePlotEdges(plot, location1, location2) {
 	//Alte Daten abrufen
 	plot_name = getPlotName(plot);
 	list = plot.getOwners(plot);
+	flags = plot.getFlags(plot);
 	//Neues Plot erstellen und altes Plot löschen
 	new_plot = plot.add(location1, location2);
 	world = loc.getWorld(location1);
@@ -151,6 +152,7 @@ function changePlotEdges(plot, location1, location2) {
 	for(i = 0; i < list.getSize(list); i++) {
 		list.add(new_list, list.getIndex(list, i));
 	}
+	plot.setFlags(new_plot, flags, true);
 	return;
 }
 
@@ -174,6 +176,15 @@ function getFlags(plot, getActive) { //getActive = true means getActiveFlags
 	flags_true = list.new();
 	flags_false = list.new();
 	array = array.new(2);
+	array[0] = 128;
+	array[1] = "FARM_FLAG";
+	if(flags >= 128) {
+		list.add(flags_true, array);
+		flags -= 128;
+	} else {
+		list.add(flags_false, array);
+	}
+	array = array.new(2);
 	array[0] = 64;
 	array[1] = "EXPLOSION_FLAG";
 	if(flags >= 64) {
@@ -241,3 +252,32 @@ function getFlags(plot, getActive) { //getActive = true means getActiveFlags
 		return flags_false;
 	}
 }
+
+function plot.calcCost(player, length, width) {
+	area = length * width;
+	free_area = skill.getAmount(player, "skill.freeplotsize");
+	new_area = area - free_area;
+	if(new_area > 0) {
+		betrag = new_area / 5;
+		used_free_area = free_area;
+		new_free_area = 0;
+	} else {
+		betrag = 0;
+		new_free_area = free_area - area;
+		used_free_area = area;
+	}
+	if(!hasEnoughMoney(player_id, betrag)) {
+		player.speak(player, "§2Money", "You've not enough money.");
+		player.speak(player, "§2Money", "Cost = (Length * Width) / 5");
+		return false;
+	} else {
+		subMoney(player, betrag);
+		skill.setAmount(player, "skill.freeplotsize", new_free_area);
+		if(used_free_area > 0) {
+			player.speak(player, "§qSkill", "Used free plot area: ", text.number(used_free_area));
+			player.speak(player, "§qSkill", "New free plot area: ", text.number(new_free_area));
+		}
+		player.speak(player, "§2Money", "You paid ", text.number(betrag), " coins.");
+	}
+	return true;
+}

+ 4 - 0
utils/u_quest.txt

@@ -0,0 +1,4 @@
+function stage.increase(player) {
+	$stage++;
+	quest.display(player, $quest_name, $stage, $all_stages);
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов