Răsfoiți Sursa

Tin, Bronze (Graphics, Recipes, ...), Bugfixes, improved Scheduler, Coins (+ new Graphics)

Kajetan Johannes Hammerle 7 ani în urmă
părinte
comite
9fd723e6d2
100 a modificat fișierele cu 1005 adăugiri și 113 ștergeri
  1. 9 14
      src/main/java/me/km/KajetansMod.java
  2. 0 2
      src/main/java/me/km/api/Utils.java
  3. 2 1
      src/main/java/me/km/blocks/BlockBase.java
  4. 80 0
      src/main/java/me/km/blocks/BlockBed.java
  5. 55 0
      src/main/java/me/km/blocks/BlockHay.java
  6. 13 0
      src/main/java/me/km/blocks/BlockOre.java
  7. 10 0
      src/main/java/me/km/blocks/IBlockBase.java
  8. 36 11
      src/main/java/me/km/blocks/ModBlocks.java
  9. 2 5
      src/main/java/me/km/dimensions/ChangeWorldEvent.java
  10. 6 4
      src/main/java/me/km/effects/CommandWand.java
  11. 2 0
      src/main/java/me/km/effects/Effect.java
  12. 6 2
      src/main/java/me/km/effects/EffectUtils.java
  13. 5 5
      src/main/java/me/km/effects/passive/ArrowEffects.java
  14. 32 0
      src/main/java/me/km/inventory/CustomContainer.java
  15. 84 0
      src/main/java/me/km/items/ItemBed.java
  16. 71 9
      src/main/java/me/km/items/ModItems.java
  17. 162 0
      src/main/java/me/km/items/ModRecipes.java
  18. 5 4
      src/main/java/me/km/playerbank/ModDedicatedPlayerList.java
  19. 8 0
      src/main/java/me/km/playerbank/ModNetHandlerPlayServer.java
  20. 7 3
      src/main/java/me/km/playerbank/PlayerLogInOut.java
  21. 41 13
      src/main/java/me/km/scheduler/SnuviScheduler.java
  22. 8 1
      src/main/java/me/km/scheduler/SnuviTask.java
  23. 6 0
      src/main/java/me/km/scoreboard/PlayerScoreboard.java
  24. 1 1
      src/main/java/me/km/scoreboard/ScoreboardAPI.java
  25. 1 0
      src/main/java/me/km/snuviscript/CommandGiveUp.java
  26. 49 21
      src/main/java/me/km/snuviscript/ScriptEvents.java
  27. 28 3
      src/main/java/me/km/snuviscript/SnuviParser.java
  28. 5 0
      src/main/resources/assets/km/blockstates/bronze_block.json
  29. 21 0
      src/main/resources/assets/km/blockstates/real_hay_bed.json
  30. 7 0
      src/main/resources/assets/km/blockstates/real_hay_block.json
  31. 5 0
      src/main/resources/assets/km/blockstates/tin_block.json
  32. 5 0
      src/main/resources/assets/km/blockstates/tin_ore.json
  33. 28 1
      src/main/resources/assets/km/lang/en_US.lang
  34. 6 0
      src/main/resources/assets/km/models/block/bronze_block.json
  35. 16 2
      src/main/resources/assets/km/models/block/guild_block.json
  36. 7 0
      src/main/resources/assets/km/models/block/real_hay.json
  37. 19 0
      src/main/resources/assets/km/models/block/real_hay_bed_foot.json
  38. 29 0
      src/main/resources/assets/km/models/block/real_hay_bed_head.json
  39. 6 0
      src/main/resources/assets/km/models/block/tin_block.json
  40. 6 0
      src/main/resources/assets/km/models/block/tin_ore.json
  41. 6 0
      src/main/resources/assets/km/models/item/bronze_axe.json
  42. 6 0
      src/main/resources/assets/km/models/item/bronze_boots.json
  43. 6 0
      src/main/resources/assets/km/models/item/bronze_chestplate.json
  44. 6 0
      src/main/resources/assets/km/models/item/bronze_helmet.json
  45. 6 0
      src/main/resources/assets/km/models/item/bronze_hoe.json
  46. 6 0
      src/main/resources/assets/km/models/item/bronze_ingot.json
  47. 6 0
      src/main/resources/assets/km/models/item/bronze_leggings.json
  48. 6 0
      src/main/resources/assets/km/models/item/bronze_nugget.json
  49. 6 0
      src/main/resources/assets/km/models/item/bronze_pickaxe.json
  50. 6 0
      src/main/resources/assets/km/models/item/bronze_shovel.json
  51. 6 0
      src/main/resources/assets/km/models/item/bronze_sword.json
  52. 6 0
      src/main/resources/assets/km/models/item/coin_copper.json
  53. 6 0
      src/main/resources/assets/km/models/item/coin_gold.json
  54. 6 0
      src/main/resources/assets/km/models/item/coin_silver.json
  55. 1 1
      src/main/resources/assets/km/models/item/copper_axe.json
  56. 1 1
      src/main/resources/assets/km/models/item/copper_boots.json
  57. 1 1
      src/main/resources/assets/km/models/item/copper_chestplate.json
  58. 1 1
      src/main/resources/assets/km/models/item/copper_helmet.json
  59. 1 1
      src/main/resources/assets/km/models/item/copper_hoe.json
  60. 1 1
      src/main/resources/assets/km/models/item/copper_ingot.json
  61. 1 1
      src/main/resources/assets/km/models/item/copper_leggings.json
  62. 1 1
      src/main/resources/assets/km/models/item/copper_nugget.json
  63. 1 1
      src/main/resources/assets/km/models/item/copper_pickaxe.json
  64. 1 1
      src/main/resources/assets/km/models/item/copper_shovel.json
  65. 1 1
      src/main/resources/assets/km/models/item/copper_sword.json
  66. 6 0
      src/main/resources/assets/km/models/item/real_hay_bed.json
  67. 3 0
      src/main/resources/assets/km/models/item/real_hay_block.json
  68. 6 0
      src/main/resources/assets/km/models/item/tin_ingot.json
  69. 6 0
      src/main/resources/assets/km/models/item/tin_nugget.json
  70. BIN
      src/main/resources/assets/km/textures/blocks/bronze_block.png
  71. BIN
      src/main/resources/assets/km/textures/blocks/guildblock/guildblock_back.png
  72. BIN
      src/main/resources/assets/km/textures/blocks/guildblock/guildblock_bottom.png
  73. BIN
      src/main/resources/assets/km/textures/blocks/guildblock/guildblock_front.png
  74. BIN
      src/main/resources/assets/km/textures/blocks/guildblock/guildblock_left.png
  75. BIN
      src/main/resources/assets/km/textures/blocks/guildblock/guildblock_right.png
  76. BIN
      src/main/resources/assets/km/textures/blocks/guildblock/guildblock_top.png
  77. BIN
      src/main/resources/assets/km/textures/blocks/tin_block.png
  78. BIN
      src/main/resources/assets/km/textures/blocks/tin_ore.png
  79. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_axe.png
  80. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_boots.png
  81. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_chestplate.png
  82. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_helmet.png
  83. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_hoe.png
  84. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_ingot.png
  85. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_leggings.png
  86. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_nugget.png
  87. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_pickaxe.png
  88. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_shovel.png
  89. BIN
      src/main/resources/assets/km/textures/items/bronze/bronze_sword.png
  90. BIN
      src/main/resources/assets/km/textures/items/coin_copper.png
  91. BIN
      src/main/resources/assets/km/textures/items/coin_gold.png
  92. BIN
      src/main/resources/assets/km/textures/items/coin_silver.png
  93. BIN
      src/main/resources/assets/km/textures/items/coins/coin_copper.png
  94. BIN
      src/main/resources/assets/km/textures/items/coins/coin_gold.png
  95. BIN
      src/main/resources/assets/km/textures/items/coins/coin_silver.png
  96. 0 0
      src/main/resources/assets/km/textures/items/copper/copper_axe.png
  97. 0 0
      src/main/resources/assets/km/textures/items/copper/copper_boots.png
  98. 0 0
      src/main/resources/assets/km/textures/items/copper/copper_chestplate.png
  99. 0 0
      src/main/resources/assets/km/textures/items/copper/copper_helmet.png
  100. 0 0
      src/main/resources/assets/km/textures/items/copper/copper_hoe.png

+ 9 - 14
src/main/java/me/km/KajetansMod.java

@@ -11,6 +11,7 @@ import me.km.dimensions.WorldData;
 import me.km.effects.EffectUtils;
 import me.km.fluids.ModFluids;
 import me.km.items.ModItems;
+import me.km.items.ModRecipes;
 import me.km.jobsystem.JobAPI;
 import me.km.permissions.PermissionManager;
 import me.km.playerbank.PlayerBank;
@@ -27,7 +28,6 @@ import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.fml.common.SidedProxy;
 import net.minecraftforge.fml.common.event.FMLInitializationEvent;
-import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
 import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
 import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
 import net.minecraftforge.fml.common.event.FMLServerAboutToStartEvent;
@@ -83,6 +83,14 @@ public class KajetansMod
         ModBlocks.init();
     }
     
+    @Mod.EventHandler
+    public void init(FMLInitializationEvent e) 
+    {
+        proxy.initEntities();
+        MinecraftForge.EVENT_BUS.register(new ClientEvents());
+        ModRecipes.init();
+    }
+    
     @Mod.EventHandler
     public void beforeStart(FMLServerAboutToStartEvent e) 
     {
@@ -248,19 +256,6 @@ public class KajetansMod
         databank.closeDataBankConnection();
     }
 
-    @Mod.EventHandler
-    public void init(FMLInitializationEvent e) 
-    {
-        proxy.initEntities();
-        MinecraftForge.EVENT_BUS.register(new ClientEvents());
-    }
-
-    @Mod.EventHandler
-    public void postInit(FMLPostInitializationEvent e) 
-    {
-        ModItems.lateInit();
-    }
-
     /*public static void main(String[] args)
     {
         // Erstellt alle Enums für die aktiven Effekte

+ 0 - 2
src/main/java/me/km/api/Utils.java

@@ -49,8 +49,6 @@ import net.minecraft.util.DamageSource;
 import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.world.WorldServer;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.entity.EntityTravelToDimensionEvent;
 
 public class Utils 
 {    

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

@@ -10,7 +10,7 @@ import net.minecraft.item.ItemBlock;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 
-public class BlockBase extends Block 
+public class BlockBase extends Block implements IBlockBase
 {
     protected String name;
     private SoundType type;
@@ -25,6 +25,7 @@ public class BlockBase extends Block
         this.type = super.getSoundType();
     }
 
+    @Override
     public void registerItemModel(ItemBlock itemBlock) 
     {
         KajetansMod.proxy.registerItemRenderer(itemBlock, 0, name);

+ 80 - 0
src/main/java/me/km/blocks/BlockBed.java

@@ -0,0 +1,80 @@
+package me.km.blocks;
+
+import java.util.List;
+import java.util.Random;
+import javax.annotation.Nullable;
+import static net.minecraft.block.BlockBed.PART;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+public class BlockBed extends net.minecraft.block.BlockBed
+{
+    protected String name;
+    private SoundType type;
+    private final Item drop;
+    private static final AxisAlignedBB BOX = new AxisAlignedBB(0, 0, 0, 1, 0.125d, 1);
+    private static final AxisAlignedBB BOX_2 = new AxisAlignedBB(0, 0, 0.625d, 1, 0.25d, 1);
+    
+    public BlockBed(String name, String local, Item drop)
+    {
+        this.name = name;
+        this.setRegistryName(name);
+        super.setUnlocalizedName(local);
+        this.type = SoundType.CLOTH;
+        this.drop = drop;
+        super.setHardness(0.2F);
+        super.disableStats();
+    }
+    
+    @Override
+    public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entityIn, boolean p_185477_7_)
+    {
+        addCollisionBoxToList(pos, entityBox, collidingBoxes, BOX);
+        addCollisionBoxToList(pos, entityBox, collidingBoxes, BOX_2);
+    }
+
+    @Override
+    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
+    {
+        return state.getValue(PART) == BlockBed.EnumPartType.HEAD ? FULL_BLOCK_AABB : BOX;
+    }
+    
+    @Override
+    public final Item getItemDropped(IBlockState state, Random rand, int fortune)
+    {
+        return state.getValue(PART) == BlockBed.EnumPartType.HEAD ? Items.AIR : drop;
+    }
+
+    @Override
+    public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state) 
+    {
+        return new ItemStack(drop);
+    }
+
+    @Override
+    public BlockBed setSoundType(SoundType sound) 
+    {
+        this.type = sound;
+        return this;
+    }
+
+    @Override
+    public SoundType getSoundType(IBlockState state, World w, BlockPos pos, Entity entity) 
+    {
+        return type;
+    }     
+
+    @Override
+    public boolean isBed(IBlockState state, IBlockAccess world, BlockPos pos, Entity player) 
+    {
+        return true;
+    }
+}

+ 55 - 0
src/main/java/me/km/blocks/BlockHay.java

@@ -0,0 +1,55 @@
+package me.km.blocks;
+
+import me.km.KajetansMod;
+import net.minecraft.block.BlockRotatedPillar;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+
+public class BlockHay extends BlockRotatedPillar implements IBlockBase
+{ 
+    protected String name;
+    private SoundType type;
+    
+    public BlockHay(String name, String local) 
+    {
+        super(Material.GRASS);
+        this.name = name;
+        this.setRegistryName(name);
+        super.setUnlocalizedName(local);
+        super.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
+        this.type = super.getSoundType();
+        this.setDefaultState(this.blockState.getBaseState().withProperty(AXIS, EnumFacing.Axis.Y));
+    }
+
+    @Override
+    public void onFallenUpon(World w, BlockPos pos, Entity ent, float fallDistance)
+    {
+        ent.fall(fallDistance, 0.2F);
+    }
+
+    @Override
+    public void registerItemModel(ItemBlock itemBlock) 
+    {
+        KajetansMod.proxy.registerItemRenderer(itemBlock, 0, name);
+    }
+
+    @Override
+    public BlockHay setSoundType(SoundType sound) 
+    {
+        this.type = sound;
+        return this;
+    }
+
+    @Override
+    public SoundType getSoundType(IBlockState state, World world, BlockPos pos, Entity entity) 
+    {
+        return type;
+    }
+}

+ 13 - 0
src/main/java/me/km/blocks/BlockOre.java

@@ -0,0 +1,13 @@
+package me.km.blocks;
+
+import net.minecraft.block.material.Material;
+
+public class BlockOre extends BlockBase
+{
+    public BlockOre(String name, String local) 
+    {
+        super(Material.ROCK, name, local);
+        super.setHardness(3.0f);
+        super.setResistance(5.0f); 
+    }
+}

+ 10 - 0
src/main/java/me/km/blocks/IBlockBase.java

@@ -0,0 +1,10 @@
+package me.km.blocks;
+
+import net.minecraft.block.SoundType;
+import net.minecraft.item.ItemBlock;
+
+public interface IBlockBase 
+{
+    public void registerItemModel(ItemBlock itemBlock);
+    public IBlockBase setSoundType(SoundType sound);
+}

+ 36 - 11
src/main/java/me/km/blocks/ModBlocks.java

@@ -4,34 +4,53 @@ import me.km.fluids.BlockFluidBase;
 import me.km.fluids.BlockFluidHoney;
 import me.km.fluids.BlockFluidPoison;
 import me.km.fluids.ModFluids;
+import me.km.items.ModItems;
 import net.minecraft.block.Block;
+import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.item.ItemBlock;
 import net.minecraftforge.fml.common.registry.GameRegistry;
 
 public class ModBlocks 
 {
-    public static BlockBase copperOre;
+    // ores + blocks
+    public static BlockOre copperOre;
     public static BlockBase copperBlock;
     
+    public static BlockOre tinOre;
+    public static BlockBase tinBlock;
+    
+    public static BlockBase bronzeBlock;
+    
+    // misc
     public static BlockBase guildblock;
+    public static BlockHay realHayBlock;
+    public static BlockBed realHayBed;
     
+    // fluids
     public static BlockFluidPoison poison;
     public static BlockFluidHoney honey;
     
     public static void init() 
     {
-        copperOre = register((BlockBase) new BlockBase(Material.ROCK, "copper_ore", "oreCopper")
-                .setHardness(3.0F)
-                .setResistance(5.0F));
-        copperOre = register((BlockBase) new BlockBase(Material.IRON, "copper_block", "blockCopper")
-                .setHardness(4.0F)
-                .setResistance(10.0F));
+        // ores + blocks
+        copperOre = register(new BlockOre("copper_ore", "oreCopper"));      
+        copperBlock = register((BlockBase) new BlockBase(Material.IRON, "copper_block", "blockCopper")
+                .setHardness(3).setResistance(10));
+        tinOre = register(new BlockOre("tin_ore", "oreTin"));      
+        tinBlock = register((BlockBase) new BlockBase(Material.IRON, "tin_block", "blockTin")
+                .setHardness(3).setResistance(5));
+        bronzeBlock = register((BlockBase) new BlockBase(Material.IRON, "bronze_block", "blockBronze")
+                .setHardness(5).setResistance(10));
         
+        // misc
         guildblock = register((BlockBase) new BlockBase(Material.IRON, "guild_block", "blockGuild")
-                .setHardness(50.0F)
-                .setResistance(2000.0F));
+                .setHardness(50.0F).setResistance(2000.0F));
+        realHayBlock = register((BlockHay) new BlockHay("real_hay_block", "realHayBlock")
+                .setSoundType(SoundType.PLANT).setHardness(0.5F));
+        realHayBed = registerBlock(new BlockBed("real_hay_bed", "realHayBlock", ModItems.realHayBed));
     
+        // fluids
         poison = register(new BlockFluidPoison(ModFluids.poison, Material.WATER));
         honey = register(new BlockFluidHoney(ModFluids.honey, Material.WATER));
     }
@@ -40,9 +59,9 @@ public class ModBlocks
     {
         GameRegistry.register(block);
         GameRegistry.register(itemBlock);
-        if(block instanceof BlockBase) 
+        if(block instanceof IBlockBase) 
         {
-            ((BlockBase) block).registerItemModel(itemBlock);
+            ((IBlockBase) block).registerItemModel(itemBlock);
         }
         if(block instanceof BlockFluidBase) 
         {
@@ -50,6 +69,12 @@ public class ModBlocks
         }
         return block;
     }
+    
+    private static <T extends Block> T registerBlock(T block) 
+    {
+        GameRegistry.register(block);
+        return block;
+    }
 
     private static <T extends Block> T register(T block) 
     {

+ 2 - 5
src/main/java/me/km/dimensions/ChangeWorldEvent.java

@@ -60,7 +60,7 @@ public class ChangeWorldEvent extends ModuleListener
         {
             s = ModDimensions.getWorldName(DimensionManager.getWorld(dimension));
         }
-        SimpleConfig sp = new SimpleConfig(KajetansMod.worldManager, "world/" + p.getUniqueID() + "/" + s + ".yml", false);  
+        SimpleConfig sp = new SimpleConfig(KajetansMod.worldManager, "worldinfo/" + p.getUniqueID() + "/" + s, false);  
         
         // general data
         sp.setInt("exp", p.experienceTotal);     
@@ -126,7 +126,7 @@ public class ChangeWorldEvent extends ModuleListener
         {
             s = ModDimensions.getWorldName(DimensionManager.getWorld(dimension));
         }
-        SimpleConfig sp = new SimpleConfig(KajetansMod.worldManager, "world/" + p.getUniqueID() + "/" + s + ".yml", true); 
+        SimpleConfig sp = new SimpleConfig(KajetansMod.worldManager, "worldinfo/" + p.getUniqueID() + "/" + s, true); 
         if(!sp.exists())
         {
             this.getModule().sendToConsole("Der Spieler '" + p.getName() + "' hat keine Daten in der Welt '" + s + "'.");
@@ -161,7 +161,6 @@ public class ChangeWorldEvent extends ModuleListener
         for(counter = 0; counter < inv.size(); counter++)
         {
             inv.set(counter, sp.getItemStack("inv." + counter)); 
-            counter++;
         }
         
         // armor inventory
@@ -169,7 +168,6 @@ public class ChangeWorldEvent extends ModuleListener
         for(counter = 0; counter < inv.size(); counter++)
         {
             inv.set(counter, sp.getItemStack("armor." + counter)); 
-            counter++;
         }
         
         // offhand inventory
@@ -177,7 +175,6 @@ public class ChangeWorldEvent extends ModuleListener
         for(counter = 0; counter < inv.size(); counter++)
         {
             inv.set(counter, sp.getItemStack("offhand." + counter)); 
-            counter++;
         }
         
         // enderchest

+ 6 - 4
src/main/java/me/km/effects/CommandWand.java

@@ -1,21 +1,23 @@
 package me.km.effects;
 
+import java.util.Arrays;
+import java.util.stream.Collectors;
 import me.km.api.GlobalText;
 import me.km.api.Module;
-import me.km.api.ModuleCommand;
+import me.km.api.ModuleTabCommand;
 import me.km.items.ItemWand;
 import me.km.permissions.Permissions;
 import net.minecraft.command.ICommandSender;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.ItemStack;
 
-public class CommandWand extends ModuleCommand
+public class CommandWand extends ModuleTabCommand
 {   
     public CommandWand(Module m) 
     {
-        super("wand", m);
+        super("magicwand", m, Arrays.stream(Effect.values()).map(n -> n.getEffectString()).filter(o -> o != null).collect(Collectors.toList()), 0);
         super.setDescription("Belegt deinen Zauberstab mit einem Effekt");
-        super.setUsage("/wand <effect>");
+        super.setUsage("/magicwand <effect>");
         super.setPermission(Permissions.WAND);
     }
 

+ 2 - 0
src/main/java/me/km/effects/Effect.java

@@ -81,6 +81,7 @@ public enum Effect
     FLYING                  (Flying.class),
     FREEZE                  (Freeze.class),
     GRAPPLING_HOOK          (GrapplingHook.class),
+    GRAVITY                 (Gravity.class),
     HARM                    (Harm.class),
     HARVEST                 (Harvest.class),
     HEAL                    (Heal.class),
@@ -119,6 +120,7 @@ public enum Effect
     SPRINT                  (Sprint.class),
     STONE                   (Stone.class),
     SUN                     (Sun.class),
+    TELEPORT_BLOCK          (TeleportBlock.class),
     TELEPORT_PLAYER         (TeleportPlayer.class),
     THOR                    (Thor.class),
     UNLUCKY                 (Unlucky.class),

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

@@ -83,14 +83,18 @@ public class EffectUtils extends Module
         KajetansMod.scheduler.scheduleTask(() -> removeInvalidData(ent), 100);
     }
     
-    public Object hasEntityData(Entity ent, String key)
+    public Object getEntityData(Entity ent, String key)
     {
         EntityData data = entityData.get(ent.getEntityId());
         if(data == null)
         {
             return null;
         }
-        return data.data;
+        if(data.s.equals(key))
+        {
+            return data.data;
+        }
+        return null;
     }
     
     // -----------------------------------------------------------------------------------

+ 5 - 5
src/main/java/me/km/effects/passive/ArrowEffects.java

@@ -70,11 +70,11 @@ public class ArrowEffects extends ModuleListener
         EntityPlayer p = Utils.getDamager(e.getSource());
         if(p != null)
         {
-            if(KajetansMod.effects.hasEntityData(ent, "arcaneshot") != null)
+            if(KajetansMod.effects.getEntityData(ent, "arcaneshot") != null)
             {
                 Utils.teleportEntity(ent, p);
             }
-            else if(KajetansMod.effects.hasEntityData(ent, "rapidfire") != null)
+            else if(KajetansMod.effects.getEntityData(ent, "rapidfire") != null)
             {
                 p.heal(2);
             }
@@ -90,7 +90,7 @@ public class ArrowEffects extends ModuleListener
         }
         EntityPlayerMP p = (EntityPlayerMP) player;
         WorldServer w = p.getServerWorld();
-        Integer fromList = (Integer) KajetansMod.effects.hasEntityData(p, "clusterbomb");
+        Integer fromList = (Integer) KajetansMod.effects.getEntityData(p, "clusterbomb");
         if(fromList != null)
         {
             int power = fromList * 600;
@@ -106,7 +106,7 @@ public class ArrowEffects extends ModuleListener
             });
             arrow.setDead();
         }
-        else if(KajetansMod.effects.hasEntityData(p, "grapplinghook") != null)
+        else if(KajetansMod.effects.getEntityData(p, "grapplinghook") != null)
         {
             EffectBlockChanger list = new EffectBlockChanger(w);
             BlockPos pos = arrow.getPosition();
@@ -147,7 +147,7 @@ public class ArrowEffects extends ModuleListener
     {       
         EntityThrowable pro = e.getEntityThrowable();
         if(pro instanceof EntitySnowball || !(pro.getThrower() instanceof EntityPlayerMP) ||
-            KajetansMod.effects.hasEntityData(pro, "smokebomb") == null || 
+            KajetansMod.effects.getEntityData(pro, "smokebomb") == null || 
             !KajetansMod.worldManager.getWorldPreferences(pro.world).skills)
         {
             return;

+ 32 - 0
src/main/java/me/km/inventory/CustomContainer.java

@@ -1,5 +1,6 @@
 package me.km.inventory;
 
+import me.km.KajetansMod;
 import me.km.snuviscript.SnuviInventory;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
@@ -12,14 +13,18 @@ import net.minecraft.network.play.server.SPacketOpenWindow;
 
 public class CustomContainer extends ContainerChest
 {
+    private boolean canBeClosed;
+    
     public CustomContainer(String title, int slotCount, EntityPlayerMP p) 
     {
         super(p.inventory, new EntityInventory(title, slotCount, p), p);
+        canBeClosed = true;
     }
     
     public CustomContainer(SnuviInventory inv, EntityPlayerMP p) 
     {
         super(p.inventory, inv, p);
+        canBeClosed = true;
     }
     
     public InventoryBasic getShownInventory()
@@ -29,6 +34,16 @@ public class CustomContainer extends ContainerChest
     
     public void openForPlayer(EntityPlayerMP p)
     {
+        // opening container on next tick to prevent closing during noClicking or onCanceledClick
+        if(p.openContainer instanceof CustomContainer)
+        {
+            CustomContainer cc = (CustomContainer) p.openContainer;
+            if(!cc.canBeClosed)
+            {
+                KajetansMod.scheduler.scheduleTask(() -> openForPlayer(p));
+                return;
+            }
+        }
         if(p.openContainer != p.inventoryContainer)
         {
             p.closeScreen();
@@ -52,11 +67,14 @@ public class CustomContainer extends ContainerChest
         if(p instanceof EntityPlayerMP)
         {
             EntityPlayerMP player = (EntityPlayerMP) p;
+            canBeClosed = false;
             if(noClicking(slotId, dragType, clickTypeIn, player))
             {
                 onCanceledClick(slotId, dragType, clickTypeIn, player);
+                canBeClosed = true;
                 return ItemStack.EMPTY;
             }
+            canBeClosed = true;
         }
         return super.slotClick(slotId, dragType, clickTypeIn, p);
     }  
@@ -64,4 +82,18 @@ public class CustomContainer extends ContainerChest
     public void onCanceledClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayerMP player)
     {
     }
+
+    @Override
+    public void onContainerClosed(EntityPlayer p) 
+    {
+        if(canBeClosed)
+        {
+            super.onContainerClosed(p);
+        }
+        else
+        {
+            // closing container on next tick to prevent closing during noClicking or onCanceledClick
+            KajetansMod.scheduler.scheduleTask(() -> super.onContainerClosed(p));
+        }
+    }
 }

+ 84 - 0
src/main/java/me/km/items/ItemBed.java

@@ -0,0 +1,84 @@
+package me.km.items;
+
+import me.km.blocks.ModBlocks;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockBed;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumActionResult;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.SoundCategory;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.world.World;
+
+public class ItemBed extends ItemBase
+{
+    public ItemBed(String name, String local) 
+    {
+        super(name, local);
+        super.setCreativeTab(CreativeTabs.DECORATIONS);
+    }
+
+    @Override
+    public EnumActionResult onItemUse(EntityPlayer p, World w, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
+    {
+        if(w.isRemote)
+        {
+            return EnumActionResult.SUCCESS;
+        }
+        else if(facing != EnumFacing.UP)
+        {
+            return EnumActionResult.FAIL;
+        }
+        else
+        {
+            IBlockState iblockstate = w.getBlockState(pos);
+            Block block = iblockstate.getBlock();
+            boolean flag = block.isReplaceable(w, pos);
+
+            if (!flag)
+            {
+                pos = pos.up();
+            }
+
+            int i = MathHelper.floor((double)(p.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+            EnumFacing enumfacing = EnumFacing.getHorizontal(i);
+            BlockPos blockpos = pos.offset(enumfacing);
+            ItemStack itemstack = p.getHeldItem(hand);
+
+            if (p.canPlayerEdit(pos, facing, itemstack) && p.canPlayerEdit(blockpos, facing, itemstack))
+            {
+                IBlockState iblockstate1 = w.getBlockState(blockpos);
+                boolean flag1 = iblockstate1.getBlock().isReplaceable(w, blockpos);
+                boolean flag2 = flag || w.isAirBlock(pos);
+                boolean flag3 = flag1 || w.isAirBlock(blockpos);
+
+                if (flag2 && flag3 && w.getBlockState(pos.down()).isTopSolid() && w.getBlockState(blockpos.down()).isTopSolid())
+                {
+                    IBlockState iblockstate2 = ModBlocks.realHayBed.getDefaultState().withProperty(BlockBed.OCCUPIED, false).withProperty(BlockBed.FACING, enumfacing).withProperty(BlockBed.PART, BlockBed.EnumPartType.FOOT);
+                    w.setBlockState(pos, iblockstate2, 10);
+                    w.setBlockState(blockpos, iblockstate2.withProperty(BlockBed.PART, BlockBed.EnumPartType.HEAD), 10);
+                    w.notifyNeighborsRespectDebug(pos, block, false);
+                    w.notifyNeighborsRespectDebug(blockpos, iblockstate1.getBlock(), false);
+                    SoundType soundtype = iblockstate2.getBlock().getSoundType(iblockstate2, w, pos, p);
+                    w.playSound((EntityPlayer)null, pos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F);
+                    itemstack.shrink(1);
+                    return EnumActionResult.SUCCESS;
+                }
+                else
+                {
+                    return EnumActionResult.FAIL;
+                }
+            }
+            else
+            {
+                return EnumActionResult.FAIL;
+            }
+        }
+    }
+}

+ 71 - 9
src/main/java/me/km/items/ModItems.java

@@ -20,11 +20,14 @@ public class ModItems
         DIAMOND(3, 1561, 8.0F, 3.0F, 10),
         GOLD(0, 32, 12.0F, 0.0F, 22);
 
+        for axes
         ATTACK_DAMAGES {6.0F, 8.0F, 8.0F, 8.0F, 6.0F}
         ATTACK_SPEEDS { -3.2F, -3.2F, -3.1F, -3.0F, -3.0F}
     */
     public static final Item.ToolMaterial TOOL_COPPER = 
-            EnumHelper.addToolMaterial("COPPER", 1, 168, 8, 1, 18);
+            EnumHelper.addToolMaterial("COPPER", 1, 161, 6, 1, 18);
+    public static final Item.ToolMaterial TOOL_BRONZE = 
+            EnumHelper.addToolMaterial("BRONZE", 2, 208, 7, 1.5f, 15);
     
     /*
         String nameIn, int maxDamageFactorIn, int[] damageReductionAmountArrayIn, 
@@ -36,52 +39,111 @@ public class ModItems
         DIAMOND("diamond", 33, new int[]{3, 6, 8, 3}, 10, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 2.0F);
     */
     public static final ArmorMaterial ARMOR_COPPER = 
-            EnumHelper.addArmorMaterial("COPPER", KajetansMod.MODID + ":copper", 10, 
-                    new int[]{1, 4, 5, 2}, 20, SoundEvents.ITEM_ARMOR_EQUIP_CHAIN, 0);
+            EnumHelper.addArmorMaterial("COPPER", KajetansMod.MODID + ":copper", 9, 
+                    new int[]{1, 4, 5, 1}, 20, SoundEvents.ITEM_ARMOR_EQUIP_CHAIN, 0);
+    public static final ArmorMaterial ARMOR_BRONZE = 
+            EnumHelper.addArmorMaterial("BRONZE", KajetansMod.MODID + ":bronze", 13, 
+                    new int[]{2, 5, 6, 2}, 20, SoundEvents.ITEM_ARMOR_EQUIP_CHAIN, 0);
     
+    // nuggets and ingots
     public static ItemBase copperIngot;
     public static ItemBase copperNugget;
     
+    public static ItemBase tinIngot;
+    public static ItemBase tinNugget;
+    
+    public static ItemBase bronzeIngot;
+    public static ItemBase bronzeNugget;
+    
+    // tools and swords
     public static ItemSword copperSword;
     public static ItemSpade copperShovel;
     public static ItemPickaxe copperPickaxe;
     public static ItemAxe copperAxe;
     public static ItemHoe copperHoe;
     
+    public static ItemSword bronzeSword;
+    public static ItemSpade bronzeShovel;
+    public static ItemPickaxe bronzePickaxe;
+    public static ItemAxe bronzeAxe;
+    public static ItemHoe bronzeHoe;
+    
+    // armor
     public static ItemArmor copperHelmet;
     public static ItemArmor copperChestplate;
     public static ItemArmor copperLeggings;
     public static ItemArmor copperBoots;
     
+    public static ItemArmor bronzeHelmet;
+    public static ItemArmor bronzeChestplate;
+    public static ItemArmor bronzeLeggings;
+    public static ItemArmor bronzeBoots;
+    
+    // wands
     public static ItemWand woodenWand;
     
+    // coins
+    public static ItemBase copperCoin;
+    public static ItemBase silverCoin;
+    public static ItemBase goldCoin;
+    
+    // misc
     public static ItemScroll scroll;
+    public static ItemBed realHayBed; 
     
     public static void init() 
     {
+        // nuggets and ingots
 	copperIngot = register(new ItemBase("copper_ingot", "ingotCopper").setCreativeTab(CreativeTabs.MATERIALS));
         copperNugget = register(new ItemBase("copper_nugget", "copperNugget").setCreativeTab(CreativeTabs.MATERIALS));
         
+        tinIngot = register(new ItemBase("tin_ingot", "ingotTin").setCreativeTab(CreativeTabs.MATERIALS));
+        tinNugget = register(new ItemBase("tin_nugget", "tinNugget").setCreativeTab(CreativeTabs.MATERIALS));
+        
+        bronzeIngot = register(new ItemBase("bronze_ingot", "ingotBronze").setCreativeTab(CreativeTabs.MATERIALS));
+        bronzeNugget = register(new ItemBase("bronze_nugget", "bronzeNugget").setCreativeTab(CreativeTabs.MATERIALS));
+        
+        // repair items
+        TOOL_COPPER.setRepairItem(new ItemStack(copperIngot));
+        ARMOR_COPPER.setRepairItem(new ItemStack(copperIngot));
+        TOOL_BRONZE.setRepairItem(new ItemStack(bronzeIngot));
+        ARMOR_BRONZE.setRepairItem(new ItemStack(bronzeIngot));
+        
+        // tools and swords
         copperSword =  register(new ItemSword(TOOL_COPPER, "copper_sword", "swordCopper"));
         copperShovel = register(new ItemSpade(TOOL_COPPER, "copper_shovel", "shovelCopper"));
         copperPickaxe = register(new ItemPickaxe(TOOL_COPPER, "copper_pickaxe", "pickaxeCopper"));
         copperAxe = register(new ItemAxe(TOOL_COPPER, 7, -3.1f, "copper_axe", "hatchetCopper"));
         copperHoe = register(new ItemHoe(TOOL_COPPER, "copper_hoe", "hoeCopper"));
         
+        bronzeSword =  register(new ItemSword(TOOL_BRONZE, "bronze_sword", "swordBronze"));
+        bronzeShovel = register(new ItemSpade(TOOL_BRONZE, "bronze_shovel", "shovelBronze"));
+        bronzePickaxe = register(new ItemPickaxe(TOOL_BRONZE, "bronze_pickaxe", "pickaxeBronze"));
+        bronzeAxe = register(new ItemAxe(TOOL_BRONZE, 8, -3.0f, "bronze_axe", "hatchetBronze"));
+        bronzeHoe = register(new ItemHoe(TOOL_BRONZE, "bronze_hoe", "hoeBronze"));
+               
+        // armor
         copperHelmet = register(new ItemArmor(ARMOR_COPPER, EntityEquipmentSlot.HEAD, "copper_helmet", "helmetCopper"));
         copperChestplate = register(new ItemArmor(ARMOR_COPPER, EntityEquipmentSlot.CHEST, "copper_chestplate", "chestplateCopper"));
         copperLeggings = register(new ItemArmor(ARMOR_COPPER, EntityEquipmentSlot.LEGS, "copper_leggings", "leggingsCopper"));
         copperBoots = register(new ItemArmor(ARMOR_COPPER, EntityEquipmentSlot.FEET, "copper_boots", "bootsCopper"));
         
+        bronzeHelmet = register(new ItemArmor(ARMOR_BRONZE, EntityEquipmentSlot.HEAD, "bronze_helmet", "helmetBronze"));
+        bronzeChestplate = register(new ItemArmor(ARMOR_BRONZE, EntityEquipmentSlot.CHEST, "bronze_chestplate", "chestplateBronze"));
+        bronzeLeggings = register(new ItemArmor(ARMOR_BRONZE, EntityEquipmentSlot.LEGS, "bronze_leggings", "leggingsBronze"));
+        bronzeBoots = register(new ItemArmor(ARMOR_BRONZE, EntityEquipmentSlot.FEET, "bronze_boots", "bootsBronze"));
+        
+        // wands
         woodenWand = register(new ItemWand("wood_wand", "wandWood", Item.ToolMaterial.WOOD, 1));
         
+        // coins
+        copperCoin = register(new ItemBase("coin_copper", "coinCopper").setCreativeTab(CreativeTabs.MISC));
+        silverCoin = register(new ItemBase("coin_silver", "coinSilver").setCreativeTab(CreativeTabs.MISC));
+        goldCoin = register(new ItemBase("coin_gold", "coinGold").setCreativeTab(CreativeTabs.MISC));
+        
+        // misc
         scroll = register((ItemScroll) new ItemScroll("scroll", "scroll").setCreativeTab(CreativeTabs.MISC));
-    }
-    
-    public static void lateInit() 
-    {
-        TOOL_COPPER.setRepairItem(new ItemStack(copperIngot));
-        ARMOR_COPPER.setRepairItem(new ItemStack(copperIngot));
+        realHayBed = register(new ItemBed("real_hay_bed", "realHayBed"));
     }
 	
     private static <T extends Item> T register(T item) 

+ 162 - 0
src/main/java/me/km/items/ModRecipes.java

@@ -0,0 +1,162 @@
+package me.km.items;
+
+import me.km.blocks.ModBlocks;
+import net.minecraft.block.Block;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.FurnaceRecipes;
+
+public class ModRecipes 
+{    
+    public static void init() 
+    {
+	CraftingManager cm = CraftingManager.getInstance();
+        FurnaceRecipes fr = FurnaceRecipes.instance();
+
+        // misc
+        cm.addShapelessRecipe(new ItemStack(ModItems.bronzeIngot, 9), new Object[] 
+        {
+            ModItems.copperIngot, ModItems.copperIngot, ModItems.copperIngot,
+            ModItems.copperIngot, ModItems.copperIngot, ModItems.copperIngot,
+            ModItems.copperIngot, ModItems.copperIngot, ModItems.tinIngot
+        });
+        
+        // furnace recipes
+        fr.addSmeltingRecipeForBlock(ModBlocks.copperOre, new ItemStack(ModItems.copperIngot), 0.5f);
+        fr.addSmeltingRecipeForBlock(ModBlocks.tinOre, new ItemStack(ModItems.tinIngot), 1);
+        
+        // armor recipes
+        String[][] armorPatterns = new String[][] {{"XXX", "X X"}, {"X X", "XXX", "XXX"}, {"XXX", "X X", "X X"}, {"X X", "X X"}};
+        Item[][] armorItems = new Item[][] 
+        {
+            {ModItems.copperIngot, ModItems.bronzeIngot}, 
+            {ModItems.copperHelmet, ModItems.bronzeHelmet}, 
+            {ModItems.copperChestplate, ModItems.bronzeChestplate}, 
+            {ModItems.copperLeggings, ModItems.bronzeLeggings}, 
+            {ModItems.copperBoots, ModItems.bronzeBoots}
+        };
+        addArmorRecipes(cm, armorPatterns, armorItems);
+        
+        // tool recipes
+        String[][] toolPatterns = new String[][] {{"XXX", " # ", " # "}, {"X", "#", "#"}, {"XX", "X#", " #"}, {"XX", " #", " #"}};
+        Object[][] toolItems = new Object[][] 
+        {
+            {ModItems.copperIngot, ModItems.bronzeIngot}, 
+            {ModItems.copperPickaxe, ModItems.bronzePickaxe}, 
+            {ModItems.copperShovel, ModItems.bronzeShovel}, 
+            {ModItems.copperAxe, ModItems.bronzeAxe}, 
+            {ModItems.copperHoe, ModItems.bronzeHoe}
+        };
+        addToolRecipes(cm, toolPatterns, toolItems);
+        
+        // weapon recipes
+        String[][] weaponPatterns = new String[][] {{"X", "X", "#"}};
+        Object[][] weaponItems = new Object[][] 
+        {
+            {ModItems.copperIngot, ModItems.bronzeIngot}, 
+            {ModItems.copperSword, ModItems.bronzeSword}
+        };
+        addWeaponRecipes(cm, weaponPatterns, weaponItems);
+        
+        // block <-> parts <-> smaller parts recipes
+        Object[][] ingotItems = new Object[][] 
+        {
+            {ModBlocks.copperBlock, new ItemStack(ModItems.copperIngot, 9)}, 
+            {ModItems.copperIngot, new ItemStack(ModItems.copperNugget, 9)}, 
+            {ModBlocks.tinBlock, new ItemStack(ModItems.tinIngot, 9)}, 
+            {ModItems.tinIngot, new ItemStack(ModItems.tinNugget, 9)}, 
+            {ModBlocks.bronzeBlock, new ItemStack(ModItems.bronzeIngot, 9)}, 
+            {ModItems.bronzeIngot, new ItemStack(ModItems.bronzeNugget, 9)}, 
+        };
+        addIngotRecipes(cm, ingotItems);
+
+        addNuggetRecipes(fr, toolItems, armorItems, weaponItems, ModItems.copperNugget, ModItems.bronzeNugget);
+    }
+
+    private static void addArmorRecipes(CraftingManager cm, String[][] armorPatterns, Item[][] armorItems)
+    {
+        for (int i = 0; i < armorItems[0].length; ++i)
+        {
+            Item item = armorItems[0][i];
+
+            for (int j = 0; j < armorItems.length - 1; ++j)
+            {
+                Item item2 = armorItems[j + 1][i];
+                cm.addRecipe(new ItemStack(item2), new Object[] {armorPatterns[j], 'X', item});
+            }
+        }
+    }
+    
+    private static void addToolRecipes(CraftingManager cm, String[][] toolPatterns, Object[][] toolItems)
+    {
+        for (int i = 0; i < toolItems[0].length; ++i)
+        {
+            Object object = toolItems[0][i];
+
+            for (int j = 0; j < toolItems.length - 1; ++j)
+            {
+                Item item = (Item) toolItems[j + 1][i];
+                cm.addRecipe(new ItemStack(item), new Object[] {toolPatterns[j], '#', Items.STICK, 'X', object});
+            }
+        }
+    }
+    
+    private static void addWeaponRecipes(CraftingManager cm, String[][] weaponPatterns, Object[][] weaponItems)
+    {
+        for (int i = 0; i < weaponItems[0].length; ++i)
+        {
+            Object object = weaponItems[0][i];
+            for (int j = 0; j < weaponItems.length - 1; ++j)
+            {
+                Item item = (Item) weaponItems[j + 1][i];
+                cm.addRecipe(new ItemStack(item), new Object[] {weaponPatterns[j], '#', Items.STICK, 'X', object});
+            }
+        }
+    }
+
+    private static void addIngotRecipes(CraftingManager cm, Object[][] ingotItems)
+    {
+        for(Object[] aobject : ingotItems)
+        {
+            try
+            {
+                Item block = (Item) aobject[0];
+                ItemStack parts = (ItemStack) aobject[1];
+                ItemStack ingot = parts.copy();
+                ingot.setCount(1);
+                cm.addRecipe(new ItemStack(block), new Object[] {"###", "###", "###", '#', ingot});
+                cm.addRecipe(parts, new Object[] {"#", '#', block});
+            }
+            catch(ClassCastException ex)
+            {
+                Block block = (Block) aobject[0];
+                ItemStack parts = (ItemStack) aobject[1];
+                ItemStack ingot = parts.copy();
+                ingot.setCount(1);
+                cm.addRecipe(new ItemStack(block), new Object[] {"###", "###", "###", '#', ingot});
+                cm.addRecipe(parts, new Object[] {"#", '#', block});
+            }
+        }
+    }
+    
+    private static void addNuggetRecipes(FurnaceRecipes fr, Object[][] toolItems, Item[][] armorItems, Object[][] weaponItems, Item... nuggets)
+    {
+        for(int i = 0; i < nuggets.length; i++)
+        {
+            for(int j = 1; j < toolItems.length; j++)
+            {
+                fr.addSmelting((Item) toolItems[j][i], new ItemStack(nuggets[i]), 0.1f);
+            }
+            for(int j = 1; j < armorItems.length; j++)
+            {
+                fr.addSmelting((Item) armorItems[j][i], new ItemStack(nuggets[i]), 0.1f);
+            }
+            for(int j = 1; j < weaponItems.length; j++)
+            {
+                fr.addSmelting((Item) weaponItems[j][i], new ItemStack(nuggets[i]), 0.1f);
+            }
+        }
+    }
+}

+ 5 - 4
src/main/java/me/km/playerbank/ModDedicatedPlayerList.java

@@ -100,6 +100,7 @@ public class ModDedicatedPlayerList extends DedicatedPlayerList
             p.setPosition(spawnPoint.getX(), spawnPoint.getY(), spawnPoint.getZ());
         }
         p.setWorld(playerWorld);
+
         p.interactionManager.setWorld(playerWorld);
         
         String s = "local";
@@ -112,6 +113,9 @@ public class ModDedicatedPlayerList extends DedicatedPlayerList
         WorldInfo worldinfo = playerWorld.getWorldInfo();
         this.setPlayerGameTypeBasedOnOther(p, null, playerWorld);
         p.connection = nethandlerplayserver;
+        // send custom loaded dimensions to the player
+        ModDimensions.sendNotificationsForDimensions(p);
+        // End
         nethandlerplayserver.sendPacket(new SPacketJoinGame(p.getEntityId(), p.interactionManager.getGameType(), worldinfo.isHardcoreModeEnabled(), p.dimension, playerWorld.getDifficulty(), this.getMaxPlayers(), worldinfo.getTerrainType(), playerWorld.getGameRules().getBoolean("reducedDebugInfo")));
         nethandlerplayserver.sendPacket(new SPacketCustomPayload("MC|Brand", (new PacketBuffer(Unpooled.buffer())).writeString(this.getServerInstance().getServerModName())));
         nethandlerplayserver.sendPacket(new SPacketServerDifficulty(worldinfo.getDifficulty(), worldinfo.isDifficultyLocked()));
@@ -197,10 +201,7 @@ public class ModDedicatedPlayerList extends DedicatedPlayerList
         }
 
         p.addSelfToInternalCraftingInventory();
-        
-        // send custom loaded dimensions to the player
-        ModDimensions.sendNotificationsForDimensions(p);
-        
+
         net.minecraftforge.fml.common.FMLCommonHandler.instance().firePlayerLoggedIn(p);
     }
     

+ 8 - 0
src/main/java/me/km/playerbank/ModNetHandlerPlayServer.java

@@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.network.NetHandlerPlayServer;
 import net.minecraft.network.NetworkManager;
+import net.minecraft.network.play.client.CPacketAnimation;
 import net.minecraft.network.play.client.CPacketChatMessage;
 import net.minecraft.network.play.server.SPacketChat;
 import net.minecraft.server.MinecraftServer;
@@ -95,4 +96,11 @@ public class ModNetHandlerPlayServer extends NetHandlerPlayServer
             this.serverController.initiateShutdown();
         }
     }
+
+    @Override
+    public void handleAnimation(CPacketAnimation packetIn) 
+    {
+        super.handleAnimation(packetIn);
+        scriptEvents.onArmSwing(this.player, packetIn.getHand());
+    }
 }

+ 7 - 3
src/main/java/me/km/playerbank/PlayerLogInOut.java

@@ -23,11 +23,15 @@ public class PlayerLogInOut extends ModuleListener
     }
     
     @SubscribeEvent(priority = EventPriority.HIGH)
-    public void onPlayerJoin(PlayerJoinMessageEvent e)
+    public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent e)
     {
-        EntityPlayer p = e.getEntityPlayer();
+        EntityPlayer p = e.player;
+        if(p == null)
+        {
+            return;
+        }
         
-        if(Utils.hasPlayedBefore(p)) // first join
+        if(!Utils.hasPlayedBefore(p)) // first join
         {
             Utils.teleportEntity(p, Utils.getSpawn());
         }

+ 41 - 13
src/main/java/me/km/scheduler/SnuviScheduler.java

@@ -1,5 +1,7 @@
 package me.km.scheduler;
 
+import java.util.ArrayList;
+import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -11,6 +13,8 @@ public class SnuviScheduler extends Module
 {
     private boolean checker;
     private int counter;
+    private final ArrayList<SnuviTask> addQueue;
+    private final ArrayList<Integer> removeQueue;
     private final HashMap<Integer, SnuviTask> tasks;
     
     public SnuviScheduler(String mname, String prefix, TextFormatting color)
@@ -18,17 +22,19 @@ public class SnuviScheduler extends Module
         super(mname, prefix, color);
         counter = 0;
         tasks = new HashMap<>();
+        addQueue = new ArrayList<>();
+        removeQueue = new ArrayList<>();
     }
     
     public void cancelTask(int id)
     {
-        tasks.remove(id);
+        removeQueue.add(id);
     }
     
     public int scheduleRepeatingTask(Runnable r, long ticks, long rtimer)
     {
         counter++;
-        tasks.put(counter, new SnuviTask(r, ticks, rtimer));
+        addQueue.add(new SnuviTask(counter, r, ticks, rtimer));
         return counter;
     }
     
@@ -37,24 +43,46 @@ public class SnuviScheduler extends Module
         return scheduleRepeatingTask(r, delay, 0);
     }
     
+    public int scheduleTask(Runnable r)
+    { 
+        return scheduleTask(r, 0);
+    }
+    
     public void tick()
     {
-        checker = false;
-        long l = System.currentTimeMillis();
-        tasks.values().removeIf(task -> 
+        try
         {
-            if(checker)
+            if(!removeQueue.isEmpty())
             {
-                return false;
+                removeQueue.forEach(i -> tasks.remove(i));
+                removeQueue.clear();
             }
-            if(System.currentTimeMillis() - l > 25)
+            if(!addQueue.isEmpty())
             {
-                checker = true;
-                this.sendWarningToConsole("Der Scheduler ist länger als 25 ms gelaufen.");
-                return false;
+                addQueue.forEach(task -> tasks.put(task.getId(), task));
+                addQueue.clear();
             }
-            return task.tick();
-        });
+            checker = false;
+            long l = System.currentTimeMillis();
+            tasks.values().removeIf(task -> 
+            {
+                if(checker)
+                {
+                    return false;
+                }
+                if(System.currentTimeMillis() - l > 25)
+                {
+                    checker = true;
+                    this.sendWarningToConsole("Der Scheduler ist länger als 25 ms gelaufen.");
+                    return false;
+                }
+                return task.tick();
+            });
+        }
+        catch(ConcurrentModificationException ex)
+        {
+            this.sendWarningToConsole(ex.toString());
+        }
     }
     
     public static void scheduleAsyncTask(Runnable r)

+ 8 - 1
src/main/java/me/km/scheduler/SnuviTask.java

@@ -2,15 +2,22 @@ package me.km.scheduler;
 
 public class SnuviTask
 {
+    private final int id;
     private final long rtimer;
     private final Runnable r;
     private long timer;
     
-    public SnuviTask(Runnable r, long delay, long rtimer)
+    public SnuviTask(int id, Runnable r, long delay, long rtimer)
     {
         this.rtimer = rtimer << 1; // server ticks seems to be 1/40 of a second
         this.timer = delay << 1;
         this.r = r;
+        this.id = id;
+    }
+
+    public int getId() 
+    {
+        return id;
     }
     
     public long getRepeatTimer()

+ 6 - 0
src/main/java/me/km/scoreboard/PlayerScoreboard.java

@@ -60,6 +60,12 @@ public class PlayerScoreboard
             changeNeeded = true;
         }
     }
+    
+    public void clear()
+    {
+        elements.keySet().forEach(i -> toRemove.add(i));
+        update();
+    }
 
     public void update()
     {         

+ 1 - 1
src/main/java/me/km/scoreboard/ScoreboardAPI.java

@@ -47,6 +47,6 @@ public class ScoreboardAPI extends Module
     
     public void resetScoreboard(EntityPlayerMP p)
     {
-        boards.put(p.getUniqueID(), new PlayerScoreboard(p));
+        getScoreboard(p).clear();
     }
 }

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

@@ -22,6 +22,7 @@ public class CommandGiveUp extends ModuleCommand
         super.addAlias("fuckitigiveup");
         super.addAlias("ineedhelp");
         super.addAlias("leave");
+        super.addAlias("l");
     }
 
     @Override

+ 49 - 21
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -167,26 +167,34 @@ public class ScriptEvents extends ModuleListener
     
     public boolean QuestClickInventory(Script qd, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
     {
-        qd.setVar("event", "inv-click");
-        ScriptVars.setPlayerVars(qd, p); 
-        qd.setVar("inv-id", inv.getId());
-        qd.setVar("inv-name", inv.getName());
-        qd.setVar("inv-slot", slot);
-        ScriptVars.setItemVars(qd, inv.getStackInSlot(slot));
-        qd.setVar("cancel", false); 
-        qd.runCode();
-        return qd.getBoolean("cancel");
+        if(qd.isEventLoaded("inv-click"))
+        {
+            qd.setVar("event", "inv-click");
+            ScriptVars.setPlayerVars(qd, p); 
+            qd.setVar("inv-id", inv.getId());
+            qd.setVar("inv-name", inv.getName());
+            qd.setVar("inv-slot", slot);
+            ScriptVars.setItemVars(qd, inv.getStackInSlot(slot));
+            qd.setVar("cancel", false); 
+            qd.runCode();
+            return qd.getBoolean("cancel");
+        }
+        return false;
     }
 
     public boolean QuestCloseInventory(Script qd, SnuviInventory inv, EntityPlayer p)
     {
-        qd.setVar("event", "inv-close");
-        ScriptVars.setPlayerVars(qd, p); 
-        qd.setVar("inv-id", inv.getId());
-        qd.setVar("inv-name", inv.getName());
-        qd.setVar("cancel", false); 
-        qd.runCode();
-        return qd.getBoolean("cancel");
+        if(qd.isEventLoaded("inv-close"))
+        {
+            qd.setVar("event", "inv-close");
+            ScriptVars.setPlayerVars(qd, p); 
+            qd.setVar("inv-id", inv.getId());
+            qd.setVar("inv-name", inv.getName());
+            qd.setVar("cancel", false); 
+            qd.runCode();
+            return qd.getBoolean("cancel");
+        }
+        return false;
     }
     
     @SubscribeEvent
@@ -585,7 +593,29 @@ public class ScriptEvents extends ModuleListener
     }
     
     @SubscribeEvent
-    public void QuestUseitem(LivingEntityUseItemEvent.Start e)
+    public void onItemClick(PlayerInteractEvent.RightClickItem e)
+    {        
+        handleEvent(e.getEntityPlayer(), "item-air-click", (qd) -> 
+        {
+            ScriptVars.setItemVars(qd, e.getItemStack());
+            qd.setVar("hand", e.getHand().toString());
+            qd.setVar("cancel", e.isCanceled());  
+        }, (qd) -> 
+        {
+            e.setCanceled(qd.getBoolean("cancel"));
+        });
+    }
+    
+    public void onArmSwing(EntityPlayer p, EnumHand hand)
+    {        
+        handleEvent(p, "arm-swing", (qd) -> 
+        {
+            qd.setVar("hand", hand);
+        });
+    }
+    
+    @SubscribeEvent
+    public void onItemUseStart(LivingEntityUseItemEvent.Start e)
     {        
         if(!(e.getEntityLiving() instanceof EntityPlayer))
         {
@@ -618,10 +648,7 @@ public class ScriptEvents extends ModuleListener
         }
         handleEvent((EntityPlayer) e.getEntityLiving(), "item-use-finish", (qd) -> 
         {
-            qd.setVar("cancel", e.isCanceled()); 
-        }, (qd) -> 
-        {
-            e.setCanceled(qd.getBoolean("cancel")); 
+            qd.setVar("result-stack", e.getResultStack());  
         });
     }
     
@@ -718,6 +745,7 @@ public class ScriptEvents extends ModuleListener
             if(args.length() == 0)
             {
                 qd.setVar("args", new ArrayList<>());
+                return;
             }
             qd.setVar("args", Arrays.stream(args.trim().split(" ")).map(s -> ScriptUtils.convertInput(s)).collect(Collectors.toList()));
         });

+ 28 - 3
src/main/java/me/km/snuviscript/SnuviParser.java

@@ -67,6 +67,7 @@ import net.minecraft.entity.projectile.EntityPotion;
 import net.minecraft.inventory.EntityEquipmentSlot;
 import net.minecraft.inventory.IInventory;
 import net.minecraft.item.ItemStack;
+import net.minecraft.network.ThreadQuickExitException;
 import net.minecraft.network.play.client.CPacketChatMessage;
 import net.minecraft.network.play.client.CPacketClientStatus;
 import net.minecraft.network.play.server.SPacketSpawnPosition;
@@ -189,7 +190,7 @@ public class SnuviParser
         registerConsumer(list, "player.shootprojectile", (args, qd) -> 
                 EffectUtils.launchProjectile((EntityPlayer) args[0], getClass(args[1].toString()), ScriptUtils.getDouble(args[2]), args[3]));
         registerConsumer(list, "player.respawn", (args, qd) ->
-                ((EntityPlayerMP) args[0]).connection.processClientStatus(new CPacketClientStatus(CPacketClientStatus.State.PERFORM_RESPAWN)));
+                respawnPlayer(args));
         registerConsumer(list, "player.inventorytolist", (args, qd) -> 
                 qd.setVar(args[0], ((EntityPlayer) args[1]).inventory.mainInventory));    
         registerFunction(list, "player.getamount", (args, qd) ->                            
@@ -197,7 +198,7 @@ public class SnuviParser
         registerFunction(list, "player.getnearest", (args, qd) ->                            
                 Utils.getNearestPlayer(((Location) args[0]).getWorld(), ((Location) args[0]).getPos())); 
         registerConsumer(list, "player.say", (args, qd) ->
-                ((EntityPlayerMP) args[0]).connection.processChatMessage(new CPacketChatMessage(ScriptUtils.connect(args, 1))));
+                playerSay(args));
         registerFunction(list, "player.isafk", (args, qd) -> 
                 KajetansMod.afkManager.getEvent(AfkListener.class).isAfk(((EntityPlayer) args[0])));
         registerConsumer(list, "player.speak", (args, qd) -> 
@@ -320,7 +321,7 @@ public class SnuviParser
         registerConsumer(list, "item.drop", (args, qd) ->       
                 dropItem(args));                              
         registerFunction(list, "item.gettype", (args, qd) ->    
-                ((ItemStack) args[0]).getItem().getRegistryName());
+                ((ItemStack) args[0]).getItem().getRegistryName().getResourcePath());
         registerFunction(list, "item.getdata", (args, qd) ->    
                 ((ItemStack) args[0]).getMetadata());           
         registerConsumer(list, "item.setdata", (args, qd) ->    
@@ -992,6 +993,30 @@ public class SnuviParser
     // Quest Befehle
     // -----------------------
     
+    private void playerSay(Object[] args)
+    {
+        try
+        {
+            ((EntityPlayerMP) args[0]).connection.processChatMessage(new CPacketChatMessage(ScriptUtils.connect(args, 1)));
+        }
+        catch(ThreadQuickExitException ex)
+        {
+            // Minecraft needs this for canceling and queueing into main thread
+        }
+    }
+    
+    private void respawnPlayer(Object[] args)
+    {
+        try
+        {
+            ((EntityPlayerMP) args[0]).connection.processClientStatus(new CPacketClientStatus(CPacketClientStatus.State.PERFORM_RESPAWN));
+        }
+        catch(ThreadQuickExitException ex)
+        {
+            // Minecraft needs this for canceling and queueing into main thread
+        }
+    }
+    
     private Class getClass(String s)
     {
         try

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

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

+ 21 - 0
src/main/resources/assets/km/blockstates/real_hay_bed.json

@@ -0,0 +1,21 @@
+{
+    "variants": {
+        "facing=north,occupied=true,part=foot": { "model": "km:real_hay_bed_foot", "y": 180 },
+        "facing=east,occupied=true,part=foot":  { "model": "km:real_hay_bed_foot", "y": 270 },
+        "facing=south,occupied=true,part=foot": { "model": "km:real_hay_bed_foot" },
+        "facing=west,occupied=true,part=foot":  { "model": "km:real_hay_bed_foot", "y": 90 },
+        "facing=north,occupied=true,part=head": { "model": "km:real_hay_bed_head", "y": 180 },
+        "facing=east,occupied=true,part=head":  { "model": "km:real_hay_bed_head", "y": 270 },
+        "facing=south,occupied=true,part=head": { "model": "km:real_hay_bed_head" },
+        "facing=west,occupied=true,part=head":  { "model": "km:real_hay_bed_head", "y": 90 },
+        
+        "facing=north,occupied=false,part=foot": { "model": "km:real_hay_bed_foot", "y": 180 },
+        "facing=east,occupied=false,part=foot":  { "model": "km:real_hay_bed_foot", "y": 270 },
+        "facing=south,occupied=false,part=foot": { "model": "km:real_hay_bed_foot" },
+        "facing=west,occupied=false,part=foot":  { "model": "km:real_hay_bed_foot", "y": 90 },
+        "facing=north,occupied=false,part=head": { "model": "km:real_hay_bed_head", "y": 180 },
+        "facing=east,occupied=false,part=head":  { "model": "km:real_hay_bed_head", "y": 270 },
+        "facing=south,occupied=false,part=head": { "model": "km:real_hay_bed_head" },
+        "facing=west,occupied=false,part=head":  { "model": "km:real_hay_bed_head", "y": 90 }
+    }
+}

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

@@ -0,0 +1,7 @@
+{
+    "variants": {
+        "axis=y": { "model": "km:real_hay" },
+        "axis=z": { "model": "km:real_hay", "x": 90 },
+        "axis=x": { "model": "km:real_hay", "x": 90, "y": 90 }
+    }
+}

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

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

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

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

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

@@ -1,5 +1,9 @@
 item.ingotCopper.name=Copper Ingot
 item.copperNugget.name=Copper Nugget
+item.ingotTin.name=Tin Ingot
+item.tinNugget.name=Tin Nugget
+item.ingotBronze.name=Bronze Ingot
+item.bronzeNugget.name=Bronze Nugget
 
 item.swordCopper.name=Copper Sword
 item.shovelCopper.name=Copper Shovel
@@ -7,18 +11,41 @@ item.pickaxeCopper.name=Copper Pickaxe
 item.hatchetCopper.name=Copper Axe
 item.hoeCopper.name=Copper Hoe
 
+item.swordBronze.name=Bronze Sword
+item.shovelBronze.name=Bronze Shovel
+item.pickaxeBronze.name=Bronze Pickaxe
+item.hatchetBronze.name=Bronze Axe
+item.hoeBronze.name=Bronze Hoe
+
 item.helmetCopper.name=Copper Helmet
 item.chestplateCopper.name=Copper Chestplate
 item.leggingsCopper.name=Copper Leggings
 item.bootsCopper.name=Copper Boots
 
-item.scroll.name=Magic Scroll
+item.helmetBronze.name=Bronze Helmet
+item.chestplateBronze.name=Bronze Chestplate
+item.leggingsBronze.name=Bronze Leggings
+item.bootsBronze.name=Bronze Boots
 
 tile.oreCopper.name=Copper Ore
 tile.blockCopper.name=Copper Block
+tile.oreTin.name=Tin Ore
+tile.blockTin.name=Tin Block
+tile.blockBronze.name=Bronze Block
+
+
+tile.hayBlock.name=Straw Bale
+tile.realHayBlock.name=Hay Bale
+
+
+item.coinCopper.name=Copper Coin
+item.coinSilver.name=Silver Coin
+item.coinGold.name=Gold Coin
 
 tile.fluid.poison.name=Poison
+tile.fluid.honey.name=Honey
 
+item.scroll.name=Magic Scroll
 tile.blockGuild.name=Guild Block
 
 entity.BrownBear.name=Brown Bear

+ 6 - 0
src/main/resources/assets/km/models/block/bronze_block.json

@@ -0,0 +1,6 @@
+{
+    "parent": "block/cube_all",
+    "textures": {
+        "all": "km:blocks/bronze_block"
+    }
+}

+ 16 - 2
src/main/resources/assets/km/models/block/guild_block.json

@@ -1,6 +1,20 @@
 {
-    "parent": "block/cube_all",
+    "parent": "block/cube",
+    "display": {
+        "firstperson_righthand": {
+            "rotation": [ 0, 135, 0 ],
+            "translation": [ 0, 0, 0 ],
+            "scale": [ 0.40, 0.40, 0.40 ]
+        }
+    },
     "textures": {
-        "all": "km:blocks/guild_block"
+        "particle": "km:blocks/guildblock/guildblock_top",
+        "down": "km:blocks/guildblock/guildblock_bottom",
+        "up": "km:blocks/guildblock/guildblock_top",
+        "north": "km:blocks/guildblock/guildblock_back",
+        "east": "km:blocks/guildblock/guildblock_right",
+        "south": "km:blocks/guildblock/guildblock_front",
+        "west": "km:blocks/guildblock/guildblock_left"
     }
 }
+

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

@@ -0,0 +1,7 @@
+{
+    "parent": "block/cube_column",
+    "textures": {
+        "end": "km:blocks/real_hay_block_top",
+        "side": "km:blocks/real_hay_block_side"
+    }
+}

+ 19 - 0
src/main/resources/assets/km/models/block/real_hay_bed_foot.json

@@ -0,0 +1,19 @@
+{
+    "textures": {
+        "particle": "km:blocks/real_hay_block_side",
+        "top": "km:blocks/real_hay_block_side",
+        "side": "km:blocks/real_hay_block_top"
+    },
+    "elements": [
+        {   "from": [ 0, 0, 0 ],
+            "to": [ 16, 2, 16 ],
+            "faces": {
+                "up":    { "uv": [  0, 16, 16, 0 ], "texture": "#top", "rotation": 90 },
+                "down":  { "uv": [  0, 16, 16, 0 ], "texture": "#top", "rotation": 90 },
+                "west":  { "uv": [  0,  0, 16, 2 ], "texture": "#side" },
+                "north": { "uv": [  0,  0, 2, 16 ], "texture": "#top", "rotation": 90 },
+                "east":  { "uv": [  0,  0, 16, 2 ], "texture": "#side" }
+            }
+        }
+    ]
+}

+ 29 - 0
src/main/resources/assets/km/models/block/real_hay_bed_head.json

@@ -0,0 +1,29 @@
+{
+    "textures": {
+        "particle": "km:blocks/real_hay_block_side",
+        "top": "km:blocks/real_hay_block_side",
+        "side": "km:blocks/real_hay_block_top"
+    },
+    "elements": [
+        {   "from": [ 0, 0, 10 ],
+            "to": [ 16, 4, 16 ],
+            "faces": {
+                "up":    { "uv": [  0, 16, 6,  0 ], "texture": "#top", "rotation": 90 },
+                "down":  { "uv": [  10, 16, 16,  0 ], "texture": "#top", "rotation": 90 },
+                "north": { "uv": [  6, 16, 12, 0 ], "texture": "#top",  "rotation": 270 },
+                "south": { "uv": [  4, 16, 10, 0 ], "texture": "#top", "rotation": 90 },
+                "west":  { "uv": [  0, 0, 6, 4 ], "texture": "#side" },
+                "east":  { "uv": [ 0, 0, 6, 4 ], "texture": "#side" }
+            }
+        },
+        {   "from": [ 0, 0, 0 ],
+            "to": [ 16, 2, 10 ],
+            "faces": {
+                "up":    { "uv": [ 0, 16, 10, 0 ], "texture": "#top", "rotation": 90 },
+                "down":  { "uv": [ 0, 16, 10, 0 ], "texture": "#top", "rotation": 90 },
+                "west":  { "uv": [ 0,  0, 10, 2 ], "texture": "#side" },
+                "east":  { "uv": [ 0,  0, 10, 2 ], "texture": "#side" }
+            }
+        }
+    ]
+}

+ 6 - 0
src/main/resources/assets/km/models/block/tin_block.json

@@ -0,0 +1,6 @@
+{
+    "parent": "block/cube_all",
+    "textures": {
+        "all": "km:blocks/tin_block"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/block/tin_ore.json

@@ -0,0 +1,6 @@
+{
+    "parent": "block/cube_all",
+    "textures": {
+        "all": "km:blocks/tin_ore"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_axe"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_boots"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_chestplate"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_helmet"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_hoe"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_ingot"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_leggings"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_nugget"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_pickaxe"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_shovel"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/bronze/bronze_sword"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/coins/coin_copper"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/coins/coin_gold"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/coins/coin_silver"
+    }
+}

+ 1 - 1
src/main/resources/assets/km/models/item/copper_axe.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/handheld",
     "textures": {
-        "layer0": "km:items/copper_axe"
+        "layer0": "km:items/copper/copper_axe"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_boots.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/generated",
     "textures": {
-        "layer0": "km:items/copper_boots"
+        "layer0": "km:items/copper/copper_boots"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_chestplate.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/generated",
     "textures": {
-        "layer0": "km:items/copper_chestplate"
+        "layer0": "km:items/copper/copper_chestplate"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_helmet.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/generated",
     "textures": {
-        "layer0": "km:items/copper_helmet"
+        "layer0": "km:items/copper/copper_helmet"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_hoe.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/handheld",
     "textures": {
-        "layer0": "km:items/copper_hoe"
+        "layer0": "km:items/copper/copper_hoe"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_ingot.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/generated",
     "textures": {
-        "layer0": "km:items/copper_ingot"
+        "layer0": "km:items/copper/copper_ingot"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_leggings.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/generated",
     "textures": {
-        "layer0": "km:items/copper_leggings"
+        "layer0": "km:items/copper/copper_leggings"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_nugget.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/generated",
     "textures": {
-        "layer0": "km:items/copper_nugget"
+        "layer0": "km:items/copper/copper_nugget"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_pickaxe.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/handheld",
     "textures": {
-        "layer0": "km:items/copper_pickaxe"
+        "layer0": "km:items/copper/copper_pickaxe"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_shovel.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/handheld",
     "textures": {
-        "layer0": "km:items/copper_shovel"
+        "layer0": "km:items/copper/copper_shovel"
     }
 }

+ 1 - 1
src/main/resources/assets/km/models/item/copper_sword.json

@@ -1,6 +1,6 @@
 {
     "parent": "item/handheld",
     "textures": {
-        "layer0": "km:items/copper_sword"
+        "layer0": "km:items/copper/copper_sword"
     }
 }

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/real_hay_bed"
+    }
+}

+ 3 - 0
src/main/resources/assets/km/models/item/real_hay_block.json

@@ -0,0 +1,3 @@
+{
+    "parent": "km:block/real_hay"
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/tin/tin_ingot"
+    }
+}

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

@@ -0,0 +1,6 @@
+{
+    "parent": "item/generated",
+    "textures": {
+        "layer0": "km:items/tin/tin_nugget"
+    }
+}

BIN
src/main/resources/assets/km/textures/blocks/bronze_block.png


BIN
src/main/resources/assets/km/textures/blocks/guildblock/guildblock_back.png


BIN
src/main/resources/assets/km/textures/blocks/guildblock/guildblock_bottom.png


BIN
src/main/resources/assets/km/textures/blocks/guildblock/guildblock_front.png


BIN
src/main/resources/assets/km/textures/blocks/guildblock/guildblock_left.png


BIN
src/main/resources/assets/km/textures/blocks/guildblock/guildblock_right.png


BIN
src/main/resources/assets/km/textures/blocks/guildblock/guildblock_top.png


BIN
src/main/resources/assets/km/textures/blocks/tin_block.png


BIN
src/main/resources/assets/km/textures/blocks/tin_ore.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_axe.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_boots.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_chestplate.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_helmet.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_hoe.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_ingot.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_leggings.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_nugget.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_pickaxe.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_shovel.png


BIN
src/main/resources/assets/km/textures/items/bronze/bronze_sword.png


BIN
src/main/resources/assets/km/textures/items/coin_copper.png


BIN
src/main/resources/assets/km/textures/items/coin_gold.png


BIN
src/main/resources/assets/km/textures/items/coin_silver.png


BIN
src/main/resources/assets/km/textures/items/coins/coin_copper.png


BIN
src/main/resources/assets/km/textures/items/coins/coin_gold.png


BIN
src/main/resources/assets/km/textures/items/coins/coin_silver.png


+ 0 - 0
src/main/resources/assets/km/textures/items/copper_axe.png → src/main/resources/assets/km/textures/items/copper/copper_axe.png


+ 0 - 0
src/main/resources/assets/km/textures/items/copper_boots.png → src/main/resources/assets/km/textures/items/copper/copper_boots.png


+ 0 - 0
src/main/resources/assets/km/textures/items/copper_chestplate.png → src/main/resources/assets/km/textures/items/copper/copper_chestplate.png


+ 0 - 0
src/main/resources/assets/km/textures/items/copper_helmet.png → src/main/resources/assets/km/textures/items/copper/copper_helmet.png


+ 0 - 0
src/main/resources/assets/km/textures/items/copper_hoe.png → src/main/resources/assets/km/textures/items/copper/copper_hoe.png


Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff