CombatManager luck and critical

This commit is contained in:
unurled 2024-02-27 20:57:06 +01:00
parent 64b79663ef
commit 241feba114
Signed by: unurled
GPG key ID: FDBC9CBE1F82423F

View file

@ -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("<red>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("<red>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("<red>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("<red>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)
}
}
}