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); } } }
void HandlePushQuestToParty(PushQuestToParty packet) { if (!GetPlayer().CanShareQuest(packet.QuestID)) { return; } Quest quest = Global.ObjectMgr.GetQuestTemplate(packet.QuestID); if (quest == null) { return; } Player sender = GetPlayer(); Group group = sender.GetGroup(); if (!group) { sender.SendPushToPartyResponse(sender, QuestPushReason.NotInParty); return; } for (GroupReference refe = group.GetFirstMember(); refe != null; refe = refe.Next()) { Player receiver = refe.GetSource(); if (!receiver || receiver == sender) { continue; } if (!receiver.SatisfyQuestStatus(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.OnQuest); continue; } if (receiver.GetQuestStatus(packet.QuestID) == QuestStatus.Complete) { sender.SendPushToPartyResponse(receiver, QuestPushReason.AlreadyDone); continue; } if (!receiver.SatisfyQuestDay(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.DifferentServerDaily); continue; } if (!receiver.CanTakeQuest(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Invalid); continue; } if (!receiver.SatisfyQuestLog(false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.LogFull); continue; } if (!receiver.GetPlayerSharingQuest().IsEmpty()) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Busy); continue; } sender.SendPushToPartyResponse(receiver, QuestPushReason.Success); if (quest.IsAutoAccept() && receiver.CanAddQuest(quest, true) && receiver.CanTakeQuest(quest, true)) { receiver.AddQuestAndCheckCompletion(quest, sender); } if ((quest.IsAutoComplete() && quest.IsRepeatable() && !quest.IsDailyOrWeekly()) || quest.HasFlag(QuestFlags.AutoComplete)) { receiver.PlayerTalkClass.SendQuestGiverRequestItems(quest, sender.GetGUID(), receiver.CanCompleteRepeatableQuest(quest), true); } else { receiver.SetQuestSharingInfo(sender.GetGUID(), quest.Id); receiver.PlayerTalkClass.SendQuestGiverQuestDetails(quest, receiver.GetGUID(), true, false); } } }
void HandlePushQuestToParty(PushQuestToParty packet) { Quest quest = Global.ObjectMgr.GetQuestTemplate(packet.QuestID); if (quest == null) { return; } Player sender = GetPlayer(); if (!_player.CanShareQuest(packet.QuestID)) { sender.SendPushToPartyResponse(sender, QuestPushReason.NotAllowed); return; } // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share if (Global.QuestPoolMgr.IsQuestActive(packet.QuestID)) { sender.SendPushToPartyResponse(sender, QuestPushReason.NotDaily); return; } Group group = sender.GetGroup(); if (!group) { sender.SendPushToPartyResponse(sender, QuestPushReason.NotInParty); return; } for (GroupReference refe = group.GetFirstMember(); refe != null; refe = refe.Next()) { Player receiver = refe.GetSource(); if (!receiver || receiver == sender) { continue; } if (!receiver.GetPlayerSharingQuest().IsEmpty()) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Busy); continue; } if (!receiver.IsAlive()) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Dead); receiver.SendPushToPartyResponse(sender, QuestPushReason.DeadToRecipient, quest); continue; } switch (receiver.GetQuestStatus(packet.QuestID)) { case QuestStatus.Rewarded: { sender.SendPushToPartyResponse(receiver, QuestPushReason.AlreadyDone); receiver.SendPushToPartyResponse(sender, QuestPushReason.AlreadyDoneToRecipient, quest); continue; } case QuestStatus.Incomplete: case QuestStatus.Complete: { sender.SendPushToPartyResponse(receiver, QuestPushReason.OnQuest); receiver.SendPushToPartyResponse(sender, QuestPushReason.OnQuestToRecipient, quest); continue; } default: break; } if (!receiver.SatisfyQuestLog(false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.LogFull); receiver.SendPushToPartyResponse(sender, QuestPushReason.LogFullToRecipient, quest); continue; } if (!receiver.SatisfyQuestDay(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.AlreadyDone); receiver.SendPushToPartyResponse(sender, QuestPushReason.AlreadyDoneToRecipient, quest); continue; } if (!receiver.SatisfyQuestMinLevel(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.LowLevel); receiver.SendPushToPartyResponse(sender, QuestPushReason.LowLevelToRecipient, quest); continue; } if (!receiver.SatisfyQuestMaxLevel(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.HighLevel); receiver.SendPushToPartyResponse(sender, QuestPushReason.HighLevelToRecipient, quest); continue; } if (!receiver.SatisfyQuestClass(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Class); receiver.SendPushToPartyResponse(sender, QuestPushReason.ClassToRecipient, quest); continue; } if (!receiver.SatisfyQuestRace(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Race); receiver.SendPushToPartyResponse(sender, QuestPushReason.RaceToRecipient, quest); continue; } if (!receiver.SatisfyQuestReputation(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.LowFaction); receiver.SendPushToPartyResponse(sender, QuestPushReason.LowFactionToRecipient, quest); continue; } if (!receiver.SatisfyQuestDependentQuests(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Prerequisite); receiver.SendPushToPartyResponse(sender, QuestPushReason.PrerequisiteToRecipient, quest); continue; } if (!receiver.SatisfyQuestExpansion(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Expansion); receiver.SendPushToPartyResponse(sender, QuestPushReason.ExpansionToRecipient, quest); continue; } if (!receiver.CanTakeQuest(quest, false)) { sender.SendPushToPartyResponse(receiver, QuestPushReason.Invalid); receiver.SendPushToPartyResponse(sender, QuestPushReason.InvalidToRecipient, quest); continue; } sender.SendPushToPartyResponse(receiver, QuestPushReason.Success); if (quest.IsAutoAccept() && receiver.CanAddQuest(quest, true) && receiver.CanTakeQuest(quest, true)) { receiver.AddQuestAndCheckCompletion(quest, sender); } if ((quest.IsAutoComplete() && quest.IsRepeatable() && !quest.IsDailyOrWeekly()) || quest.HasFlag(QuestFlags.AutoComplete)) { receiver.PlayerTalkClass.SendQuestGiverRequestItems(quest, sender.GetGUID(), receiver.CanCompleteRepeatableQuest(quest), true); } else { receiver.SetQuestSharingInfo(sender.GetGUID(), quest.Id); receiver.PlayerTalkClass.SendQuestGiverQuestDetails(quest, receiver.GetGUID(), true, false); } } }