Finalized ARC

Finished 99% of the implementation work for the ARC and recipe system. Still need to populate the recipes (which will require textures for some items have have yet to be added).
This commit is contained in:
WayofTime 2020-10-30 16:41:41 -04:00
parent 9fa68e86ae
commit 1ead4ff820
56 changed files with 945 additions and 129 deletions

View file

@ -18,7 +18,7 @@ e1a98bd53fca155e4bbb03c1e548341af0f84bd7 assets/bloodmagic/blockstates/masterrit
b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json
487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json
e6d9cf699667aaa47efff37b2b033895dee29c15 assets/bloodmagic/blockstates/waterritualstone.json
fb7a615c3c1cf62b3a9c4a3ef701d22e7b45108c assets/bloodmagic/lang/en_us.json
d3520bf2873b775b43323d9c68e4a305a6d92c3a 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
@ -71,6 +71,7 @@ f4531e22aa1db1cff324db5ccb344d3b9fa85c8d assets/bloodmagic/models/item/divinatio
4c39378f6c14dc243a7d52564e5a21df94683415 assets/bloodmagic/models/item/etherealslate.json
c36bde4f98c0aeb3bf0f369ad3bc067e5f0dc916 assets/bloodmagic/models/item/fireritualstone.json
b5708a8cc7259fd36ffeabd155ea085b9fdef0fd assets/bloodmagic/models/item/firescribetool.json
537a52d7b59dc996ea23f24d86a4add87c61c6a0 assets/bloodmagic/models/item/furnacecell_primitive.json
44663089f348642bcca1c5020b5081c3ab172f92 assets/bloodmagic/models/item/growthsigil.json
f68825f667ca73b4373fd5068a47f0d1ca9b2aad assets/bloodmagic/models/item/icesigil.json
109b5485c25d978af55b46682d5bfa7008909458 assets/bloodmagic/models/item/infusedslate.json
@ -96,6 +97,7 @@ fd1447d943ddc4540a51a72dcbb245d77d45da71 assets/bloodmagic/models/item/reagentwa
2722891c9c40b124d85bf9ff8eb885e175f5e6ff assets/bloodmagic/models/item/ritualstone.json
db73abb3bcb1731b6fc389e3577910b6aab87b10 assets/bloodmagic/models/item/sacrificerune.json
9403d6195d4d38d5876c2a42f4edfb9bdcd05210 assets/bloodmagic/models/item/sacrificialdagger.json
b8582a5cd6ca35279e9b35931f1c5ca089b094b8 assets/bloodmagic/models/item/sanguinereverter.json
cc71421e98ee7ee047a4cfbb6cb69529c2b02d4e assets/bloodmagic/models/item/selfsacrificerune.json
ea5747638d0b5dcc03f008b202cc60a11e0827bb assets/bloodmagic/models/item/sigilofmagnetism.json
9ec68a2dcf04b987c3c5d5c6c52195e3deccacbb assets/bloodmagic/models/item/soulgemcommon.json
@ -142,6 +144,7 @@ a31019db55828cb937a071ac2f74b125a2d0c955 assets/bloodmagic/models/item/waterritu
4130e8907fe8fcf0a5de805f9c2b7ba9166323e9 assets/bloodmagic/models/item/waterscribetool.json
7426fed5f833ce3d08602f727f1467dd3e107991 assets/bloodmagic/models/item/watersigil.json
f72efc172699d43405019add97f455bd6b7f452b assets/bloodmagic/models/item/weakbloodorb.json
1efacee8dc0c3114567509ad247800cff59cb455 assets/bloodmagic/models/item/weakbloodshard.json
828c0f89e747d48d37c6a86030a8ec59ca5c29cb data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json
f8b66411c96c6a7a409fb10f6888d078f1f8fa14 data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_blank.json
ab5612f33028487c08e51de4b91bb786df1b1b95 data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_capacity.json
@ -151,6 +154,7 @@ 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
091fbd276c5ad173716e9e7474fa278e742a662f data/bloodmagic/advancements/recipes/bloodmagictab/primitive_furnace_cell.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
@ -194,8 +198,7 @@ d79a96eb3eed597f1c18a8983764a6362a24748c data/bloodmagic/recipes/altar/dusk_tool
584d01dff4d64bb88bd3783751a29723700f1728 data/bloodmagic/recipes/altar/slate.json
926d4a0e165c87a15a609744d832d2f5f04a40d0 data/bloodmagic/recipes/altar/water_tool.json
7551501cf361667ec7454c307b9d2368536fbed6 data/bloodmagic/recipes/altar/weakbloodorb.json
4f511cfb93faf65aa50fabd7e753e0759ed95a1c data/bloodmagic/recipes/arc/test1.json
5e735ea45bb2a49b43803c53a586ecbd5f3cbfe1 data/bloodmagic/recipes/arc/test2.json
352ba51f1c988029059e5b53a3a11432d0591b58 data/bloodmagic/recipes/arc/weakbloodshard.json
e1285ec51100f2336c1ea1a1a3057e74a0dd84d1 data/bloodmagic/recipes/array/airsigil.json
d1ac23080f72f21adb5908befefe965ffb4efd4f data/bloodmagic/recipes/array/bloodlightsigil.json
1890706e5b93cd6df764b0419483c348e0d7f277 data/bloodmagic/recipes/array/divinationsigil.json
@ -214,6 +217,7 @@ 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
0b1a11f0e1b6bc317e2dbf04560a81581623f41e data/bloodmagic/recipes/primitive_furnace_cell.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
@ -232,6 +236,10 @@ ae3a6a760e9f793d5a62e2f0f6c45219b0017816 data/bloodmagic/recipes/soulforge/reage
e517023dc3e32929344ff5415397fc833bfbc29a data/bloodmagic/recipes/soulforge/reagent_magnetism.json
c0e75e0e12290d191245c5b0b5b13bc739d2ff44 data/bloodmagic/recipes/soulforge/reagent_void.json
a222d09abf1ea61feb684f2ac23d011c2034f526 data/bloodmagic/recipes/soulforge/reagent_water.json
4a4340f334c51beaacb77fd201298ad94b71e79c data/bloodmagic/recipes/soulforge/sanguine_reverter.json
7e281841a2953c1284d332c2bbf75097f8128241 data/bloodmagic/recipes/soulforge/sentientsword.json
d7d993bb729284a5201c164ea81fbe1d8e4e4750 data/bloodmagic/recipes/weak_activation_crystal.json
94ff722e094a3479433cad0e4a1386f68f170e7b data/bloodmagic/tags/items/arc_tool.json
fdead91c0aa241e991f797de38f0b56d6ef3916a data/bloodmagic/tags/items/arc_tool.json
80636d8b3770da483ba6cd41870ecb0ad042f2f0 data/bloodmagic/tags/items/arc_tool_furnace.json
65326040c8974fcfcc8711d29040b4297ff55ec1 data/bloodmagic/tags/items/arc_tool_reverter.json
14fb88c612622be110e273818eee9512cd285d56 data/bloodmagic/tags/items/arc_tool_sieve.json

View file

@ -48,6 +48,7 @@
"item.bloodmagic.earthscribetool": "Inscription Tool: Earth",
"item.bloodmagic.etherealslate": "Ethereal Slate",
"item.bloodmagic.firescribetool": "Inscription Tool: Fire",
"item.bloodmagic.furnacecell_primitive": "Primitive Fuel Cell",
"item.bloodmagic.growthsigil": "Sigil of the Green Grove",
"item.bloodmagic.icesigil": "Sigil of the Frozen Lake",
"item.bloodmagic.infusedslate": "Imbued Slate",
@ -69,6 +70,7 @@
"item.bloodmagic.ritualdiviner": "Ritual Diviner",
"item.bloodmagic.ritualdivinerdusk": "Ritual Diviner [Dusk]",
"item.bloodmagic.sacrificialdagger": "Sacrificial Knife",
"item.bloodmagic.sanguinereverter": "Sanguine Reverter",
"item.bloodmagic.sigilofmagnetism": "Sigil of Magnetism",
"item.bloodmagic.soulgemcommon": "Common Tartaric Gem",
"item.bloodmagic.soulgemlesser": "Lesser Tartaric Gem",
@ -79,6 +81,7 @@
"item.bloodmagic.waterscribetool": "Inscription Tool: Water",
"item.bloodmagic.watersigil": "Water Sigil",
"item.bloodmagic.weakbloodorb": "Weak Blood Orb",
"item.bloodmagic.weakbloodshard": "Weak Blood Shard",
"itemGroup.bloodmagic.creativeTab": "Blood Magic",
"itemGroup.bloodmagictab": "Blood Magic",
"jei.bloodmagic.recipe.alchemyarraycrafting": "Alchemy Array",

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/furnacecell_primitive"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/sanguinereverter"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "bloodmagic:item/weakbloodshard"
}
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"bloodmagic:primitive_furnace_cell"
]
},
"criteria": {
"has_magician_orb": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "bloodmagic:magicianbloodorb"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "bloodmagic:primitive_furnace_cell"
}
}
},
"requirements": [
[
"has_magician_orb",
"has_the_recipe"
]
]
}

View file

@ -1,20 +0,0 @@
{
"type": "bloodmagic:arc",
"input": {
"tag": "forge:gems/diamond"
},
"tool": {
"tag": "forge:bones"
},
"addedoutput": [
{
"chance": 0.5,
"type": {
"item": "minecraft:diamond"
}
}
],
"output": {
"item": "bloodmagic:altar"
}
}

View file

@ -1,20 +0,0 @@
{
"type": "bloodmagic:arc",
"input": {
"tag": "forge:gems/diamond"
},
"tool": {
"item": "minecraft:acacia_boat"
},
"inputfluid": {
"amount": 1000,
"fluid": "minecraft:lava"
},
"outputfluid": {
"fluid": "minecraft:water",
"amount": 100
},
"output": {
"item": "bloodmagic:altar"
}
}

View file

@ -0,0 +1,20 @@
{
"type": "bloodmagic:arc",
"input": {
"item": "bloodmagic:infusedslate"
},
"tool": {
"tag": "bloodmagic:arc_tool_reverter"
},
"addedoutput": [
{
"chance": 0.2,
"type": {
"item": "bloodmagic:weakbloodshard"
}
}
],
"output": {
"item": "bloodmagic:weakbloodshard"
}
}

View file

@ -0,0 +1,26 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"csc",
"cfc",
"coc"
],
"key": {
"c": {
"tag": "forge:cobblestone"
},
"f": {
"tag": "forge:storage_blocks/coal"
},
"s": {
"item": "bloodmagic:blankslate"
},
"o": {
"type": "bloodmagic:bloodorb",
"orb_tier": 3
}
},
"result": {
"item": "bloodmagic:furnacecell_primitive"
}
}

View file

@ -0,0 +1,21 @@
{
"type": "bloodmagic:soulforge",
"input0": {
"item": "minecraft:shears"
},
"input1": {
"tag": "forge:stone"
},
"input2": {
"item": "bloodmagic:infusedslate"
},
"input3": {
"tag": "forge:ingots/iron"
},
"output": {
"item": "bloodmagic:sanguinereverter",
"nbt": "{Damage:0}"
},
"minimumDrain": 350.0,
"drain": 30.0
}

View file

@ -1,6 +1,10 @@
{
"replace": false,
"values": [
"minecraft:diamond"
"minecraft:diamond",
"bloodmagic:airscribetool",
"bloodmagic:sanguinereverter",
"bloodmagic:lavacrystal",
"bloodmagic:furnacecell_primitive"
]
}

View file

@ -0,0 +1,7 @@
{
"replace": false,
"values": [
"bloodmagic:lavacrystal",
"bloodmagic:furnacecell_primitive"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"bloodmagic:sanguinereverter"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"bloodmagic:airscribetool"
]
}

View file

@ -452,6 +452,11 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar
return ImmutableSet.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARRAY));
}
public Set<RecipeARC> getARCRecipes(World world)
{
return ImmutableSet.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARC));
}
public Set<RecipeAlchemyArray> getCraftingAlchemyArrayRecipes(World world)
{
Set<RecipeAlchemyArray> recipes = Set.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARRAY));

View file

@ -117,6 +117,19 @@ public abstract class RecipeARC extends BloodMagicRecipe
return list;
}
public double[] getAllOutputChances()
{
int size = addedItems.size();
double[] chanceArray = new double[size];
for (int i = 0; i < size; i++)
{
chanceArray[i] = addedItems.get(i).getRight();
}
return chanceArray;
}
@Override
public void write(PacketBuffer buffer)
{

View file

@ -88,20 +88,22 @@ public class ScreenAlchemicalReactionChamber extends ScreenBase<ContainerAlchemi
ClientHandler.handleGuiTank(stack, tileARC.outputTank, this.guiLeft + 152, this.guiTop
+ 15, 16, 63, 194, 1, 16, 63, mouseX, mouseY, background.toString(), null);
// int l = this.getCookProgressScaled(90);
// this.blit(stack, i + 115, j + 14 + 90 - l, 176, 90 - l, 18, l);
int w = this.getCookProgressScaled(38);
System.out.println("Width: " + w);
// FurnaceTileEntity d;
this.blit(stack, i + 63, j + 44, 176, 90, w, 23);
}
////
// 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);
// }
public int getCookProgressScaled(int scale)
{
double progress = ((TileAlchemicalReactionChamber) tileARC).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);
}
}

View file

@ -50,6 +50,7 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider
ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.BLANK_RITUAL_STONE.get(), 4).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicItems.REINFORCED_SLATE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_blank"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.MASTER_RITUAL_STONE.get()).key('a', Tags.Items.OBSIDIAN).key('b', BloodMagicBlocks.BLANK_RITUAL_STONE.get()).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).patternLine("aba").patternLine("bcb").patternLine("aba").addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_stone_master"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.PRIMITIVE_FURNACE_CELL.get()).key('c', Tags.Items.COBBLESTONE).key('f', Tags.Items.STORAGE_BLOCKS_COAL).key('s', Ingredient.fromItems(BloodMagicItems.SLATE.get())).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).patternLine("csc").patternLine("cfc").patternLine("coc").addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("primitive_furnace_cell"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.LAVA_CRYSTAL.get()).key('a', Tags.Items.GLASS).key('b', Items.LAVA_BUCKET).key('c', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).key('d', Tags.Items.OBSIDIAN).key('e', Tags.Items.GEMS_DIAMOND).patternLine("aba").patternLine("bcb").patternLine("ded").addCriterion("has_weak_orb", hasItem(BloodMagicItems.WEAK_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("lava_crystal"));
// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', Ingredient.fromItems(Items.DIAMOND)).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_standard"));
// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_orb"));

View file

@ -5,10 +5,13 @@ import java.nio.file.Path;
import net.minecraft.data.BlockTagsProvider;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.ItemTagsProvider;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.tags.ITag.INamedTag;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.data.ExistingFileHelper;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.common.item.BloodMagicItems;
import wayoftime.bloodmagic.common.tags.BloodMagicTags;
public class GeneratorItemTags extends ItemTagsProvider
@ -22,12 +25,22 @@ public class GeneratorItemTags extends ItemTagsProvider
public void registerTags()
{
this.getOrCreateBuilder(BloodMagicTags.ARC_TOOL).add(Items.DIAMOND);
this.registerTool(BloodMagicItems.AIR_INSCRIPTION_TOOL.get(), BloodMagicTags.ARC_TOOL_SIEVE);
this.registerTool(BloodMagicItems.SANGUINE_REVERTER.get(), BloodMagicTags.ARC_TOOL_REVERTER);
this.registerTool(BloodMagicItems.LAVA_CRYSTAL.get(), BloodMagicTags.ARC_TOOL_FURNACE);
this.registerTool(BloodMagicItems.PRIMITIVE_FURNACE_CELL.get(), BloodMagicTags.ARC_TOOL_FURNACE);
// this.getOrCreateBuilder(GOORESISTANT).addTag(BlockTags.DOORS);
// this.getOrCreateBuilder(GOORESISTANT).addTag(BlockTags.BEDS);
// this.getOrCreateBuilder(GOORESISTANT).add(Blocks.PISTON, Blocks.PISTON_HEAD, Blocks.STICKY_PISTON, Blocks.MOVING_PISTON);
}
public void registerTool(Item item, INamedTag<Item> tag)
{
this.getOrCreateBuilder(tag).add(item);
this.getOrCreateBuilder(BloodMagicTags.ARC_TOOL).add(item);
}
/**
* Resolves a Path for the location to save the given tag.
*/

View file

@ -222,6 +222,11 @@ public class GeneratorLanguage extends LanguageProvider
addItem(BloodMagicItems.BASE_RITUAL_DIVINER, "Ritual Diviner");
addItem(BloodMagicItems.DUSK_RITUAL_DIVINER, "Ritual Diviner [Dusk]");
addItem(BloodMagicItems.WEAK_BLOOD_SHARD, "Weak Blood Shard");
addItem(BloodMagicItems.SANGUINE_REVERTER, "Sanguine Reverter");
addItem(BloodMagicItems.PRIMITIVE_FURNACE_CELL, "Primitive Fuel Cell");
// addItem(BloodMagicItems , "");
// JEI

View file

@ -36,7 +36,7 @@ public class ARCRecipeBuilder extends BloodMagicRecipeBuilder<ARCRecipeBuilder>
this.arcTool = arcTool;
this.inputFluid = inputFluid;
this.output = output;
this.outputFluid = outputFluid;
this.outputFluid = outputFluid == null ? FluidStack.EMPTY : outputFluid;
}
public static ARCRecipeBuilder arc(Ingredient input, Ingredient arcTool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid)
@ -92,7 +92,7 @@ public class ARCRecipeBuilder extends BloodMagicRecipeBuilder<ARCRecipeBuilder>
json.add(Constants.JSON.ADDEDOUTPUT, mainArray);
}
if (outputFluid != null)
if (outputFluid != null && !outputFluid.isEmpty())
json.add(Constants.JSON.OUTPUT_FLUID, SerializerHelper.serializeFluidStack(outputFluid));
json.add(Constants.JSON.OUTPUT, SerializerHelper.serializeItemStack(output));

View file

@ -8,6 +8,7 @@ import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.item.arc.ItemARCToolBase;
import wayoftime.bloodmagic.common.item.sigil.ItemSigilAir;
import wayoftime.bloodmagic.common.item.sigil.ItemSigilBloodLight;
import wayoftime.bloodmagic.common.item.sigil.ItemSigilDivination;
@ -98,6 +99,7 @@ public class BloodMagicItems
public static final RegistryObject<Item> ARCANE_ASHES = BASICITEMS.register("arcaneashes", () -> new ItemArcaneAshes());
public static final RegistryObject<Item> DAGGER_OF_SACRIFICE = BASICITEMS.register("daggerofsacrifice", () -> new ItemDaggerOfSacrifice());
public static final RegistryObject<Item> LAVA_CRYSTAL = BASICITEMS.register("lavacrystal", () -> new ItemLavaCrystal());
public static final RegistryObject<Item> WEAK_BLOOD_SHARD = BASICITEMS.register("weakbloodshard", () -> new ItemBase());
// Ritual stuffs
public static final RegistryObject<Item> WEAK_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalweak", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.WEAK));
@ -136,4 +138,8 @@ public class BloodMagicItems
public static final RegistryObject<Item> SOUL_SNARE = BASICITEMS.register("soulsnare", ItemSoulSnare::new);
public static final RegistryObject<Item> SENTIENT_SWORD = ITEMS.register("soulsword", () -> new ItemSentientSword());
// ARC Tools
public static final RegistryObject<Item> SANGUINE_REVERTER = BASICITEMS.register("sanguinereverter", () -> new ItemARCToolBase(32, 2));
public static final RegistryObject<Item> PRIMITIVE_FURNACE_CELL = BASICITEMS.register("furnacecell_primitive", () -> new ItemARCToolBase(128, 1.25));
}

View file

@ -1,6 +1,11 @@
package wayoftime.bloodmagic.common.item;
import net.minecraft.item.ItemStack;
public interface IARCTool
{
default double getCraftingSpeedMultiplier(ItemStack stack)
{
return 1;
}
}

View file

@ -0,0 +1,23 @@
package wayoftime.bloodmagic.common.item.arc;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.common.item.IARCTool;
public class ItemARCToolBase extends Item implements IARCTool
{
private final double craftingMultiplier;
public ItemARCToolBase(int maxDamage, double craftingMultiplier)
{
super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB).maxDamage(maxDamage));
this.craftingMultiplier = craftingMultiplier;
}
@Override
public double getCraftingSpeedMultiplier(ItemStack stack)
{
return craftingMultiplier;
}
}

View file

@ -0,0 +1,101 @@
package wayoftime.bloodmagic.common.item.inventory;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
public class InventoryWrapper implements IInventory
{
protected int[] syncedSlots = new int[0];
protected NonNullList<ItemStack> inventory;
private int size;
public InventoryWrapper(int size)
{
this.inventory = NonNullList.withSize(size, ItemStack.EMPTY);
this.size = size;
}
@Override
public void clear()
{
this.inventory = NonNullList.withSize(size, ItemStack.EMPTY);
}
@Override
public int getSizeInventory()
{
return size;
}
@Override
public boolean isEmpty()
{
for (ItemStack stack : inventory) if (!stack.isEmpty())
return false;
return true;
}
@Override
public ItemStack getStackInSlot(int index)
{
return inventory.get(index);
}
@Override
public ItemStack decrStackSize(int index, int count)
{
if (!getStackInSlot(index).isEmpty())
{
if (getStackInSlot(index).getCount() <= count)
{
ItemStack itemStack = inventory.get(index);
inventory.set(index, ItemStack.EMPTY);
markDirty();
return itemStack;
}
ItemStack itemStack = inventory.get(index).split(count);
markDirty();
return itemStack;
}
return ItemStack.EMPTY;
}
@Override
public ItemStack removeStackFromSlot(int slot)
{
if (!inventory.get(slot).isEmpty())
{
ItemStack itemStack = inventory.get(slot);
setInventorySlotContents(slot, ItemStack.EMPTY);
return itemStack;
}
return ItemStack.EMPTY;
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack)
{
inventory.set(slot, stack);
if (!stack.isEmpty() && stack.getCount() > getInventoryStackLimit())
stack.setCount(getInventoryStackLimit());
markDirty();
}
@Override
public void markDirty()
{
}
@Override
public boolean isUsableByPlayer(PlayerEntity player)
{
return false;
}
}

View file

@ -1,6 +1,7 @@
package wayoftime.bloodmagic.common.item.sigil;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.IGrowable;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
@ -64,7 +65,7 @@ public class ItemSigilGreenGrove extends ItemSigilToggleableBase
// if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state))
{
if (state.getBlock() instanceof IGrowable)
if (state.getBlock() instanceof IGrowable && state.getBlock() != Blocks.GRASS_BLOCK)
{
if (worldIn.rand.nextInt(50) == 0)
{

View file

@ -3,16 +3,12 @@ package wayoftime.bloodmagic.common.recipe;
import java.util.function.Consumer;
import net.minecraft.data.IFinishedRecipe;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.crafting.Ingredient;
import net.minecraftforge.common.Tags;
import net.minecraftforge.fluids.FluidStack;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.data.recipe.builder.ARCRecipeBuilder;
import wayoftime.bloodmagic.common.item.BloodMagicItems;
import wayoftime.bloodmagic.common.tags.BloodMagicTags;
public class ARCRecipeProvider implements ISubRecipeProvider
{
@ -20,7 +16,12 @@ public class ARCRecipeProvider implements ISubRecipeProvider
public void addRecipes(Consumer<IFinishedRecipe> consumer)
{
String basePath = "arc/";
ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.BONES), null, new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), null).addRandomOutput(new ItemStack(Items.DIAMOND), 0.5).build(consumer, BloodMagic.rl(basePath + "test1"));
ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromItems(Items.ACACIA_BOAT), FluidStackIngredient.from(Fluids.LAVA, 1000), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), new FluidStack(Fluids.WATER, 100)).build(consumer, BloodMagic.rl(basePath + "test2"));
// ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.BONES), null, new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), null).addRandomOutput(new ItemStack(Items.DIAMOND, 2), 0.5).build(consumer, BloodMagic.rl(basePath + "test1"));
// ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.BONES), null, new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), null).addRandomOutput(new ItemStack(Items.DIAMOND, 5), 0.5).build(consumer, BloodMagic.rl(basePath + "test3"));
// ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromItems(Items.ACACIA_BOAT), FluidStackIngredient.from(Fluids.LAVA, 1000), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), new FluidStack(Fluids.WATER, 100)).build(consumer, BloodMagic.rl(basePath + "test2"));
// ARCRecipeBuilder.arc(Ingredient.fromTag(Tags.Items.NETHERRACK), Ingredient.fromTag(BloodMagicTags.ARC_TOOL_REVERTER), FluidStackIngredient.from(Fluids.LAVA, 1000), new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), new FluidStack(Fluids.WATER, 100)).addRandomOutput(new ItemStack(BloodMagicItems.SLATE.get()), 0.2).addRandomOutput(new ItemStack(BloodMagicItems.REINFORCED_SLATE.get()), 0.1).addRandomOutput(new ItemStack(BloodMagicItems.IMBUED_SLATE.get()), 0.001).build(consumer, BloodMagic.rl(basePath + "test4"));
ARCRecipeBuilder.arc(Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()), Ingredient.fromTag(BloodMagicTags.ARC_TOOL_REVERTER), null, new ItemStack(BloodMagicItems.WEAK_BLOOD_SHARD.get()), null).addRandomOutput(new ItemStack(BloodMagicItems.WEAK_BLOOD_SHARD.get()), 0.2).build(consumer, BloodMagic.rl(basePath + "weakbloodshard"));
}
}

View file

@ -32,6 +32,8 @@ public class TartaricForgeRecipeProvider implements ISubRecipeProvider
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_GROWTH.get()), 128, 20, Ingredient.fromTag(ItemTags.SAPLINGS), Ingredient.fromTag(ItemTags.SAPLINGS), Ingredient.fromItems(Items.SUGAR_CANE), Ingredient.fromItems(Items.SUGAR)).build(consumer, BloodMagic.rl(basePath + "reagent_growth"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_MAGNETISM.get()), 600, 10, Ingredient.fromTag(Tags.Items.STRING), Ingredient.fromTag(Tags.Items.INGOTS_GOLD), Ingredient.fromTag(Tags.Items.INGOTS_GOLD), Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_IRON)).build(consumer, BloodMagic.rl(basePath + "reagent_magnetism"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_FAST_MINER.get()), 128, 20, Ingredient.fromItems(Items.IRON_PICKAXE), Ingredient.fromItems(Items.IRON_AXE), Ingredient.fromItems(Items.IRON_SHOVEL), Ingredient.fromTag(Tags.Items.GUNPOWDER)).build(consumer, BloodMagic.rl(basePath + "reagent_fastminer"));
TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.SANGUINE_REVERTER.get()), 350, 30, Ingredient.fromItems(Items.SHEARS), Ingredient.fromTag(Tags.Items.STONE), Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()), Ingredient.fromTag(Tags.Items.INGOTS_IRON)).build(consumer, BloodMagic.rl(basePath + "sanguine_reverter"));
}
}

View file

@ -84,14 +84,15 @@ public class ARCRecipeSerializer<RECIPE extends RecipeARC> extends ForgeRegistry
inputFluidIng = FluidStackIngredient.deserialize(inputFluid);
}
FluidStack outputFluid = null;
FluidStack outputFluidStack = FluidStack.EMPTY;
if (json.has(Constants.JSON.OUTPUT_FLUID))
{
outputFluid = SerializerHelper.deserializeFluid(json);
JsonObject outputFluid = JSONUtils.getJsonObject(json, Constants.JSON.OUTPUT_FLUID).getAsJsonObject();
outputFluidStack = SerializerHelper.deserializeFluid(outputFluid);
}
return this.factory.create(recipeId, inputIng, toolIng, inputFluidIng, output, addedItems, outputFluid);
return this.factory.create(recipeId, inputIng, toolIng, inputFluidIng, output, addedItems, outputFluidStack);
}
@Override

View file

@ -9,4 +9,5 @@ public class BloodMagicTags
public static final ITag.INamedTag<Item> ARC_TOOL = ItemTags.makeWrapperTag("bloodmagic:arc_tool");
public static final ITag.INamedTag<Item> ARC_TOOL_FURNACE = ItemTags.makeWrapperTag("bloodmagic:arc_tool_furnace");
public static final ITag.INamedTag<Item> ARC_TOOL_SIEVE = ItemTags.makeWrapperTag("bloodmagic:arc_tool_sieve");
public static final ITag.INamedTag<Item> ARC_TOOL_REVERTER = ItemTags.makeWrapperTag("bloodmagic:arc_tool_reverter");
}

View file

@ -2,6 +2,8 @@ package wayoftime.bloodmagic.compat.jei;
import java.util.Objects;
import com.google.common.collect.ImmutableSet;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin;
import mezz.jei.api.helpers.IJeiHelpers;
@ -11,12 +13,15 @@ import mezz.jei.api.registration.IRecipeRegistration;
import net.minecraft.client.Minecraft;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.util.ResourceLocation;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.api.impl.BloodMagicAPI;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.item.BloodMagicItems;
import wayoftime.bloodmagic.compat.jei.altar.BloodAltarRecipeCategory;
import wayoftime.bloodmagic.compat.jei.arc.ARCFurnaceRecipeCategory;
import wayoftime.bloodmagic.compat.jei.arc.ARCRecipeCategory;
import wayoftime.bloodmagic.compat.jei.array.AlchemyArrayCraftingCategory;
import wayoftime.bloodmagic.compat.jei.forge.TartaricForgeRecipeCategory;
@ -33,6 +38,8 @@ public class BloodMagicJEIPlugin implements IModPlugin
registration.addRecipeCatalyst(new ItemStack(BloodMagicBlocks.SOUL_FORGE.get()), TartaricForgeRecipeCategory.UID);
registration.addRecipeCatalyst(new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), BloodAltarRecipeCategory.UID);
registration.addRecipeCatalyst(new ItemStack(BloodMagicItems.ARCANE_ASHES.get()), AlchemyArrayCraftingCategory.UID);
registration.addRecipeCatalyst(new ItemStack(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()), ARCRecipeCategory.UID);
registration.addRecipeCatalyst(new ItemStack(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()), ARCFurnaceRecipeCategory.UID);
}
@Override
@ -42,6 +49,8 @@ public class BloodMagicJEIPlugin implements IModPlugin
registration.addRecipeCategories(new TartaricForgeRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
registration.addRecipeCategories(new BloodAltarRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
registration.addRecipeCategories(new AlchemyArrayCraftingCategory(registration.getJeiHelpers().getGuiHelper()));
registration.addRecipeCategories(new ARCRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
registration.addRecipeCategories(new ARCFurnaceRecipeCategory(registration.getJeiHelpers().getGuiHelper()));
}
@Override
@ -51,6 +60,8 @@ public class BloodMagicJEIPlugin implements IModPlugin
registration.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getTartaricForgeRecipes(world), TartaricForgeRecipeCategory.UID);
registration.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAltarRecipes(world), BloodAltarRecipeCategory.UID);
registration.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArrayRecipes(world), AlchemyArrayCraftingCategory.UID);
registration.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getARCRecipes(world), ARCRecipeCategory.UID);
registration.addRecipes(ImmutableSet.copyOf(world.getRecipeManager().getRecipesForType(IRecipeType.SMELTING)), ARCFurnaceRecipeCategory.UID);
}
@Override

View file

@ -0,0 +1,114 @@
package wayoftime.bloodmagic.compat.jei.arc;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.mojang.blaze3d.matrix.MatrixStack;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import mezz.jei.api.helpers.IGuiHelper;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.category.IRecipeCategory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipe;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.tags.BloodMagicTags;
import wayoftime.bloodmagic.util.Constants;
import wayoftime.bloodmagic.util.handler.event.ClientHandler;
import wayoftime.bloodmagic.util.helper.TextHelper;
public class ARCFurnaceRecipeCategory implements IRecipeCategory<FurnaceRecipe>
{
private static final int OUTPUT_SLOT = 0;
private static final int INPUT_SLOT = 1;
private static final int CATALYST_SLOT = 2;
public static final ResourceLocation UID = BloodMagic.rl(Constants.Compat.JEI_CATEGORY_ARC + "furnace");
public static final ResourceLocation BACKGROUNDRL = BloodMagic.rl("gui/jei/arc.png");
@Nonnull
private final IDrawable background;
private final IDrawable icon;
// @Nonnull
// private final ICraftingGridHelper craftingGridHelper;
public ARCFurnaceRecipeCategory(IGuiHelper guiHelper)
{
icon = guiHelper.createDrawableIngredient(new ItemStack(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()));
background = guiHelper.createDrawable(BACKGROUNDRL, 0, 0, 157, 43);
// craftingGridHelper = guiHelper.createCraftingGridHelper(INPUT_SLOT);
}
@Nonnull
@Override
public ResourceLocation getUid()
{
return UID;
}
@Nonnull
@Override
public String getTitle()
{
return TextHelper.localize("jei.bloodmagic.recipe.arcfurnace");
}
@Nonnull
@Override
public IDrawable getBackground()
{
return background;
}
@Nullable
@Override
public IDrawable getIcon()
{
return icon;
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull FurnaceRecipe recipe, @Nonnull IIngredients ingredients)
{
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 53, 16);
recipeLayout.getItemStacks().init(INPUT_SLOT, true, 0, 5);
recipeLayout.getItemStacks().init(CATALYST_SLOT, true, 21, 16);
guiItemStacks.set(ingredients);
}
@Override
public Class<? extends FurnaceRecipe> getRecipeClass()
{
return FurnaceRecipe.class;
}
@Override
public void setIngredients(FurnaceRecipe recipe, IIngredients ingredients)
{
List<Ingredient> inputIngList = recipe.getIngredients();
inputIngList.add(Ingredient.fromTag(BloodMagicTags.ARC_TOOL_FURNACE));
ingredients.setInputIngredients(inputIngList);
ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput());
}
@Override
public void draw(FurnaceRecipe recipe, MatrixStack matrixStack, double mouseX, double mouseY)
{
FluidStack outputStack = FluidStack.EMPTY;
ClientHandler.handleGuiTank(matrixStack, outputStack, outputStack.getAmount(), 140, 7, 16, 36, 157, 6, 18, 38, (int) mouseX, (int) mouseY, BACKGROUNDRL.toString(), null);
FluidStack inputStack = FluidStack.EMPTY;
ClientHandler.handleGuiTank(matrixStack, inputStack, inputStack.getAmount(), 1, 26, 16, 16, 175, 26, 18, 18, (int) mouseX, (int) mouseY, BACKGROUNDRL.toString(), null);
}
}

View file

@ -0,0 +1,172 @@
package wayoftime.bloodmagic.compat.jei.arc;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.mojang.blaze3d.matrix.MatrixStack;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import mezz.jei.api.helpers.IGuiHelper;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.category.IRecipeCategory;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.fluids.FluidStack;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.api.impl.recipe.RecipeARC;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.util.Constants;
import wayoftime.bloodmagic.util.handler.event.ClientHandler;
import wayoftime.bloodmagic.util.helper.TextHelper;
public class ARCRecipeCategory implements IRecipeCategory<RecipeARC>
{
private static final int OUTPUT_SLOT = 0;
private static final int INPUT_SLOT = 4;
private static final int CATALYST_SLOT = 5;
public static final ResourceLocation UID = BloodMagic.rl(Constants.Compat.JEI_CATEGORY_ARC);
public static final ResourceLocation BACKGROUNDRL = BloodMagic.rl("gui/jei/arc.png");
@Nonnull
private final IDrawable background;
private final IDrawable icon;
// @Nonnull
// private final ICraftingGridHelper craftingGridHelper;
public ARCRecipeCategory(IGuiHelper guiHelper)
{
icon = guiHelper.createDrawableIngredient(new ItemStack(BloodMagicBlocks.ALCHEMICAL_REACTION_CHAMBER.get()));
background = guiHelper.createDrawable(BACKGROUNDRL, 0, 0, 157, 43);
// craftingGridHelper = guiHelper.createCraftingGridHelper(INPUT_SLOT);
}
@Nonnull
@Override
public ResourceLocation getUid()
{
return UID;
}
@Nonnull
@Override
public String getTitle()
{
return TextHelper.localize("jei.bloodmagic.recipe.arc");
}
@Nonnull
@Override
public IDrawable getBackground()
{
return background;
}
@Nullable
@Override
public IDrawable getIcon()
{
return icon;
}
@Override
public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull RecipeARC recipe, @Nonnull IIngredients ingredients)
{
IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks();
recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 53, 16);
recipeLayout.getItemStacks().init(OUTPUT_SLOT + 1, false, 53 + 22 * 1, 16);
recipeLayout.getItemStacks().init(OUTPUT_SLOT + 2, false, 53 + 22 * 2, 16);
recipeLayout.getItemStacks().init(OUTPUT_SLOT + 3, false, 53 + 22 * 3, 16);
recipeLayout.getItemStacks().init(INPUT_SLOT, true, 0, 5);
recipeLayout.getItemStacks().init(CATALYST_SLOT, true, 21, 16);
guiItemStacks.set(ingredients);
}
@Override
public Class<? extends RecipeARC> getRecipeClass()
{
return RecipeARC.class;
}
@Override
public void setIngredients(RecipeARC recipe, IIngredients ingredients)
{
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setOutputs(VanillaTypes.ITEM, recipe.getAllListedOutputs());
}
@Override
public void draw(RecipeARC recipe, MatrixStack matrixStack, double mouseX, double mouseY)
{
Minecraft mc = Minecraft.getInstance();
double[] chanceArray = recipe.getAllOutputChances();
String[] infoString = new String[chanceArray.length];
for (int i = 0; i < infoString.length; i++)
{
if (chanceArray[i] >= 1)
{
infoString[i] = "";
} else if (chanceArray[i] < 0.01)
{
infoString[i] = "<1%";
} else
{
infoString[i] = "" + (int) (chanceArray[i] * 100) + "%";
}
mc.fontRenderer.drawStringWithShadow(matrixStack, infoString[i], 86 + 22 * i
- mc.fontRenderer.getStringWidth(infoString[i]) / 2, 5, Color.white.getRGB());
}
// if (recipe.getFluidOutput() != null && !recipe.getFluidOutput().isEmpty())
{
FluidStack outputStack = recipe.getFluidOutput();
ClientHandler.handleGuiTank(matrixStack, outputStack, outputStack.getAmount(), 140, 7, 16, 36, 157, 6, 18, 38, (int) mouseX, (int) mouseY, BACKGROUNDRL.toString(), null);
}
if (recipe.getFluidIngredient() != null)
{
List<FluidStack> inputFluids = recipe.getFluidIngredient().getRepresentations();
FluidStack inputStack = inputFluids.get(0);
ClientHandler.handleGuiTank(matrixStack, inputStack, inputStack.getAmount(), 1, 26, 16, 16, 175, 26, 18, 18, (int) mouseX, (int) mouseY, BACKGROUNDRL.toString(), null);
}
// { TextHelper.localize("jei.bloodmagic.recipe.requiredtier", NumeralHelper.toRoman(recipe.getMinimumTier().toInt())),
// TextHelper.localize("jei.bloodmagic.recipe.requiredlp", recipe.getSyphon()) };
// mc.fontRenderer.drawString(matrixStack, infoString[0], 90
// - mc.fontRenderer.getStringWidth(infoString[0]) / 2, 0, Color.gray.getRGB());
// mc.fontRenderer.drawString(matrixStack, infoString[1], 90
// - mc.fontRenderer.getStringWidth(infoString[1]) / 2, 10, Color.gray.getRGB());
}
@Override
public List<ITextComponent> getTooltipStrings(RecipeARC recipe, double mouseX, double mouseY)
{
List<ITextComponent> tooltip = new ArrayList<>();
FluidStack outputStack = recipe.getFluidOutput();
if (!outputStack.isEmpty())
{
ClientHandler.handleGuiTank(null, outputStack, -1, 140, 8, 16, 34, 157, 7, 18, 36, (int) mouseX, (int) mouseY, BACKGROUNDRL.toString(), tooltip);
}
if (recipe.getFluidIngredient() != null)
{
List<FluidStack> inputFluids = recipe.getFluidIngredient().getRepresentations();
FluidStack inputStack = inputFluids.get(0);
ClientHandler.handleGuiTank(null, inputStack, -1, 1, 26, 16, 16, 175, 26, 18, 18, (int) mouseX, (int) mouseY, BACKGROUNDRL.toString(), tooltip);
}
return tooltip;
}
}

View file

@ -2,13 +2,15 @@ package wayoftime.bloodmagic.tile;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.fluid.Fluids;
import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipe;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntityType;
@ -23,8 +25,12 @@ import net.minecraftforge.fluids.capability.IFluidHandlerItem;
import net.minecraftforge.fluids.capability.templates.FluidTank;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.registries.ObjectHolder;
import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
import wayoftime.bloodmagic.api.impl.BloodMagicAPI;
import wayoftime.bloodmagic.api.impl.recipe.RecipeARC;
import wayoftime.bloodmagic.common.item.IARCTool;
import wayoftime.bloodmagic.common.item.inventory.InventoryWrapper;
import wayoftime.bloodmagic.common.tags.BloodMagicTags;
import wayoftime.bloodmagic.tile.contailer.ContainerAlchemicalReactionChamber;
import wayoftime.bloodmagic.util.Constants;
import wayoftime.bloodmagic.util.MultiSlotItemHandler;
@ -45,6 +51,7 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic
public FluidTank outputTank = new FluidTank(FluidAttributes.BUCKET_VOLUME * 20);
public double currentProgress = 0;
public static final double DEFAULT_SPEED = 0.005;
public TileAlchemicalReactionChamber(TileEntityType<?> type)
{
@ -91,15 +98,17 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic
@Override
public void tick()
{
if (world.isRemote)
{
return;
}
// if (world.isRemote)
// {
// return;
// }
if (world.getGameTime() % 20 == 0)
{
outputTank.fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE);
}
// if (world.getGameTime() % 20 == 0)
// {
// outputTank.fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE);
// }
boolean outputChanged = false;
ItemStack fullBucketStack = this.getStackInSlot(INPUT_BUCKET_SLOT);
ItemStack emptyBucketStack = this.getStackInSlot(OUTPUT_BUCKET_SLOT);
@ -109,58 +118,63 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic
MultiSlotItemHandler outputSlotHandler = new MultiSlotItemHandler(outputInventory, 64);
if (!fullBucketStack.isEmpty() && inputTank.getSpace() >= 1000)
if (!world.isRemote)
{
ItemStack testFullBucketStack = ItemHandlerHelper.copyStackWithSize(fullBucketStack, 1);
LazyOptional<IFluidHandlerItem> fluidHandlerWrapper = FluidUtil.getFluidHandler(testFullBucketStack);
if (fluidHandlerWrapper.isPresent())
if (!fullBucketStack.isEmpty() && inputTank.getSpace() >= 1000)
{
IFluidHandlerItem fluidHandler = fluidHandlerWrapper.resolve().get();
FluidStack transferedStack = FluidUtil.tryFluidTransfer(inputTank, fluidHandler, 1000, false);
if (!transferedStack.isEmpty())
ItemStack testFullBucketStack = ItemHandlerHelper.copyStackWithSize(fullBucketStack, 1);
LazyOptional<IFluidHandlerItem> fluidHandlerWrapper = FluidUtil.getFluidHandler(testFullBucketStack);
if (fluidHandlerWrapper.isPresent())
{
fluidHandler.drain(transferedStack, FluidAction.EXECUTE);
List<ItemStack> arrayList = new ArrayList<>();
arrayList.add(fluidHandler.getContainer());
if (outputSlotHandler.canTransferAllItemsToSlots(arrayList, true))
IFluidHandlerItem fluidHandler = fluidHandlerWrapper.resolve().get();
FluidStack transferedStack = FluidUtil.tryFluidTransfer(inputTank, fluidHandler, 1000, false);
if (!transferedStack.isEmpty())
{
inputTank.fill(transferedStack, FluidAction.EXECUTE);
outputSlotHandler.canTransferAllItemsToSlots(arrayList, false);
if (fullBucketStack.getCount() > 1)
fluidHandler.drain(transferedStack, FluidAction.EXECUTE);
List<ItemStack> arrayList = new ArrayList<>();
arrayList.add(fluidHandler.getContainer());
if (outputSlotHandler.canTransferAllItemsToSlots(arrayList, true))
{
fullBucketStack.setCount(fullBucketStack.getCount() - 1);
} else
{
setInventorySlotContents(INPUT_BUCKET_SLOT, ItemStack.EMPTY);
outputChanged = true;
inputTank.fill(transferedStack, FluidAction.EXECUTE);
outputSlotHandler.canTransferAllItemsToSlots(arrayList, false);
if (fullBucketStack.getCount() > 1)
{
fullBucketStack.setCount(fullBucketStack.getCount() - 1);
} else
{
setInventorySlotContents(INPUT_BUCKET_SLOT, ItemStack.EMPTY);
}
}
}
}
}
}
if (!emptyBucketStack.isEmpty() && outputTank.getFluidAmount() >= 1000)
{
ItemStack testEmptyBucketStack = ItemHandlerHelper.copyStackWithSize(emptyBucketStack, 1);
LazyOptional<IFluidHandlerItem> fluidHandlerWrapper = FluidUtil.getFluidHandler(testEmptyBucketStack);
if (fluidHandlerWrapper.isPresent())
if (!emptyBucketStack.isEmpty() && outputTank.getFluidAmount() >= 1000)
{
IFluidHandlerItem fluidHandler = fluidHandlerWrapper.resolve().get();
FluidStack transferedStack = FluidUtil.tryFluidTransfer(fluidHandler, outputTank, 1000, false);
if (!transferedStack.isEmpty())
ItemStack testEmptyBucketStack = ItemHandlerHelper.copyStackWithSize(emptyBucketStack, 1);
LazyOptional<IFluidHandlerItem> fluidHandlerWrapper = FluidUtil.getFluidHandler(testEmptyBucketStack);
if (fluidHandlerWrapper.isPresent())
{
fluidHandler.fill(transferedStack, FluidAction.EXECUTE);
List<ItemStack> arrayList = new ArrayList<>();
arrayList.add(fluidHandler.getContainer());
if (outputSlotHandler.canTransferAllItemsToSlots(arrayList, true))
IFluidHandlerItem fluidHandler = fluidHandlerWrapper.resolve().get();
FluidStack transferedStack = FluidUtil.tryFluidTransfer(fluidHandler, outputTank, 1000, false);
if (!transferedStack.isEmpty())
{
outputTank.drain(transferedStack, FluidAction.EXECUTE);
outputSlotHandler.canTransferAllItemsToSlots(arrayList, false);
if (emptyBucketStack.getCount() > 1)
fluidHandler.fill(transferedStack, FluidAction.EXECUTE);
List<ItemStack> arrayList = new ArrayList<>();
arrayList.add(fluidHandler.getContainer());
if (outputSlotHandler.canTransferAllItemsToSlots(arrayList, true))
{
emptyBucketStack.setCount(emptyBucketStack.getCount() - 1);
} else
{
setInventorySlotContents(OUTPUT_BUCKET_SLOT, ItemStack.EMPTY);
outputChanged = true;
outputTank.drain(transferedStack, FluidAction.EXECUTE);
outputSlotHandler.canTransferAllItemsToSlots(arrayList, false);
if (emptyBucketStack.getCount() > 1)
{
emptyBucketStack.setCount(emptyBucketStack.getCount() - 1);
} else
{
setInventorySlotContents(OUTPUT_BUCKET_SLOT, ItemStack.EMPTY);
}
}
}
}
@ -169,16 +183,72 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic
ItemStack inputStack = this.getStackInSlot(INPUT_SLOT);
ItemStack toolStack = this.getStackInSlot(ARC_TOOL_SLOT);
RecipeARC recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getARC(world, inputStack, toolStack, inputTank.getFluid());
if (recipe != null && outputSlotHandler.canTransferAllItemsToSlots(recipe.getAllListedOutputs(), true))
{
// We have enough fluid (if applicable) and the theoretical outputs can fit.
double craftingMultiplier = 1;
if (toolStack.getItem() instanceof IARCTool)
{
craftingMultiplier = ((IARCTool) toolStack.getItem()).getCraftingSpeedMultiplier(toolStack);
}
for (int i = 0; i < NUM_OUTPUTS; i++)
RecipeARC recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getARC(world, inputStack, toolStack, inputTank.getFluid());
if (canCraft(recipe, outputSlotHandler))
{
this.setInventorySlotContents(OUTPUT_SLOT + i, outputSlotHandler.getStackInSlot(i));
// We have enough fluid (if applicable) and the theoretical outputs can fit.
currentProgress += craftingMultiplier * DEFAULT_SPEED;
if (currentProgress >= 1)
{
if (!world.isRemote)
{
outputChanged = true;
craftItem(recipe, outputSlotHandler);
}
currentProgress = 0;
}
} else
{
if (toolStack.getItem().isIn(BloodMagicTags.ARC_TOOL_FURNACE))
{
InventoryWrapper invWrapper = new InventoryWrapper(1);
invWrapper.setInventorySlotContents(0, inputStack.copy());
// ItemStack[] outputInventory = new ItemStack[]
// { input };
// MultiSlotItemHandler outputSlotHandler = new MultiSlotItemHandler(outputInventory, 64);
Optional<FurnaceRecipe> furnaceRecipe = world.getRecipeManager().getRecipe(IRecipeType.SMELTING, invWrapper, world);
if (furnaceRecipe.isPresent())
{
ItemStack outputStack = furnaceRecipe.get().getCraftingResult(invWrapper);
if (canCraftFurnace(outputStack, outputSlotHandler))
{
currentProgress += craftingMultiplier * DEFAULT_SPEED;
if (currentProgress >= 1)
{
if (!world.isRemote)
{
craftFurnace(outputStack, outputSlotHandler);
outputChanged = true;
}
currentProgress = 0;
}
}
} else
{
currentProgress = 0;
}
} else
{
currentProgress = 0;
}
}
if (outputChanged && !world.isRemote)
{
for (int i = 0; i < NUM_OUTPUTS; i++)
{
this.setInventorySlotContents(OUTPUT_SLOT + i, outputSlotHandler.getStackInSlot(i));
}
}
// FluidUtil.tryEmptyContainer(container, fluidDestination, maxAmount, player, doDrain)
@ -189,6 +259,12 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic
if (recipe == null)
return false;
FluidStackIngredient inputFluidIngredient = recipe.getFluidIngredient();
if (inputFluidIngredient != null && !inputFluidIngredient.test(inputTank.getFluid()))
{
return false;
}
if (outputSlotHandler.canTransferAllItemsToSlots(recipe.getAllListedOutputs(), true))
{
FluidStack outputStack = recipe.getFluidOutput();
@ -199,16 +275,37 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic
return false;
}
public void craftItem(RecipeARC recipe, MultiSlotItemHandler outputSlotHandler)
private void craftItem(RecipeARC recipe, MultiSlotItemHandler outputSlotHandler)
{
if (this.canCraft(recipe, outputSlotHandler))
{
if (recipe.getFluidIngredient() != null)
{
FluidStack inputStack = recipe.getFluidIngredient().getMatchingInstance(inputTank.getFluid());
inputTank.drain(inputStack, FluidAction.EXECUTE);
}
outputSlotHandler.canTransferAllItemsToSlots(recipe.getAllOutputs(world.rand), false);
outputTank.fill(recipe.getFluidOutput().copy(), FluidAction.EXECUTE);
consumeInventory();
}
}
private boolean canCraftFurnace(ItemStack outputStack, MultiSlotItemHandler outputSlotHandler)
{
List<ItemStack> outputList = new ArrayList<>();
outputList.add(outputStack);
return outputSlotHandler.canTransferAllItemsToSlots(outputList, true);
}
private void craftFurnace(ItemStack outputStack, MultiSlotItemHandler outputSlotHandler)
{
List<ItemStack> outputList = new ArrayList<>();
outputList.add(outputStack);
outputSlotHandler.canTransferAllItemsToSlots(outputList, false);
consumeInventory();
}
public void consumeInventory()
{
ItemStack inputStack = getStackInSlot(INPUT_SLOT);
@ -266,6 +363,6 @@ public class TileAlchemicalReactionChamber extends TileInventory implements ITic
public double getProgressForGui()
{
return 0;
return currentProgress;
}
}

View file

@ -170,6 +170,7 @@ public class Constants
public static final String JEI_CATEGORY_SOULFORGE = "soulforge";
public static final String JEI_CATEGORY_ALCHEMYTABLE = "alchemytable";
public static final String JEI_CATEGORY_ARMOURDOWNGRADE = "armourdowngrade";
public static final String JEI_CATEGORY_ARC = "arc";
public static final String WAILA_CONFIG_ALTAR = BloodMagic.MODID + ".bloodaltar";
public static final String WAILA_CONFIG_TELEPOSER = BloodMagic.MODID + ".teleposer";

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View file

@ -0,0 +1,11 @@
{
"name": "Soul Network",
"icon": "bloodmagic:weakbloodorb",
"category": "altar",
"pages": [
{
"type": "text",
"text": ""
}
]
}

View file

@ -5,7 +5,20 @@
"pages": [
{
"type": "text",
"text": "$(item)Divination Sigil$()."
"text": "The $(item)Divination Sigil$() is probably the first of many sigils that you would like to craft in Blood Magic. In order to craft the sigil, you need to create an $(l:alchemyarray/arcaneash)Alchemy Array$(/l) and use $(item)Redstone Dust$() and a $(item)Blank Slate$() as the base and catalyst items, respectively."
},
{
"type": "image",
"images": [
"bloodmagic:images/entries/sigil/divination_sigil.png"
],
"title": "Divination Sigil Array",
"border": true,
"text": "The Divination Sigil, next to its crafting array."
},
{
"type": "text",
"text": "The Divination Sigil has two primary uses: $(br)$(li)When the player right-clicks in the air with the sigil, it will display the amount of LP that is in the owner's $(l:altar/soulnetwork)Soul Network.$(/l)$(li)When clicking on a $(l:altar/bloodaltar)Blood Altar$(/l), it will tell the player the altar's current Tier, the amount of LP stored in the altar, as well as its current max capacity. Having a $(item)Divination Sigil$() on hand can also be helpful for other block applications, but that will be covered later."
}
]
}

View file

@ -0,0 +1,26 @@
{
"name": "Sigil of the Green Grove",
"icon": "bloodmagic:growthsigil",
"category": "sigil",
"pages": [
{
"type": "text",
"text": "The $(item)Sigil of the Green Grove$() is an item that has multiple uses. Crafted in an array with a $(item)Growth Reagent$(item) and a $(item)Reinforced Slate$(), the sigil can use the power of your stored life force to nourish and grow nearby plants."
},
{
"type": "image",
"images": [
"bloodmagic:images/entries/sigil/grove_sigil1.png",
"bloodmagic:images/entries/sigil/grove_sigil2.png",
"bloodmagic:images/entries/sigil/grove_sigil3.png"
],
"title": "Green Grove Sigil Array",
"border": true,
"text": "The Sigil of the Green Grove's array, plus its primary uses."
},
{
"type": "text",
"text": "If you right click on a block that is $(2)IGrowable$(), it will apply the bonemeal effect while consuming 150LP.$(br2)However, if you shift-right-click the sigil in the air, the sigil will light up to indicate that it is activated and will consume 150LP every 10 seconds. Every block in a 7x7x5 high volume centered on the player will have a growth tick applied to it, growing nearby crops. Good for farming those taters!"
}
]
}

View file

@ -0,0 +1,21 @@
{
"name": "Lava Sigil",
"icon": "bloodmagic:lavasigil",
"category": "sigil",
"pages": [
{
"type": "text",
"text": "The sister sigil to the $(l:sigil/water)Water Sigil,$(/l) the $(item)Lava Sigil$() creates a source block of lava where you click on the ground for the cost of 1000LP. Crafted in an $(l:alchemyarray/arcaneash)Alchemy Array$(/l) using a $(item)Lava Reagent$() and a $(item)Blank Slate,$() it'll drain 5 hearts from you if you don't have enough LP in your $(l:altar/soulnetwork)Soul Network.$(/l)"
},
{
"type": "image",
"images": [
"bloodmagic:images/entries/sigil/lava_sigil1.png",
"bloodmagic:images/entries/sigil/lava_sigil2.png"
],
"title": "Lava Sigil Array",
"border": true,
"text": "The Lava Sigil, next to its crafting array, plus its primary use."
}
]
}

View file

@ -0,0 +1,21 @@
{
"name": "Sigil of the Fast Miner",
"icon": "bloodmagic:miningsigil",
"category": "sigil",
"pages": [
{
"type": "text",
"text": "The $(item)Sigil of the Fast Miner$() is a sigil that, when activated using shift-right-click, will consume 100LP every 10 seconds and apply the Haste potion effect. Thus, it increases your mining, digging, and cutting speeds. Crafted using the $(item)Mining Reagent$() and $(item)Reinforced Slate$() in an alchemy array."
},
{
"type": "image",
"images": [
"bloodmagic:images/entries/sigil/mining_sigil1.png",
"bloodmagic:images/entries/sigil/mining_sigil2.png"
],
"title": "Fast Miner Sigil Array",
"border": true,
"text": "The Sigil of the Fast Miner's array, plus its primary uses."
}
]
}

View file

@ -0,0 +1,21 @@
{
"name": "Water Sigil",
"icon": "bloodmagic:watersigil",
"category": "sigil",
"pages": [
{
"type": "text",
"text": "The $(item)Water Sigil$() is a rather simple sigil. By right clicking on a block, you can drain 100LP from your $(l:altar/soulnetwork)Soul Network$(/l) to place a source block of water in the world. If there's not enough LP, it will instead drain the toll from your health. Crafted using a $(item)Water Reagent$() and a $(item)Blank Slate.$()"
},
{
"type": "image",
"images": [
"bloodmagic:images/entries/sigil/water_sigil1.png",
"bloodmagic:images/entries/sigil/water_sigil2.png"
],
"title": "Water Sigil Array",
"border": true,
"text": "The Water Sigil, next to its crafting array, plus its primary use."
}
]
}

View file

@ -0,0 +1,17 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "minecraft:book"
},
{
"item": "minecraft:glass"
}
],
"result": {
"item": "patchouli:guide_book",
"nbt": {
"patchouli:book": "bloodmagic:guide"
}
}
}