Finished the Altar
This commit is contained in:
parent
ac5402df6b
commit
ab60e5f3fe
10 changed files with 415 additions and 65 deletions
|
@ -5,95 +5,336 @@ import WayofTime.bloodmagic.api.BloodMagicAPI;
|
|||
import WayofTime.bloodmagic.api.altar.AltarRecipe;
|
||||
import WayofTime.bloodmagic.api.altar.AltarUpgrade;
|
||||
import WayofTime.bloodmagic.api.altar.EnumAltarTier;
|
||||
import WayofTime.bloodmagic.api.altar.IBloodAltar;
|
||||
import WayofTime.bloodmagic.api.registry.AltarRecipeRegistry;
|
||||
import WayofTime.bloodmagic.block.BlockLifeEssence;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.server.gui.IUpdatePlayerListBox;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraftforge.fluids.*;
|
||||
|
||||
public class TileAltar extends TileInventory implements IUpdatePlayerListBox, IFluidTank, IFluidHandler
|
||||
{
|
||||
public class TileAltar extends TileInventory implements IBloodAltar, IUpdatePlayerListBox, IFluidTank, IFluidHandler {
|
||||
private int tier;
|
||||
private AltarUpgrade upgrade = new AltarUpgrade();
|
||||
private FluidStack fluid = new FluidStack(BloodMagicAPI.getLifeEssence(), 0);
|
||||
protected FluidStack fluidOutput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0);
|
||||
protected FluidStack fluidInput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0);
|
||||
private int capacity;
|
||||
|
||||
public TileAltar()
|
||||
{
|
||||
private int upgradeLevel;
|
||||
|
||||
private int resultID;
|
||||
private int resultDamage;
|
||||
private int liquidRequired; //mB
|
||||
private boolean canBeFilled;
|
||||
private int consumptionRate;
|
||||
private int drainRate;
|
||||
private float consumptionMultiplier;
|
||||
private float efficiencyMultiplier;
|
||||
private float sacrificeEfficiencyMultiplier;
|
||||
private float selfSacrificeEfficiencyMultiplier;
|
||||
private float capacityMultiplier;
|
||||
private float orbCapacityMultiplier;
|
||||
private float dislocationMultiplier;
|
||||
private int accelerationUpgrades;
|
||||
private boolean isUpgraded;
|
||||
private boolean isResultBlock;
|
||||
private int bufferCapacity;
|
||||
private int progress;
|
||||
|
||||
public boolean isActive;
|
||||
|
||||
private int lockdownDuration;
|
||||
private int demonBloodDuration;
|
||||
|
||||
private int cooldownAfterCrafting = 500;
|
||||
|
||||
public TileAltar() {
|
||||
super(1, "altar");
|
||||
|
||||
this.capacity = 10000;
|
||||
this.capacity = FluidContainerRegistry.BUCKET_VOLUME * 10;
|
||||
this.bufferCapacity = FluidContainerRegistry.BUCKET_VOLUME;
|
||||
this.resultID = 0;
|
||||
this.resultDamage = 0;
|
||||
this.isActive = false;
|
||||
this.consumptionRate = 0;
|
||||
this.drainRate = 0;
|
||||
this.consumptionMultiplier = 0;
|
||||
this.efficiencyMultiplier = 0;
|
||||
this.capacityMultiplier = 1;
|
||||
this.isUpgraded = false;
|
||||
this.isResultBlock = false;
|
||||
this.upgradeLevel = 0;
|
||||
this.progress = 0;
|
||||
this.lockdownDuration = 0;
|
||||
this.demonBloodDuration = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update()
|
||||
{
|
||||
if (getWorld().isRemote)
|
||||
{
|
||||
public void readFromNBT(NBTTagCompound par1NBTTagCompound) {
|
||||
super.readFromNBT(par1NBTTagCompound);
|
||||
|
||||
resultID = par1NBTTagCompound.getInteger("resultID");
|
||||
resultDamage = par1NBTTagCompound.getInteger("resultDamage");
|
||||
|
||||
if (!par1NBTTagCompound.hasKey("Empty")) {
|
||||
FluidStack fluid = this.fluid.loadFluidStackFromNBT(par1NBTTagCompound);
|
||||
|
||||
if (fluid != null) {
|
||||
setMainFluid(fluid);
|
||||
}
|
||||
|
||||
FluidStack fluidOut = new FluidStack(BloodMagicAPI.getLifeEssence(), par1NBTTagCompound.getInteger("outputAmount"));
|
||||
|
||||
if (fluidOut != null) {
|
||||
setOutputFluid(fluidOut);
|
||||
}
|
||||
|
||||
FluidStack fluidIn = new FluidStack(BloodMagicAPI.getLifeEssence(), par1NBTTagCompound.getInteger("inputAmount"));
|
||||
|
||||
if (fluidIn != null) {
|
||||
setInputFluid(fluidIn);
|
||||
}
|
||||
}
|
||||
|
||||
upgradeLevel = par1NBTTagCompound.getInteger("upgradeLevel");
|
||||
isActive = par1NBTTagCompound.getBoolean("isActive");
|
||||
liquidRequired = par1NBTTagCompound.getInteger("liquidRequired");
|
||||
canBeFilled = par1NBTTagCompound.getBoolean("canBeFilled");
|
||||
isUpgraded = par1NBTTagCompound.getBoolean("isUpgraded");
|
||||
consumptionRate = par1NBTTagCompound.getInteger("consumptionRate");
|
||||
drainRate = par1NBTTagCompound.getInteger("drainRate");
|
||||
consumptionMultiplier = par1NBTTagCompound.getFloat("consumptionMultiplier");
|
||||
efficiencyMultiplier = par1NBTTagCompound.getFloat("efficiencyMultiplier");
|
||||
selfSacrificeEfficiencyMultiplier = par1NBTTagCompound.getFloat("selfSacrificeEfficiencyMultiplier");
|
||||
sacrificeEfficiencyMultiplier = par1NBTTagCompound.getFloat("sacrificeEfficiencyMultiplier");
|
||||
capacityMultiplier = par1NBTTagCompound.getFloat("capacityMultiplier");
|
||||
orbCapacityMultiplier = par1NBTTagCompound.getFloat("orbCapacityMultiplier");
|
||||
dislocationMultiplier = par1NBTTagCompound.getFloat("dislocationMultiplier");
|
||||
capacity = par1NBTTagCompound.getInteger("capacity");
|
||||
bufferCapacity = par1NBTTagCompound.getInteger("bufferCapacity");
|
||||
progress = par1NBTTagCompound.getInteger("progress");
|
||||
isResultBlock = par1NBTTagCompound.getBoolean("isResultBlock");
|
||||
lockdownDuration = par1NBTTagCompound.getInteger("lockdownDuration");
|
||||
accelerationUpgrades = par1NBTTagCompound.getInteger("accelerationUpgrades");
|
||||
demonBloodDuration = par1NBTTagCompound.getInteger("demonBloodDuration");
|
||||
cooldownAfterCrafting = par1NBTTagCompound.getInteger("cooldownAfterCrafting");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound par1NBTTagCompound) {
|
||||
super.writeToNBT(par1NBTTagCompound);
|
||||
|
||||
par1NBTTagCompound.setInteger("resultID", resultID);
|
||||
par1NBTTagCompound.setInteger("resultDamage", resultDamage);
|
||||
|
||||
if (fluid != null) {
|
||||
fluid.writeToNBT(par1NBTTagCompound);
|
||||
} else {
|
||||
par1NBTTagCompound.setString("Empty", "");
|
||||
}
|
||||
|
||||
if (fluidOutput != null) {
|
||||
par1NBTTagCompound.setInteger("outputAmount", fluidOutput.amount);
|
||||
}
|
||||
|
||||
if (fluidInput != null) {
|
||||
par1NBTTagCompound.setInteger("inputAmount", fluidInput.amount);
|
||||
}
|
||||
|
||||
par1NBTTagCompound.setInteger("upgradeLevel", upgradeLevel);
|
||||
par1NBTTagCompound.setBoolean("isActive", isActive);
|
||||
par1NBTTagCompound.setInteger("liquidRequired", liquidRequired);
|
||||
par1NBTTagCompound.setBoolean("canBeFilled", canBeFilled);
|
||||
par1NBTTagCompound.setBoolean("isUpgraded", isUpgraded);
|
||||
par1NBTTagCompound.setInteger("consumptionRate", consumptionRate);
|
||||
par1NBTTagCompound.setInteger("drainRate", drainRate);
|
||||
par1NBTTagCompound.setFloat("consumptionMultiplier", consumptionMultiplier);
|
||||
par1NBTTagCompound.setFloat("efficiencyMultiplier", efficiencyMultiplier);
|
||||
par1NBTTagCompound.setFloat("sacrificeEfficiencyMultiplier", sacrificeEfficiencyMultiplier);
|
||||
par1NBTTagCompound.setFloat("selfSacrificeEfficiencyMultiplier", selfSacrificeEfficiencyMultiplier);
|
||||
par1NBTTagCompound.setBoolean("isResultBlock", isResultBlock);
|
||||
par1NBTTagCompound.setFloat("capacityMultiplier", capacityMultiplier);
|
||||
par1NBTTagCompound.setFloat("orbCapacityMultiplier", orbCapacityMultiplier);
|
||||
par1NBTTagCompound.setFloat("dislocationMultiplier", dislocationMultiplier);
|
||||
par1NBTTagCompound.setInteger("capacity", capacity);
|
||||
par1NBTTagCompound.setInteger("progress", progress);
|
||||
par1NBTTagCompound.setInteger("bufferCapacity", bufferCapacity);
|
||||
par1NBTTagCompound.setInteger("lockdownDuration", lockdownDuration);
|
||||
par1NBTTagCompound.setInteger("accelerationUpgrades", this.accelerationUpgrades);
|
||||
par1NBTTagCompound.setInteger("demonBloodDuration", demonBloodDuration);
|
||||
par1NBTTagCompound.setInteger("cooldownAfterCrafting", cooldownAfterCrafting);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
if (getWorld().isRemote) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (getWorld().getTotalWorldTime() % (Math.max(20 - getUpgrade().getSpeedCount(), 1)) == 0)
|
||||
{
|
||||
if (getWorld().getTotalWorldTime() % (Math.max(20 - getUpgrade().getSpeedCount(), 1)) == 0) {
|
||||
everySecond();
|
||||
}
|
||||
|
||||
if (getWorld().getTotalWorldTime() % 100 == 0)
|
||||
{
|
||||
if (getWorld().getTotalWorldTime() % 100 == 0) {
|
||||
everyFiveSeconds();
|
||||
}
|
||||
}
|
||||
|
||||
private void everySecond()
|
||||
{
|
||||
// Do recipes
|
||||
if (AltarRecipeRegistry.getRecipes().containsKey(getStackInSlot(0)))
|
||||
{
|
||||
AltarRecipe recipe = AltarRecipeRegistry.getRecipeForInput(getStackInSlot(0));
|
||||
private void everySecond() {
|
||||
startCycle();
|
||||
}
|
||||
|
||||
if (!(tier >= recipe.minTier))
|
||||
{
|
||||
return;
|
||||
private void everyFiveSeconds() {
|
||||
checkTier();
|
||||
}
|
||||
|
||||
public void startCycle() {
|
||||
if (worldObj != null) {
|
||||
worldObj.markBlockForUpdate(pos);
|
||||
}
|
||||
|
||||
if (fluid == null || fluid.amount <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (getStackInSlot(0) != null) {
|
||||
// Do recipes
|
||||
if (AltarRecipeRegistry.getRecipes().containsKey(getStackInSlot(0))) {
|
||||
AltarRecipe recipe = AltarRecipeRegistry.getRecipeForInput(getStackInSlot(0));
|
||||
|
||||
if (tier >= recipe.getMinTier()) {
|
||||
this.liquidRequired = recipe.getSyphon();
|
||||
// this.canBeFilled = recipe
|
||||
this.consumptionRate = recipe.getConsumeRate();
|
||||
this.drainRate = recipe.getDrainRate();
|
||||
this.isActive = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void everyFiveSeconds()
|
||||
{
|
||||
checkTier();
|
||||
}
|
||||
|
||||
private void checkTier()
|
||||
{
|
||||
private void checkTier() {
|
||||
// TODO - Write checking for tier stuff
|
||||
|
||||
EnumAltarTier tier = BloodAltar.getAltarTier(getWorld(), getPos());
|
||||
|
||||
if (tier.equals(EnumAltarTier.ONE))
|
||||
{
|
||||
if (tier.equals(EnumAltarTier.ONE)) {
|
||||
upgrade = new AltarUpgrade();
|
||||
return;
|
||||
} else {
|
||||
upgrade = BloodAltar.getUpgrades(worldObj, pos, tier);
|
||||
}
|
||||
|
||||
if (this.fluid.amount > this.capacity) {
|
||||
this.fluid.amount = this.capacity;
|
||||
}
|
||||
|
||||
worldObj.markBlockForUpdate(pos);
|
||||
}
|
||||
|
||||
public void sacrificialDaggerCall(int amount, boolean isSacrifice) {
|
||||
if (!isSacrifice && this.lockdownDuration > 0) {
|
||||
int amt = (int) Math.min(bufferCapacity - fluidInput.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount);
|
||||
fluidInput.amount += amt;
|
||||
} else {
|
||||
fluid.amount += Math.min(capacity - fluid.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount);
|
||||
}
|
||||
}
|
||||
|
||||
public TileAltar setUpgrade(AltarUpgrade upgrade)
|
||||
{
|
||||
@Override
|
||||
public boolean isItemValidForSlot(int slot, ItemStack itemstack) {
|
||||
return slot == 0;
|
||||
}
|
||||
|
||||
public TileAltar setUpgrade(AltarUpgrade upgrade) {
|
||||
this.upgrade = upgrade;
|
||||
return this;
|
||||
}
|
||||
|
||||
public AltarUpgrade getUpgrade()
|
||||
{
|
||||
public AltarUpgrade getUpgrade() {
|
||||
return upgrade;
|
||||
}
|
||||
|
||||
public TileAltar setTier(int tier)
|
||||
{
|
||||
public TileAltar setTier(int tier) {
|
||||
this.tier = tier;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCapacity() {
|
||||
return capacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCurrentBlood() {
|
||||
return getFluidAmount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTier() {
|
||||
return tier;
|
||||
return upgradeLevel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSacrificeMultiplier() {
|
||||
return sacrificeEfficiencyMultiplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSelfSacrificeMultiplier() {
|
||||
return selfSacrificeEfficiencyMultiplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getOrbMultiplier() {
|
||||
return orbCapacityMultiplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getDislocationMultiplier() {
|
||||
return dislocationMultiplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBufferCapacity() {
|
||||
return bufferCapacity;
|
||||
}
|
||||
|
||||
public void addToDemonBloodDuration(int dur) {
|
||||
this.demonBloodDuration += dur;
|
||||
}
|
||||
|
||||
public boolean hasDemonBlood() {
|
||||
return this.demonBloodDuration > 0;
|
||||
}
|
||||
|
||||
public void decrementDemonBlood() {
|
||||
this.demonBloodDuration = Math.max(0, this.demonBloodDuration - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void requestPauseAfterCrafting(int amount) {
|
||||
if (this.isActive) {
|
||||
this.cooldownAfterCrafting = amount;
|
||||
}
|
||||
}
|
||||
|
||||
public void setMainFluid(FluidStack fluid) {
|
||||
this.fluid = fluid;
|
||||
}
|
||||
|
||||
public void setOutputFluid(FluidStack fluid) {
|
||||
this.fluidOutput = fluid;
|
||||
}
|
||||
|
||||
public void setInputFluid(FluidStack fluid) {
|
||||
this.fluidInput = fluid;
|
||||
}
|
||||
|
||||
// IFluidHandler
|
||||
|
@ -140,11 +381,6 @@ public class TileAltar extends TileInventory implements IUpdatePlayerListBox, IF
|
|||
return fluid.amount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCapacity() {
|
||||
return capacity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidTankInfo getInfo() {
|
||||
return new FluidTankInfo(this);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue