private void DropGold(Creature killer, Random rnd, Position pos)
{
var goldDropChance = ChannelServer.Instance.Conf.World.GoldDropChance;
// Add global bonus
float goldRateBonus;
string bonuses;
if (ChannelServer.Instance.GameEventManager.GlobalBonuses.GetBonusMultiplier(GlobalBonusStat.GoldDropRate, out goldRateBonus, out bonuses))
goldDropChance *= goldRateBonus;
// Check if drop
if (rnd.NextDouble() >= goldDropChance)
return;
// Random base amount
var amount = rnd.Next(this.Drops.GoldMin, this.Drops.GoldMax + 1);
// Add global bonus
float goldDropBonus;
if (ChannelServer.Instance.GameEventManager.GlobalBonuses.GetBonusMultiplier(GlobalBonusStat.GoldDropAmount, out goldDropBonus, out bonuses))
amount = (int)(amount * goldDropBonus);
if (amount > 0)
{
var finish = LuckyFinish.None;
// Lucky Finish
var luckyChance = rnd.NextDouble();
// Sunday: Increase in lucky finish.
// +5%, bonus is unofficial.
if (ErinnTime.Now.Month == ErinnMonth.Imbolic)
luckyChance += 0.05;
var hugeLuckyFinishChance = ChannelServer.Instance.Conf.World.HugeLuckyFinishChance;
var bigLuckyFinishChance = ChannelServer.Instance.Conf.World.BigLuckyFinishChance;
var luckyFinishChance = ChannelServer.Instance.Conf.World.LuckyFinishChance;
// Add global bonus
float luckyDropBonus;
if (ChannelServer.Instance.GameEventManager.GlobalBonuses.GetBonusMultiplier(GlobalBonusStat.LuckyFinishRate, out luckyDropBonus, out bonuses))
{
hugeLuckyFinishChance *= luckyDropBonus;
bigLuckyFinishChance *= luckyDropBonus;
luckyFinishChance *= luckyDropBonus;
}
if (luckyChance < hugeLuckyFinishChance)
{
amount *= 100;
finish = LuckyFinish.Lucky;
Send.CombatMessage(killer, Localization.Get("Huge Lucky Finish!!"));
Send.Notice(killer, Localization.Get("Huge Lucky Finish!!"));
}
else if (luckyChance < bigLuckyFinishChance)
{
amount *= 5;
finish = LuckyFinish.BigLucky;
Send.CombatMessage(killer, Localization.Get("Big Lucky Finish!!"));
Send.Notice(killer, Localization.Get("Big Lucky Finish!!"));
}
else if (luckyChance < luckyFinishChance)
{
amount *= 2;
finish = LuckyFinish.HugeLucky;
Send.CombatMessage(killer, Localization.Get("Lucky Finish!!"));
Send.Notice(killer, Localization.Get("Lucky Finish!!"));
}
// If lucky finish
if (finish != LuckyFinish.None)
{
// Event
ChannelServer.Instance.Events.OnCreatureGotLuckyFinish(killer, finish, amount);
// Sunday: Increase in lucky bonus.
// +5%, bonus is unofficial.
if (ErinnTime.Now.Month == ErinnMonth.Imbolic)
amount = (int)(amount * 1.05f);
}
// Drop rate muliplicator
amount = Math.Min(21000, Math2.MultiplyChecked(amount, ChannelServer.Instance.Conf.World.GoldDropRate));
// Drop stack for stack
var i = 0;
var pattern = (amount == 21000);
do
{
Position dropPos;
if (!pattern)
{
dropPos = pos.GetRandomInRange(Item.DropRadius, rnd);
}
else
{
dropPos = new Position(pos.X + CreatureDrops.MaxGoldPattern[i, 0], pos.Y + CreatureDrops.MaxGoldPattern[i, 1]);
i++;
}
var gold = Item.CreateGold(Math.Min(1000, amount));
gold.Drop(this.Region, dropPos, 0, killer, false);
amount -= gold.Info.Amount;
}
while (amount > 0);
}
}