auracore/src/main/java/dev/tilera/auracore/mixins/MixinTileArcaneFurnace.java

193 lines
7.9 KiB
Java

package dev.tilera.auracore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import dev.tilera.auracore.api.Aspects;
import dev.tilera.auracore.aura.AuraManager;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.item.EntityXPOrb;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.util.MathHelper;
import thaumcraft.api.ThaumcraftApi;
import thaumcraft.api.TileThaumcraft;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.visnet.VisNetHandler;
import thaumcraft.common.config.ConfigBlocks;
import thaumcraft.common.tiles.TileArcaneFurnace;
@Mixin(TileArcaneFurnace.class)
public abstract class MixinTileArcaneFurnace extends TileThaumcraft {
@Shadow(remap = false)
private ItemStack[] furnaceItemStacks;
@Shadow(remap = false)
public int furnaceCookTime;
@Shadow(remap = false)
public int furnaceMaxCookTime;
@Shadow(remap = false)
public int speedyTime;
@Shadow(remap = false)
public int facingX;
@Shadow(remap = false)
public int facingZ;
@Shadow(remap = false)
protected abstract int getBellows();
@Shadow(remap = false)
protected abstract void getFacing();
@Shadow(remap = false)
protected abstract int calcCookTime();
@Shadow(remap = false)
public abstract int getSizeInventory();
@Shadow(remap = false)
protected abstract boolean canSmelt(int slotIn);
/**
* @author tilera
* @reason Use Vis from the aura
*/
@Overwrite
public void updateEntity() {
super.updateEntity();
if (this.facingX == -5) {
this.getFacing();
}
if (!super.worldObj.isRemote) {
boolean cookedflag = false;
if (this.furnaceCookTime > 0) {
--this.furnaceCookTime;
cookedflag = true;
}
if (cookedflag && this.speedyTime > 0) {
--this.speedyTime;
}
if (this.speedyTime <= 0) {
this.speedyTime = VisNetHandler.drainVis(super.worldObj, super.xCoord, super.yCoord, super.zCoord, Aspect.FIRE, 5);
}
if (this.furnaceMaxCookTime == 0) {
this.furnaceMaxCookTime = this.calcCookTime();
}
if (this.furnaceCookTime > this.furnaceMaxCookTime) {
this.furnaceCookTime = this.furnaceMaxCookTime;
}
int a;
if (this.furnaceCookTime == 0 && cookedflag) {
for(a = 0; a < this.getSizeInventory(); ++a) {
if (this.furnaceItemStacks[a] != null) {
ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[a]);
if (itemstack != null && AuraManager.decreaseClosestAura(this.worldObj, this.xCoord, this.yCoord, this.zCoord, 1)) {
this.ejectItem(itemstack.copy(), this.furnaceItemStacks[a]);
super.worldObj.addBlockEvent(super.xCoord, super.yCoord, super.zCoord, ConfigBlocks.blockArcaneFurnace, 3, 0);
--this.furnaceItemStacks[a].stackSize;
if (this.furnaceItemStacks[a].stackSize <= 0) {
this.furnaceItemStacks[a] = null;
}
break;
}
}
}
}
if (this.furnaceCookTime == 0 && !cookedflag) {
for(a = 0; a < this.getSizeInventory(); ++a) {
if (this.furnaceItemStacks[a] != null && this.canSmelt(a)) {
this.furnaceMaxCookTime = this.calcCookTime();
this.furnaceCookTime = this.furnaceMaxCookTime;
break;
}
}
}
}
}
/**
* @author tilera
* @reason Add flux to aura
*/
@Overwrite(remap = false)
public void ejectItem(ItemStack items, ItemStack furnaceItemStack) {
if (items != null) {
ItemStack bit = items.copy();
int bellows = this.getBellows();
float lx = 0.5F;
lx += (float)this.facingX * 1.2F;
float lz = 0.5F;
lz += (float)this.facingZ * 1.2F;
float mx = this.facingX == 0 ? (super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat()) * 0.03F : (float)this.facingX * 0.13F;
float mz = this.facingZ == 0 ? (super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat()) * 0.03F : (float)this.facingZ * 0.13F;
EntityItem entityitem = new EntityItem(super.worldObj, (double)((float)super.xCoord + lx), (double)((float)super.yCoord + 0.4F), (double)((float)super.zCoord + lz), items);
entityitem.motionX = (double)mx;
entityitem.motionZ = (double)mz;
entityitem.motionY = 0.0D;
super.worldObj.spawnEntityInWorld(entityitem);
if (ThaumcraftApi.getSmeltingBonus(furnaceItemStack) != null) {
ItemStack bonus = ThaumcraftApi.getSmeltingBonus(furnaceItemStack).copy();
if (bonus != null) {
if (bellows == 0) {
if (super.worldObj.rand.nextInt(4) == 0) {
++bonus.stackSize;
}
} else {
for(int a = 0; a < bellows; ++a) {
if (super.worldObj.rand.nextFloat() < 0.44F) {
++bonus.stackSize;
}
}
}
}
if (bonus != null && bonus.stackSize > 0) {
mx = this.facingX == 0 ? (super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat()) * 0.03F : (float)this.facingX * 0.13F;
mz = this.facingZ == 0 ? (super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat()) * 0.03F : (float)this.facingZ * 0.13F;
EntityItem entityitem2 = new EntityItem(super.worldObj, (double)((float)super.xCoord + lx), (double)((float)super.yCoord + 0.4F), (double)((float)super.zCoord + lz), bonus);
entityitem2.motionX = (double)mx;
entityitem2.motionZ = (double)mz;
entityitem2.motionY = 0.0D;
super.worldObj.spawnEntityInWorld(entityitem2);
}
}
if (this.worldObj.rand.nextInt(15 + bellows * 5) == 0) {
AuraManager.addFluxToClosest(this.worldObj, this.xCoord, this.yCoord, this.zCoord, this.worldObj.rand.nextBoolean() ? new AspectList().add(Aspect.FIRE, 1) : new AspectList().add(Aspects.EVIL, 1));
}
int var2 = items.stackSize;
float var3 = FurnaceRecipes.smelting().func_151398_b(bit);
int var4;
if (var3 == 0.0F) {
var2 = 0;
} else if (var3 < 1.0F) {
var4 = MathHelper.floor_float((float)var2 * var3);
if (var4 < MathHelper.ceiling_float_int((float)var2 * var3) && (float)Math.random() < (float)var2 * var3 - (float)var4) {
++var4;
}
var2 = var4;
}
while(var2 > 0) {
var4 = EntityXPOrb.getXPSplit(var2);
var2 -= var4;
EntityXPOrb xp = new EntityXPOrb(super.worldObj, (double)((float)super.xCoord + lx), (double)((float)super.yCoord + 0.4F), (double)((float)super.zCoord + lz), var4);
mx = this.facingX == 0 ? (super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat()) * 0.025F : (float)this.facingX * 0.13F;
mz = this.facingZ == 0 ? (super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat()) * 0.025F : (float)this.facingZ * 0.13F;
xp.motionX = (double)mx;
xp.motionZ = (double)mz;
xp.motionY = 0.0D;
super.worldObj.spawnEntityInWorld(xp);
}
}
}
}