generated from tilera/1710mod
601 lines
23 KiB
Java
601 lines
23 KiB
Java
package net.anvilcraft.thaummach.tiles;
|
|
|
|
import java.util.List;
|
|
|
|
import dev.tilera.auracore.api.HelperLocation;
|
|
import dev.tilera.auracore.api.machine.IConnection;
|
|
import dev.tilera.auracore.aura.AuraManager;
|
|
import net.anvilcraft.thaummach.RecipesCrucible;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.entity.EntityLiving;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.item.EntityItem;
|
|
import net.minecraft.entity.monster.EntitySnowman;
|
|
import net.minecraft.entity.passive.EntityTameable;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.network.NetworkManager;
|
|
import net.minecraft.network.Packet;
|
|
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
|
|
import net.minecraft.potion.Potion;
|
|
import net.minecraft.potion.PotionEffect;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.DamageSource;
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
import thaumcraft.api.aspects.Aspect;
|
|
import thaumcraft.api.aspects.AspectList;
|
|
import thaumcraft.client.fx.particles.FXWisp;
|
|
import thaumcraft.common.entities.golems.EntityTravelingTrunk;
|
|
|
|
public class TileCrucible extends TileEntity implements IConnection {
|
|
public int smeltDelay;
|
|
public float pureVis = 0.0F;
|
|
public float taintedVis = 0.0F;
|
|
public float maxVis;
|
|
public int face = 3;
|
|
private short type;
|
|
private float conversion;
|
|
private float speed;
|
|
public int bellows = 0;
|
|
private int soundDelay = 25;
|
|
float pPure;
|
|
float pTaint;
|
|
int wait;
|
|
boolean updateNextPeriod;
|
|
public boolean isPowering = false;
|
|
|
|
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
|
super.readFromNBT(nbttagcompound);
|
|
this.pureVis = nbttagcompound.getFloat("pureVis");
|
|
this.taintedVis = nbttagcompound.getFloat("taintedVis");
|
|
this.type = nbttagcompound.getShort("type");
|
|
this.setTier(this.type);
|
|
this.bellows = nbttagcompound.getShort("bellows");
|
|
}
|
|
|
|
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
|
super.writeToNBT(nbttagcompound);
|
|
nbttagcompound.setFloat("pureVis", this.pureVis);
|
|
nbttagcompound.setFloat("taintedVis", this.taintedVis);
|
|
nbttagcompound.setShort("type", this.type);
|
|
nbttagcompound.setShort("bellows", (short) this.bellows);
|
|
}
|
|
|
|
@Override
|
|
public Packet getDescriptionPacket() {
|
|
NBTTagCompound nbt = new NBTTagCompound();
|
|
|
|
nbt.setFloat("pureVis", this.pureVis);
|
|
nbt.setFloat("taintedVis", this.taintedVis);
|
|
nbt.setShort("type", this.type);
|
|
nbt.setInteger("bellows", this.bellows);
|
|
|
|
return new S35PacketUpdateTileEntity(
|
|
this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), nbt
|
|
);
|
|
}
|
|
|
|
@Override
|
|
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
|
|
NBTTagCompound nbt = pkt.func_148857_g();
|
|
|
|
this.pureVis = nbt.getFloat("pureVis");
|
|
this.taintedVis = nbt.getFloat("taintedVis");
|
|
this.type = nbt.getShort("type");
|
|
this.bellows = nbt.getInteger("bellows");
|
|
|
|
this.worldObj.markBlockRangeForRenderUpdate(
|
|
this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord
|
|
);
|
|
}
|
|
|
|
public void setTier(short t) {
|
|
switch (t) {
|
|
case 1:
|
|
this.maxVis = 500.0F;
|
|
this.conversion = 0.5F;
|
|
this.speed = 0.25F;
|
|
this.type = 1;
|
|
break;
|
|
case 2:
|
|
this.maxVis = 600.0F;
|
|
this.conversion = 0.6F;
|
|
this.speed = 0.5F;
|
|
this.type = 2;
|
|
break;
|
|
case 3:
|
|
this.maxVis = 750.0F;
|
|
this.conversion = 0.7F;
|
|
this.speed = 0.75F;
|
|
this.type = 3;
|
|
break;
|
|
case 4:
|
|
this.maxVis = 750.0F;
|
|
this.conversion = 0.4F;
|
|
this.speed = 0.75F;
|
|
this.type = 4;
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void updateEntity() {
|
|
if (this.worldObj.isRemote)
|
|
return;
|
|
|
|
float totalVis = this.pureVis + this.taintedVis;
|
|
--this.smeltDelay;
|
|
--this.wait;
|
|
if (this.pPure != this.pureVis || this.pTaint != this.taintedVis) {
|
|
this.pTaint = this.taintedVis;
|
|
this.pPure = this.pureVis;
|
|
this.updateNextPeriod = true;
|
|
}
|
|
|
|
if (this.wait <= 0 && this.updateNextPeriod) {
|
|
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
|
this.updateNextPeriod = false;
|
|
this.wait = 10;
|
|
}
|
|
|
|
--this.soundDelay;
|
|
if (this.soundDelay <= 0) {
|
|
this.soundDelay = 15 + super.worldObj.rand.nextInt(15);
|
|
}
|
|
|
|
if (totalVis > this.maxVis) {
|
|
float overflowSplit
|
|
= Math.min((this.pureVis + this.taintedVis - this.maxVis) / 2.0F, 1.0F);
|
|
if (this.pureVis >= overflowSplit) {
|
|
this.pureVis -= overflowSplit;
|
|
}
|
|
|
|
if (overflowSplit >= 1.0F) {
|
|
if (this.taintedVis >= 1.0F) {
|
|
AuraManager.addTaintToClosest(
|
|
this.worldObj, this.xCoord, this.yCoord, this.zCoord, 1
|
|
);
|
|
--this.taintedVis;
|
|
FXWisp ef = new FXWisp(
|
|
super.worldObj,
|
|
(double) ((float) super.xCoord + super.worldObj.rand.nextFloat()),
|
|
(double) ((float) super.yCoord + 0.8F),
|
|
(double) ((float) super.zCoord + super.worldObj.rand.nextFloat()),
|
|
(double
|
|
) ((float) super.xCoord + 0.5F
|
|
+ (super.worldObj.rand.nextFloat()
|
|
- super.worldObj.rand.nextFloat())),
|
|
(double
|
|
) ((float) super.yCoord + 3.0F + super.worldObj.rand.nextFloat()),
|
|
(double
|
|
) ((float) super.zCoord + 0.5F
|
|
+ (super.worldObj.rand.nextFloat()
|
|
- super.worldObj.rand.nextFloat())),
|
|
0.5F,
|
|
5
|
|
);
|
|
Minecraft.getMinecraft().effectRenderer.addEffect(ef);
|
|
}
|
|
}
|
|
|
|
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
|
}
|
|
|
|
if (this.getBlockMetadata() == 1 || this.getBlockMetadata() == 2) {
|
|
boolean oldPower = this.isPowering;
|
|
if ((double) totalVis >= (double) this.maxVis * 0.9) {
|
|
this.isPowering = true;
|
|
} else {
|
|
this.isPowering = false;
|
|
}
|
|
|
|
if (oldPower != this.isPowering) {
|
|
for (int a = -1; a < 2; ++a) {
|
|
for (int b = -1; b < 2; ++b) {
|
|
for (int c = -1; c < 2; ++c) {
|
|
this.worldObj.markBlockForUpdate(
|
|
this.xCoord + a, this.yCoord + b, this.zCoord + c
|
|
);
|
|
this.worldObj.notifyBlocksOfNeighborChange(
|
|
this.xCoord + a,
|
|
this.yCoord + b,
|
|
this.zCoord + c,
|
|
Blocks.air
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
float tconv = 0.0f;
|
|
float sa;
|
|
float pureCook;
|
|
float taintCook;
|
|
boolean aboveFurnace;
|
|
boolean aboveBoostedFurnace;
|
|
if (this.smeltDelay <= 0 && this.getBlockMetadata() != 3) {
|
|
this.smeltDelay = 5;
|
|
List<EntityItem> list = this.getContents();
|
|
if (list.size() > 0) {
|
|
EntityItem entity
|
|
= (EntityItem) list.get(super.worldObj.rand.nextInt(list.size()));
|
|
ItemStack item = entity.getEntityItem();
|
|
if (this.canCook(item)) {
|
|
aboveFurnace = false;
|
|
aboveBoostedFurnace = false;
|
|
if (super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
) instanceof TileArcaneFurnace
|
|
&& ((TileArcaneFurnace) super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
))
|
|
.isBurning()) {
|
|
aboveFurnace = true;
|
|
if (((TileArcaneFurnace) super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
))
|
|
.boost) {
|
|
aboveBoostedFurnace = true;
|
|
}
|
|
}
|
|
|
|
tconv
|
|
= RecipesCrucible.smelting().getSmeltingResult(item, true, false);
|
|
sa = this.conversion;
|
|
if (aboveFurnace) {
|
|
sa += 0.1F
|
|
+ (float) ((TileArcaneFurnace) super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
))
|
|
.bellows
|
|
* 0.025F;
|
|
if (aboveBoostedFurnace) {
|
|
sa += 0.1F;
|
|
}
|
|
|
|
sa = Math.min(sa, 1.0F);
|
|
}
|
|
|
|
pureCook = tconv * sa;
|
|
taintCook = tconv - pureCook;
|
|
if (this.getBlockMetadata() != 2
|
|
|| !(totalVis + tconv > this.maxVis)) {
|
|
this.pureVis += pureCook;
|
|
this.taintedVis += taintCook;
|
|
float tspeed = this.speed + (float) this.bellows * 0.1F;
|
|
this.smeltDelay = 10 + Math.round(tconv / 5.0F / tspeed);
|
|
if (aboveFurnace) {
|
|
this.smeltDelay = (int
|
|
) ((float) this.smeltDelay
|
|
* (0.8F
|
|
- (float
|
|
) ((TileArcaneFurnace) super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
))
|
|
.bellows
|
|
* 0.05F));
|
|
}
|
|
|
|
AuraManager.addFluxToClosest(
|
|
this.worldObj,
|
|
this.xCoord,
|
|
this.yCoord,
|
|
this.zCoord,
|
|
new AspectList().add(Aspect.TAINT, (int) (tconv / 10.0))
|
|
);
|
|
|
|
--item.stackSize;
|
|
if (item.stackSize <= 0) {
|
|
entity.setDead();
|
|
}
|
|
|
|
this.worldObj.markBlockForUpdate(
|
|
this.xCoord, this.yCoord, this.zCoord
|
|
);
|
|
super.worldObj.spawnParticle(
|
|
"largesmoke",
|
|
entity.posX,
|
|
entity.posY,
|
|
entity.posZ,
|
|
0.0,
|
|
0.0,
|
|
0.0
|
|
);
|
|
super.worldObj.playSoundEffect(
|
|
(double) ((float) super.xCoord + 0.5F),
|
|
(double) ((float) super.yCoord + 0.5F),
|
|
(double) ((float) super.zCoord + 0.5F),
|
|
"thaumcraft:bubble",
|
|
0.25F,
|
|
0.9F + super.worldObj.rand.nextFloat() * 0.2F
|
|
);
|
|
}
|
|
} else {
|
|
entity.motionX = (double
|
|
) ((super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat())
|
|
* 0.2F);
|
|
entity.motionY
|
|
= (double) (0.2F + super.worldObj.rand.nextFloat() * 0.3F);
|
|
entity.motionZ = (double
|
|
) ((super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat())
|
|
* 0.2F);
|
|
super.worldObj.playSoundAtEntity(
|
|
entity,
|
|
"random.pop",
|
|
0.5F,
|
|
2.0F + super.worldObj.rand.nextFloat() * 0.45F
|
|
);
|
|
entity.delayBeforeCanPickup = 10;
|
|
entity.age = 0;
|
|
}
|
|
}
|
|
} else if (this.smeltDelay <= 0 && this.getBlockMetadata() == 3 && (float) Math.round(totalVis + 1.0F) <= this.maxVis) {
|
|
this.smeltDelay = 20 - this.bellows * 2;
|
|
List<EntityLivingBase> list = super.worldObj.getEntitiesWithinAABB(
|
|
EntityLivingBase.class,
|
|
AxisAlignedBB.getBoundingBox(
|
|
(double) (super.xCoord - 4),
|
|
(double) (super.yCoord - 4),
|
|
(double) (super.zCoord - 4),
|
|
(double) (super.xCoord + 5),
|
|
(double) (super.yCoord + 5),
|
|
(double) (super.zCoord + 5)
|
|
)
|
|
);
|
|
boolean sucked = false;
|
|
|
|
for (int a = 0; a < list.size(); ++a) {
|
|
if (!(list.get(a) instanceof EntityPlayer)
|
|
&& !(list.get(a) instanceof EntityTameable)
|
|
&& !(list.get(a) instanceof EntityTravelingTrunk)
|
|
&& ((EntityLiving) list.get(a)).hurtTime <= 0
|
|
&& ((EntityLiving) list.get(a)).deathTime <= 0) {
|
|
if (list.get(a) instanceof EntitySnowman) {
|
|
((EntityLiving) list.get(a)).spawnExplosionParticle();
|
|
((EntityLiving) list.get(a)).setDead();
|
|
}
|
|
|
|
aboveFurnace = false;
|
|
aboveBoostedFurnace = false;
|
|
if (super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
) instanceof TileArcaneFurnace
|
|
&& ((TileArcaneFurnace) super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
))
|
|
.isBurning()) {
|
|
aboveFurnace = true;
|
|
if (((TileArcaneFurnace) super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
))
|
|
.boost) {
|
|
aboveBoostedFurnace = true;
|
|
}
|
|
}
|
|
|
|
tconv = this.conversion;
|
|
if (aboveFurnace) {
|
|
tconv += 0.1F
|
|
+ (float) ((TileArcaneFurnace) super.worldObj.getTileEntity(
|
|
super.xCoord, super.yCoord - 1, super.zCoord
|
|
))
|
|
.bellows
|
|
* 0.025F;
|
|
if (aboveBoostedFurnace) {
|
|
tconv += 0.1F;
|
|
}
|
|
|
|
tconv = Math.min(tconv, 1.0F);
|
|
}
|
|
|
|
sa = 1.0F;
|
|
if (((EntityLiving) list.get(a)).isEntityUndead()) {
|
|
sa = 0.5F;
|
|
}
|
|
|
|
pureCook = sa * tconv;
|
|
taintCook = sa - pureCook;
|
|
this.pureVis += pureCook;
|
|
this.taintedVis += taintCook;
|
|
((EntityLiving) list.get(a))
|
|
.attackEntityFrom(DamageSource.generic, 1);
|
|
((EntityLiving) list.get(a))
|
|
.addPotionEffect(new PotionEffect(Potion.hunger.id, 3000, 0));
|
|
sucked = true;
|
|
|
|
for (int b = 0; b < 3; ++b) {
|
|
//FXWisp ef = new FXWisp(
|
|
// super.worldObj,
|
|
// ((EntityLiving) list.get(a)).posX
|
|
// + (double) super.worldObj.rand.nextFloat()
|
|
// - (double) super.worldObj.rand.nextFloat(),
|
|
// ((EntityLiving) list.get(a)).posY
|
|
// + (double) (((EntityLiving) list.get(a)).height / 2.0F)
|
|
// + (double) super.worldObj.rand.nextFloat()
|
|
// - (double) super.worldObj.rand.nextFloat(),
|
|
// ((EntityLiving) list.get(a)).posZ
|
|
// + (double) super.worldObj.rand.nextFloat()
|
|
// - (double) super.worldObj.rand.nextFloat(),
|
|
// (double) ((float) super.xCoord + 0.5F),
|
|
// (double) ((float) super.yCoord + 0.25F),
|
|
// (double) ((float) super.zCoord + 0.5F),
|
|
// 0.3F,
|
|
// 5
|
|
//);
|
|
//Minecraft.getMinecraft().effectRenderer.addEffect(ef);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sucked) {
|
|
AuraManager.addFluxToClosest(
|
|
this.worldObj,
|
|
this.xCoord,
|
|
this.yCoord,
|
|
this.zCoord,
|
|
new AspectList().add(Aspect.SOUL, 1)
|
|
);
|
|
|
|
this.face = 0;
|
|
super.worldObj.playSoundEffect(
|
|
(double) super.xCoord,
|
|
(double) super.yCoord,
|
|
(double) super.zCoord,
|
|
"thaumcraft:suck",
|
|
0.1F,
|
|
0.8F + super.worldObj.rand.nextFloat() * 0.3F
|
|
);
|
|
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
|
} else if (this.face < 3) {
|
|
++this.face;
|
|
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
|
}
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
private List<EntityItem> getContents() {
|
|
float t2x = 0.0F;
|
|
List<EntityItem> list = super.worldObj.getEntitiesWithinAABB(
|
|
EntityItem.class,
|
|
AxisAlignedBB.getBoundingBox(
|
|
(double) super.xCoord,
|
|
(double) ((float) super.yCoord + t2x),
|
|
(double) super.zCoord,
|
|
(double) super.xCoord + 1.0,
|
|
(double) super.yCoord + 1.0 - (double) t2x,
|
|
(double) super.zCoord + 1.0
|
|
)
|
|
);
|
|
return list;
|
|
}
|
|
|
|
public boolean ejectContents(EntityPlayer player) {
|
|
boolean ret = false;
|
|
List<EntityItem> list = this.getContents();
|
|
|
|
for (int a = 0; a < list.size(); ++a) {
|
|
((EntityItem) list.get(a)).noClip = true;
|
|
((EntityItem) list.get(a)).delayBeforeCanPickup = 0;
|
|
((EntityItem) list.get(a)).motionX
|
|
= (player.posX - ((EntityItem) list.get(a)).posX) * 0.20000000298023224;
|
|
((EntityItem) list.get(a)).motionY
|
|
= (player.posY - ((EntityItem) list.get(a)).posY) * 0.20000000298023224;
|
|
((EntityItem) list.get(a)).motionZ
|
|
= (player.posZ - ((EntityItem) list.get(a)).posZ) * 0.20000000298023224;
|
|
((EntityItem) list.get(a))
|
|
.moveEntity(
|
|
((EntityItem) list.get(a)).motionX,
|
|
((EntityItem) list.get(a)).motionY,
|
|
((EntityItem) list.get(a)).motionZ
|
|
);
|
|
((EntityItem) list.get(a)).noClip = false;
|
|
ret = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
private boolean canCook(ItemStack items) {
|
|
if (items == null) {
|
|
return false;
|
|
} else {
|
|
float cookvalue
|
|
= RecipesCrucible.smelting().getSmeltingResult(items, true, false);
|
|
return cookvalue != 0.0F;
|
|
}
|
|
}
|
|
|
|
public boolean getConnectable(ForgeDirection face) {
|
|
switch (face) {
|
|
case EAST:
|
|
case SOUTH:
|
|
case WEST:
|
|
case NORTH:
|
|
case DOWN:
|
|
return true;
|
|
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public boolean isVisSource() {
|
|
return true;
|
|
}
|
|
|
|
public boolean isVisConduit() {
|
|
return false;
|
|
}
|
|
|
|
public float getPureVis() {
|
|
return this.pureVis;
|
|
}
|
|
|
|
public void setPureVis(float amount) {
|
|
this.pureVis = amount;
|
|
}
|
|
|
|
public float getTaintedVis() {
|
|
return this.taintedVis;
|
|
}
|
|
|
|
public void setTaintedVis(float amount) {
|
|
this.taintedVis = amount;
|
|
}
|
|
|
|
public float getMaxVis() {
|
|
return this.maxVis;
|
|
}
|
|
|
|
public float[] subtractVis(float amount) {
|
|
float pureAmount = amount / 2.0F;
|
|
float taintAmount = amount / 2.0F;
|
|
float[] result = new float[] { 0.0F, 0.0F };
|
|
if (amount < 0.001F) {
|
|
return result;
|
|
} else {
|
|
if (this.pureVis < pureAmount) {
|
|
pureAmount = this.pureVis;
|
|
}
|
|
|
|
if (this.taintedVis < taintAmount) {
|
|
taintAmount = this.taintedVis;
|
|
}
|
|
|
|
if (pureAmount < amount / 2.0F && taintAmount == amount / 2.0F) {
|
|
taintAmount = Math.min(amount - pureAmount, this.taintedVis);
|
|
} else if (taintAmount < amount / 2.0F && pureAmount == amount / 2.0F) {
|
|
pureAmount = Math.min(amount - taintAmount, this.pureVis);
|
|
}
|
|
|
|
this.pureVis -= pureAmount;
|
|
this.taintedVis -= taintAmount;
|
|
result[0] = pureAmount;
|
|
result[1] = taintAmount;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
public int getVisSuction(HelperLocation loc) {
|
|
return 0;
|
|
}
|
|
|
|
public void setVisSuction(int suction) {}
|
|
|
|
public int getTaintSuction(HelperLocation loc) {
|
|
return 0;
|
|
}
|
|
|
|
public void setTaintSuction(int suction) {}
|
|
|
|
public void setSuction(int suction) {}
|
|
|
|
public int getSuction(HelperLocation loc) {
|
|
return 0;
|
|
}
|
|
}
|