From ec1b0644cb3c523945244b38c8927a056b039c5c Mon Sep 17 00:00:00 2001 From: WayofTime Date: Mon, 26 Oct 2020 15:53:09 -0400 Subject: [PATCH] Framework for ARC Initial framework for the ARC block, including GUI, Container, Tile Entity, and Block. --- build.gradle | 2 +- src/generated/resources/.cache/cache | 9 + .../alchemicalreactionchamber.json | 34 +++ .../block/alchemicalreactionchamber.json | 9 + .../item/alchemicalreactionchamber.json | 3 + .../bloodmagictab/ritual_diviner_0.json | 32 +++ .../bloodmagictab/ritual_diviner_1.json | 32 +++ .../blocks/alchemicalreactionchamber.json | 19 ++ .../bloodmagic/recipes/ritual_diviner_0.json | 31 +++ .../bloodmagic/recipes/ritual_diviner_1.json | 22 ++ .../recipes/weak_activation_crystal.json | 13 ++ .../java/WayofTime/bloodmagic/BloodMagic.java | 2 + .../bloodmagic/tile/TileSoulForge.java | 42 ---- .../bloodmagic/client/ClientEvents.java | 2 + .../ScreenAlchemicalReactionChamber.java | 84 ++++++++ .../block/BlockAlchemicalReactionChamber.java | 162 ++++++++++++++ .../common/block/BlockSoulForge.java | 47 +++-- .../common/block/BloodMagicBlocks.java | 4 + .../common/data/GeneratorBaseRecipes.java | 2 +- .../common/data/GeneratorBlockStates.java | 25 +++ .../common/data/GeneratorItemModels.java | 1 + .../common/data/GeneratorLootTable.java | 1 + .../common/item/BloodMagicItems.java | 1 + .../bloodmagic/common/item/IARCTool.java | 6 + .../common/item/sigil/ItemSigilFluidBase.java | 5 +- .../tile/TileAlchemicalReactionChamber.java | 129 ++++++++++++ .../ContainerAlchemicalReactionChamber.java | 198 ++++++++++++++++++ .../bloodmagic/textures/block/arc_bottom.png | Bin 0 -> 915 bytes .../bloodmagic/textures/block/arc_front.png | Bin 0 -> 1283 bytes .../bloodmagic/textures/block/arc_side.png | Bin 0 -> 1200 bytes .../bloodmagic/textures/block/arc_top.png | Bin 0 -> 1317 bytes .../bloodmagic/textures/gui/arc_gui.png | Bin 0 -> 18575 bytes 32 files changed, 847 insertions(+), 70 deletions(-) create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json create mode 100644 src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemicalReactionChamber.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java create mode 100644 src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java create mode 100644 src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_bottom.png create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_front.png create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_side.png create mode 100644 src/main/resources/assets/bloodmagic/textures/block/arc_top.png create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/arc_gui.png diff --git a/build.gradle b/build.gradle index f06f3e9a..fa742ba4 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.16.3-3.0-0' +version = '1.16.3-3.0-1' group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'BloodMagic' diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1a1bca55..94f44db7 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1,5 +1,6 @@ cb435652c27b4978d8db83af2fd531ccaa82ada7 assets/bloodmagic/blockstates/accelerationrune.json 43be0406da1c9f7cf734427bea235a65cda073d2 assets/bloodmagic/blockstates/airritualstone.json +5ba8e1b2a7ef85028044056cc971b8fe02ab7e7f assets/bloodmagic/blockstates/alchemicalreactionchamber.json 4a60c54def00d68368ed0a0d4783979aa63d5f60 assets/bloodmagic/blockstates/altarcapacityrune.json 950fff9f06033741091aa8a66a62857da673efb9 assets/bloodmagic/blockstates/bettercapacityrune.json 8a5edb859a6f4d0adfbe2f608bab6b8c8addf01a assets/bloodmagic/blockstates/blankrune.json @@ -20,6 +21,7 @@ e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritu af6eebbeef7c75844a0651065016fecb365595dd assets/bloodmagic/lang/en_us.json 34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json bcdbccc49d4509571be6988762ab87126275a4c8 assets/bloodmagic/models/block/airritualstone.json +adf6c0b1e25451609486dc8c8cfbd9cf0f8c67f4 assets/bloodmagic/models/block/alchemicalreactionchamber.json 3c98a88c2283ad54f0efb9d7194361bbc3e93c17 assets/bloodmagic/models/block/altarcapacityrune.json 7cd62092c6fb3109e016d42090cf89bfa3ab7fca assets/bloodmagic/models/block/bettercapacityrune.json 1fe0f89895addb7abcacf6ce7e39b6ddc87b0d85 assets/bloodmagic/models/block/blankrune.json @@ -44,6 +46,7 @@ a8a1d06fcc2f8395530c72d2846133fff37d5537 assets/bloodmagic/models/block/sacrific fe8e3deb3ad0107ca3ebd70694c1fc55a987d912 assets/bloodmagic/models/item/airritualstone.json 0bcf230493163a43357cbee7c26b8756089cb548 assets/bloodmagic/models/item/airscribetool.json 17cbe9142ef3950ea1b6be11694b849f55e93f13 assets/bloodmagic/models/item/airsigil.json +92cc51b70ce22796804d093e3fc21141658f85fd assets/bloodmagic/models/item/alchemicalreactionchamber.json f150f178edf7d6d250bcfd84af1c28a21cff09c6 assets/bloodmagic/models/item/altarcapacityrune.json 866b8cdd3da56e2e82dbd5f16ab5117b5a503749 assets/bloodmagic/models/item/apprenticebloodorb.json 719e38516b76596e177809508b4e2b28f05acfb0 assets/bloodmagic/models/item/arcaneashes.json @@ -148,6 +151,8 @@ e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bl 263f7c251d2f163db5bd229f2ab8a222f23ae03a data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json 7ca400d1141ff4be1b529cd060950b42cf3b9bfb data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json 344567e6f5671131addcfebbd92d18e5cbd66ef5 data/bloodmagic/advancements/recipes/bloodmagictab/lava_crystal.json +01e90bb9c59d44a52777ecc0cf28754295fda675 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json +836e1fc171dba197e02d6a9e3e61a3718cb5a482 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json c8e5cdac0e7328640ab1cb0eab0a46f0733b59b3 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_blank.json 1578416eb302aecb3fd61e481634c5c021541f51 data/bloodmagic/advancements/recipes/bloodmagictab/ritual_stone_master.json 832301a424345b7ca70b43cb214faa104179f0fb data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json @@ -155,6 +160,7 @@ c8e5cdac0e7328640ab1cb0eab0a46f0733b59b3 data/bloodmagic/advancements/recipes/bl 7a7f9f995d2414289d07c0a145647c8e735a6b78 data/bloodmagic/advancements/recipes/bloodmagictab/soul_snare.json 639ebb2ccabb2eaece59be96c2e6f28c31f4d2f4 data/bloodmagic/loot_tables/blocks/accelerationrune.json 26e3f34021426def32602e5ae7755e4672878320 data/bloodmagic/loot_tables/blocks/airritualstone.json +1ed1f3cebe68450b6d5ca3ce69e4728a7d250b1c data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json 443550be9eaf1021b11fd2bbe6afcfe2cee6f7ad data/bloodmagic/loot_tables/blocks/alchemyarray.json 17d8dcc62320d5d2eeb781e925963d9b9d5eec54 data/bloodmagic/loot_tables/blocks/altar.json 05bb6268d7e884c962061a632e162d5baf73271e data/bloodmagic/loot_tables/blocks/altarcapacityrune.json @@ -206,6 +212,8 @@ b63d77c3762f86d4a91f62e192c3e9b26e3b52ca data/bloodmagic/recipes/blood_rune_sacr 7c4e247c1df6ef594bbb2fc2196afb102f45982b data/bloodmagic/recipes/blood_rune_self_sacrifice.json e2bcf2a6f951fbcef45554ec90ba28d14e261d18 data/bloodmagic/recipes/blood_rune_speed.json 9dedad36e9d2ab6688e069c2e6df3851c395b583 data/bloodmagic/recipes/lava_crystal.json +bfd7925ad30534463d7daf0f7dce03cf1502cbcf data/bloodmagic/recipes/ritual_diviner_0.json +2ec436681cdd169bae99d090bb889c2a45420b6c data/bloodmagic/recipes/ritual_diviner_1.json 7757e5fd52f71b0d21595e072593fc592210dd64 data/bloodmagic/recipes/ritual_stone_blank.json 8608f828f997b1a8015287bd9cd436e9d7dff2ff data/bloodmagic/recipes/ritual_stone_master.json aefbf1fd258f1cda8d04db7e0794b9612993e6bf data/bloodmagic/recipes/sacrificial_dagger.json @@ -222,3 +230,4 @@ e517023dc3e32929344ff5415397fc833bfbc29a data/bloodmagic/recipes/soulforge/reage c0e75e0e12290d191245c5b0b5b13bc739d2ff44 data/bloodmagic/recipes/soulforge/reagent_void.json a222d09abf1ea61feb684f2ac23d011c2034f526 data/bloodmagic/recipes/soulforge/reagent_water.json 7e281841a2953c1284d332c2bbf75097f8128241 data/bloodmagic/recipes/soulforge/sentientsword.json +d7d993bb729284a5201c164ea81fbe1d8e4e4750 data/bloodmagic/recipes/weak_activation_crystal.json diff --git a/src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json b/src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json new file mode 100644 index 00000000..05658c8b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/alchemicalreactionchamber.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=north,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber" + }, + "facing=south,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 180 + }, + "facing=west,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 270 + }, + "facing=east,lit=false": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 90 + }, + "facing=north,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber" + }, + "facing=south,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 180 + }, + "facing=west,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 270 + }, + "facing=east,lit=true": { + "model": "bloodmagic:block/alchemicalreactionchamber", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json b/src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json new file mode 100644 index 00000000..84690dfc --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/alchemicalreactionchamber.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "side": "bloodmagic:block/arc_side", + "front": "bloodmagic:block/arc_front", + "bottom": "bloodmagic:block/arc_bottom", + "top": "bloodmagic:block/arc_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json b/src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json new file mode 100644 index 00000000..bb6ed1e2 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/alchemicalreactionchamber.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/alchemicalreactionchamber" +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json new file mode 100644 index 00000000..ac4dd373 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_0.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:ritual_diviner_0" + ] + }, + "criteria": { + "has_scribe": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:airscribetool" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:ritual_diviner_0" + } + } + }, + "requirements": [ + [ + "has_scribe", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json new file mode 100644 index 00000000..b671e3bd --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/ritual_diviner_1.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:ritual_diviner_1" + ] + }, + "criteria": { + "has_demon_slate": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:demonslate" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:ritual_diviner_1" + } + } + }, + "requirements": [ + [ + "has_demon_slate", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json new file mode 100644 index 00000000..e3d6ee73 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemicalreactionchamber.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:alchemicalreactionchamber" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json new file mode 100644 index 00000000..5806cf36 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_0.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "dfd", + "ase", + "dwd" + ], + "key": { + "a": { + "item": "bloodmagic:airscribetool" + }, + "s": { + "tag": "forge:rods/wooden" + }, + "d": { + "tag": "forge:gems/diamond" + }, + "e": { + "item": "bloodmagic:earthscribetool" + }, + "f": { + "item": "bloodmagic:firescribetool" + }, + "w": { + "item": "bloodmagic:waterscribetool" + } + }, + "result": { + "item": "bloodmagic:ritualdiviner" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json new file mode 100644 index 00000000..46a797ed --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/ritual_diviner_1.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "tdt", + " S " + ], + "key": { + "S": { + "item": "bloodmagic:demonslate" + }, + "t": { + "item": "bloodmagic:duskscribetool" + }, + "d": { + "item": "bloodmagic:ritualdiviner" + } + }, + "result": { + "item": "bloodmagic:ritualdivinerdusk" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json b/src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json new file mode 100644 index 00000000..ba19a174 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/weak_activation_crystal.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "bloodmagic:lavacrystal" + }, + "output": { + "item": "bloodmagic:activationcrystalweak" + }, + "upgradeLevel": 2, + "altarSyphon": 10000, + "consumptionRate": 20, + "drainRate": 10 +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 2fc39a67..4b3aa5ce 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -50,6 +50,7 @@ import wayoftime.bloodmagic.core.registry.OrbRegistry; import wayoftime.bloodmagic.network.BloodMagicPacketHandler; import wayoftime.bloodmagic.potion.BloodMagicPotions; import wayoftime.bloodmagic.ritual.RitualManager; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; import wayoftime.bloodmagic.tile.TileAlchemyArray; import wayoftime.bloodmagic.tile.TileAltar; import wayoftime.bloodmagic.tile.TileMasterRitualStone; @@ -151,6 +152,7 @@ public class BloodMagic event.getRegistry().register(TileEntityType.Builder.create(TileAlchemyArray::new, BloodMagicBlocks.ALCHEMY_ARRAY.get()).build(null).setRegistryName("alchemyarray")); event.getRegistry().register(TileEntityType.Builder.create(TileSoulForge::new, BloodMagicBlocks.SOUL_FORGE.get()).build(null).setRegistryName("soulforge")); event.getRegistry().register(TileEntityType.Builder.create(TileMasterRitualStone::new, BloodMagicBlocks.MASTER_RITUAL_STONE.get()).build(null).setRegistryName("masterritualstone")); + event.getRegistry().register(TileEntityType.Builder.create(TileAlchemicalReactionChamber::new, BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()).build(null).setRegistryName("alchemicalreactionchamber")); } @SubscribeEvent diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 0dcdcc12..6f8fccde 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -231,48 +231,6 @@ public class TileSoulForge extends TileInventory return ((double) burnTime) / ticksRequired; } -// private boolean canCraft(RecipeTartaricForge recipe) -// { -// if (recipe == null) -// return false; -// -// ItemStack currentOutputStack = getStackInSlot(outputSlot); -// if (recipe.getOutput().isEmpty()) -// return false; -// if (currentOutputStack.isEmpty()) -// return true; -// if (!currentOutputStack.isItemEqual(recipe.getOutput())) -// return false; -// int result = currentOutputStack.getCount() + recipe.getOutput().getCount(); -// return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); -// -// } -// -// public void craftItem(RecipeTartaricForge recipe) -// { -// if (this.canCraft(recipe)) -// { -// ItemStack currentOutputStack = getStackInSlot(outputSlot); -// -// List inputList = new ArrayList<>(); -// for (int i = 0; i < 4; i++) if (!getStackInSlot(i).isEmpty()) -// inputList.add(getStackInSlot(i).copy()); -// -// BloodMagicCraftedEvent.SoulForge event = new BloodMagicCraftedEvent.SoulForge(recipe.getOutput().copy(), inputList.toArray(new ItemStack[0])); -// MinecraftForge.EVENT_BUS.post(event); -// -// if (currentOutputStack.isEmpty()) -// { -// setInventorySlotContents(outputSlot, event.getOutput()); -// } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, event.getOutput())) -// { -// currentOutputStack.grow(event.getOutput().getCount()); -// } -// -// consumeInventory(); -// } -// } - public double getWill(EnumDemonWillType type) { ItemStack soulStack = getStackInSlot(soulSlot); diff --git a/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java index 8d3b6065..032df2a9 100644 --- a/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java +++ b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java @@ -16,6 +16,7 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.client.render.block.RenderAlchemyArray; import wayoftime.bloodmagic.client.render.block.RenderAltar; +import wayoftime.bloodmagic.client.screens.ScreenAlchemicalReactionChamber; import wayoftime.bloodmagic.client.screens.ScreenSoulForge; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; import wayoftime.bloodmagic.common.item.BloodMagicItems; @@ -39,6 +40,7 @@ public class ClientEvents public static void registerContainerScreens() { ScreenManager.registerFactory(BloodMagicBlocks.SOUL_FORGE_CONTAINER.get(), ScreenSoulForge::new); + ScreenManager.registerFactory(BloodMagicBlocks.ARC_CONTAINER.get(), ScreenAlchemicalReactionChamber::new); } public static void registerItemModelProperties(FMLClientSetupEvent event) diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java new file mode 100644 index 00000000..cc06b489 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemicalReactionChamber.java @@ -0,0 +1,84 @@ +package wayoftime.bloodmagic.client.screens; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; +import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; + +public class ScreenAlchemicalReactionChamber extends ScreenBase +{ + private static final ResourceLocation background = new ResourceLocation(BloodMagic.MODID, "textures/gui/arc_gui.png"); + public TileAlchemicalReactionChamber tileARC; + + public ScreenAlchemicalReactionChamber(ContainerAlchemicalReactionChamber container, PlayerInventory playerInventory, ITextComponent title) + { + super(container, playerInventory, title); + tileARC = container.tileARC; + this.xSize = 176; + this.ySize = 205; + } + + @Override + public ResourceLocation getBackground() + { + return background; + } + +// public + +// public ScreenSoulForge(InventoryPlayer playerInventory, IInventory tileSoulForge) +// { +// super(new ContainerSoulForge(playerInventory, tileSoulForge)); +// this.tileSoulForge = tileSoulForge; +// this.xSize = 176; +// this.ySize = 205; +// } +// +// @Override +// public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks) +// { +// this.drawDefaultBackground(); +// super.drawScreen(mouseX, mouseY, partialTicks); +// this.renderHoveredToolTip(mouseX, mouseY); +// } +// + @Override + protected void drawGuiContainerForegroundLayer(MatrixStack stack, int mouseX, int mouseY) + { + this.font.func_243248_b(stack, new TranslationTextComponent("tile.bloodmagic.arc.name"), 8, 5, 4210752); + this.font.func_243248_b(stack, new TranslationTextComponent("container.inventory"), 8, 111, 4210752); + } + +// + @Override + protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialTicks, int mouseX, int mouseY) + { + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + getMinecraft().getTextureManager().bindTexture(background); + int i = (this.width - this.xSize) / 2; + int j = (this.height - this.ySize) / 2; + this.blit(stack, i, j, 0, 0, this.xSize, this.ySize); + +// int l = this.getCookProgressScaled(90); +// this.blit(stack, i + 115, j + 14 + 90 - l, 176, 90 - l, 18, l); + } + +//// +// public int getCookProgressScaled(int scale) +// { +// double progress = ((TileSoulForge) tileSoulForge).getProgressForGui(); +//// if (tileSoulForge != null) +//// { +//// System.out.println("Tile is NOT null"); +//// } +//// double progress = ((float) this.container.data.get(0)) / ((float) this.container.data.get(1)); +//// System.out.println(this.container.data.get(0)); +// return (int) (progress * scale); +// } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemicalReactionChamber.java new file mode 100644 index 00000000..da151b5c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemicalReactionChamber.java @@ -0,0 +1,162 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.AbstractFurnaceTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.fml.network.NetworkHooks; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; + +public class BlockAlchemicalReactionChamber extends Block +{ + public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + public static final BooleanProperty LIT = BlockStateProperties.LIT; + + public BlockAlchemicalReactionChamber() + { + super(Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(2).sound(SoundType.STONE)); + this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH).with(LIT, Boolean.valueOf(false))); + } + + @Override + public boolean hasTileEntity(BlockState state) + { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) + { + return new TileAlchemicalReactionChamber(); + } + + @Override + public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) + { + TileAlchemicalReactionChamber arc = (TileAlchemicalReactionChamber) world.getTileEntity(blockPos); + if (arc != null) + arc.dropItems(); + + super.onPlayerDestroy(world, blockPos, blockState); + } + + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) + { + if (!state.isIn(newState.getBlock())) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + if (tileentity instanceof TileAlchemicalReactionChamber) + { + ((TileAlchemicalReactionChamber) tileentity).dropItems(); + worldIn.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } + + @Override + public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) + { + if (world.isRemote) + return ActionResultType.SUCCESS; + + TileEntity tile = world.getTileEntity(pos); + if (!(tile instanceof TileAlchemicalReactionChamber)) + return ActionResultType.FAIL; + + NetworkHooks.openGui((ServerPlayerEntity) player, (INamedContainerProvider) tile, pos); +// player.openGui(BloodMagic.instance, Constants.Gui.SOUL_FORGE_GUI, world, pos.getX(), pos.getY(), pos.getZ()); + + return ActionResultType.SUCCESS; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) + { + return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + /** + * Called by ItemBlocks after a block is set in the world, to allow post-place + * logic + */ + @Override + public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) + { + if (stack.hasDisplayName()) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + if (tileentity instanceof AbstractFurnaceTileEntity) + { + ((AbstractFurnaceTileEntity) tileentity).setCustomName(stack.getDisplayName()); + } + } + + } + + /** + * Returns the blockstate with the given rotation from the passed blockstate. If + * inapplicable, returns the passed blockstate. + * + * @deprecated call via {@link IBlockState#withRotation(Rotation)} whenever + * possible. Implementing/overriding is fine. + */ + @Override + public BlockState rotate(BlockState state, Rotation rot) + { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + /** + * Returns the blockstate with the given mirror of the passed blockstate. If + * inapplicable, returns the passed blockstate. + * + * @deprecated call via {@link IBlockState#withMirror(Mirror)} whenever + * possible. Implementing/overriding is fine. + */ + @Override + public BlockState mirror(BlockState state, Mirror mirrorIn) + { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) + { + builder.add(FACING, LIT); + } + + public boolean eventReceived(BlockState state, World worldIn, BlockPos pos, int id, int param) + { + super.eventReceived(state, worldIn, pos, id, param); + TileEntity tileentity = worldIn.getTileEntity(pos); + return tileentity == null ? false : tileentity.receiveClientEvent(id, param); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java index 27f7b461..dba36a9a 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java @@ -15,6 +15,7 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraftforge.common.ToolType; import net.minecraftforge.fml.network.NetworkHooks; @@ -27,13 +28,6 @@ public class BlockSoulForge extends Block// implements IBMBlock public BlockSoulForge() { super(Properties.create(Material.IRON).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(1)); - -// setTranslationKey(BloodMagic.MODID + ".soulForge"); -// setHardness(2.0F); -// setResistance(5.0F); -// setSoundType(SoundType.METAL); -// setHarvestLevel("pickaxe", 1); -// setCreativeTab(BloodMagic.TAB_BM); } @Override @@ -76,20 +70,29 @@ public class BlockSoulForge extends Block// implements IBMBlock return ActionResultType.SUCCESS; } -// @Override -// public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) -// { -// TileSoulForge tileSoulForge = (TileSoulForge) world.getTileEntity(blockPos); -// if (tileSoulForge != null) -// tileSoulForge.dropItems(); -// -// super.breakBlock(world, blockPos, blockState); -// } + @Override + public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) + { + TileSoulForge forge = (TileSoulForge) world.getTileEntity(blockPos); + if (forge != null) + forge.dropItems(); -// -// @Override -// public BlockItem getItem() -// { -// return new BlockItem(this); -// } + super.onPlayerDestroy(world, blockPos, blockState); + } + + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) + { + if (!state.isIn(newState.getBlock())) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + if (tileentity instanceof TileSoulForge) + { + ((TileSoulForge) tileentity).dropItems(); + worldIn.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java index 48e0dc40..af778e7d 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java @@ -19,6 +19,7 @@ import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.block.enums.BloodRuneType; import wayoftime.bloodmagic.common.item.BloodMagicItems; import wayoftime.bloodmagic.ritual.EnumRuneType; +import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; import wayoftime.bloodmagic.tile.contailer.ContainerSoulForge; public class BloodMagicBlocks @@ -59,6 +60,8 @@ public class BloodMagicBlocks public static final RegistryObject MASTER_RITUAL_STONE = BASICBLOCKS.register("masterritualstone", () -> new BlockMasterRitualStone(false)); + public static final RegistryObject ALCHEMICAL_REACTION_CHAMBER = BLOCKS.register("alchemicalreactionchamber", () -> new BlockAlchemicalReactionChamber()); + private static ForgeFlowingFluid.Properties makeProperties() { return new ForgeFlowingFluid.Properties(LIFE_ESSENCE_FLUID, LIFE_ESSENCE_FLUID_FLOWING, FluidAttributes.builder(FLUID_STILL, FLUID_FLOWING)).bucket(LIFE_ESSENCE_BUCKET).block(LIFE_ESSENCE_BLOCK); @@ -71,6 +74,7 @@ public class BloodMagicBlocks public static RegistryObject LIFE_ESSENCE_BUCKET = ITEMS.register("life_essence_bucket", () -> new BucketItem(LIFE_ESSENCE_FLUID, new Item.Properties().containerItem(Items.BUCKET).maxStackSize(1).group(BloodMagic.TAB))); public static final RegistryObject> SOUL_FORGE_CONTAINER = CONTAINERS.register("soul_forge_container", () -> IForgeContainerType.create(ContainerSoulForge::new)); + public static final RegistryObject> ARC_CONTAINER = CONTAINERS.register("arc_container", () -> IForgeContainerType.create(ContainerAlchemicalReactionChamber::new)); // public static final RegistryObject BLOOD_STONE = registerNoItem("blood_stone", () -> new BloodstoneBlock()); // //// private static RegistryObject register(String name, Supplier sup, Function, Supplier> itemCreator) diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java index d2f11e9d..346be435 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java @@ -34,7 +34,7 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.BLOOD_ALTAR.get()).key('a', Tags.Items.STONE).key('b', Items.FURNACE).key('c', Tags.Items.INGOTS_GOLD).key('d', BloodMagicItems.MONSTER_SOUL_RAW.get()).patternLine("a a").patternLine("aba").patternLine("cdc").addCriterion("has_will", hasItem(BloodMagicItems.MONSTER_SOUL_RAW.get())).build(consumer, BloodMagic.rl("blood_altar")); ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SOUL_FORGE.get()).key('s', Tags.Items.STONE).key('g', Tags.Items.INGOTS_GOLD).key('i', Tags.Items.INGOTS_IRON).key('o', Tags.Items.STORAGE_BLOCKS_IRON).patternLine("i i").patternLine("sgs").patternLine("sos").addCriterion("has_gold", hasItem(Items.GOLD_INGOT)).build(consumer, BloodMagic.rl("soul_forge")); ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.SOUL_SNARE.get(), 4).key('r', Tags.Items.DUSTS_REDSTONE).key('s', Tags.Items.STRING).key('i', Tags.Items.INGOTS_IRON).patternLine("sis").patternLine("iri").patternLine("sis").addCriterion("has_redstone", hasItem(Items.REDSTONE)).build(consumer, BloodMagic.rl("soul_snare")); - ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.BASE_RITUAL_DIVINER.get()).key('a', BloodMagicItems.AIR_INSCRIPTION_TOOL.get()).key('s', Tags.Items.RODS_WOODEN).key('d', Tags.Items.GEMS_DIAMOND).key('e', BloodMagicItems.EARTH_INSCRIPTION_TOOL.get()).key('f', BloodMagicItems.FIRE_INSCRIPTION_TOOL.get()).key('w', BloodMagicItems.WATER_INSCRIPTION_TOOL.get()).addCriterion("has_scribe", hasItem(BloodMagicItems.AIR_INSCRIPTION_TOOL.get())).build(consumer, BloodMagic.rl("ritual_diviner_0")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.BASE_RITUAL_DIVINER.get()).key('a', BloodMagicItems.AIR_INSCRIPTION_TOOL.get()).key('s', Tags.Items.RODS_WOODEN).key('d', Tags.Items.GEMS_DIAMOND).key('e', BloodMagicItems.EARTH_INSCRIPTION_TOOL.get()).key('f', BloodMagicItems.FIRE_INSCRIPTION_TOOL.get()).key('w', BloodMagicItems.WATER_INSCRIPTION_TOOL.get()).patternLine("dfd").patternLine("ase").patternLine("dwd").addCriterion("has_scribe", hasItem(BloodMagicItems.AIR_INSCRIPTION_TOOL.get())).build(consumer, BloodMagic.rl("ritual_diviner_0")); ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.DUSK_RITUAL_DIVINER.get()).key('S', BloodMagicItems.DEMONIC_SLATE.get()).key('t', BloodMagicItems.DUSK_INSCRIPTION_TOOL.get()).key('d', BloodMagicItems.BASE_RITUAL_DIVINER.get()).patternLine(" S ").patternLine("tdt").patternLine(" S ").addCriterion("has_demon_slate", hasItem(BloodMagicItems.DEMONIC_SLATE.get())).build(consumer, BloodMagic.rl("ritual_diviner_1")); } diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java index 04b013f1..38288795 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java @@ -2,11 +2,15 @@ package wayoftime.bloodmagic.common.data; import net.minecraft.block.Block; import net.minecraft.data.DataGenerator; +import net.minecraft.util.Direction; import net.minecraftforge.client.model.generators.BlockStateProvider; import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.VariantBlockStateBuilder; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.fml.RegistryObject; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BlockAlchemicalReactionChamber; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; public class GeneratorBlockStates extends BlockStateProvider @@ -35,6 +39,8 @@ public class GeneratorBlockStates extends BlockStateProvider buildCubeAll(BloodMagicBlocks.EARTH_RITUAL_STONE.get()); buildCubeAll(BloodMagicBlocks.DUSK_RITUAL_STONE.get()); buildCubeAll(BloodMagicBlocks.DAWN_RITUAL_STONE.get()); + + buildFurnace(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()); } private void buildCubeAll(Block block) @@ -42,4 +48,23 @@ public class GeneratorBlockStates extends BlockStateProvider getVariantBuilder(block).forAllStates(state -> ConfiguredModel.builder().modelFile(cubeAll(block)).build()); } + private void buildFurnace(Block block) + { +// ConfiguredModel[] furnaceModel = ConfiguredModel.builder().modelFile().build(); + ModelFile furnace_off = models().orientableWithBottom("alchemicalreactionchamber", BloodMagic.rl("block/arc_side"), BloodMagic.rl("block/arc_front"), BloodMagic.rl("block/arc_bottom"), BloodMagic.rl("block/arc_top")); +// getVariantBuilder(block).addModels(block.getDefaultState().with(BlockAlchemicalReactionChamber.FACING, Direction.NORTH).with(BlockAlchemicalReactionChamber.LIT, false), furnaceModel); + + VariantBlockStateBuilder builder = getVariantBuilder(block); + + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.NORTH).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.EAST).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).rotationY(90).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.SOUTH).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).rotationY(180).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.WEST).with(BlockAlchemicalReactionChamber.LIT, false).modelForState().modelFile(furnace_off).rotationY(270).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.NORTH).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.EAST).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).rotationY(90).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.SOUTH).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).rotationY(180).addModel(); + builder.partialState().with(BlockAlchemicalReactionChamber.FACING, Direction.WEST).with(BlockAlchemicalReactionChamber.LIT, true).modelForState().modelFile(furnace_off).rotationY(270).addModel(); + +// getVariantBuilder(block). + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java index 77739743..35edebf5 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java @@ -43,6 +43,7 @@ public class GeneratorItemModels extends ItemModelProvider registerBlockModel(BloodMagicBlocks.EARTH_RITUAL_STONE.get()); registerBlockModel(BloodMagicBlocks.DUSK_RITUAL_STONE.get()); registerBlockModel(BloodMagicBlocks.DAWN_RITUAL_STONE.get()); + registerBlockModel(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()); registerToggleableItem(BloodMagicItems.GREEN_GROVE_SIGIL.get()); registerToggleableItem(BloodMagicItems.FAST_MINER_SIGIL.get()); diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java index 4115ea9a..5315c433 100644 --- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java @@ -60,6 +60,7 @@ public class GeneratorLootTable extends LootTableProvider registerDropping(BloodMagicBlocks.EARTH_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); registerDropping(BloodMagicBlocks.DUSK_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); registerDropping(BloodMagicBlocks.DAWN_RITUAL_STONE.get(), BloodMagicBlocks.BLANK_RITUAL_STONE.get()); + registerDropSelfLootTable(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()); } private void registerNoDropLootTable(Block block) diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java index 30ae733e..cd5a0ad0 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -62,6 +62,7 @@ public class BloodMagicItems public static final RegistryObject EARTH_RITUAL_STONE_ITEM = ITEMS.register("earthritualstone", () -> new BlockItem(BloodMagicBlocks.EARTH_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject DUSK_RITUAL_STONE_ITEM = ITEMS.register("duskritualstone", () -> new BlockItem(BloodMagicBlocks.DUSK_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject DAWN_RITUAL_STONE_ITEM = ITEMS.register("lightritualstone", () -> new BlockItem(BloodMagicBlocks.DAWN_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject ALCHEMICAL_REACTION_CHAMBER_ITEM = ITEMS.register("alchemicalreactionchamber", () -> new BlockItem(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get(), new Item.Properties().group(BloodMagic.TAB))); public static final RegistryObject MASTER_RITUAL_STONE_ITEM = ITEMS.register("masterritualstone", () -> new BlockItem(BloodMagicBlocks.MASTER_RITUAL_STONE.get(), new Item.Properties().group(BloodMagic.TAB))); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java b/src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java new file mode 100644 index 00000000..11112588 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/IARCTool.java @@ -0,0 +1,6 @@ +package wayoftime.bloodmagic.common.item; + +public interface IARCTool +{ + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java index 53224f84..4a9319e9 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java @@ -5,7 +5,6 @@ import javax.annotation.Nullable; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BucketItem; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -54,10 +53,8 @@ public abstract class ItemSigilFluidBase extends ItemSigilBase { BlockState state = world.getBlockState(blockPos); Block block = state.getBlock(); - BucketItem b; - System.out.println(block); + IFluidHandler targetFluidHandler = FluidUtil.getFluidHandler(world, blockPos, side).orElse(null); - System.out.println(targetFluidHandler); if (targetFluidHandler == null) diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java new file mode 100644 index 00000000..06be3d0e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java @@ -0,0 +1,129 @@ +package wayoftime.bloodmagic.tile; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.registries.ObjectHolder; +import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber; +import wayoftime.bloodmagic.util.Constants; + +public class TileAlchemicalReactionChamber extends TileInventory implements ITickableTileEntity, INamedContainerProvider +{ + @ObjectHolder("bloodmagic:alchemicalreactionchamber") + public static TileEntityType TYPE; + + public static final int ARC_TOOL_SLOT = 0; + public static final int OUTPUT_SLOT = 1; + public static final int NUM_OUTPUTS = 5; + public static final int INPUT_SLOT = 6; + public static final int INPUT_BUCKET_SLOT = 7; + public static final int OUTPUT_BUCKET_SLOT = 8; + + public FluidTank inputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 2); + public FluidTank outputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 2); + +// Input slots are from 0 to 3. + + public int burnTime = 0; + + public TileAlchemicalReactionChamber(TileEntityType type) + { + super(type, 9, "alchemicalreactionchamber"); + } + + public TileAlchemicalReactionChamber() + { + this(TYPE); + } + + @Override + public void deserialize(CompoundNBT tag) + { + super.deserialize(tag); + + burnTime = tag.getInt(Constants.NBT.SOUL_FORGE_BURN); + } + + @Override + public CompoundNBT serialize(CompoundNBT tag) + { + super.serialize(tag); + + tag.putInt(Constants.NBT.SOUL_FORGE_BURN, burnTime); + return tag; + } + + @Override + public void tick() + { + + } + +// private boolean canCraft(RecipeTartaricForge recipe) +// { +// if (recipe == null) +// return false; +// +// ItemStack currentOutputStack = getStackInSlot(outputSlot); +// if (recipe.getOutput().isEmpty()) +// return false; +// if (currentOutputStack.isEmpty()) +// return true; +// if (!currentOutputStack.isItemEqual(recipe.getOutput())) +// return false; +// int result = currentOutputStack.getCount() + recipe.getOutput().getCount(); +// return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); +// +// } +// +// public void craftItem(RecipeTartaricForge recipe) +// { +// if (this.canCraft(recipe)) +// { +// ItemStack currentOutputStack = getStackInSlot(outputSlot); +// +// List inputList = new ArrayList<>(); +// for (int i = 0; i < 4; i++) if (!getStackInSlot(i).isEmpty()) +// inputList.add(getStackInSlot(i).copy()); +// +// BloodMagicCraftedEvent.SoulForge event = new BloodMagicCraftedEvent.SoulForge(recipe.getOutput().copy(), inputList.toArray(new ItemStack[0])); +// MinecraftForge.EVENT_BUS.post(event); +// +// if (currentOutputStack.isEmpty()) +// { +// setInventorySlotContents(outputSlot, event.getOutput()); +// } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, event.getOutput())) +// { +// currentOutputStack.grow(event.getOutput().getCount()); +// } +// +// consumeInventory(); +// } +// } + + @Override + public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) + { + assert world != null; + return new ContainerAlchemicalReactionChamber(this, p_createMenu_1_, p_createMenu_2_); + } + + @Override + public ITextComponent getDisplayName() + { + return new StringTextComponent("Alchemical Reaction Chamber"); + } + + public double getProgressForGui() + { + return 0; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java new file mode 100644 index 00000000..8b600788 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerAlchemicalReactionChamber.java @@ -0,0 +1,198 @@ +package wayoftime.bloodmagic.tile.contailer; + +import java.util.Optional; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.IARCTool; +import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber; + +public class ContainerAlchemicalReactionChamber extends Container +{ + public final TileAlchemicalReactionChamber tileARC; + +// public ContainerSoulForge(InventoryPlayer inventoryPlayer, IInventory tileARC) +// { +// this.tileARC = tileARC; +// +// } + + public ContainerAlchemicalReactionChamber(int windowId, PlayerInventory playerInventory, PacketBuffer extraData) + { + this((TileAlchemicalReactionChamber) playerInventory.player.world.getTileEntity(extraData.readBlockPos()), windowId, playerInventory); + } + + public ContainerAlchemicalReactionChamber(@Nullable TileAlchemicalReactionChamber tile, int windowId, PlayerInventory playerInventory) + { + super(BloodMagicBlocks.ARC_CONTAINER.get(), windowId); + this.tileARC = tile; + this.setup(playerInventory, tile); + } + + public void setup(PlayerInventory inventory, IInventory tileARC) + { + this.addSlot(new SlotARCTool(tileARC, TileAlchemicalReactionChamber.ARC_TOOL_SLOT, 35, 51)); + for (int i = 0; i < TileAlchemicalReactionChamber.NUM_OUTPUTS; i++) + { + this.addSlot(new SlotOutput(tileARC, TileAlchemicalReactionChamber.OUTPUT_SLOT + i, 116, 15 + i * 18)); + } + this.addSlot(new Slot(tileARC, TileAlchemicalReactionChamber.INPUT_SLOT, 71, 15)); + this.addSlot(new SlotBucket(tileARC, TileAlchemicalReactionChamber.INPUT_BUCKET_SLOT, 8, 15, true)); + this.addSlot(new SlotBucket(tileARC, TileAlchemicalReactionChamber.OUTPUT_BUCKET_SLOT, 152, 87, false)); + +// this.addSlot(new SlotSoul(tileARC, TileSoulForge.soulSlot, 152, 51)); + + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 9; j++) + { + addSlot(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 123 + i * 18)); + } + } + + for (int i = 0; i < 9; i++) + { + addSlot(new Slot(inventory, i, 8 + i * 18, 181)); + } + } + + @Override + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) + { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.inventorySlots.get(index); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if ((index >= 1 && index < 1 + 5) || (index == 7 || index == 8))// Attempting to transfer from output slots + // or bucket slots + { + if (!this.mergeItemStack(itemstack1, 9, 9 + 36, true)) + { + return ItemStack.EMPTY; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (index > 9) // Attempting to transfer from main inventory + { + if (itemstack1.getItem() instanceof IARCTool) // Try the tool slot first + { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) + { + return ItemStack.EMPTY; + } + } else if (isBucket(itemstack1, true)) // If it's a full bucket, transfer to tank filler slot. + { + if (!this.mergeItemStack(itemstack1, 7, 8, false)) + { + return ItemStack.EMPTY; + } + } else if (isBucket(itemstack1, false)) // If it's an empty bucket, transfer to tank emptier slot. + { + if (!this.mergeItemStack(itemstack1, 8, 9, false)) + { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(itemstack1, 6, 7, false)) + { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(itemstack1, 9, 45, false)) // Attempting to transfer from input slots + { + return ItemStack.EMPTY; + } + + if (itemstack1.getCount() == 0) + { + slot.putStack(ItemStack.EMPTY); + } else + { + slot.onSlotChanged(); + } + + if (itemstack1.getCount() == itemstack.getCount()) + { + return ItemStack.EMPTY; + } + + slot.onTake(playerIn, itemstack1); + } + + return itemstack; + } + + @Override + public boolean canInteractWith(PlayerEntity playerIn) + { + return this.tileARC.isUsableByPlayer(playerIn); + } + + private class SlotARCTool extends Slot + { + public SlotARCTool(IInventory inventory, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + } + + @Override + public boolean isItemValid(ItemStack itemStack) + { + return itemStack.getItem() instanceof IARCTool; + } + } + + private class SlotBucket extends Slot + { + private final boolean needsFullBucket; + + public SlotBucket(IInventory inventory, int slotIndex, int x, int y, boolean needsFullBucket) + { + super(inventory, slotIndex, x, y); + this.needsFullBucket = needsFullBucket; + } + + @Override + public boolean isItemValid(ItemStack itemStack) + { + Optional fluidStackOptional = FluidUtil.getFluidContained(itemStack); + + return fluidStackOptional.isPresent() && ((needsFullBucket && !fluidStackOptional.get().isEmpty()) + || (!needsFullBucket && fluidStackOptional.get().isEmpty())); + } + } + + private static boolean isBucket(ItemStack stack, boolean requiredFull) + { + Optional fluidStackOptional = FluidUtil.getFluidContained(stack); + + return fluidStackOptional.isPresent() && ((requiredFull && !fluidStackOptional.get().isEmpty()) + || (!requiredFull && fluidStackOptional.get().isEmpty())); + } + + private class SlotOutput extends Slot + { + public SlotOutput(IInventory inventory, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + } + + @Override + public boolean isItemValid(ItemStack stack) + { + return false; + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/textures/block/arc_bottom.png b/src/main/resources/assets/bloodmagic/textures/block/arc_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab0e1201fad97abad7c98afb7a6a959f242eb38 GIT binary patch literal 915 zcmV;E18n?>P)EX>4Tx04R}tkv&MmKpe$iQ$;D23U*L&$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0Yam~RI_UWP&La) z#baVNw<`9$B7h-;5kkMjOg)ia%)oPe-NVP%yC~1{KKJM7Q}QMQd?N82(+!JwgLr1s z(mC%FhgnHdh|h_~4Z0xlBiCh@-#8Z?7I5bWxZD8-pLEHP9LY~pC=`JAGy0|+FmMY5*4*A&`#607GSt=b4RCM> zj1?(+-Q(T8oxS~grq$mMVS;j?z&5&G00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00C=BL_t(I%T-fJlEW|vY!=z7-13h6|6@5MQ6wM-4~(sg zsw|pb!1Q=LqP2#Iz!(F)cg#6KM2HAP1X^ogX3ROk%m4sp#^>{a&N*?v-$6tmBA6M7 z2zi(p5dn9vd*64sJIoB+d#|o*EdW47)HgG$Vj{w}ZCGnnGftWAj`KO&U}kLF1|ljY z5dk6sn;8H=L@w+if`}*;2><|9g^0k+pa~+P3kX0dNLCTSS_>jlc2q#&{yor80Cj4?n&P}TCCbrAtoJ*Hr0m3|hUGs*W~P^&Lc2pxckK_ z=f=5v$r@vnB6mk?4enk9s`~%0wAP@i=)L3hdez)TqzV&6MA-NJvat#P&*!t|{C>aD pdxx1_WREd$yWKFxs3za<7eA3sKmqZ1tQ-IU002ovPDHLkV1mU`iJ$-g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/block/arc_front.png b/src/main/resources/assets/bloodmagic/textures/block/arc_front.png new file mode 100644 index 0000000000000000000000000000000000000000..7b6cffb4fdcd94907b07ea654d09b7986d97adea GIT binary patch literal 1283 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 literal 0 HcmV?d00001