99 lines
3.3 KiB
Java
99 lines
3.3 KiB
Java
package com.legacy.aether.player.abilities;
|
|
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.IProjectile;
|
|
import net.minecraft.entity.projectile.EntityArrow;
|
|
import net.minecraft.entity.projectile.EntityFireball;
|
|
import net.minecraft.entity.projectile.EntityThrowable;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.DamageSource;
|
|
import net.minecraft.world.WorldServer;
|
|
|
|
import com.legacy.aether.api.player.IPlayerAether;
|
|
import com.legacy.aether.api.player.util.IAetherAbility;
|
|
import com.legacy.aether.entities.projectile.EntityProjectileBase;
|
|
import com.legacy.aether.items.ItemsAether;
|
|
|
|
import cpw.mods.fml.common.registry.IThrowableEntity;
|
|
|
|
public class AbilityRepulsion implements IAetherAbility {
|
|
|
|
private Random rand = new Random();
|
|
|
|
private final IPlayerAether player;
|
|
|
|
public AbilityRepulsion(IPlayerAether player) {
|
|
this.player = player;
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldExecute() {
|
|
return this.player.getAccessoryInventory().wearingAccessory(new ItemStack(ItemsAether.repulsion_shield));
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate() {
|
|
if (this.player.getEntity().worldObj.isRemote) {
|
|
return;
|
|
}
|
|
|
|
List<?> entities = this.player.getEntity().worldObj.getEntitiesWithinAABBExcludingEntity(this.player.getEntity(), this.player.getEntity().boundingBox.expand(3.0D, 3.0D, 3.0D));
|
|
|
|
for (int size = 0; size < entities.size(); ++size) {
|
|
Entity projectile = (Entity) entities.get(size);
|
|
|
|
if (isProjectile(projectile) && this.getShooter(projectile) != this.player.getEntity()) {
|
|
double x, y, z;
|
|
|
|
Entity shooter = this.getShooter(projectile);
|
|
|
|
if (shooter == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
x = this.player.getEntity().posX - shooter.posX;
|
|
y = this.player.getEntity().boundingBox.minY - shooter.boundingBox.minY;
|
|
z = this.player.getEntity().posZ - shooter.posZ;
|
|
|
|
double difference = -Math.sqrt((x * x) + (y * y) + (z * z));
|
|
|
|
x /= difference;
|
|
y /= difference;
|
|
z /= difference;
|
|
|
|
projectile.setDead();
|
|
|
|
double packX, packY, packZ;
|
|
packX = (-projectile.motionX * 0.15F) + ((this.rand.nextFloat() - 0.5F) * 0.05F);
|
|
packY = (-projectile.motionY * 0.15F) + ((this.rand.nextFloat() - 0.5F) * 0.05F);
|
|
packZ = (-projectile.motionZ * 0.15F) + ((this.rand.nextFloat() - 0.5F) * 0.05F);
|
|
|
|
((WorldServer) this.player.getEntity().worldObj).func_147487_a("flame", projectile.posX, projectile.posY, projectile.posZ, 12, packX, packY, packZ, 0.625F);
|
|
|
|
this.player.getEntity().worldObj.playSoundAtEntity(this.player.getEntity(), "note.snare", 1.0F, 1.0F);
|
|
this.player.getAccessoryInventory().damageWornStack(1, new ItemStack(ItemsAether.repulsion_shield));
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean onPlayerAttacked(DamageSource source) {
|
|
if (isProjectile(source.getEntity())) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private Entity getShooter(Entity ent) {
|
|
return ent instanceof EntityArrow ? ((EntityArrow) ent).shootingEntity : ent instanceof EntityThrowable ? ((EntityThrowable) ent).getThrower() : ent instanceof EntityProjectileBase ? ((EntityProjectileBase) ent).getThrower() : ent instanceof EntityFireball ? ((EntityFireball) ent).shootingEntity : null;
|
|
}
|
|
|
|
public static boolean isProjectile(Entity entity) {
|
|
return entity instanceof IProjectile || entity instanceof IThrowableEntity;
|
|
}
|
|
|
|
} |