2011-05-13 04:24:42 -04:00
|
|
|
package org.moparscape.msc.gs.model;
|
2011-04-27 01:44:26 -04:00
|
|
|
|
2011-05-14 08:34:42 -04:00
|
|
|
import java.util.Map;
|
|
|
|
import java.util.WeakHashMap;
|
2011-05-13 04:24:42 -04:00
|
|
|
|
2011-05-14 08:34:42 -04:00
|
|
|
import org.moparscape.msc.config.Formulae;
|
|
|
|
import org.moparscape.msc.gs.model.mini.Damage;
|
|
|
|
import org.moparscape.msc.gs.tools.DataConversions;
|
2011-04-27 01:44:26 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Each NPC has a Damage Syndicate (pool of damage) binded to them.
|
|
|
|
*
|
|
|
|
* @author xEnt
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public class Syndicate {
|
2011-05-14 08:34:42 -04:00
|
|
|
|
|
|
|
private Map<Player, Damage> damage = new WeakHashMap<Player, Damage>();
|
|
|
|
|
|
|
|
public void addDamage(final Player player, final int damage,
|
|
|
|
final int damageType) {
|
|
|
|
final Damage prev = this.damage.get(player);
|
|
|
|
if (prev != null) {
|
|
|
|
prev.addDamage(damage, damageType);
|
|
|
|
} else {
|
|
|
|
this.damage.put(player, new Damage(damage, damageType));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Map<Player, Damage> getDamages() {
|
|
|
|
return damage;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void distributeExp(final Npc npc) {
|
|
|
|
final Map<Player, Damage> dmgs = getDamages();
|
2011-06-25 01:44:53 -04:00
|
|
|
final int exp = DataConversions
|
|
|
|
.roundUp(Formulae.combatExperience(npc) / 4D);
|
2011-05-14 08:34:42 -04:00
|
|
|
int newXP = 0;
|
|
|
|
for (final Player p : dmgs.keySet()) {
|
|
|
|
Damage dmg = dmgs.get(p);
|
|
|
|
int total = dmg.getTotalDamage();
|
|
|
|
if (total > npc.getDef().hits) {
|
|
|
|
total = npc.getDef().hits;
|
|
|
|
}
|
|
|
|
if (p != null) {
|
|
|
|
newXP = (exp * total) / npc.getDef().hits;
|
|
|
|
|
|
|
|
p.incExp(4, roundAndCast(newXP * 4 * dmg.getRangePortion()),
|
|
|
|
true);
|
|
|
|
p.getActionSender().sendStat(4);
|
|
|
|
switch (p.getCombatStyle()) {
|
|
|
|
case 0:
|
|
|
|
for (int x = 0; x < 3; x++) {
|
|
|
|
p.incExp(x,
|
|
|
|
roundAndCast(newXP * dmg.getCombatPortion()),
|
|
|
|
true);
|
|
|
|
p.getActionSender().sendStat(x);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
p.incExp(2,
|
|
|
|
roundAndCast(newXP * 3 * dmg.getCombatPortion()),
|
|
|
|
true);
|
|
|
|
p.getActionSender().sendStat(2);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
p.incExp(0,
|
|
|
|
roundAndCast(newXP * 3 * dmg.getCombatPortion()),
|
|
|
|
true);
|
|
|
|
p.getActionSender().sendStat(0);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
p.incExp(1,
|
|
|
|
roundAndCast(newXP * 3 * dmg.getCombatPortion()),
|
|
|
|
true);
|
|
|
|
p.getActionSender().sendStat(1);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
p.incExp(3, roundAndCast(newXP * dmg.getCombatPortion()), true);
|
|
|
|
p.getActionSender().sendStat(3);
|
|
|
|
}
|
|
|
|
}
|
2011-04-27 01:44:26 -04:00
|
|
|
}
|
2011-06-25 01:44:53 -04:00
|
|
|
|
2011-05-14 08:34:42 -04:00
|
|
|
public int roundAndCast(double d) {
|
|
|
|
return (int) Math.round(d);
|
2011-04-27 01:44:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|