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 57990c5..5be5a4a 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 @@ -4,8 +4,13 @@ import static me.unurled.sacredrealms.sr.utils.Component.comp; import static me.unurled.sacredrealms.sr.utils.SRPlayerUtils.spawnIndicator; import static me.unurled.sacredrealms.sr.utils.SRPlayerUtils.updateActionBar; +import java.util.HashMap; +import java.util.Map.Entry; import java.util.Random; +import java.util.UUID; import me.unurled.sacredrealms.sr.components.attributes.Attribute; +import me.unurled.sacredrealms.sr.components.entity.EntityManager; +import me.unurled.sacredrealms.sr.components.entity.SREntity; import me.unurled.sacredrealms.sr.components.player.PlayerManager; import me.unurled.sacredrealms.sr.components.player.SRPlayer; import me.unurled.sacredrealms.sr.managers.Manager; @@ -24,6 +29,8 @@ import org.jetbrains.annotations.NotNull; @SuppressWarnings("EmptyMethod") public class CombatManager extends Manager { + private final HashMap> historyMobDamage = new HashMap<>(); + @EventHandler public void onDamage(@NotNull EntityDamageByBlockEvent e) { // TODO: Implement @@ -104,8 +111,44 @@ public class CombatManager extends Manager { } // apply damage + if (historyMobDamage.containsKey(entity.getUniqueId())) { + HashMap 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 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 playerDoubleHashMap = + historyMobDamage.get(entity.getUniqueId()); + if (playerDoubleHashMap == null) { + return; + } + for (Entry 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) } diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/entity/SREntity.java b/src/main/java/me/unurled/sacredrealms/sr/components/entity/SREntity.java index b67c3b0..19d086b 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/entity/SREntity.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/entity/SREntity.java @@ -6,6 +6,8 @@ import org.jetbrains.annotations.NotNull; public class SREntity { private final UUID uuid; + private double health = 100; + private Long experience = 0L; public SREntity(@NotNull Entity e) { uuid = e.getUniqueId(); @@ -14,4 +16,20 @@ public class SREntity { public UUID getUuid() { return uuid; } + + public Long getExperience() { + return experience; + } + + public void setExperience(Long experience) { + this.experience = experience; + } + + public double getHealth() { + return health; + } + + public void setHealth(double health) { + this.health = health; + } } diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java b/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java index c0946b9..c575588 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java @@ -23,7 +23,8 @@ import org.jetbrains.annotations.Nullable; public class SRPlayer { @Expose private UUID uuid = null; - @Expose private int level = 0; + @Expose private int level = 1; + @Expose private Long experience = 0L; private double health = 100; @Expose private HashMap attributes = new HashMap<>(); private HashMap> itemAttributes = new HashMap<>(); @@ -235,4 +236,12 @@ public class SRPlayer { public void setHealth(double health) { this.health = health; } + + public Long getExperience() { + return experience; + } + + public void setExperience(Long experience) { + this.experience = experience; + } }