Add EngineGank
This commit is contained in:
parent
5984bc2774
commit
bce2faee65
145
src/com/massivecraft/massivecore/EngineGank.java
Normal file
145
src/com/massivecraft/massivecore/EngineGank.java
Normal file
@ -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<Entity, WeakHashMap<Player, Double>> entityToPlayerDamages = new WeakHashMap<Entity, WeakHashMap<Player, Double>>();
|
||||||
|
|
||||||
|
protected Map<Player, Double> getPlayerDamages(Entity entity, boolean store)
|
||||||
|
{
|
||||||
|
WeakHashMap<Player, Double> ret = this.entityToPlayerDamages.get(entity);
|
||||||
|
|
||||||
|
if (ret == null)
|
||||||
|
{
|
||||||
|
ret = new WeakHashMap<Player, Double>(4);
|
||||||
|
if (store)
|
||||||
|
{
|
||||||
|
this.entityToPlayerDamages.put(entity, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// PUBLIC
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public Map<Player, Double> getPlayerDamages(Entity entity)
|
||||||
|
{
|
||||||
|
return this.getPlayerDamages(entity, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Player> getPlayers(Entity entity)
|
||||||
|
{
|
||||||
|
return this.getPlayerDamages(entity).keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Player, Double> getPlayerQuotients(Entity entity)
|
||||||
|
{
|
||||||
|
// Get PlayerDamages
|
||||||
|
Map<Player, Double> playerDamages = getPlayerDamages(entity);
|
||||||
|
|
||||||
|
// Calculate Total
|
||||||
|
double total = 0;
|
||||||
|
for (Double damage : playerDamages.values())
|
||||||
|
{
|
||||||
|
total += damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Ret
|
||||||
|
Map<Player, Double> ret = new MassiveMap<Player, Double>(playerDamages.size());
|
||||||
|
|
||||||
|
// Fill Ret
|
||||||
|
for (Entry<Player, Double> 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<Player, Double> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -183,6 +183,7 @@ public class MassiveCore extends MassivePlugin
|
|||||||
MassiveCoreEngineDestination.get().activate();
|
MassiveCoreEngineDestination.get().activate();
|
||||||
PlayerUtil.get().activate();
|
PlayerUtil.get().activate();
|
||||||
EngineChestGui.get().activate();
|
EngineChestGui.get().activate();
|
||||||
|
EngineGank.get().activate();
|
||||||
|
|
||||||
// Collections
|
// Collections
|
||||||
MultiverseColl.get().init();
|
MultiverseColl.get().init();
|
||||||
|
Loading…
Reference in New Issue
Block a user