Example #1
0
        public void CreatureCompletesQuest(MabiCreature creature, MabiQuest quest, bool rewards)
        {
            if (rewards)
            {
                // Owl
                WorldManager.Instance.Broadcast(new MabiPacket(Op.QuestOwlComplete, creature.Id).PutLong(quest.Id), SendTargets.Range, creature);

                // Rewards
                foreach (var reward in quest.Info.Rewards)
                {
                    switch (reward.Type)
                    {
                        case RewardType.Exp:
                            creature.GiveExp(reward.Amount);
                            creature.Client.Send(PacketCreator.AcquireExp(creature, reward.Amount));
                            this.CreatureStatsUpdate(creature);
                            break;

                        case RewardType.Gold:
                            creature.GiveItem(2000, reward.Amount);
                            creature.Client.Send(PacketCreator.AcquireItem(creature, reward.Id, reward.Amount));
                            break;

                        case RewardType.Item:
                            creature.GiveItem(reward.Id, reward.Amount);
                            creature.Client.Send(PacketCreator.AcquireItem(creature, reward.Id, reward.Amount));
                            break;

                        case RewardType.Skill:
                            var id = (SkillConst)reward.Id;
                            var rank = (SkillRank)reward.Amount;

                            // Only give skill if char doesn't have it or rank is lower.
                            var skill = creature.Skills.Get(id);
                            if (skill == null || skill.Rank < rank)
                            {
                                creature.Skills.Give(id, rank);
                                WorldManager.Instance.CreatureStatsUpdate(creature);
                            }
                            break;

                        default:
                            Logger.Warning("Unsupported reward type '{0}'.", reward.Type);
                            break;
                    }
                }

                // Only call this if there were rewards, we're using this
                // method to clear quests as well.
                var script = ScriptManager.Instance.GetQuestScript(quest.Info.Id);
                if (script != null)
                    script.OnCompleted(creature.Client as WorldClient, quest);
            }

            Send.ItemInfo(creature.Client, creature, quest.QuestItem);

            // Remove from quest log.
            creature.Client.Send(new MabiPacket(Op.QuestClear, creature.Id).PutLong(quest.Id));
        }