void HandleQuestLogRemoveQuest(QuestLogRemoveQuest packet) { if (packet.Entry < SharedConst.MaxQuestLogSize) { uint questId = GetPlayer().GetQuestSlotQuestId(packet.Entry); if (questId != 0) { if (!GetPlayer().TakeQuestSourceItem(questId, true)) { return; // can't un-equip some items, reject quest cancel } Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); QuestStatus oldStatus = _player.GetQuestStatus(questId); if (quest != null) { if (quest.HasSpecialFlag(QuestSpecialFlags.Timed)) { GetPlayer().RemoveTimedQuest(questId); } if (quest.HasFlag(QuestFlags.Pvp)) { GetPlayer().pvpInfo.IsHostile = GetPlayer().pvpInfo.IsInHostileArea || GetPlayer().HasPvPForcingQuest(); GetPlayer().UpdatePvPState(); } } GetPlayer().TakeQuestSourceItem(questId, true); // remove quest src item from player GetPlayer().AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements. GetPlayer().RemoveActiveQuest(questId); GetPlayer().RemoveCriteriaTimer(CriteriaTimedTypes.Quest, questId); Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId); Global.ScriptMgr.OnQuestStatusChange(_player, questId); if (quest != null) { Global.ScriptMgr.OnQuestStatusChange(_player, quest, oldStatus, QuestStatus.None); } } GetPlayer().SetQuestSlot(packet.Entry, 0); GetPlayer().UpdateCriteria(CriteriaTypes.QuestAbandoned, 1); } }
void HandleQuestgiverCompleteQuest(QuestGiverCompleteQuest packet) { bool autoCompleteMode = packet.FromScript; // 0 - standart complete quest mode with npc, 1 - auto-complete mode Quest quest = Global.ObjectMgr.GetQuestTemplate(packet.QuestID); if (quest == null) { return; } if (autoCompleteMode && !quest.HasFlag(QuestFlags.AutoComplete)) { return; } WorldObject obj; if (autoCompleteMode) { obj = GetPlayer(); } else { obj = Global.ObjAccessor.GetObjectByTypeMask(GetPlayer(), packet.QuestGiverGUID, TypeMask.Unit | TypeMask.GameObject); } if (!obj) { return; } if (!autoCompleteMode) { if (!obj.HasInvolvedQuest(packet.QuestID)) { return; } // some kind of WPE protection if (!GetPlayer().CanInteractWithQuestGiver(obj)) { return; } } else { // Do not allow completing quests on other players. if (packet.QuestGiverGUID != GetPlayer().GetGUID()) { return; } } if (!GetPlayer().CanSeeStartQuest(quest) && GetPlayer().GetQuestStatus(packet.QuestID) == QuestStatus.None) { Log.outError(LogFilter.Network, "Possible hacking attempt: Player {0} ({1}) tried to complete quest [entry: {2}] without being in possession of the quest!", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.QuestID); return; } Battleground bg = GetPlayer().GetBattleground(); if (bg) { bg.HandleQuestComplete(packet.QuestID, GetPlayer()); } if (GetPlayer().GetQuestStatus(packet.QuestID) != QuestStatus.Complete) { if (quest.IsRepeatable()) { GetPlayer().PlayerTalkClass.SendQuestGiverRequestItems(quest, packet.QuestGiverGUID, GetPlayer().CanCompleteRepeatableQuest(quest), false); } else { GetPlayer().PlayerTalkClass.SendQuestGiverRequestItems(quest, packet.QuestGiverGUID, GetPlayer().CanRewardQuest(quest, false), false); } } else { if (quest.HasSpecialFlag(QuestSpecialFlags.Deliver)) // some items required { GetPlayer().PlayerTalkClass.SendQuestGiverRequestItems(quest, packet.QuestGiverGUID, GetPlayer().CanRewardQuest(quest, false), false); } else // no items required { GetPlayer().PlayerTalkClass.SendQuestGiverOfferReward(quest, packet.QuestGiverGUID, true); } } }