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

@ -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;
}
}