Files
Wizardry/src/main/java/electroblob/wizardry/entity/construct/EntityBlackHole.java
T
2018-03-09 11:56:31 +01:00

147 lines
4.8 KiB
Java

package electroblob.wizardry.entity.construct;
import java.util.List;
import electroblob.wizardry.util.MagicDamage;
import electroblob.wizardry.util.MagicDamage.DamageType;
import electroblob.wizardry.util.WizardryUtilities;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.SoundEvents;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketEntityVelocity;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
public class EntityBlackHole extends EntityMagicConstruct {
public int[] randomiser;
public int[] randomiser2;
public EntityBlackHole(World world){
super(world);
this.width = 6.0f;
this.height = 3.0f;
randomiser = new int[30];
for(int i = 0; i < randomiser.length; i++){
randomiser[i] = this.rand.nextInt(10);
}
randomiser2 = new int[30];
for(int i = 0; i < randomiser2.length; i++){
randomiser2[i] = this.rand.nextInt(10);
}
}
public EntityBlackHole(World world, double x, double y, double z, EntityLivingBase caster, int lifetime,
float damageMultiplier){
super(world, x, y, z, caster, lifetime, damageMultiplier);
this.width = 6.0f;
this.height = 3.0f;
randomiser = new int[30];
for(int i = 0; i < randomiser.length; i++){
randomiser[i] = this.rand.nextInt(10);
}
randomiser2 = new int[30];
for(int i = 0; i < randomiser2.length; i++){
randomiser2[i] = this.rand.nextInt(10);
}
}
@Override
protected void readEntityFromNBT(NBTTagCompound nbttagcompound){
super.readEntityFromNBT(nbttagcompound);
randomiser = nbttagcompound.getIntArray("randomiser");
randomiser2 = nbttagcompound.getIntArray("randomiser2");
}
@Override
protected void writeEntityToNBT(NBTTagCompound nbttagcompound){
super.writeEntityToNBT(nbttagcompound);
nbttagcompound.setIntArray("randomiser", randomiser);
nbttagcompound.setIntArray("randomiser2", randomiser2);
}
public void onUpdate(){
super.onUpdate();
// System.out.println("Client side: " + this.world.isRemote + ", Caster: " + this.caster);
// Particle effect. Finishes 40 ticks before the end so the particles disappear at the same time.
if(this.ticksExisted + 40 < this.lifetime){
for(int i = 0; i < 5; i++){
// this.world.spawnParticle(EnumParticleTypes.PORTAL, this.posX + (this.rand.nextDouble() - 0.5D) *
// (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height - 0.75D, this.posZ +
// (this.rand.nextDouble() - 0.5D) * (double)this.width, (this.rand.nextDouble() - 0.5D) * 2.0D,
// -this.rand.nextDouble(), (this.rand.nextDouble() - 0.5D) * 2.0D);
this.world.spawnParticle(EnumParticleTypes.PORTAL, this.posX, this.posY, this.posZ,
(this.rand.nextDouble() - 0.5D) * 4.0D, (this.rand.nextDouble() - 0.5D) * 4.0D - 1,
(this.rand.nextDouble() - 0.5D) * 4.0D);
}
}
if(this.lifetime - this.ticksExisted == 75){
this.playSound(SoundEvents.BLOCK_PORTAL_TRIGGER, 1.5f, 1.0f);
}else if(this.ticksExisted % 80 == 1 && this.ticksExisted + 80 < this.lifetime){
this.playSound(SoundEvents.BLOCK_PORTAL_AMBIENT, 1.5f, 1.0f);
}
List<EntityLivingBase> targets = WizardryUtilities.getEntitiesWithinRadius(6.0d, this.posX, this.posY,
this.posZ, this.world);
if(!this.world.isRemote){
for(EntityLivingBase target : targets){
if(this.isValidTarget(target)){
// Sucks the target in
if(this.posX > target.posX && target.motionX < 1){
target.motionX += 0.1;
}else if(this.posX < target.posX && target.motionX > -1){
target.motionX -= 0.1;
}
if(this.posY > target.posY && target.motionY < 1){
target.motionY += 0.1;
}else if(this.posY < target.posY && target.motionY > -1){
target.motionY -= 0.1;
}
if(this.posZ > target.posZ && target.motionZ < 1){
target.motionZ += 0.1;
}else if(this.posZ < target.posZ && target.motionZ > -1){
target.motionZ -= 0.1;
}
// Player motion is handled on that player's client so needs packets
if(target instanceof EntityPlayerMP){
((EntityPlayerMP)target).connection.sendPacket(new SPacketEntityVelocity(target));
}
if(this.getDistance(target) <= 2){
// Damages the target if it is close enough
if(this.getCaster() != null){
target.attackEntityFrom(
MagicDamage.causeIndirectMagicDamage(this, getCaster(), DamageType.MAGIC),
2 * damageMultiplier);
}else{
target.attackEntityFrom(DamageSource.MAGIC, 2 * damageMultiplier);
}
}
}
}
}
}
/**
* Checks using a Vec3dd to determine if this entity is within range of that vector to be rendered. Args: Vec3dD
*/
public boolean isInRangeToRenderVec3dD(Vec3d par1Vec3d){
return true;
}
}