package electroblob.wizardry.spell; import electroblob.wizardry.entity.construct.EntityIceSpike; import electroblob.wizardry.registry.WizardryItems; import electroblob.wizardry.util.BlockUtils; import electroblob.wizardry.util.GeometryUtils; import electroblob.wizardry.util.SpellModifiers; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; public class IceSpikes extends SpellConstructRanged { public static final String ICE_SPIKE_COUNT = "ice_spike_count"; public IceSpikes(){ super("ice_spikes", EntityIceSpike::new, true); addProperties(EFFECT_RADIUS, ICE_SPIKE_COUNT, DAMAGE, EFFECT_DURATION, EFFECT_STRENGTH); this.ignoreUncollidables(true); } @Override protected boolean spawnConstruct(World world, double x, double y, double z, EnumFacing side, EntityLivingBase caster, SpellModifiers modifiers){ if(side == null) return false; BlockPos blockHit = new BlockPos(x, y, z); if(side.getAxisDirection() == EnumFacing.AxisDirection.NEGATIVE) blockHit = blockHit.offset(side); if(world.getBlockState(blockHit).isNormalCube()) return false; Vec3d origin = new Vec3d(x, y, z); Vec3d pos = origin.add(new Vec3d(side.getOpposite().getDirectionVec())); // Now always spawns a spike exactly at the position aimed at super.spawnConstruct(world, pos.x, pos.y, pos.z, side, caster, modifiers); // -1 because of the one spawned above int quantity = (int)(getProperty(ICE_SPIKE_COUNT).floatValue() * modifiers.get(WizardryItems.blast_upgrade)) - 1; float maxRadius = getProperty(EFFECT_RADIUS).floatValue() * modifiers.get(WizardryItems.blast_upgrade); for(int i=0; i