code refactoring
This commit is contained in:
parent
456df87c33
commit
9105d31a02
9 changed files with 652 additions and 542 deletions
|
@ -26,7 +26,6 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
|||
import org.bukkit.inventory.EntityEquipment;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@SuppressWarnings("EmptyMethod")
|
||||
public class CombatManager extends Manager {
|
||||
|
||||
public static final Random RANDOM = new Random();
|
||||
|
@ -41,6 +40,66 @@ public class CombatManager extends Manager {
|
|||
e.setCancelled(true);
|
||||
}
|
||||
|
||||
private static void playerVictim(
|
||||
@NotNull EntityDamageByEntityEvent e, Player player, Mob mob, PlayerManager pm) {
|
||||
// get equipment of damager
|
||||
EntityEquipment equipment = mob.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
|
||||
player.sendMessage(player.identity(), 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;
|
||||
}
|
||||
|
||||
if (luck < 0) {
|
||||
// chances of miss
|
||||
if (RANDOM.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 && RANDOM.nextBoolean()) {
|
||||
// chance of critical hit
|
||||
player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
|
||||
// damage * 2
|
||||
damage = damage * 2;
|
||||
}
|
||||
|
||||
// apply damage
|
||||
player.damage(damage);
|
||||
// add an
|
||||
|
||||
SRPlayer player1 = pm.getPlayer(player.getUniqueId());
|
||||
if (player1 != null) {
|
||||
player1.setHealth(player.getHealth() - damage, DamageCause.ENTITY_ATTACK);
|
||||
if (player1.getHealth() <= 0) {
|
||||
player.damage(player.getHealth());
|
||||
}
|
||||
updateActionBar(player, player1);
|
||||
}
|
||||
|
||||
spawnIndicator(player, false, damage);
|
||||
|
||||
// TODO: check for status effects (apply status effects depending item of damager)
|
||||
}
|
||||
|
||||
// TODO: Finish this
|
||||
@EventHandler
|
||||
public void onDamage(@NotNull EntityDamageByEntityEvent e) {
|
||||
|
@ -56,156 +115,124 @@ public class CombatManager extends Manager {
|
|||
}
|
||||
|
||||
if (damager instanceof Player d) {
|
||||
if (entity instanceof Player) {
|
||||
// no pvp
|
||||
playerDamager(e, entity, d, pm);
|
||||
return;
|
||||
}
|
||||
if (entity instanceof Player player && damager instanceof Mob mob) {
|
||||
playerVictim(e, player, mob, pm);
|
||||
}
|
||||
}
|
||||
|
||||
private void playerDamager(
|
||||
@NotNull EntityDamageByEntityEvent e, LivingEntity entity, Player d, PlayerManager pm) {
|
||||
if (entity instanceof Player) {
|
||||
// no pvp
|
||||
e.setCancelled(true);
|
||||
d.sendMessage(comp("<red>You can't attack players!"));
|
||||
d.playSound(d, Sound.BLOCK_ANVIL_HIT, 1.0f, 1.0f);
|
||||
return;
|
||||
}
|
||||
if (entity instanceof Mob mob) {
|
||||
isMob(e, entity, d, pm, mob);
|
||||
}
|
||||
}
|
||||
|
||||
private void isMob(
|
||||
@NotNull EntityDamageByEntityEvent e,
|
||||
LivingEntity entity,
|
||||
Player d,
|
||||
PlayerManager pm,
|
||||
Mob 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.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);
|
||||
|
||||
double luck = dLuck - eLuck;
|
||||
if (luck < -1000) {
|
||||
// 100% chance of miss
|
||||
d.sendMessage(comp("<red>You missed!"));
|
||||
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
|
||||
if (RANDOM.nextBoolean()) {
|
||||
d.playSound(d, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
|
||||
e.setCancelled(true);
|
||||
d.sendMessage(comp("<red>You can't attack players!"));
|
||||
d.playSound(d, Sound.BLOCK_ANVIL_HIT, 1.0f, 1.0f);
|
||||
d.sendMessage(comp("<red>You missed!"));
|
||||
return;
|
||||
}
|
||||
if (entity instanceof Mob 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.getEquipment();
|
||||
double eDefense = Items.getTotalAttribute(equipment, Attribute.DEFENSE);
|
||||
} else if (luck > 0 && luck < 1000 && RANDOM.nextBoolean()) {
|
||||
// chance of critical hit
|
||||
d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
|
||||
// damage * 2
|
||||
damage = damage * 2;
|
||||
}
|
||||
// apply damage
|
||||
|
||||
Double damage = dStrength - eDefense;
|
||||
historyHandler(entity, d, damage);
|
||||
entity.damage(damage);
|
||||
|
||||
Double dLuck = Items.getTotalAttribute(d, Attribute.LUCK);
|
||||
Double eLuck = Items.getTotalAttribute(equipment, Attribute.LUCK);
|
||||
EntityManager em = EntityManager.getInstance(EntityManager.class);
|
||||
SREntity ent = em.getEntity(entity.getUniqueId());
|
||||
|
||||
double luck = dLuck - eLuck;
|
||||
if (luck < -1000) {
|
||||
// 100% chance of miss
|
||||
d.sendMessage(comp("<red>You missed!"));
|
||||
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 (entity.getHealth() <= 0) {
|
||||
die(entity, d, pm, ent);
|
||||
return;
|
||||
}
|
||||
|
||||
if (luck < 0) {
|
||||
// chances of miss
|
||||
if (RANDOM.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 && RANDOM.nextBoolean()) {
|
||||
// chance of critical hit
|
||||
d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
|
||||
// damage * 2
|
||||
damage = damage * 2;
|
||||
}
|
||||
// apply damage
|
||||
spawnIndicator(entity, false, damage);
|
||||
// TODO: check for status effects (apply status effects depending item of damager)
|
||||
}
|
||||
|
||||
if (historyMobDamage.containsKey(entity.getUniqueId())) {
|
||||
HashMap<Player, Double> history =
|
||||
historyMobDamage.getOrDefault(entity.getUniqueId(), new HashMap<>());
|
||||
if (history.containsKey(d)) {
|
||||
history.put(d, history.get(d) + damage);
|
||||
} else {
|
||||
history.put(d, damage);
|
||||
}
|
||||
} else {
|
||||
HashMap<Player, Double> history = new HashMap<>();
|
||||
history.put(d, damage);
|
||||
historyMobDamage.put(entity.getUniqueId(), history);
|
||||
}
|
||||
entity.damage(damage);
|
||||
|
||||
EntityManager em = EntityManager.getInstance(EntityManager.class);
|
||||
SREntity ent = em.getEntity(entity.getUniqueId());
|
||||
|
||||
if (entity.getHealth() <= 0) {
|
||||
// entity is dead, give experience to player
|
||||
SRPlayer player1 = pm.getPlayer(d.getUniqueId());
|
||||
if (player1 != null && ent != null) {
|
||||
// calculate experience % based on damage
|
||||
HashMap<Player, Double> playerDoubleHashMap =
|
||||
historyMobDamage.get(entity.getUniqueId());
|
||||
if (playerDoubleHashMap == null) {
|
||||
return;
|
||||
}
|
||||
for (Entry<Player, Double> map : playerDoubleHashMap.entrySet()) {
|
||||
Double exp = ent.getExperience() * (map.getValue() / ent.getHealth());
|
||||
SRPlayer tmp = pm.getPlayer(map.getKey().getUniqueId());
|
||||
if (tmp != null) {
|
||||
tmp.setExperience((long) (tmp.getExperience() + exp));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
spawnIndicator(entity, false, damage);
|
||||
// TODO: check for status effects (apply status effects depending item of damager)
|
||||
}
|
||||
} else if (entity instanceof Player player && damager instanceof Mob mob) {
|
||||
// damager is not player
|
||||
// get equipment of damager
|
||||
EntityEquipment equipment = mob.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
|
||||
player.sendMessage(comp("<red>You dodged!"));
|
||||
player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
|
||||
e.setCancelled(true);
|
||||
private void die(LivingEntity entity, Player d, PlayerManager pm, SREntity ent) {
|
||||
// entity is dead, give experience to player
|
||||
SRPlayer player1 = pm.getPlayer(d.getUniqueId());
|
||||
if (player1 != null && ent != null) {
|
||||
// calculate experience % based on damage
|
||||
HashMap<Player, Double> playerDoubleHashMap = historyMobDamage.get(entity.getUniqueId());
|
||||
if (playerDoubleHashMap == null) {
|
||||
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;
|
||||
}
|
||||
|
||||
if (luck < 0) {
|
||||
// chances of miss
|
||||
if (RANDOM.nextBoolean()) {
|
||||
player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
|
||||
e.setCancelled(true);
|
||||
player.sendMessage(comp("<red>You dodged!"));
|
||||
return;
|
||||
for (Entry<Player, Double> map : playerDoubleHashMap.entrySet()) {
|
||||
Double exp = ent.getExperience() * (map.getValue() / ent.getHealth());
|
||||
SRPlayer tmp = pm.getPlayer(map.getKey().getUniqueId());
|
||||
if (tmp != null) {
|
||||
tmp.setExperience((long) (tmp.getExperience() + exp));
|
||||
}
|
||||
} else if (luck > 0 && luck < 1000 && RANDOM.nextBoolean()) {
|
||||
// chance of critical hit
|
||||
player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
|
||||
// damage * 2
|
||||
damage = damage * 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// apply damage
|
||||
player.damage(damage);
|
||||
// add an
|
||||
|
||||
SRPlayer player1 = pm.getPlayer(player.getUniqueId());
|
||||
if (player1 != null) {
|
||||
player1.setHealth(player.getHealth() - damage, DamageCause.ENTITY_ATTACK);
|
||||
if (player1.getHealth() <= 0) {
|
||||
player.damage(player.getHealth());
|
||||
}
|
||||
updateActionBar(player, player1);
|
||||
private void historyHandler(LivingEntity entity, Player d, Double damage) {
|
||||
if (historyMobDamage.containsKey(entity.getUniqueId())) {
|
||||
HashMap<Player, Double> history =
|
||||
historyMobDamage.getOrDefault(entity.getUniqueId(), new HashMap<>());
|
||||
if (history.containsKey(d)) {
|
||||
history.put(d, history.get(d) + damage);
|
||||
} else {
|
||||
history.put(d, damage);
|
||||
}
|
||||
|
||||
spawnIndicator(player, false, damage);
|
||||
|
||||
// TODO: check for status effects (apply status effects depending item of damager)
|
||||
} else {
|
||||
HashMap<Player, Double> history = new HashMap<>();
|
||||
history.put(d, damage);
|
||||
historyMobDamage.put(entity.getUniqueId(), history);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue