generated from tilera/1710mod
193 lines
7.9 KiB
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);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|