This repository has been archived on 2022-11-23. You can view files and clone it, but cannot push or open issues or pull requests.
arcane-seals/src/main/java/net/anvilcraft/arcaneseals/tiles/TileSeal.java

2649 lines
101 KiB
Java

package net.anvilcraft.arcaneseals.tiles;
import java.util.List;
import dev.tilera.auracore.api.AuraNode;
import dev.tilera.auracore.aura.AuraManager;
import dev.tilera.auracore.client.FXSparkle;
import dev.tilera.auracore.helper.Utils;
import net.anvilcraft.arcaneseals.utils.HelperLocation;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.IProjectile;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.item.EntityXPOrb;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.passive.EntityAnimal;
import net.minecraft.entity.passive.EntityTameable;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.IInventory;
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.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import thaumcraft.client.fx.WRVector3;
import thaumcraft.client.fx.bolt.FXLightningBolt;
import thaumcraft.client.fx.particles.FXScorch;
import thaumcraft.client.fx.particles.FXWisp;
public class TileSeal extends TileEntity {
public int delay = 0;
private int soundDelay = 0;
public int portalWindow = 0;
public boolean pOpen = false;
public float pSize = 0.0F;
//private int pDelay = 0;
public boolean worked;
public boolean isPowering = false;
public short orientation = -1;
public byte[] runes = new byte[] { -1, -1, -1 };
protected boolean gettingPower() {
return super.worldObj.isBlockIndirectlyGettingPowered(
super.xCoord, super.yCoord, super.zCoord
)
|| super.worldObj.isBlockIndirectlyGettingPowered(
super.xCoord, super.yCoord + 1, super.zCoord
);
}
@Override
public void updateEntity() {
if (this.delay <= 0) {
boolean oldPower = this.isPowering;
this.isPowering = false;
--this.soundDelay;
if (!this.worldObj.isRemote
&& (!this.gettingPower() || this.runes[0] == 0 && this.runes[1] == 4)) {
switch (this.runes[0]) {
case 0:
this.magicSeal();
break;
case 1:
this.airSeal();
break;
case 2:
this.waterSeal();
break;
case 3:
this.earthSeal();
break;
case 4:
this.fireSeal();
break;
case 5:
this.darkSeal();
}
}
if (oldPower != this.isPowering) {
HelperLocation loc = new HelperLocation(this, this.orientation);
int xx;
int yy;
int zz;
for (xx = -1; xx <= 1; ++xx) {
for (yy = -1; yy <= 1; ++yy) {
for (zz = -1; zz <= 1; ++zz) {
super.worldObj.markBlockForUpdate(
(int) loc.x + xx, (int) loc.y + yy, (int) loc.z + zz
);
}
}
}
super.worldObj.notifyBlocksOfNeighborChange(
(int) loc.x, (int) loc.y, (int) loc.z, Blocks.air
);
loc.moveBackwards(1.0);
for (xx = -1; xx <= 1; ++xx) {
for (yy = -1; yy <= 1; ++yy) {
for (zz = -1; zz <= 1; ++zz) {
super.worldObj.markBlockForUpdate(
(int) loc.x + xx, (int) loc.y + yy, (int) loc.z + zz
);
}
}
}
super.worldObj.notifyBlocksOfNeighborChange(
(int) loc.x, (int) loc.y, (int) loc.z, Blocks.air
);
}
}
if (this.delay > 0) {
--this.delay;
}
if (this.pOpen && (double) this.pSize < 1.4) {
this.pSize += 0.15F;
}
if (!this.pOpen && this.pSize > 0.0F || this.delay > 0 && this.pSize > 0.0F) {
this.pSize -= 0.25F;
}
if ((double) this.pSize > 1.4) {
this.pSize = 1.4F;
}
if (this.pSize < 0.0F) {
this.pSize = 0.0F;
}
}
@Override
public boolean canUpdate() {
return true;
}
private void magicSeal() {
switch (this.runes[1]) {
case -1:
this.magicBoost();
this.delay = 20;
break;
case 0:
switch (this.runes[2]) {
case -1:
this.magicBoost();
this.delay = 15;
return;
case 0:
this.magicBoost();
this.delay = 10;
return;
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 1:
// TODO: WTF
//SISpecialTile current
// = (SISpecialTile) mod_ThaumCraft.SpecialTileHM.get(Arrays.asList(
// super.xCoord,
// super.yCoord,
// super.zCoord,
// (byte) ModLoader.getMinecraftInstance().thePlayer.dimension,
// 0
// ));
//if (current == null) {
// SISpecialTile pd = new SISpecialTile(
// super.xCoord,
// super.yCoord,
// super.zCoord,
// this.runes[2],
// (byte) ModLoader.getMinecraftInstance().thePlayer.dimension,
// (byte) 0
// );
// mod_ThaumCraft.AddSpecialTileToList(pd);
//}
//this.handlePortals();
break;
case 2:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 3:
switch (this.runes[2]) {
case -1:
if (this.worldObj.isRemote) {
FXSparkle ef = new FXSparkle(
super.worldObj,
(double) this.sealX(false),
(double) this.sealY(false),
(double) this.sealZ(false),
(double
) ((float) super.xCoord + super.worldObj.rand.nextFloat()
),
(double
) ((float) super.yCoord + super.worldObj.rand.nextFloat()
),
(double
) ((float) super.zCoord + super.worldObj.rand.nextFloat()
),
1.0F,
super.worldObj.rand.nextBoolean() ? 0 : 3,
4
);
Minecraft.getMinecraft().effectRenderer.addEffect(ef);
this.delay = 5;
}
return;
case 3:
FXSparkle ef2 = new FXSparkle(
super.worldObj,
(double) this.sealX(false),
(double) this.sealY(false),
(double) this.sealZ(false),
(double
) ((float) super.xCoord + super.worldObj.rand.nextFloat()),
(double
) ((float) super.yCoord + super.worldObj.rand.nextFloat()),
(double
) ((float) super.zCoord + super.worldObj.rand.nextFloat()),
1.0F,
super.worldObj.rand.nextBoolean() ? 0 : 3,
4
);
Minecraft.getMinecraft().effectRenderer.addEffect(ef2);
this.delay = 5;
return;
default:
return;
}
case 4:
switch (this.runes[2]) {
case -1:
this.scan(3, true, true, true, true);
break;
case 0:
this.scan(6, false, true, false, false);
break;
case 1:
this.scan(9, true, true, true, true);
case 2:
default:
break;
case 3:
this.scan(6, false, false, true, false);
break;
case 4:
this.scan(6, true, false, false, false);
break;
case 5:
this.scan(6, false, false, false, true);
}
this.delay = 5;
case 5:
}
}
private void airSeal() {
switch (this.runes[1]) {
case -1:
this.pushEntity(false, true, true, 3, 0.03F);
this.delay = 2;
break;
case 0:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 1:
switch (this.runes[2]) {
case -1:
this.pushEntity(false, true, true, 5, 0.06F);
break;
case 0:
this.pushEntity(false, true, false, 7, 0.08F);
break;
case 1:
this.pushEntity(false, true, true, 7, 0.08F);
case 2:
case 4:
case 5:
default:
break;
case 3:
this.pushEntity(false, false, true, 7, 0.08F);
}
this.delay = 2;
break;
case 2:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 3:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 4:
this.shock();
this.delay = 8 + super.worldObj.rand.nextInt(3) - this.runeAmount(1) * 2;
break;
case 5:
label86:
switch (this.runes[2]) {
case -1:
this.pushEntity(true, true, true, 5, 0.06F);
break;
case 0:
this.pushEntity(true, true, false, 7, 0.08F);
break;
case 1:
this.pushEntity(true, true, true, 7, 0.08F);
case 2:
default:
break;
case 3:
this.pushEntity(true, false, true, 7, 0.08F);
break;
case 4:
this.pushEntity(true, true, true, 6, 0.07F);
List<Entity> list = this.getEntities(
super.worldObj, 0.0F, this.orientation, false
);
int a = 0;
while (true) {
if (a >= list.size()) {
break label86;
}
Entity entity = (Entity) list.get(a);
if (!(entity instanceof EntityPlayer)
/*&& !(entity instanceof EntityTravelingTrunk)*/) {
entity.attackEntityFrom(DamageSource.generic, 1);
// TODO: server or client side?
net.anvilcraft.arcaneseals.utils.UtilsFX.poof(
super.worldObj,
(float) entity.posX - 0.5F,
(float) entity.posY - 0.5F + entity.getEyeHeight(),
(float) entity.posZ - 0.5F
);
super.worldObj.playSoundEffect(
(double) super.xCoord,
(double) super.yCoord,
(double) super.zCoord,
// TODO: 99% wrong sound ID
"random.fizz",
0.5F,
2.0F + super.worldObj.rand.nextFloat() * 0.4F
);
}
++a;
}
case 5:
this.pushEntity(true, false, true, 6, 0.04F);
List<Entity> list2 = this.getEntities(
super.worldObj, 0.2F, this.orientation, false
);
for (int b = 0; b < list2.size(); ++b) {
Entity entity = (Entity) list2.get(b);
if (entity instanceof EntityItem) {
this.attemptItemPickup((EntityItem) entity);
}
}
}
this.delay = 2;
}
}
private void waterSeal() {
switch (this.runes[1]) {
case -1:
this.hydrate(3);
this.delay = 20;
break;
case 0:
switch (this.runes[2]) {
case -1:
this.heal(3, true, true, true, false);
this.delay = 20;
return;
case 0:
this.heal(5, false, false, true, false);
this.delay = 20;
return;
case 1:
this.heal(5, true, true, true, false);
this.delay = 10;
return;
case 2:
this.heal(5, true, true, true, true);
this.delay = 20;
return;
case 3:
this.heal(5, false, true, false, false);
this.delay = 20;
return;
case 4:
this.heal(5, true, true, true, false);
this.delay = 20;
return;
case 5:
this.heal(5, true, false, false, false);
this.delay = 20;
return;
default:
return;
}
case 1:
switch (this.runes[2]) {
case -1:
this.freeze(6, true, true, false);
return;
case 0:
this.freeze(10, true, false, false);
return;
case 1:
this.freeze(10, true, true, false);
return;
case 2:
this.freeze(15, true, false, false);
return;
case 3:
this.freeze(10, false, true, false);
return;
case 4:
this.freeze(10, true, true, false);
return;
case 5:
this.freeze(10, false, false, true);
return;
default:
return;
}
case 2:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 3:
switch (this.runes[2]) {
case -1:
this.fertilize(3);
this.delay = 30;
return;
case 0:
case 2:
case 4:
case 5:
default:
return;
case 1:
this.fertilize(3);
this.delay = 15;
return;
case 3:
this.fertilize(6);
this.delay = 30;
return;
}
case 4:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 5:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
}
}
}
private void earthSeal() {
switch (this.runes[1]) {
case -1:
this.till(3);
this.delay = 20;
break;
case 0:
switch (this.runes[2]) {
case -1:
//this.replant(6);
this.delay = 40;
return;
case 0:
case 2:
case 4:
case 5:
default:
return;
case 1:
//this.replant(6);
this.delay = 20;
return;
case 3:
//this.replant(12);
this.delay = 40;
return;
}
case 1:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 2:
switch (this.runes[2]) {
case -1:
this.harvest(3);
this.delay = 20;
return;
case 0:
case 2:
case 4:
case 5:
default:
return;
case 1:
this.harvest(3);
this.delay = 10;
return;
case 3:
this.harvest(6);
this.delay = 20;
return;
}
case 3:
switch (this.runes[2]) {
case -1:
this.till(3);
this.delay = 20;
return;
case 0:
case 2:
case 4:
case 5:
default:
return;
case 1:
this.till(3);
this.delay = 10;
return;
case 3:
this.till(6);
this.delay = 20;
return;
}
case 4:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 5:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
}
}
}
private void fireSeal() {
switch (this.runes[1]) {
case -1:
this.scorch(4, 1, true, true, false);
break;
case 0:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 1:
switch (this.runes[2]) {
case -1:
this.beam(6, 1, true, false, true, false, 6.0F, 2.0F);
this.delay = 5;
return;
case 0:
case 2:
case 3:
case 5:
default:
return;
case 1:
this.beam(9, 2, true, true, true, false, 9.0F, 2.0F);
this.delay = 5;
return;
case 4:
this.beam(9, 3, true, false, true, true, 9.0F, 3.0F);
this.delay = 5;
return;
}
case 2:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 3:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 4:
switch (this.runes[2]) {
case -1:
this.scorch(5, 2, true, true, false);
return;
case 0:
this.scorch(7, 3, true, false, false);
return;
case 1:
this.scorch(8, 3, true, true, false);
return;
case 2:
this.scorch(6, 6, true, true, false);
return;
case 3:
this.scorch(7, 3, false, true, false);
return;
case 4:
this.scorch(7, 3, true, true, false);
return;
case 5:
this.scorch(7, 3, false, false, true);
return;
default:
return;
}
case 5:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
}
}
}
private void darkSeal() {
switch (this.runes[1]) {
case -1:
default:
break;
case 0:
switch (this.runes[2]) {
case -1:
this.nullifyAura();
this.delay = 100;
return;
case 0:
this.nullifyAura();
this.delay = 80;
return;
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 1:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 2:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 3:
switch (this.runes[2]) {
case -1:
this.preventSpawn(6);
return;
case 0:
case 1:
case 2:
case 4:
case 5:
default:
return;
case 3:
this.preventSpawn(12);
return;
}
case 4:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
default:
return;
}
case 5:
switch (this.runes[2]) {
case -1:
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
}
}
}
private void nullifyAura() {
if (super.worldObj.isRemote)
return;
int nodeId = AuraManager.getClosestAuraWithinRange(
super.worldObj, super.xCoord, super.yCoord, super.zCoord, 512
);
if (nodeId < 0)
return;
AuraNode node = AuraManager.getNode(nodeId);
if (node.level > 0 /* && node.taint > 0*/) {
AuraManager.addRandomFlux(super.worldObj, node, 1);
AuraManager.queueNodeChanges(nodeId, -1, 0, false, null, 0, 0, 0);
FXSparkle ef = new FXSparkle(
super.worldObj,
(double) ((float) super.xCoord + super.worldObj.rand.nextFloat()),
(double) ((float) super.yCoord + super.worldObj.rand.nextFloat()),
(double) ((float) super.zCoord + super.worldObj.rand.nextFloat()),
2.0F,
5,
5
);
Minecraft.getMinecraft().effectRenderer.addEffect(ef);
}
}
private void preventSpawn(int range) {
List<Entity> list
= this.getEntitiesSorted(super.worldObj, range, this.orientation, true);
for (int a = 0; a < list.size(); ++a) {
Entity entity = (Entity) list.get(a);
if (entity instanceof EntityMob && ((EntityMob) entity).ticksExisted < 5) {
entity.setDead();
}
}
}
private boolean
scan(int range, boolean items, boolean mobs, boolean animals, boolean pvp) {
if (super.worldObj.isRemote)
return false;
boolean foundsomething = false;
List<Entity> list
= this.getEntitiesSorted(super.worldObj, range, this.orientation, true);
int q;
for (q = 0; q < list.size(); ++q) {
Entity entity = (Entity) list.get(q);
if (items && entity instanceof EntityItem
|| animals && entity instanceof EntityAnimal
|| mobs && (entity instanceof EntityMob || entity instanceof IMob)
|| pvp && entity instanceof EntityPlayer) {
this.worked = true;
foundsomething = true;
break;
}
}
this.isPowering = foundsomething;
if (foundsomething) {
q = Minecraft.getMinecraft().gameSettings.fancyGraphics ? 6 : 3;
for (int a = 0; a < q; ++a) {
FXWisp ef = new FXWisp(
super.worldObj,
(double) this.sealX(false),
(double) this.sealY(false),
(double) this.sealZ(false),
(double) ((float) super.xCoord + super.worldObj.rand.nextFloat()),
(double) ((float) super.yCoord + super.worldObj.rand.nextFloat()),
(double) ((float) super.zCoord + super.worldObj.rand.nextFloat()),
0.1F,
4
);
Minecraft.getMinecraft().effectRenderer.addEffect(ef);
}
}
return false;
}
private boolean freeze(int range, boolean mobs, boolean animals, boolean pvp) {
if (super.worldObj.isRemote)
return false;
boolean didsomething = false;
List<Entity> list
= this.getEntitiesSorted(super.worldObj, range, this.orientation, true);
for (int a = 0; a < list.size(); ++a) {
Entity entity = (Entity) list.get(a);
if (entity instanceof EntityLivingBase
&& (animals && entity instanceof EntityAnimal
&& !(entity instanceof EntityTameable)
|| mobs && (entity instanceof EntityMob || entity instanceof IMob)
|| pvp && entity instanceof EntityPlayer)) {
entity.motionX *= 0.05;
entity.motionY *= 0.05;
entity.motionZ *= 0.05;
if (this.runes[2] == 1) {
entity.motionY += 0.05999999865889549;
entity.onGround = false;
}
// TODO: implement FXFreeze
//for (int repeat = 0; repeat < 3; ++repeat) {
// FXFreeze ef = new FXFreeze(
// super.worldObj,
// this.sealX(false),
// this.sealY(false),
// this.sealZ(false),
// entity
// );
// ModLoader.getMinecraftInstance().effectRenderer.addEffect(ef);
//}
this.worked = true;
didsomething = true;
if (this.runes[2] != 4) {
break;
}
}
}
if (this.soundDelay <= 0 && didsomething) {
super.worldObj.playSoundEffect(
(double) ((float) super.xCoord + 0.5F),
(double) ((float) super.yCoord + 0.5F),
(double) ((float) super.zCoord + 0.5F),
"thaumcraft.wind",
0.2F,
0.9F + super.worldObj.rand.nextFloat() * 0.1F
);
this.soundDelay = 25;
}
return false;
}
private boolean fertilize(int range) {
if (super.worldObj.isRemote)
return false;
int xm = 0;
int xp = 0;
int ym = 0;
int yp = 0;
int zm = 0;
int zp = 0;
if (this.orientation == 0) {
xm = zm = -range;
zp = range;
xp = range;
ym = -(range * 2);
} else if (this.orientation == 1) {
xm = zm = -range;
zp = range;
xp = range;
yp = range * 2;
} else if (this.orientation == 2) {
xm = ym = -range;
yp = range;
xp = range;
zm = -(range * 2);
} else if (this.orientation == 3) {
xm = ym = -range;
yp = range;
xp = range;
zp = range * 2;
} else if (this.orientation == 4) {
zm = ym = -range;
yp = range;
zp = range;
xm = -(range * 2);
} else if (this.orientation == 5) {
zm = ym = -range;
yp = range;
zp = range;
xp = range * 2;
}
for (int x = xm; x <= xp; ++x) {
for (int y = ym; y <= yp; ++y) {
for (int z = zm; z <= zp; ++z) {
if (super.worldObj.getBlockLightValue(
super.xCoord + x, super.yCoord + y + 1, super.zCoord + z
) >= 8
&& super.yCoord + y + 1 <= super.worldObj.getHeight()
&& super.yCoord + y - 1 >= 0) {
if (Utils.useBonemealAtLoc(
super.worldObj,
super.xCoord + x,
super.yCoord + y,
super.zCoord + z
)) {
net.anvilcraft.arcaneseals.utils.UtilsFX.poofUpwards(
super.worldObj,
super.xCoord + x,
super.yCoord + y,
super.zCoord + z,
3
);
}
}
}
}
}
return false;
}
private boolean harvest(int range) {
int xm = 0;
int xp = 0;
int ym = 0;
int yp = 0;
int zm = 0;
int zp = 0;
if (this.orientation == 0) {
xm = zm = -range;
zp = range;
xp = range;
ym = -(range * 2);
} else if (this.orientation == 1) {
xm = zm = -range;
zp = range;
xp = range;
yp = range * 2;
} else if (this.orientation == 2) {
xm = ym = -range;
yp = range;
xp = range;
zm = -(range * 2);
} else if (this.orientation == 3) {
xm = ym = -range;
yp = range;
xp = range;
zp = range * 2;
} else if (this.orientation == 4) {
zm = ym = -range;
yp = range;
zp = range;
xm = -(range * 2);
} else if (this.orientation == 5) {
zm = ym = -range;
yp = range;
zp = range;
xp = range * 2;
}
for (int x = xm; x <= xp; ++x) {
for (int y = ym; y <= yp; ++y) {
for (int z = zm; z <= zp; ++z) {
if (super.yCoord + y + 1 <= super.worldObj.getHeight()
&& super.yCoord + y - 1 >= 0) {
// TODO: alter ne
//int cbID = super.worldObj.getBlockId(
// super.xCoord + x, super.yCoord + y, super.zCoord + z
//);
//super.worldObj.getBlockId(
// super.xCoord + x, super.yCoord + y + 1, super.zCoord + z
//);
//int bbID = super.worldObj.getBlockId(
// super.xCoord + x, super.yCoord + y - 1, super.zCoord + z
//);
//TileEntity te = super.worldObj.getBlockTileEntity(
// super.xCoord + x, super.yCoord + y - 1, super.zCoord + z
//);
//if (super.worldObj.rand.nextInt(10) == 0) {
// if (cbID == Block.crops.blockID
// && super.worldObj.getBlockMetadata(
// super.xCoord + x,
// super.yCoord + y,
// super.zCoord + z
// ) == 7
// || cbID == Block.melon.blockID
// || cbID == Block.tallGrass.blockID
// || cbID == Block.pumpkin.blockID
// || cbID == Block.plantYellow.blockID
// || cbID == Block.plantRed.blockID
// || cbID == flaxId
// && super.worldObj.getBlockMetadata(
// super.xCoord + x,
// super.yCoord + y,
// super.zCoord + z
// ) == 4
// || cbID == Block.plantRed.blockID
// || cbID == Block.reed.blockID
// && bbID == Block.reed.blockID
// || cbID == Block.cactus.blockID
// && bbID == Block.cactus.blockID) {
// Block.blocksList[cbID].dropBlockAsItem(
// super.worldObj,
// super.xCoord + x,
// super.yCoord + y,
// super.zCoord + z,
// super.worldObj.getBlockMetadata(
// super.xCoord + x,
// super.yCoord + y,
// super.zCoord + z
// ),
// 0
// );
// super.worldObj.setBlockWithNotify(
// super.xCoord + x,
// super.yCoord + y,
// super.zCoord + z,
// 0
// );
// ThaumCraftCore.poof(
// super.worldObj,
// (float) (super.xCoord + x),
// (float) (super.yCoord + y),
// (float) (super.zCoord + z)
// );
// this.worked = true;
// return true;
// }
// if (te != null && te instanceof TECrop) {
// TECrop tec = (TECrop) te;
// if (tec.id != -1 && tec.harvest(false)) {
// ThaumCraftCore.poof(
// super.worldObj,
// (float) (super.xCoord + x),
// (float) (super.yCoord + y),
// (float) (super.zCoord + z)
// );
// this.worked = true;
// return true;
// }
// }
//}
}
}
}
}
return false;
}
private boolean hydrate(int range) {
int xm = 0;
int xp = 0;
int ym = 0;
int yp = 0;
int zm = 0;
int zp = 0;
if (this.orientation == 0) {
xm = zm = -range;
zp = range;
xp = range;
ym = -(range * 2);
} else if (this.orientation == 1) {
xm = zm = -range;
zp = range;
xp = range;
yp = range * 2;
} else if (this.orientation == 2) {
xm = ym = -range;
yp = range;
xp = range;
zm = -(range * 2);
} else if (this.orientation == 3) {
xm = ym = -range;
yp = range;
xp = range;
zp = range * 2;
} else if (this.orientation == 4) {
zm = ym = -range;
yp = range;
zp = range;
xm = -(range * 2);
} else if (this.orientation == 5) {
zm = ym = -range;
yp = range;
zp = range;
xp = range * 2;
}
for (int x = xm; x <= xp; ++x) {
for (int y = ym; y <= yp; ++y) {
for (int z = zm; z <= zp; ++z) {
if (super.yCoord + y <= super.worldObj.getHeight()
&& super.yCoord + y >= 0) {
Block cbID = super.worldObj.getBlock(
super.xCoord + x, super.yCoord + y, super.zCoord + z
);
int md = super.worldObj.getBlockMetadata(
super.xCoord + x, super.yCoord + y, super.zCoord + z
);
if (cbID == Blocks.farmland && md != 7
&& super.worldObj.rand.nextInt(10) == 0) {
super.worldObj.setBlockMetadataWithNotify(
super.xCoord + x, super.yCoord + y, super.zCoord + z, 7, 3
);
net.anvilcraft.arcaneseals.utils.UtilsFX.sparkleDown(
super.worldObj,
super.xCoord + x,
super.yCoord + y + 1,
super.zCoord + z,
2
);
this.worked = true;
return true;
}
}
}
}
}
return false;
}
// TODO: implement plant stuff
//private boolean replant(int range) {
// int xm = 0;
// int xp = 0;
// int ym = 0;
// int yp = 0;
// int zm = 0;
// int zp = 0;
// if (this.orientation == 0) {
// xm = zm = -range;
// zp = range;
// xp = range;
// ym = -(range * 2);
// } else if (this.orientation == 1) {
// xm = zm = -range;
// zp = range;
// xp = range;
// yp = range * 2;
// } else if (this.orientation == 2) {
// xm = ym = -range;
// yp = range;
// xp = range;
// zm = -(range * 2);
// } else if (this.orientation == 3) {
// xm = ym = -range;
// yp = range;
// xp = range;
// zp = range * 2;
// } else if (this.orientation == 4) {
// zm = ym = -range;
// yp = range;
// zp = range;
// xm = -(range * 2);
// } else if (this.orientation == 5) {
// zm = ym = -range;
// yp = range;
// zp = range;
// xp = range * 2;
// }
// for (int x = xm; x <= xp; ++x) {
// for (int y = ym; y <= yp; ++y) {
// for (int z = zm; z <= zp; ++z) {
// if (super.yCoord + y + 1 <= super.worldObj.getHeight()
// && super.yCoord + y >= 0) {
// Block cbID = super.worldObj.getBlock(
// super.xCoord + x, super.yCoord + y, super.zCoord + z
// );
// super.worldObj.getBlockMetadata(
// super.xCoord + x, super.yCoord + y, super.zCoord + z
// );
// if (cbID == Blocks.farmland
// && super.worldObj.isAirBlock(
// super.xCoord + x, super.yCoord + y + 1, super.zCoord + z
// )
// && super.worldObj.rand.nextInt(10) == 0 && this.fetchSeed())
// { super.worldObj.setBlockAndMetadataWithNotify(
// super.xCoord + x,
// super.yCoord + y + 1,
// super.zCoord + z,
// Blocks.crops.blockID,
// 0
// );
// ThaumCraftCore.poofUpwards(
// super.worldObj,
// super.xCoord + x,
// super.yCoord + y + 1,
// super.zCoord + z,
// 0
// );
// this.worked = true;
// return true;
// }
// }
// }
// }
// }
// return false;
//}
//private boolean fetchSeed() {
// for (int x = -2; x <= 2; ++x) {
// for (int y = -2; y <= 2; ++y) {
// for (int z = -2; z <= 2; ++z) {
// if ((x != 0 || y != 0 || z != 0) && super.yCoord + y >= 0) {
// TileEntity block = super.worldObj.getBlockTileEntity(
// super.xCoord + x, super.yCoord + y, super.zCoord + z
// );
// if (block instanceof IInventory) {
// IInventory chest = (IInventory) block;
// for (int a = 0; a < chest.getSizeInventory(); ++a) {
// if (chest.getStackInSlot(a) != null
// && chest.getStackInSlot(a).getItem().shiftedIndex
// == Item.seeds.shiftedIndex) {
// chest.decrStackSize(a, 1);
// ThaumCraftCore.poofGood(
// super.worldObj,
// (float) block.xCoord,
// (float) block.yCoord,
// (float) block.zCoord
// );
// return true;
// }
// }
// }
// }
// }
// }
// }
// return false;
//}
private boolean till(int range) {
int xm = 0;
int xp = 0;
int ym = 0;
int yp = 0;
int zm = 0;
int zp = 0;
if (this.orientation == 0) {
xm = zm = -range;
zp = range;
xp = range;
ym = -(range * 2);
} else if (this.orientation == 1) {
xm = zm = -range;
zp = range;
xp = range;
yp = range * 2;
} else if (this.orientation == 2) {
xm = ym = -range;
yp = range;
xp = range;
zm = -(range * 2);
} else if (this.orientation == 3) {
xm = ym = -range;
yp = range;
xp = range;
zp = range * 2;
} else if (this.orientation == 4) {
zm = ym = -range;
yp = range;
zp = range;
xm = -(range * 2);
} else if (this.orientation == 5) {
zm = ym = -range;
yp = range;
zp = range;
xp = range * 2;
}
for (int x = xm; x <= xp; ++x) {
for (int y = ym; y <= yp; ++y) {
for (int z = zm; z <= zp; ++z) {
if (super.yCoord + y <= super.worldObj.getHeight()
&& super.yCoord + y >= 0) {
Block cbID = super.worldObj.getBlock(
super.xCoord + x, super.yCoord + y, super.zCoord + z
);
Block tbID = super.worldObj.getBlock(
super.xCoord + x, super.yCoord + y + 1, super.zCoord + z
);
if ((cbID == Blocks.dirt || cbID == Blocks.grass)
&& tbID == Blocks.air
&& super.worldObj.rand.nextInt(10) == 0) {
super.worldObj.setBlock(
super.xCoord + x,
super.yCoord + y,
super.zCoord + z,
Blocks.farmland,
0,
3
);
net.anvilcraft.arcaneseals.utils.UtilsFX.sparkleUp(
super.worldObj,
super.xCoord + x,
super.yCoord + y + 1,
super.zCoord + z,
3
);
this.worked = true;
return true;
}
}
}
}
}
return false;
}
private void magicBoost() {
int auraId = AuraManager.getClosestAuraWithinRange(
super.worldObj, super.xCoord, super.yCoord, super.zCoord, 512
);
if (auraId < 0)
return;
// TODO: WTF
//int auraX = super.xCoord >> 4;
//int auraZ = super.zCoord >> 4;
//SIAuraChunk ac = (SIAuraChunk) mod_ThaumCraft.AuraHM.get(
// Arrays.asList(auraX, auraZ, ThaumCraftCore.getDimension(super.worldObj))
//);
//if (ac != null && ac.boost < 100) {
// this.worked = true;
// ++ac.boost;
// FXWisp ef = new FXWisp(
// super.worldObj,
// (double) this.sealX(false),
// (double) this.sealY(false),
// (double) this.sealZ(false),
// (double) ((float) super.xCoord + super.worldObj.rand.nextFloat()),
// (double) ((float) super.yCoord + super.worldObj.rand.nextFloat()),
// (double) ((float) super.zCoord + super.worldObj.rand.nextFloat()),
// 0.1F,
// super.worldObj.rand.nextInt(5)
// );
// ModLoader.getMinecraftInstance().effectRenderer.addEffect(ef);
//}
}
// TODO: portals
//private void handlePortals() {
// List list = this.getEntitiesSorted(super.worldObj, 1, this.orientation, false);
// boolean p = false;
// int q;
// for (q = 0; q < list.size(); ++q) {
// if (list.get(q) instanceof EntityPlayer) {
// p = true;
// break;
// }
// }
// if (list.size() > 0) {
// Collection pp = mod_ThaumCraft.SpecialTileHM.values();
// boolean fs = false;
// Iterator i$ = pp.iterator();
// label74: {
// SISpecialTile pd;
// do {
// do {
// do {
// do {
// if (!i$.hasNext()) {
// break label74;
// }
// pd = (SISpecialTile) i$.next();
// } while (pd.type != 0);
// } while (pd.dimension
// != ModLoader.getMinecraftInstance().thePlayer.dimension);
// } while (pd.rune != this.runes[2]);
// } while (pd.x == super.xCoord && pd.y == super.yCoord && pd.z ==
// super.zCoord
// );
// if (!(super.worldObj.getBlockTileEntity(pd.x, pd.y, pd.z) instanceof
// TileSeal
// )) {
// mod_ThaumCraft.DeleteSpecialTileFromList(pd);
// this.portalWindow = 0;
// } else {
// if (!this.pOpen && p) {
// super.worldObj.playSoundEffect(
// (double) super.xCoord + 0.5,
// (double) super.yCoord + 0.5,
// (double) super.zCoord + 0.5,
// "thaumcraft.popen",
// 0.4F,
// 1.0F + super.worldObj.rand.nextFloat() * 0.2F
// );
// }
// if (this.pDelay <= 0 && p) {
// this.renderTeleportDest();
// this.pDelay = 3;
// }
// --this.pDelay;
// this.pOpen = true;
// fs = true;
// }
// }
// if (!fs && this.pOpen) {
// this.pOpen = false;
// }
// } else {
// if (this.pOpen) {
// list = ThaumCraftCore.getEntitiesSorted(
// super.worldObj, this, 2, this.orientation, false
// );
// for (q = 0; q < list.size(); ++q) {
// if (list.get(q) instanceof EntityPlayer) {
// super.worldObj.playSoundEffect(
// (double) super.xCoord + 0.5,
// (double) super.yCoord + 0.5,
// (double) super.zCoord + 0.5,
// "thaumcraft.pclose",
// 0.4F,
// 1.0F + super.worldObj.rand.nextFloat() * 0.2F
// );
// break;
// }
// }
// }
// this.pOpen = false;
// }
// this.teleport();
//}
// TODO: implement portal rendering with looking glass
//private void renderTeleportDest() {
// if (this.txRender == null) {
// this.txRender = new PortalRenderer();
// }
// new ArrayList();
// Collection p = mod_ThaumCraft.SpecialTileHM.values();
// int count = -1;
// boolean skipped = true;
// boolean playsound = false;
// Iterator i$ = p.iterator();
// while (i$.hasNext()) {
// SISpecialTile pd = (SISpecialTile) i$.next();
// if (pd.type == 0
// && pd.dimension == ModLoader.getMinecraftInstance().thePlayer.dimension
// && pd.rune == this.runes[2]
// && (pd.x != super.xCoord || pd.y != super.yCoord || pd.z != super.zCoord
// )) {
// if (!(super.worldObj.getBlockTileEntity(pd.x, pd.y, pd.z)
// instanceof TileSeal)) {
// mod_ThaumCraft.DeleteSpecialTileFromList(pd);
// break;
// }
// ++count;
// if (count >= this.portalWindow) {
// skipped = false;
// TileEntity ts = super.worldObj.getBlockTileEntity(pd.x, pd.y, pd.z);
// if (ts != null && ts instanceof TileSeal) {
// PortalRenderer.createPortalView(
// this.txRender, this, (TileSeal) ts
// );
// break;
// }
// }
// }
// }
// if (skipped) {
// this.portalWindow = 0;
// }
//}
// TODO: portals
//public boolean teleport() {
// if (this.delay > 0) {
// return false;
// } else {
// List list = super.worldObj.getEntitiesWithinAABB(
// Entity.class,
// AxisAlignedBB.getBoundingBoxFromPool(
// (double) super.xCoord,
// (double) super.yCoord,
// (double) super.zCoord,
// (double) (super.xCoord + 1),
// (double) (super.yCoord + 1),
// (double) (super.zCoord + 1)
// )
// );
// if (list.size() == 0) {
// return false;
// } else {
// Entity entity = (Entity) list.get(0);
// if (entity instanceof EntityFX) {
// return false;
// } else {
// ArrayList rd = new ArrayList();
// Collection p = mod_ThaumCraft.SpecialTileHM.values();
// int count = -1;
// Iterator i$ = p.iterator();
// while (i$.hasNext()) {
// SISpecialTile pd = (SISpecialTile) i$.next();
// if (pd.type == 0
// && pd.dimension
// == ModLoader.getMinecraftInstance().thePlayer.dimension
// && pd.rune == this.runes[2]
// && (pd.x != super.xCoord || pd.y != super.yCoord
// || pd.z != super.zCoord)) {
// ++count;
// if (count >= this.portalWindow) {
// rd.add(pd);
// break;
// }
// }
// }
// if (rd.size() < 1) {
// return false;
// } else {
// SISpecialTile targetDest = (SISpecialTile) rd.get(0);
// if (targetDest == null) {
// return false;
// } else {
// ThaumCraftCore.loadChunk(
// super.worldObj, targetDest.x, targetDest.z
// );
// TileEntity ts = super.worldObj.getBlockTileEntity(
// targetDest.x, targetDest.y, targetDest.z
// );
// if (ts != null && ts instanceof TileSeal) {
// TileSeal target = (TileSeal) ts;
// if (target.runes[0] == 0 && target.runes[1] == 1) {
// target.delay = 40;
// float tYaw = entity.rotationYaw;
// switch (target.orientation) {
// case 2:
// tYaw = 180.0F;
// break;
// case 3:
// tYaw = 0.0F;
// break;
// case 4:
// tYaw = 90.0F;
// break;
// case 5:
// tYaw = 270.0F;
// }
// int diff = this.orientation - target.orientation;
// double t;
// if (diff == -3 || diff == 2
// || diff == -1
// && this.orientation + target.orientation !=
// 5
// && this.orientation + target.orientation
// != 9) {
// t = entity.motionX;
// entity.motionX = entity.motionZ;
// entity.motionZ = -t;
// if (entity.ridingEntity != null) {
// entity.ridingEntity.motionX
// = entity.ridingEntity.motionZ;
// entity.ridingEntity.motionZ = -t;
// }
// } else if (diff == -2 || diff == 3 || diff == 1 &&
// this.orientation + target.orientation != 5 &&
// this.orientation + target.orientation != 9) {
// t = entity.motionX;
// entity.motionX = -entity.motionZ;
// entity.motionZ = t;
// if (entity.ridingEntity != null) {
// entity.ridingEntity.motionX
// = -entity.ridingEntity.motionZ;
// entity.ridingEntity.motionZ = t;
// }
// } else if (diff == 0) {
// entity.motionX = -entity.motionX;
// entity.motionZ = -entity.motionZ;
// if (entity.ridingEntity != null) {
// entity.ridingEntity.motionX
// = -entity.ridingEntity.motionX;
// entity.ridingEntity.motionZ
// = -entity.ridingEntity.motionZ;
// }
// }
// if (diff == 0
// && (this.orientation == 1 || this.orientation ==
// 0
// )) {
// entity.motionY = -entity.motionY;
// if (entity.ridingEntity != null) {
// entity.ridingEntity.motionY
// = -entity.ridingEntity.motionY;
// }
// }
// ThaumCraftCore.poof(
// super.worldObj,
// (float) entity.posX - 0.5F,
// (float) entity.posY - 0.5F,
// (float) entity.posZ - 0.5F
// );
// super.worldObj.playSoundEffect(
// entity.posX,
// entity.posY,
// entity.posZ,
// "mob.endermen.portal",
// 1.0F,
// 1.0F
// );
// int xm = 0;
// int zm = 0;
// int ym = 0;
// switch (target.orientation) {
// case 0:
// ym = -1;
// break;
// case 1:
// ym = 1;
// break;
// case 2:
// zm = -1;
// break;
// case 3:
// zm = 1;
// break;
// case 4:
// xm = -1;
// break;
// case 5:
// xm = 1;
// }
// if (target.orientation > 1
// && super.worldObj.isAirBlock(
// target.xCoord + xm,
// target.yCoord + ym - 1,
// target.zCoord + zm
// )) {
// --ym;
// }
// entity.setLocationAndAngles(
// (double) target.xCoord + 0.5 + (double) xm,
// (double) target.yCoord + 0.5 + (double) ym,
// (double) target.zCoord + 0.5 + (double) zm,
// tYaw,
// entity.rotationPitch
// );
// if (entity.ridingEntity != null) {
// entity.ridingEntity.setLocationAndAngles(
// (double) target.xCoord + 0.5 + (double) xm,
// (double) target.yCoord + 0.5 + (double) ym,
// (double) target.zCoord + 0.5 + (double) zm,
// tYaw,
// entity.ridingEntity.rotationPitch
// );
// }
// ThaumCraftCore.poof(
// super.worldObj,
// (float) entity.posX - 0.5F,
// (float) entity.posY - 0.5F,
// (float) entity.posZ - 0.5F
// );
// super.worldObj.playSoundEffect(
// entity.posX,
// entity.posY,
// entity.posZ,
// "mob.endermen.portal",
// 1.0F,
// 1.0F
// );
// int auraX = super.xCoord >> 4;
// int auraZ = super.zCoord >> 4;
// SIAuraChunk ac
// = (SIAuraChunk) mod_ThaumCraft.AuraHM.get(
// Arrays.asList(
// auraX,
// auraZ,
// ThaumCraftCore.getDimension(super.worldObj
// )
// )
// );
// if (ac != null) {
// if (entity instanceof EntityItem) {
// ++ac.badVibes;
// } else {
// ac.badVibes = (short) (ac.badVibes + 4);
// }
// }
// auraX = target.xCoord >> 4;
// auraZ = target.zCoord >> 4;
// ac = (SIAuraChunk) mod_ThaumCraft.AuraHM.get(
// Arrays.asList(
// auraX,
// auraZ,
// ThaumCraftCore.getDimension(super.worldObj)
// )
// );
// if (ac != null) {
// if (entity instanceof EntityItem) {
// ++ac.badVibes;
// } else {
// ac.badVibes = (short) (ac.badVibes + 4);
// }
// }
// this.worked = true;
// return true;
// } else {
// return false;
// }
// } else {
// return false;
// }
// }
// }
// }
// }
// }
//}
private void beam(
int range,
int damage,
boolean push,
boolean homing,
boolean motes,
boolean core,
float speed1,
float speed2
) {
List<Entity> list
= this.getEntitiesSorted(super.worldObj, range, this.orientation, true);
for (int a = 0; a < list.size(); ++a) {
Entity entity = (Entity) list.get(a);
if (entity instanceof EntityLivingBase && !(entity instanceof EntityPlayer)
&& !(entity instanceof EntityTameable)) {
//FXBeam ef = new FXBeam(
// super.worldObj,
// (double) this.sealX(false),
// (double) this.sealY(false),
// (double) this.sealZ(false),
// entity,
// damage
//);
//ef.drawCore = core;
//ef.drawMotes = motes;
//ef.push = push;
//ef.speed = speed2;
//ef.moteSpeed = speed1;
//ef.homing = homing;
//ModLoader.getMinecraftInstance().effectRenderer.addEffect(ef);
//if (this.soundDelay <= 0) {
// super.worldObj.playSoundEffect(
// (double) super.xCoord + 0.5,
// (double) super.yCoord + 0.5,
// (double) super.zCoord + 0.5,
// "arcaneseals:beamloop",
// 0.6F,
// 1.0F
// );
// this.soundDelay = 5;
//}
//this.worked = true;
//break;
}
}
}
private void
heal(int range, boolean mobs, boolean animals, boolean player, boolean buff) {
List<Entity> list
= this.getEntitiesSorted(super.worldObj, range, this.orientation, true);
for (int a = list.size() - 1; a >= 0; --a) {
Entity entity = (Entity) list.get(a);
if (entity instanceof EntityLivingBase
&& (animals
&& (entity instanceof EntityAnimal
|| entity instanceof EntityVillager)
|| mobs && (entity instanceof EntityMob || entity instanceof IMob)
|| player
&& (entity instanceof EntityPlayer
|| entity instanceof EntityTameable))) {
if (!(entity instanceof EntityPlayer)
&& ((EntityLivingBase) entity).getActivePotionEffect(Potion.hunger)
!= null) {
break;
}
if (((EntityLivingBase) entity).getHealth()
!= ((EntityLivingBase) entity).getMaxHealth()) {
((EntityLivingBase) entity).heal(1);
if (buff) {
((EntityLivingBase) entity)
.addPotionEffect(
new PotionEffect(Potion.regeneration.id, 60, 1)
);
}
super.worldObj.playSoundAtEntity(
entity, "thaumcraft.heal", 1.0F, 1.0F
);
for (int qq = 0; qq < 5; ++qq) {
FXWisp ef = new FXWisp(
super.worldObj,
(double) this.sealX(false),
(double) this.sealY(false),
(double) this.sealZ(false),
entity.posX
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
entity.boundingBox.minY + (double) (entity.height / 2.0F)
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
entity.posZ
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
0.2F,
super.worldObj.rand.nextBoolean() ? 0 : 2
);
Minecraft.getMinecraft().effectRenderer.addEffect(ef);
}
this.worked = true;
if (this.runes[2] != 4) {
break;
}
}
}
}
}
private void
scorch(int range, int damage, boolean mobs, boolean animals, boolean pvp) {
List<Entity> list
= this.getEntitiesSorted(super.worldObj, range, this.orientation, true);
for (int a = list.size() - 1; a >= 0; --a) {
Entity entity = (Entity) list.get(a);
if (entity instanceof EntityLivingBase
&& (animals && entity instanceof EntityAnimal
&& !(entity instanceof EntityTameable)
|| mobs && (entity instanceof EntityMob || entity instanceof IMob)
|| pvp && entity instanceof EntityPlayer)) {
for (int q = 0; q < damage; ++q) {
entity.attackEntityFrom(DamageSource.onFire, damage);
FXScorch ef = new FXScorch(
super.worldObj,
(double) this.sealX(false),
(double) this.sealY(false),
(double) this.sealZ(false),
Vec3.createVectorHelper(
entity.posX - this.sealX(false),
entity.posY - this.sealY(false),
entity.posZ - this.sealZ(false)
),
(float) damage * 0.5F,
this.runeAmount(1) > 0
);
ef.mobs = mobs;
ef.pvp = pvp;
ef.animals = animals;
Minecraft.getMinecraft().effectRenderer.addEffect(ef);
}
if (this.soundDelay <= 0) {
super.worldObj.playSoundEffect(
(double) super.xCoord + 0.5,
(double) super.yCoord + 0.5,
(double) super.zCoord + 0.5,
"thaumcraft:fireloop",
0.33F,
1.0F
);
this.soundDelay = 20;
}
this.worked = true;
break;
}
}
}
private boolean shock() {
int range = 6 + this.runeAmount(1) * 2;
boolean shocked = false;
boolean mobs = this.runeAmount(3) == 0;
boolean animals = this.runeAmount(0) == 0;
boolean pvp = this.runeAmount(5) > 0;
if (pvp) {
mobs = false;
animals = false;
}
List<Entity> list
= this.getEntitiesSorted(super.worldObj, range, this.orientation, true);
for (int a = 0; a < list.size(); ++a) {
if (list.get(a) instanceof EntityLivingBase
&& this.canEntityBeSeen((Entity) list.get(a))) {
EntityLivingBase entity = (EntityLivingBase) list.get(a);
if (animals && entity instanceof EntityAnimal
&& !(entity instanceof EntityTameable)
|| mobs && (entity instanceof EntityMob || entity instanceof IMob)
|| pvp && entity instanceof EntityPlayer) {
shocked = true;
FXLightningBolt bolt = new FXLightningBolt(
super.worldObj,
this.sealPos(false),
new WRVector3(entity),
super.worldObj.rand.nextLong()
);
bolt.defaultFractal();
bolt.setType(2);
bolt.finalizeBolt();
entity.attackEntityFrom(DamageSource.magic, 3);
entity.addPotionEffect(new PotionEffect(
Potion.moveSlowdown.id, 100, this.runeAmount(2) * 4
));
this.worked = true;
if (this.runeAmount(4) < 2) {
break;
}
}
}
}
if (shocked) {
super.worldObj.playSoundEffect(
(double) super.xCoord + 0.5,
(double) super.yCoord + 0.5,
(double) super.zCoord + 0.5,
"thaumcraft:shock",
0.33F,
1.0F
);
}
return false;
}
private void pushEntity(
boolean pull, boolean creatures, boolean items, int range, float strength
) {
boolean pushed = false;
List<Entity> list
= this.getEntities(super.worldObj, (float) range, this.orientation, false);
for (int a = 0; a < list.size(); ++a) {
Entity entity = (Entity) list.get(a);
if (!(entity instanceof IProjectile) && !(entity instanceof EntityXPOrb)
&& !(entity instanceof EntityPlayer)
&& !(entity instanceof EntityTameable)
&& (creatures || !(entity instanceof EntityLivingBase))
&& (items || !(entity instanceof EntityItem))) {
double d6 = entity.posX - (double) this.sealX(false);
double d8 = entity.posY - (double) this.sealY(false);
double d10 = entity.posZ - (double) this.sealZ(false);
double d11
= (double) MathHelper.sqrt_double(d6 * d6 + d8 * d8 + d10 * d10);
d6 /= d11;
d8 /= d11;
d10 /= d11;
if (pull) {
entity.motionX -= d6 * (double) strength * 2.0;
if (this.orientation <= 1 || this.runes[2] == 4
|| this.runes[2] == 5) {
entity.motionY -= d8 * (double) strength * 3.0;
}
entity.motionZ -= d10 * (double) strength * 2.0;
} else {
float power = entity.onGround ? strength * 2.0F : strength;
entity.motionX += d6 * (double) power;
entity.motionZ += d10 * (double) power;
if (this.orientation <= 1) {
entity.motionY += d8 * (double) strength * 3.0;
}
}
pushed = true;
}
}
if (pushed) {
this.worked = true;
if (this.soundDelay <= 0) {
if (pull) {
super.worldObj.playSoundEffect(
(double) ((float) super.xCoord + 0.5F),
(double) ((float) super.yCoord + 0.5F),
(double) ((float) super.zCoord + 0.5F),
"thaumcraft.suck",
0.1F,
strength * 3.0F + 0.9F + super.worldObj.rand.nextFloat() * 0.1F
);
this.soundDelay = 30;
} else {
super.worldObj.playSoundEffect(
(double) ((float) super.xCoord + 0.5F),
(double) ((float) super.yCoord + 0.5F),
(double) ((float) super.zCoord + 0.5F),
"thaumcraft.wind",
0.1F,
strength * 3.0F + 0.9F + super.worldObj.rand.nextFloat() * 0.1F
);
this.soundDelay = 25;
}
}
float q = 0.0F;
float w = 0.0F;
float e = 0.0F;
switch (this.orientation) {
case 0:
w = -1.0F;
q = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
e = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
break;
case 1:
w = 1.0F;
q = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
e = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
break;
case 2:
e = -1.0F;
q = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
w = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
break;
case 3:
e = 1.0F;
q = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
w = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
break;
case 4:
q = -1.0F;
w = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
e = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
break;
case 5:
q = 1.0F;
w = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
e = super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat();
}
// TODO: more effects!
//FXWind ef = new FXWind(
// super.worldObj,
// (double) this.sealX(false),
// (double) this.sealY(false),
// (double) this.sealZ(false),
// (double) (this.sealX(false) + q),
// (double) (this.sealY(false) + w),
// (double) (this.sealZ(false) + e),
// pull
//);
//ModLoader.getMinecraftInstance().effectRenderer.addEffect(ef);
}
}
protected void attemptItemPickup(EntityItem entity) {
ItemStack items = entity.getEntityItem();
for (int x = -2; x <= 2; ++x) {
for (int y = -2; y <= 2; ++y) {
for (int z = -2; z <= 2; ++z) {
if ((x != 0 || y != 0 || z != 0) && super.yCoord + y >= 0) {
TileEntity block = super.worldObj.getTileEntity(
super.xCoord + x, super.yCoord + y, super.zCoord + z
);
if (block instanceof IInventory) {
IInventory chest = (IInventory) block;
for (int a = 0; a < chest.getSizeInventory(); ++a) {
int j;
FXSparkle ef1;
FXSparkle ef2;
if (chest.getStackInSlot(a) == null) {
chest.setInventorySlotContents(a, items);
entity.setDead();
super.worldObj.playSoundAtEntity(
entity,
"random.pop",
0.15F,
2.0F + super.worldObj.rand.nextFloat() * 0.45F
);
for (j = 0; j < 5; ++j) {
ef1 = new FXSparkle(
super.worldObj,
entity.posX,
entity.posY,
entity.posZ,
entity.posX
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
entity.posY
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
entity.posZ
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
2.0F,
1,
3
);
Minecraft.getMinecraft().effectRenderer.addEffect(
ef1
);
ef2 = new FXSparkle(
super.worldObj,
entity.posX
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.2F),
entity.posY
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.2F),
entity.posZ
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.2F),
(double) ((float) block.xCoord + 0.5F),
(double) ((float) block.yCoord + 0.5F),
(double) ((float) block.zCoord + 0.5F),
1.0F,
1,
3
);
Minecraft.getMinecraft().effectRenderer.addEffect(
ef2
);
}
return;
}
if (chest.getStackInSlot(a).isItemEqual(items)
&& chest.getStackInSlot(a).stackSize + items.stackSize
<= items.getMaxStackSize()) {
items.stackSize += chest.getStackInSlot(a).stackSize;
chest.setInventorySlotContents(a, items);
entity.setDead();
super.worldObj.playSoundAtEntity(
entity,
"random.pop",
0.15F,
2.0F + super.worldObj.rand.nextFloat() * 0.45F
);
for (j = 0; j < 5; ++j) {
ef1 = new FXSparkle(
super.worldObj,
entity.posX,
entity.posY,
entity.posZ,
entity.posX
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
entity.posY
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
entity.posZ
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.5F),
2.0F,
1,
3
);
Minecraft.getMinecraft().effectRenderer.addEffect(
ef1
);
ef2 = new FXSparkle(
super.worldObj,
entity.posX
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.2F),
entity.posY
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.2F),
entity.posZ
+ (double
) ((super.worldObj.rand.nextFloat()
- super.worldObj.rand.nextFloat())
* 0.2F),
(double) ((float) block.xCoord + 0.5F),
(double) ((float) block.yCoord + 0.5F),
(double) ((float) block.zCoord + 0.5F),
1.0F,
1,
3
);
Minecraft.getMinecraft().effectRenderer.addEffect(
ef2
);
}
return;
}
}
}
}
}
}
}
}
private float sealX(boolean reverse) {
float calc = (float) super.xCoord;
switch (this.orientation) {
case 0:
calc += 0.5F;
break;
case 1:
calc += 0.5F;
break;
case 2:
calc += 0.5F;
break;
case 3:
calc += 0.5F;
break;
case 4:
calc += reverse ? 0.0F : 1.0F;
break;
case 5:
calc += reverse ? 1.0F : 0.0F;
}
return calc;
}
private float sealY(boolean reverse) {
float calc = (float) super.yCoord;
switch (this.orientation) {
case 0:
calc += reverse ? 0.0F : 1.0F;
break;
case 1:
calc += reverse ? 1.0F : 0.0F;
break;
case 2:
case 3:
case 4:
case 5:
calc += 0.5F;
}
return calc;
}
private float sealZ(boolean reverse) {
float calc = (float) super.zCoord;
switch (this.orientation) {
case 0:
calc += 0.5F;
break;
case 1:
calc += 0.5F;
break;
case 2:
calc += reverse ? 0.0F : 1.0F;
break;
case 3:
calc += reverse ? 1.0F : 0.0F;
break;
case 4:
calc += 0.5F;
break;
case 5:
calc += 0.5F;
}
return calc;
}
private WRVector3 sealPos(boolean reverse) {
return new WRVector3(
this.sealX(reverse), this.sealY(reverse), this.sealZ(reverse)
);
}
public int runeAmount(int type) {
int count = 0;
if (this.runes[1] == type) {
++count;
}
if (this.runes[2] == type) {
++count;
}
return count;
}
public int runeCount() {
int count = 0;
if (this.runes[0] != -1) {
++count;
}
if (this.runes[1] != -1) {
++count;
}
if (this.runes[2] != -1) {
++count;
}
return count;
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
this.orientation = nbttagcompound.getShort("orientation");
this.runes = nbttagcompound.getByteArray("runes");
this.portalWindow = nbttagcompound.getInteger("window");
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setShort("orientation", this.orientation);
nbttagcompound.setByteArray("runes", this.runes);
nbttagcompound.setInteger("window", this.portalWindow);
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setShort("orientation", this.orientation);
nbt.setByteArray("runes", this.runes);
nbt.setInteger("window", this.portalWindow);
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.orientation = nbt.getShort("orientation");
this.runes = nbt.getByteArray("runes");
this.portalWindow = nbt.getInteger("window");
}
public List<Entity>
getEntities(World world, float range, int orientation, boolean visibleonly) {
double xm = 0.0;
double xp = 0.0;
double ym = 0.0;
double yp = 0.0;
double zm = 0.0;
double zp = 0.0;
if (orientation == 0) {
xm = zm = (double) (-range);
xp = zp = (double) range;
ym = (double) (-(range * 2.0F));
} else if (orientation == 1) {
xm = zm = (double) (-range);
xp = zp = (double) range;
yp = (double) (range * 2.0F);
} else if (orientation == 2) {
xm = ym = (double) (-range);
xp = yp = (double) range;
zm = (double) (-(range * 2.0F));
} else if (orientation == 3) {
xm = ym = (double) (-range);
xp = yp = (double) range;
zp = (double) (range * 2.0F);
} else if (orientation == 4) {
zm = ym = (double) (-range);
zp = yp = (double) range;
xm = (double) (-(range * 2.0F));
} else if (orientation == 5) {
zm = ym = (double) (-range);
zp = yp = (double) range;
xp = (double) (range * 2.0F);
}
List<Entity> list = world.getEntitiesWithinAABB(
Entity.class,
AxisAlignedBB.getBoundingBox(
(double) this.xCoord + xm,
(double) this.yCoord + ym,
(double) this.zCoord + zm,
(double) this.xCoord + 1.0 + xp,
(double) this.yCoord + 1.0 + yp,
(double) this.zCoord + 1.0 + zp
)
);
if (visibleonly) {
for (int q = 0; q < list.size(); ++q) {
if (!this.canEntityBeSeen((Entity) list.get(q))) {
list.remove(q);
--q;
}
}
}
return list;
}
public boolean canEntityBeSeen(Entity entity) {
return this.worldObj.rayTraceBlocks(
Vec3.createVectorHelper(
(double) this.xCoord + 0.5,
(double) this.yCoord + 0.5,
(double) this.zCoord + 0.5
),
Vec3.createVectorHelper(
entity.posX,
entity.posY + (double) entity.getEyeHeight(),
entity.posZ
),
true
)
== null;
}
public List<Entity>
getEntitiesSorted(World world, int range, int orientation, boolean visibleonly) {
List<Entity> ws
= this.getEntities(world, (float) range, orientation, visibleonly);
boolean didSort = false;
do {
didSort = false;
for (int a = 0; a < ws.size() - 1; ++a) {
Entity entity = (Entity) ws.get(a);
double dist = this.getDistanceFrom(entity.posX, entity.posY, entity.posZ);
Entity entity2 = (Entity) ws.get(a + 1);
double dist2
= this.getDistanceFrom(entity2.posX, entity2.posY, entity2.posZ);
if (dist > dist2) {
ws.remove(a);
ws.add(entity);
didSort = true;
break;
}
}
} while (didSort);
return ws;
}
}