Browse Source

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

Kajetan Johannes Hammerle 5 years ago
parent
commit
b09b326acb
100 changed files with 745 additions and 2147 deletions
  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 me.km.blocks.ModBlocks;
-import me.km.blocks.cauldron.TileEntityCauldron;
+import me.km.blocks.cookingpot.TileEntityCookingPot;
 import me.km.entities.ModEntities;
 import me.km.items.ItemColoredSoup;
 import me.km.items.ItemGemStone;
@@ -84,14 +84,14 @@ public class ClientProxy extends CommonProxy
         BlockColors bColors = Minecraft.getMinecraft().getBlockColors();
         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) 
             {
                 return -16777216;
             }
             Color c = tile.getColor();
             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) ->
         {

+ 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.SimpleConfig;
 import me.km.databank.DataBank;
-import me.km.datatools.DataToolsEvents;
 import me.km.world.ModWorldGeneration;
 import me.km.networking.ModPacketHandler;
-import me.km.permissions.PermissionManager;
 import me.km.playerbank.PlayerManager;
 import me.km.plots.ProtectionBank;
 import me.km.scheduler.SnuviScheduler;
@@ -41,8 +39,6 @@ public class KajetansMod
     public static PlayerManager playerbank;
     public static ProtectionBank plots;
     public static BlockProtection blocks;
-    public static Module datatools;
-    public static Module world;
     public static ScriptModule scripts;
     
     @SideOnly(Side.SERVER)
@@ -53,7 +49,7 @@ public class KajetansMod
 
     public static final String MODID = "km";
     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)
     public static KajetansMod instance;
@@ -82,7 +78,8 @@ public class KajetansMod
                 @net.minecraftforge.fml.common.eventhandler.SubscribeEvent
                 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()));
                 }
             });*/
@@ -149,15 +146,9 @@ public class KajetansMod
 
         // block protections
         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
         scripts = new ScriptModule("Scripts", TextFormatting.LIGHT_PURPLE);
@@ -165,7 +156,6 @@ public class KajetansMod
 
         // Permissions
         perms = new PermissionManager("Perms", TextFormatting.DARK_PURPLE);
-        perms.registerEvents("me.km.permissions");
         setPermissionManager();
 
         scripts.startScript("startscript");
@@ -189,6 +179,7 @@ public class KajetansMod
             return;
         }
         scripts.startScript("endscript");
+        scheduler.stop();
         databank.closeDataBankConnection();
         scheduler.getWorker().stop();
     }

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

@@ -29,7 +29,18 @@ public class ObjectRegistry
         e.getMappings().stream()
                 .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.HashMap;
 import java.util.HashSet;
 import java.util.UUID;
 import me.kcm.command.ICommandManager;
-import me.km.KajetansMod;
 import me.km.module.Module;
 import me.km.snuviscript.ScriptEvents;
 import net.minecraft.command.ICommand;
@@ -13,7 +12,6 @@ import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.tileentity.CommandBlockBaseLogic;
-import net.minecraft.util.text.TextComponentString;
 import net.minecraft.util.text.TextFormatting;
 import net.minecraftforge.fml.relauncher.Side;
 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.module.Module;
+import me.km.utils.Location;
 import me.km.utils.Utils;
-import me.km.permissions.Permissions;
 import net.minecraft.block.Block;
+import net.minecraft.block.BlockButton;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.BlockDoor;
+import net.minecraft.block.BlockPistonMoving;
+import net.minecraft.block.BlockTrapDoor;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
@@ -21,6 +24,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class BlockProtection extends Module
 {
+    private final static String BLOCK_BYPASS = "block.bypass";
+    
     private final BlockProtectionBank bank;
     
     public BlockProtection() 
@@ -35,6 +40,37 @@ public class BlockProtection extends Module
         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)
     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
         {
-            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);
             }        
@@ -55,7 +91,7 @@ public class BlockProtection extends Module
             BlockPos pos = e.getPos().add(0, 1, 0);
             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);
                 }               
@@ -68,7 +104,7 @@ public class BlockProtection extends Module
     {
         EntityPlayer p = e.getPlayer();
         IBlockState state = e.getState();
-        if(Utils.shouldBeProtected(state.getBlock()))
+        if(shouldBeProtected(state.getBlock()))
         {
             BlockPos pos = e.getPos();
             if(Utils.getStateValue(state, BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER)
@@ -76,7 +112,7 @@ public class BlockProtection extends Module
                 pos = pos.add(0, -1, 0);
             } 
             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);
                 return;
@@ -93,7 +129,7 @@ public class BlockProtection extends Module
             return;
         }
         IBlockState state = e.getWorld().getBlockState(e.getPos());
-        if(!Utils.shouldBeProtected(state.getBlock()))
+        if(!shouldBeProtected(state.getBlock()))
         {
             return;
         }
@@ -103,7 +139,7 @@ public class BlockProtection extends Module
         {
             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);   
         }  

+ 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;
 
-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.BlockCampFireBurning;
 import me.km.blocks.campfire.BlockCampFire;
 import me.km.blocks.campfire.BlockCampFireBurnt;
+import me.km.blocks.cookingpot.BlockCookingPot;
 import me.km.blocks.leaves.*;
 import me.km.fluids.BlockFluidBase;
 import me.km.fluids.BlockFluidHoney;
@@ -49,21 +49,10 @@ public class ModBlocks
     public static BlockCrate crateOak;
     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 BlockCampFireBurnt campFireBurnt;
     
@@ -123,22 +112,11 @@ public class ModBlocks
         crateOak = register(r, new BlockCrate("crate_oak", "crateOak"));
         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);
         campFireBurnt = register(r, new BlockCampFireBurnt("camp_fire_burnt", "campFireBurnt"));
         GameRegistry.registerTileEntity(TileEntityCampFire.class, campFireBurning.getRegistryName().toString());
@@ -197,19 +175,9 @@ public class ModBlocks
         register(r, crateOak, getItemBlock(crateOak));
         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, 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 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) 
     {
@@ -36,7 +36,7 @@ public class BlockCampFire extends BlockBase
     @Override
     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;
         }

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

+ 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.util.LinkedList;
@@ -6,7 +6,7 @@ import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemFishFood;
 
-public class CauldronColorMixer 
+public class CookingPotColorMixer 
 {
     public final static Color DEFAULT = new Color(47, 67, 244); 
     
@@ -45,7 +45,7 @@ public class CauldronColorMixer
     private final LinkedList<Color> colors;
     private Color cachedColor; 
 
-    public CauldronColorMixer()
+    public CookingPotColorMixer()
     {
         items = 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.util.LinkedList;
@@ -13,13 +13,13 @@ import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.math.BlockPos;
 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

+ 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.Predicate;
 import me.km.KajetansMod;
-import me.km.permissions.Permissions;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.util.text.TextComponentString;
 
@@ -24,7 +23,7 @@ public class ChatChannel
             {
                 TextComponentString text = new TextComponentString(s);
                 cc.forEach(p -> p.sendMessage(text));
-            }, p -> KajetansMod.perms.hasPermission(p, Permissions.SCRIPT_ERROR));   
+            }, p -> KajetansMod.perms.hasPermission(p, "script.error"));   
     
     // -------------------------------------------------------------------------
     // 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;
                 }
                 // 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())
             {

+ 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.km.DamageUtils;
 import me.km.KajetansMod;
+import me.km.scoreboard.ScoreboardUtils;
 import me.km.utils.ReflectionUtils;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLivingBase;
@@ -55,10 +56,11 @@ public class CustomEventCaller
     }
     
     @SubscribeEvent
-    public void onPlayerMove(TickEvent.ServerTickEvent e)
+    public void onServerTick(TickEvent.ServerTickEvent e)
     {      
         if(e.phase == TickEvent.Phase.END)
         {
+            ScoreboardUtils.update();
             if(!ADD_QUEUE.isEmpty())
             {
                 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;
 
-import net.minecraft.entity.passive.EntityVillager;
 import net.minecraft.inventory.IInventory;
-import net.minecraft.inventory.InventoryBasic;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 
 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)
     {
         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.List;
-import me.km.blocks.cauldron.CauldronColorMixer;
+import me.km.blocks.cookingpot.CookingPotColorMixer;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.player.EntityPlayer;
@@ -61,7 +61,7 @@ public class ItemColoredSoup extends ItemFood
         if(com == null)
         {
             com = new NBTTagCompound();
-            com.setInteger("color", CauldronColorMixer.DEFAULT.getRGB());
+            com.setInteger("color", CookingPotColorMixer.DEFAULT.getRGB());
             com.setTag("ingredients", new NBTTagList());
             com.setFloat("saturation", 0);
             com.setInteger("food", 0);
@@ -71,7 +71,7 @@ public class ItemColoredSoup extends ItemFood
         {
             if(!com.hasKey("color"))
             {
-                com.setInteger("color", CauldronColorMixer.DEFAULT.getRGB());   
+                com.setInteger("color", CookingPotColorMixer.DEFAULT.getRGB());   
             }
             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)));
         
         // 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
         {

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

@@ -1,6 +1,5 @@
 package me.km.items.herbs;
 
-import me.km.KajetansMod;
 import net.minecraft.entity.player.EntityPlayerMP;
 
 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;
 
-import me.km.KajetansMod;
 import net.minecraft.entity.player.EntityPlayerMP;
 
 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;
 
-import javax.annotation.Nullable;
 import me.km.entities.EntityItemProjectile;
 import me.km.items.ItemBase;
 import me.km.items.ModItems;
@@ -10,7 +9,6 @@ import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.SoundEvents;
 import net.minecraft.item.EnumAction;
-import net.minecraft.item.IItemPropertyGetter;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.stats.StatList;
@@ -20,8 +18,6 @@ import net.minecraft.util.EnumHand;
 import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.SoundCategory;
 import net.minecraft.world.World;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
 
 public class ItemSling extends ItemBase
 {
@@ -31,31 +27,16 @@ public class ItemSling extends ItemBase
         super.maxStackSize = 1;
         super.setMaxDamage(192);
         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)
@@ -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;
         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.");
     }
     
-    public final void registerEvent(Object o)
+    public static void registerEvent(Object 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.km.KajetansMod;
-import me.km.permissions.Permissions;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockDoor;
 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.EntityWither;
 import net.minecraft.entity.item.EntityItemFrame;
+import net.minecraft.entity.passive.EntityVillager;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.util.math.BlockPos;
@@ -20,6 +20,7 @@ import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.world.DimensionType;
 import net.minecraftforge.event.entity.EntityJoinWorldEvent;
 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.FillBucketEvent;
 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
@@ -29,11 +30,13 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class Protection
 {
+    private final static String PLOT_BYPASS = "plot.bypass";
+    
     @SubscribeEvent(priority = EventPriority.HIGHEST)
     public void onBlockPlace(BlockEvent.PlaceEvent e)
     {
         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);
         }        
@@ -43,7 +46,7 @@ public class Protection
     public void onBlockBreak(BlockEvent.BreakEvent e)
     {
         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);
         }  
@@ -68,7 +71,7 @@ public class Protection
     {
         EntityPlayer p = e.getEntityPlayer(); 
         RayTraceResult ray = e.getTarget();
-        if(ray == null || KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS))
+        if(ray == null || KajetansMod.perms.hasPermission(p, PLOT_BYPASS))
         {
             return;
         }
@@ -137,7 +140,7 @@ public class Protection
         if(e.getTarget() instanceof EntityItemFrame)
         {
             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))
             {
                 e.setCanceled(true);
@@ -155,7 +158,7 @@ public class Protection
     public void onPlayerInteract(PlayerInteractEvent.LeftClickBlock e) 
     {
         EntityPlayer p = e.getEntityPlayer();
-        if(KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS))
+        if(KajetansMod.perms.hasPermission(p, PLOT_BYPASS))
         {
             return;
         }  
@@ -170,7 +173,7 @@ public class Protection
     public void onPlayerInteract(PlayerInteractEvent.RightClickBlock e) 
     {
         EntityPlayer p = e.getEntityPlayer();
-        if(KajetansMod.perms.hasPermission(p, Permissions.PLOT_BYPASS))
+        if(KajetansMod.perms.hasPermission(p, PLOT_BYPASS))
         {
             return;
         }    
@@ -190,7 +193,7 @@ public class Protection
     public void protectFromInteract(PlayerInteractEvent.EntityInteract e)
     {      
         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))
         {
             e.setCanceled(true);
@@ -202,4 +205,13 @@ public class Protection
     {      
         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)}});
         registerShaped(r, "", new String[] {" X ", "XXX"}, new ItemStack(ModItems.strawHat), 
                 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), 
                 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);
         
         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, 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.crateBirch), new ItemStack(ModBlocks.crateJungle), 
             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++)
         {
             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 HashMap<Integer, SnuviTask> tasks;
     private final AsyncWorker worker = new AsyncWorker();
+    private boolean noAdding = false;
     
     public SnuviScheduler(String prefix, TextFormatting color)
     {
@@ -29,6 +30,29 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
         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)
     {
         removeQueue.add(id);
@@ -36,6 +60,11 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
     
     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)
         {
             counter++;
@@ -90,7 +119,7 @@ public class SnuviScheduler extends Module implements ISnuviScheduler
                 }
                 try
                 {
-                    return task.tick();
+                    return task.tick(noAdding);
                 }
                 catch(Exception ex)
                 {

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

@@ -32,7 +32,7 @@ public class SnuviTask
         return rtimer > 0;
     }
     
-    public boolean tick() 
+    public boolean tick(boolean noRepeat) 
     {
         timer -= 1;
         if(timer <= 0)
@@ -45,7 +45,7 @@ public class SnuviTask
             {
                 KajetansMod.scripts.getSnuviParser().getLogger().print(ex.getLocalizedMessage(), ex, null, null, null, -1);
             }
-            if(rtimer <= 0)
+            if(rtimer <= 0 || noRepeat)
             {
                 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 HashSet<Integer> toRemove;
     private final HashMap<Integer, String> toAdd;
-    
+
     private final Scoreboard board;
     private final ScoreObjective o;
     private boolean changeNeeded;
-    
+
     private final UUID uuid;
 
     public PlayerScoreboard(EntityPlayerMP p)
@@ -37,7 +37,7 @@ public class PlayerScoreboard
         this.uuid = p.getUniqueID();
         p.connection.sendPacket(new SPacketScoreboardObjective(o, 0));
     }
-    
+
     public void addText(int id, String text)
     { 
         String s = elements.get(id);
@@ -53,7 +53,7 @@ public class PlayerScoreboard
             changeNeeded = true;
         }
     }
-    
+
     public void removeText(int id)
     { 
         if(elements.containsKey(id))
@@ -62,27 +62,27 @@ public class PlayerScoreboard
             changeNeeded = true;
         }
     }
-    
+
     public void clear()
     {
         elements.keySet().forEach(i -> toRemove.add(i));
         update();
     }
 
-    public void update()
+    public boolean update()
     {         
         if(!changeNeeded)
         {
-            return;
+            return false;
         }
-        
+
         EntityPlayerMP p = KajetansMod.server.getPlayerList().getPlayerByUUID(uuid);
-        
+
         if(p == null)
         {
-            return;
+            return true;
         }
-        
+
         if(!toRemove.isEmpty())
         {
             toRemove.forEach(i -> 
@@ -95,7 +95,7 @@ public class PlayerScoreboard
             });
             toRemove.clear();
         }
-        
+
         if(!toAdd.isEmpty())
         {
             toAdd.entrySet().stream().forEach((e) -> 
@@ -111,5 +111,6 @@ public class PlayerScoreboard
         changeNeeded = false;
         // displaying objective in sidebar
         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);
     }
     
+    public static void update()
+    {
+        BOARDS.values().removeIf(ps -> ps.update());
+    }
+    
     public static PlayerScoreboard get(EntityPlayerMP p)
     {
         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.module.Module;
 import me.km.module.ModuleCommand;
-import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 
@@ -15,7 +14,7 @@ public class CommandGiveUp extends ModuleCommand
         super("giveup", m);
         super.setDescription("Gibt deine Quest auf");
         super.setUsage("/giveup");
-        super.setPermission(Permissions.GIVEUP);
+        super.setPermission("giveup");
         super.addAlias("fuckit");
         super.addAlias("fuckitigiveup");
         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.km.utils.Utils;
 import me.km.exception.PlayerNotFoundException;
-import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
@@ -21,7 +20,7 @@ public class CommandScript extends ModuleCommand
         super("script", m);
         super.setDescription("Zeigt alles über Scripts");
         super.setUsage("/script für die Hilfe");
-        super.setPermission(Permissions.SCRIPT);
+        super.setPermission("script");
         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.SQLException;
 import me.km.KajetansMod;
-import me.km.utils.NBTUtils;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.List;
 import java.util.UUID;
 import java.util.function.Consumer;
+import me.hammerle.snuviscript.code.InputProvider;
 import me.hammerle.snuviscript.code.Script;
 import me.hammerle.snuviscript.code.SnuviUtils;
 import me.hammerle.snuviscript.code.SnuviParser;
@@ -22,6 +22,7 @@ import me.km.utils.Utils;
 import me.km.chatchannel.ChatChannel;
 import me.km.world.ModDimensions;
 import me.km.effects.EffectUtils;
+import me.km.entities.EntityHuman;
 import me.km.inventory.InventoryUtils;
 import me.km.utils.ItemStackUtils;
 import me.km.utils.ReflectionUtils;
@@ -73,11 +74,15 @@ import me.km.items.weapons.*;
 import me.km.networking.ModPacketHandler;
 import me.km.scoreboard.ScoreboardUtils;
 import net.minecraft.block.BlockCrops;
+import net.minecraft.entity.EntityAgeable;
 import net.minecraft.entity.EntityList;
+import net.minecraft.entity.SharedMonsterAttributes;
 import net.minecraft.entity.effect.EntityLightningBolt;
 import net.minecraft.entity.item.EntityItem;
+import net.minecraft.init.Blocks;
 import net.minecraft.init.Items;
 import net.minecraft.item.Item;
+import net.minecraft.item.ItemArmor;
 import net.minecraft.item.ItemAxe;
 import net.minecraft.nbt.JsonToNBT;
 import net.minecraft.nbt.NBTException;
@@ -91,7 +96,12 @@ import net.minecraft.tileentity.TileEntitySkull;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.math.MathHelper;
 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.village.MerchantRecipe;
 import net.minecraft.world.EnumDifficulty;
 import net.minecraft.world.GameType;
 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)); 
             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
@@ -245,7 +246,7 @@ public class MinecraftFunctions
         });
         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; 
         });
         parser.registerFunction("player.setcompass", (sc, in) -> 
@@ -746,6 +747,40 @@ public class MinecraftFunctions
             PotionUtils.appendEffects(stack, list);
             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
@@ -866,7 +901,42 @@ public class MinecraftFunctions
         { 
             Location l0 = (Location) in[0].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; 
         });
         parser.registerFunction("block.set", (sc, in) -> 
@@ -879,13 +949,54 @@ public class MinecraftFunctions
         parser.registerFunction("block.set2", (sc, in) -> 
         { 
             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; 
         });
@@ -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.damage", (sc, in) -> 
@@ -1156,7 +1267,7 @@ public class MinecraftFunctions
                 ent.setAlwaysRenderNameTag(in[2].getBoolean(sc));   
                 return Void.TYPE; 
             }
-            ent.setAlwaysRenderNameTag(true);  
+            ent.setAlwaysRenderNameTag(false);  
             return Void.TYPE; 
         }); 
         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)); 
             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; 
         });
         parser.registerFunction("entity.ride", (sc, in) -> 
@@ -1376,6 +1482,110 @@ public class MinecraftFunctions
             in[0].set(sc, Utils.getLiving(ent, in[2].getDouble(sc))); 
             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   
@@ -2101,7 +2311,35 @@ public class MinecraftFunctions
             }
             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   
@@ -2109,8 +2347,74 @@ public class MinecraftFunctions
         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.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
@@ -2184,7 +2488,7 @@ public class MinecraftFunctions
         parser.registerAlias("delglobalvar", "dgv");
         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; 
         });       
         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));
     }
+    
+    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.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 import java.util.Map;
 import java.util.Random;
 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.entities.EntityItemProjectile;
 import me.km.exception.PlayerNotFoundException;
-import me.km.permissions.Permissions;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityLiving;
 import net.minecraft.entity.player.EntityPlayer;
@@ -38,10 +37,9 @@ public class Utils
 {    
     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;
         }
         text = text.replaceAll("&.", "");
@@ -386,40 +384,5 @@ public class Utils
                     .filter(pl -> pl.getName().toLowerCase().contains(nameLower))
                     .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.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.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": {
-        "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": [
         {
-            "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": {
-                "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": {
-                "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": {
-                "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": {
-                "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": {
-                "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 },
             "shade": false,
             "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 },
             "shade": false,
             "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": {
-        "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": [
         {
-            "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": {
-                "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": {
-                "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": {
-                "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": {
-                "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


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