summaryrefslogtreecommitdiff
path: root/src/main/java/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net')
-rw-r--r--src/main/java/net/cflems/mc/penguin_dust/PenguinDust.java6
-rw-r--r--src/main/java/net/cflems/mc/penguin_dust/Spell.java4
-rw-r--r--src/main/java/net/cflems/mc/penguin_dust/SpellExecutor.java2
-rw-r--r--src/main/java/net/cflems/mc/penguin_dust/listener/DamageListener.java31
-rw-r--r--src/main/java/net/cflems/mc/penguin_dust/spells/Fireball.java19
-rw-r--r--src/main/java/net/cflems/mc/penguin_dust/spells/Lightning.java12
-rw-r--r--src/main/java/net/cflems/mc/penguin_dust/utils/SpellUtils.java6
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));
}
}