auracore/src/main/java/dev/tilera/auracore/crafting/AuracoreCraftingManager.java

110 lines
4.3 KiB
Java

package dev.tilera.auracore.crafting;
import dev.tilera.auracore.api.AuracoreRecipes;
import dev.tilera.auracore.api.crafting.CrucibleRecipe;
import dev.tilera.auracore.api.crafting.IInfusionRecipe;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import thaumcraft.api.ThaumcraftApi;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.crafting.IArcaneRecipe;
import thaumcraft.common.config.ConfigBlocks;
import thaumcraft.common.lib.research.ResearchManager;
import thaumcraft.common.tiles.TileCrucible;
import thaumcraft.common.tiles.TileMagicWorkbench;
public class AuracoreCraftingManager {
public static IArcaneRecipe findMatchingArcaneRecipe(TileMagicWorkbench awb, EntityPlayer player) {
for (Object recipe : ThaumcraftApi.getCraftingRecipes()) {
if (recipe instanceof IArcaneRecipe && ((IArcaneRecipe)recipe).matches(awb, player.worldObj, player)) {
return (IArcaneRecipe) recipe;
}
}
return null;
}
public IInfusionRecipe findMatchingInfusionRecipe(TileMagicWorkbench inv, EntityPlayer pl) {
for (IInfusionRecipe recipe : AuracoreRecipes.getInfusionRecipes()) {
if (recipe.matches(inv, pl.worldObj, pl)) {
return recipe;
}
}
return null;
}
public static int getArcaneRecipeVisCost(IArcaneRecipe recipe, TileMagicWorkbench awb) {
if (recipe == null) return 0;
int sum = 0;
AspectList aspects = recipe.getAspects(awb);
for (Aspect aspect : aspects.getAspects()) {
if (aspect != null) sum += aspects.getAmount(aspect);
}
return sum;
}
public static TileMagicWorkbench createBridgeInventory(IInventory sourceInventory, int firstSlotIndex, int gridSize )
{
TileMagicWorkbench workbenchTile = new TileMagicWorkbench();
for( int i = 0; i < gridSize; i++ )
{
workbenchTile.setInventorySlotContentsSoftly( i, sourceInventory.getStackInSlot( i + firstSlotIndex ) );
}
return workbenchTile;
}
public static boolean performCrucibleCrafting(EntityPlayer player, TileCrucible tile) {
AspectList tags = new AspectList();
for (Aspect tag : tile.aspects.getAspects()) {
tags.add(tag, tile.aspects.getAmount(tag));
}
World world = tile.getWorldObj();
CrucibleRecipe recipe = AuracoreRecipes.getCrucibleRecipe(tags, tile);
ItemStack output = AuracoreRecipes.getCrucibleOutput(tags, tile, recipe);
if (output != null && isCrucibleCreationSuccessful(world, output, player) && !world.isRemote) {
tile.ejectItem(output);
world.addBlockEvent(tile.xCoord, tile.yCoord, tile.zCoord, ConfigBlocks.blockMetalDevice, 1, -1);
}
if (!world.isRemote) {
tile.spillRemnants();
}
return true;
}
public static boolean isCrucibleCreationSuccessful(World world, ItemStack item, EntityPlayer player) {
String key = AuracoreRecipes.getCrucibleRecipe((ItemStack)item).key;
boolean completed = ResearchManager.isResearchComplete(player.getDisplayName(), key);
float chance = 0.0f;
if (completed) {
return true;
}
return false;
//TODO: research
/*if (!ResearchManager.doesPlayerHaveRequisites(player.getDisplayName(), key)) {
return false;
}
ItemStack note = ResearchManager.createResearchNoteForPlayer(world, player, key);
if (note == null) {
if (!world.isRemote) {
player.func_70006_a("Your discover something, but you can't record your findings!");
}
} else if (ResearchManager.progressExperimentalResearch(world, key, note, Config.resExpChance + (int)Math.sqrt(item.stackSize * 8))) {
chance = ResearchManager.getData(note).getTotalProgress();
if (chance == 1.0f) {
note.setItemDamage(note.getItemDamage() + 64);
}
player.inventoryContainer.detectAndSendChanges();
if (!world.isRemote) {
player.func_70006_a("You've learned something new!");
}
}
return world.rand.nextFloat() < chance;*/
}
}