public override void Kill(Creature killer)
{
base.Kill(killer);
this.DisappearTime = DateTime.Now.AddSeconds(NPC.DisappearDelay);
if (killer == null)
return;
// Exp
var exp = (long)(this.RaceData.Exp * ChannelServer.Instance.Conf.World.ExpRate);
var expRule = killer.Party.ExpRule;
var expMessage = "+{0} EXP";
// Add global bonus
float bonusMultiplier;
string bonuses;
if (ChannelServer.Instance.GameEventManager.GlobalBonuses.GetBonusMultiplier(GlobalBonusStat.CombatExp, out bonusMultiplier, out bonuses))
exp = (long)(exp * bonusMultiplier);
if (!string.IsNullOrWhiteSpace(bonuses))
expMessage += " (" + bonuses + ")";
// Give
if (!killer.IsInParty || expRule == PartyExpSharing.AllToFinish)
{
killer.GiveExp(exp);
Send.CombatMessage(killer, expMessage, exp);
}
else
{
var members = killer.Party.GetMembers();
var eaExp = 0L;
var killerExp = 0L;
var killerPos = killer.GetPosition();
// Apply optional exp bonus
if (members.Length > 1)
{
var extra = members.Length - 1;
var bonus = ChannelServer.Instance.Conf.World.PartyExpBonus;
exp += (long)(exp * ((extra * bonus) / 100f));
}
// Official simply ALWAYS divides by party member total,
// even if they cannot recieve the experience.
if (expRule == PartyExpSharing.Equal)
{
eaExp = exp / members.Length;
killerExp = eaExp;
}
else if (expRule == PartyExpSharing.MoreToFinish)
{
exp /= 2;
eaExp = exp / members.Length;
killerExp = exp;
}
// Killer's exp
killer.GiveExp(killerExp);
Send.CombatMessage(killer, expMessage, killerExp);
// Exp for members in range of killer, the range is unofficial
foreach (var member in members.Where(a => a != killer && a.GetPosition().InRange(killerPos, 3000)))
{
member.GiveExp(eaExp);
Send.CombatMessage(member, expMessage, eaExp);
}
}
}