From 241feba114cc3ef0fe495ea71579a8f2c686afc2 Mon Sep 17 00:00:00 2001 From: unurled Date: Tue, 27 Feb 2024 20:57:06 +0100 Subject: [PATCH] CombatManager luck and critical --- .../sr/components/combat/CombatManager.java | 101 ++++++++++++++++-- 1 file changed, 90 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/combat/CombatManager.java b/src/main/java/me/unurled/sacredrealms/sr/components/combat/CombatManager.java index 1ac1d9d..bb11bf5 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/combat/CombatManager.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/combat/CombatManager.java @@ -2,7 +2,10 @@ package me.unurled.sacredrealms.sr.components.combat; import static me.unurled.sacredrealms.sr.utils.Component.comp; +import java.util.Random; import me.unurled.sacredrealms.sr.components.attributes.Attribute; +import me.unurled.sacredrealms.sr.components.player.PlayerManager; +import me.unurled.sacredrealms.sr.components.player.SRPlayer; import me.unurled.sacredrealms.sr.managers.Manager; import me.unurled.sacredrealms.sr.utils.Items; import org.bukkit.Sound; @@ -21,6 +24,9 @@ public class CombatManager extends Manager { public void onDamage(EntityDamageByBlockEvent e) { // TODO: Implement // blast enchant :shrug: + // fall damage, fire damage, etc + e.setDamage(0.0); + e.setCancelled(true); } // TODO: Finish this @@ -28,12 +34,13 @@ public class CombatManager extends Manager { public void onDamage(EntityDamageByEntityEvent e) { e.setDamage(0.0); - if (!(e.getDamager() instanceof LivingEntity) || !(e.getEntity() instanceof LivingEntity)) { + if (!(e.getDamager() instanceof LivingEntity damager) || !(e.getEntity() instanceof LivingEntity entity)) { + return; + } + PlayerManager pm = (PlayerManager) PlayerManager.getInstance(PlayerManager.class); + if (pm == null) { return; } - - LivingEntity damager = (LivingEntity) e.getDamager(); - LivingEntity entity = (LivingEntity) e.getEntity(); if (damager instanceof Player d) { if (entity instanceof Player) { @@ -45,9 +52,15 @@ public class CombatManager extends Manager { } if (entity instanceof Mob) { Double dStrength = Items.getTotalAttribute(d, Attribute.STRENGTH); + SRPlayer player = pm.getPlayer(d.getUniqueId()); + if (player != null) { + dStrength += player.getAttribute(Attribute.STRENGTH); + } EntityEquipment equipment = ((Mob) entity).getEquipment(); Double eDefense = Items.getTotalAttribute(equipment, Attribute.DEFENSE); + Double damage = dStrength - eDefense; + Double dLuck = Items.getTotalAttribute(d, Attribute.LUCK); Double eLuck = Items.getTotalAttribute(equipment, Attribute.LUCK); @@ -56,26 +69,92 @@ public class CombatManager extends Manager { // 100% chance of miss luck = -10000d; d.sendMessage(comp("You missed!")); - // TODO: play miss sound -// d.playSound(); + d.playSound(d, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f); e.setCancelled(true); return; } else if (luck > 1000) { // 100% chance of critical hit luck = 10000d; + d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f); + damage = damage * 2; } if (luck < 0) { // chances of miss - - } else if (luck > 0) { + Random r = new Random(); + if (r.nextBoolean()) { + d.playSound(d, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f); + e.setCancelled(true); + d.sendMessage(comp("You missed!")); + return; + } + } else if (luck > 0 && luck < 1000) { // chance of critical hit - } else { + Random r = new Random(); + if (r.nextBoolean()) { + d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f); + // damage * 2 + damage = damage * 2; + } + } + // apply damage + + entity.damage(damage); + // TODO: check for status effects (apply status effects depending item of damager) + } + } else if (entity instanceof Player player) { + // damager is not player + if (damager instanceof Mob) { + // get equipment of damager + EntityEquipment equipment = ((Mob) damager).getEquipment(); + Double dStrength = Items.getTotalAttribute(equipment, Attribute.STRENGTH); + Double eDefense = Items.getTotalAttribute(player, Attribute.DEFENSE); + + Double damage = dStrength - eDefense; + + Double dLuck = Items.getTotalAttribute(equipment, Attribute.LUCK); + Double eLuck = Items.getTotalAttribute(player, Attribute.LUCK); + + Double luck = dLuck - eLuck; + + if (luck < -1000) { + // 100% chance of miss + luck = -10000d; + player.sendMessage(comp("You dodged!")); + player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f); + e.setCancelled(true); + return; + } else if (luck > 1000) { + // 100% chance of critical hit + luck = 10000d; + player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f); + damage = damage * 2; } - } - } else if (entity instanceof Player) { + if (luck < 0) { + // chances of miss + Random r = new Random(); + if (r.nextBoolean()) { + player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f); + e.setCancelled(true); + player.sendMessage(comp("You dodged!")); + return; + } + } else if (luck > 0 && luck < 1000) { + // chance of critical hit + Random r = new Random(); + if (r.nextBoolean()) { + player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f); + // damage * 2 + damage = damage * 2; + } + } + // apply damage + player.damage(damage); + + // TODO: check for status effects (apply status effects depending item of damager) + } } }