From bce2faee6547279976f4d8ece04d615f608f5c35 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Sat, 25 Apr 2015 03:38:28 +0200 Subject: [PATCH] Add EngineGank --- .../massivecraft/massivecore/EngineGank.java | 145 ++++++++++++++++++ .../massivecraft/massivecore/MassiveCore.java | 1 + 2 files changed, 146 insertions(+) create mode 100644 src/com/massivecraft/massivecore/EngineGank.java diff --git a/src/com/massivecraft/massivecore/EngineGank.java b/src/com/massivecraft/massivecore/EngineGank.java new file mode 100644 index 00000000..3047c266 --- /dev/null +++ b/src/com/massivecraft/massivecore/EngineGank.java @@ -0,0 +1,145 @@ +package com.massivecraft.massivecore; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.WeakHashMap; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.plugin.Plugin; + +import com.massivecraft.massivecore.EngineAbstract; +import com.massivecraft.massivecore.MassiveCore; +import com.massivecraft.massivecore.collections.MassiveMap; +import com.massivecraft.massivecore.util.MUtil; + +public class EngineGank extends EngineAbstract +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static EngineGank i = new EngineGank(); + public static EngineGank get() { return i; } + public EngineGank() {} + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Plugin getPlugin() + { + return MassiveCore.get(); + } + + // -------------------------------------------- // + // PROTECTED + // -------------------------------------------- // + + // NOTE: The usage of WeakHashMap here is important. We would create a memory leak otherwise. WeakHashMap works very well for meta data storage. + protected WeakHashMap> entityToPlayerDamages = new WeakHashMap>(); + + protected Map getPlayerDamages(Entity entity, boolean store) + { + WeakHashMap ret = this.entityToPlayerDamages.get(entity); + + if (ret == null) + { + ret = new WeakHashMap(4); + if (store) + { + this.entityToPlayerDamages.put(entity, ret); + } + } + + return ret; + } + + // -------------------------------------------- // + // PUBLIC + // -------------------------------------------- // + + public Map getPlayerDamages(Entity entity) + { + return this.getPlayerDamages(entity, false); + } + + public Set getPlayers(Entity entity) + { + return this.getPlayerDamages(entity).keySet(); + } + + public Map getPlayerQuotients(Entity entity) + { + // Get PlayerDamages + Map playerDamages = getPlayerDamages(entity); + + // Calculate Total + double total = 0; + for (Double damage : playerDamages.values()) + { + total += damage; + } + + // Create Ret + Map ret = new MassiveMap(playerDamages.size()); + + // Fill Ret + for (Entry playerDamage : playerDamages.entrySet()) + { + Player player = playerDamage.getKey(); + Double damage = playerDamage.getValue(); + ret.put(player, damage / total); + } + + // Return Ret + return ret; + } + + // -------------------------------------------- // + // LISTENER + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onEntityDamage(EntityDamageByEntityEvent event) + { + // If an entity ... + Entity entity = event.getEntity(); + + // ... takes damage ... + double damage = event.getDamage(); + if (damage <= 0.1) return; + + // ... and the damager ... + Entity edamager = MUtil.getLiableDamager(event); + + // ... is a player ... + if ( ! (edamager instanceof Player)) return; + Player player = (Player)edamager; + + // ... that is not an NPC ... + if (player.hasMetadata("NPC")) return; + + // ... that is someone else ... + if (player.equals(entity)) return; + + // ... then get player damages ... + Map playerDamages = this.getPlayerDamages(entity, true); + + // ... get player damage ... + Double playerDamage = playerDamages.get(player); + if (playerDamage == null) playerDamage = 0D; + + // ... increment ... + playerDamage += damage; + + // ... and set. + playerDamages.put(player, playerDamage); + } + +} diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index efb5b826..77fb6e58 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -183,6 +183,7 @@ public class MassiveCore extends MassivePlugin MassiveCoreEngineDestination.get().activate(); PlayerUtil.get().activate(); EngineChestGui.get().activate(); + EngineGank.get().activate(); // Collections MultiverseColl.get().init();