Browse Source

preparation for paper release

mloeschenkohl 3 years ago
parent
commit
6bb5690d91

+ 4 - 0
configs/inv_data/mailbox/4.96921431E8.snuvic

@@ -0,0 +1,4 @@
+item-0="{Count:1b,id:"minecraft:stone"}"
+item-1="{Count:1b,id:"minecraft:air"}"
+item-2="{Count:1b,id:"minecraft:air"}"
+item-3="{Count:1b,id:"minecraft:air"}"

+ 3 - 1
configs/inv_data/survival/4.96921431E8.snuvic

@@ -1,4 +1,6 @@
 BEETROOT=64.0
 CARROT=99.0
-FLINT=3840.0
+DIAMOND=980.0
+FLINT=3816.0
+PUMPKIN=64.0
 WHEAT=1128.0

+ 2 - 0
configs/player_data/survival_data/1.086995138E9.snuvic

@@ -0,0 +1,2 @@
+backpos="null"
+firstjoin=false

+ 2 - 0
configs/player_data/survival_data/1.11345452E8.snuvic

@@ -0,0 +1,2 @@
+backpos="null"
+firstjoin=false

+ 2 - 0
configs/player_data/survival_data/1.468138155E9.snuvic

@@ -0,0 +1,2 @@
+backpos="world:134.19033521922563:67.72375643115483:-60.81237245241793:147.2640380859375:-0.9470778703689575"
+firstjoin=false

+ 2 - 0
configs/player_data/survival_data/1.767533467E9.snuvic

@@ -1,2 +1,4 @@
+backpos="null"
+door_auto_close=false
 firstjoin=false
 rank="§4Owner"

+ 2 - 0
configs/player_data/survival_data/1.922602981E9.snuvic

@@ -0,0 +1,2 @@
+backpos="null"
+firstjoin=false

+ 6 - 1
configs/player_data/survival_data/4.96921431E8.snuvic

@@ -1,6 +1,11 @@
-backpos="world_the_end:2.1249811289948886:64.0:0.2926819080436539:-178.2692108154297:25.838891983032227"
+backpos="world:-281.2745413282124:1.804055289940565:-486.31546331433555:9.553924560546875:17.63433074951172"
+door_auto_close=true
 firstjoin=false
 message.join="goes hard or goes home."
 message.leave="goes home now."
+pet_damage=true
 pvp=false
 rank="§cAdmin"
+showcoords=true
+silentjoin=false
+sitting=true

+ 1 - 1
configs/server.snuvic

@@ -1,2 +1,2 @@
 mail_id=2.0
-serverspawn="world:110.8265858304995:81.0:-5.983481571867978:-179.377685546875:0.7645598649978638"
+serverspawn="world:109.3314626186463:80.0:-20.723112906491803:-133.90687561035156:3.909329891204834"

+ 21 - 22
endscript.txt

@@ -9,38 +9,37 @@ script.startNamed("Perms", "utils/u_error", "system/perms", "utils/u_general");
 script.startNamed("Playerdata", "utils/u_error", "system/player_data", "utils/u_general");
 script.startNamed("Chat", "utils/u_error", "system/chat", "utils/u_general");
 script.startNamed("Commands", "startcommands");
-//script.startNamed("Creative", "utils/u_error", "system/creative", "utils/u_general");
-script.startNamed("Copyisland", "system/copyisland", "utils/u_general");
-//script.startNamed("Damage", "utils/u_error", "system/damage", "utils/u_general");
-script.startNamed("Doors", "utils/u_error", "system/doors", "utils/u_general");
-//script.startNamed("Harvest", "utils/u_error", "survival/harvest", "utils/u_general");
-//script.startNamed("Hawkeye", "utils/u_error", "system/hawkeye", "utils/u_general");
-//script.startNamed("Herobrine", "utils/u_error", "survival/herobrine", "utils/u_general");
+	//script.startNamed("Creative", "utils/u_error", "system/creative", "utils/u_general");
+//script.startNamed("Copyisland", "system/copyisland", "utils/u_general");
+script.startNamed("Damage", "utils/u_error", "system/damage", "utils/u_general");
+//script.startNamed("Doors", "utils/u_error", "system/doors", "utils/u_general");
+	//script.startNamed("Harvest", "utils/u_error", "survival/harvest", "utils/u_general");
+	//script.startNamed("Hawkeye", "utils/u_error", "system/hawkeye", "utils/u_general");
+	//script.startNamed("Herobrine", "utils/u_error", "survival/herobrine", "utils/u_general");
 //script.startNamed("Playtime", "system/playtime");
 script.startNamed("Pumpkin", "utils/u_error", "survival/pumpkin", "utils/u_general");
 //script.startNamed("Mobspawning", "survival/mobspawning");
-//script.startNamed("Fixitems", "utils/u_error", "system/fixitems", "utils/u_general");
-//script.startNamed("Trader", "utils/u_error", "survival/trader", "utils/u_general");
-//script.startNamed("Gemstones", "utils/u_error", "survival/gemstones", "utils/u_general");
-//script.startNamed("Sitting", "utils/u_error", "system/sitting", "utils/u_general");
+	//script.startNamed("Trader", "utils/u_error", "survival/trader", "utils/u_general");
+	//script.startNamed("Gemstones", "utils/u_error", "survival/gemstones", "utils/u_general");
+script.startNamed("Sitting", "utils/u_error", "system/sitting", "utils/u_general");
 script.startNamed("Ticket", "utils/u_error", "system/tickets", "utils/u_general");
 script.startNamed("Mails", "utils/u_error", "system/mailsystem", "utils/u_general");
+script.startNamed("Market", "utils/u_error", "system/market", "utils/u_general");
 //script.startNamed("Shops", "utils/u_error", "system/chestshops", "utils/u_general");
 //script.startNamed("Survival", "utils/u_error", "survival/survival", "utils/u_general");
-//script.startNamed("Gamecenter", "utils/u_error", "system/gamecenter", "utils/u_general", "utils/u_games");
-//script.startNamed("Ranklist", "utils/u_error", "system/ranklist", "utils/u_general", "utils/u_games");
-//script.startNamed("Story", "utils/u_error", "story/story", "utils/u_general");
-//script.startNamed("QuestsAdmont", "utils/u_error", "story/admont/core", "utils/u_general", "utils/u_quest");
-//script.startNamed("QuestsSchiffbruch", "utils/u_error", "story/schiffbruch/core", "utils/u_general", "utils/u_quest");
-//script.startNamed("Workberries", "system/workberries");
-//script.startNamed("Recipes", "survival/recipes");
-//script.startNamed("Timber", "utils/u_error", "survival/timber", "utils/u_general");
+	//script.startNamed("Gamecenter", "utils/u_error", "system/gamecenter", "utils/u_general", "utils/u_games");
+	//script.startNamed("Ranklist", "utils/u_error", "system/ranklist", "utils/u_general", "utils/u_games");
+	//script.startNamed("Story", "utils/u_error", "story/story", "utils/u_general");
+	//script.startNamed("QuestsAdmont", "utils/u_error", "story/admont/core", "utils/u_general", "utils/u_quest");
+	//script.startNamed("QuestsSchiffbruch", "utils/u_error", "story/schiffbruch/core", "utils/u_general", "utils/u_quest");
+	//script.startNamed("Workberries", "system/workberries");
+	//script.startNamed("Recipes", "survival/recipes");
+	//script.startNamed("Timber", "utils/u_error", "survival/timber", "utils/u_general");
 //script.startNamed("Loom", "utils/u_error", "survival/loom", "utils/u_general");
 //script.startNamed("Lectern", "utils/u_error", "survival/lectern", "utils/u_general");
-//script.startNamed("Mobarena", "utils/u_error", "survival/mobarena", "utils/u_general");
-//script.startNamed("TicTacToe", "utils/u_error", "minigames/tictactoe/tictactoe", "utils/u_general");
+	//script.startNamed("Mobarena", "utils/u_error", "survival/mobarena", "utils/u_general");
+	//script.startNamed("TicTacToe", "utils/u_error", "minigames/tictactoe/tictactoe", "utils/u_general");
 script.startNamed("TipLoop", "utils/u_error", "system/tiploop", "utils/u_general");
-//script.startNamed("Gamerules", "system/gamerules");
 //script.startNamed("Scheduler", "utils/u_error", "system/scheduler", "utils/u_general");
 
 error.setConsolePrint(false);

+ 2 - 2
survival/harvest.txt

@@ -44,7 +44,7 @@ if(player.checkHandsForTag(player, hoe_tag)) {
 goto("wait");
 
 @block_drop
-item = living.getEquip(player);
+item = living.getEquip(player, read.slot("HAND"));
 if(!block.hasTag(block, crops_tag)) {
 	goto("wait");
 }
@@ -63,4 +63,4 @@ for(i = 0; i < list.getSize(drops); i++) {
 }
 block.setData(location, concat(block_type, "[age=0]"));
 player.damageItem(player, 1);
-goto("wait");
+goto("wait");

+ 320 - 0
survival/herobrine.txt

@@ -0,0 +1,320 @@
+event.load("player_toss");
+event.load("block_click");
+
+par = particle.get("minecraft:witch");
+prefix_money = "§2Money";
+prefix_commands = "§6Commands";
+
+max_ench_lvl = map.new();
+map.add(max_ench_lvl, enchantment.get("efficiency"), 10);
+map.add(max_ench_lvl, enchantment.get("smite"), 10);
+map.add(max_ench_lvl, enchantment.get("bane_of_arthropods"), 10);
+map.add(max_ench_lvl, enchantment.get("loyalty"), 5);
+map.add(max_ench_lvl, enchantment.get("piercing"), 5);
+map.add(max_ench_lvl, enchantment.get("lure"), 5);
+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"), 5);
+map.add(max_ench_lvl, enchantment.get("fire_protection"), 5);
+map.add(max_ench_lvl, enchantment.get("blast_protection"), 5);
+map.add(max_ench_lvl, enchantment.get("projectile_protection"), 5);
+map.add(max_ench_lvl, enchantment.get("feather_falling"), 5);
+map.add(max_ench_lvl, enchantment.get("respiration"), 5);
+map.add(max_ench_lvl, enchantment.get("thorns"), 5);
+map.add(max_ench_lvl, enchantment.get("depth_strider"), 5);
+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"), 10);
+map.add(max_ench_lvl, enchantment.get("knockback"), 5);
+map.add(max_ench_lvl, enchantment.get("fire_aspect"), 2);
+map.add(max_ench_lvl, enchantment.get("looting"), 5);
+map.add(max_ench_lvl, enchantment.get("sweeping"), 5);
+map.add(max_ench_lvl, enchantment.get("power"), 5);
+map.add(max_ench_lvl, enchantment.get("punch"), 5);
+map.add(max_ench_lvl, enchantment.get("impaling"), 5);
+map.add(max_ench_lvl, enchantment.get("fortune"), 5);
+
+msg("dev", "§bLectern §rloaded.");
+@wait
+wait();
+loc = entity.getLocation(player);
+world_name = world.getName(loc.getWorld(loc));
+ignoreGoto(event);
+goto("wait");
+
+@player_toss
+target_loc = player.getTarget(player, 5);
+block_type = block.getType(target_loc);
+if(block_type == "minecraft:lectern") {
+	cancel = true;
+	item.entity.spawn(item.entity.new(loc.mod(target_loc, 0.5, 1.5, 0.5), item));
+}
+goto("wait");
+
+@block_click
+if(hand == "OFF_HAND") {
+	goto("wait");
+}
+if(action == "left") {
+	goto("wait");
+}
+if(block_type != "minecraft:lectern") {
+	goto("wait");
+}
+itementity = entity.get(loc.mod(block_loc, 0.5, 0.9, 0.5), 0.2, "net.minecraft.entity.item.ItemEntity");
+if(itementity == null) {
+	goto("wait");
+}
+list = entity.near(itementity, 0.2);
+list.add(list, itementity);
+temp_list = list.new();
+for(i = 0; i < list.getSize(list); i++) {
+	entity = list.getIndex(list, i);
+	if(entity.getType(entity) != "item") {
+		list.add(temp_list, entity);
+	}
+}
+for(i = 0; i < list.getSize(temp_list); i++) {
+	entity = list.getIndex(temp_list, i);
+	list.remove(list, entity);
+}
+if(list.getSize(list) < 2) {
+	msg.prefix(player, prefix_commands, "Too few items on lectern.");
+	goto("wait");
+}
+a = array.new(2, 6); //0 = item, 1 = itementity, 2 = enchantments, 3 = enchanted, 4 = enchanted_book, 5 = book
+size = 0;
+for(i = 0; i < list.getSize(list); i++) {
+	entity = list.getIndex(list, i);
+	item = item.entity.get(entity);
+	size += item.getAmount(item);
+	if(size > 2) {
+		msg.prefix(player, prefix_commands, "Too many items on lectern.");
+		goto("wait");
+	}
+	map = enchantment.readFromItem(item);
+	a[i, 0] = item;
+	a[i, 1] = entity;
+	a[i, 2] = map;
+	a[i, 4] = false;
+	a[i, 5] = false;
+	if(map.getSize(map) > 0) {
+		//Verzauberte Items
+		a[i, 3] = true;
+		if(item.getType(item) == "minecraft:enchanted_book") {
+			a[i, 4] = true;
+		}
+	} else {
+		//Nicht verzauberte Items
+		a[i, 3] = false;
+		if(item.getType(item) == "minecraft:book") {
+			a[i, 5] = true;
+		}
+	}
+}
+lectern_action = null;
+if(a[0, 4] == true && a[1, 4] == true) {
+	//Beide Items sind verzauberte Bücher
+	lectern_action = 0;
+}
+elseif(a[0, 5] == true || a[1, 5] == true) {
+	//Eines der beiden Items ist ein normales Buch
+	if(a[0, 4] == true || a[1, 4] == true) {
+		//Eines der beiden Items ist ein verzaubertes Buch
+		lectern_action = 1;
+	} elseif(a[0, 3] == true || a[1, 3] == true) {
+		//Eines der beiden Items ist ein verzaubertes Item
+		lectern_action = 2;
+	}
+}
+elseif(a[0, 4] == true || a[1, 4] == true) {
+	lectern_action = 3;
+}
+if(lectern_action == null) {
+	goto("wait");
+}
+
+if(lectern_action == 0) {
+	//Verzauberungsbücher mergen
+	item1 = a[0, 0];
+	item_entity1 = a[0, 1];
+	item_entity2 = a[1, 1];
+	map1 = a[0, 2];
+	map2 = a[1, 2];
+	map_size1 = map.getSize(map1);
+	map_size2 = map.getSize(map2);
+	iter = map.iterator(map2);
+	betrag = 0;
+	extra = 0;
+	while(hasNext(iter)) {
+		element = next(iter);
+		key = map.getKey(element);
+		level1 = map.getValue(element);
+		level2 = map.getOrDefault(map1, key, 0);
+		if(level1 == level2) {
+			max_lvl = map.get(max_ench_lvl, key);
+			//max_lvl = map.getOrDefault(max_ench_lvl, key, enchantment.getMaxLevel(key));
+			if(max_lvl == null) {
+				msg.prefix(player, prefix_commands, "Unknown enchantment.");
+				goto("wait");
+			}
+			if(level1 >= max_lvl) {
+				msg.prefix(player, prefix_commands, "Maximum level already reached.");
+				goto("wait");
+			}
+			extra += 200;
+			level1++;
+		}
+		if(level2 > level1) {
+			level1 = level2;
+		}
+		map.add(map1, key, level1);
+	}
+	if(map_size1 > map_size2) {
+		map = map1;
+	} else {
+		map = map2;
+	}
+	iter = map.iterator(map);
+	while(hasNext(iter)) {
+		element = next(iter);
+		level = map.getValue(element);
+		betrag += level * 100 + extra;
+	}
+	
+	if(!world.isCreativeName(world_name)) {
+		if(!hasEnoughMoney(player.getId(player), betrag)) {
+			msg.prefix(player, prefix_money, concat("Not enough snuvis in inventory. This action costs ", text.number(betrag), " snuvis."));
+			goto("wait");
+		}
+		subMoney(player, betrag);
+	}
+	
+	enchantment.writeToItem(map1, item1);
+	item.entity.set(item_entity1, item.clone(item1));
+	entity.remove(item_entity2);
+} elseif(lectern_action == 1) {
+	//Verzauberungsbuch kopieren
+	if(a[0, 5]) {
+		book_index = 0;
+		other_index = 1;
+	} else {
+		book_index = 1;
+		other_index = 0;
+	}
+	item1 = a[book_index, 0];
+	item_entity1 = a[book_index, 1];
+	item2 = a[other_index, 0];
+	item_entity2 = a[other_index, 1];
+	map2 = a[other_index, 2];
+	
+	map_size = map.getSize(map2);
+	betrag = 100 * map_size;
+	if(!world.isCreativeName(world_name)) {
+		if(!hasEnoughMoney(player.getId(player), betrag)) {
+			msg.prefix(player, prefix_money, concat("Not enough snuvis on your account. This action costs ", text.number(betrag), " snuvis."));
+			goto("wait");
+		}
+		subMoney(player, betrag);
+	}
+	
+	item1 = read.item("minecraft:enchanted_book");
+	enchantment.writeToItem(map2, item1);
+	item.entity.set(item_entity1, item1);
+	item.entity.set(item_entity2, item.clone(item2));
+} elseif(lectern_action == 2) {
+	//Einzelne Verzauberung herunterziehen
+	if(a[0, 5]) {
+		book_index = 0;
+		other_index = 1;
+	} else {
+		book_index = 1;
+		other_index = 0;
+	}
+	item_entity1 = a[book_index, 1];
+	map1 = map.new();
+	item2 = a[other_index, 0];
+	item_entity2 = a[other_index, 1];
+	map2 = a[other_index, 2];
+
+	item1 = read.item("minecraft:enchanted_book");
+	element = next(map.iterator(map2));
+	key = map.getKey(element);
+	value = map.getValue(element);
+	map.add(map1, key, value);
+	map.remove(map2, key);
+	
+	betrag = 100 * value;
+	if(!world.isCreativeName(world_name)) {
+		if(!hasEnoughMoney(player.getId(player), betrag)) {
+			msg.prefix(player, prefix_money, concat("Not enough snuvis in your ccount. This action costs ", text.number(betrag), " snuvis."));
+			goto("wait");
+		}
+		subMoney(player, betrag);
+	}
+	
+	enchantment.writeToItem(map1, item1);
+	enchantment.writeToItem(map2, item2);
+	item.entity.set(item_entity1, item1);
+	item.entity.set(item_entity2, item.clone(item2));
+} elseif(lectern_action == 3) {
+	//Alle Verzauberungen vom Buch auf das Item übertragen
+	betrag = 0;
+	if(a[0, 4]) {
+		ench_book_index = 0;
+		other_index = 1;
+	} else {
+		ench_book_index = 1;
+		other_index = 0;
+	}
+	item1 = a[ench_book_index, 0];
+	item_entity1 = a[ench_book_index, 1];
+	map1 = a[ench_book_index, 2];
+	item2 = a[other_index, 0];
+	item_entity2 = a[other_index, 1];
+	map2 = a[other_index, 2];
+	map_size1 = map.getSize(map1);
+	map_size2 = map.getSize(map2);
+	
+	iter = map.iterator(map1);
+	while(hasNext(iter)) {
+		element = next(iter);
+		key = map.getKey(element);
+		value = map.getValue(element);
+		value2 = map.getOrDefault(map2, key, 0);
+		if(value2 > value) {
+			value = value2;
+		}
+		map.add(map2, key, value);
+	}
+	
+	if(map_size1 > map_size2) {
+		map = map1;
+	} else {
+		map = map2;
+	}
+	iter = map.iterator(map);
+	while(hasNext(iter)) {
+		element = next(iter);
+		level = map.getValue(element);
+		betrag += level * 100;
+	}
+	if(!world.isCreativeName(world_name)) {
+		if(!hasEnoughMoney(player.getId(player), betrag)) {
+			msg.prefix(player, prefix_money, concat("Not enough snuvis on your account. This action costs ", text.number(betrag), " snuvis."));
+			goto("wait");
+		}
+		subMoney(player, betrag);
+	}
+	
+	enchantment.writeToItem(map2, item2);
+	item.entity.set(item_entity2, item.clone(item2));
+	entity.remove(item_entity1);
+}
+entity.throw(item_entity1, 0, 0.3, 0);
+entity.throw(item_entity2, 0, 0.3, 0);
+particle.spawn(loc.mod(block_loc, 0.5, 1.4, 0.5), par, 20, 0, 0.25, 0.25, 0.25);
+msg.prefix(player, prefix_money, concat("This cost " , text.number(betrag), " snuvis."));
+goto("wait");

+ 124 - 0
survival/loom.txt

@@ -0,0 +1,124 @@
+event.load("player_toss");
+
+wool_tag = item.getTag("minecraft:wool");
+par = particle.get("minecraft:witch");
+
+counter_map = map.new();
+loom_list = list.new();
+
+msg("dev", "§bLoom §rloaded.");
+@wait
+wait();
+loc = entity.getLocation(player);
+world_name = world.getName(loc.getWorld(loc));
+if(world.isCreativeName(world_name)) {
+	goto("wait");
+}
+if(event == "player_toss") {
+	target_loc = player.getTarget(player, 5);
+	block_type = block.getType(target_loc);
+	if(block_type == "minecraft:loom") {
+		if(!item.hasTag(wool_tag, item) && item.getType(item) != "km:coarse_cloth") {
+			goto("wait");
+		}
+		cancel = true;
+		spawn_loc = loc.mod(target_loc, 0.5, 1.5, 0.5);
+		loom_loc = loc.mod(target_loc, 0.5, 1, 0.5);
+		item_entity = item.entity.new(spawn_loc, item);
+		item.entity.spawn(item_entity);
+		loom_id = map.getOrDefault(counter_map, loom_loc, 0) + 1;
+		map.add(counter_map, loom_loc, loom_id);
+		a = array.new(3);
+		a[0] = loom_id;
+		a[1] = player.getUuid(player);
+		a[2] = loom_loc;
+		list.add(loom_list, a);
+		sgoto(40, "loom");
+	}
+}
+goto("wait");
+
+@loom
+a = list.getIndex(loom_list, 0);
+list.removeIndex(loom_list, 0);
+loom_id = a[0];
+player_uuid = a[1];
+loom_loc = a[2];
+player = player.get(player_uuid);
+if(player == null) {
+	goto("wait");
+}
+loc_loom_id = map.get(counter_map, loom_loc);
+if(loc_loom_id != loom_id) {
+	goto("wait");
+}
+wool_amount = 0;
+wool_item = null;
+wool_item_entity = null;
+coarse_amount = 0;
+coarse_item = null;
+coarse_item_entity = null;
+list = entity.near(loom_loc, 0.05);
+iter = iterator(list);
+while(hasNext(iter)) {
+	item_entity = next(iter);
+	item = item.entity.get(item_entity);
+	type = item.getType(item);
+	amount = item.getAmount(item);
+	if(item.hasTag(wool_tag, item)) {
+		wool_amount = amount;
+		wool_item = item;
+		wool_item_entity = item_entity;
+		continue;
+	}
+	if(type == "km:coarse_cloth") {
+		coarse_amount = amount;
+		coarse_item = item;
+		coarse_item_entity = item_entity;
+		continue;
+	}
+}
+if(wool_amount == 0) {
+	goto("wait");
+}
+if(coarse_amount == 0) {
+	//only wool to coarse
+	amount = item.getAmount(wool_item);
+	output_item = read.item("km:coarse_cloth");
+	item.setAmount(output_item, amount);
+	item.entity.set(wool_item_entity, output_item);
+	entity.throw(wool_item_entity, 0, 0.3, 0);
+	particle.spawn(loc.mod(loom_loc, 0.5, 1.4, 0.5), par, 20, 0, 0.25, 0.25, 0.25);
+	loomEvent(player, loom_loc, wool_item_entity);
+	goto("wait");
+}
+//wool and coarse to cloth
+if(coarse_amount > wool_amount) {
+	amount = wool_amount;
+	wool_amount = 0;
+	coarse_amount -= amount;
+} else {
+	amount = coarse_amount;
+	coarse_amount = 0;
+	wool_amount -= amount;
+}
+item.setAmount(coarse_item, coarse_amount);
+item.setAmount(wool_item, wool_amount);
+item.entity.set(coarse_item_entity, coarse_item);
+item.entity.set(wool_item_entity, wool_item);
+
+output_item = read.item("km:cloth");
+item.setAmount(output_item, amount);
+output_item_entity = item.entity.new(loom_loc, output_item);
+item.entity.spawn(output_item_entity);
+entity.throw(output_item_entity, 0, 0.2, 0);
+particle.spawn(loc.mod(loom_loc, 0.5, 1.4, 0.5), par, 20, 0, 0.25, 0.25, 0.25);
+loomEvent(player, loom_loc, output_item_entity);
+goto("wait");
+
+function loomEvent(player, loom_loc, entity) {
+	setScriptVar("player", player);
+	setScriptVar("loom_loc", loom_loc);
+	setScriptVar("entity", entity);
+	script.callEvent("player_loom_finish");
+}

+ 35 - 0
survival/mobspawning.txt

@@ -0,0 +1,35 @@
+event.load("entity_join");
+
+x1 = 122;
+z1 = 215;
+x2 = 223;
+z2 = 314;
+
+msg("dev", "§bMobspawning §rloaded");
+@wait
+wait();
+if(event == "entity_join") {
+	if(!isLiving(entity)) {
+		goto("wait");
+	}
+	entity_type = entity.getType(entity);
+	if(entity_type == "player" || entity_type == "human" || entity_type == "nobody" || entity_type == "armor_stand") {
+		goto("wait");
+	}
+	ent_loc = entity.getLocation(entity);
+	world_name = world.getName(loc.getWorld(ent_loc));
+	if(world_name != "overworld") {
+		goto("wait");
+	}
+	x = loc.getX(ent_loc);
+	z = loc.getZ(ent_loc);
+	if(x < x1 || x > x2) {
+		goto("wait");
+	}
+	if(z < z1 || z > z2) {
+		goto("wait");
+	}
+	cancel = true;
+	goto("wait");
+}
+goto("wait");

+ 259 - 0
survival/pumpkin.txt

@@ -0,0 +1,259 @@
+event.load("entity_click");
+event.load("inv_click");
+
+items_list = list.new(); //Array-List: Alle Items mit Rezepten
+recipe_site_map = map.new();
+
+air = "minecraft:air";
+air_item = read.item("air");
+leather = "minecraft:leather";
+string = "minecraft:string";
+bronze_ingot = "km:bronze_ingot";
+copper_ingot = "km:copper_ingot";
+tin_ingot = "km:tin_ingot";
+silver_ingot = "km:silver_ingot";
+stick = "minecraft:stick";
+planks = "minecraft:oak_planks";
+cobblestone = "minecraft:cobblestone";
+iron_ingot = "minecraft:iron_ingot";
+gold_ingot = "minecraft:gold_ingot";
+diamond = "minecraft:diamond";
+book = "minecraft:book";
+birch_planks = "minecraft:birch_planks";
+dark_oak_planks = "minecraft:dark_oak_planks";
+jungle_planks = "minecraft:jungle_planks";
+spruce_planks = "minecraft:spruce_planks";
+acacia_planks = "minecraft:acacia_planks";
+coarse_dirt = "minecraft:coarse_dirt";
+gravel = "minecraft:gravel";
+wheat = "minecraft:wheat";
+grass = "minecraft:grass";
+iron_nugget = "minecraft:iron_nugget";
+hay_bundle = "km:hay_bundle";
+real_hay_block = "km:real_hay_block";
+cloth = "km:cloth";
+
+recipe.add(1, "minecraft:saddle", leather, leather, leather, leather, string, leather, air, iron_ingot, air);
+recipe.add(1, "km:bronze_helmet", bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, air, bronze_ingot, air, air, air);
+recipe.add(1, "km:bronze_chestplate", bronze_ingot, air, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot);
+recipe.add(1, "km:bronze_leggings", bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, air, bronze_ingot, bronze_ingot, air, bronze_ingot);
+recipe.add(1, "km:bronze_boots", bronze_ingot, air, bronze_ingot, bronze_ingot, air, bronze_ingot, air, air, air);
+recipe.add(1, "km:copper_helmet", copper_ingot, copper_ingot, copper_ingot, copper_ingot, air, copper_ingot, air, air, air);
+recipe.add(1, "km:copper_chestplate", copper_ingot, air, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot);
+recipe.add(1, "km:copper_leggings", copper_ingot, copper_ingot, copper_ingot, copper_ingot, air, copper_ingot, copper_ingot, air, copper_ingot);
+recipe.add(1, "km:copper_boots", copper_ingot, air, copper_ingot, copper_ingot, air, copper_ingot, air, air, air);
+recipe.add(1, "km:bookshelf_acacia", acacia_planks, acacia_planks, acacia_planks, book, book, book, acacia_planks, acacia_planks, acacia_planks);
+recipe.add(1, "km:bookshelf_birch", birch_planks, birch_planks, birch_planks, book, book, book, birch_planks, birch_planks, birch_planks);
+recipe.add(1, "km:bookshelf_dark_oak", dark_oak_planks, dark_oak_planks, dark_oak_planks, book, book, book, dark_oak_planks, dark_oak_planks, dark_oak_planks);
+recipe.add(1, "km:bookshelf_jungle", jungle_planks, jungle_planks, jungle_planks, book, book, book, jungle_planks, jungle_planks, jungle_planks);
+recipe.add(1, "km:bookshelf_spruce", spruce_planks, spruce_planks, spruce_planks, book, book, book, spruce_planks, spruce_planks, spruce_planks);
+recipe.add(1, "km:copper_block", copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot);
+recipe.add(1, "km:bronze_block", bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot);
+recipe.add(1, "km:tin_block", tin_ingot, tin_ingot, tin_ingot, tin_ingot, tin_ingot, tin_ingot, tin_ingot, tin_ingot, tin_ingot);
+recipe.add(1, "km:silver_block", silver_ingot, silver_ingot, silver_ingot, silver_ingot, silver_ingot, silver_ingot, silver_ingot, silver_ingot, silver_ingot);
+recipe.add(1, "km:cooking_pot_copper", copper_ingot, air, copper_ingot, copper_ingot, air, copper_ingot, copper_ingot, copper_ingot, copper_ingot);
+recipe.add(1, bronze_ingot, tin_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot, copper_ingot);
+recipe.add(1, copper_ingot, air, air, air, air, "km:copper_ore", air, air, air, air);
+recipe.add(1, tin_ingot, air, air, air, air, "km:tin_ore", air, air, air, air);
+recipe.add(1, silver_ingot, air, air, air, air, "km:silver_ore", air, air, air, air);
+recipe.add(1, "km:spikes_bronze", air, bronze_ingot, air, bronze_ingot, bronze_ingot, bronze_ingot, air, air, air);
+recipe.add(1, "km:spikes_copper", air, copper_ingot, air, copper_ingot, copper_ingot, copper_ingot, air, air, air);
+recipe.add(1, "km:spikes_gold", air, gold_ingot, air, gold_ingot, gold_ingot, gold_ingot, air, air, air);
+recipe.add(1, "km:spikes_iron", air, iron_ingot, air, iron_ingot, iron_ingot, iron_ingot, air, air, air);
+recipe.add(1, "km:wooden_battleaxe", air, planks, planks, air, stick, planks, stick, air, air);
+recipe.add(1, "km:stone_battleaxe", air, cobblestone, cobblestone, air, stick, cobblestone, stick, air, air);
+recipe.add(1, "km:iron_battleaxe", air, iron_ingot, iron_ingot, air, stick, iron_ingot, stick, air, air);
+recipe.add(1, "km:golden_battleaxe", air, gold_ingot, gold_ingot, air, stick, gold_ingot, stick, air, air);
+recipe.add(1, "km:diamond_battleaxe", air, diamond, diamond, air, stick, diamond, stick, air, air);
+recipe.add(1, "km:copper_battleaxe", air, copper_ingot, copper_ingot, air, stick, copper_ingot, stick, air, air);
+recipe.add(1, "km:bronze_battleaxe", air, bronze_ingot, bronze_ingot, air, stick, bronze_ingot, stick, air, air);
+recipe.add(1, "km:copper_axe", air, copper_ingot, copper_ingot, air, copper_ingot, stick, air, air, stick);
+recipe.add(1, "km:bronze_axe", air, bronze_ingot, bronze_ingot, air, bronze_ingot, stick, air, air, stick);
+recipe.add(1, "km:wooden_dagger", air, air, planks, air, stick, air, air, air, air);
+recipe.add(1, "km:stone_dagger", air, air, cobblestone, air, stick, air, air, air, air);
+recipe.add(1, "km:iron_dagger", air, air, iron_ingot, air, stick, air, air, air, air);
+recipe.add(1, "km:golden_dagger", air, air, gold_ingot, air, stick, air, air, air, air);
+recipe.add(1, "km:diamond_dagger", air, air, diamond, air, stick, air, air, air, air);
+recipe.add(1, "km:copper_dagger", air, air, copper_ingot, air, stick, air, air, air, air);
+recipe.add(1, "km:bronze_dagger", air, air, bronze_ingot, air, stick, air, air, air, air);
+recipe.add(1, "km:copper_hoe", air, copper_ingot, copper_ingot, air, air, stick, air, air, stick);
+recipe.add(1, "km:bronze_hoe", air, bronze_ingot, bronze_ingot, air, air, stick, air, air, stick);
+recipe.add(1, "km:wooden_hammer", planks, planks, planks, planks, stick, planks, air, stick, air);
+recipe.add(1, "km:stone_hammer", cobblestone, cobblestone, cobblestone, cobblestone, stick, cobblestone, air, stick, air);
+recipe.add(1, "km:iron_hammer", iron_ingot, iron_ingot, iron_ingot, iron_ingot, stick, iron_ingot, air, stick, air);
+recipe.add(1, "km:golden_hammer", gold_ingot, gold_ingot, gold_ingot, gold_ingot, stick, gold_ingot, air, stick, air);
+recipe.add(1, "km:diamond_hammer", diamond, diamond, diamond, diamond, stick, diamond, air, stick, air);
+recipe.add(1, "km:copper_hammer", copper_ingot, copper_ingot, copper_ingot, copper_ingot, stick, copper_ingot, air, stick, air);
+recipe.add(1, "km:bronze_hammer", bronze_ingot, bronze_ingot, bronze_ingot, bronze_ingot, stick, bronze_ingot, air, stick, air);
+recipe.add(1, "km:copper_shovel", air, copper_ingot, air, air, stick, air, air, stick, air);
+recipe.add(1, "km:bronze_shovel", air, bronze_ingot, air, air, stick, air, air, stick, air);
+recipe.add(1, "km:wooden_scepter", air, stick, planks, air, stick, stick, stick, air, air);
+recipe.add(1, "km:stone_scepter", air, stick, cobblestone, air, stick, stick, stick, air, air);
+recipe.add(1, "km:iron_scepter", air, stick, iron_ingot, air, stick, stick, stick, air, air);
+recipe.add(1, "km:golden_scepter", air, stick, gold_ingot, air, stick, stick, stick, air, air);
+recipe.add(1, "km:diamond_scepter", air, stick, diamond, air, stick, stick, stick, air, air);
+recipe.add(1, "km:copper_scepter", air, stick, copper_ingot, air, stick, stick, stick, air, air);
+recipe.add(1, "km:bronze_scepter", air, stick, bronze_ingot, air, stick, stick, stick, air, air);
+recipe.add(1, "km:copper_pickaxe", copper_ingot, copper_ingot, copper_ingot, air, stick, air, air, stick, air);
+recipe.add(1, "km:bronze_pickaxe", bronze_ingot, bronze_ingot, bronze_ingot, air, stick, air, air, stick, air);
+recipe.add(1, "km:wooden_stick", air, air, planks, air, stick, air, planks, air, air);
+recipe.add(1, "km:stone_stick", air, air, cobblestone, air, stick, air, cobblestone, air, air);
+recipe.add(1, "km:iron_stick", air, air, iron_ingot, air, stick, air, iron_ingot, air, air);
+recipe.add(1, "km:golden_stick", air, air, gold_ingot, air, stick, air, gold_ingot, air, air);
+recipe.add(1, "km:diamond_stick", air, air, diamond, air, stick, air, diamond, air, air);
+recipe.add(1, "km:copper_stick", air, air, copper_ingot, air, stick, air, copper_ingot, air, air);
+recipe.add(1, "km:bronze_stick", air, air, bronze_ingot, air, stick, air, bronze_ingot, air, air);
+recipe.add(1, "km:copper_sword", air, copper_ingot, air, air, copper_ingot, air, air, stick, air);
+recipe.add(1, "km:bronze_sword", air, bronze_ingot, air, air, bronze_ingot, air, air, stick, air);
+recipe.add(1, "km:mushroom_stick_raw", air, "minecraft:brown_mushroom", "minecraft:brown_mushroom", air, stick, "minecraft:red_mushroom", air, air, air);
+recipe.add(1, "km:mushroom_stick_cooked", air, air, air, air, "km:mushroom_stick_raw", air, air, air, air);
+recipe.add(1, "km:fried_egg", air, air, air, air, "minecraft:egg", air, air, air, air);
+recipe.add(1, "km:crate_acacia", acacia_planks, acacia_planks, acacia_planks, acacia_planks, acacia_planks, acacia_planks, acacia_planks, acacia_planks, acacia_planks);
+recipe.add(1, "km:crate_birch", birch_planks, birch_planks, birch_planks, birch_planks, birch_planks, birch_planks, birch_planks, birch_planks, birch_planks);
+recipe.add(1, "km:crate_big_oak", dark_oak_planks, dark_oak_planks, dark_oak_planks, dark_oak_planks, dark_oak_planks, dark_oak_planks, dark_oak_planks, dark_oak_planks, dark_oak_planks);
+recipe.add(1, "km:crate_oak", planks, planks, planks, planks, planks, planks, planks, planks, planks);
+recipe.add(1, "km:crate_jungle", jungle_planks, jungle_planks, jungle_planks, jungle_planks, jungle_planks, jungle_planks, jungle_planks, jungle_planks, jungle_planks);
+recipe.add(1, "km:crate_spruce", spruce_planks, spruce_planks, spruce_planks, spruce_planks, spruce_planks, spruce_planks, spruce_planks, spruce_planks, spruce_planks);
+recipe.add(1, "km:coarse_dirt_slab", air, air, air, coarse_dirt, coarse_dirt, coarse_dirt, air, air, air);
+recipe.add(1, "km:gravel_slab", air, air, air, gravel, gravel, gravel, air, air, air);
+recipe.add(1, "km:straw_hat", air, wheat, air, wheat, wheat, wheat, air, air, air);
+recipe.add(1, hay_bundle, grass, grass, grass, grass, grass, grass, grass, grass, grass);
+recipe.add(1, real_hay_block, hay_bundle, hay_bundle, hay_bundle, hay_bundle, hay_bundle, hay_bundle, hay_bundle, hay_bundle, hay_bundle);
+recipe.add(1, "km:real_hay_bed", air, air, air, real_hay_block, real_hay_block, real_hay_block, air, air, air);
+recipe.add(1, "km:lantern", iron_nugget, iron_nugget, iron_nugget, "minecraft:glass_pane", "minecraft:torch", "minecraft:glass_pane", iron_nugget, iron_nugget, iron_nugget);
+recipe.add(1, "km:sling", stick, string, stick, stick, air, stick, air, stick, air);
+recipe.add(4, "minecraft:string", air, air, air, air, "minecraft:white_wool", air, air, air, air);
+recipe.add(4, "km:cloth_helmet", cloth, cloth, cloth, cloth, air, cloth, air, air, air);
+recipe.add(4, "km:cloth_chestplate", cloth, air, cloth, cloth, cloth, cloth, cloth, cloth, cloth);
+recipe.add(4, "km:cloth_leggings", cloth, cloth, cloth, cloth, air, cloth, cloth, air, cloth);
+recipe.add(4, "km:cloth_boots", cloth, air, cloth, cloth, air, cloth, air, air, air);
+
+msg("dev", "§bRecipes §rloaded.");
+@wait
+wait();
+if(event == "entity_click") {
+	if(hand == "OFF_HAND") {
+		goto("wait");
+	}
+	if(entity.getType(entity) != "human") {
+		goto("wait");
+	}
+	if(entity.getName(entity) == "Recipes") {
+		recipe_menu = inv.new("333333333333333333333333333333333333333333333200000022");
+		recipe.setPage(player, recipe_menu, 1);
+		inv.open(recipe_menu, player, "Recipes");
+	}
+	goto("wait");
+}
+if(event == "inv_click") {
+	if(inv_name == "Recipes") {
+		item_type = item.getType(item);
+		if(item_type == "minecraft:air") {
+			goto("wait");
+		}
+		if(item_type == "km:return_red") {
+			page = map.getOrDefault($recipe_site_map, player.getUuid(player), 1);
+			recipe.setPage(player, inv, page);
+			goto("wait");
+		}
+		if(item_type == "minecraft:paper") {
+			name = item.getName(item);
+			if(text.contains(name, "<<") || text.contains(name, ">>")) {
+				page = removeFormat(name);
+				page = text.replace(page, "<<", "");
+				page = text.replace(page, ">>", "");
+				page = read.number(page);
+				if(inv_slot == 46) {
+					recipe.setPage(player, inv, page);
+				}
+				if(inv_slot == 47) {
+					recipe.setPage(player, inv, page);
+				}
+				goto("wait");
+			}
+		}
+		index = recipe.getIndexFromItemType(item_type);
+		if(index == null) {
+			goto("wait");
+		}
+		recipe.showRecipe(player, inv, index);
+	}
+}
+goto("wait");
+
+function recipe.add(result_amount, result_item, item1, item2, item3, item4, item5, item6, item7, item8, item9) {
+	array = array.new(11);
+	array[0] = result_amount;
+	array[1] = result_item;
+	array[2] = item1;
+	array[3] = item2;
+	array[4] = item3;
+	array[5] = item4;
+	array[6] = item5;
+	array[7] = item6;
+	array[8] = item7;
+	array[9] = item8;
+	array[10] = item9;
+	list.add($items_list, array);
+}
+
+function recipe.getIndexFromItemType(item_type) {
+	for(i = 0; i < list.getSize($items_list); i++) {
+		array = list.getIndex($items_list, i);
+		if(array[1] == item_type) {
+			return i;
+		}
+	}
+	return null;
+}
+
+function recipe.showRecipe(player, menu, index) {
+	for(i = 0; i < 48; i++) {
+		inv.setItem(menu, i, $air_item);
+	}
+	array = list.getIndex($items_list, index);
+	inv.setItem(menu, 23, read.item("km:arrow_right"));
+	inv.setItem(menu, 45, read.item("km:return_red", 1, "§fReturn to overview"));
+	inv.setItem(menu, 10, read.item(array[2]));
+	inv.setItem(menu, 11, read.item(array[3]));
+	inv.setItem(menu, 12, read.item(array[4]));
+	inv.setItem(menu, 19, read.item(array[5]));
+	inv.setItem(menu, 20, read.item(array[6]));
+	inv.setItem(menu, 21, read.item(array[7]));
+	inv.setItem(menu, 28, read.item(array[8]));
+	inv.setItem(menu, 29, read.item(array[9]));
+	inv.setItem(menu, 30, read.item(array[10]));
+	inv.setItem(menu, 25, read.item(array[1], array[0]));
+	inv.update(player);
+}
+
+function recipe.setPage(player, menu, page) {
+	map.add($recipe_site_map, player.getUuid(player), page);
+	size = list.getSize($items_list);
+	max_page = math.roundUp(size / 45);
+	if(page > max_page) {
+		return;
+	}
+	inv.setItem(menu, 45, $air_item);
+	if(page > 1) {
+		inv.setItem(menu, 46, read.item("minecraft:paper", 1, concat("§e", text.number(page - 1), " <<")));
+	} else {
+		inv.setItem(menu, 46, $air_item);
+	}
+	if(page < max_page) {
+		inv.setItem(menu, 47, read.item("minecraft:paper", 1, concat("§e>> ", text.number(page + 1))));
+	} else {
+		inv.setItem(menu, 47, $air_item);
+	}
+	max_index = size - 1;
+	for(i = 0; i < 45; i++) {
+		list_index = i + 45 * (page - 1);
+		if(list_index > max_index) {
+			inv.setItem(menu, i, $air_item);
+		} else {
+			array = list.getIndex($items_list, list_index);
+			inv.setItem(menu, i, read.item(array[1]));
+		}
+	}
+	inv.update(player);
+}

+ 2 - 2
survival/survival.txt

@@ -209,7 +209,7 @@ world = loc.getWorld(player_loc);
 if(world.getName(world) != "overworld") {
 	goto("wait");
 }
-item = living.getEquip(player, "hand");
+item = living.getEquip(player, read.slot("HAND"));
 if(item.getType(item) != "minecraft:clock") {
 	goto("wait");
 }
@@ -1211,4 +1211,4 @@ function setDeathLoc(player) {
 
 function getDeathLoc(player) {
 	return map.getOrDefault($death_loc_map, player.getUuid(player), world.getServerSpawn());
-}
+}

+ 5 - 3
survival/trader.txt

@@ -111,7 +111,9 @@ if(first_join) {
 }
 player.setHeadName(player);
 silentjoin = player.getSilentJoin(player);
-if(!silentjoin) {
+if(silentjoin) {
+	message = null;
+} else {
 	own_message = player.getJoinMessage(player);
 	if(own_message == null || !send_personally_messages) {
 		message = text.new(string.concat("§a§l> §r", fullname, " §9", list.getIndex(joinmessages, math.random(0, list.getSize(joinmessages) - 1))));
@@ -206,7 +208,7 @@ list = map.getOrDefault(causetolist, damage_type, defaultdeaths);
 if(damage_type == "player") {
 	killer = player.getFromDamageSource(damage_source);
 	killer_name = player.getName(killer);
-	item = living.getEquip(killer, "hand");
+	item = living.getEquip(killer, read.slot("HAND"));
 	if(item.hasName(item)) {
 		message1 = string.concat(death_prefix, fullname, colorcodedeath, " killed by ", killer_name, " with ");
 		message2 = item.getFullText(item);
@@ -286,4 +288,4 @@ while(hasNext(iter)) {
 	}
 }
 sgoto(1200, "minute_loop");
-goto("wait");
+goto("wait");

+ 239 - 195
system/chestshops.txt

@@ -7,32 +7,36 @@ prefix_shop = "§6Shop";
 wall_signs_tag = block.getTag("minecraft:wall_signs");
 invid_to_sign_loc = map.new();
 
-msg.text("dev", "§bChestShops §rloaded.");
-@wait
+msg.string("dev", "§bChestShops §rloaded.");
+@main
 wait();
 ignoreGoto(event);
-goto("wait");
+goto("main");
 
 @inv_click
+if(!string.contains(inv_title, "Shop")) {
+	goto("main");
+}
+inv_id = inv.getId(inv);
 if(inv_slot == 10) {
 	map.remove(invid_to_sign_loc, inv_id);
 	inv.close(player);
-	goto("wait");
+	goto("main");
 }
 sign_loc = map.get(invid_to_sign_loc, inv_id);
 if(sign_loc == null) {
 	inv.close(player);
 	msg.prefix(player, prefix_shop, "Defect shop.");
-	goto("wait");
+	goto("main");
 }
 if(!isAWallSign(sign_loc)) {
 	map.remove(invid_to_sign_loc, inv_id);
 	inv.close(player);
 	msg.prefix(player, prefix_shop, "No longer a shop.");
-	goto("wait");
+	goto("main");
 }
 factor = 1;
-if(click_type == "QUICK_MOVE") {
+if(click == "SHIFT_LEFT") {
 	factor = 8;
 }
 adminshop = isAdminShop(sign_loc);
@@ -44,18 +48,18 @@ if(!isAChest(chestloc1)) {
 	map.remove(invid_to_sign_loc, inv_id);
 	inv.close(player);
 	msg.prefix(player, prefix_shop, "No longer a shop.");
-	goto("wait");
+	goto("main");
 }
 if(inv_slot == 3) { //Buy
 	itemstack = inv.getItem(inv, 4);
 	itemstack_2 = item.clone(itemstack);
-	if(click_type == "QUICK_MOVE") {
+	if(click == "SHIFT_LEFT") {
 		item.setAmount(itemstack_2, item.getAmount(itemstack_2) * factor);
 	}
 	//Check players money
 	if(!hasEnoughMoney(player, buy_price)) {
 		msg.prefix(player, prefix_shop, "You do not have enough money.");
-		goto("wait");
+		goto("main");
 	}
 	if(!adminshop) {
 		itemamount2 = 0;
@@ -65,7 +69,7 @@ if(inv_slot == 3) { //Buy
 		itemamount1 = block.getItemAmount(chestloc1, true, itemstack);
 		if(itemamount1 + itemamount2 < item.getAmount(itemstack_2)) {
 			msg.prefix(player, prefix_shop, "Not enough items in chest.");
-			goto("wait");
+			goto("main");
 		}
 	}
 	//Items ins Inventar geben oder droppen
@@ -83,11 +87,11 @@ if(inv_slot == 3) { //Buy
 		owner_player_id = text.convert(block.getSign(sign_loc, 3));
 		if(!isDouble(owner_player_id)) {
 			msg.prefix(player, prefix_shop, "Invalid shop owner.");
-			goto("wait");
+			goto("main");
 		}
 		if(player.getNameFromId(owner_player_id) == null) {
 			msg.prefix(player, prefix_shop, "Invalid shop owner.");
-			goto("wait");
+			goto("main");
 		}
 		addMoney(owner_player_id, buy_price);
 	}
@@ -96,28 +100,28 @@ if(inv_slot == 3) { //Buy
 }  elseif(inv_slot == 6) { //Sell
 	itemstack = inv.getItem(inv, 5);
 	itemstack_2 = item.clone(itemstack);
-	if(click_type == "QUICK_MOVE") {
+	if(click == "SHIFT_LEFT") {
 		item.setAmount(itemstack_2, item.getAmount(itemstack_2) * factor);
 	}
 	if(!adminshop) {
 		owner_player_id = text.convert(block.getSign(sign_loc, 3));
 		if(!isDouble(owner_player_id)) {
 			msg.prefix(player, prefix_shop, "Invalid shop owner.");
-			goto("wait");
+			goto("main");
 		}
 		if(player.getNameFromId(owner_player_id) == null) {
 			msg.prefix(player, prefix_shop, "Invalid shop owner.");
-			goto("wait");
+			goto("main");
 		}
 		if(!hasEnoughMoney(owner_player_id, sell_price)) {
 			msg.prefix(player, prefix_shop, "Shop owner does not have enough money.");
-			goto("wait");
+			goto("main");
 		}
 	}
 	//Items des Spielers checken
 	if(player.getItemAmount(player, true, itemstack) < item.getAmount(itemstack_2)) {
 		msg.prefix(player, prefix_shop, "You do not have enough items.");
-		goto("wait");
+		goto("main");
 	}
 	//Platz in der Kiste checken
 	if(!adminshop) {
@@ -132,7 +136,7 @@ if(inv_slot == 3) { //Buy
 				msg.prefix(player, prefix_shop, "Not enough space in chest.");
 				block.subItem(chestloc1, itemstack_temp);
 				block.addItem(chestloc1, notinchest2);
-				goto("wait");
+				goto("main");
 			}
 		}
 		subMoney(owner_player_id, sell_price);
@@ -141,15 +145,15 @@ if(inv_slot == 3) { //Buy
 	player.removeItem(player, itemstack_2);
 	inv.update(player);
 }
-goto("wait");
+goto("main");
 
 @inv_close
 map.remove(invid_to_sign_loc, inv_id);
-goto("wait");
+goto("main");
 
 @custom_command
 if(!isPlayer(sender)) {
-	goto("wait");
+	goto("main");
 }
 player = sender;
 if(command == "shop") {
@@ -157,119 +161,119 @@ if(command == "shop") {
 	if(size == 0) {
 		@syntax
 		msg.prefix(player, prefix_shop, "/shop ...");
-		msg.text(player, "§6 - create §rCreates a shop");
-		msg.text(player, "§6 - buy <amount> <price> §rSet buy settings");
-		msg.text(player, "§6 - sell <amount> <price> §rSet sell settings");
-		msg.text(player, "§6 - remove <buy/sell> §rRemove settings");
+		msg.string(player, "§6 - create §rCreates a shop");
+		msg.string(player, "§6 - buy <amount> <price> §rSet buy settings");
+		msg.string(player, "§6 - sell <amount> <price> §rSet sell settings");
+		msg.string(player, "§6 - remove <buy/sell> §rRemove settings");
 		if(perm.has("adminshop", player)) {
-			msg.text(player, "§6 - admin §rSet to adminshop");
+			msg.string(player, "§6 - admin §rSet to adminshop");
 		}
-		goto("wait");
+		goto("main");
 	}
 	arg0 = text.toLowerCase(list.getIndex(args, 0));
 	if(arg0 == "create") {
 		if(size != 1) {
 			msg.prefix(player, prefix_shop, "§6/shop create");
-			goto("wait");
+			goto("main");
 		}
 		sign_loc = player.getTarget(player, 5, false, false);
 		if(!isAWallSign(sign_loc)) {
 			msg.prefix(player, prefix_shop, "Look at a sign.");
-			goto("wait");
+			goto("main");
 		}
 		chest_loc = loc.mod(sign_loc, 0, -1, 0);
 		if(!isAChest(chest_loc)) {
 			msg.prefix(player, prefix_shop, "No chest under sign.");
-			goto("wait");
+			goto("main");
 		}
 		if(!plot.check(sign_loc, player, 0, false)) {
 			msg.prefix(player, prefix_shop, "Not your plot.");
-			goto("wait");
+			goto("main");
 		}
 		block.setSign(sign_loc, 0, "[Shop]");
 		block.setSign(sign_loc, 3, text.number(player.getId(player)));
 		msg.prefix(player, prefix_shop, "§rCreated Shop.");
-		goto("wait");
+		goto("main");
 	}
 	if(arg0 == "admin") {
 		if(!perm.has("adminshop", player)) {
 			msg.prefix(player, prefix_shop, "§6No Permission.");
-			goto("wait");
+			goto("main");
 		}
 		if(size != 1) {
 			msg.prefix(player, prefix_shop, "§6/shop admin");
-			goto("wait");
+			goto("main");
 		}
 		sign_loc = player.getTarget(player, 5, false, false);
 		if(!isAWallSign(sign_loc)) {
 			msg.prefix(player, prefix_shop, "Look at a sign.");
-			goto("wait");
+			goto("main");
 		}
 		chest_loc = loc.mod(sign_loc, 0, -1, 0);
 		if(!isAChest(chest_loc)) {
 			msg.prefix(player, prefix_shop, "No chest under sign.");
-			goto("wait");
+			goto("main");
 		}
 		block.setSign(sign_loc, 0, "[Admin Shop]");
 		block.setSign(sign_loc, 3, "");
 		msg.prefix(player, prefix_shop, "§rCreated Admin Shop.");
-		goto("wait");
+		goto("main");
 	}
 	if(arg0 == "buy" || arg0 == "sell") {
 		if(size != 3) {
-			msg.prefix(player, prefix_shop, concat("§6/shop ", arg0, " <amount> <price>"));
-			goto("wait");
+			msg.prefix(player, prefix_shop, string.concat("§6/shop ", arg0, " <amount> <price>"));
+			goto("main");
 		}
 		amount = list.getIndex(args, 1);
 		price = list.getIndex(args, 2);
 		if(!isDouble(amount) || !isDouble(amount)) {
 			msg.prefix(player, prefix_shop, "§rNumber expected.");
-			goto("wait");
+			goto("main");
 		}
 		if(price < 0) {
 			msg.prefix(player, prefix_shop, "§rPositive number expected.");
-			goto("wait");
+			goto("main");
 		}
 		sign_loc = player.getTarget(player, 5, false, false);
 		if(!isAWallSign(sign_loc)) {
 			msg.prefix(player, prefix_shop, "Look at a sign.");
-			goto("wait");
+			goto("main");
 		}
 		chest_loc = loc.mod(sign_loc, 0, -1, 0);
 		if(!isAChest(chest_loc)) {
 			msg.prefix(player, prefix_shop, "No chest under sign.");
-			goto("wait");
+			goto("main");
 		}
 		if(!shop.isOwner(player, sign_loc)) {
 			msg.prefix(player, prefix_shop, "You are not the owner.");
-			goto("wait");
+			goto("main");
 		}
 		if(arg0 == "buy") {
-			block.setSign(sign_loc, 1, concat("Buy ", text.number(amount), " for ", text.number(price)));
+			block.setSign(sign_loc, 1, string.concat("Buy ", text.number(amount), " for ", text.number(price)));
 		} else {
-			block.setSign(sign_loc, 2, concat("Sell ", text.number(amount), " for ", text.number(price)));
+			block.setSign(sign_loc, 2, string.concat("Sell ", text.number(amount), " for ", text.number(price)));
 		}
 		msg.prefix(player, prefix_shop, "§rPrice set.");
-		goto("wait");
+		goto("main");
 	}
 	if(arg0 == "remove") {
 		if(size != 2) {
-			msg.prefix(player, prefix_shop, concat("§6/shop remove <buy/sell>"));
-			goto("wait");
+			msg.prefix(player, prefix_shop, "§6/shop remove <buy/sell>");
+			goto("main");
 		}
 		sign_loc = player.getTarget(player, 5, false, false);
 		if(!isAWallSign(sign_loc)) {
 			msg.prefix(player, prefix_shop, "Look at a sign.");
-			goto("wait");
+			goto("main");
 		}
 		chest_loc = loc.mod(sign_loc, 0, -1, 0);
 		if(!isAChest(chest_loc)) {
 			msg.prefix(player, prefix_shop, "No chest under sign.");
-			goto("wait");
+			goto("main");
 		}
 		if(!shop.isOwner(player, sign_loc)) {
 			msg.prefix(player, prefix_shop, "You are not the owner.");
-			goto("wait");
+			goto("main");
 		}
 		arg1 = text.toLowerCase(list.getIndex(args, 1));
 		if(arg1 == "buy") {
@@ -277,187 +281,227 @@ if(command == "shop") {
 		} elseif(arg1 == "sell") {
 			block.setSign(sign_loc, 2, "");
 		} else {
-			msg.prefix(player, prefix_shop, concat("§6/shop remove <buy/sell>"));
-			goto("wait");
+			msg.prefix(player, prefix_shop, "§6/shop remove <buy/sell>");
+			goto("main");
 		}
 		msg.prefix(player, prefix_shop, "§rPrice removed.");
-		goto("wait");
+		goto("main");
 	}
 	goto("syntax");
 }
-goto("wait");
+goto("main");
 
 @block_click
 if(block == null) {
-	goto("wait");
+	goto("main");
 }
-if(isAChest(block_loc)) {
-	chest_loc = block_loc;
-	sign_loc = loc.mod(chest_loc, 0, 1, 0);
-	if(!isAWallSign(sign_loc)) {
-		chest_loc = block.getSecChest(chest_loc);
-		if(chest_loc == null) {
-			goto("wait");
-		}
-		sign_loc = loc.mod(chest_loc, 0, 1, 0);
-		if(!isAWallSign(sign_loc)) {
-			goto("wait");
-		}
-	}
-	line0 = block.getSign(sign_loc, 0);
-	if(line0 != "[Shop]" && line0 != "[Admin Shop]") {
-		goto("wait");
+if(block.isWallSign(block)) {
+	if(!block.isShopSign(block)) {
+		goto("main");
 	}
-	if(shop.isOwner(player, sign_loc)) {
-		goto("wait");
+	chest_block = block.getShopChest(block);
+	if(chest_block == null) {
+		goto("main");
 	}
-	if(perm.has("plot.bypass", player)) {
-		goto("wait");
-	}
-	cancel = true;
-	goto("wait");
-}
-if(isAWallSign(block_loc)) {
-	sign_loc = block_loc;
-	chest_loc = loc.mod(sign_loc, 0, -1, 0);
-	if(!isAChest(chest_loc)) {
-		goto("wait");
-	}
-	line0 = block.getSign(sign_loc, 0);
-	if(line0 != "[Shop]" && line0 != "[Admin Shop]") {
-		goto("wait");
-	}
-	buy_line = block.getSign(sign_loc, 1);
-	sell_line = block.getSign(sign_loc, 2);
-	owner_player_id = text.convert(block.getSign(sign_loc, 3));
-	if(isDouble(owner_player_id)) {
-		owner_name = player.getNameFromId(owner_player_id);
+	owner_id = shop.getOwner(block);
+	if(owner_id == null) {
+		inv_title = "Admin Shop";
+	} else {
+		owner_name = player.getNameFromId(owner_id);
 		if(owner_name == null) {
 			msg.prefix(player, prefix_shop, "Invalid shop owner.");
-			goto("wait");
+			goto("main");
 		}
-		inv_title = concat("§8Shop von ", owner_name);
-	} elseif(owner_player_id == "") {
-		inv_title = "Admin Shop";
-	} else {
-		msg.prefix(player, prefix_shop, "Invalid shop owner.");
-		goto("wait");
+		inv_title = string.concat("§8Shop of ", owner_name);
 	}
-	item_stack = shop.getItem(chest_loc);
+	item_stack = shop.getItem(chest_block);
 	if(item_stack == null) {
-		buy_line = "";
-		sell_line = "";
-	}
-	inv = inv.new("222320000002322203");
-	if(buy_line != "") {
-		split_list = text.split(" ", buy_line);
-		buy_amount = list.getIndex(split_list, 1);
-		if(!isDouble(buy_amount)) {
-			msg.prefix(player, prefix_shop, "Invalid buy amount.");
-			goto("wait");
-		}
-		buy_amount = read.number(buy_amount);
-		buy_price = list.getIndex(split_list, 3);
-		if(!isDouble(buy_price)) {
-			msg.prefix(player, prefix_shop, "Invalid buy price.");
-			goto("wait");
-		}
-		buy_price = read.number(buy_price);
-		buy_stack = item.clone(item_stack);
-		item.setAmount(buy_stack, buy_amount);
-		a = money.split(buy_price);
-		gold = a[0];
-		silver = a[1];
-		bronze = a[2];
-		index = 2;
-		if(bronze != 0) {
-			inv.setItem(inv, index--, read.item("km:coin_copper", bronze));
-		}
-		if(silver != 0) {
-			inv.setItem(inv, index--, read.item("km:coin_silver", silver));
-		}
-		if(gold != 0) {
-			inv.setItem(inv, index, read.item("km:coin_gold", gold));
-		}
-		inv.setItem(inv, 3, read.item("km:arrow_right", 1, "§rBuy"));
-		inv.setItem(inv, 4, buy_stack);
-	}
-	if(sell_line != "") {
-		split_list = text.split(" ", sell_line);
-		sell_amount = list.getIndex(split_list, 1);
-		if(!isDouble(sell_amount)) {
-			msg.prefix(player, prefix_shop, "Invalid buy amount.");
-			goto("wait");
-		}
-		sell_amount = read.number(sell_amount);
-		sell_price = list.getIndex(split_list, 3);
-		if(!isDouble(sell_price)) {
-			msg.prefix(player, prefix_shop, "Invalid buy price.");
-			goto("wait");
-		}
-		sell_price = read.number(sell_price);
-		sell_stack = item.clone(item_stack);
-		item.setAmount(sell_stack, sell_amount);
-		a = money.split(sell_price);
-		gold = a[0];
-		silver = a[1];
-		bronze = a[2];
-		inv.setItem(inv, 5, sell_stack);
-		inv.setItem(inv, 6, read.item("km:arrow_right", 1, "§rSell"));
-		index = 7;
-		if(bronze != 0) {
-			inv.setItem(inv, index++, read.item("km:coin_copper", bronze));
-		}
-		if(silver != 0) {
-			inv.setItem(inv, index++, read.item("km:coin_silver", silver));
-		}
-		if(gold != 0) {
-			inv.setItem(inv, index, read.item("km:coin_gold", gold));
-		}
+		msg.prefix(player, prefix_shop, "No item found.");
+		goto("main");
 	}
+	inv = inv.new("222320000002322203", inv_title);
+	shop.setBuyElement(inv, block, item.clone(item_stack));
+	shop.setSellElement(inv, block, item.clone(item_stack));
 	inv.setItem(inv, 10, read.item("km:cross_red", 1, "§rCancel"));
-	inv.open(inv, player, inv_title);
+	inv.open(inv, player);
 	map.add(invid_to_sign_loc, inv.getId(inv), sign_loc);
 }
-goto("wait");
+goto("main");
+
+function shop.setBuyElement(sign_block, inv, item_stack) {
+	buy_line = block.getSign(sign_block, 1);
+	split_list = string.split(" ", buy_line);
+	buy_amount = list.getIndex(split_list, 1);
+	if(!isDouble(buy_amount)) {
+		return;
+	}
+	buy_price = list.getIndex(split_list, 3);
+	if(!isDouble(buy_price)) {
+		return;
+	}
+	item.setAmount(item_stack, buy_amount);
+	a = money.split(buy_price);
+	gold = a[0];
+	silver = a[1];
+	bronze = a[2];
+	index = 2;
+	if(bronze != 0) {
+		inv.setItem(inv, index--, read.item("km:coin_copper", bronze));
+	}
+	if(silver != 0) {
+		inv.setItem(inv, index--, read.item("km:coin_silver", silver));
+	}
+	if(gold != 0) {
+		inv.setItem(inv, index, read.item("km:coin_gold", gold));
+	}
+	inv.setItem(inv, 3, read.item("km:arrow_right", 1, "§rBuy"));
+	inv.setItem(inv, 4, item_stack);
+}
 
-function shop.getItem(chest_loc) {
-	inv = block.getInv(chest_loc);
+function shop.setSellElement(sign_block, inv, item_stack) {
+	sell_line = block.getSign(sign_block, 2);
+	split_list = string.split(" ", sell_line);
+	sell_amount = list.getIndex(split_list, 1);
+	if(!isDouble(sell_amount)) {
+		return;
+	}
+	sell_price = list.getIndex(split_list, 3);
+	if(!isDouble(sell_price)) {
+		return;
+	}
+	sell_stack = item.clone(item_stack);
+	item.setAmount(sell_stack, sell_amount);
+	a = money.split(sell_price);
+	gold = a[0];
+	silver = a[1];
+	bronze = a[2];
+	index = 7;
+	if(bronze != 0) {
+		inv.setItem(inv, index++, read.item("km:coin_copper", bronze));
+	}
+	if(silver != 0) {
+		inv.setItem(inv, index++, read.item("km:coin_silver", silver));
+	}
+	if(gold != 0) {
+		inv.setItem(inv, index, read.item("km:coin_gold", gold));
+	}
+	inv.setItem(inv, 5, sell_stack);
+	inv.setItem(inv, 6, read.item("km:arrow_right", 1, "§rSell"));
+}
+
+
+function shop.getItem(chest_block) {
+	inv = block.getInventory(chest_block);
+	air = item.getAir();
 	for(i = 0; i < inv.getSize(inv); i++) {
-		item_stack = item.clone(inv.getItem(inv, i));
-		if(item.getType(item_stack) != "minecraft:air") {
-			return item_stack;
+		item_stack = inv.getItem(inv, i);
+		if(item.getType(item_stack) != air) {
+			return item.clone(item_stack);
 		}
 	}
 	return null;
 }
 
-function isAChest(location) {
-	return block.getType(location) == "minecraft:chest";
+function block.isChest(block) {
+	return block.isType(block, "minecraft:chest");
 }
 
-function isAWallSign(location) {
-	if(location == null) {
+function block.isWallSign(block) {
+	if(block == null) {
 		return false;
 	}
-	return block.hasTag($wall_signs_tag, block.get(location));
+	return block.hasTag($wall_signs_tag, block);
 }
 
-function shop.isOwner(player, sign_loc) {
-	owner_player_id = text.convert(block.getSign(sign_loc, 3));
-	if(owner_player_id == "") {
-		return perm.has("adminshop", player);
+function block.getSignAbove(block) {
+	sign_loc = loc.mod(block.getLocation(block), 0, 1, 0);
+	sign_block = block.get(sign_loc);
+	if(block.isAWallSign(sign_block)) {
+		return sign_block;
 	}
-	if(isDouble(owner_player_id)) {
-		owner_name = player.getNameFromId(owner_player_id);
-		if(owner_name == null) {
-			return false;
+	return null;
+}
+
+function block.getSecChest(block) {
+	loc = block.getLocation(block);
+	mod_block = block.get(loc.mod(loc, 1, 0, 0));
+	if(block.isChest(mod_block)) {
+		return mod_block;
+	}
+	mod_block = block.get(loc.mod(loc, 0, 0, 1));
+	if(block.isChest(mod_block)) {
+		return mod_block;
+	}
+	mod_block = block.get(loc.mod(loc, -1, 0, 0));
+	if(block.isChest(mod_block)) {
+		return mod_block;
+	}
+	mod_block = block.get(loc.mod(loc, 0, 0, -1));
+	if(block.isChest(mod_block)) {
+		return mod_block;
+	}
+	return null;
+}
+
+function block.getShopChest(sign_block) {
+	sign_loc = block.getLocation(sign_block);
+	chest_loc = loc.mod(sign_loc, 0, -1, 0);
+	chest_block = block.get(chest_loc);
+	if(block.isChest(chest_block)) {
+		return chest_block;
+	}
+	return null;
+}
+
+function block.getShopSign(chest_block) {
+	sign_block == block.getSignAbove(chest_block);
+	if(sign_block == null) {
+		chest_block = block.getSecChest(chest_block);
+		sign_block == block.getSignAbove(chest_block);
+		if(sign_block == null) {
+			return null;
 		}
-		return owner_player_id == player.getId(player);
+	}
+	if(block.isShopSign(sign_block)) {
+		return sign_block;
+	}
+	return null;
+}
+
+function block.isShopSign(sign_block) {
+	line0 = string.text(block.getSign(sign_block, 0));
+	if(line0 == "[Shop]") {
+		return true;
+	}
+	if(line0 == "[Admin Shop]") {
+		return true;
 	}
 	return false;
 }
 
+function shop.getOwner(sign_block) {
+	owner_id = read.number(block.getSign(sign_block, 3));
+	if(owner_id == null) {
+		return null;
+	}
+	return owner_id;
+}
+
+function shop.isOwner(player, sign_block) {
+	if(player.hasBypass(player)) {
+		return true;
+	}
+	owner_id = read.number(block.getSign(sign_block, 3));
+	if(owner_id == null) {
+		return perm.has("adminshop", player);
+	}
+	owner_name = player.getNameFromId(owner_id);
+	if(owner_name == null) {
+		return false;
+	}
+	return owner_id == player.getId(player);
+}
+
 function shop.getItemAmount(item) {
 	if(item.getType(item) == "km:coin_gold") {
 		return item.getAmount(item) * 64 * 64;

File diff suppressed because it is too large
+ 242 - 251
system/commands.txt


+ 41 - 42
system/copyisland.txt

@@ -1,7 +1,7 @@
-event.load("animal_tame");
-event.load("living_hurt");
-event.load("living_heal");
-event.load("entity_join");
+event.load("living_tame");
+event.load("entity_damage");
+event.load("entity_heal");
+event.load("entity_spawn");
 
 entities_list = list.new();
 
@@ -19,51 +19,45 @@ set.add(permanent_tamed_name, "skeleton_horse");
 set.add(permanent_tamed_name, "zombie_horse");
 set.add(permanent_tamed_name, "parrot");
 
-msg("dev", "§bDamage §rloaded.");
+msg.string("dev", "§bDamage §rloaded.");
 @wait
 wait();
 ignoreGoto(event);
 goto("wait");
 
-@animal_tame
-if(isLiving(animal) && !isPlayer(animal)) {
+@living_tame
+if(!isPlayer(living_entity)) {
 	if(list.getSize(entities_list) == 0) {
-		sgoto(1, "sgoto_updateEntityName");
+		sgoto(2, "sgoto_updateEntityName");
 	}
-	list.add(entities_list, animal);
+	list.add(entities_list, living_entity);
 }
 goto("wait");
 
-@entity_join
+@entity_spawn
 if(isLiving(entity) && !isPlayer(entity)) {
 	updateEntityName(entity);
 }
 goto("wait");
 
-@living_heal
-cancel = true;
-if(heal_amount <= 0) {
+@entity_heal
+if(isPlayer(entity) || !isLiving(entity)) {
 	goto("wait");
 }
-health = living.getHealth(living_entity);
-if(health <= 0) {
-	goto("wait");
-}
-new_health = health + heal_amount;
-living.setHealth(living_entity, new_health);
-if(isLiving(living_entity) && !isPlayer(living_entity)) {
-	updateEntityName(living_entity);
+if(list.getSize(entities_list) == 0) {
+	sgoto(2, "sgoto_updateEntityName");
 }
+list.add(entities_list, entity);
 goto("wait");
 
-@living_hurt
-if(isPlayer(living_entity) || !isLiving(living_entity)) {
+@entity_damage
+if(isPlayer(entity) || !isLiving(entity)) {
 	goto("wait");
 }
 if(list.getSize(entities_list) == 0) {
-	sgoto(1, "sgoto_updateEntityName");
+	sgoto(2, "sgoto_updateEntityName");
 }
-list.add(entities_list, living_entity);
+list.add(entities_list, entity);
 goto("wait");
 
 @sgoto_updateEntityName
@@ -74,38 +68,43 @@ while(hasNext(iter)) {
 list.clear(entities_list);
 goto("wait");
 
-function updateEntityName(living_entity) {
-	if(!isLiving(living_entity)) {
+function updateEntityName(entity) {
+	if(!isLiving(entity)) {
 		return;
 	}
+	living_entity = entity;
 	entity_type = entity.getType(living_entity);
-	if(entity_type == "nobody" || entity_type == "armor_stand" || entity_type == "human") {
+	if(entity_type == "armor_stand" || entity_type == "human") {
 		return;
 	}
 
 	entity_name = entity.getName(living_entity);
+	if(entity_name == null) {
+		string_name = null;
+	} else {
+		string_name = string.text(entity_name);
+	}
 	max_health = living.getMaxHealth(living_entity);
-	health = text.number(math.round(living.getHealth(living_entity)));
-	max_health = text.number(math.roundComma(max_health, 1));
+	health = string.number(math.round(living.getHealth(living_entity)));
+	max_health = string.number(math.roundComma(max_health, 1));
 	
-	heart_index = text.indexOf(entity_name, "❤", 0);
+	heart_index = string.indexOf(string_name, "❤", 0);
 	if(heart_index == -1) {
 		//Kein Herz gefunden
-		setEntityName(living_entity, health, max_health, entity_name);
+		setEntityName(living_entity, health, max_health, string_name);
 		return;
 	}
-		
-	next_new_line = text.indexOf(entity_name, "\n", heart_index);
-	if(next_new_line == -1) {
-		//Rechts vom Herz keine New-Line gefunden
+	
+	if(heart_index == 2) {
+		//Links vom Herz kein Name
 		setEntityName(living_entity, health, max_health, null);
 		return;
 	}
-	entity_name = text.subString(entity_name, next_new_line + 1, text.length(entity_name));
-	setEntityName(living_entity, health, max_health, entity_name);
+	string_name = string.subString(string_name, 0, heart_index - 2);
+	setEntityName(living_entity, health, max_health, string_name);
 }
 
-function setEntityName(living_entity, health, max_health, entity_name) {
+function setEntityName(living_entity, health, max_health, string_name) {
 	entity_type = entity.getType(living_entity);
 	permanent = false;
 	if(set.contains($permanent_name, entity_type)) {
@@ -115,9 +114,9 @@ function setEntityName(living_entity, health, max_health, entity_name) {
 			permanent = true;
 		}
 	}
-	if(entity_name == null) {
-		entity.setName(living_entity, concat(health, "/", max_health, " §c❤"), permanent);
+	if(string_name == null) {
+		entity.setName(living_entity, text.new(string.concat("§c❤§r", health)), permanent);
 		return;
 	}
-	entity.setName(living_entity, concat(health, "/", max_health, " §c❤\n", entity_name), permanent);
+	entity.setName(living_entity, text.merge(text.new(string.trim(string_name)), text.new(string.concat(" §c❤§r", health))), permanent);
 }

+ 3 - 0
system/doors.txt

@@ -32,4 +32,7 @@ table.setsize(".", 2);
 table.setsize("i", 2);
 table.setsize(":", 2);
 
+table.setEmpty1(string.concat(string.fromCode(63502), " "));
+table.setEmpty2(string.concat(string.fromCode(63501), " "));
+
 term();

+ 2 - 1
system/mailsystem.txt → system/mailsystem.txt

@@ -114,6 +114,7 @@ function updateItem(inv, slot, material) {
     inv.setItem(inv, slot, newItem(material));
 }   
 
+msg.string("dev", "§bMarket §rloaded.");
 @loop
 wait();
 ignoreGoto(event);
@@ -121,7 +122,7 @@ goto("loop");
 
 @save
 config.saveAsync(stock);
-print("save");
+//print("save");
 save = false;
 goto("loop");
 

+ 4 - 0
system/perms.txt

@@ -79,6 +79,7 @@ perm.addToGroup(2, "setservermessage");
 perm.addToGroup(2, "scoreboard");
 perm.addToGroup(2, "adminshop");
 perm.addToGroup(2, "entities");
+perm.addToGroup(2, "logo");
 perm.addToGroup(2, "tag");
 perm.addToGroup(2, "team");
 perm.addToGroup(2, "mailbox.other");
@@ -193,6 +194,7 @@ perm.addToGroup(2, "quest");
 perm.addToGroup(2, "debug");
 perm.addToGroup(2, "user.other");
 perm.addToGroup(2, "skills.other");
+perm.addToGroup(2, "plot.bypass");
 
 perm.addToGroup(3, "isMod");
 perm.addToGroup(3, "isTeam");
@@ -213,6 +215,7 @@ perm.addToGroup(3, "nickname");
 perm.addToGroup(3, "playtime.year");
 perm.addToGroup(3, "playtime.month");
 perm.addToGroup(3, "playtime.other");
+perm.addToGroup(3, "logo");
 perm.addToGroup(3, "give");
 perm.addToGroup(3, "grow");
 perm.addToGroup(3, "home.other");
@@ -317,6 +320,7 @@ perm.addToGroup(7, "tip");
 perm.addToGroup(7, "setblock");
 perm.addToGroup(7, "summon");
 perm.addToGroup(7, "human");
+perm.addToGroup(7, "logo");
 perm.addToGroup(7, "fly");
 perm.addToGroup(7, "gamemode");
 perm.addToGroup(7, "skull");

+ 24 - 19
system/player_data.txt

@@ -1,44 +1,48 @@
-event.load("entity_mount");
+event.load("entity_dismount");
 event.load("block_click");
 
 sitting = map.new();
 stairs_tag = block.getTag("minecraft:stairs");
-half_property = block.getProperty("half");
 
-msg("dev", "§bSitting §rloaded.");
+msg.string("dev", "§bSitting §rloaded.");
 @wait
 wait();
 ignoreGoto(event);
 goto("wait");
 
-@entity_mount
-if(isPlayer(rider)) {
-	player = rider;
-	if(map.contains(sitting, player)) {
-		entity.remove(map.get(sitting, player));
-		map.remove(sitting, player);
+@entity_dismount
+if(isPlayer(entity)) {
+	player = entity;
+	player_uuid = player.getUuid(player);
+	if(map.contains(sitting, player_uuid)) {
+		entity.remove(map.get(sitting, player_uuid));
+		map.remove(sitting, player_uuid);
 	}
 }
 goto("wait");
 
 @block_click
-if(hand == "OFF_HAND") {
+if(block == null) {
 	goto("wait");
 }
-if(block.hasTag(stairs_tag, block)) {
-	if(action == "left") {
+if(hand == read.slot("OFF_HAND")) {
+	goto("wait");
+}
+if(block.hasTag(block, stairs_tag)) {
+	if(action != "RIGHT_CLICK_BLOCK") {
 		goto("wait");
 	}
-	if(block.property.getValue(block_loc, half_property) != "bottom") {
+	if(block.getBisectedHalf(block) != "BOTTOM") {
 		goto("wait");
 	}
-	if(item.getType(living.getEquip(player, "hand")) != "minecraft:air") {
+	if(item.getType(living.getHand(player)) != material.getAir()) {
 		goto("wait");
 	}
-	if(!loc.isAir(loc.mod(block_loc, 0, 1, 0))) {
+	if(!block.isAir(block.mod(block, 0, 1, 0))) {
 		goto("wait");
 	}
-	if(map.contains(sitting, player)) {
+	player_uuid = player.getUuid(player);
+	if(map.contains(sitting, player_uuid)) {
 		goto("wait");
 	}
 	if(player.hasMinigame(player)) {
@@ -47,8 +51,9 @@ if(block.hasTag(stairs_tag, block)) {
 	if(!player.hasSittingActivated(player)) {
 		goto("wait");
 	}
-	entity = entity.spawn("km:nobody", loc.mod(block_loc, 0.5, 0, 0.5), "{NoGravity:true}");
-	map.add(sitting, player, entity);
+	entity = read.spawnMob(block.getLocation(block), "{Facing:1b,Invisible:1b,Invulnerable:1b,OnGround:0b,Rotation:[0.0f,-90.0f],id:\"minecraft:item_frame\"}");
+	entity.frame.setfixed(entity, true);
+	map.add(sitting, player_uuid, entity);
 	entity.mount(player, entity);
 }
-goto("wait");
+goto("wait");

+ 124 - 0
system/tickets.txt

@@ -0,0 +1,124 @@
+print("test");
+
+wand = material.get("WOODEN_AXE");
+main_hand = read.slot("HAND");
+
+event.load("custom_command");
+event.load("block_click");
+command.add("/set");
+
+pos1 = map.new();
+pos2 = map.new();
+
+loc1 = null;
+loc2 = null;
+
+
+help = command.newhelp("/set", "/set");
+command.addHelpChild(help, command.newHelpString("block_data", true));
+command.addHelp(help);
+command.sendhelp();
+
+function addPos1(loc) {
+    map.add($pos1, player.getUUID($player), loc);
+}
+
+function addPos2(loc) {
+    map.add($pos2, player.getUUID($player), loc);
+}
+
+function send(msg) {
+    msg($player, text.new(string.concat("[§6WorldEdit§r] ", msg)));
+}
+
+function checkMarkings() {
+    uuid = player.getUUID($player);
+    $loc1 = map.get($pos1, uuid);
+    $loc2 = map.get($pos2, uuid);
+    if($loc1 == null || $loc2 == null) {
+        send("Missing position");
+        return true;
+    }
+    if(loc.distance($loc1, $loc2) > 100) {
+        send("Too much distance");
+        return true;
+    }
+    loc.sort($loc1, $loc2);
+    return false;
+}
+
+function getData(raw_data_string) {
+    data_string = raw_data_string;
+    if(!string.startsWith(data_string, "minecraft:", 0)) {
+        data_string = string.concat("minecraft:", data_string);
+    }
+    data = read.blockData(data_string);
+    if(data == null) {
+        send(string.concat("'", raw_data_string, "' is not valid blockdata."));
+    }
+    return data;
+}
+
+// event loop
+@loop
+wait();
+igoto(event);
+goto("loop");
+
+@block_click
+if(block != null && hand == main_hand && perm.has("worldedit", player)) {
+    item = living.getEquip(player, main_hand);
+    if(item.getType(item) == wand) {
+        if(action == "LEFT_CLICK_BLOCK") {
+            loc = block.getLocation(block);
+            addPos1(loc);
+            send(string.concat("§6Pos 1: §r", 
+                string.number(loc.getBlockX(loc)), "§6 | §r", 
+                string.number(loc.getBlockY(loc)), "§6 | §r", 
+                string.number(loc.getBlockZ(loc))
+                ));
+            cancel = true;
+        } elseif(action == "RIGHT_CLICK_BLOCK") {
+            loc = block.getLocation(block);
+            addPos2(loc);
+            send(string.concat("§6Pos 2: §r", 
+                string.number(loc.getBlockX(loc)), "§6 | §r", 
+                string.number(loc.getBlockY(loc)), "§6 | §r", 
+                string.number(loc.getBlockZ(loc))
+                ));
+            cancel = true;
+        }
+    }
+}
+goto("loop");
+
+@custom_command
+if(!isPlayer(sender)) {
+    msg(sender, "§cWorld Edit commands must be used by a player.");
+    goto("loop");
+}
+player = sender;
+if(string.startsWith(command, "/", 0)) {
+    igoto(string.substring(command, 1, string.length(command)));
+}
+goto("loop");
+
+@set
+if(checkMarkings()) {
+    goto("loop");
+}
+if(list.getSize(args) <= 0) {
+    send("//set <type>");
+    goto("loop");
+}
+block_data = getData(list.get(args, 0));
+if(block_data == null) {
+    goto("loop");
+}
+iter = loc.iterator(loc1, loc2);
+while(hasNext(iter)) {
+    loc = next(iter);
+    block.setData(block.get(loc), block_data);
+}
+goto("loop");
+

+ 37 - 0
test.txt

@@ -0,0 +1,37 @@
+error(true);
+p = read.player("kajetanjohannes");
+loc = entity.getLocation(p);
+
+/*event.load("human_damage");
+@loop
+wait();
+cancel = false;
+goto("loop");*/
+
+entity = player.getTargetEntity(p, 50);
+if(entity != null) {
+    human.setName(entity, "Wusler24");
+    //print("yes");
+    /*human.setSkin(entity, "ewogICJ0aW1lc3RhbXAiIDogMTYzOTY3MTc5ODEyNywKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdUlJZXQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWZkOWFjZTM2MmMxYzFmOTg0ZTAxYmU2ZTZjNTRhYWY0MTI1ZDBmNTc5ZDQyNTgyOTdiZWUxMjcyMjI0NDNmNCIKICAgIH0KICB9Cn0", "qFMdFP0a8dLDQvlsUpGAo5fNgjmccphiE7HNdLPe12UKtZoA8xb7noxXjPyodseX/LddrRzz63KiEGphnjjl1p4TvbuIdngA4kCFKHhCG7gmWWO/mGPpv5q9nW0WtUgHwe/MeEyqyrLri4HPxsL6UMFuzXoAMdx61p1marLmsBcPb4bNtmFKMn6lt+cG++p9gYO74vL22RhNubH/PDjCvFqVZi8TZOj/pCq6/BG3n/M4PRnHQ36nOMN2cT2JM5d2As8wnepCaDV+KRjTtVg7Sws+Sl80iS/TWMzRsSUkZB5PQVCIdpfyD1JOuhV5NVo0+iqUGdEKmwY/VltlAJ/Mz/BNobGzxV640t9cutpXq6PVhMRxSXtaOT0mSzjJla71nc34KOQverNnOCsgj3AZ6HA+jJ2xK2fC1etGIF0Y/M7QZHM6jM3fE0htF9odQowue0S/9/ram7LhXrcWA7mzSDVpLN8jEjIGC25uEEG6StRhYQih0N/wyrYKR66OsMQTpXcnoacl9tiHwFz7XiknXHKY2SliCXVHKQSHy9aIBLnxZPeDYPj5N1xvK4f3788LAiXyFDbrQ1243WCgVuJwIrh1Tg1qSUDuJx1GEevWfiazySqOFhhw1MwmjJXFOp7dz+VKKt+rjEBjq+cTkvskDZqpEINxqcNP1hnImiszMY0=");
+    */
+    human.setSkin(entity, "ewogICJ0aW1lc3RhbXAiIDogMTYzODkyMDIxNTE1MSwKICAicHJvZmlsZUlkIiA6ICI0NWY3YTJlNjE3ODE0YjJjODAwODM5MmRmN2IzNWY0ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJfSnVzdERvSXQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTNkMDQ1Y2QzMDIxODRkMjlhMmEzNmZlM2YyYmVhYmI5MGU3MmIyYjA3NTJmNzgzMmU5MDkzMjRiYWQwMjY5ZiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", "NCRVEz6H/aJtN4Ni7Ec9GqXwEIOhaFpzWM8hfbLhrD3+X9TcADuHKt+R7rgVNfxXZB2X14IekBckJnMjAo0Ofhn4RGI2DUMnjiwQsd7raFjgmenuuoJRIvU5ylnoNxQqa2jy7ac1HMzeW+aYIlVo+viAtojmYs5tXByDfyGY2HOd6igjRL7iokoGfb9gOxlmQriDkNXhT0frMatwINT6bF3cBpyji1VoWVUOzPQFDeQWsW07FQCjIGd5sBUFUm7a9m9mjeZA9QFVS/y6v4Q3fAaRXBp3j1QT59fkkSnO3rAiWpqoz9VDrYgYlPRarMF6YzsbfURGZil4S6e8Z761FJnTgUXuBCO1E0JsMb53HPamSYdI6MlCQ1b+dGv4Ewm/MSWKMw5IopmM8a4FTwuojiZPdompBQJxObOljbYgKpTWnZ74WTHwpFp0/Ku2sB1M0joyllImhtukiwxYcETUHefyBx97KQXlEVbnzGYFmdNFSSoTpT+Mc27yCMjhgW5zT6Z5yTLiXJ+xaHw2lplwsEyC9KJt1cUeg7EwrAMEv0hjsQWOateLvJa3K2GJ58BKlQHKbojMhutM0sF+gM1KeSIV5+FWlnsdT10nxqUGzgAs8GAtIN9HtCiZQ8ffuc7tcdP7wqucjZWDA8egdyYRPAVduEk8Ncmh8yw05kN/HoA=");
+    
+    /*human.setSkin(entity, "ewogICJ0aW1lc3RhbXAiIDogMTYzODkyMDE1NzA3NSwKICAicHJvZmlsZUlkIiA6ICI2OTBkMDM2OGM2NTE0OGM5ODZjMzEwN2FjMmRjNjFlYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ5emZyXzciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmNjNTA0OWU1MTRiNTg5Y2I5NTc5YWJjZjU5ZDQxNDg0YWFlMTJmZjE3ZDc4ZmJkMGM3OWVjZmVmNjFlNzMwZCIKICAgIH0KICB9Cn0=", "mMo0/F0jlu7FLu3VCnGhlKaN1SAlX9LNhPOZak0e/2vtSPz/W4fV62qpEJkFokeuRVaL82f9YBVVJAsQAV5WhTgFEDsAmZuCqjsVIikmdzbkBwsVA6gJb3rPXUFnr0ZUiqc24yonHu4WLUcFv2HZDV/JVD8mTg9HLjnPZYTcWfGSaavARvIW+g4jgLGZcdWDV9KCFCp5eq9Sqch8bAHXI9T6AAIqKv14knzgKHcGiuq++ukrROKEsp8/p0FUFsey6IXI6/oTkhXTHk8AvwGMXu2NdAhbVqKrw6IQP8k827iyslqemdmnZstzabOs56VdtgZF3JMncPcnhBb7Vucr5IesocSTjDUn5t90jOyQXd3Nn7JeZRTovOnRDWyN+4IV/4QzId2cD9xS0JFVcksheGYfUnl+IiSobHBMAp9nfP/ZTB6arNN/1+HeDsrqAmYzwy0qzFooBKTXD/XtNbJPzVjwiQwWhea3Ggu9cENdElzS8HyMXli1RABrLoOlkFXBwvaoieTk4hduamop3RAfT1UHMflnpw1VwtjFGYaQNQrJ8t5JqREpz1PMz/k6aC6mWGQWgEsHSVRsa/m2ZRsnXSLvED2egAkWNnoPIxxnwcvduWC+bamaJW7GnJqayMd+NHr4xmiLiSvFrDmBTezOAno16wfPJ11k8Xva3C9Epnw=");*/
+} else {
+    for(i = 0; i < 1; i++) {
+        h = human.spawn(loc, "Default");
+    }
+}
+
+ents = world.getEntities(loc.getWorld(loc));
+iter = iterator(ents);
+
+counter = 0;
+while(hasNext(iter)) {
+    ent = next(iter);
+    text = class(ent);
+    if(string.contains(text, "Human")) {
+        counter++;
+    }
+}
+print(counter);

+ 35 - 0
test4.txt

@@ -0,0 +1,35 @@
+p = read.player("kajetanjohannes");
+
+e = player.getTargetEntity(p, 6);
+
+if(e == null) {
+    sb.clear(p);
+    text = "";
+    for(i = 1; i < 13; i++) {
+        text = string.concat(text, string.fromCode(63488 + i));
+    }
+    sb.add("online", 1, text);
+    
+    fh = string.fromCode(63488 + 10);
+    hh = string.fromCode(63488 + 11);
+    eh = string.fromCode(63488 + 12);
+    m1 = string.fromCode(63488 + 13);
+    sb.add("online", 2, string.concat(fh, m1, fh, m1, fh, m1, hh, m1, eh));
+    
+    fb = string.fromCode(63488 + 22);
+    hb = string.fromCode(63488 + 23);
+    eb = string.fromCode(63488 + 24);
+    sb.add("online", 3, string.concat("§0", string.fromCode(63488 + 13), "X", fb, m1, hb, m1, eb, "§1", "X", fb, m1, hb, m1, eb));
+    sb.add("online", 4, string.concat("§2", string.fromCode(63488 + 14), "X", fb, m1, hb, m1, eb, "§3", "X", fb, m1, hb, m1, eb));
+    sb.add("online", 5, string.concat("§4", string.fromCode(63488 + 15), "X", fb, m1, hb, m1, eb, "§5", "X", fb, m1, hb, m1, eb));
+    sb.add("online", 6, string.concat("§6", string.fromCode(63488 + 16), "X", fb, m1, hb, m1, eb, "§7", "X", fb, m1, hb, m1, eb));
+    sb.add("online", 7, string.concat("§8", string.fromCode(63488 + 17), "X", fb, m1, hb, m1, eb, "§9", "X", fb, m1, hb, m1, eb));
+    sb.add("online", 8, string.concat("§a", string.fromCode(63488 + 18), "X", fb, m1, hb, m1, eb, "§b", "X", fb, m1, hb, m1, eb));
+    sb.add("online", 9, string.concat("§c", string.fromCode(63488 + 19), "X", fb, m1, hb, m1, eb, "§d", "X", fb, m1, hb, m1, eb));
+    sb.add("online", 10, string.concat("§e", string.fromCode(63488 + 20), "X", fb, m1, hb, m1, eb, "§f", "X", fb, m1, hb, m1, eb));
+    
+    term();
+}
+
+w = string.fromCode(63497);
+entity.setName(e, text.new(string.concat("Wusi", w, "Gusi2")));

+ 0 - 0
test5.txt


+ 12 - 0
utils/u_commands.txt

@@ -1,3 +1,15 @@
+function getItemFlags() {
+	list = list.new();
+	list.add(list, "HIDE_ATTRIBUTES");
+	list.add(list, "HIDE_UNBREAKABLE");
+	list.add(list, "HIDE_DESTROYS");
+	list.add(list, "HIDE_PLACED_ON");
+	list.add(list, "HIDE_POTION_EFFECTS");
+	list.add(list, "HIDE_DYE");
+	list.add(list, "HIDE_ENCHANTS");
+	return list;
+}
+
 function getRickRollSounds() {
 	RickRollSounds = list.new();
 	list.add(RickRollSounds, math.pow(2, -6 / 12));//6

File diff suppressed because it is too large
+ 275 - 584
utils/u_error.txt


Some files were not shown because too many files changed in this diff