package cn.dawn47.weapon.entity;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.command.IEntitySelector;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.world.World;
import cn.annoreg.core.Registrant;
import cn.annoreg.mc.RegEntity;
import cn.dawn47.weapon.client.render.RendererRadiationBall;
import cn.liutils.entityx.EntityAdvanced;
import cn.liutils.entityx.EntityCallback;
import cn.liutils.entityx.event.CollideEvent;
import cn.liutils.entityx.event.CollideEvent.CollideHandler;
import cn.liutils.entityx.handlers.Rigidbody;
import cn.liutils.util.client.ViewOptimize.IAssociatePlayer;
import cn.liutils.util.generic.MathUtils;
import cn.liutils.util.helper.Motion3D;
import cn.liutils.util.mc.EntitySelectors;
import cn.liutils.util.mc.WorldUtils;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@Registrant
@RegEntity
@RegEntity.HasRender
public class EntityRadiationBall extends EntityAdvanced implements IAssociatePlayer {
@SideOnly(Side.CLIENT)
@RegEntity.Render
public static RendererRadiationBall renderer;
EntityPlayer spawner;
public int splashTick = 0;
public boolean isHit;
public int ticksAfterHit;
protected double VELOCITY=3;
public EntityRadiationBall(final EntityPlayer ent) {
super(ent.worldObj);
spawner = ent;
this.setSize(0.7F, 0.2F);
new Motion3D(ent, true).multiplyMotionBy(VELOCITY).applyToEntity(EntityRadiationBall.this);
Rigidbody rb = new Rigidbody();
addMotionHandler(rb);
rb.entitySel = new IEntitySelector() {
@Override
public boolean isEntityApplicable(Entity entity) {
return entity != ent;
}
};
this.regEventHandler(new CollideHandler() {
@Override
public void onEvent(CollideEvent event) {
if (!isHit) {
MovingObjectPosition res = event.result;
if(res.entityHit != null && res.entityHit != spawner) {
res.entityHit.attackEntityFrom(DamageSource.causeMobDamage(ent), 12);
}
if(res.typeOfHit == MovingObjectType.BLOCK) {
Vec3 v = res.hitVec;
posX = v.xCoord;
posY = v.yCoord;
posZ = v.zCoord;
}
executeAfter(new EntityCallback() {
@Override
public void execute(Entity target) {
setDead();
}
}, 20);
}
isHit = true;
motionX = motionY = motionZ = 0;
}
});
}
public EntityRadiationBall(World world) {
super(world);
addMotionHandler(new Rigidbody());
regEventHandler(new CollideHandler() {
@Override
public void onEvent(CollideEvent event) {
isHit = true;
motionX = motionY = motionZ = 0;
//TODO: Spawn particles
}
});
}
@Override
public void entityInit() {
super.entityInit();
dataWatcher.addObject(10, 0.0f);
dataWatcher.addObject(11, 0.0f);
dataWatcher.addObject(12, 0.0f);
dataWatcher.addObject(15, (byte) 0);
dataWatcher.addObject(16, (int) 0);
}
@Override
public void onUpdate() {
if(isHit) {
++ticksAfterHit;
if(ticksAfterHit == 20)
this.setDead();
}
syncData();
super.onUpdate();
}
void syncData() {
if (worldObj.isRemote) {
byte b = dataWatcher.getWatchableObjectByte(15);
if (b == 0) {
isHit = false;
ticksAfterHit = 0;
} else {
isHit = true;
ticksAfterHit = b >> 1;
}
if (spawner != null) {
Entity e = worldObj.getEntityByID(dataWatcher.getWatchableObjectInt(16));
if (e instanceof EntityPlayer) {
spawner = (EntityPlayer) e;
}
}
motionX = dataWatcher.getWatchableObjectFloat(10);
motionY = dataWatcher.getWatchableObjectFloat(11);
motionZ = dataWatcher.getWatchableObjectFloat(12);
if (isHit) {
motionX = motionY = motionZ = 0;
}
} else {
if (isHit) {
dataWatcher.updateObject(15, (byte) (1 | (ticksAfterHit << 1)));
} else {
dataWatcher.updateObject(15, (byte) 0);
}
dataWatcher.updateObject(16, spawner.getEntityId());
dataWatcher.updateObject(10, (float) motionX);
dataWatcher.updateObject(11, (float) motionY);
dataWatcher.updateObject(12, (float) motionZ);
}
}
@Override
public boolean shouldRenderInPass(int pass){
return pass==1;
}
@Override
public boolean canBeCollidedWith() {
return false;
}
@Override
protected void readEntityFromNBT(NBTTagCompound p_70037_1_) {
setDead();
}
@Override
protected void writeEntityToNBT(NBTTagCompound p_70014_1_) {}
@Override
public EntityPlayer getPlayer() {
return spawner;
}
}