d91a3e056a
Adds ParticleBuilder to replace the particle spawning methods in the proxies, and changes all particle spawning to use the builder except for in the spell classes, which are to be reorganised first.
84 lines
3.4 KiB
Java
84 lines
3.4 KiB
Java
package electroblob.wizardry.spell;
|
|
|
|
import electroblob.wizardry.WizardData;
|
|
import electroblob.wizardry.Wizardry;
|
|
import electroblob.wizardry.constants.Element;
|
|
import electroblob.wizardry.constants.SpellType;
|
|
import electroblob.wizardry.constants.Tier;
|
|
import electroblob.wizardry.registry.WizardryItems;
|
|
import electroblob.wizardry.util.IElementalDamage;
|
|
import electroblob.wizardry.util.SpellModifiers;
|
|
import electroblob.wizardry.util.ParticleBuilder.Type;
|
|
import electroblob.wizardry.util.WizardryUtilities;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.init.SoundEvents;
|
|
import net.minecraft.item.EnumAction;
|
|
import net.minecraft.util.EnumHand;
|
|
import net.minecraft.util.math.RayTraceResult;
|
|
import net.minecraft.util.math.Vec3d;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.event.entity.living.LivingHurtEvent;
|
|
import net.minecraftforge.fml.common.Mod;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
|
|
@Mod.EventBusSubscriber
|
|
public class CurseOfSoulbinding extends Spell {
|
|
|
|
public CurseOfSoulbinding(){
|
|
super(Tier.ADVANCED, 35, Element.NECROMANCY, "curse_of_soulbinding", SpellType.ATTACK, 100, EnumAction.NONE,
|
|
false);
|
|
}
|
|
|
|
@Override
|
|
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
|
|
|
Vec3d look = caster.getLookVec();
|
|
|
|
RayTraceResult rayTrace = WizardryUtilities.standardEntityRayTrace(world, caster,
|
|
10 * modifiers.get(WizardryItems.range_upgrade));
|
|
|
|
if(rayTrace != null && rayTrace.typeOfHit == RayTraceResult.Type.ENTITY
|
|
&& WizardryUtilities.isLiving(rayTrace.entityHit) && WizardData.get(caster) != null){
|
|
EntityLivingBase target = (EntityLivingBase)rayTrace.entityHit;
|
|
if(!WizardData.get(caster).soulbind(target)) return false;
|
|
}
|
|
|
|
if(world.isRemote){
|
|
for(int i = 1; i < (int)(25 * modifiers.get(WizardryItems.range_upgrade)); i += 2){
|
|
// I figured it out! when on client side, entityplayer.posY is at the eyes, not the feet!
|
|
double x1 = caster.posX + look.x * i / 2 + world.rand.nextFloat() / 5 - 0.1f;
|
|
double y1 = WizardryUtilities.getPlayerEyesPos(caster) - 0.4f + look.y * i / 2
|
|
+ world.rand.nextFloat() / 5 - 0.1f;
|
|
double z1 = caster.posZ + look.z * i / 2 + world.rand.nextFloat() / 5 - 0.1f;
|
|
// world.spawnParticle("mobSpell", x1, y1, z1, -1*look.xCoord, -1*look.yCoord, -1*look.zCoord);
|
|
Wizardry.proxy.spawnParticle(Type.DARK_MAGIC, world, x1, y1, z1, 0.0d, 0.0d, 0.0d, 0,
|
|
0.4f, 0.0f, 0.0f);
|
|
Wizardry.proxy.spawnParticle(Type.DARK_MAGIC, world, x1, y1, z1, 0.0d, 0.0d, 0.0d, 0,
|
|
0.1f, 0.0f, 0.0f);
|
|
Wizardry.proxy.spawnParticle(Type.SPARKLE, world, x1, y1, z1, 0.0d, 0.0d, 0.0d,
|
|
12 + world.rand.nextInt(8), 1.0f, 0.8f, 1.0f);
|
|
}
|
|
}
|
|
|
|
caster.swingArm(hand);
|
|
WizardryUtilities.playSoundAtPlayer(caster, SoundEvents.ENTITY_WITHER_SPAWN, 1.0F,
|
|
world.rand.nextFloat() * 0.2F + 1.0F);
|
|
return true;
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public static void onLivingHurtEvent(LivingHurtEvent event){
|
|
|
|
if(!event.getEntity().world.isRemote && event.getEntityLiving() instanceof EntityPlayer
|
|
&& !event.getSource().isUnblockable() && !(event.getSource() instanceof IElementalDamage
|
|
&& ((IElementalDamage)event.getSource()).isRetaliatory())){
|
|
WizardData data = WizardData.get((EntityPlayer)event.getEntityLiving());
|
|
if(data != null){
|
|
data.damageAllSoulboundCreatures(event.getAmount());
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|