Browse Source

further removed commands, block refactoring, files moved to new system

Kajetan Johannes Hammerle 5 năm trước cách đây
mục cha
commit
b09b326acb
100 tập tin đã thay đổi với 745 bổ sung2147 xóa
  1. 3 3
      KajetansMod.iml
  2. 6 15
      src/main/java/me/km/CommonProxy.java
  3. 12 1
      src/main/java/me/km/MeshDefinitionFix.java
  4. 1 3
      src/main/java/me/km/PackageHelper.java
  5. 44 8
      src/main/java/me/km/blockprotections/BlockProtection.java
  6. 0 86
      src/main/java/me/km/blockprotections/BlockProtectionBank.java
  7. 9 41
      src/main/java/me/km/blocks/BlockBase.java
  8. 2 2
      src/main/java/me/km/blocks/campfire/BlockCampFire.java
  9. 0 29
      src/main/java/me/km/blocks/campfire/BlockCampFireBurning.java
  10. 9 9
      src/main/java/me/km/blocks/cookingpot/BlockCookingPot.java
  11. 3 3
      src/main/java/me/km/blocks/cookingpot/CookingPotColorMixer.java
  12. 5 5
      src/main/java/me/km/blocks/cookingpot/TileEntityCookingPot.java
  13. 1 2
      src/main/java/me/km/blocks/leaves/BlockApricotLeaves.java
  14. 0 329
      src/main/java/me/km/chatchannel/TextColor.java
  15. 0 148
      src/main/java/me/km/datatools/CommandHuman.java
  16. 0 161
      src/main/java/me/km/datatools/CommandVillager.java
  17. 0 86
      src/main/java/me/km/datatools/DataToolsEvents.java
  18. 1 1
      src/main/java/me/km/effects/EffectUtils.java
  19. 3 1
      src/main/java/me/km/entities/EntityNobody.java
  20. 0 26
      src/main/java/me/km/events/PlayerHurtEvent.java
  21. 3 3
      src/main/java/me/km/items/ItemArmor.java
  22. 1 1
      src/main/java/me/km/items/ItemCylinder.java
  23. 0 1
      src/main/java/me/km/items/ModelCylinder.java
  24. 0 1
      src/main/java/me/km/items/herbs/ItemGoldHerb.java
  25. 7 26
      src/main/java/me/km/items/herbs/ItemHerbs.java
  26. 1 1
      src/main/java/me/km/items/weapons/ItemStick.java
  27. 0 59
      src/main/java/me/km/module/ModuleCommand.java
  28. 20 8
      src/main/java/me/km/playerbank/PlayerBank.java
  29. 26 26
      src/main/java/me/km/plots/ProtectionBank.java
  30. 30 1
      src/main/java/me/km/scheduler/AsyncWorker.java
  31. 2 2
      src/main/java/me/km/scheduler/SnuviTask.java
  32. 13 12
      src/main/java/me/km/scheduler/TaskTicker.java
  33. 5 0
      src/main/java/me/km/scoreboard/ScoreboardUtils.java
  34. 1 2
      src/main/java/me/km/snuviscript/CommandGiveUp.java
  35. 1 2
      src/main/java/me/km/snuviscript/CommandScript.java
  36. 352 29
      src/main/java/me/km/snuviscript/MinecraftFunctions.java
  37. 0 332
      src/main/java/me/km/snuviscript/ScriptBank.java
  38. 0 1
      src/main/java/me/km/utils/RecipeUtils.java
  39. 2 39
      src/main/java/me/km/utils/SpecialBlockUtils.java
  40. 5 0
      src/main/java/me/km/world/ChangeWorldEvent.java
  41. 0 5
      src/main/resources/assets/km/blockstates/barrel_acacia.json
  42. 0 5
      src/main/resources/assets/km/blockstates/barrel_big_oak.json
  43. 0 5
      src/main/resources/assets/km/blockstates/barrel_birch.json
  44. 0 5
      src/main/resources/assets/km/blockstates/barrel_jungle.json
  45. 0 5
      src/main/resources/assets/km/blockstates/barrel_oak.json
  46. 0 5
      src/main/resources/assets/km/blockstates/barrel_spruce.json
  47. 0 5
      src/main/resources/assets/km/blockstates/bronze_block.json
  48. 0 9
      src/main/resources/assets/km/blockstates/camp_fire_burning.json
  49. 0 9
      src/main/resources/assets/km/blockstates/cauldron_big_oak.json
  50. 0 9
      src/main/resources/assets/km/blockstates/cauldron_birch.json
  51. 0 9
      src/main/resources/assets/km/blockstates/cauldron_jungle.json
  52. 0 9
      src/main/resources/assets/km/blockstates/cauldron_oak.json
  53. 0 9
      src/main/resources/assets/km/blockstates/cauldron_spruce.json
  54. 9 0
      src/main/resources/assets/km/blockstates/cherry_leaves.json
  55. 3 13
      src/main/resources/assets/km/blockstates/copper_block.json
  56. 8 0
      src/main/resources/assets/km/models/block/artefact.json
  57. 0 68
      src/main/resources/assets/km/models/block/barrel/barrel.json
  58. 0 10
      src/main/resources/assets/km/models/block/barrel/barrel_acacia.json
  59. 0 10
      src/main/resources/assets/km/models/block/barrel/barrel_big_oak.json
  60. 0 10
      src/main/resources/assets/km/models/block/barrel/barrel_birch.json
  61. 0 10
      src/main/resources/assets/km/models/block/barrel/barrel_jungle.json
  62. 0 10
      src/main/resources/assets/km/models/block/barrel/barrel_oak.json
  63. 0 10
      src/main/resources/assets/km/models/block/barrel/barrel_spruce.json
  64. 57 88
      src/main/resources/assets/km/models/block/bronze_block.json
  65. 53 42
      src/main/resources/assets/km/models/block/camp_fire_burnt.json
  66. 0 11
      src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_empty.json
  67. 0 12
      src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_level1.json
  68. 0 12
      src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_level2.json
  69. 0 12
      src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_level3.json
  70. 0 11
      src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_empty.json
  71. 0 12
      src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_level1.json
  72. 0 12
      src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_level2.json
  73. 0 12
      src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_level3.json
  74. 0 11
      src/main/resources/assets/km/models/block/cauldron/birch/cauldron_empty.json
  75. 0 12
      src/main/resources/assets/km/models/block/cauldron/birch/cauldron_level1.json
  76. 0 12
      src/main/resources/assets/km/models/block/cauldron/birch/cauldron_level2.json
  77. 0 12
      src/main/resources/assets/km/models/block/cauldron/birch/cauldron_level3.json
  78. 0 11
      src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_empty.json
  79. 0 12
      src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_level1.json
  80. 0 12
      src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_level2.json
  81. 0 12
      src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_level3.json
  82. 0 11
      src/main/resources/assets/km/models/block/cauldron/oak/cauldron_empty.json
  83. 0 12
      src/main/resources/assets/km/models/block/cauldron/oak/cauldron_level1.json
  84. 0 12
      src/main/resources/assets/km/models/block/cauldron/oak/cauldron_level2.json
  85. 0 12
      src/main/resources/assets/km/models/block/cauldron/oak/cauldron_level3.json
  86. 0 11
      src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_empty.json
  87. 0 12
      src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_level1.json
  88. 0 12
      src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_level2.json
  89. 0 12
      src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_level3.json
  90. 11 0
      src/main/resources/assets/km/models/block/cooking_pot/copper/empty.json
  91. 12 0
      src/main/resources/assets/km/models/block/cooking_pot/copper/level1.json
  92. 12 0
      src/main/resources/assets/km/models/block/cooking_pot/copper/level2.json
  93. 12 0
      src/main/resources/assets/km/models/block/cooking_pot/copper/level3.json
  94. 0 0
      src/main/resources/assets/km/models/block/cooking_pot/empty.json
  95. 0 0
      src/main/resources/assets/km/models/block/cooking_pot/level1.json
  96. 0 0
      src/main/resources/assets/km/models/block/cooking_pot/level2.json
  97. 0 0
      src/main/resources/assets/km/models/block/cooking_pot/level3.json
  98. BIN
      src/main/resources/assets/km/models/block/copper_block.json
  99. BIN
      src/main/resources/assets/km/textures/blocks/barrel/barrel_side.png
  100. BIN
      src/main/resources/assets/km/textures/blocks/barrel/barrel_top.png

+ 3 - 3
KajetansMod.iml

@@ -2,7 +2,7 @@ package me.km;
 
 
 import java.awt.Color;
 import java.awt.Color;
 import me.km.blocks.ModBlocks;
 import me.km.blocks.ModBlocks;
-import me.km.blocks.cauldron.TileEntityCauldron;
+import me.km.blocks.cookingpot.TileEntityCookingPot;
 import me.km.entities.ModEntities;
 import me.km.entities.ModEntities;
 import me.km.items.ItemColoredSoup;
 import me.km.items.ItemColoredSoup;
 import me.km.items.ItemGemStone;
 import me.km.items.ItemGemStone;
@@ -84,14 +84,14 @@ public class ClientProxy extends CommonProxy
         BlockColors bColors = Minecraft.getMinecraft().getBlockColors();
         BlockColors bColors = Minecraft.getMinecraft().getBlockColors();
         bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int tintIndex) -> 
         bColors.registerBlockColorHandler((IBlockState state, IBlockAccess w, BlockPos pos, int tintIndex) -> 
         {
         {
-            TileEntityCauldron tile = (TileEntityCauldron) w.getTileEntity(pos);
+            TileEntityCookingPot tile = (TileEntityCookingPot) w.getTileEntity(pos);
             if(tile == null) 
             if(tile == null) 
             {
             {
                 return -16777216;
                 return -16777216;
             }
             }
             Color c = tile.getColor();
             Color c = tile.getColor();
             return -16777216 | c.getRed() << 16 | c.getGreen() << 8 | c.getBlue();
             return -16777216 | c.getRed() << 16 | c.getGreen() << 8 | c.getBlue();
-        }, ModBlocks.cauldronOak, ModBlocks.cauldronAcacia, ModBlocks.cauldronBigOak, ModBlocks.cauldronBirch, ModBlocks.cauldronJungle, ModBlocks.cauldronSpruce);
+        }, ModBlocks.cookingPotCopper);
 
 
         IBlockColor tallGrass = (IBlockState state, IBlockAccess w, BlockPos pos, int tintIndex) ->
         IBlockColor tallGrass = (IBlockState state, IBlockAccess w, BlockPos pos, int tintIndex) ->
         {
         {

+ 6 - 15
src/main/java/me/km/CommonProxy.java

@@ -5,10 +5,8 @@ import me.km.blockprotections.BlockProtection;
 import me.km.module.Module;
 import me.km.module.Module;
 import me.km.module.SimpleConfig;
 import me.km.module.SimpleConfig;
 import me.km.databank.DataBank;
 import me.km.databank.DataBank;
-import me.km.datatools.DataToolsEvents;
 import me.km.world.ModWorldGeneration;
 import me.km.world.ModWorldGeneration;
 import me.km.networking.ModPacketHandler;
 import me.km.networking.ModPacketHandler;
-import me.km.permissions.PermissionManager;
 import me.km.playerbank.PlayerManager;
 import me.km.playerbank.PlayerManager;
 import me.km.plots.ProtectionBank;
 import me.km.plots.ProtectionBank;
 import me.km.scheduler.SnuviScheduler;
 import me.km.scheduler.SnuviScheduler;
@@ -41,8 +39,6 @@ public class KajetansMod
     public static PlayerManager playerbank;
     public static PlayerManager playerbank;
     public static ProtectionBank plots;
     public static ProtectionBank plots;
     public static BlockProtection blocks;
     public static BlockProtection blocks;
-    public static Module datatools;
-    public static Module world;
     public static ScriptModule scripts;
     public static ScriptModule scripts;
     
     
     @SideOnly(Side.SERVER)
     @SideOnly(Side.SERVER)
@@ -53,7 +49,7 @@ public class KajetansMod
 
 
     public static final String MODID = "km";
     public static final String MODID = "km";
     public static final String NAME = "Kajetans Mod";
     public static final String NAME = "Kajetans Mod";
-    public static final String VERSION = "0.0.34";
+    public static final String VERSION = "0.0.35";
 
 
     @Mod.Instance(MODID)
     @Mod.Instance(MODID)
     public static KajetansMod instance;
     public static KajetansMod instance;
@@ -82,7 +78,8 @@ public class KajetansMod
                 @net.minecraftforge.fml.common.eventhandler.SubscribeEvent
                 @net.minecraftforge.fml.common.eventhandler.SubscribeEvent
                 public void wusi2(net.minecraftforge.event.ServerChatEvent e) 
                 public void wusi2(net.minecraftforge.event.ServerChatEvent e) 
                 {
                 {
-                    BlockPos pos = Utils.getTargetBlock(e.getPlayer());
+                    BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(0, 0, 0);
+                    = Utils.getTargetBlock(e.getPlayer());
                     e.getPlayer().sendMessage(new TextComponentString(pos.toString()));
                     e.getPlayer().sendMessage(new TextComponentString(pos.toString()));
                 }
                 }
             });*/
             });*/
@@ -149,15 +146,9 @@ public class KajetansMod
 
 
         // block protections
         // block protections
         blocks = new BlockProtection();
         blocks = new BlockProtection();
-        
-        // DataTools
-        datatools = new Module("DataTools", TextFormatting.GRAY);
-        datatools.registerCommands(e, "me.km.datatools");          
-        datatools.registerEvent(new DataToolsEvents(datatools));
 
 
-        // Worldmanager
-        world = new Module("Worlds", TextFormatting.RED);      
-        world.registerEvent(new ChangeWorldEvent());
+        // Worldmanager   
+        Module.registerEvent(new ChangeWorldEvent());
 
 
         // Scriptsystem
         // Scriptsystem
         scripts = new ScriptModule("Scripts", TextFormatting.LIGHT_PURPLE);
         scripts = new ScriptModule("Scripts", TextFormatting.LIGHT_PURPLE);
@@ -165,7 +156,6 @@ public class KajetansMod
 
 
         // Permissions
         // Permissions
         perms = new PermissionManager("Perms", TextFormatting.DARK_PURPLE);
         perms = new PermissionManager("Perms", TextFormatting.DARK_PURPLE);
-        perms.registerEvents("me.km.permissions");
         setPermissionManager();
         setPermissionManager();
 
 
         scripts.startScript("startscript");
         scripts.startScript("startscript");
@@ -189,6 +179,7 @@ public class KajetansMod
             return;
             return;
         }
         }
         scripts.startScript("endscript");
         scripts.startScript("endscript");
+        scheduler.stop();
         databank.closeDataBankConnection();
         databank.closeDataBankConnection();
         scheduler.getWorker().stop();
         scheduler.getWorker().stop();
     }
     }

+ 12 - 1
src/main/java/me/km/MeshDefinitionFix.java

@@ -29,7 +29,18 @@ public class ObjectRegistry
         e.getMappings().stream()
         e.getMappings().stream()
                 .forEach((missing) -> 
                 .forEach((missing) -> 
                 {
                 {
-                    missing.remap(Blocks.STONE);   
+                    if(missing.key.toString().contains("barrel"))
+                    {
+                        missing.remap(ModBlocks.barrel);   
+                    }
+                    else if(missing.key.toString().contains("cauldron"))
+                    {
+                        missing.remap(ModBlocks.cookingPotCopper);   
+                    }
+                    else
+                    {
+                        missing.remap(Blocks.STONE);   
+                    }
                 });
                 });
     }
     }
     
     

+ 1 - 3
src/main/java/me/km/PackageHelper.java → src/main/java/me/km/PackageHelper.java

@@ -1,11 +1,10 @@
-package me.km.permissions;
+package me.km;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.UUID;
 import java.util.UUID;
 import me.kcm.command.ICommandManager;
 import me.kcm.command.ICommandManager;
-import me.km.KajetansMod;
 import me.km.module.Module;
 import me.km.module.Module;
 import me.km.snuviscript.ScriptEvents;
 import me.km.snuviscript.ScriptEvents;
 import net.minecraft.command.ICommand;
 import net.minecraft.command.ICommand;
@@ -13,7 +12,6 @@ import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.tileentity.CommandBlockBaseLogic;
 import net.minecraft.tileentity.CommandBlockBaseLogic;
-import net.minecraft.util.text.TextComponentString;
 import net.minecraft.util.text.TextFormatting;
 import net.minecraft.util.text.TextFormatting;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 import net.minecraftforge.fml.relauncher.SideOnly;

+ 44 - 8
src/main/java/me/km/blockprotections/BlockProtection.java

@@ -2,11 +2,14 @@ package me.km.blockprotections;
 
 
 import me.km.KajetansMod;
 import me.km.KajetansMod;
 import me.km.module.Module;
 import me.km.module.Module;
+import me.km.utils.Location;
 import me.km.utils.Utils;
 import me.km.utils.Utils;
-import me.km.permissions.Permissions;
 import net.minecraft.block.Block;
 import net.minecraft.block.Block;
+import net.minecraft.block.BlockButton;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.BlockDoor;
 import net.minecraft.block.BlockDoor;
+import net.minecraft.block.BlockPistonMoving;
+import net.minecraft.block.BlockTrapDoor;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Blocks;
@@ -21,6 +24,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 
 public class BlockProtection extends Module
 public class BlockProtection extends Module
 {
 {
+    private final static String BLOCK_BYPASS = "block.bypass";
+    
     private final BlockProtectionBank bank;
     private final BlockProtectionBank bank;
     
     
     public BlockProtection() 
     public BlockProtection() 
@@ -35,6 +40,37 @@ public class BlockProtection extends Module
         return bank;
         return bank;
     }
     }
     
     
+    private boolean shouldBeProtected(Block b)
+    {
+        return (b instanceof BlockDoor || 
+               b instanceof BlockContainer ||
+               b == Blocks.LEVER || 
+               b instanceof BlockButton || 
+               b instanceof BlockTrapDoor) && !(b instanceof BlockPistonMoving);   
+    }
+    
+    private BlockPos getSameNearbyBlock(World w, BlockPos pos, Block b)
+    {           
+        Location l = new Location(w, pos);
+        if(l.getRelativeBlockState(1, 0, 0).getBlock() == b)
+        {
+            return pos.add(1, 0, 0);
+        }
+        else if(l.getRelativeBlockState(-1, 0, 0).getBlock() == b)
+        {
+            return pos.add(-1, 0, 0);
+        }
+        else if(l.getRelativeBlockState(0, 0, 1).getBlock() == b)
+        {
+            return pos.add(0, 0, 1);
+        }
+        else if(l.getRelativeBlockState(0, 0, -1).getBlock() == b)
+        {
+            return pos.add(0, 0, -1);
+        }
+        return null;
+    }
+    
     @SubscribeEvent(priority = EventPriority.HIGHEST)
     @SubscribeEvent(priority = EventPriority.HIGHEST)
     public void onBlockPlace(BlockEvent.PlaceEvent e)
     public void onBlockPlace(BlockEvent.PlaceEvent e)
     {
     {
@@ -44,8 +80,8 @@ public class BlockProtection extends Module
         
         
         if(b == Blocks.CHEST || b == Blocks.TRAPPED_CHEST) // Deny placing chests near other protected chests
         if(b == Blocks.CHEST || b == Blocks.TRAPPED_CHEST) // Deny placing chests near other protected chests
         {
         {
-            BlockPos otherChest = Utils.getSameNearbyBlock(w, e.getPos(), b);
-            if(otherChest != null && !bank.hasAccess(otherChest, w, p) && !KajetansMod.perms.hasPermission(p, Permissions.BLOCK_BYPASS))
+            BlockPos otherChest = getSameNearbyBlock(w, e.getPos(), b);
+            if(otherChest != null && !bank.hasAccess(otherChest, w, p) && !KajetansMod.perms.hasPermission(p, BLOCK_BYPASS))
             {
             {
                 e.setCanceled(true);
                 e.setCanceled(true);
             }        
             }        
@@ -55,7 +91,7 @@ public class BlockProtection extends Module
             BlockPos pos = e.getPos().add(0, 1, 0);
             BlockPos pos = e.getPos().add(0, 1, 0);
             if(w.getBlockState(pos).getBlock() instanceof BlockContainer)
             if(w.getBlockState(pos).getBlock() instanceof BlockContainer)
             {
             {
-                if(!bank.hasAccess(pos, w, p) && !KajetansMod.perms.hasPermission(p, Permissions.BLOCK_BYPASS))
+                if(!bank.hasAccess(pos, w, p) && !KajetansMod.perms.hasPermission(p, BLOCK_BYPASS))
                 {
                 {
                     e.setCanceled(true);
                     e.setCanceled(true);
                 }               
                 }               
@@ -68,7 +104,7 @@ public class BlockProtection extends Module
     {
     {
         EntityPlayer p = e.getPlayer();
         EntityPlayer p = e.getPlayer();
         IBlockState state = e.getState();
         IBlockState state = e.getState();
-        if(Utils.shouldBeProtected(state.getBlock()))
+        if(shouldBeProtected(state.getBlock()))
         {
         {
             BlockPos pos = e.getPos();
             BlockPos pos = e.getPos();
             if(Utils.getStateValue(state, BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER)
             if(Utils.getStateValue(state, BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER)
@@ -76,7 +112,7 @@ public class BlockProtection extends Module
                 pos = pos.add(0, -1, 0);
                 pos = pos.add(0, -1, 0);
             } 
             } 
             World w = e.getWorld();
             World w = e.getWorld();
-            if(bank.hasAccess(pos, w, p) || KajetansMod.perms.hasPermission(p, Permissions.BLOCK_BYPASS))
+            if(bank.hasAccess(pos, w, p) || KajetansMod.perms.hasPermission(p, BLOCK_BYPASS))
             {
             {
                 bank.remove(pos, w);
                 bank.remove(pos, w);
                 return;
                 return;
@@ -93,7 +129,7 @@ public class BlockProtection extends Module
             return;
             return;
         }
         }
         IBlockState state = e.getWorld().getBlockState(e.getPos());
         IBlockState state = e.getWorld().getBlockState(e.getPos());
-        if(!Utils.shouldBeProtected(state.getBlock()))
+        if(!shouldBeProtected(state.getBlock()))
         {
         {
             return;
             return;
         }
         }
@@ -103,7 +139,7 @@ public class BlockProtection extends Module
         {
         {
             pos = pos.add(0, -1, 0);
             pos = pos.add(0, -1, 0);
         }
         }
-        if(!bank.hasAccess(pos, e.getWorld(), p) && !KajetansMod.perms.hasPermission(p, Permissions.BLOCK_BYPASS))
+        if(!bank.hasAccess(pos, e.getWorld(), p) && !KajetansMod.perms.hasPermission(p, BLOCK_BYPASS))
         {
         {
             e.setCanceled(true);   
             e.setCanceled(true);   
         }  
         }  

+ 0 - 86
src/main/java/me/km/blockprotections/BlockProtectionBank.java

@@ -1,86 +0,0 @@
-package me.km.blocks;
-
-import java.util.List;
-import javax.annotation.Nullable;
-import static net.minecraft.block.Block.FULL_BLOCK_AABB;
-import net.minecraft.block.material.Material;
-import net.minecraft.block.state.BlockFaceShape;
-import net.minecraft.block.state.IBlockState;
-import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.entity.Entity;
-import net.minecraft.util.EnumFacing;
-import net.minecraft.util.math.AxisAlignedBB;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-
-public class BlockBarrel extends BlockBase
-{
-    protected static final AxisAlignedBB AABB_LEGS = new AxisAlignedBB(0.0D, 0.0625D, 0.0D, 1.0D, 0.875D, 1.0D);
-    protected static final AxisAlignedBB AABB_WALL_NORTH = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.125D);
-    protected static final AxisAlignedBB AABB_WALL_SOUTH = new AxisAlignedBB(0.0D, 0.0D, 0.875D, 1.0D, 1.0D, 1.0D);
-    protected static final AxisAlignedBB AABB_WALL_EAST = new AxisAlignedBB(0.875D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D);
-    protected static final AxisAlignedBB AABB_WALL_WEST = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.125D, 1.0D, 1.0D);
-
-    public BlockBarrel(String name, String local) 
-    {
-        super(Material.WOOD, name, local);
-        super.setCreativeTab(CreativeTabs.DECORATIONS);
-    }
-
-    @Override
-    public void addCollisionBoxToList(IBlockState state, World w, BlockPos pos, AxisAlignedBB eBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity ent, boolean p_185477_7_)
-    {
-        addCollisionBoxToList(pos, eBox, collidingBoxes, AABB_LEGS);
-        addCollisionBoxToList(pos, eBox, collidingBoxes, AABB_WALL_WEST);
-        addCollisionBoxToList(pos, eBox, collidingBoxes, AABB_WALL_NORTH);
-        addCollisionBoxToList(pos, eBox, collidingBoxes, AABB_WALL_EAST);
-        addCollisionBoxToList(pos, eBox, collidingBoxes, AABB_WALL_SOUTH);
-    }
-
-    @Override
-    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
-    {
-        return FULL_BLOCK_AABB;
-    }
-
-    @Override
-    public boolean isOpaqueCube(IBlockState state)
-    {
-        return false;
-    }
-
-    @Override
-    public boolean isFullCube(IBlockState state)
-    {
-        return false;
-    }
-
-    /*@Override
-    public Item getItemDropped(IBlockState state, Random rand, int fortune)
-    {
-        return Items.CAULDRON;
-    }
-
-    @Override
-    public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state)
-    {
-        return new ItemStack(Items.CAULDRON);
-    }*/
-
-    @Override
-    public boolean isPassable(IBlockAccess worldIn, BlockPos pos)
-    {
-        return true;
-    }
-
-    @Override
-    public BlockFaceShape getBlockFaceShape(IBlockAccess w, IBlockState state, BlockPos pos, EnumFacing face)
-    {
-        if(face == EnumFacing.UP)
-        {
-            return BlockFaceShape.BOWL;
-        }
-        return face == EnumFacing.DOWN ? BlockFaceShape.UNDEFINED : BlockFaceShape.SOLID;
-    }
-}

+ 9 - 41
src/main/java/me/km/blocks/BlockBase.java

@@ -1,11 +1,11 @@
 package me.km.blocks;
 package me.km.blocks;
 
 
-import me.km.blocks.cauldron.BlockWoodCauldron;
-import me.km.blocks.cauldron.TileEntityCauldron;
+import me.km.blocks.cookingpot.TileEntityCookingPot;
 import me.km.blocks.campfire.TileEntityCampFire;
 import me.km.blocks.campfire.TileEntityCampFire;
 import me.km.blocks.campfire.BlockCampFireBurning;
 import me.km.blocks.campfire.BlockCampFireBurning;
 import me.km.blocks.campfire.BlockCampFire;
 import me.km.blocks.campfire.BlockCampFire;
 import me.km.blocks.campfire.BlockCampFireBurnt;
 import me.km.blocks.campfire.BlockCampFireBurnt;
+import me.km.blocks.cookingpot.BlockCookingPot;
 import me.km.blocks.leaves.*;
 import me.km.blocks.leaves.*;
 import me.km.fluids.BlockFluidBase;
 import me.km.fluids.BlockFluidBase;
 import me.km.fluids.BlockFluidHoney;
 import me.km.fluids.BlockFluidHoney;
@@ -49,21 +49,10 @@ public class ModBlocks
     public static BlockCrate crateOak;
     public static BlockCrate crateOak;
     public static BlockCrate crateSpruce;
     public static BlockCrate crateSpruce;
     
     
-    public static BlockWoodCauldron cauldronOak;
-    public static BlockWoodCauldron cauldronBirch;
-    public static BlockWoodCauldron cauldronAcacia;
-    public static BlockWoodCauldron cauldronJungle;
-    public static BlockWoodCauldron cauldronSpruce;
-    public static BlockWoodCauldron cauldronBigOak;
+    public static BlockCookingPot cookingPotCopper;
     
     
-    public static BlockBarrel barrelOak;
-    public static BlockBarrel barrelBirch;
-    public static BlockBarrel barrelAcacia;
-    public static BlockBarrel barrelJungle;
-    public static BlockBarrel barrelSpruce;
-    public static BlockBarrel barrelBigOak;
+    public static BlockBase barrel;
     
     
-    public static BlockCampFire campFire;
     public static BlockCampFireBurning campFireBurning;
     public static BlockCampFireBurning campFireBurning;
     public static BlockCampFireBurnt campFireBurnt;
     public static BlockCampFireBurnt campFireBurnt;
     
     
@@ -123,22 +112,11 @@ public class ModBlocks
         crateOak = register(r, new BlockCrate("crate_oak", "crateOak"));
         crateOak = register(r, new BlockCrate("crate_oak", "crateOak"));
         crateSpruce = register(r, new BlockCrate("crate_spruce", "crateSpruce"));
         crateSpruce = register(r, new BlockCrate("crate_spruce", "crateSpruce"));
         
         
-        cauldronOak = register(r, new BlockWoodCauldron("cauldron_oak", "cauldronOak"));
-        cauldronBirch = register(r, new BlockWoodCauldron("cauldron_birch", "cauldronBirch"));
-        cauldronAcacia = register(r, new BlockWoodCauldron("cauldron_acacia", "cauldronAcacia"));
-        cauldronJungle = register(r, new BlockWoodCauldron("cauldron_jungle", "cauldronJungle"));
-        cauldronSpruce = register(r, new BlockWoodCauldron("cauldron_spruce", "cauldronSpruce"));
-        cauldronBigOak = register(r, new BlockWoodCauldron("cauldron_big_oak", "cauldronBigOak"));
-        GameRegistry.registerTileEntity(TileEntityCauldron.class, "km:cauldron");
+        cookingPotCopper = register(r, new BlockCookingPot("cooking_pot_copper", "cookingPotCopper"));
+        GameRegistry.registerTileEntity(TileEntityCookingPot.class, "km:cauldron");
         
         
-        barrelOak = register(r, new BlockBarrel("barrel_oak", "barrelOak"));
-        barrelBirch = register(r, new BlockBarrel("barrel_birch", "barrelBirch"));
-        barrelAcacia = register(r, new BlockBarrel("barrel_acacia", "barrelAcacia"));
-        barrelJungle = register(r, new BlockBarrel("barrel_jungle", "barrelJungle"));
-        barrelSpruce = register(r, new BlockBarrel("barrel_spruce", "barrelSpruce"));
-        barrelBigOak = register(r, new BlockBarrel("barrel_big_oak", "barrelBigOak"));
+        barrel = register(r, (BlockBase) new BlockBase(Material.WOOD, "barrel", "barrel").setSoundType(SoundType.WOOD).setHardness(2.5f));
         
         
-        campFire = register(r, new BlockCampFire("camp_fire", "campFire"));
         campFireBurning = (BlockCampFireBurning) register(r, new BlockCampFireBurning("camp_fire_burning", "campFireBurning")).setLightLevel(1);
         campFireBurning = (BlockCampFireBurning) register(r, new BlockCampFireBurning("camp_fire_burning", "campFireBurning")).setLightLevel(1);
         campFireBurnt = register(r, new BlockCampFireBurnt("camp_fire_burnt", "campFireBurnt"));
         campFireBurnt = register(r, new BlockCampFireBurnt("camp_fire_burnt", "campFireBurnt"));
         GameRegistry.registerTileEntity(TileEntityCampFire.class, campFireBurning.getRegistryName().toString());
         GameRegistry.registerTileEntity(TileEntityCampFire.class, campFireBurning.getRegistryName().toString());
@@ -197,19 +175,9 @@ public class ModBlocks
         register(r, crateOak, getItemBlock(crateOak));
         register(r, crateOak, getItemBlock(crateOak));
         register(r, crateSpruce, getItemBlock(crateSpruce));
         register(r, crateSpruce, getItemBlock(crateSpruce));
         
         
-        register(r, cauldronAcacia, getItemBlock(cauldronAcacia));
-        register(r, cauldronBigOak, getItemBlock(cauldronBigOak));
-        register(r, cauldronBirch, getItemBlock(cauldronBirch));
-        register(r, cauldronJungle, getItemBlock(cauldronJungle));
-        register(r, cauldronOak, getItemBlock(cauldronOak));
-        register(r, cauldronSpruce, getItemBlock(cauldronSpruce));
+        register(r, cookingPotCopper, getItemBlock(cookingPotCopper));
         
         
-        register(r, barrelAcacia, getItemBlock(barrelAcacia));
-        register(r, barrelBigOak, getItemBlock(barrelBigOak));
-        register(r, barrelBirch, getItemBlock(barrelBirch));
-        register(r, barrelJungle, getItemBlock(barrelJungle));
-        register(r, barrelOak, getItemBlock(barrelOak));
-        register(r, barrelSpruce, getItemBlock(barrelSpruce));
+        register(r, barrel, getItemBlock(barrel));
         
         
         register(r, lantern, getItemBlock(lantern));
         register(r, lantern, getItemBlock(lantern));
         register(r, tallGrass, getItemBlock(tallGrass));
         register(r, tallGrass, getItemBlock(tallGrass));

+ 2 - 2
src/main/java/me/km/blocks/campfire/BlockCampFire.java

@@ -23,7 +23,7 @@ import net.minecraftforge.fml.relauncher.SideOnly;
 
 
 public class BlockCampFire extends BlockBase
 public class BlockCampFire extends BlockBase
 {
 {
-    public static final AxisAlignedBB BOX = new AxisAlignedBB(0.25D, 0.0D, 0.25D, 0.75D, 0.4D, 0.75D);
+    public static final AxisAlignedBB BOX = new AxisAlignedBB(0.0d, 0.0d, 0.0d, 1.0d, 0.4375d, 1.0d);
     
     
     public BlockCampFire(String name, String local) 
     public BlockCampFire(String name, String local) 
     {
     {
@@ -36,7 +36,7 @@ public class BlockCampFire extends BlockBase
     @Override
     @Override
     public boolean onBlockActivated(World w, BlockPos pos, IBlockState state, EntityPlayer p, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
     public boolean onBlockActivated(World w, BlockPos pos, IBlockState state, EntityPlayer p, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
     {
     {
-        if (w.isRemote)
+        if(w.isRemote)
         {
         {
             return true;
             return true;
         }
         }

+ 0 - 29
src/main/java/me/km/blocks/campfire/BlockCampFireBurning.java

@@ -1,29 +0,0 @@
-package me.km.blocks.cauldron;
-
-import net.minecraft.block.SoundType;
-import net.minecraft.block.material.MapColor;
-import net.minecraft.block.state.IBlockState;
-import net.minecraft.entity.Entity;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.IBlockAccess;
-import net.minecraft.world.World;
-
-public class BlockWoodCauldron extends BlockModCauldron
-{
-    public BlockWoodCauldron(String name, String local) 
-    {
-        super(name, local);
-    }
-
-    @Override
-    public MapColor getMapColor(IBlockState state, IBlockAccess worldIn, BlockPos pos) 
-    {
-        return MapColor.WOOD;
-    }
-   
-    @Override
-    public SoundType getSoundType(IBlockState state, World world, BlockPos pos, Entity entity) 
-    {
-        return SoundType.WOOD;
-    }
-}

+ 9 - 9
src/main/java/me/km/blocks/cauldron/BlockModCauldron.java → src/main/java/me/km/blocks/cookingpot/BlockCookingPot.java

@@ -1,4 +1,4 @@
-package me.km.blocks.cauldron;
+package me.km.blocks.cookingpot;
 
 
 import java.util.Random;
 import java.util.Random;
 import me.km.KajetansMod;
 import me.km.KajetansMod;
@@ -20,11 +20,11 @@ import net.minecraft.util.EnumHand;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraft.world.World;
 
 
-public class BlockModCauldron extends BlockCauldron implements IBlockBase, ITileEntityProvider
+public class BlockCookingPot extends BlockCauldron implements IBlockBase, ITileEntityProvider
 {
 {
     protected String name;
     protected String name;
 
 
-    public BlockModCauldron(String name, String local) 
+    public BlockCookingPot(String name, String local) 
     {
     {
         this.name = name;
         this.name = name;
         this.setRegistryName(name);
         this.setRegistryName(name);
@@ -40,7 +40,7 @@ public class BlockModCauldron extends BlockCauldron implements IBlockBase, ITile
     }
     }
 
 
     @Override
     @Override
-    public BlockModCauldron setSoundType(SoundType sound) 
+    public BlockCookingPot setSoundType(SoundType sound) 
     {
     {
         super.setSoundType(sound);
         super.setSoundType(sound);
         return this;
         return this;
@@ -49,7 +49,7 @@ public class BlockModCauldron extends BlockCauldron implements IBlockBase, ITile
     @Override
     @Override
     public TileEntity createNewTileEntity(World worldIn, int meta) 
     public TileEntity createNewTileEntity(World worldIn, int meta) 
     {
     {
-        return new TileEntityCauldron();
+        return new TileEntityCookingPot();
     }
     }
     
     
     @Override
     @Override
@@ -81,9 +81,9 @@ public class BlockModCauldron extends BlockCauldron implements IBlockBase, ITile
         else
         else
         {
         {
             TileEntity te = w.getTileEntity(pos);
             TileEntity te = w.getTileEntity(pos);
-            if(te instanceof TileEntityCauldron)
+            if(te instanceof TileEntityCookingPot)
             {
             {
-                TileEntityCauldron cauldron = (TileEntityCauldron) te;
+                TileEntityCookingPot cauldron = (TileEntityCookingPot) te;
                 boolean b = false;
                 boolean b = false;
                 if(cauldron.hasDefaultColor())
                 if(cauldron.hasDefaultColor())
                 {
                 {
@@ -139,9 +139,9 @@ public class BlockModCauldron extends BlockCauldron implements IBlockBase, ITile
         if(level <= 0 && !w.isRemote)
         if(level <= 0 && !w.isRemote)
         {
         {
             TileEntity te = w.getTileEntity(pos);
             TileEntity te = w.getTileEntity(pos);
-            if(te instanceof TileEntityCauldron)
+            if(te instanceof TileEntityCookingPot)
             {
             {
-                ((TileEntityCauldron) te).reset();
+                ((TileEntityCookingPot) te).reset();
             }
             }
         }
         }
         super.setWaterLevel(w, pos, state, level);
         super.setWaterLevel(w, pos, state, level);

+ 3 - 3
src/main/java/me/km/blocks/cauldron/CauldronColorMixer.java → src/main/java/me/km/blocks/cookingpot/CookingPotColorMixer.java

@@ -1,4 +1,4 @@
-package me.km.blocks.cauldron;
+package me.km.blocks.cookingpot;
 
 
 import java.awt.Color;
 import java.awt.Color;
 import java.util.LinkedList;
 import java.util.LinkedList;
@@ -6,7 +6,7 @@ import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemFishFood;
 import net.minecraft.item.ItemFishFood;
 
 
-public class CauldronColorMixer 
+public class CookingPotColorMixer 
 {
 {
     public final static Color DEFAULT = new Color(47, 67, 244); 
     public final static Color DEFAULT = new Color(47, 67, 244); 
     
     
@@ -45,7 +45,7 @@ public class CauldronColorMixer
     private final LinkedList<Color> colors;
     private final LinkedList<Color> colors;
     private Color cachedColor; 
     private Color cachedColor; 
 
 
-    public CauldronColorMixer()
+    public CookingPotColorMixer()
     {
     {
         items = new LinkedList<>();
         items = new LinkedList<>();
         colors = new LinkedList<>();
         colors = new LinkedList<>();

+ 5 - 5
src/main/java/me/km/blocks/cauldron/TileEntityCauldron.java → src/main/java/me/km/blocks/cookingpot/TileEntityCookingPot.java

@@ -1,4 +1,4 @@
-package me.km.blocks.cauldron;
+package me.km.blocks.cookingpot;
 
 
 import java.awt.Color;
 import java.awt.Color;
 import java.util.LinkedList;
 import java.util.LinkedList;
@@ -13,13 +13,13 @@ import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraft.world.World;
 
 
-public class TileEntityCauldron extends TileEntity
+public class TileEntityCookingPot extends TileEntity
 {
 {
-    private CauldronColorMixer mixer;
+    private CookingPotColorMixer mixer;
     
     
-    public TileEntityCauldron()
+    public TileEntityCookingPot()
     {
     {
-        mixer = new CauldronColorMixer();
+        mixer = new CookingPotColorMixer();
     }
     }
     
     
     @Override
     @Override

+ 1 - 2
src/main/java/me/km/blocks/leaves/BlockApricotLeaves.java

@@ -4,7 +4,6 @@ import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.Predicate;
 import me.km.KajetansMod;
 import me.km.KajetansMod;
-import me.km.permissions.Permissions;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.util.text.TextComponentString;
 import net.minecraft.util.text.TextComponentString;
 
 
@@ -24,7 +23,7 @@ public class ChatChannel
             {
             {
                 TextComponentString text = new TextComponentString(s);
                 TextComponentString text = new TextComponentString(s);
                 cc.forEach(p -> p.sendMessage(text));
                 cc.forEach(p -> p.sendMessage(text));
-            }, p -> KajetansMod.perms.hasPermission(p, Permissions.SCRIPT_ERROR));   
+            }, p -> KajetansMod.perms.hasPermission(p, "script.error"));   
     
     
     // -------------------------------------------------------------------------
     // -------------------------------------------------------------------------
     // chat channels
     // chat channels

+ 0 - 329
src/main/java/me/km/chatchannel/TextColor.java

@@ -1,329 +0,0 @@
-package me.km.datatools;
-
-import me.km.module.Module;
-import me.km.module.ModuleCommand;
-import me.km.utils.Utils;
-import me.km.utils.NBTUtils;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import me.km.permissions.Permissions;
-import me.km.utils.ItemStackUtils;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.inventory.EntityEquipmentSlot;
-import net.minecraft.item.ItemArmor;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.text.TextComponentString;
-
-public class CommandDataTools extends ModuleCommand
-{
-    private final ArrayList<String> first;
-    
-    public CommandDataTools(Module m) 
-    {
-        super("datatools", m);
-        super.setDescription("special commands for changing date");
-        super.setUsage("/datatools for help");
-        super.setPermission(Permissions.DATATOOLS);  
-        super.addAlias("dt");
-        
-        first = new ArrayList<>(Arrays.asList(new String[]
-                {"print-nbt", "flag", "attribute", "hide-entity", "show-entity", 
-            "name-entity", "name-item", "lore-item", "silent-entity", "magic"})); 
-    }
-
-    @Override
-    public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) 
-    {
-        List<String> names = new ArrayList<>();
-        switch (args.length) 
-        {
-            case 1:
-                first.stream().filter(e -> e.toLowerCase().startsWith(args[0].toLowerCase())).forEach(e ->
-                {
-                    names.add(e);
-                }); 
-                break;
-            case 2:
-                if(args[0].equals("flag"))
-                {
-                    Arrays.stream(ItemStackUtils.ItemFlag.values()).filter(e -> e.toString().toLowerCase().startsWith(args[1].toLowerCase())).forEach(e ->
-                    {
-                        names.add(e.toString());
-                    });
-                }
-                else if(args[0].equals("attribute"))
-                {
-                    Arrays.stream(ItemStackUtils.Attribute.values()).filter(e -> e.toString().toLowerCase().startsWith(args[1].toLowerCase())).forEach(e ->
-                    {
-                        names.add(e.toString());
-                    });
-                }   
-                break;
-            case 3:
-                if(args[0].equals("attribute"))
-                {
-                    Arrays.stream(EntityEquipmentSlot.values()).filter(e -> e.toString().toLowerCase().startsWith(args[2].toLowerCase())).forEach(e ->
-                    {
-                        names.add(e.toString());
-                    });
-                }   
-                break;
-            case 5:
-                if(args[0].equals("attribute"))
-                {
-                    Arrays.stream(ItemStackUtils.Operation.values()).filter(e -> e.toString().toLowerCase().startsWith(args[4].toLowerCase())).forEach(e ->
-                    {
-                        names.add(e.toString());
-                    });
-                }   
-                break;    
-        }
-        return names;  
-    }
-
-    @Override
-    public boolean execute(ICommandSender cs, String[] arg) 
-    {
-        if(!(cs instanceof EntityPlayerMP))
-        {
-            //this.getModule().send(cs, GlobalText.onlyPlayer());
-            return true;
-        }
-        EntityPlayerMP p = (EntityPlayerMP) cs;
-        Module m = this.getModule();
-        if(arg.length >= 1)
-        {         
-            switch (arg[0]) 
-            {
-                case "print-nbt":
-                {
-                    Entity ent = Utils.getTargetedEntity(p, 3, Entity.class);
-                    if(ent == null)
-                    {
-                        m.send(cs, "You must look at an entity.");
-                        return true;
-                    }       
-                    //this.getModule().send(cs, GlobalText.Spacer());
-                    this.getModule().send(cs, "NBT: " + ent.getName());
-                    String nbt = NBTUtils.toString(ent);
-                    cs.sendMessage(new TextComponentString(NBTUtils.highlightNbtSyntax(nbt)));   
-                    NBTUtils.sendCopyableText(p, nbt);
-                    return true;
-                }
-                case "flag":
-                {
-                    if(arg.length < 2)
-                    {
-                        break;
-                    }
-                    ItemStack stack = p.getHeldItemMainhand();
-                    if(stack == ItemStack.EMPTY)
-                    {
-                        m.send(cs, "You must hold an item in your hand.");
-                        return true;
-                    }
-                    try
-                    {
-                        ItemStackUtils.ItemFlag flag = ItemStackUtils.ItemFlag.valueOf(arg[1].toUpperCase());
-                        ItemStackUtils.addItemFlag(stack, flag);
-                        m.send(cs, "The flag was added.");
-                    }
-                    catch(IllegalArgumentException ex)
-                    {
-                        m.send(cs, "The given flag does not exist.");
-                    }                           
-                    return true;
-                }
-                case "attribute":
-                {
-                    ItemStack stack = p.getHeldItemMainhand();
-                    if(stack == ItemStack.EMPTY)
-                    {
-                        m.send(cs, "You must hold an item in your hand.");
-                        return true;
-                    }                            
-                    if(arg.length < 5)
-                    {
-                        break;
-                    }
-                    try
-                    {
-                        ItemStackUtils.addAttribute(stack, ItemStackUtils.Attribute.valueOf(arg[1]), 
-                                EntityEquipmentSlot.valueOf(arg[2]), Double.parseDouble(arg[3]), ItemStackUtils.Operation.valueOf(arg[4]));
-                        m.send(cs, "The attribute was added.");
-                    } 
-                    catch(NumberFormatException ex)
-                    {
-                        m.send(cs, "A number is invalid.");
-                    }
-                    catch(IllegalArgumentException ex)
-                    {
-                        m.send(cs, "The enum does not exist.");
-                    }
-                    return true;
-                }
-                case "hide-entity":
-                {
-                    Entity ent = Utils.getTargetedEntity(p, 3, Entity.class);
-                    if(ent == null)
-                    {
-                        m.send(cs, "You must look at an entity.");
-                        return true;
-                    }                        
-                    ent.setInvisible(true);
-                    m.send(cs, "The entity is now invisible.");
-                    return true;    
-                }
-                case "show-entity":
-                    Collection<Entity> ents = Utils.getEntities(p.getEntityWorld(), p.posX, p.posY, p.posZ, 3, Entity.class);
-                    if(ents.isEmpty())
-                    {
-                        m.send(cs, "There must be at least one entity in your surroundings.");
-                        return true;
-                    } 
-                    ents.stream().forEach(ent -> ent.setInvisible(false));
-                    m.send(cs, "All entities near you are visible again.");
-                    return true;  
-                case "silent-entity":
-                {
-                    Entity ent = Utils.getTargetedEntity(p, 3, Entity.class);
-                    if(ent == null)
-                    {
-                        m.send(cs, "You must look at an entity.");
-                        return true;
-                    }                                 
-                    ent.setSilent(true);
-                    m.send(cs, "The entity is now silent.");
-                    return true;    
-                }
-                case "name-entity":
-                {
-                    if(arg.length < 2)
-                    {
-                        break;
-                    }
-                    Entity ent = Utils.getTargetedEntity(p, 3, Entity.class);
-                    if(ent == null)
-                    {
-                        m.send(cs, "You must look at an entity.");
-                        return true;
-                    }                                
-                    String s = Utils.colorMessage(Utils.connectSpaces(arg, 1), p);
-                    ent.setCustomNameTag(s);
-                    m.send(cs, "The entity is now called '" + s + "§r'.");
-                    return true; 
-                }
-                case "name-item":
-                {
-                    if(arg.length < 2)
-                    { 
-                        break;
-                    }
-                    ItemStack hand = p.getHeldItemMainhand();
-                    if(hand == ItemStack.EMPTY)
-                    {
-                        m.send(cs, "You must hold an item in your hand.");
-                        return true;
-                    }                          
-                    String s = Utils.colorMessage(Utils.connectSpaces(arg, 1), p);
-                    hand.setStackDisplayName(s);
-                    m.send(cs, "The item is now called '" + s + "§r'.");
-                    return true;
-                }
-                case "lore-item":
-                {
-                    if(arg.length < 3)
-                    {
-                        break;
-                    }
-                    ItemStack hand = p.getHeldItemMainhand();
-                    if(hand == ItemStack.EMPTY)
-                    {
-                        m.send(cs, "You must hold an item in your hand.");
-                        return true;
-                    }                          
-                    int line;
-                    try
-                    {
-                        line = Integer.parseInt(arg[1]);
-                        if(line < 0)
-                        {
-                            throw new NumberFormatException();
-                        }
-                    }
-                    catch(NumberFormatException ex)
-                    {
-                        m.send(cs, "An invalid number was given.");
-                        return true;
-                    }            
-                    ItemStackUtils.addLore(hand, Utils.colorMessage(Utils.connectSpaces(arg, 2), p), line);
-                    m.send(cs, "The new lore was added.");
-                    return true;
-                }
-                case "magic":
-                {
-                    if(arg.length < 2)
-                    {
-                        break;
-                    }
-                    ItemStack hand = p.getHeldItemMainhand();
-                    if(hand == ItemStack.EMPTY)
-                    {
-                        m.send(cs, "You must hold an item in your hand.");
-                        return true;
-                    }                          
-                    int value;
-                    try
-                    {
-                        value = Integer.parseInt(arg[1]);
-                        if(value < 0)
-                        {
-                            throw new NumberFormatException();
-                        }
-                    }
-                    catch(NumberFormatException ex)
-                    {
-                        m.send(cs, "An invalid number was given.");
-                        return true;
-                    }         
-                    if(hand.getItem() instanceof ItemArmor)
-                    {
-                        NBTTagCompound com = hand.getTagCompound();
-                        if(com == null)
-                        {
-                            com = new NBTTagCompound();
-                            hand.setTagCompound(com);
-                        }
-                        com.setInteger("magic", value);
-                        m.send(cs, "The magic resistance was set to " + value + ".");
-                    }
-                    else
-                    {
-                        m.send(cs, "Only armor can have magic resistance.");
-                    }
-                    return true;
-                }
-            }
-        }
-                    
-        m.send(cs, "/datatools ...");
-        m.sendHelpListElement(cs, "print-nbt", "prints NBT of an entity");
-        m.sendHelpListElement(cs, "flag <flag>", "adds a flag to an itemstack");
-        m.sendHelpListElement(cs, "attribute <a> <slot> <d> <op>", "adds an attribute to an itemstack");
-        m.sendHelpListElement(cs, "hide-entity", "makes an entity invisible");
-        m.sendHelpListElement(cs, "show-entity", "makes near entities visible");
-        m.sendHelpListElement(cs, "silent-entity", "silence an entity");
-        m.sendHelpListElement(cs, "name-entity <name>", "sets the name of an entity");
-        m.sendHelpListElement(cs, "name-item <name>", "sets the name of an item");
-        m.sendHelpListElement(cs, "lore-item <line> <lore>", "sets the lore of an item");
-        m.sendHelpListElement(cs, "magic <def>", "sets magic resistance of armor");
-        return true;  
-    }
-}

+ 0 - 148
src/main/java/me/km/datatools/CommandHuman.java

@@ -1,148 +0,0 @@
-package me.km.datatools;
-
-import me.km.module.Module;
-import me.km.module.ModuleCommand;
-import me.km.utils.Utils;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import me.km.entities.EntityHuman;
-import me.km.permissions.Permissions;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.World;
-
-public class CommandHuman extends ModuleCommand
-{
-    private final ArrayList<String> first;
-    
-    public CommandHuman(Module m) 
-    {
-        super("human", m);
-        super.setDescription("special commands for humans");
-        super.setUsage("/human für die Hilfe");
-        super.setPermission(Permissions.HUMAN);  
-        super.addAlias("h");
-        
-        first = new ArrayList<>(Arrays.asList(new String[]
-                {"spawn", "set", "kill", "size", "slim"})); 
-    }
-
-    @Override
-    public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) 
-    {
-        List<String> names = new ArrayList<>();
-        switch (args.length) 
-        {
-            case 1:
-                first.stream().filter(e -> e.toLowerCase().startsWith(args[0].toLowerCase())).forEach(e ->
-                {
-                    names.add(e);
-                }); 
-                break;  
-        }
-        return names;  
-    }
-
-    @Override
-    public boolean execute(ICommandSender cs, String[] arg) 
-    {
-        if(!(cs instanceof EntityPlayerMP))
-        {
-            this.getModule().send(cs, "This command is only for players.");
-            return true;
-        }
-        EntityPlayerMP p = (EntityPlayerMP) cs;
-        Module m = this.getModule();
-        if(arg.length >= 1)
-        {         
-            switch (arg[0]) 
-            {
-                case "spawn":
-                {                                            
-                    World w = p.getEntityWorld();
-                    EntityHuman h = new EntityHuman(w);
-                    h.setPosition(p.posX, p.posY, p.posZ);       
-                    w.spawnEntity(h);
-                    return true;
-                }
-                case "set":
-                {
-                    if(arg.length < 2)
-                    {
-                        break;
-                    }
-                    EntityHuman h = Utils.getTargetedEntity(p, 3, EntityHuman.class);
-                    if(h == null)
-                    {
-                        m.send(cs, "You must look at a human.");
-                        return true;
-                    }       
-                    h.setSkinName(arg[1]);
-                    m.send(cs, "The data was changed.");
-                    return true;
-                }
-                case "kill":
-                {
-                    EntityHuman h = Utils.getTargetedEntity(p, 3, EntityHuman.class);
-                    if(h == null)
-                    {
-                        m.send(cs, "You must look at a human.");
-                        return true;
-                    }       
-                    h.setDead();
-                    m.send(cs, "The human was killed.");
-                    return true;
-                }
-                case "size":
-                {
-                    if(arg.length < 2)
-                    {
-                        break;
-                    }
-                    EntityHuman h = Utils.getTargetedEntity(p, 3, EntityHuman.class);
-                    if(h == null)
-                    {
-                        m.send(cs, "You must look at a human.");
-                        return true;
-                    }       
-                    float scale;
-                    try
-                    {
-                        scale = Float.parseFloat(arg[1]);
-                    }
-                    catch(NumberFormatException ex)
-                    {
-                        m.send(cs, "The given float was invalid.");
-                        return true;
-                    }
-                    h.setScale(scale);
-                    m.send(cs, "The human was scaled.");
-                    return true;
-                }
-                case "slim":
-                {
-                    EntityHuman h = Utils.getTargetedEntity(p, 3, EntityHuman.class);
-                    if(h == null)
-                    {
-                        m.send(cs, "You must look at a human.");
-                        return true;
-                    }       
-                    h.setSlim(!h.isSlim());
-                    m.send(cs, "The skin was changed.");
-                    return true;
-                }
-            }
-        }
-                    
-        m.send(cs, "/human ...");
-        m.sendHelpListElement(cs, "spawn", "spawns a human");
-        m.sendHelpListElement(cs, "set <name>", "sets the human's skinname");
-        m.sendHelpListElement(cs, "kill", "kills a human");
-        m.sendHelpListElement(cs, "size <scale>", "scales a human");
-        m.sendHelpListElement(cs, "slim", "switch between Alex/Steve model");
-        return true;  
-    }
-}

+ 0 - 161
src/main/java/me/km/datatools/CommandVillager.java

@@ -1,161 +0,0 @@
-package me.km.datatools;
-
-import me.km.module.Module;
-import me.km.module.ModuleCommand;
-import me.km.utils.Utils;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import me.km.inventory.CustomContainer;
-import me.km.permissions.Permissions;
-import me.km.inventory.InventoryBase;
-import me.km.inventory.InventoryUtils;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.entity.SharedMonsterAttributes;
-import net.minecraft.entity.passive.EntityVillager;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.village.MerchantRecipe;
-import net.minecraft.village.MerchantRecipeList;
-import net.minecraft.world.World;
-
-public class CommandVillager extends ModuleCommand
-{
-    private final ArrayList<String> vil;
-    
-    public CommandVillager(Module m) 
-    {
-        super("villager", m);
-        super.setDescription("Spezielle Commands für Villager");
-        super.setUsage("/villager für die Hilfe");
-        super.setPermission(Permissions.VILLAGER);
-        super.addAlias("vi");
-        
-        vil = new ArrayList<>(Arrays.asList(new String[] {"inv", "trades", "spawn", "child"})); 
-    }
-
-    @Override
-    public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) 
-    {
-        List<String> names = new ArrayList<>();     
-        if(args.length == 1)
-        {
-            vil.stream().filter(e -> e.toLowerCase().startsWith(args[0].toLowerCase())).forEach(e -> 
-            {                   
-                names.add(e);
-            });
-            return names;
-        }     
-        return names;  
-    }
-
-    @Override
-    public boolean execute(ICommandSender cs, String[] arg) 
-    {
-        if(!(cs instanceof EntityPlayerMP))
-        {
-            this.getModule().send(cs, "This command is only for players.");
-            return true;
-        }
-        EntityPlayerMP p = (EntityPlayerMP) cs;
-        Module m = this.getModule();
-        if(arg.length >= 1)
-        {         
-            switch (arg[0])    
-            {
-                case "inv":
-                {
-                    EntityVillager v = Utils.getTargetedEntity(p, 3, EntityVillager.class);
-                    if(v == null)
-                    {
-                        m.send(cs, "Du musst auf einen Villager gerichtet sein.");
-                        return true;
-                    }       
-                    p.displayGUIChest(InventoryUtils.getInventory(v));
-                    return true;
-                }
-                case "trades":
-                {
-                    EntityVillager v = Utils.getTargetedEntity(p, 3, EntityVillager.class);
-                    if(v == null)
-                    {
-                        m.send(cs, "Du musst auf einen Villager gerichtet sein.");
-                        return true;
-                    }         
-                    InventoryBase inv = new InventoryBase("ChangeTrades - " + v.getEntityId(), 54, v);
-                    int i = 0;
-                    MerchantRecipeList list = v.getRecipes(null);
-                    if(list != null)
-                    {
-                        for(MerchantRecipe mr : list)
-                        {
-                            inv.setInventorySlotContents(i, mr.getItemToSell().copy());
-                            inv.setInventorySlotContents(i + 9, mr.getItemToBuy().copy());
-                            inv.setInventorySlotContents(i + 18, mr.getSecondItemToBuy().copy());                         
-                            i++;
-                            if(i >= 9)
-                            {
-                                i = 27;
-                            }
-                            if(i >= 36)
-                            {
-                                break;
-                            }
-                        }
-                    }
-                    new CustomContainer(inv, p).openForPlayer();
-                    return true;
-                }
-                case "spawn":   
-                    if(arg.length >= 2)
-                    {                                                      
-                        try
-                        {
-                            World w = p.getEntityWorld();
-                            EntityVillager v = new EntityVillager(w, Integer.parseInt(arg[1]));
-                            v.setPosition(p.posX, p.posY, p.posZ);       
-                            v.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0);
-                            w.spawnEntity(v);
-                            return true;
-                        }
-                        catch(NumberFormatException ex)
-                        {
-                            m.send(cs, "Die ID ist ungültig.");
-                        } 
-                        catch(IllegalArgumentException ex)
-                        {
-                            m.send(cs, "Dieser Typ von Villager existiert nicht.");
-                        } 
-                    }
-                    break;
-                case "child":   
-                    if(arg.length >= 2)
-                    {                                                      
-                        try
-                        {
-                            World w = p.getEntityWorld();
-                            EntityVillager v = new EntityVillager(w, Integer.parseInt(arg[1]));
-                            v.setGrowingAge(Integer.MIN_VALUE);
-                            v.setPosition(p.posX, p.posY, p.posZ);       
-                            v.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0);
-                            w.spawnEntity(v);
-                            return true;
-                        }
-                        catch(IllegalArgumentException ex)
-                        {
-                            m.send(cs, "Dieser Typ von Villager existiert nicht.");
-                        } 
-                    }
-                    break;
-            }
-        }
-        // Help Menu
-        m.send(cs, "/villager ...");
-        m.sendHelpListElement(cs, "inv", "Öffnet den Inventar eines Villagers");
-        m.sendHelpListElement(cs, "trades", "Öffnet die Trades vom Villager");
-        m.sendHelpListElement(cs, "spawn <profid>", "Spawnt einen Villager");
-        m.sendHelpListElement(cs, "child <profid>", "Spawnt einen Villager");
-        return true;
-    }
-}

+ 0 - 86
src/main/java/me/km/datatools/DataToolsEvents.java

@@ -1,86 +0,0 @@
-package me.km.datatools;
-
-import me.km.module.Module;
-import me.km.module.ModuleListener;
-import me.km.inventory.CustomContainer;
-import me.km.inventory.InventoryBase;
-import me.km.inventory.InventoryUtils;
-import me.km.utils.ReflectionUtils;
-import net.minecraft.entity.passive.EntityVillager;
-import net.minecraft.inventory.ContainerChest;
-import net.minecraft.inventory.IInventory;
-import net.minecraft.item.ItemStack;
-import net.minecraft.village.MerchantRecipe;
-import net.minecraft.village.MerchantRecipeList;
-import net.minecraftforge.event.entity.living.LivingAttackEvent;
-import net.minecraftforge.event.entity.player.PlayerContainerEvent;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-
-public class DataToolsEvents
-{
-    private final Module m;
-    
-    public DataToolsEvents(Module m)
-    {
-        this.m = m;
-    }
-    
-    @SubscribeEvent
-    public void onVillagerMenuClose(PlayerContainerEvent.Close e)
-    {             
-        if(e.getContainer() instanceof CustomContainer)
-        {
-            CustomContainer c = (CustomContainer) e.getContainer();
-            InventoryBase inv = c.getInventoryBase();
-            if(inv.getName().startsWith("ChangeTrades"))
-            {
-                EntityVillager v = (EntityVillager) inv.getOwner();
-                ReflectionUtils.setCareerLevel(v, 10);
-                MerchantRecipeList list = v.getRecipes(null);
-                if(list == null)
-                {
-                    return; // will never happen
-                }
-                else
-                {
-                    list.clear();
-                }
-                MerchantRecipe mr;
-                for(int i = 0; i < 36; i++)
-                {
-                    if(i == 9)
-                    {
-                        i = 27;
-                    }
-                    if(inv.getStackInSlot(i) == ItemStack.EMPTY)
-                    {
-                        continue;                
-                    }          
-
-                    mr = new MerchantRecipe(inv.getStackInSlot(i + 9), inv.getStackInSlot(i + 18), inv.getStackInSlot(i), 0, Integer.MAX_VALUE);
-                    list.add(mr);
-                }
-                m.send(e.getEntityPlayer(), "The villager deals were overwritten.");
-            }
-        }
-        else if(e.getContainer() instanceof ContainerChest)
-        {
-            ContainerChest c = (ContainerChest) e.getContainer();
-            IInventory inv = c.getLowerChestInventory();
-            if(inv.getName().startsWith("ChangeInventory") && inv instanceof InventoryBase)
-            {
-                InventoryUtils.setInventory((InventoryBase) inv);
-                m.send(e.getEntityPlayer(), "The villager inventory was overwritten.");
-            }
-        }
-    }
-    
-    @SubscribeEvent
-    public void VillagerProtect(LivingAttackEvent e)
-    { 
-        if(e.getEntityLiving() instanceof EntityVillager && !e.getSource().isCreativePlayer())
-        {
-            e.setCanceled(true);
-        }
-    }
-}

+ 1 - 1
src/main/java/me/km/effects/EffectUtils.java

@@ -126,7 +126,7 @@ public class EntityItemProjectile extends EntityItem implements IProjectile
                     return true;
                     return true;
                 }
                 }
                 // size of the projectile is 0.25 x 0.25
                 // size of the projectile is 0.25 x 0.25
-                return ent.getEntityBoundingBox().grow(0.125f).calculateIntercept(oldV, newV) == null;
+                return ent.getEntityBoundingBox().grow(0.25f).calculateIntercept(oldV, newV) == null;
             });
             });
             if(!list.isEmpty())
             if(!list.isEmpty())
             {
             {

+ 3 - 1
src/main/java/me/km/entities/EntityNobody.java

@@ -6,6 +6,7 @@ import java.util.LinkedList;
 import me.hammerle.snuviscript.code.Script;
 import me.hammerle.snuviscript.code.Script;
 import me.km.DamageUtils;
 import me.km.DamageUtils;
 import me.km.KajetansMod;
 import me.km.KajetansMod;
+import me.km.scoreboard.ScoreboardUtils;
 import me.km.utils.ReflectionUtils;
 import me.km.utils.ReflectionUtils;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.EntityLivingBase;
@@ -55,10 +56,11 @@ public class CustomEventCaller
     }
     }
     
     
     @SubscribeEvent
     @SubscribeEvent
-    public void onPlayerMove(TickEvent.ServerTickEvent e)
+    public void onServerTick(TickEvent.ServerTickEvent e)
     {      
     {      
         if(e.phase == TickEvent.Phase.END)
         if(e.phase == TickEvent.Phase.END)
         {
         {
+            ScoreboardUtils.update();
             if(!ADD_QUEUE.isEmpty())
             if(!ADD_QUEUE.isEmpty())
             {
             {
                 ADD_QUEUE.forEach(data -> MOVE_DATA.put(data.getId(), data));
                 ADD_QUEUE.forEach(data -> MOVE_DATA.put(data.getId(), data));

+ 0 - 26
src/main/java/me/km/events/PlayerHurtEvent.java

@@ -1,37 +1,11 @@
 package me.km.inventory;
 package me.km.inventory;
 
 
-import net.minecraft.entity.passive.EntityVillager;
 import net.minecraft.inventory.IInventory;
 import net.minecraft.inventory.IInventory;
-import net.minecraft.inventory.InventoryBasic;
 import net.minecraft.item.Item;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
 
 
 public class InventoryUtils
 public class InventoryUtils
 {       
 {       
-    public static InventoryBase getInventory(EntityVillager v)
-    {
-        InventoryBase real = new InventoryBase("ChangeInventory - " + v.getEntityId(), 9, v);
-        InventoryBasic old = v.getVillagerInventory();
-        for(int i = 0; i < 9; i++)
-        {
-            real.setInventorySlotContents(i, old.getStackInSlot(i).copy());
-        }
-        return real;
-    }
-    
-    public static void setInventory(InventoryBase inv)
-    {
-        if(inv.getOwner() instanceof EntityVillager)
-        {
-            EntityVillager v = (EntityVillager) inv.getOwner();
-            InventoryBasic vInv = v.getVillagerInventory();
-            for(int i = 0; i < 8; i++)
-            {
-                vInv.setInventorySlotContents(i, inv.getStackInSlot(i).copy());
-            }
-        }
-    }
-
     public static int searchInventoryFor(IInventory inv, ItemStack searchfor, boolean useData)
     public static int searchInventoryFor(IInventory inv, ItemStack searchfor, boolean useData)
     {
     {
         if(searchfor.isEmpty())
         if(searchfor.isEmpty())

+ 3 - 3
src/main/java/me/km/items/ItemArmor.java

@@ -2,7 +2,7 @@ package me.km.items;
 
 
 import java.util.LinkedList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.List;
-import me.km.blocks.cauldron.CauldronColorMixer;
+import me.km.blocks.cookingpot.CookingPotColorMixer;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayer;
@@ -61,7 +61,7 @@ public class ItemColoredSoup extends ItemFood
         if(com == null)
         if(com == null)
         {
         {
             com = new NBTTagCompound();
             com = new NBTTagCompound();
-            com.setInteger("color", CauldronColorMixer.DEFAULT.getRGB());
+            com.setInteger("color", CookingPotColorMixer.DEFAULT.getRGB());
             com.setTag("ingredients", new NBTTagList());
             com.setTag("ingredients", new NBTTagList());
             com.setFloat("saturation", 0);
             com.setFloat("saturation", 0);
             com.setInteger("food", 0);
             com.setInteger("food", 0);
@@ -71,7 +71,7 @@ public class ItemColoredSoup extends ItemFood
         {
         {
             if(!com.hasKey("color"))
             if(!com.hasKey("color"))
             {
             {
-                com.setInteger("color", CauldronColorMixer.DEFAULT.getRGB());   
+                com.setInteger("color", CookingPotColorMixer.DEFAULT.getRGB());   
             }
             }
             if(!com.hasKey("ingredients", 9))
             if(!com.hasKey("ingredients", 9))
             {
             {

+ 1 - 1
src/main/java/me/km/items/ItemCylinder.java

@@ -411,7 +411,7 @@ public class ModItems
         herbFire = register(r, new ItemHerbs("herb_fire", "herbFire", new PotionEffect(MobEffects.FIRE_RESISTANCE, 2400, 0)));
         herbFire = register(r, new ItemHerbs("herb_fire", "herbFire", new PotionEffect(MobEffects.FIRE_RESISTANCE, 2400, 0)));
         
         
         // block special
         // block special
-        campFire = register(r, new ItemBlockSpecial("camp_fire", "camp_fire_item", "campFire", ModBlocks.campFire).setCreativeTab(CreativeTabs.DECORATIONS));
+        campFire = register(r, new ItemBlockSpecial("camp_fire", "camp_fire_item", "campFire", ModBlocks.campFireBurning).setCreativeTab(CreativeTabs.DECORATIONS));
         
         
         try
         try
         {
         {

+ 0 - 1
src/main/java/me/km/items/ModelCylinder.java

@@ -1,6 +1,5 @@
 package me.km.items.herbs;
 package me.km.items.herbs;
 
 
-import me.km.KajetansMod;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.entity.player.EntityPlayerMP;
 
 
 public class ItemAquaHerb extends ItemSpecialHerb
 public class ItemAquaHerb extends ItemSpecialHerb

+ 0 - 1
src/main/java/me/km/items/herbs/ItemGoldHerb.java

@@ -1,6 +1,5 @@
 package me.km.items.herbs;
 package me.km.items.herbs;
 
 
-import me.km.KajetansMod;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.entity.player.EntityPlayerMP;
 
 
 public class ItemGoldHerb extends ItemSpecialHerb
 public class ItemGoldHerb extends ItemSpecialHerb

+ 7 - 26
src/main/java/me/km/items/herbs/ItemHerbs.java

@@ -1,6 +1,5 @@
 package me.km.items.weapons;
 package me.km.items.weapons;
 
 
-import javax.annotation.Nullable;
 import me.km.entities.EntityItemProjectile;
 import me.km.entities.EntityItemProjectile;
 import me.km.items.ItemBase;
 import me.km.items.ItemBase;
 import me.km.items.ModItems;
 import me.km.items.ModItems;
@@ -10,7 +9,6 @@ import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.SoundEvents;
 import net.minecraft.init.SoundEvents;
 import net.minecraft.item.EnumAction;
 import net.minecraft.item.EnumAction;
-import net.minecraft.item.IItemPropertyGetter;
 import net.minecraft.item.Item;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemStack;
 import net.minecraft.stats.StatList;
 import net.minecraft.stats.StatList;
@@ -20,8 +18,6 @@ import net.minecraft.util.EnumHand;
 import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.SoundCategory;
 import net.minecraft.util.SoundCategory;
 import net.minecraft.world.World;
 import net.minecraft.world.World;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
 
 
 public class ItemSling extends ItemBase
 public class ItemSling extends ItemBase
 {
 {
@@ -31,31 +27,16 @@ public class ItemSling extends ItemBase
         super.maxStackSize = 1;
         super.maxStackSize = 1;
         super.setMaxDamage(192);
         super.setMaxDamage(192);
         super.setCreativeTab(CreativeTabs.COMBAT);
         super.setCreativeTab(CreativeTabs.COMBAT);
-        this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter()
+        this.addPropertyOverride(new ResourceLocation("pull"), (stack, w, ent) ->
         {
         {
-            @SideOnly(Side.CLIENT)
-            @Override
-            public float apply(ItemStack stack, @Nullable World w, @Nullable EntityLivingBase ent)
+            if(ent == null)
             {
             {
-                if (ent == null)
-                {
-                    return 0f;
-                }
-                else
-                {
-                    return ent.getActiveItemStack().getItem() != ModItems.sling ? 0f : (stack.getMaxItemUseDuration() - ent.getItemInUseCount()) / 20.0F;
-                }
-            }
-        });
-        this.addPropertyOverride(new ResourceLocation("pulling"), new IItemPropertyGetter()
-        {
-            @SideOnly(Side.CLIENT)
-            @Override
-            public float apply(ItemStack stack, @Nullable World w, @Nullable EntityLivingBase ent)
-            {
-                return ent != null && ent.isHandActive() && ent.getActiveItemStack() == stack ? 1f : 0f;
+                return 0.0f;
             }
             }
+            return ent.getActiveItemStack().getItem() != ModItems.sling ? 0.0f : (stack.getMaxItemUseDuration() - ent.getItemInUseCount()) / 20.0F;
         });
         });
+        this.addPropertyOverride(new ResourceLocation("pulling"), (stack, w, ent) -> 
+                ent != null && ent.isHandActive() && ent.getActiveItemStack() == stack ? 1f : 0f);
     }
     }
     
     
     private ItemStack findAmmo(EntityPlayer p)
     private ItemStack findAmmo(EntityPlayer p)
@@ -136,7 +117,7 @@ public class ItemSling extends ItemBase
         }
         }
     }
     }
 
 
-    public static float getArrowVelocity(int charge)
+    private static float getArrowVelocity(int charge)
     {
     {
         float f = charge / 20.0F;
         float f = charge / 20.0F;
         f = (f * f + f * 2.0F) / 3.0F;
         f = (f * f + f * 2.0F) / 3.0F;

+ 1 - 1
src/main/java/me/km/items/weapons/ItemStick.java

@@ -146,7 +146,7 @@ public class Module
         this.sendToConsole("All events were loaded.");
         this.sendToConsole("All events were loaded.");
     }
     }
     
     
-    public final void registerEvent(Object o)
+    public static void registerEvent(Object o)
     {
     {
         MinecraftForge.EVENT_BUS.register(o);
         MinecraftForge.EVENT_BUS.register(o);
     }
     }

+ 0 - 59
src/main/java/me/km/module/ModuleCommand.java

@@ -1,59 +0,0 @@
-package me.km.permissions;
-
-public class Permissions 
-{
-    // World
-    public final static String WORLD = "world";
-    
-    // AFK-Manager
-    public final static String AFK = "afk";
-    public final static String AFK_OTHER = "afk.other";
-
-    // Block-Protections
-    public final static String BLOCK_BYPASS = "block.bypass";
-    public final static String BLOCK = "block";
-    public final static String BLOCK_ALL = "block.all";
-    public final static String BLOCK_OTHER = "block.other";
-
-    // Chat-Manager
-    public final static String COLOR = "color";
-    public final static String USE_COLOR = "usecolor";
-    public final static String NICKNAME = "nickname";
-    public final static String FAKERANK = "fakerank";
-
-    // Data-Tools
-    public final static String DATATOOLS = "datatools"; 
-    public final static String VILLAGER = "villager"; 
-    public final static String HUMAN = "human"; 
-
-    // Effects
-    public final static String WAND = "wand"; 
-
-    // Environment
-    public final static String HEAL_STATS = "healstats"; 
-    public final static String TEMPERATURE = "temperature"; 
-    public final static String SEASON = "season"; 
-
-    // Jobs
-    public final static String JOB = "job"; 
-    public final static String RECIPE = "recipe";
-    public final static String ACTIVE_SKILLS = "activeskills"; 
-    public final static String SKILLS = "skills";
-
-    // Plots
-    public final static String PLOT = "plot"; 
-    public final static String PLOT_CREATE = "plot.create";
-    public final static String PLOT_INFO = "plot.info"; 
-    public final static String PLOT_TAG = "plot.tag"; 
-    public final static String PLOT_SHARE = "plot.share"; 
-    public final static String PLOT_BYPASS = "plot.bypass";
-    public final static String PLOT_MARK = "plot.mark"; 
-
-    // Scrolls
-    public final static String SCROLL = "scroll"; 
-
-    // Quests / Scripts
-    public final static String SCRIPT = "script"; 
-    public final static String GIVEUP = "giveup"; 
-    public final static String SCRIPT_ERROR = "script.error";
-}

+ 20 - 8
src/main/java/me/km/playerbank/PlayerBank.java

@@ -2,7 +2,6 @@ package me.km.plots;
 
 
 import me.kcm.events.FarmlandTrampleEvent;
 import me.kcm.events.FarmlandTrampleEvent;
 import me.km.KajetansMod;
 import me.km.KajetansMod;
-import me.km.permissions.Permissions;
 import net.minecraft.block.Block;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockDoor;
 import net.minecraft.block.BlockDoor;
 import net.minecraft.block.BlockButton;
 import net.minecraft.block.BlockButton;
@@ -13,6 +12,7 @@ import net.minecraft.entity.Entity;
 import net.minecraft.entity.boss.EntityDragon;
 import net.minecraft.entity.boss.EntityDragon;
 import net.minecraft.entity.boss.EntityWither;
 import net.minecraft.entity.boss.EntityWither;
 import net.minecraft.entity.item.EntityItemFrame;
 import net.minecraft.entity.item.EntityItemFrame;
+import net.minecraft.entity.passive.EntityVillager;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Blocks;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.BlockPos;
@@ -20,6 +20,7 @@ import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.world.DimensionType;
 import net.minecraft.world.DimensionType;
 import net.minecraftforge.event.entity.EntityJoinWorldEvent;
 import net.minecraftforge.event.entity.EntityJoinWorldEvent;
 import net.minecraftforge.event.entity.EntityStruckByLightningEvent;
 import net.minecraftforge.event.entity.EntityStruckByLightningEvent;
+import net.minecraftforge.event.entity.living.LivingAttackEvent;
 import net.minecraftforge.event.entity.player.AttackEntityEvent;
 import net.minecraftforge.event.entity.player.AttackEntityEvent;
 import net.minecraftforge.event.entity.player.FillBucketEvent;
 import net.minecraftforge.event.entity.player.FillBucketEvent;
 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
@@ -29,11 +30,13 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 
 public class Protection
 public class Protection
 {
 {
+    private final static String PLOT_BYPASS = "plot.bypass";
+    
     @SubscribeEvent(priority = EventPriority.HIGHEST)
     @SubscribeEvent(priority = EventPriority.HIGHEST)
     public void onBlockPlace(BlockEvent.PlaceEvent e)
     public void onBlockPlace(BlockEvent.PlaceEvent e)
     {
     {
         EntityPlayer p = e.getPlayer();
         EntityPlayer p = e.getPlayer();
-        if(!KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS) && !KajetansMod.plots.canBuild(e.getWorld(), e.getPos(), p))
+        if(!KajetansMod.perms.hasPermission(p, PLOT_BYPASS) && !KajetansMod.plots.canBuild(e.getWorld(), e.getPos(), p))
         {
         {
             e.setCanceled(true);
             e.setCanceled(true);
         }        
         }        
@@ -43,7 +46,7 @@ public class Protection
     public void onBlockBreak(BlockEvent.BreakEvent e)
     public void onBlockBreak(BlockEvent.BreakEvent e)
     {
     {
         EntityPlayer p = e.getPlayer();
         EntityPlayer p = e.getPlayer();
-        if(!KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS) && !KajetansMod.plots.canBuild(e.getWorld(), e.getPos(), p))
+        if(!KajetansMod.perms.hasPermission(p, PLOT_BYPASS) && !KajetansMod.plots.canBuild(e.getWorld(), e.getPos(), p))
         {
         {
             e.setCanceled(true);
             e.setCanceled(true);
         }  
         }  
@@ -68,7 +71,7 @@ public class Protection
     {
     {
         EntityPlayer p = e.getEntityPlayer(); 
         EntityPlayer p = e.getEntityPlayer(); 
         RayTraceResult ray = e.getTarget();
         RayTraceResult ray = e.getTarget();
-        if(ray == null || KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS))
+        if(ray == null || KajetansMod.perms.hasPermission(p, PLOT_BYPASS))
         {
         {
             return;
             return;
         }
         }
@@ -137,7 +140,7 @@ public class Protection
         if(e.getTarget() instanceof EntityItemFrame)
         if(e.getTarget() instanceof EntityItemFrame)
         {
         {
             EntityPlayer p = e.getEntityPlayer();
             EntityPlayer p = e.getEntityPlayer();
-            if(!KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS) && 
+            if(!KajetansMod.perms.hasPermission(p, PLOT_BYPASS) && 
             !KajetansMod.plots.canBuild(p.world, e.getTarget().getPosition(), p))
             !KajetansMod.plots.canBuild(p.world, e.getTarget().getPosition(), p))
             {
             {
                 e.setCanceled(true);
                 e.setCanceled(true);
@@ -155,7 +158,7 @@ public class Protection
     public void onPlayerInteract(PlayerInteractEvent.LeftClickBlock e) 
     public void onPlayerInteract(PlayerInteractEvent.LeftClickBlock e) 
     {
     {
         EntityPlayer p = e.getEntityPlayer();
         EntityPlayer p = e.getEntityPlayer();
-        if(KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS))
+        if(KajetansMod.perms.hasPermission(p, PLOT_BYPASS))
         {
         {
             return;
             return;
         }  
         }  
@@ -170,7 +173,7 @@ public class Protection
     public void onPlayerInteract(PlayerInteractEvent.RightClickBlock e) 
     public void onPlayerInteract(PlayerInteractEvent.RightClickBlock e) 
     {
     {
         EntityPlayer p = e.getEntityPlayer();
         EntityPlayer p = e.getEntityPlayer();
-        if(KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS))
+        if(KajetansMod.perms.hasPermission(p, PLOT_BYPASS))
         {
         {
             return;
             return;
         }    
         }    
@@ -190,7 +193,7 @@ public class Protection
     public void protectFromInteract(PlayerInteractEvent.EntityInteract e)
     public void protectFromInteract(PlayerInteractEvent.EntityInteract e)
     {      
     {      
         EntityPlayer p = e.getEntityPlayer();
         EntityPlayer p = e.getEntityPlayer();
-        if(!KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS) && 
+        if(!KajetansMod.perms.hasPermission(p, PLOT_BYPASS) && 
             !KajetansMod.plots.canBuild(e.getWorld(), e.getTarget().getPosition(), p))
             !KajetansMod.plots.canBuild(e.getWorld(), e.getTarget().getPosition(), p))
         {
         {
             e.setCanceled(true);
             e.setCanceled(true);
@@ -202,4 +205,13 @@ public class Protection
     {      
     {      
         e.setCanceled(true);
         e.setCanceled(true);
     }
     }
+    
+    @SubscribeEvent
+    public void onAttackVillager(LivingAttackEvent e)
+    { 
+        if(e.getEntityLiving() instanceof EntityVillager && !e.getSource().isCreativePlayer())
+        {
+            e.setCanceled(true);
+        }
+    }
 }
 }

+ 26 - 26
src/main/java/me/km/plots/ProtectionBank.java

@@ -148,8 +148,20 @@ public class ModRecipes
                 new char[] {'X'}, new ItemStack[][] {{new ItemStack(ModBlocks.realHayBlock)}});
                 new char[] {'X'}, new ItemStack[][] {{new ItemStack(ModBlocks.realHayBlock)}});
         registerShaped(r, "", new String[] {" X ", "XXX"}, new ItemStack(ModItems.strawHat), 
         registerShaped(r, "", new String[] {" X ", "XXX"}, new ItemStack(ModItems.strawHat), 
                 new char[] {'X'}, new ItemStack[][] {{new ItemStack(Items.WHEAT)}});
                 new char[] {'X'}, new ItemStack[][] {{new ItemStack(Items.WHEAT)}});
-        registerShaped(r, "", new String[] {"XXX", "XXX"}, new ItemStack(ModItems.campFire), 
-                new char[] {'X'}, new ItemStack[][] {{new ItemStack(Items.STICK)}});
+        registerShaped(r, "", new String[] {" S ", "SCS", "WWW"}, new ItemStack(ModItems.campFire), 
+                new char[] {'S', 'C', 'W'}, new ItemStack[][] 
+                {
+                    {
+                        new ItemStack(Items.STICK)
+                    },
+                    {
+                        new ItemStack(Items.COAL), new ItemStack(Items.COAL, 1, 1)
+                    },
+                    {
+                        new ItemStack(Blocks.LOG), new ItemStack(Blocks.LOG, 1, 1), new ItemStack(Blocks.LOG, 1, 2),
+                        new ItemStack(Blocks.LOG, 1, 3), new ItemStack(Blocks.LOG2, 1, 0), new ItemStack(Blocks.LOG2, 1, 1)
+                    }
+                });
         registerShaped(r, "", new String[] {"XXX", "GCG", "XXX"}, new ItemStack(ModBlocks.lantern), 
         registerShaped(r, "", new String[] {"XXX", "GCG", "XXX"}, new ItemStack(ModBlocks.lantern), 
                 new char[] {'X', 'G', 'C'}, new ItemStack[][] 
                 new char[] {'X', 'G', 'C'}, new ItemStack[][] 
                 {
                 {
@@ -252,6 +264,9 @@ public class ModRecipes
         addToolNuggetRecipes(fr, toolItems, ModItems.copperNugget, ModItems.bronzeNugget, Items.IRON_NUGGET, Items.GOLD_NUGGET);
         addToolNuggetRecipes(fr, toolItems, ModItems.copperNugget, ModItems.bronzeNugget, Items.IRON_NUGGET, Items.GOLD_NUGGET);
         
         
         addWoodRecipes(r);
         addWoodRecipes(r);
+        
+        String[] pattern = new String[] {"X X", "X X", "XXX"};
+        registerShaped(r, "", pattern, new ItemStack(ModBlocks.cookingPotCopper), new char[] {'X'}, new ItemStack[][] {{new ItemStack(ModItems.copperIngot)}});
     }
     }
 
 
     // -----------------------------------------------------------------------------------
     // -----------------------------------------------------------------------------------
@@ -413,41 +428,26 @@ public class ModRecipes
             new ItemStack(Blocks.PLANKS, 1, 2), new ItemStack(Blocks.PLANKS, 1, 3), 
             new ItemStack(Blocks.PLANKS, 1, 2), new ItemStack(Blocks.PLANKS, 1, 3), 
             new ItemStack(Blocks.PLANKS, 1, 4), new ItemStack(Blocks.PLANKS, 1, 5) 
             new ItemStack(Blocks.PLANKS, 1, 4), new ItemStack(Blocks.PLANKS, 1, 5) 
         };
         };
-        String[] pattern = new String[] {"X X", "X X", "XXX"};
-        ItemStack[] result = new ItemStack[] 
-        {
-            new ItemStack(ModBlocks.cauldronOak), new ItemStack(ModBlocks.cauldronSpruce), 
-            new ItemStack(ModBlocks.cauldronBirch), new ItemStack(ModBlocks.cauldronJungle), 
-            new ItemStack(ModBlocks.cauldronAcacia), new ItemStack(ModBlocks.cauldronBigOak) 
-        };
         
         
-        for(int i = 0; i < planks.length; i++)
-        {
-            registerShaped(r, "", pattern, result[i], new char[] {'X'}, new ItemStack[][] {{planks[i]}});
-        }
-        
-        result = new ItemStack[] 
+        ItemStack[] result = new ItemStack[] 
         {
         {
             new ItemStack(ModBlocks.crateOak), new ItemStack(ModBlocks.crateSpruce), 
             new ItemStack(ModBlocks.crateOak), new ItemStack(ModBlocks.crateSpruce), 
             new ItemStack(ModBlocks.crateBirch), new ItemStack(ModBlocks.crateJungle), 
             new ItemStack(ModBlocks.crateBirch), new ItemStack(ModBlocks.crateJungle), 
             new ItemStack(ModBlocks.crateAcacia), new ItemStack(ModBlocks.crateBigOak) 
             new ItemStack(ModBlocks.crateAcacia), new ItemStack(ModBlocks.crateBigOak) 
         };
         };
-        pattern = new String[] {"XXX", "XXX", "XXX"};
+        String[] pattern = new String[] {"XXX", "XXX", "XXX"};
         for(int i = 0; i < planks.length; i++)
         for(int i = 0; i < planks.length; i++)
         {
         {
             registerShaped(r, "", pattern, result[i], new char[] {'X'}, new ItemStack[][] {{planks[i]}});
             registerShaped(r, "", pattern, result[i], new char[] {'X'}, new ItemStack[][] {{planks[i]}});
         }
         }
         
         
-        result = new ItemStack[] 
+        ItemStack[] slabs = new ItemStack[] 
         {
         {
-            new ItemStack(ModBlocks.barrelOak), new ItemStack(ModBlocks.barrelSpruce), 
-            new ItemStack(ModBlocks.barrelBirch), new ItemStack(ModBlocks.barrelJungle), 
-            new ItemStack(ModBlocks.barrelAcacia), new ItemStack(ModBlocks.barrelBigOak) 
-        };
-        pattern = new String[] {"X X", "XXX", "X X"};
-        for(int i = 0; i < planks.length; i++)
-        {
-            registerShaped(r, "", pattern, result[i], new char[] {'X'}, new ItemStack[][] {{planks[i]}});
-        }
+            new ItemStack(Blocks.WOODEN_SLAB, 1, 0), new ItemStack(Blocks.WOODEN_SLAB, 1, 1), 
+            new ItemStack(Blocks.WOODEN_SLAB, 1, 2), new ItemStack(Blocks.WOODEN_SLAB, 1, 3), 
+            new ItemStack(Blocks.WOODEN_SLAB, 1, 4), new ItemStack(Blocks.WOODEN_SLAB, 1, 5) 
+        };   
+        pattern = new String[] {"XSX", "X X", "XSX"};
+        registerShaped(r, "", pattern, new ItemStack(ModBlocks.barrel), new char[] {'X', 'S'}, new ItemStack[][] {planks, slabs});
     }
     }
 }
 }

+ 30 - 1
src/main/java/me/km/scheduler/AsyncWorker.java

@@ -18,6 +18,7 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
     private final LinkedList<Integer> removeQueue;
     private final LinkedList<Integer> removeQueue;
     private final HashMap<Integer, SnuviTask> tasks;
     private final HashMap<Integer, SnuviTask> tasks;
     private final AsyncWorker worker = new AsyncWorker();
     private final AsyncWorker worker = new AsyncWorker();
+    private boolean noAdding = false;
     
     
     public SnuviScheduler(String prefix, TextFormatting color)
     public SnuviScheduler(String prefix, TextFormatting color)
     {
     {
@@ -29,6 +30,29 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
         worker.start();
         worker.start();
     }
     }
     
     
+    public void stop()
+    {
+        noAdding = true;
+        long endTime = System.nanoTime() + 60_000_000_000l;
+        System.out.println("Waiting until end of synchronized tasks ...");
+        while(!tasks.isEmpty() && System.nanoTime() < endTime)
+        {
+            tick();
+        }
+        System.out.println("Waiting until end of asynchronous tasks ...");
+        while(worker.hasWork() && System.nanoTime() < endTime)
+        {
+            try
+            {
+                Thread.sleep(250);
+            }
+            catch(InterruptedException ex)
+            {
+            }
+        }
+        System.out.println("the scheduler is now stopped");
+    }
+    
     public void cancelTask(int id)
     public void cancelTask(int id)
     {
     {
         removeQueue.add(id);
         removeQueue.add(id);
@@ -36,6 +60,11 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
     
     
     public int scheduleRepeatingTask(Runnable r, long ticks, long rtimer)
     public int scheduleRepeatingTask(Runnable r, long ticks, long rtimer)
     {
     {
+        if(noAdding)
+        {
+            System.out.println("scheduling tasks is not allowed on server stop");
+            return -1;
+        }
         synchronized(addQueue)
         synchronized(addQueue)
         {
         {
             counter++;
             counter++;
@@ -90,7 +119,7 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
                 }
                 }
                 try
                 try
                 {
                 {
-                    return task.tick();
+                    return task.tick(noAdding);
                 }
                 }
                 catch(Exception ex)
                 catch(Exception ex)
                 {
                 {

+ 2 - 2
src/main/java/me/km/scheduler/SnuviTask.java

@@ -32,7 +32,7 @@ public class SnuviTask
         return rtimer > 0;
         return rtimer > 0;
     }
     }
     
     
-    public boolean tick() 
+    public boolean tick(boolean noRepeat) 
     {
     {
         timer -= 1;
         timer -= 1;
         if(timer <= 0)
         if(timer <= 0)
@@ -45,7 +45,7 @@ public class SnuviTask
             {
             {
                 KajetansMod.scripts.getSnuviParser().getLogger().print(ex.getLocalizedMessage(), ex, null, null, null, -1);
                 KajetansMod.scripts.getSnuviParser().getLogger().print(ex.getLocalizedMessage(), ex, null, null, null, -1);
             }
             }
-            if(rtimer <= 0)
+            if(rtimer <= 0 || noRepeat)
             {
             {
                 return true;
                 return true;
             }
             }

+ 13 - 12
src/main/java/me/km/scheduler/TaskTicker.java

@@ -18,11 +18,11 @@ public class PlayerScoreboard
     private final HashMap<Integer, String> elements;
     private final HashMap<Integer, String> elements;
     private final HashSet<Integer> toRemove;
     private final HashSet<Integer> toRemove;
     private final HashMap<Integer, String> toAdd;
     private final HashMap<Integer, String> toAdd;
-    
+
     private final Scoreboard board;
     private final Scoreboard board;
     private final ScoreObjective o;
     private final ScoreObjective o;
     private boolean changeNeeded;
     private boolean changeNeeded;
-    
+
     private final UUID uuid;
     private final UUID uuid;
 
 
     public PlayerScoreboard(EntityPlayerMP p)
     public PlayerScoreboard(EntityPlayerMP p)
@@ -37,7 +37,7 @@ public class PlayerScoreboard
         this.uuid = p.getUniqueID();
         this.uuid = p.getUniqueID();
         p.connection.sendPacket(new SPacketScoreboardObjective(o, 0));
         p.connection.sendPacket(new SPacketScoreboardObjective(o, 0));
     }
     }
-    
+
     public void addText(int id, String text)
     public void addText(int id, String text)
     { 
     { 
         String s = elements.get(id);
         String s = elements.get(id);
@@ -53,7 +53,7 @@ public class PlayerScoreboard
             changeNeeded = true;
             changeNeeded = true;
         }
         }
     }
     }
-    
+
     public void removeText(int id)
     public void removeText(int id)
     { 
     { 
         if(elements.containsKey(id))
         if(elements.containsKey(id))
@@ -62,27 +62,27 @@ public class PlayerScoreboard
             changeNeeded = true;
             changeNeeded = true;
         }
         }
     }
     }
-    
+
     public void clear()
     public void clear()
     {
     {
         elements.keySet().forEach(i -> toRemove.add(i));
         elements.keySet().forEach(i -> toRemove.add(i));
         update();
         update();
     }
     }
 
 
-    public void update()
+    public boolean update()
     {         
     {         
         if(!changeNeeded)
         if(!changeNeeded)
         {
         {
-            return;
+            return false;
         }
         }
-        
+
         EntityPlayerMP p = KajetansMod.server.getPlayerList().getPlayerByUUID(uuid);
         EntityPlayerMP p = KajetansMod.server.getPlayerList().getPlayerByUUID(uuid);
-        
+
         if(p == null)
         if(p == null)
         {
         {
-            return;
+            return true;
         }
         }
-        
+
         if(!toRemove.isEmpty())
         if(!toRemove.isEmpty())
         {
         {
             toRemove.forEach(i -> 
             toRemove.forEach(i -> 
@@ -95,7 +95,7 @@ public class PlayerScoreboard
             });
             });
             toRemove.clear();
             toRemove.clear();
         }
         }
-        
+
         if(!toAdd.isEmpty())
         if(!toAdd.isEmpty())
         {
         {
             toAdd.entrySet().stream().forEach((e) -> 
             toAdd.entrySet().stream().forEach((e) -> 
@@ -111,5 +111,6 @@ public class PlayerScoreboard
         changeNeeded = false;
         changeNeeded = false;
         // displaying objective in sidebar
         // displaying objective in sidebar
         p.connection.sendPacket(new SPacketDisplayObjective(1, o));
         p.connection.sendPacket(new SPacketDisplayObjective(1, o));
+        return false;
     }
     }
 }
 }

+ 5 - 0
src/main/java/me/km/scoreboard/ScoreboardUtils.java

@@ -13,6 +13,11 @@ public class ScoreboardUtils
         BOARDS.remove(uuid);
         BOARDS.remove(uuid);
     }
     }
     
     
+    public static void update()
+    {
+        BOARDS.values().removeIf(ps -> ps.update());
+    }
+    
     public static PlayerScoreboard get(EntityPlayerMP p)
     public static PlayerScoreboard get(EntityPlayerMP p)
     {
     {
         PlayerScoreboard data = BOARDS.get(p.getUniqueID());
         PlayerScoreboard data = BOARDS.get(p.getUniqueID());

+ 1 - 2
src/main/java/me/km/snuviscript/CommandGiveUp.java

@@ -4,7 +4,6 @@ import me.hammerle.snuviscript.code.Script;
 import me.km.KajetansMod;
 import me.km.KajetansMod;
 import me.km.module.Module;
 import me.km.module.Module;
 import me.km.module.ModuleCommand;
 import me.km.module.ModuleCommand;
-import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayer;
 
 
@@ -15,7 +14,7 @@ public class CommandGiveUp extends ModuleCommand
         super("giveup", m);
         super("giveup", m);
         super.setDescription("Gibt deine Quest auf");
         super.setDescription("Gibt deine Quest auf");
         super.setUsage("/giveup");
         super.setUsage("/giveup");
-        super.setPermission(Permissions.GIVEUP);
+        super.setPermission("giveup");
         super.addAlias("fuckit");
         super.addAlias("fuckit");
         super.addAlias("fuckitigiveup");
         super.addAlias("fuckitigiveup");
         super.addAlias("ineedhelp");
         super.addAlias("ineedhelp");

+ 1 - 2
src/main/java/me/km/snuviscript/CommandScript.java

@@ -9,7 +9,6 @@ import me.hammerle.snuviscript.code.Script;
 import me.hammerle.snuviscript.variable.Variable;
 import me.hammerle.snuviscript.variable.Variable;
 import me.km.utils.Utils;
 import me.km.utils.Utils;
 import me.km.exception.PlayerNotFoundException;
 import me.km.exception.PlayerNotFoundException;
-import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.entity.player.EntityPlayerMP;
@@ -21,7 +20,7 @@ public class CommandScript extends ModuleCommand
         super("script", m);
         super("script", m);
         super.setDescription("Zeigt alles über Scripts");
         super.setDescription("Zeigt alles über Scripts");
         super.setUsage("/script für die Hilfe");
         super.setUsage("/script für die Hilfe");
-        super.setPermission(Permissions.SCRIPT);
+        super.setPermission("script");
         super.addAlias("s");
         super.addAlias("s");
     }
     }
 
 

+ 352 - 29
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -6,13 +6,13 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.SQLException;
 import me.km.KajetansMod;
 import me.km.KajetansMod;
-import me.km.utils.NBTUtils;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.GregorianCalendar;
 import java.util.List;
 import java.util.List;
 import java.util.UUID;
 import java.util.UUID;
 import java.util.function.Consumer;
 import java.util.function.Consumer;
+import me.hammerle.snuviscript.code.InputProvider;
 import me.hammerle.snuviscript.code.Script;
 import me.hammerle.snuviscript.code.Script;
 import me.hammerle.snuviscript.code.SnuviUtils;
 import me.hammerle.snuviscript.code.SnuviUtils;
 import me.hammerle.snuviscript.code.SnuviParser;
 import me.hammerle.snuviscript.code.SnuviParser;
@@ -22,6 +22,7 @@ import me.km.utils.Utils;
 import me.km.chatchannel.ChatChannel;
 import me.km.chatchannel.ChatChannel;
 import me.km.world.ModDimensions;
 import me.km.world.ModDimensions;
 import me.km.effects.EffectUtils;
 import me.km.effects.EffectUtils;
+import me.km.entities.EntityHuman;
 import me.km.inventory.InventoryUtils;
 import me.km.inventory.InventoryUtils;
 import me.km.utils.ItemStackUtils;
 import me.km.utils.ItemStackUtils;
 import me.km.utils.ReflectionUtils;
 import me.km.utils.ReflectionUtils;
@@ -73,11 +74,15 @@ import me.km.items.weapons.*;
 import me.km.networking.ModPacketHandler;
 import me.km.networking.ModPacketHandler;
 import me.km.scoreboard.ScoreboardUtils;
 import me.km.scoreboard.ScoreboardUtils;
 import net.minecraft.block.BlockCrops;
 import net.minecraft.block.BlockCrops;
+import net.minecraft.entity.EntityAgeable;
 import net.minecraft.entity.EntityList;
 import net.minecraft.entity.EntityList;
+import net.minecraft.entity.SharedMonsterAttributes;
 import net.minecraft.entity.effect.EntityLightningBolt;
 import net.minecraft.entity.effect.EntityLightningBolt;
 import net.minecraft.entity.item.EntityItem;
 import net.minecraft.entity.item.EntityItem;
+import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.init.Items;
 import net.minecraft.item.Item;
 import net.minecraft.item.Item;
+import net.minecraft.item.ItemArmor;
 import net.minecraft.item.ItemAxe;
 import net.minecraft.item.ItemAxe;
 import net.minecraft.nbt.JsonToNBT;
 import net.minecraft.nbt.JsonToNBT;
 import net.minecraft.nbt.NBTException;
 import net.minecraft.nbt.NBTException;
@@ -91,7 +96,12 @@ import net.minecraft.tileentity.TileEntitySkull;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.ITextComponent;
+import net.minecraft.util.text.Style;
 import net.minecraft.util.text.TextComponentString;
 import net.minecraft.util.text.TextComponentString;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.util.text.event.ClickEvent;
+import net.minecraft.util.text.event.HoverEvent;
+import net.minecraft.village.MerchantRecipe;
 import net.minecraft.world.EnumDifficulty;
 import net.minecraft.world.EnumDifficulty;
 import net.minecraft.world.GameType;
 import net.minecraft.world.GameType;
 import net.minecraft.world.chunk.storage.AnvilChunkLoader;
 import net.minecraft.world.chunk.storage.AnvilChunkLoader;
@@ -173,15 +183,6 @@ public class MinecraftFunctions
             TitleUtils.setSubTitle((EntityPlayerMP) in[0].get(sc), SnuviUtils.connect(sc, in, 1)); 
             TitleUtils.setSubTitle((EntityPlayerMP) in[0].get(sc), SnuviUtils.connect(sc, in, 1)); 
             return Void.TYPE; 
             return Void.TYPE; 
         });
         });
-        
-        // ---------------------------------------------------------------------
-        // Villager-library  
-        // ---------------------------------------------------------------------
-        parser.registerFunction("villager.showtrades", (sc, in) -> 
-        { 
-            ((EntityPlayer) in[0].get(sc)).displayVillagerTradeGui(((EntityVillager) in[1].get(sc))); 
-            return Void.TYPE; 
-        });
        
        
         // ---------------------------------------------------------------------    
         // ---------------------------------------------------------------------    
         // Player-library
         // Player-library
@@ -245,7 +246,7 @@ public class MinecraftFunctions
         });
         });
         parser.registerFunction("player.speak", (sc, in) -> 
         parser.registerFunction("player.speak", (sc, in) -> 
         { 
         { 
-            sendMessageToGroup(in[0].get(sc), sc, NBTUtils.concat(sc, 2, "§7[§r" + in[1].getString(sc) + "§7]§r ", in)); 
+            sendMessageToGroup(in[0].get(sc), sc, concat(sc, 2, "§7[§r" + in[1].getString(sc) + "§7]§r ", in)); 
             return Void.TYPE; 
             return Void.TYPE; 
         });
         });
         parser.registerFunction("player.setcompass", (sc, in) -> 
         parser.registerFunction("player.setcompass", (sc, in) -> 
@@ -746,6 +747,40 @@ public class MinecraftFunctions
             PotionUtils.appendEffects(stack, list);
             PotionUtils.appendEffects(stack, list);
             return Void.TYPE;
             return Void.TYPE;
         });
         });
+        parser.registerFunction("item.addflag", (sc, in) -> 
+        { 
+            ItemStackUtils.addItemFlag((ItemStack) in[0].get(sc), ItemStackUtils.ItemFlag.valueOf(in[0].getString(sc).toUpperCase()));
+            return Void.TYPE;
+        });
+        parser.registerFunction("item.addattribute", (sc, in) -> 
+        { 
+            ItemStackUtils.addAttribute((ItemStack) in[0].get(sc), 
+                    ItemStackUtils.Attribute.valueOf(in[1].getString(sc).toUpperCase()), 
+                    EntityEquipmentSlot.valueOf(in[2].getString(sc).toUpperCase()), 
+                    in[3].getDouble(sc), 
+                    ItemStackUtils.Operation.valueOf(in[4].getString(sc).toUpperCase()));
+            return Void.TYPE;
+        });
+        parser.registerFunction("item.setmagic", (sc, in) -> 
+        { 
+            ItemStack stack = (ItemStack) in[0].get(sc);                  
+            int value = in[1].getInt(sc);  
+            if(stack.getItem() instanceof ItemArmor)
+            {
+                NBTTagCompound com = stack.getTagCompound();
+                if(com == null)
+                {
+                    com = new NBTTagCompound();
+                    stack.setTagCompound(com);
+                }
+                com.setInteger("magic", value);
+            }
+            else
+            {
+                throw new IllegalArgumentException("magic resistance is only for armor");
+            }
+            return Void.TYPE;
+        });
 
 
         // ---------------------------------------------------------------------    
         // ---------------------------------------------------------------------    
         // Location-library
         // Location-library
@@ -866,7 +901,42 @@ public class MinecraftFunctions
         { 
         { 
             Location l0 = (Location) in[0].get(sc);
             Location l0 = (Location) in[0].get(sc);
             Location l1 = (Location) in[1].get(sc);
             Location l1 = (Location) in[1].get(sc);
-            NBTUtils.cloneBlock(l0.getWorld(), l0.getBlockPos(), l1.getWorld(), l1.getBlockPos());
+            
+            World w = l0.getWorld(); 
+            BlockPos oldPos = l0.getBlockPos();
+            World newW = l1.getWorld(); 
+            BlockPos newPos = l1.getBlockPos();
+            
+            if(oldPos.equals(newPos))
+            {
+                return Void.TYPE; 
+            }
+            
+            IBlockState state = w.getBlockState(oldPos);
+            NBTTagCompound nbt = null;
+
+            if(state.getBlock() != Blocks.AIR)
+            {
+                TileEntity te = w.getTileEntity(oldPos);
+                if (te != null)
+                {
+                    nbt = te.writeToNBT(new NBTTagCompound());
+                }
+            }
+
+            newW.setBlockState(newPos, state);
+            if(nbt != null)
+            {
+                TileEntity te = newW.getTileEntity(newPos);
+                if(te != null)
+                {
+                    nbt.setInteger("x", newPos.getX());
+                    nbt.setInteger("y", newPos.getY());
+                    nbt.setInteger("z", newPos.getZ());
+                    te.readFromNBT(nbt);
+                    te.markDirty();
+                }
+            }
             return Void.TYPE; 
             return Void.TYPE; 
         });
         });
         parser.registerFunction("block.set", (sc, in) -> 
         parser.registerFunction("block.set", (sc, in) -> 
@@ -879,13 +949,54 @@ public class MinecraftFunctions
         parser.registerFunction("block.set2", (sc, in) -> 
         parser.registerFunction("block.set2", (sc, in) -> 
         { 
         { 
             Location l = (Location) in[0].get(sc);
             Location l = (Location) in[0].get(sc);
-            if(in.length >= 4)
+
+            World w = l.getWorld();
+            BlockPos pos = l.getBlockPos();
+            int dv = in[2].getInt(sc);
+            Block block = Block.getBlockFromName(in[1].getString(sc));
+            String data = in.length >= 4 ? SnuviUtils.connect(sc, in, 3) : null;
+            
+            NBTTagCompound nbttagcompound = new NBTTagCompound();
+            boolean flag = false;
+
+            if(data != null && block.hasTileEntity()) 
             {
             {
-                NBTUtils.setBlockWithData(l.getWorld(), l.getBlockPos(), in[2].getInt(sc), Block.getBlockFromName(in[1].getString(sc)), SnuviUtils.connect(sc, in, 3));
+                try 
+                {
+                    nbttagcompound = JsonToNBT.getTagFromJson(data);
+                    flag = true;
+                } 
+                catch(NBTException ex) 
+                {
+                    throw new IllegalStringException(data);
+                }
             }
             }
-            else
+
+            TileEntity tileentity = w.getTileEntity(pos);
+            if (tileentity != null) 
+            {
+                if (tileentity instanceof IInventory) 
+                {
+                    ((IInventory) tileentity).clear();
+                }
+                w.setBlockState(pos, Blocks.AIR.getDefaultState(), block == Blocks.AIR ? 2 : 4);
+            }
+
+            IBlockState iblockdata = block.getStateFromMeta(dv);
+            if(w.setBlockState(pos, iblockdata, 2)) 
             {
             {
-                NBTUtils.setBlockWithData(l.getWorld(), l.getBlockPos(), in[2].getInt(sc), Block.getBlockFromName(in[1].getString(sc)), null);
+                if(flag) 
+                {
+                    TileEntity tileentity1 = w.getTileEntity(pos);
+                    if (tileentity1 != null) 
+                    {
+                        nbttagcompound.setInteger("x", pos.getX());
+                        nbttagcompound.setInteger("y", pos.getY());
+                        nbttagcompound.setInteger("z", pos.getZ());
+                        tileentity1.readFromNBT(nbttagcompound);
+                    }
+                }
+                w.notifyNeighborsRespectDebug(pos, iblockdata.getBlock(), false);
             }
             }
             return Void.TYPE; 
             return Void.TYPE; 
         });
         });
@@ -1054,7 +1165,7 @@ public class MinecraftFunctions
         });
         });
 
 
         // ---------------------------------------------------------------------    
         // ---------------------------------------------------------------------    
-        // Entity - Befehle
+        // entity commands
         // ---------------------------------------------------------------------  
         // ---------------------------------------------------------------------  
         parser.registerFunction("entity.getlocation", (sc, in) -> new Location((Entity) in[0].get(sc)));   
         parser.registerFunction("entity.getlocation", (sc, in) -> new Location((Entity) in[0].get(sc)));   
         parser.registerFunction("entity.damage", (sc, in) -> 
         parser.registerFunction("entity.damage", (sc, in) -> 
@@ -1156,7 +1267,7 @@ public class MinecraftFunctions
                 ent.setAlwaysRenderNameTag(in[2].getBoolean(sc));   
                 ent.setAlwaysRenderNameTag(in[2].getBoolean(sc));   
                 return Void.TYPE; 
                 return Void.TYPE; 
             }
             }
-            ent.setAlwaysRenderNameTag(true);  
+            ent.setAlwaysRenderNameTag(false);  
             return Void.TYPE; 
             return Void.TYPE; 
         }); 
         }); 
         parser.registerFunction("entity.getname", (sc, in) -> ((Entity) in[0].get(sc)).getDisplayName().getUnformattedText()); 
         parser.registerFunction("entity.getname", (sc, in) -> ((Entity) in[0].get(sc)).getDisplayName().getUnformattedText()); 
@@ -1245,14 +1356,9 @@ public class MinecraftFunctions
             ((Entity) in[0].get(sc)).setSilent(in[1].getBoolean(sc)); 
             ((Entity) in[0].get(sc)).setSilent(in[1].getBoolean(sc)); 
             return Void.TYPE; 
             return Void.TYPE; 
         });
         });
-        parser.registerFunction("entity.hide", (sc, in) -> 
-        { 
-            ((Entity) in[0].get(sc)).setInvisible(true); 
-            return Void.TYPE; 
-        });
-        parser.registerFunction("entity.show", (sc, in) -> 
+        parser.registerFunction("entity.setinvisible", (sc, in) -> 
         { 
         { 
-            ((Entity) in[0].get(sc)).setInvisible(false);
+            ((Entity) in[0].get(sc)).setInvisible(in[1].getBoolean(sc)); 
             return Void.TYPE; 
             return Void.TYPE; 
         });
         });
         parser.registerFunction("entity.ride", (sc, in) -> 
         parser.registerFunction("entity.ride", (sc, in) -> 
@@ -1376,6 +1482,110 @@ public class MinecraftFunctions
             in[0].set(sc, Utils.getLiving(ent, in[2].getDouble(sc))); 
             in[0].set(sc, Utils.getLiving(ent, in[2].getDouble(sc))); 
             return Void.TYPE;
             return Void.TYPE;
         });
         });
+        parser.registerFunction("entity.setspeed", (sc, in) -> 
+        {  
+            ((EntityLivingBase) in[0].get(sc)).getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(in[1].getDouble(sc));
+            return Void.TYPE;
+        });
+        parser.registerFunction("entity.setgrowingage", (sc, in) -> 
+        {  
+            ((EntityAgeable) in[0].get(sc)).setGrowingAge(in[1].getInt(sc));
+            return Void.TYPE;
+        });
+        
+        // ---------------------------------------------------------------------    
+        // human commands
+        // ---------------------------------------------------------------------  
+        parser.registerFunction("human.spawn", (sc, in) -> 
+        {  
+            Location l = (Location) in[0].get(sc);
+            World w = l.getWorld();
+            EntityHuman h = new EntityHuman(w);
+            h.setPosition(l.getX(), l.getY(), l.getZ());       
+            w.spawnEntity(h);
+            return h;
+        });
+        parser.registerFunction("human.setskin", (sc, in) -> 
+        {  
+            ((EntityHuman) in[0].get(sc)).setSkinName(in[1].getString(sc));   
+            return Void.TYPE; 
+        });
+        parser.registerFunction("human.setscale", (sc, in) -> 
+        {  
+            ((EntityHuman) in[0].get(sc)).setScale(in[1].getFloat(sc));   
+            return Void.TYPE; 
+        });
+        parser.registerFunction("human.setslim", (sc, in) -> 
+        {  
+            ((EntityHuman) in[0].get(sc)).setSlim(in[1].getBoolean(sc));   
+            return Void.TYPE; 
+        });
+        
+        // ---------------------------------------------------------------------
+        // villager commands
+        // ---------------------------------------------------------------------
+        parser.registerFunction("villager.showtrades", (sc, in) -> 
+        { 
+            ((EntityPlayer) in[0].get(sc)).displayVillagerTradeGui(((EntityVillager) in[1].get(sc))); 
+            return Void.TYPE; 
+        });
+        parser.registerFunction("villager.cleartrades", (sc, in) -> 
+        { 
+            ((EntityVillager) in[0].get(sc)).getRecipes(null).clear();
+            return Void.TYPE; 
+        });
+        parser.registerFunction("villager.addtrade", (sc, in) -> 
+        { 
+            EntityVillager v = (EntityVillager) in[0].get(sc);
+            ReflectionUtils.setCareerLevel(v, 10);
+            ItemStack buy1 = (ItemStack) in[1].get(sc);
+            if(buy1 == null)
+            {
+                buy1 = ItemStack.EMPTY;
+            }
+            ItemStack buy2 = (ItemStack) in[2].get(sc);
+            if(buy2 == null)
+            {
+                buy2 = ItemStack.EMPTY;
+            }
+            ItemStack sell = (ItemStack) in[3].get(sc);
+            if(buy2 == null)
+            {
+                buy2 = ItemStack.EMPTY;
+            }
+            MerchantRecipe mr = new MerchantRecipe(buy1, buy2, sell, 0, Integer.MAX_VALUE);
+            if(in.length > 4)
+            {
+                v.getRecipes(null).set(in[4].getInt(sc), mr);
+            }
+            else
+            {
+                v.getRecipes(null).add(mr);
+            }
+            return Void.TYPE; 
+        });
+        parser.registerFunction("villager.removetrade", (sc, in) -> 
+        { 
+            EntityVillager v = (EntityVillager) in[0].get(sc);
+            v.getRecipes(null).remove(in[1].get(sc));
+            return Void.TYPE; 
+        });
+        parser.registerFunction("villager.tradeamount", (sc, in) -> ((EntityVillager) in[0].get(sc)).getRecipes(null).size());
+        parser.registerFunction("villager.getslot", (sc, in) -> ((EntityVillager) in[0].get(sc)).getVillagerInventory().getStackInSlot(in[1].getInt(sc)));
+        parser.registerFunction("villager.setslot", (sc, in) -> 
+        {
+            ((EntityVillager) in[0].get(sc)).getVillagerInventory().setInventorySlotContents(in[1].getInt(sc), ((ItemStack) in[2].get(sc)).copy());
+            return Void.TYPE; 
+        });
+        parser.registerFunction("villager.spawn", (sc, in) -> 
+        {
+            Location l = (Location) in[0].get(sc);
+            World w = l.getWorld();
+            EntityVillager v = new EntityVillager(w, in[1].getInt(sc));
+            v.setPosition(l.getX(), l.getY(), l.getZ());        
+            w.spawnEntity(v);
+            return v; 
+        });
         
         
         // ---------------------------------------------------------------------  
         // ---------------------------------------------------------------------  
         // GMap-library   
         // GMap-library   
@@ -2101,7 +2311,35 @@ public class MinecraftFunctions
             }
             }
             return stack;
             return stack;
         });
         });
-        parser.registerFunction("read.spawnmob", (sc, in) -> NBTUtils.fromString(SnuviUtils.connect(sc, in, 1).replace('\'', '"'), (Location) in[0].get(sc)));
+        parser.registerFunction("read.spawnmob", (sc, in) -> 
+        {
+            Location l = (Location) in[0].get(sc);
+            String data = SnuviUtils.connect(sc, in, 1).replace('\'', '"');
+            
+            try 
+            {
+                NBTTagCompound nbt = JsonToNBT.getTagFromJson(data);
+                Vec3d v = l.getPos();
+                Entity ent = AnvilChunkLoader.readWorldEntityPos(nbt, l.getWorld(), v.x, v.y, v.z, true);
+                if(ent == null)
+                {
+                    return null;
+                }
+                else
+                {
+                    ent.setLocationAndAngles(v.x, v.y, v.z, ent.rotationYaw, ent.rotationPitch);
+                    if(ent instanceof EntityLiving)
+                    {
+                        ((EntityLiving) ent).onInitialSpawn(ent.getEntityWorld().getDifficultyForLocation(new BlockPos(ent)), null);
+                    }
+                }  
+                return ent;
+            }
+            catch(NBTException ex)
+            {
+                throw new IllegalArgumentException("illegal entity string '" + data + "'");
+            }
+        });
 
 
         // ---------------------------------------------------------------------  
         // ---------------------------------------------------------------------  
         // Text-library   
         // Text-library   
@@ -2109,8 +2347,74 @@ public class MinecraftFunctions
         parser.registerFunction("text.location", (sc, in) -> ((Location) in[0].get(sc)).toString());
         parser.registerFunction("text.location", (sc, in) -> ((Location) in[0].get(sc)).toString());
         parser.registerFunction("text.locationblock", (sc, in) -> ((Location) in[0].get(sc)).toBlockString());
         parser.registerFunction("text.locationblock", (sc, in) -> ((Location) in[0].get(sc)).toBlockString());
         parser.registerFunction("text.item", (sc, in) -> ItemStackUtils.getNbtString((ItemStack) in[0].get(sc)));
         parser.registerFunction("text.item", (sc, in) -> ItemStackUtils.getNbtString((ItemStack) in[0].get(sc)));
-        parser.registerFunction("text.click", (sc, in) -> NBTUtils.getClickable(in[0].get(sc), in[1].getString(sc)));
-        parser.registerFunction("text.hover", (sc, in) -> NBTUtils.getHoverable(in[0].get(sc), in[1].getString(sc)));
+        parser.registerFunction("text.click", (sc, in) -> 
+        {
+            Object message = in[0].get(sc);
+            ITextComponent text; 
+            if(message instanceof ITextComponent)
+            {
+                text = (ITextComponent) message;
+            }
+            else
+            {
+                text = new TextComponentString(String.valueOf(message));
+            }
+            Style style = text.getStyle();
+            style.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, in[1].getString(sc)));
+            return text;
+        });
+        parser.registerFunction("text.hover", (sc, in) -> 
+        {
+            Object message = in[0].get(sc);
+            ITextComponent text; 
+            if(message instanceof ITextComponent)
+            {
+                text = (ITextComponent) message;
+            }
+            else
+            {
+                text = new TextComponentString(String.valueOf(message));
+            }
+            Style style = text.getStyle();
+            style.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponentString(in[1].getString(sc))));
+            return text;
+        });
+        parser.registerFunction("text.link", (sc, in) -> 
+        {
+            TextComponentString text = new TextComponentString(in[0].getString(sc));
+            Style style = text.getStyle();
+            style.setColor(TextFormatting.RED);
+            style.setBold(true);
+            style.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, in[1].getString(sc)));
+            return text;
+        });
+        parser.registerFunction("text.copytext", (sc, in) -> 
+        {
+            String s = in[1].getString(sc);
+            s = s.replace('{', 'Ɛ');
+            s = s.replace('}', 'Ƒ');
+            s = s.replace('[', 'ƒ');
+            s = s.replace(']', 'Ɠ');
+            s = s.replace('(', 'ƕ');
+            s = s.replace(')', 'Ɩ');
+            s = s.replace(" ", "%20");
+            s = s.replace('\'', 'Ɩ');
+            s = s.replace('"', 'Ɩ');
+            s = s.replace("\\", "");
+
+            TextComponentString text = new TextComponentString(in[0].getString(sc));
+            Style style = text.getStyle();
+            style.setColor(TextFormatting.RED);
+            style.setBold(true);
+            style.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "http://minecraft.hammerle.me/showtext.php/?text=" + s));
+            return text;
+        });
+        parser.registerFunction("text.entity", (sc, in) -> 
+        {
+            NBTTagCompound tag = new NBTTagCompound();
+            ((Entity) in[0].get(sc)).writeToNBTAtomically(tag);
+            return tag.toString();
+        });
 
 
         // ---------------------------------------------------------------------    
         // ---------------------------------------------------------------------    
         // worker library
         // worker library
@@ -2184,7 +2488,7 @@ public class MinecraftFunctions
         parser.registerAlias("delglobalvar", "dgv");
         parser.registerAlias("delglobalvar", "dgv");
         parser.registerFunction("msg", (sc, in) -> 
         parser.registerFunction("msg", (sc, in) -> 
         { 
         { 
-            sendMessageToGroup(in[0].get(sc), sc, NBTUtils.concat(sc, 1, in)); 
+            sendMessageToGroup(in[0].get(sc), sc, concat(sc, 1, "", in)); 
             return Void.TYPE; 
             return Void.TYPE; 
         });       
         });       
         parser.registerFunction("removeformat", (sc, in) -> SnuviUtils.connect(sc, in, 0).replaceAll("§.", ""));           
         parser.registerFunction("removeformat", (sc, in) -> SnuviUtils.connect(sc, in, 0).replaceAll("§.", ""));           
@@ -2283,4 +2587,23 @@ public class MinecraftFunctions
     {
     {
         doForGroup(group, sc, p -> p.sendMessage(text));
         doForGroup(group, sc, p -> p.sendMessage(text));
     }
     }
+    
+    private static ITextComponent concat(Script sc, int start, String pre, InputProvider... ob)
+    {
+        TextComponentString text = new TextComponentString(pre);
+        Object o;
+        for(int i = start; i < ob.length; i++)
+        {
+            o = ob[i].get(sc);
+            if(o instanceof ITextComponent)
+            {
+                text.appendSibling((ITextComponent) o);
+            }
+            else
+            {
+                text.appendText(String.valueOf(o));
+            }
+        }
+        return text;
+    }
 }
 }

+ 0 - 332
src/main/java/me/km/snuviscript/ScriptBank.java

@@ -1,332 +0,0 @@
-package me.km.utils;
-
-import com.google.common.collect.Lists;
-import java.util.List;
-import java.util.function.Predicate;
-import me.hammerle.snuviscript.code.InputProvider;
-import me.hammerle.snuviscript.code.Script;
-import me.km.exception.IllegalStringException;
-import net.minecraft.block.Block;
-import net.minecraft.block.state.IBlockState;
-import net.minecraft.command.CommandClone;
-import net.minecraft.command.CommandException;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.command.WrongUsageException;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLiving;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Blocks;
-import net.minecraft.inventory.IInventory;
-import net.minecraft.nbt.JsonToNBT;
-import net.minecraft.nbt.NBTException;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.Vec3d;
-import net.minecraft.util.text.ITextComponent;
-import net.minecraft.util.text.Style;
-import net.minecraft.util.text.TextComponentString;
-import net.minecraft.util.text.TextFormatting;
-import net.minecraft.util.text.event.ClickEvent;
-import net.minecraft.util.text.event.HoverEvent;
-import net.minecraft.world.World;
-import net.minecraft.world.chunk.storage.AnvilChunkLoader;
-import net.minecraft.world.gen.structure.StructureBoundingBox;
-
-public class NBTUtils 
-{
-    // -----------------------------------------------------------------------------------
-    // Entity Tools
-    // -----------------------------------------------------------------------------------
-
-    public static String toString(Entity ent)
-    {
-        NBTTagCompound tag = new NBTTagCompound();
-        ent.writeToNBTAtomically(tag);
-        return tag.toString();
-    }
-    
-    public static Entity fromString(String s, Location l)
-    {
-        try 
-        {
-            NBTTagCompound nbt = JsonToNBT.getTagFromJson(s);
-            Vec3d v = l.getPos();
-            Entity ent = AnvilChunkLoader.readWorldEntityPos(nbt, l.getWorld(), v.x, v.y, v.z, true);
-            if(ent == null)
-            {
-                return null;
-            }
-            else
-            {
-                ent.setLocationAndAngles(v.x, v.y, v.z, ent.rotationYaw, ent.rotationPitch);
-                if(ent instanceof EntityLiving)
-                {
-                    ((EntityLiving) ent).onInitialSpawn(ent.getEntityWorld().getDifficultyForLocation(new BlockPos(ent)), null);
-                }
-            }  
-            return ent;
-        }
-        catch(NBTException ex)
-        {
-            throw new IllegalStringException("illegal entity string '" + s + "'");
-        }
-    }
-    
-    // -------------------------------------------------------------------------
-    // Block Tools
-    // -------------------------------------------------------------------------
-    
-    @SuppressWarnings(value = {"unchecked", "deprecation"})
-    public static void setBlockWithData(World w, BlockPos pos, int dv, Block block, String data)
-    {
-        NBTTagCompound nbttagcompound = new NBTTagCompound();
-        boolean flag = false;
-
-        if (data != null && block.hasTileEntity()) 
-        {
-            try 
-            {
-                nbttagcompound = JsonToNBT.getTagFromJson(data);
-                flag = true;
-            } 
-            catch(NBTException ex) 
-            {
-                throw new IllegalStringException(data);
-            }
-        }
-
-        TileEntity tileentity = w.getTileEntity(pos);
-        if (tileentity != null) 
-        {
-            if (tileentity instanceof IInventory) 
-            {
-                ((IInventory) tileentity).clear();
-            }
-            w.setBlockState(pos, Blocks.AIR.getDefaultState(), block == Blocks.AIR ? 2 : 4);
-        }
-
-        IBlockState iblockdata = block.getStateFromMeta(dv);
-        if(w.setBlockState(pos, iblockdata, 2)) 
-        {
-            if(flag) 
-            {
-                TileEntity tileentity1 = w.getTileEntity(pos);
-                if (tileentity1 != null) 
-                {
-                    nbttagcompound.setInteger("x", pos.getX());
-                    nbttagcompound.setInteger("y", pos.getY());
-                    nbttagcompound.setInteger("z", pos.getZ());
-                    tileentity1.readFromNBT(nbttagcompound);
-                }
-            }
-            w.notifyNeighborsRespectDebug(pos, iblockdata.getBlock(), false);
-        }
-    }
-    
-    @SuppressWarnings(value = {"unchecked", "deprecation"})
-    public static void cloneBlock(World w, BlockPos oldPos, World newW, BlockPos newPos)
-    {
-        if(oldPos.equals(newPos))
-        {
-            return;
-        }
-        IBlockState state = w.getBlockState(oldPos);
-        NBTTagCompound nbt = null;
-
-        if(state.getBlock() != Blocks.AIR)
-        {
-            TileEntity te = w.getTileEntity(oldPos);
-            if (te != null)
-            {
-                nbt = te.writeToNBT(new NBTTagCompound());
-            }
-        }
-
-        newW.setBlockState(newPos, state);
-        if(nbt != null)
-        {
-            TileEntity te = newW.getTileEntity(newPos);
-            if(te != null)
-            {
-                nbt.setInteger("x", newPos.getX());
-                nbt.setInteger("y", newPos.getY());
-                nbt.setInteger("z", newPos.getZ());
-                te.readFromNBT(nbt);
-                te.markDirty();
-            }
-        }
-    }
-
-    // -------------------------------------------------------------------------
-    // NBT Tools
-    // -------------------------------------------------------------------------  
-    
-    public static String highlightNbtSyntax(String text)
-    {
-        StringBuilder sb = new StringBuilder(text);
-        int counter = 0;
-        for(char c : text.toCharArray())
-        {
-            switch(c)
-            {
-                case '}':
-                    sb.replace(counter, counter + 1, "§c} §r");
-                    counter += 6;
-                    continue;
-                case '{':
-                    sb.replace(counter, counter + 1, "§c{§r");
-                    counter += 5;
-                    continue;
-                case ']':
-                    sb.replace(counter, counter + 1, "§c] §r");
-                    counter += 6;
-                    continue;
-                case '[':
-                    sb.replace(counter, counter + 1, "§c[§r");
-                    counter += 5;
-                    continue;
-                case ',':
-                    sb.replace(counter, counter + 1, "§6, §r");
-                    counter += 6;
-                    continue;
-                case '"':
-                    sb.replace(counter, counter + 1, "§a\"");
-                    counter += 3;
-                    continue;
-                case ':':
-                    sb.replace(counter, counter + 1, "§8:");
-                    counter += 3;
-                    continue;
-                case '0':
-                    sb.replace(counter, counter + 1, "§50");
-                    counter += 3;
-                    continue;
-                case '1':
-                    sb.replace(counter, counter + 1, "§51");
-                    counter += 3;
-                    continue;
-                case '2':
-                    sb.replace(counter, counter + 1, "§52");
-                    counter += 3;
-                    continue;
-                case '3':
-                    sb.replace(counter, counter + 1, "§53");
-                    counter += 3;
-                    continue;
-                case '4':
-                    sb.replace(counter, counter + 1, "§54");
-                    counter += 3;
-                    continue;
-                case '5':
-                    sb.replace(counter, counter + 1, "§55");
-                    counter += 3;
-                    continue;
-                case '6':
-                    sb.replace(counter, counter + 1, "§56");
-                    counter += 3;
-                    continue;
-                case '7':
-                    sb.replace(counter, counter + 1, "§57");
-                    counter += 3;
-                    continue;
-                case '8':
-                    sb.replace(counter, counter + 1, "§58");
-                    counter += 3;
-                    continue;
-                case '9':
-                    sb.replace(counter, counter + 1, "§59");
-                    counter += 3;
-                    continue;
-                default:
-                    counter++;
-            }
-        }
-        return sb.toString();
-    }    
-    
-    // -------------------------------------------------------------------------
-    // Copy Tools
-    // -------------------------------------------------------------------------
-    
-    public static void sendCopyableText(EntityPlayer p, String s)
-    {
-        s = s.replace('{', 'Ɛ');
-        s = s.replace('}', 'Ƒ');
-        s = s.replace('[', 'ƒ');
-        s = s.replace(']', 'Ɠ');
-        s = s.replace('(', 'ƕ');
-        s = s.replace(')', 'Ɩ');
-        s = s.replace(" ", "%20");
-        s = s.replace('\'', 'Ɩ');
-        s = s.replace('"', 'Ɩ');
-        s = s.replace("\\", "");
-        sendLink(p, "Hier drücken zum Kopieren.", "http://minecraft.hammerle.me/showtext.php/?text=" + s);
-    } 
-    
-    private static void sendLink(EntityPlayer p, String s, String link)
-    {
-        TextComponentString text = new TextComponentString(s);
-        Style style = text.getStyle();
-        style.setColor(TextFormatting.RED);
-        style.setBold(true);
-        style.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, link));
-        p.sendMessage(text);
-    }
-    
-    public static ITextComponent getClickable(Object message, String command)
-    {
-        ITextComponent text; 
-        if(message instanceof ITextComponent)
-        {
-            text = (ITextComponent) message;
-        }
-        else
-        {
-            text = new TextComponentString(String.valueOf(message));
-        }
-        Style style = text.getStyle();
-        style.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command));
-        return text;
-    }
-    
-    public static ITextComponent getHoverable(Object message, String hover)
-    {
-        ITextComponent text; 
-        if(message instanceof ITextComponent)
-        {
-            text = (ITextComponent) message;
-        }
-        else
-        {
-            text = new TextComponentString(String.valueOf(message));
-        }
-        Style style = text.getStyle();
-        style.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponentString(hover)));
-        return text;
-    }
-    
-    public static ITextComponent concat(Script sc, int start, String pre, InputProvider... ob)
-    {
-        TextComponentString text = new TextComponentString(pre);
-        Object o;
-        for(int i = start; i < ob.length; i++)
-        {
-            o = ob[i].get(sc);
-            if(o instanceof ITextComponent)
-            {
-                text.appendSibling((ITextComponent) o);
-            }
-            else
-            {
-                text.appendText(String.valueOf(o));
-            }
-        }
-        return text;
-    }
-    
-    public static ITextComponent concat(Script sc, int start, InputProvider... ob)
-    {
-        return concat(sc, start, "", ob);
-    }
-}

+ 0 - 1
src/main/java/me/km/utils/RecipeUtils.java

@@ -3,7 +3,6 @@ package me.km.utils;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 import java.util.Map;
 import java.util.Map;
 import java.util.Random;
 import java.util.Random;
 import java.util.UUID;
 import java.util.UUID;

+ 2 - 39
src/main/java/me/km/utils/SpecialBlockUtils.java

@@ -7,7 +7,6 @@ import me.km.KajetansMod;
 import me.km.world.ModTeleporter;
 import me.km.world.ModTeleporter;
 import me.km.entities.EntityItemProjectile;
 import me.km.entities.EntityItemProjectile;
 import me.km.exception.PlayerNotFoundException;
 import me.km.exception.PlayerNotFoundException;
-import me.km.permissions.Permissions;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLiving;
 import net.minecraft.entity.EntityLiving;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayer;
@@ -38,10 +37,9 @@ public class Utils
 {    
 {    
     public static String colorMessage(String text, ICommandSender cs) 
     public static String colorMessage(String text, ICommandSender cs) 
     {
     {
-        text = text.replace("&k", "");
-        if(KajetansMod.perms.hasPermission(cs, Permissions.USE_COLOR))
+        if(KajetansMod.perms.hasPermission(cs, "color"))
         {
         {
-            text = text.replace("&", "§");
+            text = text.replace('&', '§');
             return text;
             return text;
         }
         }
         text = text.replaceAll("&.", "");
         text = text.replaceAll("&.", "");
@@ -386,40 +384,5 @@ public class Utils
                     .filter(pl -> pl.getName().toLowerCase().contains(nameLower))
                     .filter(pl -> pl.getName().toLowerCase().contains(nameLower))
                     .findFirst().orElseThrow(() -> new PlayerNotFoundException(name));
                     .findFirst().orElseThrow(() -> new PlayerNotFoundException(name));
     }
     }
-    
-    // -------------------------------------------------------------------------
-    // Blocks
-    // -------------------------------------------------------------------------
-    
-    public static BlockPos getSameNearbyBlock(World w, BlockPos pos, Block b)
-    {           
-        Location l = new Location(w, pos);
-        if(l.getRelativeBlockState(1, 0, 0).getBlock() == b)
-        {
-            return pos.add(1, 0, 0);
-        }
-        else if(l.getRelativeBlockState(-1, 0, 0).getBlock() == b)
-        {
-            return pos.add(-1, 0, 0);
-        }
-        else if(l.getRelativeBlockState(0, 0, 1).getBlock() == b)
-        {
-            return pos.add(0, 0, 1);
-        }
-        else if(l.getRelativeBlockState(0, 0, -1).getBlock() == b)
-        {
-            return pos.add(0, 0, -1);
-        }
-        return null;
-    }
-       
-    public static boolean shouldBeProtected(Block b)
-    {
-        return (b instanceof BlockDoor || 
-               b instanceof BlockContainer ||
-               b == Blocks.LEVER || 
-               b instanceof BlockButton || 
-               b instanceof BlockTrapDoor) && !(b instanceof BlockPistonMoving);   
-    }
 }
 }
 
 

+ 5 - 0
src/main/java/me/km/world/ChangeWorldEvent.java

@@ -0,0 +1,5 @@
+{
+    "variants": {
+        "normal": { "model": "km:barrel" }
+    }
+}

+ 0 - 5
src/main/resources/assets/km/blockstates/barrel_acacia.json

@@ -1,5 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:barrel/barrel_acacia" }
-    }
-}

+ 0 - 5
src/main/resources/assets/km/blockstates/barrel_big_oak.json

@@ -1,5 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:barrel/barrel_big_oak" }
-    }
-}

+ 0 - 5
src/main/resources/assets/km/blockstates/barrel_birch.json

@@ -1,5 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:barrel/barrel_birch" }
-    }
-}

+ 0 - 5
src/main/resources/assets/km/blockstates/barrel_jungle.json

@@ -1,5 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:barrel/barrel_jungle" }
-    }
-}

+ 0 - 5
src/main/resources/assets/km/blockstates/barrel_oak.json

@@ -1,5 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:barrel/barrel_oak" }
-    }
-}

+ 0 - 5
src/main/resources/assets/km/blockstates/barrel_spruce.json

@@ -1,5 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:barrel/barrel_spruce" }
-    }
-}

+ 0 - 5
src/main/resources/assets/km/blockstates/bronze_block.json

@@ -1,5 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:camp_fire" }
-    }
-}

+ 0 - 9
src/main/resources/assets/km/blockstates/camp_fire_burning.json

@@ -1,9 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:cauldron/acacia/cauldron_empty" },
-        "level=0": { "model": "km:cauldron/acacia/cauldron_empty" },
-        "level=1": { "model": "km:cauldron/acacia/cauldron_level1" },
-        "level=2": { "model": "km:cauldron/acacia/cauldron_level2" },
-        "level=3": { "model": "km:cauldron/acacia/cauldron_level3" }
-    }
-}

+ 0 - 9
src/main/resources/assets/km/blockstates/cauldron_big_oak.json

@@ -1,9 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:cauldron/big_oak/cauldron_empty" },
-        "level=0": { "model": "km:cauldron/big_oak/cauldron_empty" },
-        "level=1": { "model": "km:cauldron/big_oak/cauldron_level1" },
-        "level=2": { "model": "km:cauldron/big_oak/cauldron_level2" },
-        "level=3": { "model": "km:cauldron/big_oak/cauldron_level3" }
-    }
-}

+ 0 - 9
src/main/resources/assets/km/blockstates/cauldron_birch.json

@@ -1,9 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:cauldron/birch/cauldron_empty" },
-        "level=0": { "model": "km:cauldron/birch/cauldron_empty" },
-        "level=1": { "model": "km:cauldron/birch/cauldron_level1" },
-        "level=2": { "model": "km:cauldron/birch/cauldron_level2" },
-        "level=3": { "model": "km:cauldron/birch/cauldron_level3" }
-    }
-}

+ 0 - 9
src/main/resources/assets/km/blockstates/cauldron_jungle.json

@@ -1,9 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:cauldron/jungle/cauldron_empty" },
-        "level=0": { "model": "km:cauldron/jungle/cauldron_empty" },
-        "level=1": { "model": "km:cauldron/jungle/cauldron_level1" },
-        "level=2": { "model": "km:cauldron/jungle/cauldron_level2" },
-        "level=3": { "model": "km:cauldron/jungle/cauldron_level3" }
-    }
-}

+ 0 - 9
src/main/resources/assets/km/blockstates/cauldron_oak.json

@@ -1,9 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:cauldron/oak/cauldron_empty" },
-        "level=0": { "model": "km:cauldron/oak/cauldron_empty" },
-        "level=1": { "model": "km:cauldron/oak/cauldron_level1" },
-        "level=2": { "model": "km:cauldron/oak/cauldron_level2" },
-        "level=3": { "model": "km:cauldron/oak/cauldron_level3" }
-    }
-}

+ 0 - 9
src/main/resources/assets/km/blockstates/cauldron_spruce.json

@@ -1,9 +0,0 @@
-{
-    "variants": {
-        "normal": { "model": "km:cauldron/spruce/cauldron_empty" },
-        "level=0": { "model": "km:cauldron/spruce/cauldron_empty" },
-        "level=1": { "model": "km:cauldron/spruce/cauldron_level1" },
-        "level=2": { "model": "km:cauldron/spruce/cauldron_level2" },
-        "level=3": { "model": "km:cauldron/spruce/cauldron_level3" }
-    }
-}

+ 9 - 0
src/main/resources/assets/km/blockstates/cherry_leaves.json

@@ -0,0 +1,9 @@
+{
+    "variants": {
+        "normal": { "model": "km:cooking_pot/copper/empty" },
+        "level=0": { "model": "km:cooking_pot/copper/empty" },
+        "level=1": { "model": "km:cooking_pot/copper/level1" },
+        "level=2": { "model": "km:cooking_pot/copper/level2" },
+        "level=3": { "model": "km:cooking_pot/copper/level3" }
+    }
+}

+ 3 - 13
src/main/resources/assets/km/blockstates/copper_block.json

@@ -53,19 +53,9 @@ tile.crateJungle.name=Jungle Crate
 tile.crateOak.name=Oak Crate
 tile.crateOak.name=Oak Crate
 tile.crateSpruce.name=Spruce Crate
 tile.crateSpruce.name=Spruce Crate
 
 
-tile.cauldronOak.name=Oak Vat
-tile.cauldronBirch.name=Birch Vat
-tile.cauldronAcacia.name=Acacia Vat
-tile.cauldronJungle.name=Jungle Vat
-tile.cauldronSpruce.name=Spruce Vat
-tile.cauldronBigOak.name=Dark Oak Vat
-
-tile.barrelOak.name=Oak Barrel
-tile.barrelBirch.name=Birch Barrel
-tile.barrelAcacia.name=Acacia Barrel
-tile.barrelJungle.name=Jungle Barrel
-tile.barrelSpruce.name=Spruce Barrel
-tile.barrelBigOak.name=Dark Oak Barrel
+tile.cookingPotCopper.name=Copper Cooking Pot
+
+tile.barrel.name=Barrel
 
 
 tile.spikes.copper.name=Copper Spikes
 tile.spikes.copper.name=Copper Spikes
 tile.spikes.tin.name=Tin Spikes
 tile.spikes.tin.name=Tin Spikes

+ 8 - 0
src/main/resources/assets/km/models/block/artefact.json

@@ -0,0 +1,8 @@
+{
+    "parent": "block/cube_bottom_top",
+    "textures": {
+        "top": "km:blocks/barrel/barrel_top",
+        "side": "km:blocks/barrel/barrel_side",
+        "bottom": "km:blocks/barrel/barrel_bottom"
+    }
+}

+ 0 - 68
src/main/resources/assets/km/models/block/barrel/barrel.json

@@ -1,68 +0,0 @@
-{
-    "parent": "block/block",
-    "ambientocclusion": false,
-    "elements": [
-        {
-            "from": [ 0.00, 0.00, 0.00 ], 
-            "to": [ 2.00, 16.00, 16.00 ], 
-            "faces": {
-                "down":  { "texture": "#top" },
-                "up":    { "texture": "#top", "cullface": "up" },
-                "north": { "texture": "#side", "cullface": "north" },
-                "south": { "texture": "#side", "cullface": "south" },
-                "west":  { "texture": "#side", "cullface": "west" },
-                "east":  { "texture": "#sidev" }
-            }
-        },
-        {
-            "from": [ 2.00, 1.00, 2.00 ], 
-            "to": [ 14.00, 2.00, 14.00 ], 
-            "faces": {
-                "down":  { "texture": "#inside" }
-            }
-        },
-        {
-            "from": [ 14.00, 0.00, 0.00 ], 
-            "to": [ 16.00, 16.00, 16.00 ], 
-            "faces": {
-                "down":  { "texture": "#top" },
-                "up":    { "texture": "#top", "cullface": "up" },
-                "north": { "texture": "#side", "cullface": "north" },
-                "south": { "texture": "#side", "cullface": "south" },
-                "west":  { "texture": "#sidev" },
-                "east":  { "texture": "#side", "cullface": "east" }
-            }
-        },
-        {
-            "from": [ 2.00, 0.00, 0.00 ], 
-            "to": [ 14.00, 16.00, 2.00 ], 
-            "faces": {
-                "down":  { "texture": "#top" },
-                "up":    { "texture": "#top", "cullface": "up" },
-                "north": { "texture": "#side", "cullface": "north" },
-                "south": { "texture": "#sidev" },
-                "west":  { "texture": "#side", "cullface": "west" },
-                "east":  { "texture": "#side", "cullface": "east" }
-            }
-        },
-        {
-            "from": [ 2.00, 0.00, 14.00 ], 
-            "to": [ 14.00, 16.00, 16.00 ], 
-            "faces": {
-                "down":  { "texture": "#top" },
-                "up":    { "texture": "#top", "cullface": "up" },
-                "north": { "texture": "#sidev" },
-                "south": { "texture": "#side", "cullface": "south" },
-                "west":  { "texture": "#side", "cullface": "west" },
-                "east":  { "texture": "#side", "cullface": "east" }
-            }
-        },
-        {
-            "from": [ 2.00, 13.00, 2.00 ], 
-            "to": [ 14.00, 14.00, 14.00 ], 
-            "faces": {
-                "up":    { "texture": "#inside", "cullface": "up" }
-            }
-        }
-    ]
-}

+ 0 - 10
src/main/resources/assets/km/models/block/barrel/barrel_acacia.json

@@ -1,10 +0,0 @@
-{
-    "parent": "km:block/barrel/barrel",
-    "textures": {
-        "particle": "km:blocks/cauldron/acacia/barrel_side",
-        "top": "km:blocks/cauldron/acacia/cauldron_top",
-        "side": "km:blocks/cauldron/acacia/barrel_side",
-        "sidev": "km:blocks/cauldron/acacia/cauldron_sidev",
-        "inside": "km:blocks/cauldron/acacia/cauldron_inner"
-    }
-}

+ 0 - 10
src/main/resources/assets/km/models/block/barrel/barrel_big_oak.json

@@ -1,10 +0,0 @@
-{
-    "parent": "km:block/barrel/barrel",
-    "textures": {
-        "particle": "km:blocks/cauldron/big_oak/barrel_side",
-        "top": "km:blocks/cauldron/big_oak/cauldron_top",
-        "side": "km:blocks/cauldron/big_oak/barrel_side",
-        "sidev": "km:blocks/cauldron/big_oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/big_oak/cauldron_inner"
-    }
-}

+ 0 - 10
src/main/resources/assets/km/models/block/barrel/barrel_birch.json

@@ -1,10 +0,0 @@
-{
-    "parent": "km:block/barrel/barrel",
-    "textures": {
-        "particle": "km:blocks/cauldron/birch/barrel_side",
-        "top": "km:blocks/cauldron/birch/cauldron_top",
-        "side": "km:blocks/cauldron/birch/barrel_side",
-        "sidev": "km:blocks/cauldron/birch/cauldron_sidev",
-        "inside": "km:blocks/cauldron/birch/cauldron_inner"
-    }
-}

+ 0 - 10
src/main/resources/assets/km/models/block/barrel/barrel_jungle.json

@@ -1,10 +0,0 @@
-{
-    "parent": "km:block/barrel/barrel",
-    "textures": {
-        "particle": "km:blocks/cauldron/jungle/barrel_side",
-        "top": "km:blocks/cauldron/jungle/cauldron_top",
-        "side": "km:blocks/cauldron/jungle/barrel_side",
-        "sidev": "km:blocks/cauldron/jungle/cauldron_sidev",
-        "inside": "km:blocks/cauldron/jungle/cauldron_inner"
-    }
-}

+ 0 - 10
src/main/resources/assets/km/models/block/barrel/barrel_oak.json

@@ -1,10 +0,0 @@
-{
-    "parent": "km:block/barrel/barrel",
-    "textures": {
-        "particle": "km:blocks/cauldron/oak/barrel_side",
-        "top": "km:blocks/cauldron/oak/cauldron_top",
-        "side": "km:blocks/cauldron/oak/barrel_side",
-        "sidev": "km:blocks/cauldron/oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/oak/cauldron_inner"
-    }
-}

+ 0 - 10
src/main/resources/assets/km/models/block/barrel/barrel_spruce.json

@@ -1,10 +0,0 @@
-{
-    "parent": "km:block/barrel/barrel",
-    "textures": {
-        "particle": "km:blocks/cauldron/spruce/barrel_side",
-        "top": "km:blocks/cauldron/spruce/cauldron_top",
-        "side": "km:blocks/cauldron/spruce/barrel_side",
-        "sidev": "km:blocks/cauldron/spruce/cauldron_sidev",
-        "inside": "km:blocks/cauldron/spruce/cauldron_inner"
-    }
-}

+ 57 - 88
src/main/resources/assets/km/models/block/bronze_block.json

@@ -1,123 +1,92 @@
 {
 {
+    "parent": "block/block",
+    "display": {
+        "head": {
+            "translation": [ 0, 10.5, 0 ]
+        }
+    },
     "textures": {
     "textures": {
-        "0": "blocks/planks_oak",
-        "particle": "blocks/planks_oak",
-        "fire": "blocks/fire_layer_0"
+        "particle": "km:blocks/campfire/campfire_log",
+        "log": "km:blocks/campfire/campfire_log",
+        "litlog": "km:blocks/campfire/campfire_log_lit",
+        "fire": "km:blocks/campfire/campfire_fire"
     },
     },
-    "ambientocclusion": false,
     "elements": [
     "elements": [
         {
         {
-            "from": [ 6.0, 6.0, 7.0 ], 
-            "to": [ 19.0, 8.0, 9.0 ], 
-            "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -45.0 },
+            "from": [1, 0, 0],
+            "to": [5, 4, 16],
             "faces": {
             "faces": {
-                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "up": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "down": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] }
+                "north": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "east": {"uv": [0, 1, 16, 5], "texture": "#litlog"},
+                "south": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "west": {"uv": [16, 0, 0, 4], "texture": "#log"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"},
+                "down": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"}
             }
             }
         },
         },
         {
         {
-            "from": [ -3.0, 6.0, 7.0 ], 
-            "to": [ 10.0, 8.0, 9.0 ], 
-            "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 },
+            "from": [0, 3, 11],
+            "to": [16, 7, 15],
             "faces": {
             "faces": {
-                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "up": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "down": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] }
+                "north": {"uv": [16, 0, 0, 4], "texture": "#litlog"},
+                "east": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "south": {"uv": [0, 0, 16, 4], "texture": "#litlog"},
+                "west": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 180, "texture": "#log"},
+                "down": {"uv": [0, 4, 16, 8], "texture": "#litlog"}
             }
             }
         },
         },
         {
         {
-            "from": [ 7.0, 6.0, -3.0 ], 
-            "to": [ 9.0, 8.0, 10.0 ], 
-            "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -45.0 },
+            "from": [11, 0, 0],
+            "to": [15, 4, 16],
             "faces": {
             "faces": {
-                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "east": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "west": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 13.0 ] },
-                "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 13.0 ] }
+                "north": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "east": {"uv": [0, 0, 16, 4], "texture": "#log"},
+                "south": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "west": {"uv": [16, 1, 0, 5], "texture": "#litlog"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"},
+                "down": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"}
             }
             }
         },
         },
         {
         {
-            "from": [ 7.0, 6.0, 6.0 ], 
-            "to": [ 9.0, 8.0, 19.0 ], 
-            "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 },
+            "from": [0, 3, 1],
+            "to": [16, 7, 5],
             "faces": {
             "faces": {
-                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "east": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "west": { "texture": "#0", "uv": [ 0.0, 0.0, 13.0, 2.0 ] },
-                "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 13.0 ] },
-                "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 13.0 ] }
+                "north": {"uv": [0, 0, 16, 4], "texture": "#litlog"},
+                "east": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "south": {"uv": [16, 0, 0, 4], "texture": "#litlog"},
+                "west": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 180, "texture": "#log"},
+                "down": {"uv": [0, 4, 16, 8], "texture": "#litlog"}
             }
             }
         },
         },
         {
         {
-            "from": [ 7.0, 0.0, 0.0 ], 
-            "to": [ 9.0, 2.0, 16.0 ], 
-            "rotation": { "origin": [ 8.0, 6.0, 8.0 ], "axis": "y", "angle": 45.0 },
+            "from": [5, 0, 0],
+            "to": [11, 1, 16],
             "faces": {
             "faces": {
-                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "east": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 2.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "west": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 2.0 ] },
-                "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 16.0 ] },
-                "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 16.0 ] }
+                "north": {"uv": [0, 15, 6, 16], "texture": "#log"},
+                "south": {"uv": [10, 15, 16, 16], "texture": "#log"},
+                "up": {"uv": [0, 8, 16, 14], "rotation": 90, "texture": "#litlog"},
+                "down": {"uv": [0, 8, 16, 14], "rotation": 90, "texture": "#log"}
             }
             }
         },
         },
-        {
-            "from": [ 7.0, 0.0, 0.0 ], 
-            "to": [ 9.0, 2.0, 16.0 ], 
-            "rotation": { "origin": [ 8.0, 6.0, 8.0 ], "axis": "y", "angle": -45.0 },
-            "faces": {
-                "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "east": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 2.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "west": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 2.0 ] },
-                "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 16.0 ] },
-                "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 16.0 ] }
-            }
-        },
-
-        {   "from": [ 2.8, 1.5, 8 ],
-            "to": [ 13.2, 17.5, 8 ],
+        {   "from": [ 0.8, 1, 8 ],
+            "to": [ 15.2, 17, 8 ],
             "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
             "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
             "shade": false,
             "shade": false,
             "faces": {
             "faces": {
-                "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"},
-                "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"}
-            }
-        },
-        {   "from": [ 2.8, 1.5, 8 ],
-            "to": [ 13.2, 17.5, 8 ],
-            "shade": false,
-            "faces": {
-                "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"},
-                "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"}
-            }
-        },
-        {   "from": [ 8, 1.5, 2.8 ],
-            "to": [ 8, 17.5, 13.2 ],
-            "shade": false,
-            "faces": {
-                "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"},
-                "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"}
+                "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire" },
+                "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire" }
             }
             }
         },
         },
-        {   "from": [ 8, 1.5, 2.8 ],
-            "to": [ 8, 17.5, 13.2 ],
+        {   "from": [ 8, 1, 0.8 ],
+            "to": [ 8, 17, 15.2 ],
             "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
             "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
             "shade": false,
             "shade": false,
             "faces": {
             "faces": {
-                "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"},
-                "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire"}
+                "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire" },
+                "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#fire" }
             }
             }
         }
         }
     ]
     ]
-}
+}

+ 53 - 42
src/main/resources/assets/km/models/block/camp_fire_burnt.json

@@ -1,63 +1,74 @@
 {
 {
+    "parent": "block/block",
+    "display": {
+        "head": {
+            "rotation": [ 0, 0, 0 ],
+            "translation": [ 0, 10.5, 0 ],
+            "scale":[ 1, 1, 1 ]
+        }
+    },
     "textures": {
     "textures": {
-        "0": "km:blocks/campfire/burnt_oak_tip",
-        "1": "km:blocks/campfire/burnt_plank_oak",
-        "2": "blocks/planks_oak",
-        "fire": "blocks/fire_layer_0",
-        "particle": "blocks/planks_oak"
+        "particle": "km:blocks/campfire/campfire_log",
+        "log": "km:blocks/campfire/campfire_log"
     },
     },
     "elements": [
     "elements": [
         {
         {
-            "from": [ -3.0, 6.0, 7.0 ], 
-            "to": [ 10.0, 8.0, 9.0 ], 
-            "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 },
+            "from": [1, 0, 0],
+            "to": [5, 4, 16],
+            "faces": {
+                "north": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "east": {"uv": [0, 1, 16, 5], "texture": "#log"},
+                "south": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "west": {"uv": [16, 0, 0, 4], "texture": "#log"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"},
+                "down": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"}
+            }
+        },
+        {
+            "from": [0, 3, 11],
+            "to": [16, 7, 15],
             "faces": {
             "faces": {
-                "north": { "texture": "#0", "uv": [ 3.0, 7.0, 16.0, 9.0 ] },
-                "east": { "texture": "#1", "uv": [ 7.0, 6.0, 9.0, 8.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 12.0, 13.0, 14.0 ], "rotation": 180 },
-                "west": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "up": { "texture": "#0", "uv": [ 0.0, 6.0, 13.0, 8.0 ], "rotation": 180 },
-                "down": { "texture": "#0", "uv": [ 0.0, 5.0, 6.0, 7.0 ], "rotation": 180 }
+                "north": {"uv": [16, 0, 0, 4], "texture": "#log"},
+                "east": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "south": {"uv": [0, 0, 16, 4], "texture": "#log"},
+                "west": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 180, "texture": "#log"},
+                "down": {"uv": [0, 4, 16, 8], "texture": "#log"}
             }
             }
         },
         },
         {
         {
-            "from": [ 7.0, 3.0, -3.0 ], 
-            "to": [ 9.0, 5.0, 10.0 ], 
-            "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": -22.5 },
+            "from": [11, 0, 0],
+            "to": [15, 4, 16],
             "faces": {
             "faces": {
-                "north": { "texture": "#2", "uv": [ 1.0, 1.0, 3.0, 3.0 ] },
-                "east": { "texture": "#0", "uv": [ 0.0, 6.0, 13.0, 8.0 ] },
-                "south": { "texture": "#0", "uv": [ 0.0, 5.0, 2.0, 7.0 ] },
-                "west": { "texture": "#0", "uv": [ 0.0, 5.0, 13.0, 7.0 ], "rotation": 180 },
-                "up": { "texture": "#0", "uv": [ 5.0, 3.0, 7.0, 16.0 ], "rotation": 180 },
-                "down": { "texture": "#0", "uv": [ 3.0, 3.0, 5.0, 16.0 ] }
+                "north": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "east": {"uv": [0, 0, 16, 4], "texture": "#log"},
+                "south": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "west": {"uv": [16, 1, 0, 5], "texture": "#log"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"},
+                "down": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#log"}
             }
             }
         },
         },
         {
         {
-            "from": [ 7.0, 0.0, 0.0 ], 
-            "to": [ 9.0, 2.0, 16.0 ], 
-            "rotation": { "origin": [ 8.0, 6.0, 8.0 ], "axis": "y", "angle": 45.0 },
+            "from": [0, 3, 1],
+            "to": [16, 7, 5],
             "faces": {
             "faces": {
-                "north": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "east": { "texture": "#1", "uv": [ 0.0, 12.0, 16.0, 14.0 ] },
-                "south": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "west": { "texture": "#1", "uv": [ 0.0, 11.0, 16.0, 13.0 ] },
-                "up": { "texture": "#1", "uv": [ 7.0, 0.0, 9.0, 16.0 ] },
-                "down": { "texture": "#1", "uv": [ 12.0, 0.0, 14.0, 16.0 ] }
+                "north": {"uv": [0, 0, 16, 4], "texture": "#log"},
+                "east": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "south": {"uv": [16, 0, 0, 4], "texture": "#log"},
+                "west": {"uv": [0, 4, 4, 8], "texture": "#log"},
+                "up": {"uv": [0, 0, 16, 4], "rotation": 180, "texture": "#log"},
+                "down": {"uv": [0, 4, 16, 8], "texture": "#log"}
             }
             }
         },
         },
         {
         {
-            "from": [ 7.0, 0.0, 0.0 ], 
-            "to": [ 9.0, 2.0, 16.0 ], 
-            "rotation": { "origin": [ 8.0, 6.0, 8.0 ], "axis": "y", "angle": -45.0 },
+            "from": [5, 0, 0],
+            "to": [11, 1, 16],
             "faces": {
             "faces": {
-                "north": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "east": { "texture": "#1", "uv": [ 0.0, 12.0, 16.0, 14.0 ] },
-                "south": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
-                "west": { "texture": "#1", "uv": [ 0.0, 11.0, 16.0, 13.0 ] },
-                "up": { "texture": "#1", "uv": [ 7.0, 0.0, 9.0, 16.0 ] },
-                "down": { "texture": "#1", "uv": [ 3.0, 0.0, 5.0, 16.0 ] }
+                "north": {"uv": [0, 15, 6, 16], "texture": "#log"},
+                "south": {"uv": [10, 15, 16, 16], "texture": "#log"},
+                "up": {"uv": [0, 8, 16, 14], "rotation": 90, "texture": "#log"},
+                "down": {"uv": [0, 8, 16, 14], "rotation": 90, "texture": "#log"}
             }
             }
         }
         }
     ]
     ]
-}
+}

+ 0 - 11
src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_empty.json

@@ -1,11 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_empty",
-    "textures": {
-        "particle": "km:blocks/cauldron/acacia/cauldron_side",
-        "top": "km:blocks/cauldron/acacia/cauldron_top",
-        "bottom": "km:blocks/cauldron/acacia/cauldron_bottom",
-        "side": "km:blocks/cauldron/acacia/cauldron_side",
-        "sidev": "km:blocks/cauldron/acacia/cauldron_sidev",
-        "inside": "km:blocks/cauldron/acacia/cauldron_inner"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_level1.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level1",
-    "textures": {
-        "particle": "km:blocks/cauldron/acacia/cauldron_side",
-        "top": "km:blocks/cauldron/acacia/cauldron_top",
-        "bottom": "km:blocks/cauldron/acacia/cauldron_bottom",
-        "side": "km:blocks/cauldron/acacia/cauldron_side",
-        "sidev": "km:blocks/cauldron/acacia/cauldron_sidev",
-        "inside": "km:blocks/cauldron/acacia/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_level2.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level2",
-    "textures": {
-        "particle": "km:blocks/cauldron/acacia/cauldron_side",
-        "top": "km:blocks/cauldron/acacia/cauldron_top",
-        "bottom": "km:blocks/cauldron/acacia/cauldron_bottom",
-        "side": "km:blocks/cauldron/acacia/cauldron_side",
-        "sidev": "km:blocks/cauldron/acacia/cauldron_sidev",
-        "inside": "km:blocks/cauldron/acacia/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/acacia/cauldron_level3.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level3",
-    "textures": {
-        "particle": "km:blocks/cauldron/acacia/cauldron_side",
-        "top": "km:blocks/cauldron/acacia/cauldron_top",
-        "bottom": "km:blocks/cauldron/acacia/cauldron_bottom",
-        "side": "km:blocks/cauldron/acacia/cauldron_side",
-        "sidev": "km:blocks/cauldron/acacia/cauldron_sidev",
-        "inside": "km:blocks/cauldron/acacia/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 11
src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_empty.json

@@ -1,11 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_empty",
-    "textures": {
-        "particle": "km:blocks/cauldron/big_oak/cauldron_side",
-        "top": "km:blocks/cauldron/big_oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/big_oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/big_oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/big_oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/big_oak/cauldron_inner"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_level1.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level1",
-    "textures": {
-        "particle": "km:blocks/cauldron/big_oak/cauldron_side",
-        "top": "km:blocks/cauldron/big_oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/big_oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/big_oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/big_oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/big_oak/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_level2.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level2",
-    "textures": {
-        "particle": "km:blocks/cauldron/big_oak/cauldron_side",
-        "top": "km:blocks/cauldron/big_oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/big_oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/big_oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/big_oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/big_oak/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/big_oak/cauldron_level3.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level3",
-    "textures": {
-        "particle": "km:blocks/cauldron/big_oak/cauldron_side",
-        "top": "km:blocks/cauldron/big_oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/big_oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/big_oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/big_oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/big_oak/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 11
src/main/resources/assets/km/models/block/cauldron/birch/cauldron_empty.json

@@ -1,11 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_empty",
-    "textures": {
-        "particle": "km:blocks/cauldron/birch/cauldron_side",
-        "top": "km:blocks/cauldron/birch/cauldron_top",
-        "bottom": "km:blocks/cauldron/birch/cauldron_bottom",
-        "side": "km:blocks/cauldron/birch/cauldron_side",
-        "sidev": "km:blocks/cauldron/birch/cauldron_sidev",
-        "inside": "km:blocks/cauldron/birch/cauldron_inner"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/birch/cauldron_level1.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level1",
-    "textures": {
-        "particle": "km:blocks/cauldron/birch/cauldron_side",
-        "top": "km:blocks/cauldron/birch/cauldron_top",
-        "bottom": "km:blocks/cauldron/birch/cauldron_bottom",
-        "side": "km:blocks/cauldron/birch/cauldron_side",
-        "sidev": "km:blocks/cauldron/birch/cauldron_sidev",
-        "inside": "km:blocks/cauldron/birch/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/birch/cauldron_level2.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level2",
-    "textures": {
-        "particle": "km:blocks/cauldron/birch/cauldron_side",
-        "top": "km:blocks/cauldron/birch/cauldron_top",
-        "bottom": "km:blocks/cauldron/birch/cauldron_bottom",
-        "side": "km:blocks/cauldron/birch/cauldron_side",
-        "sidev": "km:blocks/cauldron/birch/cauldron_sidev",
-        "inside": "km:blocks/cauldron/birch/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/birch/cauldron_level3.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level3",
-    "textures": {
-        "particle": "km:blocks/cauldron/birch/cauldron_side",
-        "top": "km:blocks/cauldron/birch/cauldron_top",
-        "bottom": "km:blocks/cauldron/birch/cauldron_bottom",
-        "side": "km:blocks/cauldron/birch/cauldron_side",
-        "sidev": "km:blocks/cauldron/birch/cauldron_sidev",
-        "inside": "km:blocks/cauldron/birch/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 11
src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_empty.json

@@ -1,11 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_empty",
-    "textures": {
-        "particle": "km:blocks/cauldron/jungle/cauldron_side",
-        "top": "km:blocks/cauldron/jungle/cauldron_top",
-        "bottom": "km:blocks/cauldron/jungle/cauldron_bottom",
-        "side": "km:blocks/cauldron/jungle/cauldron_side",
-        "sidev": "km:blocks/cauldron/jungle/cauldron_sidev",
-        "inside": "km:blocks/cauldron/jungle/cauldron_inner"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_level1.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level1",
-    "textures": {
-        "particle": "km:blocks/cauldron/jungle/cauldron_side",
-        "top": "km:blocks/cauldron/jungle/cauldron_top",
-        "bottom": "km:blocks/cauldron/jungle/cauldron_bottom",
-        "side": "km:blocks/cauldron/jungle/cauldron_side",
-        "sidev": "km:blocks/cauldron/jungle/cauldron_sidev",
-        "inside": "km:blocks/cauldron/jungle/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_level2.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level2",
-    "textures": {
-        "particle": "km:blocks/cauldron/jungle/cauldron_side",
-        "top": "km:blocks/cauldron/jungle/cauldron_top",
-        "bottom": "km:blocks/cauldron/jungle/cauldron_bottom",
-        "side": "km:blocks/cauldron/jungle/cauldron_side",
-        "sidev": "km:blocks/cauldron/jungle/cauldron_sidev",
-        "inside": "km:blocks/cauldron/jungle/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/jungle/cauldron_level3.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level3",
-    "textures": {
-        "particle": "km:blocks/cauldron/jungle/cauldron_side",
-        "top": "km:blocks/cauldron/jungle/cauldron_top",
-        "bottom": "km:blocks/cauldron/jungle/cauldron_bottom",
-        "side": "km:blocks/cauldron/jungle/cauldron_side",
-        "sidev": "km:blocks/cauldron/jungle/cauldron_sidev",
-        "inside": "km:blocks/cauldron/jungle/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 11
src/main/resources/assets/km/models/block/cauldron/oak/cauldron_empty.json

@@ -1,11 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_empty",
-    "textures": {
-        "particle": "km:blocks/cauldron/oak/cauldron_side",
-        "top": "km:blocks/cauldron/oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/oak/cauldron_inner"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/oak/cauldron_level1.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level1",
-    "textures": {
-        "particle": "km:blocks/cauldron/oak/cauldron_side",
-        "top": "km:blocks/cauldron/oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/oak/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/oak/cauldron_level2.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level2",
-    "textures": {
-        "particle": "km:blocks/cauldron/oak/cauldron_side",
-        "top": "km:blocks/cauldron/oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/oak/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/oak/cauldron_level3.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level3",
-    "textures": {
-        "particle": "km:blocks/cauldron/oak/cauldron_side",
-        "top": "km:blocks/cauldron/oak/cauldron_top",
-        "bottom": "km:blocks/cauldron/oak/cauldron_bottom",
-        "side": "km:blocks/cauldron/oak/cauldron_side",
-        "sidev": "km:blocks/cauldron/oak/cauldron_sidev",
-        "inside": "km:blocks/cauldron/oak/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 11
src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_empty.json

@@ -1,11 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_empty",
-    "textures": {
-        "particle": "km:blocks/cauldron/spruce/cauldron_side",
-        "top": "km:blocks/cauldron/spruce/cauldron_top",
-        "bottom": "km:blocks/cauldron/spruce/cauldron_bottom",
-        "side": "km:blocks/cauldron/spruce/cauldron_side",
-        "sidev": "km:blocks/cauldron/spruce/cauldron_sidev",
-        "inside": "km:blocks/cauldron/spruce/cauldron_inner"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_level1.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level1",
-    "textures": {
-        "particle": "km:blocks/cauldron/spruce/cauldron_side",
-        "top": "km:blocks/cauldron/spruce/cauldron_top",
-        "bottom": "km:blocks/cauldron/spruce/cauldron_bottom",
-        "side": "km:blocks/cauldron/spruce/cauldron_side",
-        "sidev": "km:blocks/cauldron/spruce/cauldron_sidev",
-        "inside": "km:blocks/cauldron/spruce/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_level2.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level2",
-    "textures": {
-        "particle": "km:blocks/cauldron/spruce/cauldron_side",
-        "top": "km:blocks/cauldron/spruce/cauldron_top",
-        "bottom": "km:blocks/cauldron/spruce/cauldron_bottom",
-        "side": "km:blocks/cauldron/spruce/cauldron_side",
-        "sidev": "km:blocks/cauldron/spruce/cauldron_sidev",
-        "inside": "km:blocks/cauldron/spruce/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 0 - 12
src/main/resources/assets/km/models/block/cauldron/spruce/cauldron_level3.json

@@ -1,12 +0,0 @@
-{
-    "parent": "km:block/cauldron/cauldron_level3",
-    "textures": {
-        "particle": "km:blocks/cauldron/spruce/cauldron_side",
-        "top": "km:blocks/cauldron/spruce/cauldron_top",
-        "bottom": "km:blocks/cauldron/spruce/cauldron_bottom",
-        "side": "km:blocks/cauldron/spruce/cauldron_side",
-        "sidev": "km:blocks/cauldron/spruce/cauldron_sidev",
-        "inside": "km:blocks/cauldron/spruce/cauldron_inner",
-        "water": "km:blocks/grey_water_still"
-    }
-}

+ 11 - 0
src/main/resources/assets/km/models/block/cooking_pot/copper/empty.json

@@ -0,0 +1,11 @@
+{
+    "parent": "km:block/cooking_pot/empty",
+    "textures": {
+        "particle": "km:blocks/copper_block",
+        "top": "km:blocks/copper_block",
+        "bottom": "km:blocks/copper_block",
+        "side": "km:blocks/copper_block",
+        "sidev": "km:blocks/copper_block",
+        "inside": "km:blocks/copper_block"
+    }
+}

+ 12 - 0
src/main/resources/assets/km/models/block/cooking_pot/copper/level1.json

@@ -0,0 +1,12 @@
+{
+    "parent": "km:block/cooking_pot/level1",
+    "textures": {
+        "particle": "km:blocks/copper_block",
+        "top": "km:blocks/copper_block",
+        "bottom": "km:blocks/copper_block",
+        "side": "km:blocks/copper_block",
+        "sidev": "km:blocks/copper_block",
+        "inside": "km:blocks/copper_block",
+        "water": "km:blocks/grey_water_still"
+    }
+}

+ 12 - 0
src/main/resources/assets/km/models/block/cooking_pot/copper/level2.json

@@ -0,0 +1,12 @@
+{
+    "parent": "km:block/cooking_pot/level2",
+    "textures": {
+        "particle": "km:blocks/copper_block",
+        "top": "km:blocks/copper_block",
+        "bottom": "km:blocks/copper_block",
+        "side": "km:blocks/copper_block",
+        "sidev": "km:blocks/copper_block",
+        "inside": "km:blocks/copper_block",
+        "water": "km:blocks/grey_water_still"
+    }
+}

+ 12 - 0
src/main/resources/assets/km/models/block/cooking_pot/copper/level3.json

@@ -0,0 +1,12 @@
+{
+    "parent": "km:block/cooking_pot/level3",
+    "textures": {
+        "particle": "km:blocks/copper_block",
+        "top": "km:blocks/copper_block",
+        "bottom": "km:blocks/copper_block",
+        "side": "km:blocks/copper_block",
+        "sidev": "km:blocks/copper_block",
+        "inside": "km:blocks/copper_block",
+        "water": "km:blocks/grey_water_still"
+    }
+}

+ 0 - 0
src/main/resources/assets/km/models/block/cauldron/cauldron_empty.json → src/main/resources/assets/km/models/block/cooking_pot/empty.json


+ 0 - 0
src/main/resources/assets/km/models/block/cauldron/cauldron_level1.json → src/main/resources/assets/km/models/block/cooking_pot/level1.json


+ 0 - 0
src/main/resources/assets/km/models/block/cauldron/cauldron_level2.json → src/main/resources/assets/km/models/block/cooking_pot/level2.json


+ 0 - 0
src/main/resources/assets/km/models/block/cauldron/cauldron_level3.json → src/main/resources/assets/km/models/block/cooking_pot/level3.json


BIN
src/main/resources/assets/km/models/block/copper_block.json


BIN
src/main/resources/assets/km/textures/blocks/barrel/barrel_side.png


BIN
src/main/resources/assets/km/textures/blocks/barrel/barrel_top.png


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác