diff options
| author | Carson Fleming <cflems@cflems.net> | 2025-10-19 21:46:09 -0400 |
|---|---|---|
| committer | Carson Fleming <cflems@cflems.net> | 2025-10-19 21:46:09 -0400 |
| commit | a460759e8f1a76fc5af19bd6417f469d61ba2492 (patch) | |
| tree | 447b3809d089c0b8684bdd45b7610e7fb858c44d | |
| parent | e97c16a377dbe42167938ca7c664a9da7475132f (diff) | |
| download | penguin-dust-a460759e8f1a76fc5af19bd6417f469d61ba2492.tar.gz | |
adjust power formulas
7 files changed, 62 insertions, 18 deletions
diff --git a/src/main/java/net/cflems/mc/penguin_dust/PenguinDust.java b/src/main/java/net/cflems/mc/penguin_dust/PenguinDust.java index c24aad3..a1c918d 100644 --- a/src/main/java/net/cflems/mc/penguin_dust/PenguinDust.java +++ b/src/main/java/net/cflems/mc/penguin_dust/PenguinDust.java @@ -5,8 +5,10 @@ import net.cflems.mc.penguin_dust.listener.DamageListener; import net.cflems.mc.penguin_dust.listener.ItemUseListener; import net.cflems.mc.penguin_dust.listener.PlayerXPListener; +import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.Nullable; public final class PenguinDust extends JavaPlugin { @Override @@ -17,4 +19,8 @@ public final class PenguinDust extends JavaPlugin { pluginManager.registerEvents(new ItemUseListener(), this); pluginManager.registerEvents(new DamageListener(), this); } + + public static FixedMetadataValue createMetadataValue(@Nullable Object value) { + return new FixedMetadataValue(JavaPlugin.getProvidingPlugin(PenguinDust.class), value); + } } diff --git a/src/main/java/net/cflems/mc/penguin_dust/Spell.java b/src/main/java/net/cflems/mc/penguin_dust/Spell.java index 5f493c5..7603bf9 100644 --- a/src/main/java/net/cflems/mc/penguin_dust/Spell.java +++ b/src/main/java/net/cflems/mc/penguin_dust/Spell.java @@ -19,4 +19,8 @@ public enum Spell { public boolean execute(@NotNull Player player, int strength) { return executor.execute(player, strength); } + + public double calculateDamage(int strength, double distance) { + return executor.calculateDamage(strength, distance); + } } diff --git a/src/main/java/net/cflems/mc/penguin_dust/SpellExecutor.java b/src/main/java/net/cflems/mc/penguin_dust/SpellExecutor.java index 3bc25b3..e23e3a8 100644 --- a/src/main/java/net/cflems/mc/penguin_dust/SpellExecutor.java +++ b/src/main/java/net/cflems/mc/penguin_dust/SpellExecutor.java @@ -5,4 +5,6 @@ import org.jetbrains.annotations.NotNull; public interface SpellExecutor { boolean execute(@NotNull Player player, int strength); + + double calculateDamage(int strength, double distance); } diff --git a/src/main/java/net/cflems/mc/penguin_dust/listener/DamageListener.java b/src/main/java/net/cflems/mc/penguin_dust/listener/DamageListener.java index 5e8a35e..a60a5e7 100644 --- a/src/main/java/net/cflems/mc/penguin_dust/listener/DamageListener.java +++ b/src/main/java/net/cflems/mc/penguin_dust/listener/DamageListener.java @@ -3,9 +3,13 @@ package net.cflems.mc.penguin_dust.listener; import com.google.common.collect.MoreCollectors; import net.cflems.mc.penguin_dust.PenguinDust; +import net.cflems.mc.penguin_dust.Spell; import net.cflems.mc.penguin_dust.utils.SpellUtils; +import org.bukkit.Bukkit; import org.bukkit.entity.Entity; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.LightningStrike; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -19,13 +23,30 @@ public final class DamageListener implements Listener { @EventHandler(priority = EventPriority.NORMAL) public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { Entity damager = event.getDamager(); - List<MetadataValue> damageMetadata = damager.getMetadata(SpellUtils.DAMAGE_KEY); - Optional<MetadataValue> damageValue = - damageMetadata.stream() + + List<MetadataValue> strengthMetadata = damager.getMetadata(SpellUtils.SPELL_STRENGTH_KEY); + Optional<MetadataValue> strengthValue = + strengthMetadata.stream() .filter(md -> md.getOwningPlugin() instanceof PenguinDust) .collect(MoreCollectors.toOptional()); - if (damageValue.isEmpty()) return; + if (strengthValue.isEmpty()) return; + + Spell causingSpell = + switch (damager) { + case Fireball _fireball -> Spell.FIREBALL; + case LightningStrike _lightningStrike -> Spell.LIGHTNING; + default -> null; + }; + if (causingSpell == null) { + Bukkit.getLogger() + .warning( + "Entity type has not been mapped to a spell yet: " + + damager.getClass().getName()); + return; + } - event.setDamage(damageValue.get().asInt()); + double distance = event.getEntity().getLocation().distance(damager.getLocation()); + double damage = causingSpell.calculateDamage(strengthValue.get().asInt(), distance); + event.setDamage(damage); } } diff --git a/src/main/java/net/cflems/mc/penguin_dust/spells/Fireball.java b/src/main/java/net/cflems/mc/penguin_dust/spells/Fireball.java index ca96609..aa3dfc2 100644 --- a/src/main/java/net/cflems/mc/penguin_dust/spells/Fireball.java +++ b/src/main/java/net/cflems/mc/penguin_dust/spells/Fireball.java @@ -1,18 +1,33 @@ package net.cflems.mc.penguin_dust.spells; +import net.cflems.mc.penguin_dust.PenguinDust; import net.cflems.mc.penguin_dust.SpellExecutor; +import net.cflems.mc.penguin_dust.utils.SpellUtils; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; public final class Fireball implements SpellExecutor { - private static final float MAX_YIELD = 128f; + private static final float MAX_RADIUS = 128f; @Override public boolean execute(@NotNull Player player, int strength) { org.bukkit.entity.Fireball fireball = player.launchProjectile(org.bukkit.entity.Fireball.class); - fireball.setYield(Math.min(strength / 2.0f, MAX_YIELD)); + fireball.setYield(calculateExplosionRadius(strength)); + fireball.setMetadata( + SpellUtils.SPELL_STRENGTH_KEY, PenguinDust.createMetadataValue(strength)); return true; } + + public double calculateDamage(int strength, double distance) { + double effectiveRadius = calculateExplosionRadius(strength); + if (distance >= effectiveRadius) return 0; + + return 3.5 * Math.pow(effectiveRadius - distance, 0.75); + } + + private float calculateExplosionRadius(int strength) { + return Math.min(strength / 2.0f, MAX_RADIUS); + } } diff --git a/src/main/java/net/cflems/mc/penguin_dust/spells/Lightning.java b/src/main/java/net/cflems/mc/penguin_dust/spells/Lightning.java index 610921d..6ad1dba 100644 --- a/src/main/java/net/cflems/mc/penguin_dust/spells/Lightning.java +++ b/src/main/java/net/cflems/mc/penguin_dust/spells/Lightning.java @@ -8,8 +8,6 @@ import org.bukkit.FluidCollisionMode; import org.bukkit.World; import org.bukkit.entity.LightningStrike; import org.bukkit.entity.Player; -import org.bukkit.metadata.FixedMetadataValue; -import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.util.RayTraceResult; import org.jetbrains.annotations.NotNull; @@ -34,15 +32,13 @@ public final class Lightning implements SpellExecutor { world.strikeLightning(rayTraceResult.getHitPosition().toLocation(world)); lightningStrike.setCausingPlayer(player); - JavaPlugin providingPlugin = JavaPlugin.getProvidingPlugin(PenguinDust.class); lightningStrike.setMetadata( - SpellUtils.DAMAGE_KEY, - new FixedMetadataValue(providingPlugin, calculateDamage(strength))); + SpellUtils.SPELL_STRENGTH_KEY, PenguinDust.createMetadataValue(strength)); return true; } - private static int calculateDamage(int spellStrength) { - double spellDamage = spellStrength * Math.sqrt(spellStrength) / 8.0; - return (int) spellDamage; + public double calculateDamage(int spellStrength, double distance) { + if (distance >= spellStrength) return 0; + return Math.pow(spellStrength - distance, 1.5) / 8.0; } } diff --git a/src/main/java/net/cflems/mc/penguin_dust/utils/SpellUtils.java b/src/main/java/net/cflems/mc/penguin_dust/utils/SpellUtils.java index 7b9d166..333bcd2 100644 --- a/src/main/java/net/cflems/mc/penguin_dust/utils/SpellUtils.java +++ b/src/main/java/net/cflems/mc/penguin_dust/utils/SpellUtils.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public final class SpellUtils { - public static final String DAMAGE_KEY = "penguin-dust:damage"; + public static final String SPELL_STRENGTH_KEY = "penguin-dust:spell-strength"; private static final NamespacedKey SPELL_NAME_KEY = Preconditions.checkNotNull(NamespacedKey.fromString("penguin-dust:spell")); private static final NamespacedKey SPELL_REMAINING_CAPACITY_KEY = @@ -138,8 +138,8 @@ public final class SpellUtils { int maxCapacity) { meta.setLore( List.of( - "Enchanted with: " + spell, - "Magical Durability: " + remainingCapacity + "/" + maxCapacity, + "Imbued with: " + spell, + "Dust Remaining: " + remainingCapacity + "/" + maxCapacity, "Spell Strength: " + throughput)); } } |
