def handle(world_session, socket, reader): if len(reader.data) >= 8: # Avoid handling empty packet guid, quest_entry = unpack('<QL', reader.data[:12]) # quest giver is an npc or an item quest_giver = GridManager.get_surrounding_unit_by_guid( world_session.player_mgr, guid ) or world_session.player_mgr.inventory.get_item_info_by_guid( guid)[3].item_template if not quest_giver: Logger.error( "Error in CMSG_QUESTGIVER_QUERY_QUEST, could not find quest giver with guid of: %u" % guid) return 0 quest_giver_is_related = world_session.player_mgr.quest_manager.check_quest_giver_npc_is_related( quest_giver.entry, quest_entry) or quest_giver.start_quest == quest_entry if not quest_giver_is_related: Logger.error( "Error in CMSG_QUESTGIVER_QUERY_QUEST, quest giver %u was not related to quest %u" % (quest_giver.entry, quest_entry)) return 0 quest = WorldDatabaseManager.quest_get_by_entry(quest_entry) if not quest: Logger.error( "Error in CMSG_QUESTGIVER_QUERY_QUEST, could not find quest with an entry of: %u" % quest_entry) return 0 world_session.player_mgr.quest_manager.send_quest_giver_quest_details( quest, guid, True) return 0
def get_dialog_status(self, world_obj, defstatus): dialog_status = defstatus rbounds = WorldDatabaseManager.creature_quest_get_by_entry( world_obj.entry) # realtions bounds, the quest giver irbounds = WorldDatabaseManager.creature_involved_quest_get_by_entry( world_obj.entry ) # involved relations bounds, the quest completer # TODO: If unit is hostile to player, do not display status # Quest finish, Loop through all the completion quests offered by this quest giver # TODO: This loop for irbound in irbounds: if len(irbound) == 0: continue quest_entry = irbound[1] quest = WorldDatabaseManager.quest_get_by_entry(quest_entry) # TODO: put in a check for quest status when you have quests that are already accepted by player # Quest start, Loop through all the acceptable quests offered by this quest giver for rbound in rbounds: new_dialog_status = QuestGiverStatuses.QUEST_GIVER_NONE quest_entry = rbound[1] quest = WorldDatabaseManager.quest_get_by_entry(quest_entry) if (quest.Method == 0): new_dialog_status = QuestGiverStatuses.QUEST_GIVER_REWARD elif (self.owner.level < quest.MinLevel & self.owner.level >= quest.MinLevel - 4): new_dialog_status = QuestGiverStatuses.QUEST_GIVER_FUTURE # Silver ! elif (self.owner.level >= quest.MinLevel & self.owner.level < quest.QuestLevel + 7): new_dialog_status = QuestGiverStatuses.QUEST_GIVER_QUEST # Yellow ! elif (self.owner.level > quest.QuestLevel + 7): new_dialog_status = QuestGiverStatuses.QUEST_GIVER_TRIVIAL # ez quest # print("Classes: %s"%(quest.RequiredClasses)) # Update the status if it appears to be a "higher" code then any of the previous if new_dialog_status > dialog_status: dialog_status = new_dialog_status # return the status return dialog_status
def get_dialog_status(self, world_obj): dialog_status = QuestGiverStatus.QUEST_GIVER_NONE # Relations bounds, the quest giver; Involved relations bounds, the quest completer relations_list = WorldDatabaseManager.creature_quest_get_by_entry( world_obj.entry) involved_relations_list = WorldDatabaseManager.creature_involved_quest_get_by_entry( world_obj.entry) if self.player_mgr.is_enemy_to(world_obj): return dialog_status # TODO: Quest finish for involved_relation in involved_relations_list: if len(involved_relation) == 0: continue quest_entry = involved_relation[1] quest = WorldDatabaseManager.quest_get_by_entry(quest_entry) if not quest: continue # TODO: put in a check for quest status when you have quests that are already accepted by player # Quest start for relation in relations_list: new_dialog_status = QuestGiverStatus.QUEST_GIVER_NONE quest_entry = relation[1] quest = WorldDatabaseManager.quest_get_by_entry(quest_entry) if not quest or not self.check_quest_requirements(quest): continue if quest.Method == 0: new_dialog_status = QuestGiverStatus.QUEST_GIVER_REWARD elif quest.MinLevel > self.player_mgr.level >= quest.MinLevel - 4: new_dialog_status = QuestGiverStatus.QUEST_GIVER_FUTURE elif quest.MinLevel <= self.player_mgr.level < quest.QuestLevel + 7: new_dialog_status = QuestGiverStatus.QUEST_GIVER_QUEST elif self.player_mgr.level > quest.QuestLevel + 7: new_dialog_status = QuestGiverStatus.QUEST_GIVER_TRIVIAL if new_dialog_status > dialog_status: dialog_status = new_dialog_status return dialog_status
def prepare_quest_giver_gossip_menu(self, quest_giver, guid): quest_menu = QuestMenu() # Type is unit, but not player if quest_giver.get_type( ) == ObjectTypes.TYPE_UNIT and quest_giver.get_type( ) != ObjectTypes.TYPE_PLAYER: relations_list = WorldDatabaseManager.creature_quest_get_by_entry( quest_giver.entry) involved_relations_list = WorldDatabaseManager.creature_involved_quest_get_by_entry( quest_giver.entry) elif quest_giver.get_type() == ObjectTypes.TYPE_GAMEOBJECT: # TODO: Gameobjects relations_list = [] involved_relations_list = [] else: return # TODO: Finish quests for involved_relation in involved_relations_list: if len(involved_relation) == 0: continue continue # Starting quests for relation in relations_list: if len(relation) == 0: continue quest_entry = relation[1] quest = WorldDatabaseManager.quest_get_by_entry(quest_entry) if not quest or not self.check_quest_requirements( quest) or not self.check_quest_level(quest, False): continue quest_menu.add_menu_item(quest, QuestStatus.QUEST_OFFER) if len(quest_menu.items) == 1: # TODO: handle a single quest situation, open the quest directly quest = list(quest_menu.items.values())[0] self.send_quest_giver_quest_list("Greetings, $N.", guid, quest_menu.items) else: # TODO: Send the proper greeting message self.send_quest_giver_quest_list("Greetings, $N.", guid, quest_menu.items)
def prepare_quest_giver_gossip_menu(self, quest_giver, guid): quest_menu = QuestMenu() # Type is unit, but not player if quest_giver.get_type() == ObjectTypes.TYPE_UNIT and quest_giver.get_type() != ObjectTypes.TYPE_PLAYER: relations_list = WorldDatabaseManager.creature_quest_get_by_entry(quest_giver.entry) involved_relations_list = WorldDatabaseManager.creature_involved_quest_get_by_entry(quest_giver.entry) elif quest_giver.get_type() == ObjectTypes.TYPE_GAMEOBJECT: # TODO: Gameobjects relations_list = [] involved_relations_list = [] else: return # TODO: Finish quests for involved_relation in involved_relations_list: if len(involved_relation) == 0: continue continue # Starting quests for relation in relations_list: if len(relation) == 0: continue quest_entry = relation[1] quest = WorldDatabaseManager.quest_get_by_entry(quest_entry) if not quest or not self.check_quest_requirements(quest) or not self.check_quest_level(quest, False): continue quest_menu.add_menu_item(quest, QuestStatus.QUEST_OFFER) if len(quest_menu.items) == 1: quest_menu_item = list(quest_menu.items.values())[0] if quest_menu_item.status == QuestStatus.QUEST_REWARD: # TODO: Handle completed quest return 0 elif quest_menu_item.status == QuestStatus.QUEST_ACCEPTED: # TODO: Handle in progress quests return 0 else: self.send_quest_giver_quest_details(quest_menu_item.quest, guid, True) else: # TODO: Send the proper greeting message self.send_quest_giver_quest_list("Greetings, $N.", guid, quest_menu.items) self.update_surrounding_quest_status()