Browse Source

new quest: gaumenschmauss

Marvin Löschenkohl 3 năm trước cách đây
mục cha
commit
aced4f29b5

+ 0 - 111
Archiv/troll.txt

@@ -1,111 +0,0 @@
-%msg dev §bTroll §rwurde geladen.;
-
-%addList banned;
-%addListElement banned marvinius;
-%addListElement banned eropster;
-%addListElement banned kajetanjohannes;
-
-%loadEvent player-login;
-
-@wait
-%wait;
-%if $event == player-login && %checkForListElement banned $player-name; == true && $started != true goto troll;
-%goto wait;
-
-@troll
-%setVar started true;
-%setVar p $player-name;
-%waitfor 20;
-%command effect $p minecraft:jump_boost 1000000 128 true;
-%command effect $p minecraft:slowness 1000000 255 true;
-%command title $p times 20 200 20;
-
-@troll01
-%command title $p times 20 200 20;
-%command title $p subtitle {"text":"...alles!!!","color":"white"};
-%command title $p title {"text":"Wir können...","color":"dark_red"};
-%sgoto 240 troll02;
-%goto wait;
-
-@troll02
-%command title $p subtitle {"text":"...alles!!!","color":"white"};
-%command title $p title {"text":"Daher wissen wir...","color":"dark_red"};
-%sgoto 240 troll03;
-%goto wait;
-
-@troll03
-%command title $p subtitle {"text":"...alles!!!","color":"white"};
-%command title $p title {"text":"Und deshalb sehen wir...","color":"dark_red"};
-%sgoto 240 troll1;
-%goto wait;
-
-@troll1
-%command title $p subtitle {"text":"Willkommen auf Neostralis 2.0","color":"red"};
-%command title $p title {"text":"Hallo SanX^^","color":"dark_red"};
-%sgoto 240 troll2;
-%goto wait;
-
-@troll2
-%command title $p subtitle {"text":"...die man sich nicht vorstellen kann!","color":"white"};
-%command title $p title {"text":"Hier geschehen Dinge...","color":"dark_red"}; 
-%sgoto 240 troll3;
-%goto wait;
-
-@troll3
-%command title $p subtitle {"text":"...ERLEBEN","color":"white"};
-%command title $p title {"text":"Man muss sie...","color":"dark_red"};
-%sgoto 240 troll4;
-%goto wait;
-
-@troll4
-%command title $p subtitle {"text":"...du wirst das leider nicht :,(","color":"white"};
-%command title $p title {"text":"Doch du...","color":"dark_red"};
-%sgoto 240 troll5;
-%goto wait;
-
-@troll5
-%command title $p reset;
-%command title $p times 20 200 20;
-%command title $p title {"text":"Featurerequests...","color":"dark_red"};
-%sgoto 240 troll6;
-%goto wait;
-
-@troll6
-%command title $p title {"text":"...werden hier angehört","color":"white"};
-%sgoto 240 troll7;
-%goto wait;
-
-@troll7
-%command title $p title {"text":"...angenommen","color":"white"};
-%sgoto 240 troll8;
-%goto wait;
-
-@troll8
-%command title $p title {"text":"...und bearbeitet","color":"white"};
-%sgoto 240 troll9;
-%goto wait;
-
-@troll9
-%command title $p subtitle {"text":"...UNERWÜNSCHT!!! :,(","color":"white"};
-%command title $p title {"text":"Deswegen bist du hier...","color":"dark_red"};
-%sgoto 240 troll10;
-%goto wait;
-
-@troll10
-%command title $p subtitle {"text":"...is presented by...","color":"white"};
-%command title $p title {"text":"This program...","color":"dark_red"};
-%sgoto 240 troll11;
-%goto wait;
-
-@troll11
-%command title $p reset;
-%command title $p times 20 200 20;
-%command title $p title {"text":"marvinius","color":"dark_aqua"};
-%sgoto 240 troll12;
-%goto wait;
-
-@troll12
-%command title $p subtitle {"text":"...es möglich macht","color":"white"};
-%command title $p title {"text":"Weil kajetans Questive...","color":"dark_red"};
-%setVar started false;
-%goto wait;

+ 3 - 2
minigames/jumpnrun/jumpnrun.txt

@@ -172,13 +172,14 @@ block.set(newblock, wool_block);
 sound.spawn(newblock, jump_sound, sound_category_ambient);
 moveloc1 = loc.mod(newblock, 0, 1, 0);
 moveloc2 = loc.mod(newblock, 1, 2, 1);
-event.addMoveData(moveloc1, moveloc2, -1, -1);
+player_uuid = player.getUuid(player);
+event.addMoveData(moveloc1, moveloc2, -1, -1, player_uuid);
 if(fallid != null) {
 	event.removeMoveData(fallid);
 }
 fallloc1 = loc.mod(moveloc1, -10, -10, -10);
 fallloc2 = loc.mod(moveloc1, 10, -2, 10);
-fallid = event.addMoveData(fallloc1, fallloc2, -1, -1);
+fallid = event.addMoveData(fallloc1, fallloc2, -1, -1, player_uuid);
 goto("wait");
 
 @player_join

+ 22 - 13
minigames/rebuild/rebuild.txt

@@ -18,6 +18,16 @@ buildingarea = map.new();
 solved = map.new();
 check_list = list.new();
 
+if(list.getSize(player_list) == 1) {
+	singleteam = true;
+	for(i = 0; i < list.getSize(player_list); i++) {
+		p = player.get(list.getIndex(player_list, i));
+		player.speak(p, gamename, "Singleteam. Not ranked");
+	}
+} else {
+	singleteam = false;
+}
+
 for(i = 0; i < list.getSize(player_list); i++) {
 	p_uuid = list.getIndex(player_list, i);
 	p = player.get(p_uuid);
@@ -88,7 +98,12 @@ if(event == "player_giveup" || event == "player_logout") {
 	script = script.getFromId(script_id);
 	minigame.kickplayer(script, player);
 	if(list.getSize(player_list) < 2) {
-		p = player.get(list.getIndex(player_list, 0));
+		if(singleteam) {
+			p = player;
+		} else {
+			p_uuid = list.getIndex(player_list, 0);
+			p = player.get(p_uuid);
+		}
 		wincore(p);
 	}
 }
@@ -105,16 +120,6 @@ for(i = 0; i < list.getSize(player_list); i++) {
 	}
 }
 
-if(list.getSize(player_list) == 1) {
-	singleteam = true;
-	for(i = 0; i < list.getSize(player_list); i++) {
-		p = player.get(list.getIndex(player_list, i));
-		player.speak(p, gamename, "Singleteam. Not ranked");
-	}
-} else {
-	singleteam = false;
-}
-
 @checkgame
 wait();
 if(player.hasMinigameId(player, script_id)) {
@@ -133,8 +138,12 @@ for(i = 0; i < list.getSize(list); i++) {
 script = script.getFromId(script_id);
 minigame.kickplayer(script, player);
 if(list.getSize(player_list) < 2) {
-	p_uuid = list.getIndex(player_list, 0);
-	p = player.get(p_uuid);
+	if(singleteam) {
+		p = player;
+	} else {
+		p_uuid = list.getIndex(player_list, 0);
+		p = player.get(p_uuid);
+	}
 	wincore(p);
 }
 goto("checkgame");

+ 2 - 2
startscript.txt

@@ -21,12 +21,12 @@ script.startNamed("Shops", "system/chestshops", "utils/u_general");
 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");
+script.startNamed("Scheduler", "system/scheduler", "utils/u_general");
 
 error.setConsolePrint(true);
 debug.setConsolePrint(false);
-
 term();

+ 40 - 4
story/admont/core.txt

@@ -1,5 +1,6 @@
 event.load("human_hurt");
 event.load("entity_click");
+event.load("inv_click");
 
 msg("dev", "§bQuests: §rAdmont loaded.");
 @wait
@@ -31,9 +32,44 @@ if(player.hasQuest2(player)) {
 entity_name = entity.getName(entity);
 if(entity_name == "Oma") {
 	inv = inv.new("333333333");
-	inv.setItem(inv, 0, read.item("minecraft:enchanted_book", 1, "§fQuestname", "§eQuestbeschreibung"));
-	inv.setItem(inv, 1, read.item("minecraft:enchanted_book", 1, "§fQuestname", "§eQuestbeschreibung"));
-	inv.open(inv, player, "Quests");
+	inv.setItem(inv, 0, read.item("minecraft:enchanted_book", 1, "§fDer Anfang...", "§e...beginnt immer mit einer netten Oma."));
+	inv.open(inv, player, "Quests: Oma");
 	goto("wait");
 }
-goto("wait");
+if(entity_name == "Dieter") {
+	inv = inv.new("333333333");
+	inv.setItem(inv, 0, read.item("minecraft:enchanted_book", 1, "§fGaumenschmauß...", "§e...für die ganze Familie."));
+	inv.open(inv, player, "Quests: Dieter");
+	goto("wait");
+}
+goto("wait");
+
+@inv_click
+if(inv_name == "Quests: Oma") {
+	if(inv_slot == 0) {
+		quest.start(player, "story/admont/start");
+		goto("wait");
+	}
+	goto("wait");
+}
+if(inv_name == "Quests: Dieter") {
+	if(inv_slot == 0) {
+		quest.start(player, "story/admont/gaumenschmauss");
+		goto("wait");
+	}
+	goto("wait");
+}
+goto("wait");
+
+function quest.start(player, path) {
+	script = script.start(path, "utils/u_quest", "utils/u_general");
+	if(script == null) {
+		msg("dev", "quest not started");
+		return;
+	}
+	quest.addPlayer(script, player);
+	script.setVar(script, "player", player);
+	script.setVar(script, "script", script);
+	script.callEvent("quest_start", script);
+	inv.close(player);
+}

+ 143 - 0
story/admont/gaumenschmauss.txt

@@ -0,0 +1,143 @@
+event.load("entity_click");
+event.load("quest_start");
+event.load("quest_term");
+event.load("custom_command");
+event.load("block_break");
+event.load("living_death");
+
+stage = 0;
+all_stages = 7;
+quest_name = "Gaumenschmauß...";
+coal_counter = 0;
+story = world.getStory();
+cow_loc = loc.new(story, -1561.5, 66, -80);
+
+@wait
+wait();
+if(event == "living_death") {
+	player = player.getFromDamageSource(damage_source);
+	if(player == null) {
+		goto("wait");
+	}
+}
+if(!player.isQuester(player, script)) {
+	goto("wait");
+}
+if(event == "quest_term") {
+	//Hier Code einfügen...
+	wait(); //Script wird von außen terminiert
+}
+if(event == "quest_start") {
+	quest.display(player, quest_name, stage, all_stages);
+	msg.prefix(player, "§dDieter", "Sieht aus als hätten wir Gesellschaft! Wenn du hergekommen bist, um mit uns zu essen, muss ich dich leider enttäuschen. Wir haben weder ein Gericht, noch Feuer. Man könnte sagen, wir brauchen jemanden zum Anfeuern.");
+	msg(player, "§dAntwortmöglichkeiten:");
+	msg(player, text.click("[§dA§r] §eIch feuer sehr gerne mit an!", "/questanswer A"));
+	msg(player, text.click("[§dB§r] §eCheerleading? Kann ich.", "/questanswer B"));
+	goto("wait");
+}
+label = concat("stage", text.number(stage));
+goto(label);
+
+@stage0
+if(event == "custom_command" && command == "questanswer") {
+	option = list.getIndex(args, 0);
+	if(option == "A" || option == "B") {
+		stage.increase(player);
+		msg.prefix(player, "§dDieter", "Na das ist doch super. Hier in der Nähe ist die Odelsteinhöhle. Hol uns doch 6 Stück Kohle.");
+		player.giveSingleItem(player, read.item("minecraft:stone_pickaxe"), false);
+	}
+}
+goto("wait");
+
+@stage1
+if(event == "block_break") {
+	if(block_type == "minecraft:coal_ore") {
+		cancel = true;
+		item.drop(entity.getLocation(player), read.item("minecraft:coal"));
+		coal_counter++;
+		if(coal_counter == 6) {
+			stage.increase(player);
+		}
+	}
+}
+goto("wait");
+
+@stage2
+if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
+	entity_name = entity.getName(entity);
+	if(entity_name == "Dieter") {
+		item = entity.getEquip(player, "hand");
+		if(item.getType(item) != "minecraft:coal") {
+			msg.prefix(player, "§dDieter", "Das kann ich nicht gebrauchen.");
+			goto("wait");
+		}
+		if(player.getItemAmount(player, false, item) < 6) {
+			msg.prefix(player, "§dDieter", "Das ist leider zu wenig.");
+			goto("wait");
+		}
+		player.removeItem(player, read.item("minecraft:coal", 6));
+		stage.increase(player);
+		msg.prefix(player, "§dDieter", "Vielen Dank! Jetzt fehlt uns nur noch ein ordentlicher Braten.");
+		scheduler.msgPrefix(30, player, "§dDieter", "Wir zünden schonmal das Holz an. Geh du derweil zum Metzger und besorg uns etwas Rindfleisch!");
+	}
+}
+goto("wait");
+
+@stage3
+if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
+	entity_name = entity.getName(entity);
+	if(entity_name == "Metzger") {
+		stage.increase(player);
+		msg.prefix(player, "§dMetzger", "Hey, du gehörst hier eigentlich nicht hin! Ich will deinen jungen Augen diesen grausamen Anblick ersparen.");
+		msg(player, "§dAntwortmöglichkeiten:");
+		msg(player, text.click("[§dA§r] §eDas macht nichts. Ich hätte gerne etwas Rindfleisch, wenn das möglich ist.", "/questanswer A"));
+		msg(player, text.click("[§dB§r] §eIch kann das auf keinen Fall mit ansehen!", "/questanswer B"));
+	}
+}
+goto("wait");
+
+@stage4
+if(event == "custom_command" && command == "questanswer") {
+	option = list.getIndex(args, 0);
+	if(option == "A") {
+		stage.increase(player);
+		msg.prefix(player, "§dMetzger", "Na dann such dir eins aus. Ich erlaube dir auch, selbst Hand anzulegen.");
+		entity.spawn("cow", cow_loc);
+		player.giveSingleItem(player, read.item("minecraft:stone_axe"), false);
+		goto("wait");
+	}
+	if(option == "B") {
+		stage.increase(player);
+		stage.increase(player);
+		msg.prefix(player, "§dMetzger", "Kein Problem. Ich habe noch etwas gelagert.");
+		player.safeGiveItem(player, read.item("minecraft:beef", 1));
+	}
+}
+goto("wait");
+
+@stage5
+if(event == "living_death") {
+	if(entity.getType(living_entity) == "cow") {
+		stage.increase(player);
+	}
+}
+goto("wait");
+
+@stage6
+if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
+	entity_name = entity.getName(entity);
+	if(entity_name == "Dieter") {
+		item = entity.getEquip(player, "hand");
+		if(item.getType(item) != "minecraft:beef") {
+			msg.prefix(player, "§dDieter", "Das kann ich nicht gebrauchen.");
+			goto("wait");
+		}
+		player.removeItem(player, read.item("minecraft:beef"));
+		msg.prefix(player, "§dDieter", "Super! Das wird ein einzigartiger Gaumenschmaus.");
+		player.safeGiveItem(player, read.item("minecraft:cooked_beef"));
+		msg(player, "§dQuest abgeschlossen. Belohnung: 15 Snuvis!");
+		addMoney(player, 15);
+		quest.finish(script, player);
+	}
+}
+goto("wait");

+ 103 - 0
story/admont/start.txt

@@ -0,0 +1,103 @@
+event.load("entity_click");
+event.load("quest_start");
+event.load("quest_term");
+event.load("block_click");
+event.load("custom_command");
+
+stage = 0;
+all_stages = 5;
+quest_name = "Der Anfang...";
+cake_loc = loc.new(world.getStory(), -1511, 65, -23);
+
+@wait
+wait();
+if(!player.isQuester(player, script)) {
+	goto("wait");
+}
+if(event == "quest_term") {
+	//Hier Code einfügen...
+	wait(); //Script wird von außen terminiert
+}
+if(event == "quest_start") {
+	quest.display(player, quest_name, stage, all_stages);
+	msg.prefix(player, "§dOma", "Hallo Grünschnabel! Du siehst sehr verloren aus... Ist alles okay bei dir?");
+	scheduler.msgPrefix(30, player, "§dOma", "Iss doch etwas von meinem frisch gebackenen Kuchen, damit du nicht verhungerst.");
+	block.set(cake_loc, "minecraft:cake");
+	player.setHunger(player, 18);
+	player.setSaturation(player, 0);
+	goto("wait");
+}
+label = concat("stage", text.number(stage));
+goto(label);
+
+@stage0
+if(event == "block_click") {
+	if(block_loc == cake_loc) {
+		stage.increase(player);
+		msg.prefix(player, "§dOma", "Na, das ist doch schon besser :)");
+		scheduler.msgPrefix(30, player, "§dOma", "Geh doch dort über die Brücke und sprich mit dem Gastwirt, direkt am Dorfeingang auf der rechten Seite. Er wird dir sicher behilflich sein!");
+	}
+}
+goto("wait");
+
+@stage1
+if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
+	entity_name = entity.getName(entity);
+	if(entity_name == "Gastwirt") {
+		stage.increase(player);
+		msg.prefix(player, "§dGastwirt", "Guten Tag, wie kann ich dir behilflich sein?");
+		msg(player, "§dAntwortmöglichkeiten:");
+		msg(player, text.click("[§dA§r] §eIch weiß nicht, wo ich hier gelandet bin.", "/questanswer A"));
+		msg(player, text.click("[§dB§r] §eMir ist nicht mehr zu helfen.", "/questanswer B"));
+	}
+}
+goto("wait");
+
+@stage2
+if(event == "custom_command" && command == "questanswer") {
+	option = list.getIndex(args, 0);
+	if(option == "A") {
+		stage.increase(player);
+		msg.prefix(player, "§dGastwirt", "Da bin ich der richtige Ansprechpartner. Du bist hier in Admont, einem kleinen Dörfchen in der weiten Welt.");
+		scheduler.msgPrefix(30, player, "§dGastwirt", "Du siehst mir recht vertrauenswürdig aus. Vielleicht könntest du uns die eine oder andere Arbeit abnehmen.");
+		scheduler.msgPrefix(60, player, "§dGastwirt", "Geh doch in mein Haus zu meiner Frau, sie wird dir weiterhelfen.");
+		goto("wait");
+	}
+	if(option == "B") {
+		stage.increase(player);
+		msg.prefix(player, "§dGastwirt", "Aber hallo. Das bekommen wir schon auf die Reihe.");
+		scheduler.msgPrefix(30, player, "§dGastwirt", "Du bist hier in Admont, einem kleinen Dörfchen in der weiten Welt.");
+		scheduler.msgPrefix(60, player, "§dGastwirt", "Du siehst mir recht vertrauenswürdig aus. Vielleicht könntest du uns die eine oder andere Arbeit abnehmen.");
+		scheduler.msgPrefix(90, player, "§dGastwirt", "Geh doch in mein Haus zu meiner Frau, sie wird dir weiterhelfen.");
+	}
+}
+goto("wait");
+
+@stage3
+if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
+	entity_name = entity.getName(entity);
+	if(entity_name == "Gastwirtin") {
+		stage.increase(player);
+		msg.prefix(player, "§dGastwirtin", concat("Hallo, ", player.getName(player), " du scheinst neu zu sein. Mein Mann hat mir schon von dir erzählt."));
+		scheduler.msgPrefix(30, player, "§dGastwirtin", "Schau dich doch erstmal in Admont um und wenn du fertig bist, bring mir doch bitte etwas Wasser mit.");
+		scheduler.msgPrefix(60, player, "§dGastwirtin", "Nach diesem langen Tag bin ich sehr durstig. Hier hast du eine Wasserflasche.");
+		player.safeGiveItem(player, read.item("minecraft:glass_bottle"));
+	}
+}
+goto("wait");
+
+@stage4
+if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
+	entity_name = entity.getName(entity);
+	if(entity_name == "Gastwirtin") {
+		item = entity.getEquip(player, "hand");
+		if(text.item(item) == "{id:\"minecraft:potion\",Count:1b,tag:{Potion:\"minecraft:water\"}}") {
+			msg.prefix(player, "§dGastwirt", "Danke! Hier eine kleine Belohnung.");
+			player.removeItem(player, item);
+			msg(player, "§dQuest abgeschlossen. Belohnung: 12 Snuvis!");
+			addMoney(player, 12);
+			quest.finish(script, player);
+		}
+	}
+}
+goto("wait");

+ 1 - 1
story/spawn/stonemage.txt

@@ -175,7 +175,7 @@ if(entity_name == "Stone Mage") {
 			stage.increase(player);
 		}
 	} elseif(stage == 33) {
-		spawn_script = script.get("SpawnQuests");
+		spawn_script = script.get("QuestsSpawn");
 		map = script.getVar(spawn_script, "timestamp");
 		map.add(map, player.getUuid(player), time.getMillis());
 		msg(player, "§dQuest completed. Reward: 50 Coins!");

+ 53 - 41
system/commands.txt

@@ -266,6 +266,11 @@ set.add(butcher_set, "creeper");
 set.add(butcher_set, "enderman");
 set.add(butcher_set, "pillager");
 set.add(butcher_set, "spider");
+set.add(butcher_set, "phantom");
+set.add(butcher_set, "witch");
+set.add(butcher_set, "stray");
+set.add(butcher_set, "drowned");
+set.add(butcher_set, "wither");
 
 rank_array = array.new(25, 2);
 //Playtime
@@ -511,7 +516,7 @@ if(event == "player_move") {
 }
 if(event == "block_click") {
 	world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-	if(!isSurvWorldName(world_name) && block.hasTag(beds_tag, block)) {
+	if(action == "right" && !isSurvWorldName(world_name) && block.hasTag(beds_tag, block)) {
 		cancel = true;
 		goto("wait");
 	}
@@ -519,33 +524,37 @@ if(event == "block_click") {
 		goto("wait");
 	}
 	if(block.hasTag(chest_tag, block)) {
+		if(plot.check(block_loc, player, 16, true)) {
+			cancel = false;
+			goto("wait");
+		}
 		player_id = player.getId(player);
 		player_uuid = player.getUuid(player);
 		list = plot.get(block_loc);
-		iter = list.iterator(list);
-		access = false;
-		while(hasNext(iter)) {
-			plot = next(iter);
-			owners_list = plot.getOwners(plot);
-			isOwner = list.contains(owners_list, player_uuid);
-			canOpenChests = plot.canOpenChests(plot, player_id);
-			if(plot.isSub(plot)) {
-				if(isOwner || canOpenChests) {
-					cancel = false;
+		if(list.getSize(list) > 0) {
+			iter = list.iterator(list);
+			access = false;
+			while(hasNext(iter)) {
+				plot = next(iter);
+				canOpenChests = plot.canOpenChests(plot, player_id);
+				if(plot.isSub(plot)) {
+					if(canOpenChests) {
+						cancel = false;
+						goto("wait");
+					}
+					cancel = true;
+					msg.prefix(player, prefix_plot, "This chest is locked for you.");
 					goto("wait");
 				}
-				cancel = true;
-				msg.prefix(player, prefix_plot, "This chest is locked for you.");
-				goto("wait");
+				if(canOpenChests) {
+					access = true;
+					cancel = false;
+				}
+			
 			}
-			if(canOpenChests) {
-				access = true;
-				cancel = false;
+			if(!access) {
+				msg.prefix(player, prefix_plot, "This chest is locked for you.");
 			}
-			
-		}
-		if(!access) {
-			msg.prefix(player, prefix_plot, "This chest is locked for you.");
 		}
 		goto("wait");
 	}
@@ -1079,6 +1088,7 @@ boolean = !player.isLive(player);
 player.setLive(player, boolean);
 player.setHeadName(player);
 player.setTabName(player);
+msg.prefix(player, prefix_commands, "Live toggled.");
 goto("wait");
 
 @lightning
@@ -1182,6 +1192,7 @@ msg(player, table.get(table, "ID", text.number(p_id)));
 msg(player, table.get(table, "Rank", getRank(p_or_id)));
 msg(player, table.get(table, "PvP", hasPvpOn(p_or_id)));
 msg(player, table.get(table, "Quests", text.number(quest.getCounter(p_or_id))));
+msg(player, table.get(table, "Money", text.number(getMoney(p_or_id))));
 msg(player, table.getEnd(table));
 goto("wait");
 
@@ -1448,14 +1459,7 @@ msg(player, getSpacer());
 rank = getRank(player);
 msg(player, concat("§6Current rank: §r[", rank, "§r]"));
 msg(player, "Choose a rank:");
-a = rank.getRankArray();
-a_size = array.getSize(a);
-for(i = 0; i < a_size; i++) {
-	tech_name = a[i, 0];
-	if(rank.checkCriteria(player, tech_name)) {
-		rank.choose(player, tech_name);
-	}
-}
+rank.showAll(player);
 goto("wait");
 
 @setrank
@@ -1706,7 +1710,7 @@ goto("wait");
 @iteminfo
 item = entity.getEquip(player, "hand");
 text = text.item(item);
-text = text.replace(text, "\"","\\\"");
+text = text.replace(text, "\"", "\\\"");
 msg(player, text.clipBoard(text, text));
 goto("wait");
 
@@ -2243,12 +2247,8 @@ if(size != 1) {
 	goto("wait");
 }
 radius = list.getIndex(args, 0);
-if(!isDouble(radius)) {
-	msg.prefix(player, prefix_commands, "§rZahl erwartet");
-	goto("wait");
-}
-if(radius < 0) {
-	msg.prefix(player, prefix_commands, "§rPositive Zahl erwartet");
+if(!isDouble(radius) || radius < 0) {
+	msg.prefix(player, prefix_commands, "Positive number expected.");
 	goto("wait");
 }
 entity.removeAll("net.minecraft.entity.item.ItemEntity", entity.getLocation(player), radius);
@@ -2365,10 +2365,10 @@ if(size != 1) {
 	msg(sender, " - mails");
 	msg(sender, " - perms");
 	msg(sender, " - pumpkin");
-	msg(sender, " - quests");
 	msg(sender, " - shop");
 	msg(sender, " - sitting");
 	msg(sender, " - stats");
+	msg(sender, " - story");
 	msg(sender, " - survival");
 	msg(sender, " - ticket");
 	msg(sender, " - voxel");
@@ -2463,7 +2463,12 @@ elseif(arg0 == "ticket") {
 	}
 	script.startNamed("Ticket", "system/ticketsystem", "utils/u_general");
 }
-elseif(arg0 == "quests") {
+elseif(arg0 == "story") {
+	script = script.get("Story");
+	if(script != null) {
+		script.term(script);
+	}
+	script.startNamed("Story", "system/story", "utils/u_general");
 	script = script.get("QuestsSpawn");
 	if(script != null) {
 		script.term(script);
@@ -2896,6 +2901,7 @@ if(arg0 == "name-item") {
 	}
 	name = text.concatList(args, " ", 1, size - 1);
 	name = text.replace(name, "&", "§");
+	name = text.replace(name, "\\n", "\n");
 	item.setName(item, name);
 	msg.prefix(player, prefix_datatools, concat("Das Item trägt nun den Namen ", name, "§r."));
 	goto("wait");
@@ -4406,7 +4412,7 @@ if(arg0 == "create" || arg0 == "create3d") {
 	sub_plot = false;
 	if(!perm.has(player, "plot.other")) {
 		world_name = world.getName(world1);
-		if(!(isSurvWorldName(world_name) || world.isCreativeName(world_name))) {
+		if(!world.canUsePlots(world1)) {
 			msg.prefix(player, prefix_perms, "You have no permission in this world.");
 			goto("wait");
 		}
@@ -5193,7 +5199,7 @@ if(p == null) {
 	goto("wait");
 }
 if(!player.doesAcceptTpaRequests(p)) {
-	msg.prefix(player, prefix_commands, concat("§c", p_name, "§r rejects teleport requests."));
+ 	msg.prefix(player, prefix_commands, concat("§c", p_name, "§r rejects teleport requests."));
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(player)));
@@ -6484,6 +6490,7 @@ if(size != 1) {
 	msg(player, "§6 - server");
 	msg(player, "§6 - games");
 	msg(player, "§6 - creative");
+	msg(player, "§6 - story");
 	goto("wait");
 }
 arg0 = text.toLowerCase(list.getIndex(args, 0));
@@ -6498,6 +6505,9 @@ if(arg0 == "games") {
 } elseif(arg0 == "creative") {
 	config.set(config, "creativespawn", new_spawn);
 	msg.prefix(player, prefix_commands, "New spawn for creative world set.");
+} elseif(arg0 == "story") {
+	config.set(config, "storyspawn", new_spawn);
+	msg.prefix(player, prefix_commands, "New spawn for story world set.");
 } else {
 	goto("setspawnhelp");
 }
@@ -7203,6 +7213,7 @@ function setCommandHelps() {
 	addCommandHelp("top");
 	addCommandHelp("ride");
 	addCommandHelp("repair");
+	addCommandHelp("live");
 	
 	addCommandHelpChildPlayer("mute");
 	addCommandHelpChildPlayer("unmute");
@@ -7257,10 +7268,10 @@ function setCommandHelps() {
 	command.addHelpChild(help, command.newHelpLiteral("mails"));
 	command.addHelpChild(help, command.newHelpLiteral("perms"));
 	command.addHelpChild(help, command.newHelpLiteral("pumpkin"));
-	command.addHelpChild(help, command.newHelpLiteral("quests"));
 	command.addHelpChild(help, command.newHelpLiteral("shop"));
 	command.addHelpChild(help, command.newHelpLiteral("sitting"));
 	command.addHelpChild(help, command.newHelpLiteral("stats"));
+	command.addHelpChild(help, command.newHelpLiteral("story"));
 	command.addHelpChild(help, command.newHelpLiteral("survival"));
 	command.addHelpChild(help, command.newHelpLiteral("ticket"));
 	command.addHelpChild(help, command.newHelpLiteral("voxel"));
@@ -7381,6 +7392,7 @@ function setCommandHelps() {
 	command.addHelpChild(help, command.newHelpLiteral("server"));
 	command.addHelpChild(help, command.newHelpLiteral("games"));
 	command.addHelpChild(help, command.newHelpLiteral("creative"));
+	command.addHelpChild(help, command.newHelpLiteral("story"));
 	command.addHelp(help);
 	
 	help = command.newHelp("datatools", "datatools");

+ 1 - 1
system/creative.txt

@@ -11,7 +11,7 @@ ignoreGoto(event);
 goto("wait");
 
 @block_place
-if(block_type == "minecraft:end_portal_frame") {
+if(block_type == "minecraft:end_portal_frame" && !loc.isInSurvWorld(block_loc)) {
 	cancel = true;
 }
 goto("wait");

+ 4 - 0
system/gamerules.txt

@@ -42,6 +42,10 @@ function world.setGamerules(world) {
 	}
 	if(world_name == "story") {
 		gamerule.set.bool("doMobSpawning", world, false);
+		gamerule.set.bool("doDaylightCycle", world, false);
+		gamerule.set.bool("doWeatherCycle", world, false);
+		gamerule.set.bool("mobGriefing", world, false);
+		gamerule.set.int("randomTickSpeed", world, 0);
 	}
 	if(world_name == "world2012") {
 		gamerule.set.bool("doDaylightCycle", world, false);

+ 2 - 1
system/perms.txt

@@ -317,10 +317,11 @@ perm.registerGroup(9, "isTeam");
 perm.registerGroup(9, "tip");
 perm.registerGroup(9, "setmessage");
 
-//Owner-Rechte
+//Owner
 perm.registerGroup(10, "isOwner");
 perm.registerGroup(10, "isTeam");
 
+//Streamer
 perm.registerGroup(11, "isStreamer");
 perm.registerGroup(11, "live");
 perm.registerGroup(11, "setmessage");

+ 19 - 10
system/scheduler.txt

@@ -6,17 +6,26 @@ msg("dev", "§bScheduler §rloaded.");
 iter = list.iterator(list);
 while(hasNext(iter)) {
 	a = next(iter);
-	action = a[0];
-	
-	//Fly verändern
-	if(action == 0) {
-		player = a[1];
-		bool = a[2];
-		player.setFly(player, bool);
+	ticks = --a[1];
+	if(ticks <= 0) {
+		action = a[0];
+		
+		//Fly verändern
+		if(action == 0) {
+			player = a[2];
+			bool = a[3];
+			player.setFly(player, bool);
+		}
+		//Msg Prefix
+		if(action == 1) {
+			player = a[2];
+			prefix = a[3];
+			message = a[4];
+			msg.prefix(player, prefix, message);
+		}
+		
+		remove(iter);
 	}
-	
-	
 }
-list.clear(list);
 sgoto(1, "loop");
 wait();

+ 17 - 0
system/story.txt

@@ -0,0 +1,17 @@
+event.load("player_move");
+
+story = world.getStory();
+move_id_to_spawn = event.addMoveData(loc.new(story, -1501.5, 59, -35.5), loc.new(story, -1499, 62.5, -33), 5, -1);
+
+msg("dev", "§bStory §rloaded.");
+@wait
+wait();
+ignoreGoto(event);
+goto("wait");
+
+@player_move
+if(id == move_id_to_spawn) {
+	player.setBackPosLoc(player, world.getStorySpawn());
+	player.teleport(player, world.getServerSpawn(), false);
+}
+goto("wait");

+ 42 - 10
system/survival.txt

@@ -43,6 +43,7 @@ crops_tag = block.getTag("minecraft:crops");
 hoe_tag = item.getTag("km:hoe");
 
 overworld = world.getOverWorld();
+moveid_storyspawn = event.addMoveData(loc.new(overworld, 167, 70, 241), loc.new(overworld, 169, 72, 243), 5, -1);
 moveid_gamesspawn = event.addMoveData(loc.new(overworld, 219, 66, 253), loc.new(overworld, 223, 69, 258), 5, -1);
 move_id_afk_loop = event.addMoveData(loc.new(overworld, 208, 69, 226), loc.new(overworld, 209, 69.5, 227), 5, -1);
 config = getScriptVar("server_config");
@@ -62,6 +63,25 @@ map.add(max_ench_lvl, enchantment.get("luck_of_the_sea"), 5);
 map.add(max_ench_lvl, enchantment.get("riptide"), 5);
 map.add(max_ench_lvl, enchantment.get("unbreaking"), 5);
 map.add(max_ench_lvl, enchantment.get("quick_charge"), 5);
+map.add(max_ench_lvl, enchantment.get("protection"), 4);
+map.add(max_ench_lvl, enchantment.get("fire_protection"), 4);
+map.add(max_ench_lvl, enchantment.get("blast_protection"), 4);
+map.add(max_ench_lvl, enchantment.get("projectile_protection"), 4);
+map.add(max_ench_lvl, enchantment.get("feather_falling"), 4);
+map.add(max_ench_lvl, enchantment.get("respiration"), 3);
+map.add(max_ench_lvl, enchantment.get("thorns"), 3);
+map.add(max_ench_lvl, enchantment.get("depth_strider"), 4);
+map.add(max_ench_lvl, enchantment.get("frost_walker"), 2);
+map.add(max_ench_lvl, enchantment.get("soul_speed"), 3);
+map.add(max_ench_lvl, enchantment.get("sharpness"), 5);
+map.add(max_ench_lvl, enchantment.get("knockback"), 2);
+map.add(max_ench_lvl, enchantment.get("fire_aspect"), 2);
+map.add(max_ench_lvl, enchantment.get("looting"), 3);
+map.add(max_ench_lvl, enchantment.get("sweeping_edge"), 3);
+map.add(max_ench_lvl, enchantment.get("power"), 5);
+map.add(max_ench_lvl, enchantment.get("punch"), 2);
+map.add(max_ench_lvl, enchantment.get("impaling"), 5);
+map.add(max_ench_lvl, enchantment.get("fortune"), 3);
 
 air = "minecraft:air";
 air_item = read.item(air);
@@ -232,6 +252,14 @@ msg("dev", "§bSurvival §rloaded.");
 @wait
 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");
+	}
 	if(id == moveid_gamesspawn) {
 		player.setBackPosLoc(player, world.getServerSpawn());
 		player.teleport(player, world.getGamesSpawn(), false);
@@ -353,7 +381,7 @@ if(entity.getType(entity) == "human") {
 	}
 	if(entity_name == "Adventure") {
 		if(!player.isOnAdventure(player)) {
-			msg.prefix(player, "§5Adventure", "§rYou aren't on an adventure. Click the chest in the teleporter for an adventure.");
+			msg.prefix(player, "§5Adventure", "§rYou aren't on an adventure. Click the chest in the teleporter to start for an adventure.");
 			goto("wait");
 		}
 		player.setAdventure(player, false);
@@ -363,11 +391,11 @@ if(entity.getType(entity) == "human") {
 		}
 		player.setAdventureAmounts(player, ++adventures);
 		msg.prefix(player, "§5Adventure", "§rCongratulations, you finished your adventure, here ist your reward!");
-		if(adventures >= 10) {
+		if(adventures == 10) {
 			offerRank(player, "rank.pioneer");
-		} elseif(adventures >= 5) {
+		} elseif(adventures == 5) {
 			offerRank(player, "rank.explorer");
-		} elseif(adventures >= 1) {
+		} elseif(adventures == 1) {
 			offerRank(player, "rank.adventurer");
 		}
 		removeAdventureDisplay(player);
@@ -827,7 +855,11 @@ if(block_type == "minecraft:chest") {
 		clicked = map.getOrDefault(tp_map, player_uuid, 0);
 		now_time = time.getMillis();
 		if(now_time - clicked < 5000) {
-			msg.prefix(player, "§bTeleport", "Wait 5 seconds!");
+			msg.prefix(player, "§5Adventure", "Wait 5 seconds!");
+			goto("wait");
+		}
+		if(!player.hasClearInventory(player)) {
+			msg.prefix(player, "§5Adventure", "Your inventory needs be empty!");
 			goto("wait");
 		}
 		map.add(tp_map, player_uuid, now_time);
@@ -836,8 +868,8 @@ if(block_type == "minecraft:chest") {
 			if(!player.isOnAdventure(player)) {
 				alpha = math.random(0, 360);
 				alpha *= math.pi() / 180;
-				x = math.round(math.sin(alpha) * 8000) + 0.5;
-				z = math.round(math.cos(alpha) * 8000) + 0.5;
+				x = math.round(math.sin(alpha) * 10000) + 0.5;
+				z = math.round(math.cos(alpha) * 10000) + 0.5;
 				y = 255;
 				tp_loc = loc.new(world.getOverWorld(), x, y, z);
 				while(block.isAir(tp_loc)) {
@@ -872,13 +904,13 @@ if(block_type == "minecraft:chest") {
 			}
 		}
 		if(!temp) {
-			msg.prefix(player, "§bTeleport", "No receiver found!");
+			msg.prefix(player, "§5Adventure", "No receiver found!");
 			goto("wait");
 		}
 		
 		lore_list = item.getLore(item);
 		if(list.getSize(lore_list) != 4) {
-			msg.prefix(player, "§bTeleport", "No receiver found!");
+			msg.prefix(player, "§5Adventure", "No receiver found!");
 			goto("wait");
 		}
 		world = world.get(list.getIndex(lore_list, 0));
@@ -887,7 +919,7 @@ if(block_type == "minecraft:chest") {
 		z = read.number(list.getIndex(lore_list, 3));
 		tp_loc = loc.new(world, x, y, z);
 		if(!isATpReceiver(tp_loc)) {
-			msg.prefix(player, "§bTeleport", "No receiver found!");
+			msg.prefix(player, "§5Adventure", "No receiver found!");
 			goto("wait");
 		}
 		loc.add(tp_loc, 0.5, -3, 0.5);

+ 0 - 1
system/tables.txt

@@ -311,7 +311,6 @@ function minigame.displayResetAll() {
 		p_uuid = next(iter);
 		p = player.get(p_uuid);
 		display.reset(p);
-		displayMoney(p, getMoney(player));
 	}
 }
 

+ 93 - 22
utils/u_general.txt

@@ -112,11 +112,22 @@ function isSurvWorldName(world_name) {
 	return false;
 }
 
-function safeGiveItemPlayer(player, item) {
+function player.giveSingleItem(player, item, boolean) {
+	amount = player.getItemAmount(player, boolean, item);
+	if(amount == 0) {
+		player.safeGiveItem(player, item);
+	}
+}
+
+function player.safeGiveItem(player, item) {
 	rest_item = player.giveItem(player, item);
 	item.drop(entity.getLocation(player), rest_item);
 }
 
+function safeGiveItemPlayer(player, item) { //Deprecated
+	player.safeGiveItem(player, item);
+}
+
 function setBlockIfNotAir(location, block) {
 	if(block.getType(location) == "minecraft:air") {
 		block.set(location, block, true);
@@ -247,7 +258,7 @@ function ranking.getPoints(rankingtable, player_id) {
 //--------------------------------------------------
 
 function world.getServerSpawn() {
-	return read.location(config.getString(getScriptVar("server_config"), "serverspawn", "games:0:100:0"));
+	return read.location(config.getString(getScriptVar("server_config"), "serverspawn", "overworld:0:100:0"));
 }
 
 function world.getGamesSpawn() {
@@ -255,7 +266,11 @@ function world.getGamesSpawn() {
 }
 
 function world.getCreativeSpawn() {
-	return read.location(config.getString(getScriptVar("server_config"), "creativespawn", "games:0:100:0"));
+	return read.location(config.getString(getScriptVar("server_config"), "creativespawn", "creative:0:100:0"));
+}
+
+function world.getStorySpawn() {
+	return read.location(config.getString(getScriptVar("server_config"), "storyspawn", "story:0:100:0"));
 }
 
 function world.getOverWorld() {
@@ -270,6 +285,10 @@ function world.getCreative() {
 	return world.get("creative");
 }
 
+function world.getStory() {
+	return world.get("story");
+}
+
 function world.isCreativeName(world_name) {
 	return world_name == "creative";
 }
@@ -322,7 +341,7 @@ function player.changeInv(player, from_world, to_world) {
 					gm = "creative";
 				} else {
 					gm = "adventure";
-					scheduler.addFly(player, true);
+					scheduler.addFly(1, player, true);
 				}
 			} else {
 				gm = "survival";
@@ -356,12 +375,10 @@ function inv.saveForPlayer(sec_player, for_player_or_id, world) {
 	//Inventare
 	for(i = 0; i <= 35; i++) {
 		item_string = text.item(player.getInvSlot(sec_player, i));
-		item_string = text.replace(item_string, "\n", "\\n");
 		config.set(config, concat("slot-", i), item_string);
 	}
 	for(i = 0; i <= 26; i++) {
 		item_string = text.item(player.getEnderSlot(sec_player, i));
-		item_string = text.replace(item_string, "\n", "\\n");
 		config.set(config, concat("eslot-", i), item_string);
 	}
 	config.set(config, "offhand", text.item(entity.getEquip(sec_player, "offhand")));
@@ -401,13 +418,17 @@ function inv.loadFromPlayer(sec_player, from_player_or_id, world) {
 	//Inventare
 	for(i = 0; i <= 35; i++) {
 		item_string = config.getString(config, concat("slot-", i), "minecraft:air");
-		item_string = text.replace(item_string, "\\n", "\n");
-		player.setInvSlot(sec_player, i, read.item(item_string));
+		item = read.item(item_string);
+		if(item != null) {
+			player.setInvSlot(sec_player, i, item);
+		}
 	}
 	for(i = 0; i <= 26; i++) {
 		item_string = config.getString(config, concat("eslot-", i), "minecraft:air");
-		item_string = text.replace(item_string, "\\n", "\n");
-		player.setEnderSlot(sec_player, i, read.item(item_string));
+		item = read.item(item_string);
+		if(item != null) {
+			player.setEnderSlot(sec_player, i, item);
+		}
 	}
 	entity.setEquip(sec_player, "offhand", read.item(config.getString(config, "offhand", "minecraft:air")));
 	entity.setEquip(sec_player, "head", read.item(config.getString(config, "head", "minecraft:air")));
@@ -474,6 +495,12 @@ function quest.getFromPlayer(player) {
 	return map.get(quest_ids, player.getUuid(player));
 }
 
+function player.isQuester(player, script) {
+	script_id = script.getId(script);
+	quest_ids = getScriptVar("quest_ids");
+	return map.get(quest_ids, player.getUuid(player)) == script_id;
+}
+
 function quest.getCounter(player_or_id) {
 	config = playerdata.getSurvival(player_or_id);
 	return config.getDouble(config, "quests_solved", 0);
@@ -485,16 +512,16 @@ function quest.setCounter(player_or_id, amount) {
 	config.saveAsync(config);
 }
 
-function quest.addCounter(player_or_id, amount) {
-	config = playerdata.getSurvival(player_or_id);
+function quest.addCounter(player, amount) {
+	config = playerdata.getSurvival(player);
 	new_amount = config.getDouble(config, "quests_solved", 0) + amount;
 	config.set(config, "quests_solved", new_amount);
 	config.saveAsync(config);
-	if(new_amount >= 500) {
+	if(new_amount == 500) {
 		offerRank(player, "rank.altruist");
-	} elseif(new_amount >= 50) {
+	} elseif(new_amount == 50) {
 		offerRank(player, "rank.friend");
-	} elseif(new_amount >= 15) {
+	} elseif(new_amount == 15) {
 		offerRank(player, "rank.volunteer");
 	}
 }
@@ -1116,13 +1143,13 @@ function addAdventureDisplay(player, location) {
 //Player-Data-Utils
 //--------------------------------------------------
 
-function player.teleport(player, location, backPos) {
+function player.teleport(player, location, setBackPos) {
 	player_uuid = player.getUuid(player);
 	if(player.isOnAdventure(player)) {
 		msg(player, "[§5Adventure§r] Teleport blocked. ", text.click("[§5Cancel Adventure?§r]", concat("/stopadventure ", player)));
 		return false;
 	}
-	if(backPos) {
+	if(setBackPos) {
 		player.setBackPos(player);
 	}
 	player_loc = entity.getLocation(player);
@@ -1165,7 +1192,7 @@ function player.teleport(player, location, backPos) {
 					msg.prefix(player, "§5Party", concat(p_name, "§c is afk."));
 					continue;
 				}
-				player.teleport(p, location, backPos);
+				player.teleport(p, location, setBackPos);
 			}
 		}
 		//Quests
@@ -1351,6 +1378,16 @@ function msg.radius(prefix, message, location, radius) {
 //Player-Utils
 //--------------------------------------------------
 
+function player.hasClearInventory(player) {
+	inv = player.getInv(player);
+	for(slot = 0; slot < 36; slot++) {
+		if(item.getType(inv.getItem(inv, slot)) != "minecraft:air") {
+			return false;
+		}
+	}
+	return true;
+}
+
 function player.getJoinMessage(player_or_id) {
 	config = playerdata.getSurvival(player_or_id);
 	return config.getString(config, "message.join", "null");
@@ -2520,6 +2557,18 @@ function loc.isAir(location) {
 	return type == "minecraft:air" || type == "minecraft:cave_air";
 }
 
+function loc.isInSurvWorld(location) {
+	world_name = world.getName(loc.getWorld(location));
+	if(world_name == "overworld") {
+		return true;
+	} elseif(world_name == "the_end") {
+		return true;
+	} elseif(world_name == "the_nether") {
+		return true;
+	}
+	return false;
+}
+
 function loc.isInGamesWorld(location) {
 	return loc.getWorld(location) == world.getGames();
 }
@@ -2734,6 +2783,17 @@ function rank.choose(player, tech_name) {
 	msg(player, text.click(concat("[§", rank, "§r]"), concat("/setrank ", player.getName(player), " &", rank)));
 }
 
+function rank.showAll(player) {
+	a = rank.getRankArray();
+	a_size = array.getSize(a);
+	for(i = 0; i < a_size; i++) {
+		tech_name = a[i, 0];
+		if(rank.checkCriteria(player, tech_name)) {
+			rank.choose(player, tech_name);
+		}
+	}
+}
+
 //--------------------------------------------------
 //Perm-Utils
 //--------------------------------------------------
@@ -3306,10 +3366,21 @@ function scheduler.add(data_array) {
 	list.add(getScriptVar("scheduler_list"), data_array);
 }
 
-function scheduler.addFly(player, bool) {
-	a = array.new(3);
+function scheduler.addFly(ticks, player, bool) {
+	a = array.new(4);
 	a[0] = 0;
-	a[1] = player;
-	a[2] = bool;
+	a[1] = ticks;
+	a[2] = player;
+	a[3] = bool;
+	scheduler.add(a);
+}
+
+function scheduler.msgPrefix(ticks, player, prefix, message) {
+	a = array.new(5);
+	a[0] = 1;
+	a[1] = ticks;
+	a[2] = player;
+	a[3] = prefix;
+	a[4] = message;
 	scheduler.add(a);
 }