소스 검색

better questing

mloeschenkohl 2 년 전
부모
커밋
ed74d18fa9

+ 38 - 0
FireArrow.txt

@@ -0,0 +1,38 @@
+event.load("projectile_hit");
+
+@wait
+wait();
+
+if(loc_hit != null){
+	flame = enchantment.getLevel(enchantment.get("flame"), entity.getEquip(shooter, "hand"));
+	if(flame > 0){
+		if(plot.check(loc_hit, shooter, 3, true)){
+			loc = entity.getLocation(projectile);
+			if(block.isAir(loc_hit)){
+				block.set(loc_hit,"minecraft:fire");
+			}
+			if(block.isAir(loc)){
+				fire_ring(loc,"minecraft:fire",0);
+			}
+		}
+	}
+}
+goto("wait");
+
+function fire_ring(location,block,radius){
+	loc_x = loc.getX(location);
+	loc_y = loc.getY(location);
+	loc_z = loc.getZ(location);
+	for(a = -radius; a < radius+1; a++){
+		loc.setX(location, loc_x + a);
+		for(b = -radius; b < radius+1; b++){
+			loc.setY(location, loc_y + b);
+			for(c = -radius; c < radius+1; c++){
+				loc.setZ(location, loc_z + c);
+				if(block.isAir(location)){
+					block.set(location,block);
+				}
+			}
+		}
+	}
+}

+ 46 - 0
cobweb_test.txt

@@ -0,0 +1,46 @@
+event.load("block_break");
+cobweb_radius = 1;
+sword = item.getTag("km:sword");
+msg("dev", "§bCobwebs §rloaded.");
+
+@wait
+wait();
+if(cancel) {
+	goto("wait");
+}
+if(block_type != "minecraft:cobweb"){
+	goto("wait");
+}
+equip = entity.getEquip(player, "hand");
+if(!item.hasTag(sword, equip)){
+	goto("wait");
+}
+
+cobweb_X = loc.getX(block_loc);
+cobweb_Y = loc.getY(block_loc);
+cobweb_Z = loc.getZ(block_loc);
+
+unbreaking_level = enchantment.getLevel(enchantment.get("unbreaking"), equip);
+location = block_loc;
+for(a = -cobweb_radius; a < cobweb_radius+1; a++){
+	loc.setX(location, cobweb_X + a);
+	for(b = -cobweb_radius; b < cobweb_radius+1; b++){
+		loc.setY(location, cobweb_Y + b);
+		for(c = -cobweb_radius; c < cobweb_radius+1; c++){
+			loc.setZ(location, cobweb_Z + c);
+			if(math.abs(a)+math.abs(b)+math.abs(c)+math.random(0,2) < cobweb_radius+2){
+				shear(location,block_type,player,unbreaking_level);
+			}
+		}
+	}
+}
+goto("wait");
+
+function shear(block_loc,original_block_type,player,unbreaking_level){
+	if(block.getType(block_loc) == original_block_type){
+		block.break(block_loc, player);
+		if(math.random(0,99) < 100/(unbreaking_level+1)){
+			player.damageItem(player, 1);
+		}	
+	}		
+}

+ 3 - 3
docu_core.php

@@ -104,15 +104,15 @@
     <table>
         <tr>
             <th class="command">array.new</th>
-            <th class="desc">initializes an array with the given size</th>
+            <th class="desc">initializes an array with the given size and returns the array</th>
         </tr>
         <tr>
             <td class="bold">Format</td>
-            <td>array.new(var[size, ...])</td>
+            <td>array.new(size, ...)</td>
         </tr>
         <tr>
             <td class="bold">Examples</td>
-            <td>array.new(a[3]);<br>a[0] = 3;<br>array.new(b[3, 2])<br>b[0, 0] = 3;</td>
+            <td>a = array.new(3);<br>a[0] = 2;<br>b = array.new(3, 2)<br>b[0, 0] = 3;</td>
         </tr>
     </table>
     <table>

+ 1 - 1
docu_minecraft.php

@@ -283,7 +283,7 @@
         </tr>
         <tr>
             <td class="bold">Variablen</td>
-            <td>player<br>player_name (deprecated)<br>hasblock as boolean<br>**block_loc<br>**block_type<br>*cancel</td>
+            <td>player<br>player_name (deprecated)<br>has_block as boolean<br>**block<br>**block_loc<br>**block_type<br>*cancel</td>
         </tr>
     </table>
     <table>

+ 354 - 98
fraktal_maker.txt

@@ -1,20 +1,85 @@
-msg("dev", "Fractal_Maker has started.");
 event.load("block_place"); 
 event.load("block_break"); 
 event.load("item_air_click");
+event.load("inv_click");
 event.load("chat");
-Undo_Map = map.new();
-built = false;
-FractalHelpMap = map.new();
-fractal.help_register("§e§lFractal§6§lPlace", "to start placing the pattern");
-fractal.help_register("§e§lFractal§6§lStart", "to start generating the fractal");
-fractal.help_register("§e§lFractal§6§lBuildHere", "to place the fractal at current location");
-fractal.help_register("§e§lFractal§6§lNew", "to start again");
-fractal.help_register("§e§lFractal§6§lUndo", "to undo placing your last fractal");
-fractal.help_register("§e§lFractal§6§lRedo", "to redo placing your last fractal");
-fractal.help_register("§e§lFractal§6§lIter", "to set the amount of iterations with km:digits");
-fractal.help_register("§e§lFractal§6§lPause", "to stop fractal/fractal-pattern placement");
-fractal.help_register("§e§lFractal§6§lResume", "to unpause");
+
+decay_var = 3;
+iterations = 3;
+default_iterations = iterations;
+age = 0;
+default_age = age;
+Selected_Fractal = 1;
+default_Selected_Fractal = Selected_Fractal;
+Undo_List = list.new();
+Redo_List = list.new();
+Fractal_List = list.new();
+
+FractalHelp = array.new(9, 2);
+FractalHelp[0,0] = "§e§lFractal§6§lPlace";
+FractalHelp[0,1] = "to start placing the pattern";
+FractalHelp[1,0] = "§e§lFractal§6§lStart";
+FractalHelp[1,1] = "to start generating the fractal";
+FractalHelp[2,0] = "§e§lFractal§6§lBuildHere";
+FractalHelp[2,1] = "to place the fractal at current location";
+FractalHelp[3,0] = "§e§lFractal§6§lNew";
+FractalHelp[3,1] = "to start again";
+FractalHelp[4,0] = "§e§lFractal§6§lUndo";
+FractalHelp[4,1] = "to undo placing your last fractal";
+FractalHelp[5,0] = "§e§lFractal§6§lRedo";
+FractalHelp[5,1] = "to redo placing your last fractal";
+FractalHelp[6,0] = "§e§lFractal§6§lPause";
+FractalHelp[6,1] = "to stop fractal/fractal-pattern placement";
+FractalHelp[7,0] = "§e§lFractal§6§lResume";
+FractalHelp[7,1] = "to unpause";
+FractalHelp[8,0] = "§e§lFractal§6§lSettings";
+FractalHelp[8,1] = "open Fractal creation settings";
+
+Settings_Inv = array.new(25);
+Settings_Inv[0] = read.item("minecraft:slime_ball",1,"Selected Fractal");
+Settings_Inv[1] = read.item("km:refresh_red",1,"Set to default");
+Settings_Inv[2] = read.item("km:arrow_left",1,"- 10");
+Settings_Inv[3] = read.item("km:arrow_left",1,"- 1");
+Settings_Inv[4] = read.item("km:digit_0");
+Settings_Inv[5] = read.item(text.concat("km:digit_",text.number(Selected_Fractal)));
+Settings_Inv[6] = read.item("km:arrow_right",1,"+ 1");
+Settings_Inv[7] = read.item("km:arrow_right",1,"+ 10");
+Settings_Inv[8] = read.item("km:check_green",1,"Confirm");
+Settings_Inv[9] = read.item("minecraft:slime_ball",1,"Iterations");
+Settings_Inv[10] = read.item("km:refresh_red",1,"Set to default");
+Settings_Inv[11] = read.item("km:arrow_left",1,"- 1");
+Settings_Inv[12] = read.item("km:digit_0");
+Settings_Inv[13] = read.item(text.concat("km:digit_",text.number(iterations)));
+Settings_Inv[14] = read.item("km:arrow_right",1,"+ 1");
+Settings_Inv[15] = read.item("km:check_green",1,"Confirm");
+Settings_Inv[16] = read.item("minecraft:slime_ball",1,"Decay");
+Settings_Inv[17] = read.item("km:refresh_red",1,"Set to default");
+Settings_Inv[18] = read.item("km:arrow_left",1,"- 10");
+Settings_Inv[19] = read.item("km:arrow_left",1,"- 1");
+Settings_Inv[20] = read.item("km:digit_0");
+Settings_Inv[21] = read.item(text.concat("km:digit_",text.number(age)));
+Settings_Inv[22] = read.item("km:arrow_right",1,"+ 1");
+Settings_Inv[23] = read.item("km:arrow_right",1,"+ 10");
+Settings_Inv[24] = read.item("km:check_green",1,"Confirm");
+
+numbers = map.new();
+map.add(numbers, 0, read.item("km:digit_0"));
+map.add(numbers, 1, read.item("km:digit_1"));
+map.add(numbers, 2, read.item("km:digit_2"));
+map.add(numbers, 3, read.item("km:digit_3"));
+map.add(numbers, 4, read.item("km:digit_4"));
+map.add(numbers, 5, read.item("km:digit_5"));
+map.add(numbers, 6, read.item("km:digit_6"));
+map.add(numbers, 7, read.item("km:digit_7"));
+map.add(numbers, 8, read.item("km:digit_8"));
+map.add(numbers, 9, read.item("km:digit_9"));
+
+Fractal_Settings_Inv = inv.new("222222222220222202222222222");
+F_S_I_ID = inv.getID(Fractal_Settings_Inv);
+//Fractal_Settings_Inv = inv.new("222222222 220222202 222222222");
+for(a = 0; a < 25; a++){
+	inv.setItem(Fractal_Settings_Inv, a, Settings_Inv[a]);
+}
 
 @Start
 Blocks = map.new();
@@ -25,9 +90,10 @@ Coords_Z = list.new();
 start = false; 
 build = false;
 set_iter = false;
-iterations = 3;
 pause = false;
+setage = false;
 
+msg("dev", "§bFractalmaker §rloaded.");
 @wait
 wait();
 if(player.getname(player) == "SirTerence7"){
@@ -37,7 +103,7 @@ goto("wait");
 
 @block_place
 if(start && !pause){
-	cancel=false;
+	cancel = false;
 	map.add(Blocks, block_loc, block_type);
 	list.add(Block_Coords, block_loc);
 }
@@ -65,66 +131,253 @@ elseif(start && pause){
 }
 goto("wait"); 
 
-@item_air_click
-if(set_iter){
-	set_iter = false;
-	Hand_Item = item.getType(entity.getEquip(player, "hand"));
-	OffHand_Item = item.getType(entity.getEquip(player, "offhand"));
-	old_iterations = iterations;
-	if(Hand_Item == "km:digit_2" || OffHand_Item == "km:digit_2"){
-		iterations = 2;
-	}elseif(Hand_Item == "km:digit_3" || OffHand_Item == "km:digit_3"){
-		iterations = 3;
-	}elseif(Hand_Item == "km:digit_4" || OffHand_Item == "km:digit_4"){
-		iterations = 4;
-	}elseif(Hand_Item == "km:digit_5" || OffHand_Item == "km:digit_5"){
-		iterations = 5;
-	}elseif(Hand_Item == "km:digit_6" || OffHand_Item == "km:digit_6"){
-		iterations = 6;
-	}elseif(Hand_Item == "km:digit_7" || OffHand_Item == "km:digit_7"){
-		iterations = 7;
+@inv_click
+if(inv_id == F_S_I_ID){
+	ignoreGoto(text.number(inv_slot));
+	goto("wait");
+}
+
+@1
+temp_Selected_Fractal = default_Selected_Fractal;
+setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal);
+if(temp_Selected_Fractal == Selected_Fractal){
+	inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]);
+}else{
+	inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal"));
+}
+inv.update(player);
+goto("wait");
+
+@2
+temp_Selected_Fractal -= 10;
+if(temp_Selected_Fractal < 1){
+	temp_Selected_Fractal = 1;
+}else{
+	setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal);
+	if(temp_Selected_Fractal == Selected_Fractal){
+		inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]);
 	}else{
-		goto("wait");
+		inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal"));
 	}
-	msg(player, "iterations set to: ", iterations);
-	if(old_iterations != iterations && build){
-		goto("iter_jump");
+}
+inv.update(player);
+goto("wait");
+
+@3
+temp_Selected_Fractal--;
+if(temp_Selected_Fractal < 1){
+	temp_Selected_Fractal = 1;
+}else{
+	setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal);
+	if(temp_Selected_Fractal == Selected_Fractal){
+		inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal"));
 	}
-	build = true;
 }
+inv.update(player);
 goto("wait");
 
+@6
+temp_Selected_Fractal++;
+if(temp_Selected_Fractal > list.getSize(Fractal_List)){
+	temp_Selected_Fractal = temp_Selected_Fractal - 1;
+}else{
+	setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal);
+	if(temp_Selected_Fractal == Selected_Fractal){
+		inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal"));
+	}
+}
+inv.update(player);
+goto("wait");
+		
+@7
+temp_Selected_Fractal += 10;
+if(temp_Selected_Fractal > list.getSize(Fractal_List)){
+	temp_Selected_Fractal = list.getSize(Fractal_List);
+}else{
+	setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal);
+	if(temp_Selected_Fractal == Selected_Fractal){
+		inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal"));
+	}
+}
+inv.update(player);
+goto("wait");
+
+@8
+Selected_Fractal = temp_Selected_Fractal;
+inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]);
+inv.update(player);
+if(build){
+	goto("iter_jump");
+}
+goto("wait");	
+	
+@10	
+temp_iterations = default_iterations;
+setnumber(Fractal_Settings_Inv, 12, 13, temp_iterations);
+if(temp_iterations == iterations){
+	inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]);
+}else{
+	inv.setItem(Fractal_Settings_Inv, 9, read.item("km:gem_stone",1,"Iterations"));
+}
+inv.update(player);
+goto("wait");
+
+@11
+temp_iterations--;
+if(temp_iterations < 2){
+	temp_iterations = 2;
+}else{
+	setnumber(Fractal_Settings_Inv, 12, 13, temp_iterations);
+	if(temp_iterations == iterations){
+		inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 9, read.item("km:gem_stone",1,"Iterations"));
+	}
+}
+inv.update(player);
+goto("wait");
+
+@14
+temp_iterations++;
+if(temp_iterations > 5){
+	temp_iterations = 5;
+}else{
+	setnumber(Fractal_Settings_Inv, 12, 13, temp_iterations);
+	if(temp_iterations == iterations){
+		inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 9, read.item("km:gem_stone",1,"Iterations"));
+	}
+}
+inv.update(player);
+goto("wait");
+
+@15
+iterations = temp_iterations;
+inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]);
+inv.update(player);
+if(build){
+	goto("iter_jump");
+}
+goto("wait");
+	
+	
+@17
+temp_age = default_age;
+setnumber(Fractal_Settings_Inv, 20, 21, temp_age);
+if(temp_age == age){
+	inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]);
+}else{
+	inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay"));
+}
+inv.update(player);
+goto("wait");
+
+@18
+temp_age -= 10;
+if(temp_age < 0){
+	temp_age = 0;
+}else{
+	setnumber(Fractal_Settings_Inv, 20, 21, temp_age);
+	if(temp_age == age){
+		inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay"));
+	}
+}
+inv.update(player);
+goto("wait");
+
+@19
+temp_age--;
+if(temp_age < 0){
+	temp_age = 0;
+}else{
+	setnumber(Fractal_Settings_Inv, 20, 21, temp_age);
+	if(temp_age == age){
+		inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay"));
+	}
+}
+inv.update(player);
+goto("wait");
+
+@22
+temp_age++;
+if(temp_age > 99){
+	temp_age = 99;
+}else{
+	setnumber(Fractal_Settings_Inv, 20, 21, temp_age);
+	if(temp_age == age){
+		inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay"));
+	}
+}
+inv.update(player);
+goto("wait");
+
+@23
+temp_age += 10;
+if(temp_age > 99){
+	temp_age = 99;
+}else{
+	setnumber(Fractal_Settings_Inv, 20, 21, temp_age);
+	if(temp_age == age){
+		inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]);
+	}else{
+		inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay"));
+	}
+}
+inv.update(player);
+goto("wait");
+
+@24
+age = temp_age;
+inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]);
+inv.update(player);
+if(build){
+	goto("iter_jump");
+}
+goto("wait");
+
+
 @chat
-if(text.contains(message, "fractal")){
+if(text.contains(message, "%fractal")){
+	message = text.subString(message,1,text.length(message));
 	ignoreGoto(message);
 }
 goto("wait");
 
 @fractalhelp
-temp = map.iterator(FractalHelpMap);
-while(hasNext(temp)){
-	temp_key = map.getKey(next(temp));
-	temp_value = map.get(FractalHelpMap, temp_key);
+temp_size = array.getSize(FractalHelp);
+for(a = 0; a < temp_size-1; a++){
+	temp_key = FractalHelp[a,0];
+	temp_value = FractalHelp[a,1];
 	fractal_command = text.hover(text.click(temp_key, temp_value), temp_value);
-	msg(player, fractal_command);
+	msg(player, fractal_command);	
 }
-cancel = true;
 
 goto("wait");
 
 @fractalplace
-cancel = true;
 msg(player, "You can place the pattern now.");
 start = true;
 goto("wait");
 
 @fractalstart
-cancel = true;
 if(start && map.getSize(Blocks) > 1){
 	msg(player, "The Fractal will start generating now");
 	@iter_jump
 	loc = loc.getWorld(entity.getLocation(player));
-	Relative_Fractal = fractal.create(Block_Coords, loc, Blocks, 2, iterations+1, Block_Coords);
+	list.add(Fractal_List, fractal.create(Block_Coords, loc, Blocks, 2, iterations+1, Block_Coords, age));
 	build = true;
 	start = false;
 	pause = false;
@@ -135,57 +388,44 @@ if(start && map.getSize(Blocks) > 1){
 goto("wait");
 
 @fractalbuildhere
-cancel = true;
 if(build){
 	player_loc = entity.getLocation(player);
 	@place_fractal
 	redo_loc = player_loc;
 	msg(player, "Fractal will now generate with ", iterations, " iterations.");
-	Undo_Map = fractal.build(Relative_Fractal, player_loc, player);
-	built = true;
+	list.add(Undo_List, fractal.build(list.getIndex(Fractal_List, list.getSize(Fractal_List) - Selected_Fractal), player_loc, player));
 }else{
 	msg(player, "You have not yet generated a fractal.");
 }
 goto("wait");
 
 @fractalnew
-cancel = true;
 msg(player, "Restarting");
 goto("Start");
 goto("wait");
 
 @fractalundo
-cancel = true;
-if(built && map.getSize(Undo_Map) > 1){
+temp_size = list.getSize(Undo_List);
+if(temp_size > 0){
 	msg(player, "Undoing");
-	redo = true;
-	built = false;
-	fractal.undo(Undo_Map);
+	list.add(Redo_List, fractal.undo(list.getIndex(Undo_List,temp_size-1)));
+	list.removeIndex(Undo_List,temp_size-1);
 }else{
 	msg(player, "Nothing to undo");
 }
 goto("wait");
 
 @fractalredo
-if(redo){
+temp_size = list.getSize(Redo_List);
+if(temp_size > 0){
 	msg(player, "Redoing");
-	fractal.build(Relative_Fractal, redo_loc, player);
-	redo = false;
-	built = true;
+	list.add(Undo_List, fractal.undo(list.getIndex(Redo_List,temp_size-1)));
+	list.removeIndex(Redo_List,temp_size-1);
 }else{
 	msg(player, "Nothing to redo");
 }
 goto("wait");
 
-@fractaliter
-if(build){
-	msg(player, "Click with a digit from 2-7 in hand.");
-	set_iter = true;
-}else{
-	msg(player, "You need to place a pattern first.");
-}
-goto("wait"); 
-
 @fractalpause
 if(pause){
 	msg(player, "You have already paused, type \"fractalresume\" to continue.");
@@ -207,13 +447,20 @@ if(pause){
 }
 goto("wait");
 
-function fractal.create(Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords){
+@fractalsettings
+temp_iterations = iterations;
+temp_age = age;
+temp_Selected_Fractal = Selected_Fractal;
+inv.open(Fractal_Settings_Inv, player, "Fractal Settings");
+goto("wait");
+
+function fractal.create(Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords, fractalage){
 	List_Size = list.getSize(Last_Block_Coords);
 	Coords_X = list.new();
 	Coords_Y = list.new();
 	Coords_Z = list.new();
 	New_Block_Coords = list.new();
-	relative_blocks = map.new();
+	relative_blocks = list.new();
 	for(a = 0; a < List_Size; a++){
 		block_loc = list.getIndex(Last_Block_Coords, a);
 		list.add(Coords_X, loc.getX(block_loc));
@@ -244,10 +491,13 @@ function fractal.create(Block_Coords, world, Blocks, iter, iterations, Last_Bloc
 								rel_loc = loc.new(world, a2, b2, c2);
 								loc_set = loc.new(world, Min_X + a2 - a, Min_Y + b2 - b, Min_Z + c2 - c);
 								Block_to_set = map.getOrDefault(Blocks, loc_set, "minecraft:air");
+								temparray = array.new(2);
+								temparray[0] = rel_loc;
+								temparray[1] = Block_to_set;
 								rand_temp = math.random(0,100);
-								if(Block_to_set != "minecraft:air" && rand_temp > 3){
+								if(Block_to_set != "minecraft:air" && rand_temp + 1 > fractalage){
 									list.add(New_Block_Coords, loc_place);
-									map.add(relative_blocks, rel_loc, Block_to_set);
+									list.add(relative_blocks, temparray);
 								}
 							}
 						}
@@ -261,7 +511,7 @@ function fractal.create(Block_Coords, world, Blocks, iter, iterations, Last_Bloc
 	}
 	iter++;
 	if(iter < iterations){
-		relative_blocks = fractal.create(New_Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords);
+		relative_blocks = fractal.create(New_Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords, fractalage);
 	}
 	return(relative_blocks);
 }
@@ -272,14 +522,10 @@ function fractal.build(Fractal, Position, Player){
 	Pos_Y = math.round(loc.getY(Position));
 	Pos_Z = math.round(loc.getZ(Position));
 	World = loc.getWorld(Position);
-	Coords_for_Undo = map.new();
-	Coords_List = list.new();
-	iterator = map.iterator(Fractal);
-	while(hasNext(iterator)){
-		list.add(Coords_List, map.getKey(next(iterator)));
-	}
-	for(a = 0; a < list.getSize(Coords_List); a++){
-		rel_loc = list.getIndex(Coords_List, a);
+	Coords_for_Undo = list.new();
+	for(a = 0; a < list.getSize(Fractal); a++){
+		temp_array = list.getIndex(Fractal, a);
+		rel_loc = temp_array[0];
 		Temp_X = Pos_X + loc.getX(rel_loc);
 		Temp_Y = Pos_Y + loc.getY(rel_loc);
 		Temp_Z = Pos_Z + loc.getZ(rel_loc);
@@ -287,21 +533,25 @@ function fractal.build(Fractal, Position, Player){
 		if(!block.isAir(abs_loc) && abs_loc != Position){
 			msg(Player, "Block is in the Way, cannot paste Fractal here.", block.getType(abs_loc));
 			stop = true;
-			a = list.getSize(Coords_List) + 1;
+			a = list.getSize(Fractal) + 1;
 		}else{
 			stop = false;
 		}
 	}
 	if(!stop){
-		for(a = 0; a < list.getSize(Coords_List); a++){
-			rel_loc = list.getIndex(Coords_List, a);
+		for(a = 0; a < list.getSize(Fractal); a++){
+			temp_array = list.getIndex(Fractal, a);
+			rel_loc = temp_array[0];
 			Temp_X = Pos_X + loc.getX(rel_loc);
 			Temp_Y = Pos_Y + loc.getY(rel_loc);
 			Temp_Z = Pos_Z + loc.getZ(rel_loc);
 			abs_loc = loc.new(World, Temp_X, Temp_Y, Temp_Z);
-			Block_to_set = map.getOrDefault(Fractal, rel_loc, "minecraft:air");
+			Block_to_set = temp_array[1];
 			if(Block_to_set != "minecraft:air"){
-				map.add(Coords_for_Undo, abs_loc, block.getType(abs_loc));
+				temp_array2 = array.new(2);
+				temp_array2[0] = abs_loc;
+				temp_array2[1] = block.getType(abs_loc);
+				list.add(Coords_for_Undo, temp_array2);
 				block.set(abs_loc, Block_to_set);
 			}
 		}
@@ -309,20 +559,26 @@ function fractal.build(Fractal, Position, Player){
 	return(Coords_for_Undo);
 }
 
-function fractal.undo(Coords_for_Undo){
-	Coords_List = list.new();
-	iterator = map.iterator(Coords_for_Undo);
-	while(hasNext(iterator)){
-		list.add(Coords_List, map.getKey(next(iterator)));
-	}
+function fractal.undo(Coords_List){
+	Coords_for_Redo = list.new();
 	for(a = 0; a < list.getSize(Coords_List); a++){
-		undo_loc = list.getIndex(Coords_List, a);
-		undo_block = map.getOrDefault(Coords_for_Undo, undo_loc, "minecraft:air");
+		temp_array = list.getIndex(Coords_List, a);
+		undo_loc = temp_array[0];
+		undo_block = temp_array[1];
 		if(undo_block == "minecraft:" || undo_block == ""){undo_block = "minecraft:air";}
+		temp_array2 = array.new(2);
+		temp_array2[0] = undo_loc;
+		temp_array2[1] = block.getType(undo_loc);
+		list.add(Coords_for_Redo, temp_array2);
 		block.set(undo_loc, undo_block);
 	}
+	return(Coords_for_Redo);
 }
 
-function fractal.help_register(message, description){
-	map.add($FractalHelpMap, message, description);
+function setnumber(Inv, First_Slot, Second_Slot, Number){
+	if(Number > 100){Number = 99;}
+	First_Digit = map.get($numbers, math.roundDown(Number / 10));
+	Second_Digit = map.get($numbers, Number - 10 * math.roundDown(Number / 10));
+	inv.setItem(Inv, First_Slot, First_Digit);
+	inv.setItem(Inv, Second_Slot, Second_Digit);
 }

+ 5 - 5
jantest4.txt

@@ -1,10 +1,10 @@
 event.load("player_toss");
 event.load("entity_click");
 event.load("living_death");
-randblock_x1 = -2987;
-randblock_x2 = -3000;
-randblock_z1 = -1000;
-randblock_z2 = -1004;
+randblock_x1 = -2984;
+randblock_x2 = -3003;
+randblock_z1 = -997;
+randblock_z2 = -1009;
 middleloc = -2994;
 
 @checkgame
@@ -19,7 +19,7 @@ if(event == "living_death"){
 }else{
 	p = player.getName(player);
 }
-if(p == "SirTerence7" || p == "Mareeeen"){
+if(p == "SirTerence7" || p == "Mareeeen" || p == "marvinius"){
 	ignoreGoto(event);
 }
 goto("checkgame");

+ 0 - 43
jantest5.txt

@@ -1,43 +0,0 @@
-event.load("player_toss");
-event.load("entity_click");
-event.load("block_click");
-Fun_Block = "minecraft:red_wool";
-tag = text.concat("{BlockState:{Name:\"", Fun_Block, "\"},Time:1,Motion:[0.0,0.5,0.0],DropItem:1,HurtEntities:0}");
-
-@checkgame
-wait();
-
-if(perm.has(player, "isVIP") || perm.has(player, "isTeam")){
-	ignoreGoto(event);
-}
-goto("checkgame");
-
-@player_toss
-if(item.getType(entity.getEquip(player, "hand")) == Fun_Block) {
-	cancel = true;
-	falling_block_entity = entity.spawn("falling_block", entity.getLocation(player), tag);
-	throw(player, falling_block_entity);
-}
-goto("checkgame");
-
-@entity_click
-if(entity.getType(entity) == "falling_block"){
-	throw(player, falling_block_entity);
-}
-goto("checkgame");
-
-@block_click
-if(block_type == Fun_Block){
-	block.set(block_loc, "minecraft:air");
-	falling_block_entity = entity.spawn("falling_block", block_loc, tag);
-}
-goto("checkgame");
-
-function throw(p, entity_to_throw){
-	array = entity.getLook(p);
-	array2 = entity.getMotion(p);
-	x = array[0]*0.225 + array2[0]*0.25;
-	y = math.abs(array[1]*0.75) + math.abs(array2[1])*0.5;
-	z = array[2]*0.225 + array2[2]*0.25;
-	entity.throw(entity_to_throw, x, y, z);
-}

+ 0 - 0
lava_test.txt


+ 41 - 0
luftballon.txt

@@ -0,0 +1,41 @@
+event.load("entity_click");
+event.load("block_click");
+Fun_Block = "minecraft:red_wool";
+Wool_loc = loc.new(games, -459, 164, -65);
+tag = text.concat("{BlockState:{Name:\"", Fun_Block, "\"},Time:1,Motion:[0.0,0.5,0.0],DropItem:1,HurtEntities:0}");
+
+msg("dev", "§bLuftballon §rloaded.");
+@Luftballon_loop
+wait();
+if(event == "block_click" ){
+	if(inRegion(block_loc) && block_type == Fun_Block){
+		block.set(block_loc, "minecraft:air");
+		block_loc = loc.new(loc.getWorld(block_loc),loc.getX(block_loc)+0.5,loc.getY(block_loc),loc.getZ(block_loc)+0.5);
+		falling_block_entity = entity.spawn("falling_block", block_loc, tag);
+	}
+	goto("Luftballon_loop");
+}
+if(event == "entity_click"){
+	if(inRegion(entity.getLocation(entity)) && entity.getType(entity) == "falling_block"){
+		throw(player, falling_block_entity);
+	}
+}
+goto("Luftballon_loop");
+
+function inRegion(temp_loc){
+	temp_x = loc.getX(temp_loc);
+	temp_y = loc.getY(temp_loc);
+	temp_z = loc.getZ(temp_loc);
+	if(-450 > temp_x && temp_x > -467 && 162 < temp_y && temp_y < 173 && -59 > temp_z && temp_z > -70){
+		return(true);
+	}
+	return(false);	
+}
+
+function throw(p, entity_to_throw){
+	array = entity.getLook(p);
+	x = array[0]*0.225 + math.random(0,0.25) - math.random(0,0.25);
+	y = math.abs(array[1])*0.25 + math.random(0.75,0.95) + 0.5;
+	z = array[2]*0.225 + math.random(0,0.25) - math.random(0,0.25);
+	entity.throw(entity_to_throw, x, y, z);
+}

+ 1 - 1
minigames/among_us/among_us.txt

@@ -1594,7 +1594,7 @@ if(block_loc == fix_o2_loc_1 || block_loc == fix_o2_loc_2) {
 		inv.setItem(oxygen_inv, 14, read.item("km:digit_7", 1, "§f7"));
 		inv.setItem(oxygen_inv, 15, read.item("km:digit_8", 1, "§f8"));
 		inv.setItem(oxygen_inv, 16, read.item("km:cross_red"));
-		inv.setItem(oxygen_inv, 17, read.item("km:digit_9", 1, "§r9"));
+		inv.setItem(oxygen_inv, 17, read.item("km:digit_9", 1, "§f9"));
 		inv.setItem(oxygen_inv, 18, read.item("km:check_green"));
 		inv.open(oxygen_inv, player, "§cENTER CODE");
 		sabotage.openedInv(player);

+ 56 - 0
shears_test.txt

@@ -0,0 +1,56 @@
+event.load("block_break");
+//radius = 1;
+msg("dev", "§bShears §rloaded.");
+
+@wait
+wait();
+if(cancel) {
+	goto("wait");
+}
+if(!text.contains(block_type, "leaves")){
+	goto("wait");
+}
+if(item.getType(entity.getEquip(player, "hand")) != "minecraft:shears"){
+	goto("wait");
+}
+if(block.getState(block_loc, block.getProperty("persistent"))){
+	goto("wait");
+}
+
+shears_X = loc.getX(block_loc);
+shears_Y = loc.getY(block_loc);
+shears_Z = loc.getZ(block_loc);
+unbreaking_level = enchantment.getLevel(enchantment.get("unbreaking"), entity.getEquip(player, "hand"));
+radius = enchantment.getLevel(enchantment.get("sharpness"), entity.getEquip(player, "hand"));
+if(radius > 0){
+	cancel = true;
+}
+location = block_loc;
+for(a = -radius; a < radius+1; a++){
+	loc.setX(location, shears_X + a);
+	for(b = -radius; b < radius+1; b++){
+		loc.setY(location, shears_Y + b);
+		for(c = -radius; c < radius+1; c++){
+			loc.setZ(location, shears_Z + c);
+			if(math.abs(a)+math.abs(b)+math.abs(c)+math.random(0,2) < radius+2){
+				shear(location,block_type,player,unbreaking_level);
+			}
+		}
+	}
+}
+goto("wait");
+
+function shear(block_loc,original_block_type,player,unbreaking_level){
+	if(block.getType(block_loc) == original_block_type){
+		if(!block.getState(block_loc, block.getProperty("persistent"))){
+			block.set(block_loc, "minecraft:air");
+			item.drop(block_loc, read.item(original_block_type,1));
+			if(player.isSurvival(player)){
+				if(math.random(0,99) < 100/(unbreaking_level+1)){
+					player.damageItem(player, 1);
+				}
+			}
+
+		}	
+	}		
+}

+ 9 - 5
story/admont/core.txt

@@ -65,7 +65,7 @@ if(entity_name == "Felsmagier") {
 if(entity_name == "Peter") {
 	inv = inv.new("333333333");
 	inv.setItem(inv, 0, read.item("minecraft:enchanted_book", 1, "§fErstes Date"));
-	inv.setItem(inv, 1, read.item("minecraft:enchanted_book", 1, "§fNeue Hose"));
+	//inv.setItem(inv, 1, read.item("minecraft:enchanted_book", 1, "§fNeue Hose"));
 	inv.open(inv, player, "Quests: Peter");
 	goto("wait");
 }
@@ -334,9 +334,13 @@ function checkAdmontStable() {
 	}
 	while(entities > 70) {
 		index = math.random(0, size - 1);
-		entity.remove(list.getIndex(list, index));
-		list.removeIndex(list, index);
-		entities--;
-		size--;
+		element = list.getIndex(list, index);
+		entity_type = entity.getType(element); 
+		if(entity_type == "cow" || entity_type == "pig" || entity_type == "sheep") {
+			entity.remove(element);
+			list.removeIndex(list, index);
+			entities--;
+			size--;
+		}
 	}
 }

+ 9 - 11
story/admont/die_uhr_tickt.txt

@@ -10,6 +10,7 @@ quest_name = "Die Uhr tickt";
 gold = 0;
 orchids = 0;
 bluedye = 0;
+gold_ingot_needed = 5;
 
 @wait
 wait();
@@ -52,11 +53,13 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 	if(entity_name == "Schmied") {
 		item = entity.getEquip(player, "hand");
 		item_type = item.getType(item);
-		wusi = human.giveItem("Schmied", player, "minecraft:gold_ingot", 5);
-		if(wusi == 0) {
+		rest_amount = human.giveItem(entity_name, player, "minecraft:gold_ingot", gold_ingot_needed);
+		if(rest_amount == 0) {
 			msg.prefix(player, "§dSchmied", "Perfekt, jetzt fehlt nurnoch hellblauer Farbstoff für das Detail.");
 			scheduler.msgPrefix(30, player, "§dSchmied", "Pflücke eine blaue Orchidee und verarbeite sie zu Farbstoff.");
 			stage.increase(player);
+		} else {
+			gold_ingot_needed = rest_amount;
 		}
 	}
 }	
@@ -80,12 +83,9 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Schmied") {
-		item = entity.getEquip(player, "hand");
-		item_type = item.getType(item);
-		wusi = human.giveItem("Schmied", player, "minecraft:light_blue_dye", 1);
-		if(wusi == 0) {
+		rest_amount = human.giveItem(entity_name, player, "minecraft:light_blue_dye", 1);
+		if(rest_amount == 0) {
 			stage.increase(player);
-			player.removeItem(player, read.item(item_type));
 			msg.prefix(player, "§dSchmied", "Jetzt kann ich loslegen!");
 			scheduler.msgPrefix(60, player, "§dSchmied", "Einen Moment noch.");
 			scheduler.msgPrefix(120, player, "§dSchmied", "Tadaaaa. Das Werk ist vollbracht. Du kannst sie ihm gleich vorbeibringen.");
@@ -99,10 +99,8 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Herbert") {
-		item = entity.getEquip(player, "hand");
-		item_type = item.getType(item);
-		if(item_type == "minecraft:clock") {
-			player.removeItem(player, read.item(item_type));
+		rest_amount = human.giveItem(entity_name, player, "minecraft:clock", 1);
+		if(rest_amount == 0) {
 			msg.prefix(player, "§dHerbert", "Das ging aber flott!");
 			msg(player, "§dQuest abgeschlossen. Belohnung: 6 Snuvis!");
 			money.addBoost(player, 6);

+ 17 - 24
story/admont/erntezeit.txt

@@ -8,8 +8,6 @@ stage = 0;
 all_stages = 3;
 quest_name = "Erntezeit";
 
-wheat_given = 0;
-carrots_given = 0;
 wheat_needed = 64;
 carrots_needed = 10;
 wheat_harvestet = 0;
@@ -60,7 +58,7 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(60, block_loc, "minecraft:wheat[age=7]", false);
 		wheat_harvestet++;
-		if(wheat_harvestet == wheat_needed) {
+		if(t == wheat_needed) {
 			stage.increase(player);
 		}
 	}
@@ -79,31 +77,26 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 	if(entity_name == "Bauer") {
 		item = entity.getEquip(player, "hand");
 		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "minecraft:wheat") {
-			if(wheat_given >= wheat_needed) {
-				goto("wait");
-			}
-			wheat_given++;
-			player.removeItem(player, read.item(item_type));
-			if(wheat_given == wheat_needed) {
-				msg.prefix(player, "§dBauer", "Danke für das Weizen.");
+		if(item_type == "minecraft:wheat") {
+			if(wheat_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, wheat_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dBauer", "Danke für das Weizen.");
+				}
+				wheat_needed = rest_amount;
 			}
 		}
-		elseif(item_type == "minecraft:carrot") {
-			if(carrots_given >= carrots_needed) {
-				goto("wait");
-			}
-			carrots_given++;
-			player.removeItem(player, read.item(item_type));
-			if(carrots_given == carrots_needed) {
-				msg.prefix(player, "§dBauer", "Danke für die Karotten.");
+		if(item_type == "minecraft:carrot") {
+			if(carrots_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, carrots_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dBauer", "Danke für die Karotten.");
+				}
+				carrots_needed = rest_amount;
 			}
 		}
-		if(wheat_given >= wheat_needed && carrots_given >= carrots_needed) {
-			msg.prefix(player, "§dBauer", "Danke für deine Hilfe.");
+		if(wheat_needed == 0 && carrots_needed == 0) {
+			msg.prefix(player, "§dBauer", "Vielen Dank für deine Hilfe!");
 			msg(player, "§dQuest abgeschlossen. Belohnung: 7 Snuvis!");
 			money.addBoost(player, 7);
 			quest.finish(script, player);

+ 14 - 15
story/admont/erstes_date.txt

@@ -9,6 +9,7 @@ stage = 0;
 all_stages = 2;
 quest_name = "Erstes Date";
 tulips = 0;
+tulips_needed = 3;
 book_chest_loc = loc.new(world.getStory(), -1626, 57, 23);
 
 @wait
@@ -19,8 +20,11 @@ if(!player.isQuester(player, script)) {
 if(event == "quest_term") {
 	//Hier Code einfügen...
 	if(stage == 1) {
-		player.removeItem2(player, read.item("minecraft:writable_book"));
-		player.removeItem2(player, read.item("minecraft:written_book"));
+		rest_item = player.removeItemNbt(player, read.item("minecraft:writable_book"));
+		rest_amount = item.getAmount(rest_item);
+		if(rest_amount != 0) {
+			player.removeItemNbt(player, read.item("minecraft:written_book"));
+		}
 	}
 	wait(); //Script wird von außen terminiert
 }
@@ -99,20 +103,15 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Peter") {
-		item = entity.getEquip(player, "hand");
-		if(item.getType(item) != "minecraft:pink_tulip") {
-			msg.prefix(player, "§dPeter", "Das kann ich nicht gebrauchen.");
-			goto("wait");
-		}
-		if(item.getAmount(item) < 3) {
-			msg.prefix(player, "§dPeter", "Ich brauche bitte 3 pinke Tulpen!");
-			goto("wait");
+		rest_amount = human.giveItem(entity_name, player, "minecraft:pink_tulip", tulips_needed);
+		if(rest_amount == 0) {
+			msg.prefix(player, "§dPeter", "Vielen Dank!");
+			msg(player, "§dQuest abgeschlossen. Belohnung: 10 Snuvis!");
+			money.addBoost(player, 10);
+			quest.finish(script, player);
+		} else {
+			tulips_needed = rest_amount;
 		}
-		player.removeItem(player, read.item("minecraft:pink_tulip", 3));
-		msg.prefix(player, "§dPeter", "Vielen Dank!");
-		msg(player, "§dQuest abgeschlossen. Belohnung: 10 Snuvis!");
-		money.addBoost(player, 10);
-		quest.finish(script, player);
 	}
 }
 goto("wait");

+ 14 - 11
story/admont/felsmagier.txt

@@ -125,9 +125,9 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 			goto("wait");
 		}
 		player.removeItem(player, read.item("minecraft:bread"));
-		player.giveSingleItem(player, key, false);
-		player.giveSingleItem(player, read.item("minecraft:stone_sword"), true);
-		player.giveSingleItem(player, read.item("minecraft:shield"), true);
+		player.giveSingleItem(player, key, true);
+		player.giveSingleItem(player, read.item("minecraft:stone_sword"), false);
+		player.giveSingleItem(player, read.item("minecraft:shield"), false);
 		msg.prefix(player, "§dZauberlehrling", "Rechtsklicke Türen damit, um sie zu öffnen.");
 		scheduler.msgPrefix(30, player, "§dZauberlehrling", "Auf deinem Weg zum Magier musst du durch mehrere Räume.");
 		scheduler.msgPrefix(60, player, "§dZauberlehrling", "Pass auf dich auf!");
@@ -227,9 +227,11 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 goto("wait");
 
 @stage17
-if(event == "bucket_use") {
+if(event == "bucket_use" && has_block) {
 	cancel = false;
-	stage.increase(player);
+	if(block.gotWater(block, block_type, block_loc)) {
+		stage.increase(player);
+	}
 }
 goto("wait");
 
@@ -274,14 +276,15 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Felsmagier") {
-		item = entity.getEquip(player, "hand");
-		if(item.getType(item) == "minecraft:nether_wart" && item.getAmount(item) >= warts_harvested) {
-			msg.prefix(player, "§dFelsmagier", "Danke dir.");
-			player.removeItem(player, read.item("minecraft:nether_wart", warts_harvested));
+		rest_amount = human.giveItem(entity_name, player, "minecraft:nether_wart", warts_harvested);
+		if(rest_amount == 0) {
 			stage.increase(player);
+			msg.prefix(player, "§dFelsmagier", "Danke dir.");
 			scheduler.msgPrefix(30, player, "§dFelsmagier", "Bitte gehe nach unten und koche das für mich.");
-			safeGiveItemPlayer(player, read.item("minecraft:coal"));
-			safeGiveItemPlayer(player, read.item("km:mushroom_stick_raw"));
+			player.safeGiveItem(player, read.item("minecraft:coal"));
+			player.safeGiveItem(player, read.item("km:mushroom_stick_raw"));
+		} else {
+			warts_harvested = rest_amount;
 		}
 	}
 }

+ 9 - 18
story/admont/fuer_die_wissenschaft.txt

@@ -7,6 +7,7 @@ event.load("custom_command");
 stage = 0;
 all_stages = 5;
 quest_name = "Für die Wissenschaft!";
+paper_neded = 3;
 
 @wait
 wait();
@@ -84,7 +85,6 @@ goto("wait");
 if(event == "craft") {
 	if(item.getType(result) == "minecraft:paper") {
 		stage.increase(player);
-		paper_given = 0;
 	}
 }
 goto("wait");
@@ -93,23 +93,14 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Isabell") {
-		item = entity.getEquip(player, "hand");
-		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "minecraft:paper") {
-			if(paper_given >= 3) {
-				goto("wait");
-			}
-			paper_given++;
-			player.removeItem(player, read.item(item_type));
-			if(paper_given == 3) {
-				msg.prefix(player, "§dIsabell", "DANKE! Du rettest mich und die Wissenschaft!");
-				msg(player, "§dQuest abgeschlossen. Belohnung: 10 Snuvis!");
-				money.addBoost(player, 10);
-				quest.finish(script, player);
-			}
+		rest_amount = human.giveItem(entity_name, player, "minecraft:paper", paper_neded);
+		if(rest_amount == 0) {
+			msg.prefix(player, "§dIsabell", "DANKE! Du rettest mich und die Wissenschaft!");
+			msg(player, "§dQuest abgeschlossen. Belohnung: 10 Snuvis!");
+			money.addBoost(player, 10);
+			quest.finish(script, player);
+		} else {
+			paper_neded = rest_amount;
 		}
 	}
 }

+ 14 - 22
story/admont/gaumenschmauss.txt

@@ -66,19 +66,14 @@ goto("wait");
 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");
+		rest_amount = human.giveItem(entity_name, player, "minecraft:coal", coal_counter);
+		if(rest_amount == 0) {
+			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!");
+		} else {
+			coal_counter = rest_amount;
 		}
-		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");
@@ -129,17 +124,14 @@ goto("wait");
 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");
+		rest_amount = human.giveItem(entity_name, player, "minecraft:beef", 1);
+		if(rest_amount == 0) {
+			msg.prefix(player, "§dDieter", "Super! Das wird ein einzigartiger Gaumenschmaus.");
+			player.safeGiveItem(player, read.item("minecraft:cooked_beef"));
+			msg(player, "§dQuest abgeschlossen. Belohnung: 10 Snuvis!");
+			money.addBoost(player, 10);
+			quest.finish(script, player);
 		}
-		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: 10 Snuvis!");
-		money.addBoost(player, 10);
-		quest.finish(script, player);
 	}
 }
 goto("wait");

+ 25 - 30
story/admont/helfende_hand.txt

@@ -11,9 +11,9 @@ quest_name = "Helfende Hand";
 wool = 0;
 iron = 0;
 coal = 0;
-wool_given = 0;
-iron_given = 0;
-coal_given = 0;
+wool_needed = 6;
+iron_needed = 3;
+coal_needed = 4;
 wool_tag = item.getTag("minecraft:wool");
 
 @wait
@@ -45,7 +45,7 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, "minecraft:coal_ore", false);
 		coal++;
-		if(coal == 4) {
+		if(coal == coal_needed) {
 			stage.increase(player);
 		}
 	}
@@ -53,7 +53,7 @@ if(event == "block_break") {
 		cancel = false;
 		scheduler.setBlock(5, block_loc, "minecraft:iron_ore", false);
 		iron++;
-		if(iron == 3) {
+		if(iron == iron_needed) {
 			stage.increase(player);
 		}
 	}
@@ -66,7 +66,7 @@ if(event == "entity_click") {
 			item_type = item.getType(item);
 			if(item_type == "minecraft:shears") {
 				wool++;
-				if(wool == 6) {
+				if(wool == wool_needed) {
 					stage.increase(player);
 				}
 			}
@@ -85,38 +85,33 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 		item = entity.getEquip(player, "hand");
 		item_type = item.getType(item);
 		if(item_type == "minecraft:coal") {
-			if(coal_given >= 4) {
-				goto("wait");
-			}
-			coal_given++;
-			player.removeItem(player, read.item("minecraft:coal"));
-			if(coal_given == 4) {
-				msg.prefix(player, "§dGustav", "Danke für die Kohle.");
+			if(coal_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, "minecraft:coal", coal_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dGustav", "Danke für die Kohle.");
+				}
+				coal_needed = rest_amount;
 			}
 		}
 		elseif(item_type == "minecraft:iron_ore") {
-			if(iron_given >= 3) {
-				goto("wait");
-			}
-			iron_given++;
-			player.removeItem(player, read.item("minecraft:iron_ore"));
-			if(iron_given == 3) {
-				msg.prefix(player, "§dGustav", "Danke für das Eisenerz.");
+			if(iron_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, "minecraft:iron_ore", iron_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dGustav", "Danke für das Eisenerz.");
+				}
+				iron_needed = rest_amount;
 			}
 		}
 		elseif(item.hasTag(wool_tag, item)) {
-			if(wool_given >= 6) {
-				goto("wait");
-			}
-			wool_given += item.getAmount(item);
-			player.removeItem(player, item);
-			if(wool_given == 6) {
-				msg.prefix(player, "§dGustav", "Danke für die Wolle.");
+			if(wool_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, wool_tag, wool_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dGustav", "Danke für die Wolle.");
+				}
+				wool_needed = rest_amount;
 			}
-		} else {
-			msg.prefix(player, "§dGustav", "Das kann ich nicht gebrauchen.");
 		}
-		if(coal_given >= 4 && iron_given >= 3 && wool_given >= 6) {
+		if(coal_needed == 0 && iron_needed == 0 && wool_needed == 0) {
 			money.addBoost(player, 8);
 			msg(player, "§dQuest abgeschlossen. Belohnung: 8 Snuvis!");
 			quest.finish(script, player);

+ 4 - 2
story/admont/ich_und_mein_holz.txt

@@ -48,12 +48,14 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Förster") {
-		wusi = human.giveItem("Förster", player, "minecraft:spruce_log", 32);
-		if(wusi == 0) {
+		rest_amount = human.giveItem("Förster", player, "minecraft:spruce_log", spruce_log);
+		if(rest_amount == 0) {
 			msg.prefix(player, "§dFörster", "Danke, ich werde es zur Verarbeitung weiterreichen");
 			money.addBoost(player, 8);
 			msg(player, "§dQuest abgeschlossen. Belohnung: 8 Snuvis!");
 			quest.finish(script, player);
+		} else {
+			spruce_log = rest_amount;
 		}
 	}
 }

+ 9 - 19
story/admont/in_eile.txt

@@ -8,7 +8,6 @@ stage = 0;
 all_stages = 2;
 quest_name = "In Eile";
 
-bread_given = 0;
 bread_needed = 21;
 wheat_needed = 63;
 wheat_harvestet = 0;
@@ -73,24 +72,15 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Ulf") {
-		item = entity.getEquip(player, "hand");
-		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "minecraft:bread") {
-			if(bread_given >= bread_needed) {
-				goto("wait");
-			}
-			bread_given++;
-			player.removeItem(player, read.item(item_type));
-			if(bread_given == bread_needed) {
-				msg.prefix(player, "§dBauer", "Du kommst gerade rechtzeitig, die Kunden sind eben eingetroffen! Hier eine Belohnung.");
-				player.giveItem(player, read.item("km:berry_work"));
-				msg(player, "§dQuest abgeschlossen. Belohnung: 5 Snuvis!");
-				money.addBoost(player, 5);
-				quest.finish(script, player);
-			}
+		rest_amount = human.giveItem(entity_name, player, "minecraft:bread", bread_needed);
+		if(rest_amount == 0) {
+			msg.prefix(player, "§dBauer", "Du kommst gerade rechtzeitig, die Kunden sind eben eingetroffen! Hier eine Belohnung.");
+			player.giveItem(player, read.item("km:berry_work"));
+			msg(player, "§dQuest abgeschlossen. Belohnung: 5 Snuvis!");
+			money.addBoost(player, 5);
+			quest.finish(script, player);
+		} else {
+			bread_needed = rest_amount;
 		}
 	}
 }

+ 59 - 73
story/admont/kraeutermeister.txt

@@ -28,15 +28,6 @@ crimson_fungus_needed = 1;
 warped_roots_needed = 2;
 crimson_roots_needed = 2;
 
-brown_mushroom_given = 0;
-red_mushroom_given = 0;
-nether_wart_given = 0;
-twisting_vines_given = 0;
-warped_fungus_given = 0;
-crimson_fungus_given = 0;
-warped_roots_given = 0;
-crimson_roots_given = 0;
-
 @wait
 wait();
 if(event == "living_death") {
@@ -211,92 +202,87 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 	if(entity_name == "Kunibert") {
 		item = entity.getEquip(player, "hand");
 		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "minecraft:brown_mushroom") {
-			if(brown_mushroom_given >= brown_mushroom_needed) {
-				goto("wait");
-			}
-			brown_mushroom_given++;
-			player.removeItem(player, read.item(item_type));
-			if(brown_mushroom_given == brown_mushroom_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für die braunen Pilze.");
+		if(item_type == "minecraft:brown_mushroom") {
+			if(brown_mushroom_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, brown_mushroom_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für die braunen Pilze.");
+				} else {
+					brown_mushroom_needed = rest_amount;
+				}
 			}
 		}
 		elseif(item_type == "minecraft:red_mushroom") {
-			if(red_mushroom_given >= red_mushroom_needed) {
-				goto("wait");
-			}
-			red_mushroom_given++;
-			player.removeItem(player, read.item(item_type));
-			if(red_mushroom_given == red_mushroom_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für die roten Pilze.");
+			if(red_mushroom_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, red_mushroom_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für die roten Pilze.");
+				} else {
+					red_mushroom_needed = rest_amount;
+				}
 			}
 		}
 		elseif(item_type == "minecraft:nether_wart") {
-			if(nether_wart_given >= nether_wart_needed) {
-				goto("wait");
-			}
-			nether_wart_given++;
-			player.removeItem(player, read.item(item_type));
-			if(nether_wart_given == nether_wart_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für die Netherwarzen.");
+			if(nether_wart_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, nether_wart_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für die Netherwarzen.");
+				} else {
+					nether_wart_needed = rest_amount;
+				}
 			}
 		}
 		elseif(item_type == "minecraft:crimson_roots") {
-			if(crimson_roots_given >= crimson_roots_needed) {
-				goto("wait");
-			}
-			crimson_roots_given++;
-			player.removeItem(player, read.item(item_type));
-			if(crimson_roots_given == crimson_roots_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für die Karmesinwurzeln.");
+			if(crimson_roots_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, crimson_roots_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für die Karmesinwurzeln.");
+				} else {
+					crimson_roots_needed = rest_amount;
+				}
 			}
 		}
 		elseif(item_type == "minecraft:crimson_fungus") {
-			if(crimson_fungus_given >= crimson_fungus_needed) {
-				goto("wait");
-			}
-			crimson_fungus_given++;
-			player.removeItem(player, read.item(item_type));
-			if(crimson_fungus_given == crimson_fungus_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für den Karmesinpilz.");
+			if(crimson_fungus_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, crimson_fungus_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für den Karmesinpilz.");
+				} else {
+					crimson_fungus_needed = rest_amount;
+				}
 			}
 		}
-		elseif(item_type == "minecraft:warped_roots") {
-			if(warped_roots_given >= warped_roots_needed) {
-				goto("wait");
-			}
-			warped_roots_given++;
-			player.removeItem(player, read.item(item_type));
-			if(warped_roots_given == warped_roots_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für die Wirrwurzeln.");
+		if(item_type == "minecraft:warped_roots") {
+			if(warped_roots_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, warped_roots_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für die Wirrwurzeln.");
+				} else {
+					warped_roots_needed = rest_amount;
+				}
 			}
 		}
 		elseif(item_type == "minecraft:warped_fungus") {
-			if(warped_fungus_given >= warped_fungus_needed) {
-				goto("wait");
-			}
-			warped_fungus_given++;
-			player.removeItem(player, read.item(item_type));
-			if(warped_fungus_given == warped_fungus_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für den Wirrpilz.");
+			if(warped_fungus_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, warped_fungus_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für den Wirrpilz.");
+				} else {
+					warped_fungus_needed = rest_amount;
+				}
 			}
 		}
 		elseif(item_type == "minecraft:twisting_vines") {
-			if(twisting_vines_given >= twisting_vines_needed) {
-				goto("wait");
+			if(twisting_vines_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, twisting_vines_needed);
+				if(rest_amount == 0) {
+					msg.prefix(player, "§dKunibert", "Danke für die Zwirbelranken.");
+				} else {
+					twisting_vines_needed = rest_amount;
+				}
 			}
-			twisting_vines_given++;
-			player.removeItem(player, read.item(item_type));
-			if(twisting_vines_given == twisting_vines_needed) {
-				msg.prefix(player, "§dKunibert", "Danke für die Zwirbelranken.");
-			}
-		} else {
-			msg.prefix(player, "§dKunibert", "Das kann ich nicht gebrauchen.");
 		}
-		if(brown_mushroom_given >= brown_mushroom_needed && red_mushroom_given >= red_mushroom_needed && nether_wart_given >= nether_wart_needed && crimson_roots_given >= crimson_roots_needed && crimson_fungus_given >= crimson_fungus_needed && warped_roots_given >= warped_roots_needed && warped_fungus_given >= warped_fungus_needed && twisting_vines_given >= twisting_vines_needed) {
+		if(brown_mushroom_needed == 0 && red_mushroom_needed == 0 && nether_wart_needed == 0 && crimson_roots_needed == 0 && crimson_fungus_needed == 0 && warped_roots_needed == 0 && warped_fungus_needed == 0 && twisting_vines_needed == 0) {
 			msg.prefix(player, "§dKunibert", "Damit kann ich einiges anstellen. Vielen Dank!");
 			money.addBoost(player, 12);
 			msg(player, "§dQuest abgeschlossen. Belohnung: 12 Snuvis!");

+ 43 - 47
story/admont/mitbringsel.txt

@@ -7,14 +7,6 @@ stage = 0;
 all_stages = 3;
 quest_name = "Mitbringsel";
 
-herb_strong_given = 0;
-herb_shadow_given = 0;
-herb_xp_given = 0;
-herb_sea_given = 0;
-herb_gold_given = 0;
-herb_breathing_given = 0;
-herb_fire_given = 0;
-
 herb_strong_needed = 10;
 herb_shadow_needed = 2;
 herb_xp_needed = 1;
@@ -89,59 +81,63 @@ if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "
 	if(entity_name == "Kunibert") {
 		item = entity.getEquip(player, "hand");
 		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "km:herb_strong") {
-			if(herb_strong_given >= herb_strong_needed) {
-				goto("wait");
+		if(item_type == "km:herb_strong") {
+			if(herb_strong_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, herb_strong_needed);
+				if(rest_amount != 0) {
+					herb_strong_needed = rest_amount;
+				}
 			}
-			herb_strong_given++;
-			player.removeItem(player, read.item(item_type));
 		}
-		elseif(item_type == "km:herb_shadow") {
-			if(herb_shadow_given >= herb_shadow_needed) {
-				goto("wait");
+		elseifif(item_type == "km:herb_shadow") {
+			if(herb_shadow_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, herb_shadow_needed);
+				if(rest_amount != 0) {
+					herb_shadow_needed = rest_amount;
+				}
 			}
-			herb_shadow_given++;
-			player.removeItem(player, read.item(item_type));
 		}
-		elseif(item_type == "km:herb_xp") {
-			if(herb_xp_given >= herb_xp_needed) {
-				goto("wait");
+		elseifif(item_type == "km:herb_xp") {
+			if(herb_xp_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, herb_xp_needed);
+				if(rest_amount != 0) {
+					herb_xp_needed = rest_amount;
+				}
 			}
-			herb_xp_given++;
-			player.removeItem(player, read.item(item_type));
 		}
-		elseif(item_type == "km:herb_sea") {
-			if(herb_sea_given >= herb_sea_needed) {
-				goto("wait");
+		elseifif(item_type == "km:herb_sea") {
+			if(herb_sea_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, herb_sea_needed);
+				if(rest_amount != 0) {
+					herb_sea_needed = rest_amount;
+				}
 			}
-			herb_sea_given++;
-			player.removeItem(player, read.item(item_type));
 		}
-		elseif(item_type == "km:herb_gold") {
-			if(herb_gold_given >= herb_gold_needed) {
-				goto("wait");
+		elseifif(item_type == "km:herb_gold") {
+			if(herb_gold_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, herb_gold_needed);
+				if(rest_amount != 0) {
+					herb_gold_needed = rest_amount;
+				}
 			}
-			herb_gold_given++;
-			player.removeItem(player, read.item(item_type));
 		}
-		elseif(item_type == "km:herb_breathing") {
-			if(herb_breathing_given >= herb_breathing_needed) {
-				goto("wait");
+		elseifif(item_type == "km:herb_breathing") {
+			if(herb_breathing_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, herb_breathing_needed);
+				if(rest_amount != 0) {
+					herb_breathing_needed = rest_amount;
+				}
 			}
-			herb_breathing_given++;
-			player.removeItem(player, read.item(item_type));
 		}
-		elseif(item_type == "km:herb_fire") {
-			if(herb_fire_given >= herb_fire_needed) {
-				goto("wait");
+		elseifif(item_type == "km:herb_fire") {
+			if(herb_fire_needed > 0) {
+				rest_amount = human.giveItem(entity_name, player, item_type, herb_fire_needed);
+				if(rest_amount != 0) {
+					herb_fire_needed = rest_amount;
+				}
 			}
-			herb_fire_given++;
-			player.removeItem(player, read.item(item_type));
 		}
-		if(herb_strong_given == herb_strong_needed && herb_shadow_given == herb_shadow_needed && herb_xp_given == herb_xp_needed && herb_sea_given == herb_sea_needed && herb_gold_given == herb_gold_needed && herb_breathing_given == herb_breathing_needed && herb_fire_given == herb_fire_needed) {
+		if(herb_strong_needed == 0 && herb_shadow_needed == 0 && herb_xp_needed == 0 && herb_sea_needed == 0 && herb_gold_needed == 0 && herb_breathing_needed == 0 && herb_fire_needed == 0) {
 			msg.prefix(player, "§dKunibert", "Ahhh.. dich hat der liebe Olaf geschickt! Ach, das ist doch pure Freude, wenn er mir etwas von seinen Reisen mitbringt.");
 			scheduler.msgPrefix(30, player, "§dKunibert", "Gib ihm doch dies als Dankeschön.");
 			scheduler.giveItem(30, player, read.item("minecraft:blue_orchid"));

+ 2 - 7
story/admont/reinigung.txt

@@ -84,13 +84,8 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Olaf") {
-		item = entity.getEquip(player, "hand");
-		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "minecraft:nautilus_shell") {
-			player.removeItem(player, read.item(item_type));
+		rest_amount = human.giveItem(entity_name, player, "minecraft:nautilus_shell", 1);
+		if(rest_amount == 0) {
 			msg(player, "§dQuest abgeschlossen. Belohnung: 4 Snuvis!");
 			money.addBoost(player, 4);
 			quest.finish(script, player);

+ 7 - 17
story/admont/spezialwunsch.txt

@@ -9,7 +9,6 @@ stage = 0;
 all_stages = 3;
 quest_name = "Spezialwunsch";
 
-hay_given = 0;
 hay_needed = 13;
 hay_harvestet = 0;
 
@@ -95,22 +94,13 @@ goto("wait");
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Bauer") {
-		item = entity.getEquip(player, "hand");
-		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "km:hay_bundle") {
-			if(hay_given >= hay_needed) {
-				goto("wait");
-			}
-			hay_given++;
-			player.removeItem(player, read.item(item_type));
-			if(hay_given == hay_needed) {
-				msg(player, "§dQuest abgeschlossen. Belohnung: 4 Snuvis!");
-				money.addBoost(player, 4);
-				quest.finish(script, player);
-			}
+		rest_amount = human.giveItem(entity_name, player, "km:hay_bundle", hay_needed);
+		if(rest_amount == 0) {
+			msg(player, "§dQuest abgeschlossen. Belohnung: 4 Snuvis!");
+			money.addBoost(player, 4);
+			quest.finish(script, player);
+		} else {
+			hay_needed = rest_amount;
 		}
 	}
 }

+ 9 - 15
story/admont/tuecher.txt

@@ -15,7 +15,7 @@ loom_list_2 = list.new();
 par = particle.get("minecraft:witch");
 loom_coarse = 0;
 loom_cloth = 0;
-give_amount = 4;
+needed_amount = 4;
 
 @wait
 wait();
@@ -238,20 +238,14 @@ function loom2(location, input_item_entity_1, output_item) {
 if(event == "entity_click" && hand == "MAIN_HAND" && entity.getType(entity) == "human") {
 	entity_name = entity.getName(entity);
 	if(entity_name == "Rolf") {
-		item = entity.getEquip(player, "hand");
-		item_type = item.getType(item);
-		if(item_type == "minecraft:air") {
-			goto("wait");
-		}
-		elseif(item_type == "km:cloth") {
-			rest_item = player.removeItem(player, read.item(item_type, give_amount));
-			give_amount = item.getAmount(rest_item);
-			if(give_amount == 0) {
-				msg.prefix(player, "§dRolf", "Vielen Dank!");
-				money.addBoost(player, 8);
-				msg(player, "§dQuest abgeschlossen. Belohnung: 8 Snuvis!");
-				quest.finish(script, player);
-			}
+		rest_amount = human.giveItem(entity_name, player, "km:cloth", needed_amount);
+		if(rest_amount == 0) {
+			msg.prefix(player, "§dRolf", "Vielen Dank!");
+			money.addBoost(player, 8);
+			msg(player, "§dQuest abgeschlossen. Belohnung: 8 Snuvis!");
+			quest.finish(script, player);
+		} else {
+			needed_amount = rest_amount;
 		}
 	}
 }

+ 9 - 0
sword_test.txt

@@ -0,0 +1,9 @@
+weapon = item.getTag("km:melee_weapon");
+msg("dev", weapon);
+
+event.load("block_break");
+
+@wait
+wait();
+msg("dev", item.hasTag(weapon, entity.getEquip(player, "hand")));
+goto("wait");

+ 13 - 8
system/chat.txt

@@ -134,8 +134,8 @@ player.showDefaultStacks(player);
 stacks.setActive(player, true);
 rank.offerTimeScheduled(player);
 displayMoney(player, getMoney(player));
-//send marvinius amount of errors
-if(player_id == 2) {
+//send marvinius and sirterence amount of errors
+if(player_id == 2 || player_id == 35) {
 	error_size = error.getSize();
 	if(error_size > 0) {
 		msg.prefix(player, "§cError", concat("There are ", text.number(error_size), " errors."));
@@ -157,6 +157,10 @@ rank.removeTimeOffert(player);
 goto("wait");
 
 @chat
+if(text.startsWith(message, "%", 0)) {
+	cancel = true;
+	goto("wait");
+}
 if(text.startsWith(message, "7", 0)) {
 	length = text.length(message);
 	space_index = read.number(text.indexOf(message, " ", 1));
@@ -222,17 +226,18 @@ function player.greet(player) {
 	title.reset(player);
 	title.setSub(player, concat("§cNice to see you §6", player_name));
 	title.send(player, "");
-	list.add($headlist, player);
-	sgoto(20, "showHead");
+	list.add($headlist, player.getUuid(player));
+	sgoto(40, "showHead");
 }
 
 @showHead
-p = list.getIndex(headlist, 0);
+p_uuid = list.getIndex(headlist, 0);
 list.removeIndex(headlist, 0);
-p_name = player.getName(p);
-head.add(p, 0, p_name, 0.4, 0.1, 0.2, 0.35);
+p_name = player.getName(p_uuid);
+p = player.get(p_uuid);
+head.add(p, 0, p_name, 0.43, 0.2, 0.14, 0.25);
 list.add($headlist2, p);
-sgoto(60, "removeHead");
+sgoto(80, "removeHead");
 goto("wait");
 
 @removeHead

+ 209 - 123
system/commands.txt

@@ -26,6 +26,7 @@ command.add("infopoint11");
 //Vanilla überschreiben
 command.add("help");
 command.add("butcher");
+command.add("yeet");
 
 alias_map = map.new();
 command_list = list.new();
@@ -63,6 +64,7 @@ command.register("head", "Gives you a player's head");
 command.register("heal", "Heals, fills hunger bar and remove effects");
 command.register("home", "Manage your homes");
 command.register("live", "Toggles Live-Mode");
+command.register("lag", "Executes a lag test");
 command.register("leave", "Leave a minigame");
 command.register("human", "Human-Commands");
 command.register("inv", "Inv-Commands");
@@ -86,6 +88,7 @@ command.register("playtime", "Shows your playtime");
 command.register("plot", "Plot-Commands");
 command.register("plough", "Plough dirt around you");
 command.register("pvp", "Toggles pvp");
+command.register("quest", "Quest-Commands");
 command.register("rank", "Shows your available ranks");
 command.register("repair", "Repairs your item in mainhand");
 command.register("report", "Report whatever you want");
@@ -136,6 +139,7 @@ command.register("warn", "Warns a player");
 command.register("warp", "Warp-Commands");
 command.register("weather", "Weather-Commands");
 command.register("world", "World-Commands");
+command.register("yeet", "Throws the Player");
 
 command.registerAlias("afklo", "afk");
 command.registerAlias("itemdb", "iteminfo");
@@ -248,7 +252,6 @@ if(afk_map == null) {
 		if(player != null) {
 			player.setAfk(player, true);
 			afk_loop_active = true;
-			
 		}
 	}
 }
@@ -263,6 +266,7 @@ money.setBoostFactor(1);
 sgoto(10, "coordsloop");
 sgoto(1200, "afk_checker_loop");
 
+lag_list = list.new();
 clan_invitations = list.new();
 friend_requests = map.new();
 lock_chests = map.new();
@@ -350,74 +354,19 @@ rank_array[24, 0] = "rank.user";
 rank_array[24, 1] = "3User";
 setScriptVar("ranks", rank_array);
 
-permgroupToRank = map.new();
-map.add(permgroupToRank, "admin", "cAdmin");
-map.add(permgroupToRank, "builder", "5Builder");
-map.add(permgroupToRank, "vip", "dVIP");
-map.add(permgroupToRank, "dev", "5Developer");
-map.add(permgroupToRank, "supporter", "bSupporter");
-map.add(permgroupToRank, "mod", "9Moderator");
-map.add(permgroupToRank, "yt", "dInfluencer");
-map.add(permgroupToRank, "streamer", "dInfluencer");
-map.add(permgroupToRank, "sponsor", "dSponsor");
-
-permgroupsmap = map.new();
-map.add(permgroupsmap, "worldedit", 1);
-map.add(permgroupsmap, "admin", 2);
-map.add(permgroupsmap, "builder", 3);
-map.add(permgroupsmap, "vip", 4);
-map.add(permgroupsmap, "dev", 5);
-map.add(permgroupsmap, "teleport", 6);
-map.add(permgroupsmap, "supporter", 9);
-map.add(permgroupsmap, "streamer", 11);
-map.add(permgroupsmap, "mod", 12);
-map.add(permgroupsmap, "yt", 13);
-map.add(permgroupsmap, "sponsor", 14);
-map.add(permgroupsmap, "bypass", 15);
-map.add(permgroupsmap, "creative", 17);
-
-permgroupsmap2 = map.new();
-map.add(permgroupsmap2, 1, "worldedit");
-map.add(permgroupsmap2, 2, "admin");
-map.add(permgroupsmap2, 3, "builder");
-map.add(permgroupsmap2, 4, "vip");
-map.add(permgroupsmap2, 5, "dev");
-map.add(permgroupsmap2, 6, "teleport");
-map.add(permgroupsmap2, 9, "supporter");
-map.add(permgroupsmap2, 11, "streamer");
-map.add(permgroupsmap2, 12, "mod");
-map.add(permgroupsmap2, 13, "yt");
-map.add(permgroupsmap2, 14, "sponsor");
-map.add(permgroupsmap2, 15, "bypass");
-map.add(permgroupsmap2, 17, "creative");
-
-monthlist = map.new();
-map.add(monthlist, 1, "Jan");
-map.add(monthlist, 2, "Feb");
-map.add(monthlist, 3, "Mar");
-map.add(monthlist, 4, "Apr");
-map.add(monthlist, 5, "May");
-map.add(monthlist, 6, "Jun");
-map.add(monthlist, 7, "Jul");
-map.add(monthlist, 8, "Aug");
-map.add(monthlist, 9, "Sep");
-map.add(monthlist, 10, "Oct");
-map.add(monthlist, 11, "Nov");
-map.add(monthlist, 12, "Dec");
-
-monthdays = map.new();
-map.add(monthdays, 1, 31);
-map.add(monthdays, 2, 28);
-map.add(monthdays, 3, 31);
-map.add(monthdays, 4, 30);
-map.add(monthdays, 5, 31);
-map.add(monthdays, 6, 30);
-map.add(monthdays, 7, 31);
-map.add(monthdays, 8, 31);
-map.add(monthdays, 9, 30);
-map.add(monthdays, 10, 31);
-map.add(monthdays, 11, 30);
-map.add(monthdays, 12, 31);
+month_array = array.new(12, 2);
+month.add(0, "Jan", 31);
+month.add(1, "Feb", 28);
+month.add(2, "Mar", 31);
+month.add(3, "Apr", 30);
+month.add(4, "May", 31);
+month.add(5, "Jun", 30);
+month.add(6, "Jul", 31);
+month.add(7, "Aug", 31);
+month.add(8, "Sep", 30);
+month.add(9, "Oct", 31);
+month.add(10, "Nov", 30);
+month.add(11, "Dec", 31);
 
 jailed_list = list.new();
 ironbars = read.item("minecraft:iron_bars", 1, "§r");
@@ -475,7 +424,7 @@ check_for_plot_list = list.new();
 plot.registerMoveEvents(world.get("overworld"));
 plot.registerMoveEvents(world.get("the_nether"));
 plot.registerMoveEvents(world.get("the_end"));
-plot.registerMoveEvents(world.get("games"));
+plot.registerMoveEvents(world.get("creative"));
 
 event.load("entity_click");
 event.load("player_move");
@@ -661,6 +610,8 @@ if(event == "player_logout") {
 		script_id = quest.getFromPlayer(player);
 		script = script.getFromId(script_id);
 		if(script == null) {
+			snuvi.debug("Player logged out with corrupt quest");
+			quest.removePlayer(player); //in case of corrupt quest
 			goto("wait");
 		}
 		setScriptVar("player", player);
@@ -1450,6 +1401,29 @@ if(arg0 == "delete") {
 }
 goto("wait");
 
+@lag
+msg.prefix(player, prefix_commands, "Lag test is performed. Please wait...");
+a = array.new(2);
+a[0] = player.getUuid(player);
+a[1] = time.getMillis();
+list.add(lag_list, a);
+sgoto(100, "do_lag_test");
+goto("wait");
+
+@do_lag_test
+t = time.getMillis();
+a = list.getIndex(lag_list, 0);
+list.removeIndex(lag_list, 0);
+p_uuid = a[0];
+t_old = a[1];
+t = math.roundComma((t - t_old) / 5000 * 20, 2); //Umwandlung 5000ms -> 1s -> 20ticks
+p = player.get(p_uuid);
+if(p != null) {
+	msg.prefix(p, prefix_commands, "Expected: 20 ticks/sec");
+	msg.prefix(p, prefix_commands, concat("Measured: ", t, " ticks/sec"));
+}
+goto("wait");
+
 @live
 boolean = !player.isLive(player);
 player.setLive(player, boolean);
@@ -1468,6 +1442,17 @@ entity.spawn("minecraft:lightning_bolt", location);
 goto("wait");
 
 @ride
+world_name = world.getName(loc.getWorld(entity.getLocation(player)));
+if(world.isGamesName(world_name)) {
+	if(player.hasMinigame(affectedplayer) || (perm.has(affectedplayer, "ride") && !perm.has(affectedplayer, "isTeam"))) {
+		if(size == 2) {
+			msg.prefix(player, prefix_commands, "This player can't use this now.");
+		} else {
+			msg.prefix(player, prefix_commands, "You can't use this now.");
+		}
+		goto("wait");
+	}
+}
 player_uuid = player.getUuid(player);
 if(set.contains(ride_set, player_uuid)) {
 	msg.prefix(player, prefix_commands, "Entity-Ride-Click removed.");
@@ -1563,6 +1548,48 @@ msg(player, table.get(table, "Money", text.number(getMoney(p_or_id))));
 msg(player, table.getEnd(table));
 goto("wait");
 
+@quest
+if(size == 0) {
+	@quest_syntax
+	msg.prefix(player, prefix_quest, "§r/quest ...");
+	msg(player, "§5 - term <player> §rTerminates a player's quest");
+	goto("wait");
+}
+arg0 = text.toLowerCase(list.getIndex(args, 0));
+if(arg0 == "term") {
+	if(size != 2) {
+		msg.prefix(player, prefix_quest, "§r/quest term <player>");
+		goto("wait");
+	}
+	p_name = list.getIndex(args, 1);
+	if(!checkIfEverOnline(p_name)) {
+		msg.prefix(player, prefix_quest, "This player has never been online.");
+		goto("wait");
+	}
+	p = read.player(p_name);
+	if(p == null) {
+		msg.prefix(player, prefix_quest, "This player is not online.");
+		goto("wait");
+	}
+	script_id = quest.getFromPlayer(p);
+	if(script_id == null) {
+		msg.prefix(player, prefix_quest, "This player has no quest.");
+		goto("wait");
+	}
+	script = script.getFromId(script_id);
+	if(script == null) {
+		quest.removePlayer(p);
+		msg.prefix(player, prefix_quest, "Corrupt quest terminated.");
+		goto("wait");
+	}
+	setScriptVar("player", p);
+	script.callEvent("quest_term", script);
+	quest.term(script, player);
+	msg.prefix(player, prefix_quest, "Player's quest terminated.");
+	goto("wait");
+}
+goto("quest_syntax");
+
 @friend
 if(size == 0) {
 	@friend_syntax
@@ -2027,11 +2054,12 @@ if(player.isAfk(player)) {
 } else {
 	msg.prefix("online", prefix_commands, concat(nickname, "§7 is now afk."));
 	player.setAfk(player, true);
+	if(!afk_loop_active) {
+		afk_loop_active = true;
+		sgoto(30, "afk_loop");
+	}
 }
 player.setTabName(player);
-if(!afk_loop_active) {
-	sgoto(30, "afk_loop");
-}
 goto("wait");
 
 @silentjoin
@@ -2073,6 +2101,9 @@ sgoto(10, "coordsloop");
 goto("wait");
 
 @afk_loop
+if(!afk_loop_active) {
+	goto("wait");
+}
 afk_map = getScriptVar("afk_map");
 iter = map.iterator(afk_map);
 while(hasNext(iter)) {
@@ -2132,6 +2163,7 @@ while(hasNext(iter)) {
 		player.setAfk(p, true);
 		player.setTabName(p);
 		if(!afk_loop_active) {
+			afk_loop_active = true;
 			sgoto(30, "afk_loop");
 		}
 	}
@@ -2285,21 +2317,27 @@ if(arg0 == "give") {
 			msg.prefix(player, prefix_perms, "This player has never been online.");
 			goto("wait");
 		}
-		if(!isAPermGroup(perm)) {
-			msg.prefix(player, prefix_perms, "This is no permission group.");
+		if(!perm.isGroupName(perm)) {
+			msg.prefix(player, prefix_perms, "This is not a permission group.");
 			goto("wait");
 		}
+		if(!perm.has(player, "isAdmin")) {
+			if(perm == "admin" || perm == "mod" || perm == "bypass") {
+				msg.prefix(player, prefix_perms, "Only admins can give this permission group.");
+				goto("wait");
+			}
+		}
 		p_uuid = player.getUuid(p_name);
 		p_id = player.getId(p_uuid);
 		p_name = player.getName(p_uuid);
-		perm_id = map.get(permgroupsmap, perm);
-		if(hasPermAlready(p_id, perm_id)) {
+		perm_id = perm.getIdFromGroupname(perm);
+		if(player.hasPermGroup(p_id, perm_id)) {
 			msg.prefix(player, prefix_perms, "Perm already added.");
 			goto("wait");
 		}
 		if(isOnline(p_name)) {
 			p = read.player(p_name);
-			rank = map.get(permgroupToRank, perm);
+			rank = perm.getRankFromGroupname(perm);
 			if(rank != null) {
 				offerRank(p, rank.getTechName(rank));
 			}
@@ -2323,10 +2361,16 @@ if(arg0 == "remove") {
 			msg.prefix(player, prefix_perms, "This player has never been online.");
 			goto("wait");
 		}
-		if(!isAPermGroup(perm)) {
-			msg.prefix(player, prefix_perms, "This is no permission group.");
+		if(!perm.isGroupName(perm)) {
+			msg.prefix(player, prefix_perms, "This is not a permission group.");
 			goto("wait");
 		}
+		if(!perm.has(player, "isAdmin")) {
+			if(perm == "admin" || perm == "mod" || perm == "bypass") {
+				msg.prefix(player, prefix_perms, "Only admins can give this permission group.");
+				goto("wait");
+			}
+		}
 		p_uuid = player.getUuid(p_name);
 		p_id = player.getId(p_uuid);
 		p_name = player.getName(p_uuid);
@@ -2338,8 +2382,8 @@ if(arg0 == "remove") {
 				goto("wait");
 			}
 		}
-		perm_id = map.get(permgroupsmap, perm);
-		if(!hasPermAlready(p_id, perm_id)) {
+		perm_id = perm.getIdFromGroupname(perm);
+		if(!player.hasPermGroup(p_id, perm_id)) {
 			msg.prefix(player, prefix_perms, "This player doesn't have that perm.");
 			goto("wait");
 		}
@@ -2396,7 +2440,7 @@ if(arg0 == "list") {
 		} else {
 			msg.prefix(player, prefix_perms, p_name);
 			for(i = 0; i < listsize; i++) {
-				msg(player, " - ", map.get(permgroupsmap2, list.getIndex(permslist, i)));
+				msg(player, " - ", perm.getNameFromId(list.getIndex(permslist, i)));
 			}
 		}
 	}
@@ -3308,7 +3352,7 @@ if(size == 0) {
 				change = math.round(a / b * 100 - 100);
 				change = concat(color, text.number(change), " %");
 			}
-			msg(player, table.get(table, concat("§6", map.get(monthlist, i)), time_string, change));
+			msg(player, table.get(table, concat("§6", month.getShortName(i)), time_string, change));
 			if(i == now_month && year == now_year) {
 				break;
 			}
@@ -3356,7 +3400,7 @@ if(size == 0) {
 		//Tabelle erstellen
 		table = table.new("§8", 4, 5, 5);
 		msg(player, table.getStart(table));
-		msg(player, table.get(table, map.get(monthlist, month), "Playtime", "Players"));
+		msg(player, table.get(table, month.getShortName(month), "Playtime", "Players"));
 		msg(player, table.getMiddle(table));
 		//Erstes Mitternacht des gewählten Monats festlegen
 		now_day = time.getDay(calendar);
@@ -4079,7 +4123,7 @@ p = read.player(p_name);
 p_name = player.getName(p);
 if(p_name == "marvinius") {
 	msg(player, "§cSorry §b¯\\_(ツ)_/¯");
-	//goto("wait");
+	goto("wait");
 }
 head.add(p, 0, sender_name, 0.4, 0.05, 0.2, 0.35);
 title.setSub(p, "is watching you");
@@ -5827,12 +5871,12 @@ if(!player.doesAcceptTpaRequests(p)) {
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, "You can't teleport in this world.");
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(p)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, "You can't teleport to this world.");
 	goto("wait");
 }
@@ -5863,12 +5907,12 @@ if(!player.doesAcceptTpaRequests(p)) {
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, concat("§c", p_name, "§r isn't allowed to teleport to this world."));
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(p)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, concat("§c", p_name, "§r isn't allowed to teleport from their world."));
 	goto("wait");
 }
@@ -5895,12 +5939,12 @@ if(p == null) {
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, concat("§c", p_name, "§r isn't allowed to teleport to your world."));
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(p)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, concat("§c", p_name, "§r isn't allowed to teleport from their world."));
 	goto("wait");
 }
@@ -5931,12 +5975,12 @@ if(p == null) {
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, "You can't teleport in this world.");
 	goto("wait");
 }
 world_name = world.getName(loc.getWorld(entity.getLocation(p)));
-if(isGamesWorldName(world_name)) {
+if(world.isGamesName(world_name)) {
 	msg.prefix(player, prefix_commands, "You can't teleport to this world.");
 	goto("wait");
 }
@@ -6124,12 +6168,12 @@ if(warp_loc == null) {
 }
 if(!perm.has(player, "warp.create")) {
 	world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-	if(isGamesWorldName(world_name)) {
+	if(world.isGamesName(world_name)) {
 		msg.prefix(player, prefix_commands, "You can't teleport in this world.");
 		goto("wait");
 	}
 	world_name = world.getName(loc.getWorld(warp_loc));
-	if(isGamesWorldName(world_name)) {
+	if(world.isGamesName(world_name)) {
 		msg.prefix(player, prefix_commands, "You can't teleport to this world.");
 		goto("wait");
 	}
@@ -6343,13 +6387,16 @@ if(size >= 1) {
 		goto("wait");
 	}
 }
-if(player.hasMinigame(affectedplayer)) {
-	if(size == 2) {
-		msg.prefix(player, prefix_commands, "This player can't fly now.");
-	} else {
-		msg.prefix(player, prefix_commands, "You can't fly now.");
+world_name = world.getName(loc.getWorld(entity.getLocation(player)));
+if(world.isGamesName(world_name)) {
+	if(player.hasMinigame(affectedplayer) || (perm.has(affectedplayer, "fly") && !perm.has(affectedplayer, "isTeam"))) {
+		if(size == 2) {
+			msg.prefix(player, prefix_commands, "This player can't fly now.");
+		} else {
+			msg.prefix(player, prefix_commands, "You can't fly now.");
+		}
+		goto("wait");
 	}
-	goto("wait");
 }
 if(size == 2) {
 	boolean = list.getIndex(args, 1);
@@ -6461,7 +6508,7 @@ if(player.hasMinigame(player)) {
 hasPerms = perm.has(player, "isTeam");
 if(!hasPerms) {
 	world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-	if(isGamesWorldName(world_name) || isStoryWorldName(world_name)) {
+	if(world.isGamesName(world_name) || world.isStoryName(world_name)) {
 		msg.prefix(player, prefix_commands, "You can't use /back in this world.");
 		goto("wait");
 	}
@@ -6478,7 +6525,7 @@ if(world == null) {
 }
 if(!hasPerms) {
 	world_name = world.getName(world);
-	if(isGamesWorldName(world_name)) {
+	if(world.isGamesName(world_name)) {
 		msg.prefix(player, prefix_commands, "You can't teleport to this world.");
 		goto("wait");
 	}
@@ -7124,7 +7171,7 @@ if(arg0 == "spawn") {
 	}
 	if(!perm.has(player, "isTeam")) {
 		world_name = world.getName(loc.getWorld(entity.getLocation(player)));
-		if(isGamesWorldName(world_name)) {
+		if(world.isGamesName(world_name)) {
 			msg.prefix(player, prefix_commands, "You can't teleport in this world.");
 			goto("wait");
 		}
@@ -7519,6 +7566,16 @@ if(arg0 == "diffi") {
 }
 goto("world_syntax");
 
+@yeet
+if(size == 0){
+	msg.prefix(player, prefix_commands, "/yeet <strength>");
+	goto("wait");
+}
+yeet_strength = list.getIndex(args, 0);
+yeet(player,math.abs(yeet_strength));
+msg(player, "§4YEET");
+goto("wait");
+
 @giveup
 script_id = quest.getFromPlayer(player);
 if(script_id == null) {
@@ -7527,6 +7584,8 @@ if(script_id == null) {
 }
 script = script.getFromId(script_id);
 if(script == null) {
+	snuvi.debug("Player used giveup on corrupt quest");
+	quest.removePlayer(player); //in case of corrupt quest
 	msg.prefix(player, prefix_quest, "You have no quest.");
 	goto("wait");
 }
@@ -7615,10 +7674,6 @@ if(size != 1) {
 }
 goto("wait");
 
-//--------------------------------------------------
-//Inv-Utils
-//--------------------------------------------------
-
 function inv.show(from_player, to_player) {
 	player_inv = player.getInv(from_player);
 	//inv = inv.new("333303000 333333333 333333333 333333333 000000000 333333333");
@@ -7897,8 +7952,10 @@ function setCommandHelps() {
 	commandhelp.add("top");
 	commandhelp.add("ride");
 	commandhelp.add("repair");
+	commandhelp.add("lag");
 	commandhelp.add("live");
 	commandhelp.add("hack");
+	commandhelp.add("vote");
 	
 	commandhelp.addChildPlayer("mute");
 	commandhelp.addChildPlayer("unmute");
@@ -8242,10 +8299,10 @@ function setCommandHelps() {
 	
 	help = command.newHelp("perm", "perm");
 	//perm give <player> <perm>
-	helpArg0 = command.newHelpLiteral("give");
+	helpArg0 = command.newHelpLiteral("give", "perm.give");
 	helpArg1 = command.newHelpSpecial("Player", "player");
-	command.addHelpChild(helpArg1, command.newHelpLiteral("admin"));
-	command.addHelpChild(helpArg1, command.newHelpLiteral("mod"));
+	command.addHelpChild(helpArg1, command.newHelpLiteral("admin", "isAdmin"));
+	command.addHelpChild(helpArg1, command.newHelpLiteral("mod", "isAdmin"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("supporter"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("builder"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("worldedit"));
@@ -8255,15 +8312,15 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg1, command.newHelpLiteral("yt"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("streamer"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("sponsor"));
-	command.addHelpChild(helpArg1, command.newHelpLiteral("bypass"));
+	command.addHelpChild(helpArg1, command.newHelpLiteral("bypass", "isAdmin"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("creative"));
 	command.addHelpChild(helpArg0, helpArg1);
 	command.addHelpChild(help, helpArg0);
 	//perm remove <player> <perm>
-	helpArg0 = command.newHelpLiteral("remove");
+	helpArg0 = command.newHelpLiteral("remove", "perm.remove");
 	helpArg1 = command.newHelpSpecial("Player", "player");
-	command.addHelpChild(helpArg1, command.newHelpLiteral("admin"));
-	command.addHelpChild(helpArg1, command.newHelpLiteral("mod"));
+	command.addHelpChild(helpArg1, command.newHelpLiteral("admin", "isAdmin"));
+	command.addHelpChild(helpArg1, command.newHelpLiteral("mod", "isAdmin"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("supporter"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("builder"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("worldedit"));
@@ -8271,21 +8328,22 @@ function setCommandHelps() {
 	command.addHelpChild(helpArg1, command.newHelpLiteral("vip"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("dev"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("yt"));
+	command.addHelpChild(helpArg1, command.newHelpLiteral("streamer"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("sponsor"));
-	command.addHelpChild(helpArg1, command.newHelpLiteral("bypass"));
+	command.addHelpChild(helpArg1, command.newHelpLiteral("bypass", "isAdmin"));
 	command.addHelpChild(helpArg1, command.newHelpLiteral("creative"));
 	command.addHelpChild(helpArg0, helpArg1);
 	command.addHelpChild(help, helpArg0);
 	//perm removeall <player>
-	helpArg0 = command.newHelpLiteral("removeall");
+	helpArg0 = command.newHelpLiteral("removeall", "perm.removeall");
 	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player"));
 	command.addHelpChild(help, helpArg0);
 	//perm list <player>
-	helpArg0 = command.newHelpLiteral("list");
+	helpArg0 = command.newHelpLiteral("list", "perm.list");
 	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player"));
 	command.addHelpChild(help, helpArg0);
 	//perm toggle
-	command.addHelpChild(help, command.newHelpLiteral("toggle"));
+	command.addHelpChild(help, command.newHelpLiteral("toggle", "perm.toggle"));
 	command.addHelp(help);
 	
 	help = command.newHelp("script", "script");
@@ -8634,6 +8692,13 @@ function setCommandHelps() {
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
 	
+	help = command.newHelp("quest", "quest");
+	//quest term <player>
+	helpArg0 = command.newHelpLiteral("term");
+	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player"));
+	command.addHelpChild(help, helpArg0);
+	command.addHelp(help);
+	
 	help = command.newHelp("pvp", "pvp");
 	helpArg0 = command.newHelpLiteral("on");
 	command.addHelpChild(helpArg0, command.newHelpSpecial("Player", "player", "pvp.other"));
@@ -8860,6 +8925,10 @@ function setCommandHelps() {
 	command.addHelpChild(help, helpArg0);
 	command.addHelp(help);
 	
+	help = command.newHelp("yeet", "yeet");
+	command.addHelpChild(help, command.newHelpInt("strength", 1, 10000000000000));
+	command.addHelp(help);
+	
 	command.sendHelp();
 }
 
@@ -8945,6 +9014,10 @@ function command.registerAlias(alias, command) {
 	map.add($alias_map, alias, command);
 }
 
+//--------------------------------------------------
+//Time-Utils
+//--------------------------------------------------
+
 //Spielzeit aller Online-Spieler
 function playtime.getTotalOnlineMinutes() {
 	minutes = 0;
@@ -9024,7 +9097,7 @@ function time.getYearDays(year) {
 }
 
 function time.getMonthDays(month, year) {
-	days = map.get($monthdays, month);
+	days = month.getDays(month);
 	//Schaltjahre
 	if(month == 2 && year % 4 == 0) {
 		days++;
@@ -9053,7 +9126,7 @@ function time.getDaysBetween(day1, month1, year1, day2, month2, year2) {
 		if(month1 == month2) {
 			d_days = day2 - day1;
 		} else {
-			d_days += map.get($monthdays, month1) - day1;
+			d_days += month.getDays(month1) - day1;
 			d_days += day2;
 		}
 	} else {
@@ -9067,12 +9140,25 @@ function time.getDaysBetween(day1, month1, year1, day2, month2, year2) {
 			m++;
 		}
 		//Volle Tage
-		d_days += map.get($monthdays, month1) - day1;
+		d_days += month.getDays(month1) - day1;
 		d_days += day2;
 	}
 	return y_days + m_days + d_days;
 }
 
+function month.add(month_index, shortname, days) {
+	$month_array[month_index, 0] = shortname;
+	$month_array[month_index, 1] = days;
+}
+
+function month.getShortName(month) {
+	return $month_array[month - 1, 0];
+}
+
+function month.getDays(month) {
+	return $month_array[month - 1, 1];
+}
+
 //--------------------------------------------------
 //Player-Utils
 //--------------------------------------------------

+ 40 - 9
system/doors.txt

@@ -2,9 +2,12 @@ event.load("block_click");
 
 doors = list.new();
 trapdoors = list.new();
-orig_tdoor_state = map.new();
+fencegates = list.new();
+orig_state = map.new();
 doors_tag = block.getTag("minecraft:wooden_doors");
 trapdoors_tag = block.getTag("minecraft:wooden_trapdoors");
+fencegates_tag = block.getTag("minecraft:fence_gates");
+open_prop = block.getProperty("open");
 
 msg("dev", "§bDoors §rloaded.");
 @wait
@@ -45,13 +48,26 @@ if(block.hasTag(doors_tag, block) && action == "right") {
 if(block.hasTag(trapdoors_tag, block) && action == "right") {
 	player_spec = player.getAutoCloseDoor(player);
 	if(player_spec) {
-		if(!map.contains(orig_tdoor_state, block_loc)) {
-			door_state = block.getTrapdoorStatus(block_loc);
-			map.add(orig_tdoor_state, block_loc, door_state);
+		if(!map.contains(orig_state, block_loc)) {
+			state = block.getTrapdoorStatus(block_loc);
+			map.add(orig_state, block_loc, state);
 		}
 		list.add(trapdoors, block_loc);
 		sgoto(60, "toggletrapdoor");
 	}
+	goto("wait");
+}
+if(block.hasTag(fencegates_tag, block) && action == "right") {
+	player_spec = player.getAutoCloseDoor(player);
+	if(player_spec) {
+		if(!map.contains(orig_state, block_loc)) {
+			state = block.getState(block_loc, open_prop);
+			map.add(orig_state, block_loc, state);
+		}
+		list.add(fencegates, block_loc);
+		sgoto(60, "togglefencegate");
+	}
+	goto("wait");
 }
 goto("wait");
 
@@ -69,13 +85,28 @@ goto("wait");
 doorloc = list.getIndex(trapdoors, 0);
 list.removeIndex(trapdoors, 0);
 if(block.hasTag(trapdoors_tag, block.get(doorloc))) {
-	orig_state = map.get(orig_tdoor_state, doorloc);
-	if(orig_state == null) {
+	state = map.get(orig_state, doorloc);
+	if(state == null) {
+		goto("wait");
+	}
+	map.remove(orig_state, doorloc);
+	if(block.getTrapdoorStatus(doorloc) != state) {
+		block.setTrapdoorStatus(doorloc, state);
+	}
+}
+goto("wait");
+
+@togglefencegate
+doorloc = list.getIndex(fencegates, 0);
+list.removeIndex(fencegates, 0);
+if(block.hasTag(fencegates_tag, block.get(doorloc))) {
+	state = map.get(orig_state, doorloc);
+	if(state == null) {
 		goto("wait");
 	}
-	map.remove(orig_tdoor_state, doorloc);
-	if(block.getTrapdoorStatus(doorloc) != orig_state) {
-		block.setTrapdoorStatus(doorloc, orig_state);
+	map.remove(orig_state, doorloc);
+	if(block.getState(doorloc, open_prop) != state) {
+		//TODO
 	}
 }
 goto("wait");

+ 31 - 22
system/perms.txt

@@ -9,29 +9,12 @@ databank.workerExecute(executeOnce);
 
 perm.clear();
 
-permgroups = list.new();
-list.add(permgroups, "mod");
-list.add(permgroups, "supporter");
-list.add(permgroups, "builder");
-list.add(permgroups, "worldedit");
-list.add(permgroups, "teleport");
-list.add(permgroups, "vip");
-list.add(permgroups, "dev");
-
-permgroupsmap = map.new();
-map.add(permgroupsmap, "worldedit", 1);
-map.add(permgroupsmap, "mod", 2);
-map.add(permgroupsmap, "builder", 3);
-map.add(permgroupsmap, "vip", 4);
-map.add(permgroupsmap, "dev", 5);
-map.add(permgroupsmap, "teleport", 6);
-map.add(permgroupsmap, "supporter", 9);
-
 //Default-Rechte
 perm.registerGroup(0, "isUser");
 perm.registerGroup(0, "clan");
 perm.registerGroup(0, "wusi");
 perm.registerGroup(0, "hasitem");
+perm.registerGroup(0, "lag");
 perm.registerGroup(0, "lock");
 perm.registerGroup(0, "ping");
 perm.registerGroup(0, "bug");
@@ -168,6 +151,7 @@ perm.registerGroup(2, "tppos");
 perm.registerGroup(2, "plot.other");
 perm.registerGroup(2, "plot.moreinfo");
 perm.registerGroup(2, "boost");
+perm.registerGroup(2, "yeet");
 perm.registerGroup(2, "whitelist");
 perm.registerGroup(2, "color");
 perm.registerGroup(2, "elytra");
@@ -229,9 +213,8 @@ perm.registerGroup(2, "remove");
 perm.registerGroup(2, "clear");
 perm.registerGroup(2, "locate");
 perm.registerGroup(2, "locatebiome");
+perm.registerGroup(2, "quest");
 perm.registerGroup(2, "debug");
-perm.registerGroup(2, "error");
-perm.registerGroup(2, "errordebug");
 perm.registerGroup(2, "user.other");
 
 //Builder-Rechte
@@ -289,6 +272,7 @@ perm.registerGroup(5, "color");
 perm.registerGroup(5, "particle");
 perm.registerGroup(5, "setmessage");
 perm.registerGroup(5, "xp");
+perm.registerGroup(5, "quest");
 perm.registerGroup(5, "var");
 perm.registerGroup(5, "tip");
 perm.registerGroup(5, "script");
@@ -350,7 +334,6 @@ perm.registerGroup(11, "setmessage");
 //Moderator
 perm.registerGroup(12, "isMod");
 perm.registerGroup(12, "isTeam");
-perm.registerGroup(12, "perm");
 perm.registerGroup(12, "cli");
 perm.registerGroup(12, "speed");
 perm.registerGroup(12, "script.error");
@@ -361,6 +344,7 @@ perm.registerGroup(12, "inv.reload");
 perm.registerGroup(12, "feed");
 perm.registerGroup(12, "mute");
 perm.registerGroup(12, "kill");
+perm.registerGroup(12, "quest");
 perm.registerGroup(12, "unmute");
 perm.registerGroup(12, "heal");
 perm.registerGroup(12, "nickname");
@@ -390,6 +374,8 @@ perm.registerGroup(12, "playsound");
 perm.registerGroup(12, "gamemode");
 perm.registerGroup(12, "ass");
 perm.registerGroup(12, "perm");
+perm.registerGroup(12, "perm.give");
+perm.registerGroup(12, "perm.remove");
 perm.registerGroup(12, "perm.list");
 perm.registerGroup(12, "perm.toggle");
 perm.registerGroup(12, "adminshop");
@@ -402,6 +388,8 @@ perm.registerGroup(12, "fly");
 perm.registerGroup(12, "fly.other");
 perm.registerGroup(12, "plot.other");
 perm.registerGroup(12, "warp.create");
+perm.registerGroup(12, "boost");
+perm.registerGroup(12, "yeet");
 
 //YTer
 perm.registerGroup(13, "isYT");
@@ -422,9 +410,30 @@ perm.registerGroup(16, "script.debug");
 //Building perms for creative world
 perm.registerGroup(17, "creative");
 
+permgroups = array.new(13, 3);
+perm.addGroup(0, 1, "worldedit", null);
+perm.addGroup(1, 2, "admin", "cAdmin");
+perm.addGroup(2, 3, "builder", "5Builder");
+perm.addGroup(3, 4, "vip", "dVIP");
+perm.addGroup(4, 5, "dev", "5Developer");
+perm.addGroup(5, 6, "teleport", null);
+perm.addGroup(6, 9, "supporter", "bSupporter");
+perm.addGroup(7, 11, "streamer", "dInfluencer");
+perm.addGroup(8, 12, "mod", "9Moderator");
+perm.addGroup(9, 13, "yt", "dInfluencer");
+perm.addGroup(10, 14, "sponsor", "dSponsor");
+perm.addGroup(11, 15, "bypass", null);
+perm.addGroup(12, 17, "creative", null);
+perm.setGroups(permgroups);
+
+function perm.addGroup(index, permgroup_id, permgroup_name, rank) {
+	$permgroups[index, 0] = permgroup_id;
+	$permgroups[index, 1] = permgroup_name;
+	$permgroups[index, 2] = rank;
+}
+
 //Perms auf Spieler registrieren
 registerAllPerms();
-
 perm.registerPlayer("e41b5335-3c74-46e9-a6c5-dafc6334a477", 7); //marvinius
 perm.registerPlayer("51e240f9-ab10-4ea6-8a5d-779319f51257", 10); //kajetan
 

+ 3 - 3
system/survival.txt

@@ -499,11 +499,11 @@ if(inv_id == bankinvid) { //Bankmenü
 			msg.prefix(player, prefix_money, message);
 			goto("wait");
 		}
-		player.removeItem2(player, item1);
+		player.removeItemNbt(player, item1);
 		notgiven = player.giveItem(player, item2);
 		if(item.getType(notgiven) != "minecraft:air") {
 			amount = item.getAmount(notgiven);
-			player.removeItem2(player, read.item(item_type, amount2 - amount));
+			player.removeItemNbt(player, read.item(item_type, amount2 - amount));
 			player.giveItem(player, item1);
 			msg.prefix(player, prefix_money, "Not enough space in inventory.");
 			goto("wait");
@@ -532,7 +532,7 @@ if(inv_id == bankinvid) { //Bankmenü
 			msg.prefix(player, prefix_money, "§rCoin not in inventory.");
 		} else {
 			addMoney(player, betrag);
-			player.removeItem2(player, inv.getItem(bankmenu, inv_slot));
+			player.removeItemNbt(player, inv.getItem(bankmenu, inv_slot));
 			inv.update(player);
 		}
 		goto("wait");

+ 154 - 44
test.txt

@@ -132,25 +132,6 @@ function correctTimeFormat(textnumber) {
 	return textnumber;
 }
 
-function isStoryWorldName(world_name) {
-	return world_name == "story";
-}
-
-function isGamesWorldName(world_name) {
-	return world_name == "games";
-}
-
-function isSurvWorldName(world_name) {
-	if(world_name == "overworld") {
-		return true;
-	} elseif(world_name == "the_end") {
-		return true;
-	} elseif(world_name == "the_nether") {
-		return true;
-	}
-	return false;
-}
-
 function player.giveSingleItem(player, item, boolean) {
 	amount = player.getItemAmount(player, boolean, item);
 	if(amount == 0) {
@@ -370,6 +351,33 @@ function world.isCreativeName(world_name) {
 	return world_name == "creative";
 }
 
+function world.isGamesName(world_name) {
+	return world_name == "games";
+}
+
+function world.isStoryName(world_name) {
+	return world_name == "story";
+}
+
+function isStoryWorldName(world_name) { //Deprecated
+	return world_name == "story";
+}
+
+function isGamesWorldName(world_name) { //Deprecated
+	return world_name == "games";
+}
+
+function isSurvWorldName(world_name) {
+	if(world_name == "overworld") {
+		return true;
+	} elseif(world_name == "the_end") {
+		return true;
+	} elseif(world_name == "the_nether") {
+		return true;
+	}
+	return false;
+}
+
 function world.canUsePlots(world) {
 	world_name = world.getName(world);
 	if(isSurvWorldName(world_name)) {
@@ -1381,7 +1389,7 @@ function player.teleport(player, location, setBackPos) {
 	player.setHeadName(player);
 	player.showDefaultStacks(player);
 	
-	if(isGamesWorldName(to_world_name)) {
+	if(world.isGamesName(to_world_name)) {
 		player.clearInventory(player);
 		inv = player.getInv(player);
 		inv.setItem(inv, 0, read.item("minecraft:compass"));
@@ -1576,6 +1584,14 @@ function msg.radius(prefix, message, location, radius) {
 	}
 }
 
+//--------------------------------------------------
+//Item-Utils
+//--------------------------------------------------
+
+function item.getAir() {
+	return read.item("minecraft:air");
+}
+
 //--------------------------------------------------
 //Player-Utils
 //--------------------------------------------------
@@ -1686,22 +1702,25 @@ function player.setTabName(player) {
 	player.setDisplayName(player, tab_name);
 }
 
-function player.removeItem2(player, itemstack) {
+function player.removeItemNbt(player, itemstack) {
+	//Make a copy
 	item_type = item.getType(itemstack);
 	amount = item.getAmount(itemstack);
-	my_item = read.item(item_type, amount); //Kopie erstellen
-	item.setAmount(my_item, 1);
-	for(slot = 0; slot <= 35; slot++) {
-		item = player.getInvSlot(player, slot);
+	my_item = read.item(item_type, amount);
+	//Loop the inventory
+	inv = player.getInv(player);
+	for(slot = 0; slot < inv.getSize(inv); slot++) {
+		item = inv.getItem(inv, slot);
 		if(item.getType(item) == item_type) {
-			amount2 = item.getAmount(item);
-			diff = amount - amount2;
+			diff = amount - item.getAmount(item);
 			if(diff > 0) {
 				amount = diff;
 				item.setAmount(item, 0);
 			} else {
 				item.setAmount(item, math.abs(diff));
-				return null;
+				air = item.getAir();
+				item.setAmount(air, 0);
+				return air;
 			}
 		}
 	}
@@ -1709,6 +1728,27 @@ function player.removeItem2(player, itemstack) {
 	return my_item;
 }
 
+function player.removeItemTag(player, tag, amount) {
+	air = item.getAir();
+	inv = player.getInv(player);
+	for(slot = 0; slot < inv.getSize(inv); slot++) {
+		item = inv.getItem(inv, slot);
+		if(item.hasTag(tag, item)) {
+			diff = amount - item.getAmount(item);
+			if(diff > 0) {
+				item.setAmount(item, 0);
+				amount = diff;
+			} else {
+				item.setAmount(item, math.abs(diff));
+				amount = 0;
+				break;
+			}
+		}
+	}
+	item.setAmount(air, amount);
+	return air;
+}
+
 function player.showDebug(player, boolean) {
 	player_uuid = player.getUuid(player);
 	if(boolean) {
@@ -1731,6 +1771,8 @@ function player.showDefaultStacks(player) {
 	} elseif(world_name == "story") {
 		stacks.set(player, 0, "km:gear");
 		stacks.set(player, 1, "km:golden_scepter");
+	} elseif(world_name == "creative") {
+		stacks.set(player, 0, "km:gear");
 	}
 	stacks.setActive(player, true);
 }
@@ -2134,6 +2176,13 @@ function player.checkHandsForTag(player, tag) {
 //Block-Utils
 //--------------------------------------------------
 
+function block.gotWater(block, block_type, block_loc) {
+	if(block_type == "minecraft:water") {
+		return true;
+	}
+	return block.getState(block_loc, block.getProperty("waterlogged"));
+}
+
 function block.getSecondDoor(door_loc_1) {
 	prop_h_facing = block.getProperty("horizontal_facing");
 	state_facing = block.getState(door_loc_1, prop_h_facing);
@@ -2749,7 +2798,7 @@ function skill.get(tech_name) {
 
 function skill.getShopItem(player, tech_name) {
 	if(tech_name == null) {
-		return read.item("minecraft:air");
+		return item.getAir();
 	}
 	skill = skill.get(tech_name);
 	amount = skill.getAmount(player, tech_name);
@@ -3269,12 +3318,6 @@ function removeAllPerms(player_id) {
 	}
 }
 
-function isAPermGroup(permstring) {
-	if(map.contains($permgroupsmap, text.toLowerCase(permstring))) {
-		return true;
-	}
-	return false;
-}
 
 function getPermsFromPlayer(player_id) {
 	permslist = list.new();
@@ -3289,15 +3332,6 @@ function getPermsFromPlayer(player_id) {
 	return permslist;
 }
 
-function hasPermAlready(player_id, perm_id) {
-	permslist = getPermsFromPlayer(player_id);
-	if(list.contains(permslist, perm_id)) {
-		return true;
-	} else {
-		return false;
-	}
-}
-
 function registerAllPerms() {
 	stmt = databank.prepare("SELECT * FROM playerperms;");
 	result = databank.execute(stmt);
@@ -3310,6 +3344,70 @@ function registerAllPerms() {
 	databank.close(stmt);
 }
 
+function perm.setGroups(permgroups) {
+	setScriptVar("permgroups", permgroups);
+}
+
+function perm.getGroups() {
+	return getScriptVar("permgroups");
+}
+
+function perm.getNameFromId(permgroup_id) {
+	a = perm.getGroups();
+	for(i = 0; i < array.getSize(a); i++) {
+		if(a[i, 0] == permgroup_id) {
+			return a[i, 1];
+		}
+	}
+	return null;
+}
+
+function perm.getRankFromId(permgroup_id) {
+	a = perm.getGroups();
+	for(i = 0; i < array.getSize(a); i++) {
+		if(a[i, 0] == permgroup_id) {
+			return a[i, 2];
+		}
+	}
+	return null;
+}
+
+function perm.getIdFromGroupname(permgroup_name) {
+	a = perm.getGroups();
+	for(i = 0; i < array.getSize(a); i++) {
+		if(a[i, 1] == permgroup_name) {
+			return a[i, 0];
+		}
+	}
+	return null;
+}
+
+function perm.getRankFromGroupname(permgroup_name) {
+	a = perm.getGroups();
+	for(i = 0; i < array.getSize(a); i++) {
+		if(a[i, 1] == permgroup_name) {
+			return a[i, 2];
+		}
+	}
+	return null;
+}
+
+function perm.isGroupName(permgroup_name) {
+	a = perm.getGroups();
+	for(i = 0; i < array.getSize(a); i++) {
+		if(a[i, 1] == permgroup_name) {
+			return true;
+		}
+	}
+	return false;
+}
+
+function player.hasPermGroup(player_id, perm_id) {
+	permslist = getPermsFromPlayer(player_id);
+	return list.contains(permslist, perm_id);
+}
+
+
 //--------------------------------------------------
 //Nickname-Utils
 //--------------------------------------------------
@@ -4160,4 +4258,16 @@ function hawkeye.undo(list) {
 			block.set(loc, "minecraft:air", true);
 		}
 	}
+}
+
+//--------------------------------------------------
+//
+//--------------------------------------------------
+
+function yeet (player, strength){
+	array = entity.getLook(player);
+	x = array[0] * (math.log(strength)+1);
+	y = math.abs(array[1]) * (math.log(strength)+1);
+	z = array[2] * (math.log(strength)+1);
+	entity.throw(player, x, y, z);
 }

+ 33 - 5
utils/u_quest.txt

@@ -33,20 +33,48 @@ function player.setShipProgress(player_or_id, progress) {
 	}
 }
 
-function human.giveItem(human_name, player, needed_type, needed_amount) {
+function human.giveItem(human_name, player, needed_type_or_tag, needed_amount) {
+	if(needed_amount == 0) {
+		return -1;
+	}
 	item = entity.getEquip(player, "hand");
 	item_type = item.getType(item);
 	if(item_type == "minecraft:air") {
-		return null;
+		return needed_amount;
+	}
+	human_name = concat("§d", human_name);
+	needed = false;
+	tag_check = false;
+	if(text.class(needed_type_or_tag) == "String") {
+		if(item_type == needed_type_or_tag) {
+			needed = true;
+		}
+	} else {
+		if(item.hasTag(needed_type_or_tag, item)) {
+			needed = true;
+			tag_check = true;
+		}
 	}
-	if(item_type == needed_type) {
+	if(needed) {
 		rest_item = player.removeItem(player, read.item(item_type, needed_amount));
 		rest_item_amount = item.getAmount(rest_item);
 		if(rest_item_amount > 0) {
-			msg.prefix(player, human_name, concat("Ich brauche bitte noch ", text.number(rest_item_amount), " Stück davon."));
+			rest_item = player.removeItemNbt(player, rest_item);
+			rest_item_amount = item.getAmount(rest_item);
+			if(rest_item_amount > 0) {
+				if(tag_check) {
+					rest_item = player.removeItemTag(player, needed_type_or_tag, rest_item_amount);
+					rest_item_amount = item.getAmount(rest_item);
+					if(rest_item_amount > 0) {
+						msg.prefix(player, human_name, concat("Ich brauche bitte noch ", text.number(rest_item_amount), " Stück davon."));
+					}
+				} else {
+					msg.prefix(player, human_name, concat("Ich brauche bitte noch ", text.number(rest_item_amount), " Stück davon."));
+				}
+			}
 		}
 		return rest_item_amount;
 	}
 	msg.prefix(player, human_name, "Das kann ich nicht gebrauchen.");
-	return null;
+	return needed_amount;
 }