Переглянути джерело

loads of new items, lanterns, gravel slabs, deleted scoreboard defaults in favor of the display, refactoring, human fixes

Kajetan Johannes Hammerle 6 роки тому
батько
коміт
dcb4880466
100 змінених файлів з 1822 додано та 201 видалено
  1. 2 2
      build.gradle
  2. 37 24
      src/main/java/me/km/KajetansMod.java
  3. 34 2
      src/main/java/me/km/ObjectRegistry.java
  4. 4 8
      src/main/java/me/km/api/Utils.java
  5. 2 4
      src/main/java/me/km/blockprotections/BlockProtectionBank.java
  6. 1 1
      src/main/java/me/km/blocks/BlockCampFireBurning.java
  7. 273 0
      src/main/java/me/km/blocks/BlockLantern.java
  8. 1 1
      src/main/java/me/km/blocks/BlockModBed.java
  9. 110 0
      src/main/java/me/km/blocks/BlockModSlab.java
  10. 1 1
      src/main/java/me/km/blocks/BlockNoTrampleFarmland.java
  11. 1 1
      src/main/java/me/km/blocks/EnumMetals.java
  12. 16 0
      src/main/java/me/km/blocks/ModBlocks.java
  13. 1 1
      src/main/java/me/km/chatmanager/ChatListener.java
  14. 1 1
      src/main/java/me/km/chatmanager/ChatManager.java
  15. 7 10
      src/main/java/me/km/databank/DataBank.java
  16. 273 0
      src/main/java/me/km/databank/DummyStatement.java
  17. 2 2
      src/main/java/me/km/databank/SimpleDataBank.java
  18. 1 1
      src/main/java/me/km/datatools/CommandHuman.java
  19. 1 1
      src/main/java/me/km/effects/CommandWand.java
  20. 6 6
      src/main/java/me/km/effects/EffectUtils.java
  21. 1 1
      src/main/java/me/km/effects/passive/Mugging.java
  22. 14 8
      src/main/java/me/km/entities/EntityHuman.java
  23. 2 2
      src/main/java/me/km/entities/EntityItemProjectile.java
  24. 24 11
      src/main/java/me/km/entities/HumanSkinLoader.java
  25. 1 1
      src/main/java/me/km/environment/EnvironmentAPI.java
  26. 1 1
      src/main/java/me/km/events/CustomEventCaller.java
  27. 67 0
      src/main/java/me/km/items/ModItems.java
  28. 2 1
      src/main/java/me/km/items/tools/ItemAxe.java
  29. 4 2
      src/main/java/me/km/items/tools/ItemHammer.java
  30. 2 1
      src/main/java/me/km/items/tools/ItemHoe.java
  31. 2 1
      src/main/java/me/km/items/tools/ItemPickaxe.java
  32. 2 1
      src/main/java/me/km/items/tools/ItemSpade.java
  33. 28 0
      src/main/java/me/km/items/weapons/ItemBattleAxe.java
  34. 2 2
      src/main/java/me/km/items/weapons/ItemDagger.java
  35. 28 0
      src/main/java/me/km/items/weapons/ItemGreatSword.java
  36. 1 1
      src/main/java/me/km/items/weapons/ItemGun.java
  37. 27 0
      src/main/java/me/km/items/weapons/ItemSpear.java
  38. 3 2
      src/main/java/me/km/items/weapons/ItemStick.java
  39. 2 1
      src/main/java/me/km/items/weapons/ItemSword.java
  40. 2 2
      src/main/java/me/km/items/weapons/ItemWand.java
  41. 5 4
      src/main/java/me/km/items/weapons/ItemWeapon.java
  42. 3 3
      src/main/java/me/km/jobsystem/JobAPI.java
  43. 2 2
      src/main/java/me/km/jobsystem/JobBank.java
  44. 2 2
      src/main/java/me/km/networking/HumanUpdate.java
  45. 2 2
      src/main/java/me/km/playerbank/PlayerBank.java
  46. 2 2
      src/main/java/me/km/playerbank/PlayerManager.java
  47. 2 2
      src/main/java/me/km/plots/ProtectionBank.java
  48. 2 2
      src/main/java/me/km/plots/ProtectionBuyPlot.java
  49. 14 0
      src/main/java/me/km/recipes/ModRecipes.java
  50. 0 2
      src/main/java/me/km/scoreboard/ScoreboardAPI.java
  51. 0 50
      src/main/java/me/km/scoreboard/ScoreboardRefresher.java
  52. 19 5
      src/main/java/me/km/snuviscript/MinecraftFunctions.java
  53. 2 2
      src/main/java/me/km/snuviscript/ScriptBank.java
  54. 7 0
      src/main/resources/assets/km/blockstates/gravel_slab.json
  55. 11 0
      src/main/resources/assets/km/blockstates/lantern.json
  56. 28 0
      src/main/resources/assets/km/lang/en_US.lang
  57. 0 7
      src/main/resources/assets/km/models/block/camp_fire.json
  58. 0 7
      src/main/resources/assets/km/models/block/camp_fire_burning.json
  59. 0 5
      src/main/resources/assets/km/models/block/camp_fire_burnt.json
  60. 173 0
      src/main/resources/assets/km/models/block/lantern/cealing.json
  61. 149 0
      src/main/resources/assets/km/models/block/lantern/standing.json
  62. 193 0
      src/main/resources/assets/km/models/block/lantern/wall.json
  63. 8 0
      src/main/resources/assets/km/models/block/slabs/bottom_slab_gravel.json
  64. 8 0
      src/main/resources/assets/km/models/block/slabs/upper_slab_gravel.json
  65. 6 0
      src/main/resources/assets/km/models/item/bronze_battleaxe.json
  66. 6 0
      src/main/resources/assets/km/models/item/bronze_greatsword.json
  67. 6 0
      src/main/resources/assets/km/models/item/bronze_spear.json
  68. 6 0
      src/main/resources/assets/km/models/item/copper_battleaxe.json
  69. 6 0
      src/main/resources/assets/km/models/item/copper_greatsword.json
  70. 6 0
      src/main/resources/assets/km/models/item/copper_spear.json
  71. 6 0
      src/main/resources/assets/km/models/item/diamond_battleaxe.json
  72. 6 0
      src/main/resources/assets/km/models/item/diamond_greatsword.json
  73. 6 0
      src/main/resources/assets/km/models/item/diamond_spear.json
  74. 6 0
      src/main/resources/assets/km/models/item/gold_battleaxe.json
  75. 6 0
      src/main/resources/assets/km/models/item/gold_greatsword.json
  76. 6 0
      src/main/resources/assets/km/models/item/gold_spear.json
  77. 25 0
      src/main/resources/assets/km/models/item/handheld_battleaxe.json
  78. 25 0
      src/main/resources/assets/km/models/item/handheld_greatsword.json
  79. 25 0
      src/main/resources/assets/km/models/item/handheld_spear.json
  80. 6 0
      src/main/resources/assets/km/models/item/iron_battleaxe.json
  81. 6 0
      src/main/resources/assets/km/models/item/iron_greatsword.json
  82. 6 0
      src/main/resources/assets/km/models/item/iron_spear.json
  83. 6 0
      src/main/resources/assets/km/models/item/stone_battleaxe.json
  84. 6 0
      src/main/resources/assets/km/models/item/stone_greatsword.json
  85. 6 0
      src/main/resources/assets/km/models/item/stone_spear.json
  86. 6 0
      src/main/resources/assets/km/models/item/wood_battleaxe.json
  87. 6 0
      src/main/resources/assets/km/models/item/wood_greatsword.json
  88. 6 0
      src/main/resources/assets/km/models/item/wood_spear.json
  89. BIN
      src/main/resources/assets/km/textures/blocks/lantern/candle.png
  90. BIN
      src/main/resources/assets/km/textures/blocks/lantern/glass_dusty.png
  91. BIN
      src/main/resources/assets/km/textures/items/battleaxe/bronze_battleaxe.png
  92. BIN
      src/main/resources/assets/km/textures/items/battleaxe/copper_battleaxe.png
  93. BIN
      src/main/resources/assets/km/textures/items/battleaxe/diamond_battleaxe.png
  94. BIN
      src/main/resources/assets/km/textures/items/battleaxe/gold_battleaxe.png
  95. BIN
      src/main/resources/assets/km/textures/items/battleaxe/iron_battleaxe.png
  96. BIN
      src/main/resources/assets/km/textures/items/battleaxe/stone_battleaxe.png
  97. BIN
      src/main/resources/assets/km/textures/items/battleaxe/wood_battleaxe.png
  98. BIN
      src/main/resources/assets/km/textures/items/greatsword/bronze_greatsword.png
  99. BIN
      src/main/resources/assets/km/textures/items/greatsword/copper_greatsword.png
  100. BIN
      src/main/resources/assets/km/textures/items/greatsword/diamond_greatsword.png

+ 2 - 2
build.gradle

@@ -21,7 +21,7 @@ compileJava {
 }
 
 minecraft {
-    version = "1.12.1-14.22.0.2475"
+    version = "1.12.2-14.23.0.2537"
     runDir = "run"
     
     // the mappings can be changed at any time, and must be in the following format.
@@ -29,7 +29,7 @@ minecraft {
     // stable_#            stables are built at the discretion of the MCP team.
     // Use non-default mappings at your own risk. they may not always work.
     // simply re-run your setup task after changing the mappings to update your workspace.
-    mappings = "snapshot_20170624"
+    mappings = "snapshot_20171003"
     // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
 }
 

+ 37 - 24
src/main/java/me/km/KajetansMod.java

@@ -68,7 +68,7 @@ public class KajetansMod
 
     public static final String MODID = "km";
     public static final String NAME = "Kajetans Mod";
-    public static final String VERSION = "0.0.17";
+    public static final String VERSION = "0.0.18";
 
     @Mod.Instance(MODID)
     public static KajetansMod instance;
@@ -101,29 +101,21 @@ public class KajetansMod
                     try
                     {
                         net.minecraft.entity.player.EntityPlayerMP p = e.getPlayer();
-                        net.minecraft.util.math.BlockPos pos = Utils.getPlayerTarget(p);
                         String[] parts = e.getMessage().split(" ");
                         switch(parts[0])
                         {
-                            case "s0":
-                                ModPacketHandler.sendSeasonUpdate(p, (byte) 0);
+                            case "human":
+                                me.km.entities.EntityHuman human = new me.km.entities.EntityHuman(p.world);
+                                human.setPosition(p.posX, p.posY, p.posZ);
+                                p.world.spawnEntity(human);
                                 break;
-                            case "s1":
-                                ModPacketHandler.sendSeasonUpdate(p, (byte) 1);
+                            case "name":
+                                me.km.api.Utils.getEntities(p.world, p.posX, p.posY, p.posZ, 5, me.km.entities.EntityHuman.class)
+                                        .forEach(h -> h.setCustomNameTag(parts[1]));
                                 break;
-                            case "color":
-                                ((me.km.blocks.TileEntityCauldron) p.world.getTileEntity(pos))
-                                    .setColor(Integer.parseInt(parts[1]), Integer.parseInt(parts[2]), Integer.parseInt(parts[3]));
-                                break;
-                            case "ent":
-                                me.km.entities.EntityNobody ent = new me.km.entities.EntityNobody(p.world);
-                                ent.setLocationAndAngles(p.posX, p.posY, p.posZ, 0, 0);
-                                ent.setCustomNameTag("Test name");
-                                p.world.spawnEntity(ent);
-                                break;
-                            case "search":
-                                Utils.getEntities(p.world, p.posX, p.posY, p.posZ, 5, net.minecraft.entity.Entity.class)
-                                        .forEach(s -> System.out.println(s));
+                            case "skin":
+                                me.km.api.Utils.getEntities(p.world, p.posX, p.posY, p.posZ, 5, me.km.entities.EntityHuman.class)
+                                        .forEach(h -> h.setSkinName(parts[1]));
                                 break;
                         }
                     }
@@ -132,6 +124,25 @@ public class KajetansMod
                         ex.printStackTrace();
                     }
                 }
+                
+                @net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+                public void onCrafting(net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemCraftedEvent e)
+                {  
+                    if(e.player.world.isRemote)
+                    {
+                        System.out.println("CRAFT");
+                        int size = e.craftMatrix.getInventoryStackLimit();
+                        net.minecraft.item.ItemStack stack;
+                        for(int i = 0; i < size; i++)
+                        {
+                            stack = e.craftMatrix.getStackInSlot(i);
+                            if(!stack.isEmpty())
+                            {
+                                stack.shrink(1);
+                            }
+                        }
+                    }
+                }
             });*/
     }
     
@@ -182,7 +193,9 @@ public class KajetansMod
         databank = new DataBank("DataBank", "DataBank", TextFormatting.RED, conf.getString("user", "root"), conf.getString("password", ""));
         if(!databank.openDataBankConnection())
         {
-            return;
+            System.out.println("------------------------------------------------");
+            System.out.println("Starting server with dummy databank");
+            System.out.println("------------------------------------------------");
         }
 
         // Scheduler
@@ -190,7 +203,7 @@ public class KajetansMod
         scheduler.registerEvents("me.km.scheduler");
 
         // Spielerdatenbank
-        playerbank = new PlayerManager("PlayerBank", "PlayerBank", TextFormatting.RED, databank.getConnection());
+        playerbank = new PlayerManager("PlayerBank", "PlayerBank", TextFormatting.RED, databank);
         // databank is initialized in JobAPI in order to have a reference
         playerbank.registerEvents("me.km.playerbank");
         
@@ -210,13 +223,13 @@ public class KajetansMod
 
         // Plot-System
         plots = new Module("Plots", "Plots", TextFormatting.GOLD);
-        plots.setDataBank(new ProtectionBank(plots, databank.getConnection()));
+        plots.setDataBank(new ProtectionBank(plots, databank));
         plots.registerCommands(e, "me.km.plots");          
         plots.registerEvents("me.km.plots");
 
         // Chests- und Co-Protections
         blocks = new Module("BlockProtections", "Blocks", TextFormatting.BLUE);
-        blocks.setDataBank(new BlockProtectionBank(blocks, databank.getConnection()));
+        blocks.setDataBank(new BlockProtectionBank(blocks, databank));
         blocks.registerCommands(e, "me.km.blockprotections");          
         blocks.registerEvents("me.km.blockprotections");
 
@@ -232,7 +245,7 @@ public class KajetansMod
 
         // Scriptsystem
         scripts = new ScriptModule("Scripts", "Scripts", TextFormatting.LIGHT_PURPLE);
-        scripts.setDataBank(new ScriptBank(scripts, databank.getConnection()));
+        scripts.setDataBank(new ScriptBank(scripts, databank));
         scripts.registerCommands(e, "me.km.snuviscript");          
         scripts.registerEvents("me.km.snuviscript");
 

+ 34 - 2
src/main/java/me/km/ObjectRegistry.java

@@ -1,5 +1,7 @@
 package me.km;
 
+import java.util.List;
+import java.util.stream.Collectors;
 import me.km.blocks.ModBlocks;
 import me.km.fluids.ModFluids;
 import me.km.items.ModItems;
@@ -7,13 +9,17 @@ import me.km.recipes.ModRecipes;
 import me.km.sounds.Sounds;
 import net.minecraft.block.Block;
 import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
 import net.minecraft.item.Item;
 import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.SoundEvent;
 import net.minecraftforge.event.RegistryEvent;
+import net.minecraftforge.fml.common.FMLCommonHandler;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.registry.ForgeRegistries;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.registries.ForgeRegistry;
 
 @Mod.EventBusSubscriber
 public class ObjectRegistry 
@@ -46,7 +52,33 @@ public class ObjectRegistry
     @SubscribeEvent
     public static void onRecipeRegistry(RegistryEvent.Register<IRecipe> e) 
     {
-        ModRecipes.init(e.getRegistry());
+        if(FMLCommonHandler.instance().getSide() == Side.SERVER)
+        {
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("Registering recipes");
+            ModRecipes.init(e.getRegistry());
+        }
+        else
+        {
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("_______________________________________");
+            System.out.println("removing recipes");
+            // remove recipes
+            ForgeRegistry<IRecipe> recipeRegistry = (ForgeRegistry<IRecipe>) ForgeRegistries.RECIPES;
+            List<ResourceLocation> recipes = recipeRegistry.getKeys().stream().collect(Collectors.toList());
+            recipes.forEach(key -> recipeRegistry.remove(key));
+        }
     }
     
     @SubscribeEvent

+ 4 - 8
src/main/java/me/km/api/Utils.java

@@ -12,10 +12,10 @@ import me.km.KajetansMod;
 import me.km.dimensions.ModTeleporter;
 import me.km.entities.EntityItemProjectile;
 import me.km.exception.PlayerNotFoundException;
-import me.km.items.ItemDagger;
-import me.km.items.ItemHammer;
-import me.km.items.ItemStick;
-import me.km.items.ItemWand;
+import me.km.items.weapons.ItemDagger;
+import me.km.items.tools.ItemHammer;
+import me.km.items.weapons.ItemStick;
+import me.km.items.weapons.ItemWand;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.block.Block;
@@ -27,8 +27,6 @@ import net.minecraft.block.BlockTrapDoor;
 import net.minecraft.block.properties.IProperty;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.enchantment.EnchantmentHelper;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.SharedMonsterAttributes;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.entity.projectile.EntityArrow;
 import net.minecraft.entity.projectile.EntityFireball;
@@ -36,7 +34,6 @@ import net.minecraft.entity.projectile.EntityThrowable;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Enchantments;
 import net.minecraft.init.Items;
-import net.minecraft.init.MobEffects;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemAxe;
 import net.minecraft.item.ItemHoe;
@@ -52,7 +49,6 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraft.nbt.NBTUtil;
 import net.minecraft.network.play.server.SPacketEntityVelocity;
 import net.minecraft.tileentity.TileEntitySkull;
-import net.minecraft.util.CombatRules;
 import net.minecraft.util.DamageSource;
 import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.world.WorldServer;

+ 2 - 4
src/main/java/me/km/blockprotections/BlockProtectionBank.java

@@ -6,20 +6,18 @@ import me.km.api.GlobalText;
 import me.km.api.Module;
 import me.km.playerbank.PlayerBank;
 import me.km.databank.SimpleDataBank;
-import java.sql.Connection;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
-import me.km.api.Location;
+import me.km.databank.DataBank;
 import me.km.dimensions.ModDimensions;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.Vec3d;
 import net.minecraft.world.World;
 
 public class BlockProtectionBank extends SimpleDataBank
 {  
-    public BlockProtectionBank(Module m, Connection c) 
+    public BlockProtectionBank(Module m, DataBank c) 
     {
         super(m, c);
     }

+ 1 - 1
src/main/java/me/km/blocks/BlockCampFireBurning.java

@@ -24,7 +24,7 @@ public class BlockCampFireBurning extends BlockCampFire implements ITileEntityPr
     public BlockCampFireBurning(String name, String local) 
     {
         super(name, local);
-        this.isBlockContainer = true;
+        this.hasTileEntity = true;
     }
 
     @Override

+ 273 - 0
src/main/java/me/km/blocks/BlockLantern.java

@@ -0,0 +1,273 @@
+package me.km.blocks;
+
+import java.util.Random;
+import me.km.KajetansMod;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockDirectional;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.properties.IProperty;
+import net.minecraft.block.state.BlockFaceShape;
+import net.minecraft.block.state.BlockStateContainer;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.Item;
+import net.minecraft.util.BlockRenderLayer;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumParticleTypes;
+import net.minecraft.util.Mirror;
+import net.minecraft.util.Rotation;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+public class BlockLantern extends BlockDirectional implements IBlockBase
+{
+    protected static final AxisAlignedBB HANGING_AABB = new AxisAlignedBB(0.1875d, 0.125d, 0.1875d, 0.8125d, 1, 0.875d);
+    protected static final AxisAlignedBB STANDING_AABB = new AxisAlignedBB(0.1875d, 0, 0.1875d, 0.8125d, 0.75d, 0.875d);
+    
+    protected static final AxisAlignedBB TORCH_NORTH_AABB = new AxisAlignedBB(0.1875d, 0, 0.375d, 0.8125d, 1, 1);
+    protected static final AxisAlignedBB TORCH_SOUTH_AABB = new AxisAlignedBB(0.1875d, 0, 0, 0.8125d, 1, 0.625d);
+    protected static final AxisAlignedBB TORCH_WEST_AABB = new AxisAlignedBB(0.375d, 0, 0.1875d, 1, 1, 0.8125d);
+    protected static final AxisAlignedBB TORCH_EAST_AABB = new AxisAlignedBB(0, 0, 0.1875d, 0.625d, 1, 0.8125d);
+    
+    protected String name;
+    
+    public BlockLantern(String name, String local) 
+    {
+        super(Material.IRON);
+        this.name = name;
+        super.setHardness(0.0F);
+        super.setLightLevel(0.9375F);
+        super.setSoundType(SoundType.METAL);
+        this.setRegistryName(name);
+        super.setUnlocalizedName(local);
+        super.setCreativeTab(CreativeTabs.DECORATIONS);
+        
+        this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.UP));
+        super.setTickRandomly(true);
+    }
+
+    @Override
+    public void registerItemModel(Item itemBlock) 
+    {
+        KajetansMod.proxy.registerItemRenderer(itemBlock, 0, name);
+    }
+
+    @Override
+    public BlockLantern setSoundType(SoundType sound) 
+    {
+        super.setSoundType(sound);
+        return this;
+    }
+
+    @Override
+    public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess w, BlockPos pos)
+    {
+        return NULL_AABB;
+    }
+
+    @Override
+    public boolean isOpaqueCube(IBlockState state)
+    {
+        return false;
+    }
+
+    @Override
+    public boolean isFullCube(IBlockState state)
+    {
+        return false;
+    }
+
+    @Override
+    public boolean canPlaceBlockOnSide(World w, BlockPos pos, EnumFacing side)
+    {
+        return canPlaceBlock(w, pos, side);
+    }
+
+    @Override
+    public boolean canPlaceBlockAt(World worldIn, BlockPos pos)
+    {
+        for(EnumFacing enumfacing : EnumFacing.values())
+        {
+            if(canPlaceBlock(worldIn, pos, enumfacing))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected static boolean canPlaceBlock(World w, BlockPos pos, EnumFacing direction)
+    {
+        BlockPos blockpos = pos.offset(direction.getOpposite());
+        IBlockState state = w.getBlockState(blockpos);
+        Block block = state.getBlock();
+        if(direction == EnumFacing.UP)
+        {
+            return block.canPlaceTorchOnTop(state, w, pos);
+        }
+        else
+        {
+            return !isExceptBlockForAttachWithPiston(block) && state.getBlockFaceShape(w, blockpos, direction) == BlockFaceShape.SOLID;
+        }
+    }
+
+    @Override
+    public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
+    {
+        return canPlaceBlock(worldIn, pos, facing) ? this.getDefaultState().withProperty(FACING, facing) : this.getDefaultState().withProperty(FACING, EnumFacing.DOWN);
+    }
+
+    @Override
+    public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos)
+    {
+        if(this.checkForDrop(worldIn, pos, state) && !canPlaceBlock(worldIn, pos, state.getValue(FACING)))
+        {
+            this.dropBlockAsItem(worldIn, pos, state, 0);
+            worldIn.setBlockToAir(pos);
+        }
+    }
+
+    private boolean checkForDrop(World worldIn, BlockPos pos, IBlockState state)
+    {
+        if(this.canPlaceBlockAt(worldIn, pos))
+        {
+            return true;
+        }
+        else
+        {
+            this.dropBlockAsItem(worldIn, pos, state, 0);
+            worldIn.setBlockToAir(pos);
+            return false;
+        }
+    }
+
+    @Override
+    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
+    {
+        EnumFacing enumfacing = (EnumFacing) state.getValue(FACING);
+        switch(enumfacing)
+        {
+            case EAST:
+                return TORCH_EAST_AABB;
+            case WEST:
+                return TORCH_WEST_AABB;
+            case SOUTH:
+                return TORCH_SOUTH_AABB;
+            case NORTH:
+            default:
+                return TORCH_NORTH_AABB;
+            case UP:
+                return STANDING_AABB;
+            case DOWN:
+                return HANGING_AABB;
+        }
+    }
+
+    @Override
+    public IBlockState getStateFromMeta(int meta)
+    {
+        EnumFacing enumfacing;
+        switch(meta & 7)
+        {
+            case 0:
+                enumfacing = EnumFacing.DOWN;
+                break;
+            case 1:
+                enumfacing = EnumFacing.EAST;
+                break;
+            case 2:
+                enumfacing = EnumFacing.WEST;
+                break;
+            case 3:
+                enumfacing = EnumFacing.SOUTH;
+                break;
+            case 4:
+                enumfacing = EnumFacing.NORTH;
+                break;
+            case 5:
+            default:
+                enumfacing = EnumFacing.UP;
+        }
+        return this.getDefaultState().withProperty(FACING, enumfacing);
+    }
+
+    @Override
+    public int getMetaFromState(IBlockState state)
+    {
+        switch(state.getValue(FACING))
+        {
+            case EAST: return 1;
+            case WEST: return 2;
+            case SOUTH: return 3;
+            case NORTH: return 4;
+            case UP:
+            default: return 5;
+            case DOWN: return 0;
+        }
+    }
+
+    @Override
+    public IBlockState withRotation(IBlockState state, Rotation rot)
+    {
+        return state.withProperty(FACING, rot.rotate(state.getValue(FACING)));
+    }
+
+    @Override
+    public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
+    {
+        return state.withRotation(mirrorIn.toRotation(state.getValue(FACING)));
+    }
+
+    @Override
+    protected BlockStateContainer createBlockState()
+    {
+        return new BlockStateContainer(this, new IProperty[] {FACING});
+    }
+
+    @Override
+    public BlockFaceShape getBlockFaceShape(IBlockAccess p_193383_1_, IBlockState p_193383_2_, BlockPos p_193383_3_, EnumFacing p_193383_4_)
+    {
+        return BlockFaceShape.UNDEFINED;
+    }
+
+    @SideOnly(Side.CLIENT)
+    @Override
+    public void randomDisplayTick(IBlockState state, World w, BlockPos pos, Random rand)
+    {
+        EnumFacing face = state.getValue(FACING);
+        double x = pos.getX() + 0.5D;
+        double y = pos.getY() + 0.7D;
+        double z = pos.getZ() + 0.5D;
+        switch(face)
+        {
+            case EAST:
+            case WEST:
+            case SOUTH:
+            case NORTH:
+                EnumFacing oface = face.getOpposite();
+                x += 0.1875d * oface.getFrontOffsetX();
+                z += 0.1875d * oface.getFrontOffsetZ();
+                break;
+            case DOWN:
+                break;
+            case UP:
+                y -= 0.125d;
+                break;
+        }
+        w.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x, y , z, 0, 0, 0);
+        w.spawnParticle(EnumParticleTypes.FLAME, x, y, z, 0, 0, 0);
+    }
+
+    @SideOnly(Side.CLIENT)
+    @Override
+    public BlockRenderLayer getBlockLayer()
+    {
+        return BlockRenderLayer.TRANSLUCENT;
+    }
+}

+ 1 - 1
src/main/java/me/km/blocks/BlockModBed.java

@@ -52,7 +52,7 @@ public abstract class BlockModBed extends BlockHorizontal
         super(Material.CLOTH);
         this.setDefaultState(this.blockState.getBaseState().withProperty(PART, BlockBed.EnumPartType.FOOT)
                         .withProperty(OCCUPIED, false));
-        this.isBlockContainer = true;
+        this.hasTileEntity = true;
         
         this.name = name;
         this.setRegistryName(name);

+ 110 - 0
src/main/java/me/km/blocks/BlockModSlab.java

@@ -0,0 +1,110 @@
+package me.km.blocks;
+
+import me.km.KajetansMod;
+import net.minecraft.block.BlockSlab;
+import static net.minecraft.block.BlockSlab.HALF;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.properties.IProperty;
+import net.minecraft.block.state.BlockStateContainer;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.BlockRenderLayer;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+public class BlockModSlab extends BlockSlab implements IBlockBase
+{
+    protected String name;
+    
+    public BlockModSlab(Material material, String name, String local)
+    {
+        super(material);
+        this.name = name;
+        this.setRegistryName(name);
+        super.setUnlocalizedName(local);
+        super.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
+        
+        this.setDefaultState(this.blockState.getBaseState().withProperty(HALF, BlockSlab.EnumBlockHalf.BOTTOM));
+        super.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
+        super.useNeighborBrightness = true;
+    }
+    
+    @Override
+    public void registerItemModel(Item itemBlock) 
+    {
+        KajetansMod.proxy.registerItemRenderer(itemBlock, 0, name);
+    }
+    
+    @Override
+    public BlockModSlab setSoundType(SoundType sound) 
+    {
+        super.setSoundType(sound);
+        return this;
+    }
+
+    @Override
+    public IBlockState getStateFromMeta(int meta)
+    {
+        IBlockState iblockstate = this.getDefaultState();
+        if(!this.isDouble())
+        {
+            iblockstate = iblockstate.withProperty(HALF, (meta & 8) == 0 ? BlockSlab.EnumBlockHalf.BOTTOM : BlockSlab.EnumBlockHalf.TOP);
+        }
+        return iblockstate;
+    }
+
+    @Override
+    public int getMetaFromState(IBlockState state)
+    {
+        int i = 0;
+        if(state.getValue(HALF) == BlockSlab.EnumBlockHalf.TOP)
+        {
+            i |= 8;
+        }
+        return i;
+    }
+
+    @Override
+    protected BlockStateContainer createBlockState()
+    {
+        if(this.isDouble())
+        {
+            return new BlockStateContainer(this);
+        }
+        return new BlockStateContainer(this, new IProperty[] {HALF});
+    }
+
+    @Override
+    public IProperty<?> getVariantProperty()
+    {
+        return null;
+    }
+
+    @Override
+    public Comparable<?> getTypeForItem(ItemStack stack)
+    {
+        return null;
+    }
+
+    @Override
+    public String getUnlocalizedName(int meta) 
+    {
+        return super.getUnlocalizedName();
+    }
+    
+    @Override
+    public boolean isDouble()
+    {
+        return false;
+    }
+    
+    @SideOnly(Side.CLIENT)
+    @Override
+    public BlockRenderLayer getBlockLayer()
+    {
+        return BlockRenderLayer.CUTOUT;
+    }
+}

+ 1 - 1
src/main/java/me/km/blocks/BlockNoTrampleFarmland.java

@@ -13,7 +13,7 @@ public class BlockNoTrampleFarmland extends BlockFarmland
         super.setHardness(0.6F);
         super.setSoundType(SoundType.GROUND);
         super.setUnlocalizedName("farmland");
-        super.setLightOpacity(0);
+        super.useNeighborBrightness = true;
     }
     
     @Override

+ 1 - 1
src/main/java/me/km/blocks/EnumMetals.java

@@ -13,7 +13,7 @@ public enum EnumMetals implements IStringSerializable
     BRONZE(2, "bronze", MapColor.YELLOW, ModItems.bronzeIngot),
     GOLD(3, "gold", MapColor.GOLD, Items.GOLD_INGOT),
     IRON(4, "iron", MapColor.IRON, Items.IRON_INGOT),
-    SILVER(5, "silver", MapColor.IRON, ModItems.silverIngot);
+    SILVER(5, "silver", MapColor.SILVER, ModItems.silverIngot);
 
     private static final EnumMetals[] META_LOOKUP = new EnumMetals[values().length];
     private final int meta;

+ 16 - 0
src/main/java/me/km/blocks/ModBlocks.java

@@ -6,6 +6,7 @@ import me.km.fluids.BlockFluidPoison;
 import me.km.fluids.ModFluids;
 import me.km.items.ItemMetal;
 import net.minecraft.block.Block;
+import net.minecraft.block.SoundType;
 import net.minecraft.block.material.MapColor;
 import net.minecraft.block.material.Material;
 import net.minecraft.creativetab.CreativeTabs;
@@ -60,6 +61,8 @@ public class ModBlocks
     public static BlockCampFireBurning campFireBurning;
     public static BlockCampFireBurnt campFireBurnt;
     
+    public static BlockLantern lantern;
+    
     // traps
     public static BlockSpikeTrap spikes;
     
@@ -67,6 +70,9 @@ public class ModBlocks
     public static BlockFluidPoison poison;
     public static BlockFluidHoney honey;
     
+    // slabs
+    public static BlockModSlab gravelSlab;
+    
     public static void initBlocks(IForgeRegistry<Block> r) 
     {
         // ores + blocks
@@ -117,6 +123,8 @@ public class ModBlocks
         campFireBurnt = register(r, new BlockCampFireBurnt("camp_fire_burnt", "campFireBurnt"));
         GameRegistry.registerTileEntity(TileEntityCampFire.class, campFireBurning.getRegistryName().toString());
         
+        lantern = register(r, new BlockLantern("lantern", "lantern"));
+        
         // traps
         spikes = register(r, new BlockSpikeTrap(Material.IRON, "spikes", "spikes"));
     
@@ -124,6 +132,9 @@ public class ModBlocks
         poison = register(r, new BlockFluidPoison(ModFluids.poison, Material.WATER));
         honey = register(r, new BlockFluidHoney(ModFluids.honey, Material.WATER));
         
+        // slabs
+        gravelSlab = register(r, (BlockModSlab) new BlockModSlab(Material.SAND, "gravel_slab", "gravelSlab").setSoundType(SoundType.GROUND).setHardness(0.6F));
+        
         // overwrites
         register(r, Blocks.FARMLAND, new BlockNoTrampleFarmland());
     }
@@ -175,12 +186,17 @@ public class ModBlocks
         register(r, barrelOak, getItemBlock(barrelOak));
         register(r, barrelSpruce, getItemBlock(barrelSpruce));
         
+        register(r, lantern, getItemBlock(lantern));
+        
         // traps
         register(r, spikes, getItemMetal(spikes));
         
         // fluids
         register(r, poison, getItemBlock(poison));
         register(r, honey, getItemBlock(honey));
+        
+        // slabs
+        register(r, gravelSlab, getItemBlock(gravelSlab));
     }
 
     private static void register(IForgeRegistry<Item> r, Block block, Item itemBlock) 

+ 1 - 1
src/main/java/me/km/chatmanager/ChatListener.java

@@ -20,7 +20,7 @@ public class ChatListener extends ModuleListener
     
     @SubscribeEvent
     public void onChatEvent(ServerChatEvent e)
-    {
+    {    
         e.setComponent(new TextComponentString(
                         KajetansMod.chatManager.getFullName(e.getPlayer()) + "§1 | §r"  + 
                                 ChatManager.colorMessage(e.getMessage(), e.getPlayer())));

+ 1 - 1
src/main/java/me/km/chatmanager/ChatManager.java

@@ -26,7 +26,7 @@ public class ChatManager extends Module
         ranks = new HashMap<>();
         fakeRank = new HashMap<>(); 
         nickname = new HashMap<>(); 
-        fallback = "§8";
+        fallback = "§8Θ";
         playerRanks = new HashMap<>();
     }
 

+ 7 - 10
src/main/java/me/km/databank/DataBank.java

@@ -3,11 +3,14 @@ package me.km.databank;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
+import java.sql.Statement;
 import me.km.api.Module;
 import net.minecraft.util.text.TextFormatting;
 
 public class DataBank extends Module
 {
+    private final static DummyStatement DUMMY_STATEMENT = new DummyStatement();
+    
     private Connection c;
     private final String user;
     private final String password;
@@ -53,18 +56,12 @@ public class DataBank extends Module
         }
     }
     
-    public Connection getConnection()
+    public Statement createStatement() throws SQLException
     {
-        /*try 
+        if(c == null)
         {
-            if(c.isClosed())
-            {
-                openDataBankConnection();
-            }
+            return DUMMY_STATEMENT;
         }
-        catch(SQLException ex) 
-        {
-        }*/
-        return c;
+        return c.createStatement();
     } 
 }

+ 273 - 0
src/main/java/me/km/databank/DummyStatement.java

@@ -0,0 +1,273 @@
+package me.km.databank;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.sql.Statement;
+
+public class DummyStatement implements Statement
+{
+    @Override
+    public ResultSet executeQuery(String sql) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int executeUpdate(String sql) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void close() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getMaxFieldSize() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setMaxFieldSize(int max) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getMaxRows() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setMaxRows(int max) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setEscapeProcessing(boolean enable) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getQueryTimeout() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setQueryTimeout(int seconds) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void cancel() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public SQLWarning getWarnings() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void clearWarnings() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setCursorName(String name) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean execute(String sql) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public ResultSet getResultSet() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getUpdateCount() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean getMoreResults() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setFetchDirection(int direction) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getFetchDirection() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setFetchSize(int rows) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getFetchSize() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getResultSetConcurrency() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getResultSetType() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void addBatch(String sql) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void clearBatch() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int[] executeBatch() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public Connection getConnection() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean getMoreResults(int current) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public ResultSet getGeneratedKeys() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int executeUpdate(String sql, int[] columnIndexes) throws SQLException
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int executeUpdate(String sql, String[] columnNames) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean execute(String sql, int autoGeneratedKeys) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean execute(String sql, int[] columnIndexes) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean execute(String sql, String[] columnNames) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public int getResultSetHoldability() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean isClosed() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void setPoolable(boolean poolable) throws SQLException 
+    {
+    }
+
+    @Override
+    public boolean isPoolable() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public void closeOnCompletion() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean isCloseOnCompletion() throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public <T> T unwrap(Class<T> iface) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+
+    @Override
+    public boolean isWrapperFor(Class<?> iface) throws SQLException 
+    {
+        throw new SQLException("Dummy Handler");
+    }
+}

+ 2 - 2
src/main/java/me/km/databank/SimpleDataBank.java

@@ -11,10 +11,10 @@ import me.km.table.Table;
 
 public abstract class SimpleDataBank 
 {
-    private final Connection c;
+    private final DataBank c;
     private final Module m;
     
-    public SimpleDataBank(Module m, Connection c)
+    public SimpleDataBank(Module m, DataBank c)
     {
         this.c = c;
         this.m = m;

+ 1 - 1
src/main/java/me/km/datatools/CommandHuman.java

@@ -81,7 +81,7 @@ public class CommandHuman extends ModuleCommand
                         m.send(cs, "Du musst auf einen Human gerichtet sein.");
                         return true;
                     }       
-                    h.setName(arg[1]);
+                    h.setSkinName(arg[1]);
                     m.send(cs, "Die Daten wurden geändert.");
                     return true;
                 }

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

@@ -5,7 +5,7 @@ import java.util.stream.Collectors;
 import me.km.api.GlobalText;
 import me.km.api.Module;
 import me.km.api.ModuleTabCommand;
-import me.km.items.ItemWand;
+import me.km.items.weapons.ItemWand;
 import me.km.items.ModItems;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;

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

@@ -201,27 +201,27 @@ public class EffectUtils
         else if(EntitySnowball.class == projectile) 
         {
             launch = new EntitySnowball(w, p);
-            ((EntitySnowball) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+            ((EntitySnowball) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
         } 
         else if(EntityEgg.class == projectile)
         {
             launch = new EntityEgg(w, p);
-            ((EntityEgg) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+            ((EntityEgg) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
         } 
         else if(EntityEnderPearl.class == projectile) 
         {
             launch = new EntityEnderPearl(w, p);
-            ((EntityEnderPearl) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+            ((EntityEnderPearl) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
         } 
         else if(EntityPotion.class == projectile) 
         {
             launch = new EntityPotion(w, p, (ItemStack) data);
-            ((EntityPotion) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, -20.0f, 0.5f, 1.0f);
+            ((EntityPotion) launch).shoot(p, p.rotationPitch, p.rotationYaw, -20.0f, 0.5f, 1.0f);
         } 
         else if(EntityExpBottle.class == projectile) 
         {
             launch = new EntityExpBottle(w, p);
-            ((EntityExpBottle) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, -20.0f, 0.7f, 1.0f);
+            ((EntityExpBottle) launch).shoot(p, p.rotationPitch, p.rotationYaw, -20.0f, 0.7f, 1.0f);
         } 
         else if(EntityArrow.class.isAssignableFrom(projectile)) 
         {
@@ -238,7 +238,7 @@ public class EffectUtils
             {
                 launch = new EntityTippedArrow(w, p);
             }
-            ((EntityArrow) launch).setAim(p, p.rotationPitch, p.rotationYaw, 0.0F, 3.0F, 1.0F);
+            ((EntityArrow) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0F, 3.0F, 1.0F);
         } 
         else if(EntityFireball.class.isAssignableFrom(projectile)) 
         {

+ 1 - 1
src/main/java/me/km/effects/passive/Mugging.java

@@ -9,7 +9,7 @@ import me.km.api.Utils;
 import me.km.effects.Effect;
 import me.km.effects.EffectUtils;
 import me.km.inventory.InventoryUtils;
-import me.km.items.ItemDagger;
+import me.km.items.weapons.ItemDagger;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.monster.EntityMob;
 import net.minecraft.entity.passive.EntityVillager;

+ 14 - 8
src/main/java/me/km/entities/EntityHuman.java

@@ -41,7 +41,7 @@ public class EntityHuman extends EntityCreature implements IEntityAdditionalSpaw
     
     public EntityHuman(World w)
     {
-        super(w);
+        super(w);       
         this.name = STEVE;
         this.scale = 1;
         this.originalWidth = width;
@@ -197,7 +197,7 @@ public class EntityHuman extends EntityCreature implements IEntityAdditionalSpaw
         this.tasks.addTask(2, new EntityAIWatchClosest(this, EntityLiving.class, 8.0F));
     }
     
-    public void setName(String name)
+    public void setSkinName(String name)
     {
         this.name = name;
         if(!this.world.isRemote)
@@ -205,6 +205,11 @@ public class EntityHuman extends EntityCreature implements IEntityAdditionalSpaw
             ModPacketHandler.sendHumanUpdate(this);
         }
     }   
+    
+    public String getSkinName()
+    {
+        return name;
+    }
 
     @Override
     protected void applyEntityAttributes()
@@ -276,12 +281,6 @@ public class EntityHuman extends EntityCreature implements IEntityAdditionalSpaw
     {
         return true;
     }
-    
-    @Override
-    public String getName()
-    {
-        return name;
-    }
 
     @Override
     public ITextComponent getDisplayName()
@@ -297,6 +296,7 @@ public class EntityHuman extends EntityCreature implements IEntityAdditionalSpaw
         {
             f -= 0.08F;
         }
+        f *= scale;
         return f;
     }
 
@@ -304,4 +304,10 @@ public class EntityHuman extends EntityCreature implements IEntityAdditionalSpaw
     {
         return 1.62F;
     }
+    
+    @Override
+    protected boolean canDespawn()
+    {
+        return false;
+    }
 }

+ 2 - 2
src/main/java/me/km/entities/EntityItemProjectile.java

@@ -45,7 +45,7 @@ public class EntityItemProjectile extends EntityItem implements IProjectile
         float f = -MathHelper.sin(rotationYawIn * 0.017453292F) * MathHelper.cos(rotationPitchIn * 0.017453292F);
         float f1 = -MathHelper.sin((rotationPitchIn + pitchOffset) * 0.017453292F);
         float f2 = MathHelper.cos(rotationYawIn * 0.017453292F) * MathHelper.cos(rotationPitchIn * 0.017453292F);
-        this.setThrowableHeading(f, f1, f2, velocity, inaccuracy);
+        this.shoot(f, f1, f2, velocity, inaccuracy);
         this.motionX += entityThrower.motionX;
         this.motionZ += entityThrower.motionZ;
 
@@ -56,7 +56,7 @@ public class EntityItemProjectile extends EntityItem implements IProjectile
     }
     
     @Override
-    public void setThrowableHeading(double x, double y, double z, float velocity, float inaccuracy)
+    public void shoot(double x, double y, double z, float velocity, float inaccuracy)
     {
         float f = MathHelper.sqrt(x * x + y * y + z * z);
         x = x / (double)f;

+ 24 - 11
src/main/java/me/km/entities/HumanSkinLoader.java

@@ -54,13 +54,13 @@ public class HumanSkinLoader
                     loading.remove(name);
                     delayed.accept(rloc);
                     
-                     ArrayList<Consumer<ResourceLocation>> list = queue.get(name);
-                     if(list != null)
-                     {
-                         list.forEach(c -> c.accept(rloc));
-                         list.clear();
-                         queue.remove(name);
-                     }
+                    ArrayList<Consumer<ResourceLocation>> list = queue.get(name);
+                    if(list != null)
+                    {
+                        list.forEach(c -> c.accept(rloc));
+                        list.clear();
+                        queue.remove(name);
+                    }
                 });
             }
             else
@@ -85,16 +85,29 @@ public class HumanSkinLoader
             HttpURLConnection httpurlconnection = null;
             try
             {
-                httpurlconnection = (HttpURLConnection)(new URL("http://skins.minecraft.net/MinecraftSkins/" + name + ".png"))
+                //httpurlconnection = (HttpURLConnection)(new URL("http://skins.minecraft.net/MinecraftSkins/" + name + ".png"))
+                httpurlconnection = (HttpURLConnection) (new URL("http://skins.hammerle.me/" + name + ".png"))
                         .openConnection(Minecraft.getMinecraft().getProxy());
                 httpurlconnection.setDoInput(true);
                 httpurlconnection.setDoOutput(false);
                 httpurlconnection.connect();
 
-                if(httpurlconnection.getResponseCode() != 200)
+                int code = httpurlconnection.getResponseCode();
+                if(code != 200)
                 {
-                    System.out.println("Server response code did not return 200, skin servers might be down.");
-                    return;
+                    // Failed own server, trying mojangs
+                    httpurlconnection.disconnect();
+                    httpurlconnection = (HttpURLConnection) (new URL("http://skins.minecraft.net/MinecraftSkins/" + name + ".png"))
+                            .openConnection(Minecraft.getMinecraft().getProxy());
+                    httpurlconnection.setDoInput(true);
+                    httpurlconnection.setDoOutput(false);
+                    httpurlconnection.connect();
+                    code = httpurlconnection.getResponseCode();
+                    if(code != 200)
+                    {
+                        System.out.println("Server response code did return " + code + ", skin servers might be down.");
+                        return;
+                    }
                 }
                 
                 BufferedImage image = converter.parseUserSkin(ImageIO.read(httpurlconnection.getInputStream()));

+ 1 - 1
src/main/java/me/km/environment/EnvironmentAPI.java

@@ -169,7 +169,7 @@ public class EnvironmentAPI
     
     public static int getTemperature(World w, BlockPos pos)
     {
-        double d = w.getBiome(pos).getTemperature();
+        double d = w.getBiome(pos).getDefaultTemperature();
         d -= (((pos.getY() - 65) * 0.05) / 30) + 0.3;
         d += (w.getLightFromNeighbors(pos) * 0.3) / 15;
         try

+ 1 - 1
src/main/java/me/km/events/CustomEventCaller.java

@@ -23,7 +23,7 @@ public class CustomEventCaller
         if(e.phase == TickEvent.Phase.END)
         {
             EntityPlayer p = e.player;
-            if(p.lastTickPosX != p.posX || p.lastTickPosY != p.posY || p.lastTickPosZ != p.posZ)
+            if(p.prevPosX != p.posX || p.prevPosY != p.posY || p.prevPosZ != p.posZ)
             {
                 MinecraftForge.EVENT_BUS.post(new PlayerMoveEvent(p));
             }  

+ 67 - 0
src/main/java/me/km/items/ModItems.java

@@ -1,5 +1,15 @@
 package me.km.items;
 
+import me.km.items.weapons.ItemWand;
+import me.km.items.weapons.ItemSword;
+import me.km.items.weapons.ItemStick;
+import me.km.items.tools.ItemSpade;
+import me.km.items.tools.ItemPickaxe;
+import me.km.items.tools.ItemHoe;
+import me.km.items.tools.ItemHammer;
+import me.km.items.tools.ItemAxe;
+import me.km.items.weapons.ItemGun;
+import me.km.items.weapons.ItemDagger;
 import me.km.items.herbs.ItemHerbs;
 import me.km.items.noglint.ItemNoGlintPotion;
 import me.km.KajetansMod;
@@ -9,6 +19,9 @@ import me.km.items.herbs.ItemAquaHerb;
 import me.km.items.herbs.ItemGoldHerb;
 import me.km.items.noglint.ItemNoGlintLingeringPotion;
 import me.km.items.noglint.ItemNoGlintSplashPotion;
+import me.km.items.weapons.ItemBattleAxe;
+import me.km.items.weapons.ItemGreatSword;
+import me.km.items.weapons.ItemSpear;
 import me.km.sounds.Sounds;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.init.Items;
@@ -159,6 +172,33 @@ public class ModItems
     public static ItemHammer goldHammer;
     public static ItemHammer diamondHammer;
     
+    // spear
+    public static ItemSpear woodenSpear;
+    public static ItemSpear stoneSpear;
+    public static ItemSpear copperSpear;
+    public static ItemSpear bronzeSpear;
+    public static ItemSpear ironSpear;
+    public static ItemSpear goldSpear;
+    public static ItemSpear diamondSpear;
+    
+    // great sword
+    public static ItemGreatSword woodenGreatSword;
+    public static ItemGreatSword stoneGreatSword;
+    public static ItemGreatSword copperGreatSword;
+    public static ItemGreatSword bronzeGreatSword;
+    public static ItemGreatSword ironGreatSword;
+    public static ItemGreatSword goldGreatSword;
+    public static ItemGreatSword diamondGreatSword;
+    
+    // great sword
+    public static ItemBattleAxe woodenBattleAxe;
+    public static ItemBattleAxe stoneBattleAxe;
+    public static ItemBattleAxe copperBattleAxe;
+    public static ItemBattleAxe bronzeBattleAxe;
+    public static ItemBattleAxe ironBattleAxe;
+    public static ItemBattleAxe goldBattleAxe;
+    public static ItemBattleAxe diamondBattleAxe;
+    
     // guns
     public static ItemBase revolverBullet;
     public static ItemBase musketAmmunition;
@@ -298,6 +338,33 @@ public class ModItems
         goldHammer = register(r, new ItemHammer("gold_hammer", "hammerGold", Item.ToolMaterial.GOLD));
         diamondHammer = register(r, new ItemHammer("diamond_hammer", "hammerDiamond", Item.ToolMaterial.DIAMOND));
         
+        // spear
+        woodenSpear = register(r, new ItemSpear("wood_spear", "spearWood", Item.ToolMaterial.WOOD));
+        stoneSpear = register(r, new ItemSpear("stone_spear", "spearStone", Item.ToolMaterial.STONE));
+        copperSpear = register(r, new ItemSpear("copper_spear", "spearCopper", TOOL_COPPER));
+        bronzeSpear = register(r, new ItemSpear("bronze_spear", "spearBronze", TOOL_BRONZE));
+        ironSpear = register(r, new ItemSpear("iron_spear", "spearIron", Item.ToolMaterial.IRON));
+        goldSpear = register(r, new ItemSpear("gold_spear", "spearGold", Item.ToolMaterial.GOLD));
+        diamondSpear = register(r, new ItemSpear("diamond_spear", "spearDiamond", Item.ToolMaterial.DIAMOND));
+        
+        // great sword
+        woodenGreatSword = register(r, new ItemGreatSword("wood_greatsword", "greatSwordWood", Item.ToolMaterial.WOOD));
+        stoneGreatSword = register(r, new ItemGreatSword("stone_greatsword", "greatSwordStone", Item.ToolMaterial.STONE));
+        copperGreatSword = register(r, new ItemGreatSword("copper_greatsword", "greatSwordCopper", TOOL_COPPER));
+        bronzeGreatSword = register(r, new ItemGreatSword("bronze_greatsword", "greatSwordBronze", TOOL_BRONZE));
+        ironGreatSword = register(r, new ItemGreatSword("iron_greatsword", "greatSwordIron", Item.ToolMaterial.IRON));
+        goldGreatSword = register(r, new ItemGreatSword("gold_greatsword", "greatSwordGold", Item.ToolMaterial.GOLD));
+        diamondGreatSword = register(r, new ItemGreatSword("diamond_greatsword", "greatSwordDiamond", Item.ToolMaterial.DIAMOND));
+        
+        // battle axe
+        woodenBattleAxe = register(r, new ItemBattleAxe("wood_battleaxe", "battleAxeWood", Item.ToolMaterial.WOOD));
+        stoneBattleAxe = register(r, new ItemBattleAxe("stone_battleaxe", "battleAxeStone", Item.ToolMaterial.STONE));
+        copperBattleAxe = register(r, new ItemBattleAxe("copper_battleaxe", "battleAxeCopper", TOOL_COPPER));
+        bronzeBattleAxe = register(r, new ItemBattleAxe("bronze_battleaxe", "battleAxeBronze", TOOL_BRONZE));
+        ironBattleAxe = register(r, new ItemBattleAxe("iron_battleaxe", "battleAxeIron", Item.ToolMaterial.IRON));
+        goldBattleAxe = register(r, new ItemBattleAxe("gold_battleaxe", "battleAxeGold", Item.ToolMaterial.GOLD));
+        diamondBattleAxe = register(r, new ItemBattleAxe("diamond_battleaxe", "battleAxeDiamond", Item.ToolMaterial.DIAMOND));
+        
         // guns
         musketAmmunition = register(r, new ItemBase("musket_ammunition", "musketAmmunition").setCreativeTab(CreativeTabs.COMBAT));
         revolverBullet = register(r, new ItemBase("revolver_bullet", "revolverBullet").setCreativeTab(CreativeTabs.COMBAT));

+ 2 - 1
src/main/java/me/km/items/ItemAxe.java → src/main/java/me/km/items/tools/ItemAxe.java

@@ -1,6 +1,7 @@
-package me.km.items;
+package me.km.items.tools;
 
 import me.km.KajetansMod;
+import me.km.items.ItemModelProvider;
 import net.minecraft.item.Item;
 
 public class ItemAxe extends net.minecraft.item.ItemAxe implements ItemModelProvider

+ 4 - 2
src/main/java/me/km/items/ItemHammer.java → src/main/java/me/km/items/tools/ItemHammer.java

@@ -1,9 +1,11 @@
-package me.km.items;
+package me.km.items.tools;
+
+import me.km.items.weapons.ItemWeapon;
 
 public class ItemHammer extends ItemWeapon
 {
     public ItemHammer(String name, String local, ToolMaterial m) 
     {
-        super(name, local, m, 4, -3f);
+        super(name, local, m, 4, 1);
     }
 }

+ 2 - 1
src/main/java/me/km/items/ItemHoe.java → src/main/java/me/km/items/tools/ItemHoe.java

@@ -1,6 +1,7 @@
-package me.km.items;
+package me.km.items.tools;
 
 import me.km.KajetansMod;
+import me.km.items.ItemModelProvider;
 import net.minecraft.item.Item;
 
 public class ItemHoe extends net.minecraft.item.ItemHoe implements ItemModelProvider

+ 2 - 1
src/main/java/me/km/items/ItemPickaxe.java → src/main/java/me/km/items/tools/ItemPickaxe.java

@@ -1,6 +1,7 @@
-package me.km.items;
+package me.km.items.tools;
 
 import me.km.KajetansMod;
+import me.km.items.ItemModelProvider;
 import net.minecraft.item.Item;
 
 public class ItemPickaxe extends net.minecraft.item.ItemPickaxe implements ItemModelProvider

+ 2 - 1
src/main/java/me/km/items/ItemSpade.java → src/main/java/me/km/items/tools/ItemSpade.java

@@ -1,6 +1,7 @@
-package me.km.items;
+package me.km.items.tools;
 
 import me.km.KajetansMod;
+import me.km.items.ItemModelProvider;
 import net.minecraft.item.Item;
 
 public class ItemSpade extends net.minecraft.item.ItemSpade implements ItemModelProvider

+ 28 - 0
src/main/java/me/km/items/weapons/ItemBattleAxe.java

@@ -0,0 +1,28 @@
+package me.km.items.weapons;
+
+import com.google.common.collect.Multimap;
+import net.minecraft.entity.ai.attributes.AttributeModifier;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.item.Item;
+
+public class ItemBattleAxe extends ItemWeapon
+{
+    private static final AttributeModifier BOOST = new AttributeModifier("extended reach", 0.5d, 0);
+    
+    public ItemBattleAxe(String name, String local, Item.ToolMaterial material) 
+    {
+        super(name, local, material, 5, 0.5d);
+    }
+    
+    @Override
+    public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot)
+    {
+        Multimap<String, AttributeModifier> map = super.getItemAttributeModifiers(equipmentSlot);
+        if (equipmentSlot == EntityEquipmentSlot.MAINHAND)
+        {
+            map.put(EntityPlayer.REACH_DISTANCE.getName(), BOOST);
+        }
+        return map;
+    }
+}

+ 2 - 2
src/main/java/me/km/items/ItemDagger.java → src/main/java/me/km/items/weapons/ItemDagger.java

@@ -1,9 +1,9 @@
-package me.km.items;
+package me.km.items.weapons;
 
 public class ItemDagger extends ItemWeapon
 {
     public ItemDagger(String name, String local, ToolMaterial m) 
     {
-        super(name, local, m, 1, -1.8f);
+        super(name, local, m, 1, 1.8d);
     }
 }

+ 28 - 0
src/main/java/me/km/items/weapons/ItemGreatSword.java

@@ -0,0 +1,28 @@
+package me.km.items.weapons;
+
+import com.google.common.collect.Multimap;
+import net.minecraft.entity.ai.attributes.AttributeModifier;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.item.Item;
+
+public class ItemGreatSword extends ItemWeapon
+{
+    private static final AttributeModifier BOOST = new AttributeModifier("extended reach", 0.5d, 0);
+    
+    public ItemGreatSword(String name, String local, Item.ToolMaterial material) 
+    {
+        super(name, local, material, 6, 0.8d);
+    }
+    
+    @Override
+    public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot)
+    {
+        Multimap<String, AttributeModifier> map = super.getItemAttributeModifiers(equipmentSlot);
+        if (equipmentSlot == EntityEquipmentSlot.MAINHAND)
+        {
+            map.put(EntityPlayer.REACH_DISTANCE.getName(), BOOST);
+        }
+        return map;
+    }
+}

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

@@ -1,4 +1,4 @@
-package me.km.items;
+package me.km.items.weapons;
 
 import java.util.List;
 import me.km.api.Utils;

+ 27 - 0
src/main/java/me/km/items/weapons/ItemSpear.java

@@ -0,0 +1,27 @@
+package me.km.items.weapons;
+
+import com.google.common.collect.Multimap;
+import net.minecraft.entity.ai.attributes.AttributeModifier;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.EntityEquipmentSlot;
+
+public class ItemSpear extends ItemWeapon
+{
+    private static final AttributeModifier BOOST = new AttributeModifier("extended reach", 1, 0);
+    
+    public ItemSpear(String name, String local, ToolMaterial material) 
+    {
+        super(name, local, material, 6, 0.8d);
+    }
+    
+    @Override
+    public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot)
+    {
+        Multimap<String, AttributeModifier> map = super.getItemAttributeModifiers(equipmentSlot);
+        if (equipmentSlot == EntityEquipmentSlot.MAINHAND)
+        {
+            map.put(EntityPlayer.REACH_DISTANCE.getName(), BOOST);
+        }
+        return map;
+    }
+}

+ 3 - 2
src/main/java/me/km/items/ItemStick.java → src/main/java/me/km/items/weapons/ItemStick.java

@@ -1,11 +1,12 @@
-package me.km.items;
+package me.km.items.weapons;
 
+import me.km.items.weapons.ItemWeapon;
 import net.minecraft.item.Item;
 
 public class ItemStick extends ItemWeapon
 {
     public ItemStick(String name, String local, Item.ToolMaterial m) 
     {
-        super(name, local, m, 0, -2.0f);
+        super(name, local, m, 0, 1.7d);
     }
 }

+ 2 - 1
src/main/java/me/km/items/ItemSword.java → src/main/java/me/km/items/weapons/ItemSword.java

@@ -1,6 +1,7 @@
-package me.km.items;
+package me.km.items.weapons;
 
 import me.km.KajetansMod;
+import me.km.items.ItemModelProvider;
 import net.minecraft.item.Item;
 
 public class ItemSword extends net.minecraft.item.ItemSword implements ItemModelProvider

+ 2 - 2
src/main/java/me/km/items/ItemWand.java → src/main/java/me/km/items/weapons/ItemWand.java

@@ -1,4 +1,4 @@
-package me.km.items;
+package me.km.items.weapons;
 
 import java.util.List;
 import me.km.KajetansMod;
@@ -28,7 +28,7 @@ public class ItemWand extends ItemWeapon
     
     public ItemWand(String name, String local, ToolMaterial material, int strength) 
     {
-        super(name, local, material, 0, -3);
+        super(name, local, material, 0, 1);
         this.strength = strength;
         this.roman = " " + Utils.intToRoman(strength);
     }

+ 5 - 4
src/main/java/me/km/items/ItemWeapon.java → src/main/java/me/km/items/weapons/ItemWeapon.java

@@ -1,6 +1,7 @@
-package me.km.items;
+package me.km.items.weapons;
 
 import com.google.common.collect.Multimap;
+import me.km.items.ItemBase;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.entity.EntityLivingBase;
@@ -27,13 +28,13 @@ public class ItemWeapon extends ItemBase
         this.maxStackSize = 1;
         super.setMaxDamage(material.getMaxUses());
         super.setCreativeTab(CreativeTabs.COMBAT);
-        this.attackDamage = attackDamage + material.getDamageVsEntity();
-        this.speed = speed;
+        this.attackDamage = attackDamage + material.getAttackDamage();
+        this.speed = speed - 4; // mojang modifier
     }
     
     public ItemWeapon(String name, String local, Item.ToolMaterial material, float attackDamage)
     {
-        this(name, local, material, attackDamage, -2.4d);
+        this(name, local, material, attackDamage, 1.6d);
     }
 
     @Override

+ 3 - 3
src/main/java/me/km/jobsystem/JobAPI.java

@@ -23,7 +23,7 @@ public class JobAPI extends Module
     public JobAPI(String mname, String prefix, TextFormatting color) 
     {
         super(mname, prefix, color);
-        bank = new JobBank(this, KajetansMod.databank.getConnection());
+        bank = new JobBank(this, KajetansMod.databank);
         super.setDataBank(bank);
         jobs = new HashMap<>();
     }
@@ -195,7 +195,7 @@ public class JobAPI extends Module
         bank.setXp(p, job, xp);
     }
     
-    public void addXP(EntityPlayer p, int xp, byte job)
+    public void addXP(EntityPlayer p, byte job, int xp)
     {     
         setXP(p, job, getXP(p, job) + xp);
     }
@@ -221,6 +221,6 @@ public class JobAPI extends Module
     
     public void addLevel(EntityPlayer p, byte job, byte level)
     {
-        setLevel(p, job, (byte) (getXP(p, job) + level));
+        setLevel(p, job, (byte) (getLevel(p, job) + level));
     }
 }

+ 2 - 2
src/main/java/me/km/jobsystem/JobBank.java

@@ -2,13 +2,13 @@ package me.km.jobsystem;
 
 import me.km.api.Module;
 import me.km.databank.SimpleDataBank;
-import java.sql.Connection;
 import java.util.ArrayList;
+import me.km.databank.DataBank;
 import net.minecraft.entity.player.EntityPlayer;
 
 public class JobBank extends SimpleDataBank
 {
-    public JobBank(Module m, Connection c) 
+    public JobBank(Module m, DataBank c) 
     {
         super(m, c);
     }

+ 2 - 2
src/main/java/me/km/networking/HumanUpdate.java

@@ -24,7 +24,7 @@ public class HumanUpdate implements IMessage
     public HumanUpdate(EntityHuman h) 
     {
         humanId = h.getEntityId();
-        name = h.getName();
+        name = h.getSkinName();
     }
     
     @Override
@@ -55,7 +55,7 @@ public class HumanUpdate implements IMessage
                 return null;
             }
             EntityHuman h = (EntityHuman) ent;
-            h.setName(message.name);
+            h.setSkinName(message.name);
             h.setTexture(HumanSkinLoader.INSTANCE.getTexture(message.name, loc -> h.setTexture(loc)));
             return null;
         }

+ 2 - 2
src/main/java/me/km/playerbank/PlayerBank.java

@@ -1,15 +1,15 @@
 package me.km.playerbank;
 
 import com.mojang.authlib.GameProfile;
-import java.sql.Connection;
 import me.km.KajetansMod;
 import me.km.api.Module;
+import me.km.databank.DataBank;
 import me.km.databank.SimpleDataBank;
 import net.minecraft.entity.player.EntityPlayer;
 
 public class PlayerBank extends SimpleDataBank
 {  
-    public PlayerBank(Module m, Connection c) 
+    public PlayerBank(Module m, DataBank c) 
     {
         super(m, c);
     }

+ 2 - 2
src/main/java/me/km/playerbank/PlayerManager.java

@@ -1,10 +1,10 @@
 package me.km.playerbank;
 
-import java.sql.Connection;
 import java.util.HashMap;
 import java.util.UUID;
 import me.km.api.Location;
 import me.km.api.Module;
+import me.km.databank.DataBank;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.text.TextFormatting;
 
@@ -13,7 +13,7 @@ public class PlayerManager extends Module
     private final HashMap<UUID, Location> backLocation;
     private final PlayerBank bank;
     
-    public PlayerManager(String mname, String prefix, TextFormatting color, Connection c) 
+    public PlayerManager(String mname, String prefix, TextFormatting color, DataBank c) 
     {
         super(mname, prefix, color);
         backLocation = new HashMap<>();

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

@@ -1,13 +1,13 @@
 package me.km.plots;
 
 import com.mojang.authlib.GameProfile;
-import java.sql.Connection;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.stream.Collectors;
 import me.km.KajetansMod;
 import me.km.api.GlobalText;
 import me.km.api.Module;
+import me.km.databank.DataBank;
 import me.km.databank.SimpleDataBank;
 import me.km.dimensions.ModDimensions;
 import me.km.playerbank.PlayerBank;
@@ -42,7 +42,7 @@ public class ProtectionBank extends SimpleDataBank
         return protectetEntities.contains(et);
     }
     
-    public ProtectionBank(Module m, Connection c) 
+    public ProtectionBank(Module m, DataBank c) 
     {
         super(m, c);
         protectetEntities = new HashSet();

+ 2 - 2
src/main/java/me/km/plots/ProtectionBuyPlot.java

@@ -22,7 +22,7 @@ public class ProtectionBuyPlot extends Protection
         super(m);
     }
     
-    @SubscribeEvent
+    /*@SubscribeEvent
     public void markRegion(PlayerInteractEvent.RightClickBlock e)
     {
         if(e.getHand() == EnumHand.OFF_HAND)
@@ -92,5 +92,5 @@ public class ProtectionBuyPlot extends Protection
         {
             this.getModule().send(p, GlobalText.noNaturalNumber());
         } 
-    }
+    }*/
 }

+ 14 - 0
src/main/java/me/km/recipes/ModRecipes.java

@@ -1,6 +1,9 @@
 package me.km.recipes;
 
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
 import me.km.blocks.EnumMetals;
 import me.km.blocks.ModBlocks;
 import me.km.items.ModItems;
@@ -11,12 +14,16 @@ import net.minecraft.init.Items;
 import net.minecraft.item.EnumDyeColor;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
 import net.minecraft.item.crafting.FurnaceRecipes;
 import net.minecraft.item.crafting.IRecipe;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.item.crafting.ShapedRecipes;
 import net.minecraft.item.crafting.ShapelessRecipes;
 import net.minecraft.util.NonNullList;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.common.registry.ForgeRegistries;
+import net.minecraftforge.registries.ForgeRegistry;
 import net.minecraftforge.registries.IForgeRegistry;
 
 public class ModRecipes 
@@ -146,6 +153,13 @@ 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", "GCG", "XXX"}, new ItemStack(ModBlocks.lantern), 
+                new char[] {'X', 'G', 'C'}, new ItemStack[][] 
+                {
+                    {new ItemStack(Items.IRON_NUGGET)},
+                    {new ItemStack(Blocks.GLASS_PANE)},
+                    {new ItemStack(Blocks.TORCH)}
+                });
         
         // guns
         addPlankRecipe(r, new String[] {"XX", "# "}, Items.IRON_INGOT, new ItemStack(ModItems.ironRevolver));

+ 0 - 2
src/main/java/me/km/scoreboard/ScoreboardAPI.java

@@ -2,7 +2,6 @@ package me.km.scoreboard;
 
 import java.util.HashMap;
 import java.util.UUID;
-import me.km.KajetansMod;
 import me.km.api.Module;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.util.text.TextFormatting;
@@ -15,7 +14,6 @@ public class ScoreboardAPI extends Module
     {
         super(mname, prefix, color);
         boards = new HashMap<>();
-        KajetansMod.scheduler.scheduleRepeatingTask(new ScoreboardRefresher(this), 40, 30);
     }
     
     public void initScoreboardAPI()

+ 0 - 50
src/main/java/me/km/scoreboard/ScoreboardRefresher.java

@@ -1,50 +0,0 @@
-package me.km.scoreboard;
-
-import me.km.KajetansMod;
-import me.km.dimensions.WorldPreferences;
-import me.km.environment.EnvironmentAPI;
-import net.minecraft.util.math.BlockPos;
-
-public class ScoreboardRefresher implements Runnable
-{
-    private final ScoreboardAPI scoreboard;
-    
-    public ScoreboardRefresher(ScoreboardAPI scoreboard)
-    {
-        this.scoreboard = scoreboard;
-    }
-    
-    @Override
-    public void run() 
-    {
-        KajetansMod.server.getPlayerList().getPlayers().stream().forEach(p -> 
-        {
-            PlayerScoreboard data = scoreboard.getScoreboard(p);
-            BlockPos l =  p.getPosition();
-            data.addText(99, "§7LO §r" + l.getX() + "§7:§r" + l.getY() + "§7:§r" + l.getZ());
-            data.addText(98, "§7HP §r" + (p.getHealth() * 100 / p.getMaxHealth()) + "§7%");
-            WorldPreferences pref = KajetansMod.worldManager.getWorldPreferences(p.world);
-            if(pref.statusEffects)
-            {
-                data.addText(78, new StringBuilder("§7EN §6||||||||||||||||||||").insert(EnvironmentAPI.getEnergy(p) / 500 + 7, "§c").toString());
-                data.addText(77, new StringBuilder("§7TH §9||||||||||||||||||||").insert(EnvironmentAPI.getThirst(p) / 500 + 7, "§7").toString());
-                data.addText(76, new StringBuilder("§7CO §3||||||||||||||||||||").insert(EnvironmentAPI.getCold(p) / 5 + 7, "§7").toString());
-            }
-            else
-            {                  
-                data.removeText(78);  
-                data.removeText(77);  
-                data.removeText(76);
-            }
-            if(pref.manabar)
-            {
-                data.addText(75, new StringBuilder("§7MP §9||||||||||||||||||||").insert(EnvironmentAPI.getMana(p) / 5 + 7, "§7").toString());
-            }
-            else
-            {              
-                data.removeText(75);
-            }
-            data.update();
-        });
-    }
-}

+ 19 - 5
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -82,6 +82,8 @@ import me.km.pathfinder.PathfinderUtils;
 import me.km.skills.LeveledSkill;
 import me.km.skills.Skill;
 import net.minecraft.entity.item.EntityItem;
+import net.minecraft.inventory.Slot;
+import net.minecraft.util.NonNullList;
 import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.text.ITextComponent;
 
@@ -399,9 +401,9 @@ public class MinecraftFunctions implements ISnuviLogger
         parser.registerFunction("job.getxp", (args, qd) -> 
                 new Fraction(KajetansMod.jobs.getXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]))));
         parser.registerConsumer("job.addxp", (args, qd) -> 
-                KajetansMod.jobs.addXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
+                KajetansMod.jobs.addXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getInt(args[2])));
         parser.registerConsumer("job.setxp", (args, qd) -> 
-                KajetansMod.jobs.setXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
+                KajetansMod.jobs.setXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getInt(args[2])));
         parser.registerConsumer("job.registerjob", (args, qd) -> 
                 KajetansMod.jobs.registerJob(ScriptUtils.getByte(args[0]), ScriptUtils.connect(args, 1)));
         parser.registerConsumer("job.registerrecipe", (args, qd) -> 
@@ -657,7 +659,19 @@ public class MinecraftFunctions implements ISnuviLogger
         parser.registerConsumer("inv.open", (args, qd) -> 
                 new ScriptInventoryHolder((SnuviInventory) args[0], (EntityPlayerMP) args[1], (MinecraftScript) qd).openForPlayer());
         parser.registerConsumer("inv.close", (args, qd) -> 
-                invClose(args));                 
+                invClose(args));      
+        parser.registerConsumer("inv.update", (args, qd) -> 
+                {
+                    EntityPlayerMP p = (EntityPlayerMP) args[0];
+                    NonNullList<ItemStack> list = NonNullList.<ItemStack>create();
+                    int size = p.openContainer.inventorySlots.size();
+                    for(int j = 0; j < size; j++)
+                    {
+                        ItemStack itemstack = p.openContainer.inventorySlots.get(j).getStack();
+                        list.add(itemstack.isEmpty() ? ItemStack.EMPTY : itemstack);
+                    }
+                    p.sendAllContents(p.openContainer, list);
+                }); 
 
         // -------------------------------------------------------------  
         // Read-Bibliothek   
@@ -705,7 +719,7 @@ public class MinecraftFunctions implements ISnuviLogger
         parser.registerFunction("onlyletters", (args, qd) ->                            
                 onlyLetters(ScriptUtils.connect(args, 0)));
         parser.registerConsumer("command", (args, qd) -> 
-                KajetansMod.server.commandManager.executeCommand(KajetansMod.server, ScriptUtils.connect(args, 0)));
+                KajetansMod.scheduler.scheduleTask(() -> KajetansMod.server.commandManager.executeCommand(KajetansMod.server, ScriptUtils.connect(args, 0))));
     }
     
     @Override
@@ -1607,4 +1621,4 @@ public class MinecraftFunctions implements ISnuviLogger
         Module m = KajetansMod.scripts;
         doForGroup("dev", null, p -> m.sendHelpListElement(p, message, message2));
     }   
-}
+}

+ 2 - 2
src/main/java/me/km/snuviscript/ScriptBank.java

@@ -2,13 +2,13 @@ package me.km.snuviscript;
 
 import me.km.api.Module;
 import me.km.databank.SimpleDataBank;
-import java.sql.Connection;
 import me.hammerle.code.Code;
+import me.km.databank.DataBank;
 import me.km.table.Table;
 
 public class ScriptBank extends SimpleDataBank
 {   
-    public ScriptBank(Module m, Connection c) 
+    public ScriptBank(Module m, DataBank c) 
     {
         super(m, c);
     }

+ 7 - 0
src/main/resources/assets/km/blockstates/gravel_slab.json

@@ -0,0 +1,7 @@
+{
+    "variants": {
+        "normal":  { "model": "km:slabs/bottom_slab_gravel" },
+        "half=top": { "model": "km:slabs/upper_slab_gravel" },
+        "half=bottom": { "model": "km:slabs/bottom_slab_gravel" }
+    }
+}

+ 11 - 0
src/main/resources/assets/km/blockstates/lantern.json

@@ -0,0 +1,11 @@
+{
+    "variants": {
+        "normal":  { "model": "km:lantern/standing" },
+        "facing=down": { "model": "km:lantern/cealing" },
+        "facing=up": { "model": "km:lantern/standing" },
+        "facing=east": { "model": "km:lantern/wall", "y": 90},
+        "facing=south": { "model": "km:lantern/wall", "y": 180 },
+        "facing=west": { "model": "km:lantern/wall", "y": 270 },
+        "facing=north": { "model": "km:lantern/wall"}
+    }
+}

+ 28 - 0
src/main/resources/assets/km/lang/en_US.lang

@@ -78,11 +78,15 @@ tile.campFireBurnt.name=Burnt Camp Fire
 container.campfire=Camp Fire
 item.campFire.name=Camp Fire
 
+tile.lantern.name=Lantern
+
 tile.fluid.poison.name=Poison
 tile.fluid.honey.name=Honey
 fluid.poison=Poison
 fluid.honey=Honey
 
+tile.gravelSlab.name=Gravel Slab
+
 
 item.wandWood.name=Wooden Wand
 item.wandStone.name=Stone Wand
@@ -120,6 +124,30 @@ item.hammerIron.name=Iron Hammer
 item.hammerGold.name=Gold Hammer
 item.hammerDiamond.name=Diamond Hammer
 
+item.spearWood.name=Wooden Spear
+item.spearStone.name=Stone Spear
+item.spearCopper.name=Copper Spear
+item.spearBronze.name=Bronze Spear
+item.spearIron.name=Iron Spear
+item.spearGold.name=Gold Spear
+item.spearDiamond.name=Diamond Spear
+
+item.greatSwordWood.name=Wooden Greatsword
+item.greatSwordStone.name=Stone Greatsword
+item.greatSwordCopper.name=Copper Greatsword
+item.greatSwordBronze.name=Bronze Greatsword
+item.greatSwordIron.name=Iron Greatsword
+item.greatSwordGold.name=Gold Greatsword
+item.greatSwordDiamond.name=Diamond Greatsword
+
+item.battleAxeWood.name=Wooden Battleaxe
+item.battleAxeStone.name=Stone Battleaxe
+item.battleAxeCopper.name=Copper Battleaxe
+item.battleAxeBronze.name=Bronze Battleaxe
+item.battleAxeIron.name=Iron Battleaxe
+item.battleAxeGold.name=Gold Battleaxe
+item.battleAxeDiamond.name=Diamond Battleaxe
+
 #item.keyWood.name=Wooden Key
 item.keySilver.name=Silver Key
 item.keyCopper.name=Copper Key

+ 0 - 7
src/main/resources/assets/km/models/block/camp_fire.json

@@ -1,5 +1,4 @@
 {
-    "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
     "textures": {
         "0": "blocks/planks_oak",
         "particle": "blocks/planks_oak"
@@ -7,7 +6,6 @@
     "ambientocclusion": false,
     "elements": [
         {
-            "name": "Cube",
             "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 },
@@ -21,7 +19,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -35,7 +32,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -49,7 +45,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -63,7 +58,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -77,7 +71,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },

+ 0 - 7
src/main/resources/assets/km/models/block/camp_fire_burning.json

@@ -1,5 +1,4 @@
 {
-    "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
     "textures": {
         "0": "blocks/planks_oak",
         "particle": "blocks/planks_oak",
@@ -8,7 +7,6 @@
     "ambientocclusion": false,
     "elements": [
         {
-            "name": "Cube",
             "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 },
@@ -22,7 +20,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -36,7 +33,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -50,7 +46,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -64,7 +59,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -78,7 +72,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },

+ 0 - 5
src/main/resources/assets/km/models/block/camp_fire_burnt.json

@@ -1,5 +1,4 @@
 {
-    "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
     "textures": {
         "0": "km:blocks/campfire/burnt_oak_tip",
         "1": "km:blocks/campfire/burnt_plank_oak",
@@ -9,7 +8,6 @@
     },
     "elements": [
         {
-            "name": "Cube",
             "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 },
@@ -23,7 +21,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -37,7 +34,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },
@@ -51,7 +47,6 @@
             }
         },
         {
-            "name": "Cube",
             "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 },

+ 173 - 0
src/main/resources/assets/km/models/block/lantern/cealing.json

@@ -0,0 +1,173 @@
+{
+    "parent": "block/block",
+    "ambientocclusion": false,
+    "textures": {
+        "side": "blocks/cauldron_side",
+        "glass": "km:blocks/lantern/glass_dusty",
+        "candle": "km:blocks/lantern/candle", 
+        "particle": "blocks/cauldron_side"
+    },
+    "elements": [
+        {
+            "from": [ 4.0, 2.0, 4.0 ], 
+            "to": [ 12.0, 3.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 13.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 12.0, 7.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 3.0, 3.0, 3.0 ], 
+            "to": [ 13.0, 4.0, 13.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 15.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 14.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 14.0, 13.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 4.0, 4.0 ], 
+            "to": [ 5.0, 12.0, 5.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 11.0, 4.0, 4.0 ], 
+            "to": [ 12.0, 12.0, 5.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 11.0, 4.0, 11.0 ], 
+            "to": [ 12.0, 12.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 4.0, 11.0 ], 
+            "to": [ 5.0, 12.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 3.0, 12.0, 3.0 ], 
+            "to": [ 13.0, 13.0, 13.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 15.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 14.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 14.0, 13.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 13.0, 4.0 ], 
+            "to": [ 12.0, 14.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 13.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 12.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 6.0, 4.0, 10.0 ], 
+            "to": [ 11.0, 12.0, 11.0 ], 
+            "faces": {
+                "east": { "texture": "#glass", "uv": [ 11.0, 4.0, 12.0, 12.0 ] },
+                "south": { "texture": "#glass", "uv": [ 6.0, 1.0, 11.0, 9.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 4.0, 5.0 ], 
+            "to": [ 10.0, 12.0, 6.0 ], 
+            "faces": {
+                "north": { "texture": "#glass", "uv": [ 2.0, 5.0, 7.0, 12.0 ] },
+                "west": { "texture": "#glass", "uv": [ 8.0, 4.0, 9.0, 12.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 4.0, 6.0 ], 
+            "to": [ 6.0, 12.0, 11.0 ], 
+            "faces": {
+                "south": { "texture": "#glass", "uv": [ 7.0, 7.0, 8.0, 15.0 ] },
+                "west": { "texture": "#glass", "uv": [ 3.0, 2.0, 8.0, 10.0 ] }
+            }
+        },
+        {
+            "from": [ 10.0, 4.0, 5.0 ], 
+            "to": [ 11.0, 12.0, 10.0 ], 
+            "faces": {
+                "north": { "texture": "#glass", "uv": [ 2.0, 6.0, 3.0, 14.0 ] },
+                "east": { "texture": "#glass", "uv": [ 3.0, 2.0, 8.0, 10.0 ] }
+            }
+        },
+        {
+            "from": [ 7.0, 4.0, 7.0 ], 
+            "to": [ 9.0, 9.0, 9.0 ], 
+            "faces": {
+                "north": { "texture": "#candle", "uv": [ 8.0, 11.0, 10.0, 16.0 ] },
+                "east": { "texture": "#candle", "uv": [ 10.0, 11.0, 12.0, 16.0 ] },
+                "south": { "texture": "#candle", "uv": [ 12.0, 11.0, 14.0, 16.0 ] },
+                "west": { "texture": "#candle", "uv": [ 14.0, 11.0, 16.0, 16.0 ] },
+                "up": { "texture": "#candle", "uv": [ 14.0, 9.0, 16.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 14.0, 7.0 ], 
+            "to": [ 7.0, 16.0, 9.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 6.0, 7.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 7.0, 7.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 6.0, 7.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 6.0, 8.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 6.0, 5.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 6.0, 5.0 ] }
+            }
+        },
+        {
+            "from": [ 9.0, 14.0, 7.0 ], 
+            "to": [ 11.0, 16.0, 9.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 6.0, 7.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 7.0, 7.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 6.0, 7.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 6.0, 8.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 6.0, 5.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 6.0, 5.0 ] }
+            }
+        }
+    ]
+}

+ 149 - 0
src/main/resources/assets/km/models/block/lantern/standing.json

@@ -0,0 +1,149 @@
+{
+    "parent": "block/block",
+    "ambientocclusion": false,
+    "textures": {
+        "side": "blocks/cauldron_side",
+        "glass": "km:blocks/lantern/glass_dusty",
+        "candle": "km:blocks/lantern/candle", 
+        "particle": "blocks/cauldron_side"
+    },
+    "elements": [
+        {
+            "from": [ 4.0, 0.0, 4.0 ], 
+            "to": [ 12.0, 1.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 13.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 12.0, 7.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 3.0, 1.0, 3.0 ], 
+            "to": [ 13.0, 2.0, 13.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 15.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 14.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 14.0, 13.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 2.0, 4.0 ], 
+            "to": [ 5.0, 10.0, 5.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 11.0, 2.0, 4.0 ], 
+            "to": [ 12.0, 10.0, 5.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 11.0, 2.0, 11.0 ], 
+            "to": [ 12.0, 10.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 2.0, 11.0 ], 
+            "to": [ 5.0, 10.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 3.0, 10.0, 3.0 ], 
+            "to": [ 13.0, 11.0, 13.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 15.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 14.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 14.0, 13.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 11.0, 4.0 ], 
+            "to": [ 12.0, 12.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 13.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 12.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 6.0, 2.0, 10.0 ], 
+            "to": [ 11.0, 10.0, 11.0 ], 
+            "faces": {
+                "east": { "texture": "#glass", "uv": [ 11.0, 4.0, 12.0, 12.0 ] },
+                "south": { "texture": "#glass", "uv": [ 6.0, 1.0, 11.0, 9.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 2.0, 5.0 ], 
+            "to": [ 10.0, 10.0, 6.0 ], 
+            "faces": {
+                "north": { "texture": "#glass", "uv": [ 2.0, 5.0, 7.0, 12.0 ] },
+                "west": { "texture": "#glass", "uv": [ 8.0, 4.0, 9.0, 12.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 2.0, 6.0 ], 
+            "to": [ 6.0, 10.0, 11.0 ], 
+            "faces": {
+                "south": { "texture": "#glass", "uv": [ 7.0, 7.0, 8.0, 15.0 ] },
+                "west": { "texture": "#glass", "uv": [ 3.0, 2.0, 8.0, 10.0 ] }
+            }
+        },
+        {
+            "from": [ 10.0, 2.0, 5.0 ], 
+            "to": [ 11.0, 10.0, 10.0 ], 
+            "faces": {
+                "north": { "texture": "#glass", "uv": [ 2.0, 6.0, 3.0, 14.0 ] },
+                "east": { "texture": "#glass", "uv": [ 3.0, 2.0, 8.0, 10.0 ] }
+            }
+        },
+        {
+            "from": [ 7.0, 2.0, 7.0 ], 
+            "to": [ 9.0, 7.0, 9.0 ], 
+            "faces": {
+                "north": { "texture": "#candle", "uv": [ 8.0, 11.0, 10.0, 16.0 ] },
+                "east": { "texture": "#candle", "uv": [ 10.0, 11.0, 12.0, 16.0 ] },
+                "south": { "texture": "#candle", "uv": [ 12.0, 11.0, 14.0, 16.0 ] },
+                "west": { "texture": "#candle", "uv": [ 14.0, 11.0, 16.0, 16.0 ] },
+                "up": { "texture": "#candle", "uv": [ 14.0, 9.0, 16.0, 11.0 ] }
+            }
+        }
+    ]
+}

+ 193 - 0
src/main/resources/assets/km/models/block/lantern/wall.json

@@ -0,0 +1,193 @@
+{
+    "parent": "block/block",
+    "ambientocclusion": false,
+    "textures": {
+        "side": "blocks/cauldron_side",
+        "glass": "km:blocks/lantern/glass_dusty",
+        "candle": "km:blocks/lantern/candle", 
+        "particle": "blocks/cauldron_side"
+    },
+    "elements": [
+        {
+            "from": [ 4.0, 2.0, 7.0 ], 
+            "to": [ 12.0, 3.0, 15.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 13.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 12.0, 7.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 3.0, 3.0, 6.0 ], 
+            "to": [ 13.0, 4.0, 16.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 15.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 14.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 14.0, 13.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 4.0, 7.0 ], 
+            "to": [ 5.0, 12.0, 8.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 11.0, 4.0, 7.0 ], 
+            "to": [ 12.0, 12.0, 8.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 11.0, 4.0, 14.0 ], 
+            "to": [ 12.0, 12.0, 15.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 4.0, 14.0 ], 
+            "to": [ 5.0, 12.0, 15.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 6.0, 13.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 5.0, 13.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 5.0, 14.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 5.0, 4.0 ] }
+            }
+        },
+        {
+            "from": [ 3.0, 12.0, 6.0 ], 
+            "to": [ 13.0, 13.0, 16.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 15.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 14.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 14.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 14.0, 13.0 ] }
+            }
+        },
+        {
+            "from": [ 4.0, 13.0, 7.0 ], 
+            "to": [ 12.0, 14.0, 15.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 13.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 12.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 12.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 12.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 6.0, 4.0, 13.0 ], 
+            "to": [ 11.0, 12.0, 14.0 ], 
+            "faces": {
+                "east": { "texture": "#glass", "uv": [ 11.0, 4.0, 12.0, 12.0 ] },
+                "south": { "texture": "#glass", "uv": [ 6.0, 1.0, 11.0, 9.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 4.0, 8.0 ], 
+            "to": [ 10.0, 12.0, 9.0 ], 
+            "faces": {
+                "north": { "texture": "#glass", "uv": [ 2.0, 5.0, 7.0, 12.0 ] },
+                "west": { "texture": "#glass", "uv": [ 8.0, 4.0, 9.0, 12.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 4.0, 9.0 ], 
+            "to": [ 6.0, 12.0, 14.0 ], 
+            "faces": {
+                "south": { "texture": "#glass", "uv": [ 7.0, 7.0, 8.0, 15.0 ] },
+                "west": { "texture": "#glass", "uv": [ 3.0, 2.0, 8.0, 10.0 ] }
+            }
+        },
+        {
+            "from": [ 10.0, 4.0, 8.0 ], 
+            "to": [ 11.0, 12.0, 13.0 ], 
+            "faces": {
+                "north": { "texture": "#glass", "uv": [ 2.0, 6.0, 3.0, 14.0 ] },
+                "east": { "texture": "#glass", "uv": [ 3.0, 2.0, 8.0, 10.0 ] }
+            }
+        },
+        {
+            "from": [ 7.0, 4.0, 10.0 ], 
+            "to": [ 9.0, 9.0, 12.0 ], 
+            "faces": {
+                "north": { "texture": "#candle", "uv": [ 8.0, 11.0, 10.0, 16.0 ] },
+                "east": { "texture": "#candle", "uv": [ 10.0, 11.0, 12.0, 16.0 ] },
+                "south": { "texture": "#candle", "uv": [ 12.0, 11.0, 14.0, 16.0 ] },
+                "west": { "texture": "#candle", "uv": [ 14.0, 11.0, 16.0, 16.0 ] },
+                "up": { "texture": "#candle", "uv": [ 14.0, 9.0, 16.0, 11.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 1.0, 10.0 ], 
+            "to": [ 11.0, 3.0, 16.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 10.0, 7.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 11.0, 7.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 10.0, 7.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 10.0, 8.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 10.0, 9.0 ] }
+            }
+        },
+        {
+            "from": [ 5.0, 13.0, 10.0 ], 
+            "to": [ 11.0, 15.0, 16.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 10.0, 7.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 11.0, 7.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 10.0, 7.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 10.0, 8.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 10.0, 9.0 ] }
+            }
+        },
+        {
+            "from": [ 6.0, 15.0, 12.0 ], 
+            "to": [ 10.0, 16.0, 16.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 8.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 9.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 8.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 8.0, 7.0 ] },
+                "up": { "texture": "#side", "uv": [ 4.0, 3.0, 8.0, 7.0 ] }
+            }
+        },
+        {
+            "from": [ 6.0, 0.0, 12.0 ], 
+            "to": [ 10.0, 1.0, 16.0 ], 
+            "faces": {
+                "north": { "texture": "#side", "uv": [ 4.0, 5.0, 8.0, 6.0 ] },
+                "east": { "texture": "#side", "uv": [ 5.0, 5.0, 9.0, 6.0 ] },
+                "south": { "texture": "#side", "uv": [ 4.0, 5.0, 8.0, 6.0 ] },
+                "west": { "texture": "#side", "uv": [ 4.0, 6.0, 8.0, 7.0 ] },
+                "down": { "texture": "#side", "uv": [ 4.0, 3.0, 8.0, 7.0 ] }
+            }
+        }
+    ]
+}

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

@@ -0,0 +1,8 @@
+{
+    "parent": "block/half_slab",
+    "textures": {
+        "bottom": "blocks/gravel",
+        "top": "blocks/gravel",
+        "side": "blocks/gravel"
+    }
+}

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

@@ -0,0 +1,8 @@
+{
+    "parent": "block/upper_slab",
+    "textures": {
+        "bottom": "blocks/gravel",
+        "top": "blocks/gravel",
+        "side": "blocks/gravel"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/bronze_battleaxe.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_battleaxe",
+    "textures": {
+        "layer0": "km:items/battleaxe/bronze_battleaxe"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/bronze_greatsword.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_greatsword",
+    "textures": {
+        "layer0": "km:items/greatsword/bronze_greatsword"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/bronze_spear.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_spear",
+    "textures": {
+        "layer0": "km:items/spear/bronze_spear"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/copper_battleaxe.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_battleaxe",
+    "textures": {
+        "layer0": "km:items/battleaxe/copper_battleaxe"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/copper_greatsword.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_greatsword",
+    "textures": {
+        "layer0": "km:items/greatsword/copper_greatsword"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/copper_spear.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_spear",
+    "textures": {
+        "layer0": "km:items/spear/copper_spear"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/diamond_battleaxe.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_battleaxe",
+    "textures": {
+        "layer0": "km:items/battleaxe/diamond_battleaxe"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/diamond_greatsword.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_greatsword",
+    "textures": {
+        "layer0": "km:items/greatsword/diamond_greatsword"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/diamond_spear.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_spear",
+    "textures": {
+        "layer0": "km:items/spear/diamond_spear"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/gold_battleaxe.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_battleaxe",
+    "textures": {
+        "layer0": "km:items/battleaxe/gold_battleaxe"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/gold_greatsword.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_greatsword",
+    "textures": {
+        "layer0": "km:items/greatsword/gold_greatsword"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/gold_spear.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_spear",
+    "textures": {
+        "layer0": "km:items/spear/gold_spear"
+    }
+}

+ 25 - 0
src/main/resources/assets/km/models/item/handheld_battleaxe.json

@@ -0,0 +1,25 @@
+{
+    "parent": "item/generated",
+    "display": {
+        "thirdperson_righthand": {
+            "rotation": [ 0, -90, 55 ],
+            "translation": [ 0, 9.0, 0.5 ],
+            "scale": [ 1.7, 1.7, 0.85 ]
+        },
+        "thirdperson_lefthand": {
+            "rotation": [ 0, 90, -55 ],
+            "translation": [ 0, 9.0, 0.5 ],
+            "scale": [ 1.7, 1.7, 0.85 ]
+        },
+        "firstperson_righthand": {
+            "rotation": [ 0, -90, 25 ],
+            "translation": [ 1.13, 3.2, 1.13 ],
+            "scale": [ 1.36, 1.36, 0.68 ]
+        },
+        "firstperson_lefthand": {
+            "rotation": [ 0, 90, -25 ],
+            "translation": [ 1.13, 3.2, 1.13 ],
+            "scale": [ 1.36, 1.36, 0.68 ]
+        }
+    }
+}

+ 25 - 0
src/main/resources/assets/km/models/item/handheld_greatsword.json

@@ -0,0 +1,25 @@
+{
+    "parent": "item/generated",
+    "display": {
+        "thirdperson_righthand": {
+            "rotation": [ 0, -90, 55 ],
+            "translation": [ 0, 7.0, 0.5 ],
+            "scale": [ 1.7, 1.7, 0.85 ]
+        },
+        "thirdperson_lefthand": {
+            "rotation": [ 0, 90, -55 ],
+            "translation": [ 0, 7.0, 0.5 ],
+            "scale": [ 1.7, 1.7, 0.85 ]
+        },
+        "firstperson_righthand": {
+            "rotation": [ 0, -90, 25 ],
+            "translation": [ 1.13, 3.2, 1.13 ],
+            "scale": [ 1.36, 1.36, 0.68 ]
+        },
+        "firstperson_lefthand": {
+            "rotation": [ 0, 90, -25 ],
+            "translation": [ 1.13, 3.2, 1.13 ],
+            "scale": [ 1.36, 1.36, 0.68 ]
+        }
+    }
+}

+ 25 - 0
src/main/resources/assets/km/models/item/handheld_spear.json

@@ -0,0 +1,25 @@
+{
+    "parent": "item/generated",
+    "display": {
+        "thirdperson_righthand": {
+            "rotation": [ 0, -90, 55 ],
+            "translation": [ 0, 4.0, 0.5 ],
+            "scale": [ 1.7, 1.7, 0.85 ]
+        },
+        "thirdperson_lefthand": {
+            "rotation": [ 0, 90, -55 ],
+            "translation": [ 0, 4.0, 0.5 ],
+            "scale": [ 1.7, 1.7, 0.85 ]
+        },
+        "firstperson_righthand": {
+            "rotation": [ 0, -90, 25 ],
+            "translation": [ 1.13, 3.2, 1.13 ],
+            "scale": [ 1.36, 1.36, 0.68 ]
+        },
+        "firstperson_lefthand": {
+            "rotation": [ 0, 90, -25 ],
+            "translation": [ 1.13, 3.2, 1.13 ],
+            "scale": [ 1.36, 1.36, 0.68 ]
+        }
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/iron_battleaxe.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_battleaxe",
+    "textures": {
+        "layer0": "km:items/battleaxe/iron_battleaxe"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/iron_greatsword.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_greatsword",
+    "textures": {
+        "layer0": "km:items/greatsword/iron_greatsword"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/iron_spear.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_spear",
+    "textures": {
+        "layer0": "km:items/spear/iron_spear"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/stone_battleaxe.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_battleaxe",
+    "textures": {
+        "layer0": "km:items/battleaxe/stone_battleaxe"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/stone_greatsword.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_greatsword",
+    "textures": {
+        "layer0": "km:items/greatsword/stone_greatsword"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/stone_spear.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_spear",
+    "textures": {
+        "layer0": "km:items/spear/stone_spear"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/wood_battleaxe.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_battleaxe",
+    "textures": {
+        "layer0": "km:items/battleaxe/wood_battleaxe"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/wood_greatsword.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_greatsword",
+    "textures": {
+        "layer0": "km:items/greatsword/wood_greatsword"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/wood_spear.json

@@ -0,0 +1,6 @@
+{
+    "parent": "km:item/handheld_spear",
+    "textures": {
+        "layer0": "km:items/spear/wood_spear"
+    }
+}

BIN
src/main/resources/assets/km/textures/blocks/lantern/candle.png


BIN
src/main/resources/assets/km/textures/blocks/lantern/glass_dusty.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/bronze_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/copper_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/diamond_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/gold_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/iron_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/stone_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/battleaxe/wood_battleaxe.png


BIN
src/main/resources/assets/km/textures/items/greatsword/bronze_greatsword.png


BIN
src/main/resources/assets/km/textures/items/greatsword/copper_greatsword.png


BIN
src/main/resources/assets/km/textures/items/greatsword/diamond_greatsword.png


Деякі файли не було показано, через те що забагато файлів було змінено