diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java index 51c26ea8..9f179443 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java @@ -98,7 +98,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS @Override public boolean isDead() { - return dead && deathTicks <= 0; + return dead && deathTicks <= 0 && super.isDead(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java index be09a09c..9ca99fc5 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java @@ -164,7 +164,7 @@ public class DarkVortexSpell extends AbstractSpell implements ProjectileDelegate } }); - if (!source.subtractEnergyCost(accumulatedMass * 0.001)) { + if (!source.subtractEnergyCost(0.01)) { setDead(); source.asWorld().createExplosion(source.asEntity(), origin.x, origin.y, origin.z, 3, ExplosionSourceType.NONE); } @@ -175,7 +175,7 @@ public class DarkVortexSpell extends AbstractSpell implements ProjectileDelegate @Override public void tickDying(Caster source) { - accumulatedMass /= 2D; + accumulatedMass *= 0.8F; double mass = getMass() * 0.1; double logarithm = 1 - (1D / (1 + (mass * mass))); radius.update((float)Math.max(0.1, logarithm * source.asWorld().getGameRules().getInt(UGameRules.MAX_DARK_VORTEX_SIZE)), 200L); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/spell/DarkVortexSpellRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/spell/DarkVortexSpellRenderer.java index 2134f8c3..f8a84c1a 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/spell/DarkVortexSpellRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/spell/DarkVortexSpellRenderer.java @@ -7,6 +7,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.effect.DarkVortexSpell; import com.minelittlepony.unicopia.client.render.RenderLayers; import com.minelittlepony.unicopia.client.render.model.PlaneModel; import com.minelittlepony.unicopia.client.render.model.SphereModel; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Camera; import net.minecraft.client.render.RenderLayer; @@ -16,6 +17,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; public class DarkVortexSpellRenderer extends SpellRenderer { @@ -38,12 +40,15 @@ public class DarkVortexSpellRenderer extends SpellRenderer { public void render(MatrixStack matrices, VertexConsumerProvider vertices, DarkVortexSpell spell, Caster caster, int light, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { Camera camera = MinecraftClient.getInstance().gameRenderer.getCamera(); + Vec3d ray = camera.getPos().subtract(spell.getOrigin(caster)); + float radius = (float)spell.getEventHorizonRadius(); - float absDistance = (float)camera.getPos().distanceTo(spell.getOrigin(caster)); + float absDistance = (float)ray.length(); matrices.push(); matrices.translate(0, spell.getYOffset(), 0); + matrices.multiply(RotationAxis.NEGATIVE_Y.rotationDegrees(-caster.asEntity().getYaw())); float visualRadius = Math.min(radius * 0.8F, absDistance - 1F); @@ -53,11 +58,6 @@ public class DarkVortexSpellRenderer extends SpellRenderer { SphereModel.SPHERE.render(matrices, vertices.getBuffer(RenderLayers.getMagicColored()), light, 1, visualRadius + 0.15F, 0, 0, 0, 0.9F); matrices.push(); - matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(90)); - matrices.multiply(RotationAxis.NEGATIVE_X.rotationDegrees(90 + camera.getYaw())); - matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(-camera.getPitch())); - - matrices.scale(0.7F, 1, 1); float distance = 1F / MathHelper.clamp(absDistance / (radius + 7), 0.0000001F, 1); distance *= distance; @@ -67,46 +67,41 @@ public class DarkVortexSpellRenderer extends SpellRenderer { SphereModel.DISK.render(matrices, vertices.getBuffer(RenderLayers.getEndPortal()), light, 1, radius * 0.5F, 0, 0, 0, 0); - matrices.push(); - matrices.scale(distance, distance, distance); - - if (absDistance > radius) { - matrices.push(); - matrices.translate(0, -0.1F, 0); - for (int i = 0; i < 10; i++) { - float brightness = i / 10F; - SphereModel.DISK.render(matrices, vertices.getBuffer(RenderLayers.getMagicNoColor()), light, 1, radius * (1 + (0.25F * i)) * 0.7F, brightness, brightness, brightness, 0.2F); - } - matrices.pop(); - } - matrices.pop(); - - - if (radius > 0.3F && absDistance > radius) { + double g = Math.sqrt(ray.x * ray.x + ray.z * ray.z); + float pitch = MathHelper.wrapDegrees((float)(-(MathHelper.atan2(ray.y, g) * 180.0F / (float)Math.PI))); + float yaw = MathHelper.wrapDegrees((float)(MathHelper.atan2(ray.z, ray.x) * 180.0F / (float)Math.PI) - 90.0F); + + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(caster.asEntity().getYaw())); + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-yaw)); + matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-pitch)); + radius *= Math.min(2, 3 + radius); float processionSpeed = animationProgress * 0.02F; float maxProcessionAngle = 15; + float cosProcession = MathHelper.cos(processionSpeed); + float sinProcession = MathHelper.sin(processionSpeed); + float range = (float)spell.getDrawDropOffRange() / 8F; matrices.scale(range, range, range); - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90 + MathHelper.cos(processionSpeed) * maxProcessionAngle)); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(MathHelper.sin(processionSpeed) * maxProcessionAngle)); + + matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(cosProcession * maxProcessionAngle)); + matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(sinProcession * maxProcessionAngle)); matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(animationProgress * 18)); + VertexConsumer buffer = vertices.getBuffer(RenderLayer.getEntityTranslucent(ACCRETION_DISK_TEXTURE)); PlaneModel.INSTANCE.render(matrices, buffer, light, 0, 1, 1, 1, 1, 1); - - - - matrices.scale(0.9F, 0.9F, 0.9F); + float secondaryScale = 0.9F + cosProcession * 0.3F; + matrices.translate(0, 0, 0.0001F); + matrices.scale(secondaryScale, secondaryScale, secondaryScale); matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(33)); - PlaneModel.INSTANCE.render(matrices, buffer, light, 0, 1, 1, 1, 1, 1); - + matrices.translate(0, 0, 0.0001F); matrices.scale(0.9F, 0.9F, 0.9F); matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(33)); PlaneModel.INSTANCE.render(matrices, buffer, light, 0, 1, 1, 1, 1, 1);