diff --git a/src/main/java/electroblob/wizardry/client/renderer/entity/RenderBoulder.java b/src/main/java/electroblob/wizardry/client/renderer/entity/RenderBoulder.java index 8fffdbd2..286d5eb2 100644 --- a/src/main/java/electroblob/wizardry/client/renderer/entity/RenderBoulder.java +++ b/src/main/java/electroblob/wizardry/client/renderer/entity/RenderBoulder.java @@ -23,16 +23,19 @@ public class RenderBoulder extends Render { public void doRender(EntityBoulder entity, double x, double y, double z, float yaw, float partialTicks){ GlStateManager.pushMatrix(); - GlStateManager.translate(x, y + 1.2, z); + GlStateManager.translate(x, y + entity.height/2, z); GlStateManager.rotate(180, 0F, 0F, 1F); GlStateManager.rotate(yaw - 90, 0, 1, 0); GlStateManager.rotate(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * partialTicks, 0, 0, 1); - GlStateManager.translate(0, entity.height/2 - 1.5, 0); + GlStateManager.translate(0, -entity.height/2, 0); // Pass in -1 for the lifetime as the boulder crumbles when the time expires float s = DrawingUtils.smoothScaleFactor(-1, entity.ticksExisted, partialTicks, 10, 10); + s *= entity.getSizeMultiplier(); GlStateManager.scale(s, s, s); + GlStateManager.translate(0, 0.875, 0); // No idea why it starts 7/8 of a block too low, but it does + this.bindTexture(TEXTURE); model.render(entity, 0, 0, 0, 0, 0, 0.0625f); diff --git a/src/main/java/electroblob/wizardry/entity/construct/EntityBoulder.java b/src/main/java/electroblob/wizardry/entity/construct/EntityBoulder.java index e380afeb..72a4b9de 100644 --- a/src/main/java/electroblob/wizardry/entity/construct/EntityBoulder.java +++ b/src/main/java/electroblob/wizardry/entity/construct/EntityBoulder.java @@ -1,11 +1,11 @@ package electroblob.wizardry.entity.construct; +import com.google.common.collect.Lists; import electroblob.wizardry.Wizardry; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.spell.Boulder; import electroblob.wizardry.spell.Spell; -import electroblob.wizardry.util.BlockUtils; import electroblob.wizardry.util.EntityUtils; import electroblob.wizardry.util.MagicDamage; import electroblob.wizardry.util.MagicDamage.DamageType; @@ -56,9 +56,11 @@ public class EntityBoulder extends EntityScaledConstruct { super.onUpdate(); - this.motionY -= 0.03999999910593033D; + this.motionY -= 0.03999999910593033D; // Gravity + this.move(MoverType.SELF, velX, motionY, velZ); + // Entity damage List collided = world.getEntitiesWithinAABB(EntityLivingBase.class, this.getEntityBoundingBox()); float damage = Spells.boulder.getProperty(Spell.DAMAGE).floatValue() * damageMultiplier; @@ -68,7 +70,15 @@ public class EntityBoulder extends EntityScaledConstruct { if(!isValidTarget(entity)) break; - if(EntityUtils.attackEntityWithoutKnockback(entity, MagicDamage.causeIndirectMagicDamage(this, getCaster(), DamageType.MAGIC), damage)){ + boolean crushBonus = entity.posY < this.posY + && entity.getEntityBoundingBox().minX > this.getEntityBoundingBox().minX + && entity.getEntityBoundingBox().maxX < this.getEntityBoundingBox().maxX + && entity.getEntityBoundingBox().minZ > this.getEntityBoundingBox().minZ + && entity.getEntityBoundingBox().maxZ < this.getEntityBoundingBox().maxZ; + + if(EntityUtils.attackEntityWithoutKnockback(entity, MagicDamage.causeIndirectMagicDamage(this, + getCaster(), DamageType.MAGIC), crushBonus ? damage * 1.5f : damage) && !crushBonus){ + // Only knock back if not crushing EntityUtils.applyStandardKnockback(this, entity, knockback); entity.motionX += this.motionX; entity.motionZ += this.motionZ; @@ -76,8 +86,26 @@ public class EntityBoulder extends EntityScaledConstruct { entity.playSound(WizardrySounds.ENTITY_BOULDER_HIT, 1, 1); } + // Wall smashing if(EntityUtils.canDamageBlocks(getCaster(), world) && collidedHorizontally){ - smashBlocks(BlockUtils.getBlockSphere(new BlockPos(posX + velX, posY + height / 2, posZ + velZ), height * 0.8), true); + AxisAlignedBB box = getEntityBoundingBox().offset(velX, 0, velZ); + List cuboid = Lists.newArrayList(BlockPos.getAllInBox(MathHelper.floor(box.minX), MathHelper.floor(box.minY), + MathHelper.floor(box.minZ), MathHelper.floor(box.maxX), MathHelper.floor(box.maxY), MathHelper.floor(box.maxZ))); + smashBlocks(cuboid, true); + } + + // Trailing particles + for(int i = 0; i < 10; i++){ + + double particleX = this.posX + width * 0.7 * (rand.nextDouble() - 0.5); + double particleZ = this.posZ + width * 0.7 * (rand.nextDouble() - 0.5); + + IBlockState block = world.getBlockState(new BlockPos(this).down()); + + if(block.getBlock() != Blocks.AIR){ + world.spawnParticle(EnumParticleTypes.BLOCK_DUST, particleX, this.posY, particleZ, + 0, 0.2, 0, Block.getStateId(block)); + } } } @@ -123,7 +151,7 @@ public class EntityBoulder extends EntityScaledConstruct { if(world.isRemote){ - for(int i = 0; i < 100; i++){ + for(int i = 0; i < 200; i++){ double x = posX + (rand.nextDouble() - 0.5) * width; double y = posY + rand.nextDouble() * height; double z = posZ + (rand.nextDouble() - 0.5) * width; @@ -148,14 +176,18 @@ public class EntityBoulder extends EntityScaledConstruct { super.fall(distance, damageMultiplier); + // Floor smashing if(EntityUtils.canDamageBlocks(getCaster(), world) && distance > 3){ - List sphere = BlockUtils.getBlockSphere(new BlockPos(posX + velX, posY + height / 2 + motionY, posZ + velZ), height * 0.8); - if(smashBlocks(sphere, distance > 8)) return; + AxisAlignedBB box = getEntityBoundingBox().offset(velX, motionY, velZ); + List cuboid = Lists.newArrayList(BlockPos.getAllInBox(MathHelper.floor(box.minX), MathHelper.floor(box.minY), + MathHelper.floor(box.minZ), MathHelper.floor(box.maxX), MathHelper.floor(box.maxY), MathHelper.floor(box.maxZ))); + if(smashBlocks(cuboid, distance > 8)) return; hitsRemaining--; } if(world.isRemote){ + // Landing particles for(int i = 0; i < 40; i++){ double particleX = this.posX - 1.5 + 3 * rand.nextDouble(); @@ -169,6 +201,7 @@ public class EntityBoulder extends EntityScaledConstruct { } } + // Other landing effects if(distance > 1.2){ world.playSound(posX, posY, posZ, WizardrySounds.ENTITY_BOULDER_LAND, SoundCategory.BLOCKS, Math.min(2, distance / 4), 1, false); shakeNearbyPlayers();