Aura.Channel.World.Entities.Creature.DropGold C# (CSharp) Method

DropGold() private method

Drops creature's gold.
private DropGold ( Creature killer, Random rnd, Position pos ) : void
killer Creature
rnd Random
pos Position
return void
		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);
			}
		}