Generated the initial infrastructure for Alchemy Array effects, which includes crafting. Needs to be hooked into by TileAlchemyArray.
This commit is contained in:
parent
073830a785
commit
63c3853776
|
@ -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);
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,8 +12,11 @@ import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
public class AlchemyCircleRenderer {
|
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) {
|
public void renderAt(TileEntity tile, double x, double y, double z) {
|
||||||
|
@ -28,7 +31,7 @@ public class AlchemyCircleRenderer {
|
||||||
float size = 1.0F;
|
float size = 1.0F;
|
||||||
|
|
||||||
// Bind the texture to the circle
|
// 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, 10242, 10497.0F);
|
||||||
GL11.glTexParameterf(3553, 10243, 10497.0F);
|
GL11.glTexParameterf(3553, 10243, 10497.0F);
|
||||||
|
@ -42,7 +45,7 @@ public class AlchemyCircleRenderer {
|
||||||
|
|
||||||
EnumFacing sideHit = EnumFacing.UP; // Specify which face this "circle"
|
EnumFacing sideHit = EnumFacing.UP; // Specify which face this "circle"
|
||||||
// is located on
|
// 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) {
|
switch (sideHit) {
|
||||||
case DOWN:
|
case DOWN:
|
||||||
|
|
|
@ -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<ItemStack, AlchemyArrayRecipe> 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<ItemStack, AlchemyArrayRecipe> 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<ItemStack, AlchemyArrayRecipe> 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<ItemStack, AlchemyArrayRecipe> 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<ItemStack, AlchemyArrayEffect> 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<ItemStack, AlchemyArrayEffect> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ package WayofTime.bloodmagic.client.render;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer;
|
import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer;
|
||||||
import WayofTime.bloodmagic.tile.TileAlchemyArray;
|
import WayofTime.bloodmagic.tile.TileAlchemyArray;
|
||||||
|
|
||||||
|
@ -12,7 +13,7 @@ public class RenderAlchemyArray extends TileEntitySpecialRenderer
|
||||||
{
|
{
|
||||||
if (tileEntity instanceof TileAlchemyArray)
|
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);
|
renderer.renderAt(tileEntity, x, y, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,36 @@
|
||||||
package WayofTime.bloodmagic.registry;
|
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.BloodMagic;
|
||||||
import WayofTime.bloodmagic.ConfigHandler;
|
import WayofTime.bloodmagic.ConfigHandler;
|
||||||
import WayofTime.bloodmagic.api.Constants;
|
import WayofTime.bloodmagic.api.Constants;
|
||||||
import WayofTime.bloodmagic.block.*;
|
import WayofTime.bloodmagic.block.BlockAlchemyArray;
|
||||||
import WayofTime.bloodmagic.item.block.*;
|
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.TileAltar;
|
||||||
import WayofTime.bloodmagic.tile.TileImperfectRitualStone;
|
import WayofTime.bloodmagic.tile.TileImperfectRitualStone;
|
||||||
import WayofTime.bloodmagic.tile.TileMasterRitualStone;
|
import WayofTime.bloodmagic.tile.TileMasterRitualStone;
|
||||||
import WayofTime.bloodmagic.tile.TilePlinth;
|
import WayofTime.bloodmagic.tile.TilePlinth;
|
||||||
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
|
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 class ModBlocks {
|
||||||
public static Block altar;
|
public static Block altar;
|
||||||
|
@ -55,6 +72,7 @@ public class ModBlocks {
|
||||||
GameRegistry.registerTileEntity(TileImperfectRitualStone.class, Constants.Mod.MODID + ":" + TileImperfectRitualStone.class.getSimpleName());
|
GameRegistry.registerTileEntity(TileImperfectRitualStone.class, Constants.Mod.MODID + ":" + TileImperfectRitualStone.class.getSimpleName());
|
||||||
GameRegistry.registerTileEntity(TileMasterRitualStone.class, Constants.Mod.MODID + ":" + TileMasterRitualStone.class.getSimpleName());
|
GameRegistry.registerTileEntity(TileMasterRitualStone.class, Constants.Mod.MODID + ":" + TileMasterRitualStone.class.getSimpleName());
|
||||||
GameRegistry.registerTileEntity(TilePlinth.class, Constants.Mod.MODID + ":" + TilePlinth.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() {
|
public static void initRenders() {
|
||||||
|
|
|
@ -1,7 +1,45 @@
|
||||||
package WayofTime.bloodmagic.tile;
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue