diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java new file mode 100644 index 00000000..d3650e52 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffect.java @@ -0,0 +1,9 @@ +package WayofTime.bloodmagic.api.alchemyCrafting; + +import net.minecraft.tileentity.TileEntity; + +public abstract class AlchemyArrayEffect { + + public abstract boolean update(TileEntity tile, int ticksActive); + +} diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java new file mode 100644 index 00000000..92f95af7 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyArrayEffectCrafting.java @@ -0,0 +1,30 @@ +package WayofTime.bloodmagic.api.alchemyCrafting; + +import lombok.Getter; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; + +public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect { + + @Getter + public final ItemStack outputStack; + + public AlchemyArrayEffectCrafting(ItemStack outputStack) { + this.outputStack = outputStack; + } + + @Override + public boolean update(TileEntity tile, int ticksActive) { + //TODO: Add recipe rechecking to verify nothing screwy is going on. + BlockPos pos = tile.getPos(); + + ItemStack output = outputStack.copy(); + EntityItem outputEntity = new EntityItem(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); + + tile.getWorld().spawnEntityInWorld(outputEntity); + + return true; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java index efc1b44b..b906acbc 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java @@ -12,8 +12,11 @@ import org.lwjgl.opengl.GL11; public class AlchemyCircleRenderer { - public AlchemyCircleRenderer() { - + public float offsetFromFace = -0.9f; + public final ResourceLocation arrayResource; + + public AlchemyCircleRenderer(ResourceLocation arrayResource) { + this.arrayResource = arrayResource; } public void renderAt(TileEntity tile, double x, double y, double z) { @@ -28,7 +31,7 @@ public class AlchemyCircleRenderer { float size = 1.0F; // Bind the texture to the circle - Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); + Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); GL11.glTexParameterf(3553, 10242, 10497.0F); GL11.glTexParameterf(3553, 10243, 10497.0F); @@ -42,7 +45,7 @@ public class AlchemyCircleRenderer { EnumFacing sideHit = EnumFacing.UP; // Specify which face this "circle" // is located on - GL11.glTranslatef(sideHit.getFrontOffsetX() * -0.9f, sideHit.getFrontOffsetY() * -0.9f, sideHit.getFrontOffsetZ() * -0.9f); + GL11.glTranslatef(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); switch (sideHit) { case DOWN: diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java new file mode 100644 index 00000000..e0f68962 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java @@ -0,0 +1,177 @@ +package WayofTime.bloodmagic.api.registry; + +import java.util.Map.Entry; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffectCrafting; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.sun.istack.internal.Nullable; + +public class AlchemyArrayRecipeRegistry { + + public static final AlchemyCircleRenderer defaultRenderer = new AlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); + + @Getter + private static BiMap recipes = HashBiMap.create(); + + /** + * General case for creating an AlchemyArrayEffect for a given input. + * + * @param inputStack + * - Input item that is used to change the Alchemy Circle into + * the circle that you are making + * @param catalystStack + * - Catalyst item that, when right-clicked onto the array, will + * cause an effect + * @param arrayEffect + * - The effect that will be activated once the array is + * activated + * @param circleRenderer + * - Circle rendered when the array is passive - can be + * substituted for a special renderer + */ + public static void registerRecipe(ItemStack inputStack, @Nullable ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { + for (Entry entry : recipes.entrySet()) { + AlchemyArrayRecipe arrayRecipe = entry.getValue(); + if (arrayRecipe.doesInputMatchRecipe(inputStack)) { + AlchemyArrayEffect eff = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); + if (eff != null) { + return; // Recipe already exists! + } else { + arrayRecipe.catalystMap.put(catalystStack, arrayEffect); + if (circleRenderer != null) { + arrayRecipe.circleRenderer = circleRenderer; + } + return; + } + } + } + + if (circleRenderer == null) { + recipes.put(inputStack, new AlchemyArrayRecipe(inputStack, catalystStack, arrayEffect, defaultRenderer)); + } else { + recipes.put(inputStack, new AlchemyArrayRecipe(inputStack, catalystStack, arrayEffect, circleRenderer)); + } + + recipes.put(inputStack, new AlchemyArrayRecipe(inputStack, catalystStack, arrayEffect, circleRenderer)); + } + + public static void registerCraftingRecipe(ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack, AlchemyCircleRenderer circleRenderer) { + registerRecipe(inputStack, catalystStack, new AlchemyArrayEffectCrafting(outputStack), circleRenderer); + } + + public static void registerCraftingRecipe(ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack, ResourceLocation arrayResource) { + registerRecipe(inputStack, catalystStack, new AlchemyArrayEffectCrafting(outputStack), arrayResource); + } + + public static void registerCraftingRecipe(ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack) { + registerRecipe(inputStack, catalystStack, new AlchemyArrayEffectCrafting(outputStack)); + } + + public static void registerRecipe(ItemStack inputStack, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { + AlchemyCircleRenderer circleRenderer = null; + if (arrayResource == null) { + circleRenderer = defaultRenderer; + } else { + circleRenderer = new AlchemyCircleRenderer(arrayResource); + } + + registerRecipe(inputStack, catalystStack, arrayEffect, circleRenderer); + } + + public static void registerRecipe(ItemStack inputStack, ItemStack catalystStack, AlchemyArrayEffect arrayEffect) { + registerRecipe(inputStack, catalystStack, arrayEffect, (AlchemyCircleRenderer) null); + } + + public static void replaceAlchemyCircle(ItemStack inputStack, AlchemyCircleRenderer circleRenderer) { + if (circleRenderer == null) { + return; + } + for (Entry entry : recipes.entrySet()) { + AlchemyArrayRecipe arrayRecipe = entry.getValue(); + if (arrayRecipe.doesInputMatchRecipe(inputStack)) { + arrayRecipe.circleRenderer = circleRenderer; + } + } + } + + public static AlchemyArrayRecipe getRecipeForInput(ItemStack input) { + return recipes.get(input); + } + + public static AlchemyArrayEffect getAlchemyArrayEffect(ItemStack inputStack, @Nullable ItemStack catalystStack) { + for (Entry entry : recipes.entrySet()) { + AlchemyArrayRecipe arrayRecipe = entry.getValue(); + if (arrayRecipe.doesInputMatchRecipe(inputStack)) { + AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); + + return effect; // TODO: Decide if a copy should be returned. + } + } + + return null; + } + + @Getter + @ToString + @EqualsAndHashCode + public static class AlchemyArrayRecipe { + + public AlchemyCircleRenderer circleRenderer; + public final ItemStack inputStack; + public final BiMap catalystMap = HashBiMap.create(); + + public AlchemyArrayRecipe(ItemStack inputStack, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { + this.inputStack = inputStack; + + } + + /** + * Compares the inputed ItemStack to see if it matches with the recipe's + * inputStack. + * + * @param comparedStack + * @return - true if the ItemStack is a compatible item + */ + public boolean doesInputMatchRecipe(ItemStack comparedStack) { + if (comparedStack == null || this.inputStack == null) + return false; + + return this.inputStack.isItemEqual(comparedStack); + } + + /** + * Gets the actual AlchemyArrayEffect for the given catalyst. + * + * @param comparedStack + * The catalyst that is being checked + * @return + */ + public AlchemyArrayEffect getAlchemyArrayEffectForCatalyst(@Nullable ItemStack comparedStack) { + for (Entry entry : catalystMap.entrySet()) { + ItemStack catalystStack = entry.getKey(); + if (comparedStack == null && catalystStack == null) { + return entry.getValue(); + } + + if (comparedStack == null || catalystStack == null) { + continue; + } + + if (catalystStack.isItemEqual(comparedStack)) { + return entry.getValue(); + } + } + + return null; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/RenderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/client/render/RenderAlchemyArray.java index 6fcea4c3..a8ca4820 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/RenderAlchemyArray.java @@ -2,6 +2,7 @@ package WayofTime.bloodmagic.client.render; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; import WayofTime.bloodmagic.tile.TileAlchemyArray; @@ -12,7 +13,7 @@ public class RenderAlchemyArray extends TileEntitySpecialRenderer { if (tileEntity instanceof TileAlchemyArray) { - AlchemyCircleRenderer renderer = new AlchemyCircleRenderer(); //Temporary renderer for testing + AlchemyCircleRenderer renderer = new AlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); //Temporary renderer for testing renderer.renderAt(tileEntity, x, y, z); } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java index e4dbb32d..695b150f 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java @@ -1,19 +1,36 @@ package WayofTime.bloodmagic.registry; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fml.common.registry.GameRegistry; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.*; -import WayofTime.bloodmagic.item.block.*; +import WayofTime.bloodmagic.block.BlockAlchemyArray; +import WayofTime.bloodmagic.block.BlockAltar; +import WayofTime.bloodmagic.block.BlockBloodLight; +import WayofTime.bloodmagic.block.BlockBloodRune; +import WayofTime.bloodmagic.block.BlockBloodStoneBrick; +import WayofTime.bloodmagic.block.BlockCrystal; +import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.block.BlockPedestal; +import WayofTime.bloodmagic.block.BlockRitualController; +import WayofTime.bloodmagic.block.BlockRitualStone; +import WayofTime.bloodmagic.block.BlockTeleposer; +import WayofTime.bloodmagic.block.BlockTestSpellBlock; +import WayofTime.bloodmagic.item.block.ItemBlockBloodRune; +import WayofTime.bloodmagic.item.block.ItemBlockBloodStoneBrick; +import WayofTime.bloodmagic.item.block.ItemBlockCrystal; +import WayofTime.bloodmagic.item.block.ItemBlockPedestal; +import WayofTime.bloodmagic.item.block.ItemBlockRitualController; +import WayofTime.bloodmagic.item.block.ItemBlockRitualStone; +import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.tile.TileImperfectRitualStone; import WayofTime.bloodmagic.tile.TileMasterRitualStone; import WayofTime.bloodmagic.tile.TilePlinth; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; -import net.minecraft.block.Block; -import net.minecraft.item.ItemBlock; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fml.common.registry.GameRegistry; public class ModBlocks { public static Block altar; @@ -55,6 +72,7 @@ public class ModBlocks { GameRegistry.registerTileEntity(TileImperfectRitualStone.class, Constants.Mod.MODID + ":" + TileImperfectRitualStone.class.getSimpleName()); GameRegistry.registerTileEntity(TileMasterRitualStone.class, Constants.Mod.MODID + ":" + TileMasterRitualStone.class.getSimpleName()); GameRegistry.registerTileEntity(TilePlinth.class, Constants.Mod.MODID + ":" + TilePlinth.class.getSimpleName()); + GameRegistry.registerTileEntity(TileAlchemyArray.class, Constants.Mod.MODID + ":" + TileAlchemyArray.class.getSimpleName()); } public static void initRenders() { diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 48ed72b2..2d400ef0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,7 +1,45 @@ package WayofTime.bloodmagic.tile; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.util.ITickable; -public class TileAlchemyArray extends TileEntity{ +public class TileAlchemyArray extends TileInventory implements ITickable{ + + public TileAlchemyArray() { + super(2, "alchemyArray"); + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) { + super.readFromNBT(tagCompound); + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) { + super.writeToNBT(tagCompound); + } + + @Override + public void update() { + + } + + @Override + public Packet getDescriptionPacket() + { + NBTTagCompound nbttagcompound = new NBTTagCompound(); + writeToNBT(nbttagcompound); + return new S35PacketUpdateTileEntity(pos, this.getBlockMetadata(), nbttagcompound); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) + { + super.onDataPacket(net, packet); + readFromNBT(packet.getNbtCompound()); + } }