diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/ArcanusConfig.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/ArcanusConfig.java index 7683431c..79fe2337 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/ArcanusConfig.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/ArcanusConfig.java @@ -84,8 +84,8 @@ public static final class TouchShapeProperties { public static double potencyModifier = 0.2; } - @Category(id = "projectileShapeProperties", translation = "config.arcanuscontinuum.projectileShapeProperties", sortOrder = 2) - public static final class ProjectileShapeProperties { + @Category(id = "missileShapeProperties", translation = "config.arcanuscontinuum.missileShapeProperties", sortOrder = 2) + public static final class MissileShapeProperties { @ConfigEntry(id = "enabled", type = EntryType.BOOLEAN, translation = "config.arcanuscontinuum.enabled") public static boolean enabled = true; diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellEffect.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellEffect.java index 083c359c..44435bd6 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellEffect.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellEffect.java @@ -23,7 +23,7 @@ public SpellType getType() { public abstract void effect(@Nullable LivingEntity caster, @Nullable Entity sourceEntity, Level level, HitResult target, List effects, ItemStack stack, double potency); - public boolean shouldTriggerOnceOnExplosion() { + public boolean singleCastOnly() { return false; } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellGroup.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellGroup.java index e536f044..08c28f11 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellGroup.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/api/spells/SpellGroup.java @@ -25,6 +25,8 @@ public static SpellGroup fromNbt(CompoundTag tag) { // TODO remove in 1.21.1 String nbtId = nbtEffects.getString(i); ResourceLocation correctedId = switch(nbtId) { + case "arcanuscontinuum:projectile_shape" -> ArcanusSpellComponents.MISSILE.getId(); + case "arcanuscontinuum:lob_shape" -> ArcanusSpellComponents.LOB.getId(); case "arcanuscontinuum:explosion_shape" -> ArcanusSpellComponents.BURST.getId(); case "arcanuscontinuum:guardian_orb_shape" -> ArcanusSpellComponents.ENTANGLED_ORB.getId(); case "arcanuscontinuum:aggressorb_shape" -> ArcanusSpellComponents.AGGRESSORB.getId(); diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/ArcanusClient.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/ArcanusClient.java index 62c7ad30..420abafd 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/ArcanusClient.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/ArcanusClient.java @@ -120,7 +120,8 @@ public void onInitializeClient() { EntityRendererRegistry.register(ArcanusEntities.OPOSSUM.get(), OpossumEntityRenderer::new); EntityRendererRegistry.register(ArcanusEntities.NECRO_SKELETON.get(), SkeletonRenderer::new); EntityRendererRegistry.register(ArcanusEntities.MANA_SHIELD.get(), ManaShieldEntityRenderer::new); - EntityRendererRegistry.register(ArcanusEntities.MAGIC_PROJECTILE.get(), MagicProjectileEntityRenderer::new); + EntityRendererRegistry.register(ArcanusEntities.MISSILE.get(), MissileEntityRenderer::new); + EntityRendererRegistry.register(ArcanusEntities.LOB.get(), LobEntityRenderer::new); EntityRendererRegistry.register(ArcanusEntities.AOE.get(), AreaOfEffectEntityRenderer::new); EntityRendererRegistry.register(ArcanusEntities.SMITE.get(), SmiteEntityRenderer::new); EntityRendererRegistry.register(ArcanusEntities.MAGIC_RUNE.get(), MagicRuneEntityRenderer::new); diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicLobModel.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicLobModel.java index 86137c6c..dcc70463 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicLobModel.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicLobModel.java @@ -3,14 +3,14 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.cammiescorner.arcanuscontinuum.Arcanus; -import dev.cammiescorner.arcanuscontinuum.common.entities.magic.MagicProjectile; +import dev.cammiescorner.arcanuscontinuum.common.entities.magic.Missile; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; -public class MagicLobModel extends EntityModel { +public class MagicLobModel extends EntityModel { public static final ModelLayerLocation MODEL_LAYER = new ModelLayerLocation(Arcanus.id("magic_lob"), "main"); public final ModelPart cube1; public final ModelPart cube2; @@ -41,7 +41,7 @@ public void renderToBuffer(PoseStack matrices, VertexConsumer vertexConsumer, in } @Override - public void setupAnim(MagicProjectile entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + public void setupAnim(Missile entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicProjectileModel.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicProjectileModel.java index 50d85a02..ee11b5c6 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicProjectileModel.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/models/entity/magic/MagicProjectileModel.java @@ -3,14 +3,14 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.cammiescorner.arcanuscontinuum.Arcanus; -import dev.cammiescorner.arcanuscontinuum.common.entities.magic.MagicProjectile; +import dev.cammiescorner.arcanuscontinuum.common.entities.magic.Missile; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; -public class MagicProjectileModel extends EntityModel { +public class MagicProjectileModel extends EntityModel { public static final ModelLayerLocation MODEL_LAYER = new ModelLayerLocation(Arcanus.id("magic_projectile"), "main"); private final ModelPart base; public final ModelPart ring1; @@ -42,7 +42,7 @@ public void renderToBuffer(PoseStack matrices, VertexConsumer vertexConsumer, in } @Override - public void setupAnim(MagicProjectile entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + public void setupAnim(Missile entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/LobEntityRenderer.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/LobEntityRenderer.java new file mode 100644 index 00000000..01598bf7 --- /dev/null +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/LobEntityRenderer.java @@ -0,0 +1,49 @@ +package dev.cammiescorner.arcanuscontinuum.client.renderer.entity.magic; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import dev.cammiescorner.arcanuscontinuum.Arcanus; +import dev.cammiescorner.arcanuscontinuum.client.ArcanusClient; +import dev.cammiescorner.arcanuscontinuum.client.models.entity.magic.MagicLobModel; +import dev.cammiescorner.arcanuscontinuum.common.entities.magic.Lob; +import dev.cammiescorner.arcanuscontinuum.common.util.ArcanusHelper; +import dev.cammiescorner.arcanuscontinuum.common.util.Color; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.ArrowRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; + +public class LobEntityRenderer extends ArrowRenderer { + private static final ResourceLocation LOB_TEXTURE = Arcanus.id("textures/entity/magic/lob.png"); + private final MagicLobModel lobModel; + + public LobEntityRenderer(EntityRendererProvider.Context context) { + super(context); + lobModel = new MagicLobModel(context.getModelSet().bakeLayer(MagicLobModel.MODEL_LAYER)); + } + + @Override + public void render(Lob entity, float yaw, float tickDelta, PoseStack matrices, MultiBufferSource vertices, int light) { + VertexConsumer consumer = vertices.getBuffer(ArcanusClient.getMagicCircles(getTextureLocation(entity))); + Color color = ArcanusHelper.getMagicColor(entity); + + matrices.pushPose(); + + matrices.translate(0, 0.3, 0); + lobModel.cube1.xRot = (entity.tickCount + tickDelta) * 0.1f; + lobModel.cube1.yRot = (entity.tickCount + tickDelta) * 0.1f; + lobModel.cube2.yRot = -(entity.tickCount + tickDelta) * 0.125f; + lobModel.cube2.zRot = -(entity.tickCount + tickDelta) * 0.125f; + lobModel.cube3.zRot = (entity.tickCount + tickDelta) * 0.15f; + lobModel.cube3.xRot = (entity.tickCount + tickDelta) * 0.15f; + lobModel.renderToBuffer(matrices, consumer, light, OverlayTexture.NO_OVERLAY, color.redF(), color.greenF(), color.blueF(), 1f); + + matrices.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(Lob entity) { + return LOB_TEXTURE; + } +} diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/MagicProjectileEntityRenderer.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/MagicProjectileEntityRenderer.java deleted file mode 100644 index 38673005..00000000 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/MagicProjectileEntityRenderer.java +++ /dev/null @@ -1,68 +0,0 @@ -package dev.cammiescorner.arcanuscontinuum.client.renderer.entity.magic; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; -import dev.cammiescorner.arcanuscontinuum.Arcanus; -import dev.cammiescorner.arcanuscontinuum.client.ArcanusClient; -import dev.cammiescorner.arcanuscontinuum.client.models.entity.magic.MagicLobModel; -import dev.cammiescorner.arcanuscontinuum.client.models.entity.magic.MagicProjectileModel; -import dev.cammiescorner.arcanuscontinuum.common.entities.magic.MagicProjectile; -import dev.cammiescorner.arcanuscontinuum.common.registry.ArcanusSpellComponents; -import dev.cammiescorner.arcanuscontinuum.common.util.ArcanusHelper; -import dev.cammiescorner.arcanuscontinuum.common.util.Color; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.ArrowRenderer; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; - -public class MagicProjectileEntityRenderer extends ArrowRenderer { - private static final ResourceLocation PROJECTILE_TEXTURE = Arcanus.id("textures/entity/magic/projectile.png"); - private static final ResourceLocation LOB_TEXTURE = Arcanus.id("textures/entity/magic/lob.png"); - private final MagicLobModel lobModel; - private final MagicProjectileModel projectileModel; - - public MagicProjectileEntityRenderer(EntityRendererProvider.Context context) { - super(context); - lobModel = new MagicLobModel(context.getModelSet().bakeLayer(MagicLobModel.MODEL_LAYER)); - projectileModel = new MagicProjectileModel(context.getModelSet().bakeLayer(MagicProjectileModel.MODEL_LAYER)); - } - - @Override - public void render(MagicProjectile entity, float yaw, float tickDelta, PoseStack matrices, MultiBufferSource vertices, int light) { - VertexConsumer consumer = vertices.getBuffer(ArcanusClient.getMagicCircles(getTextureLocation(entity))); - boolean isProjectile = ArcanusSpellComponents.PROJECTILE.is(entity.getShape()); - Color color = ArcanusHelper.getMagicColor(entity); - - matrices.pushPose(); - - if(isProjectile) { - matrices.mulPose(Axis.YP.rotationDegrees(Mth.lerp(tickDelta, entity.yRotO, entity.getYRot()) - 180.0F)); - matrices.mulPose(Axis.XP.rotationDegrees(Mth.lerp(tickDelta, entity.xRotO, entity.getXRot()))); - matrices.translate(0.0F, -1.0F, 0.0F); - projectileModel.ring1.zRot = (entity.tickCount + tickDelta) * 0.1F; - projectileModel.ring2.zRot = -(entity.tickCount + tickDelta) * 0.125F; - projectileModel.ring3.zRot = (entity.tickCount + tickDelta) * 0.15F; - projectileModel.renderToBuffer(matrices, consumer, light, OverlayTexture.NO_OVERLAY, color.redF(), color.greenF(), color.blueF(), 1.0F); - } - else { - matrices.translate(0, 0.3, 0); - lobModel.cube1.xRot = (entity.tickCount + tickDelta) * 0.1F; - lobModel.cube1.yRot = (entity.tickCount + tickDelta) * 0.1F; - lobModel.cube2.yRot = -(entity.tickCount + tickDelta) * 0.125F; - lobModel.cube2.zRot = -(entity.tickCount + tickDelta) * 0.125F; - lobModel.cube3.zRot = (entity.tickCount + tickDelta) * 0.15F; - lobModel.cube3.xRot = (entity.tickCount + tickDelta) * 0.15F; - lobModel.renderToBuffer(matrices, consumer, light, OverlayTexture.NO_OVERLAY, color.redF(), color.greenF(), color.blueF(), 1.0F); - } - - matrices.popPose(); - } - - @Override - public ResourceLocation getTextureLocation(MagicProjectile entity) { - return ArcanusSpellComponents.PROJECTILE.is(entity.getShape()) ? PROJECTILE_TEXTURE : LOB_TEXTURE; - } -} diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/MissileEntityRenderer.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/MissileEntityRenderer.java new file mode 100644 index 00000000..5ac16d08 --- /dev/null +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/client/renderer/entity/magic/MissileEntityRenderer.java @@ -0,0 +1,50 @@ +package dev.cammiescorner.arcanuscontinuum.client.renderer.entity.magic; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import dev.cammiescorner.arcanuscontinuum.Arcanus; +import dev.cammiescorner.arcanuscontinuum.client.ArcanusClient; +import dev.cammiescorner.arcanuscontinuum.client.models.entity.magic.MagicProjectileModel; +import dev.cammiescorner.arcanuscontinuum.common.entities.magic.Missile; +import dev.cammiescorner.arcanuscontinuum.common.util.ArcanusHelper; +import dev.cammiescorner.arcanuscontinuum.common.util.Color; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.ArrowRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +public class MissileEntityRenderer extends ArrowRenderer { + private static final ResourceLocation PROJECTILE_TEXTURE = Arcanus.id("textures/entity/magic/projectile.png"); + private final MagicProjectileModel projectileModel; + + public MissileEntityRenderer(EntityRendererProvider.Context context) { + super(context); + projectileModel = new MagicProjectileModel(context.getModelSet().bakeLayer(MagicProjectileModel.MODEL_LAYER)); + } + + @Override + public void render(Missile entity, float yaw, float tickDelta, PoseStack matrices, MultiBufferSource vertices, int light) { + VertexConsumer consumer = vertices.getBuffer(ArcanusClient.getMagicCircles(getTextureLocation(entity))); + Color color = ArcanusHelper.getMagicColor(entity); + + matrices.pushPose(); + + matrices.mulPose(Axis.YP.rotationDegrees(Mth.lerp(tickDelta, entity.yRotO, entity.getYRot()) - 180f)); + matrices.mulPose(Axis.XP.rotationDegrees(Mth.lerp(tickDelta, entity.xRotO, entity.getXRot()))); + matrices.translate(0f, -1f, 0f); + projectileModel.ring1.zRot = (entity.tickCount + tickDelta) * 0.1f; + projectileModel.ring2.zRot = -(entity.tickCount + tickDelta) * 0.125f; + projectileModel.ring3.zRot = (entity.tickCount + tickDelta) * 0.15f; + projectileModel.renderToBuffer(matrices, consumer, light, OverlayTexture.NO_OVERLAY, color.redF(), color.greenF(), color.blueF(), 1f); + + matrices.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(Missile entity) { + return PROJECTILE_TEXTURE; + } +} diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/compat/DynamicLightsCompat.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/compat/DynamicLightsCompat.java index 26af5e61..29337717 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/compat/DynamicLightsCompat.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/compat/DynamicLightsCompat.java @@ -14,7 +14,7 @@ public void onInitializeDynamicLights() { DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.BEAM.get(), entity -> (int) (Math.abs(Math.sin(entity.tickCount * 0.05)) * 4 + 5)); DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.ENTANGLED_ORB.get(), entity -> (int) (Math.abs(Math.sin(entity.tickCount * 0.05)) * 5 + 6)); DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.AGGRESSORB.get(), entity -> (int) (Math.abs(Math.sin(entity.tickCount * 0.05)) * 5 + 6)); - DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.MAGIC_PROJECTILE.get(), entity -> (int) (Math.abs(Math.sin(entity.tickCount * 0.05)) * 3 + 4)); + DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.MISSILE.get(), entity -> (int) (Math.abs(Math.sin(entity.tickCount * 0.05)) * 3 + 4)); DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.MAGIC_RUNE.get(), entity -> (int) (Math.abs(Math.sin(entity.tickCount * 0.05)) * 3 + 4)); DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.MANA_SHIELD.get(), entity -> (int) (Math.abs(Math.sin(entity.tickCount * 0.05)) * 7 + 8)); DynamicLightHandlers.registerDynamicLightHandler(ArcanusEntities.SMITE.get(), entity -> (int) (-0.103501 * entity.tickCount * entity.tickCount + 2.15793 * entity.tickCount + 3.38905)); diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/AreaOfEffect.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/AreaOfEffect.java index a4bf562e..95ca11b9 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/AreaOfEffect.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/AreaOfEffect.java @@ -79,7 +79,7 @@ public void tick() { AABB box = new AABB(-2, 0, -2, 2, 2.5, 2).move(position()); for(SpellEffect effect : new HashSet<>(effects)) { - if(effect.shouldTriggerOnceOnExplosion()) + if(effect.singleCastOnly()) continue; level().getEntitiesOfClass(Entity.class, box, entity -> entity.isAlive() && !entity.isSpectator() && entity instanceof Targetable targetable && targetable.arcanus$canBeTargeted()).forEach(entity -> { @@ -95,7 +95,7 @@ public void tick() { } for(SpellEffect effect : new HashSet<>(effects)) - if(effect.shouldTriggerOnceOnExplosion()) + if(effect.singleCastOnly()) effect.effect(getCaster(), this, level(), new EntityHitResult(this), effects, stack, potency); } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/GuidedShot.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/GuidedShot.java new file mode 100644 index 00000000..e889a87a --- /dev/null +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/GuidedShot.java @@ -0,0 +1,4 @@ +package dev.cammiescorner.arcanuscontinuum.common.entities.magic; + +public class GuidedShot { +} diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Lob.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Lob.java new file mode 100644 index 00000000..db6030f7 --- /dev/null +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Lob.java @@ -0,0 +1,159 @@ +package dev.cammiescorner.arcanuscontinuum.common.entities.magic; + +import dev.cammiescorner.arcanuscontinuum.Arcanus; +import dev.cammiescorner.arcanuscontinuum.ArcanusConfig; +import dev.cammiescorner.arcanuscontinuum.api.entities.Targetable; +import dev.cammiescorner.arcanuscontinuum.api.spells.SpellEffect; +import dev.cammiescorner.arcanuscontinuum.api.spells.SpellGroup; +import dev.cammiescorner.arcanuscontinuum.api.spells.SpellShape; +import dev.cammiescorner.arcanuscontinuum.common.util.ArcanusHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +public class Lob extends AbstractArrow implements Targetable { + private ItemStack stack = ItemStack.EMPTY; + private List effects = new ArrayList<>(); + private List spellGroups = new ArrayList<>(); + private int groupIndex; + private double potency; + + public Lob(EntityType entityType, Level world) { + super(entityType, world); + } + + @Override + public void tick() { + if(level() instanceof ServerLevel server && (getOwner() == null || !getOwner().isAlive())) { + EntityHitResult target = new EntityHitResult(this); + + for(SpellEffect effect : new HashSet<>(effects)) + effect.effect((LivingEntity) getOwner(), this, level(), target, effects, stack, potency); + + if(getOwner() instanceof LivingEntity caster) + SpellShape.castNext(caster, target.getLocation(), null, server, stack, spellGroups, groupIndex, potency); + + kill(); + return; + } + + super.tick(); + } + + @Override + public boolean displayFireAnimation() { + return false; + } + + @Override + protected void onHitEntity(EntityHitResult target) { + if(level() instanceof ServerLevel server) { + for(SpellEffect effect : new HashSet<>(effects)) + effect.effect((LivingEntity) getOwner(), this, level(), target, effects, stack, potency); + + if(getOwner() instanceof LivingEntity caster) + SpellShape.castNext(caster, target.getLocation(), target.getEntity(), server, stack, spellGroups, groupIndex, potency); + } + + playSound(getHitGroundSoundEvent(), 1F, 1.2F / (random.nextFloat() * 0.2F + 0.9F)); + kill(); + } + + @Override + protected void onHitBlock(BlockHitResult target) { + if(getOwner() instanceof LivingEntity caster && level() instanceof ServerLevel server) { + for(SpellEffect effect : new HashSet<>(effects)) + effect.effect(caster, this, level(), target, effects, stack, potency); + + SpellShape.castNext(caster, target.getLocation(), this, server, stack, spellGroups, groupIndex, potency); + } + + super.onHitBlock(target); + kill(); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + effects.clear(); + spellGroups.clear(); + + stack = ItemStack.of(tag.getCompound("ItemStack")); + potency = tag.getDouble("Potency"); + groupIndex = tag.getInt("GroupIndex"); + + ListTag effectList = tag.getList("Effects", Tag.TAG_STRING); + ListTag groupsList = tag.getList("SpellGroups", Tag.TAG_COMPOUND); + + for(int i = 0; i < effectList.size(); i++) + effects.add((SpellEffect) Arcanus.SPELL_COMPONENTS.get(new ResourceLocation(effectList.getString(i)))); + for(int i = 0; i < groupsList.size(); i++) + spellGroups.add(SpellGroup.fromNbt(groupsList.getCompound(i))); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + ListTag effectList = new ListTag(); + ListTag groupsList = new ListTag(); + + tag.put("ItemStack", stack.save(new CompoundTag())); + tag.putDouble("Potency", potency); + tag.putInt("GroupIndex", groupIndex); + + for(SpellEffect effect : effects) + effectList.add(StringTag.valueOf(Arcanus.SPELL_COMPONENTS.getKey(effect).toString())); + for(SpellGroup group : spellGroups) + groupsList.add(group.toNbt()); + + tag.put("Effects", effectList); + tag.put("SpellGroups", groupsList); + } + + @Override + protected SoundEvent getDefaultHitGroundSoundEvent() { + return super.getDefaultHitGroundSoundEvent(); + } + + @Override + protected float getWaterInertia() { + return 1F; + } + + @Override + protected ItemStack getPickupItem() { + return ItemStack.EMPTY; + } + + public void setProperties(Entity caster, @Nullable Entity castSource, ItemStack stack, List effects, List groups, int groupIndex, double potency) { + Entity sourceEntity = castSource != null ? castSource : caster; + shootFromRotation(sourceEntity, sourceEntity.getXRot(), sourceEntity.getYRot(), 0f, ArcanusConfig.SpellShapes.LobShapeProperties.projectileSpeed, 1f); + setOwner(caster); + setPosRaw(sourceEntity.getX(), sourceEntity.getEyeY(), sourceEntity.getZ()); + setNoGravity(true); + setBaseDamage(0); + this.stack = stack; + this.effects = effects; + this.spellGroups = groups; + this.groupIndex = groupIndex; + this.potency = potency; + ArcanusHelper.copyMagicColor(this, caster); + } +} diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/MagicProjectile.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Missile.java similarity index 85% rename from src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/MagicProjectile.java rename to src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Missile.java index 7b27e0b2..76230b10 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/MagicProjectile.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Missile.java @@ -6,8 +6,6 @@ import dev.cammiescorner.arcanuscontinuum.api.spells.SpellEffect; import dev.cammiescorner.arcanuscontinuum.api.spells.SpellGroup; import dev.cammiescorner.arcanuscontinuum.api.spells.SpellShape; -import dev.cammiescorner.arcanuscontinuum.common.registry.ArcanusComponents; -import dev.cammiescorner.arcanuscontinuum.common.registry.ArcanusSpellComponents; import dev.cammiescorner.arcanuscontinuum.common.util.ArcanusHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -30,22 +28,22 @@ import java.util.HashSet; import java.util.List; -public class MagicProjectile extends AbstractArrow implements Targetable { +public class Missile extends AbstractArrow implements Targetable { private ItemStack stack = ItemStack.EMPTY; private List effects = new ArrayList<>(); private List spellGroups = new ArrayList<>(); private int groupIndex; private double potency; - public MagicProjectile(EntityType entityType, Level world) { + public Missile(EntityType entityType, Level world) { super(entityType, world); } @Override public void tick() { - int lifeSpan = ArcanusConfig.SpellShapes.ProjectileShapeProperties.baseLifeSpan; + int lifeSpan = ArcanusConfig.SpellShapes.MissileShapeProperties.baseLifeSpan; - if(level() instanceof ServerLevel server && (getOwner() == null || !getOwner().isAlive() || (ArcanusSpellComponents.PROJECTILE.is(getShape()) && tickCount >= lifeSpan))) { + if(level() instanceof ServerLevel server && (getOwner() == null || !getOwner().isAlive() || tickCount >= lifeSpan)) { EntityHitResult target = new EntityHitResult(this); for(SpellEffect effect : new HashSet<>(effects)) @@ -146,18 +144,13 @@ protected ItemStack getPickupItem() { return ItemStack.EMPTY; } - public SpellShape getShape() { - return ArcanusComponents.getSpellShape(this); - } - - public void setProperties(Entity caster, @Nullable Entity castSource, SpellShape shape, ItemStack stack, List effects, List groups, int groupIndex, double potency, float speed, boolean noGravity) { + public void setProperties(Entity caster, @Nullable Entity castSource, ItemStack stack, List effects, List groups, int groupIndex, double potency) { Entity sourceEntity = castSource != null ? castSource : caster; - shootFromRotation(sourceEntity, sourceEntity.getXRot(), sourceEntity.getYRot(), 0F, speed, 1F); + shootFromRotation(sourceEntity, sourceEntity.getXRot(), sourceEntity.getYRot(), 0f, ArcanusConfig.SpellShapes.MissileShapeProperties.projectileSpeed, 1f); setOwner(caster); setPosRaw(sourceEntity.getX(), sourceEntity.getEyeY(), sourceEntity.getZ()); - setNoGravity(noGravity); + setNoGravity(true); setBaseDamage(0); - ArcanusComponents.setSpellShape(this, shape); this.stack = stack; this.effects = effects; this.spellGroups = groups; diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Smite.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Smite.java index a1535b12..cbef930c 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Smite.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/entities/magic/Smite.java @@ -50,7 +50,7 @@ public void tick() { AABB box = new AABB(getX() - 4, getY() - 1, getZ() - 4, getX() + 4, (level().getHeight() + 2048) - getY(), getZ() + 4); for(SpellEffect effect : new HashSet<>(effects)) { - if(effect.shouldTriggerOnceOnExplosion()) { + if(effect.singleCastOnly()) { effect.effect(getCaster(), this, level(), new EntityHitResult(this), effects, stack, potency); continue; } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusComponents.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusComponents.java index 8ffdb6e9..3bec4513 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusComponents.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusComponents.java @@ -96,7 +96,6 @@ public void registerEntityComponentFactories(EntityComponentFactoryRegistry regi registry.beginRegistration(LivingEntity.class, STUN_COMPONENT).respawnStrategy(RespawnCopyStrategy.NEVER_COPY).end(StunComponent::new); registry.beginRegistration(Player.class, QUEST_COMPONENT).respawnStrategy(RespawnCopyStrategy.ALWAYS_COPY).end(QuestComponent::new); registry.beginRegistration(LivingEntity.class, BOLT_TARGET).respawnStrategy(RespawnCopyStrategy.NEVER_COPY).end(BoltTargetComponent::new); - registry.beginRegistration(MagicProjectile.class, SPELL_SHAPE).end(SpellShapeComponent::new); registry.beginRegistration(LivingEntity.class, AGGRESSORB_COMPONENT).respawnStrategy(RespawnCopyStrategy.NEVER_COPY).end(AggressorbComponent::new); registry.beginRegistration(LivingEntity.class, GUARDIAN_ORB_COMPONENT).respawnStrategy(RespawnCopyStrategy.NEVER_COPY).end(GuardianOrbComponent::new); registry.beginRegistration(Player.class, PORTAL_COOL_DOWN_COMPONENT).respawnStrategy(RespawnCopyStrategy.ALWAYS_COPY).end(PortalCoolDownComponent::new); @@ -107,7 +106,7 @@ public void registerEntityComponentFactories(EntityComponentFactoryRegistry regi AreaOfEffect.class, Beam.class, EntangledOrb.class, - MagicProjectile.class, + Missile.class, MagicRune.class, ManaShield.class, PocketDimensionPortal.class, diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusEntities.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusEntities.java index 370dba78..f9f6f461 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusEntities.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusEntities.java @@ -15,17 +15,18 @@ public class ArcanusEntities { public static final RegistryHandler> ENTITY_TYPES = RegistryHandler.create(Registries.ENTITY_TYPE, Arcanus.MOD_ID); - public static final RegistrySupplier> WIZARD = ENTITY_TYPES.register("wizard", () -> FabricEntityTypeBuilder.createMob().entityFactory(Wizard::new).defaultAttributes(Wizard::createMobAttributes).dimensions(EntityDimensions.scalable(0.7F, 1.8F)).build()); - public static final RegistrySupplier> OPOSSUM = ENTITY_TYPES.register("opossum", () -> FabricEntityTypeBuilder.createMob().entityFactory(Opossum::new).defaultAttributes(Opossum::createMobAttributes).dimensions(EntityDimensions.scalable(0.6F, 0.7F)).build()); - public static final RegistrySupplier> NECRO_SKELETON = ENTITY_TYPES.register("necro_skeleton", () -> FabricEntityTypeBuilder.createMob().entityFactory(NecroSkeleton::new).disableSummon().defaultAttributes(NecroSkeleton::createAttributes).dimensions(EntityDimensions.scalable(0.6F, 1.8F)).build()); - public static final RegistrySupplier> MANA_SHIELD = ENTITY_TYPES.register("mana_shield", () -> FabricEntityTypeBuilder.create().entityFactory(ManaShield::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(4F, 4F)).build()); - public static final RegistrySupplier> MAGIC_PROJECTILE = ENTITY_TYPES.register("magic_projectile", () -> FabricEntityTypeBuilder.create().entityFactory(MagicProjectile::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.6F, 0.6F)).build()); - public static final RegistrySupplier> SMITE = ENTITY_TYPES.register("smite", () -> FabricEntityTypeBuilder.create().entityFactory(Smite::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(4F, 4F)).build()); - public static final RegistrySupplier> MAGIC_RUNE = ENTITY_TYPES.register("magic_rune", () -> FabricEntityTypeBuilder.create().entityFactory(MagicRune::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(1F, 0.125F)).build()); - public static final RegistrySupplier> AOE = ENTITY_TYPES.register("area_of_effect", () -> FabricEntityTypeBuilder.create().entityFactory(AreaOfEffect::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(4F, 2.5F)).build()); - public static final RegistrySupplier> BEAM = ENTITY_TYPES.register("beam", () -> FabricEntityTypeBuilder.create().entityFactory(Beam::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.1F, 0.1F)).build()); - public static final RegistrySupplier> ENTANGLED_ORB = ENTITY_TYPES.register("entangled_orb", () -> FabricEntityTypeBuilder.create().entityFactory(EntangledOrb::new).trackedUpdateRate(60).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.4F, 0.4F)).build()); - public static final RegistrySupplier> AGGRESSORB = ENTITY_TYPES.register("aggressorb", () -> FabricEntityTypeBuilder.create().entityFactory(Aggressorb::new).trackedUpdateRate(60).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.4F, 0.4F)).build()); + public static final RegistrySupplier> WIZARD = ENTITY_TYPES.register("wizard", () -> FabricEntityTypeBuilder.createMob().entityFactory(Wizard::new).defaultAttributes(Wizard::createMobAttributes).dimensions(EntityDimensions.scalable(0.7f, 1.8f)).build()); + public static final RegistrySupplier> OPOSSUM = ENTITY_TYPES.register("opossum", () -> FabricEntityTypeBuilder.createMob().entityFactory(Opossum::new).defaultAttributes(Opossum::createMobAttributes).dimensions(EntityDimensions.scalable(0.6f, 0.7f)).build()); + public static final RegistrySupplier> NECRO_SKELETON = ENTITY_TYPES.register("necro_skeleton", () -> FabricEntityTypeBuilder.createMob().entityFactory(NecroSkeleton::new).disableSummon().defaultAttributes(NecroSkeleton::createAttributes).dimensions(EntityDimensions.scalable(0.6f, 1.8f)).build()); + public static final RegistrySupplier> MANA_SHIELD = ENTITY_TYPES.register("mana_shield", () -> FabricEntityTypeBuilder.create().entityFactory(ManaShield::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(4f, 4f)).build()); + public static final RegistrySupplier> MISSILE = ENTITY_TYPES.register("missile", () -> FabricEntityTypeBuilder.create().entityFactory(Missile::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.6f, 0.6f)).build()); + public static final RegistrySupplier> LOB = ENTITY_TYPES.register("lob", () -> FabricEntityTypeBuilder.create().entityFactory(Lob::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.6f, 0.6f)).build()); + public static final RegistrySupplier> SMITE = ENTITY_TYPES.register("smite", () -> FabricEntityTypeBuilder.create().entityFactory(Smite::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(4f, 4f)).build()); + public static final RegistrySupplier> MAGIC_RUNE = ENTITY_TYPES.register("magic_rune", () -> FabricEntityTypeBuilder.create().entityFactory(MagicRune::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(1f, 0.125f)).build()); + public static final RegistrySupplier> AOE = ENTITY_TYPES.register("area_of_effect", () -> FabricEntityTypeBuilder.create().entityFactory(AreaOfEffect::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(4f, 2.5f)).build()); + public static final RegistrySupplier> BEAM = ENTITY_TYPES.register("beam", () -> FabricEntityTypeBuilder.create().entityFactory(Beam::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.1f, 0.1f)).build()); + public static final RegistrySupplier> ENTANGLED_ORB = ENTITY_TYPES.register("entangled_orb", () -> FabricEntityTypeBuilder.create().entityFactory(EntangledOrb::new).trackedUpdateRate(60).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.4f, 0.4f)).build()); + public static final RegistrySupplier> AGGRESSORB = ENTITY_TYPES.register("aggressorb", () -> FabricEntityTypeBuilder.create().entityFactory(Aggressorb::new).trackedUpdateRate(60).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(0.4f, 0.4f)).build()); public static final RegistrySupplier> PORTAL = ENTITY_TYPES.register("pocket_dimension_portal", () -> FabricEntityTypeBuilder.create().entityFactory(PocketDimensionPortal::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(1.5f, 0.1f)).build()); public static final RegistrySupplier> TEMPORAL_DILATION_FIELD = ENTITY_TYPES.register("temporal_dilation_field", () -> FabricEntityTypeBuilder.create().entityFactory(TemporalDilationField::new).fireImmune().disableSummon().dimensions(EntityDimensions.fixed(9f, 9f)).build()); } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusSpellComponents.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusSpellComponents.java index 71e2ca74..0ac3a144 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusSpellComponents.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/registry/ArcanusSpellComponents.java @@ -36,7 +36,7 @@ public void cast(@Nullable LivingEntity caster, Vec3 castFrom, @Nullable Entity //-----Spell Shapes-----// public static final RegistrySupplier SELF = SPELL_COMPONENTS.register("self_shape", SelfSpellShape::new); public static final RegistrySupplier TOUCH = SPELL_COMPONENTS.register("touch_shape", TouchSpellShape::new); - public static final RegistrySupplier PROJECTILE = SPELL_COMPONENTS.register("projectile_shape", ProjectileSpellShape::new); + public static final RegistrySupplier MISSILE = SPELL_COMPONENTS.register("missile_shape", MissileSpellShape::new); public static final RegistrySupplier LOB = SPELL_COMPONENTS.register("lob_shape", LobSpellShape::new); public static final RegistrySupplier BOLT = SPELL_COMPONENTS.register("bolt_shape", BoltSpellShape::new); public static final RegistrySupplier BEAM = SPELL_COMPONENTS.register("beam_shape", BeamSpellShape::new); @@ -46,7 +46,7 @@ public void cast(@Nullable LivingEntity caster, Vec3 castFrom, @Nullable Entity public static final RegistrySupplier COUNTER = SPELL_COMPONENTS.register("counter_shape", CounterSpellShape::new); public static final RegistrySupplier AOE = SPELL_COMPONENTS.register("aoe_shape", AreaOfEffectSpellShape::new); public static final RegistrySupplier SMITE = SPELL_COMPONENTS.register("smite_shape", SmiteSpellShape::new); - public static final RegistrySupplier ENTANGLED_ORB = SPELL_COMPONENTS.register("entangled_orb_shape", GuardianOrbSpellShape::new); + public static final RegistrySupplier ENTANGLED_ORB = SPELL_COMPONENTS.register("entangled_orb_shape", EntangledOrbSpellShape::new); public static final RegistrySupplier AGGRESSORB = SPELL_COMPONENTS.register("aggressorb_shape", AggressorbSpellShape::new); // TODO replace name with something better. also change the texture file //-----Spell Effects-----// diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/attack/NecromancySpellEffect.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/attack/NecromancySpellEffect.java index 53ce0ea0..ca912084 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/attack/NecromancySpellEffect.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/attack/NecromancySpellEffect.java @@ -57,7 +57,7 @@ public void effect(@Nullable LivingEntity caster, @Nullable Entity sourceEntity, } @Override - public boolean shouldTriggerOnceOnExplosion() { + public boolean singleCastOnly() { return true; } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/support/ManaShieldSpellEffect.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/support/ManaShieldSpellEffect.java index 38303c1c..439d18ff 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/support/ManaShieldSpellEffect.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/support/ManaShieldSpellEffect.java @@ -49,7 +49,7 @@ public void effect(@Nullable LivingEntity caster, @Nullable Entity sourceEntity, } @Override - public boolean shouldTriggerOnceOnExplosion() { + public boolean singleCastOnly() { return true; } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/utility/SpatialRiftSpellEffect.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/utility/SpatialRiftSpellEffect.java index 4369087f..f2ecb3c6 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/utility/SpatialRiftSpellEffect.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/effects/utility/SpatialRiftSpellEffect.java @@ -35,7 +35,7 @@ public void effect(@Nullable LivingEntity caster, @Nullable Entity sourceEntity, } @Override - public boolean shouldTriggerOnceOnExplosion() { + public boolean singleCastOnly() { return true; } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/BurstSpellShape.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/BurstSpellShape.java index cfe54a07..bd5e45de 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/BurstSpellShape.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/BurstSpellShape.java @@ -50,7 +50,7 @@ public void cast(@Nullable LivingEntity caster, Vec3 castFrom, @Nullable Entity } for(SpellEffect effect : new HashSet<>(effects)) { - if(effect.shouldTriggerOnceOnExplosion()) { + if(effect.singleCastOnly()) { effect.effect(caster, sourceEntity, level, new EntityHitResult(sourceEntity), effects, stack, potency); continue; } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/GuardianOrbSpellShape.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/EntangledOrbSpellShape.java similarity index 95% rename from src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/GuardianOrbSpellShape.java rename to src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/EntangledOrbSpellShape.java index 7e4ce89c..332ba6ca 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/GuardianOrbSpellShape.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/EntangledOrbSpellShape.java @@ -15,8 +15,8 @@ import java.util.List; -public class GuardianOrbSpellShape extends SpellShape { - public GuardianOrbSpellShape() { +public class EntangledOrbSpellShape extends SpellShape { + public EntangledOrbSpellShape() { super( ArcanusConfig.SpellShapes.EntangledOrbShapeProperties.enabled, ArcanusConfig.SpellShapes.EntangledOrbShapeProperties.weight, diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/LobSpellShape.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/LobSpellShape.java index 2f9d3e6d..885768c6 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/LobSpellShape.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/LobSpellShape.java @@ -4,7 +4,7 @@ import dev.cammiescorner.arcanuscontinuum.api.spells.SpellEffect; import dev.cammiescorner.arcanuscontinuum.api.spells.SpellGroup; import dev.cammiescorner.arcanuscontinuum.api.spells.SpellShape; -import dev.cammiescorner.arcanuscontinuum.common.entities.magic.MagicProjectile; +import dev.cammiescorner.arcanuscontinuum.common.entities.magic.Lob; import dev.cammiescorner.arcanuscontinuum.common.registry.ArcanusEntities; import dev.cammiescorner.arcanuscontinuum.common.util.ArcanusHelper; import net.minecraft.server.level.ServerLevel; @@ -41,7 +41,7 @@ public void cast(@Nullable LivingEntity caster, Vec3 castFrom, @Nullable Entity potency += getPotencyModifier(); if(caster != null) { - List list = world.getEntities(EntityTypeTest.forClass(MagicProjectile.class), entity -> caster.equals(entity.getOwner())); + List list = world.getEntities(EntityTypeTest.forClass(Lob.class), entity -> caster.equals(entity.getOwner())); Entity sourceEntity = castSource != null ? castSource : caster; HitResult target = ArcanusHelper.raycast(sourceEntity, 4.5, true, true); @@ -53,14 +53,14 @@ public void cast(@Nullable LivingEntity caster, Vec3 castFrom, @Nullable Entity effect.effect(caster, sourceEntity, world, target, effects, stack, potency); SpellShape.castNext(caster, target.getLocation(), hitResult.getEntity(), world, stack, spellGroups, groupIndex, potency); - world.playSound(hitResult.getEntity(), hitResult.getEntity().blockPosition(), SoundEvents.ARROW_HIT, SoundSource.NEUTRAL, 1F, 1.2F / (world.random.nextFloat() * 0.2F + 0.9F)); + world.playSound(hitResult.getEntity(), hitResult.getEntity().blockPosition(), SoundEvents.ARROW_HIT, SoundSource.NEUTRAL, 1f, 1.2f / (world.random.nextFloat() * 0.2f + 0.9f)); } else { - MagicProjectile projectile = ArcanusEntities.MAGIC_PROJECTILE.get().create(world); + Lob lob = ArcanusEntities.LOB.get().create(world); - if(projectile != null) { - projectile.setProperties(caster, castSource, this, stack, effects, spellGroups, groupIndex, potency, projectileSpeed, false); - world.addFreshEntity(projectile); + if(lob != null) { + lob.setProperties(caster, castSource, stack, effects, spellGroups, groupIndex, potency); + world.addFreshEntity(lob); } } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/ProjectileSpellShape.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/MissileSpellShape.java similarity index 64% rename from src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/ProjectileSpellShape.java rename to src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/MissileSpellShape.java index 21d5b80f..fb8ed33b 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/ProjectileSpellShape.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/common/spell_components/shapes/MissileSpellShape.java @@ -4,7 +4,7 @@ import dev.cammiescorner.arcanuscontinuum.api.spells.SpellEffect; import dev.cammiescorner.arcanuscontinuum.api.spells.SpellGroup; import dev.cammiescorner.arcanuscontinuum.api.spells.SpellShape; -import dev.cammiescorner.arcanuscontinuum.common.entities.magic.MagicProjectile; +import dev.cammiescorner.arcanuscontinuum.common.entities.magic.Missile; import dev.cammiescorner.arcanuscontinuum.common.registry.ArcanusEntities; import dev.cammiescorner.arcanuscontinuum.common.util.ArcanusHelper; import net.minecraft.server.level.ServerLevel; @@ -22,26 +22,26 @@ import java.util.HashSet; import java.util.List; -public class ProjectileSpellShape extends SpellShape { - public ProjectileSpellShape() { +public class MissileSpellShape extends SpellShape { + public MissileSpellShape() { super( - ArcanusConfig.SpellShapes.ProjectileShapeProperties.enabled, - ArcanusConfig.SpellShapes.ProjectileShapeProperties.weight, - ArcanusConfig.SpellShapes.ProjectileShapeProperties.manaCost, - ArcanusConfig.SpellShapes.ProjectileShapeProperties.manaMultiplier, - ArcanusConfig.SpellShapes.ProjectileShapeProperties.coolDown, - ArcanusConfig.SpellShapes.ProjectileShapeProperties.minimumLevel, - ArcanusConfig.SpellShapes.ProjectileShapeProperties.potencyModifier + ArcanusConfig.SpellShapes.MissileShapeProperties.enabled, + ArcanusConfig.SpellShapes.MissileShapeProperties.weight, + ArcanusConfig.SpellShapes.MissileShapeProperties.manaCost, + ArcanusConfig.SpellShapes.MissileShapeProperties.manaMultiplier, + ArcanusConfig.SpellShapes.MissileShapeProperties.coolDown, + ArcanusConfig.SpellShapes.MissileShapeProperties.minimumLevel, + ArcanusConfig.SpellShapes.MissileShapeProperties.potencyModifier ); } @Override public void cast(@Nullable LivingEntity caster, Vec3 castFrom, @Nullable Entity castSource, ServerLevel world, ItemStack stack, List effects, List spellGroups, int groupIndex, double potency) { - float projectileSpeed = ArcanusConfig.SpellShapes.ProjectileShapeProperties.projectileSpeed; + float projectileSpeed = ArcanusConfig.SpellShapes.MissileShapeProperties.projectileSpeed; potency += getPotencyModifier(); if(caster != null) { - List list = world.getEntities(EntityTypeTest.forClass(MagicProjectile.class), entity -> caster.equals(entity.getOwner())); + List list = world.getEntities(EntityTypeTest.forClass(Missile.class), entity -> caster.equals(entity.getOwner())); Entity sourceEntity = castSource != null ? castSource : caster; HitResult target = ArcanusHelper.raycast(sourceEntity, 4.5, true, true); @@ -53,13 +53,13 @@ public void cast(@Nullable LivingEntity caster, Vec3 castFrom, @Nullable Entity effect.effect(caster, sourceEntity, world, target, effects, stack, potency); SpellShape.castNext(caster, target.getLocation(), hitResult.getEntity(), world, stack, spellGroups, groupIndex, potency); - world.playSound(hitResult.getEntity(), hitResult.getEntity().blockPosition(), SoundEvents.ARROW_HIT, SoundSource.NEUTRAL, 1F, 1.2F / (world.random.nextFloat() * 0.2F + 0.9F)); + world.playSound(hitResult.getEntity(), hitResult.getEntity().blockPosition(), SoundEvents.ARROW_HIT, SoundSource.NEUTRAL, 1f, 1.2f / (world.random.nextFloat() * 0.2f + 0.9f)); } else { - MagicProjectile projectile = ArcanusEntities.MAGIC_PROJECTILE.get().create(world); + Missile projectile = ArcanusEntities.MISSILE.get().create(world); if(projectile != null) { - projectile.setProperties(caster, castSource, this, stack, effects, spellGroups, groupIndex, potency, projectileSpeed, false); + projectile.setProperties(caster, castSource, stack, effects, spellGroups, groupIndex, potency); world.addFreshEntity(projectile); } } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/client/ArcanusEnglishLanguageProvider.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/client/ArcanusEnglishLanguageProvider.java index 0ee7314e..3a99cf3c 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/client/ArcanusEnglishLanguageProvider.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/client/ArcanusEnglishLanguageProvider.java @@ -110,7 +110,8 @@ public void generateTranslations(TranslationBuilder builder) { builder.add(ArcanusEntities.AOE.get(), "Area Of Effect"); builder.add(ArcanusEntities.BEAM.get(), "Beam"); builder.add(ArcanusEntities.ENTANGLED_ORB.get(), "Entangled Orb"); - builder.add(ArcanusEntities.MAGIC_PROJECTILE.get(), "Magic Projectile"); + builder.add(ArcanusEntities.MISSILE.get(), "Missile"); + builder.add(ArcanusEntities.LOB.get(), "Lob"); builder.add(ArcanusEntities.MAGIC_RUNE.get(), "Magic Rune"); builder.add(ArcanusEntities.MANA_SHIELD.get(), "Mana Shield"); builder.add(ArcanusEntities.NECRO_SKELETON.get(), "Necro Skeleton"); @@ -219,7 +220,7 @@ public void generateTranslations(TranslationBuilder builder) { spell(builder, ArcanusSpellComponents.EMPTY, "EMPTY"); spell(builder, ArcanusSpellComponents.SELF, "Self Shape"); spell(builder, ArcanusSpellComponents.TOUCH, "Touch Shape"); - spell(builder, ArcanusSpellComponents.PROJECTILE, "Projectile Shape"); + spell(builder, ArcanusSpellComponents.MISSILE, "Missile Shape"); spell(builder, ArcanusSpellComponents.LOB, "Lob Shape"); spell(builder, ArcanusSpellComponents.BOLT, "Bolt Shape"); spell(builder, ArcanusSpellComponents.BEAM, "Beam Shape"); @@ -371,7 +372,7 @@ public void generateTranslations(TranslationBuilder builder) { builder.add("config.arcanuscontinuum.baseManaDrain", "Base Mana Drain"); builder.add("config.arcanuscontinuum.selfShapeProperties", "Self Shape"); builder.add("config.arcanuscontinuum.touchShapeProperties", "Touch Shape"); - builder.add("config.arcanuscontinuum.projectileShapeProperties", "Projectile Shape"); + builder.add("config.arcanuscontinuum.missileShapeProperties", "Missile Shape"); builder.add("config.arcanuscontinuum.lobShapeProperties", "Lob Shape"); builder.add("config.arcanuscontinuum.boltShapeProperties", "Bolt Shape"); builder.add("config.arcanuscontinuum.beamShapeProperties", "Beam Shape"); diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/common/ArcanusChestLootProvider.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/common/ArcanusChestLootProvider.java index fe46b699..6b30c695 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/common/ArcanusChestLootProvider.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/datagen/common/ArcanusChestLootProvider.java @@ -82,7 +82,7 @@ private static CompoundTag healSelfSpell() { } private static CompoundTag healAllySpell() { - var spell = new Spell(List.of(new SpellGroup(ArcanusSpellComponents.PROJECTILE.get(), List.of(ArcanusSpellComponents.HEAL.get(), ArcanusSpellComponents.HEAL.get()), List.of(new Vector2i(80, 84), new Vector2i(133, 48), new Vector2i(139, 118)))), "Heal Ally"); + var spell = new Spell(List.of(new SpellGroup(ArcanusSpellComponents.MISSILE.get(), List.of(ArcanusSpellComponents.HEAL.get(), ArcanusSpellComponents.HEAL.get()), List.of(new Vector2i(80, 84), new Vector2i(133, 48), new Vector2i(139, 118)))), "Heal Ally"); return spell.toNbt(); } @@ -100,7 +100,7 @@ private static CompoundTag fireballSpell() { } private static CompoundTag magicMissileSpell() { - var spell = new Spell(List.of(new SpellGroup(ArcanusSpellComponents.PROJECTILE.get(), List.of(ArcanusSpellComponents.DAMAGE.get(), ArcanusSpellComponents.DAMAGE.get()), List.of(new Vector2i(86, 82), new Vector2i(146, 81), new Vector2i(117, 127)))), "Magic Missile"); + var spell = new Spell(List.of(new SpellGroup(ArcanusSpellComponents.MISSILE.get(), List.of(ArcanusSpellComponents.DAMAGE.get(), ArcanusSpellComponents.DAMAGE.get()), List.of(new Vector2i(86, 82), new Vector2i(146, 81), new Vector2i(117, 127)))), "Magic Missile"); return spell.toNbt(); } diff --git a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/AbstractArrowMixin.java b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/AbstractArrowMixin.java index b97ecfc7..05bc34e5 100644 --- a/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/AbstractArrowMixin.java +++ b/src/main/java/dev/cammiescorner/arcanuscontinuum/mixin/common/AbstractArrowMixin.java @@ -1,7 +1,7 @@ package dev.cammiescorner.arcanuscontinuum.mixin.common; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import dev.cammiescorner.arcanuscontinuum.common.entities.magic.MagicProjectile; +import dev.cammiescorner.arcanuscontinuum.common.entities.magic.Missile; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Projectile; @@ -20,6 +20,6 @@ public AbstractArrowMixin(EntityType entityType, Level wor target = "Lnet/minecraft/world/entity/player/Player;canHarmPlayer(Lnet/minecraft/world/entity/player/Player;)Z" )) private boolean ignorePvpFlag(boolean original) { - return original || ((Object) this) instanceof MagicProjectile; + return original || ((Object) this) instanceof Missile; } }