Tidy up entity geometry stuff:
- Add a getCentre method for entities to GeometryUtils - Replace getPositionEyes(0) with getPositionEyes(1) since it's more efficient, and by definition they must be the same - Remove all the silly getEntityBoundingBox().minY stuff, this bug has been fixed since 1.8! (which begs the question: if it was considered a bug, how on earth did it go unfixed for that long?) - A few other small things
This commit is contained in:
@@ -281,7 +281,7 @@ public final class WizardryEventHandler {
|
||||
.target(attacker).spawn(world);
|
||||
|
||||
ParticleBuilder.spawnShockParticles(world, attacker.posX,
|
||||
attacker.getEntityBoundingBox().minY + attacker.height / 2, attacker.posZ);
|
||||
attacker.posY + attacker.height / 2, attacker.posZ);
|
||||
}
|
||||
|
||||
DamageSafetyChecker.attackEntitySafely(attacker, MagicDamage.causeDirectMagicDamage(event.getEntityLiving(),
|
||||
|
||||
@@ -3,6 +3,7 @@ package electroblob.wizardry.client.animation;
|
||||
import electroblob.wizardry.data.WizardData;
|
||||
import electroblob.wizardry.item.SpellActions;
|
||||
import electroblob.wizardry.spell.Grapple;
|
||||
import electroblob.wizardry.util.GeometryUtils;
|
||||
import electroblob.wizardry.util.InventoryUtils;
|
||||
import net.minecraft.client.model.ModelBiped;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
@@ -100,7 +101,7 @@ public abstract class ActionAnimation extends Animation {
|
||||
if(hit.entityHit instanceof EntityLivingBase){
|
||||
// If the target is an entity, we need to use the entity's centre rather than the original hit position
|
||||
// because the entity will have moved!
|
||||
target = new Vec3d(hit.entityHit.posX, hit.entityHit.getEntityBoundingBox().minY + hit.entityHit.height/2, hit.entityHit.posZ);
|
||||
target = GeometryUtils.getCentre(hit.entityHit);
|
||||
}
|
||||
|
||||
EnumHandSide side = InventoryUtils.getSideForHand(player, player.getActiveHand());
|
||||
|
||||
@@ -95,7 +95,7 @@ public abstract class ParticleTargeted extends ParticleWizardry {
|
||||
if(this.target != null){
|
||||
|
||||
this.targetX = this.target.prevPosX + (this.target.posX - this.target.prevPosX) * partialTicks;
|
||||
double correction = this.target.getEntityBoundingBox().minY - this.target.posY;
|
||||
double correction = this.target.posY - this.target.posY;
|
||||
this.targetY = this.target.prevPosY + (this.target.posY - this.target.prevPosY) * partialTicks
|
||||
+ target.height/2 + correction;
|
||||
this.targetZ = this.target.prevPosZ + (this.target.posZ - this.target.prevPosZ) * partialTicks;
|
||||
|
||||
@@ -206,7 +206,7 @@ public abstract class ParticleWizardry extends Particle {
|
||||
this.entity = entity;
|
||||
// Set these to the correct values
|
||||
if(entity != null){
|
||||
this.setPosition(this.entity.posX + relativeX, this.entity.getEntityBoundingBox().minY
|
||||
this.setPosition(this.entity.posX + relativeX, this.entity.posY
|
||||
+ relativeY, this.entity.posZ + relativeZ);
|
||||
this.prevPosX = this.posX;
|
||||
this.prevPosY = this.posY;
|
||||
|
||||
@@ -82,7 +82,7 @@ public class RenderFireRing extends Render<EntityFireRing> {
|
||||
float f2 = 0.5F;
|
||||
float f3 = 0.0F;
|
||||
float f4 = 0.2f;
|
||||
float f5 = (float)(entity.posY - entity.getEntityBoundingBox().minY);
|
||||
float f5 = (float)(entity.posY - entity.posY);
|
||||
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
float f61 = 0.0F;
|
||||
int i = 0;
|
||||
@@ -129,7 +129,7 @@ public class RenderFireRing extends Render<EntityFireRing> {
|
||||
float f2 = 0.5F;
|
||||
float f3 = 0.0F;
|
||||
float f4 = 0.2f;
|
||||
float f5 = (float)(entity.posY - entity.getEntityBoundingBox().minY);
|
||||
float f5 = (float)(entity.posY - entity.posY);
|
||||
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
float f61 = 0.0F;
|
||||
int i = 0;
|
||||
|
||||
@@ -121,7 +121,7 @@ public class EntityHammer extends EntityMagicConstruct {
|
||||
ParticleBuilder.create(Type.LIGHTNING).pos(posX, posY + height - 0.1, posZ) .target(target).spawn(world);
|
||||
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX,
|
||||
target.getEntityBoundingBox().minY + target.height, target.posZ);
|
||||
target.posY + target.height, target.posZ);
|
||||
}
|
||||
|
||||
target.playSound(WizardrySounds.ENTITY_HAMMER_ATTACK, 1.0F, rand.nextFloat() * 0.4F + 1.5F);
|
||||
|
||||
@@ -81,7 +81,7 @@ public class EntityLightningSigil extends EntityScaledConstruct {
|
||||
.pos(0, target.height/2, 0).target(secondaryTarget).spawn(world);
|
||||
|
||||
ParticleBuilder.spawnShockParticles(world, secondaryTarget.posX,
|
||||
secondaryTarget.getEntityBoundingBox().minY + secondaryTarget.height / 2,
|
||||
secondaryTarget.posY + secondaryTarget.height / 2,
|
||||
secondaryTarget.posZ);
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ public class EntityStormcloud extends EntityScaledConstruct {
|
||||
}else{
|
||||
ParticleBuilder.create(Type.LIGHTNING).pos(target.posX, posY + height/2, target.posZ)
|
||||
.target(target).scale(2).spawn(world);
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.getEntityBoundingBox().minY + target.height, target.posZ);
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.posY + target.height, target.posZ);
|
||||
}
|
||||
|
||||
target.playSound(WizardrySounds.ENTITY_STORMCLOUD_THUNDER, 1, 1.6f);
|
||||
|
||||
@@ -117,7 +117,7 @@ public class EntityAIAttackSpell<T extends EntityLiving & ISpellCaster> extends
|
||||
|
||||
// Only executed server side.
|
||||
|
||||
double distanceSq = this.attacker.getDistanceSq(this.target.posX, this.target.getEntityBoundingBox().minY,
|
||||
double distanceSq = this.attacker.getDistanceSq(this.target.posX, this.target.posY,
|
||||
this.target.posZ);
|
||||
boolean targetIsVisible = this.attacker.getEntitySenses().canSee(this.target);
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ public class EntityDecoy extends EntitySummonedCreature {
|
||||
if(world.isRemote){
|
||||
for(int i = 0; i < 20; i++){
|
||||
ParticleBuilder.create(Type.DUST)
|
||||
.pos(this.posX + (this.rand.nextDouble() - 0.5) * this.width, this.getEntityBoundingBox().minY
|
||||
.pos(this.posX + (this.rand.nextDouble() - 0.5) * this.width, this.posY
|
||||
+ this.rand.nextDouble() * this.height, this.posZ + (this.rand.nextDouble() - 0.5) * this.width)
|
||||
.time(40)
|
||||
.clr(0.2f, 1.0f, 0.8f)
|
||||
|
||||
@@ -90,7 +90,7 @@ public abstract class EntityMagicArrow extends Entity implements IProjectile, IE
|
||||
|
||||
this.setCaster(caster);
|
||||
|
||||
this.setLocationAndAngles(caster.posX, caster.getEntityBoundingBox().minY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET,
|
||||
this.setLocationAndAngles(caster.posX, caster.posY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET,
|
||||
caster.posZ, caster.rotationYaw, caster.rotationPitch);
|
||||
|
||||
this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
|
||||
@@ -117,10 +117,10 @@ public abstract class EntityMagicArrow extends Entity implements IProjectile, IE
|
||||
|
||||
this.setCaster(caster);
|
||||
|
||||
this.posY = caster.getEntityBoundingBox().minY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET;
|
||||
this.posY = caster.posY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET;
|
||||
double dx = target.posX - caster.posX;
|
||||
double dy = this.doGravity() ? target.getEntityBoundingBox().minY + (double)(target.height / 3.0f) - this.posY
|
||||
: target.getEntityBoundingBox().minY + (double)(target.height / 2.0f) - this.posY;
|
||||
double dy = this.doGravity() ? target.posY + (double)(target.height / 3.0f) - this.posY
|
||||
: target.posY + (double)(target.height / 2.0f) - this.posY;
|
||||
double dz = target.posZ - caster.posZ;
|
||||
double horizontalDistance = (double)MathHelper.sqrt(dx * dx + dz * dz);
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ public abstract class EntityMagicProjectile extends EntityThrowable implements I
|
||||
/** Sets the shooter of the projectile to the given caster, positions the projectile at the given caster's eyes and
|
||||
* aims it in the direction they are looking with the given speed. */
|
||||
public void aim(EntityLivingBase caster, float speed){
|
||||
this.setPosition(caster.posX, caster.getEntityBoundingBox().minY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET, caster.posZ);
|
||||
this.setPosition(caster.posX, caster.posY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET, caster.posZ);
|
||||
// This is the standard set of parameters for this method, used by snowballs and ender pearls amongst others.
|
||||
this.shoot(caster, caster.rotationPitch, caster.rotationYaw, 0.0f, speed, 1.0f);
|
||||
this.thrower = caster;
|
||||
@@ -66,10 +66,10 @@ public abstract class EntityMagicProjectile extends EntityThrowable implements I
|
||||
// Mojang's 'fix' for the projectile-hitting-thrower bug actually made the problem worse, hence the following line.
|
||||
this.ignoreEntity = thrower;
|
||||
|
||||
this.posY = caster.getEntityBoundingBox().minY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET;
|
||||
this.posY = caster.posY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET;
|
||||
double dx = target.posX - caster.posX;
|
||||
double dy = !this.hasNoGravity() ? target.getEntityBoundingBox().minY + (double)(target.height / 3.0f) - this.posY
|
||||
: target.getEntityBoundingBox().minY + (double)(target.height / 2.0f) - this.posY;
|
||||
double dy = !this.hasNoGravity() ? target.posY + (double)(target.height / 3.0f) - this.posY
|
||||
: target.posY + (double)(target.height / 2.0f) - this.posY;
|
||||
double dz = target.posZ - caster.posZ;
|
||||
double horizontalDistance = MathHelper.sqrt(dx * dx + dz * dz);
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ public class EntitySparkBomb extends EntityBomb {
|
||||
|
||||
}else{
|
||||
ParticleBuilder.create(Type.LIGHTNING).pos(this.getPositionVector()).target(target).spawn(world);
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.getEntityBoundingBox().minY + target.height/2, target.posZ);
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.posY + target.height/2, target.posZ);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -609,7 +609,7 @@ public class ItemArtefact extends Item {
|
||||
.pos(0, event.getEntity().height/2, 0).target(target).spawn(player.world);
|
||||
|
||||
ParticleBuilder.spawnShockParticles(player.world, target.posX,
|
||||
target.getEntityBoundingBox().minY + target.height/2, target.posZ);
|
||||
target.posY + target.height/2, target.posZ);
|
||||
}
|
||||
|
||||
DamageSafetyChecker.attackEntitySafely(target, MagicDamage.causeDirectMagicDamage(player,
|
||||
@@ -693,7 +693,7 @@ public class ItemArtefact extends Item {
|
||||
.pos(0, event.getEntity().height/2, 0).target(target).spawn(world);
|
||||
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX,
|
||||
target.getEntityBoundingBox().minY + target.height/2, target.posZ);
|
||||
target.posY + target.height/2, target.posZ);
|
||||
}
|
||||
|
||||
DamageSafetyChecker.attackEntitySafely(target, MagicDamage.causeDirectMagicDamage(player,
|
||||
|
||||
@@ -210,7 +210,7 @@ public class ItemLightningHammer extends Item implements IConjuredItem {
|
||||
if(hit.world.isRemote){
|
||||
ParticleBuilder.create(Type.LIGHTNING).pos(hit.getPositionVector().add(0, hit.height / 2, 0))
|
||||
.target(target).spawn(hit.world);
|
||||
ParticleBuilder.spawnShockParticles(hit.world, target.posX, target.getEntityBoundingBox().minY + target.height / 2, target.posZ);
|
||||
ParticleBuilder.spawnShockParticles(hit.world, target.posX, target.posY + target.height / 2, target.posZ);
|
||||
}
|
||||
|
||||
//target.playSound(WizardrySounds.SPELL_SPARK, 1, 1.5f + 0.4f * world.rand.nextFloat());
|
||||
|
||||
@@ -59,7 +59,7 @@ public class ItemPurifyingElixir extends Item {
|
||||
|
||||
for(int i = 0; i < 20; i++){
|
||||
double x = entity.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = entity.getEntityBoundingBox().minY + entity.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = entity.posY + entity.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = entity.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.14, 0).clr(0x0f001b)
|
||||
.time(20 + world.rand.nextInt(12)).spawn(world);
|
||||
|
||||
@@ -847,7 +847,7 @@ public class ItemWand extends Item implements IWorkbenchItem, ISpellCastingItem,
|
||||
|
||||
if(player.world.isRemote){
|
||||
|
||||
Vec3d origin = new Vec3d(player.posX, player.getEntityBoundingBox().minY + player.getEyeHeight(), player.posZ);
|
||||
Vec3d origin = player.getPositionEyes(1);
|
||||
Vec3d hit = origin.add(player.getLookVec().scale(player.getDistance(event.getTarget())));
|
||||
// Generate two perpendicular vectors in the plane perpendicular to the look vec
|
||||
Vec3d vec1 = player.getLookVec().rotatePitch(90);
|
||||
|
||||
@@ -190,7 +190,7 @@ public abstract class Forfeit {
|
||||
add(Tier.APPRENTICE, Element.FIRE, create("fireball", (w, p) -> {
|
||||
if(!w.isRemote){
|
||||
EntityMagicFireball fireball = new EntityMagicFireball(w);
|
||||
Vec3d vec = p.getPositionEyes(0).add(p.getLookVec().scale(6));
|
||||
Vec3d vec = p.getPositionEyes(1).add(p.getLookVec().scale(6));
|
||||
fireball.setPosition(vec.x, vec.y, vec.z);
|
||||
fireball.shoot(p.posX, p.posY + p.getEyeHeight(), p.posZ, 1.5f, 1);
|
||||
w.spawnEntity(fireball);
|
||||
|
||||
@@ -53,7 +53,7 @@ public interface ICustomPotionParticles extends ISyncedPotion {
|
||||
|
||||
double x = event.getEntityLiving().posX
|
||||
+ (event.getEntityLiving().world.rand.nextDouble() - 0.5) * event.getEntityLiving().width;
|
||||
double y = event.getEntityLiving().getEntityBoundingBox().minY
|
||||
double y = event.getEntityLiving().posY
|
||||
+ event.getEntityLiving().world.rand.nextDouble() * event.getEntityLiving().height;
|
||||
double z = event.getEntityLiving().posZ
|
||||
+ (event.getEntityLiving().world.rand.nextDouble() - 0.5) * event.getEntityLiving().width;
|
||||
|
||||
@@ -54,7 +54,7 @@ public class PotionContainment extends PotionMagicEffect {
|
||||
if(target.getEntityBoundingBox().minX < origin.x - maxDistance) x = origin.x - maxDistance + target.width/2;
|
||||
|
||||
if(target.getEntityBoundingBox().maxY > origin.y + maxDistance) y = origin.y + maxDistance - target.height;
|
||||
if(target.getEntityBoundingBox().minY < origin.y - maxDistance) y = origin.y - maxDistance;
|
||||
if(target.posY < origin.y - maxDistance) y = origin.y - maxDistance;
|
||||
|
||||
if(target.getEntityBoundingBox().maxZ > origin.z + maxDistance) z = origin.z + maxDistance - target.width/2;
|
||||
if(target.getEntityBoundingBox().minZ < origin.z - maxDistance) z = origin.z - maxDistance + target.width/2;
|
||||
@@ -67,7 +67,7 @@ public class PotionContainment extends PotionMagicEffect {
|
||||
// for(int i = 0; i < 20; i++){
|
||||
// ParticleBuilder.create(ParticleBuilder.Type.DUST).pos(
|
||||
// x,
|
||||
// target.getEntityBoundingBox().minY + target.height * target.world.rand.nextFloat(),
|
||||
// target.posY + target.height * target.world.rand.nextFloat(),
|
||||
// target.posZ + target.width * (target.world.rand.nextFloat() - 0.5f))
|
||||
// .face(EnumFacing.EAST).clr(0.8f, 0.9f, 1).spawn(target.world);
|
||||
// }
|
||||
@@ -87,7 +87,7 @@ public class PotionContainment extends PotionMagicEffect {
|
||||
// for(int i = 0; i < 20; i++){
|
||||
// ParticleBuilder.create(ParticleBuilder.Type.DUST).pos(
|
||||
// target.posX + target.width * (target.world.rand.nextFloat() - 0.5f),
|
||||
// target.getEntityBoundingBox().minY + target.height * target.world.rand.nextFloat(),
|
||||
// target.posY + target.height * target.world.rand.nextFloat(),
|
||||
// z)
|
||||
// .face(EnumFacing.SOUTH).clr(0.8f, 0.9f, 1).spawn(target.world);
|
||||
// }
|
||||
|
||||
@@ -31,7 +31,7 @@ public class Arc extends SpellRay {
|
||||
// Rather neatly, the entity can be set here and if it's null nothing will happen.
|
||||
ParticleBuilder.create(Type.LIGHTNING).entity(caster)
|
||||
.pos(caster != null ? origin.subtract(caster.getPositionVector()) : origin).target(target).spawn(world);
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.getEntityBoundingBox().minY + target.height/2, target.posZ);
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.posY + target.height/2, target.posZ);
|
||||
}
|
||||
|
||||
// This is a lot neater than it was, thanks to the damage type system.
|
||||
|
||||
@@ -109,7 +109,7 @@ public class ArcaneJammer extends SpellRay {
|
||||
|
||||
if(event.getWorld().isRemote){
|
||||
|
||||
Vec3d centre = event.getCaster().getPositionEyes(0).add(event.getCaster().getLookVec());
|
||||
Vec3d centre = event.getCaster().getPositionEyes(1).add(event.getCaster().getLookVec());
|
||||
|
||||
for(int i = 0; i < 5; i++){
|
||||
double x = centre.x + 0.5f * (event.getWorld().rand.nextFloat() - 0.5f);
|
||||
|
||||
@@ -68,13 +68,13 @@ public class Banish extends SpellRay {
|
||||
int x = MathHelper.floor(entity.posX + MathHelper.sin(angle) * radius);
|
||||
int z = MathHelper.floor(entity.posZ - MathHelper.cos(angle) * radius);
|
||||
Integer y = BlockUtils.getNearestFloor(world,
|
||||
new BlockPos(x, (int)entity.getEntityBoundingBox().minY, z), (int)radius);
|
||||
new BlockPos(x, (int)entity.posY, z), (int)radius);
|
||||
|
||||
if(world.isRemote){
|
||||
|
||||
for(int i=0; i<10; i++){
|
||||
double dx1 = entity.posX;
|
||||
double dy1 = entity.getEntityBoundingBox().minY + entity.height * world.rand.nextFloat();
|
||||
double dy1 = entity.posY + entity.height * world.rand.nextFloat();
|
||||
double dz1 = entity.posZ;
|
||||
world.spawnParticle(EnumParticleTypes.PORTAL, dx1, dy1, dz1, world.rand.nextDouble() - 0.5,
|
||||
world.rand.nextDouble() - 0.5, world.rand.nextDouble() - 0.5);
|
||||
|
||||
@@ -41,7 +41,7 @@ public class Blink extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i = 0; i < 10; i++){
|
||||
double dx = caster.posX;
|
||||
double dy = caster.getEntityBoundingBox().minY + 2 * world.rand.nextFloat();
|
||||
double dy = caster.posY + 2 * world.rand.nextFloat();
|
||||
double dz = caster.posZ;
|
||||
// For portal particles, velocity is not velocity but the offset where they start, then drift to
|
||||
// the actual position given.
|
||||
@@ -80,7 +80,7 @@ public class Blink extends Spell {
|
||||
|
||||
float angle = (float)(Math.atan2(target.posZ - caster.posZ, target.posX - caster.posX)
|
||||
+ world.rand.nextDouble() * Math.PI);
|
||||
double radius = caster.getDistance(target.posX, target.getEntityBoundingBox().minY, target.posZ)
|
||||
double radius = caster.getDistance(target.posX, target.posY, target.posZ)
|
||||
+ world.rand.nextDouble() * 3.0d;
|
||||
|
||||
int x = MathHelper.floor(target.posX + MathHelper.sin(angle) * radius);
|
||||
@@ -94,7 +94,7 @@ public class Blink extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i = 0; i < 10; i++){
|
||||
double dx1 = caster.posX;
|
||||
double dy1 = caster.getEntityBoundingBox().minY + caster.height * world.rand.nextFloat();
|
||||
double dy1 = caster.posY + caster.height * world.rand.nextFloat();
|
||||
double dz1 = caster.posZ;
|
||||
world.spawnParticle(EnumParticleTypes.PORTAL, dx1, dy1, dz1, world.rand.nextDouble() - 0.5,
|
||||
world.rand.nextDouble() - 0.5, world.rand.nextDouble() - 0.5);
|
||||
|
||||
@@ -110,7 +110,7 @@ public class ChainLightning extends SpellRay {
|
||||
ParticleBuilder.create(Type.LIGHTNING).entity(caster)
|
||||
.pos(caster != null ? origin.subtract(caster.getPositionVector()) : origin).target(target).spawn(world);
|
||||
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.getEntityBoundingBox().minY + target.height/2, target.posZ);
|
||||
ParticleBuilder.spawnShockParticles(world, target.posX, target.posY + target.height/2, target.posZ);
|
||||
}
|
||||
|
||||
//target.playSound(WizardrySounds.SPELL_SPARK, 1, 1.5f + 0.4f * world.rand.nextFloat());
|
||||
|
||||
@@ -84,7 +84,7 @@ public class Divination extends Spell {
|
||||
BlockPos target = sphere.get(sphere.size() - 1);
|
||||
|
||||
direction = EnumFacing.getFacingFromVector((float)(target.getX() + 0.5 - caster.posX),
|
||||
(float)(target.getY() + 0.5 - (caster.getEntityBoundingBox().minY + caster.getEyeHeight())),
|
||||
(float)(target.getY() + 0.5 - (caster.posY + caster.getEyeHeight())),
|
||||
(float)(target.getZ() + 0.5 - caster.posZ));
|
||||
|
||||
strength = Strength.forWeight(calculateWeight(world, caster, target, range, modifiers));
|
||||
|
||||
@@ -61,7 +61,7 @@ public class DragonFireball extends Spell {
|
||||
EntityDragonFireball fireball = new EntityDragonFireball(world, caster, 1, 1, 1);
|
||||
|
||||
double dx = target.posX - caster.posX;
|
||||
double dy = target.getEntityBoundingBox().minY + (double)(target.height / 2.0F)
|
||||
double dy = target.posY + (double)(target.height / 2.0F)
|
||||
- (caster.posY + (double)(caster.height / 2.0F));
|
||||
double dz = target.posZ - caster.posZ;
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ public class Fangs extends Spell {
|
||||
|
||||
@Override
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
if(!spawnFangs(world, new Vec3d(caster.posX, caster.getEntityBoundingBox().minY, caster.posZ),
|
||||
if(!spawnFangs(world, caster.getPositionVector(),
|
||||
GeometryUtils.replaceComponent(caster.getLookVec(), Axis.Y, 0).normalize(), caster, modifiers)) return false;
|
||||
this.playSound(world, caster, ticksInUse, -1, modifiers);
|
||||
return true;
|
||||
|
||||
@@ -3,12 +3,9 @@ package electroblob.wizardry.spell;
|
||||
import electroblob.wizardry.client.DrawingUtils;
|
||||
import electroblob.wizardry.item.SpellActions;
|
||||
import electroblob.wizardry.registry.WizardryItems;
|
||||
import electroblob.wizardry.util.BlockUtils;
|
||||
import electroblob.wizardry.util.*;
|
||||
import electroblob.wizardry.util.BlockUtils.SurfaceCriteria;
|
||||
import electroblob.wizardry.util.EntityUtils;
|
||||
import electroblob.wizardry.util.ParticleBuilder;
|
||||
import electroblob.wizardry.util.ParticleBuilder.Type;
|
||||
import electroblob.wizardry.util.SpellModifiers;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@@ -32,7 +29,7 @@ public class Firestorm extends SpellAreaEffect {
|
||||
|
||||
@Override
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
burnNearbyBlocks(world, new Vec3d(caster.posX, caster.getEntityBoundingBox().minY, caster.posZ), caster, modifiers);
|
||||
burnNearbyBlocks(world, caster.getPositionVector(), caster, modifiers);
|
||||
return super.cast(world, caster, hand, ticksInUse, modifiers);
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ public class FlamingAxe extends SpellConjuration {
|
||||
|
||||
for(int i=0; i<10; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
world.spawnParticle(EnumParticleTypes.FLAME, x, y, z, 0, 0, 0);
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ public class FlamingWeapon extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i=0; i<10; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.1, 0).clr(0.9f, 0.7f, 1).spawn(world);
|
||||
}
|
||||
|
||||
@@ -46,11 +46,11 @@ public class Flight extends Spell {
|
||||
|
||||
if(world.isRemote){
|
||||
double x = caster.posX - 1 + world.rand.nextDouble() * 2;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ - 1 + world.rand.nextDouble() * 2;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, -0.1, 0).time(15).clr(0.8f, 1, 0.5f).spawn(world);
|
||||
x = caster.posX - 1 + world.rand.nextDouble() * 2;
|
||||
y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
z = caster.posZ - 1 + world.rand.nextDouble() * 2;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, -0.1, 0).time(15).clr(1f, 1f, 1f).spawn(world);
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class FreezingWeapon extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i=0; i<10; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.1, 0).clr(0.9f, 0.7f, 1).spawn(world);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ public class FrostAxe extends SpellConjuration {
|
||||
|
||||
for(int i=0; i<10; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SNOW).pos(x, y, z).spawn(world);
|
||||
}
|
||||
|
||||
@@ -57,11 +57,11 @@ public class Glide extends Spell {
|
||||
|
||||
if(world.isRemote){
|
||||
double x = caster.posX - 0.25 + world.rand.nextDouble() / 2;
|
||||
double y = caster.getEntityBoundingBox().minY + world.rand.nextDouble();
|
||||
double y = caster.posY + world.rand.nextDouble();
|
||||
double z = caster.posZ - 0.25 + world.rand.nextDouble() / 2;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, -0.1, 0).time(15).clr(1f, 1f, 1f).spawn(world);
|
||||
x = caster.posX - 0.25 + world.rand.nextDouble() / 2;
|
||||
y = caster.getEntityBoundingBox().minY + world.rand.nextDouble();
|
||||
y = caster.posY + world.rand.nextDouble();
|
||||
z = caster.posZ - 0.25 + world.rand.nextDouble() / 2;
|
||||
ParticleBuilder.create(Type.LEAF).pos(x, y, z).time(20).spawn(world);
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public class Grapple extends Spell {
|
||||
|
||||
WizardData data = WizardData.get(caster);
|
||||
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight(), caster.posZ);
|
||||
Vec3d origin = caster.getPositionEyes(1);
|
||||
|
||||
float extensionSpeed = getProperty(EXTENSION_SPEED).floatValue() * modifiers.get(SpellModifiers.POTENCY);
|
||||
|
||||
@@ -98,7 +98,7 @@ public class Grapple extends Spell {
|
||||
if(hit.entityHit instanceof EntityLivingBase){
|
||||
// If the target is an entity, we need to use the entity's centre rather than the original hit position
|
||||
// because the entity will have moved!
|
||||
target = new Vec3d(hit.entityHit.posX, hit.entityHit.getEntityBoundingBox().minY + hit.entityHit.height/2, hit.entityHit.posZ);
|
||||
target = GeometryUtils.getCentre(hit.entityHit);
|
||||
}
|
||||
|
||||
double distance = origin.distanceTo(target);
|
||||
@@ -209,11 +209,11 @@ public class Grapple extends Spell {
|
||||
|
||||
if(target == null) return false;
|
||||
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight(), caster.posZ);
|
||||
Vec3d origin = caster.getPositionEyes(1);
|
||||
|
||||
// If the target is an entity, we need to use the entity's centre rather than the original hit position
|
||||
// because the entity will have moved!
|
||||
Vec3d targetVec = new Vec3d(target.posX, target.getEntityBoundingBox().minY + target.height/2, target.posZ);
|
||||
Vec3d targetVec = GeometryUtils.getCentre(target);
|
||||
|
||||
RayTraceResult hit = findTarget(world, caster, origin, targetVec.subtract(origin).normalize(), modifiers);
|
||||
|
||||
@@ -284,7 +284,7 @@ public class Grapple extends Spell {
|
||||
|
||||
// If the target is an entity, we need to use the entity's centre rather than the original hit position
|
||||
// because the entity will have moved!
|
||||
Vec3d target = new Vec3d(entity.posX, entity.getEntityBoundingBox().minY + entity.height/2, entity.posZ);
|
||||
Vec3d target = GeometryUtils.getCentre(entity);
|
||||
|
||||
double distance = origin.distanceTo(target);
|
||||
Vec3d vec = target.subtract(origin).normalize();
|
||||
@@ -344,7 +344,7 @@ public class Grapple extends Spell {
|
||||
|
||||
if(caster != null){
|
||||
|
||||
origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight(), caster.posZ);
|
||||
origin = caster.getPositionEyes(1);
|
||||
|
||||
if(caster instanceof EntityPlayer){
|
||||
WizardData data = WizardData.get((EntityPlayer)caster);
|
||||
@@ -354,7 +354,7 @@ public class Grapple extends Spell {
|
||||
}
|
||||
}else if(caster instanceof EntityLiving){
|
||||
Entity entity = ((EntityLiving)caster).getAttackTarget();
|
||||
if(entity != null) target = new Vec3d(entity.posX, entity.getEntityBoundingBox().minY + entity.height/2, entity.posZ);
|
||||
if(entity != null) target = GeometryUtils.getCentre(entity);
|
||||
}
|
||||
|
||||
if(target != null) direction = target.subtract(origin).normalize();
|
||||
|
||||
@@ -6,11 +6,8 @@ import electroblob.wizardry.registry.WizardryBlocks;
|
||||
import electroblob.wizardry.registry.WizardryItems;
|
||||
import electroblob.wizardry.registry.WizardryPotions;
|
||||
import electroblob.wizardry.registry.WizardrySounds;
|
||||
import electroblob.wizardry.util.BlockUtils;
|
||||
import electroblob.wizardry.util.EntityUtils;
|
||||
import electroblob.wizardry.util.ParticleBuilder;
|
||||
import electroblob.wizardry.util.*;
|
||||
import electroblob.wizardry.util.ParticleBuilder.Type;
|
||||
import electroblob.wizardry.util.SpellModifiers;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@@ -36,7 +33,7 @@ public class IceAge extends SpellAreaEffect {
|
||||
|
||||
@Override
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
freezeNearbyBlocks(world, new Vec3d(caster.posX, caster.getEntityBoundingBox().minY, caster.posZ), caster, modifiers);
|
||||
freezeNearbyBlocks(world, caster.getPositionVector(), caster, modifiers);
|
||||
return super.cast(world, caster, hand, ticksInUse, modifiers);
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ public class ImbueWeapon extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i=0; i<10; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.1, 0).clr(0.9f, 0.7f, 1).spawn(world);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ public class Intimidate extends SpellAreaEffect {
|
||||
@Override
|
||||
protected void spawnParticleEffect(World world, Vec3d origin, double radius, @Nullable EntityLivingBase caster, SpellModifiers modifiers){
|
||||
|
||||
if(caster != null) origin = caster.getPositionEyes(0);
|
||||
if(caster != null) origin = caster.getPositionEyes(1);
|
||||
|
||||
for(int i = 0; i < 30; i++){
|
||||
double x = origin.x - 1 + world.rand.nextDouble() * 2;
|
||||
|
||||
@@ -54,7 +54,7 @@ public class InvokeWeather extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i = 0; i < 10; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.1, 0).clr(0.5f, 0.7f, 1).spawn(world);
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ public class Leap extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i = 0; i < 10; i++){
|
||||
double x = caster.posX + world.rand.nextFloat() - 0.5F;
|
||||
double y = caster.getEntityBoundingBox().minY;
|
||||
double y = caster.posY;
|
||||
double z = caster.posZ + world.rand.nextFloat() - 0.5F;
|
||||
world.spawnParticle(EnumParticleTypes.CLOUD, x, y, z, 0, 0, 0);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class Levitation extends Spell {
|
||||
|
||||
if(world.isRemote){
|
||||
double x = caster.posX - 0.25 + world.rand.nextDouble() * 0.5;
|
||||
double y = caster.getEntityBoundingBox().minY;
|
||||
double y = caster.getPositionEyes(1).y;
|
||||
double z = caster.posZ - 0.25 + world.rand.nextDouble() * 0.5;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, -0.1, 0).time(15).clr(0.5f, 1, 0.7f).spawn(world);
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ public class LightningPulse extends Spell {
|
||||
}
|
||||
|
||||
if(world.isRemote){
|
||||
ParticleBuilder.create(Type.LIGHTNING_PULSE).pos(caster.posX, caster.getEntityBoundingBox().minY
|
||||
ParticleBuilder.create(Type.LIGHTNING_PULSE).pos(caster.posX, caster.posY
|
||||
+ GeometryUtils.ANTI_Z_FIGHTING_OFFSET, caster.posZ)
|
||||
.scale(modifiers.get(WizardryItems.blast_upgrade)).spawn(world);
|
||||
}
|
||||
|
||||
@@ -85,10 +85,10 @@ public class MindControl extends SpellRay {
|
||||
|
||||
for(int i=0; i<10; i++){
|
||||
ParticleBuilder.create(Type.DARK_MAGIC, world.rand, target.posX,
|
||||
target.getEntityBoundingBox().minY + target.getEyeHeight(), target.posZ, 0.25, false)
|
||||
target.posY + target.getEyeHeight(), target.posZ, 0.25, false)
|
||||
.clr(0.8f, 0.2f, 1.0f).spawn(world);
|
||||
ParticleBuilder.create(Type.DARK_MAGIC, world.rand, target.posX,
|
||||
target.getEntityBoundingBox().minY + target.getEyeHeight(), target.posZ, 0.25, false)
|
||||
target.posY + target.getEyeHeight(), target.posZ, 0.25, false)
|
||||
.clr(0.2f, 0.04f, 0.25f).spawn(world);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ public class MindTrick extends SpellRay {
|
||||
}else{
|
||||
for(int i=0; i<10; i++){
|
||||
ParticleBuilder.create(Type.DARK_MAGIC, world.rand, target.posX,
|
||||
target.getEntityBoundingBox().minY + target.getEyeHeight(), target.posZ, 0.25, false)
|
||||
target.posY + target.getEyeHeight(), target.posZ, 0.25, false)
|
||||
.clr(0.8f, 0.2f, 1.0f).spawn(world);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ public class PhaseStep extends Spell {
|
||||
|
||||
for(int i = 0; i < 10; i++){
|
||||
double dx1 = caster.posX;
|
||||
double dy1 = caster.getEntityBoundingBox().minY + 2 * world.rand.nextFloat();
|
||||
double dy1 = caster.posY + 2 * world.rand.nextFloat();
|
||||
double dz1 = caster.posZ;
|
||||
world.spawnParticle(EnumParticleTypes.PORTAL, dx1, dy1, dz1, world.rand.nextDouble() - 0.5,
|
||||
world.rand.nextDouble() - 0.5, world.rand.nextDouble() - 0.5);
|
||||
|
||||
@@ -68,7 +68,7 @@ public class PocketFurnace extends Spell {
|
||||
if(world.isRemote){
|
||||
for(int i = 0; i < 10; i++){
|
||||
double x1 = (double)((float)caster.posX + world.rand.nextFloat() * 2 - 1.0F);
|
||||
double y1 = (double)((float)caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5F + world.rand.nextFloat());
|
||||
double y1 = (double)((float)caster.posY + caster.getEyeHeight() - 0.5F + world.rand.nextFloat());
|
||||
double z1 = (double)((float)caster.posZ + world.rand.nextFloat() * 2 - 1.0F);
|
||||
world.spawnParticle(EnumParticleTypes.FLAME, x1, y1, z1, 0, 0.01F, 0);
|
||||
}
|
||||
|
||||
@@ -140,7 +140,7 @@ public class Possession extends SpellRay {
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
|
||||
Vec3d look = caster.getLookVec();
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight() - Y_OFFSET, caster.posZ);
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.posY + caster.getEyeHeight() - Y_OFFSET, caster.posZ);
|
||||
|
||||
if(!shootSpell(world, origin, look, caster, ticksInUse, modifiers)) return false;
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ public class RemoveCurse extends SpellBuff {
|
||||
|
||||
for(int i = 0; i < particleCount*2; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.14, 0).clr(0x0f001b)
|
||||
.time(20 + world.rand.nextInt(12)).spawn(world);
|
||||
|
||||
@@ -50,7 +50,7 @@ public class ShadowWard extends Spell {
|
||||
double dx = -1 + 2 * world.rand.nextFloat();
|
||||
double dy = -1 + world.rand.nextFloat();
|
||||
double dz = -1 + 2 * world.rand.nextFloat();
|
||||
world.spawnParticle(EnumParticleTypes.PORTAL, caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight(), caster.posZ, dx, dy, dz);
|
||||
world.spawnParticle(EnumParticleTypes.PORTAL, caster.posX, caster.posY + caster.getEyeHeight(), caster.posZ, dx, dy, dz);
|
||||
}
|
||||
|
||||
if(ticksInUse % 50 == 0){
|
||||
|
||||
@@ -70,7 +70,7 @@ public class Shockwave extends SpellAreaEffect {
|
||||
double velocityFactor = proximity * getProperty(MAX_REPULSION_VELOCITY).floatValue();
|
||||
|
||||
double dx = target.posX - origin.x;
|
||||
double dy = target.getEntityBoundingBox().minY + 1 - origin.y;
|
||||
double dy = target.posY + 1 - origin.y;
|
||||
double dz = target.posZ - origin.z;
|
||||
|
||||
target.motionX = velocityFactor * dx;
|
||||
|
||||
@@ -46,7 +46,7 @@ public class SpectralPathway extends Spell {
|
||||
|
||||
// Gets the coordinates of the nearest block intersection to the player's feet.
|
||||
// Remember that a block always takes the coordinates of its northwestern corner.
|
||||
BlockPos origin = new BlockPos(Math.round(caster.posX), (int)caster.getEntityBoundingBox().minY - 1,
|
||||
BlockPos origin = new BlockPos(Math.round(caster.posX), (int)caster.posY - 1,
|
||||
Math.round(caster.posZ));
|
||||
|
||||
int startPoint = direction.getAxisDirection() == AxisDirection.POSITIVE ? -1 : 0;
|
||||
|
||||
@@ -108,7 +108,7 @@ public class SpeedTime extends Spell {
|
||||
|
||||
double particleSpread = 2;
|
||||
double x = caster.posX + 2;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.height / 2;
|
||||
double y = caster.posY + caster.height / 2;
|
||||
double z = caster.posZ;
|
||||
|
||||
ParticleBuilder.create(ParticleBuilder.Type.SPARKLE, world.rand, x, y, z, particleSpread, false)
|
||||
|
||||
@@ -4,6 +4,7 @@ import electroblob.wizardry.Wizardry;
|
||||
import electroblob.wizardry.registry.WizardryItems;
|
||||
import electroblob.wizardry.util.AllyDesignationSystem;
|
||||
import electroblob.wizardry.util.EntityUtils;
|
||||
import electroblob.wizardry.util.GeometryUtils;
|
||||
import electroblob.wizardry.util.SpellModifiers;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
@@ -104,7 +105,7 @@ public abstract class SpellAreaEffect extends Spell {
|
||||
|
||||
@Override
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
boolean result = findAndAffectEntities(world, new Vec3d(caster.posX, caster.getEntityBoundingBox().minY, caster.posZ),
|
||||
boolean result = findAndAffectEntities(world, caster.getPositionVector(),
|
||||
caster, ticksInUse, modifiers);
|
||||
if(result) this.playSound(world, caster, ticksInUse, -1, modifiers);
|
||||
return result;
|
||||
|
||||
@@ -195,7 +195,7 @@ public class SpellBuff extends Spell {
|
||||
|
||||
for(int i = 0; i < particleCount; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.1, 0).clr(r, g, b).spawn(world);
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ public class SpellConjuration extends Spell {
|
||||
|
||||
for(int i=0; i<10; i++){
|
||||
double x = caster.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = caster.posY + caster.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = caster.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.1, 0).clr(0.7f, 0.9f, 1).spawn(world);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ public class SpellConstructRanged<T extends EntityMagicConstruct> extends SpellC
|
||||
Vec3d look = caster.getLookVec();
|
||||
|
||||
double x = caster.posX + look.x * range;
|
||||
double y = caster.getEntityBoundingBox().minY + caster.getEyeHeight() + look.y * range;
|
||||
double y = caster.posY + caster.getEyeHeight() + look.y * range;
|
||||
double z = caster.posZ + look.z * range;
|
||||
|
||||
if(!spawnConstruct(world, x, y, z, null, caster, modifiers)) return false;
|
||||
@@ -128,7 +128,7 @@ public class SpellConstructRanged<T extends EntityMagicConstruct> extends SpellC
|
||||
SpellModifiers modifiers){
|
||||
|
||||
double range = getProperty(RANGE).doubleValue() * modifiers.get(WizardryItems.range_upgrade);
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight(), caster.posZ);
|
||||
Vec3d origin = caster.getPositionEyes(1);
|
||||
|
||||
if(target != null && caster.getDistance(target) <= range){
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ public abstract class SpellRay extends Spell {
|
||||
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
|
||||
|
||||
Vec3d look = caster.getLookVec();
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight() - Y_OFFSET, caster.posZ);
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.posY + caster.getEyeHeight() - Y_OFFSET, caster.posZ);
|
||||
if(!this.isContinuous && world.isRemote && !Wizardry.proxy.isFirstPerson(caster)){
|
||||
origin = origin.add(look.scale(1.2));
|
||||
}
|
||||
@@ -175,16 +175,16 @@ public abstract class SpellRay extends Spell {
|
||||
@Override
|
||||
public boolean cast(World world, EntityLiving caster, EnumHand hand, int ticksInUse, EntityLivingBase target, SpellModifiers modifiers){
|
||||
// IDEA: Add in an aiming error and trigger onMiss accordingly
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.getEntityBoundingBox().minY + caster.getEyeHeight() - Y_OFFSET, caster.posZ);
|
||||
Vec3d origin = new Vec3d(caster.posX, caster.posY + caster.getEyeHeight() - Y_OFFSET, caster.posZ);
|
||||
Vec3d targetPos = null;
|
||||
|
||||
if(!ignoreLivingEntities || !EntityUtils.isLiving(target)){
|
||||
targetPos = new Vec3d(target.posX, target.getEntityBoundingBox().minY + target.height / 2, target.posZ);
|
||||
targetPos = new Vec3d(target.posX, target.posY + target.height / 2, target.posZ);
|
||||
|
||||
}else{
|
||||
|
||||
int x = MathHelper.floor(target.posX);
|
||||
int y = (int)target.getEntityBoundingBox().minY - 1; // -1 because we need the block under the target
|
||||
int y = (int)target.posY - 1; // -1 because we need the block under the target
|
||||
int z = MathHelper.floor(target.posZ);
|
||||
BlockPos pos = new BlockPos(x, y, z);
|
||||
|
||||
|
||||
@@ -127,10 +127,10 @@ public class SpellThrowable<T extends EntityThrowable> extends Spell {
|
||||
|
||||
throwable.ignoreEntity = caster;
|
||||
|
||||
throwable.posY = caster.getEntityBoundingBox().minY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET;
|
||||
throwable.posY = caster.posY + (double)caster.getEyeHeight() - LAUNCH_Y_OFFSET;
|
||||
double dx = target.posX - caster.posX;
|
||||
double dy = !throwable.hasNoGravity() ? target.getEntityBoundingBox().minY + (double)(target.height / 3.0f) - throwable.posY
|
||||
: target.getEntityBoundingBox().minY + (double)(target.height / 2.0f) - throwable.posY;
|
||||
double dy = !throwable.hasNoGravity() ? target.posY + (double)(target.height / 3.0f) - throwable.posY
|
||||
: target.posY + (double)(target.height / 2.0f) - throwable.posY;
|
||||
double dz = target.posZ - caster.posZ;
|
||||
double horizontalDistance = MathHelper.sqrt(dx * dx + dz * dz);
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ public class Thunderstorm extends Spell {
|
||||
ParticleBuilder.create(Type.LIGHTNING).pos(x, y, z).target(secondaryTarget).spawn(world);
|
||||
|
||||
ParticleBuilder.spawnShockParticles(world, secondaryTarget.posX,
|
||||
secondaryTarget.getEntityBoundingBox().minY + secondaryTarget.height / 2,
|
||||
secondaryTarget.posY + secondaryTarget.height / 2,
|
||||
secondaryTarget.posZ);
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ public class Thunderstorm extends Spell {
|
||||
ParticleBuilder.create(Type.LIGHTNING).entity(secondaryTarget)
|
||||
.pos(0, secondaryTarget.height / 2, 0).target(tertiaryTarget).spawn(world);
|
||||
ParticleBuilder.spawnShockParticles(world, tertiaryTarget.posX,
|
||||
tertiaryTarget.getEntityBoundingBox().minY + tertiaryTarget.height / 2,
|
||||
tertiaryTarget.posY + tertiaryTarget.height / 2,
|
||||
tertiaryTarget.posZ);
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ public class Whirlwind extends SpellRay {
|
||||
// Left as EntityLivingBase because why not be able to move armour stands around?
|
||||
if(target instanceof EntityLivingBase){
|
||||
|
||||
Vec3d vec = target.getPositionVector().add(0, target.getEyeHeight(), 0).subtract(origin).normalize();
|
||||
Vec3d vec = target.getPositionEyes(1).subtract(origin).normalize();
|
||||
|
||||
if(!world.isRemote){
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ public class WitherSkull extends Spell {
|
||||
EntityWitherSkull witherskull = new EntityWitherSkull(world, caster, 1, 1, 1);
|
||||
|
||||
double dx = target.posX - caster.posX;
|
||||
double dy = target.getEntityBoundingBox().minY + (double)(target.height / 2.0F)
|
||||
double dy = target.posY + (double)(target.height / 2.0F)
|
||||
- (caster.posY + (double)(caster.height / 2.0F));
|
||||
double dz = target.posZ - caster.posZ;
|
||||
|
||||
|
||||
@@ -125,7 +125,7 @@ public final class BlockUtils {
|
||||
* is negative.
|
||||
*/
|
||||
public static IBlockState getBlockEntityIsStandingOn(Entity entity){
|
||||
BlockPos pos = new BlockPos(MathHelper.floor(entity.posX), (int)entity.getEntityBoundingBox().minY - 1,
|
||||
BlockPos pos = new BlockPos(MathHelper.floor(entity.posX), (int)entity.posY - 1,
|
||||
MathHelper.floor(entity.posZ));
|
||||
return entity.world.getBlockState(pos);
|
||||
}
|
||||
|
||||
@@ -210,7 +210,7 @@ public final class EntityUtils {
|
||||
}
|
||||
}
|
||||
|
||||
box = box.offset(destination.subtract(entity.posX, box.minY, entity.posZ));
|
||||
box = box.offset(destination.subtract(entity.posX, entity.posY, entity.posZ));
|
||||
|
||||
// All the parameters of this method are INCLUSIVE, so even the max coordinates should be rounded down
|
||||
Iterable<BlockPos> cuboid = BlockPos.getAllInBox(MathHelper.floor(box.minX), MathHelper.floor(box.minY),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package electroblob.wizardry.util;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumFacing.Axis;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
@@ -49,6 +50,14 @@ public final class GeometryUtils {
|
||||
return new Vec3d(box.minX + (box.maxX - box.minX) * 0.5, box.minY + (box.maxY - box.minY) * 0.5, box.minZ + (box.maxZ - box.minZ) * 0.5);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link Vec3d} of the coordinates at the centre of the given entity's bounding box. This is more
|
||||
* efficient than {@code GeometryUtils.getCentre(entity.getEntityBoundingBox())} as it can use the entity's fields.
|
||||
*/
|
||||
public static Vec3d getCentre(Entity entity){
|
||||
return new Vec3d(entity.posX, entity.posY + entity.height/2, entity.posZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link Vec3d} of the coordinates at the centre of the given face of the given block position (i.e. the
|
||||
* centre of the block plus 0.5 in the given direction).
|
||||
|
||||
@@ -768,7 +768,7 @@ public final class ParticleBuilder {
|
||||
|
||||
for(int i = 0; i < 10; i++){
|
||||
double x = entity.posX + world.rand.nextDouble() * 2 - 1;
|
||||
double y = entity.getEntityBoundingBox().minY + entity.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double y = entity.posY + entity.getEyeHeight() - 0.5 + world.rand.nextDouble();
|
||||
double z = entity.posZ + world.rand.nextDouble() * 2 - 1;
|
||||
ParticleBuilder.create(Type.SPARKLE).pos(x, y, z).vel(0, 0.1, 0).clr(1, 1, 0.3f).spawn(world);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public final class RayTracer {
|
||||
public static RayTraceResult standardBlockRayTrace(World world, EntityLivingBase entity, double range, boolean hitLiquids,
|
||||
boolean ignoreUncollidables, boolean returnLastUncollidable){
|
||||
// This method does not apply an offset like ray spells do, since it is not desirable in most other use cases.
|
||||
Vec3d origin = new Vec3d(entity.posX, entity.getEntityBoundingBox().minY + entity.getEyeHeight(), entity.posZ);
|
||||
Vec3d origin = entity.getPositionEyes(1);
|
||||
Vec3d endpoint = origin.add(entity.getLookVec().scale(range));
|
||||
return world.rayTraceBlocks(origin, endpoint, hitLiquids, ignoreUncollidables, returnLastUncollidable);
|
||||
}
|
||||
@@ -76,7 +76,7 @@ public final class RayTracer {
|
||||
@Nullable
|
||||
public static RayTraceResult standardEntityRayTrace(World world, Entity entity, double range, boolean hitLiquids){
|
||||
// This method does not apply an offset like ray spells do, since it is not desirable in most other use cases.
|
||||
Vec3d origin = new Vec3d(entity.posX, entity.getEntityBoundingBox().minY + entity.getEyeHeight(), entity.posZ);
|
||||
Vec3d origin = entity.getPositionEyes(1);
|
||||
Vec3d endpoint = origin.add(entity.getLookVec().scale(range));
|
||||
return rayTrace(world, origin, endpoint, 0, hitLiquids, false, false, Entity.class, ignoreEntityFilter(entity));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user