def _getQuestPath(self, questDestUid, isPrivate, alreadyVisited, needToVisit, pathDict, avId):
        questDest = None
        questPath = []
        needToStore = False
        if not isPrivate:
            if not questPath:
                questIds = self.world.queryGoal(questDestUid, self, avId)
                for (questDoId, questUid) in questIds:
                    questGoalObj = self.air.doId2do.get(questDoId)
                    if questGoalObj:
                        if questGoalObj.getParentObj() is self or questGoalObj is self:
                            if questDoId != self.doId:
                                pathDict.setdefault(questDoId, self.doId)
                                newIds = [
                                    self.doId,
                                    questDoId]
                            else:
                                newIds = [
                                    self.doId]
                            questPath = alreadyVisited + [
                                self.doId,
                                questDoId]
                            questDest = QuestStep(self.doId, questDoId, questGoalObj._getQuestStepType(), questGoalObj._getQuestStepPosH())
                            needToStore = True
                            avObj = self.air.doId2do.get(avId)
                            if avObj:
                                avObj.setQuestGoalDoId(questGoalObj)
                            
                            break
                        
                    elif questDoId != None:
                        pass
                    
                    if questDestUid.getType() != QuestGoal.Type_Custom and questUid:
                        
                        try:
                            objInfo = self.air.worldCreator.getObjectDataFromFileByUid(questUid, self.getFileName())
                            if objInfo:
                                if objInfo.get('Type') == 'Dinghy':
                                    pos = objInfo['Pos']
                                    hpr = objInfo['Hpr']
                                    questPath = alreadyVisited + [
                                        self.doId]
                                    questDest = QuestStep(self.doId, 0, QuestStep.STQuestNode, (pos[0], pos[1], pos[2], hpr[0]))
                                    needToStore = True
                                    break
                                elif objInfo.get('Type') == 'Quest Node':
                                    pos = objInfo['Pos']
                                    nodePos = None
                                    parentUid = self.air.worldCreator.getObjectDataFromFileByUid(questUid, self.getFileName(), getParentUid = True)
                                    if parentUid:
                                        parentObj = self.world.uidMgr.justGetMeMeObject(parentUid)
                                        if parentObj:
                                            tform = TransformState.makePosHpr(parentObj.getPos(self), parentObj.getHpr(self))
                                            nodePos = tform.getMat().xformPoint(pos)
                                        
                                    
                                    if nodePos == None:
                                        nodePos = pos
                                    
                                    hpr = objInfo['Hpr']
                                    at = int(float(objInfo['At']))
                                    near = int(float(objInfo['Near']))
                                    nearOffset = (int(objInfo['NearOffsetX']), int(objInfo['NearOffsetY']), int(objInfo['NearOffsetZ']))
                                    nearVis = (int(objInfo['NearVisX']), int(objInfo['NearVisY']), int(objInfo['NearVisZ']))
                                    questPath = alreadyVisited + [
                                        self.doId]
                                    questDest = QuestStep(self.doId, 0, QuestStep.STQuestNode, (nodePos[0], nodePos[1], nodePos[2], hpr[0]), nodeSizes = [
                                        at,
                                        near], nearOffset = nearOffset, nearVis = nearVis)
                                    needToStore = True
                                    break
                                elif objInfo.get('Type') == 'Object Spawn Node':
                                    pos = objInfo['Pos']
                                    hpr = objInfo['Hpr']
                                    questPath = alreadyVisited + [
                                        self.doId]
                                    questDest = QuestStep(self.doId, 0, QuestStep.STArea, (pos[0], pos[1], pos[2], hpr[0]))
                                    needToStore = True
                                    break
                                
                        except AttributeError:
                            pass
                        

                
            
        elif not questPath:
            if self.air.worldCreator.isObjectDefined(questDestUid.getGoalIds(all = False), self.world.getFileName() + '.py'):
                questPath = alreadyVisited + [
                    self.doId]
                needToStore = False
            
        
        if questPath:
            finalPath = [
                questPath[-1]]
            next = pathDict.get(finalPath[-1])
            while next:
                finalPath.append(next)
                next = pathDict.get(finalPath[-1])
            finalPath.reverse()
        
        exitLinks = questPath
        for link in exitLinks:
            pathDict[link] = self.doId
        
        needToVisit += exitLinks
        if needToVisit:
            nextDoId = needToVisit.pop(0)
            nextStep = self.air.doId2do[nextDoId]
            finalPath = nextStep._getQuestPath(questDestUid, isPrivate, alreadyVisited + [
                self.doId], needToVisit, pathDict, avId)
            if questDestUid.getType() == QuestGoal.Type_Custom:
                nextStep.questSteps.pop(questDestUid, None)
            
            needToStore = True
        else:
            finalPath = []
            needToStore = True
        if needToStore and self.doId in finalPath:
            self._storeQuestStep(finalPath, questDestUid, questDest)
        
        if not finalPath:
            self._storeQuestStep(finalPath, questDestUid, questStep = QuestStep.getNullStep())
        
        return finalPath
Ejemplo n.º 2
0
    def _getQuestPath(self, questDestUid, isPrivate, alreadyVisited, needToVisit, pathDict, avId):
        questDest = None
        questPath = []
        needToStore = False
        if not isPrivate:
            if not questPath:
                questIds = self.world.queryGoal(questDestUid, self, avId)
                for (questDoId, questUid) in questIds:
                    questGoalObj = self.air.doId2do.get(questDoId)
                    if questGoalObj:
                        if questGoalObj.getParentObj() is self or questGoalObj is self:
                            if questDoId != self.doId:
                                pathDict.setdefault(questDoId, self.doId)
                                newIds = [
                                    self.doId,
                                    questDoId]
                            else:
                                newIds = [
                                    self.doId]
                            questPath = alreadyVisited + [
                                self.doId,
                                questDoId]
                            questDest = QuestStep(self.doId, questDoId, questGoalObj._getQuestStepType(), questGoalObj._getQuestStepPosH())
                            needToStore = True
                            avObj = self.air.doId2do.get(avId)
                            if avObj:
                                avObj.setQuestGoalDoId(questGoalObj)
                            
                            break
                        
                    elif questDoId != None:
                        pass
                    
                    if questDestUid.getType() != QuestGoal.Type_Custom and questUid:
                        
                        try:
                            objInfo = self.air.worldCreator.getObjectDataFromFileByUid(questUid, self.getFileName())
                            if objInfo:
                                if objInfo.get('Type') == 'Dinghy':
                                    pos = objInfo['Pos']
                                    hpr = objInfo['Hpr']
                                    questPath = alreadyVisited + [
                                        self.doId]
                                    questDest = QuestStep(self.doId, 0, QuestStep.STQuestNode, (pos[0], pos[1], pos[2], hpr[0]))
                                    needToStore = True
                                    break
                                elif objInfo.get('Type') == 'Quest Node':
                                    pos = objInfo['Pos']
                                    nodePos = None
                                    parentUid = self.air.worldCreator.getObjectDataFromFileByUid(questUid, self.getFileName(), getParentUid = True)
                                    if parentUid:
                                        parentObj = self.world.uidMgr.justGetMeMeObject(parentUid)
                                        if parentObj:
                                            tform = TransformState.makePosHpr(parentObj.getPos(self), parentObj.getHpr(self))
                                            nodePos = tform.getMat().xformPoint(pos)
                                        
                                    
                                    if nodePos == None:
                                        nodePos = pos
                                    
                                    hpr = objInfo['Hpr']
                                    at = int(float(objInfo['At']))
                                    near = int(float(objInfo['Near']))
                                    nearOffset = (int(objInfo['NearOffsetX']), int(objInfo['NearOffsetY']), int(objInfo['NearOffsetZ']))
                                    nearVis = (int(objInfo['NearVisX']), int(objInfo['NearVisY']), int(objInfo['NearVisZ']))
                                    questPath = alreadyVisited + [
                                        self.doId]
                                    questDest = QuestStep(self.doId, 0, QuestStep.STQuestNode, (nodePos[0], nodePos[1], nodePos[2], hpr[0]), nodeSizes = [
                                        at,
                                        near], nearOffset = nearOffset, nearVis = nearVis)
                                    needToStore = True
                                    break
                                elif objInfo.get('Type') == 'Object Spawn Node':
                                    pos = objInfo['Pos']
                                    hpr = objInfo['Hpr']
                                    questPath = alreadyVisited + [
                                        self.doId]
                                    questDest = QuestStep(self.doId, 0, QuestStep.STArea, (pos[0], pos[1], pos[2], hpr[0]))
                                    needToStore = True
                                    break
                                
                        except AttributeError:
                            pass
                        

                
            
        elif not questPath:
            if self.air.worldCreator.isObjectDefined(questDestUid.getGoalIds(all = False), self.world.getFileName() + '.py'):
                questPath = alreadyVisited + [
                    self.doId]
                needToStore = False
            
        
        if questPath:
            finalPath = [
                questPath[-1]]
            next = pathDict.get(finalPath[-1])
            while next:
                finalPath.append(next)
                next = pathDict.get(finalPath[-1])
            finalPath.reverse()
        
        exitLinks = questPath
        for link in exitLinks:
            pathDict[link] = self.doId
        
        needToVisit += exitLinks
        if needToVisit:
            nextDoId = needToVisit.pop(0)
            nextStep = self.air.doId2do[nextDoId]
            finalPath = nextStep._getQuestPath(questDestUid, isPrivate, alreadyVisited + [
                self.doId], needToVisit, pathDict, avId)
            if questDestUid.getType() == QuestGoal.Type_Custom:
                nextStep.questSteps.pop(questDestUid, None)
            
            needToStore = True
        else:
            finalPath = []
            needToStore = True
        if needToStore and self.doId in finalPath:
            self._storeQuestStep(finalPath, questDestUid, questDest)
        
        if not finalPath:
            self._storeQuestStep(finalPath, questDestUid, questStep = QuestStep.getNullStep())
        
        return finalPath