From 9e06605dad31ee6c1f615c1fba5897acdc7efec7 Mon Sep 17 00:00:00 2001 From: einsteinsci Date: Sun, 3 May 2015 15:14:09 -0700 Subject: [PATCH] Restructured repository. --- build.gradle | 70 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 51017 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 ++++ gradlew.bat | 90 ++ .../einsteinsci/betterbeginnings/ModMain.java | 133 +++ .../blocks/BlockBrickOven.java | 244 +++++ .../blocks/BlockCampfire.java | 200 +++++ .../blocks/BlockDoubleWorkbench.java | 200 +++++ .../blocks/BlockEnderSmelter.java | 244 +++++ .../blocks/BlockInfusionRepairStation.java | 46 + .../betterbeginnings/blocks/BlockKiln.java | 274 ++++++ .../blocks/BlockNetherBrickOven.java | 248 ++++++ .../blocks/BlockObsidianKiln.java | 244 +++++ .../betterbeginnings/blocks/BlockSmelter.java | 244 +++++ .../betterbeginnings/config/BBConfig.java | 162 ++++ .../betterbeginnings/config/BBConfigGui.java | 28 + .../config/BBConfigGuiFactory.java | 35 + .../event/BBEventHandler.java | 479 ++++++++++ .../event/BlockBreakHelper.java | 144 +++ .../event/DamageSourceFace.java | 24 + .../betterbeginnings/event/Worldgen.java | 31 + .../betterbeginnings/gui/BBGuiHandler.java | 155 ++++ .../betterbeginnings/gui/GuiBrickOven.java | 58 ++ .../betterbeginnings/gui/GuiCampfire.java | 64 ++ .../gui/GuiDoubleWorkbench.java | 138 +++ .../betterbeginnings/gui/GuiEnderSmelter.java | 98 +++ .../gui/GuiInfusionRepair.java | 142 +++ .../betterbeginnings/gui/GuiKiln.java | 55 ++ .../gui/GuiNetherBrickOven.java | 144 +++ .../betterbeginnings/gui/GuiObsidianKiln.java | 55 ++ .../gui/GuiSimpleWorkbench.java | 55 ++ .../betterbeginnings/gui/GuiSmelter.java | 103 +++ .../inventory/ContainerBrickOven.java | 201 +++++ .../inventory/ContainerCampfire.java | 184 ++++ .../inventory/ContainerDoubleWorkbench.java | 255 ++++++ .../inventory/ContainerEnderSmelter.java | 199 +++++ .../inventory/ContainerInfusionRepair.java | 183 ++++ .../inventory/ContainerKiln.java | 170 ++++ .../inventory/ContainerNetherBrickOven.java | 187 ++++ .../inventory/ContainerObsidianKiln.java | 173 ++++ .../inventory/ContainerSimpleWorkbench.java | 179 ++++ .../inventory/ContainerSmelter.java | 187 ++++ .../inventory/InventoryBrickOvenMatrix.java | 202 +++++ .../inventory/InventoryInfusionRepair.java | 178 ++++ ...InventoryWorkbenchAdditionalMaterials.java | 172 ++++ .../inventory/SlotAdvancedCrafting.java | 237 +++++ .../inventory/SlotBrickOvenOutput.java | 12 + .../inventory/SlotInfusionRepairResult.java | 110 +++ .../inventory/TankNetherBrickOvenFuel.java | 53 ++ .../items/ItemBonePickaxe.java | 42 + .../betterbeginnings/items/ItemBoneShard.java | 21 + .../items/ItemCharredMeat.java | 34 + .../betterbeginnings/items/ItemCloth.java | 23 + .../items/ItemClothArmor.java | 22 + .../betterbeginnings/items/ItemFireBow.java | 87 ++ .../items/ItemFlintHatchet.java | 41 + .../betterbeginnings/items/ItemHammer.java | 44 + .../items/ItemIronNugget.java | 21 + .../betterbeginnings/items/ItemJerkyBeef.java | 21 + .../betterbeginnings/items/ItemJerkyRaw.java | 22 + .../betterbeginnings/items/ItemKnife.java | 104 +++ .../betterbeginnings/items/ItemKnifeBone.java | 19 + .../items/ItemKnifeDiamond.java | 19 + .../items/ItemKnifeFlint.java | 19 + .../betterbeginnings/items/ItemKnifeGold.java | 19 + .../betterbeginnings/items/ItemKnifeIron.java | 19 + .../items/ItemLeatherStrip.java | 21 + .../items/ItemMarshmallow.java | 21 + .../items/ItemMarshmallowCooked.java | 22 + .../items/ItemNoobWoodSword.java | 23 + .../betterbeginnings/items/ItemPan.java | 24 + .../items/ItemRoastingStick.java | 40 + .../items/ItemRoastingStickMallow.java | 61 ++ .../items/ItemRockHammer.java | 21 + .../betterbeginnings/items/ItemSilk.java | 23 + .../betterbeginnings/items/ItemTestItem.java | 39 + .../betterbeginnings/items/ItemThread.java | 21 + .../betterbeginnings/items/ItemTwine.java | 22 + .../betterbeginnings/network/ClientProxy.java | 42 + .../PacketNetherBrickOvenFuelLevel.java | 84 ++ .../betterbeginnings/network/ServerProxy.java | 41 + .../betterbeginnings/register/IBBName.java | 9 + .../register/InfusionRepairUtil.java | 525 +++++++++++ .../register/RegisterBlocks.java | 95 ++ .../register/RegisterHelper.java | 46 + .../register/RegisterItems.java | 155 ++++ .../register/RegisterModels.java | 41 + .../register/RegisterRecipes.java | 832 ++++++++++++++++++ .../register/RegisterTileEntities.java | 19 + .../register/RemoveRecipes.java | 192 ++++ .../achievement/RegisterAchievements.java | 90 ++ .../recipe/AdvancedCraftingHandler.java | 268 ++++++ .../register/recipe/AdvancedRecipe.java | 268 ++++++ .../recipe/BrickOvenRecipeHandler.java | 216 +++++ .../recipe/BrickOvenShapedRecipe.java | 261 ++++++ .../recipe/BrickOvenShapelessRecipe.java | 156 ++++ .../register/recipe/CampfirePanRecipes.java | 101 +++ .../register/recipe/CampfireRecipes.java | 101 +++ .../register/recipe/IBrickOvenRecipe.java | 31 + .../register/recipe/KilnRecipes.java | 109 +++ .../recipe/NetherBrickOvenRecipeHandler.java | 63 ++ .../register/recipe/OreRecipeElement.java | 96 ++ .../register/recipe/SmelterRecipe.java | 54 ++ .../register/recipe/SmelterRecipeHandler.java | 140 +++ .../tileentity/TileEntityBrickOven.java | 564 ++++++++++++ .../tileentity/TileEntityCampfire.java | 561 ++++++++++++ .../tileentity/TileEntityEnderSmelter.java | 535 +++++++++++ .../tileentity/TileEntityKiln.java | 525 +++++++++++ .../tileentity/TileEntityNetherBrickOven.java | 615 +++++++++++++ .../tileentity/TileEntityObsidianKiln.java | 522 +++++++++++ .../tileentity/TileEntitySmelter.java | 485 ++++++++++ .../betterbeginnings/util/ChatUtil.java | 46 + .../blockstates/brickOven.json | 19 + .../blockstates/brickOvenLit.json | 19 + .../blockstates/campfire.json | 7 + .../blockstates/campfireLit.json | 7 + .../blockstates/doubleWorkbench.json | 19 + .../blockstates/enderSmelter.json | 19 + .../blockstates/enderSmelterLit.json | 19 + .../blockstates/infusionRepairStation.json | 7 + .../betterbeginnings/blockstates/kiln.json | 19 + .../betterbeginnings/blockstates/kilnLit.json | 19 + .../blockstates/netherBrickOven.json | 19 + .../blockstates/netherBrickOvenLit.json | 19 + .../blockstates/obsidianKiln.json | 19 + .../blockstates/obsidianKilnLit.json | 19 + .../betterbeginnings/blockstates/smelter.json | 19 + .../blockstates/smelterLit.json | 19 + .../assets/betterbeginnings/lang/en_US.lang | 112 +++ .../models/block/brickOven.json | 8 + .../models/block/brickOvenLit.json | 8 + .../models/block/campfire.json | 60 ++ .../models/block/campfireLit.json | 50 ++ .../models/block/doubleWorkbench.json | 12 + .../models/block/doubleWorkbench_e.json | 12 + .../models/block/doubleWorkbench_n.json | 12 + .../models/block/doubleWorkbench_none.json | 6 + .../models/block/doubleWorkbench_s.json | 12 + .../models/block/doubleWorkbench_w.json | 12 + .../models/block/enderSmelter.json | 8 + .../models/block/enderSmelterLit.json | 8 + .../models/block/infusionRepairStation.json | 12 + .../betterbeginnings/models/block/kiln.json | 8 + .../models/block/kilnLit.json | 8 + .../models/block/netherBrickOven.json | 8 + .../models/block/netherBrickOvenLit.json | 8 + .../models/block/obsidianKiln.json | 8 + .../models/block/obsidianKilnLit.json | 8 + .../models/block/smelter.json | 8 + .../models/block/smelterLit.json | 8 + .../models/item/boneKnife.json | 42 + .../models/item/bonePickaxe.json | 18 + .../models/item/boneShard.json | 42 + .../models/item/brickOven.json | 22 + .../models/item/brickOvenLit.json | 22 + .../models/item/campfire.json | 42 + .../models/item/campfireLit.json | 42 + .../models/item/charredMeat.json | 42 + .../betterbeginnings/models/item/cloth.json | 42 + .../models/item/clothBoots.json | 42 + .../models/item/clothHat.json | 42 + .../models/item/clothPants.json | 42 + .../models/item/clothShirt.json | 42 + .../models/item/diamondKnife.json | 42 + .../models/item/doubleWorkbench.json | 22 + .../models/item/enderSmelter.json | 22 + .../models/item/enderSmelterLit.json | 22 + .../betterbeginnings/models/item/fireBow.json | 42 + .../models/item/flintHatchet.json | 42 + .../models/item/flintKnife.json | 42 + .../models/item/goldKnife.json | 42 + .../models/item/infusionRepairStation.json | 22 + .../models/item/ironKnife.json | 42 + .../models/item/ironNugget.json | 42 + .../models/item/jerkyBeef.json | 42 + .../models/item/jerkyRaw.json | 42 + .../betterbeginnings/models/item/kiln.json | 22 + .../betterbeginnings/models/item/kilnLit.json | 22 + .../models/item/leatherStrip.json | 42 + .../models/item/marshmallow.json | 42 + .../models/item/marshmallowCooked.json | 42 + .../models/item/netherBrickOven.json | 22 + .../models/item/netherBrickOvenLit.json | 22 + .../models/item/noobWoodSword.json | 42 + .../models/item/obsidianKiln.json | 22 + .../models/item/obsidianKilnLit.json | 22 + .../betterbeginnings/models/item/pan.json | 42 + .../models/item/roastingStick.json | 42 + .../item/roastingStickCookedMallow.json | 42 + .../models/item/roastingStickRawMallow.json | 42 + .../models/item/rockHammer.json | 42 + .../betterbeginnings/models/item/silk.json | 42 + .../betterbeginnings/models/item/smelter.json | 22 + .../models/item/smelterLit.json | 22 + .../models/item/testItem.json | 42 + .../betterbeginnings/models/item/thread.json | 42 + .../betterbeginnings/models/item/twine.json | 42 + .../textures/blocks/CampfireImg.png | Bin 0 -> 873 bytes .../textures/blocks/RepairTableBottom.png | Bin 0 -> 432 bytes .../textures/blocks/RepairTableSide.png | Bin 0 -> 608 bytes .../textures/blocks/RepairTableTop.png | Bin 0 -> 876 bytes .../textures/blocks/Thumbs.db | Bin 0 -> 36352 bytes .../textures/blocks/brickOvenLit.png | Bin 0 -> 651 bytes .../textures/blocks/brickOvenSide.png | Bin 0 -> 669 bytes .../textures/blocks/brickOvenTop.png | Bin 0 -> 647 bytes .../textures/blocks/brickOvenUnlit.png | Bin 0 -> 665 bytes .../textures/blocks/enderSmelterLit.png | Bin 0 -> 630 bytes .../textures/blocks/enderSmelterSide.png | Bin 0 -> 584 bytes .../textures/blocks/enderSmelterTop.png | Bin 0 -> 582 bytes .../textures/blocks/enderSmelterUnlit.png | Bin 0 -> 616 bytes .../textures/blocks/kilnLit.png | Bin 0 -> 637 bytes .../textures/blocks/kilnSide.png | Bin 0 -> 607 bytes .../textures/blocks/kilnTop.png | Bin 0 -> 586 bytes .../textures/blocks/kilnUnlit.png | Bin 0 -> 639 bytes .../textures/blocks/netherBrickOvenLit.png | Bin 0 -> 545 bytes .../textures/blocks/netherBrickOvenSide.png | Bin 0 -> 467 bytes .../textures/blocks/netherBrickOvenTop.png | Bin 0 -> 430 bytes .../textures/blocks/netherBrickOvenUnlit.png | Bin 0 -> 500 bytes .../textures/blocks/obsidianKilnLit.png | Bin 0 -> 459 bytes .../textures/blocks/obsidianKilnSide.png | Bin 0 -> 603 bytes .../textures/blocks/obsidianKilnTop.png | Bin 0 -> 516 bytes .../textures/blocks/obsidianKilnUnlit.png | Bin 0 -> 454 bytes .../textures/blocks/smelterLit.png | Bin 0 -> 542 bytes .../textures/blocks/smelterSide.png | Bin 0 -> 499 bytes .../textures/blocks/smelterTop.png | Bin 0 -> 489 bytes .../textures/blocks/smelterUnlit.png | Bin 0 -> 545 bytes .../textures/blocks/workbenchEastIfSouth.png | Bin 0 -> 473 bytes .../textures/blocks/workbenchFront.png | Bin 0 -> 483 bytes .../textures/blocks/workbenchNorthIfWest.png | Bin 0 -> 458 bytes .../textures/blocks/workbenchSide.png | Bin 0 -> 462 bytes .../textures/blocks/workbenchSouthIfEast.png | Bin 0 -> 458 bytes .../textures/blocks/workbenchTop.png | Bin 0 -> 533 bytes .../textures/blocks/workbenchTopIfEast.png | Bin 0 -> 493 bytes .../textures/blocks/workbenchTopIfNorth.png | Bin 0 -> 489 bytes .../textures/blocks/workbenchTopIfSouth.png | Bin 0 -> 493 bytes .../textures/blocks/workbenchTopIfWest.png | Bin 0 -> 490 bytes .../textures/blocks/workbenchWestIfNorth.png | Bin 0 -> 476 bytes .../textures/gui/container/Thumbs.db | Bin 0 -> 23552 bytes .../textures/gui/container/brickOven.png | Bin 0 -> 2241 bytes .../textures/gui/container/campfire.png | Bin 0 -> 2618 bytes .../gui/container/doubleWorkbench.png | Bin 0 -> 2010 bytes .../gui/container/infusionRepairStation.png | Bin 0 -> 2049 bytes .../textures/gui/container/kiln.png | Bin 0 -> 1488 bytes .../gui/container/netherBrickOven.png | Bin 0 -> 2951 bytes .../gui/container/simpleWorkbench.png | Bin 0 -> 2052 bytes .../textures/gui/container/smelter.png | Bin 0 -> 2221 bytes .../betterbeginnings/textures/items/Thumbs.db | Bin 0 -> 12288 bytes .../betterbeginnings/textures/items/blank.png | Bin 0 -> 149 bytes .../textures/items/boneKnife.png | Bin 0 -> 275 bytes .../textures/items/bonePickaxe.png | Bin 0 -> 330 bytes .../textures/items/boneShard.png | Bin 0 -> 345 bytes .../textures/items/charredMeat.png | Bin 0 -> 362 bytes .../betterbeginnings/textures/items/cloth.png | Bin 0 -> 425 bytes .../textures/items/clothBoots.png | Bin 0 -> 266 bytes .../textures/items/clothHat.png | Bin 0 -> 250 bytes .../textures/items/clothPants.png | Bin 0 -> 256 bytes .../textures/items/clothShirt.png | Bin 0 -> 307 bytes .../textures/items/diamondKnife.png | Bin 0 -> 309 bytes .../textures/items/fireBow.png | Bin 0 -> 302 bytes .../textures/items/flintHatchet.png | Bin 0 -> 300 bytes .../textures/items/flintKnife.png | Bin 0 -> 292 bytes .../textures/items/goldKnife.png | Bin 0 -> 319 bytes .../textures/items/ironKnife.png | Bin 0 -> 295 bytes .../textures/items/ironNugget.png | Bin 0 -> 234 bytes .../textures/items/jerkyBeef.png | Bin 0 -> 420 bytes .../textures/items/jerkyRaw.png | Bin 0 -> 430 bytes .../textures/items/leatherStrip.png | Bin 0 -> 285 bytes .../textures/items/marshmallow.png | Bin 0 -> 267 bytes .../textures/items/marshmallowCooked.png | Bin 0 -> 230 bytes .../textures/items/noobWoodSword.png | Bin 0 -> 181 bytes .../betterbeginnings/textures/items/pan.png | Bin 0 -> 375 bytes .../textures/items/roastingStick.png | Bin 0 -> 221 bytes .../items/roastingStickCookedMallow.png | Bin 0 -> 243 bytes .../textures/items/roastingStickRawMallow.png | Bin 0 -> 256 bytes .../textures/items/rockHammer.png | Bin 0 -> 341 bytes .../betterbeginnings/textures/items/silk.png | Bin 0 -> 524 bytes .../textures/items/testItem.png | Bin 0 -> 269 bytes .../textures/items/thread.png | Bin 0 -> 318 bytes .../betterbeginnings/textures/items/twine.png | Bin 0 -> 320 bytes .../textures/model/Campfire.png | Bin 0 -> 982 bytes .../betterbeginnings/textures/model/Thumbs.db | Bin 0 -> 3072 bytes .../textures/model/cloth_1.png | Bin 0 -> 1586 bytes .../textures/model/cloth_2.png | Bin 0 -> 841 bytes src/main/resources/mcmod.info | 16 + 285 files changed, 18412 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/ModMain.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockCampfire.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockDoubleWorkbench.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockEnderSmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockInfusionRepairStation.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockNetherBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockObsidianKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockSmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/config/BBConfig.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGui.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGuiFactory.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/event/BBEventHandler.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/event/BlockBreakHelper.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/event/DamageSourceFace.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/event/Worldgen.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/BBGuiHandler.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiCampfire.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiDoubleWorkbench.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiEnderSmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiInfusionRepair.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiNetherBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiObsidianKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSimpleWorkbench.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerCampfire.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerDoubleWorkbench.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerEnderSmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerInfusionRepair.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerNetherBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerObsidianKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSimpleWorkbench.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryBrickOvenMatrix.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryInfusionRepair.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryWorkbenchAdditionalMaterials.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotAdvancedCrafting.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotBrickOvenOutput.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotInfusionRepairResult.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/inventory/TankNetherBrickOvenFuel.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemBonePickaxe.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemBoneShard.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemCharredMeat.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemCloth.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemClothArmor.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemFireBow.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemFlintHatchet.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemHammer.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemIronNugget.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyBeef.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyRaw.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnife.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeBone.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeDiamond.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeFlint.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeGold.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeIron.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemLeatherStrip.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallow.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallowCooked.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemNoobWoodSword.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemPan.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStick.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStickMallow.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemRockHammer.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemSilk.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemTestItem.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemThread.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/items/ItemTwine.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/network/ClientProxy.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/network/PacketNetherBrickOvenFuelLevel.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/network/ServerProxy.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/IBBName.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/InfusionRepairUtil.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/RegisterBlocks.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/RegisterHelper.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/RegisterItems.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/RegisterModels.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/RegisterRecipes.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/RegisterTileEntities.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/RemoveRecipes.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/achievement/RegisterAchievements.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedCraftingHandler.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedRecipe.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenRecipeHandler.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapedRecipe.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapelessRecipe.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfirePanRecipes.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfireRecipes.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/IBrickOvenRecipe.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/KilnRecipes.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/NetherBrickOvenRecipeHandler.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/OreRecipeElement.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipe.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipeHandler.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityCampfire.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityEnderSmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityNetherBrickOven.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityObsidianKiln.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntitySmelter.java create mode 100644 src/main/java/net/einsteinsci/betterbeginnings/util/ChatUtil.java create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/brickOven.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/brickOvenLit.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/campfire.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/campfireLit.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/doubleWorkbench.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/enderSmelter.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/enderSmelterLit.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/infusionRepairStation.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/kiln.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/kilnLit.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/netherBrickOven.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/netherBrickOvenLit.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/obsidianKiln.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/obsidianKilnLit.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/smelter.json create mode 100644 src/main/resources/assets/betterbeginnings/blockstates/smelterLit.json create mode 100644 src/main/resources/assets/betterbeginnings/lang/en_US.lang create mode 100644 src/main/resources/assets/betterbeginnings/models/block/brickOven.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/brickOvenLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/campfire.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/campfireLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_e.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_n.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_none.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_s.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_w.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/enderSmelter.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/enderSmelterLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/infusionRepairStation.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/kiln.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/kilnLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/netherBrickOven.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/netherBrickOvenLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/obsidianKiln.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/obsidianKilnLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/smelter.json create mode 100644 src/main/resources/assets/betterbeginnings/models/block/smelterLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/boneKnife.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/bonePickaxe.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/boneShard.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/brickOven.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/brickOvenLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/campfire.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/campfireLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/charredMeat.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/cloth.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/clothBoots.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/clothHat.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/clothPants.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/clothShirt.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/diamondKnife.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/doubleWorkbench.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/enderSmelter.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/enderSmelterLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/fireBow.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/flintHatchet.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/flintKnife.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/goldKnife.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/infusionRepairStation.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/ironKnife.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/ironNugget.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/jerkyBeef.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/jerkyRaw.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/kiln.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/kilnLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/leatherStrip.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/marshmallow.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/marshmallowCooked.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/netherBrickOven.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/netherBrickOvenLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/noobWoodSword.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/obsidianKiln.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/obsidianKilnLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/pan.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/roastingStick.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/roastingStickCookedMallow.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/roastingStickRawMallow.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/rockHammer.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/silk.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/smelter.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/smelterLit.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/testItem.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/thread.json create mode 100644 src/main/resources/assets/betterbeginnings/models/item/twine.json create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/CampfireImg.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/RepairTableBottom.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/RepairTableSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/RepairTableTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/Thumbs.db create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenLit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenUnlit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterLit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterUnlit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/kilnLit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/kilnSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/kilnTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/kilnUnlit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/netherBrickOvenLit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/netherBrickOvenSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/netherBrickOvenTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/netherBrickOvenUnlit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/obsidianKilnLit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/obsidianKilnSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/obsidianKilnTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/obsidianKilnUnlit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/smelterLit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/smelterSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/smelterTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/smelterUnlit.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchEastIfSouth.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchFront.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchNorthIfWest.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchSide.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchSouthIfEast.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTop.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfEast.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfNorth.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfSouth.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfWest.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/blocks/workbenchWestIfNorth.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/Thumbs.db create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/brickOven.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/campfire.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/doubleWorkbench.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/infusionRepairStation.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/kiln.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/netherBrickOven.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/simpleWorkbench.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/gui/container/smelter.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/Thumbs.db create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/blank.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/boneKnife.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/bonePickaxe.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/boneShard.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/charredMeat.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/cloth.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/clothBoots.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/clothHat.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/clothPants.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/clothShirt.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/diamondKnife.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/fireBow.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/flintHatchet.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/flintKnife.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/goldKnife.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/ironKnife.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/ironNugget.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/jerkyBeef.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/jerkyRaw.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/leatherStrip.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/marshmallow.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/marshmallowCooked.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/noobWoodSword.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/pan.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/roastingStick.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/roastingStickCookedMallow.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/roastingStickRawMallow.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/rockHammer.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/silk.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/testItem.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/thread.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/items/twine.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/model/Campfire.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/model/Thumbs.db create mode 100644 src/main/resources/assets/betterbeginnings/textures/model/cloth_1.png create mode 100644 src/main/resources/assets/betterbeginnings/textures/model/cloth_2.png create mode 100644 src/main/resources/mcmod.info diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7ce8c9f --- /dev/null +++ b/build.gradle @@ -0,0 +1,70 @@ +buildscript { + repositories { + mavenCentral() + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } + maven { + name = "sonatype" + url = "https://oss.sonatype.org/content/repositories/snapshots/" + } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + } +} + +apply plugin: 'forge' + +version = "MC1.8.0-b0.9.1" +group= "net.einsteinsci.betterbeginnings" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = "betterbeginnings" + +minecraft { + version = "1.8-11.14.1.1334" + runDir = "eclipse" + + // the mappings can be changed at any time, and must be in the following format. + // snapshot_YYYYMMDD snapshot are built nightly. + // stable_# stables are built at the discretion of the MCP team. + // Use non-default mappings at your own risk. they may not allways work. + // simply re-run your setup task after changing the mappings to update your workspace. + mappings = "snapshot_20141130" +} + +dependencies { + // you may put jars on which you depend on in ./libs + // or you may define them like so.. + //compile "some.group:artifact:version:classifier" + //compile "some.group:artifact:version" + + // real examples + //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env + //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env + + // for more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html + +} + +processResources +{ + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..b7612167031001b7b84baf2a959e8ea8ad03c011 GIT binary patch literal 51017 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

N(DARnfPMFG|;(rIGZH1uB1rN;y7UlJ8 znb!RwO#5WS_%cPPlwSw94PTKP64}}J!~E1}ch9``2jvUrB*#@up8L&*`tqgq ztTAS@^33w-5hFZAH&{j)?l0<)9X(d`N|yLk!E=iT%PD-FTJ!|hqyj%RFFP`SaL;|_ z$(+VYhKm)K@Oe~+eZK(6ElQNdfimBrdKjeVl57_7p^|)jrzt|wyRonj$j9Bji!


f)EE4q$t9yObmyG04W0z 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 t|KH7qPwVTc?c*oWQQiM74F8)Y \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/net/einsteinsci/betterbeginnings/ModMain.java b/src/main/java/net/einsteinsci/betterbeginnings/ModMain.java new file mode 100644 index 0000000..0c6055c --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/ModMain.java @@ -0,0 +1,133 @@ +package net.einsteinsci.betterbeginnings; + +import net.einsteinsci.betterbeginnings.config.BBConfig; +import net.einsteinsci.betterbeginnings.event.BBEventHandler; +import net.einsteinsci.betterbeginnings.event.Worldgen; +import net.einsteinsci.betterbeginnings.network.PacketNetherBrickOvenFuelLevel; +import net.einsteinsci.betterbeginnings.network.ServerProxy; +import net.einsteinsci.betterbeginnings.register.*; +import net.einsteinsci.betterbeginnings.register.achievement.RegisterAchievements; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraftforge.common.AchievementPage; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.common.*; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.Mod.Instance; +import net.minecraftforge.fml.common.event.*; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.logging.log4j.Level; + +/* + * Forge Version: 11.14.1.1334 for MC 1.8.0 + */ + +@Mod(modid = ModMain.MODID, version = ModMain.VERSION, name = ModMain.NAME, + guiFactory = "net.einsteinsci.betterbeginnings.config.BBConfigGuiFactory") +public class ModMain +{ + public static final String MODID = "betterbeginnings"; + public static final String VERSION = "0.0.6.0"; + public static final String NAME = "Better Beginnings"; + public static final CreativeTabs tabBetterBeginnings = new CreativeTabs("tabBetterBeginnings") + { + @Override + @SideOnly(Side.CLIENT) + public Item getTabIconItem() + { + return RegisterItems.flintKnife; + } + }; + + @Instance(ModMain.MODID) + public static ModMain modInstance; + public static Configuration configFile; + public static SimpleNetworkWrapper network; + @SidedProxy(clientSide = "net.einsteinsci.betterbeginnings.network.ClientProxy", + serverSide = "net.einsteinsci.betterbeginnings.network.ServerProxy") + public static ServerProxy proxy; + public BBEventHandler eventHandler = new BBEventHandler(); + + public static void LogDebug(String text) + { + if (BBConfig.debugLogging) + { + Log(Level.DEBUG, text); + } + } + + public static void Log(Level level, String text) + { + FMLLog.log(NAME, level, text); + } + + public static void LogDebug(Level level, String text) + { + if (BBConfig.debugLogging) + { + Log(level, text); + } + } + + @EventHandler + public void preInit(FMLPreInitializationEvent e) + { + Log("Starting pre-initialization..."); + + configFile = new Configuration(e.getSuggestedConfigurationFile()); + configFile.load(); + BBConfig.initialize(); + BBConfig.syncConfig(configFile); + + proxy.registerNetworkStuff(); + proxy.registerRenderThings(); + + + FMLCommonHandler.instance().bus().register(eventHandler); + MinecraftForge.EVENT_BUS.register(eventHandler); + + network = NetworkRegistry.INSTANCE.newSimpleChannel("bbchannel"); + network.registerMessage(PacketNetherBrickOvenFuelLevel.PacketHandler.class, + PacketNetherBrickOvenFuelLevel.class, 0, Side.CLIENT); + + RegisterItems.register(); + RegisterBlocks.register(); + RegisterTileEntities.register(); + } + + public static void Log(String text) + { + Log(Level.INFO, text); + } + + @EventHandler + public void init(FMLInitializationEvent e) + { + RemoveRecipes.remove(); + RegisterRecipes.addShapelessRecipes(); + RegisterRecipes.addShapedRecipes(); + RegisterRecipes.addAdvancedRecipes(); + RegisterRecipes.addFurnaceRecipes(); + + RemoveRecipes.removeFurnaceRecipes(); + + if (e.getSide() == Side.CLIENT) + { + RegisterModels.register(); + } + } + + @EventHandler + public void postInit(FMLPostInitializationEvent e) + { + + RegisterItems.tweakVanilla(); + Worldgen.addWorldgen(); + AchievementPage.registerAchievementPage(new AchievementPage(NAME, RegisterAchievements.getAchievements())); + Log("Finished post-initialization."); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockBrickOven.java new file mode 100644 index 0000000..4f910d8 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockBrickOven.java @@ -0,0 +1,244 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityBrickOven; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +public class BlockBrickOven extends BlockContainer implements IBBName +{ + public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); + private static boolean isLit; + private final boolean isLit2; // strange why... + + public BlockBrickOven(boolean lit) + { + super(Material.rock); + + if (lit) + { + setLightLevel(0.875F); + } + else + { + setLightLevel(0.0F); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + setUnlocalizedName(getName()); + + setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); + isLit2 = lit; + setHardness(2.0f); + setResistance(10.0f); + + + } + + @Override + public String getName() + { + return isLit2 ? "brickOvenLit" : "brickOven"; + } + + public static void updateBlockState(boolean lit, World world, BlockPos pos) + { + IBlockState iblockstate = world.getBlockState(pos); + TileEntity tileentity = world.getTileEntity(pos); + isLit = true; + + if (lit) + { + world.setBlockState(pos, RegisterBlocks.brickOvenLit.getDefaultState() + .withProperty(FACING, iblockstate.getValue(FACING)), 3); + } + else + { + world.setBlockState(pos, RegisterBlocks.brickOven.getDefaultState() + .withProperty(FACING, iblockstate.getValue(FACING)), 3); + } + + isLit = false; + + if (tileentity != null) + { + tileentity.validate(); + world.setTileEntity(pos, tileentity); + } + } + + public int getMetaFromState(IBlockState state) + { + return ((EnumFacing)state.getValue(FACING)).getIndex(); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random rand) + { + if (isLit2) + { + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + double d0 = (double)pos.getX() + 0.5D; + double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D; + double d2 = (double)pos.getZ() + 0.5D; + double d3 = 0.52D; + double d4 = rand.nextDouble() * 0.6D - 0.3D; + + switch (BlockKiln.SwitchEnumFacing.facings[enumfacing.ordinal()]) + { + case 1: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + break; + case 2: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + break; + case 3: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); + break; + case 4: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); + } + } + } + + @SideOnly(Side.CLIENT) + @Override + public void onBlockAdded(World world, BlockPos pos, IBlockState state) + { + if (!world.isRemote) + { + Block block = world.getBlockState(pos.offset(EnumFacing.NORTH)).getBlock(); + Block block1 = world.getBlockState(pos.offset(EnumFacing.SOUTH)).getBlock(); + Block block2 = world.getBlockState(pos.offset(EnumFacing.WEST)).getBlock(); + Block block3 = world.getBlockState(pos.offset(EnumFacing.EAST)).getBlock(); + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + + if (enumfacing == EnumFacing.NORTH && block.isFullBlock() && !block1.isFullBlock()) + { + enumfacing = EnumFacing.SOUTH; + } + else if (enumfacing == EnumFacing.SOUTH && block1.isFullBlock() && !block.isFullBlock()) + { + enumfacing = EnumFacing.NORTH; + } + else if (enumfacing == EnumFacing.WEST && block2.isFullBlock() && !block3.isFullBlock()) + { + enumfacing = EnumFacing.EAST; + } + else if (enumfacing == EnumFacing.EAST && block3.isFullBlock() && !block2.isFullBlock()) + { + enumfacing = EnumFacing.WEST; + } + + world.setBlockState(pos, state.withProperty(FACING, enumfacing), 2); + } + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int par3) + { + return Item.getItemFromBlock(RegisterBlocks.brickOven); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + player.openGui(ModMain.modInstance, BBGuiHandler.BRICKOVEN_ID, world, pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + + @Override + public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, + int meta, EntityLivingBase placer) + { + return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, + ItemStack stack) + { + world.setBlockState(pos, state.withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2); + + if (stack.hasDisplayName()) + { + TileEntity teBase = world.getTileEntity(pos); + if (teBase instanceof TileEntityBrickOven) + { + TileEntityBrickOven tileEntity = (TileEntityBrickOven)teBase; + tileEntity.setBlockName(stack.getDisplayName()); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, BlockPos pos) + { + return Item.getItemFromBlock(RegisterBlocks.brickOven); + } + + protected BlockState createBlockState() + { + return new BlockState(this, FACING); + } + + @Override + public int getRenderType() + { + return 3; + } + + // Drop stuff everywhere + @Override + public void breakBlock(World worldIn, BlockPos pos, IBlockState state) + { + if (!isLit) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + + if (tileentity instanceof TileEntityBrickOven) + { + InventoryHelper.dropInventoryItems(worldIn, pos, (TileEntityBrickOven)tileentity); + worldIn.updateComparatorOutputLevel(pos, this); + } + } + + super.breakBlock(worldIn, pos, state); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2) + { + return new TileEntityBrickOven(); + } +} + + +// Buffer diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockCampfire.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockCampfire.java new file mode 100644 index 0000000..177da86 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockCampfire.java @@ -0,0 +1,200 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.*; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityCampfire; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +public class BlockCampfire extends BlockContainer implements IBBName +{ + private static boolean isAlteringLit; + private final boolean isLit; // strange why... + + public BlockCampfire(boolean lit) + { + super(Material.rock); + setResistance(3.0F); + setHardness(1.5F); + + if (!lit) + { + setCreativeTab(ModMain.tabBetterBeginnings); + } + + setUnlocalizedName(getName()); + + isLit = lit; + } + + @Override + public String getName() + { + return isLit ? "campfireLit" : "campfire"; + } + + public static void updateBlockState(boolean lit, World world, BlockPos pos) + { + TileEntity tileEntity = world.getTileEntity(pos); + isAlteringLit = true; + + if (lit) + { + world.setBlockState(pos, RegisterBlocks.campfireLit.getDefaultState(), 3); + } + else + { + world.setBlockState(pos, RegisterBlocks.campfire.getDefaultState(), 3); + } + + isAlteringLit = false; + + if (tileEntity != null) + { + tileEntity.validate(); + world.setTileEntity(pos, tileEntity); + } + } + + public boolean isFullCube() + { + return false; + } + + public boolean isPassable(IBlockAccess worldIn, BlockPos pos) + { + return false; + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess worldIn, BlockPos pos, EnumFacing side) + { + return true; + } + + public boolean isOpaqueCube() + { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random rand) + { + TileEntityCampfire tile = (TileEntityCampfire)world.getTileEntity(pos); + + if (tile.isBurning()) + { + for (int i = 0; i < 3; i++) + { + double ry = rand.nextDouble() * 0.5 + 0.15; + double rx = rand.nextDouble() * 0.4 + 0.3; + double rz = rand.nextDouble() * 0.4 + 0.3; + + double vx = rand.nextDouble() * 0.02 - 0.01; + double vy = rand.nextDouble() * 0.05 + 0.03; + double vz = rand.nextDouble() * 0.02 - 0.01; + world.spawnParticle(EnumParticleTypes.FLAME, pos.getX() + rx, pos.getY() + ry, pos.getZ() + rz, + vx, vy, vz); + } + } + else if (tile.isDecaying()) + { + for (int i = 0; i < 2; i++) + { + double ry = rand.nextDouble() * 0.5 + 0.15; + double rx = rand.nextDouble() * 0.4 + 0.3; + double rz = rand.nextDouble() * 0.4 + 0.3; + + double vx = rand.nextDouble() * 0.02 - 0.01; + double vy = rand.nextDouble() * 0.05 + 0.03; + double vz = rand.nextDouble() * 0.02 - 0.01; + world.spawnParticle(EnumParticleTypes.SMOKE_LARGE, pos.getX() + rx, pos.getY() + ry, pos.getZ() + rz, + vx, vy, vz); + } + } + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int par3) + { + return Item.getItemFromBlock(RegisterBlocks.campfire); + } + + @Override + public boolean canPlaceBlockAt(World world, BlockPos pos) + { + return world.getBlockState(pos).getBlock() + .isReplaceable(world, pos) && World + .doesBlockHaveSolidTopSurface(world, pos.offset(EnumFacing.DOWN)); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + if (player.getHeldItem() != null) + { + Item item = player.getHeldItem().getItem(); + + if (item == Items.flint_and_steel || item == RegisterItems.fireBow) + { + return false; + } + } + + player.openGui(ModMain.modInstance, BBGuiHandler.CAMPFIRE_ID, world, pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos) + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + @Override + public int getRenderType() + { + return 3; + } + + // Drop stuff everywhere + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + if (!isLit) + { + TileEntity tileentity = world.getTileEntity(pos); + + if (tileentity instanceof TileEntityCampfire) + { + InventoryHelper.dropInventoryItems(world, pos, (TileEntityCampfire)tileentity); + world.updateComparatorOutputLevel(pos, this); + } + } + + super.breakBlock(world, pos, state); + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) + { + return new TileEntityCampfire(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockDoubleWorkbench.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockDoubleWorkbench.java new file mode 100644 index 0000000..694aaec --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockDoubleWorkbench.java @@ -0,0 +1,200 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.register.achievement.RegisterAchievements; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; + +public class BlockDoubleWorkbench extends Block implements IBBName +{ + public static final PropertyDirection CONNECTION = PropertyDirection.create("connection"); + + public BlockDoubleWorkbench() + { + super(Material.wood); + setStepSound(soundTypeWood); + setCreativeTab(ModMain.tabBetterBeginnings); + setDefaultState(blockState.getBaseState().withProperty(CONNECTION, EnumFacing.UP)); + + // Not sure how this works... + setHardness(2.0f); + setResistance(5.0f); + + setUnlocalizedName(getName()); + } + + @Override + public String getName() + { + return "doubleWorkbench"; + } + + public int getMetaFromState(IBlockState state) + { + return ((EnumFacing)state.getValue(CONNECTION)).getIndex(); + } + + @Override + public int getRenderType() + { + return 3; + } + + @Override + public void onBlockAdded(World world, BlockPos pos, IBlockState state) + { + IBlockState north = world.getBlockState(pos.north()); + if (north.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos, state.withProperty(CONNECTION, EnumFacing.NORTH), 3); + world.setBlockState(pos.north(), north.withProperty(CONNECTION, EnumFacing.SOUTH), 3); + } + + IBlockState south = world.getBlockState(pos.south()); + if (south.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos, state.withProperty(CONNECTION, EnumFacing.SOUTH), 3); + world.setBlockState(pos.south(), south.withProperty(CONNECTION, EnumFacing.NORTH), 3); + } + + IBlockState east = world.getBlockState(pos.east()); + if (east.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos, state.withProperty(CONNECTION, EnumFacing.EAST), 3); + world.setBlockState(pos.east(), east.withProperty(CONNECTION, EnumFacing.WEST), 3); + } + + IBlockState west = world.getBlockState(pos.west()); + if (west.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos, state.withProperty(CONNECTION, EnumFacing.WEST), 3); + world.setBlockState(pos.west(), west.withProperty(CONNECTION, EnumFacing.EAST), 3); + } + } + + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + IBlockState north = world.getBlockState(pos.north()); + if (north.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos.north(), north.withProperty(CONNECTION, EnumFacing.UP), 3); + } + IBlockState south = world.getBlockState(pos.south()); + if (south.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos.south(), south.withProperty(CONNECTION, EnumFacing.UP), 3); + } + IBlockState east = world.getBlockState(pos.east()); + if (east.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos.east(), east.withProperty(CONNECTION, EnumFacing.UP), 3); + } + IBlockState west = world.getBlockState(pos.west()); + if (west.getBlock().equals(RegisterBlocks.doubleWorkbench)) + { + world.setBlockState(pos.west(), west.withProperty(CONNECTION, EnumFacing.UP), 3); + } + } + + @Override + public boolean canPlaceBlockAt(World world, BlockPos pos) + { + if (world.getBlockState(pos.north()).getBlock().equals(this) && + world.getBlockState(pos.north()).getValue(CONNECTION) != EnumFacing.UP) + { + return false; + } + if (world.getBlockState(pos.south()).getBlock().equals(this) && + world.getBlockState(pos.south()).getValue(CONNECTION) != EnumFacing.UP) + { + return false; + } + if (world.getBlockState(pos.east()).getBlock().equals(this) && + world.getBlockState(pos.east()).getValue(CONNECTION) != EnumFacing.UP) + { + return false; + } + if (world.getBlockState(pos.west()).getBlock().equals(this) && + world.getBlockState(pos.west()).getValue(CONNECTION) != EnumFacing.UP) + { + return false; + } + + return true; + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing face, + float posX, float posY, float posZ) + { + if (state.getValue(CONNECTION).equals(EnumFacing.UP)) + { + player.openGui(ModMain.modInstance, BBGuiHandler.SIMPLEWORKBENCH_ID, world, + pos.getX(), pos.getY(), pos.getZ()); + return true; + } + else + { + player.openGui(ModMain.modInstance, BBGuiHandler.DOUBLEWORKBENCH_ID, world, + pos.getX(), pos.getY(), pos.getZ()); + return true; + } + + // if (world.isRemote) + // { + // return true; + // } + // else + // { + // // player.displayGUIWorkbench(x, y, z); + // return true; + // } + } + + public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) + { + if (placer instanceof EntityPlayer) + { + RegisterAchievements.achievementGet((EntityPlayer)placer, "doubleWorkbench"); + } + + return super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer); + } + + protected BlockState createBlockState() + { + return new BlockState(this, CONNECTION); + } + + /* + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister iconregister) + { + blockIcon = iconregister.registerIcon(ModMain.MODID + ":workbenchSide"); + top = iconregister.registerIcon(ModMain.MODID + ":workbenchTop"); + westNorthIfSolo = iconregister.registerIcon(ModMain.MODID + ":workbenchFront"); + + westIfNorth = iconregister.registerIcon(ModMain.MODID + ":workbenchWestIfNorth"); + northIfWest = iconregister.registerIcon(ModMain.MODID + ":workbenchNorthIfWest"); + eastIfSouth = iconregister.registerIcon(ModMain.MODID + ":workbenchEastIfSouth"); + southIfEast = iconregister.registerIcon(ModMain.MODID + ":workbenchSouthIfEast"); + + topIfNorth = iconregister.registerIcon(ModMain.MODID + ":workbenchTopIfNorth"); + topIfWest = iconregister.registerIcon(ModMain.MODID + ":workbenchTopIfWest"); + topIfEast = iconregister.registerIcon(ModMain.MODID + ":workbenchTopIfEast"); + topIfSouth = iconregister.registerIcon(ModMain.MODID + ":workbenchTopIfSouth"); + } */ +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockEnderSmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockEnderSmelter.java new file mode 100644 index 0000000..06f8daa --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockEnderSmelter.java @@ -0,0 +1,244 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityEnderSmelter; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +public class BlockEnderSmelter extends BlockContainer implements IBBName +{ + public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); + private static boolean isLit; + private final boolean isLit2; // strange why... + + public BlockEnderSmelter(boolean lit) + { + super(Material.rock); + + if (lit) + { + setLightLevel(0.875F); + } + else + { + setLightLevel(0.0F); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + setUnlocalizedName(getName()); + + setHardness(1.5f); + setResistance(10.0f); + setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); + + isLit2 = lit; + } + + @Override + public String getName() + { + return isLit2 ? "enderSmelterLit" : "enderSmelter"; + } + + public static void updateBlockState(boolean lit, World world, BlockPos pos) + { + IBlockState state = world.getBlockState(pos); + TileEntity tileEntity = world.getTileEntity(pos); + isLit = true; + + if (lit) + { + world.setBlockState(pos, RegisterBlocks.enderSmelterLit.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + else + { + world.setBlockState(pos, RegisterBlocks.enderSmelter.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + + isLit = false; + + if (tileEntity != null) + { + tileEntity.validate(); + world.setTileEntity(pos, tileEntity); + } + } + + public int getMetaFromState(IBlockState state) + { + return ((EnumFacing)state.getValue(FACING)).getIndex(); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random random) + { + if (isLit2) + { + float f = pos.getX() + 0.5f; + float f1 = pos.getY() + random.nextFloat() * 6.0f / 16.0f; + float f2 = pos.getZ() + 0.5f; + + float f3 = 0.5f; + float f4 = random.nextFloat() * 0.6f - 0.2f; + + // Weird implementation because of particle rendering bug (#59). + if (state.getValue(FACING) == EnumFacing.WEST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.PORTAL, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.EAST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.PORTAL, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.NORTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.PORTAL, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.SOUTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.PORTAL, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + } + } + } + + @SideOnly(Side.CLIENT) + @Override + public void onBlockAdded(World world, BlockPos pos, IBlockState state) + { + if (!world.isRemote) + { + Block block = world.getBlockState(pos.offset(EnumFacing.NORTH)).getBlock(); + Block block1 = world.getBlockState(pos.offset(EnumFacing.SOUTH)).getBlock(); + Block block2 = world.getBlockState(pos.offset(EnumFacing.WEST)).getBlock(); + Block block3 = world.getBlockState(pos.offset(EnumFacing.EAST)).getBlock(); + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + + if (enumfacing == EnumFacing.NORTH && block.isFullBlock() && !block1.isFullBlock()) + { + enumfacing = EnumFacing.SOUTH; + } + else if (enumfacing == EnumFacing.SOUTH && block1.isFullBlock() && !block.isFullBlock()) + { + enumfacing = EnumFacing.NORTH; + } + else if (enumfacing == EnumFacing.WEST && block2.isFullBlock() && !block3.isFullBlock()) + { + enumfacing = EnumFacing.EAST; + } + else if (enumfacing == EnumFacing.EAST && block3.isFullBlock() && !block2.isFullBlock()) + { + enumfacing = EnumFacing.WEST; + } + + world.setBlockState(pos, state.withProperty(FACING, enumfacing), 2); + } + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int par3) + { + return Item.getItemFromBlock(RegisterBlocks.enderSmelter); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + player.openGui(ModMain.modInstance, BBGuiHandler.ENDERSMELTER_ID, world, + pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + + @Override + public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, + int meta, EntityLivingBase placer) + { + return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, + ItemStack stack) + { + world.setBlockState(pos, state.withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2); + + if (stack.hasDisplayName()) + { + TileEntity teBase = world.getTileEntity(pos); + if (teBase instanceof TileEntityEnderSmelter) + { + TileEntityEnderSmelter tileEntity = (TileEntityEnderSmelter)teBase; + tileEntity.setBlockName(stack.getDisplayName()); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, BlockPos pos) + { + return Item.getItemFromBlock(RegisterBlocks.enderSmelter); + } + + protected BlockState createBlockState() + { + return new BlockState(this, FACING); + } + + @Override + public int getRenderType() + { + return 3; + } + + // Drop stuff everywhere + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + if (!isLit) + { + TileEntity tileentity = world.getTileEntity(pos); + + if (tileentity instanceof TileEntityEnderSmelter) + { + InventoryHelper.dropInventoryItems(world, pos, (TileEntityEnderSmelter)tileentity); + world.updateComparatorOutputLevel(pos, this); + } + } + + super.breakBlock(world, pos, state); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2) + { + return new TileEntityEnderSmelter(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockInfusionRepairStation.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockInfusionRepairStation.java new file mode 100644 index 0000000..5d21808 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockInfusionRepairStation.java @@ -0,0 +1,46 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; + +public class BlockInfusionRepairStation extends Block implements IBBName +{ + public BlockInfusionRepairStation() + { + super(Material.rock); + + setCreativeTab(ModMain.tabBetterBeginnings); + setHardness(2.0f); + setResistance(6000); + + setUnlocalizedName(getName()); + } + + @Override + public String getName() + { + return "infusionRepairStation"; + } + + @Override + public int getRenderType() + { + return 3; + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + player.openGui(ModMain.modInstance, BBGuiHandler.INFUSIONREPAIR_ID, world, pos.getX(), pos.getY(), pos.getZ()); + return true; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockKiln.java new file mode 100644 index 0000000..ef78113 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockKiln.java @@ -0,0 +1,274 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityKiln; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +public class BlockKiln extends BlockContainer implements IBBName +{ + public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); + private static boolean isLit; + private final boolean isLit2; // strange why... + + @SideOnly(Side.CLIENT) + static final class SwitchEnumFacing + { + static final int[] facings = new int[EnumFacing.values().length]; + + static + { + try + { + facings[EnumFacing.WEST.ordinal()] = 1; + } + catch (NoSuchFieldError var4) + { + } + + try + { + facings[EnumFacing.EAST.ordinal()] = 2; + } + catch (NoSuchFieldError var3) + { + } + + try + { + facings[EnumFacing.NORTH.ordinal()] = 3; + } + catch (NoSuchFieldError var2) + { + } + + try + { + facings[EnumFacing.SOUTH.ordinal()] = 4; + } + catch (NoSuchFieldError var1) + { + } + } + } + + public BlockKiln(boolean lit) + { + super(Material.rock); + setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); + isLit2 = lit; + + if (!lit) + { + setCreativeTab(ModMain.tabBetterBeginnings); + } + + setUnlocalizedName(getName()); + + setHardness(2.0f); + setResistance(10.0f); + } + + @Override + public String getName() + { + return isLit2 ? "kilnLit" : "kiln"; + } + + public static void updateBlockState(boolean flag, World world, BlockPos pos) + { + IBlockState iblockstate = world.getBlockState(pos); + TileEntity tileentity = world.getTileEntity(pos); + isLit = true; + + if (flag) + { + world.setBlockState(pos, RegisterBlocks.kilnLit.getDefaultState() + .withProperty(FACING, iblockstate.getValue(FACING)), 3); + } + else + { + world.setBlockState(pos, RegisterBlocks.kiln.getDefaultState() + .withProperty(FACING, iblockstate.getValue(FACING)), 3); + } + + isLit = false; + + if (tileentity != null) + { + tileentity.validate(); + world.setTileEntity(pos, tileentity); + } + } + + public int getMetaFromState(IBlockState state) + { + return ((EnumFacing)state.getValue(FACING)).getIndex(); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random rand) + { + if (isLit2) + { + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + double d0 = (double)pos.getX() + 0.5D; + double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D; + double d2 = (double)pos.getZ() + 0.5D; + double d3 = 0.52D; + double d4 = rand.nextDouble() * 0.6D - 0.3D; + + switch (SwitchEnumFacing.facings[enumfacing.ordinal()]) + { + case 1: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + break; + case 2: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); + break; + case 3: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); + break; + case 4: + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); + world.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); + } + } + } + + @Override + public void onBlockAdded(World world, BlockPos pos, IBlockState state) + { + if (!world.isRemote) + { + Block block = world.getBlockState(pos.offset(EnumFacing.NORTH)).getBlock(); + Block block1 = world.getBlockState(pos.offset(EnumFacing.SOUTH)).getBlock(); + Block block2 = world.getBlockState(pos.offset(EnumFacing.WEST)).getBlock(); + Block block3 = world.getBlockState(pos.offset(EnumFacing.EAST)).getBlock(); + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + + if (enumfacing == EnumFacing.NORTH && block.isFullBlock() && !block1.isFullBlock()) + { + enumfacing = EnumFacing.SOUTH; + } + else if (enumfacing == EnumFacing.SOUTH && block1.isFullBlock() && !block.isFullBlock()) + { + enumfacing = EnumFacing.NORTH; + } + else if (enumfacing == EnumFacing.WEST && block2.isFullBlock() && !block3.isFullBlock()) + { + enumfacing = EnumFacing.EAST; + } + else if (enumfacing == EnumFacing.EAST && block3.isFullBlock() && !block2.isFullBlock()) + { + enumfacing = EnumFacing.WEST; + } + + world.setBlockState(pos, state.withProperty(FACING, enumfacing), 2); + } + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int fortune) + { + return Item.getItemFromBlock(RegisterBlocks.kiln); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + player.openGui(ModMain.modInstance, BBGuiHandler.KILN_ID, world, pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + + @Override + public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, + int meta, EntityLivingBase placer) + { + return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, + ItemStack stack) + { + world.setBlockState(pos, state.withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2); + + if (stack.hasDisplayName()) + { + TileEntity teBase = world.getTileEntity(pos); + if (teBase instanceof TileEntityKiln) + { + TileEntityKiln tileEntity = (TileEntityKiln)teBase; + tileEntity.setBlockName(stack.getDisplayName()); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, BlockPos pos) + { + return Item.getItemFromBlock(RegisterBlocks.kiln); + } + + protected BlockState createBlockState() + { + return new BlockState(this, FACING); + } + + @Override + public int getRenderType() + { + return 3; + } + + // Drop stuff everywhere + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + if (!isLit) + { + TileEntity tileentity = world.getTileEntity(pos); + + if (tileentity instanceof TileEntityKiln) + { + InventoryHelper.dropInventoryItems(world, pos, (TileEntityKiln)tileentity); + world.updateComparatorOutputLevel(pos, this); + } + } + + super.breakBlock(world, pos, state); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2) + { + return new TileEntityKiln(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockNetherBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockNetherBrickOven.java new file mode 100644 index 0000000..ee8b84c --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockNetherBrickOven.java @@ -0,0 +1,248 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class BlockNetherBrickOven extends BlockContainer implements IBBName +{ + public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); + private static boolean isLit; + private final boolean isLit2; // strange why... + + public BlockNetherBrickOven(boolean lit) + { + super(Material.rock); + + if (lit) + { + setLightLevel(0.875F); + } + else + { + setLightLevel(0F); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + setUnlocalizedName(getName()); + + setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); + + setHardness(4.0f); + setResistance(10.0f); + + isLit2 = lit; + } + + @Override + public String getName() + { + return isLit2 ? "netherBrickOvenLit" : "netherBrickOven"; + } + + public static void updateBlockState(boolean lit, World world, BlockPos pos) + { + IBlockState state = world.getBlockState(pos); + TileEntity tileEntity = world.getTileEntity(pos); + isLit = true; + + if (lit) + { + world.setBlockState(pos, RegisterBlocks.netherBrickOvenLit.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + else + { + world.setBlockState(pos, RegisterBlocks.netherBrickOven.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + + isLit = false; + + if (tileEntity != null) + { + tileEntity.validate(); + world.setTileEntity(pos, tileEntity); + } + } + + public int getMetaFromState(IBlockState state) + { + return ((EnumFacing)state.getValue(FACING)).getIndex(); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random random) + { + if (isLit2) + { + float f = pos.getX() + 0.5f; + float f1 = pos.getY() + random.nextFloat() * 6.0f / 16.0f; + float f2 = pos.getZ() + 0.5f; + + float f3 = 0.5f; + float f4 = random.nextFloat() * 0.6f - 0.2f; + + if (state.getValue(FACING) == EnumFacing.WEST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.EAST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.NORTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.SOUTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + } + } + } + + @SideOnly(Side.CLIENT) + @Override + public void onBlockAdded(World world, BlockPos pos, IBlockState state) + { + if (!world.isRemote) + { + Block block = world.getBlockState(pos.offset(EnumFacing.NORTH)).getBlock(); + Block block1 = world.getBlockState(pos.offset(EnumFacing.SOUTH)).getBlock(); + Block block2 = world.getBlockState(pos.offset(EnumFacing.WEST)).getBlock(); + Block block3 = world.getBlockState(pos.offset(EnumFacing.EAST)).getBlock(); + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + + if (enumfacing == EnumFacing.NORTH && block.isFullBlock() && !block1.isFullBlock()) + { + enumfacing = EnumFacing.SOUTH; + } + else if (enumfacing == EnumFacing.SOUTH && block1.isFullBlock() && !block.isFullBlock()) + { + enumfacing = EnumFacing.NORTH; + } + else if (enumfacing == EnumFacing.WEST && block2.isFullBlock() && !block3.isFullBlock()) + { + enumfacing = EnumFacing.EAST; + } + else if (enumfacing == EnumFacing.EAST && block3.isFullBlock() && !block2.isFullBlock()) + { + enumfacing = EnumFacing.WEST; + } + + world.setBlockState(pos, state.withProperty(FACING, enumfacing), 2); + } + + super.onBlockAdded(world, pos, state); + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int par3) + { + return Item.getItemFromBlock(RegisterBlocks.netherBrickOven); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + player.openGui(ModMain.modInstance, BBGuiHandler.NETHERBRICKOVEN_ID, world, pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + + @Override + public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, + int meta, EntityLivingBase placer) + { + return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, + ItemStack stack) + { + world.setBlockState(pos, state.withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2); + + if (stack.hasDisplayName()) + { + TileEntity teBase = world.getTileEntity(pos); + if (teBase instanceof TileEntityNetherBrickOven) + { + TileEntityNetherBrickOven tileEntity = (TileEntityNetherBrickOven)teBase; + tileEntity.setBlockName(stack.getDisplayName()); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, BlockPos pos) + { + return Item.getItemFromBlock(RegisterBlocks.netherBrickOven); + } + + protected BlockState createBlockState() + { + return new BlockState(this, FACING); + } + + @Override + public int getRenderType() + { + return 3; + } + + // Drop stuff everywhere + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + if (!isLit) + { + TileEntity tileentity = world.getTileEntity(pos); + + if (tileentity instanceof TileEntityNetherBrickOven) + { + InventoryHelper.dropInventoryItems(world, pos, (TileEntityNetherBrickOven)tileentity); + world.updateComparatorOutputLevel(pos, this); + } + } + + super.breakBlock(world, pos, state); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2) + { + return new TileEntityNetherBrickOven(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockObsidianKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockObsidianKiln.java new file mode 100644 index 0000000..5bd50ce --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockObsidianKiln.java @@ -0,0 +1,244 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityObsidianKiln; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +public class BlockObsidianKiln extends BlockContainer implements IBBName +{ + public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); + private static boolean isLit; + private final boolean isLit2; // strange why... + + public BlockObsidianKiln(boolean lit) + { + super(Material.rock); + + if (lit) + { + setLightLevel(0.875F); + } + else + { + setLightLevel(0F); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + setUnlocalizedName(getName()); + + setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); + setHardness(2.0f); + setResistance(10.0f); + + isLit2 = lit; + } + + @Override + public String getName() + { + return isLit2 ? "obsidianKilnLit" : "obsidianKiln"; + } + + public static void updateBlockState(boolean lit, World world, BlockPos pos) + { + IBlockState state = world.getBlockState(pos); + TileEntity tileEntity = world.getTileEntity(pos); + isLit = true; + + if (lit) + { + world.setBlockState(pos, RegisterBlocks.obsidianKilnLit.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + else + { + world.setBlockState(pos, RegisterBlocks.obsidianKiln.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + + isLit = false; + + if (tileEntity != null) + { + tileEntity.validate(); + world.setTileEntity(pos, tileEntity); + } + } + + public int getMetaFromState(IBlockState state) + { + return ((EnumFacing)state.getValue(FACING)).getIndex(); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random random) + { + if (isLit2) + { + float f = pos.getX() + 0.5f; + float f1 = pos.getY() + random.nextFloat() * 6.0f / 16.0f; + float f2 = pos.getZ() + 0.5f; + + float f3 = 0.5f; + float f4 = random.nextFloat() * 0.6f - 0.2f; + + if (state.getValue(FACING) == EnumFacing.WEST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.EAST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.NORTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.SOUTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + } + } + } + + @SideOnly(Side.CLIENT) + @Override + public void onBlockAdded(World world, BlockPos pos, IBlockState state) + { + if (!world.isRemote) + { + Block block = world.getBlockState(pos.offset(EnumFacing.NORTH)).getBlock(); + Block block1 = world.getBlockState(pos.offset(EnumFacing.SOUTH)).getBlock(); + Block block2 = world.getBlockState(pos.offset(EnumFacing.WEST)).getBlock(); + Block block3 = world.getBlockState(pos.offset(EnumFacing.EAST)).getBlock(); + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + + if (enumfacing == EnumFacing.NORTH && block.isFullBlock() && !block1.isFullBlock()) + { + enumfacing = EnumFacing.SOUTH; + } + else if (enumfacing == EnumFacing.SOUTH && block1.isFullBlock() && !block.isFullBlock()) + { + enumfacing = EnumFacing.NORTH; + } + else if (enumfacing == EnumFacing.WEST && block2.isFullBlock() && !block3.isFullBlock()) + { + enumfacing = EnumFacing.EAST; + } + else if (enumfacing == EnumFacing.EAST && block3.isFullBlock() && !block2.isFullBlock()) + { + enumfacing = EnumFacing.WEST; + } + + world.setBlockState(pos, state.withProperty(FACING, enumfacing), 2); + } + + super.onBlockAdded(world, pos, state); + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int par3) + { + return Item.getItemFromBlock(RegisterBlocks.obsidianKiln); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + player.openGui(ModMain.modInstance, BBGuiHandler.OBSIDIANKILN_ID, world, pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + + @Override + public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, + int meta, EntityLivingBase placer) + { + return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, + ItemStack stack) + { + world.setBlockState(pos, state.withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2); + + if (stack.hasDisplayName()) + { + TileEntity teBase = world.getTileEntity(pos); + if (teBase instanceof TileEntityObsidianKiln) + { + TileEntityObsidianKiln tileEntity = (TileEntityObsidianKiln)teBase; + tileEntity.setBlockName(stack.getDisplayName()); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, BlockPos pos) + { + return Item.getItemFromBlock(RegisterBlocks.obsidianKiln); + } + + protected BlockState createBlockState() + { + return new BlockState(this, FACING); + } + + @Override + public int getRenderType() + { + return 3; + } + + // Drop stuff everywhere + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + if (!isLit) + { + TileEntity tileentity = world.getTileEntity(pos); + + if (tileentity instanceof TileEntityObsidianKiln) + { + InventoryHelper.dropInventoryItems(world, pos, (TileEntityObsidianKiln)tileentity); + world.updateComparatorOutputLevel(pos, this); + } + } + + super.breakBlock(world, pos, state); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2) + { + return new TileEntityObsidianKiln(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockSmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockSmelter.java new file mode 100644 index 0000000..064ec5f --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/blocks/BlockSmelter.java @@ -0,0 +1,244 @@ +package net.einsteinsci.betterbeginnings.blocks; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.tileentity.TileEntitySmelter; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +public class BlockSmelter extends BlockContainer implements IBBName +{ + public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); + private static boolean isLit; + private final boolean isLit2; // strange why... + + public BlockSmelter(boolean lit) + { + super(Material.rock); + + if (lit) + { + setLightLevel(0.875F); + } + else + { + setLightLevel(0F); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + setUnlocalizedName(getName()); + + setDefaultState(blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); + setHardness(1.5f); + setResistance(10.0f); + + isLit2 = lit; + } + + @Override + public String getName() + { + return isLit2 ? "smelterLit" : "smelter"; + } + + public static void updateBlockState(boolean lit, World world, BlockPos pos) + { + IBlockState state = world.getBlockState(pos); + TileEntity tileEntity = world.getTileEntity(pos); + isLit = true; + + if (lit) + { + world.setBlockState(pos, RegisterBlocks.smelterLit.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + else + { + world.setBlockState(pos, RegisterBlocks.smelter.getDefaultState() + .withProperty(FACING, state.getValue(FACING)), 3); + } + + isLit = false; + + if (tileEntity != null) + { + tileEntity.validate(); + world.setTileEntity(pos, tileEntity); + } + } + + @Override + public int getRenderType() + { + return 3; + } + + // Drop stuff everywhere + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + if (!isLit) + { + TileEntity tileentity = world.getTileEntity(pos); + + if (tileentity instanceof TileEntitySmelter) + { + InventoryHelper.dropInventoryItems(world, pos, (TileEntitySmelter)tileentity); + world.updateComparatorOutputLevel(pos, this); + } + } + + super.breakBlock(world, pos, state); + } + + public int getMetaFromState(IBlockState state) + { + return ((EnumFacing)state.getValue(FACING)).getIndex(); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random random) + { + if (isLit2) + { + float f = pos.getX() + 0.5f; + float f1 = pos.getY() + random.nextFloat() * 6.0f / 16.0f; + float f2 = pos.getZ() + 0.5f; + + float f3 = 0.5f; + float f4 = random.nextFloat() * 0.6f - 0.2f; + + if (state.getValue(FACING) == EnumFacing.WEST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f - f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.EAST) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f3, f1, f2 + f4, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.NORTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f4, f1, f2 - f3, 0.0F, 0.0F, 0.0F); + } + else if (state.getValue(FACING) == EnumFacing.SOUTH) + { + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + world.spawnParticle(EnumParticleTypes.FLAME, f + f4, f1, f2 + f3, 0.0F, 0.0F, 0.0F); + } + } + } + + @SideOnly(Side.CLIENT) + @Override + public void onBlockAdded(World world, BlockPos pos, IBlockState state) + { + if (!world.isRemote) + { + Block block = world.getBlockState(pos.offset(EnumFacing.NORTH)).getBlock(); + Block block1 = world.getBlockState(pos.offset(EnumFacing.SOUTH)).getBlock(); + Block block2 = world.getBlockState(pos.offset(EnumFacing.WEST)).getBlock(); + Block block3 = world.getBlockState(pos.offset(EnumFacing.EAST)).getBlock(); + EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); + + if (enumfacing == EnumFacing.NORTH && block.isFullBlock() && !block1.isFullBlock()) + { + enumfacing = EnumFacing.SOUTH; + } + else if (enumfacing == EnumFacing.SOUTH && block1.isFullBlock() && !block.isFullBlock()) + { + enumfacing = EnumFacing.NORTH; + } + else if (enumfacing == EnumFacing.WEST && block2.isFullBlock() && !block3.isFullBlock()) + { + enumfacing = EnumFacing.EAST; + } + else if (enumfacing == EnumFacing.EAST && block3.isFullBlock() && !block2.isFullBlock()) + { + enumfacing = EnumFacing.WEST; + } + + world.setBlockState(pos, state.withProperty(FACING, enumfacing), 2); + } + + super.onBlockAdded(world, pos, state); + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int par3) + { + return Item.getItemFromBlock(RegisterBlocks.smelter); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, + float clickX, float clickY, float clickZ) + { + player.openGui(ModMain.modInstance, BBGuiHandler.SMELTER_ID, world, pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + + @Override + public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, + int meta, EntityLivingBase placer) + { + return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, + ItemStack stack) + { + world.setBlockState(pos, state.withProperty(FACING, placer.getHorizontalFacing().getOpposite()), 2); + + if (stack.hasDisplayName()) + { + TileEntity teBase = world.getTileEntity(pos); + if (teBase instanceof TileEntitySmelter) + { + TileEntitySmelter tileEntity = (TileEntitySmelter)teBase; + tileEntity.setBlockName(stack.getDisplayName()); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, BlockPos pos) + { + return Item.getItemFromBlock(RegisterBlocks.smelter); + } + + protected BlockState createBlockState() + { + return new BlockState(this, FACING); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2) + { + return new TileEntitySmelter(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfig.java b/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfig.java new file mode 100644 index 0000000..9c8d9fd --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfig.java @@ -0,0 +1,162 @@ +package net.einsteinsci.betterbeginnings.config; + +import net.minecraftforge.common.config.Configuration; + +import java.util.*; + +public class BBConfig +{ + public static final String GENERAL = Configuration.CATEGORY_GENERAL; + public static final String CRAFTING = "crafting"; + public static final String SMELTING = "smelting"; + + public static boolean greetUser; + public static boolean debugLogging; + public static boolean advancedCraftingForLotsOfThings; + public static boolean requireAdvancedCrafting; + public static boolean removeCraftedFoodRecipes; + public static boolean canMakeVanillaWorkbench; + public static boolean canMakeVanillaFurnace; + public static boolean canMakeChainArmor; + public static boolean removeWoodToolRecipes; + public static boolean flamingAnimalsDropCharredMeat; + public static boolean spidersDropString; + public static boolean moreBones; + public static boolean moreBonesPeacefulOnly; + public static boolean spawnMarshmallows; + public static boolean canSmelterDoKilnStuff; + public static boolean removeSmeltingRecipes; + public static boolean removeOnlyVanillaSmeltingRecipes; + public static boolean makeStuffStackable; + public static boolean canCampfireDoAllKilnStuff; + + public static List alwaysBreakable; + public static List alsoAxes; + public static List alsoPickaxes; + public static List alsoKnives; + + public static void initialize() + { + greetUser = true; + debugLogging = false; + advancedCraftingForLotsOfThings = true; + requireAdvancedCrafting = true; + removeCraftedFoodRecipes = true; + canMakeVanillaWorkbench = false; + canMakeVanillaFurnace = false; + canMakeChainArmor = true; + removeWoodToolRecipes = true; + flamingAnimalsDropCharredMeat = true; + spidersDropString = false; + moreBones = true; + moreBonesPeacefulOnly = true; + spawnMarshmallows = true; + canSmelterDoKilnStuff = false; + removeSmeltingRecipes = true; + removeOnlyVanillaSmeltingRecipes = true; + makeStuffStackable = true; + canCampfireDoAllKilnStuff = false; + + alwaysBreakable = new ArrayList(); + alsoAxes = new ArrayList(); + alsoPickaxes = new ArrayList(); + alsoKnives = new ArrayList(); + } + + public static void syncConfig(Configuration config) + { + ////////////// + // Booleans // + ////////////// + + // General + greetUser = config.getBoolean("Greet user", GENERAL, true, "Greet user upon login"); + debugLogging = config.getBoolean("Debug logging", GENERAL, false, "Log all kinds of stuff, for debug purposes"); + flamingAnimalsDropCharredMeat = config.getBoolean("Burn, Baby, Burn", GENERAL, true, + "Animals that die by flame drop charred meat instead of vanilla cooked meat"); + spidersDropString = config.getBoolean("Spiders drop string", GENERAL, false, + "Spiders drop vanilla string as well as silk."); + moreBones = config.getBoolean("All bones", GENERAL, true, + "Almost all mobs drop bones, not just skeletons"); + moreBonesPeacefulOnly = config.getBoolean("More bones only works on peaceful", GENERAL, true, + "Non-skeleton mobs only drop bones on peaceful. Requires" + + " 'All bones' to be true in order to do anything."); + spawnMarshmallows = config.getBoolean("Generate marshmallows", GENERAL, true, + "Marshmallows spawn in dungeons, mineshafts, desert temples, " + + "and jungle temples."); + makeStuffStackable = config.getBoolean("Make stuff stackable", GENERAL, true, + "Makes items that should be stackable (doors, " + + "minecarts, potions) stackable."); + + // Crafting + advancedCraftingForLotsOfThings = config.getBoolean("Advanced crafting for lots of things", CRAFTING, true, + "Require Advanced Crafting for things like doors, " + + "pistons, chests, etc."); + requireAdvancedCrafting = config.getBoolean("Require Advanced Crafting", CRAFTING, true, + "Disable vanilla crafting for recipes that require advanced " + + "crafting table. Setting this to false sort of makes " + + "this part of the mod pointless."); + removeCraftedFoodRecipes = config.getBoolean("Remove Crafted Food Recipes", CRAFTING, true, + "Remove crafting recipes of vanilla food items, enforcing the " + + "use of the ovens."); + canMakeVanillaWorkbench = config.getBoolean("Enable vanilla workbench recipe", CRAFTING, true, + "Provide alternative recipe for vanilla crafting table"); + canMakeVanillaFurnace = config.getBoolean("Enable vanilla furnace recipe", CRAFTING, true, + "Provide alternative recipe for vanilla furnace"); + canMakeChainArmor = config.getBoolean("Enable chain armor", CRAFTING, true, + "Allow vanilla chain armor to be craftable from iron nuggets"); + removeWoodToolRecipes = config.getBoolean("Remove wooden tool recipes", CRAFTING, true, + "Remove recipes for wooden pickaxe, axe, shovel, and hoe."); + + // Smelting + canSmelterDoKilnStuff = config.getBoolean("Smelter can make kiln products", SMELTING, false, + "Allow smelter to make glass, bricks, smooth stone, etc."); + + removeSmeltingRecipes = config.getBoolean("Disable vanilla smelting", SMELTING, true, + "Remove recipes that normally use the vanilla furnace"); + removeOnlyVanillaSmeltingRecipes = config.getBoolean("Only remove smelting recipes for vanilla items", + SMELTING, true, + "Only remove furnace recipes for vanilla items/blocks. " + + "Requires 'Disable vanilla smelting'."); + canCampfireDoAllKilnStuff = config.getBoolean("Can campfire handle all kiln smelting", SMELTING, true, + "Allow campfire to process all recipes kiln can, instead of " + + "just a few."); + + //////////// + // Arrays // + //////////// + + String[] _alwaysBreakable = config.getStringList("Always breakable", GENERAL, new String[] {}, + "List of blocks always breakable. Use this format: " + + "'modid:blockName'."); + alwaysBreakable.clear(); + Collections.addAll(alwaysBreakable, _alwaysBreakable); + + String[] _alsoAxes = config.getStringList("Also axes", GENERAL, new String[] {}, + "List of items that qualify as axes for breakable checks. " + + "Use this format: 'modid:itemName'."); + alsoAxes.clear(); + Collections.addAll(alsoAxes, _alsoAxes); + + String[] _alsoPickaxes = config.getStringList("Also pickaxes", GENERAL, new String[] {}, + "List of items that qualify as pickaxes for breakable checks. " + + "Use this format: 'modid:itemName'."); + alsoPickaxes.clear(); + Collections.addAll(alsoPickaxes, _alsoPickaxes); + + String[] _alsoKnives = config.getStringList("Also knives", GENERAL, new String[] {}, + "List of items that qualify as knives for breakable checks. " + + "Use this format: 'modid:itemName'."); + alsoKnives.clear(); + Collections.addAll(alsoKnives, _alsoKnives); + + ////////// + // Save // + ////////// + + if (config.hasChanged()) + { + config.save(); + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGui.java b/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGui.java new file mode 100644 index 0000000..40fcca7 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGui.java @@ -0,0 +1,28 @@ +package net.einsteinsci.betterbeginnings.config; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.common.config.ConfigElement; +import net.minecraftforge.fml.client.config.GuiConfig; +import net.minecraftforge.fml.client.config.IConfigElement; + +import java.util.List; + +public class BBConfigGui extends GuiConfig +{ + public BBConfigGui(GuiScreen parent) + { + super(parent, getAllCategories(), ModMain.MODID, false, false, + GuiConfig.getAbridgedConfigPath(ModMain.configFile.toString())); + } + + public static List getAllCategories() + { + List all = new ConfigElement(ModMain.configFile.getCategory(BBConfig.GENERAL)) + .getChildElements(); + all.addAll(new ConfigElement(ModMain.configFile.getCategory(BBConfig.CRAFTING)).getChildElements()); + all.addAll(new ConfigElement(ModMain.configFile.getCategory(BBConfig.SMELTING)).getChildElements()); + + return all; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGuiFactory.java b/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGuiFactory.java new file mode 100644 index 0000000..a43d1ed --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/config/BBConfigGuiFactory.java @@ -0,0 +1,35 @@ +package net.einsteinsci.betterbeginnings.config; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.fml.client.IModGuiFactory; + +import java.util.Set; + +public class BBConfigGuiFactory implements IModGuiFactory +{ + @Override + public void initialize(Minecraft minecraftInstance) + { + // Nothin here + } + + @Override + public Class mainConfigGuiClass() + { + return BBConfigGui.class; + } + + @Override + public Set runtimeGuiCategories() + { + return null; + } + + @Override + public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) + { + return null; + } + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/event/BBEventHandler.java b/src/main/java/net/einsteinsci/betterbeginnings/event/BBEventHandler.java new file mode 100644 index 0000000..d943de7 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/event/BBEventHandler.java @@ -0,0 +1,479 @@ +package net.einsteinsci.betterbeginnings.event; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.config.BBConfig; +import net.einsteinsci.betterbeginnings.items.ItemHammer; +import net.einsteinsci.betterbeginnings.items.ItemKnife; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.register.RegisterItems; +import net.einsteinsci.betterbeginnings.register.achievement.RegisterAchievements; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityCampfire; +import net.einsteinsci.betterbeginnings.util.ChatUtil; +import net.minecraft.block.Block; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.*; +import net.minecraft.entity.passive.*; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.*; +import net.minecraft.world.EnumDifficulty; +import net.minecraftforge.event.entity.living.LivingDropsEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.client.event.ConfigChangedEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent; + +import java.util.*; + +public class BBEventHandler +{ + @SubscribeEvent + public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e) + { + if (BBConfig.greetUser) + { + ChatUtil.sendModChatToPlayer(e.player, ChatUtil.LIME + "Better Beginnings loaded successfully."); + } + } + + @SubscribeEvent + public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent e) + { + if (e.modID.equals(ModMain.MODID)) + { + BBConfig.syncConfig(ModMain.configFile); + } + } + + @SubscribeEvent + public void onItemTooltip(ItemTooltipEvent e) + { + Item item = e.itemStack.getItem(); + + if (item == RegisterItems.charredMeat) + { + e.toolTip.add("Not to be confused with charcoal"); + } + + if (item == RegisterItems.ironNugget) + { + e.toolTip.add("Good for hinges and rivets"); + } + + if (item == RegisterItems.flintKnife) + { + e.toolTip.add("Don't bring it to a gunfight"); + } + + if (item == RegisterItems.noobWoodSword && EnchantmentHelper.getEnchantments(e.itemStack).isEmpty()) + { + e.toolTip.add(ChatUtil.BLUE + "+0 Attack Damage"); + } + + if (item == RegisterItems.testItem) + { + e.toolTip.add(ChatUtil.PINK + "For dev testing only. What it does changes from one version to the next."); + } + + if (item == RegisterItems.pan) + { + e.toolTip.add(ChatUtil.BLUE + "Fry stuff over a campfire!"); + } + + if (isWIP(e.itemStack)) + { + e.toolTip.add(ChatUtil.RED + "WIP. May not be fully functional."); + } + } + + public boolean isWIP(ItemStack stack) + { + List wip = new ArrayList<>(); + + wip.add(new ItemStack(RegisterItems.clothBoots)); + wip.add(new ItemStack(RegisterItems.clothPants)); + wip.add(new ItemStack(RegisterItems.clothShirt)); + wip.add(new ItemStack(RegisterItems.clothHat)); + wip.add(new ItemStack(RegisterItems.roastingStick)); + wip.add(new ItemStack(RegisterItems.roastingStickRawMallow)); + wip.add(new ItemStack(RegisterItems.roastingStickCookedMallow)); + + for (ItemStack test : wip) + { + if (stack.getItem() == test.getItem()) + { + return true; + } + } + + return false; + } + + @SubscribeEvent + public void onBlockBreak(BlockEvent.BreakEvent e) + { + // Let's leave this to the professionals + BlockBreakHelper.handleBlockBreaking(e); + } + + @SubscribeEvent + public void onRightClick(PlayerInteractEvent e) + { + if (e.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) + { + if (e.entityPlayer.getHeldItem() != null) + { + ItemStack stack = e.entityPlayer.getHeldItem(); + Item item = stack.getItem(); + + if (item == Items.flint_and_steel || item == RegisterItems.fireBow) + { + Block b = e.world.getBlockState(e.pos).getBlock(); + + if (b == RegisterBlocks.campfire || b == RegisterBlocks.campfireLit) + { + TileEntityCampfire campfire = (TileEntityCampfire)e.world.getTileEntity(e.pos); + + campfire.lightFuel(); // Light it. + e.entityPlayer.getHeldItem().damageItem(1, e.entityPlayer); + if (item == Items.flint_and_steel) + { + e.setCanceled(true); + } + } + } + } + } + } + + @SubscribeEvent + public void onBlockDrops(BlockEvent.HarvestDropsEvent e) + { + Block block = e.state.getBlock(); + EntityPlayer player = e.harvester; + + // All onBlockDrops activity that does not have to do with players must + // occur before here. + if (player == null) + { + return; + } + + ItemStack held = player.getHeldItem(); + Random rand = player.worldObj.rand; + + // Knife silk-touching for vines + if (block == Blocks.vine && !e.isSilkTouching) + { + if (held != null) + { + if (held.getItem() instanceof ItemKnife) + { + if (rand.nextInt(8) == 0) + { + e.drops.add(new ItemStack(Blocks.vine)); + } + } + } + } + + // Knife silk-touching for grass/bushes + if ((block == Blocks.tallgrass || block == Blocks.deadbush) && !e.isSilkTouching) + { + if (held != null) + { + if (held.getItem() instanceof ItemKnife) + { + if (rand.nextInt(8) == 0) + { + int meta = block.getMetaFromState(e.state); + e.drops.add(new ItemStack(block, 1, meta)); + } + } + } + } + + // Hammer + if (held != null) + { + if (held.getItem() instanceof ItemHammer) + { + ItemStack crushResult = ItemHammer.getCrushResult(block); + if (crushResult != null) + { + e.drops.clear(); + e.drops.add(crushResult); + } + } + } + + // Makes sure emergency escape mechanic does not let blocks fall out (like logs) + ItemStack heldItemStack = player.getHeldItem(); + + int neededHarvestLevel = block.getHarvestLevel(e.state); + String neededToolClass = block.getHarvestTool(e.state); + int usedHarvestLevel = 0; + String usedToolClass = null; + if (heldItemStack != null) + { + for (String toolClass : heldItemStack.getItem().getToolClasses(heldItemStack)) + { + int hl = heldItemStack.getItem().getHarvestLevel(heldItemStack, toolClass); + if (hl >= usedHarvestLevel) + { + usedHarvestLevel = hl; + usedToolClass = toolClass; + } + } + } + + if (neededToolClass == null || neededToolClass.equalsIgnoreCase("shovel") || + neededToolClass.equalsIgnoreCase("null")) + { + return; + } + + if (usedToolClass == null || !usedToolClass.equalsIgnoreCase(neededToolClass) || + usedHarvestLevel < neededHarvestLevel) + { + e.drops.clear(); + } + } + + @SubscribeEvent + public void onItemSmelted(PlayerEvent.ItemSmeltedEvent e) + { + if (e.smelting.getItem() == Items.golden_apple && e.smelting.getItemDamage() == 1) + { + RegisterAchievements.achievementGet(e.player, "notchApple"); + } + } + + @SubscribeEvent + public void onItemCrafted(PlayerEvent.ItemCraftedEvent e) + { + // To fix duplication glitch (#27) + if (e.crafting.getItem() instanceof ItemKnife) + { + for (int i = 0; i < e.craftMatrix.getSizeInventory(); i++) + { + ItemStack stack = e.craftMatrix.getStackInSlot(i); + if (stack != null) + { + if (stack.getItem() instanceof ItemKnife) + { + --stack.stackSize; + + if (stack.stackSize <= 0) + { + e.craftMatrix.setInventorySlotContents(i, null); + } + else + { + e.craftMatrix.setInventorySlotContents(i, stack); + } + } + } + } + } + + if (e.crafting.getItem() == RegisterItems.flintKnife) + { + RegisterAchievements.achievementGet(e.player, "flintKnife"); + } + else if (e.crafting.getItem() instanceof ItemKnife) + { + RegisterAchievements.achievementGet(e.player, "upgradeKnife"); + } + + if (e.crafting.getItem() == Items.string) + { + RegisterAchievements.achievementGet(e.player, "makeString"); + } + + if (e.crafting.getItem() == RegisterItems.twine) + { + RegisterAchievements.achievementGet(e.player, "makeTwine"); + } + + for (int i = 0; i < e.craftMatrix.getSizeInventory(); ++i) + { + if (e.craftMatrix.getStackInSlot(i) != null) + { + ItemStack current = e.craftMatrix.getStackInSlot(i); + if (current.getItem() instanceof ItemKnife && e.crafting.getItem() == Items.stick) + { + RegisterAchievements.achievementGet(e.player, "makeSticks"); + } + } + } + + if (e.crafting.getItem() == RegisterItems.flintHatchet) + { + RegisterAchievements.achievementGet(e.player, "makeHatchet"); + } + + if (e.crafting.getItem() instanceof ItemSword) + { + RegisterAchievements.achievementGet(e.player, "makeSword"); + } + + if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.infusionRepairStation)) + { + RegisterAchievements.achievementGet(e.player, "infusionRepair"); + } + + if (e.crafting.getItem() == RegisterItems.boneShard) + { + RegisterAchievements.achievementGet(e.player, "boneShards"); + } + + if (e.crafting.getItem() == RegisterItems.bonePickaxe) + { + RegisterAchievements.achievementGet(e.player, "bonePick"); + } + + if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.kiln)) + { + RegisterAchievements.achievementGet(e.player, "makeKiln"); + } + + if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.obsidianKiln)) + { + RegisterAchievements.achievementGet(e.player, "obsidianKiln"); + } + + if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.smelter)) + { + RegisterAchievements.achievementGet(e.player, "makeSmelter"); + } + + if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.enderSmelter)) + { + RegisterAchievements.achievementGet(e.player, "enderSmelter"); + } + + if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.brickOven)) + { + RegisterAchievements.achievementGet(e.player, "makeBrickOven"); + } + + if (e.crafting.getItem() == Items.cake) + { + RegisterAchievements.achievementGet(e.player, "cake"); + } + + if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.netherBrickOven)) + { + RegisterAchievements.achievementGet(e.player, "netherBrickOven"); + } + } + + @SubscribeEvent + public void onEntityLivingDrops(LivingDropsEvent e) + { + Random rand = e.entity.worldObj.rand; + + if (e.entityLiving instanceof EntitySpider) // Includes cave spiders + { + if (!BBConfig.spidersDropString) + { + Iterator iterator = e.drops.iterator(); + while (iterator.hasNext()) + { + EntityItem entityItem = (EntityItem)iterator.next(); + Item item = entityItem.getEntityItem().getItem(); + if (item == Items.string) + { + iterator.remove(); + } + } + } + + int dropCount = rand.nextInt(3 + e.lootingLevel) + 2; + for (int i = 0; i < dropCount; ++i) + { + e.entityLiving.dropItem(RegisterItems.silk, 1); + } + } + + if (BBConfig.moreBones) + { + if (!BBConfig.moreBonesPeacefulOnly || e.entity.worldObj.getDifficulty() == EnumDifficulty.PEACEFUL) + { + int maxBones = 0; + int maxShards = 0; + + if (e.entityLiving instanceof EntityCow) + { + maxBones = 4; + } + if (e.entityLiving instanceof EntitySheep || e.entityLiving instanceof EntityPig) + { + maxBones = 3; + } + if (e.entityLiving instanceof EntityChicken || e.entityLiving instanceof EntityOcelot) + { + maxShards = 3; + } + if (e.entityLiving instanceof EntityZombie) + { + maxBones = 2; + maxShards = 3; + } + + if (maxBones > 0 && e.recentlyHit && !e.entityLiving.isChild()) + { + int dropCount = rand.nextInt(maxBones + e.lootingLevel); + for (int i = 0; i < dropCount; ++i) + { + e.entityLiving.dropItem(Items.bone, 1); + } + } + if (maxShards > 0 && e.recentlyHit && !e.entityLiving.isChild()) + { + int dropCount = rand.nextInt(maxShards + e.lootingLevel); + for (int i = 0; i < dropCount; ++i) + { + e.entityLiving.dropItem(RegisterItems.boneShard, 1); + } + } + } + + if (e.entityLiving instanceof EntitySkeleton) + { + int dropCount = rand.nextInt(3 + e.lootingLevel); + e.entityLiving.dropItem(Items.bone, 1); + e.entityLiving.dropItem(RegisterItems.boneShard, dropCount); + } + } + + if (BBConfig.flamingAnimalsDropCharredMeat) + { + // Flaming mobs drop charred meat instead of cooked meats + if (e.entityLiving instanceof EntityCow || e.entityLiving instanceof EntityPig || + e.entityLiving instanceof EntityChicken) + { + int charredDrops = 0; + + Iterator iterator = e.drops.iterator(); + while (iterator.hasNext()) + { + EntityItem entityItem = (EntityItem)iterator.next(); + Item item = entityItem.getEntityItem().getItem(); + if (item == Items.cooked_beef || item == Items.cooked_porkchop || item == Items.cooked_chicken) + { + iterator.remove(); + charredDrops += entityItem.getEntityItem().stackSize; + } + } + + e.entityLiving.dropItem(RegisterItems.charredMeat, charredDrops); + } + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/event/BlockBreakHelper.java b/src/main/java/net/einsteinsci/betterbeginnings/event/BlockBreakHelper.java new file mode 100644 index 0000000..f810490 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/event/BlockBreakHelper.java @@ -0,0 +1,144 @@ +package net.einsteinsci.betterbeginnings.event; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.items.ItemKnife; +import net.einsteinsci.betterbeginnings.util.ChatUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockPos; +import net.minecraft.world.EnumDifficulty; +import net.minecraftforge.event.world.BlockEvent; +import org.apache.logging.log4j.Level; + +import java.util.HashMap; +import java.util.Map; + +public class BlockBreakHelper +{ + public static final Map brokenOnce = new HashMap<>(); + + // returns whether to cancel drops or not + public static void handleBlockBreaking(BlockEvent.BreakEvent e) + { + Block block = e.state.getBlock(); + EntityPlayer player = e.getPlayer(); + ItemStack heldItemStack = player.getHeldItem(); + + if (player.capabilities.isCreativeMode) + { + return; + } + + int neededHarvestLevel = block.getHarvestLevel(e.state); + String neededToolClass = block.getHarvestTool(e.state); + int usedHarvestLevel = 0; + String usedToolClass = null; + String stackName = heldItemStack != null ? heldItemStack.getDisplayName() : "NULL"; + + if (heldItemStack != null) + { + for (String toolClass : heldItemStack.getItem().getToolClasses(heldItemStack)) + { + int hl = heldItemStack.getItem().getHarvestLevel(heldItemStack, toolClass); + if (hl >= usedHarvestLevel) + { + usedHarvestLevel = hl; + usedToolClass = toolClass; + } + } + } + + boolean cancel = false; + + if (heldItemStack != null) + { + if (heldItemStack.getItem() instanceof ItemKnife && + ItemKnife.getBreakable().contains(block)) + { + return; // allows knife to do stuff. + } + } + + if (neededToolClass == null || + neededToolClass.equalsIgnoreCase("shovel") || + neededToolClass.equalsIgnoreCase("null")) + { + return; + } + + if (neededToolClass.equalsIgnoreCase(usedToolClass)) + { + if (usedHarvestLevel < neededHarvestLevel) + { + cancel = true; + } + } + else + { + if (usedToolClass == null || usedToolClass.equalsIgnoreCase("null")) + { + if (e.world.getDifficulty() != EnumDifficulty.PEACEFUL) + { + player.attackEntityFrom(new DamageSourceFace(block), 6.0f); + } + + if (!brokenOnce.containsKey(player) || brokenOnce.get(player) == null || + !brokenOnce.get(player).equals(e.pos)) + { + ChatUtil.sendModChatToPlayer(player, "Almost. Once more should do it."); + brokenOnce.put(player, e.pos); + + // skip other notification + e.setCanceled(true); + return; + } + else + { + ChatUtil.sendModChatToPlayer(player, "Ouch! But at least it worked."); + brokenOnce.put(player, null); + } + + ModMain.Log(Level.INFO, "Block break failed for " + stackName + " on " + block.getUnlocalizedName()); + ModMain.Log(Level.INFO, " Required tool class: " + neededToolClass + ", supplied: " + usedToolClass); + ModMain.Log(Level.INFO, " Minimum harvest level: " + neededHarvestLevel + ", supplied: " + + usedHarvestLevel); + } + else + { + cancel = true; + } + } + + if (cancel) + { + ModMain.Log(Level.INFO, "Block break failed for " + stackName + " on " + block.getUnlocalizedName()); + ModMain.Log(Level.INFO, " Required tool class: " + neededToolClass + ", supplied: " + usedToolClass); + ModMain.Log(Level.INFO, " Minimum harvest level: " + neededHarvestLevel + ", supplied: " + + usedHarvestLevel); + + ChatUtil.sendModChatToPlayer(player, "Wrong tool!"); + ChatUtil.sendModChatToPlayer(player, + "Requires " + getToolLevelName(neededHarvestLevel) + " " + neededToolClass); + + e.setCanceled(true); + } + } + + public static String getToolLevelName(int level) + { + switch (level) + { + case 0: + return "WOOD"; + case 1: + return "STONE"; + case 2: + return "IRON"; + case 3: + return "DIAMOND"; + default: + return "Level " + level; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/event/DamageSourceFace.java b/src/main/java/net/einsteinsci/betterbeginnings/event/DamageSourceFace.java new file mode 100644 index 0000000..a74d353 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/event/DamageSourceFace.java @@ -0,0 +1,24 @@ +package net.einsteinsci.betterbeginnings.event; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.*; + +public class DamageSourceFace extends DamageSource +{ + public Block faceHurt; + + public DamageSourceFace(Block block) + { + super("face"); + faceHurt = block; + setDamageBypassesArmor(); + setDifficultyScaled(); + } + + @Override + public IChatComponent getDeathMessage(EntityLivingBase mob) + { + return new ChatComponentTranslation("death.face", mob.getName(), faceHurt.getLocalizedName()); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/event/Worldgen.java b/src/main/java/net/einsteinsci/betterbeginnings/event/Worldgen.java new file mode 100644 index 0000000..9a05b60 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/event/Worldgen.java @@ -0,0 +1,31 @@ +package net.einsteinsci.betterbeginnings.event; + +import net.einsteinsci.betterbeginnings.config.BBConfig; +import net.einsteinsci.betterbeginnings.register.RegisterItems; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraftforge.common.ChestGenHooks; + +/** + * Created by einsteinsci on 8/11/2014. + */ +public class Worldgen +{ + public static void addWorldgen() + { + if(BBConfig.spawnMarshmallows){ + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack( + RegisterItems.marshmallow), 1, 5, 100)); + ChestGenHooks.getInfo(ChestGenHooks.PYRAMID_DESERT_CHEST) + .addItem(new WeightedRandomChestContent(new ItemStack(RegisterItems.marshmallow), 1, 10, 200)); + ChestGenHooks.getInfo(ChestGenHooks.PYRAMID_JUNGLE_CHEST).addItem(new WeightedRandomChestContent(new ItemStack( + RegisterItems.marshmallow), 1, 10, 200)); + ChestGenHooks.getInfo(ChestGenHooks.STRONGHOLD_CROSSING) + .addItem(new WeightedRandomChestContent(new ItemStack(RegisterItems.marshmallow), 1, 12, 150)); + ChestGenHooks.getInfo(ChestGenHooks.STRONGHOLD_CORRIDOR) + .addItem(new WeightedRandomChestContent(new ItemStack(RegisterItems.marshmallow), 1, 12, 150)); + ChestGenHooks.getInfo(ChestGenHooks.MINESHAFT_CORRIDOR) + .addItem(new WeightedRandomChestContent(new ItemStack(RegisterItems.marshmallow), 1, 12, 150)); + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/BBGuiHandler.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/BBGuiHandler.java new file mode 100644 index 0000000..32d63f7 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/BBGuiHandler.java @@ -0,0 +1,155 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.inventory.*; +import net.einsteinsci.betterbeginnings.tileentity.*; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.IGuiHandler; + +/** + * Some issues with this. Please note the server doesn't register items or blocks. At all. + */ +public class BBGuiHandler implements IGuiHandler +{ + public static final int KILN_ID = 0; + public static final int SIMPLEWORKBENCH_ID = 1; + public static final int DOUBLEWORKBENCH_ID = 2; + public static final int BRICKOVEN_ID = 3; + public static final int SMELTER_ID = 4; + public static final int INFUSIONREPAIR_ID = 5; + public static final int OBSIDIANKILN_ID = 6; + public static final int NETHERBRICKOVEN_ID = 7; + public static final int ENDERSMELTER_ID = 8; + public static final int CAMPFIRE_ID = 9; + + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) + { + BlockPos pos = new BlockPos(x, y, z); + + if (ID == KILN_ID) + { + TileEntityKiln tileEntityKiln = (TileEntityKiln)world.getTileEntity(pos); + return new ContainerKiln(player.inventory, tileEntityKiln); + } + + if (ID == SIMPLEWORKBENCH_ID) + { + return new ContainerSimpleWorkbench(player.inventory, world, pos); + } + + if (ID == DOUBLEWORKBENCH_ID) + { + return new ContainerDoubleWorkbench(player.inventory, world, pos); + } + + if (ID == BRICKOVEN_ID) + { + TileEntityBrickOven brickOven = (TileEntityBrickOven)world.getTileEntity(pos); + return new ContainerBrickOven(player.inventory, brickOven); + } + + if (ID == SMELTER_ID) + { + TileEntitySmelter smelter = (TileEntitySmelter)world.getTileEntity(pos); + return new ContainerSmelter(player.inventory, smelter); + } + + if (ID == INFUSIONREPAIR_ID) + { + return new ContainerInfusionRepair(player.inventory, world, pos); + } + + if (ID == OBSIDIANKILN_ID) + { + TileEntityObsidianKiln obsKiln = (TileEntityObsidianKiln)world.getTileEntity(pos); + return new ContainerObsidianKiln(player.inventory, obsKiln); + } + + if (ID == NETHERBRICKOVEN_ID) + { + TileEntityNetherBrickOven nbOven = (TileEntityNetherBrickOven)world.getTileEntity(pos); + return new ContainerNetherBrickOven(player.inventory, nbOven); + } + + if (ID == ENDERSMELTER_ID) + { + TileEntityEnderSmelter enderSmelter = (TileEntityEnderSmelter)world.getTileEntity(pos); + return new ContainerEnderSmelter(player.inventory, enderSmelter); + } + + if (ID == CAMPFIRE_ID) + { + TileEntityCampfire campfire = (TileEntityCampfire)world.getTileEntity(pos); + return new ContainerCampfire(player.inventory, campfire); + } + + return null; + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) + { + BlockPos pos = new BlockPos(x, y, z); + + if (ID == KILN_ID) + { + TileEntityKiln tileEntityKiln = (TileEntityKiln)world.getTileEntity(pos); + return new GuiKiln(player.inventory, tileEntityKiln); + } + + if (ID == SIMPLEWORKBENCH_ID) + { + return new GuiSimpleWorkbench(player.inventory, world, pos); + } + + if (ID == DOUBLEWORKBENCH_ID) + { + return new GuiDoubleWorkbench(player.inventory, world, pos); + } + + if (ID == BRICKOVEN_ID) + { + TileEntityBrickOven brickOven = (TileEntityBrickOven)world.getTileEntity(pos); + return new GuiBrickOven(player.inventory, brickOven); + } + + if (ID == SMELTER_ID) + { + TileEntitySmelter smelter = (TileEntitySmelter)world.getTileEntity(pos); + return new GuiSmelter(player.inventory, smelter); + } + + if (ID == INFUSIONREPAIR_ID) + { + return new GuiInfusionRepair(player.inventory, world, pos); + } + + if (ID == OBSIDIANKILN_ID) + { + TileEntityObsidianKiln obsKiln = (TileEntityObsidianKiln)world.getTileEntity(pos); + return new GuiObsidianKiln(player.inventory, obsKiln); + } + + if (ID == NETHERBRICKOVEN_ID) + { + TileEntityNetherBrickOven nbOven = (TileEntityNetherBrickOven)world.getTileEntity(pos); + return new GuiNetherBrickOven(player.inventory, nbOven); + } + + if (ID == ENDERSMELTER_ID) + { + TileEntityEnderSmelter enderSmelter = (TileEntityEnderSmelter)world.getTileEntity(pos); + return new GuiEnderSmelter(player.inventory, enderSmelter); + } + + if (ID == CAMPFIRE_ID) + { + TileEntityCampfire campfire = (TileEntityCampfire)world.getTileEntity(pos); + return new GuiCampfire(player.inventory, campfire); + } + + return null; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiBrickOven.java new file mode 100644 index 0000000..4c36f06 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiBrickOven.java @@ -0,0 +1,58 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerBrickOven; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityBrickOven; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiBrickOven extends GuiContainer +{ + private static final ResourceLocation ovenGuiTextures = new ResourceLocation(ModMain.MODID + + ":textures/gui/container/brickOven.png"); + private TileEntityBrickOven tileBrickOven; + + public GuiBrickOven(InventoryPlayer inventory, TileEntityBrickOven tile) + { + super(new ContainerBrickOven(inventory, tile)); + tileBrickOven = tile; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + String string = tileBrickOven.hasCustomName() ? tileBrickOven.getName() : I18n.format(tileBrickOven.getName()); + fontRendererObj.drawString(string, xSize / 2 - fontRendererObj.getStringWidth(string), 6, 4210752); + fontRendererObj.drawString(I18n.format("container.inventory"), 8, ySize - 94, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(ovenGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + int i1; + + if (tileBrickOven.isBurning()) + { + i1 = tileBrickOven.getBurnTimeRemainingScaled(12); + drawTexturedModalRect(k + 92, l + 41 + 12 - i1, 176, 12 - i1, 14, i1 + 2); + } + + i1 = tileBrickOven.getCookProgressScaled(24); + drawTexturedModalRect(k + 89, l + 20, 176, 14, i1 + 1, 16); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiCampfire.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiCampfire.java new file mode 100644 index 0000000..74a6866 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiCampfire.java @@ -0,0 +1,64 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerCampfire; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityCampfire; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiCampfire extends GuiContainer +{ + + private static final ResourceLocation campfireGuiTextures = + new ResourceLocation(ModMain.MODID + ":textures/gui/container/campfire.png"); + + private TileEntityCampfire tileCampfire; + + public GuiCampfire(InventoryPlayer invPlayer, TileEntityCampfire tile) + { + super(new ContainerCampfire(invPlayer, tile)); + tileCampfire = tile; + xSize = 176; + ySize = 166; + } + + public void drawGuiContainerForegroundLayer(int par1, int par2) + { + fontRendererObj.drawString(I18n.format("container.inventory"), 8, ySize - 96 + 4, 4210752); + } + + public void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(campfireGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + int i; + + if (tileCampfire.isBurning()) + { + i = tileCampfire.getBurnTimeRemainingScaled(22); + drawTexturedModalRect(k + 58, l + 32 + 22 - i, 176, 22 - i, 14, i); + } + if (tileCampfire.isDecaying()) + { + i = tileCampfire.getDecayTimeRemainingScaled(16); + // x y u v w h + int x = k + 77; + int y = l + 57 + 16 - i; + int u = 176; + int v = 55 - i; + int w = 3; + int h = i; + drawTexturedModalRect(x, y, u, v, w, h); + } + + i = tileCampfire.getCookProgressScaled(23); + drawTexturedModalRect(k + 82, l + 34, 177, 22, i, 16); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiDoubleWorkbench.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiDoubleWorkbench.java new file mode 100644 index 0000000..2f04450 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiDoubleWorkbench.java @@ -0,0 +1,138 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerDoubleWorkbench; +import net.einsteinsci.betterbeginnings.register.recipe.*; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.oredict.OreDictionary; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +@SideOnly(Side.CLIENT) +public class GuiDoubleWorkbench extends GuiContainer +{ + private static final ResourceLocation workbenchGuiTextures = new ResourceLocation(ModMain.MODID + + ":textures/gui/container/doubleWorkbench.png"); + + private final ContainerDoubleWorkbench container; + + //private final RenderItemPartialTransparency partialTransItemRenderer = new RenderItemPartialTransparency(); + + public GuiDoubleWorkbench(InventoryPlayer invPlayer, World world, BlockPos pos) + { + super(new ContainerDoubleWorkbench(invPlayer, world, pos)); + + container = (ContainerDoubleWorkbench)inventorySlots; + } + + @Override + public void drawScreen(int xMouse, int yMouse, float par3) + { + super.drawScreen(xMouse, yMouse, par3); + + renderTransparentItems(); + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + // I'm guessing the really big number at the end is the z layer. + fontRendererObj.drawString(I18n.format("container.craftingdouble"), 33, 6, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(workbenchGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + + // renderTransparentItems(); + } + + public void renderTransparentItems() + { + if (AdvancedCraftingHandler.crafting().hasRecipe(container.craftMatrix, container.worldObj)) + { + for (AdvancedRecipe recipe : AdvancedCraftingHandler.crafting().recipes) + { + if (recipe.matchesMostly(container.craftMatrix, container.worldObj)) + { + for (int i = 0; i < recipe.getNeededMaterials().length; ++i) + { + OreRecipeElement neededElement = recipe.getNeededMaterials()[i]; + ItemStack needed = neededElement.getFirst().copy(); + + if (needed.getItemDamage() == OreDictionary.WILDCARD_VALUE) + { + needed.setItemDamage(0); + } + + Slot slot = container.matSlots[i]; + if (container.addedMats.getStackInSlot(i) == null) + { + drawItemStack(needed, (width - xSize) / 2 + slot.xDisplayPosition, (height - ySize) / 2 + + slot.yDisplayPosition, "" + needed.stackSize); + } + } + + ItemStack result = recipe.getRecipeOutput(); + Slot slot = container.resultSlot; + if (container.craftResult.getStackInSlot(0) == null) + { + drawItemStack(result, (width - xSize) / 2 + slot.xDisplayPosition, (height - ySize) / 2 + + slot.yDisplayPosition, ""); + } + } + } + } + } + + private void drawItemStack(ItemStack stack, int xPos, int yPos, String note) + { + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + zLevel = 200.0F; + //partialTransItemRenderer.zLevel = 200.0F; + FontRenderer font = null; + if (stack != null) + { + font = stack.getItem().getFontRenderer(stack); + } + if (font == null) + { + font = fontRendererObj; + } + + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glEnable(GL11.GL_LIGHTING); + //partialTransItemRenderer.renderItemAndEffectIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos); + //partialTransItemRenderer.renderItemOverlayIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos, note); + zLevel = 0.0F; + //partialTransItemRenderer.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + } +} + + +// Buffer ;) diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiEnderSmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiEnderSmelter.java new file mode 100644 index 0000000..54330d4 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiEnderSmelter.java @@ -0,0 +1,98 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerEnderSmelter; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityEnderSmelter; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class GuiEnderSmelter extends GuiContainer +{ + // Same gui texture. + private static final ResourceLocation kilnGuiTextures = new ResourceLocation(ModMain.MODID + + ":textures/gui/container/smelter.png"); + //RenderItemPartialTransparency partialTransItemRenderer = new RenderItemPartialTransparency(); + private TileEntityEnderSmelter tileSmelter; + + public GuiEnderSmelter(InventoryPlayer invPlayer, TileEntityEnderSmelter tile) + { + super(new ContainerEnderSmelter(invPlayer, tile)); + tileSmelter = tile; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + String string = + tileSmelter.hasCustomName() ? tileSmelter.getName() : I18n.format( + tileSmelter.getName()); + fontRendererObj.drawString(string, xSize / 2 - fontRendererObj.getStringWidth(string), 6, 4210752); + fontRendererObj.drawString(I18n.format("container.inventory"), 8, ySize - 94, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(kilnGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + int i1; + + if (tileSmelter.isBurning()) + { + i1 = tileSmelter.getBurnTimeRemainingScaled(12); + drawTexturedModalRect(k + 56, l + 36 + 12 - i1, 176, 12 - i1, 14, i1 + 2); + } + + i1 = tileSmelter.getCookProgressScaled(24); + drawTexturedModalRect(k + 79, l + 34, 176, 14, i1 + 1, 16); + + if (tileSmelter.getStackInSlot(TileEntityEnderSmelter.GRAVEL) == null) + { + drawItemStack(new ItemStack(Blocks.gravel), k + 66, l + 17, ""); + } + } + + private void drawItemStack(ItemStack stack, int xPos, int yPos, String note) + { + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + zLevel = 200.0F; + //partialTransItemRenderer.zLevel = 200.0F; + FontRenderer font = null; + if (stack != null) + { + font = stack.getItem().getFontRenderer(stack); + } + if (font == null) + { + font = fontRendererObj; + } + + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glEnable(GL11.GL_LIGHTING); + //partialTransItemRenderer.renderItemAndEffectIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos); + //partialTransItemRenderer.renderItemOverlayIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos, note); + zLevel = 0.0F; + //partialTransItemRenderer.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiInfusionRepair.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiInfusionRepair.java new file mode 100644 index 0000000..0a7fe8b --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiInfusionRepair.java @@ -0,0 +1,142 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerInfusionRepair; +import net.einsteinsci.betterbeginnings.register.InfusionRepairUtil; +import net.einsteinsci.betterbeginnings.util.ChatUtil; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import java.util.ArrayList; + +@SideOnly(Side.CLIENT) +public class GuiInfusionRepair extends GuiContainer +{ + + private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation(ModMain.MODID + + ":textures/gui/container/infusionRepairStation.png"); + //private RenderItemPartialTransparency partialTransItemRenderer = new RenderItemPartialTransparency(); + private ContainerInfusionRepair container; + private EntityPlayer player; + + public GuiInfusionRepair(InventoryPlayer invPlayer, World world, BlockPos pos) + { + super(new ContainerInfusionRepair(invPlayer, world, pos)); + + container = (ContainerInfusionRepair)inventorySlots; + player = invPlayer.player; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + int takenLevels = InfusionRepairUtil.getTakenLevels(container.inputs); + String takenLevelsStr = ""; + + int neededLevels = InfusionRepairUtil.getNeededLevels(container.inputs); + String neededLevelsStr = ""; + + ItemStack repaired = container.inputs.getStackInSlot(0); + if (repaired != null) + { + if (repaired.isItemStackDamageable() && + (player.experienceLevel >= InfusionRepairUtil.getNeededLevels(container.inputs) + || player.capabilities.isCreativeMode)) + { + takenLevelsStr = "Taken: " + takenLevels + " L"; + neededLevelsStr = "Needed: " + neededLevels + " L"; + } + else if (repaired.isItemStackDamageable()) + { + takenLevelsStr = ChatUtil.RED + "Taken: " + takenLevels + " L"; + neededLevelsStr = ChatUtil.RED + "Needed: " + neededLevels + " L"; + } + else + { + takenLevelsStr = "Taken: "; + neededLevelsStr = "Needed: "; + } + } + else + { + takenLevelsStr = "Taken: "; + neededLevelsStr = "Needed: "; + } + + fontRendererObj.drawString(neededLevelsStr, 90, 5, 4210752); + fontRendererObj.drawString(takenLevelsStr, 90, 67, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + ArrayList requiredItems = InfusionRepairUtil.getRequiredStacks(container.inputs); + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(craftingTableGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + + for (int i = 0; i < requiredItems.size(); ++i) + { + if (requiredItems.get(i) == null) + { + break; + } + + Slot slot = container.circleSlots[i + 1]; + ItemStack needed = requiredItems.get(i); + + if (needed != null && !slot.getHasStack()) + { + drawItemStack(needed, (width - xSize) / 2 + slot.xDisplayPosition, (height - ySize) / 2 + + slot.yDisplayPosition, "" + needed.stackSize); + } + } + } + + private void drawItemStack(ItemStack stack, int xPos, int yPos, String note) + { + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + zLevel = 200.0F; + //partialTransItemRenderer.zLevel = 200.0F; + FontRenderer font = null; + if (stack != null) + { + font = stack.getItem().getFontRenderer(stack); + } + if (font == null) + { + font = fontRendererObj; + } + + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glEnable(GL11.GL_LIGHTING); + //partialTransItemRenderer.renderItemAndEffectIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos); + //partialTransItemRenderer.renderItemOverlayIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos, note); + zLevel = 0.0F; + //partialTransItemRenderer.zLevel = 0.0F; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiKiln.java new file mode 100644 index 0000000..12a6d42 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiKiln.java @@ -0,0 +1,55 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.inventory.ContainerKiln; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityKiln; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiKiln extends GuiContainer +{ + private static final ResourceLocation kilnGuiTextures = new ResourceLocation( + "minecraft:textures/gui/container/furnace.png"); + private TileEntityKiln tileKiln; + + public GuiKiln(InventoryPlayer invPlayer, TileEntityKiln tile) + { + super(new ContainerKiln(invPlayer, tile)); + tileKiln = tile; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + String string = tileKiln.hasCustomName() ? tileKiln.getName() : I18n.format(tileKiln.getName()); + fontRendererObj.drawString(string, xSize / 2 - fontRendererObj.getStringWidth(string), 6, 4210752); + fontRendererObj.drawString(I18n.format("container.inventory"), 8, ySize - 94, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(kilnGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + int i1; + + if (tileKiln.isBurning()) + { + i1 = tileKiln.getBurnTimeRemainingScaled(12); + drawTexturedModalRect(k + 56, l + 36 + 12 - i1, 176, 12 - i1, 14, i1 + 2); + } + + i1 = tileKiln.getCookProgressScaled(24); + drawTexturedModalRect(k + 79, l + 34, 176, 14, i1 + 1, 16); + } + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiNetherBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiNetherBrickOven.java new file mode 100644 index 0000000..990637c --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiNetherBrickOven.java @@ -0,0 +1,144 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerNetherBrickOven; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by einsteinsci on 8/22/2014. + */ +@SideOnly(Side.CLIENT) +public class GuiNetherBrickOven extends GuiContainer +{ + private static final ResourceLocation ovenGuiTextures = + new ResourceLocation(ModMain.MODID + ":textures/gui/container/netherBrickOven.png"); + + private TileEntityNetherBrickOven tileBrickOven; + + public GuiNetherBrickOven(InventoryPlayer inventory, TileEntityNetherBrickOven tile) + { + super(new ContainerNetherBrickOven(inventory, tile)); + tileBrickOven = tile; + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) + { + String string = + tileBrickOven.hasCustomName() ? tileBrickOven.getName() : + I18n.format(tileBrickOven.getName()); + fontRendererObj.drawString(string, 40, 6, 4210752); + + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + // In fuel zone + if (mouseX >= k + 16 && mouseX <= k + 33 && mouseY >= l + 9 && mouseY <= l + 58) + { + drawFluidTooltip(mouseX - k, mouseY - l); + } + } + + private void drawFluidTooltip(int x, int y) + { + List lines = new ArrayList<>(); + + lines.add("" + tileBrickOven.getFuelLevel() + " mB"); + drawHoveringText(lines, x, y); //Draw tooltip + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(ovenGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + int i1; + + i1 = tileBrickOven.getCookProgressScaled(24); + drawTexturedModalRect(k + 103, l + 34, 176, 14, i1 + 1, 16); + + int tankFillPx = tileBrickOven.getFuelLevelScaled(48); + //drawTexturedModalRect(k + 17, l + 58 - tankFillPx, 176, 31, 16, tankFillPx); + //drawFluid(tileBrickOven.getFuelStack(), k + 17, l + 10, 16, 48, tileBrickOven.fuelTank.getCapacity()); + } + + @Deprecated + public void drawFluid(FluidStack fluid, int x, int y, int width, int height, int maxCapacity) + { + if (fluid == null || fluid.getFluid() == null) + { + return; + } + //IIcon icon = fluid.getFluid().getIcon(fluid); + mc.renderEngine.bindTexture(TextureMap.locationBlocksTexture); + setGLColorFromInt(fluid.getFluid().getColor(fluid)); + int fullX = width / 16; + int fullY = height / 16; + int lastX = width - fullX * 16; + int lastY = height - fullY * 16; + int level = fluid.amount * height / maxCapacity; + int fullLvl = (height - level) / 16; + int lastLvl = height - level - fullLvl * 16; + for (int i = 0; i < fullX; i++) + { + for (int j = 0; j < fullY; j++) + { + if (j >= fullLvl) + { + //drawCutIcon(icon, x + i * 16, y + j * 16, 16, 16, j == fullLvl ? lastLvl : 0); + } + } + } + for (int i = 0; i < fullX; i++) + { + //drawCutIcon(icon, x + i * 16, y + fullY * 16, 16, lastY, fullLvl == fullY ? lastLvl : 0); + } + for (int i = 0; i < fullY; i++) + { + if (i >= fullLvl) + { + //drawCutIcon(icon, x + fullX * 16, y + i * 16, lastX, 16, i == fullLvl ? lastLvl : 0); + } + } + //drawCutIcon(icon, x + fullX * 16, y + fullY * 16, lastX, lastY, fullLvl == fullY ? lastLvl : 0); + } + + public static void setGLColorFromInt(int color) + { + float red = (color >> 16 & 255) / 255.0F; + float green = (color >> 8 & 255) / 255.0F; + float blue = (color & 255) / 255.0F; + GL11.glColor4f(red, green, blue, 1.0F); + } + + /* + //The magic is here + private void drawCutIcon(IIcon icon, int x, int y, int width, int height, int cut) + { + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + tess.addVertexWithUV(x, y + height, zLevel, icon.getMinU(), icon.getInterpolatedV(height)); + tess.addVertexWithUV(x + width, y + height, zLevel, icon.getInterpolatedU(width), + icon.getInterpolatedV(height)); + tess.addVertexWithUV(x + width, y + cut, zLevel, icon.getInterpolatedU(width), icon.getInterpolatedV(cut)); + tess.addVertexWithUV(x, y + cut, zLevel, icon.getMinU(), icon.getInterpolatedV(cut)); + tess.draw(); + } + */ +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiObsidianKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiObsidianKiln.java new file mode 100644 index 0000000..9156edb --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiObsidianKiln.java @@ -0,0 +1,55 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.inventory.ContainerObsidianKiln; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityObsidianKiln; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +/** + * Created by einsteinsci on 8/17/2014. + */ +public class GuiObsidianKiln extends GuiContainer +{ + private static final ResourceLocation kilnGuiTextures = new ResourceLocation( + "minecraft:textures/gui/container/furnace.png"); + private TileEntityObsidianKiln tileKiln; + + public GuiObsidianKiln(InventoryPlayer invPlayer, TileEntityObsidianKiln tile) + { + super(new ContainerObsidianKiln(invPlayer, tile)); + tileKiln = tile; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + String string = tileKiln.hasCustomName() ? tileKiln.getName() : + I18n.format(tileKiln.getName()); + fontRendererObj.drawString(string, xSize / 2 - fontRendererObj.getStringWidth(string), 6, 4210752); + fontRendererObj.drawString(I18n.format("container.inventory"), 8, ySize - 94, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(kilnGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + int i1; + + if (tileKiln.isBurning()) + { + i1 = tileKiln.getBurnTimeRemainingScaled(12); + drawTexturedModalRect(k + 56, l + 36 + 12 - i1, 176, 12 - i1, 14, i1 + 2); + } + + i1 = tileKiln.getCookProgressScaled(24); + drawTexturedModalRect(k + 79, l + 34, 176, 14, i1 + 1, 16); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSimpleWorkbench.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSimpleWorkbench.java new file mode 100644 index 0000000..043b3b9 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSimpleWorkbench.java @@ -0,0 +1,55 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerSimpleWorkbench; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiSimpleWorkbench extends GuiContainer +{ + private static final ResourceLocation craftingTableGuiTextures = + new ResourceLocation(ModMain.MODID + ":textures/gui/container/simpleWorkbench.png"); + private ContainerSimpleWorkbench container; + + public GuiSimpleWorkbench(InventoryPlayer invPlayer, World world, BlockPos pos) + { + super(new ContainerSimpleWorkbench(invPlayer, world, pos)); + + container = (ContainerSimpleWorkbench)inventorySlots; + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of + * the items) + */ + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + // I'm guessing the really big number at the end is the z layer. + fontRendererObj.drawString(I18n.format("container.crafting"), 28, 6, 4210752); + fontRendererObj.drawString(I18n.format("container.inventory"), 8, ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(craftingTableGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + + if (container.needsBigBoyBench()) + { + drawTexturedModalRect(k + 87, l + 32, xSize, 0, 28, 21); + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSmelter.java new file mode 100644 index 0000000..2eaaa05 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/gui/GuiSmelter.java @@ -0,0 +1,103 @@ +package net.einsteinsci.betterbeginnings.gui; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.inventory.ContainerSmelter; +import net.einsteinsci.betterbeginnings.tileentity.TileEntitySmelter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +@SideOnly(Side.CLIENT) +public class GuiSmelter extends GuiContainer +{ + private static final ResourceLocation smelterGuiTextures = new ResourceLocation(ModMain.MODID + + ":textures/gui/container/smelter.png"); + //RenderItemPartialTransparency partialTransItemRenderer = new RenderItemPartialTransparency(); + RenderItem itemRenderer = Minecraft.getMinecraft().getRenderItem(); + private TileEntitySmelter tileSmelter; + + public GuiSmelter(InventoryPlayer invPlayer, TileEntitySmelter tile) + { + super(new ContainerSmelter(invPlayer, tile)); + tileSmelter = tile; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + String string = + tileSmelter.hasCustomName() ? tileSmelter.getName() : I18n.format(tileSmelter.getName()); + fontRendererObj.drawString(string, xSize / 2 - fontRendererObj.getStringWidth(string), 6, 4210752); + fontRendererObj.drawString(I18n.format("container.inventory"), 8, ySize - 94, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + mc.getTextureManager().bindTexture(smelterGuiTextures); + int k = (width - xSize) / 2; + int l = (height - ySize) / 2; + + drawTexturedModalRect(k, l, 0, 0, xSize, ySize); + int i1; + + if (tileSmelter.isBurning()) + { + i1 = tileSmelter.getBurnTimeRemainingScaled(12); + drawTexturedModalRect(k + 56, l + 36 + 12 - i1, 176, 12 - i1, 14, i1 + 2); + } + + i1 = tileSmelter.getCookProgressScaled(24); + drawTexturedModalRect(k + 79, l + 34, 176, 14, i1 + 1, 16); + + if (tileSmelter.getStackInSlot(TileEntitySmelter.GRAVEL) == null) + { + drawItemStack(new ItemStack(Blocks.gravel), k + 66, l + 17, ""); + } + } + + @Deprecated + private void drawItemStack(ItemStack stack, int xPos, int yPos, String note) + { + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + zLevel = 200.0F; + FontRenderer font = null; + if (stack != null) + { + font = stack.getItem().getFontRenderer(stack); + } + if (font == null) + { + font = fontRendererObj; + } + + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glEnable(GL11.GL_LIGHTING); + + //partialTransItemRenderer.renderItemAndEffectIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos); + itemRenderer.renderItemIntoGUI(stack, xPos, yPos); + itemRenderer.renderItemOverlayIntoGUI(font, stack, xPos, yPos, note); + //partialTransItemRenderer.renderItemOverlayIntoGUI(font, mc.getTextureManager(), stack, xPos, yPos, note); + zLevel = 0.0F; + //partialTransItemRenderer.zLevel = 0.0F; + itemRenderer.zLevel = 0.0f; + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerBrickOven.java new file mode 100644 index 0000000..a56cdb4 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerBrickOven.java @@ -0,0 +1,201 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.BrickOvenRecipeHandler; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityBrickOven; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class ContainerBrickOven extends Container +{ + private TileEntityBrickOven tileBrickOven; + private int lastCookTime; + private int lastBurnTime; + private int lastItemBurnTime; + + public ContainerBrickOven(InventoryPlayer playerInv, TileEntityBrickOven tileEntityBrickOven) + { + tileBrickOven = tileEntityBrickOven; + addSlotToContainer(new SlotFurnaceFuel(tileEntityBrickOven, TileEntityBrickOven.FUEL, 92, 58)); + addSlotToContainer( + new SlotFurnaceOutput(playerInv.player, tileEntityBrickOven, TileEntityBrickOven.OUTPUT, 124, 21)); + + int i; + + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; j++) + { + addSlotToContainer(new Slot(tileEntityBrickOven, j + i * 3 + TileEntityBrickOven.INPUTSTART, + 30 + j * 18, 17 + i * 18)); + } + } + + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 142)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting craft) + { + super.addCraftingToCrafters(craft); + + craft.sendProgressBarUpdate(this, 0, tileBrickOven.ovenCookTime); + craft.sendProgressBarUpdate(this, 1, tileBrickOven.ovenBurnTime); + craft.sendProgressBarUpdate(this, 2, tileBrickOven.currentItemBurnLength); + } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + + for (Object listItem : crafters) + { + ICrafting crafter = (ICrafting)listItem; + + if (lastCookTime != tileBrickOven.ovenCookTime) + { + crafter.sendProgressBarUpdate(this, 0, tileBrickOven.ovenCookTime); + } + if (lastBurnTime != tileBrickOven.ovenBurnTime) + { + crafter.sendProgressBarUpdate(this, 1, tileBrickOven.ovenBurnTime); + } + if (lastItemBurnTime != tileBrickOven.currentItemBurnLength) + { + crafter.sendProgressBarUpdate(this, 2, tileBrickOven.currentItemBurnLength); + } + } + + lastBurnTime = tileBrickOven.ovenBurnTime; + lastCookTime = tileBrickOven.ovenCookTime; + lastItemBurnTime = tileBrickOven.currentItemBurnLength; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotId) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(slotId); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (slotId == TileEntityBrickOven.OUTPUT) + { + if (!mergeItemStack(itemstack1, 11, 47, true)) // move to inventory (all, avoid hotbar) + { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } + else if (slotId >= 11 && slotId < 38) // non-hotbar inventory + { + if (TileEntityBrickOven.isItemFuel(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityBrickOven.FUEL, TileEntityBrickOven.FUEL + 1, false)) + { + return null; + } + } + else if (BrickOvenRecipeHandler.instance().isInRecipe(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityBrickOven.INPUTSTART, TileEntityBrickOven.INPUTSTART + 9, + false)) // move to craft matrix + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 38, 47, false)) // move to hotbar + { + return null; + } + } + else if (slotId >= 37 && slotId < 46) // hotbar + { + if (TileEntityBrickOven.isItemFuel(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityBrickOven.FUEL, TileEntityBrickOven.FUEL + 1, false)) + { + return null; + } + } + else if (BrickOvenRecipeHandler.instance().isInRecipe(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityBrickOven.INPUTSTART, TileEntityBrickOven.INPUTSTART + 9, + false)) // move to craft matrix + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 11, 38, false)) // move to inventory (non-hotbar) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 11, 47, false)) // move to inventory (all) + { + return null; + } + + if (itemstack1.stackSize == 0) + { + slot.putStack((ItemStack)null); + } + else + { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + @SideOnly(Side.CLIENT) + @Override + public void updateProgressBar(int par1, int par2) + { + if (par1 == 0) + { + tileBrickOven.ovenCookTime = par2; + } + if (par1 == 1) + { + tileBrickOven.ovenBurnTime = par2; + } + if (par1 == 2) + { + tileBrickOven.currentItemBurnLength = par2; + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return tileBrickOven.isUseableByPlayer(player); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerCampfire.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerCampfire.java new file mode 100644 index 0000000..582c3ad --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerCampfire.java @@ -0,0 +1,184 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.CampfireRecipes; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityCampfire; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class ContainerCampfire extends Container +{ + private static final int SLOT_INPUT = TileEntityCampfire.SLOT_INPUT; + private static final int SLOT_OUTPUT = TileEntityCampfire.SLOT_OUTPUT; + private static final int SLOT_PAN = TileEntityCampfire.SLOT_PAN; + private static final int SLOT_FUEL = TileEntityCampfire.SLOT_FUEL; + public int lastItemBurnTime; + public int lastCookTime; + private TileEntityCampfire tileCampfire; + private int lastBurnTime; + private int lastDecayTime; + + public ContainerCampfire(InventoryPlayer inventory, TileEntityCampfire campfire) + { + + tileCampfire = campfire; + addSlotToContainer(new Slot(tileCampfire, SLOT_INPUT, 58, 12)); + addSlotToContainer(new Slot(tileCampfire, SLOT_PAN, 32, 35)); + addSlotToContainer(new SlotFurnaceFuel(tileCampfire, SLOT_FUEL, 58, 57)); + addSlotToContainer(new SlotFurnaceOutput(inventory.player, campfire, SLOT_OUTPUT, 118, 34)); + + int i; + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142)); + } + } + + public void addCraftingToCrafters(ICrafting craft) + { + super.addCraftingToCrafters(craft); + + craft.sendProgressBarUpdate(this, 0, tileCampfire.cookTime); + craft.sendProgressBarUpdate(this, 1, tileCampfire.burnTime); + craft.sendProgressBarUpdate(this, 2, tileCampfire.currentItemBurnTime); + craft.sendProgressBarUpdate(this, 3, tileCampfire.decayTime); + } + + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + + for (Object crafter : crafters) + { + ICrafting craft = (ICrafting)crafter; + + if (lastCookTime != tileCampfire.cookTime) + { + craft.sendProgressBarUpdate(this, 0, tileCampfire.cookTime); + } + if (lastBurnTime != tileCampfire.burnTime) + { + craft.sendProgressBarUpdate(this, 1, tileCampfire.burnTime); + } + if (lastItemBurnTime != tileCampfire.currentItemBurnTime) + { + craft.sendProgressBarUpdate(this, 2, tileCampfire.currentItemBurnTime); + } + if (lastDecayTime != tileCampfire.decayTime) + { + craft.sendProgressBarUpdate(this, 3, tileCampfire.decayTime); + } + } + + lastBurnTime = tileCampfire.burnTime; + lastCookTime = tileCampfire.cookTime; + lastItemBurnTime = tileCampfire.currentItemBurnTime; + lastDecayTime = tileCampfire.decayTime; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int par2) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(par2); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (par2 == 2) + { + if (!mergeItemStack(itemstack1, 3, 39, true)) + { + return null; + } + slot.onSlotChange(itemstack1, itemstack); + } + else if (par2 != 1 && par2 != 0) + { + if (CampfireRecipes.smelting().getSmeltingResult(itemstack1) != null) + { + if (!mergeItemStack(itemstack1, 0, 1, false)) + { + return null; + } + } + else if (TileEntityCampfire.isItemFuel(itemstack1)) + { + if (!mergeItemStack(itemstack1, 1, 2, false)) + { + return null; + } + } + else if (par2 >= 3 && par2 < 30) + { + if (!mergeItemStack(itemstack1, 30, 39, false)) + { + return null; + } + } + else if (par2 >= 30 && par2 < 39 && !mergeItemStack(itemstack1, 3, 30, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 3, 39, false)) + { + return null; + } + if (itemstack1.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + slot.onPickupFromSlot(player, itemstack1); + } + return itemstack; + } + + @SideOnly(Side.CLIENT) + public void updateProgressBar(int barId, int newValue) + { + if (barId == 0) + { + tileCampfire.cookTime = newValue; + } + if (barId == 1) + { + tileCampfire.burnTime = newValue; + } + if (barId == 2) + { + tileCampfire.currentItemBurnTime = newValue; + } + if (barId == 3) + { + tileCampfire.decayTime = newValue; + } + } + + public boolean canInteractWith(EntityPlayer player) + { + return tileCampfire.isUseableByPlayer(player); + } + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerDoubleWorkbench.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerDoubleWorkbench.java new file mode 100644 index 0000000..b7cae6b --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerDoubleWorkbench.java @@ -0,0 +1,255 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.blocks.BlockDoubleWorkbench; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.register.recipe.AdvancedCraftingHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; + +public class ContainerDoubleWorkbench extends Container +{ + /** + * The crafting matrix inventory (3x3). + */ + public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3); + public InventoryWorkbenchAdditionalMaterials addedMats = new InventoryWorkbenchAdditionalMaterials(this, 4); + public IInventory craftResult = new InventoryCraftResult(); + public World worldObj; + public Slot[] matSlots = new Slot[4]; + public Slot resultSlot; + + private BlockPos pos; + + public ContainerDoubleWorkbench(InventoryPlayer invPlayer, World world, BlockPos loc) + { + worldObj = world; + pos = loc; + + resultSlot = new SlotAdvancedCrafting(invPlayer.player, craftMatrix, craftResult, addedMats, 0, 129, 35); + addSlotToContainer(resultSlot); + int i; + int j; + + // Matrix + for (i = 0; i < 3; ++i) + { + for (j = 0; j < 3; ++j) + { + addSlotToContainer(new Slot(craftMatrix, j + i * 3, 35 + j * 18, 17 + i * 18)); + } + } + + // Inventory + for (i = 0; i < 3; ++i) + { + for (j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + // Hotbar + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + } + + // Additional materials + for (i = 0; i < 4; ++i) + { + matSlots[i] = new Slot(addedMats, i, 8, 7 + i * 18); + // matSlots[i].setBackgroundIcon(Items.apple.getIconFromDamage(0)); + addSlotToContainer(matSlots[i]); + + onCraftMatrixChanged(craftMatrix); + } + } + + @Override + public void detectAndSendChanges() + { + for (int i = 0; i < inventorySlots.size(); ++i) + { + ItemStack itemstack = ((Slot)inventorySlots.get(i)).getStack(); + ItemStack itemstack1 = (ItemStack)inventoryItemStacks.get(i); + + if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) + { + itemstack1 = itemstack == null ? null : itemstack.copy(); + inventoryItemStacks.set(i, itemstack1); + + for (Object listItem : crafters) + { + ICrafting crafter = (ICrafting)listItem; + crafter.sendSlotContents(this, i, itemstack1); + } + } + } + + onCraftMatrixChanged(craftMatrix); + } + + /** + * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that. I + * am not touching this code. + */ + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotId) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(slotId); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (slotId == 0) + { + if (!mergeItemStack(itemstack1, 10, 46, true)) + { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } + else if (slotId >= 10 && slotId < 37) + { + if (AdvancedCraftingHandler.crafting().isAddedMaterial(itemstack1)) + { + if (!mergeItemStack(itemstack1, 46, 50, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 37, 46, false)) + { + return null; + } + } + else if (slotId >= 37 && slotId < 46) + { + if (AdvancedCraftingHandler.crafting().isAddedMaterial(itemstack1)) + { + if (!mergeItemStack(itemstack1, 46, 50, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 10, 37, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 10, 46, false)) + { + return null; + } + + if (itemstack1.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + // Can Stack Enter? (I think) + @Override + public boolean canMergeSlot(ItemStack stack, Slot slot) + { + return slot.inventory != craftResult && super.canMergeSlot(stack, slot); + } + + /** + * Called when the container is closed. + */ + @Override + public void onContainerClosed(EntityPlayer player) + { + super.onContainerClosed(player); + + if (!worldObj.isRemote) + { + for (int i = 0; i < craftMatrix.getSizeInventory(); ++i) + { + ItemStack itemstack = craftMatrix.getStackInSlotOnClosing(i); + + if (itemstack != null) + { + player.dropPlayerItemWithRandomChoice(itemstack, false); + } + } + + for (int i = 0; i < addedMats.getSizeInventory(); ++i) + { + ItemStack itemstack = addedMats.getStackInSlotOnClosing(i); + + if (itemstack != null) + { + player.dropPlayerItemWithRandomChoice(itemstack, false); + } + } + } + } + + /** + * Callback for when the crafting matrix is changed. Detects if recipe is valid. + */ + @Override + public void onCraftMatrixChanged(IInventory inventory) + { + boolean hasAddedMats = false; + ItemStack result = AdvancedCraftingHandler.crafting().findMatchingRecipe(craftMatrix, addedMats, worldObj); + + if (result == null) + { + result = CraftingManager.getInstance().findMatchingRecipe(craftMatrix, worldObj); + } + + if (result != null) + { + hasAddedMats = true; + } + + if (hasAddedMats) + { + craftResult.setInventorySlotContents(0, result); + } + else + { + craftResult.setInventorySlotContents(0, null); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + // return worldObj.getBlock(posX, posY, posZ) != + // RegisterBlocks.blockDoubleWorkbench ? false : player.getDistanceSq( + // posX + 0.5D, posY + 0.5D, posZ + 0.5D) <= 64.0D; + + return worldObj.getBlockState(pos).getBlock() == RegisterBlocks.doubleWorkbench && + worldObj.getBlockState(pos).getValue(BlockDoubleWorkbench.CONNECTION) != EnumFacing.UP && + player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0D; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerEnderSmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerEnderSmelter.java new file mode 100644 index 0000000..7a41b1c --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerEnderSmelter.java @@ -0,0 +1,199 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.SmelterRecipeHandler; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityEnderSmelter; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.*; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class ContainerEnderSmelter extends Container +{ + private TileEntityEnderSmelter smelter; + private int lastCookTime; + private int lastBurnTime; + private int lastItemBurnTime; + + public ContainerEnderSmelter(InventoryPlayer playerInv, TileEntityEnderSmelter tileSmelter) + { + smelter = tileSmelter; + addSlotToContainer(new Slot(tileSmelter, TileEntityEnderSmelter.INPUT, 46, 17)); + addSlotToContainer(new Slot(tileSmelter, TileEntityEnderSmelter.FUEL, 56, 53)); + addSlotToContainer(new SlotFurnaceOutput(playerInv.player, tileSmelter, + TileEntityEnderSmelter.OUTPUT, 116, 35)); + addSlotToContainer(new Slot(tileSmelter, TileEntityEnderSmelter.GRAVEL, 66, 17)); + + int i; + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 142)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting craft) + { + super.addCraftingToCrafters(craft); + + craft.sendProgressBarUpdate(this, 0, smelter.smelterCookTime); + craft.sendProgressBarUpdate(this, 1, smelter.smelterBurnTime); + craft.sendProgressBarUpdate(this, 2, smelter.currentItemBurnLength); + } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + + for (Object listItem : crafters) + { + ICrafting crafter = (ICrafting)listItem; + + if (lastCookTime != smelter.smelterCookTime) + { + crafter.sendProgressBarUpdate(this, 0, smelter.smelterCookTime); + } + if (lastBurnTime != smelter.smelterBurnTime) + { + crafter.sendProgressBarUpdate(this, 1, smelter.smelterBurnTime); + } + if (lastItemBurnTime != smelter.currentItemBurnLength) + { + crafter.sendProgressBarUpdate(this, 2, smelter.currentItemBurnLength); + } + } + + lastBurnTime = smelter.smelterBurnTime; + lastCookTime = smelter.smelterCookTime; + lastItemBurnTime = smelter.currentItemBurnLength; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int fromId) + { + ItemStack movedStackDupe = null; + Slot slot = (Slot)inventorySlots.get(fromId); + + if (slot != null && slot.getHasStack()) + { + ItemStack movedStack = slot.getStack(); + movedStackDupe = movedStack.copy(); + + if (fromId == TileEntityEnderSmelter.OUTPUT) + { + if (!mergeItemStack(movedStack, 4, 40, true)) + { + return null; + } + slot.onSlotChange(movedStack, movedStackDupe); + } + else if (fromId != TileEntityEnderSmelter.FUEL && fromId != TileEntityEnderSmelter.INPUT && + fromId != TileEntityEnderSmelter.GRAVEL) + { + if (SmelterRecipeHandler.smelting().getSmeltingResult(movedStack) != null) + { + if (!mergeItemStack(movedStack, + TileEntityEnderSmelter.INPUT, + TileEntityEnderSmelter.INPUT + 1, + false)) + { + return null; + } + } + else if (movedStack.getItem() == Item.getItemFromBlock(Blocks.gravel)) + { + if (!mergeItemStack(movedStack, + TileEntityEnderSmelter.GRAVEL, + TileEntityEnderSmelter.GRAVEL + 1, + false)) + { + return null; + } + } + else if (TileEntityEnderSmelter.isItemFuel(movedStack)) + { + if (!mergeItemStack(movedStack, + TileEntityEnderSmelter.FUEL, + TileEntityEnderSmelter.FUEL + 1, + false)) + { + return null; + } + } + else if (fromId >= 4 && fromId < 31) + { + if (!mergeItemStack(movedStack, 31, 40, false)) + { + return null; + } + } + else if (fromId >= 31 && fromId < 40 && !mergeItemStack(movedStack, 4, 31, false)) + { + return null; + } + } + else if (!mergeItemStack(movedStack, 4, 40, false)) + { + return null; + } + if (movedStack.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + if (movedStack.stackSize == movedStackDupe.stackSize) + { + return null; + } + slot.onPickupFromSlot(player, movedStack); + } + return movedStackDupe; + } + + @SideOnly(Side.CLIENT) + @Override + public void updateProgressBar(int par1, int par2) + { + if (par1 == 0) + { + smelter.smelterCookTime = par2; + } + if (par1 == 1) + { + smelter.smelterBurnTime = par2; + } + if (par1 == 2) + { + smelter.currentItemBurnLength = par2; + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return smelter.isUseableByPlayer(player); + } + + public boolean merge(ItemStack stack, int startSlot, int endSlot, boolean searchFromBottom) + { + return mergeItemStack(stack, startSlot, endSlot, searchFromBottom); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerInfusionRepair.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerInfusionRepair.java new file mode 100644 index 0000000..10ac1ac --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerInfusionRepair.java @@ -0,0 +1,183 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.InfusionRepairUtil; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; + +/** + * Created by einsteinsci on 8/20/2014. + */ +public class ContainerInfusionRepair extends Container +{ + public Slot[] circleSlots = new Slot[9]; + public Slot resultSlot; + public InventoryInfusionRepair inputs = new InventoryInfusionRepair(this, 9); + public IInventory output = new InventoryCraftResult(); + public World worldObj; + EntityPlayer player; + + private BlockPos pos; + + public ContainerInfusionRepair(InventoryPlayer invPlayer, World world, BlockPos loc) + { + worldObj = world; + pos = loc; + + player = invPlayer.player; + + circleSlots[0] = new Slot(inputs, 0, 44, 35); + + circleSlots[1] = new Slot(inputs, 1, 44, 6); + circleSlots[2] = new Slot(inputs, 2, 67, 12); + circleSlots[3] = new Slot(inputs, 3, 73, 35); + circleSlots[4] = new Slot(inputs, 4, 67, 58); + circleSlots[5] = new Slot(inputs, 5, 44, 63); + circleSlots[6] = new Slot(inputs, 6, 21, 58); + circleSlots[7] = new Slot(inputs, 7, 15, 35); + circleSlots[8] = new Slot(inputs, 8, 21, 12); + + for (Slot slot : circleSlots) + { + addSlotToContainer(slot); + } + + resultSlot = new SlotInfusionRepairResult(invPlayer.player, inputs, output, 9, 136, 35); + addSlotToContainer(resultSlot); + + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (int i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); + } + + onCraftMatrixChanged(inputs); + } + + public void detectAndSendChanges() + { + if (InfusionRepairUtil.canRepair(inputs, player)) + { + ItemStack result = inputs.getStackInSlot(0).copy(); + result.setItemDamage(0); + output.setInventorySlotContents(0, result); + //resultSlot.setBackgroundIcon(result.getItem().getIconFromDamage(0)); // TODO: Fix bg icons + } + else + { + output.setInventorySlotContents(0, null); + //resultSlot.setBackgroundIcon(null); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotId) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(slotId); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (slotId < 10) + { + if (!mergeItemStack(itemstack1, 10, 46, false)) + { + return null; + } + } + else if (slotId >= 10 && slotId <= 45) + { + if (itemstack != null) + { + if (itemstack.getItem().isDamageable()) + { + if (!mergeItemStack(itemstack1, 0, 1, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 1, 9, false)) + { + return null; + } + } + } + else if (!mergeItemStack(itemstack1, 10, 46, false)) + { + return null; + } + + if (itemstack1.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + // Can Stack Enter? (I think) + @Override + public boolean canMergeSlot(ItemStack stack, Slot slot) + { + return slot.inventory != output && super.canMergeSlot(stack, slot); + } + + @Override + public void onContainerClosed(EntityPlayer player) + { + //super.onContainerClosed(player); + + if (!worldObj.isRemote) + { + for (int i = 0; i < 9; ++i) + { + ItemStack itemstack = inputs.getStackInSlotOnClosing(i); + + if (itemstack != null) + { + player.dropPlayerItemWithRandomChoice(itemstack, false); + } + } + } + } + + @Override + public void onCraftMatrixChanged(IInventory craftInv) + { + detectAndSendChanges(); + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return worldObj.getBlockState(pos).getBlock() == RegisterBlocks.infusionRepairStation + && player.getDistanceSq((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, + (double)pos.getZ() + 0.5D) <= 64.0D; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerKiln.java new file mode 100644 index 0000000..a72b4a4 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerKiln.java @@ -0,0 +1,170 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.KilnRecipes; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityKiln; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class ContainerKiln extends Container +{ + private TileEntityKiln tileKiln; + private int lastCookTime; + private int lastBurnTime; + private int lastItemBurnTime; + + public ContainerKiln(InventoryPlayer playerInv, TileEntityKiln tileEntityKiln) + { + tileKiln = tileEntityKiln; + addSlotToContainer(new Slot(tileEntityKiln, 0, 56, 17)); + addSlotToContainer(new Slot(tileEntityKiln, 1, 56, 53)); + addSlotToContainer(new SlotFurnaceOutput(playerInv.player, tileEntityKiln, 2, 116, 35)); + + int i; + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 142)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting craft) + { + super.addCraftingToCrafters(craft); + + craft.sendProgressBarUpdate(this, 0, tileKiln.kilnCookTime); + craft.sendProgressBarUpdate(this, 1, tileKiln.kilnBurnTime); + craft.sendProgressBarUpdate(this, 2, tileKiln.currentBurnTime); + } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + + for (int i = 0; i < crafters.size(); ++i) + { + ICrafting craft = (ICrafting)crafters.get(i); + + if (lastCookTime != tileKiln.kilnCookTime) + { + craft.sendProgressBarUpdate(this, 0, tileKiln.kilnCookTime); + } + if (lastBurnTime != tileKiln.kilnBurnTime) + { + craft.sendProgressBarUpdate(this, 1, tileKiln.kilnBurnTime); + } + if (lastItemBurnTime != tileKiln.currentBurnTime) + { + craft.sendProgressBarUpdate(this, 2, tileKiln.currentBurnTime); + } + } + + lastBurnTime = tileKiln.kilnBurnTime; + lastCookTime = tileKiln.kilnCookTime; + lastItemBurnTime = tileKiln.currentBurnTime; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int par2) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(par2); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (par2 == 2) + { + if (!mergeItemStack(itemstack1, 3, 39, true)) + { + return null; + } + slot.onSlotChange(itemstack1, itemstack); + } + else if (par2 != 1 && par2 != 0) + { + if (KilnRecipes.smelting().getSmeltingResult(itemstack1) != null) + { + if (!mergeItemStack(itemstack1, 0, 1, false)) + { + return null; + } + } + else if (TileEntityKiln.isItemFuel(itemstack1)) + { + if (!mergeItemStack(itemstack1, 1, 2, false)) + { + return null; + } + } + else if (par2 >= 3 && par2 < 30) + { + if (!mergeItemStack(itemstack1, 30, 39, false)) + { + return null; + } + } + else if (par2 >= 30 && par2 < 39 && !mergeItemStack(itemstack1, 3, 30, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 3, 39, false)) + { + return null; + } + if (itemstack1.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + slot.onPickupFromSlot(player, itemstack1); + } + return itemstack; + } + + @SideOnly(Side.CLIENT) + @Override + public void updateProgressBar(int par1, int par2) + { + if (par1 == 0) + { + tileKiln.kilnCookTime = par2; + } + if (par1 == 1) + { + tileKiln.kilnBurnTime = par2; + } + if (par1 == 2) + { + tileKiln.currentBurnTime = par2; + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return tileKiln.isUseableByPlayer(player); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerNetherBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerNetherBrickOven.java new file mode 100644 index 0000000..5a94105 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerNetherBrickOven.java @@ -0,0 +1,187 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.NetherBrickOvenRecipeHandler; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class ContainerNetherBrickOven extends Container +{ + private TileEntityNetherBrickOven tileBrickOven; + private int lastCookTime; + + public ContainerNetherBrickOven(InventoryPlayer playerInv, TileEntityNetherBrickOven tileEntityBrickOven) + { + tileBrickOven = tileEntityBrickOven; + addSlotToContainer(new Slot(tileEntityBrickOven, TileEntityNetherBrickOven.FUELINPUT, 17, 63)); + addSlotToContainer(new SlotFurnaceOutput(playerInv.player, tileEntityBrickOven, + TileEntityNetherBrickOven.OUTPUT, 138, 35)); + + int i; + + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; j++) + { + addSlotToContainer(new Slot(tileEntityBrickOven, j + i * 3 + TileEntityNetherBrickOven.INPUTSTART, + 44 + j * 18, 17 + i * 18)); + } + } + + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 142)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting craft) + { + super.addCraftingToCrafters(craft); + + craft.sendProgressBarUpdate(this, 0, tileBrickOven.ovenCookTime); + } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + + for (int i = 0; i < crafters.size(); ++i) + { + ICrafting craft = (ICrafting)crafters.get(i); + + if (lastCookTime != tileBrickOven.ovenCookTime) + { + craft.sendProgressBarUpdate(this, 0, tileBrickOven.ovenCookTime); + } + } + + lastCookTime = tileBrickOven.ovenCookTime; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotId) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(slotId); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (slotId == TileEntityNetherBrickOven.OUTPUT) + { + if (!mergeItemStack(itemstack1, 11, 47, true)) // move to inventory (all, avoid hotbar) + { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } + else if (slotId >= 11 && slotId < 38) // non-hotbar inventory + { + if (FluidContainerRegistry.isBucket(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityNetherBrickOven.FUELINPUT, + TileEntityNetherBrickOven.FUELINPUT + 1, false)) + { + return null; + } + } + else if (NetherBrickOvenRecipeHandler.instance().isInRecipe(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityNetherBrickOven.INPUTSTART, + TileEntityNetherBrickOven.INPUTSTART + 9, + false)) // move to craft matrix + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 38, 47, false)) // move to hotbar + { + return null; + } + } + else if (slotId >= 37 && slotId < 46) // hotbar + { + if (FluidContainerRegistry.isBucket(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityNetherBrickOven.FUELINPUT, + TileEntityNetherBrickOven.FUELINPUT + 1, false)) + { + return null; + } + } + else if (NetherBrickOvenRecipeHandler.instance().isInRecipe(itemstack1)) + { + if (!mergeItemStack(itemstack1, TileEntityNetherBrickOven.INPUTSTART, + TileEntityNetherBrickOven.INPUTSTART + 9, + false)) // move to craft matrix + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 11, 38, false)) // move to inventory (non-hotbar) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 11, 47, false)) // move to inventory (all) + { + return null; + } + + if (itemstack1.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + @SideOnly(Side.CLIENT) + @Override + public void updateProgressBar(int par1, int par2) + { + if (par1 == 0) + { + tileBrickOven.ovenCookTime = par2; + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return tileBrickOven.isUseableByPlayer(player); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerObsidianKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerObsidianKiln.java new file mode 100644 index 0000000..1a50359 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerObsidianKiln.java @@ -0,0 +1,173 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.KilnRecipes; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityObsidianKiln; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +/** + * Created by einsteinsci on 8/17/2014. + */ +public class ContainerObsidianKiln extends Container +{ + private TileEntityObsidianKiln tileKiln; + private int lastCookTime; + private int lastBurnTime; + private int lastItemBurnTime; + + public ContainerObsidianKiln(InventoryPlayer playerInv, TileEntityObsidianKiln obsKiln) + { + tileKiln = obsKiln; + addSlotToContainer(new Slot(obsKiln, 0, 56, 17)); + addSlotToContainer(new Slot(obsKiln, 1, 56, 53)); + addSlotToContainer(new SlotFurnaceOutput(playerInv.player, obsKiln, 2, 116, 35)); + + int i; + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 142)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting craft) + { + super.addCraftingToCrafters(craft); + + craft.sendProgressBarUpdate(this, 0, tileKiln.kilnCookTime); + craft.sendProgressBarUpdate(this, 1, tileKiln.kilnBurnTime); + craft.sendProgressBarUpdate(this, 2, tileKiln.currentBurnTime); + } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + + for (int i = 0; i < crafters.size(); ++i) + { + ICrafting craft = (ICrafting)crafters.get(i); + + if (lastCookTime != tileKiln.kilnCookTime) + { + craft.sendProgressBarUpdate(this, 0, tileKiln.kilnCookTime); + } + if (lastBurnTime != tileKiln.kilnBurnTime) + { + craft.sendProgressBarUpdate(this, 1, tileKiln.kilnBurnTime); + } + if (lastItemBurnTime != tileKiln.currentBurnTime) + { + craft.sendProgressBarUpdate(this, 2, tileKiln.currentBurnTime); + } + } + + lastBurnTime = tileKiln.kilnBurnTime; + lastCookTime = tileKiln.kilnCookTime; + lastItemBurnTime = tileKiln.currentBurnTime; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int par2) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(par2); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (par2 == 2) + { + if (!mergeItemStack(itemstack1, 3, 39, true)) + { + return null; + } + slot.onSlotChange(itemstack1, itemstack); + } + else if (par2 != 1 && par2 != 0) + { + if (KilnRecipes.smelting().getSmeltingResult(itemstack1) != null) + { + if (!mergeItemStack(itemstack1, 0, 1, false)) + { + return null; + } + } + else if (TileEntityObsidianKiln.isItemFuel(itemstack1)) + { + if (!mergeItemStack(itemstack1, 1, 2, false)) + { + return null; + } + } + else if (par2 >= 3 && par2 < 30) + { + if (!mergeItemStack(itemstack1, 30, 39, false)) + { + return null; + } + } + else if (par2 >= 30 && par2 < 39 && !mergeItemStack(itemstack1, 3, 30, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 3, 39, false)) + { + return null; + } + if (itemstack1.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + slot.onPickupFromSlot(player, itemstack1); + } + return itemstack; + } + + @SideOnly(Side.CLIENT) + @Override + public void updateProgressBar(int par1, int par2) + { + if (par1 == 0) + { + tileKiln.kilnCookTime = par2; + } + if (par1 == 1) + { + tileKiln.kilnBurnTime = par2; + } + if (par1 == 2) + { + tileKiln.currentBurnTime = par2; + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return tileKiln.isUseableByPlayer(player); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSimpleWorkbench.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSimpleWorkbench.java new file mode 100644 index 0000000..5db3c72 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSimpleWorkbench.java @@ -0,0 +1,179 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.blocks.BlockDoubleWorkbench; +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.register.recipe.AdvancedCraftingHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; + +public class ContainerSimpleWorkbench extends Container +{ + /** + * The crafting matrix inventory (3x3). + */ + public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3); + public IInventory craftResult = new InventoryCraftResult(); + BlockPos pos; + private World worldObj; + + public ContainerSimpleWorkbench(InventoryPlayer invPlayer, World world, BlockPos loc) + { + worldObj = world; + pos = loc; + + addSlotToContainer(new SlotCrafting(invPlayer.player, craftMatrix, craftResult, 0, 124, 35)); + int l; + int i1; + + for (l = 0; l < 3; ++l) + { + for (i1 = 0; i1 < 3; ++i1) + { + addSlotToContainer(new Slot(craftMatrix, i1 + l * 3, 30 + i1 * 18, 17 + l * 18)); + } + } + + for (l = 0; l < 3; ++l) + { + for (i1 = 0; i1 < 9; ++i1) + { + addSlotToContainer(new Slot(invPlayer, i1 + l * 9 + 9, 8 + i1 * 18, 84 + l * 18)); + } + } + + for (l = 0; l < 9; ++l) + { + addSlotToContainer(new Slot(invPlayer, l, 8 + l * 18, 142)); + } + + onCraftMatrixChanged(craftMatrix); + } + + public boolean needsBigBoyBench() + { + return AdvancedCraftingHandler.crafting().hasRecipe(craftMatrix, worldObj); + + } + + /** + * Called when a player shift-clicks on a slot. You must override this or + * you will crash when someone does that. I am not touching this code. + */ + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotId) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(slotId); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (slotId == 0) + { + if (!mergeItemStack(itemstack1, 10, 46, true)) + { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } + else if (slotId >= 10 && slotId < 37) + { + if (!mergeItemStack(itemstack1, 37, 46, false)) + { + return null; + } + } + else if (slotId >= 37 && slotId < 46) + { + if (!mergeItemStack(itemstack1, 10, 37, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 10, 46, false)) + { + return null; + } + + if (itemstack1.stackSize == 0) + { + slot.putStack((ItemStack)null); + } + else + { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + // Can Stack Enter? (I think) + @Override + public boolean canMergeSlot(ItemStack stack, Slot slot) + { + return slot.inventory != craftResult && super.canMergeSlot(stack, slot); + } + + /** + * Called when the container is closed. + */ + @Override + public void onContainerClosed(EntityPlayer player) + { + super.onContainerClosed(player); + + if (!worldObj.isRemote) + { + for (int i = 0; i < 9; ++i) + { + ItemStack itemstack = craftMatrix.getStackInSlotOnClosing(i); + + if (itemstack != null) + { + player.dropPlayerItemWithRandomChoice(itemstack, false); + } + } + } + } + + /** + * Callback for when the crafting matrix is changed. + */ + @Override + public void onCraftMatrixChanged(IInventory inventory) + { + craftResult.setInventorySlotContents(0, + CraftingManager.getInstance().findMatchingRecipe(craftMatrix, worldObj)); + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + // return worldObj.getBlock(posX, posY, posZ) != + // RegisterBlocks.blockDoubleWorkbench ? false : player.getDistanceSq( + // posX + 0.5D, posY + 0.5D, posZ + 0.5D) <= 64.0D; + + return worldObj.getBlockState(pos) == RegisterBlocks.doubleWorkbench + && worldObj.getBlockState(pos).getValue(BlockDoubleWorkbench.CONNECTION) == EnumFacing.UP + && player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0D; + } + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSmelter.java new file mode 100644 index 0000000..be04791 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/ContainerSmelter.java @@ -0,0 +1,187 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.SmelterRecipeHandler; +import net.einsteinsci.betterbeginnings.tileentity.TileEntitySmelter; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.*; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class ContainerSmelter extends Container +{ + private TileEntitySmelter smelter; + private int lastCookTime; + private int lastBurnTime; + private int lastItemBurnTime; + + public ContainerSmelter(InventoryPlayer playerInv, TileEntitySmelter tileEntitySmelter) + { + smelter = tileEntitySmelter; + addSlotToContainer(new Slot(tileEntitySmelter, TileEntitySmelter.INPUT, 46, 17)); + addSlotToContainer(new Slot(tileEntitySmelter, TileEntitySmelter.FUEL, 56, 53)); + addSlotToContainer(new SlotFurnaceOutput(playerInv.player, tileEntitySmelter, + TileEntitySmelter.OUTPUT, 116, 35)); + addSlotToContainer(new Slot(tileEntitySmelter, TileEntitySmelter.GRAVEL, 66, 17)); + + int i; + for (i = 0; i < 3; ++i) + { + for (int j = 0; j < 9; ++j) + { + addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (i = 0; i < 9; ++i) + { + addSlotToContainer(new Slot(playerInv, i, 8 + i * 18, 142)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting craft) + { + super.addCraftingToCrafters(craft); + + craft.sendProgressBarUpdate(this, 0, smelter.smelterCookTime); + craft.sendProgressBarUpdate(this, 1, smelter.smelterBurnTime); + craft.sendProgressBarUpdate(this, 2, smelter.currentItemBurnLength); + } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + + for (int i = 0; i < crafters.size(); ++i) + { + ICrafting craft = (ICrafting)crafters.get(i); + + if (lastCookTime != smelter.smelterCookTime) + { + craft.sendProgressBarUpdate(this, 0, smelter.smelterCookTime); + } + if (lastBurnTime != smelter.smelterBurnTime) + { + craft.sendProgressBarUpdate(this, 1, smelter.smelterBurnTime); + } + if (lastItemBurnTime != smelter.currentItemBurnLength) + { + craft.sendProgressBarUpdate(this, 2, smelter.currentItemBurnLength); + } + } + + lastBurnTime = smelter.smelterBurnTime; + lastCookTime = smelter.smelterCookTime; + lastItemBurnTime = smelter.currentItemBurnLength; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int fromId) + { + ItemStack movedStackDupe = null; + Slot slot = (Slot)inventorySlots.get(fromId); + + if (slot != null && slot.getHasStack()) + { + ItemStack movedStack = slot.getStack(); + movedStackDupe = movedStack.copy(); + + if (fromId == TileEntitySmelter.OUTPUT) + { + if (!mergeItemStack(movedStack, 4, 40, true)) + { + return null; + } + slot.onSlotChange(movedStack, movedStackDupe); + } + else if (fromId != TileEntitySmelter.FUEL && fromId != TileEntitySmelter.INPUT && + fromId != TileEntitySmelter.GRAVEL) + { + if (SmelterRecipeHandler.smelting().getSmeltingResult(movedStack) != null) + { + if (!mergeItemStack(movedStack, TileEntitySmelter.INPUT, TileEntitySmelter.INPUT + 1, false)) + { + return null; + } + } + else if (movedStack.getItem() == Item.getItemFromBlock(Blocks.gravel)) + { + if (!mergeItemStack(movedStack, TileEntitySmelter.GRAVEL, TileEntitySmelter.GRAVEL + 1, false)) + { + return null; + } + } + else if (TileEntitySmelter.isItemFuel(movedStack)) + { + if (!mergeItemStack(movedStack, TileEntitySmelter.FUEL, TileEntitySmelter.FUEL + 1, false)) + { + return null; + } + } + else if (fromId >= 4 && fromId < 31) + { + if (!mergeItemStack(movedStack, 31, 40, false)) + { + return null; + } + } + else if (fromId >= 31 && fromId < 40 && !mergeItemStack(movedStack, 4, 31, false)) + { + return null; + } + } + else if (!mergeItemStack(movedStack, 4, 40, false)) + { + return null; + } + if (movedStack.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + if (movedStack.stackSize == movedStackDupe.stackSize) + { + return null; + } + slot.onPickupFromSlot(player, movedStack); + } + return movedStackDupe; + } + + @SideOnly(Side.CLIENT) + @Override + public void updateProgressBar(int par1, int par2) + { + if (par1 == 0) + { + smelter.smelterCookTime = par2; + } + if (par1 == 1) + { + smelter.smelterBurnTime = par2; + } + if (par1 == 2) + { + smelter.currentItemBurnLength = par2; + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return smelter.isUseableByPlayer(player); + } + + public boolean merge(ItemStack stack, int startSlot, int endSlot, boolean searchFromBottom) + { + return mergeItemStack(stack, startSlot, endSlot, searchFromBottom); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryBrickOvenMatrix.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryBrickOvenMatrix.java new file mode 100644 index 0000000..b067f96 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryBrickOvenMatrix.java @@ -0,0 +1,202 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.*; +import net.minecraft.item.ItemStack; + +public class InventoryBrickOvenMatrix extends InventoryCrafting implements IInventory +{ + /** + * List of the stacks in the crafting matrix. + */ + private ItemStack[] stackList; + /** + * the width of the crafting inventory + */ + private int inventoryWidth; + /** + * Class containing the callbacks for the events on_GUIClosed and + * on_CraftMaxtrixChanged. + */ + private Container eventHandler; + + public InventoryBrickOvenMatrix(Container container, int width, int height) + { + super(container, width, height); + int k = width * height; + stackList = new ItemStack[k]; + eventHandler = container; + inventoryWidth = width; + } + + /** + * Returns the number of slots in the inventory. + */ + @Override + public int getSizeInventory() + { + return stackList.length; + } + + /** + * Returns the stack in slot i + */ + @Override + public ItemStack getStackInSlot(int slot) + { + return slot >= getSizeInventory() ? null : stackList[slot]; + } + + /** + * Returns the itemstack in the slot specified (Top left is 0, 0). Args: + * row, column + */ + @Override + public ItemStack getStackInRowAndColumn(int row, int column) + { + if (row >= 0 && row < inventoryWidth) + { + int k = row + column * inventoryWidth; + return getStackInSlot(k); + } + else + { + return null; + } + } + + /** + * Returns the customName of the inventory + */ + @Override + public String getName() + { + return "container.brickovenmatrix"; + } + + /** + * Returns if the inventory is named + */ + @Override + public boolean hasCustomName() + { + return false; + } + + /** + * When some containers are closed they call this on each slot, then drop + * whatever it returns as an EntityItem - like when you close a workbench + * GUI. + */ + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (stackList[slot] != null) + { + ItemStack itemstack = stackList[slot]; + stackList[slot] = null; + return itemstack; + } + else + { + return null; + } + } + + /** + * Removes from an inventory slot (first arg) up to a specified number + * (second arg) of items and returns them in a new stack. + */ + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (stackList[slot] != null) + { + ItemStack itemstack; + + if (stackList[slot].stackSize <= amount) + { + itemstack = stackList[slot]; + stackList[slot] = null; + eventHandler.onCraftMatrixChanged(this); + return itemstack; + } + else + { + itemstack = stackList[slot].splitStack(amount); + + if (stackList[slot].stackSize == 0) + { + stackList[slot] = null; + } + + eventHandler.onCraftMatrixChanged(this); + return itemstack; + } + } + else + { + return null; + } + } + + /** + * Sets the given item stack to the specified slot in the inventory (can be + * crafting or armor sections). + */ + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + stackList[slot] = stack; + eventHandler.onCraftMatrixChanged(this); + } + + /** + * Returns the maximum stack size for a inventory slot. + */ + @Override + public int getInventoryStackLimit() + { + return 64; + } + + /** + * For tile entities, ensures the chunk containing the tile entity is saved + * to disk later - the game won't think it hasn't changed and skip it. + */ + @Override + public void markDirty() + { + super.markDirty(); + } + + /** + * Do not make give this method the customName canInteractWith because it clashes + * with Container + */ + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + /** + * Returns true if automation is allowed to insert the given stack (ignoring + * stack size) into the given slot. + */ + @Override + public boolean isItemValidForSlot(int slot, ItemStack item) + { + return true; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryInfusionRepair.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryInfusionRepair.java new file mode 100644 index 0000000..7f56a89 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryInfusionRepair.java @@ -0,0 +1,178 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; + +public class InventoryInfusionRepair implements IInventory +{ + public ItemStack[] stackList; + public Container eventHandler; + + public InventoryInfusionRepair(Container container, int size) + { + stackList = new ItemStack[size]; + eventHandler = container; + } + + @Override + public int getSizeInventory() + { + return stackList.length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + if (getSizeInventory() <= slot) + { + return null; + } + else + { + return stackList[slot]; + } + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (stackList[slot] != null) + { + ItemStack itemstack; + + if (stackList[slot].stackSize <= amount) + { + itemstack = stackList[slot]; + stackList[slot] = null; + eventHandler.onCraftMatrixChanged(this); + return itemstack; + } + else + { + itemstack = stackList[slot].splitStack(amount); + + if (stackList[slot].stackSize == 0) + { + stackList[slot] = null; + } + + eventHandler.onCraftMatrixChanged(this); + return itemstack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (stackList[slot] != null) + { + ItemStack itemstack = stackList[slot]; + stackList[slot] = null; + return itemstack; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + stackList[slot] = stack; + eventHandler.onCraftMatrixChanged(this); + } + + @Override + public String getName() + { + return "container.inputs"; + } + + @Override + public boolean hasCustomName() + { + return false; + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public void markDirty() + { + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + if (stack != null && slot == 0) // center slot + { + return stack.getItem().isDamageable(); + } + else + { + return true; + } + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < stackList.length; i++) + { + stackList[i] = null; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryWorkbenchAdditionalMaterials.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryWorkbenchAdditionalMaterials.java new file mode 100644 index 0000000..9182688 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryWorkbenchAdditionalMaterials.java @@ -0,0 +1,172 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; + +public class InventoryWorkbenchAdditionalMaterials implements IInventory +{ + private ItemStack[] stackList; + + private Container eventHandler; + + public InventoryWorkbenchAdditionalMaterials(Container container, int size) + { + stackList = new ItemStack[size]; + eventHandler = container; + } + + @Override + public int getSizeInventory() + { + return stackList.length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + if (getSizeInventory() <= slot) + { + return null; + } + else + { + return stackList[slot]; + } + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (stackList[slot] != null) + { + ItemStack itemstack; + + if (stackList[slot].stackSize <= amount) + { + itemstack = stackList[slot]; + stackList[slot] = null; + eventHandler.onCraftMatrixChanged(this); + return itemstack; + } + else + { + itemstack = stackList[slot].splitStack(amount); + + if (stackList[slot].stackSize == 0) + { + stackList[slot] = null; + } + + eventHandler.onCraftMatrixChanged(this); + return itemstack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (stackList[slot] != null) + { + ItemStack itemstack = stackList[slot]; + stackList[slot] = null; + return itemstack; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + stackList[slot] = stack; + eventHandler.onCraftMatrixChanged(this); + } + + @Override + public String getName() + { + return "container.workbenchmaterials"; + } + + @Override + public boolean hasCustomName() + { + return false; + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public void markDirty() + { + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return true; + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < stackList.length; i++) + { + stackList[i] = null; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotAdvancedCrafting.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotAdvancedCrafting.java new file mode 100644 index 0000000..7c5ab2e --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotAdvancedCrafting.java @@ -0,0 +1,237 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.recipe.AdvancedCraftingHandler; +import net.einsteinsci.betterbeginnings.register.recipe.AdvancedRecipe; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.*; +import net.minecraft.stats.AchievementList; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; +import net.minecraftforge.fml.common.FMLCommonHandler; + +public class SlotAdvancedCrafting extends Slot +{ + /** + * The craft matrix inventory linked to this result slot. + */ + private final IInventory craftMatrix; + /** + * The added materials necessary for advanced crafting. + */ + private final IInventory additionalMaterials; + /** + * The player that is using the GUI where this slot resides. + */ + private EntityPlayer thePlayer; + /** + * The number of items that have been crafted so far. Gets passed to + * ItemStack.onCrafting before being reset. + */ + private int amountCrafted; + + public SlotAdvancedCrafting(EntityPlayer player, IInventory matrix, IInventory resultInv, + IInventory addedMats, int id, int x, int y) + { + super(resultInv, id, x, y); + thePlayer = player; + craftMatrix = matrix; + additionalMaterials = addedMats; + } + + /** + * the itemStack passed in is the output - ie, iron ingots, and pickaxes, + * not ore and wood. Typically increases an internal count then calls + * onCrafting(item). + */ + @Override + protected void onCrafting(ItemStack stack, int resultCount) + { + amountCrafted += resultCount; + onCrafting(stack); + } + + /** + * the itemStack passed in is the output - ie, iron ingots, and pickaxes, + * not ore and wood. + */ + @Override + protected void onCrafting(ItemStack stack) + { + stack.onCrafting(thePlayer.worldObj, thePlayer, amountCrafted); + amountCrafted = 0; + + if (stack.getItem() == Item.getItemFromBlock(Blocks.crafting_table)) + { + thePlayer.addStat(AchievementList.buildWorkBench, 1); + } + + if (stack.getItem() instanceof ItemPickaxe) + { + thePlayer.addStat(AchievementList.buildPickaxe, 1); + } + + if (stack.getItem() == Item.getItemFromBlock(Blocks.furnace)) + { + thePlayer.addStat(AchievementList.buildFurnace, 1); + } + + if (stack.getItem() instanceof ItemHoe) + { + thePlayer.addStat(AchievementList.buildHoe, 1); + } + + if (stack.getItem() == Items.bread) + { + thePlayer.addStat(AchievementList.makeBread, 1); + } + + if (stack.getItem() == Items.cake) + { + thePlayer.addStat(AchievementList.bakeCake, 1); + } + + if (stack.getItem() instanceof ItemPickaxe + && ((ItemPickaxe)stack.getItem()).getToolMaterial() != Item.ToolMaterial.WOOD) + { + thePlayer.addStat(AchievementList.buildBetterPickaxe, 1); + } + + if (stack.getItem() instanceof ItemSword + && ((ItemSword)stack.getItem()).getToolMaterialName() != "noobwood") + { + thePlayer.addStat(AchievementList.buildSword, 1); + } + + if (stack.getItem() == Item.getItemFromBlock(Blocks.enchanting_table)) + { + thePlayer.addStat(AchievementList.enchantments, 1); + } + + if (stack.getItem() == Item.getItemFromBlock(Blocks.bookshelf)) + { + thePlayer.addStat(AchievementList.bookcase, 1); + } + } + + // onCraftingEvent? + @Override + public void onPickupFromSlot(EntityPlayer player, ItemStack resultStack) + { + FMLCommonHandler.instance().firePlayerCraftingEvent(player, resultStack, craftMatrix); + onCrafting(resultStack); + + // Decrease crafted materials + for (int i = 0; i < craftMatrix.getSizeInventory(); ++i) + { + ItemStack ingredientStack = craftMatrix.getStackInSlot(i); + + if (ingredientStack != null) + { + craftMatrix.decrStackSize(i, 1); + + if (ingredientStack.getItem().hasContainerItem(ingredientStack)) + { + ItemStack containerStack = ingredientStack.getItem().getContainerItem(ingredientStack); + + if (containerStack != null && containerStack.isItemStackDamageable() + && containerStack.getItemDamage() > containerStack.getMaxDamage()) + { + MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thePlayer, containerStack)); + continue; + } + + //if (!ingredientStack.getItem().doesContainerItemLeaveCraftingGrid(ingredientStack) + // || !thePlayer.inventory.addItemStackToInventory(containerStack)) + //{ + // if (craftMatrix.getStackInSlot(i) == null) + // { + // craftMatrix.setInventorySlotContents(i, containerStack); + // } + // else + // { + // thePlayer.dropPlayerItemWithRandomChoice(containerStack, false); + // } + //} + } + } + } + + // Decrease added materials + for (int i = 0; i < additionalMaterials.getSizeInventory(); ++i) + { + ItemStack matStack = additionalMaterials.getStackInSlot(i); + + if (matStack != null) + { + int amount = 0; + AdvancedRecipe advRecipe = AdvancedCraftingHandler.AdvancedRecipeByResult(resultStack); + + if (advRecipe != null) + { + amount = advRecipe.getNeededMaterialCount(matStack.getItem()); + } + + additionalMaterials.decrStackSize(i, amount); + + // Containers + if (matStack.getItem().hasContainerItem(matStack)) + { + ItemStack containerStack = matStack.getItem().getContainerItem(matStack); + + if (containerStack != null && containerStack.isItemStackDamageable() + && containerStack.getItemDamage() > containerStack.getMaxDamage()) + { + MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thePlayer, containerStack)); + continue; + } + + //if (!matStack.getItem().doesContainerItemLeaveCraftingGrid(matStack) + // || !thePlayer.inventory.addItemStackToInventory(containerStack)) + //{ + // if (additionalMaterials.getStackInSlot(i) == null) + // { + // additionalMaterials.setInventorySlotContents(i, containerStack); + // } + // else + // { + // thePlayer.dropPlayerItemWithRandomChoice(containerStack, false); + // } + //} + } + } + } + } + + /** + * Check if the stack is a valid item for this slot. Always true beside for + * the armor slots. + */ + @Override + public boolean isItemValid(ItemStack stack) + { + // One way only. + return false; + } + + /** + * Decrease the size of the stack in slot (first int arg) by the amount of + * the second int arg. Returns the new stack. + */ + @Override + public ItemStack decrStackSize(int amount) + { + if (getHasStack()) + { + amountCrafted += Math.min(amount, getStack().stackSize); + } + + return super.decrStackSize(amount); + } +} + + +// BUFFER diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotBrickOvenOutput.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotBrickOvenOutput.java new file mode 100644 index 0000000..fd2b317 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotBrickOvenOutput.java @@ -0,0 +1,12 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; + +public class SlotBrickOvenOutput extends Slot +{ + public SlotBrickOvenOutput(IInventory container, int slotId, int x, int y) + { + super(container, slotId, x, y); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotInfusionRepairResult.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotInfusionRepairResult.java new file mode 100644 index 0000000..d04fc5b --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/SlotInfusionRepairResult.java @@ -0,0 +1,110 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.register.InfusionRepairUtil; +import net.einsteinsci.betterbeginnings.register.RegisterItems; +import net.einsteinsci.betterbeginnings.register.achievement.RegisterAchievements; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.ArrayList; + +/** + * Created by einsteinsci on 8/20/2014. + */ +public class SlotInfusionRepairResult extends Slot +{ + IInventory inputSlots; + EntityPlayer player; + IInventory outputSlot; + + public SlotInfusionRepairResult(EntityPlayer entityPlayer, InventoryInfusionRepair inputs, IInventory output, + int slotId, int xPos, int yPos) + { + super(inputs, slotId, xPos, yPos); + player = entityPlayer; + outputSlot = output; + + inputSlots = inputs; + } + + public void onPickupFromSlot(EntityPlayer entityPlayer, ItemStack stack) + { + onCrafting(stack); + + InventoryInfusionRepair inputs = (InventoryInfusionRepair)inputSlots; + + ArrayList required = InfusionRepairUtil.getRequiredStacks(inputs); + + for (ItemStack requiredStack : required) + { + for (int i = 0; i < inputSlots.getSizeInventory(); ++i) + { + if (requiredStack != null && inputSlots.getStackInSlot(i) != null) + { + if (requiredStack.getItem() == inputSlots.getStackInSlot(i).getItem() && + (requiredStack.getItemDamage() == OreDictionary.WILDCARD_VALUE || + requiredStack.getItemDamage() == inputSlots.getStackInSlot(i).getItemDamage())) + { + inputSlots.decrStackSize(i, requiredStack.stackSize); + + ItemStack itemstack1 = inputSlots.getStackInSlot(i); + + if (itemstack1 != null) + { + if (itemstack1.getItem().hasContainerItem(itemstack1)) + { + ItemStack containerStack = itemstack1.getItem().getContainerItem(itemstack1); + + if (containerStack != null && containerStack.isItemStackDamageable() && containerStack + .getItemDamage() > containerStack.getMaxDamage()) + { + MinecraftForge.EVENT_BUS + .post(new PlayerDestroyItemEvent(entityPlayer, containerStack)); + continue; + } + + //if (!itemstack1.getItem().doesContainerItemLeaveCraftingGrid(itemstack1) || + // !entityPlayer.inventory.addItemStackToInventory(containerStack)) + //{ + // if (inputSlots.getStackInSlot(i) == null) + // { + // inputSlots.setInventorySlotContents(i, containerStack); + // } + // else + // { + // entityPlayer.dropPlayerItemWithRandomChoice(containerStack, false); + // } + //} + } + } + + break; + } + } + } + } + + if (!entityPlayer.capabilities.isCreativeMode) + { + entityPlayer.addExperienceLevel(-InfusionRepairUtil.getTakenLevels(inputs)); + } + + inputSlots.setInventorySlotContents(0, null); + + if (stack != null) + { + if (stack.getItem() == RegisterItems.noobWoodSword) + { + RegisterAchievements.achievementGet(entityPlayer, "repairNoobSword"); + } + + FMLCommonHandler.instance().firePlayerCraftingEvent(entityPlayer, stack, inputSlots); + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/inventory/TankNetherBrickOvenFuel.java b/src/main/java/net/einsteinsci/betterbeginnings/inventory/TankNetherBrickOvenFuel.java new file mode 100644 index 0000000..eb14bd4 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/inventory/TankNetherBrickOvenFuel.java @@ -0,0 +1,53 @@ +package net.einsteinsci.betterbeginnings.inventory; + +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.*; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class TankNetherBrickOvenFuel extends FluidTank implements IFluidTank +{ + public TankNetherBrickOvenFuel(TileEntityNetherBrickOven oven, int capacity) + { + super(capacity); + + tile = oven; + } + + public boolean fillFromContainer(ItemStack container) + { + FluidStack stack = FluidContainerRegistry.getFluidForFilledItem(container); + if (stack != null) + { + if (getCapacity() - getFluidAmount() > stack.amount) + { + if (getFluid() != null) + { + if (getFluid().isFluidEqual(stack)) + { + fluid.amount += stack.amount; + return true; + } + } + else + { + fluid = stack.copy(); + return true; + } + } + } + return false; + } + + @Override + public int getFluidAmount() + { + if (fluid == null) + { + return 0; + } + return fluid.amount; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemBonePickaxe.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemBonePickaxe.java new file mode 100644 index 0000000..ba57d35 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemBonePickaxe.java @@ -0,0 +1,42 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemPickaxe; +import net.minecraft.item.ItemStack; + +import java.util.HashSet; +import java.util.Set; + +public class ItemBonePickaxe extends ItemPickaxe implements IBBName +{ + public ItemBonePickaxe() + { + super(ToolMaterial.WOOD); + + setUnlocalizedName("bonePickaxe"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "bonePickaxe"; + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) + { + return toolMaterial.getHarvestLevel(); + } + + @Override + public Set getToolClasses(ItemStack stack) + { + Set res = new HashSet<>(); + + res.add("pickaxe"); + + return res; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemBoneShard.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemBoneShard.java new file mode 100644 index 0000000..324bf26 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemBoneShard.java @@ -0,0 +1,21 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemBoneShard extends Item implements IBBName +{ + public ItemBoneShard() + { + super(); + setUnlocalizedName("boneShard"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "boneShard"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemCharredMeat.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemCharredMeat.java new file mode 100644 index 0000000..53feb9f --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemCharredMeat.java @@ -0,0 +1,34 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.achievement.RegisterAchievements; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +// "That's disgusting!" +public class ItemCharredMeat extends ItemFood implements IBBName +{ + public ItemCharredMeat() + { + super(4, 8.0f, true); + setUnlocalizedName("charredMeat"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public void onFoodEaten(ItemStack stack, World world, EntityPlayer player) + { + super.onFoodEaten(stack, world, player); + + RegisterAchievements.achievementGet(player, "charredMeat"); + } + + @Override + public String getName() + { + return "charredMeat"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemCloth.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemCloth.java new file mode 100644 index 0000000..61aa3c3 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemCloth.java @@ -0,0 +1,23 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemCloth extends Item implements IBBName +{ + public ItemCloth() + { + super(); + + setUnlocalizedName("cloth"); + + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "cloth"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemClothArmor.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemClothArmor.java new file mode 100644 index 0000000..9371f24 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemClothArmor.java @@ -0,0 +1,22 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemArmor; + +public class ItemClothArmor extends ItemArmor implements IBBName +{ + public ItemClothArmor(ArmorMaterial material, int armorIndex, String name) + { + super(material, 0, armorIndex); + + setUnlocalizedName(name); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "clothArmor_" + armorType; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemFireBow.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemFireBow.java new file mode 100644 index 0000000..0c655f4 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemFireBow.java @@ -0,0 +1,87 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; + +public class ItemFireBow extends Item implements IBBName +{ + public ItemFireBow() + { + super(); + setUnlocalizedName("fireBow"); + + setMaxStackSize(1); + setMaxDamage(8); + + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, + float hitX, float hitY, float hitZ) + { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + if (side == EnumFacing.DOWN) + { + --y; + } + + if (side == EnumFacing.UP) + { + ++y; + } + + if (side == EnumFacing.NORTH) + { + --z; + } + + if (side == EnumFacing.SOUTH) + { + ++z; + } + + if (side == EnumFacing.WEST) + { + --x; + } + + if (side == EnumFacing.EAST) + { + ++x; + } + + if (!player.canPlayerEdit(pos, side, stack)) + { + return false; + } + else + { + if (world.isAirBlock(pos)) + { + world.playSoundEffect((double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "fire.ignite", 1.0F, + itemRand.nextFloat() * 0.4F + 0.8F); + world.setBlockState(pos, Blocks.fire.getDefaultState()); + } + + stack.damageItem(1, player); + return true; + } + } + + @Override + public String getName() + { + return "fireBow"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemFlintHatchet.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemFlintHatchet.java new file mode 100644 index 0000000..63155e0 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemFlintHatchet.java @@ -0,0 +1,41 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemAxe; +import net.minecraft.item.ItemStack; + +import java.util.HashSet; +import java.util.Set; + +public class ItemFlintHatchet extends ItemAxe implements IBBName +{ + public ItemFlintHatchet() + { + super(ToolMaterial.WOOD); + setUnlocalizedName(getName()); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "flintHatchet"; + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) + { + return toolMaterial.getHarvestLevel(); + } + + @Override + public Set getToolClasses(ItemStack stack) + { + Set res = new HashSet<>(); + + res.add("axe"); + + return res; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemHammer.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemHammer.java new file mode 100644 index 0000000..34f9028 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemHammer.java @@ -0,0 +1,44 @@ +package net.einsteinsci.betterbeginnings.items; + +import com.google.common.collect.Sets; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.*; + +import java.util.Set; + +public class ItemHammer extends ItemTool +{ + private static final Set breakableBlocks = Sets + .newHashSet(Blocks.stone, Blocks.cobblestone, Blocks.gravel, Blocks.sandstone); + + protected ItemHammer(Item.ToolMaterial material) + { + super(2.0F, material, breakableBlocks); + } + + public static ItemStack getCrushResult(Block broken) + { + if (broken == Blocks.stone) + { + return new ItemStack(Blocks.cobblestone); + } + else if (broken == Blocks.cobblestone) + { + return new ItemStack(Blocks.gravel); + } + else if (broken == Blocks.gravel) + { + return new ItemStack(Items.flint, 2); + } + else if (broken == Blocks.sandstone) + { + return new ItemStack(Blocks.sand); + } + else + { + return null; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemIronNugget.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemIronNugget.java new file mode 100644 index 0000000..f6dbea2 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemIronNugget.java @@ -0,0 +1,21 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemIronNugget extends Item implements IBBName +{ + public ItemIronNugget() + { + super(); + setUnlocalizedName("ironNugget"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "ironNugget"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyBeef.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyBeef.java new file mode 100644 index 0000000..7f4beff --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyBeef.java @@ -0,0 +1,21 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemFood; + +public class ItemJerkyBeef extends ItemFood implements IBBName +{ + public ItemJerkyBeef() + { + super(4, 8.0f, true); + setUnlocalizedName("jerkyBeef"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "jerkyBeef"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyRaw.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyRaw.java new file mode 100644 index 0000000..2aa56a9 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemJerkyRaw.java @@ -0,0 +1,22 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemFood; + +public class ItemJerkyRaw extends ItemFood implements IBBName +{ + public ItemJerkyRaw() + { + super(0, 8.0f, true); + setUnlocalizedName("jerkyRaw"); + setCreativeTab(ModMain.tabBetterBeginnings); + setPotionEffect(17, 30, 1, 60); + } + + @Override + public String getName() + { + return "jerkyRaw"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnife.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnife.java new file mode 100644 index 0000000..bc8fd3f --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnife.java @@ -0,0 +1,104 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; + +import java.util.HashSet; +import java.util.Set; + +public abstract class ItemKnife extends ItemTool implements IBBName +{ + public static final float DAMAGE = 3.0f; + + public ItemKnife(ToolMaterial material) + { + super(DAMAGE, material, getBreakable()); + } + + public static Set getBreakable() + { + Set s = new HashSet<>(); + + // s.add(Blocks.log); + // s.add(Blocks.log2); + // s.add(Blocks.planks); + s.add(Blocks.pumpkin); + s.add(Blocks.lit_pumpkin); + s.add(Blocks.melon_block); + s.add(Blocks.clay); + s.add(Blocks.grass); + s.add(Blocks.mycelium); + s.add(Blocks.leaves); + s.add(Blocks.leaves2); + s.add(Blocks.brown_mushroom_block); + s.add(Blocks.red_mushroom_block); + s.add(Blocks.glass); + s.add(Blocks.glass_pane); + s.add(Blocks.soul_sand); + s.add(Blocks.stained_glass); + s.add(Blocks.stained_glass_pane); + s.add(Blocks.cactus); + + return s; + } + + // Determines if a block broken with the tool will drop its drops. + //@Override + //public boolean func_150897_b(Block block) + //{ + // if (block.getMaterial() == Material.rock && toolMaterial.getHarvestLevel() >= 0) + // { + // return true; + // } + // if (block.getMaterial() == Material.wood && toolMaterial.getHarvestLevel() >= 0) + // { + // return true; + // } + // + // return false; + //} + + //@Override + //public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack) + //{ + // return false; + //} + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) + { + return toolMaterial.getHarvestLevel(); + } + + @Override + public Set getToolClasses(ItemStack stack) + { + Set res = new HashSet<>(); + + res.add("knife"); + + return res; + } + + // ...which also requires this... + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + itemStack.setItemDamage(itemStack.getItemDamage() + 1); + + return itemStack; + } + + // Allows durability-based crafting. + @Override + public boolean hasContainerItem(ItemStack stack) + { + return true; + } + + @Override + public abstract String getName(); +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeBone.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeBone.java new file mode 100644 index 0000000..db59e64 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeBone.java @@ -0,0 +1,19 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; + +public class ItemKnifeBone extends ItemKnife +{ + public ItemKnifeBone() + { + super(ToolMaterial.STONE); + setUnlocalizedName("boneKnife"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "boneKnife"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeDiamond.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeDiamond.java new file mode 100644 index 0000000..22261fe --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeDiamond.java @@ -0,0 +1,19 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; + +public class ItemKnifeDiamond extends ItemKnife +{ + public ItemKnifeDiamond() + { + super(ToolMaterial.EMERALD); + setUnlocalizedName("diamondKnife"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "diamondKnife"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeFlint.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeFlint.java new file mode 100644 index 0000000..1798b10 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeFlint.java @@ -0,0 +1,19 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; + +public class ItemKnifeFlint extends ItemKnife +{ + public ItemKnifeFlint() + { + super(ToolMaterial.WOOD); + setUnlocalizedName("flintKnife"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "flintKnife"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeGold.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeGold.java new file mode 100644 index 0000000..3003dac --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeGold.java @@ -0,0 +1,19 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; + +public class ItemKnifeGold extends ItemKnife +{ + public ItemKnifeGold() + { + super(ToolMaterial.GOLD); + setUnlocalizedName("goldKnife"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "goldKnife"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeIron.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeIron.java new file mode 100644 index 0000000..8372abb --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemKnifeIron.java @@ -0,0 +1,19 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; + +public class ItemKnifeIron extends ItemKnife +{ + public ItemKnifeIron() + { + super(ToolMaterial.IRON); + setUnlocalizedName("ironKnife"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "ironKnife"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemLeatherStrip.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemLeatherStrip.java new file mode 100644 index 0000000..dc0336e --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemLeatherStrip.java @@ -0,0 +1,21 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemLeatherStrip extends Item implements IBBName +{ + public ItemLeatherStrip() + { + super(); + setUnlocalizedName("leatherStrip"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "leatherStrip"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallow.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallow.java new file mode 100644 index 0000000..6de1eb9 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallow.java @@ -0,0 +1,21 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemFood; + +public class ItemMarshmallow extends ItemFood implements IBBName +{ + public ItemMarshmallow() + { + super(1, 2.0f, false); + setUnlocalizedName("marshmallow"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "marshmallow"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallowCooked.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallowCooked.java new file mode 100644 index 0000000..a5b14cb --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemMarshmallowCooked.java @@ -0,0 +1,22 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemFood; + +public class ItemMarshmallowCooked extends ItemFood implements IBBName +{ + public ItemMarshmallowCooked() + { + super(5, 6.0f, false); + setUnlocalizedName("marshmallowCooked"); + setCreativeTab(ModMain.tabBetterBeginnings); + setPotionEffect(1, 15, 0, 0.8f); + } + + @Override + public String getName() + { + return "marshmallowCooked"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemNoobWoodSword.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemNoobWoodSword.java new file mode 100644 index 0000000..e634979 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemNoobWoodSword.java @@ -0,0 +1,23 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.ItemSword; + +//Replaces Vanilla Wood Sword +public class ItemNoobWoodSword extends ItemSword implements IBBName +{ + public ItemNoobWoodSword(ToolMaterial material) + { + super(material); + setUnlocalizedName("noobWoodSword"); + //setTextureName(ModMain.MODID + ":" + getUnlocalizedName().substring(5)); + //setMaxDamage(60); + //setCreativeTab(CreativeTabs.tabCombat); + } + + @Override + public String getName() + { + return "noobWoodSword"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemPan.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemPan.java new file mode 100644 index 0000000..c95ee6e --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemPan.java @@ -0,0 +1,24 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemPan extends Item implements IBBName +{ + public ItemPan() + { + super(); + setUnlocalizedName("pan"); + setMaxDamage(250); + setMaxStackSize(1); + //setTextureName(ModMain.MODID + ":" + getUnlocalizedName().substring(5)); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "pan"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStick.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStick.java new file mode 100644 index 0000000..46a37ba --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStick.java @@ -0,0 +1,40 @@ +package net.einsteinsci.betterbeginnings.items; + + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterItems; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemRoastingStick extends Item implements IBBName +{ + + public ItemRoastingStick() + { + setUnlocalizedName("roastingStick"); + //shouldRotateAroundWhenRendering(); + //setTextureName(ModMain.MODID + ":" + getUnlocalizedName().substring(5)); + setCreativeTab(ModMain.tabBetterBeginnings); + setMaxStackSize(5); + } + + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (player.inventory.hasItemStack(new ItemStack(RegisterItems.marshmallow))) + { + player.inventory.consumeInventoryItem(RegisterItems.marshmallow); + stack = new ItemStack(RegisterItems.roastingStickRawMallow); + } + player.inventoryContainer.detectAndSendChanges(); + return stack; + } + + @Override + public String getName() + { + return "roastingStick"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStickMallow.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStickMallow.java new file mode 100644 index 0000000..85af60a --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRoastingStickMallow.java @@ -0,0 +1,61 @@ +package net.einsteinsci.betterbeginnings.items; + + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.einsteinsci.betterbeginnings.register.RegisterItems; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemRoastingStickMallow extends Item implements IBBName +{ + boolean isCooked; + + public ItemRoastingStickMallow(boolean cooked) + { + if (cooked) + { + setUnlocalizedName("roastingStickCookedMallow"); + } + else + { + setUnlocalizedName("roastingStickRawMallow"); + } + isCooked = cooked; + setCreativeTab(ModMain.tabBetterBeginnings); + setMaxStackSize(1); + } + + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (isCooked) + { + player.inventory.addItemStackToInventory(new ItemStack(RegisterItems.marshmallowCooked)); + player.inventory.addItemStackToInventory(new ItemStack(RegisterItems.roastingStick)); + player.inventory.consumeInventoryItem(stack.getItem()); + } + else + { + player.inventory.addItemStackToInventory(new ItemStack(RegisterItems.marshmallow)); + player.inventory.addItemStackToInventory(new ItemStack(RegisterItems.roastingStick)); + player.inventory.consumeInventoryItem(stack.getItem()); + } + player.inventoryContainer.detectAndSendChanges(); + return stack; + } + + @Override + public String getName() + { + if (isCooked) + { + return "roastingStickCookedMallow"; + } + else + { + return "roastingStickRawMallow"; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRockHammer.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRockHammer.java new file mode 100644 index 0000000..776b29c --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemRockHammer.java @@ -0,0 +1,21 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; + + +public class ItemRockHammer extends ItemHammer implements IBBName +{ + public ItemRockHammer(ToolMaterial material) + { + super(material); + setUnlocalizedName("rockHammer"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "rockHammer"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemSilk.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemSilk.java new file mode 100644 index 0000000..00ed73d --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemSilk.java @@ -0,0 +1,23 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemSilk extends Item implements IBBName +{ + public ItemSilk() + { + super(); + + setUnlocalizedName("silk"); + + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "silk"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemTestItem.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemTestItem.java new file mode 100644 index 0000000..63f4b58 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemTestItem.java @@ -0,0 +1,39 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.*; +import net.minecraft.world.World; + +public class ItemTestItem extends Item implements IBBName +{ + public ItemTestItem() + { + super(); + setUnlocalizedName("testItem"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, + float hitX, float hitY, float hitZ) + { + Block tested = world.getBlockState(pos).getBlock(); + String blockName = tested.getUnlocalizedName().substring(5); + ChatComponentTranslation trans = new ChatComponentTranslation(blockName); + trans.appendText(" : " + world.getBlockState(pos).hashCode()); + player.addChatMessage(trans); + + return true; + } + + @Override + public String getName() + { + return "testItem"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemThread.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemThread.java new file mode 100644 index 0000000..5bc3a89 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemThread.java @@ -0,0 +1,21 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemThread extends Item implements IBBName +{ + public ItemThread() + { + super(); + setUnlocalizedName("thread"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "thread"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/items/ItemTwine.java b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemTwine.java new file mode 100644 index 0000000..02e2088 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/items/ItemTwine.java @@ -0,0 +1,22 @@ +package net.einsteinsci.betterbeginnings.items; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.register.IBBName; +import net.minecraft.item.Item; + +public class ItemTwine extends Item implements IBBName +{ + public ItemTwine() + { + super(); + + setUnlocalizedName("twine"); + setCreativeTab(ModMain.tabBetterBeginnings); + } + + @Override + public String getName() + { + return "twine"; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/network/ClientProxy.java b/src/main/java/net/einsteinsci/betterbeginnings/network/ClientProxy.java new file mode 100644 index 0000000..1ec6bf4 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/network/ClientProxy.java @@ -0,0 +1,42 @@ +package net.einsteinsci.betterbeginnings.network; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import org.apache.logging.log4j.Level; + +public class ClientProxy extends ServerProxy +{ + @Override + public void registerRenderThings() + { + //Campfire + //TileEntitySpecialRenderer render = new RenderCampfire(); + //ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCampfire.class, render); + } + + public void registerTileEntitySpecialRenderer() + { + + } + + @Override + public EntityPlayer getPlayerFromMessageContext(MessageContext ctx) + { + switch (ctx.side) + { + case CLIENT: + { + return Minecraft.getMinecraft().thePlayer; + } + case SERVER: + { + return ctx.getServerHandler().playerEntity; + } + default: + ModMain.Log(Level.ERROR, "Invalid side in TestMsgHandler: " + ctx.side); + } + return null; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/network/PacketNetherBrickOvenFuelLevel.java b/src/main/java/net/einsteinsci/betterbeginnings/network/PacketNetherBrickOvenFuelLevel.java new file mode 100644 index 0000000..5e166a3 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/network/PacketNetherBrickOvenFuelLevel.java @@ -0,0 +1,84 @@ +package net.einsteinsci.betterbeginnings.network; + +import io.netty.buffer.ByteBuf; +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.BlockPos; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.simpleimpl.*; + +/** + * Created by einsteinsci on 8/22/2014. + */ +public class PacketNetherBrickOvenFuelLevel implements IMessage +{ + BlockPos pos; + + FluidStack fluid; + + public static class PacketHandler implements IMessageHandler + { + @Override + public IMessage onMessage(PacketNetherBrickOvenFuelLevel message, MessageContext ctx) + { + EntityPlayer player = ModMain.proxy.getPlayerFromMessageContext(ctx); + + TileEntityNetherBrickOven oven = (TileEntityNetherBrickOven)player.worldObj.getTileEntity(message.pos); + oven.setFuelLevel(message.fluid); + + return null; + } + } + + public PacketNetherBrickOvenFuelLevel() + { + pos = new BlockPos(0, 0, 0); + + fluid = null; + } + + public PacketNetherBrickOvenFuelLevel(BlockPos loc, FluidStack fuel) + { + pos = loc; + + fluid = fuel; + } + + @Override + public void fromBytes(ByteBuf buf) + { + pos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); + + int fluidId = buf.readInt(); + int level = buf.readInt(); + + if (level != 0) + { + fluid = new FluidStack(fluidId, level); + } + else + { + fluid = null; + } + } + + @Override + public void toBytes(ByteBuf buf) + { + buf.writeInt(pos.getX()); + buf.writeInt(pos.getY()); + buf.writeInt(pos.getZ()); + + if (fluid != null) + { + buf.writeInt(fluid.getFluid().getID()); + buf.writeInt(fluid.amount); + } + else + { + buf.writeInt(0); + buf.writeInt(0); + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/network/ServerProxy.java b/src/main/java/net/einsteinsci/betterbeginnings/network/ServerProxy.java new file mode 100644 index 0000000..4e04019 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/network/ServerProxy.java @@ -0,0 +1,41 @@ +package net.einsteinsci.betterbeginnings.network; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.gui.BBGuiHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import org.apache.logging.log4j.Level; + +public class ServerProxy +{ + public void registerRenderThings() + { + + } + + public void registerTileEntitySpecialRenderer() + { + + } + + public void registerNetworkStuff() + { + NetworkRegistry.INSTANCE.registerGuiHandler(ModMain.modInstance, new BBGuiHandler()); + } + + public EntityPlayer getPlayerFromMessageContext(MessageContext ctx) + { + switch (ctx.side) + { + case CLIENT: + ModMain.Log(Level.ERROR, "Message for CLIENT received for dedicated server"); + return null; + case SERVER: + return ctx.getServerHandler().playerEntity; + default: + ModMain.Log(Level.ERROR, "Invalid side in RepairTableRepairPacket.Handler: " + ctx.side); + return null; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/IBBName.java b/src/main/java/net/einsteinsci/betterbeginnings/register/IBBName.java new file mode 100644 index 0000000..d77f275 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/IBBName.java @@ -0,0 +1,9 @@ +package net.einsteinsci.betterbeginnings.register; + +/** + * Created by einsteinsci on 4/4/2015. + */ +public interface IBBName +{ + public String getName(); +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/InfusionRepairUtil.java b/src/main/java/net/einsteinsci/betterbeginnings/register/InfusionRepairUtil.java new file mode 100644 index 0000000..f74b65b --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/InfusionRepairUtil.java @@ -0,0 +1,525 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.inventory.InventoryInfusionRepair; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.ArrayList; + +/** + * Created by einsteinsci on 8/20/2014. + */ +public class InfusionRepairUtil +{ + public static boolean canRepair(InventoryInfusionRepair repairTable, EntityPlayer player) + { + return canRepairIgnoreXp(repairTable) && player.experienceLevel >= getNeededLevels(repairTable); + } + + public static boolean canRepairIgnoreXp(InventoryInfusionRepair repairTable) + { + ArrayList requiredItems = getRequiredStacks(repairTable); + + if (repairTable.getStackInSlot(0) == null) + { + return false; + } + + if (!repairTable.getStackInSlot(0).isItemStackDamageable()) + { + return false; + } + + for (ItemStack needed : requiredItems) + { + boolean foundIt = false; + for (int j = 1; j < repairTable.getSizeInventory(); ++j) + { + if (repairTable.getStackInSlot(j) != null) + { + ItemStack tested = repairTable.getStackInSlot(j); + if (tested.getItem() == needed.getItem() && + (tested.getItemDamage() == needed.getItemDamage() || needed + .getItemDamage() == OreDictionary.WILDCARD_VALUE) && + tested.stackSize >= needed.stackSize) + { + foundIt = true; + break; + } + } + } + + if (!foundIt) + { + return false; + } + } + + return true; + } + + public static int getNeededLevels(InventoryInfusionRepair repairTable) + { + ItemStack infusedItem = repairTable.getStackInSlot(0); + + if (infusedItem == null) + { + return 0; + } + + if (infusedItem.getItem() instanceof ItemBow) + { + return 10; + } + + if (infusedItem.getItem() == RegisterItems.noobWoodSword) + { + return 1; + } + else if (infusedItem.getItem() == RegisterItems.flintKnife || infusedItem + .getItem() == RegisterItems.flintHatchet) + { + return 1; + } + else if (infusedItem.getItem() == RegisterItems.boneKnife) + { + return 5; + } + else if (infusedItem.getItem() == RegisterItems.bonePickaxe) + { + return 1; + } + else if (infusedItem.getItem() instanceof ItemTool) + { + ItemTool tool = (ItemTool)infusedItem.getItem(); + Item.ToolMaterial material = Item.ToolMaterial.valueOf(tool.getToolMaterialName()); + + switch (material) + { + case WOOD: + return 1; + case STONE: + return 5; + case IRON: + return 10; + case GOLD: + return 20; + case EMERALD: // See "WTF" below. + return 20; + default: + return 20; + } + } + else if (infusedItem.getItem() instanceof ItemSword) + { + ItemSword sword = (ItemSword)infusedItem.getItem(); + Item.ToolMaterial material = Item.ToolMaterial.valueOf(sword.getToolMaterialName()); + + switch (material) + { + case WOOD: + return 1; + case STONE: + return 5; + case IRON: + return 10; + case GOLD: + return 20; + case EMERALD: // See "WTF" below. + return 20; + default: + if (material == RegisterItems.NOOBWOOD) + { + return 1; + } + else + { + return 20; + } + } + } + else if (infusedItem.getItem() instanceof ItemArmor) + { + ItemArmor armor = (ItemArmor)infusedItem.getItem(); + + switch (armor.getArmorMaterial()) + { + case LEATHER: + return 1; + case CHAIN: + return 5; + case IRON: + return 10; + case GOLD: + return 20; + case DIAMOND: // WTF MOJANG?! (See above) + return 20; + default: + return 20; + } + } + else if (infusedItem.getItem() == Items.shears) + { + return 5; + } + else if (infusedItem.getItem() == Items.fishing_rod) + { + return 5; + } + else if (infusedItem.getItem() == Items.flint_and_steel) + { + return 1; + } + + return 0; + } + + public static ArrayList getRequiredStacks(InventoryInfusionRepair repairTable) + { + ArrayList requiredItems = new ArrayList(); + + ItemStack repaired = repairTable.getStackInSlot(0); + + if (repaired == null) + { + return requiredItems; + } + + if (!repaired.isItemDamaged()) + { + return requiredItems; + } + + if (repaired.getItem() instanceof ItemBow) + { + requiredItems.add(new ItemStack(Items.stick, 2)); + requiredItems.add(new ItemStack(Items.string, 2)); + } + + if (repaired.getItem() == RegisterItems.noobWoodSword) + { + requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE)); + } + else if (repaired.getItem() == RegisterItems.flintKnife || repaired.getItem() == RegisterItems.flintHatchet) + { + requiredItems.add(new ItemStack(Items.flint)); + } + else if (repaired.getItem() == RegisterItems.boneKnife) + { + requiredItems.add(new ItemStack(Items.bone)); + } + else if (repaired.getItem() == RegisterItems.bonePickaxe) + { + requiredItems.add(new ItemStack(RegisterItems.boneShard)); + } + else if (repaired.getItem() instanceof ItemTool) + { + ItemTool tool = (ItemTool)repaired.getItem(); + Item.ToolMaterial material = Item.ToolMaterial.valueOf(tool.getToolMaterialName()); + + switch (material) + { + case WOOD: + requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE)); + break; + case STONE: + requiredItems.add(new ItemStack(Blocks.stone, 1)); + break; + case IRON: + requiredItems.add(new ItemStack(Items.iron_ingot)); + break; + case GOLD: + requiredItems.add(new ItemStack(Items.gold_nugget, 2)); + break; + case EMERALD: // See "WTF" below. + requiredItems.add(new ItemStack(Items.redstone, 24)); + break; + default: + requiredItems.add(new ItemStack(Items.emerald, 4)); + break; + } + } + else if (repaired.getItem() instanceof ItemSword) + { + ItemSword sword = (ItemSword)repaired.getItem(); + Item.ToolMaterial material = Item.ToolMaterial.valueOf(sword.getToolMaterialName()); + + switch (material) + { + case WOOD: + requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE)); + break; + case STONE: + requiredItems.add(new ItemStack(Blocks.stone, 1)); + case IRON: + requiredItems.add(new ItemStack(Items.iron_ingot)); + break; + case GOLD: + requiredItems.add(new ItemStack(Items.gold_nugget, 2)); + break; + case EMERALD: // See "WTF" below. + requiredItems.add(new ItemStack(Items.redstone, 16)); + break; + default: + if (material == RegisterItems.NOOBWOOD) + { + requiredItems.add(new ItemStack(Blocks.planks, 1, OreDictionary.WILDCARD_VALUE)); + } + else + { + requiredItems.add(new ItemStack(Items.emerald, 4)); + } + break; + } + } + else if (repaired.getItem() instanceof ItemArmor) + { + ItemArmor armor = (ItemArmor)repaired.getItem(); + + switch (armor.getArmorMaterial()) + { + case LEATHER: + requiredItems.add(new ItemStack(Items.leather)); + break; + case CHAIN: + requiredItems.add(new ItemStack(RegisterItems.ironNugget)); + break; + case IRON: + requiredItems.add(new ItemStack(Items.iron_ingot)); + case GOLD: + requiredItems.add(new ItemStack(Items.gold_nugget, 2)); + case DIAMOND: // WTF MOJANG?! (See above) + requiredItems.add(new ItemStack(Items.redstone, 24)); + default: + requiredItems.add(new ItemStack(Items.emerald, 4)); + break; + } + } + else if (repaired.getItem() == Items.shears) + { + requiredItems.add(new ItemStack(Items.iron_ingot)); + } + else if (repaired.getItem() == Items.fishing_rod) + { + requiredItems.add(new ItemStack(Items.string, 4)); + } + else if (repaired.getItem() == Items.flint_and_steel) + { + requiredItems.add(new ItemStack(Items.flint)); + } + + if (repaired.isItemEnchanted()) + { + if (repaired.getTagCompound() != null) + { + if (repaired.getTagCompound().getTag("ench") != null) + { + NBTTagList enchants = (NBTTagList)repaired.getTagCompound().getTag("ench"); + for (int i = 0; i < enchants.tagCount(); i++) + { + NBTTagCompound enchant = enchants.getCompoundTagAt(i); + int enchId = enchant.getInteger("id"); + int level = enchant.getInteger("lvl"); + + switch (enchId) + { + case 0: // Protection + requiredItems.add(new ItemStack(Blocks.iron_bars, 2 * level)); + break; + case 1: // Fire Protection + requiredItems.add(new ItemStack(Items.bucket, level)); + break; + case 2: // Feather Falling + requiredItems.add(new ItemStack(Items.feather, 2 * level)); + break; + case 3: // Blast Protection + requiredItems.add(new ItemStack(Blocks.cobblestone, 8 * level)); + break; + case 4: // Projectile Protection + requiredItems.add(new ItemStack(Items.snowball, 4 * level)); + break; + case 5: // Respiration + requiredItems.add(new ItemStack(Items.glass_bottle, level)); + break; + case 6: // Aqua Affinity + requiredItems.add(new ItemStack(Blocks.clay, level)); + break; + case 7: // Thorns + requiredItems.add(new ItemStack(Blocks.cactus, 4 * level)); + break; + case 8: // Depth Strider + // requiredItems.add(new ItemStack(Blocks.prismarine, level)); + break; + case 16: // Sharpness + requiredItems.add(new ItemStack(Items.quartz, 4 * level)); + break; + case 17: // Smite + requiredItems.add(new ItemStack(Blocks.soul_sand, 2 * level)); + break; + case 18: // Anthropods + requiredItems.add(new ItemStack(Items.fermented_spider_eye, level)); + break; + case 19: // Knockback + requiredItems.add(new ItemStack(Blocks.piston, level)); + break; + case 20: // Fire Aspect + requiredItems.add(new ItemStack(Items.blaze_powder, 2 * level)); + break; + case 21: // Looting + requiredItems.add(new ItemStack(Items.gold_ingot, 2 * level)); + break; + case 32: // Efficiency + requiredItems.add(new ItemStack(Items.sugar, 4 * level)); + break; + case 33: // Silk Touch + requiredItems.add(new ItemStack(RegisterItems.cloth, 8 * level)); + break; + case 34: // Unbreaking + requiredItems.add(new ItemStack(Blocks.obsidian, level)); + break; + case 35: // Fortune + requiredItems.add(new ItemStack(Items.dye, 4 * level, 4)); + break; + case 48: // Power + requiredItems.add(new ItemStack(RegisterItems.leatherStrip, level)); + break; + case 49: // Punch + requiredItems.add(new ItemStack(Items.gunpowder, level)); + break; + case 50: // Flame + requiredItems.add(new ItemStack(Items.fire_charge, level)); + break; + case 51: // Infinity + requiredItems.add(new ItemStack(Items.arrow, 16 * level)); + break; + case 61: // Luck of the Sea + requiredItems.add(new ItemStack(Blocks.waterlily, level)); + break; + case 62: // Lure + requiredItems.add(new ItemStack(Items.fish, level, 3)); + break; + } + } + } + } + } + + return requiredItems; + } + + public static int getTakenLevels(InventoryInfusionRepair repairTable) + { + ItemStack infusedItem = repairTable.getStackInSlot(0); + + if (infusedItem == null) + { + return 0; + } + + if (infusedItem.getItem() == RegisterItems.noobWoodSword) + { + return 1; + } + else if (infusedItem.getItem() == RegisterItems.flintKnife || infusedItem + .getItem() == RegisterItems.flintHatchet) + { + return 1; + } + else if (infusedItem.getItem() == RegisterItems.boneKnife) + { + return 2; + } + else if (infusedItem.getItem() == RegisterItems.bonePickaxe) + { + return 1; + } + else if (infusedItem.getItem() instanceof ItemTool) + { + ItemTool tool = (ItemTool)infusedItem.getItem(); + Item.ToolMaterial material = Item.ToolMaterial.valueOf(tool.getToolMaterialName()); + + switch (material) + { + case WOOD: + return 1; + case STONE: + return 5; + case IRON: + return 5; + case GOLD: + return 3; + case EMERALD: // See "WTF" below. + return 8; + default: + return 8; + } + } + else if (infusedItem.getItem() instanceof ItemSword) + { + ItemSword sword = (ItemSword)infusedItem.getItem(); + Item.ToolMaterial material = Item.ToolMaterial.valueOf(sword.getToolMaterialName()); + + switch (material) + { + case WOOD: + return 1; + case STONE: + return 2; + case IRON: + return 5; + case GOLD: + return 3; + case EMERALD: // See "WTF" below. + return 8; + default: + if (material == RegisterItems.NOOBWOOD) + { + return 1; + } + else + { + return 8; + } + } + } + else if (infusedItem.getItem() instanceof ItemArmor) + { + ItemArmor armor = (ItemArmor)infusedItem.getItem(); + + switch (armor.getArmorMaterial()) + { + case LEATHER: + return 1; + case CHAIN: + return 2; + case IRON: + return 5; + case GOLD: + return 3; + case DIAMOND: // WTF MOJANG?! (See above) + return 8; + default: + return 8; + } + } + else if (infusedItem.getItem() == Items.shears) + { + return 2; + } + else if (infusedItem.getItem() == Items.fishing_rod) + { + return 2; + } + else if (infusedItem.getItem() == Items.flint_and_steel) + { + return 1; + } + + return 0; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterBlocks.java b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterBlocks.java new file mode 100644 index 0000000..195bfa3 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterBlocks.java @@ -0,0 +1,95 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.blocks.*; +import net.minecraft.block.Block; +import net.minecraftforge.oredict.OreDictionary; +import org.apache.logging.log4j.Level; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +public class RegisterBlocks +{ + public static final BlockKiln kiln = new BlockKiln(false); + public static final BlockKiln kilnLit = new BlockKiln(true); + public static final BlockDoubleWorkbench doubleWorkbench = new BlockDoubleWorkbench(); + public static final BlockBrickOven brickOven = new BlockBrickOven(false); + public static final BlockBrickOven brickOvenLit = new BlockBrickOven(true); + public static final BlockSmelter smelter = new BlockSmelter(false); + public static final BlockSmelter smelterLit = new BlockSmelter(true); + public static final BlockInfusionRepairStation infusionRepairStation = new BlockInfusionRepairStation(); + public static final BlockCampfire campfire = new BlockCampfire(false); + public static final BlockCampfire campfireLit = new BlockCampfire(true); + public static final BlockObsidianKiln obsidianKiln = new BlockObsidianKiln(false); + public static final BlockObsidianKiln obsidianKilnLit = new BlockObsidianKiln(true); + public static final BlockNetherBrickOven netherBrickOven = new BlockNetherBrickOven(false); + public static final BlockNetherBrickOven netherBrickOvenLit = new BlockNetherBrickOven(true); + public static final BlockEnderSmelter enderSmelter = new BlockEnderSmelter(false); + public static final BlockEnderSmelter enderSmelterLit = new BlockEnderSmelter(true); + + public static final List allBlocks = new ArrayList<>(); + + public static void register() + { + RegisterHelper.registerBlock(kiln); + RegisterHelper.registerBlock(kilnLit); + + RegisterHelper.registerBlock(doubleWorkbench); + + RegisterHelper.registerBlock(brickOven); + RegisterHelper.registerBlock(brickOvenLit); + + RegisterHelper.registerBlock(smelter); + RegisterHelper.registerBlock(smelterLit); + + RegisterHelper.registerBlock(infusionRepairStation); + + RegisterHelper.registerBlock(campfire); + RegisterHelper.registerBlock(campfireLit); + + RegisterHelper.registerBlock(obsidianKiln); + RegisterHelper.registerBlock(obsidianKilnLit); + + RegisterHelper.registerBlock(netherBrickOven); + RegisterHelper.registerBlock(netherBrickOvenLit); + + RegisterHelper.registerBlock(enderSmelter); + RegisterHelper.registerBlock(enderSmelterLit); + + oreDictionary(); + loadAllBlocks(); + } + + public static void oreDictionary() + { + OreDictionary.registerOre("craftingTableWood", doubleWorkbench); + } + + private static void loadAllBlocks() + { + List fields = new ArrayList<>(); + Field[] allFields = RegisterBlocks.class.getFields(); + for (Field f : allFields) + { + if (Block.class.isAssignableFrom(f.getType()) && + IBBName.class.isAssignableFrom(f.getType())) + { + fields.add(f); + } + } + + for (Field f : fields) + { + try + { + allBlocks.add((Block)f.get(null)); + } + catch (Exception e) + { + ModMain.Log(Level.ERROR, "Field " + f.getName() + " does not inherit from Block."); + } + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterHelper.java b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterHelper.java new file mode 100644 index 0000000..0325432 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterHelper.java @@ -0,0 +1,46 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.register.recipe.SmelterRecipeHandler; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.List; + +public class RegisterHelper +{ + public static void registerItem(T item) + { + GameRegistry.registerItem(item, item.getName()); + } + + public static void registerBlock(T block) + { + GameRegistry.registerBlock(block, block.getName()); + } + + public static void registerSmelterOreRecipe(String input, ItemStack output, float experience, int gravel, int bonus, + float chance) + { + for (ItemStack stack : OreDictionary.getOres(input)) + { + SmelterRecipeHandler.addRecipe(stack, output, experience, gravel, bonus, chance); + } + } + + public static void registerSmelterOreRecipe(String input, String output, float experience, int gravel, int bonus, + float chance) + { + for (ItemStack stack : OreDictionary.getOres(input)) + { + List valid = OreDictionary.getOres(output); + if (!valid.isEmpty()) + { + SmelterRecipeHandler.addRecipe(stack, OreDictionary.getOres(output).get(0), + experience, gravel, bonus, chance); + } + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterItems.java b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterItems.java new file mode 100644 index 0000000..668ce84 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterItems.java @@ -0,0 +1,155 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.items.*; +import net.einsteinsci.betterbeginnings.items.ItemCloth; +import net.minecraft.init.Items; +import net.minecraft.item.*; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraftforge.common.util.EnumHelper; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.OreDictionary; +import org.apache.logging.log4j.Level; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +public class RegisterItems +{ + public static final ToolMaterial NOOBWOOD = EnumHelper.addToolMaterial("NOOBWOOD", 0, 60, 2.0f, -4, 35); + public static final ItemNoobWoodSword noobWoodSword = new ItemNoobWoodSword(NOOBWOOD); + public static final ItemArmor.ArmorMaterial CLOTH = EnumHelper.addArmorMaterial( + "CLOTH", "CLOTH", 5, new int[] {1, 3, 2, 1}, 25); + public static final ItemClothArmor clothHat = new ItemClothArmor(CLOTH, 0, "clothHat"); + public static final ItemClothArmor clothShirt = new ItemClothArmor(CLOTH, 1, "clothShirt"); + public static final ItemClothArmor clothPants = new ItemClothArmor(CLOTH, 2, "clothPants"); + public static final ItemClothArmor clothBoots = new ItemClothArmor(CLOTH, 3, "clothBoots"); + public static final ItemKnife flintKnife = new ItemKnifeFlint(); + public static final ItemKnife boneKnife = new ItemKnifeBone(); + public static final ItemKnife ironKnife = new ItemKnifeIron(); + public static final ItemKnife diamondKnife = new ItemKnifeDiamond(); + public static final ItemKnife goldKnife = new ItemKnifeGold(); + public static final ItemFlintHatchet flintHatchet = new ItemFlintHatchet(); + public static final ItemBonePickaxe bonePickaxe = new ItemBonePickaxe(); + public static final ItemBoneShard boneShard = new ItemBoneShard(); + public static final ItemTestItem testItem = new ItemTestItem(); + public static final ItemSilk silk = new ItemSilk(); + public static final ItemThread thread = new ItemThread(); + public static final ItemCloth cloth = new ItemCloth(); + public static final ItemLeatherStrip leatherStrip = new ItemLeatherStrip(); + public static final ItemIronNugget ironNugget = new ItemIronNugget(); + public static final ItemCharredMeat charredMeat = new ItemCharredMeat(); + public static final ItemFireBow fireBow = new ItemFireBow(); + public static final ItemMarshmallow marshmallow = new ItemMarshmallow(); + public static final ItemMarshmallowCooked marshmallowCooked = new ItemMarshmallowCooked(); + public static final ItemRoastingStick roastingStick = new ItemRoastingStick(); + public static final ItemRoastingStickMallow roastingStickRawMallow = new ItemRoastingStickMallow(false); + public static final ItemRoastingStickMallow roastingStickCookedMallow = new ItemRoastingStickMallow(true); + public static final ItemTwine twine = new ItemTwine(); + public static final ItemRockHammer rockHammer = new ItemRockHammer(ToolMaterial.IRON); + public static final ItemPan pan = new ItemPan(); + + public static final List allItems = new ArrayList<>(); + + public static void register() + { + RegisterHelper.registerItem(flintKnife); + RegisterHelper.registerItem(boneKnife); + RegisterHelper.registerItem(ironKnife); + RegisterHelper.registerItem(goldKnife); + RegisterHelper.registerItem(diamondKnife); + + RegisterHelper.registerItem(flintHatchet); + RegisterHelper.registerItem(bonePickaxe); + + RegisterHelper.registerItem(boneShard); + RegisterHelper.registerItem(testItem); + RegisterHelper.registerItem(silk); + RegisterHelper.registerItem(thread); + RegisterHelper.registerItem(cloth); + RegisterHelper.registerItem(twine); + RegisterHelper.registerItem(leatherStrip); + RegisterHelper.registerItem(ironNugget); + RegisterHelper.registerItem(charredMeat); + RegisterHelper.registerItem(fireBow); + RegisterHelper.registerItem(rockHammer); + RegisterHelper.registerItem(pan); + + RegisterHelper.registerItem(marshmallow); + RegisterHelper.registerItem(roastingStick); + RegisterHelper.registerItem(marshmallowCooked); + RegisterHelper.registerItem(roastingStickCookedMallow); + RegisterHelper.registerItem(roastingStickRawMallow); + + RegisterHelper.registerItem(clothHat); + RegisterHelper.registerItem(clothShirt); + RegisterHelper.registerItem(clothPants); + RegisterHelper.registerItem(clothBoots); + + RegisterHelper.registerItem(noobWoodSword); + + oreDictRegistry(); + loadAllItems(); + } + + public static void oreDictRegistry() + { + OreDictionary.registerOre("nuggetIron", ironNugget); + OreDictionary.registerOre("itemKnife", new ItemStack(flintKnife, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("itemKnife", new ItemStack(boneKnife, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("itemKnife", new ItemStack(ironKnife, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("itemKnife", new ItemStack(goldKnife, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("itemKnife", new ItemStack(diamondKnife, 1, OreDictionary.WILDCARD_VALUE)); + + OreDictionary.registerOre("itemString", new ItemStack(Items.string)); + OreDictionary.registerOre("itemString", new ItemStack(thread)); + OreDictionary.registerOre("itemString", new ItemStack(twine)); + } + + private static void loadAllItems() + { + List fields = new ArrayList<>(); + Field[] allFields = RegisterItems.class.getFields(); + for (Field f : allFields) + { + if (Item.class.isAssignableFrom(f.getType()) && + IBBName.class.isAssignableFrom(f.getType())) + { + fields.add(f); + } + } + + for (Field f : fields) + { + try + { + allItems.add((Item)f.get(null)); + } + catch (Exception e) + { + ModMain.Log(Level.ERROR, "Field " + f.getName() + " does not inherit from Item."); + } + } + } + + public static void tweakVanilla() + { + ((ItemFood)GameRegistry.findItem("minecraft", "beef")).setPotionEffect(17, 20, 0, 20); + ((ItemFood)GameRegistry.findItem("minecraft", "porkchop")).setPotionEffect(17, 25, 0, 25); + ((ItemFood)GameRegistry.findItem("minecraft", "fish")).setPotionEffect(17, 30, 1, 60); // Both fish types here + ((ItemFood)GameRegistry.findItem("minecraft", "mutton")).setPotionEffect(17, 20, 0, 25); + ((ItemFood)GameRegistry.findItem("minecraft", "rabbit")).setPotionEffect(17, 25, 0, 30); + + // Let's face it, the vanilla stack sizes for these suck. + GameRegistry.findItem("minecraft", "minecart").setMaxStackSize(16); + // Strangely enough the oak one doesn't change. + GameRegistry.findItem("minecraft", "wooden_door").setMaxStackSize(16); + GameRegistry.findItem("minecraft", "spruce_door").setMaxStackSize(16); + GameRegistry.findItem("minecraft", "birch_door").setMaxStackSize(16); + GameRegistry.findItem("minecraft", "acacia_door").setMaxStackSize(16); + GameRegistry.findItem("minecraft", "dark_oak_door").setMaxStackSize(16); + GameRegistry.findItem("minecraft", "iron_door").setMaxStackSize(16); + GameRegistry.findItem("minecraft", "potion").setMaxStackSize(16); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterModels.java b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterModels.java new file mode 100644 index 0000000..fb40ef8 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterModels.java @@ -0,0 +1,41 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.item.Item; + +public class RegisterModels +{ + public static void register() + { + RenderItem renderItem = Minecraft.getMinecraft().getRenderItem(); + + // blocks + for (Block b : RegisterBlocks.allBlocks) + { + registerBlock((BBBlock)b); + } + + // items + for (Item i : RegisterItems.allItems) + { + registerItem((BBItem)i); + } + } + + public static void registerBlock(BBBlock block) + { + Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( + Item.getItemFromBlock(block), 0, new ModelResourceLocation( + ModMain.MODID + ":" + block.getName(), "inventory")); + } + + public static void registerItem(BBItem item) + { + Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register( + item, 0, new ModelResourceLocation(ModMain.MODID + ":" + item.getName(), "inventory")); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterRecipes.java b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterRecipes.java new file mode 100644 index 0000000..aa51545 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterRecipes.java @@ -0,0 +1,832 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.config.BBConfig; +import net.einsteinsci.betterbeginnings.register.recipe.*; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.*; + +public class RegisterRecipes +{ + public static void addShapelessRecipes() + { + // Sticks from Saplings & Knife + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(Items.stick), "treeSapling", "itemKnife")); + + // Bone Shard + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(RegisterItems.boneShard, 2), + Items.bone, "itemKnife")); + + // Leather Strip + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(RegisterItems.leatherStrip, 3), + Items.leather, "itemKnife")); + + // Bonemeal from Bone Shard (a bit more rewarding) + GameRegistry.addShapelessRecipe(new ItemStack(Items.dye, 2, 15), RegisterItems.boneShard); + + // Iron Nugget + GameRegistry.addShapelessRecipe(new ItemStack(RegisterItems.ironNugget, 9), Items.iron_ingot); + + // String + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(Items.string, 4), + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE), + "itemKnife")); + + // Twine + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(RegisterItems.twine, 2), Blocks.vine, "itemKnife")); + } + + public static void addFurnaceRecipes() + { + addKilnRecipes(); + addBrickOvenRecipes(); + addSmelterRecipes(); + addCampfireRecipes(); + } + + private static void addKilnRecipes() + { + KilnRecipes.addRecipe(Items.clay_ball, new ItemStack(Items.brick), 0.35f); + KilnRecipes.addRecipe(Blocks.clay, new ItemStack(Blocks.hardened_clay), 0.1f); + KilnRecipes.addRecipe(Blocks.cobblestone, new ItemStack(Blocks.stone), 0.1f); + KilnRecipes.addRecipe(Blocks.cactus, new ItemStack(Items.dye, 1, 2), 0.1f); + KilnRecipes.addRecipe(Blocks.log, new ItemStack(Items.coal, 1, 1), 0.15f); + KilnRecipes.addRecipe(Blocks.log2, new ItemStack(Items.coal, 1, 1), 0.15f); + KilnRecipes.addRecipe(Blocks.sand, new ItemStack(Blocks.glass), 0.1f); + KilnRecipes.addRecipe(Items.beef, new ItemStack(RegisterItems.charredMeat), 0.1f); + KilnRecipes.addRecipe(Items.porkchop, new ItemStack(RegisterItems.charredMeat), 0.1f); + KilnRecipes.addRecipe(Items.chicken, new ItemStack(RegisterItems.charredMeat), 0.1f); + KilnRecipes.addRecipe(new ItemStack(Items.fish, 1, 0), new ItemStack(RegisterItems.charredMeat), 0.1f); + KilnRecipes.addRecipe(new ItemStack(Items.fish, 1, 1), new ItemStack(RegisterItems.charredMeat), 0.1f); + } + + private static void addBrickOvenRecipes() + { + BrickOvenRecipeHandler.addShapedRecipe(new ItemStack(Items.golden_apple), "GGG", "GAG", "GGG", 'G', + Items.gold_ingot, 'A', Items.apple); + BrickOvenRecipeHandler.addShapedRecipe(new ItemStack(Items.golden_apple, 1, 1), "###", "#A#", "###", '#', + Blocks.gold_block, 'A', Items.apple); + BrickOvenRecipeHandler.addShapedRecipe(new ItemStack(Items.golden_carrot), "***", "*C*", "***", '*', + Items.gold_nugget, 'C', Items.carrot); + BrickOvenRecipeHandler.addShapedRecipe(new ItemStack(Items.cake), "MMM", "SES", "WWW", 'M', Items.milk_bucket, + 'S', Items.sugar, 'E', Items.egg, 'W', Items.wheat); + BrickOvenRecipeHandler.addShapedRecipe(new ItemStack(Items.bread, 2), "WWW", 'W', Items.wheat); + BrickOvenRecipeHandler.addShapedRecipe(new ItemStack(Items.cookie, 8), "WCW", 'W', Items.wheat, 'C', + new ItemStack(Items.dye, 1, 3)); // Cocoa bean + + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.mushroom_stew), Blocks.brown_mushroom, + Blocks.red_mushroom, Items.bowl); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.cooked_beef), Items.beef); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.cooked_porkchop), Items.porkchop); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.cooked_chicken), Items.chicken); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.cooked_fish), Items.fish); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.cooked_fish, 1, 1), new ItemStack(Items.fish, + 1, 1)); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.baked_potato), Items.potato); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.pumpkin_pie), Items.egg, Items.sugar, + Blocks.pumpkin); + BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(Items.fermented_spider_eye), Items.spider_eye, + Items.sugar, Blocks.brown_mushroom); + BrickOvenRecipeHandler + .addShapelessRecipe(new ItemStack(Items.magma_cream), Items.slime_ball, Items.blaze_powder); + //BrickOvenRecipeHandler.addShapelessRecipe(new ItemStack(RegisterItems.roastingStickCookedMallow), RegisterItems.roastingStickRawMallow); + } + + private static void addSmelterRecipes() + { + // Vanilla Ore Recipes (keep the result vanilla to prevent weirdness) + RegisterHelper.registerSmelterOreRecipe("oreIron", new ItemStack(Items.iron_ingot), 0.7f, 1, 1, 0.3f); + RegisterHelper.registerSmelterOreRecipe("oreGold", new ItemStack(Items.gold_ingot), 1.0f, 2, 1, 0.2f); + + // Modded Ore Recipes + RegisterHelper.registerSmelterOreRecipe("oreCopper", "ingotCopper", 0.6f, 1, 1, 0.3f); + RegisterHelper.registerSmelterOreRecipe("oreTin", "ingotTin", 0.6f, 1, 1, 0.2f); + RegisterHelper.registerSmelterOreRecipe("oreAluminum", "ingotAluminum", 0.8f, 1, 1, 0.2f); + RegisterHelper.registerSmelterOreRecipe("oreSilver", "ingotSilver", 1.0f, 1, 1, 0.2f); + RegisterHelper.registerSmelterOreRecipe("oreLead", "ingotLead", 0.6f, 1, 1, 0.3f); + + // Recipes that might be better suited in Kiln only + if (BBConfig.canSmelterDoKilnStuff) + { + SmelterRecipeHandler + .addRecipe(new ItemStack(Blocks.sand, 1, 0), new ItemStack(Blocks.glass), 0.1f, 1, 0, 0.0f); + SmelterRecipeHandler + .addRecipe(new ItemStack(Blocks.sand, 1, 1), new ItemStack(Blocks.stained_glass, 1, 1), + 0.1f, 1, 0, 0.0f); // Red sand makes orange stained glass. + SmelterRecipeHandler.addRecipe(Blocks.netherrack, new ItemStack(Items.netherbrick), 0.25f, 1, 1, 0.25f); + SmelterRecipeHandler.addRecipe(Blocks.stonebrick, new ItemStack(Blocks.stonebrick, 1, 2), 0.1f, 1, 0, 0.0f); + + RegisterHelper.registerSmelterOreRecipe("cobblestone", new ItemStack(Blocks.stone), 0.1f, 0, 0, 0.0f); + SmelterRecipeHandler.addRecipe(Items.clay_ball, new ItemStack(Items.brick), 0.3f, 0, 0, 0.0f); + SmelterRecipeHandler.addRecipe(Blocks.clay, new ItemStack(Blocks.hardened_clay), 0.35f, 0, 0, 0.0f); + } + + // Silk touch recipes + RegisterHelper.registerSmelterOreRecipe("oreCoal", new ItemStack(Items.coal, 1), 0.25f, 2, 2, 0.8f); + RegisterHelper.registerSmelterOreRecipe("oreQuartz", new ItemStack(Items.quartz, 2), 0.4f, 2, 4, 0.6f); + RegisterHelper.registerSmelterOreRecipe("oreLapis", new ItemStack(Items.dye, 8, 4), 0.5f, 2, 8, 0.8f); + RegisterHelper.registerSmelterOreRecipe("oreRedstone", new ItemStack(Items.redstone, 4), 0.8f, 2, 4, 0.6f); + RegisterHelper.registerSmelterOreRecipe("oreDiamond", new ItemStack(Items.diamond, 1), 1.0f, 3, 2, 0.3f); + RegisterHelper.registerSmelterOreRecipe("oreEmerald", new ItemStack(Items.emerald, 1), 1.0f, 3, 2, 0.5f); + + // Silk touch recipes (modded) + } + + private static void addCampfireRecipes() + { + CampfireRecipes.addRecipe(RegisterItems.roastingStickRawMallow, + new ItemStack(RegisterItems.roastingStickCookedMallow), 0.5f); + CampfireRecipes.addRecipe(Blocks.log, new ItemStack(Items.coal, 1, 1), 0.15f); + CampfireRecipes.addRecipe(Blocks.log2, new ItemStack(Items.coal, 1, 1), 0.15f); + CampfireRecipes.addRecipe(Items.beef, new ItemStack(RegisterItems.charredMeat), 0.1f); + CampfireRecipes.addRecipe(Items.porkchop, new ItemStack(RegisterItems.charredMeat), 0.1f); + CampfireRecipes.addRecipe(Items.chicken, new ItemStack(RegisterItems.charredMeat), 0.1f); + CampfireRecipes.addRecipe(new ItemStack(Items.fish, 1, 0), new ItemStack(RegisterItems.charredMeat), 0.1f); + CampfireRecipes.addRecipe(new ItemStack(Items.fish, 1, 1), new ItemStack(RegisterItems.charredMeat), 0.1f); + + if (BBConfig.canCampfireDoAllKilnStuff) + { + CampfireRecipes.addRecipe(Items.clay_ball, new ItemStack(Items.brick), 0.35f); + CampfireRecipes.addRecipe(Blocks.clay, new ItemStack(Blocks.hardened_clay), 0.1f); + CampfireRecipes.addRecipe(Blocks.cobblestone, new ItemStack(Blocks.stone), 0.1f); + CampfireRecipes.addRecipe(Blocks.sand, new ItemStack(Blocks.glass), 0.1f); + } + + CampfirePanRecipes.addRecipe(Items.beef, new ItemStack(Items.cooked_beef), 0.1f); + CampfirePanRecipes.addRecipe(Items.porkchop, new ItemStack(Items.cooked_porkchop), 0.1f); + CampfirePanRecipes.addRecipe(Items.chicken, new ItemStack(Items.cooked_chicken), 0.1f); + CampfirePanRecipes.addRecipe(new ItemStack(Items.fish, 1, 0), new ItemStack(Items.cooked_fish, 1, 0), 0.1f); + CampfirePanRecipes.addRecipe(new ItemStack(Items.fish, 1, 1), new ItemStack(Items.cooked_fish, 1, 1), 0.1f); + } + + public static void addAdvancedRecipes() + { + if (BBConfig.advancedCraftingForLotsOfThings) + { + // Wooden Door + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.oak_door), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "##", "##", "##", + '#', "plankWood"); + // Iron Door + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_door), + new Object[] {"nuggetIron", 2}, + "II", "II", "II", + 'I', "ingotIron"); + // Fence Gate + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.oak_fence_gate), + new Object[] {"itemString", 4, + new ItemStack(RegisterItems.leatherStrip, 4)}, + "/#/", + "/#/", + '/', "stickWood", + '#', "plankWood"); + // Trapdoor + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.trapdoor), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "###", "###", + '#', "plankWood"); + // Chest. Yep, you need iron before you can make a chest. If you absolutely must store stuff before you have + // iron, use your kiln (provided it isn't kiln-able ;D). + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.chest), + new Object[] {"nuggetIron", 3, + new ItemStack(RegisterItems.leatherStrip, 1)}, + "###", + "# #", + "###", + '#', "plankWood"); + // Trapped Chest + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.trapped_chest), + new Object[] {new ItemStack(RegisterItems.thread, 2), + "dustRedstone", 2}, + "C", "H", + 'C', Blocks.chest, + 'H', Blocks.tripwire_hook); + // Tripwire Hook + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.tripwire_hook), + new Object[] {new ItemStack(RegisterItems.thread, + 1), // Must be thread + "dustRedstone", 1}, + "I", "/", "#", + 'I', "ingotIron", + '/', "stickWood", + '#', "plankWood"); + // Piston + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.piston), + new Object[] {"nuggetIron", 2}, + "###", "CIC", "CRC", + '#', "plankWood", + 'I', "ingotIron", + 'C', "cobblestone", + 'R', "dustRedstone"); + // Dispenser + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.dispenser), + new Object[] {"nuggetIron", 2}, + "###", "#B#", "#R#", + '#', "cobblestone", + 'B', new ItemStack(Items.bow, 1, 0), + 'R', "dustRedstone"); + // Note Block + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.noteblock), + new Object[] {"itemString", 2}, + "###", "#R#", "###", + '#', "plankWood", + 'R', "dustRedstone"); + // Gold Rail + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.golden_rail, 6), + new Object[] {"nuggetGold", 2}, + "G G", "G/G", "GRG", + 'G', "ingotGold", + '/', "stickWood", + 'R', "dustRedstone"); + // Detector Rail + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.detector_rail, 6), + new Object[] {"nuggetIron", 2, "stickWood", 4}, + "I I", "I_I", "IRI", + 'I', "ingotIron", + '_', Blocks.stone_pressure_plate, + 'R', "dustRedstone"); + // TNT + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.tnt, 2), + new Object[] {"itemString", 3}, + "G#G", "#G#", "G#G", + 'G', Items.gunpowder, + '#', Blocks.sand); + // Bookshelf + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.bookshelf), + new Object[] {"nuggetIron", 1}, + "###", "BBB", "###", + '#', "plankWood", + 'B', Items.book); + // Ladder + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.ladder, 4), + new Object[] {"itemString", 1}, + "/ /", "///", "/ /", + '/', "stickWood"); + // Rail + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.rail, 16), + new Object[] {"nuggetIron", 1}, + "I I", "I/I", "I I", + 'I', "ingotIron", + '/', "stickWood"); + // Enchanting Table + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.enchanting_table), + new Object[] {new ItemStack(Items.leather), + "dyeRed", 1, "dyeBlue", 1}, + " B ", "D#D", "###", + 'B', Items.book, + 'D', "gemDiamond", + '#', Blocks.obsidian); + // Beacon + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.beacon), + new Object[] {"blockDiamond", 1, + new ItemStack(Items.blaze_rod, 4), + new ItemStack(Items.potionitem, 1, 16)}, //Awkward potion + "+++", "+S+", "###", + '+', "blockGlassColorless", + 'S', Items.nether_star, + '#', Blocks.obsidian); + // Anvil + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.anvil), new Object[] {"nuggetIron", 4}, + "###", " I ", "III", + '#', "blockIron", + 'I', "ingotIron"); + // Hopper + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.hopper, 4), new Object[] {"nuggetIron", 2, + new ItemStack(Blocks.stone_pressure_plate, 1)}, + "I I", "I#I", " I ", + 'I', "ingotIron", + '#', Blocks.chest); + // Activator Rail + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.activator_rail, 6), + new Object[] {"nuggetIron", 4}, + "I/I", "IiI", "I/I", + 'I', "ingotIron", + '/', "stickWood", + 'i', Blocks.redstone_torch); + // Dropper + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Blocks.dropper), + new Object[] {"nuggetIron", 2}, + "###", "# #", "#R#", + '#', "cobblestone", + 'R', "dustRedstone"); + // Minecart + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.minecart), + new Object[] {"nuggetIron", 2, + new ItemStack(RegisterItems.leatherStrip, 1)}, + "I I", "III", + 'I', "ingotIron"); + // Compass + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.compass), + new Object[] {"nuggetIron", 3, + new ItemStack(Items.potionitem, 1, 0)}, //Water Bottle + " I ", "IRI", " I ", + 'I', "ingotIron", + 'R', "dustRedstone"); + // Clock + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.clock), + new Object[] {"nuggetGold", 3, "dyeBlack", 1}, + " G ", "GRG", " G ", + 'G', "ingotGold", + 'R', "dustRedstone"); + // Bed + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.bed), new Object[] {"nuggetIron", 2}, + "***", "###", + '*', new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE), + '#', "plankWood"); + // Brewing Stand + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.brewing_stand), + new Object[] {"nuggetGold", 1, "nuggetIron", 3}, + " / ", "###", + '/', Items.blaze_rod, + '#', "cobblestone"); + // Cauldron + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.cauldron), new Object[] {"nuggetIron", 3}, + "I I", "I I", "III", + 'I', "ingotIron"); + } + + // Bow + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.bow), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 3)}, + " /s", "/ s", " /s", + 's', "itemString", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.bow), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 3)}, + "s/ ", "s /", "s/ ", + 's', "itemString", + '/', "stickWood"); + + // Fishing rod + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.fishing_rod), + new Object[] {new ItemStack(RegisterItems.ironNugget)}, + " /", " /s", "/ s", + '/', "stickWood", + 's', "itemString"); + + // Bone Pickaxe + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.bonePickaxe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "sBs", " / ", " / ", + 's', RegisterItems.boneShard, + 'B', Items.bone, + '/', "stickWood"); + + // Leather armor + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.leather_helmet), + new Object[] {"itemString", 3, + new ItemStack(Blocks.wool, 2, OreDictionary.WILDCARD_VALUE)}, + "LLL", + "L L", + 'L', Items.leather); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.leather_chestplate), + new Object[] {"itemString", 2, + new ItemStack(Blocks.wool, 4, OreDictionary.WILDCARD_VALUE)}, + "L L", + "LLL", + "LLL", + 'L', Items.leather); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.leather_leggings), + new Object[] {"itemString", 4, + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE)}, + "LLL", + "L L", + "L L", + 'L', Items.leather); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.leather_boots), + new Object[] {"itemString", 4, + new ItemStack(Blocks.wool, 3, OreDictionary.WILDCARD_VALUE)}, + "L L", "L L", + 'L', Items.leather); + + // Stone Tools/Weapons + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.stone_pickaxe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "###", " / ", " / ", + '#', "stone", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.stone_sword), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "#", "#", "/", + '#', "stone", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.stone_shovel), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "#", "/", "/", + '#', "stone", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.stone_axe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "##", "#/", " /", + '#', "stone", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.stone_axe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "##", "/#", "/ ", + '#', "stone", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.stone_hoe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "##", " /", " /", + '#', "stone", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.stone_hoe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "##", "/ ", "/ ", + '#', "stone", + '/', "stickWood"); + + // Iron armor + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_helmet), + new Object[] {"nuggetIron", 2, + new ItemStack(RegisterItems.leatherStrip, 3), + new ItemStack(Blocks.wool, 2, OreDictionary.WILDCARD_VALUE)}, + "III", "I I", + 'I', "ingotIron"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_chestplate), + new Object[] {"nuggetIron", 6, + new ItemStack(RegisterItems.leatherStrip, 2), + new ItemStack(Blocks.wool, 4, OreDictionary.WILDCARD_VALUE)}, + "I I", "III", "III", + 'I', "ingotIron"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_leggings), + new Object[] {"nuggetIron", 4, + new ItemStack(RegisterItems.leatherStrip, 4), + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE)}, + "III", "I I", "I I", + 'I', "ingotIron"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_boots), + new Object[] {"nuggetIron", 3, + new ItemStack(RegisterItems.leatherStrip, 2), + new ItemStack(Blocks.wool, 3, OreDictionary.WILDCARD_VALUE)}, + "I I", "I I", + 'I', "ingotIron"); + + // Iron Tools/Weapons + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_pickaxe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 3)}, + "III", " / ", " / ", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_sword), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "I", "I", "/", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_shovel), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "I", "/", "/", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_axe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "II", "I/", " /", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_axe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "II", "/I", "/ ", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_hoe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "II", " /", " /", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.iron_hoe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "II", "/ ", "/ ", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.ironKnife), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + " I", "/ ", + 'I', "ingotIron", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.ironKnife), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "I ", " /", + 'I', "ingotIron", + '/', "stickWood"); + //Gold armor + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_helmet), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 3), + "nuggetGold", 2, + new ItemStack(Blocks.wool, 2, OreDictionary.WILDCARD_VALUE)}, + "III", "I I", + 'I', "ingotGold"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_chestplate), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2), + "nuggetGold", 6, + new ItemStack(Blocks.wool, 4, OreDictionary.WILDCARD_VALUE)}, + "I I", + "III", + "III", + 'I', "ingotGold"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_leggings), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 4), + "nuggetGold", 4, + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE)}, + "III", + "I I", + "I I", + 'I', "ingotGold"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_boots), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2), + "nuggetGold", 3, + new ItemStack(Blocks.wool, 3, OreDictionary.WILDCARD_VALUE)}, + "I I", "I I", + 'I', "ingotGold"); + + + //Gold Weapons/Tools + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_pickaxe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 3)}, + "III", " / ", " / ", + 'I', "ingotGold", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_sword), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "I", "I", "/", + 'I', "ingotGold", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_shovel), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "I", "/", "/", + 'I', "ingotGold", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_axe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "II", "I/", " /", + 'I', "ingotGold", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_axe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "II", "/I", "/ ", + 'I', "ingotGold", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_hoe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "II", " /", " /", + 'I', Items.gold_ingot, + '/', Items.stick); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.golden_hoe), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 1)}, + "II", "/ ", "/ ", + 'I', "ingotGold", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.goldKnife), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + " I", "/ ", + 'I', "ingotGold", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.goldKnife), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2)}, + "I ", " /", + 'I', "ingotGold", + '/', "stickWood"); + + // Diamond armor + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_helmet), + new Object[] {"dustRedstone", 3, + new ItemStack(Items.blaze_powder, 2), + new ItemStack(RegisterItems.leatherStrip, 3), + new ItemStack(Blocks.wool, 2, OreDictionary.WILDCARD_VALUE)}, + "DDD", "D D", + 'D', "gemDiamond"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_chestplate), + new Object[] {"dustRedstone", 4, + new ItemStack(Items.blaze_powder, 6), + new ItemStack(RegisterItems.leatherStrip, 2), + new ItemStack(Blocks.wool, 4, OreDictionary.WILDCARD_VALUE)}, + "D D", "DDD", "DDD", + 'D', "gemDiamond"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_leggings), + new Object[] {"dustRedstone", 4, + new ItemStack(Items.blaze_powder, 3), + new ItemStack(RegisterItems.leatherStrip, 4), + new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE)}, + "DDD", "D D", "D D", + 'D', "gemDiamond"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_boots), + new Object[] {"dustRedstone", 3, + new ItemStack(Items.blaze_powder, 3), + new ItemStack(RegisterItems.leatherStrip, 2), + new ItemStack(Blocks.wool, 3, OreDictionary.WILDCARD_VALUE)}, + "D D", "D D", + 'D', "gemDiamond"); + + // Diamond Tools/Weapons + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_pickaxe), + new Object[] {"dustRedstone", 5, + new ItemStack(RegisterItems.leatherStrip, 3)}, + "DDD", " / ", " / ", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_sword), + new Object[] {"dustRedstone", 4, + new ItemStack(Items.blaze_powder, 5), + new ItemStack(RegisterItems.leatherStrip, 2)}, + "D", "D", "/", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_shovel), + new Object[] {"dustRedstone", 2, + new ItemStack(Items.blaze_powder, 1), + new ItemStack(RegisterItems.leatherStrip, 2)}, + "D", "/", "/", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_axe), + new Object[] {"dustRedstone", 3, + new ItemStack(Items.blaze_powder, 2), + new ItemStack(RegisterItems.leatherStrip, 2)}, + "DD", "D/", " /", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_axe), + new Object[] {"dustRedstone", 3, + new ItemStack(Items.blaze_powder, 2), + new ItemStack(RegisterItems.leatherStrip, 2)}, + "DD", "/D", "/ ", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_hoe), + new Object[] {"dustRedstone", 1, + new ItemStack(Items.blaze_powder, 1), + new ItemStack(RegisterItems.leatherStrip, 1)}, + "DD", " /", " /", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(Items.diamond_hoe), + new Object[] {"dustRedstone", 1, + new ItemStack(Items.blaze_powder, 1), + new ItemStack(RegisterItems.leatherStrip, 1)}, + "DD", "/ ", "/ ", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.diamondKnife), + new Object[] {"dustRedstone", 3, + new ItemStack(Items.blaze_powder, 3), + new ItemStack(RegisterItems.leatherStrip, 1)}, + " D", "/ ", + 'D', "gemDiamond", + '/', "stickWood"); + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.diamondKnife), + new Object[] {"dustRedstone", 3, + new ItemStack(Items.blaze_powder, 3), + new ItemStack(RegisterItems.leatherStrip, 1)}, + "D ", " /", + 'D', "gemDiamond", + '/', "stickWood"); + + // Repair Infusion Station + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterBlocks.infusionRepairStation), + new Object[] {"dustRedstone", 32, "dyeBlue", 32, + new ItemStack(Items.blaze_powder, 16)}, + "DID", "OSO", "OOO", + 'D', "gemDiamond", + 'I', "blockIron", + 'S', Blocks.bookshelf, + 'O', Blocks.obsidian); + + // Obsidian Kiln + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterBlocks.obsidianKiln), + new Object[] {"dustRedstone", 16}, + "ROR", "OKO", "ROR", + 'R', "dustRedstone", + 'O', Blocks.obsidian, + 'K', RegisterBlocks.kiln); + + // Nether Brick Oven + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterBlocks.netherBrickOven), + new Object[] {new ItemStack(Items.blaze_powder, 4), + new ItemStack(Blocks.obsidian, 1)}, + "NNN", "NBN", "NGN", + 'N', Blocks.nether_brick, + 'G', "blockGlassColorless", + 'B', RegisterBlocks.brickOven); + + // Ender Smelter + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterBlocks.enderSmelter), + new Object[] {new ItemStack(Items.ender_pearl, 4), "nuggetIron", 4}, + "#E#", "#S#", "#E#", + '#', Blocks.end_stone, + 'S', RegisterBlocks.smelter, + 'E', Items.ender_eye); + + // Rock Hammer + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.rockHammer), + new Object[] {new ItemStack(RegisterItems.leatherStrip, 2), + "nuggetIron", 2}, + "I#I", " / ", " / ", + 'I', "ingotIron", + '#', Blocks.stone, + '/', "stickWood"); + + // Pan + AdvancedCraftingHandler.addAdvancedRecipe(new ItemStack(RegisterItems.pan), new Object[] {"nuggetIron", 2,}, + "/ ", " II", + '/', "stickWood", + 'I', "ingotIron"); + } + + public static void addShapedRecipes() + { + //Roasting stick + GameRegistry.addRecipe( + new ShapedOreRecipe(new ItemStack(RegisterItems.roastingStick), " s", "s ", 's', "stickWood")); + + // Knife + GameRegistry.addShapedRecipe(new ItemStack(RegisterItems.flintKnife), "F ", " F", 'F', Items.flint); + GameRegistry.addShapedRecipe(new ItemStack(RegisterItems.flintKnife), " F", "F ", 'F', Items.flint); + + GameRegistry.addShapedRecipe(new ItemStack(RegisterItems.boneKnife), " S", "/ ", 'S', RegisterItems.boneShard, + '/', Items.bone); + GameRegistry.addShapedRecipe(new ItemStack(RegisterItems.boneKnife), "S ", " /", 'S', RegisterItems.boneShard, + '/', Items.bone); + + // Thread + GameRegistry.addShapedRecipe(new ItemStack(RegisterItems.thread), "ss", "ss", 's', RegisterItems.silk); + + // Cloth + GameRegistry.addShapedRecipe(new ItemStack(RegisterItems.cloth, 4), "ttt", "ttt", 't', RegisterItems.thread); + + // Flint Hatchet + GameRegistry.addRecipe( + new ShapedOreRecipe(new ItemStack(RegisterItems.flintHatchet), "FL", " /", 'F', Items.flint, 'L', + RegisterItems.leatherStrip, '/', "stickWood")); + + // Noob Wood Sword + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RegisterItems.noobWoodSword), "#", "#", "/", + '#', "plankWood", '/', "stickWood")); + + // Kiln + GameRegistry.addRecipe( + new ShapedOreRecipe(new ItemStack(RegisterBlocks.kiln), "###", "# #", "###", '#', "cobblestone")); + + // Brick Oven + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RegisterBlocks.brickOven), "BBB", "# #", "###", + '#', Blocks.brick_block, 'B', "ingotBrick")); + + // Smelter + GameRegistry.addShapedRecipe(new ItemStack(RegisterBlocks.smelter), "###", "#C#", "###", '#', new ItemStack( + Blocks.stonebrick, 1, 0), 'C', new ItemStack(Items.coal, 1, 1)); + + // Vanilla Furnace + GameRegistry.addShapedRecipe(new ItemStack(Blocks.furnace), "###", "# #", "---", '#', Blocks.cobblestone, '-', + Blocks.stone_slab); + + // Gravel->Flint + GameRegistry.addShapedRecipe(new ItemStack(Items.flint), "##", "##", '#', Blocks.gravel); + + // Iron Nugget->Ingot + GameRegistry.addShapedRecipe(new ItemStack(Items.iron_ingot), "***", "***", "***", '*', + RegisterItems.ironNugget); + + // Workbench + GameRegistry.addShapedRecipe(new ItemStack(RegisterBlocks.doubleWorkbench), "##", "##", '#', new ItemStack( + Blocks.planks, 1, OreDictionary.WILDCARD_VALUE)); + + if (BBConfig.canMakeChainArmor) + { + // Chain Armor + GameRegistry.addShapedRecipe(new ItemStack(Items.chainmail_helmet), "***", "* *", '*', + RegisterItems.ironNugget); + GameRegistry.addShapedRecipe(new ItemStack(Items.chainmail_chestplate), "* *", "***", "***", '*', + RegisterItems.ironNugget); + GameRegistry.addShapedRecipe(new ItemStack(Items.chainmail_leggings), "***", "* *", "* *", '*', + RegisterItems.ironNugget); + GameRegistry.addShapedRecipe(new ItemStack(Items.chainmail_boots), "* *", "* *", '*', + RegisterItems.ironNugget); + } + + // Craft vanilla benches into BB workbenches + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RegisterBlocks.doubleWorkbench, 2), "##", '#', + "craftingTableWood")); + GameRegistry + .addShapedRecipe(new ItemStack(RegisterBlocks.doubleWorkbench, 2), "##", '#', Blocks.crafting_table); + + // Craft BB workbenches into vanilla ones + if (BBConfig.canMakeVanillaWorkbench) + { + GameRegistry.addShapedRecipe( + new ItemStack(Blocks.crafting_table), "#", '#', RegisterBlocks.doubleWorkbench); + } + + // Campfire + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RegisterBlocks.campfire), + "LL", "##", + 'L', "logWood", + '#', "cobblestone")); + + // Fire Bow + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RegisterItems.fireBow), + "//", "/s", + '/', "stickWood", + 's', "itemString")); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterTileEntities.java b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterTileEntities.java new file mode 100644 index 0000000..3b04254 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/RegisterTileEntities.java @@ -0,0 +1,19 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.tileentity.*; +import net.minecraftforge.fml.common.registry.GameRegistry; + +public class RegisterTileEntities +{ + public static void register() + { + GameRegistry.registerTileEntity(TileEntityKiln.class, ModMain.MODID + ":TileEntityKiln"); + GameRegistry.registerTileEntity(TileEntityBrickOven.class, ModMain.MODID + ":TileEntityBrickOven"); + GameRegistry.registerTileEntity(TileEntitySmelter.class, ModMain.MODID + ":TileEntitySmelter"); + GameRegistry.registerTileEntity(TileEntityCampfire.class, ModMain.MODID + ":TileEntityCampfire"); + GameRegistry.registerTileEntity(TileEntityObsidianKiln.class, ModMain.MODID + ":TileEntityObsidianKiln"); + GameRegistry.registerTileEntity(TileEntityNetherBrickOven.class, ModMain.MODID + ":TileEntityNetherBrickOven"); + GameRegistry.registerTileEntity(TileEntityEnderSmelter.class, ModMain.MODID + ":TileEntityEnderSmelter"); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/RemoveRecipes.java b/src/main/java/net/einsteinsci/betterbeginnings/register/RemoveRecipes.java new file mode 100644 index 0000000..c66fee7 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/RemoveRecipes.java @@ -0,0 +1,192 @@ +package net.einsteinsci.betterbeginnings.register; + +import net.einsteinsci.betterbeginnings.config.BBConfig; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.*; + +import java.util.*; + +public class RemoveRecipes +{ + public static void remove() + { + List removedRecipes = new ArrayList(); + + // Be sure to get the correct quantity and damage + + // Replaced/Obsolete Items + removedRecipes.add(Items.wooden_sword); + removedRecipes.add(Item.getItemFromBlock(Blocks.furnace)); + removedRecipes.add(Item.getItemFromBlock(Blocks.crafting_table)); + + if (BBConfig.removeWoodToolRecipes) + { + removedRecipes.add(Items.wooden_pickaxe); + removedRecipes.add(Items.wooden_axe); + removedRecipes.add(Items.wooden_shovel); + removedRecipes.add(Items.wooden_hoe); + } + + // Advanced Crafting + if (BBConfig.requireAdvancedCrafting) + { + if (BBConfig.advancedCraftingForLotsOfThings) + { + // TODO: remove recipes for all types of doors and gates + + removedRecipes.add(Items.oak_door); // here + removedRecipes.add(Items.iron_door); + removedRecipes.add(Item.getItemFromBlock(Blocks.oak_fence_gate)); // and here + removedRecipes.add(Item.getItemFromBlock(Blocks.trapdoor)); + removedRecipes.add(Item.getItemFromBlock(Blocks.chest)); + removedRecipes.add(Item.getItemFromBlock(Blocks.trapped_chest)); + removedRecipes.add(Item.getItemFromBlock(Blocks.piston)); + removedRecipes.add(Item.getItemFromBlock(Blocks.tripwire_hook)); + removedRecipes.add(Item.getItemFromBlock(Blocks.dispenser)); + removedRecipes.add(Item.getItemFromBlock(Blocks.noteblock)); + removedRecipes.add(Item.getItemFromBlock(Blocks.golden_rail)); + removedRecipes.add(Item.getItemFromBlock(Blocks.detector_rail)); + removedRecipes.add(Item.getItemFromBlock(Blocks.tnt)); + removedRecipes.add(Item.getItemFromBlock(Blocks.bookshelf)); + removedRecipes.add(Item.getItemFromBlock(Blocks.ladder)); + removedRecipes.add(Item.getItemFromBlock(Blocks.rail)); + removedRecipes.add(Item.getItemFromBlock(Blocks.enchanting_table)); + removedRecipes.add(Item.getItemFromBlock(Blocks.beacon)); + removedRecipes.add(Item.getItemFromBlock(Blocks.anvil)); + removedRecipes.add(Item.getItemFromBlock(Blocks.hopper)); + removedRecipes.add(Item.getItemFromBlock(Blocks.activator_rail)); + removedRecipes.add(Item.getItemFromBlock(Blocks.dropper)); + removedRecipes.add(Items.minecart); + removedRecipes.add(Items.compass); + removedRecipes.add(Items.clock); + removedRecipes.add(Items.bed); + removedRecipes.add(Items.brewing_stand); + removedRecipes.add(Items.cauldron); + } + + removedRecipes.add(Items.bow); + removedRecipes.add(Items.fishing_rod); + + removedRecipes.add(Items.leather_helmet); + removedRecipes.add(Items.leather_chestplate); + removedRecipes.add(Items.leather_leggings); + removedRecipes.add(Items.leather_boots); + + removedRecipes.add(Items.stone_pickaxe); + removedRecipes.add(Items.stone_sword); + removedRecipes.add(Items.stone_axe); + removedRecipes.add(Items.stone_shovel); + removedRecipes.add(Items.stone_hoe); + + removedRecipes.add(Items.iron_pickaxe); + removedRecipes.add(Items.iron_sword); + removedRecipes.add(Items.iron_axe); + removedRecipes.add(Items.iron_shovel); + removedRecipes.add(Items.iron_hoe); + + removedRecipes.add(Items.iron_helmet); + removedRecipes.add(Items.iron_chestplate); + removedRecipes.add(Items.iron_leggings); + removedRecipes.add(Items.iron_boots); + + removedRecipes.add(Items.diamond_sword); + removedRecipes.add(Items.diamond_pickaxe); + removedRecipes.add(Items.diamond_axe); + removedRecipes.add(Items.diamond_shovel); + removedRecipes.add(Items.diamond_hoe); + + removedRecipes.add(Items.diamond_helmet); + removedRecipes.add(Items.diamond_chestplate); + removedRecipes.add(Items.diamond_leggings); + removedRecipes.add(Items.diamond_boots); + } + + // Food that should be cooked in ovens + if (BBConfig.removeCraftedFoodRecipes) + { + removedRecipes.add(Items.bread); + removedRecipes.add(Items.cake); + removedRecipes.add(Items.cookie); + removedRecipes.add(Items.fermented_spider_eye); + removedRecipes.add(Items.golden_apple); + removedRecipes.add(Items.magma_cream); + removedRecipes.add(Items.pumpkin_pie); + } + + List recipes = CraftingManager.getInstance().getRecipeList(); + Iterator iterator = recipes.iterator(); + + while (iterator.hasNext()) + { + ItemStack stack = iterator.next().getRecipeOutput(); + + if (stack != null) + { + Item item = stack.getItem(); + if (item != null && removedRecipes.contains(item)) + { + iterator.remove(); + } + } + } + } + + public static void removeFurnaceRecipes() + { + List vanillaSmeltingOutputs = new ArrayList(); + + vanillaSmeltingOutputs.add(new ItemStack(Items.baked_potato)); + vanillaSmeltingOutputs.add(new ItemStack(Items.brick)); + vanillaSmeltingOutputs.add(new ItemStack(Items.coal)); //charcoal, coal silk-touched + vanillaSmeltingOutputs.add(new ItemStack(Items.cooked_beef)); + vanillaSmeltingOutputs.add(new ItemStack(Items.cooked_chicken)); + vanillaSmeltingOutputs.add(new ItemStack(Items.cooked_fish)); + vanillaSmeltingOutputs.add(new ItemStack(Items.cooked_porkchop)); + vanillaSmeltingOutputs.add(new ItemStack(Items.diamond)); //silk-touched + vanillaSmeltingOutputs.add(new ItemStack(Items.dye)); //Cactus green, lapis silk-touched + vanillaSmeltingOutputs.add(new ItemStack(Items.emerald)); //silk-touched + vanillaSmeltingOutputs.add(new ItemStack(Items.gold_ingot)); + vanillaSmeltingOutputs.add(new ItemStack(Items.iron_ingot)); + vanillaSmeltingOutputs.add(new ItemStack(Items.netherbrick)); + vanillaSmeltingOutputs.add(new ItemStack(Items.quartz)); //silk-touched + vanillaSmeltingOutputs.add(new ItemStack(Items.redstone)); //silk-touched + vanillaSmeltingOutputs.add(new ItemStack(Blocks.glass)); + vanillaSmeltingOutputs.add(new ItemStack(Blocks.hardened_clay)); + vanillaSmeltingOutputs.add(new ItemStack(Blocks.sponge)); //1.8 + vanillaSmeltingOutputs.add(new ItemStack(Blocks.stone)); + vanillaSmeltingOutputs.add(new ItemStack(Blocks.stonebrick)); //1.8 + + if (BBConfig.removeSmeltingRecipes) + { + // Remove ALL THE THINGS! + Map recipes = FurnaceRecipes.instance().getSmeltingList(); + Iterator iterator = recipes.entrySet().iterator(); + + while (iterator.hasNext()) + { + Map.Entry entry = (Map.Entry)iterator.next(); + ItemStack result = (ItemStack)entry.getValue(); + boolean isVanilla = false; + for (ItemStack vanilla : vanillaSmeltingOutputs) + { + if (vanilla.getItem() == result.getItem()) + { + isVanilla = true; + break; + } + } + + if (!BBConfig.removeOnlyVanillaSmeltingRecipes || isVanilla) + { + iterator.remove(); + } + } + } + } +} + + +// Buffer diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/achievement/RegisterAchievements.java b/src/main/java/net/einsteinsci/betterbeginnings/register/achievement/RegisterAchievements.java new file mode 100644 index 0000000..e30ebb0 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/achievement/RegisterAchievements.java @@ -0,0 +1,90 @@ +package net.einsteinsci.betterbeginnings.register.achievement; + +import net.einsteinsci.betterbeginnings.register.RegisterBlocks; +import net.einsteinsci.betterbeginnings.register.RegisterItems; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; + +import java.util.HashMap; +import java.util.Map; + +public class RegisterAchievements +{ + public static final RegisterAchievements instance = new RegisterAchievements(); + + private static Map achievements; + + public static RegisterAchievements getInstance() + { + return instance; + } + + public static Achievement[] getAchievements() + { + addAchievements(); + + return achievements.values().toArray(new Achievement[1]); + } + + public static void addAchievements() + { + achievements = new HashMap(); + + achievements.put("flintKnife", new Achievement("achievement.flintKnife", "flintKnife", 0, 0, + RegisterItems.flintKnife, null).setSpecial()); + achievements.put("makeString", new Achievement("achievement.makeString", "makeString", -2, -1, + Items.string, get("flintKnife"))); + achievements.put("makeTwine", new Achievement("achievement.makeTwine", "makeTwine", 0, -2, RegisterItems.twine, + get("flintKnife"))); + achievements.put("upgradeKnife", new Achievement("achievement.upgradeKnife", "upgradeKnife", 3, -1, + RegisterItems.boneKnife, get("flintKnife"))); + achievements.put("makeSticks", new Achievement("achievement.makeSticks", "makeSticks", -2, 1, Items.stick, + get("flintKnife"))); + achievements.put("makeHatchet", new Achievement("achievement.makeHatchet", "makeHatchet", -1, 3, + RegisterItems.flintHatchet, get("makeSticks"))); + achievements.put("doubleWorkbench", new Achievement("achievement.doubleWorkbench", "doubleWorkbench", -3, 4, + RegisterBlocks.doubleWorkbench, get("makeHatchet"))); + achievements.put("makeSword", new Achievement("achievement.makeSword", "makeSword", -4, 6, Items.stone_sword, + get("doubleWorkbench"))); + achievements.put("infusionRepair", new Achievement("achievement.infusionRepair", "infusionRepair", -2, 7, + RegisterBlocks.infusionRepairStation, + get("doubleWorkbench"))); + achievements.put("repairNoobSword", new Achievement("achievement.repairNoobSword", "repairNoobSword", -1, 9, + RegisterItems.noobWoodSword, get("infusionRepair"))); + achievements.put("boneShards", new Achievement("achievement.boneShards", "boneShards", 3, 2, + RegisterItems.boneShard, get("flintKnife"))); + achievements.put("bonePick", new Achievement("achievement.bonePick", "bonePick", 4, 4, + RegisterItems.bonePickaxe, get("boneShards"))); + achievements.put("makeKiln", new Achievement("achievement.makeKiln", "makeKiln", 5, 6, RegisterBlocks.kiln, + get("bonePick"))); + achievements.put("charredMeat", new Achievement("achievement.charredMeat", "charredMeat", 4, 8, + RegisterItems.charredMeat, get("makeKiln"))); + achievements.put("obsidianKiln", new Achievement("achievement.obsidianKiln", "obsidianKiln", 6, 9, + RegisterBlocks.obsidianKiln, get("makeKiln"))); + achievements.put("makeSmelter", new Achievement("achievement.makeSmelter", "makeSmelter", 2, 6, + RegisterBlocks.smelter, get("makeKiln"))); + achievements.put("enderSmelter", new Achievement("achievement.enderSmelter", "enderSmelter", 1, 8, + RegisterBlocks.enderSmelter, get("makeSmelter"))); + //achievements.put("oreDoubling", new Achievement("achievement.oreDoubling", "oreDoubling", 5, 6, + // Items.gold_ingot, get("enderSmelter"))); + achievements.put("makeBrickOven", new Achievement("achievement.makeBrickOven", "makeBrickOven", 8, 5, + RegisterBlocks.brickOven, get("makeKiln"))); + achievements.put("cake", new Achievement("achievement.cake", "cake", 7, 3, Items.cake, get("makeBrickOven"))); + achievements.put("netherBrickOven", new Achievement("achievement.netherBrickOven", "netherBrickOven", 9, 8, + RegisterBlocks.netherBrickOven, get("makeBrickOven"))); + achievements.put("notchApple", new Achievement("achievement.notchApple", "notchApple", 11, 9, new ItemStack( + Items.golden_apple, 1, 0), get("netherBrickOven"))); + } + + public static Achievement get(String key) + { + return achievements.get(key); + } + + public static void achievementGet(EntityPlayer player, String achievementKey) + { + player.addStat(RegisterAchievements.get(achievementKey), 1); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedCraftingHandler.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedCraftingHandler.java new file mode 100644 index 0000000..784601f --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedCraftingHandler.java @@ -0,0 +1,268 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.einsteinsci.betterbeginnings.inventory.InventoryWorkbenchAdditionalMaterials; +import net.minecraft.block.Block; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.*; + +public class AdvancedCraftingHandler +{ + private static final AdvancedCraftingHandler CRAFTING = new AdvancedCraftingHandler(); + public List recipes = new ArrayList<>(); + + public AdvancedCraftingHandler() + { + + } + + public static void addAdvancedRecipe(ItemStack result, Object[] additionalMaterials, Object... args) + { + crafting().addRecipe(result, additionalMaterials, args); + } + + public AdvancedRecipe addRecipe(ItemStack result, Object[] additionalMaterials, Object... args) + { + String totalRecipe = ""; + int i = 0; + int width = 0; + int height = 0; + + List addedMatList = new ArrayList(); + String lastString = ""; + for (Object mat : additionalMaterials) + { + if (mat instanceof ItemStack) + { + addedMatList.add(new OreRecipeElement((ItemStack)mat)); + } + else if (mat instanceof String) + { + lastString = (String)mat; + } + else if (mat instanceof Integer) + { + addedMatList.add(new OreRecipeElement(lastString, (Integer)mat)); + } + } + OreRecipeElement[] addedMats = addedMatList.toArray(new OreRecipeElement[0]); + + // First String(s) in args + if (args[i] instanceof String[]) + { + String[] astring = (String[])args[i]; + i++; + + for (String s1 : astring) + { + height++; + width = s1.length(); + totalRecipe += s1; + } + } + else + { + while (args[i] instanceof String) + { + String s2 = (String)args[i]; + i++; + height++; + width = s2.length(); + totalRecipe += s2; + } + } + + HashMap hashmap = new HashMap(); + + for (; i < args.length; i += 2) + { + Character character = (Character)args[i]; + OreRecipeElement stackInRecipe = null; + + if (args[i + 1] instanceof Item) + { + stackInRecipe = new OreRecipeElement(new ItemStack((Item)args[i + 1], 1, OreDictionary.WILDCARD_VALUE)); + } + else if (args[i + 1] instanceof Block) + { + stackInRecipe = new OreRecipeElement( + new ItemStack((Block)args[i + 1], 1, OreDictionary.WILDCARD_VALUE)); + } + else if (args[i + 1] instanceof ItemStack) + { + stackInRecipe = new OreRecipeElement((ItemStack)args[i + 1]); + } + else if (args[i + 1] instanceof String) + { + stackInRecipe = new OreRecipeElement((String)args[i + 1], 1); + } + + hashmap.put(character, stackInRecipe); + } + + OreRecipeElement[] neededItems = new OreRecipeElement[width * height]; + + for (int j = 0; j < width * height; ++j) + { + char iterChar = totalRecipe.charAt(j); + + if (hashmap.containsKey(Character.valueOf(iterChar))) + { + neededItems[j] = ((OreRecipeElement)hashmap.get(Character.valueOf(iterChar))).copy(); + } + else + { + neededItems[j] = null; + } + } + + AdvancedRecipe advancedrecipes = new AdvancedRecipe(width, height, neededItems, result, addedMats); + recipes.add(advancedrecipes); + return advancedrecipes; + } + + public static AdvancedCraftingHandler crafting() + { + return CRAFTING; + } + + public static AdvancedRecipe AdvancedRecipeByResult(ItemStack result) + { + for (Object obj : crafting().recipes) + { + if (obj instanceof AdvancedRecipe) + { + AdvancedRecipe recipe = (AdvancedRecipe)obj; + + if (recipe.getRecipeOutput().getItem() == result.getItem()) + { + return recipe; + } + } + } + + return null; + } + + public boolean hasRecipe(InventoryCrafting crafting, World world) + { + int i = 0; + ItemStack itemstack = null; + ItemStack itemstack1 = null; + int j; + + for (j = 0; j < crafting.getSizeInventory(); ++j) + { + ItemStack itemstack2 = crafting.getStackInSlot(j); + + if (itemstack2 != null) + { + if (i == 0) + { + itemstack = itemstack2; + } + + if (i == 1) + { + itemstack1 = itemstack2; + } + + ++i; + } + } + + for (j = 0; j < recipes.size(); ++j) + { + AdvancedRecipe advrecipe = recipes.get(j); + + if (advrecipe.matchesMostly(crafting, world)) + { + return true; + } + } + + return false; + } + + public ItemStack findMatchingRecipe(InventoryCrafting crafting, InventoryWorkbenchAdditionalMaterials materials, + World world) + { + int i = 0; + ItemStack itemstack = null; + ItemStack itemstack1 = null; + int j; + + for (j = 0; j < crafting.getSizeInventory(); ++j) + { + ItemStack itemstack2 = crafting.getStackInSlot(j); + + if (itemstack2 != null) + { + if (i == 0) + { + itemstack = itemstack2; + } + + if (i == 1) + { + itemstack1 = itemstack2; + } + + ++i; + } + } + + if (i == 2 && itemstack.getItem() == itemstack1.getItem() && itemstack.stackSize == 1 && + itemstack1.stackSize == 1 && itemstack.getItem().isRepairable()) + { + Item item = itemstack.getItem(); + int j1 = item.getMaxDamage() - itemstack.getItemDamage(); + int k = item.getMaxDamage() - itemstack1.getItemDamage(); + int l = j1 + k + item.getMaxDamage() * 5 / 100; + int i1 = item.getMaxDamage() - l; + + if (i1 < 0) + { + i1 = 0; + } + + return new ItemStack(itemstack.getItem(), 1, i1); + } + else + { + for (j = 0; j < recipes.size(); ++j) + { + AdvancedRecipe advrecipe = recipes.get(j); + + if (advrecipe.matches(crafting, materials, world)) + { + return advrecipe.getCraftingResult(crafting); + } + } + + return null; + } + } + + public boolean isAddedMaterial(ItemStack stack) + { + for (Object obj : recipes) + { + if (obj instanceof AdvancedRecipe) + { + AdvancedRecipe recipe = (AdvancedRecipe)obj; + + if (recipe.hasMaterial(stack)) + { + return true; + } + } + } + + return false; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedRecipe.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedRecipe.java new file mode 100644 index 0000000..6313095 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedRecipe.java @@ -0,0 +1,268 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.einsteinsci.betterbeginnings.inventory.InventoryWorkbenchAdditionalMaterials; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class AdvancedRecipe +{ + /** + * How many horizontal slots this recipe is wide. + */ + public final int recipeWidth; + /** + * How many vertical slots this recipe uses. + */ + public final int recipeHeight; + /** + * Is a array of ItemStack that composes the recipe. + */ + public final OreRecipeElement[] recipeItems; + /** + * Is the ItemStack that you get when craft the recipe. + */ + private ItemStack recipeOutput; + + // additional materials in the side slots + private OreRecipeElement[] addedMaterials; + + // ...something... + private boolean strangeFlag; + + public AdvancedRecipe(int width, int height, OreRecipeElement[] items, ItemStack output, + OreRecipeElement[] materials) + { + recipeWidth = width; + recipeHeight = height; + recipeItems = items; + recipeOutput = output; + addedMaterials = materials; + } + + // @Override + public boolean matches(InventoryCrafting invCrafting, InventoryWorkbenchAdditionalMaterials materials, + World world) + { + for (int i = 0; i <= 3 - recipeWidth; ++i) + { + for (int j = 0; j <= 3 - recipeHeight; ++j) + { + if (checkMatch(invCrafting, materials, i, j, true)) + { + return true; + } + + if (checkMatch(invCrafting, materials, i, j, false)) + { + return true; + } + } + } + + return false; + } + + // Not sure what that fourth flag is... + private boolean checkMatch(InventoryCrafting crafting, InventoryWorkbenchAdditionalMaterials materials, int width, + int height, boolean flag4) + { + for (int k = 0; k < 3; ++k) + { + for (int l = 0; l < 3; ++l) + { + int i1 = k - width; + int j1 = l - height; + OreRecipeElement neededCraftingStack = null; + + if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight) + { + if (flag4) + { + neededCraftingStack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth]; + } + else + { + neededCraftingStack = recipeItems[i1 + j1 * recipeWidth]; + } + } + + ItemStack craftingStackInQuestion = crafting.getStackInRowAndColumn(k, l); + + if (craftingStackInQuestion != null || neededCraftingStack != null) + { + if (craftingStackInQuestion == null && neededCraftingStack != null || + craftingStackInQuestion != null && neededCraftingStack == null) + { + return false; + } + + if (!neededCraftingStack.matches(craftingStackInQuestion)) + { + return false; + } + } + + for (OreRecipeElement requiredMatStack : addedMaterials) + { + boolean foundIt = false; + for (int i2 = 0; i2 < materials.getSizeInventory(); ++i2) + { + ItemStack testedMatStack = materials.getStackInSlot(i2); + if (testedMatStack != null) + { + foundIt = requiredMatStack.matchesCheckSize(testedMatStack); + } + + if (foundIt) + { + break; + } + } + + if (!foundIt) + { + return false; + } + } + } + } + + return true; + } + + public boolean matchesMostly(InventoryCrafting invCrafting, World world) + { + for (int i = 0; i <= 3 - recipeWidth; ++i) + { + for (int j = 0; j <= 3 - recipeHeight; ++j) + { + if (checkMatchMostly(invCrafting, i, j, true)) + { + return true; + } + + if (checkMatchMostly(invCrafting, i, j, false)) + { + return true; + } + } + } + + return false; + } + + public boolean checkMatchMostly(InventoryCrafting crafting, int width, int height, boolean flag4) + { + for (int k = 0; k < 3; ++k) + { + for (int l = 0; l < 3; ++l) + { + int i1 = k - width; + int j1 = l - height; + OreRecipeElement neededCraftingStack = null; + + if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight) + { + if (flag4) + { + neededCraftingStack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth]; + } + else + { + neededCraftingStack = recipeItems[i1 + j1 * recipeWidth]; + } + } + + ItemStack craftingStackInQuestion = crafting.getStackInRowAndColumn(k, l); + + if (craftingStackInQuestion != null || neededCraftingStack != null) + { + // If one is null but not the other + if (craftingStackInQuestion == null || neededCraftingStack == null) + { + return false; + } + + if (!neededCraftingStack.matches(craftingStackInQuestion)) + { + return false; + } + } + } + } + + return true; + } + + public int getNeededMaterialCount(Item material) + { + for (OreRecipeElement stack : addedMaterials) + { + if (stack.matches(new ItemStack(material))) + { + return stack.stackSize; + } + } + + return 0; + } + + public OreRecipeElement[] getNeededMaterials() + { + return addedMaterials; + } + + // @Override + public ItemStack getCraftingResult(InventoryCrafting crafting) + { + ItemStack itemstack = getRecipeOutput().copy(); + + if (strangeFlag) + { + for (int i = 0; i < crafting.getSizeInventory(); ++i) + { + ItemStack itemstack1 = crafting.getStackInSlot(i); + + if (itemstack1 != null && itemstack1.hasTagCompound()) + { + itemstack.setTagCompound((NBTTagCompound)itemstack1.getTagCompound().copy()); + } + } + } + + return itemstack; + } + + // @Override + public ItemStack getRecipeOutput() + { + return recipeOutput; + } + + // @Override + public int getRecipeSize() + { + return recipeWidth * recipeHeight; + } + + public AdvancedRecipe func_92100_c() + { + strangeFlag = true; + return this; + } + + public boolean hasMaterial(ItemStack stack) + { + for (OreRecipeElement s : addedMaterials) + { + if (s.matches(stack)) + { + return true; + } + } + return false; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenRecipeHandler.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenRecipeHandler.java new file mode 100644 index 0000000..09542bd --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenRecipeHandler.java @@ -0,0 +1,216 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.einsteinsci.betterbeginnings.tileentity.TileEntityBrickOven; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.*; + +public class BrickOvenRecipeHandler +{ + private static final BrickOvenRecipeHandler INSTANCE = new BrickOvenRecipeHandler(); + protected List recipes = new ArrayList(); + + // private Map experienceList; + + public BrickOvenRecipeHandler() + { + + } + + public static void addShapedRecipe(ItemStack output, Object... args) + { + instance().putShapedRecipe(output, args); + } + + public BrickOvenShapedRecipe putShapedRecipe(ItemStack result, Object... args) + { + String s = ""; + int i = 0; + int j = 0; + int k = 0; + + if (args[i] instanceof String[]) + { + String[] astring = (String[])args[i++]; + + for (int l = 0; l < astring.length; ++l) + { + String s1 = astring[l]; + ++k; + j = s1.length(); + s = s + s1; + } + } + else + { + while (args[i] instanceof String) + { + String s2 = (String)args[i++]; + ++k; + j = s2.length(); + s = s + s2; + } + } + + HashMap hashmap; + + for (hashmap = new HashMap(); i < args.length; i += 2) + { + Character character = (Character)args[i]; + ItemStack itemstack1 = null; + + if (args[i + 1] instanceof Item) + { + itemstack1 = new ItemStack((Item)args[i + 1]); + } + else if (args[i + 1] instanceof Block) + { + itemstack1 = new ItemStack((Block)args[i + 1], 1, OreDictionary.WILDCARD_VALUE); + } + else if (args[i + 1] instanceof ItemStack) + { + itemstack1 = (ItemStack)args[i + 1]; + } + + hashmap.put(character, itemstack1); + } + + ItemStack[] aitemstack = new ItemStack[j * k]; + + for (int i1 = 0; i1 < j * k; ++i1) + { + char c0 = s.charAt(i1); + + if (hashmap.containsKey(Character.valueOf(c0))) + { + aitemstack[i1] = ((ItemStack)hashmap.get(Character.valueOf(c0))).copy(); + } + else + { + aitemstack[i1] = null; + } + } + + BrickOvenShapedRecipe ovenrecipe = new BrickOvenShapedRecipe(j, k, aitemstack, result); + recipes.add(ovenrecipe); + return ovenrecipe; + } + + public static BrickOvenRecipeHandler instance() + { + return INSTANCE; + } + + public static void addShapelessRecipe(ItemStack output, Object... args) + { + instance().putShapelessRecipe(output, args); + } + + public BrickOvenShapelessRecipe putShapelessRecipe(ItemStack output, Object... args) + { + ArrayList arraylist = new ArrayList(); + Object[] aobject = args; + int i = args.length; + + for (int j = 0; j < i; ++j) + { + Object object1 = aobject[j]; + + if (object1 instanceof ItemStack) + { + arraylist.add(((ItemStack)object1).copy()); + } + else if (object1 instanceof Item) + { + arraylist.add(new ItemStack((Item)object1)); + } + else + { + if (!(object1 instanceof Block)) + { + throw new RuntimeException("Invalid shapeless recipe!"); + } + + arraylist.add(new ItemStack((Block)object1)); + } + } + + BrickOvenShapelessRecipe recipe = new BrickOvenShapelessRecipe(output, arraylist); + recipes.add(recipe); + + return recipe; + } + + @Deprecated + public void addLists(ItemStack output, Object... args) + { + // putLists(output, args); + } + + @Deprecated + public void putLists(ItemStack output, Object... args) + { + + } + + public ItemStack findMatchingRecipe(TileEntityBrickOven oven) + { + int i = 0; + ItemStack itemstack = null; + ItemStack itemstack1 = null; + int j; + + for (j = TileEntityBrickOven.INPUTSTART; j < oven.getSizeInventory(); ++j) + { + ItemStack itemstack2 = oven.getStackInSlot(j); + // System.out.println("\nBrickOvenRecipeHandler.findMatchingRecipe(): j = " + j); + + if (itemstack2 != null) + { + if (i == 0) + { + itemstack = itemstack2; + } + + if (i == 1) + { + itemstack1 = itemstack2; + } + + ++i; + } + } + + for (IBrickOvenRecipe recipe : recipes) + { + // IBrickOvenRecipe recipe = (IBrickOvenRecipe)recipes.get(j); + + if (recipe.matches(oven)) + { + return recipe.getCraftingResult(oven); + } + } + + return null; + } + + public boolean isInRecipe(ItemStack stack) + { + for (IBrickOvenRecipe recipe : recipes) + { + if (recipe.contains(stack)) + { + return true; + } + } + return false; + } + + public List getRecipeList() + { + return recipes; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapedRecipe.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapedRecipe.java new file mode 100644 index 0000000..6cacfdb --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapedRecipe.java @@ -0,0 +1,261 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.einsteinsci.betterbeginnings.tileentity.TileEntityBrickOven; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.oredict.OreDictionary; + +public class BrickOvenShapedRecipe implements IBrickOvenRecipe +{ + /** + * How many horizontal slots this recipe is wide. + */ + public final int recipeWidth; + /** + * How many vertical slots this recipe uses. + */ + public final int recipeHeight; + /** + * Is a array of ItemStack that composes the recipe. + */ + public final ItemStack[] recipeItems; + /** + * Is the ItemStack that you get when craft the recipe. + */ + private ItemStack recipeOutput; + private boolean strangeField; + + public BrickOvenShapedRecipe(int width, int height, ItemStack[] input, ItemStack output) + { + recipeWidth = width; + recipeHeight = height; + recipeItems = input; + recipeOutput = output; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(TileEntityBrickOven oven) + { + for (int i = 0; i <= 3 - recipeWidth; ++i) + { + for (int j = 0; j <= 3 - recipeHeight; ++j) + { + if (checkMatch(oven, i, j, true)) + { + return true; + } + + if (checkMatch(oven, i, j, false)) + { + return true; + } + } + } + + return false; + } + + @Override + public boolean matches(TileEntityNetherBrickOven oven) + { + for (int i = 0; i <= 3 - recipeWidth; ++i) + { + for (int j = 0; j <= 3 - recipeHeight; ++j) + { + if (checkMatch(oven, i, j, true)) + { + return true; + } + + if (checkMatch(oven, i, j, false)) + { + return true; + } + } + } + + return false; + } + + private boolean checkMatch(TileEntityNetherBrickOven oven, int width, int height, boolean flag4) + { + for (int k = 0; k < 3; ++k) + { + for (int l = 0; l < 3; ++l) + { + int i1 = k - width; + int j1 = l - height; + ItemStack itemstack = null; + + if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight) + { + if (flag4) + { + itemstack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth]; + } + else + { + itemstack = recipeItems[i1 + j1 * recipeWidth]; + } + } + + ItemStack itemstack1 = oven.getStackInRowAndColumn(k, l); + + if (itemstack1 != null || itemstack != null) + { + if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) + { + return false; + } + + if (itemstack.getItem() != itemstack1.getItem()) + { + return false; + } + + if (itemstack.getItemDamage() != OreDictionary.WILDCARD_VALUE && + itemstack.getItemDamage() != itemstack1.getItemDamage()) + { + return false; + } + } + } + } + + return true; + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(TileEntityBrickOven oven) + { + ItemStack itemstack = getRecipeOutput().copy(); + + if (strangeField) + { + for (int i = 0; i < oven.getSizeInventory(); ++i) + { + ItemStack itemstack1 = oven.getStackInSlot(i); + + if (itemstack1 != null && itemstack1.hasTagCompound()) + { + itemstack.setTagCompound((NBTTagCompound)itemstack1.getTagCompound().copy()); + } + } + } + + return itemstack; + } + + @Override + public ItemStack getCraftingResult(TileEntityNetherBrickOven oven) + { + ItemStack itemstack = getRecipeOutput().copy(); + + if (strangeField) + { + for (int i = 0; i < oven.getSizeInventory(); ++i) + { + ItemStack itemstack1 = oven.getStackInSlot(i); + + if (itemstack1 != null && itemstack1.hasTagCompound()) + { + itemstack.setTagCompound((NBTTagCompound)itemstack1.getTagCompound().copy()); + } + } + } + + return itemstack; + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() + { + return recipeWidth * recipeHeight; + } + + @Override + public boolean contains(ItemStack stack) + { + for (ItemStack s : recipeItems) + { + if (s.getItem() == stack.getItem()) + { + return true; + } + } + return false; + } + + @Override + public ItemStack getRecipeOutput() + { + return recipeOutput; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + private boolean checkMatch(TileEntityBrickOven oven, int width, int height, boolean flag4) + { + for (int k = 0; k < 3; ++k) + { + for (int l = 0; l < 3; ++l) + { + int i1 = k - width; + int j1 = l - height; + ItemStack itemstack = null; + + if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight) + { + if (flag4) + { + itemstack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth]; + } + else + { + itemstack = recipeItems[i1 + j1 * recipeWidth]; + } + } + + ItemStack itemstack1 = oven.getStackInRowAndColumn(k, l); + + if (itemstack1 != null || itemstack != null) + { + if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) + { + return false; + } + + if (itemstack.getItem() != itemstack1.getItem()) + { + return false; + } + + if (itemstack.getItemDamage() != OreDictionary.WILDCARD_VALUE && + itemstack.getItemDamage() != itemstack1.getItemDamage()) + { + return false; + } + } + } + } + + return true; + } + + public BrickOvenShapedRecipe func_92100_c() + { + strangeField = true; + return this; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapelessRecipe.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapelessRecipe.java new file mode 100644 index 0000000..fc2b3d7 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/BrickOvenShapelessRecipe.java @@ -0,0 +1,156 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.einsteinsci.betterbeginnings.tileentity.TileEntityBrickOven; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.*; + +public class BrickOvenShapelessRecipe implements IBrickOvenRecipe +{ + /** + * Is a List of ItemStack that composes the recipe. + */ + public final List recipeItems; + /** + * Is the ItemStack that you get when craft the recipe. + */ + private final ItemStack recipeOutput; + + public BrickOvenShapelessRecipe(ItemStack output, List input) + { + recipeOutput = output; + recipeItems = input; + } + + /** + * Used to check if a recipe matches current crafting inventory + */ + @Override + public boolean matches(TileEntityBrickOven oven) + { + ArrayList arraylist = new ArrayList(recipeItems); + + for (int col = 0; col < 3; ++col) + { + for (int row = 0; row < 3; ++row) + { + ItemStack itemstack = oven.getStackInRowAndColumn(row, col); + + if (itemstack != null) + { + boolean flag = false; + Iterator iterator = arraylist.iterator(); + + while (iterator.hasNext()) + { + ItemStack itemstack1 = (ItemStack)iterator.next(); + + if (itemstack.getItem() == itemstack1.getItem() && + (itemstack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || itemstack + .getItemDamage() == itemstack1 + .getItemDamage())) + { + flag = true; + arraylist.remove(itemstack1); + break; + } + } + + if (!flag) + { + return false; + } + } + } + } + + return arraylist.isEmpty(); + } + + @Override + public boolean matches(TileEntityNetherBrickOven oven) + { + ArrayList arraylist = new ArrayList(recipeItems); + + for (int col = 0; col < 3; ++col) + { + for (int row = 0; row < 3; ++row) + { + ItemStack itemstack = oven.getStackInRowAndColumn(row, col); + + if (itemstack != null) + { + boolean flag = false; + Iterator iterator = arraylist.iterator(); + + while (iterator.hasNext()) + { + ItemStack itemstack1 = (ItemStack)iterator.next(); + + if (itemstack.getItem() == itemstack1.getItem() && + (itemstack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || itemstack + .getItemDamage() == itemstack1 + .getItemDamage())) + { + flag = true; + arraylist.remove(itemstack1); + break; + } + } + + if (!flag) + { + return false; + } + } + } + } + + return arraylist.isEmpty(); + } + + /** + * Returns an Item that is the result of this recipe + */ + @Override + public ItemStack getCraftingResult(TileEntityBrickOven oven) + { + return recipeOutput.copy(); + } + + @Override + public ItemStack getCraftingResult(TileEntityNetherBrickOven oven) + { + return recipeOutput.copy(); + } + + /** + * Returns the size of the recipe area + */ + @Override + public int getRecipeSize() + { + return recipeItems.size(); + } + + @Override + public boolean contains(ItemStack stack) + { + for (ItemStack s : recipeItems) + { + if (s.getItem() == stack.getItem()) + { + return true; + } + } + return false; + } + + @Override + public ItemStack getRecipeOutput() + { + return recipeOutput; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfirePanRecipes.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfirePanRecipes.java new file mode 100644 index 0000000..9d0dbb2 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfirePanRecipes.java @@ -0,0 +1,101 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.*; +import java.util.Map.Entry; + +public class CampfirePanRecipes +{ + private static final CampfirePanRecipes SMELTINGBASE = new CampfirePanRecipes(); + + private Map smeltingList = new HashMap(); + private Map experienceList = new HashMap(); + + private CampfirePanRecipes() + { + // nothing here + } + + public static void addRecipe(Item input, ItemStack output, float experience) + { + smelting().addLists(input, output, experience); + } + + public void addLists(Item input, ItemStack itemStack, float experience) + { + putLists(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), itemStack, experience); + } + + public static CampfirePanRecipes smelting() + { + return SMELTINGBASE; + } + + public void putLists(ItemStack itemStack, ItemStack itemStack2, float experience) + { + smeltingList.put(itemStack, itemStack2); + experienceList.put(itemStack2, Float.valueOf(experience)); + } + + public static void addRecipe(Block input, ItemStack output, float experience) + { + smelting().addLists(Item.getItemFromBlock(input), output, experience); + } + + public static void addRecipe(ItemStack input, ItemStack output, float experience) + { + smelting().putLists(input, output, experience); + } + + public ItemStack getSmeltingResult(ItemStack stack) + { + Iterator iterator = smeltingList.entrySet().iterator(); + Entry entry; + + do + { + if (!iterator.hasNext()) + { + return null; + } + + entry = (Entry)iterator.next(); + } while (!canBeSmelted(stack, (ItemStack)entry.getKey())); + + return (ItemStack)entry.getValue(); + } + + private boolean canBeSmelted(ItemStack stack, ItemStack stack2) + { + return stack2.getItem() == stack.getItem() + && (stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == stack + .getItemDamage()); + } + + public float giveExperience(ItemStack stack) + { + Iterator iterator = experienceList.entrySet().iterator(); + Entry entry; + + do + { + if (!iterator.hasNext()) + { + return 0.0f; + } + + entry = (Entry)iterator.next(); + } while (!canBeSmelted(stack, (ItemStack)entry.getKey())); + + if (stack.getItem().getSmeltingExperience(stack) != -1) + { + return stack.getItem().getSmeltingExperience(stack); + } + + return (Float)entry.getValue(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfireRecipes.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfireRecipes.java new file mode 100644 index 0000000..e8dae0d --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/CampfireRecipes.java @@ -0,0 +1,101 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.*; +import java.util.Map.Entry; + +public class CampfireRecipes +{ + private static final CampfireRecipes SMELTINGBASE = new CampfireRecipes(); + + private Map smeltingList = new HashMap(); + private Map experienceList = new HashMap(); + + private CampfireRecipes() + { + // nothing here + } + + public static void addRecipe(Item input, ItemStack output, float experience) + { + smelting().addLists(input, output, experience); + } + + public void addLists(Item input, ItemStack itemStack, float experience) + { + putLists(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), itemStack, experience); + } + + public static CampfireRecipes smelting() + { + return SMELTINGBASE; + } + + public void putLists(ItemStack itemStack, ItemStack itemStack2, float experience) + { + smeltingList.put(itemStack, itemStack2); + experienceList.put(itemStack2, experience); + } + + public static void addRecipe(Block input, ItemStack output, float experience) + { + smelting().addLists(Item.getItemFromBlock(input), output, experience); + } + + public static void addRecipe(ItemStack input, ItemStack output, float experience) + { + smelting().putLists(input, output, experience); + } + + public ItemStack getSmeltingResult(ItemStack stack) + { + Iterator iterator = smeltingList.entrySet().iterator(); + Entry entry; + + do + { + if (!iterator.hasNext()) + { + return null; + } + + entry = (Entry)iterator.next(); + } while (!canBeSmelted(stack, (ItemStack)entry.getKey())); + + return (ItemStack)entry.getValue(); + } + + private boolean canBeSmelted(ItemStack stack, ItemStack stack2) + { + return stack2.getItem() == stack.getItem() + && (stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == stack + .getItemDamage()); + } + + public float giveExperience(ItemStack stack) + { + Iterator iterator = experienceList.entrySet().iterator(); + Entry entry; + + do + { + if (!iterator.hasNext()) + { + return 0.0f; + } + + entry = (Entry)iterator.next(); + } while (!canBeSmelted(stack, (ItemStack)entry.getKey())); + + if (stack.getItem().getSmeltingExperience(stack) != -1) + { + return stack.getItem().getSmeltingExperience(stack); + } + + return ((Float)entry.getValue()).floatValue(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/IBrickOvenRecipe.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/IBrickOvenRecipe.java new file mode 100644 index 0000000..0214e21 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/IBrickOvenRecipe.java @@ -0,0 +1,31 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.einsteinsci.betterbeginnings.tileentity.TileEntityBrickOven; +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.item.ItemStack; + +public interface IBrickOvenRecipe +{ + /** + * Used to check if a recipe matches current crafting inventory + */ + boolean matches(TileEntityBrickOven inv); + + boolean matches(TileEntityNetherBrickOven inv); + + /** + * Returns an Item that is the result of this recipe + */ + ItemStack getCraftingResult(TileEntityBrickOven inv); + + ItemStack getCraftingResult(TileEntityNetherBrickOven inv); + + /** + * Returns the size of the recipe area + */ + int getRecipeSize(); + + boolean contains(ItemStack stack); + + ItemStack getRecipeOutput(); +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/KilnRecipes.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/KilnRecipes.java new file mode 100644 index 0000000..ba4638a --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/KilnRecipes.java @@ -0,0 +1,109 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.*; +import java.util.Map.Entry; + +public class KilnRecipes +{ + private static final KilnRecipes SMELTINGBASE = new KilnRecipes(); + + private Map smeltingList = new HashMap(); + private Map experienceList = new HashMap(); + + private KilnRecipes() + { + // nothing here + } + + public static void addRecipe(Item input, ItemStack output, float experience) + { + smelting().addLists(input, output, experience); + } + + public void addLists(Item input, ItemStack itemStack, float experience) + { + putLists(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), itemStack, experience); + } + + public static KilnRecipes smelting() + { + return SMELTINGBASE; + } + + public void putLists(ItemStack itemStack, ItemStack itemStack2, float experience) + { + smeltingList.put(itemStack, itemStack2); + experienceList.put(itemStack2, experience); + } + + public static void addRecipe(String input, ItemStack output, float experience) + { + for (ItemStack stack : OreDictionary.getOres(input)) + { + smelting().putLists(stack, output, experience); + } + } + + public static void addRecipe(Block input, ItemStack output, float experience) + { + smelting().addLists(Item.getItemFromBlock(input), output, experience); + } + + public static void addRecipe(ItemStack input, ItemStack output, float experience) + { + smelting().putLists(input, output, experience); + } + + public ItemStack getSmeltingResult(ItemStack stack) + { + Iterator iterator = smeltingList.entrySet().iterator(); + Entry entry; + + do + { + if (!iterator.hasNext()) + { + return null; + } + + entry = (Entry)iterator.next(); + } while (!canBeSmelted(stack, (ItemStack)entry.getKey())); + + return (ItemStack)entry.getValue(); + } + + private boolean canBeSmelted(ItemStack stack, ItemStack stack2) + { + return stack2.getItem() == stack.getItem() + && (stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == stack + .getItemDamage()); + } + + public float giveExperience(ItemStack stack) + { + Iterator iterator = experienceList.entrySet().iterator(); + Entry entry; + + do + { + if (!iterator.hasNext()) + { + return 0.0f; + } + + entry = (Entry)iterator.next(); + } while (!canBeSmelted(stack, (ItemStack)entry.getKey())); + + if (stack.getItem().getSmeltingExperience(stack) != -1) + { + return stack.getItem().getSmeltingExperience(stack); + } + + return ((Float)entry.getValue()).floatValue(); + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/NetherBrickOvenRecipeHandler.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/NetherBrickOvenRecipeHandler.java new file mode 100644 index 0000000..3e3d961 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/NetherBrickOvenRecipeHandler.java @@ -0,0 +1,63 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.einsteinsci.betterbeginnings.tileentity.TileEntityNetherBrickOven; +import net.minecraft.item.ItemStack; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class NetherBrickOvenRecipeHandler extends BrickOvenRecipeHandler +{ + private static final NetherBrickOvenRecipeHandler INSTANCE = new NetherBrickOvenRecipeHandler(); + + public NetherBrickOvenRecipeHandler() + { + super(); + } + + public static NetherBrickOvenRecipeHandler instance() + { + return INSTANCE; + } + + public ItemStack findMatchingRecipe(TileEntityNetherBrickOven oven) + { + int i = 0; + ItemStack itemstack = null; + ItemStack itemstack1 = null; + int j; + + for (j = TileEntityNetherBrickOven.INPUTSTART; j < oven.getSizeInventory(); ++j) + { + ItemStack itemstack2 = oven.getStackInSlot(j); + // System.out.println("\nBrickOvenRecipeHandler.findMatchingRecipe(): j = " + j); + + if (itemstack2 != null) + { + if (i == 0) + { + itemstack = itemstack2; + } + + if (i == 1) + { + itemstack1 = itemstack2; + } + + ++i; + } + } + + for (IBrickOvenRecipe recipe : BrickOvenRecipeHandler.instance().recipes) + { + // IBrickOvenRecipe recipe = (IBrickOvenRecipe)recipes.get(j); + + if (recipe.matches(oven)) + { + return recipe.getCraftingResult(oven); + } + } + + return null; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/OreRecipeElement.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/OreRecipeElement.java new file mode 100644 index 0000000..17306b0 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/OreRecipeElement.java @@ -0,0 +1,96 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by einsteinsci on 11/18/2014. + */ +public class OreRecipeElement +{ + public int stackSize; + List validItems; + String oreDictionaryEntry; + + public OreRecipeElement(ItemStack stack) + { + validItems = new ArrayList(); + validItems.add(stack); + oreDictionaryEntry = ""; + stackSize = stack.stackSize; + } + + public OreRecipeElement(String dictionaryEntry, int size) + { + validItems = new ArrayList(); + validItems.addAll(OreDictionary.getOres(dictionaryEntry)); + oreDictionaryEntry = dictionaryEntry; + stackSize = size; + } + + public OreRecipeElement(List valid, String entry, int size) + { + validItems = valid; + oreDictionaryEntry = entry; + stackSize = size; + } + + public boolean matches(ItemStack stackGiven) + { + for (ItemStack valid : validItems) + { + if (valid.getItem() == stackGiven.getItem() && (valid.getItemDamage() == stackGiven.getItemDamage() || + valid.getItemDamage() == OreDictionary.WILDCARD_VALUE)) + { + return true; + } + } + + return false; + } + + public boolean matchesCheckSize(ItemStack stackGiven) + { + for (ItemStack valid : validItems) + { + if (valid.getItem() == stackGiven.getItem() && (valid.getItemDamage() == stackGiven.getItemDamage() || + valid.getItemDamage() == OreDictionary.WILDCARD_VALUE) && stackSize <= stackGiven.stackSize) + { + return true; + } + } + + return false; + } + + public List getValidItems() + { + return validItems; + } + + public String getOreDictionaryEntry() + { + return oreDictionaryEntry; + } + + public OreRecipeElement copy() + { + return new OreRecipeElement(validItems, oreDictionaryEntry, stackSize); + } + + public ItemStack getFirst() + { + if (validItems != null && !validItems.isEmpty()) + { + ItemStack zero = validItems.get(0); + return new ItemStack(zero.getItem(), stackSize, zero.getItemDamage()); + } + else + { + return null; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipe.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipe.java new file mode 100644 index 0000000..4bf2eb8 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipe.java @@ -0,0 +1,54 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.minecraft.item.ItemStack; + +public class SmelterRecipe +{ + private ItemStack outputStack; + private ItemStack inputStack; + private float experienceGiven; + private int gravelNeeded; + + private int bonusIfEnder; + private float bonusChance; + + public SmelterRecipe(ItemStack output, ItemStack input, float experience, int gravel, int bonus, float chance) + { + outputStack = output; + inputStack = input; + experienceGiven = experience; + gravelNeeded = gravel; + bonusIfEnder = bonus; + bonusChance = chance; + } + + public ItemStack getOutput() + { + return outputStack; + } + + public ItemStack getInput() + { + return inputStack; + } + + public float getExperience() + { + return experienceGiven; + } + + public int getGravel() + { + return gravelNeeded; + } + + public int getBonus() + { + return bonusIfEnder; + } + + public float getBonusChance() + { + return bonusChance; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipeHandler.java b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipeHandler.java new file mode 100644 index 0000000..3c4c93c --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/register/recipe/SmelterRecipeHandler.java @@ -0,0 +1,140 @@ +package net.einsteinsci.betterbeginnings.register.recipe; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.*; +import java.util.Map.Entry; + +public class SmelterRecipeHandler +{ + private static final SmelterRecipeHandler SMELTINGBASE = new SmelterRecipeHandler(); + + private Map experienceList = new HashMap(); + + private List recipes = new ArrayList(); + + private SmelterRecipeHandler() + { + // nothing here + } + + public static void addRecipe(Item input, ItemStack output, float experience, int gravel, int bonus, float chance) + { + smelting().addLists(input, output, experience, gravel, bonus, chance); + } + + public void addLists(Item input, ItemStack output, float experience, int gravel, int bonus, float chance) + { + putLists(new ItemStack(input, 1, OreDictionary.WILDCARD_VALUE), output, experience, gravel, bonus, chance); + } + + public static SmelterRecipeHandler smelting() + { + return SMELTINGBASE; + } + + public void putLists(ItemStack input, ItemStack output, float experience, int gravel, int bonus, float chance) + { + experienceList.put(output, Float.valueOf(experience)); + + recipes.add(new SmelterRecipe(output, input, experience, gravel, bonus, chance)); + } + + public static void addRecipe(Block input, ItemStack output, float experience, int gravel, int bonus, float chance) + { + smelting().addLists(Item.getItemFromBlock(input), output, experience, gravel, bonus, chance); + } + + public static void addRecipe(ItemStack input, ItemStack output, float experience, int gravel, int bonus, float chance) + { + smelting().putLists(input, output, experience, gravel, bonus, chance); + } + + public ItemStack getSmeltingResult(ItemStack input) + { + for (SmelterRecipe recipe : recipes) + { + if (recipe.getInput().getItem() == input.getItem()) + { + return recipe.getOutput(); + } + } + + return null; + } + + public int getGravelCount(ItemStack stack) + { + for (SmelterRecipe recipe : recipes) + { + if (recipe.getInput() != null) + { + if (recipe.getInput().getItem() == stack.getItem()) + { + return recipe.getGravel(); + } + } + } + + return -1; + } + + public float giveExperience(ItemStack stack) + { + Iterator iterator = experienceList.entrySet().iterator(); + Entry entry; + + do + { + if (!iterator.hasNext()) + { + return 0.0f; + } + + entry = (Entry)iterator.next(); + } while (!canBeSmelted(stack, (ItemStack)entry.getKey())); + + if (stack.getItem().getSmeltingExperience(stack) != -1) + { + return stack.getItem().getSmeltingExperience(stack); + } + + return ((Float)entry.getValue()).floatValue(); + } + + private boolean canBeSmelted(ItemStack stack, ItemStack stack2) + { + return stack2.getItem() == stack.getItem() && + (stack2.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack2.getItemDamage() == stack + .getItemDamage()); + } + + public int getBonus(ItemStack input) + { + for (SmelterRecipe recipe : recipes) + { + if (recipe.getInput().getItem() == input.getItem()) + { + return recipe.getBonus(); + } + } + + return 0; + } + + public float getBonusChance(ItemStack input) + { + for (SmelterRecipe recipe : recipes) + { + if (recipe.getInput().getItem() == input.getItem()) + { + return recipe.getBonusChance(); + } + } + + return 0.0f; + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityBrickOven.java new file mode 100644 index 0000000..bdbcea6 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityBrickOven.java @@ -0,0 +1,564 @@ +package net.einsteinsci.betterbeginnings.tileentity; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.blocks.BlockBrickOven; +import net.einsteinsci.betterbeginnings.inventory.ContainerBrickOven; +import net.einsteinsci.betterbeginnings.register.recipe.BrickOvenRecipeHandler; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.IInteractionObject; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class TileEntityBrickOven extends TileEntity implements ISidedInventory, IUpdatePlayerListBox, IInteractionObject +{ + public static final int FUEL = 0; + public static final int OUTPUT = 1; + public static final int INPUTSTART = 2; + public static final int COOKTIME = 120; + private static final int[] slotsInput = new int[] {FUEL}; + private static final int[] slotsOutput = new int[] {OUTPUT}; + public int ovenBurnTime; + public int currentItemBurnLength; + public int ovenCookTime; + private ItemStack[] ovenStacks = new ItemStack[11]; + private String ovenName; + + public TileEntityBrickOven() + { + super(); + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + + // ItemStacks + NBTTagList tagList = tagCompound.getTagList("Items", 10); + ovenStacks = new ItemStack[getSizeInventory()]; + + for (int i = 0; i < tagList.tagCount(); ++i) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + byte slot = itemTag.getByte("Slot"); + + if (slot >= 0 && slot < ovenStacks.length) + { + ovenStacks[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + + // Burn Time & Cook Time + ovenBurnTime = tagCompound.getShort("BurnTime"); + ovenCookTime = tagCompound.getShort("CookTime"); + currentItemBurnLength = getItemBurnTime(ovenStacks[1]); + + if (tagCompound.hasKey("CustomName")) + { + ovenName = tagCompound.getString("CustomName"); + } + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + + tagCompound.setShort("BurnTime", (short)ovenBurnTime); + tagCompound.setShort("CookTime", (short)ovenCookTime); + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < ovenStacks.length; ++i) + { + if (ovenStacks[i] != null) + { + NBTTagCompound itemTag = new NBTTagCompound(); + ovenStacks[i].writeToNBT(itemTag); + itemTag.setByte("Slot", (byte)i); + tagList.appendTag(itemTag); + } + } + + tagCompound.setTag("Items", tagList); + if (hasCustomName()) + { + tagCompound.setString("CustomName", ovenName); + } + } + + @Override + public int getSizeInventory() + { + return ovenStacks.length; + } + + public static int getItemBurnTime(ItemStack itemStack) + { + if (itemStack == null) + { + return 0; + } + else + { + Item item = itemStack.getItem(); + + if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air) + { + Block block = Block.getBlockFromItem(item); + + // Insert any additional block fuels here + if (block == Blocks.wooden_slab) + { + return 300; + } + + if (block.getMaterial() == Material.wood) + { + return 600; + } + + if (block == Blocks.coal_block) + { + return 32000; + } + + // VERY LARGE AMOUNT OF POWER!!! + if (block == Blocks.bedrock) + { + return Short.MAX_VALUE; + } + } + + if (item instanceof ItemTool) + { + if (((ItemTool)item).getToolMaterialName().equals("WOOD") || + ((ItemTool)item).getToolMaterialName().equals("noobwood")) + { + return 400; + } + } + if (item instanceof ItemSword) + { + if (((ItemSword)item).getToolMaterialName().equals("WOOD") || + ((ItemSword)item).getToolMaterialName().equals("noobwood")) + { + return 400; + } + } + if (item instanceof ItemHoe) + { + if (((ItemHoe)item).getMaterialName().equals("WOOD") || + ((ItemHoe)item).getMaterialName().equals("noobwood")) + { + return 400; + } + } + if (item == Items.stick) + { + return 200; + } + if (item == Items.coal) + { + return 3200; + } + if (item == Item.getItemFromBlock(Blocks.sapling)) + { + return 200; + } + + // Blaze Rods and Lava are invalid fuel sources for a kiln. + if (item == Items.blaze_rod) + { + return 0; + } + if (item == Items.lava_bucket) + { + return 0; + } + + return GameRegistry.getFuelValue(itemStack); + } + } + + @Override + public ItemStack getStackInSlot(int i) + { + return ovenStacks[i]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (ovenStacks[slot] != null) + { + ItemStack stack; + if (ovenStacks[slot].stackSize <= amount) + { + stack = ovenStacks[slot]; + ovenStacks[slot] = null; + return stack; + } + else + { + stack = ovenStacks[slot].splitStack(amount); + + if (ovenStacks[slot].stackSize == 0) + { + ovenStacks[slot] = null; + } + + return stack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (ovenStacks[slot] != null) + { + ItemStack stack = ovenStacks[slot]; + ovenStacks[slot] = null; + return stack; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + ovenStacks[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) + { + stack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + if (worldObj.getTileEntity(pos) != this) + { + return false; + } + else + { + return player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0d; + } + } + + @Override + public void openInventory(EntityPlayer playerIn) + { + } + + @Override + public void closeInventory(EntityPlayer playerIn) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return slot == OUTPUT ? false : slot == FUEL ? isItemFuel(stack) : true; + } + + @Override + public String getName() + { + return hasCustomName() ? ovenName : "container.brickoven"; + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public boolean hasCustomName() + { + return ovenName != null && ovenName.length() > 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < ovenStacks.length; i++) + { + ovenStacks[i] = null; + } + } + + @Override + public void update() + { + boolean flag = ovenBurnTime > 0; + boolean flag1 = false; + + if (ovenBurnTime > 0) + { + --ovenBurnTime; + } + + if (!worldObj.isRemote) + { + if (ovenBurnTime == 0 && canSmelt()) + { + currentItemBurnLength = ovenBurnTime = getItemBurnTime(ovenStacks[FUEL]); + + if (ovenBurnTime > 0) + { + flag1 = true; + if (ovenStacks[FUEL] != null) + { + --ovenStacks[FUEL].stackSize; + + if (ovenStacks[FUEL].stackSize == 0) + { + ovenStacks[FUEL] = ovenStacks[FUEL].getItem().getContainerItem(ovenStacks[FUEL]); + } + } + } + } + + if (isBurning() && canSmelt()) + { + ++ovenCookTime; + if (ovenCookTime == COOKTIME) + { + ovenCookTime = 0; + smeltItem(); + flag1 = true; + } + } + else + { + ovenCookTime = 0; + } + } + + if (flag != ovenBurnTime > 0) + { + flag1 = true; + BlockBrickOven.updateBlockState(ovenBurnTime > 0, worldObj, pos); + } + + if (flag1) + { + markDirty(); + } + } + + private boolean canSmelt() + { + boolean empty = true; + for (int i = INPUTSTART; i < ovenStacks.length; ++i) + { + if (ovenStacks[i] != null) + { + empty = false; + break; + } + } + + if (empty) + { + return false; + } + else + { + ItemStack stack = BrickOvenRecipeHandler.instance().findMatchingRecipe(this); + if (stack == null) + { + return false; + } + + if (ovenStacks[OUTPUT] == null) + { + return true; + } + if (!ovenStacks[OUTPUT].isItemEqual(stack)) + { + return false; + } + + int result = ovenStacks[OUTPUT].stackSize + stack.stackSize; + return result <= getInventoryStackLimit() && result <= ovenStacks[OUTPUT].getMaxStackSize(); + } + } + + public boolean isBurning() + { + return ovenBurnTime > 0; + } + + public void smeltItem() + { + if (canSmelt()) + { + ItemStack itemStack = BrickOvenRecipeHandler.instance().findMatchingRecipe(this); + + if (ovenStacks[OUTPUT] == null) + { + ovenStacks[OUTPUT] = itemStack.copy(); + } + else if (ovenStacks[OUTPUT].getItem() == itemStack.getItem()) + { + ovenStacks[OUTPUT].stackSize += itemStack.stackSize; + } + + for (int i = INPUTSTART; i < ovenStacks.length; ++i) + { + ItemStack stack = ovenStacks[i]; + + if (stack != null) + { + ItemStack containerItem = null; + + if (ovenStacks[i].getItem().hasContainerItem(ovenStacks[i])) + { + containerItem = ovenStacks[i].getItem().getContainerItem(ovenStacks[i]); + } + + --ovenStacks[i].stackSize; + + if (ovenStacks[i].stackSize <= 0) + { + ovenStacks[i] = null; + } + + if (containerItem != null) + { + ovenStacks[i] = containerItem; + } + } + } + } + } + + @SideOnly(Side.CLIENT) + public int getCookProgressScaled(int progress) + { + return ovenCookTime * progress / COOKTIME; + } + + @SideOnly(Side.CLIENT) + public int getBurnTimeRemainingScaled(int time) + { + if (currentItemBurnLength == 0) + { + currentItemBurnLength = COOKTIME; + } + + return ovenBurnTime * time / currentItemBurnLength; + } + + public void setBlockName(String displayName) + { + ovenName = displayName; + } + + @Override + public int[] getSlotsForFace(EnumFacing side) + { + if (side == EnumFacing.DOWN) + { + return slotsOutput; + } + else + { + return slotsInput; + } + } + + @Override + public boolean canInsertItem(int par1, ItemStack stack, EnumFacing side) + { + return isItemValidForSlot(par1, stack); + } + + public static boolean isItemFuel(ItemStack itemStack) + { + return getItemBurnTime(itemStack) > 0; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, EnumFacing side) + { + if (side == EnumFacing.DOWN) + { + return true; + } + + return false; + } + + public ItemStack getStackInRowAndColumn(int row, int column) + { + return getStackInSlot(INPUTSTART + row + column * 3); + } + + @Override + public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) + { + return new ContainerBrickOven(playerInventory, this); + } + + @Override + public String getGuiID() + { + return ModMain.MODID + ":brickOven"; + } + + +} + + +// Buffer diff --git a/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityCampfire.java b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityCampfire.java new file mode 100644 index 0000000..8c20a6a --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityCampfire.java @@ -0,0 +1,561 @@ +package net.einsteinsci.betterbeginnings.tileentity; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.blocks.BlockCampfire; +import net.einsteinsci.betterbeginnings.inventory.ContainerCampfire; +import net.einsteinsci.betterbeginnings.items.ItemPan; +import net.einsteinsci.betterbeginnings.register.recipe.CampfirePanRecipes; +import net.einsteinsci.betterbeginnings.register.recipe.CampfireRecipes; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.IInteractionObject; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class TileEntityCampfire extends TileEntity implements IInventory, IUpdatePlayerListBox, IInteractionObject +{ + public static final int maxCookTime = 300; + public static final int maxDecayTime = 400; // 20 sec + + public static final int SLOT_INPUT = 0; + public static final int SLOT_FUEL = 2; + public static final int SLOT_OUTPUT = 1; + public static final int SLOT_PAN = 3; + + public ItemStack[] stacks = new ItemStack[4]; + + public int cookTime; + public int burnTime; + public int currentItemBurnTime; + public int decayTime; + + private String campfireName; + + public TileEntityCampfire() + { + super(); + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + + // ItemStacks + NBTTagList tagList = tagCompound.getTagList("Items", 10); + stacks = new ItemStack[getSizeInventory()]; + + for (int i = 0; i < tagList.tagCount(); ++i) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + byte slot = itemTag.getByte("Slot"); + + if (slot >= 0 && slot < stacks.length) + { + stacks[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + + // Burn Time & Cook Time + burnTime = tagCompound.getShort("BurnTime"); + cookTime = tagCompound.getShort("CookTime"); + currentItemBurnTime = getBurnTimeForFuel(stackFuel()); + decayTime = tagCompound.getShort("DecayTime"); + + if (tagCompound.hasKey("CustomName", 8)) + { + campfireName = tagCompound.getString("CustomName"); + } + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + + tagCompound.setShort("BurnTime", (short)burnTime); + tagCompound.setShort("CookTime", (short)cookTime); + tagCompound.setShort("DecayTIme", (short)decayTime); + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < stacks.length; ++i) + { + if (stacks[i] != null) + { + NBTTagCompound itemTag = new NBTTagCompound(); + stacks[i].writeToNBT(itemTag); + itemTag.setByte("Slot", (byte)i); + tagList.appendTag(itemTag); + } + } + + tagCompound.setTag("Items", tagList); + if (hasCustomName()) + { + tagCompound.setString("CustomName", campfireName); + } + } + + @Override + public int getSizeInventory() + { + return stacks.length; + } + + public static int getBurnTimeForFuel(ItemStack fuel) + { + if (fuel == null) + { + return 0; + } + + Block block = Block.getBlockFromItem(fuel.getItem()); + Item item = fuel.getItem(); + + if (block != null) + { + if (block.getMaterial() == Material.wood) + { + return 600; + } + if (block == Blocks.coal_block) + { + return 16000; + } + if (block == Blocks.wooden_slab) + { + return 300; + } + if (block == Blocks.sapling) + { + return 200; + } + } + + if (item != null) + { + if (item instanceof ItemTool) + { + if (((ItemTool)item).getToolMaterialName().equals("WOOD") || + ((ItemTool)item).getToolMaterialName().equals("noobwood")) + { + return 400; + } + } + if (item instanceof ItemSword) + { + if (((ItemSword)item).getToolMaterialName().equals("WOOD") || + ((ItemSword)item).getToolMaterialName().equals("noobwood")) + { + return 400; + } + } + if (item instanceof ItemHoe) + { + if (((ItemHoe)item).getMaterialName().equals("WOOD") || + ((ItemHoe)item).getMaterialName().equals("noobwood")) + { + return 400; + } + } + if (item == Items.stick) + { + return 200; + } + if (item == Items.coal) + { + return 1600; + } + } + + return 0; + } + + public ItemStack stackFuel() + { + return stacks[SLOT_FUEL]; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return stacks[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (stacks[slot] != null) + { + ItemStack stack; + if (stacks[slot].stackSize <= amount) + { + stack = stacks[slot]; + stacks[slot] = null; + return stack; + } + else + { + stack = stacks[slot].splitStack(amount); + + if (stacks[slot].stackSize == 0) + { + stacks[slot] = null; + } + + return stack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (stacks[slot] == null) + { + return null; + } + + ItemStack stack = stacks[slot].copy(); + stacks[slot] = null; + return stack; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + stacks[slot] = stack; + } + + @Override + public int getInventoryStackLimit() + { + return 16; //Not 64 + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + if (worldObj.getTileEntity(pos) != this) + { + return false; + } + else + { + return player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0d; + } + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return slot == SLOT_INPUT || slot == SLOT_PAN && isPan(stack) || slot == SLOT_FUEL && isItemFuel(stack); + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < stacks.length; i++) + { + stacks[i] = null; + } + } + + @Override + public String getName() + { + return hasCustomName() ? campfireName : "container.campfire"; + } + + private static boolean isPan(ItemStack stack) + { + if (stack == null) + { + return false; + } + + return stack.getItem() instanceof ItemPan; + } + + public static boolean isItemFuel(ItemStack itemstack1) + { + return getBurnTimeForFuel(itemstack1) > 0; + } + + @Override + public boolean hasCustomName() + { + return campfireName != null && campfireName.length() > 0; + } + + @Override + public void update() + { + boolean burning = burnTime > 0; + boolean dirty = false; + + if (burning) + { + burnTime--; + decayTime = maxDecayTime; + } + else + { + decayTime = Math.max(0, decayTime - 1); + } + + if (!worldObj.isRemote) + { + if (burnTime == 0 && canCook() && isDecaying()) //only start fuel if lit (w/ F&S or Fire Bow) + { + burnTime = getBurnTimeForFuel(stackFuel()); + currentItemBurnTime = burnTime; + if (burnTime > 0) + { + decayTime = maxDecayTime; + burning = true; + } + + if (burning) + { + dirty = true; + if (stackFuel() != null) + { + stackFuel().stackSize--; + + if (stackFuel().stackSize <= 0) + { + stacks[SLOT_FUEL] = null; + } + } + } + } + + if (isDecaying() && canCook()) + { + cookTime++; + if (cookTime == maxCookTime) + { + cookTime = 0; + cookItem(); // Tadaaa! + dirty = true; + } + } + else + { + cookTime = 0; + } + } + + if (burning != decayTime > 0) + { + dirty = true; + BlockCampfire.updateBlockState(decayTime > 0, worldObj, pos); + } + + if (dirty) + { + markDirty(); + } + } + + public boolean canCook() + { + if (stackInput() == null) + { + return false; + } + + ItemStack potentialResult = CampfirePanRecipes.smelting().getSmeltingResult(stackInput()); + if (potentialResult == null || stackPan() == null) + { + potentialResult = CampfireRecipes.smelting().getSmeltingResult(stackInput()); + } + + if (potentialResult == null) + { + return false; // instant no if there's no recipe + } + + if (stackOutput() == null) + { + return true; // instant yes if output is open + } + if (!stackOutput().isItemEqual(potentialResult)) + { + return false; // instant no if output doesn't match recipe + } + + int resultSize = stackOutput().stackSize + potentialResult.stackSize; + boolean canFit = resultSize <= getInventoryStackLimit(); + boolean canFitWithItem = resultSize <= stackOutput().getMaxStackSize(); + return canFit && canFitWithItem; + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + public boolean isDecaying() + { + return decayTime > 0; + } + + private void cookItem() + { + if (canCook()) + { + ItemStack potentialResult = CampfirePanRecipes.smelting().getSmeltingResult(stackInput()); + if (potentialResult == null || stackPan() == null) + { + potentialResult = CampfireRecipes.smelting().getSmeltingResult(stackInput()); + } + + if (stackOutput() == null) + { + stacks[SLOT_OUTPUT] = potentialResult.copy(); + } + else if (stackOutput().isItemEqual(potentialResult)) + { + stackOutput().stackSize += potentialResult.stackSize; + } + + stackInput().stackSize--; + + if (stackInput().stackSize <= 0) + { + stacks[SLOT_INPUT] = null; + } + + if (stacks[SLOT_PAN] != null) + { + if (stacks[SLOT_PAN].getItem() instanceof ItemPan) + { + int damage = stacks[SLOT_PAN].getItemDamage(); + stacks[SLOT_PAN].setItemDamage(damage + 1); + + if (stacks[SLOT_PAN].getItemDamage() >= stacks[SLOT_PAN].getMaxDamage()) + { + stacks[SLOT_PAN] = null; + } + } + } + } + } + + public ItemStack stackInput() + { + return stacks[SLOT_INPUT]; + } + + public ItemStack stackPan() + { + return stacks[SLOT_PAN]; + } + + public ItemStack stackOutput() + { + return stacks[SLOT_OUTPUT]; + } + + public void lightFuel() + { + int maxBurn = getBurnTimeForFuel(stackFuel()); + if (maxBurn > 0) + { + if (canCook()) + { + burnTime = maxBurn; + decayTime = maxDecayTime; + } + } + } + + public boolean isBurning() + { + return burnTime > 0; + } + + @SideOnly(Side.CLIENT) + public int getCookProgressScaled(int i) + { + return cookTime * i / maxCookTime; + } + + @SideOnly(Side.CLIENT) + public int getBurnTimeRemainingScaled(int i) + { + if (currentItemBurnTime <= 0) + { + return 0; + } + + return burnTime * i / currentItemBurnTime; + } + + public int getDecayTimeRemainingScaled(int i) + { + return decayTime * i / maxDecayTime; + } + + @Override + public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) + { + return new ContainerCampfire(playerInventory, this); + } + + @Override + public String getGuiID() + { + return ModMain.MODID + ":campfire"; + } + + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityEnderSmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityEnderSmelter.java new file mode 100644 index 0000000..0c6eed5 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityEnderSmelter.java @@ -0,0 +1,535 @@ +package net.einsteinsci.betterbeginnings.tileentity; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.blocks.BlockEnderSmelter; +import net.einsteinsci.betterbeginnings.inventory.ContainerEnderSmelter; +import net.einsteinsci.betterbeginnings.register.recipe.SmelterRecipeHandler; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.IInteractionObject; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.Random; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class TileEntityEnderSmelter extends TileEntity implements IUpdatePlayerListBox, ISidedInventory, + IInteractionObject +{ + public static final int smeltTime = 140; + public static final int INPUT = 0; + public static final int FUEL = 1; + public static final int OUTPUT = 2; + public static final int GRAVEL = 3; + public static final Random random = new Random(); + private static final int[] slotsTop = new int[] {0}; + private static final int[] slotsBottom = new int[] {2, 1}; + private static final int[] slotsSides = new int[] {1}; + public int smelterBurnTime; + public int currentItemBurnLength; + public int smelterCookTime; + public boolean oreDoubled = false; + private ItemStack[] smelterStacks = new ItemStack[4]; + private String smelterName; + + public TileEntityEnderSmelter() + { + super(); + } + + public void setBlockName(String string) + { + smelterName = string; + } + + @SideOnly(Side.CLIENT) + public int getCookProgressScaled(int progress) + { + return smelterCookTime * progress / smeltTime; + } + + @SideOnly(Side.CLIENT) + public int getBurnTimeRemainingScaled(int time) + { + if (currentItemBurnLength == 0) + { + currentItemBurnLength = smeltTime; + } + + return smelterBurnTime * time / currentItemBurnLength; + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + + // ItemStacks + NBTTagList tagList = tagCompound.getTagList("Items", 10); + smelterStacks = new ItemStack[getSizeInventory()]; + + for (int i = 0; i < tagList.tagCount(); ++i) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + byte slot = itemTag.getByte("Slot"); + + if (slot >= 0 && slot < smelterStacks.length) + { + smelterStacks[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + + // Burn Time & Cook Time + smelterBurnTime = tagCompound.getShort("BurnTime"); + smelterCookTime = tagCompound.getShort("CookTime"); + currentItemBurnLength = getItemBurnTime(smelterStacks[FUEL]); + + if (tagCompound.hasKey("CustomName", 8)) + { + smelterName = tagCompound.getString("CustomName"); + } + + oreDoubled = tagCompound.getByte("oreDoubled") == 1; + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + + tagCompound.setShort("BurnTime", (short)smelterBurnTime); + tagCompound.setShort("CookTime", (short)smelterCookTime); + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < smelterStacks.length; ++i) + { + if (smelterStacks[i] != null) + { + NBTTagCompound itemTag = new NBTTagCompound(); + smelterStacks[i].writeToNBT(itemTag); + itemTag.setByte("Slot", (byte)i); + tagList.appendTag(itemTag); + } + } + + tagCompound.setTag("Items", tagList); + if (hasCustomName()) + { + tagCompound.setString("CustomName", smelterName); + } + + tagCompound.setByte("oreDoubled", oreDoubled ? (byte)1 : (byte)0); + } + + @Override + public int getSizeInventory() + { + return smelterStacks.length; + } + + public static int getItemBurnTime(ItemStack itemStack) + { + if (itemStack == null) + { + return 0; + } + else + { + Item item = itemStack.getItem(); + + if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air) + { + Block block = Block.getBlockFromItem(item); + } + + // Charcoal + if (item == Items.coal && itemStack.getItemDamage() == 1) + { + return 1600; + } + + // Blaze Rods and Lava are valid fuel sources for a Smelter. + if (item == Items.blaze_rod) + { + return 600; + } + if (item == Items.lava_bucket) + { + return 7200; + } + + // Ender eyes and pearls are great fuel sources for the ender furnace. + if (item == Items.ender_pearl) + { + return 1200; + } + if (item == Items.ender_eye) + { + return 2400; + } + + return GameRegistry.getFuelValue(itemStack); + } + } + + @Override + public ItemStack getStackInSlot(int i) + { + return smelterStacks[i]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (smelterStacks[slot] != null) + { + ItemStack stack; + if (smelterStacks[slot].stackSize <= amount) + { + stack = smelterStacks[slot]; + smelterStacks[slot] = null; + return stack; + } + else + { + stack = smelterStacks[slot].splitStack(amount); + + if (smelterStacks[slot].stackSize == 0) + { + smelterStacks[slot] = null; + } + + return stack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (smelterStacks[slot] != null) + { + ItemStack stack = smelterStacks[slot]; + smelterStacks[slot] = null; + return stack; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + smelterStacks[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) + { + stack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + if (worldObj.getTileEntity(pos) != this) + { + return false; + } + else + { + return player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0d; + } + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return slot == 2 ? false : slot == 1 ? isItemFuel(stack) : true; + } + + @Override + public String getName() + { + return hasCustomName() ? smelterName : "container.enderSmelter"; + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public boolean hasCustomName() + { + return smelterName != null && smelterName.length() > 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < smelterStacks.length; i++) + { + smelterStacks[i] = null; + } + } + + @Override + public void update() + { + boolean flag = smelterBurnTime > 0; + boolean flag1 = false; + + if (smelterBurnTime > 0) + { + --smelterBurnTime; + } + + if (!worldObj.isRemote) + { + if (smelterBurnTime == 0 && canSmelt()) + { + currentItemBurnLength = smelterBurnTime = getItemBurnTime(smelterStacks[FUEL]); + + if (smelterBurnTime > 0) + { + flag1 = true; + if (smelterStacks[FUEL] != null) + { + --smelterStacks[FUEL].stackSize; + + if (smelterStacks[FUEL].stackSize == 0) + { + smelterStacks[FUEL] = smelterStacks[FUEL].getItem().getContainerItem(smelterStacks[FUEL]); + } + } + } + } + + if (isBurning() && canSmelt()) + { + ++smelterCookTime; + if (smelterCookTime == smeltTime) + { + smelterCookTime = 0; + smeltItem(); + flag1 = true; + } + } + else + { + smelterCookTime = 0; + } + } + + if (flag != smelterBurnTime > 0) + { + flag1 = true; + BlockEnderSmelter.updateBlockState(smelterBurnTime > 0, worldObj, pos); + } + + if (flag1) + { + markDirty(); + } + } + + private boolean canSmelt() + { + if (smelterStacks[INPUT] == null || smelterStacks[GRAVEL] == null) + { + return false; + } + else + { + ItemStack output = SmelterRecipeHandler.smelting().getSmeltingResult(smelterStacks[INPUT]); + int gravelNeeded = SmelterRecipeHandler.smelting().getGravelCount(smelterStacks[INPUT]); + int bonus = SmelterRecipeHandler.smelting().getBonus(smelterStacks[INPUT]); + + if (output == null) + { + return false; + } + + if (gravelNeeded > smelterStacks[GRAVEL].stackSize) + { + return false; + } + + if (smelterStacks[OUTPUT] == null) + { + return true; + } + if (!smelterStacks[OUTPUT].isItemEqual(output)) + { + return false; + } + + int result = smelterStacks[OUTPUT].stackSize + output.stackSize + bonus; + return result <= getInventoryStackLimit() && result <= smelterStacks[OUTPUT].getMaxStackSize(); + } + } + + public boolean isBurning() + { + return smelterBurnTime > 0; + } + + public void smeltItem() + { + if (canSmelt()) + { + ItemStack itemStack = SmelterRecipeHandler.smelting().getSmeltingResult(smelterStacks[INPUT]); + + int bonus = SmelterRecipeHandler.smelting().getBonus(smelterStacks[INPUT]); + float chance = SmelterRecipeHandler.smelting().getBonusChance(smelterStacks[INPUT]); + int resultSize = itemStack.stackSize; + if (random.nextFloat() < chance) + { + resultSize += bonus; + oreDoubled = true; + } + + if (smelterStacks[OUTPUT] == null) + { + smelterStacks[OUTPUT] = itemStack.copy(); + } + else if (smelterStacks[OUTPUT].getItem() == itemStack.getItem()) + { + smelterStacks[OUTPUT].stackSize += resultSize; + } + + int gravelUsed = SmelterRecipeHandler.smelting().getGravelCount(smelterStacks[INPUT]); + + --smelterStacks[INPUT].stackSize; + + if (smelterStacks[INPUT].stackSize <= 0) + { + smelterStacks[INPUT] = null; + } + smelterStacks[GRAVEL].stackSize -= gravelUsed; + + if (smelterStacks[GRAVEL].stackSize <= 0) + { + smelterStacks[GRAVEL] = null; + } + } + } + + @Override + public int[] getSlotsForFace(EnumFacing side) + { + if (side == EnumFacing.DOWN) + { + return slotsBottom; + } + else if (side == EnumFacing.UP) + { + return slotsTop; + } + + return slotsSides; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, EnumFacing side) + { + return isItemValidForSlot(slot, stack); + } + + public static boolean isItemFuel(ItemStack itemStack) + { + return getItemBurnTime(itemStack) > 0; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, EnumFacing side) + { + if (slot == OUTPUT) + { + return true; + } + else if (stack.getItem() instanceof ItemBucket) + { + return true; + } + else if (side != EnumFacing.UP) + { + return true; + } + + return false; + } + + @Override + public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) + { + return new ContainerEnderSmelter(playerInventory, this); + } + + @Override + public String getGuiID() + { + return ModMain.MODID + ":enderSmelter"; + } + + + + + + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityKiln.java new file mode 100644 index 0000000..85c1a37 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityKiln.java @@ -0,0 +1,525 @@ +package net.einsteinsci.betterbeginnings.tileentity; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.blocks.BlockKiln; +import net.einsteinsci.betterbeginnings.inventory.ContainerKiln; +import net.einsteinsci.betterbeginnings.register.recipe.KilnRecipes; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.IInteractionObject; +import net.minecraftforge.fml.common.registry.GameRegistry; + +public class TileEntityKiln extends TileEntity implements IUpdatePlayerListBox, ISidedInventory, IInteractionObject +{ + public static final int smeltTime = 250; + private static final int[] slotsTop = new int[] {0}; + private static final int[] slotsBottom = new int[] {2, 1}; + private static final int[] slotsSides = new int[] {1}; + public ItemStack[] kilnStacks = new ItemStack[3]; + + public int kilnBurnTime; + public int currentBurnTime; + + public int kilnCookTime; + + // Where to look for the other kiln (1 = up, -1 = down, 0 = solo) + // public int stacked; + + private String kilnName; + + public TileEntityKiln() + { + super(); + } + + public void setBlockName(String string) + { + kilnName = string; + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + + // ItemStacks + NBTTagList tagList = tagCompound.getTagList("Items", 10); + kilnStacks = new ItemStack[getSizeInventory()]; + + for (int i = 0; i < tagList.tagCount(); ++i) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + byte slot = itemTag.getByte("Slot"); + + if (slot >= 0 && slot < kilnStacks.length) + { + kilnStacks[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + + // Burn Time & Cook Time + kilnBurnTime = tagCompound.getShort("BurnTime"); + kilnCookTime = tagCompound.getShort("CookTime"); + currentBurnTime = getItemBurnTime(kilnStacks[1]); + + if (tagCompound.hasKey("CustomName", 8)) + { + kilnName = tagCompound.getString("CustomName"); + } + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + + tagCompound.setShort("BurnTime", (short)kilnBurnTime); + tagCompound.setShort("CookTime", (short)kilnCookTime); + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < kilnStacks.length; ++i) + { + if (kilnStacks[i] != null) + { + NBTTagCompound itemTag = new NBTTagCompound(); + kilnStacks[i].writeToNBT(itemTag); + itemTag.setByte("Slot", (byte)i); + tagList.appendTag(itemTag); + } + } + + tagCompound.setTag("Items", tagList); + if (hasCustomName()) + { + tagCompound.setString("CustomName", kilnName); + } + } + + @Override + public int getSizeInventory() + { + return kilnStacks.length; + } + + public static int getItemBurnTime(ItemStack itemStack) + { + if (itemStack == null) + { + return 0; + } + else + { + Item item = itemStack.getItem(); + + if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air) + { + Block block = Block.getBlockFromItem(item); + + // Insert any additional block fuels here + if (block == Blocks.wooden_slab) + { + return 150; + } + + if (block.getMaterial() == Material.wood) + { + return 300; + } + + if (block == Blocks.coal_block) + { + return 16000; + } + + // INFINITE POWER!!! + if (block == Blocks.bedrock) + { + return Short.MAX_VALUE; + } + } + + if (item instanceof ItemTool) + { + if (((ItemTool)item).getToolMaterialName().equals("WOOD") || + ((ItemTool)item).getToolMaterialName().equals("noobwood")) + { + return 200; + } + } + if (item instanceof ItemSword) + { + if (((ItemSword)item).getToolMaterialName().equals("WOOD") || + ((ItemSword)item).getToolMaterialName().equals("noobwood")) + { + return 200; + } + } + if (item instanceof ItemHoe) + { + if (((ItemHoe)item).getMaterialName().equals("WOOD") || + ((ItemHoe)item).getMaterialName().equals("noobwood")) + { + return 200; + } + } + if (item == Items.stick) + { + return 100; + } + if (item == Items.coal) + { + return 1600; + } + if (item == Item.getItemFromBlock(Blocks.sapling)) + { + return 100; + } + + // Blaze Rods and Lava are invalid fuel sources for a kiln. + if (item == Items.blaze_rod) + { + return 0; + } + if (item == Items.lava_bucket) + { + return 0; + } + + return GameRegistry.getFuelValue(itemStack); + } + } + + @Override + public ItemStack getStackInSlot(int i) + { + return kilnStacks[i]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (kilnStacks[slot] != null) + { + ItemStack stack; + if (kilnStacks[slot].stackSize <= amount) + { + stack = kilnStacks[slot]; + kilnStacks[slot] = null; + return stack; + } + else + { + stack = kilnStacks[slot].splitStack(amount); + + if (kilnStacks[slot].stackSize == 0) + { + kilnStacks[slot] = null; + } + + return stack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (kilnStacks[slot] != null) + { + ItemStack stack = kilnStacks[slot]; + kilnStacks[slot] = null; + return stack; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + kilnStacks[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) + { + stack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + if (worldObj.getTileEntity(pos) != this) + { + return false; + } + else + { + BlockPos buf = new BlockPos(pos.getX() + 0.5d, pos.getY() + 0.5d, pos.getZ() + 0.5d); + return player.getDistanceSq(buf) <= 64.0d; + } + } + + @Override + public void openInventory(EntityPlayer playerIn) + { + } + + @Override + public void closeInventory(EntityPlayer playerIn) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return slot == 2 ? false : slot == 1 ? isItemFuel(stack) : true; + } + + @Override + public String getName() + { + return hasCustomName() ? kilnName : "container.kiln"; + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public boolean hasCustomName() + { + return kilnName != null && kilnName.length() > 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < kilnStacks.length; i++) + { + kilnStacks[i] = null; + } + } + + @Override + public void update() + { + boolean flag = kilnBurnTime > 0; + boolean flag1 = false; + + if (kilnBurnTime > 0) + { + --kilnBurnTime; + } + + if (!worldObj.isRemote) + { + if (kilnBurnTime == 0 && canSmelt()) + { + currentBurnTime = kilnBurnTime = getItemBurnTime(kilnStacks[1]); + + if (kilnBurnTime > 0) + { + flag1 = true; + if (kilnStacks[1] != null) + { + --kilnStacks[1].stackSize; + + if (kilnStacks[1].stackSize == 0) + { + kilnStacks[1] = kilnStacks[1].getItem().getContainerItem(kilnStacks[1]); + } + } + } + } + + if (isBurning() && canSmelt()) + { + ++kilnCookTime; + if (kilnCookTime == smeltTime) + { + kilnCookTime = 0; + smeltItem(); + flag1 = true; + } + } + else + { + kilnCookTime = 0; + } + } + + if (flag != kilnBurnTime > 0) + { + flag1 = true; + BlockKiln.updateBlockState(kilnBurnTime > 0, worldObj, pos); + } + + if (flag1) + { + markDirty(); + } + } + + private boolean canSmelt() + { + if (kilnStacks[0] == null) + { + return false; + } + else + { + ItemStack stack = KilnRecipes.smelting().getSmeltingResult(kilnStacks[0]); + if (stack == null) + { + return false; + } + + if (kilnStacks[2] == null) + { + return true; + } + if (!kilnStacks[2].isItemEqual(stack)) + { + return false; + } + + int result = kilnStacks[2].stackSize + stack.stackSize; + return result <= getInventoryStackLimit() && result <= kilnStacks[2].getMaxStackSize(); + } + } + + public boolean isBurning() + { + return kilnBurnTime > 0; + } + + public void smeltItem() + { + if (canSmelt()) + { + ItemStack itemStack = KilnRecipes.smelting().getSmeltingResult(kilnStacks[0]); + + if (kilnStacks[2] == null) + { + kilnStacks[2] = itemStack.copy(); + } + else if (kilnStacks[2].getItem() == itemStack.getItem()) + { + kilnStacks[2].stackSize += itemStack.stackSize; + } + + --kilnStacks[0].stackSize; + + if (kilnStacks[0].stackSize <= 0) + { + kilnStacks[0] = null; + } + } + } + + public int getCookProgressScaled(int progress) + { + return kilnCookTime * progress / smeltTime; + } + + public int getBurnTimeRemainingScaled(int time) + { + if (currentBurnTime <= 0) + { + currentBurnTime = smeltTime; + } + + return kilnBurnTime * time / currentBurnTime; + } + + @Override + public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) + { + return new ContainerKiln(playerInventory, this); + } + + @Override + public String getGuiID() + { + return ModMain.MODID + ":kiln"; + } + + @Override + public int[] getSlotsForFace(EnumFacing side) + { + if (side == EnumFacing.DOWN) + { + return slotsBottom; + } + else if (side == EnumFacing.UP) + { + return slotsTop; + } + else + { + return slotsSides; + } + } + + @Override + public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) + { + return isItemValidForSlot(index, itemStackIn); + } + + public static boolean isItemFuel(ItemStack itemStack) + { + return getItemBurnTime(itemStack) > 0; + } + + @Override + public boolean canExtractItem(int par1, ItemStack stack, EnumFacing par3) + { + return par3 != EnumFacing.UP || par1 != 1 || stack.getItem() == Items.bucket; + } + + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityNetherBrickOven.java b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityNetherBrickOven.java new file mode 100644 index 0000000..8a46e2d --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityNetherBrickOven.java @@ -0,0 +1,615 @@ +package net.einsteinsci.betterbeginnings.tileentity; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.blocks.BlockNetherBrickOven; +import net.einsteinsci.betterbeginnings.inventory.ContainerNetherBrickOven; +import net.einsteinsci.betterbeginnings.inventory.TankNetherBrickOvenFuel; +import net.einsteinsci.betterbeginnings.network.PacketNetherBrickOvenFuelLevel; +import net.einsteinsci.betterbeginnings.register.recipe.NetherBrickOvenRecipeHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.IInteractionObject; +import net.minecraftforge.fluids.*; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +/** + * Created by einsteinsci on 8/21/2014. + */ +public class TileEntityNetherBrickOven extends TileEntity implements ISidedInventory, IFluidHandler, + IUpdatePlayerListBox, IInteractionObject +{ + public static final int FUELINPUT = 0; + public static final int OUTPUT = 1; + public static final int INPUTSTART = 2; + public static final int COOKTIME = 80; + /** + * Fuel used in mb per operation * + */ + public static final float FUELFORLAVA = 8; // 512 mb per stack + public static final int MINIMUMTEMPERATURE = 500; + public int ovenCookTime; + public TankNetherBrickOvenFuel fuelTank; + private int[] slotsInput = new int[] {FUELINPUT}; + private int[] slotsOutput = new int[] {OUTPUT}; + private ItemStack[] ovenStacks = new ItemStack[11]; + private String ovenName; + + public TileEntityNetherBrickOven() + { + super(); + fuelTank = new TankNetherBrickOvenFuel(this, 8000); + } + + public FluidStack getFuelStack() + { + return fuelTank.getFluid(); + } + + @Override + public int fill(EnumFacing from, FluidStack resource, boolean doFill) + { + int result = fuelTank.fill(resource, doFill); + markDirty(); + worldObj.markBlockForUpdate(pos); + return result; + } + + @Override + public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) + { + return null; + + /* + if (resource.isFluidEqual(fuelTank.getFluid())) + { + return fuelTank.drain(resource.amount, doDrain); + } + else + { + return fuelTank.drain(0, doDrain); + } + */ + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + + // ItemStacks + NBTTagList tagList = tagCompound.getTagList("Items", 10); + ovenStacks = new ItemStack[getSizeInventory()]; + + for (int i = 0; i < tagList.tagCount(); ++i) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + byte slot = itemTag.getByte("Slot"); + + if (slot >= 0 && slot < ovenStacks.length) + { + ovenStacks[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + + // Cook Time + ovenCookTime = tagCompound.getShort("CookTime"); + fuelTank = (TankNetherBrickOvenFuel)fuelTank.readFromNBT(tagCompound); + + if (tagCompound.hasKey("CustomName")) + { + ovenName = tagCompound.getString("CustomName"); + } + } + + @Override + public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) + { + return null; + //return fuelTank.drain(maxDrain, doDrain); + } + + @Override + public boolean canFill(EnumFacing from, Fluid fluid) + { + return true; + + /* + if (fuelTank.getFluid() == null) + { + return true; + } + + return fuelTank.getFluidAmount() < fuelTank.getCapacity() && fuelTank.getFluid().getFluid() == fluid; + */ + } + + @Override + public boolean canDrain(EnumFacing from, Fluid fluid) + { + return false; + + /* + if (fuelTank.getFluid() == null) + { + return false; + } + + return fuelTank.getFluidAmount() > 0 && fuelTank.getFluid().getFluid() == fluid; + */ + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + + tagCompound.setShort("CookTime", (short)ovenCookTime); + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < ovenStacks.length; ++i) + { + if (ovenStacks[i] != null) + { + NBTTagCompound itemTag = new NBTTagCompound(); + ovenStacks[i].writeToNBT(itemTag); + itemTag.setByte("Slot", (byte)i); + tagList.appendTag(itemTag); + } + } + + tagCompound.setTag("Items", tagList); + + fuelTank.writeToNBT(tagCompound); + + if (hasCustomName()) + { + tagCompound.setString("CustomName", ovenName); + } + } + + @Override + public FluidTankInfo[] getTankInfo(EnumFacing from) + { + return new FluidTankInfo[] {new FluidTankInfo(fuelTank.getFluid(), fuelTank.getCapacity())}; + } + + @Override + public void update() + { + boolean flag = canSmelt(); + boolean flag1 = false; + + if (!worldObj.isRemote) + { + if (canSmelt()) + { + ++ovenCookTime; + if (ovenCookTime == COOKTIME) + { + ovenCookTime = 0; + smeltItem(); + flag1 = true; + } + } + else + { + ovenCookTime = 0; + } + BlockNetherBrickOven.updateBlockState(canSmelt(), worldObj, pos); + + if (ovenStacks[FUELINPUT] != null) + { + if (fuelTank.fillFromContainer(ovenStacks[FUELINPUT])) + { + ovenStacks[FUELINPUT] = ovenStacks[FUELINPUT].getItem().getContainerItem(ovenStacks[FUELINPUT]); + + NetworkRegistry.TargetPoint point = new NetworkRegistry.TargetPoint( + worldObj.provider.getDimensionId(), pos.getX(), pos.getY(), pos.getZ(), 16.0d); + ModMain.network.sendToAllAround(new PacketNetherBrickOvenFuelLevel( + pos, fuelTank.getFluid()), point); + } + } + } + + if (flag != canSmelt()) + { + flag1 = true; + } + + if (flag1) + { + markDirty(); + } + } + + public boolean canSmelt() + { + if (fuelTank.getFluidAmount() <= 0 || getFuelNeededForSmelt() > fuelTank.getFluidAmount()) + { + return false; + } + + boolean empty = true; + for (int i = INPUTSTART; i < ovenStacks.length; ++i) + { + if (ovenStacks[i] != null) + { + empty = false; + break; + } + } + + if (empty) + { + return false; + } + else + { + ItemStack stack = NetherBrickOvenRecipeHandler.instance().findMatchingRecipe(this); + if (stack == null) + { + return false; + } + + if (ovenStacks[OUTPUT] == null) + { + return true; + } + if (!ovenStacks[OUTPUT].isItemEqual(stack)) + { + return false; + } + + int outputNewSize = ovenStacks[OUTPUT].stackSize + stack.stackSize; + boolean result = outputNewSize <= getInventoryStackLimit() && outputNewSize <= ovenStacks[OUTPUT] + .getMaxStackSize(); + return result; + } + } + + public void smeltItem() + { + if (canSmelt()) + { + ItemStack itemStack = NetherBrickOvenRecipeHandler.instance().findMatchingRecipe(this); + + if (ovenStacks[OUTPUT] == null) + { + ovenStacks[OUTPUT] = itemStack.copy(); + } + else if (ovenStacks[OUTPUT].getItem() == itemStack.getItem()) + { + ovenStacks[OUTPUT].stackSize += itemStack.stackSize; + } + + for (int i = INPUTSTART; i < ovenStacks.length; ++i) + { + ItemStack stack = ovenStacks[i]; + + if (stack != null) + { + ItemStack containerItem = null; + + if (ovenStacks[i].getItem().hasContainerItem(ovenStacks[i])) + { + containerItem = ovenStacks[i].getItem().getContainerItem(ovenStacks[i]); + } + + --ovenStacks[i].stackSize; + + if (ovenStacks[i].stackSize <= 0) + { + ovenStacks[i] = null; + } + + if (containerItem != null) + { + ovenStacks[i] = containerItem; + } + } + } + + fuelTank.getFluid().amount -= getFuelNeededForSmelt(); + } + + NetworkRegistry.TargetPoint point = new NetworkRegistry.TargetPoint( + worldObj.provider.getDimensionId(), pos.getX(), pos.getY(), pos.getZ(), 16.0d); + ModMain.network.sendToAllAround(new PacketNetherBrickOvenFuelLevel(pos, fuelTank.getFluid()), point); + } + + public int getFuelNeededForSmelt() + { + if (fuelTank.getFluid() == null) + { + return 0; + } + + float temperature = (float)fuelTank.getFluid().getFluid().getTemperature(); + + // Math! + float precise = FUELFORLAVA * FluidRegistry.LAVA.getTemperature() / temperature; + + int result = (int)precise; + + if (result <= 0) + { + result = 1; // No free smelting if you have blazing pyrotheum or something even hotter. + } + + return result; + } + + @Override + public Packet getDescriptionPacket() + { + NBTTagCompound tag = new NBTTagCompound(); + writeToNBT(tag); + return new S35PacketUpdateTileEntity(pos, 1, tag); + } + + @Override + public int[] getSlotsForFace(EnumFacing side) + { + if (side == EnumFacing.DOWN) + { + return slotsOutput; + } + else + { + return slotsInput; + } + } + + @Override + public boolean canInsertItem(int par1, ItemStack stack, EnumFacing side) + { + return isItemValidForSlot(par1, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, EnumFacing side) + { + return side == EnumFacing.DOWN; + } + + @Override + public void onDataPacket(NetworkManager manager, S35PacketUpdateTileEntity packet) + { + readFromNBT(packet.getNbtCompound()); + } + + public boolean isItemFuelContainer(ItemStack stack) + { + if (FluidContainerRegistry.isContainer(stack)) + { + FluidStack fluid = FluidContainerRegistry.getFluidForFilledItem(stack); + + if (fluid != null) + { + return fluid.getFluid().getTemperature() > MINIMUMTEMPERATURE; + } + } + + return false; + } + + @SideOnly(Side.CLIENT) + public int getCookProgressScaled(int progress) + { + return ovenCookTime * progress / COOKTIME; + } + + public void furnaceName(String displayName) + { + ovenName = displayName; + } + + public ItemStack getStackInRowAndColumn(int row, int column) + { + return getStackInSlot(INPUTSTART + row + column * 3); + } + + public int getFuelLevelScaled(int maxLevel) + { + float levelAbs = getFuelLevel(); + float capacity = fuelTank.getCapacity(); + float level = levelAbs / capacity; + float scaled = level * (float)maxLevel; + + return (int)scaled; + } + + public int getFuelLevel() + { + return fuelTank.getFluidAmount(); + } + + //I think this will only be called on the client side + public void setFuelLevel(FluidStack fluid) + { + fuelTank.setFluid(fluid); + } + + @Override + public String getName() + { + return hasCustomName() ? ovenName : "container.netherbrickoven"; + } + + @Override + public boolean hasCustomName() + { + return ovenName != null && ovenName.length() > 0; + } + + @Override + public IChatComponent getDisplayName() + { + return null; + } + + @Override + public int getSizeInventory() + { + return ovenStacks.length; + } + + public void setBlockName(String name) + { + ovenName = name; + } + + @Override + public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) + { + return new ContainerNetherBrickOven(playerInventory, this); + } + + @Override + public String getGuiID() + { + return ModMain.MODID + ":netherBrickOven"; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return ovenStacks[slot]; + } + + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (ovenStacks[slot] != null) + { + ItemStack stack; + if (ovenStacks[slot].stackSize <= amount) + { + stack = ovenStacks[slot]; + ovenStacks[slot] = null; + return stack; + } + else + { + stack = ovenStacks[slot].splitStack(amount); + + if (ovenStacks[slot].stackSize == 0) + { + ovenStacks[slot] = null; + } + + return stack; + } + } + else + { + return null; + } + } + + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (ovenStacks[slot] != null) + { + ItemStack stack = ovenStacks[slot]; + ovenStacks[slot] = null; + return stack; + } + else + { + return null; + } + } + + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + ovenStacks[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) + { + stack.stackSize = getInventoryStackLimit(); + } + } + + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + if (worldObj.getTileEntity(pos) != this) + { + return false; + } + else + { + return player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0d; + } + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return slot == OUTPUT ? false : slot == FUELINPUT ? isItemFuelContainer(stack) : true; + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < ovenStacks.length; i++) + { + ovenStacks[i] = null; + } + } +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityObsidianKiln.java b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityObsidianKiln.java new file mode 100644 index 0000000..ad6fa45 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntityObsidianKiln.java @@ -0,0 +1,522 @@ +package net.einsteinsci.betterbeginnings.tileentity; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.einsteinsci.betterbeginnings.blocks.BlockObsidianKiln; +import net.einsteinsci.betterbeginnings.inventory.ContainerObsidianKiln; +import net.einsteinsci.betterbeginnings.register.recipe.KilnRecipes; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.IInteractionObject; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +/** + * Created by einsteinsci on 8/17/2014. + */ +public class TileEntityObsidianKiln extends TileEntity implements IUpdatePlayerListBox, ISidedInventory, + IInteractionObject +{ + public static final int smeltTime = 100; + private static final int[] slotsTop = new int[] {0}; + private static final int[] slotsBottom = new int[] {2, 1}; + private static final int[] slotsSides = new int[] {1}; + + public ItemStack[] kilnStacks = new ItemStack[3]; + + public int kilnBurnTime; + public int currentBurnTime; + + public int kilnCookTime; + + private String kilnName; + + public TileEntityObsidianKiln() + { + super(); + } + + public void setBlockName(String string) + { + kilnName = string; + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + + // ItemStacks + NBTTagList tagList = tagCompound.getTagList("Items", 10); + kilnStacks = new ItemStack[getSizeInventory()]; + + for (int i = 0; i < tagList.tagCount(); ++i) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + byte slot = itemTag.getByte("Slot"); + + if (slot >= 0 && slot < kilnStacks.length) + { + kilnStacks[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + + // Burn Time & Cook Time + kilnBurnTime = tagCompound.getShort("BurnTime"); + kilnCookTime = tagCompound.getShort("CookTime"); + currentBurnTime = getItemBurnTime(kilnStacks[1]); + + // stacked = tagCompound.getInteger("Stacked"); + + if (tagCompound.hasKey("CustomName", 8)) + { + kilnName = tagCompound.getString("CustomName"); + } + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + + tagCompound.setShort("BurnTime", (short)kilnBurnTime); + tagCompound.setShort("CookTime", (short)kilnCookTime); + // tagCompound.setInteger("Stacked", stacked); + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < kilnStacks.length; ++i) + { + if (kilnStacks[i] != null) + { + NBTTagCompound itemTag = new NBTTagCompound(); + kilnStacks[i].writeToNBT(itemTag); + itemTag.setByte("Slot", (byte)i); + tagList.appendTag(itemTag); + } + } + + tagCompound.setTag("Items", tagList); + if (hasCustomName()) + { + tagCompound.setString("CustomName", kilnName); + } + } + + @Override + public int getSizeInventory() + { + return kilnStacks.length; + } + + public static int getItemBurnTime(ItemStack itemStack) + { + if (itemStack == null) + { + return 0; + } + else + { + Item item = itemStack.getItem(); + + if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air) + { + Block block = Block.getBlockFromItem(item); + + // Insert any additional block fuels here + if (block == Blocks.wooden_slab) + { + return 150; + } + + if (block.getMaterial() == Material.wood) + { + return 300; + } + + if (block == Blocks.coal_block) + { + return 16000; + } + } + + if (item instanceof ItemTool) + { + if (((ItemTool)item).getToolMaterialName().equals("WOOD") || + ((ItemTool)item).getToolMaterialName().equals("noobwood")) + { + return 200; + } + } + if (item instanceof ItemSword) + { + if (((ItemSword)item).getToolMaterialName().equals("WOOD") || + ((ItemSword)item).getToolMaterialName().equals("noobwood")) + { + return 200; + } + } + if (item instanceof ItemHoe) + { + if (((ItemHoe)item).getMaterialName().equals("WOOD") || + ((ItemHoe)item).getMaterialName().equals("noobwood")) + { + return 200; + } + } + if (item == Items.stick) + { + return 100; + } + if (item == Items.coal) + { + return 1600; + } + if (item == Item.getItemFromBlock(Blocks.sapling)) + { + return 100; + } + + // Blaze Rods and Lava are valid fuel sources for an obsidian kiln. + if (item == Items.blaze_rod) + { + return 1600; + } + if (item == Items.lava_bucket) + { + return 80000; + } + + return GameRegistry.getFuelValue(itemStack); + } + } + + @Override + public ItemStack getStackInSlot(int i) + { + return kilnStacks[i]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (kilnStacks[slot] != null) + { + ItemStack stack; + if (kilnStacks[slot].stackSize <= amount) + { + stack = kilnStacks[slot]; + kilnStacks[slot] = null; + return stack; + } + else + { + stack = kilnStacks[slot].splitStack(amount); + + if (kilnStacks[slot].stackSize == 0) + { + kilnStacks[slot] = null; + } + + return stack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (kilnStacks[slot] != null) + { + ItemStack stack = kilnStacks[slot]; + kilnStacks[slot] = null; + return stack; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + kilnStacks[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) + { + stack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + if (worldObj.getTileEntity(pos) != this) + { + return false; + } + else + { + return player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0d; + } + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return slot != 2 && (slot == 1 || isItemFuel(stack)); + } + + @Override + public String getName() + { + return hasCustomName() ? kilnName : "container.obsidianKiln"; + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public boolean hasCustomName() + { + return kilnName != null && kilnName.length() > 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < kilnStacks.length; i++) + { + kilnStacks[i] = null; + } + } + + @Override + public void update() + { + boolean flag = kilnBurnTime > 0; + boolean flag1 = false; + + if (kilnBurnTime > 0) + { + --kilnBurnTime; + } + + if (!worldObj.isRemote) + { + if (kilnBurnTime == 0 && canSmelt()) + { + currentBurnTime = kilnBurnTime = getItemBurnTime(kilnStacks[1]); + + if (kilnBurnTime > 0) + { + flag1 = true; + if (kilnStacks[1] != null) + { + --kilnStacks[1].stackSize; + + if (kilnStacks[1].stackSize == 0) + { + kilnStacks[1] = kilnStacks[1].getItem().getContainerItem(kilnStacks[1]); + } + } + } + } + + if (isBurning() && canSmelt()) + { + ++kilnCookTime; + if (kilnCookTime == smeltTime) + { + kilnCookTime = 0; + smeltItem(); + flag1 = true; + } + } + else + { + kilnCookTime = 0; + } + } + + if (flag != kilnBurnTime > 0) + { + flag1 = true; + BlockObsidianKiln.updateBlockState(kilnBurnTime > 0, worldObj, pos); + } + + if (flag1) + { + markDirty(); + } + } + + private boolean canSmelt() + { + if (kilnStacks[0] == null) + { + return false; + } + else + { + ItemStack stack = KilnRecipes.smelting().getSmeltingResult(kilnStacks[0]); + if (stack == null) + { + return false; + } + + if (kilnStacks[2] == null) + { + return true; + } + if (!kilnStacks[2].isItemEqual(stack)) + { + return false; + } + + int result = kilnStacks[2].stackSize + stack.stackSize; + return result <= getInventoryStackLimit() && result <= kilnStacks[2].getMaxStackSize(); + } + } + + public boolean isBurning() + { + return kilnBurnTime > 0; + } + + public void smeltItem() + { + if (canSmelt()) + { + ItemStack itemStack = KilnRecipes.smelting().getSmeltingResult(kilnStacks[0]); + + if (kilnStacks[2] == null) + { + kilnStacks[2] = itemStack.copy(); + } + else if (kilnStacks[2].getItem() == itemStack.getItem()) + { + kilnStacks[2].stackSize += itemStack.stackSize; + } + + --kilnStacks[0].stackSize; + + if (kilnStacks[0].stackSize <= 0) + { + kilnStacks[0] = null; + } + } + } + + @SideOnly(Side.CLIENT) + public int getCookProgressScaled(int progress) + { + return kilnCookTime * progress / smeltTime; + } + + @SideOnly(Side.CLIENT) + public int getBurnTimeRemainingScaled(int time) + { + if (currentBurnTime <= 0) + { + currentBurnTime = smeltTime; + } + + return kilnBurnTime * time / currentBurnTime; + } + + @Override + public int[] getSlotsForFace(EnumFacing side) + { + return side == EnumFacing.DOWN ? slotsBottom : side == EnumFacing.UP ? slotsTop : slotsSides; + } + + @Override + public boolean canInsertItem(int par1, ItemStack stack, EnumFacing par3) + { + return isItemValidForSlot(par1, stack); + } + + public static boolean isItemFuel(ItemStack itemStack) + { + return getItemBurnTime(itemStack) > 0; + } + + @Override + public boolean canExtractItem(int par1, ItemStack stack, EnumFacing par3) + { + return par3 != EnumFacing.DOWN || par1 != 0 || stack.getItem() == Items.bucket; + } + + @Override + public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) + { + return new ContainerObsidianKiln(playerInventory, this); + } + + @Override + public String getGuiID() + { + return ModMain.MODID + ":obsidianKiln"; + } + + + + + + +} + diff --git a/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntitySmelter.java b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntitySmelter.java new file mode 100644 index 0000000..462501d --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/tileentity/TileEntitySmelter.java @@ -0,0 +1,485 @@ +package net.einsteinsci.betterbeginnings.tileentity; + +import net.einsteinsci.betterbeginnings.blocks.BlockSmelter; +import net.einsteinsci.betterbeginnings.register.recipe.SmelterRecipeHandler; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.*; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.gui.IUpdatePlayerListBox; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.IInteractionObject; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public class TileEntitySmelter extends TileEntity implements ISidedInventory, IUpdatePlayerListBox, IInteractionObject +{ + public static final int smeltTime = 160; + public static final int INPUT = 0; + public static final int FUEL = 1; + public static final int OUTPUT = 2; + public static final int GRAVEL = 3; + private static final int[] slotsTop = new int[] {0}; + private static final int[] slotsBottom = new int[] {2, 1}; + private static final int[] slotsSides = new int[] {1}; + public int smelterBurnTime; + public int currentItemBurnLength; + public int smelterCookTime; + private ItemStack[] smelterStacks = new ItemStack[4]; + private String smelterName; + + public TileEntitySmelter() + { + super(); + } + + public void setBlockName(String string) + { + smelterName = string; + } + + @SideOnly(Side.CLIENT) + public int getCookProgressScaled(int progress) + { + return smelterCookTime * progress / smeltTime; + } + + @SideOnly(Side.CLIENT) + public int getBurnTimeRemainingScaled(int time) + { + if (currentItemBurnLength == 0) + { + currentItemBurnLength = smeltTime; + } + + return smelterBurnTime * time / currentItemBurnLength; + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + + // ItemStacks + NBTTagList tagList = tagCompound.getTagList("Items", 10); + smelterStacks = new ItemStack[getSizeInventory()]; + + for (int i = 0; i < tagList.tagCount(); ++i) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + byte slot = itemTag.getByte("Slot"); + + if (slot >= 0 && slot < smelterStacks.length) + { + smelterStacks[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + + // Burn Time & Cook Time + smelterBurnTime = tagCompound.getShort("BurnTime"); + smelterCookTime = tagCompound.getShort("CookTime"); + currentItemBurnLength = getItemBurnTime(smelterStacks[FUEL]); + + if (tagCompound.hasKey("CustomName", 8)) + { + smelterName = tagCompound.getString("CustomName"); + } + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + + tagCompound.setShort("BurnTime", (short)smelterBurnTime); + tagCompound.setShort("CookTime", (short)smelterCookTime); + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < smelterStacks.length; ++i) + { + if (smelterStacks[i] != null) + { + NBTTagCompound itemTag = new NBTTagCompound(); + smelterStacks[i].writeToNBT(itemTag); + itemTag.setByte("Slot", (byte)i); + tagList.appendTag(itemTag); + } + } + + tagCompound.setTag("Items", tagList); + if (hasCustomName()) + { + tagCompound.setString("CustomName", smelterName); + } + } + + @Override + public int getSizeInventory() + { + return smelterStacks.length; + } + + public static int getItemBurnTime(ItemStack itemStack) + { + if (itemStack == null) + { + return 0; + } + else + { + Item item = itemStack.getItem(); + + if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air) + { + Block block = Block.getBlockFromItem(item); + + // A VERY HIGH AMOUNT OF POWER!!! + if (block == Blocks.bedrock) + { + return Short.MAX_VALUE; + } + } + + // Charcoal + if (item == Items.coal && itemStack.getItemDamage() == 1) + { + return 1600; + } + + // Blaze Rods and Lava are valid fuel sources for a Smelter. + if (item == Items.blaze_rod) + { + return 600; + } + if (item == Items.lava_bucket) + { + return 7200; + } + + return GameRegistry.getFuelValue(itemStack); + } + } + + @Override + public ItemStack getStackInSlot(int i) + { + return smelterStacks[i]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (smelterStacks[slot] != null) + { + ItemStack stack; + if (smelterStacks[slot].stackSize <= amount) + { + stack = smelterStacks[slot]; + smelterStacks[slot] = null; + return stack; + } + else + { + stack = smelterStacks[slot].splitStack(amount); + + if (smelterStacks[slot].stackSize == 0) + { + smelterStacks[slot] = null; + } + + return stack; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (smelterStacks[slot] != null) + { + ItemStack stack = smelterStacks[slot]; + smelterStacks[slot] = null; + return stack; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + smelterStacks[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) + { + stack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + if (worldObj.getTileEntity(pos) != this) + { + return false; + } + else + { + return player.getDistanceSq((double)pos.getX() + 0.5d, (double)pos.getY() + 0.5d, + (double)pos.getZ() + 0.5d) <= 64.0d; + } + } + + @Override + public void openInventory(EntityPlayer player) + { + } + + @Override + public void closeInventory(EntityPlayer player) + { + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return slot == 2 ? false : slot == 1 ? isItemFuel(stack) : true; + } + + @Override + public String getName() + { + return hasCustomName() ? smelterName : "container.smelter"; + } + + @Override + public int getField(int id) + { + return 0; + } + + @Override + public boolean hasCustomName() + { + return smelterName != null && smelterName.length() > 0; + } + + @Override + public void setField(int id, int value) + { + } + + @Override + public IChatComponent getDisplayName() + { + return new ChatComponentText(getName()); + } + + @Override + public int getFieldCount() + { + return 0; + } + + @Override + public void clear() + { + for (int i = 0; i < smelterStacks.length; i++) + { + smelterStacks[i] = null; + } + } + + @Override + public void update() + { + boolean flag = smelterBurnTime > 0; + boolean flag1 = false; + + if (smelterBurnTime > 0) + { + --smelterBurnTime; + } + + if (!worldObj.isRemote) + { + if (smelterBurnTime == 0 && canSmelt()) + { + currentItemBurnLength = smelterBurnTime = getItemBurnTime(smelterStacks[FUEL]); + + if (smelterBurnTime > 0) + { + flag1 = true; + if (smelterStacks[FUEL] != null) + { + --smelterStacks[FUEL].stackSize; + + if (smelterStacks[FUEL].stackSize == 0) + { + smelterStacks[FUEL] = smelterStacks[FUEL].getItem().getContainerItem(smelterStacks[FUEL]); + } + } + } + } + + if (isBurning() && canSmelt()) + { + ++smelterCookTime; + if (smelterCookTime == smeltTime) + { + smelterCookTime = 0; + smeltItem(); + flag1 = true; + } + } + else + { + smelterCookTime = 0; + } + } + + if (flag != smelterBurnTime > 0) + { + flag1 = true; + BlockSmelter.updateBlockState(smelterBurnTime > 0, worldObj, pos); + } + + if (flag1) + { + markDirty(); + } + } + + private boolean canSmelt() + { + if (smelterStacks[INPUT] == null || smelterStacks[GRAVEL] == null) + { + return false; + } + else + { + ItemStack stack = SmelterRecipeHandler.smelting().getSmeltingResult(smelterStacks[INPUT]); + int gravelNeeded = SmelterRecipeHandler.smelting().getGravelCount(smelterStacks[INPUT]); + + if (stack == null) + { + return false; + } + + if (gravelNeeded > smelterStacks[GRAVEL].stackSize) + { + return false; + } + + if (smelterStacks[OUTPUT] == null) + { + return true; + } + if (!smelterStacks[OUTPUT].isItemEqual(stack)) + { + return false; + } + + int result = smelterStacks[OUTPUT].stackSize + stack.stackSize; + return result <= getInventoryStackLimit() && result <= smelterStacks[OUTPUT].getMaxStackSize(); + } + } + + public boolean isBurning() + { + return smelterBurnTime > 0; + } + + public void smeltItem() + { + if (canSmelt()) + { + ItemStack itemStack = SmelterRecipeHandler.smelting().getSmeltingResult(smelterStacks[INPUT]); + + if (smelterStacks[OUTPUT] == null) + { + smelterStacks[OUTPUT] = itemStack.copy(); + } + else if (smelterStacks[OUTPUT].getItem() == itemStack.getItem()) + { + smelterStacks[OUTPUT].stackSize += itemStack.stackSize; + } + + int gravelUsed = SmelterRecipeHandler.smelting().getGravelCount(smelterStacks[INPUT]); + + --smelterStacks[INPUT].stackSize; + + if (smelterStacks[INPUT].stackSize <= 0) + { + smelterStacks[INPUT] = null; + } + smelterStacks[GRAVEL].stackSize -= gravelUsed; + + if (smelterStacks[GRAVEL].stackSize <= 0) + { + smelterStacks[GRAVEL] = null; + } + } + } + + @Override + public int[] getSlotsForFace(EnumFacing side) + { + return side == EnumFacing.DOWN ? slotsBottom : side == EnumFacing.UP ? slotsTop : slotsSides; + } + + @Override + public boolean canInsertItem(int par1, ItemStack stack, EnumFacing par3) + { + return isItemValidForSlot(par1, stack); + } + + public static boolean isItemFuel(ItemStack itemStack) + { + return getItemBurnTime(itemStack) > 0; + } + + @Override + public boolean canExtractItem(int par1, ItemStack stack, EnumFacing par3) + { + return par3 != EnumFacing.DOWN || par1 != 1 || stack.getItem() == Items.bucket; + } + + @Override + public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) + { + return null; + } + + @Override + public String getGuiID() + { + return null; + } + + + + + + +} diff --git a/src/main/java/net/einsteinsci/betterbeginnings/util/ChatUtil.java b/src/main/java/net/einsteinsci/betterbeginnings/util/ChatUtil.java new file mode 100644 index 0000000..8567936 --- /dev/null +++ b/src/main/java/net/einsteinsci/betterbeginnings/util/ChatUtil.java @@ -0,0 +1,46 @@ +package net.einsteinsci.betterbeginnings.util; + +import net.einsteinsci.betterbeginnings.ModMain; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; + +public class ChatUtil +{ + public static final String ESCAPE = "\u00a7"; // section symbol + + public static final String RESET = ESCAPE + "r"; + + public static final String BOLD = ESCAPE + "l"; + public static final String ITALIC = ESCAPE + "o"; + public static final String UNDERLINE = ESCAPE + "n"; + public static final String STRIKETHROUGH = ESCAPE + "m"; + public static final String OBFUSCATED = ESCAPE + "k"; + + + public static final String BLACK = ESCAPE + "0"; + public static final String DARK_BLUE = ESCAPE + "1"; + public static final String DARK_GREEN = ESCAPE + "2"; + public static final String TEAL = ESCAPE + "3"; + public static final String DARK_RED = ESCAPE + "4"; + public static final String PURPLE = ESCAPE + "5"; + public static final String ORANGE = ESCAPE + "6"; + public static final String LIGHT_GRAY = ESCAPE + "7"; + public static final String DARK_GRAY = ESCAPE + "8"; + public static final String BLUE = ESCAPE + "9"; + public static final String LIME = ESCAPE + "a"; + public static final String CYAN = ESCAPE + "b"; + public static final String RED = ESCAPE + "c"; + public static final String PINK = ESCAPE + "d"; + public static final String YELLOW = ESCAPE + "e"; + public static final String WHITE = ESCAPE + "f"; + + public static void sendModChatToPlayer(EntityPlayer player, String message) + { + sendChatToPlayer(player, ORANGE + "[" + ModMain.NAME + "] " + RESET + message); + } + + public static void sendChatToPlayer(EntityPlayer player, String message) + { + player.addChatMessage(new ChatComponentText(message)); + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/brickOven.json b/src/main/resources/assets/betterbeginnings/blockstates/brickOven.json new file mode 100644 index 0000000..cb1a344 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/brickOven.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:brickOven" + }, + "facing=south": { + "model": "betterbeginnings:brickOven", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:brickOven", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:brickOven", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/brickOvenLit.json b/src/main/resources/assets/betterbeginnings/blockstates/brickOvenLit.json new file mode 100644 index 0000000..15ea2c7 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/brickOvenLit.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:brickOvenLit" + }, + "facing=south": { + "model": "betterbeginnings:brickOvenLit", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:brickOvenLit", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:brickOvenLit", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/campfire.json b/src/main/resources/assets/betterbeginnings/blockstates/campfire.json new file mode 100644 index 0000000..c5bbbcd --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/campfire.json @@ -0,0 +1,7 @@ +{ + "variants": { + "normal": { + "model": "betterbeginnings:campfire" + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/campfireLit.json b/src/main/resources/assets/betterbeginnings/blockstates/campfireLit.json new file mode 100644 index 0000000..c5bbbcd --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/campfireLit.json @@ -0,0 +1,7 @@ +{ + "variants": { + "normal": { + "model": "betterbeginnings:campfire" + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/doubleWorkbench.json b/src/main/resources/assets/betterbeginnings/blockstates/doubleWorkbench.json new file mode 100644 index 0000000..08f4be6 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/doubleWorkbench.json @@ -0,0 +1,19 @@ +{ + "variants": { + "connection=up": { + "model": "betterbeginnings:doubleWorkbench" + }, + "connection=west": { + "model": "betterbeginnings:doubleWorkbench_w" + }, + "connection=east": { + "model": "betterbeginnings:doubleWorkbench_e" + }, + "connection=north": { + "model": "betterbeginnings:doubleWorkbench_n" + }, + "connection=south": { + "model": "betterbeginnings:doubleWorkbench_s" + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/enderSmelter.json b/src/main/resources/assets/betterbeginnings/blockstates/enderSmelter.json new file mode 100644 index 0000000..b317e0c --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/enderSmelter.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:enderSmelter" + }, + "facing=south": { + "model": "betterbeginnings:enderSmelter", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:enderSmelter", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:enderSmelter", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/enderSmelterLit.json b/src/main/resources/assets/betterbeginnings/blockstates/enderSmelterLit.json new file mode 100644 index 0000000..0764ee9 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/enderSmelterLit.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:enderSmelterLit" + }, + "facing=south": { + "model": "betterbeginnings:enderSmelterLit", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:enderSmelterLit", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:enderSmelterLit", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/infusionRepairStation.json b/src/main/resources/assets/betterbeginnings/blockstates/infusionRepairStation.json new file mode 100644 index 0000000..136eede --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/infusionRepairStation.json @@ -0,0 +1,7 @@ +{ + "variants": { + "normal": { + "model": "betterbeginnings:infusionRepairStation" + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/kiln.json b/src/main/resources/assets/betterbeginnings/blockstates/kiln.json new file mode 100644 index 0000000..5a77648 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/kiln.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:kiln" + }, + "facing=south": { + "model": "betterbeginnings:kiln", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:kiln", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:kiln", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/kilnLit.json b/src/main/resources/assets/betterbeginnings/blockstates/kilnLit.json new file mode 100644 index 0000000..e11d77e --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/kilnLit.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:kilnLit" + }, + "facing=south": { + "model": "betterbeginnings:kilnLit", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:kilnLit", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:kilnLit", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/netherBrickOven.json b/src/main/resources/assets/betterbeginnings/blockstates/netherBrickOven.json new file mode 100644 index 0000000..dcfd222 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/netherBrickOven.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:netherBrickOven" + }, + "facing=south": { + "model": "betterbeginnings:netherBrickOven", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:netherBrickOven", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:netherBrickOven", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/netherBrickOvenLit.json b/src/main/resources/assets/betterbeginnings/blockstates/netherBrickOvenLit.json new file mode 100644 index 0000000..ac15cf8 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/netherBrickOvenLit.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:netherBrickOvenLit" + }, + "facing=south": { + "model": "betterbeginnings:netherBrickOvenLit", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:netherBrickOvenLit", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:netherBrickOvenLit", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/obsidianKiln.json b/src/main/resources/assets/betterbeginnings/blockstates/obsidianKiln.json new file mode 100644 index 0000000..cd1c028 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/obsidianKiln.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:obsidianKiln" + }, + "facing=south": { + "model": "betterbeginnings:obsidianKiln", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:obsidianKiln", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:obsidianKiln", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/obsidianKilnLit.json b/src/main/resources/assets/betterbeginnings/blockstates/obsidianKilnLit.json new file mode 100644 index 0000000..1fd1646 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/obsidianKilnLit.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:obsidianKilnLit" + }, + "facing=south": { + "model": "betterbeginnings:obsidianKilnLit", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:obsidianKilnLit", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:obsidianKilnLit", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/smelter.json b/src/main/resources/assets/betterbeginnings/blockstates/smelter.json new file mode 100644 index 0000000..7f548a6 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/smelter.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:smelter" + }, + "facing=south": { + "model": "betterbeginnings:smelter", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:smelter", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:smelter", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/blockstates/smelterLit.json b/src/main/resources/assets/betterbeginnings/blockstates/smelterLit.json new file mode 100644 index 0000000..7c2998e --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/blockstates/smelterLit.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "betterbeginnings:smelterLit" + }, + "facing=south": { + "model": "betterbeginnings:smelterLit", + "y": 180 + }, + "facing=west": { + "model": "betterbeginnings:smelterLit", + "y": 270 + }, + "facing=east": { + "model": "betterbeginnings:smelterLit", + "y": 90 + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/lang/en_US.lang b/src/main/resources/assets/betterbeginnings/lang/en_US.lang new file mode 100644 index 0000000..059d6ab --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/lang/en_US.lang @@ -0,0 +1,112 @@ +tile.kiln.name=Kiln +tile.kilnLit.name=Kiln (Lit) +tile.doubleWorkbench.name=Crafting Table +tile.brickOven.name=Brick Oven +tile.brickOvenLit.name=Brick Oven (Lit) +tile.smelter.name=Smelter +tile.smelterLit.name=Smelter (Lit) +tile.infusionRepairStation.name=Infusion Repair Station +tile.Campfire.name=Campfire +tile.obsidianKiln.name=Obsidian Kiln +tile.obsidianKilnLit.name=Obsidian Kiln (Lit) +tile.netherBrickOven.name=Nether Brick Oven +tile.netherBrickOvenLit.name=Nether Brick Oven (Lit) +tile.enderSmelter.name=Ender Smelter +tile.enderSmelterLit.name=Ender Smelter (Lit) +tile.campfire.name=Campfire +tile.campfireLit.name=Campfire (Lit) + +item.flintKnife.name=Flint Knife +item.boneKnife.name=Bone Knife +item.ironKnife.name=Iron Knife +item.goldKnife.name=Gold Knife +item.diamondKnife.name=Diamond Knife +item.pan.name=Pan + +item.flintHatchet.name=Flint Hatchet +item.bonePickaxe.name=Bone Pickaxe +item.noobWoodSword.name=Wooden Sword + +item.boneShard.name=Bone Shard +item.leatherStrip.name=Leather Strip +item.ironNugget.name=Iron Nugget +item.charredMeat.name=Charred Meat +item.fireBow.name=Fire Bow +item.silk.name=Silk +item.thread.name=Thread +item.twine.name=Twine +item.cloth.name=Cloth +item.marshmallow.name=Marshmallow +item.marshmallowCooked.name=Browned Marshmallow +item.roastingStick.name=Roasting Stick +item.roastingStickrawMallow.name=Marshmallow on a Stick +item.roastingStickcookedMallow.name=Browned Marshmallow on a Stick +item.rockHammer.name=Rock Hammer + +item.clothHat.name=Cloth Hat +item.clothShirt.name=Cloth Robe +item.clothPants.name=Cloth Pants +item.clothBoots.name=Cloth Boots + +item.testItem.name=Test Item + +itemGroup.tabBetterBeginnings=Better Beginnings + +container.craftingdouble=Advanced Crafting +container.kiln=Kiln +container.brickoven=Brick Oven +container.smelter=Smelter +container.infusion.needed=Needed +container.infusion.taken=Taken +container.infusion.level=L +container.obsidianKiln=Obsidian Kiln +container.netherbrickoven=Nether Brick Oven +container.enderSmelter=Ender Smelter +container.campfire=Campfire + +achievement.flintKnife=Survival of the Fittest +achievement.flintKnife.desc=Craft a flint knife out of two flint +achievement.makeString=String it Out +achievement.makeString.desc=Make string with a knife and some wool +achievement.makeTwine=The Other String +achievement.makeTwine.desc=Make twine with a knife and some vines +achievement.upgradeKnife=Bleeding Edge +achievement.upgradeKnife.desc=Make a better knife +achievement.makeSticks=I'm a sapling, I'm a sapling... +achievement.makeSticks.desc=Make a stick with a sapling and a knife +achievement.makeHatchet=The Tiny Axe +achievement.makeHatchet.desc=Make a flint hatchet with flint, a stick, and a leather strip +achievement.doubleWorkbench=Getting Complicated +achievement.doubleWorkbench.desc=Put two crafting tables down to make a double workbench +achievement.makeSword=Like a Knife, but Bigger +achievement.makeSword.desc=Craft a sword with your double workbench +achievement.infusionRepair=Infused with Antioxidants! +achievement.infusionRepair.desc=Craft a Repair Infusion Station +achievement.repairNoobSword=Magical Practice board +achievement.repairNoobSword.desc=Repair your wooden sword +achievement.boneShards=Chicken Bones +achievement.boneShards.desc=Make bone shards with your knife and a bone +achievement.bonePick=Skeleton Repurposing +achievement.bonePick.desc=Craft a bone pickaxe +achievement.makeKiln=Warm Topic +achievement.makeKiln.desc=Craft a Kiln +achievement.charredMeat=Tastes like Charcoal +achievement.charredMat.desc=Eat overcooked meat +achievement.obsidianKiln=Hotter Topic +achievement.obsidianKiln.desc=Upgrade your Kiln into an Obsidian Kiln +achievement.makeSmelter=I'm smelting! Smelting! +achievement.makeSmelter.desc=Craft a smelter +achievement.enderSmelter=The end of the road +achievement.enderSmelter.desc=Upgrade your Smelter into an Ender Smelter +achievement.oreDoubling=Double Trouble +achievement.oreDoubling.desc=Get extra ores in an Ender Smelter +achievement.makeBrickOven=Food Furnace +achievement.makeBrickOven.desc=Craft a Brick Oven +achievement.cake=More Lies +achievement.cake.desc=Bake a cake +achievement.netherBrickOven=Lava-Powered Food +achievement.netherBrickOven.desc=Upgrade your Brick Oven into a Nether Brick Oven +achievement.notchApple=Food of the Gods +achievement.notchApple.desc=Bake an enchanted golden apple + +death.face=%1$s broke their face on a %2$s diff --git a/src/main/resources/assets/betterbeginnings/models/block/brickOven.json b/src/main/resources/assets/betterbeginnings/models/block/brickOven.json new file mode 100644 index 0000000..6a4779e --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/brickOven.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/brickOvenTop", + "front": "betterbeginnings:blocks/brickOvenUnlit", + "side": "betterbeginnings:blocks/brickOvenSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/brickOvenLit.json b/src/main/resources/assets/betterbeginnings/models/block/brickOvenLit.json new file mode 100644 index 0000000..b9cc5b6 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/brickOvenLit.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/brickOvenTop", + "front": "betterbeginnings:blocks/brickOvenLit", + "side": "betterbeginnings:blocks/brickOvenSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/campfire.json b/src/main/resources/assets/betterbeginnings/models/block/campfire.json new file mode 100644 index 0000000..270514f --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/campfire.json @@ -0,0 +1,60 @@ +{ + "textures": { + "particle": "blocks/planks_oak", + "log": "blocks/planks_oak" + }, + "elements": [ + { + "from": [7.0, -4.0, 12.0], + "to": [9.0, 3.0, 14.0], + "rotation": { "origin": [8.0, -2.0, 8.0], "axis": "x", "angle": -45.0 }, + "faces": { + "north": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "east": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "south": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "west": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "up": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] }, + "down": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] } + } + }, + { + "from": [2.0, -4.0, 7.0], + "to": [4.0, 3.0, 9.0], + "rotation": { "origin": [8.0, -2.0, 8.0], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "east": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "south": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "west": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "up": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] }, + "down": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] } + } + }, + { + "from": [7.0, -4.0, 2.0], + "to": [9.0, 3.0, 4.0], + "rotation": { "origin": [8.0, -2.0, 8.0], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "east": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "south": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "west": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "up": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] }, + "down": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] } + } + }, + { + "from": [12.0, -4.0, 7.0], + "to": [14.0, 3.0, 9.0], + "rotation": { "origin": [8.0, -2.0, 8.0], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "east": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "south": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "west": { "texture": "#log", "uv": [14.0, 9.0, 14.0, 16.0] }, + "up": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] }, + "down": { "texture": "#log", "uv": [14.0, 14.0, 14.0, 16.0] } + } + } + ] +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/campfireLit.json b/src/main/resources/assets/betterbeginnings/models/block/campfireLit.json new file mode 100644 index 0000000..7407888 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/campfireLit.json @@ -0,0 +1,50 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "blocks/oak_planks", + "sticks": "blocks/oak_planks", + "temp": "betterbeginnings:blocks/campfire_temp_lit" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "down": { "texture": "#temp" }, + "up": { "texture": "#temp" }, + "north": { "texture": "#temp" }, + "south": { "texture": "#temp" }, + "east": { "texture": "#temp" }, + "west": { "texture": "#temp" } + } + } + ], + "__elements": [ + { + "from": [0, 0, 0], + "to": [2, 2, 8], + "rotation": { "origin": [-1, 18, 1.8], "axis": "x", "angle": -0.781 }, + "faces": { + "down": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "up": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "north": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "south": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "east": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "west": { "uv": [0, 0, 8, 2], "texture": "#sticks" } + } + }, + { + "from": [0, 0, 0], + "to": [2, 2, 8], + "rotation": { "origin": [1, 18, -1], "axis": "x", "angle": -0.781 }, + "faces": { + "down": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "up": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "north": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "south": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "east": { "uv": [0, 0, 8, 2], "texture": "#sticks" }, + "west": { "uv": [0, 0, 8, 2], "texture": "#sticks" } + } + } + ] +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench.json b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench.json new file mode 100644 index 0000000..8ffae74 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "particle": "blocks/planks_oak", + "down": "blocks/planks_oak", + "up": "betterbeginnings:blocks/workbenchTop", + "north": "betterbeginnings:blocks/workbenchFront", + "east": "betterbeginnings:blocks/workbenchSide", + "south": "betterbeginnings:blocks/workbenchFront", + "west": "betterbeginnings:blocks/workbenchSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_e.json b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_e.json new file mode 100644 index 0000000..c0cccd4 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_e.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_all", + "textures": { + "particle": "betterbeginnings:blocks/workbenchFront", + "down": "blocks/planks_oak", + "up": "betterbeginnings:blocks/workbenchTopIfEast", + "north": "betterbeginnings:blocks/workbenchWestIfNorth", + "east": "betterbeginnings:blocks/workbenchSide", + "south": "betterbeginnings:blocks/workbenchSouthIfEast", + "west": "betterbeginnings:blocks/workbenchFront" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_n.json b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_n.json new file mode 100644 index 0000000..8cf24b7 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_n.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_all", + "textures": { + "particle": "betterbeginnings:blocks/workbenchFront", + "down": "blocks/planks_oak", + "up": "betterbeginnings:blocks/workbenchTopIfNorth", + "north": "betterbeginnings:blocks/workbenchFront", + "east": "betterbeginnings:blocks/workbenchSouthIfEast", + "south": "betterbeginnings:blocks/workbenchFront", + "west": "betterbeginnings:blocks/workbenchWestIfNorth" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_none.json b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_none.json new file mode 100644 index 0000000..9aa9a9e --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_none.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterbeginnings:blocks/workbenchTop" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_s.json b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_s.json new file mode 100644 index 0000000..44ccf41 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_s.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_all", + "textures": { + "particle": "betterbeginnings:blocks/workbenchFront", + "down": "blocks/planks_oak", + "up": "betterbeginnings:blocks/workbenchTopIfSouth", + "north": "betterbeginnings:blocks/workbenchFront", + "east": "betterbeginnings:blocks/workbenchEastIfSouth", + "south": "betterbeginnings:blocks/workbenchFront", + "west": "betterbeginnings:blocks/workbenchNorthIfWest" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_w.json b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_w.json new file mode 100644 index 0000000..51b0d03 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/doubleWorkbench_w.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube_all", + "textures": { + "particle": "betterbeginnings:blocks/workbenchFront", + "down": "blocks/planks_oak", + "up": "betterbeginnings:blocks/workbenchTopIfWest", + "north": "betterbeginnings:blocks/workbenchNorthIfWest", + "east": "betterbeginnings:blocks/workbenchSide", + "south": "betterbeginnings:blocks/workbenchEastIfSouth", + "west": "betterbeginnings:blocks/workbenchFront" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/enderSmelter.json b/src/main/resources/assets/betterbeginnings/models/block/enderSmelter.json new file mode 100644 index 0000000..12e1764 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/enderSmelter.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/enderSmelterTop", + "front": "betterbeginnings:blocks/enderSmelterUnlit", + "side": "betterbeginnings:blocks/enderSmelterSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/enderSmelterLit.json b/src/main/resources/assets/betterbeginnings/models/block/enderSmelterLit.json new file mode 100644 index 0000000..c7ced73 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/enderSmelterLit.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/enderSmelterTop", + "front": "betterbeginnings:blocks/enderSmelterLit", + "side": "betterbeginnings:blocks/enderSmelterSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/infusionRepairStation.json b/src/main/resources/assets/betterbeginnings/models/block/infusionRepairStation.json new file mode 100644 index 0000000..65fb7cd --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/infusionRepairStation.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "particle": "betterbeginnings:blocks/RepairTableTop", + "down": "betterbeginnings:blocks/RepairTableBottom", + "up": "betterbeginnings:blocks/RepairTableTop", + "north": "betterbeginnings:blocks/RepairTableSide", + "south": "betterbeginnings:blocks/RepairTableSide", + "east": "betterbeginnings:blocks/RepairTableSide", + "west": "betterbeginnings:blocks/RepairTableSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/kiln.json b/src/main/resources/assets/betterbeginnings/models/block/kiln.json new file mode 100644 index 0000000..ec54fa3 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/kiln.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/kilnTop", + "front": "betterbeginnings:blocks/kilnUnlit", + "side": "betterbeginnings:blocks/kilnSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/kilnLit.json b/src/main/resources/assets/betterbeginnings/models/block/kilnLit.json new file mode 100644 index 0000000..edd4902 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/kilnLit.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/kilnTop", + "front": "betterbeginnings:blocks/kilnLit", + "side": "betterbeginnings:blocks/kilnSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/netherBrickOven.json b/src/main/resources/assets/betterbeginnings/models/block/netherBrickOven.json new file mode 100644 index 0000000..b893c47 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/netherBrickOven.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/netherBrickOvenTop", + "front": "betterbeginnings:blocks/netherBrickOvenUnlit", + "side": "betterbeginnings:blocks/netherBrickOvenSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/netherBrickOvenLit.json b/src/main/resources/assets/betterbeginnings/models/block/netherBrickOvenLit.json new file mode 100644 index 0000000..a21b0f9 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/netherBrickOvenLit.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/netherBrickOvenTop", + "front": "betterbeginnings:blocks/netherBrickOvenLit", + "side": "betterbeginnings:blocks/netherBrickOvenSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/obsidianKiln.json b/src/main/resources/assets/betterbeginnings/models/block/obsidianKiln.json new file mode 100644 index 0000000..97a74c5 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/obsidianKiln.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/obsidianKilnTop", + "front": "betterbeginnings:blocks/obsidianKilnUnlit", + "side": "betterbeginnings:blocks/obsidianKilnSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/obsidianKilnLit.json b/src/main/resources/assets/betterbeginnings/models/block/obsidianKilnLit.json new file mode 100644 index 0000000..b97ce0c --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/obsidianKilnLit.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/obsidianKilnTop", + "front": "betterbeginnings:blocks/obsidianKilnLit", + "side": "betterbeginnings:blocks/obsidianKilnSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/smelter.json b/src/main/resources/assets/betterbeginnings/models/block/smelter.json new file mode 100644 index 0000000..3872566 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/smelter.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/smelterTop", + "front": "betterbeginnings:blocks/smelterUnlit", + "side": "betterbeginnings:blocks/smelterSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/block/smelterLit.json b/src/main/resources/assets/betterbeginnings/models/block/smelterLit.json new file mode 100644 index 0000000..25c5331 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/block/smelterLit.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "betterbeginnings:blocks/smelterTop", + "front": "betterbeginnings:blocks/smelterLit", + "side": "betterbeginnings:blocks/smelterSide" + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/boneKnife.json b/src/main/resources/assets/betterbeginnings/models/item/boneKnife.json new file mode 100644 index 0000000..0b5e5d5 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/boneKnife.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/boneKnife" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/bonePickaxe.json b/src/main/resources/assets/betterbeginnings/models/item/bonePickaxe.json new file mode 100644 index 0000000..d376850 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/bonePickaxe.json @@ -0,0 +1,18 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/bonePickaxe" + }, + "display": { + "thirdperson": { + "rotation": [0, 90, -35], + "translation": [0, 1.25, -3.5], + "scale": [0.85, 0.85, 0.85] + }, + "firstperson": { + "rotation": [0, -135, 25], + "translation": [0, 4, 2], + "scale": [1.7, 1.7, 1.7] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/boneShard.json b/src/main/resources/assets/betterbeginnings/models/item/boneShard.json new file mode 100644 index 0000000..185fae8 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/boneShard.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/boneShard" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/brickOven.json b/src/main/resources/assets/betterbeginnings/models/item/brickOven.json new file mode 100644 index 0000000..47e8d78 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/brickOven.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/brickOven", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/brickOvenLit.json b/src/main/resources/assets/betterbeginnings/models/item/brickOvenLit.json new file mode 100644 index 0000000..aca06ea --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/brickOvenLit.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/brickOvenLit", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/campfire.json b/src/main/resources/assets/betterbeginnings/models/item/campfire.json new file mode 100644 index 0000000..cd0a149 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/campfire.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:blocks/CampfireImg" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/campfireLit.json b/src/main/resources/assets/betterbeginnings/models/item/campfireLit.json new file mode 100644 index 0000000..cd0a149 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/campfireLit.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:blocks/CampfireImg" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/charredMeat.json b/src/main/resources/assets/betterbeginnings/models/item/charredMeat.json new file mode 100644 index 0000000..dffe775 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/charredMeat.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/charredMeat" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/cloth.json b/src/main/resources/assets/betterbeginnings/models/item/cloth.json new file mode 100644 index 0000000..21dd145 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/cloth.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/cloth" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/clothBoots.json b/src/main/resources/assets/betterbeginnings/models/item/clothBoots.json new file mode 100644 index 0000000..1b26386 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/clothBoots.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/clothBoots" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/clothHat.json b/src/main/resources/assets/betterbeginnings/models/item/clothHat.json new file mode 100644 index 0000000..da7792b --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/clothHat.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/clothHat" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/clothPants.json b/src/main/resources/assets/betterbeginnings/models/item/clothPants.json new file mode 100644 index 0000000..a49f175 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/clothPants.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/clothPants" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/clothShirt.json b/src/main/resources/assets/betterbeginnings/models/item/clothShirt.json new file mode 100644 index 0000000..c955997 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/clothShirt.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/clothShirt" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/diamondKnife.json b/src/main/resources/assets/betterbeginnings/models/item/diamondKnife.json new file mode 100644 index 0000000..10b9369 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/diamondKnife.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/diamondKnife" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/doubleWorkbench.json b/src/main/resources/assets/betterbeginnings/models/item/doubleWorkbench.json new file mode 100644 index 0000000..de0e0c6 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/doubleWorkbench.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/doubleWorkbench", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/enderSmelter.json b/src/main/resources/assets/betterbeginnings/models/item/enderSmelter.json new file mode 100644 index 0000000..7334f7b --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/enderSmelter.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/enderSmelter", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/enderSmelterLit.json b/src/main/resources/assets/betterbeginnings/models/item/enderSmelterLit.json new file mode 100644 index 0000000..9bad182 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/enderSmelterLit.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/enderSmelterLit", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/fireBow.json b/src/main/resources/assets/betterbeginnings/models/item/fireBow.json new file mode 100644 index 0000000..f17e83c --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/fireBow.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/fireBow" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/flintHatchet.json b/src/main/resources/assets/betterbeginnings/models/item/flintHatchet.json new file mode 100644 index 0000000..f38af16 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/flintHatchet.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/flintHatchet" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/flintKnife.json b/src/main/resources/assets/betterbeginnings/models/item/flintKnife.json new file mode 100644 index 0000000..65d9a21 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/flintKnife.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/flintKnife" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/goldKnife.json b/src/main/resources/assets/betterbeginnings/models/item/goldKnife.json new file mode 100644 index 0000000..4aedf6b --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/goldKnife.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/goldKnife" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/infusionRepairStation.json b/src/main/resources/assets/betterbeginnings/models/item/infusionRepairStation.json new file mode 100644 index 0000000..1d77ecc --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/infusionRepairStation.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/infusionRepairStation", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/ironKnife.json b/src/main/resources/assets/betterbeginnings/models/item/ironKnife.json new file mode 100644 index 0000000..5f4b9e6 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/ironKnife.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/ironKnife" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/ironNugget.json b/src/main/resources/assets/betterbeginnings/models/item/ironNugget.json new file mode 100644 index 0000000..a1ce91e --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/ironNugget.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/ironNugget" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/jerkyBeef.json b/src/main/resources/assets/betterbeginnings/models/item/jerkyBeef.json new file mode 100644 index 0000000..49069b0 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/jerkyBeef.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/jerkyBeef" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/jerkyRaw.json b/src/main/resources/assets/betterbeginnings/models/item/jerkyRaw.json new file mode 100644 index 0000000..0a2ba82 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/jerkyRaw.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/jerkyRaw" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/kiln.json b/src/main/resources/assets/betterbeginnings/models/item/kiln.json new file mode 100644 index 0000000..20b2dc5 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/kiln.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/kiln", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/kilnLit.json b/src/main/resources/assets/betterbeginnings/models/item/kilnLit.json new file mode 100644 index 0000000..ab15add --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/kilnLit.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/kilnLit", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/leatherStrip.json b/src/main/resources/assets/betterbeginnings/models/item/leatherStrip.json new file mode 100644 index 0000000..4667d9a --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/leatherStrip.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/leatherStrip" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/marshmallow.json b/src/main/resources/assets/betterbeginnings/models/item/marshmallow.json new file mode 100644 index 0000000..d342778 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/marshmallow.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/marshmallow" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/marshmallowCooked.json b/src/main/resources/assets/betterbeginnings/models/item/marshmallowCooked.json new file mode 100644 index 0000000..fb495ba --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/marshmallowCooked.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/marshmallowCooked" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/netherBrickOven.json b/src/main/resources/assets/betterbeginnings/models/item/netherBrickOven.json new file mode 100644 index 0000000..44c7678 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/netherBrickOven.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/netherBrickOven", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/netherBrickOvenLit.json b/src/main/resources/assets/betterbeginnings/models/item/netherBrickOvenLit.json new file mode 100644 index 0000000..b822154 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/netherBrickOvenLit.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/netherBrickOvenLit", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/noobWoodSword.json b/src/main/resources/assets/betterbeginnings/models/item/noobWoodSword.json new file mode 100644 index 0000000..0070994 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/noobWoodSword.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/noobWoodSword" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/obsidianKiln.json b/src/main/resources/assets/betterbeginnings/models/item/obsidianKiln.json new file mode 100644 index 0000000..02fae21 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/obsidianKiln.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/obsidianKiln", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/obsidianKilnLit.json b/src/main/resources/assets/betterbeginnings/models/item/obsidianKilnLit.json new file mode 100644 index 0000000..3eb7eed --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/obsidianKilnLit.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/obsidianKilnLit", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/pan.json b/src/main/resources/assets/betterbeginnings/models/item/pan.json new file mode 100644 index 0000000..8beb12a --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/pan.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/pan" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/roastingStick.json b/src/main/resources/assets/betterbeginnings/models/item/roastingStick.json new file mode 100644 index 0000000..94fc883 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/roastingStick.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/roastingStick" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/roastingStickCookedMallow.json b/src/main/resources/assets/betterbeginnings/models/item/roastingStickCookedMallow.json new file mode 100644 index 0000000..3c68b09 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/roastingStickCookedMallow.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/roastingStickCookedMallow" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/roastingStickRawMallow.json b/src/main/resources/assets/betterbeginnings/models/item/roastingStickRawMallow.json new file mode 100644 index 0000000..9143538 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/roastingStickRawMallow.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/roastingStickRawMallow" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/rockHammer.json b/src/main/resources/assets/betterbeginnings/models/item/rockHammer.json new file mode 100644 index 0000000..c0a72a0 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/rockHammer.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/rockHammer" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/silk.json b/src/main/resources/assets/betterbeginnings/models/item/silk.json new file mode 100644 index 0000000..b7c2a70 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/silk.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/silk" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/smelter.json b/src/main/resources/assets/betterbeginnings/models/item/smelter.json new file mode 100644 index 0000000..f2a14e8 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/smelter.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/smelter", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/smelterLit.json b/src/main/resources/assets/betterbeginnings/models/item/smelterLit.json new file mode 100644 index 0000000..a020279 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/smelterLit.json @@ -0,0 +1,22 @@ +{ + "parent": "betterbeginnings:block/smelterLit", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/testItem.json b/src/main/resources/assets/betterbeginnings/models/item/testItem.json new file mode 100644 index 0000000..a85cbf1 --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/testItem.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/testItem" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/thread.json b/src/main/resources/assets/betterbeginnings/models/item/thread.json new file mode 100644 index 0000000..7fb2f4b --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/thread.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/thread" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/models/item/twine.json b/src/main/resources/assets/betterbeginnings/models/item/twine.json new file mode 100644 index 0000000..e5ce57a --- /dev/null +++ b/src/main/resources/assets/betterbeginnings/models/item/twine.json @@ -0,0 +1,42 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "betterbeginnings:items/twine" + }, + "display": { + "thirdperson": { + "rotation": [ + 0.0, + 90.0, + 35.0 + ], + "translation": [ + 0.0, + 1.25, + -3.5 + ], + "scale": [ + 0.85, + 0.85, + 0.85 + ] + }, + "firstperson": { + "rotation": [ + 0.0, + -135.0, + 25.0 + ], + "translation": [ + 0.0, + 4.0, + 2.0 + ], + "scale": [ + 1.7, + 1.7, + 1.7 + ] + } + } +} diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/CampfireImg.png b/src/main/resources/assets/betterbeginnings/textures/blocks/CampfireImg.png new file mode 100644 index 0000000000000000000000000000000000000000..a830b637b3e65b5b17385b5eb1751251e3b6467c GIT binary patch literal 873 zcmV-v1D5=WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0008mNklFTvs~5|qon~wI8A2akCX{2s9bp0MHg<}_h)q5RhxCw)>Ri>GEjnp z2=wi|4`-$0Y)(C8`fQ(#_u>8V-Qm1&01lOEli5p2ef+Kq)Xrd3o6KJ7&;yjFY`ZQP zJ)?e>YLnSZ;huo1#X^);U1=Vm(kkwlRJ>{cqYUdx(*PBn4!MWM9h33_BN$~^SH~+r zxm`dp(u8W%Mp&(82VDBG!2kx<*+&O=Orwg45+q= zL}}I4@d}WW@BLQ9{CkqrBmW#NEktS6l_mjlq6mh4E{-+g$4xWIKjZPU!$xSLN@)^c zy^90GKIg+$Al6LSxIAeElWtSL3CAOV)YlBAGG#?}K!?JJiBxB7C{I|(rb~W5h8ycP z&?G>`W&=|Uo3J%uMPapxl-`L*dyGW7Z9*<2{G9;OV-d_oP=4!I8&UpNv-Mez?9-Y; zNH1Se0R^E(S$ePli;Ig`T3SN>jzEfodPr|A$bD)c*)L7Vd^D5NxCPR60i`E;qHJ-* z1GwF8xE)uJ>f*_U{HV)s43NH>NoGw%{zC(i#^l@ZQoy>OC(0K43lNLNz&M>wbeuhf z^A?W0zpKah=OVJx0x7&QApJtVg0i(oMq~yByiQJ&R4PTA9VkE~5<$C-!~JtSNjmhH zcNpcTQ8ROmhy5f+Mlb6ye38TK>?}zn5=S_|+}s?PP$-1ZfEV+=9x@($j7!Zt5;qJa zZs&2KNk@F12k`f~;Pd&2-|ydlfQ5wxFl-~Q*NbR0O5*W2TrL-!r}bpgZo<&e5DACF z2m}J?@9!tHkzD%F^^4^?aDeUA+uKV4lF1}t z{}CRKhjey!{+|KV&R|rVjMk-g2BX^icfkDu33~Mvc?W_@00000NkvXXu0mjf`+JG3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/RepairTableBottom.png b/src/main/resources/assets/betterbeginnings/textures/blocks/RepairTableBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ef8593f60b245688ac60dca3764d48fb767e69 GIT binary patch literal 432 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenLit.png b/src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenLit.png new file mode 100644 index 0000000000000000000000000000000000000000..1f614ae1d1ba3f514d2226d81a1f52d764a09c8e GIT binary patch literal 651 zcmV;60(AX}P)N2bZe?^J zG%heMGW+4D#sB~U2}wjjR5(v%Qf+V2P#C>`#AL}f(`;iEw6v5GGGxQ9f-A7H6$`Q# zK$mIaGTof-BibN3BOex=lPu_GGZW*FAQ0dO@Jsf=(>+L*?B?Xj>AC0J``p{h?s~Ws zKZcq&Q>fN;F3FGQgbDC9aWXMIR9lE@nx^TxuBz&v#xZo@$lkZ&cbM)P#li&3vbaklo6QalIV0&D8hd?R3}L;2 z<tAIi=EvEc^sG(B)kHlr24QP9FFy5 zP$>go3Y+YOh0R=stxJ>C2BsYo0sQPgImaV~UlXVB5S>7LdejME8YTk8E^wS-5HPe` lguxC};Tw{3kvw@b^$#lU8M{KU$U6W4002ovPDHLkV1j%mCq4iG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenSide.png b/src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenSide.png new file mode 100644 index 0000000000000000000000000000000000000000..d3bec1a06068e66c8a7ccadb238f8345499842ad GIT binary patch literal 669 zcmV;O0%HA%P)N2bZe?^J zG%heMGW+4D#sB~U8%ab#R5(vvP>oMgQ5?O0h?NDel!BK{BTaKb@ZRG=Jl>apd}q+e zTCK(AY_$+c8Kq%`M2ILzl&!RxTdn`C({6iXZD(iaoqK=3d(I;|%Sac_XskJ^NQ%v* z+8EJtdWL0Wt0_Ek&NDn1k^Rur0f_7D$tSMMMbE@>r+JX_LEoRcm>IW1M9 zYF&3ebKBuK%mc*143vG7cPH8YgGbXNU<&wo;mVpc4UGqhCi2bliw~v3L9@11Dp1r{ zmcZNPBKT;xVVJsCAi~foEH+S)u7R<&Gs^+ZpsW8h67UnnYQkIZH3v9*)dpU0j?s9~ zG~2x?77Rqyz~6zC-Lm4HKv!6|?dQQqt$H`c!9i(Mr?&z8F`^1?8WA-btIIUE(TA2X zke&?^m1Sr?#HcFQA$DiE!&^6v^fVp-6NQP_GPtOF%W>uRmrpzMF$jt`b2FQn&}vNn zwg0jEAX&`>agD=(YBT2)el4l~-0y8=Bg+wK-gg6>Q-o4H0P(%OL;a_^*U6k92{lkD z=3AAQKYH!GYUMw)tCizkyYp_NTYI}+c&>{)NsL+6Q~KwJDXgK`Ob5TUnzc;$FqfuI z{Z1JCDyh$fbP^jKLZp1ik4GsU%RB~fqu(q>qy^Oz*8(IyI-C_9$cHfl+Z(UT3B~wa z)J5>W0d&wjyv(~ak<&aJ<+vt8D1u87+=ht)QAPR#JTxPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;9S!r^WyP0r*KoK~y+TO_FU-6HyR__g_eYSWO9nBy53D z+HQBZ+h*O}7AsmXL?V7bKd1;sRAOQzO5Y&9BqG$d6fli3k*JXbf1l5F$cE(PWOjDu z&N+9k=3S0t`_IEgHwOc!zppTKk>J|!rA)NCyUBYT1mDy+1h&pL}h9 zU+~Cm1j!fKF*4HN*{0^(>FV<*NW?~Gvm&}fKVn8e*$v;-{K1HLKt`kF5On9g(LxW@I|3=2M$f27ZpdY*US9$|zR1M8x;s?mj;#y*n`kvl*_R z;8$x`@+?<1h=*on{p=n>VC?v?rM!Kpvj>XRE!7IfkA=Jl1+3zzv5h>ONJhL>^2SWT zKivab87g2KG*EFi`Pz*yrF9;nYPdZ%fIiwn$b$<%mo4@3P8*QrS*B~IeA^@z=Dvgf hfoB@9#GvTr{s9N=6wWfnAyNPU002ovPDHLkV1k#-BHaK0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenUnlit.png b/src/main/resources/assets/betterbeginnings/textures/blocks/brickOvenUnlit.png new file mode 100644 index 0000000000000000000000000000000000000000..562d47559da99861dd4f242f77da0185cfccb74f GIT binary patch literal 665 zcmV;K0%rY*P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;9S!r^WyP0t!h)K~y+TeNt<0(qI(sA2C_7OPX!0f|gz= zsYN#IDwP6*tyqvaLGYGZXLyGYxNDqm#^Jo}C6?=VlUf6D4Z}oJ0UhrN^Gm``;{ze}2@@ zSEJzfgI9}!2jo%6cccnG&rVKLH(xAph%C}$uAmx~wk77@#IEdxCqVqQ${)vMa9l`b zld*dB?UzdVyzYFhlyzOtWHP2{YMN#khN`N+8)t|Er}mK*ze5?GaU4uwSr$EFxm<2o zkWVGup>fyer4Y^=l#E!j*(B|)Eibu(Rc_k8EfN9CvK+^WqR8`nAP@)!g9x_UZ6dgr zN>JIjPFh6wj^p(E{a&xv?RMc&*J`zDwOXgsAvL9}Nn!D%KWyV9p@1|pkzZ?ieR+Nu zCj>!vtr)t%&+aL{#>eWrs02dre8K-J!abC|-;OJv4Ebfmk21Ugwc?$^D?SNd|6cn5 z0eEQg$`JT;?6R!|b|hv~@VJ7anL6AqR`z%8gFPb>1}+yfFcNuO+IatL|6r?tfvF;o zzkn^P0?r#$jTln6JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0q03XK~y+TU6RX78&MR-=g%o!xha;46a}Tb zZWP28!JSY@uj-6JquAi0jCBx1#YardgoqmRa?$C^Rr|Xh zNk#a$oY!~Gch9|=eHu9}EoMux)Iku~*{Ge6Gnud=$OJg)%iz@H z>p-|K5bB#4>+$*Dj16~73u*w`w9srXK2Z>i_E$ZqzlYGb0htEjB(G~Tb$J8OQy9qRVZ&F_{xc^39=;tbBSWG5Q!vrymm37jD0V=;<*$- z^l`Fv$FUOD=+c_UKiLJSCQk5nlRTVh`sjLeI6-25*%L9`GtaMIJk;fk#@s-vfqFOy z_(&u{1<1NoDW`D2!peIjaPR*wO>fc^39xgazhVf~W>eE@OT2>+NK+&b+Fkosb{@@& zuxgI50sewakdwNKA;F#F&&cNUYKAe$H9B84Ndm={BDsLLo(~;}Pppss11r%JG{UdS QO8@`>07*qoM6N<$f-e{z%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterSide.png b/src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterSide.png new file mode 100644 index 0000000000000000000000000000000000000000..23628bd712d3408105499d625c08cd40c7dbb6f2 GIT binary patch literal 584 zcmV-O0=NB%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0l7&;K~y+TO_JM70$~uv_wSCN$0&j>t58w< zP+_TsDHYO%Zmwy|n&=j*>2@Kl%^-*(?Wx~5u>^;YnK^UjJG0*!?T6GuFMHq1HN17u zzE8KinZI~Qh2bG+J#TB#$YjQP{k`*}32=SA@bbN@0cYKf1K79z4r!xhG0r%!=OhU% zaxfU!q*rBAQ*e~PUukm=irEql_i!NSo$eQDV|?9-#_yNox8MFULRAPj~qeRNrqqYTq1BPF~>1E z-3znP$W~gG>&+KWXMp1`QKwjKS)}rCg~IYpbJcOCBLblD{dF1iuN%n2As~ka5h1sE z^L{g_dZ}QcX#Tx4dFgBx$kb|#6mP1G1g>iW`AWQlb}$1c(9s%npr^vAo<)!^%(>-R zG-^Y9S7U7DHCJS}%241hsb_v(!?qV{wXKqC5!j_g;!AJsct1`I>h&E>f#a>&rNv*A Wc21TVb_`1Z0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0k=s+K~y+Tb&_980#Ojf_v7^0f(U}3BIqF^ ziXOuBVJ(HqEDhUMG|bY1+_J*{?V3os8H6cYFA=0Y^}CIb5M2(#oSiu{bLXyBe~LeO zX2VNXolQ`0Y}cDc&;JRv+lQd`vMV1o!%X?OM?5^Ch7u`GNr1>G6W=#*{!hpmEzV!jejD(Mt((0JCXZ>yvN^#Nwkn z#u#=bG$cN_EG^(m+RZ4k)wSV)KL>$yV?5VOYU%7e-h1Z|fgT*}W%V5d zj_v1Gx$RBo9|8gy_YT2qGIJy{x{2K(c{)I0SH6D;@6dmjQD> zKO5o$QW=4J|GqS@2+*)%D0`HW)ROX*iVoD4cn8U#20s#ECdOeiWT58@R%TX$Ou@$n z(7;K;66RKH9ScR!cuUC4{JffF>34UDVkwMc6@&N}PUI*Xzz4RS5(+Mzh*b=J0~~=G UjSGxmPXGV_07*qoM6N<$g3$>0@Bjb+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterUnlit.png b/src/main/resources/assets/betterbeginnings/textures/blocks/enderSmelterUnlit.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1dad33a35a3fa4c5ad7a359a11961e53415281 GIT binary patch literal 616 zcmV-u0+;=XP)N2bZe?^J zG%heMGmPe!Pyhe{=1D|BR5(v%lIcntQ547LaryveC&au!NTd%@D5cmBMMTt6iA5+_ zw=_xuu8B!w#!#(j@Pkb2Ac!q$(%4Lh)FqoA9ACiS%^erW;cz+I|J?sQ=PJf|>b$vL zZRScR3Dl^jjjOC>w^Q|c9xY$1GN@#;Lzkv{ppB!&;@tnXjlo&?{S_s9Wv=0t%5mB$ zJ3l9cQ;FlFrn!rId>D}~NFo4$9qvz7Dysq@Zva!iPRvH%FRutpZvZZjz{03R1+s? zO_IfFT8yrR(-{((jc`gGX}{BwbZ!Kd)u>n;0DLHtu&O#_?Z+o5@b0Hg)0>3Li7BxM2_O*+1_OaWPg}4bg(;s^GjJAwEp37c@E1ZI0@$)bp`*X^ z(B|_hs``;Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02XvbSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8JLvUk0005-NkliCpIXfS4F5@jd(9@43`hXSG|cz1H)r^{l-algadh zGreA~)9JKY?I&jng~DR7&?>GfmC9f+uq;amrBW#xji%FSm&+9nhktVB@pzEQX0z}} zI-Sl?C`1Tqwc79ZHyVv#Fqp|?esR`nwQ{+f&*$s+`<+fFl}Z8N^?D(J!8kUFdmQLks*>G01co4azDPA(P#_=0)xSzTCHL+Mx)V0 zB9V5x4K@$?W}D3>pU25j2n0f*P%IXUL?VeqB9%&!-0gP5;SezBWblqy zAQp>3eXUkIpU=nR@o+f61Gn97i^bx8zlRFEjoEA_1c$?c9eTZ9GMSuCr<2KKxm+$5 zi}`$xD|V~b>xo1H82k+5cDrY@+4XvT|JMKj%x1F@LbKVt-|u|o{l+`OtX3;L%{(5D z+wBGz`3DeAr_<~8LIDjh^vN(=hM^ub7)sCQ6Z?>#9*stq%LOSEfFRH&?DZnujIsQd)#f%_A1Nnlp170a?; X$<3JQ=|;fT00000NkvXXu0mjf1{xf9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/kilnSide.png b/src/main/resources/assets/betterbeginnings/textures/blocks/kilnSide.png new file mode 100644 index 0000000000000000000000000000000000000000..3e784745d54efe114831ec41d34e6dd06a6b51a6 GIT binary patch literal 607 zcmV-l0-*hgP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02XvbSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8JLvUk0005fNklJbtAqxF!Dh3`vMdDkdOej&<@0&3*Bg(=zbOa=0%VHCA}2|Y#}kXi zgurMtMk0}ZzaNc83x&dmg5hvjDwV?F@M5u;PN%tC4nimt!h*y&ZkbG`*=(NA=W@Bc z*=*M9HKazPkxVAj>2$SP-R*XqbQhK|Km%fWe^;QAw%hILbUGf7ola-9TD4j&7L!aS z6Ky7w2@^)6(Re&YoJb^oC?GSR&uLMqRA?;(?7>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02XvbSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8JLvUk0005KNklmk%&l#l(Yz2V!;B5 zxx^4+jG;*kZJvc_Z3r7Hf2zN#vglg6i-BQEv|6pzYSm~oFeaExCTK>Z5fcW3 z!EiVP9F0bQmEvSRpF>eB7NM2__`nuI0kqp~z})qEy=JqyTrQc()oeCHByBpKP9R4N zpaGZr{hkiQ5Kg&V=8#bgp&KHyaX1_@z~yqG4_nXYlMlS!Znx9vL`2vFoJ=OYUN2I4 znOCgG2%7dN~HpYCe}`;L-rJ}0|2AymJARB0GK9LvgexkxK>-? zW@U?{!{Gox6YKxN1Fh+F8pljixhPGnaG%d-QeuTng*_e*-i}sv+AG$#e?9Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02XvbSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8JLvUk0005 z{r!C|mwS7ALoHEmuv)E}%_gY@0o56cMy~?7T&_?k)M~X-snlpRcXxLH-QCQ*9R{?fiy=ioz+$nm+;1Xy{{v_F`1p`2K;N2bZe?^J zG%heMGmPe!Pyhe{pGibPR5(vvQprxkFc9snsa-pEoHR>Ay3(*z><3P80I>;ifkVZO z0}_9MK;r8VDiW3Gjq)cvYeEW@UaawW-pqTkE15QlPyrVJVu0emKmi>AmT-{uPX#pKUFDOL!UHy?%9d*kuPcYi zs^dBgM}JWeNFO=rC^Nke-j1BfNPph>nN-MQJ{2t9gY6;JWTajXtFvqU{j!RgR>|+3 z%uwZ~%00000NkvXXu0mjfhG62! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/netherBrickOvenSide.png b/src/main/resources/assets/betterbeginnings/textures/blocks/netherBrickOvenSide.png new file mode 100644 index 0000000000000000000000000000000000000000..f388642bb85f30e426df97fe648cb423520bfcf4 GIT binary patch literal 467 zcmV;^0WAKBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0YpheK~y+TU6EaHfOeQgY|h#<%=XhjsI ziD^w^`e2&$G*zRVT51>xDg>&vebY&9p#T5TBp5FspDWwP-8V#rqLra_q)D=Ng1m-4K z<2p*Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0Ut?3K~y+TU6M^tgFqBTyEOzDK8j#ls12#H zanVF$x-u?|3;+KQ@(h<;(B!mvbLZXRzJX1bg(gYMy9B5~^%@$q1<~-)kKgAPK@GQu zVXW`@_tw{VVfj=x(Li-=_wd#pKy@D~=@O-%ih40{q*^KVS+K!6%#qj=^mS?8rC}=g zFNVB=NsKVehFF}$F^>Clxq2AsKo7(jj(PRG?Hu6N_6`8AyW#VAcB(kTAun0m0PmBB zQ_w-WJo5}JoRY*I3FI-eLHPhliJe}$o)7=u15N81gK8NlmiNH6nrv_r;vWN7yS`~q z$1V-r$74}boXUnC^f<#Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0cA-mydGdpKE!|ov0UTUepv;Z6k?}Gx_0*&A^FTWQr0ywDC zN$E$d-PTvRB76(eMgV({Gw>0Qf$&_lc}YsX^5dI;maHS&nY!*o>C{%4qY~Seyr8v2 zGeO~b)!kEQFR>f}!wj&+7idGjw&d=~O`96f%<$w!%OIh>2sWF|cDvo}c6D9v_xr=) zKyqqpvDC~ka|7BVzudpU;1tR}jgg7xMoc5WxEa$%_DTI|oXM6QvhH+!qvnNb-+>UyE() z>2yAyA%*rCCbFBFc82FD#rG=CVpz2whUpe1R8T qrrj>PEN8FP0ze3H0us65+WP_JT3>CXcm>7)0000N2bZe?^J zG%heMGmPe!Pyhe{Nl8ROR5(w4k;zWOFcd}e4a9Yurnb|RloHe#in2gLVu30#Y`Q>f z_%=R>Kk9;GzobDCAYDDZ;a>XN2bZe?^J zG%heMGmPe!Pyhe{*-1n}R5(wSP}y$UP!#MhkOxz|;f;hui4sL2G2qbH20J#_8{msg z$SR~nNL{2>>1!X-|L$PBMe0MPN+WALXU21m-_>e6{{X`swcR@01~5B4(czY5 zMV94x@(2ZhqN=+rD=10}Reu5uW~#cUC>qdgsxV2CRFF2$%a|(4o*+n708#ibU^gd- z_#U1`X0sazzE$*yRefM-hgD; z@@4g9Hp|m=k)~M?q)+$j=`@3_3iNuHNkXG&8itcNo<$LjE_@XBH-G@Fs>k0f&V~l=NB}Wl8x}j41WLs002ovPDHLkV1hr63yuH) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/obsidianKilnTop.png b/src/main/resources/assets/betterbeginnings/textures/blocks/obsidianKilnTop.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb8c0e0561825b9369fdd4c86e434f97a184702 GIT binary patch literal 516 zcmV+f0{i`mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0d+}4K~y+Tm6FR&!$1s0`Gs~dWhOJpyplek z&=x9QMM4N6kjkPPKw`!J{{$y9fv7BykgUjK`}$tnIT#Fvf0z*BSEL0PQwbrl(MT0V zVT@0a!_CD54px>yh|%5VxdTwTeSCd+ddHlL*2bbJ@fY)Tj8mRUX`Yk%xCfA1EiS2c z&O7JccArErA|W(N8SiVTegJ}82xIRfR#kx_Yi)8ST064dkBzY%04Q}NR69aRKfVdm zYQv#d;wd|T)*7uu^BCC>!~8gD2E!OA?-`_&S;>61Lcp{+t?L|t?Zb9x1%{vLL zW1Os4H+dvTVgzP#7v%K}^d^_)uJO;7SKc>pf>ElX8e#pG@MuhFULp$#fsqE_u;V6;!SD+q`eopJi=Ep50000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;Eegmrwuz0XIoRK~y+TeUZ&>gD?<;d+WUz0vOvQDM(O3 z5+bF_xrZu;wwD~LUi$uT(GM?_h$ulLv_CWU?D|2e=nk~jvq~?pb{U2-h@u3BwS~1S zr52~RGXZd}g!Xm%83a&2-oMF#)-Fvg72>Ae=XpUYY|=?UvTY7o=61Wo404+>OCNZF zQXv9s*R-`ZS8#NVSwk2ENR7#Fumui|cT;?l`cnK3Xi&+Z!zjJ4v!j#Bs_$cv7_dc;mz2 w9svz}gSP2_!~$Bfk3j&aR#kfkLQ^XG1K?a>-_foOrvLx|07*qoM6N<$f(;n9e*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/smelterLit.png b/src/main/resources/assets/betterbeginnings/textures/blocks/smelterLit.png new file mode 100644 index 0000000000000000000000000000000000000000..8c46c106430e5eea94afe1db6205c4c2c0ccf3d1 GIT binary patch literal 542 zcmV+(0^$9MP)N2bZe?^J zG%heMGW+4D#sB~ToJmAMR5(v%l1qvLK@5g-oVkD~ip%zaAh>X&_y7@c#A#pnKtaKc zATAu8g>Gcd;4!2{J%A^1F<*7M#lfExDw}*BkAsvr;u1cSkFI2;OvB9TZm8s+eOK9e4r5m1Fr0Nw9)yZilqyWOtWD;A#P zIGfGpa=DbtWqLC$affdoKQ7kmwQbw`{T_e2-7c3)4Xsuy>Iegw&1UoYd@`9}f&Qav zwTjgf2nxtTfC;ccP^;A{mC8fJ5m8GNpizzy6pKYoLjZ=M{(4q5tY;}B(3Z$e*pPJL zKYYhsO!i*|BOnY(m&#uJ=S3xbjr{f+T4hLwEg%`_=c_bPz-TNfH gfNmMI`45)$2fHLtgT-;cDgXcg07*qoM6N<$f-0xs761SM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/smelterSide.png b/src/main/resources/assets/betterbeginnings/textures/blocks/smelterSide.png new file mode 100644 index 0000000000000000000000000000000000000000..e254dab3d65af535eb9033efe8556f0706c24994 GIT binary patch literal 499 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;9S!r^WyP0c1%;K~y+TZIaE7f-n?D`*MhE+_`}a4kj)f z1VM~qT(~tRCL|DtgmLGC&S`JyxR|pjxA(7KZ&8QCp)AYe@wngb(==r*iXwlbs;c#R z{blfdUy*SgIh{_{x?ah<7;uVlKA)%4siG?`fjm|T16yldF4U9hd7eUmG;?7oc8HTG z@+Oms;$tHt#NKi35U)?jvdku$X7AELwqkQ>eFrA6+wJPQrh%D?g)Ja>wOVa98*I{a z0jGTYM-)Y@Ns=s=%TL2%vCxue_C4}rcsw4&Ua!~l`5cDfe!us9kH2Xe&QW0)q7R`? z{dT*hch_}XR6KGAAXy=i02>Nev3Yw0aG+!hlA{aaICd_;KqQjTz?LrVWY7g7NqPeY za}!C}l4s(YzZ0y(2%~`Ev~4Rbh)N^Y`FyTsvl$tH5}t-R@FtA%cDpft{$j?j-zCq< pAzAUq0zZj^VLO5#kf_~z-Y-e9SV2E`U3CBe002ovPDHLkV1gHN(9i$? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/smelterTop.png b/src/main/resources/assets/betterbeginnings/textures/blocks/smelterTop.png new file mode 100644 index 0000000000000000000000000000000000000000..f4890e16bc034ad0259aae0aaae9b149b827019c GIT binary patch literal 489 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;9S!r^WyP0a{5!K~y+TeUi;;gHRBK@8k4IG=_j1Ap|K_ z7eSMdf-xlifZNoSpwKL`@KO6+=bG9UdKQzpGv~~oQP=A=O;haod_EiwSf1}QWLdV` z?MUtS`^93RVB99;d2YPh?Q}ZTBM6F9mZjr33MnB0JglSvPvg}!dOBE^r5HepJ<}q7 zLV{$E$D0HdtDV4~n7?0n6wPbHQr0dietcl4W(h13z*lDPUMLAYf0j z(6j*3>jcIiO?Ritd{5^hwV+(BC fUM`nEf|m6KR^>Y8BQZXd00000NkvXXu0mjfaEHZ= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/smelterUnlit.png b/src/main/resources/assets/betterbeginnings/textures/blocks/smelterUnlit.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4a14e40e5b58916ee10dcfecf17a8a43fb9909 GIT binary patch literal 545 zcmV++0^a?JP)N2bZe?^J zG%heMGW+4D#sB~TpGibPR5(v%l1pj=K@f)fIJtoMLX3;?fgn!6jp74D1{LEIA1Ele z5yXYjEOg@`JccOh0X$2-o*IWFev6)(s=unMt6TN^{dT)O7z}#7UcFvtZM9mTzvysZq%`6vy;P&6RLB%Dg6 za=BbKn@uK@rfDV;30tqDv=@y=6(1=N`F#HEg<`QN2{f;FXfzt4rk*2t;dDA7;L!RE zOrX>042MHW@OV64uQw0~__R6%_q*Nh@p#KtQYrFadr@uq>-wF5BmHAPVG&Mkf>s1t~+oQN7@9r4ytjY7_AL{qIjAkw`ck zX2nT}$^O}a1On-Fnpu6=V7oBoN2bZe?^J zG%heMGW+4D#sB~TS4l)cR5(vt8*Oauve@__zRmhw&oW`v0#LT=By}Z;C1rt33 zJ)_?bmmdQf8sh2V7-Hd{I?>UaDNv*}nk_6~g|pZ+jU=8)lUzKlTDlcVh4p+6w&vxi zcWhZ1Ykweh?X54ub7Jk6)En1U$>qz)^7U80-~Ief^|QAX>puUzxJ~2PoTJ&B>nm^R zF5~d1w{I6S(dTsOuFSXE@s#D~XXRatj6xwLZXA>9-%l%jo+cbNTSWJ0+lNa#nfl8u z56D`0zGH4WR=R9LALo*`4SM>j(-NDyw)oA+i~N-T_2)i&=_@>pl{O9&Bok}}*c}xPIh*dbY}E4QNKW{vu$nirwwOuw$u=)x zwk?z17`Cjw(45l1VX{=%P|(CB>S26RV9J5or#utnN2bZe?^J zG%heMGW+4D#sB~TNJ&INR5(vQ}dVWhjO}8 zIv|1XVT1VD4~RdnEhqS$^yVM;qwYBo3P(G1n?S8f5PN~fzjscEXo|TctNz6a2JI>| zYk6P~9PVub$<=9Aub`*cgT}KBxQbya(xg*?iWg8l&Lk)iCEzMPzaB5tXLt`l>vOlR zhyZxzNWB_Pz<6C5MUfKoKyEhpgm?qp%qI44EBZlnH`sWHO^0DfEAi>>3PnLR-3{|V<)&WH)1X~l0KRb|K7{#Rn*aa+07*qoM6N<$g65LE AqW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchSide.png b/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchSide.png new file mode 100644 index 0000000000000000000000000000000000000000..82628c6b58c6d0f28db6a8f7d6d0aad99a95a0a0 GIT binary patch literal 462 zcmV;<0WtoGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;9S!r^WyP0Y6DZK~y+TWs$*3LSYbvTLxNSXqPf1@p1_+ zQW8jp=AvENCR$j53)|E#kZ@DG9-yVJ+VlwCT@P{}$4|~Q*9;EB%=~lC%;DeY#=+Oe zwWA&e^GWaF_+U`qC!zeAjvNdx31sun`|+?v1kvFR(|`mCI*NY?l7AmG^cL4ju1$%S zaw9z7o`S1(2zUeK-7P?J*{tdnP#R%XUP>Ip1~r*uiI5TK9#wL*h$3(m?lHzV~*6TUN2bZe?^J zG%heMGW+4D#sB~TNJ&INR5(vQ}dVWhjO}8 zIv|1XVT1VD4~RdnEhqS$^yVM;qwYBo3P(G1n?S8f5PN~fzjscEXo|TctNz6a2JI>| zYk6P~9PVub$<=9Aub`*cgT}KBxQbya(xg*?iWg8l&Lk)iCEzMPzaB5tXLt`l>vOlR zhyZxzNWB_Pz<6C5MUfKoKyEhpgm?qp%qI44EBZlnH`sWHO^0DfEAi>>3PnLR-3{|V<)&WH)1X~l0KRb|K7{#Rn*aa+07*qoM6N<$g65LE AqW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTop.png b/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTop.png new file mode 100644 index 0000000000000000000000000000000000000000..84811e99b186d2c9e14cc26e0bbd0a61afc120cb GIT binary patch literal 533 zcmV+w0_y#VP)N2bZe?^J zG%heMGW+4D#sB~TlSxEDR5(vvl3PncQ4odu6NN=WY9Uw_XTN{vh-dJ0Vw zOZydJWDn6xrddQp7o~dW*Y%zD_GrRlSZDUEnYCx1p`>EzN8Y9%z(9d2_`FQFt2>bQ z(-jRbMdh`$BsfPu*9VkI!S~f3v3cab&--r=7m1Cm_o)k? zCFdaPHhp!|iiRPWN2bZe?^J zG%heMGW+4D#sB~TYe_^wR5(w4lJ80aQ4qy_iNYWuwFnG}wseh3X)R4HDBYm^(8ti$ z#D6_TQ4f%5TSP>e(gXI}=CZnd5Du5KXXebEnY%vIh)lxL0@L9be(uYoyEDk3l@Sa( zIhX%~GH^ay$=CWWXTQ4Bt8PO;ucF9U`LKq($7=^;_X;~2Q; z<=Ux@I=ab$Vk{{2@)3WxyiSMMMDa1ld(FuPr-?Q{4L@(4>FHw!`c z7yw(MC1T^2^l*B47SS`quyX)=yxgSG?{*fRUz?W_g+D@jV}qfvAnFmMSc25AX`M?enqczz85FW`cIghKMH0%Z^nEBb8gF%n6GcGfvt j8N^AbmRzudY0v_{L@WrSBBMkZ00000NkvXXu0mjfwyVzo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfNorth.png b/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfNorth.png new file mode 100644 index 0000000000000000000000000000000000000000..70a151042bf42b0c5e7f7d850b3c4d927a74ca1a GIT binary patch literal 489 zcmV<{97<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMGW+4D#sB~TXGugsR5(w4lI=qX z6HU8}qAsA)EFz*0r3>si&9>`q5WEa?=FBr^W_CxadicG$@laj8vFEV==;M5oWDjto zNF3KntsqcHM0Vrjc2Yx80wB_FZ%YXuzyScu zMP_D9df3s!mwRy-9`ONqol0uon1spCPuQkL1W_0!7Yh{=(M~z#1G=Z)Hl&z1z1rGv z@E2%h{{jqyGaL`TKuah`OFttbX^9=+&@N2bZe?^J zG%heMGW+4D#sB~TYe_^wR5(vH;!ti-_n$=>mHWv#oXtUWPem=9!r@yS`E?Jg%A<(4-|O;OnN0a6T@!2c4bQ zMhfAhm%5D|&v60lLv8)3VPi%2l~t#6W9z z%Pb5D+>opQ9@;-s9S9SkHuh>ilA4>q5ujgP8v%F#2eBEHTbd^9jfABSPOq9Abh1A{ zI|Cqvr2{3LlVu$4y`Fjp4G_nvtIhrc(2;ox@nD{j#G;r?ZJ-BJ`^R0G|_p7^Cw_Vn{8z9ObRF(gDr@dyy$(G6_;2(K0BHrKb*vq_#Mo jl?in~`*Z$E0cPMEJ9-GC8n03200000NkvXXu0mjfMLx=* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfWest.png b/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchTopIfWest.png new file mode 100644 index 0000000000000000000000000000000000000000..782e6e6c018caf6b9fc8eb410949ae684a410dd0 GIT binary patch literal 490 zcmV<{97<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMGW+4D#sB~TXh}ptR5(w4lKn~oQ4qy_iNYWuwFovOviyi_W!K8of>ML>kNymG zO*HK>ih6)7+aeo7Y z{Jg3t!@Z@0>++(IyK2fIwN$^h4tZ=EM5LYpbvYRZr9`L{4~aoC3W+esr&b2F*8wRr z^eW4F%`cf^EI2&R0X!TZP7Rq&85B!~QD5vucA^2hk?z-Z2%ktEBxj|>bHiWhOZcbL=gYLFB(r#pmh2Sj4gOb^g&5-FG zMXAM+=TmiAtGqEf0Xo-!l=4Km(yxaD@-*s?sOv7=uSlI=gFTD_k3uI)Wa!t{21!vn g2JSH)h&-6u7l{-Tl10^@@Bjb+07*qoM6N<$f_oRqZ~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchWestIfNorth.png b/src/main/resources/assets/betterbeginnings/textures/blocks/workbenchWestIfNorth.png new file mode 100644 index 0000000000000000000000000000000000000000..649852f022417eb290161e62dbd28bf779ff5263 GIT binary patch literal 476 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 Wo7uWO^UoX)e=FDjP5l4Y7WhAlsA*OJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/gui/container/brickOven.png b/src/main/resources/assets/betterbeginnings/textures/gui/container/brickOven.png new file mode 100644 index 0000000000000000000000000000000000000000..12f5391f321ba786532d708896d85796e53a43fa GIT binary patch literal 2241 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~6kBO~L6kL&+!4FCVjcXxLmJ9g~<|NlVQQ7{?;!#D({o@d_;$|xm4 ze!;*5Kav4M@OO4qU{rG!ctjR6F!1dMVMYtqU=^UCM2TxeNpOBzNqJ&XDnmhHW?qS2 zUTTSgiJpO;(eH=Lj{(aUbx#+^kczmsGrK1(G7xaRDf#r{fB7?IADEh^X{&79_O^J{ z1EatdUkn-5%^u(QktlQg-=*_6CYq*P>N)#>-S|TMZ& zwFB#(HP4^FZ2y+n``gV}E-lkC@?a_{WmjRmuA;!(c+D(yVxv9d+XSXdf8@`!tU7UE zZi9FB*4xYP-wfE{B2pl$7hCT+zbLc0v`yl1Fbfo_udOx9tC>U{T2*!W&Xw z?s;X|Q_WcXKJzAKRJi)yzUTJ6sdi(ARsJ>B{@0nve!QVLz6Vmxj9^&J~-x=V;dDi!IXy zH$4B-bz$4Tj$jAPN1Qhr8TS5UWO>2s@5sQk&+WkD?d_6#A8P(%S;N2o`F%dVCWiW8 zg{!vtKNSw#7n#Ae{qDQ?#>ol?W;6WGzIEPxr-jIdH_Y4{mi;uC-p_p^R&Z9<{>>9k zKX*ScZ?U#hIa3~Q<&N1*LI%+%jy<$Z5DhrguwO7hg5`(Mg4vI}zUh2WbKvE^nas?{ z;n46amWM@wfsy0F)%gt!Uuzf{53)R2%Te3dU?Z?#m$<+JaldAUc&0er8S@X%Z1@CH z8L+>*kpZOV<)vS5)1I!CKQvWaG&+m>!uG4J+y8z3pTf-~&;V9|P|D%Jz$8%cuKk1m zwh*xerPHT&Wm}(`x;+Z0%OiS)#f7wl&O`VmhW4d!1L5rKfk@+r~#< z)fvrr?-aZ)@zjdBB+e1g#>#kVgMx#k7>mZ?CWh1qfdxF=Oj8ma8;o=YUQ#ILfW<#n XcShUDB9DuvplZd_)z4*}Q$iB}-ox=w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/gui/container/campfire.png b/src/main/resources/assets/betterbeginnings/textures/gui/container/campfire.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f4bd214daf66a05f370280e4af443eadce0aa7 GIT binary patch literal 2618 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 lE1eXq)b_salmb(a!{R@k4dtU$m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/gui/container/doubleWorkbench.png b/src/main/resources/assets/betterbeginnings/textures/gui/container/doubleWorkbench.png new file mode 100644 index 0000000000000000000000000000000000000000..eb462ddad45140fce621267d741f25a4c1eb1d3d GIT binary patch literal 2010 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~62^QA&dRf`N&DBm;)v@9e6; zXy+{Oh%9Dc;5!Jyj5{V~zXb|Pl(rIsj|=o#o4{eHOo z7_dNb@N{tusfc@f^I_C22NAYJt*Zai=gcyA=e5Fa;=90W`OnUGu6C%9mX7s5T{LTX zYR&SeUyS@&nU>GI_y6?gibmcCmDA?UYvW$SVDp=WGl2a=`u)o4qwK4N9_)FoxSpGl zMWErc+%yIz4uu21t}uPr7cJW$&s&|I_Fi7wrXt6l<$%}grzg1h?~=aZB*g;nzRzB*!xTw)wK?OJw;Z)Q z=QCC;U=eU&I9DA33bJou`(L{Kn=i_AW+E(n7;f;qm;EJeu{nH45buGv`%7O;|Mxyd z(18IM)Ih@GeIlnq11P+K#GUWvAKu4kvL)PK8op!u;Wx5TE7=}+WsAn0`Mwsc07T6B zz5%QgOuQ;9a$76Hyy5*N?K`&;de$#pj(0O;4g;qH4&Ub}64x~aA<~WXk?X#`3mP#b_u?Q$gKUm3> zV7d0ZwJ$5f>CWf#7CwAm&sy=F1NXua|NEU98oXv3N21~**H3nld n#u*zq5A^sBnA9Q0X;1a{l{_nd*y;QSRQ7th`njxgN@xNA0quoD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/gui/container/infusionRepairStation.png b/src/main/resources/assets/betterbeginnings/textures/gui/container/infusionRepairStation.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e4444662596a1ab257a966239a8c0896c60c25 GIT binary patch literal 2049 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~62^QA&dRf`N&DBm;)v@9e6; zXy+{Oh%9Dc;M)(vj25iHzyM;9C~=J_3C>R|DNig)Whh9@%q!8$OD$0_(KFC9?s+yn z09c@;d%8G=RK&f#@w(`ifdpHkxytwYlX(rUTsxM@sK|eM_wQ%ZhaKO74UDCZ72fbq z{@qsi_% z!LHe=2lg{moVb3j|F293~53Q&0b6&+8hJE)ZOV!lL*>7iH`oi|$bolNX-v8ATW#X&V&8M|@$)#r1ZiE?1INm8KVAN7+_&}p^Mr)+SDph+{<~*}u|?Q3vbUba2I7G}k~;eF8S9orADvE2ex?;o}Dar@7$qF~EG5%W548b~KtyTksubHcRe zGTta(S$gMo;x)Obm%Inm*IxN}_|L5_m?~J50{zA!u;9L*-|DI77=C*|99qhl@P6yH z!usiv)fr388TOkk?X%BVzZPnK14B&tW{|HTw*PwjY+KYzo(=sh0t(U(7PB9)kU775 zwiQDU^YeSoXW#$l`0&^ChVS$4yvX+8ciN0IHgX>5@nuNMVKPV-ZjhYKaOMU}!Z9@l hW3vI1;%1jPzF+_6EA{2in_hy7Xirx^mvv4FO#s-lojw2n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/gui/container/kiln.png b/src/main/resources/assets/betterbeginnings/textures/gui/container/kiln.png new file mode 100644 index 0000000000000000000000000000000000000000..2255d0abdf7931430cb941dc832975c76fc17681 GIT binary patch literal 1488 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/gui/container/simpleWorkbench.png b/src/main/resources/assets/betterbeginnings/textures/gui/container/simpleWorkbench.png new file mode 100644 index 0000000000000000000000000000000000000000..0181cfc668b938119e12d27ff597f6a0072e5df9 GIT binary patch literal 2052 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 Q0CXOMr>mdKI;Vst0B0m&y#N3J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/bonePickaxe.png b/src/main/resources/assets/betterbeginnings/textures/items/bonePickaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..c79ac48c8fe07fd37e7561fa34e48a472791c70d GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ)_?bmmdSF+3o4#7-Hd{{Nw+BduG>$G`5(1JKow`wRs(6jLXIrIPAZ>#=WU%vW3`$VB|J_Aof zj=fki*D(b%kDd(XgmdT2ru_W>;GCQRTXnw#v%{>3b9q0V`{v8tY0Qvj>|@L!kjt>^ z>0#LT=By}Z;C1rt33 z>la@$fhx{;x;Tbd_|KiNmhX^*K+EfQp}#6TDg<>7CU9^F)u}LbGB!P8^w`j0wQX+Z zv^TNazZ_DT99N#c@1Mwojz4c59nRg0JrK72v|rfiOye@6mjP>?c2>o6YMkCQdn5C1 zhrrWZ9Et_$#espni)vQo|160SxM0S{@aNjHH4WE4`y5EIc_e)!hrMBwo#@fye-FGa zvsG3&8(h|Kq0Trxuy+$vj#wYV1SXv&>v@8|sj>diIvirPMPSZl`SiC;2_g^89;QFY mn7KNx;rX1syH9KuG0lHmb5!lwzxhCaF?hQAxvX0#LT=By}Z;C1rt33 zJ)_?bmmdSFx$WuV7-HeSc0wR`lY>A@YtuZh)zjCQXa*^JA2K+k#Pw?F|Nqry-wXJ@ zhHUtiaNzdsnRkPKbGxW~74=QKQ)%qHN|fVTwUlFQVCI4O(oQzL%n3GCYJ2n9`5qLT zUcVriWZYAk`&Mx2_ea*7IjjWkMVdWZ%JRUyvB;R`rNwm#dOKP!#?3a-`QT;sIX zY(d`N^f#AY%beJp!N%dhVcv3XhS{|VdcRvuRIQ_9=da}2;qKkF*K+4Fy`Gq8|6i|4 zmdPAQSYHppfw-2i?}{AVtxCr{8dft1 zCi6HtN>98TFyYR6spq^hH*d>MIN}?Z_xx?$`!scDm;aNpW<5G8|CcA|tV=_`)b$$$ zJ0JI@IW>6Qm3*4lHf3*)SI3NRwzma}nXCEZLvs9IKKZ7~`5^iAy5yXM`Y*m$A2#_} zGQ|DM)46*?@pi8WTTFFNihf+W+tUxtdk)U&Tfb|i06Sa8p{E~Wna-k5;{cXG!6~7jK-X77SV5-1rct7)y_~jX|&U=5VR8!N5S@l3jYfIeId^MRKC3Z2j z&^6O-*z?^E*hv)eZqwT9FDbF>!Y#90#LT=By}Z;C1rt33 zJ)_?bmmdSFsrGbn46*P}mS}Sb5C3k@4!lqy--i zz7m?jlrt-lL8UF2_XNWP2B7JN44b5CUbTrNBmjN%eD&G2gTe~DWM4f DLp4;L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/clothHat.png b/src/main/resources/assets/betterbeginnings/textures/items/clothHat.png new file mode 100644 index 0000000000000000000000000000000000000000..e797bcf75ba477441c827adbc6ba04d9484f0bbd GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ)_?bmmdSF$@X+{46*P}mRRNx9{%0ljA!aGeg`h@ZS#J{7rro)XuhE!bII=W{v}IP z>YNKQ+aw(>2&6D4NL`-xwkccf6vG6z32p+?ZH}`%j2K)_e=J;(Fhg;RIm45h2}+xI p7#Jrg-VkX#!jUC6v7wQXq4v@AFmFkbqd;pJJYD@<);T3K0RY%3P%;1j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/clothPants.png b/src/main/resources/assets/betterbeginnings/textures/items/clothPants.png new file mode 100644 index 0000000000000000000000000000000000000000..cb818e4d31a32003e02e258e9fa4168889317c1d GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ)_?bmmdSFDfD!446*P}mZ)(E5C3j&#}nEn+aMy6W82(xdD`2i&Ca*d|4pAV0#LT=By}Z;C1rt33 zJ)_?bmmdSFS>oy97-HdncEU!%Lk1$wd)wMSn4Ot0YZC8_M%Eh&zFt{o2{Q`%yK9OH z>@+nNS>HYSYtp{QB{oxn(ssybZ~MX}dG2wsU2J}Dq}3Da=XbJXc@LlYmccO&BmkYn1 zmWw8QdMkG?R=`k)A@Jn+4GkNQr~dI@@`X+Fu9?%}oZpv#?q%?F^>bP0l+XkKs*ia& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/diamondKnife.png b/src/main/resources/assets/betterbeginnings/textures/items/diamondKnife.png new file mode 100644 index 0000000000000000000000000000000000000000..daa814c9d1bd8774a8dceef6f3e65ac6a7abb679 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J)_?bmmdSF+3e}! z7-Hd{{Nw+Bdsm6o3YtKycP2gmn|xbhl0;WQ;smwF*O&j#mXBv%me`gM+S6B<$(G1- z^o7LyGy%83GYeOJkZ(z>ahl~Q(aL;DXO;|?S&PJ3g&swQOFGv>`OI1-qzN3;>d4`+ z0|`FJRQqLr*q?8WWE#gVsg#~WjG6Cz!vC*VJkI-MQ5&ZZuN9lH0;>YgCdp-zZHYxE vl1@nYG>8a1j>(bmIgq1xo8i;PdNu~h%njd-Gd<1#ozLLu>gTe~DWM4fM`mk{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/fireBow.png b/src/main/resources/assets/betterbeginnings/textures/items/fireBow.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6b8ddffcf2f084542c2f7b3fb98883cc5732eb GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXY~8w@?$_XYdl>X zLoEE4PB7#5&la7wh9mcf0gDZXKU+8~xWRXiqRo2`0|L1O*aWj6& zS;~5jIkQ1xnsNSJ`Q-ez00y>r;iirDogA&(e#+HwbFwzyoXe>DTm3C_O+(Km s1@26x7c2H&yga{1Vuot&zrLyFLV-(mABdeg3FvMHPgg&ebxsLQ00|;)5C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/flintHatchet.png b/src/main/resources/assets/betterbeginnings/textures/items/flintHatchet.png new file mode 100644 index 0000000000000000000000000000000000000000..c2017f01037d3b5361484650b05cf3071f94e0a1 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXY~8w@?$_Xt2|vC zLoEFFPT0tMSV6$`WpMi?q0oS+6m9Jto}N?h%~Rwpo%X>ZuAx!y*YY{33kA;k&T~mT zQa#78y2E4dl^WqIj50im0@u>J16f_pSq6J`&MBUKm1jy(&&P-bQ$GIPV>#=+?Cezs z;^K~JvtM&x&&|-o;Sn{j94lS%U% rr}3<6EP5k#)!}uT`j{@YP~!LFkP=xPQ}S3j3^P6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/flintKnife.png b/src/main/resources/assets/betterbeginnings/textures/items/flintKnife.png new file mode 100644 index 0000000000000000000000000000000000000000..c83c5bbe6a33ed5b14fd5ad0a57c4453ae96fb0b GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L9r6oh?3y^w370~qEv>0#LT=By}Z;C1rt33>la@$fhv}Gx;Tbd z_%EGskoT|xkE=0jd0GO)wgfhnJe>m*c%FRQU6guY#R56G7J2*GPZSsJH#jVProf$} z(d5J#CvJ|lre2yK>#i~!-CI5_x#!8=`s4Gy=KS%Dz9bJjqtb-@dnXe( zQ&tuC&At+~-6(=-W>4&_Gp4gt8x$rNmYU4WHaYCL%vtD5b@zMbls_AUJr8p~2|Bfv jr^0gYx>m_~&gZ#p(sl@}jL5$SbT5OatDnm{r-UW|MSp7Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/goldKnife.png b/src/main/resources/assets/betterbeginnings/textures/items/goldKnife.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6fb75b8eef50234bf7359b923f16e0a53afc2a GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3Q$0figD*u3fvR?U zx;Tbd_|KhS$mL|n)3(`qx5XaMfXdyION$Ex&HER$3zWZCxaaXfhA&QWeSL;PThi_C z&KkbIYIRl9mR)NxSbqMy%lhvVXR(SMyQOlYMKqhSZB3K_Kl7uC&1)u{Sm5>`@y+EI z;R0)e%<2=5aQ&(~rZH6{@d)?2?Q6YG89e%bz^lt((r=glldhaQ&i(DRW<1~A18$R+ z&5U4t@VoNh={%*gTAVBv4TsKhWtW7B*vzxGoN?>xMtuogiFhAoC#_GnlZCw20lmTC M>FVdQ&MBb@08T@B&Hw-a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/ironKnife.png b/src/main/resources/assets/betterbeginnings/textures/items/ironKnife.png new file mode 100644 index 0000000000000000000000000000000000000000..e13af0d0cf2ef9e55ca86e732ae3d2189c04c3f5 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXY~8w@?$_XOFdm2 zLoEE4PT0+R*nr37?ry)=*JddQukf5~n&dFKg7NIKTs_M}EMFG>@&1_dp{C!+hT#Xd z@t!8hZy)YCUtFX4^@hrlDNj~!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPVk-lnPXn;pyTS zV&VU`?;_^`1s+!8K5ol)>(rSREzT*;ChIji0t~*bzR>)qqnz`v&E(>3hJQ2VJ+_7g zhi0#h^wJb_OgN#GbVjCoO=Hk0*$*%6%^Xthy%XeOSCG$TU(d`Sc;eybbekf*dd5ZE Y&%L5LgsxmG0ouvn>FVdQ&MBb@084#Jvj6}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/jerkyBeef.png b/src/main/resources/assets/betterbeginnings/textures/items/jerkyBeef.png new file mode 100644 index 0000000000000000000000000000000000000000..861c73cc62c88ed842ffbef5a47050806e88cf39 GIT binary patch literal 420 zcmV;V0bBlwP)AW z)kYH$QEOQ7USY=H=Q86^51GQk;yfQO&p36L{qnt^f($C6i0FDY1;9#vlI`;wR8_qD zNatf?OqWnZ^kl0@F+UB!Mdc|7@FFnA5RFCy)T!7A>EsxxM4Zjjt1fz%gHH19T#iC^ zf|C8535z*s~Wg72o zzT0N#&Ww2C)l8DhyBec0;lOtIjoLSYw^j>)QrQVN8{RMU4oPSSf3+W8s)C>adcBAM O0000+o^?A04cyJZ72@JsI?4>O9$lB67B72dzRqB!%(#W`LS!R!tE#_v-o!bQ79WdKGa zfu4mW+WB*AO?0PJ4huD4KCxA0L9mMPx% ze=vx1p_@CDxyI^|7}(hLj{C5fqZe~jnzDEQKxvW8cG=*<(5eN47{*V0j-PRAH46iL Y0XXig)?Yu^KL7v#07*qoM6N<$g7Kxcpa1{> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/leatherStrip.png b/src/main/resources/assets/betterbeginnings/textures/items/leatherStrip.png new file mode 100644 index 0000000000000000000000000000000000000000..562cfef3ba163b6b293715622daa3dc1977a951e GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXY~8w@?$_XvproL zLoEE4PT0-c>>%Kx*?3~2vXIL2J{@rfKM(y9C(FF-hmle*?UYM89tdRR`lS9Y-Qw_^9^&Tuduy+1JF6S}^x#_1byZEwBn8qRA=Ec#gf2un1spy&< b^JSFH7%zG}BL(3uRLu6{1-oD!M0#LT=By}Z;C1rt33 zJ)_?bmmdSFsqu7i46*RPdd`unK|z2u;C;Q2{}ZDl3zDV@?U?gpn$RG-}`+-Er{vI^(bS(qYnj`-g`5@WW2p6ZAF(y!|WJ2 zKh}VI^$eO0YqtJWjfiJFA$xFN)pk||36b`Rau?3tXI#p6>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP*swr zi(`m|f3gJYkAugnrT;e@O!1at$o%v5wT{H(oD&my&;GBkvEsV+=lS`i|M%aYn8C4$ z@qWB~leEhgMFr-4cDK2&^Bh*${pfV}-Gb>28Ji9B7Lq#$f5+ VD*s5w*Ai$OgQu&X%Q~loCIDj-OBw(G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/noobWoodSword.png b/src/main/resources/assets/betterbeginnings/textures/items/noobWoodSword.png new file mode 100644 index 0000000000000000000000000000000000000000..c04dc0a8571bce34f3fcd554873100150ff040cd GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fh6BL+dWOMy#Puyg( zed(&d`n>@vcNtR7D$G)0Zfi)(Wu5n5!Dri9g|qL{lnR_r6q$JxFWIbeLtxXNo*afq z#-NE4L>gTe~DWM4f?&n1a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/pan.png b/src/main/resources/assets/betterbeginnings/textures/items/pan.png new file mode 100644 index 0000000000000000000000000000000000000000..98d6d1c25631ed051e396a6b8b233d1ddcc0e893 GIT binary patch literal 375 zcmV--0f_#IP)yXOk&wsFA`D5pb0q@*FD z9;&gj-eeOPDUvM0JFFIysQ?8pOFvggBM0Bvx$sDX;2qE{iM?^B^Cc`Nu zNhwKP*LkdSW)@}^by&?EA%uXoZS&kYhZti%#!>ZBSylB@C*FIhmR`X*2LQ0v!diQ< zUaf@zpznKN&AXQuHVnh0{i6=X7pBTYw3my?AU)n+%KP^Px~|&`&o~E7)8sIj5`MTl z$II>$IJ*Xbype)s63rOCxjMz`+ZXub$E^JqGW`5>D}K8X{ISfO^6K*2&A*hjegQ!t Vy8?G?#(Dq%002ovPDHLkV1kCMoDu*4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/roastingStick.png b/src/main/resources/assets/betterbeginnings/textures/items/roastingStick.png new file mode 100644 index 0000000000000000000000000000000000000000..98f3d7897fbf12bc0f1c472d11c09009955da594 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvS8wT^vI!{F4>LGENjaN2W0N8wa+XD=GcN%P7fk<&S*J!WxU&8Vp7Z zOE_P2{WqAU!ko~MbXKyiXt9|vciV=uDcNj{6WlhLPUe@8V30iF@-o%Wc{$Kr22WQ% Jmvv4FO#si_K+FID literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/roastingStickCookedMallow.png b/src/main/resources/assets/betterbeginnings/textures/items/roastingStickCookedMallow.png new file mode 100644 index 0000000000000000000000000000000000000000..b34f190d5269fe9dcf91bb1d432e64d4dccd5491 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP*uLC zi(`m|f3gC5&7SQa?KzxxE@7N-?Ed?6|Neh|e(Asb{63-ljy9R^^#W{?A6{R-`Tu^r zywX_)f8&e)=e~SZ!0a%qKPN-&th9l%gVf1Oa~`U*e`5>js9@MUGw1ALv&jq^+kgxO ihD#pX(mpXVGc)YXE(j=e>~#WK&EVfZT6M_wC8Z%xrA}TvHth-{{H{?`0oGy_wxnvJKAKv z*9)*oet3KP_5b{MTZOX>{>B&o&wcr-fZ1Wz_PhwUS>_3C4JMP8S|0Z2d&9dz;3Gqt v@y%K8xoV67IY5RZ!;*$u`#@0ES&g!?~|`Us~J39{an^LB{Ts5^v+vf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/rockHammer.png b/src/main/resources/assets/betterbeginnings/textures/items/rockHammer.png new file mode 100644 index 0000000000000000000000000000000000000000..96aa8e6f8b4b2b4874136793b2631f5db4e56592 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvS#px;Tbd_%989$kk*Z@n@6K3&u4E>M~gVnl}IY#lXcqYlHZW{DbT- zF6x_e-6_(3`@o`Xx2$}!a;v*v#%(dLtq&cx+e@GM=DXCcPUOZj>lcgWs%ok}=}cJB zA2zK;K!CkzpZP@Lo&X^HY3HM_a6T_p!&G z*si$g#GC|?S0#P7|Fs9ko>;`HxBKcBrg^8!44$rjF6*2Ung9WNf}H>W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/silk.png b/src/main/resources/assets/betterbeginnings/textures/items/silk.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ee85a1d49e446f3c03bc651c7e8e718210219e GIT binary patch literal 524 zcmV+n0`vWeP)VGd000McNliru-Uu5K03+^AO3VNN0hvie zK~y-)rIImg+fWpRzbh=TwUw;yP>|`Axl^DaW7c$N$XHxlh*J!qKcggrOWL*AgEQKT z3wF1Y^f3y;FeF+mb+dMGy@cx10|D@TpHlX7R-%=xs?29Ay&rT^{Ot5XT`$4+eJSnp znkN~LCS12J1)x@|0Vu%B;}?IMErIoz_gZf>b=aS37PEb+g<*fH(PGJbw&L0ICjv0} z@mq~C0?1YCgSy_iTK}m+RptBmr*?Z=kFQ^yvspXb55AJ%2*8*2N4^by>CwrdR4SEJ zbxA}R_NQF8E~Q$nQZAQy`|e7Con`>nONgSVIH>VxqSm|hmOsWAhW)9&X}sT=L19Sy znu8!;4tMRFLhw?c-e~IC=>@Kruvt4C zog7LOMMR6Gc6%K@f4Y@@DU~c>hnL^PUHeAzDNP9;N}(m&C%ce?|EWLjts;)Xng)gd O0000F$L9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/testItem.png b/src/main/resources/assets/betterbeginnings/textures/items/testItem.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8f58fcb4a2bce15c3f42c952a740c09ce1c26a GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L9r6oh?3y^w370~qEv>0#LT=By}Z;C1rt33>la@$fhu}ET^vI! z{HOLX@--OnF#Y|%eE9_Fi)&|BaqePzd+}aix@PUV_kmq&TqY)aP5v-lqpbCjb47GW zVecoEKdN1^3oGKKo(sA5X})}3G=KLld!^eGrNw`=SxOZvYL`viFLzNQ`vjA>;O2|Q zkI&9e&`kPQ=deNK;CJRj(nkdsySMS?*z}z^-{|G~@BIO%3%58QUz%2Nbm^-zK!-7S My85}Sb4q9e0MC183;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/thread.png b/src/main/resources/assets/betterbeginnings/textures/items/thread.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2076b38d91fdeb364d8ce832b775ab3ce1dc28 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)WP}MF^ z7sn6_|D}^Q@-i8UIOjWxE!gwun#W;=5OpiI9n-iLNhSFwLTz4CiQRSv@f4z^h(8L!qVtX;cRXKk~!r>ulj!u@`x+uvk7 z){3@B8?)Xk>X77gnIH7R`hA+pof(=ThZVteQ1j&;7vT)9eXk9Sh4NTtDU~K)1%s!npUXO@ GgeCycp>sh1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/items/twine.png b/src/main/resources/assets/betterbeginnings/textures/items/twine.png new file mode 100644 index 0000000000000000000000000000000000000000..05cbe0e82672b0e7bccb3304c4b764c317d3ed1b GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DjSK$uZf!>a)($X?><>&kwgk(pIRaA(!qRb6&Z}Z0(}Vs3j*R>Dt%VpFFTX?)vsAr{{ak zayBvHGj=kOKCzQUV7d65uS^WJOBH}(=` zHuio{M_W*gvzeEL>A@fI&1PB_rs|WM%l1B+9CY~JEKZdo0frT`xwgM%Ev(Wllu5IA z?b^}yu3vr5S0|aBd(T!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L0m@TF)W0|RrA zr;B4qMcmVAoc_XrBCS7--(-t>H99TU$&C~i>Jf45I>IXW!pl3b$GgB$V|GH%tRL?E z-}#K&4qRR6dZPQgN<15%@#kmr%I{Z)?0k9H%RbJQFFE_ASXmJBhPRtUI9MKh{`uf* z)x}Gfnw~vNGchw;v~VHg*RNk!tX}P$o15$UeqY(!G^GaucI)^O`s=p6-Sp)9?~Au? zbuC+_rp>Ug=p&yDL-PH+XiNoiw3s0Z5^!1dGBcTOX%RZGb{|S;=sA>>Y$Z+X_T0p7GZ0W;m z|7lt}9FMi{yWXyQ!+y!!`uR*6sf)q{tY31xWjCz3E3tH`VNdL@zjuq|y>8AZT_5|N z)w6jv1FM6)UqN8awa**NJ#_0gojY3myZED^_KfY`wKuBDZvXoI{cK@Uk5gyD?51k} z|Jom{-&E;)NZnzHnL79Fp+`%^`_*hBI?H1oaYh1N@?h1Q9QClrjw;KoCwhN*!L48} z?v%JseC108qbt1IVz(_h=zAb^56h>|wjROiDIB-;qQRP&ME4s#b?@tXu8^}k2k5AV z)n;OcG|rVT{?X8!ab5ht?B#!N)JSZzQYh75q2KVxN#Bek?*IR%hBKB$`d)V1?sN3% zv#J$W4_ElHE?;K7p=P`6OG&GL@7fQ1fBI75NwVSm7t1Cqx-2XS4lhxX68K#Am{_>giWM#hiI0D?iWY*G89cJ|)ro?cbW57M+d~sxkVo zdAYmlPmwN2s2%9_1O`E#576}m$&=X3882RG$;fgtF;$#3OTgE+W0{&uu<)XloU|2Y cURB5Vi$mzhLFVdQ&MBb@02OJw-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterbeginnings/textures/model/Thumbs.db b/src/main/resources/assets/betterbeginnings/textures/model/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..ec0c4d65052ec4838a884e6214b4feac47288a39 GIT binary patch literal 3072 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