Example #1
0
 def __shipHit(self, shipId, hitObject, entry, skillId, ammoSkillId):
     ship = self.cr.doId2do.get(shipId)
     if not ship or ship.queryGameState() == 'Inactive':
         return
     if self.localAvatarUsingWeapon:
         cannonCode = 0
         cannonCodeStr = hitObject.getNetTag('cannonCode')
         if cannonCodeStr:
             cannonCode = int(cannonCodeStr)
         hullCode = 0
         hullCodeStr = hitObject.getNetTag('hullCode')
         if hullCodeStr:
             hullCode = int(hullCodeStr)
         sailCode = 0
         sailCodeStr = hitObject.getNetTag('sailCode')
         if sailCodeStr:
             sailCode = int(sailCodeStr)
         codes = [cannonCode, hullCode, sailCode]
         pos = entry.getSurfacePoint(ship)
         normal = entry.getSurfaceNormal(render)
         timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
         attackerId = 0
         attackerStr = entry.getFromNodePath().getNetTag('attackerId')
         if attackerStr:
             attackerId = int(attackerStr)
         attacker = self.cr.doId2do.get(attackerId)
         if not attacker:
             return
         if not TeamUtils.damageAllowed(attacker, ship):
             if hasattr(attacker, 'getName') and hasattr(ship, 'getName'):
                 if TeamUtils.friendOrFoe(
                         attacker, ship) == PiratesGlobals.PVP_FRIEND:
                     localAvatar.guiMgr.createWarning(
                         PLocalizer.TeamFireWarning,
                         PiratesGuiGlobals.TextFG6)
                 else:
                     localAvatar.guiMgr.createWarning(
                         PLocalizer.FriendlyFireWarning,
                         PiratesGuiGlobals.TextFG6)
             attacker.battleRandom.advanceAttackSeed()
             return
         areaList = self.getAreaList(skillId, ammoSkillId, ship, pos,
                                     attackerId)
         result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId,
                                             shipId, areaList, pos)
         self.sendSuggestProjectileSkillResult(
             skillId, ammoSkillId, result, shipId, areaList,
             [pos[0], pos[1], pos[2]], [normal[0], normal[1], normal[2]],
             codes, timestamp32)
         for doId in [shipId] + areaList:
             target = self.cr.doId2do.get(doId)
             attackerEffects, targetEffects, itemEffects = self.cr.battleMgr.getModifiedSkillEffects(
                 attacker, target, skillId, ammoSkillId)
             target.projectileWeaponHit(skillId, ammoSkillId, result,
                                        targetEffects, pos, normal, codes,
                                        attacker, itemEffects)
Example #2
0
 def compareTo(self, object, goalOwner=None):
     if self.__goalType == types.DictType:
         goalLevel = self.__goalData.get(self.LEVEL_IDX, 0)
         if goalLevel > 0:
             if goalLevel > object.getLevel():
                 return 1
             hasIsShip = hasattr(object, '_isShip')
             if game.process == 'ai':
                 if not hasIsShip:
                     return -1
                 goalLocation = self.__goalData.get(self.LOCATION_IDX, None)
                 objectLocation = object.getParentObj()
                 if goalLocation and objectLocation and hasattr(
                         objectLocation, 'getUniqueId'
                 ) and not goalLocation == LocationConstants.LocationIds.ANY_LOCATION and not LocationConstants.isInArea(
                         goalLocation, objectLocation.getUniqueId())[0]:
                     return 1
                 goalFaction = hasIsShip and object._isShip(
                 ) and self.getTargetTypeOnlyOnOcean(
                 ) and self.__goalData.get(self.FACTION_IDX, None)
                 if goalFaction:
                     isEnemy = False
                     if goalOwner:
                         isEnemy = TeamUtils.friendOrFoe(
                             goalOwner, object) == PiratesGlobals.ENEMY
                     objFaction = object.getFaction()
                     if goalFaction != None and objFaction != None and goalFaction.getFaction(
                     ) != objFaction.getFaction() or not isEnemy:
                         return 1
                 goalHull = self.__goalData.get(self.HULL_IDX, None)
                 if goalHull != None:
                     shipClassList = QuestConstants.getShipList(goalHull)
                     if shipClassList == None:
                         shipClassList = [goalHull]
                     if object.shipClass not in shipClassList:
                         return 1
                 goalFlagship = self.__goalData.get(self.FLAGSHIP_IDX,
                                                    False)
                 if goalFlagship != object.isFlagship:
                     return 1
                 if object.getTeam() == PiratesGlobals.PLAYER_TEAM:
                     return 1
                 return 0
         elif self.getTargetTypeOnlyOnOcean() or self.__goalData.get(
                 self.TYPE_IDX) == AvatarTypes.AnyAvatar:
             if goalOwner:
                 if TeamUtils.friendOrFoe(goalOwner,
                                          object) == PiratesGlobals.ENEMY:
                     return 0
             elif object.getAvatarType().isA(
                     self.__goalData.get(self.TYPE_IDX)):
                 return 0
     else:
         if self.__goalData and object.getUniqueId() in self.__goalData:
             return 0
     return 1
Example #3
0
    def makeRadarNode(self, obj, objType, objDoId=None, teamId=None):
        model = None
        outOfRangeNode = None
        camH = camera.getH(render)
        if objType != RADAR_OBJ_TYPE_QUEST and obj.getCollideMask(
        ).hasBitsInCommon(PiratesGlobals.RadarShipBitmask):
            modelDict = self.modelDict[RADAR_OBJ_TYPE_SHIP]
        else:
            modelDict = self.modelDict[objType]
        model = modelDict[0].copyTo(self.objTop)
        if modelDict[1]:
            outOfRangeNode = modelDict[1].copyTo(self.objTop)

        if objType == RADAR_OBJ_TYPE_DEFAULT:
            status = PiratesGlobals.NEUTRAL
            if teamId:
                status = TeamUtils.teamStatus(localAvatar.getTeam(), teamId)
            elif not objDoId:
                pass
            avId = obj.getNetTag('avId')
            if avId:
                avId = int(avId)
                av = base.cr.doId2do.get(avId)
                if av:
                    if DistributedBandMember.areSameCrew(
                            localAvatar.doId, avId):
                        status = PiratesGlobals.CREW
                    else:
                        status = TeamUtils.friendOrFoe(localAvatar, av)
                else:
                    return (model, outOfRangeNode)

            if status == PiratesGlobals.ENEMY or status == PiratesGlobals.PVP_ENEMY:
                model.setColorScale(MinimapGlobals.MAPCOLOR_ENEMY)
            elif status == PiratesGlobals.FRIEND or status == PiratesGlobals.PVP_FRIEND:
                model.setColorScale(MinimapGlobals.MAPCOLOR_FRIEND)
            elif status == PiratesGlobals.CREW:
                model.setColorScale(MinimapGlobals.MAPCOLOR_FRIEND)
            elif status == PiratesGlobals.NEUTRAL:
                model.setColorScale(MinimapGlobals.MAPCOLOR_NPC)
            else:
                model.setColorScale(MinimapGlobals.MAPCOLOR_NPC)
        elif objType == RADAR_OBJ_TYPE_QUEST:
            model.setColorScale(MinimapGlobals.MAPCOLOR_QUEST)
            if outOfRangeNode:
                outOfRangeNode.setColorScale(MinimapGlobals.MAPCOLOR_QUEST)
                outOfRangeNode.setScale(0.75)

        return (model, outOfRangeNode)
    def makeRadarNode(self, obj, objType, objDoId = None, teamId = None):
        model = None
        outOfRangeNode = None
        camH = camera.getH(render)
        if objType != RADAR_OBJ_TYPE_QUEST and obj.getCollideMask().hasBitsInCommon(PiratesGlobals.RadarShipBitmask):
            modelDict = self.modelDict[RADAR_OBJ_TYPE_SHIP]
        else:
            modelDict = self.modelDict[objType]
        model = modelDict[0].copyTo(self.objTop)
        if modelDict[1]:
            outOfRangeNode = modelDict[1].copyTo(self.objTop)

        if objType == RADAR_OBJ_TYPE_DEFAULT:
            status = PiratesGlobals.NEUTRAL
            if teamId:
                status = TeamUtils.teamStatus(localAvatar.getTeam(), teamId)
            elif not objDoId:
                pass
            avId = obj.getNetTag('avId')
            if avId:
                avId = int(avId)
                av = base.cr.doId2do.get(avId)
                if av:
                    if DistributedBandMember.areSameCrew(localAvatar.doId, avId):
                        status = PiratesGlobals.CREW
                    else:
                        status = TeamUtils.friendOrFoe(localAvatar, av)
                else:
                    return (model, outOfRangeNode)

            if status == PiratesGlobals.ENEMY or status == PiratesGlobals.PVP_ENEMY:
                model.setColorScale(MinimapGlobals.MAPCOLOR_ENEMY)
            elif status == PiratesGlobals.FRIEND or status == PiratesGlobals.PVP_FRIEND:
                model.setColorScale(MinimapGlobals.MAPCOLOR_FRIEND)
            elif status == PiratesGlobals.CREW:
                model.setColorScale(MinimapGlobals.MAPCOLOR_FRIEND)
            elif status == PiratesGlobals.NEUTRAL:
                model.setColorScale(MinimapGlobals.MAPCOLOR_NPC)
            else:
                model.setColorScale(MinimapGlobals.MAPCOLOR_NPC)
        elif objType == RADAR_OBJ_TYPE_QUEST:
            model.setColorScale(MinimapGlobals.MAPCOLOR_QUEST)
            if outOfRangeNode:
                outOfRangeNode.setColorScale(MinimapGlobals.MAPCOLOR_QUEST)
                outOfRangeNode.setScale(0.75)


        return (model, outOfRangeNode)
    def getAimHitPos(self, av):
        if not self.aimTrav:
            return
        self.aimTrav.traverse(render)
        numEntries = self.aimQueue.getNumEntries()
        if numEntries == 0:
            return
        self.aimQueue.sortEntries()
        avTeam = av.getTeam()
        for i in range(numEntries):
            entry = self.aimQueue.getEntry(i)
            targetColl = entry.getIntoNodePath()
            if targetColl.node().getIntoCollideMask().hasBitsInCommon(
                    PiratesGlobals.BattleAimOccludeBitmask):
                break
            target = self.getObjectFromNodepath(targetColl)
            if target:
                targetTeam = target.getTeam()
                if not TeamUtils.damageAllowed(target, localAvatar):
                    continue
                else:
                    if target.gameFSM.state == 'Death':
                        continue
                if targetColl.hasNetPythonTag('MonstrousObject'):
                    dist = entry.getSurfacePoint(av)[1]
                else:
                    dist = target.getY(av)
                if dist < 0:
                    continue
                pos = entry.getSurfacePoint(target)
                return pos
            else:
                continue

        return
Example #6
0
 def __avatarHit(self, avId, hitObject, entry, skillId, ammoSkillId):
     av = self.cr.doId2do.get(avId)
     if av and self.localAvatarUsingWeapon:
         codes = []
         pos = entry.getSurfacePoint(av)
         normal = entry.getSurfaceNormal(render)
         timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
         attackerId = 0
         attackerStr = entry.getFromNodePath().getNetTag('attackerId')
         if attackerStr:
             attackerId = int(attackerStr)
         attacker = self.cr.doId2do.get(attackerId)
         if not attacker:
             return
         if not TeamUtils.damageAllowed(attacker, av):
             if hasattr(attacker, 'getName') and hasattr(av, 'getName'):
                 pass
             return
         areaList = self.getAreaList(skillId, ammoSkillId, av, pos,
                                     attackerId)
         result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId,
                                             avId, areaList, pos)
         self.sendSuggestProjectileSkillResult(
             skillId, ammoSkillId, result, avId, areaList,
             [pos[0], pos[1], pos[2]], [normal[0], normal[1], normal[2]],
             codes, timestamp32)
         for doId in [avId] + areaList:
             target = self.cr.doId2do.get(doId)
             attackerEffects, targetEffects, itemEffects = self.cr.battleMgr.getModifiedSkillEffects(
                 attacker, target, skillId, ammoSkillId)
             target.projectileWeaponHit(skillId, ammoSkillId, result,
                                        targetEffects, pos, normal, codes,
                                        attacker, itemEffects)
Example #7
0
 def takeAim(self, av, skillId = None, ammoSkillId = None):
     if not self.aimTrav:
         return (None, None)
     
     self.aimTrav.traverse(render)
     numEntries = self.aimQueue.getNumEntries()
     if numEntries == 0:
         return (None, None)
     
     self.aimQueue.sortEntries()
     avTeam = av.getTeam()
     (currentWeaponId, isWeaponDrawn) = av.getCurrentWeapon()
     friendlyWeapon = WeaponGlobals.isFriendlyFireWeapon(currentWeaponId)
     if skillId:
         friendlySkill = WeaponGlobals.isFriendlyFire(skillId, ammoSkillId)
     
     for i in range(numEntries):
         entry = self.aimQueue.getEntry(i)
         targetColl = entry.getIntoNodePath()
         if targetColl.node().getIntoCollideMask().hasBitsInCommon(PiratesGlobals.BattleAimOccludeBitmask):
             break
         
         target = self.getObjectFromNodepath(targetColl)
         if target:
             if targetColl.hasNetPythonTag('MonstrousObject'):
                 dist = entry.getSurfacePoint(localAvatar)[1]
             else:
                 dist = target.getY(av)
             targetTeam = target.getTeam()
             if target.gameFSM.state == 'Death':
                 continue
             
             if dist < 0:
                 continue
             
             if not TeamUtils.damageAllowed(target, localAvatar):
                 if not friendlyWeapon:
                     continue
                 
                 if skillId and not friendlySkill:
                     continue
                 
             
             if not self.cr.battleMgr.obeysPirateCode(av, target):
                 if ItemGlobals.getSubtype(av.currentWeaponId) != ItemGlobals.BAYONET:
                     localAvatar.guiMgr.showPirateCode()
                     continue
                 
             
             return (target, dist)
             continue
         continue
     
     return (None, None)
 def takeAim(self, av, skillId = None, ammoSkillId = None):
     if not self.aimTrav:
         return (None, None)
     
     self.aimTrav.traverse(render)
     numEntries = self.aimQueue.getNumEntries()
     if numEntries == 0:
         return (None, None)
     
     self.aimQueue.sortEntries()
     avTeam = av.getTeam()
     (currentWeaponId, isWeaponDrawn) = av.getCurrentWeapon()
     friendlyWeapon = WeaponGlobals.isFriendlyFireWeapon(currentWeaponId)
     if skillId:
         friendlySkill = WeaponGlobals.isFriendlyFire(skillId, ammoSkillId)
     
     for i in range(numEntries):
         entry = self.aimQueue.getEntry(i)
         targetColl = entry.getIntoNodePath()
         if targetColl.node().getIntoCollideMask().hasBitsInCommon(PiratesGlobals.BattleAimOccludeBitmask):
             break
         
         target = self.getObjectFromNodepath(targetColl)
         if target:
             if targetColl.hasNetPythonTag('MonstrousObject'):
                 dist = entry.getSurfacePoint(localAvatar)[1]
             else:
                 dist = target.getY(av)
             targetTeam = target.getTeam()
             if target.gameFSM.state == 'Death':
                 continue
             
             if dist < 0:
                 continue
             
             if not TeamUtils.damageAllowed(target, localAvatar):
                 if not friendlyWeapon:
                     continue
                 
                 if skillId and not friendlySkill:
                     continue
                 
             
             if not self.cr.battleMgr.obeysPirateCode(av, target):
                 if ItemGlobals.getSubtype(av.currentWeaponId) != ItemGlobals.BAYONET:
                     localAvatar.guiMgr.showPirateCode()
                     continue
                 
             
             return (target, dist)
             continue
         continue
     
     return (None, None)
Example #9
0
 def doAttack(self, attacker, skillId, ammoSkillId, targetId, areaIdList, pos, combo = 0, charge = 0):
     attacker.battleRandom.advanceAttackSeed()
     if targetId:
         if WeaponGlobals.getIsShipSkill(skillId):
             target = base.cr.doId2do.get(targetId)
         elif WeaponGlobals.getIsDollAttackSkill(skillId):
             target = base.cr.doId2do.get(targetId)
         else:
             target = base.cr.doId2do.get(targetId)
             if hasattr(target, 'getSkillEffects'):
                 if WeaponGlobals.C_SPAWN in set(target.getSkillEffects()):
                     return WeaponGlobals.RESULT_MISS
                 
             
             if target and not TeamUtils.damageAllowed(localAvatar, target) and not WeaponGlobals.isFriendlyFire(skillId, ammoSkillId):
                 return WeaponGlobals.RESULT_NOT_AVAILABLE
             
     else:
         target = None
     weaponHit = self.willWeaponHit(attacker, target, skillId, ammoSkillId, charge)
     if combo == -1:
         if localAvatar.wantComboTiming:
             return WeaponGlobals.RESULT_MISS
         
     
     if not WeaponGlobals.getNeedTarget(skillId, ammoSkillId):
         return WeaponGlobals.RESULT_HIT
     
     if not target and not areaIdList:
         messenger.send('tooFar')
         return WeaponGlobals.RESULT_MISS
     
     if target and not self.obeysPirateCode(attacker, target):
         if ItemGlobals.getSubtype(localAvatar.currentWeaponId) == ItemGlobals.BAYONET:
             pass
         if not (WeaponGlobals.getAttackClass(skillId) == WeaponGlobals.AC_COMBAT):
             return WeaponGlobals.RESULT_AGAINST_PIRATE_CODE
         
     if target and not self.targetInRange(attacker, target, skillId, ammoSkillId, pos):
         return WeaponGlobals.RESULT_OUT_OF_RANGE
     
     if target and isinstance(target, DistributedBattleNPC.DistributedBattleNPC):
         if target.getGameState()[0] == 'BreakCombat':
             return WeaponGlobals.RESULT_MISS
         
     
     if target:
         skillEffects = target.getSkillEffects()
         if WeaponGlobals.C_SPAWN in skillEffects:
             return WeaponGlobals.RESULT_MISS
         
     
     messenger.send('properHit')
     return weaponHit
Example #10
0
 def stopFollowAim(self):
     self.reticleHolder.detachNode()
     self.reticleHolder.hide()
     taskMgr.remove('aimOverTarget')
     if localAvatar.currentAimOver:
         if TeamUtils.damageAllowed(localAvatar.currentAimOver, localAvatar):
             localAvatar.currentAimOver.hideEnemyTargetInfo()
         else:
             localAvatar.currentAimOver.hideFriendlyTargetInfo()
         localAvatar.currentAimOver.hideHpMeter(delay = 1.0)
     
     localAvatar.currentAimOver = None
 def stopFollowAim(self):
     self.reticleHolder.detachNode()
     self.reticleHolder.hide()
     taskMgr.remove('aimOverTarget')
     if localAvatar.currentAimOver:
         if TeamUtils.damageAllowed(localAvatar.currentAimOver, localAvatar):
             localAvatar.currentAimOver.hideEnemyTargetInfo()
         else:
             localAvatar.currentAimOver.hideFriendlyTargetInfo()
         localAvatar.currentAimOver.hideHpMeter(delay = 1.0)
     
     localAvatar.currentAimOver = None
    def _WeaponBase__avatarHit(self, avId, hitObject, entry, skillId, ammoSkillId):
        av = self.cr.doId2do.get(avId)
        if av and self.localAvatarUsingWeapon:
            codes = []
            pos = entry.getSurfacePoint(av)
            normal = entry.getSurfaceNormal(render)
            timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
            attackerId = 0
            attackerStr = entry.getFromNodePath().getNetTag("attackerId")
            if attackerStr:
                attackerId = int(attackerStr)

            attacker = self.cr.doId2do.get(attackerId)
            if not attacker:
                return None

            if not TeamUtils.damageAllowed(attacker, av):
                if hasattr(attacker, "getName") and hasattr(av, "getName"):
                    pass
                1
                return None

            areaList = self.getAreaList(skillId, ammoSkillId, av, pos, attackerId)
            result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId, avId, areaList, pos)
            self.sendSuggestProjectileSkillResult(
                skillId,
                ammoSkillId,
                result,
                avId,
                areaList,
                [pos[0], pos[1], pos[2]],
                [normal[0], normal[1], normal[2]],
                codes,
                timestamp32,
            )
            for doId in [avId] + areaList:
                target = self.cr.doId2do.get(doId)
                (attackerEffects, targetEffects, itemEffects) = self.cr.battleMgr.getModifiedSkillEffects(
                    attacker, target, skillId, ammoSkillId
                )
                target.projectileWeaponHit(
                    skillId, ammoSkillId, result, targetEffects, pos, normal, codes, attacker, itemEffects
                )
Example #13
0
 def doAttack(self, attacker, skillId, ammoSkillId, targetId, areaIdList, pos, combo=0, charge=0):
     attacker.battleRandom.advanceAttackSeed()
     if targetId:
         if WeaponGlobals.getIsShipSkill(skillId):
             target = base.cr.doId2do.get(targetId)
         elif WeaponGlobals.getIsDollAttackSkill(skillId):
             target = base.cr.doId2do.get(targetId)
         else:
             target = base.cr.doId2do.get(targetId)
             if hasattr(target, 'getSkillEffects'):
                 if WeaponGlobals.C_SPAWN in set(target.getSkillEffects()):
                     return WeaponGlobals.RESULT_MISS
             if target and not TeamUtils.damageAllowed(localAvatar, target) and not WeaponGlobals.isFriendlyFire(skillId, ammoSkillId):
                 return WeaponGlobals.RESULT_NOT_AVAILABLE
     else:
         target = None
     weaponHit = self.willWeaponHit(attacker, target, skillId, ammoSkillId, charge)
     if combo == -1:
         if localAvatar.wantComboTiming:
             return WeaponGlobals.RESULT_MISS
     if not WeaponGlobals.getNeedTarget(skillId, ammoSkillId):
         return WeaponGlobals.RESULT_HIT
     if not target and not areaIdList:
         messenger.send('tooFar')
         return WeaponGlobals.RESULT_MISS
     if target and not self.obeysPirateCode(attacker, target) and not (ItemGlobals.getSubtype(localAvatar.currentWeaponId) == ItemGlobals.BAYONET and WeaponGlobals.getAttackClass(skillId) == WeaponGlobals.AC_COMBAT):
         return WeaponGlobals.RESULT_AGAINST_PIRATE_CODE
     if target and not self.targetInRange(attacker, target, skillId, ammoSkillId, pos):
         return WeaponGlobals.RESULT_OUT_OF_RANGE
     if target and isinstance(target, DistributedBattleNPC.DistributedBattleNPC):
         if target.getGameState()[0] == 'BreakCombat':
             return WeaponGlobals.RESULT_MISS
     if target:
         skillEffects = target.getSkillEffects()
         if WeaponGlobals.C_SPAWN in skillEffects:
             return WeaponGlobals.RESULT_MISS
     messenger.send('properHit')
     return weaponHit
 def getAimHitPos(self, av):
     if not self.aimTrav:
         return None
     
     self.aimTrav.traverse(render)
     numEntries = self.aimQueue.getNumEntries()
     if numEntries == 0:
         return None
     
     self.aimQueue.sortEntries()
     avTeam = av.getTeam()
     for i in range(numEntries):
         entry = self.aimQueue.getEntry(i)
         targetColl = entry.getIntoNodePath()
         if targetColl.node().getIntoCollideMask().hasBitsInCommon(PiratesGlobals.BattleAimOccludeBitmask):
             break
         
         target = self.getObjectFromNodepath(targetColl)
         if target:
             targetTeam = target.getTeam()
             if not TeamUtils.damageAllowed(target, localAvatar):
                 continue
             elif target.gameFSM.state == 'Death':
                 continue
             
             if targetColl.hasNetPythonTag('MonstrousObject'):
                 dist = entry.getSurfacePoint(av)[1]
             else:
                 dist = target.getY(av)
             if dist < 0:
                 continue
             
             pos = entry.getSurfacePoint(target)
             return pos
             continue
         continue
Example #15
0
 def __shippartHit(self, hitObject, entry, skillId, ammoSkillId):
     shipId = hitObject.getNetTag('shipId')
     if shipId:
         shipId = int(shipId)
         ship = base.cr.doId2do.get(shipId)
         if ship:
             if ship.queryGameState() in ('FadeOut', 'Sinking', 'Inactive'):
                 return
         else:
             return
         fromNodePath = entry.getFromNodePath()
         attackerShipId = fromNodePath.getNetTag('shipId')
         if attackerShipId:
             attackerShipId = int(attackerShipId)
             if attackerShipId == shipId:
                 return
         attackerId = 0
         attackerStr = entry.getFromNodePath().getNetTag('attackerId')
         if attackerStr:
             attackerId = int(attackerStr)
             attacker = self.cr.doId2do.get(attackerId)
             if not attacker:
                 return
         else:
             return
         cannonCode = 0
         cannonCodeStr = hitObject.getNetTag('cannonCode')
         if cannonCodeStr:
             cannonCode = int(cannonCodeStr)
         hullCode = 0
         hullCodeStr = hitObject.getNetTag('hullCode')
         if hullCodeStr:
             hullCode = int(hullCodeStr)
         sailCode = 0
         sailCodeStr = hitObject.getNetTag('sailCode')
         if sailCodeStr:
             sailCode = int(sailCodeStr)
         codes = [cannonCode, hullCode, sailCode]
         pos = entry.getSurfacePoint(ship)
         normal = entry.getSurfaceNormal(render)
         timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
         if not TeamUtils.damageAllowed(attacker, ship):
             if TeamUtils.friendOrFoe(attacker,
                                      ship) == PiratesGlobals.PVP_FRIEND:
                 localAvatar.guiMgr.createWarning(
                     PLocalizer.TeamFireWarning, PiratesGuiGlobals.TextFG6)
             else:
                 localAvatar.guiMgr.createWarning(
                     PLocalizer.FriendlyFireWarning,
                     PiratesGuiGlobals.TextFG6)
             return
         areaList = self.getAreaList(skillId, ammoSkillId, ship, pos,
                                     attackerId)
         result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId,
                                             shipId, areaList, pos)
         self.sendSuggestProjectileSkillResult(
             skillId, ammoSkillId, result, shipId, areaList,
             [pos[0], pos[1], pos[2]], [normal[0], normal[1], normal[2]],
             codes, timestamp32)
         effectList = [shipId] + areaList
         propId = hitObject.getNetTag('propId')
         if propId:
             propId = int(propId)
             effectList += [propId]
             prop = self.cr.doId2do.get(propId)
             if prop:
                 result = self.cr.battleMgr.doAttack(
                     attacker, skillId, ammoSkillId, propId, [], pos)
                 self.sendSuggestProjectileSkillResult(
                     skillId, ammoSkillId, result, propId, [],
                     [pos[0], pos[1], pos[2]],
                     [normal[0], normal[1], normal[2]], codes, timestamp32)
         for doId in effectList:
             target = self.cr.doId2do.get(doId)
             if target:
                 attackerEffects, targetEffects, itemEffects = self.cr.battleMgr.getModifiedSkillEffects(
                     attacker, target, skillId, ammoSkillId)
                 target.projectileWeaponHit(skillId, ammoSkillId, result,
                                            targetEffects, pos, normal,
                                            codes, attacker, itemEffects)
    def getAreaList(self,
                    skillId,
                    ammoSkillId,
                    target,
                    pos,
                    attackerId,
                    isBoss=False):
        targets = []
        areaShape = WeaponGlobals.getAttackAreaShape(skillId, ammoSkillId)
        if areaShape == WeaponGlobals.AREA_SPHERE:
            self.runSphereAreaCollisions(skillId, ammoSkillId, target, pos)
        elif areaShape == WeaponGlobals.AREA_TUBE:
            self.runTubeAreaCollisions(skillId, ammoSkillId, target, pos)
        elif areaShape == WeaponGlobals.AREA_CONE:
            self.runConeAreaCollisions(skillId, ammoSkillId, target, pos)
        elif areaShape == WeaponGlobals.AREA_OFF:
            return targets

        numEntries = self.areaCollQueue.getNumEntries()
        if numEntries == 0:
            return targets

        if isBoss and numEntries > WeaponGlobals.BOSS_AREA_TARGETS:
            numEntries = WeaponGlobals.BOSS_AREA_TARGETS
        elif numEntries > WeaponGlobals.MAX_AREA_TARGETS:
            numEntries = WeaponGlobals.MAX_AREA_TARGETS

        avTeam = self.avatar.getTeam()
        for i in range(numEntries):
            entry = self.areaCollQueue.getEntry(i)
            potentialTargetColl = entry.getIntoNodePath()
            if potentialTargetColl in self.avatar.aimTubeNodePaths:
                potentialTarget = self.avatar
            else:
                potentialTarget = self.repository.targetMgr.getObjectFromNodepath(
                    potentialTargetColl)
            if potentialTarget:
                potentialTargetId = potentialTarget.getDoId()
                if potentialTargetId == target.getDoId():
                    continue

                if potentialTargetId in targets:
                    continue

                if not WeaponGlobals.isFriendlyFire(skillId, ammoSkillId):
                    if not TeamUtils.damageAllowed(potentialTarget,
                                                   self.avatar):
                        if attackerId and potentialTargetId == attackerId:
                            if not WeaponGlobals.isAttackAreaSelfDamaging(
                                    skillId, ammoSkillId):
                                continue

                elif attackerId and potentialTargetId == attackerId:
                    if not WeaponGlobals.isAttackAreaSelfDamaging(
                            skillId, ammoSkillId):
                        continue

                if TeamUtils.damageAllowed(potentialTarget, self.avatar):
                    skillEffect = WeaponGlobals.getSkillEffectFlag(skillId)
                    if skillEffect != WeaponGlobals.C_ATTUNE:
                        continue

                if potentialTarget.gameFSM.state == 'Death':
                    continue

                if potentialTarget.gameFSM.state in ('BenchRepair',
                                                     'PotionCrafting',
                                                     'Fishing'):
                    continue

                if not self.repository.battleMgr.obeysPirateCode(
                        self.avatar, potentialTarget):
                    if ItemGlobals.getSubtype(localAvatar.currentWeaponId
                                              ) == ItemGlobals.BAYONET:
                        pass
                    if not (WeaponGlobals.getAttackClass(skillId)
                            == WeaponGlobals.AC_COMBAT):
                        continue

                targets.append(potentialTargetId)
                continue
            continue

        return targets
 def compareTo(self, object, goalOwner = None):
     if self._QuestGoal__goalType == types.DictType:
         goalLevel = self._QuestGoal__goalData.get(self.LEVEL_IDX, 0)
         if goalLevel > 0 and goalLevel > object.getLevel():
             return 1
         
         hasIsShip = hasattr(object, '_isShip')
         if game.process == 'ai' and not hasIsShip:
             return -1
         
         goalLocation = self._QuestGoal__goalData.get(self.LOCATION_IDX, None)
         objectLocation = object.getParentObj()
         if goalLocation and objectLocation and hasattr(objectLocation, 'getUniqueId') and not (goalLocation == LocationConstants.LocationIds.ANY_LOCATION) and not LocationConstants.isInArea(goalLocation, objectLocation.getUniqueId())[0]:
             return 1
         
         if hasIsShip and object._isShip():
             if self.getTargetTypeOnlyOnOcean():
                 goalFaction = self._QuestGoal__goalData.get(self.FACTION_IDX, None)
                 if goalFaction:
                     isEnemy = False
                     if goalOwner:
                         isEnemy = TeamUtils.friendOrFoe(goalOwner, object) == PiratesGlobals.ENEMY
                     
                     objFaction = object.getFaction()
                     if goalFaction != None and objFaction != None or goalFaction.getFaction() != objFaction.getFaction() or not isEnemy:
                         return 1
                     
                 
                 goalHull = self._QuestGoal__goalData.get(self.HULL_IDX, None)
                 if goalHull != None:
                     shipClassList = QuestConstants.getShipList(goalHull)
                     if shipClassList == None:
                         shipClassList = [
                             goalHull]
                     
                     if object.shipClass not in shipClassList:
                         return 1
                     
                 
                 goalFlagship = self._QuestGoal__goalData.get(self.FLAGSHIP_IDX, False)
                 if goalFlagship != object.isFlagship:
                     return 1
                 
                 if object.getTeam() == PiratesGlobals.PLAYER_TEAM:
                     return 1
                 
                 return 0
             
         elif not self.getTargetTypeOnlyOnOcean():
             if self._QuestGoal__goalData.get(self.TYPE_IDX) == AvatarTypes.AnyAvatar and goalOwner:
                 if TeamUtils.friendOrFoe(goalOwner, object) == PiratesGlobals.ENEMY:
                     return 0
                 
             elif object.getAvatarType().isA(self._QuestGoal__goalData.get(self.TYPE_IDX)):
                 return 0
             
         
     elif self._QuestGoal__goalData and object.getUniqueId() in self._QuestGoal__goalData:
         return 0
     
     return 1
Example #18
0
 def getAreaList(self, skillId, ammoSkillId, target, pos, attackerId, isBoss = False):
     targets = []
     areaShape = WeaponGlobals.getAttackAreaShape(skillId, ammoSkillId)
     if areaShape == WeaponGlobals.AREA_SPHERE:
         self.runSphereAreaCollisions(skillId, ammoSkillId, target, pos)
     elif areaShape == WeaponGlobals.AREA_TUBE:
         self.runTubeAreaCollisions(skillId, ammoSkillId, target, pos)
     elif areaShape == WeaponGlobals.AREA_CONE:
         self.runConeAreaCollisions(skillId, ammoSkillId, target, pos)
     elif areaShape == WeaponGlobals.AREA_OFF:
         return targets
     
     numEntries = self.areaCollQueue.getNumEntries()
     if numEntries == 0:
         return targets
     
     if isBoss and numEntries > WeaponGlobals.BOSS_AREA_TARGETS:
         numEntries = WeaponGlobals.BOSS_AREA_TARGETS
     elif numEntries > WeaponGlobals.MAX_AREA_TARGETS:
         numEntries = WeaponGlobals.MAX_AREA_TARGETS
     
     avTeam = self.avatar.getTeam()
     for i in range(numEntries):
         entry = self.areaCollQueue.getEntry(i)
         potentialTargetColl = entry.getIntoNodePath()
         if potentialTargetColl in self.avatar.aimTubeNodePaths:
             potentialTarget = self.avatar
         else:
             potentialTarget = self.repository.targetMgr.getObjectFromNodepath(potentialTargetColl)
         if potentialTarget:
             potentialTargetId = potentialTarget.getDoId()
             if potentialTargetId == target.getDoId():
                 continue
             
             if potentialTargetId in targets:
                 continue
             
             if not WeaponGlobals.isFriendlyFire(skillId, ammoSkillId):
                 if not TeamUtils.damageAllowed(potentialTarget, self.avatar):
                     if attackerId and potentialTargetId == attackerId:
                         if not WeaponGlobals.isAttackAreaSelfDamaging(skillId, ammoSkillId):
                             continue
                         
                     
                 
             elif attackerId and potentialTargetId == attackerId:
                 if not WeaponGlobals.isAttackAreaSelfDamaging(skillId, ammoSkillId):
                     continue
                 
             
             if TeamUtils.damageAllowed(potentialTarget, self.avatar):
                 skillEffect = WeaponGlobals.getSkillEffectFlag(skillId)
                 if skillEffect != WeaponGlobals.C_ATTUNE:
                     continue
                 
             
             if potentialTarget.gameFSM.state == 'Death':
                 continue
             
             if potentialTarget.gameFSM.state in ('BenchRepair', 'PotionCrafting', 'Fishing'):
                 continue
             
             if not self.repository.battleMgr.obeysPirateCode(self.avatar, potentialTarget):
                 if ItemGlobals.getSubtype(localAvatar.currentWeaponId) == ItemGlobals.BAYONET:
                     pass
                 if not (WeaponGlobals.getAttackClass(skillId) == WeaponGlobals.AC_COMBAT):
                     continue
                 
             targets.append(potentialTargetId)
             continue
         continue
     
     return targets
 def aimOverTargetTask(self, task):
     if base.localAvatar.hasStickyTargets():
         if isinstance(base.localAvatar.currentWeapon, Doll.Doll):
             target = base.localAvatar.currentTarget
             if target:
                 pt = self.getNearProjectionPoint(target)
                 (pt, distance) = self.getTargetScreenXY(target)
                 self.reticleHolder.setPos(pt)
                 self.reticle.setScale(self.reticleScale / distance)
             else:
                 self.reticleHolder.setPos(self.RETICLE_POS)
                 self.reticle.setScale(self.reticleScale)
         
         return Task.cont
     
     (target, dist) = self.takeAim(base.localAvatar)
     if target:
         monstrous = target.hasNetPythonTag('MonstrousObject')
     else:
         monstrous = False
     dt = globalClock.getDt()
     dt = min(1.0, 8 * dt)
     if self.wantAimAssist and target and not monstrous:
         pt = self.getNearProjectionPoint(target)
         (pt, distance) = self.getTargetScreenXY(target)
         rPos = self.reticleHolder.getPos()
         if not rPos.almostEqual(pt, 0.001):
             nPos = Vec3(rPos)
             nPos += (pt - rPos) * dt
             self.reticleHolder.setPos(nPos)
         
         rScale = self.reticle.getScale()
         if not rScale.almostEqual(Vec3(self.reticleScale), 0.001):
             nScale = Vec3(rScale)
             f = self.reticleScale / distance
             nScale += (Vec3(f, f, f) - rScale) * dt
             nScale.setX(max(self.reticleScale / 1.25, nScale[0]))
             nScale.setY(max(self.reticleScale / 1.25, nScale[1]))
             nScale.setZ(max(self.reticleScale / 1.25, nScale[2]))
             self.reticle.setScale(nScale)
         
     else:
         rPos = self.reticleHolder.getPos()
         if not rPos.almostEqual(self.RETICLE_POS, 0.001):
             nPos = Vec3(rPos)
             nPos += (self.RETICLE_POS - rPos) * dt
             self.reticleHolder.setPos(nPos)
             self.reticle.setScale(self.reticleScale)
         
     if target:
         if TeamUtils.damageAllowed(target, localAvatar):
             self.reticle.setColorScale(1, 1, 1, self.reticleAlpha)
             if base.localAvatar.currentWeapon:
                 repId = WeaponGlobals.getRepId(base.localAvatar.currentWeaponId)
                 baseRange = self.WeaponBaseRange.get(repId)
                 calcRange = 0
                 specialRange = 0
                 specialMeleeRange = 0
                 ammoSkillId = localAvatar.guiMgr.combatTray.ammoSkillId
                 deadzoneRange = base.cr.battleMgr.getModifiedAttackDeadzone(localAvatar, 0, ammoSkillId)
                 if repId == InventoryType.PistolRep:
                     if localAvatar.guiMgr.combatTray.isCharging:
                         calcRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, InventoryType.PistolTakeAim, ammoSkillId)
                     else:
                         calcRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, InventoryType.PistolShoot, ammoSkillId)
                     if ItemGlobals.getSubtype(localAvatar.currentWeaponId) == ItemGlobals.BLUNDERBUSS:
                         baseRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, EnemySkills.PISTOL_SCATTERSHOT, ammoSkillId)
                         calcRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, EnemySkills.PISTOL_SCATTERSHOT, ammoSkillId)
                     elif ItemGlobals.getSubtype(localAvatar.currentWeaponId) == ItemGlobals.MUSKET:
                         specialRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, EnemySkills.PISTOL_DEADEYE, ammoSkillId)
                     elif ItemGlobals.getSubtype(localAvatar.currentWeaponId) == ItemGlobals.BAYONET:
                         specialMeleeRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, EnemySkills.BAYONET_RUSH, 0)
                     
                 elif repId == InventoryType.DaggerRep:
                     calcRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, InventoryType.DaggerAsp, 0)
                 elif repId == InventoryType.WandRep:
                     if ammoSkillId:
                         calcRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, ammoSkillId, 0)
                     
                     specialRange = base.cr.battleMgr.getModifiedAttackRange(localAvatar, InventoryType.StaffBlast, 0)
                 
                 distance = dist
                 if hasattr(target, 'battleTubeNodePaths') and not monstrous:
                     for tube in target.battleTubeNodePaths:
                         tubeLength = max(target.battleTubeRadius, target.battleTubeHeight)
                         if distance - tubeLength < distance:
                             distance -= tubeLength
                             continue
                     
                 
                 range = max(baseRange, calcRange)
                 secondaryRange = max(baseRange, specialRange)
                 if distance <= secondaryRange and distance >= deadzoneRange:
                     self.reticle.setColorScale(1, 0.69999999999999996, 0, self.reticleAlpha)
                 
                 if distance <= range and distance >= deadzoneRange:
                     self.reticle.setColorScale(1, 0, 0, self.reticleAlpha)
                 
                 if specialMeleeRange and distance <= specialMeleeRange:
                     self.reticle.setColorScale(1, 0.69999999999999996, 0, self.reticleAlpha)
                 
             
         else:
             self.reticle.setColorScale(0, 0, 1, self.reticleAlpha)
     else:
         self.reticle.setColorScale(1, 1, 1, self.reticleAlpha)
     oldTarget = base.localAvatar.currentAimOver
     if target == oldTarget:
         return Task.cont
     
     if oldTarget != None:
         messenger.send(oldTarget.uniqueName('aimOver'), [
             0])
         base.localAvatar.currentAimOver = None
         oldTarget.hideEnemyTargetInfo()
     
     if oldTarget != None and not target:
         oldTarget.hideHpMeter(delay = 8.0)
     
     if target and not target.isInvisibleGhost():
         target.showHpMeter()
         if TeamUtils.damageAllowed(target, localAvatar):
             target.showEnemyTargetInfo()
             messenger.send('pistolAimedTarget')
         else:
             target.showFriendlyTargetInfo()
         messenger.send(target.uniqueName('aimOver'), [
             1])
         base.localAvatar.currentAimOver = target
     else:
         base.localAvatar.currentAimOver = None
     return Task.cont
    def aimOverTargetTask(self, task):
        if base.localAvatar.hasStickyTargets():
            if isinstance(base.localAvatar.currentWeapon, Doll.Doll):
                target = base.localAvatar.currentTarget
                if target:
                    pt = self.getNearProjectionPoint(target)
                    pt, distance = self.getTargetScreenXY(target)
                    self.reticleHolder.setPos(pt)
                    self.reticle.setScale(self.reticleScale / distance)
                else:
                    self.reticleHolder.setPos(self.RETICLE_POS)
                    self.reticle.setScale(self.reticleScale)
            return Task.cont
        target, dist = self.takeAim(base.localAvatar)
        if target:
            monstrous = target.hasNetPythonTag('MonstrousObject')
        else:
            monstrous = False
        dt = globalClock.getDt()
        dt = min(1.0, 8 * dt)
        if self.wantAimAssist:
            if target:
                pt = not monstrous and self.getNearProjectionPoint(target)
                pt, distance = self.getTargetScreenXY(target)
                rPos = self.reticleHolder.getPos()
                if not rPos.almostEqual(pt, 0.001):
                    nPos = Vec3(rPos)
                    nPos += (pt - rPos) * dt
                    self.reticleHolder.setPos(nPos)
                rScale = self.reticle.getScale()
                nScale = rScale.almostEqual(Vec3(self.reticleScale),
                                            0.001) or Vec3(rScale)
                f = self.reticleScale / distance
                nScale += (Vec3(f, f, f) - rScale) * dt
                nScale.setX(max(self.reticleScale / 1.25, nScale[0]))
                nScale.setY(max(self.reticleScale / 1.25, nScale[1]))
                nScale.setZ(max(self.reticleScale / 1.25, nScale[2]))
                self.reticle.setScale(nScale)
        else:
            rPos = self.reticleHolder.getPos()
            if not rPos.almostEqual(self.RETICLE_POS, 0.001):
                nPos = Vec3(rPos)
                nPos += (self.RETICLE_POS - rPos) * dt
                self.reticleHolder.setPos(nPos)
                self.reticle.setScale(self.reticleScale)
        target and TeamUtils.damageAllowed(
            target, localAvatar) and self.reticle.setColorScale(
                1, 1, 1, self.reticleAlpha)
        if base.localAvatar.currentWeapon:
            repId = WeaponGlobals.getRepId(base.localAvatar.currentWeaponId)
            baseRange = self.WeaponBaseRange.get(repId)
            calcRange = 0
            specialRange = 0
            specialMeleeRange = 0
            ammoSkillId = localAvatar.guiMgr.combatTray.ammoSkillId
            deadzoneRange = base.cr.battleMgr.getModifiedAttackDeadzone(
                localAvatar, 0, ammoSkillId)
            if repId == InventoryType.PistolRep:
                if localAvatar.guiMgr.combatTray.isCharging:
                    calcRange = base.cr.battleMgr.getModifiedAttackRange(
                        localAvatar, InventoryType.PistolTakeAim, ammoSkillId)
                else:
                    calcRange = base.cr.battleMgr.getModifiedAttackRange(
                        localAvatar, InventoryType.PistolShoot, ammoSkillId)
                if ItemGlobals.getSubtype(localAvatar.currentWeaponId
                                          ) == ItemGlobals.BLUNDERBUSS:
                    baseRange = base.cr.battleMgr.getModifiedAttackRange(
                        localAvatar, EnemySkills.PISTOL_SCATTERSHOT,
                        ammoSkillId)
                    calcRange = base.cr.battleMgr.getModifiedAttackRange(
                        localAvatar, EnemySkills.PISTOL_SCATTERSHOT,
                        ammoSkillId)
                elif ItemGlobals.getSubtype(
                        localAvatar.currentWeaponId) == ItemGlobals.MUSKET:
                    specialRange = base.cr.battleMgr.getModifiedAttackRange(
                        localAvatar, EnemySkills.PISTOL_DEADEYE, ammoSkillId)
                elif ItemGlobals.getSubtype(
                        localAvatar.currentWeaponId) == ItemGlobals.BAYONET:
                    specialMeleeRange = base.cr.battleMgr.getModifiedAttackRange(
                        localAvatar, EnemySkills.BAYONET_RUSH, 0)
            else:
                if repId == InventoryType.DaggerRep:
                    calcRange = base.cr.battleMgr.getModifiedAttackRange(
                        localAvatar, InventoryType.DaggerAsp, 0)
                else:
                    if repId == InventoryType.WandRep:
                        if ammoSkillId:
                            calcRange = base.cr.battleMgr.getModifiedAttackRange(
                                localAvatar, ammoSkillId, 0)
                        specialRange = base.cr.battleMgr.getModifiedAttackRange(
                            localAvatar, InventoryType.StaffBlast, 0)
            distance = dist
            if hasattr(target, 'battleTubeNodePaths'):
                if not monstrous:
                    for tube in target.battleTubeNodePaths:
                        tubeLength = max(target.battleTubeRadius,
                                         target.battleTubeHeight)
                        if distance - tubeLength < distance:
                            distance -= tubeLength

                range = max(baseRange, calcRange)
                secondaryRange = max(baseRange, specialRange)
                if distance <= secondaryRange:
                    if distance >= deadzoneRange:
                        self.reticle.setColorScale(1, 0.7, 0,
                                                   self.reticleAlpha)
                    if distance <= range:
                        if distance >= deadzoneRange:
                            self.reticle.setColorScale(1, 0, 0,
                                                       self.reticleAlpha)
                        if specialMeleeRange:
                            if distance <= specialMeleeRange:
                                self.reticle.setColorScale(
                                    1, 0.7, 0, self.reticleAlpha)
                    else:
                        self.reticle.setColorScale(0, 0, 1, self.reticleAlpha)
                else:
                    self.reticle.setColorScale(1, 1, 1, self.reticleAlpha)
                oldTarget = base.localAvatar.currentAimOver
                if target == oldTarget:
                    return Task.cont
                if oldTarget != None:
                    messenger.send(oldTarget.uniqueName('aimOver'), [0])
                    base.localAvatar.currentAimOver = None
                    oldTarget.hideEnemyTargetInfo()
                if oldTarget != None and not target:
                    oldTarget.hideHpMeter(delay=8.0)
                target and not target.isInvisibleGhost(
                ) and target.showHpMeter()
                TeamUtils.damageAllowed(
                    target, localAvatar) and target.showEnemyTargetInfo()
                messenger.send('pistolAimedTarget')
            else:
                target.showFriendlyTargetInfo()
            messenger.send(target.uniqueName('aimOver'), [1])
            base.localAvatar.currentAimOver = target
        else:
            base.localAvatar.currentAimOver = None
        return Task.cont
    def simpleShipHit(self, hitObject, entry, skillId, ammoSkillId):
        timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
        ship = hitObject.getNetPythonTag("ship")
        if not ship:
            self.notify.warning("ignoring attack on destroyed ship")
            return None

        attackerShipId = entry.getFromNodePath().getNetTag("shipId")
        hullCode = hitObject.getNetTag("Hull Code")
        if hullCode:
            hullCode = int(hullCode)
        else:
            hullCode = 255
        mastCode = hitObject.getNetTag("Mast Code")
        hitSail = hitObject.getNetTag("Sail")
        if not hitSail:
            hitSail = 0
        else:
            hitSail = 1
        if mastCode:
            mastCode = int(mastCode)
        else:
            mastCode = 255
        pos = entry.getSurfacePoint(ship)
        normal = entry.getSurfaceNormal(render)
        attackerId = 0
        attackerStr = entry.getFromNodePath().getNetTag("attackerId")
        if attackerStr:
            attackerId = int(attackerStr)

        attacker = self.cr.doId2do.get(attackerId)
        if not attacker:
            return None

        if attackerShipId:
            if int(attackerShipId) == ship.doId:
                return None

        if not TeamUtils.damageAllowed(attacker, ship):
            if TeamUtils.friendOrFoe(attacker, ship) == PiratesGlobals.PVP_FRIEND:
                localAvatar.guiMgr.createWarning(PLocalizer.TeamFireWarning, PiratesGuiGlobals.TextFG6)
            else:
                localAvatar.guiMgr.createWarning(PLocalizer.FriendlyFireWarning, PiratesGuiGlobals.TextFG6)
            attacker.battleRandom.advanceAttackSeed()
            return None

        if ship:
            ship.validateMastCode(mastCode)

        result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId, ship.doId, [], pos)
        ammo = entry.getFromNodePath().getNetPythonTag("ammo")
        if ammo:
            if ammo.hasTag("newAmmoId"):
                ammoSkillId = int(ammo.getTag("newAmmoId"))
                pos = (0, 0, 0)

        self.sendSuggestProjectileSkillResult(
            skillId,
            ammoSkillId,
            result,
            ship.doId,
            [],
            [pos[0], pos[1], pos[2]],
            [normal[0], normal[1], normal[2]],
            [hullCode, mastCode, hitSail],
            timestamp32,
        )
        (attackerEffects, targetEffects, itemEffects) = self.cr.battleMgr.getModifiedSkillEffects(
            attacker, ship, skillId, ammoSkillId
        )
        ship.projectileWeaponHit(
            skillId,
            ammoSkillId,
            result,
            targetEffects,
            pos,
            normal,
            (hullCode, mastCode, hitSail),
            attacker,
            itemEffects,
        )
        return True
    def _WeaponBase__shippartHit(self, hitObject, entry, skillId, ammoSkillId):
        shipId = hitObject.getNetTag("shipId")
        if shipId:
            shipId = int(shipId)
            ship = base.cr.doId2do.get(shipId)
            if ship:
                if ship.queryGameState() in ("FadeOut", "Sinking", "Inactive"):
                    return None

            else:
                return None
            fromNodePath = entry.getFromNodePath()
            attackerShipId = fromNodePath.getNetTag("shipId")
            if attackerShipId:
                attackerShipId = int(attackerShipId)
                if attackerShipId == shipId:
                    return None

            attackerId = 0
            attackerStr = entry.getFromNodePath().getNetTag("attackerId")
            if attackerStr:
                attackerId = int(attackerStr)
                attacker = self.cr.doId2do.get(attackerId)
                if not attacker:
                    return None

            else:
                return None
            cannonCode = 0
            cannonCodeStr = hitObject.getNetTag("cannonCode")
            if cannonCodeStr:
                cannonCode = int(cannonCodeStr)

            hullCode = 0
            hullCodeStr = hitObject.getNetTag("hullCode")
            if hullCodeStr:
                hullCode = int(hullCodeStr)

            sailCode = 0
            sailCodeStr = hitObject.getNetTag("sailCode")
            if sailCodeStr:
                sailCode = int(sailCodeStr)

            codes = [cannonCode, hullCode, sailCode]
            pos = entry.getSurfacePoint(ship)
            normal = entry.getSurfaceNormal(render)
            timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
            if not TeamUtils.damageAllowed(attacker, ship):
                if TeamUtils.friendOrFoe(attacker, ship) == PiratesGlobals.PVP_FRIEND:
                    localAvatar.guiMgr.createWarning(PLocalizer.TeamFireWarning, PiratesGuiGlobals.TextFG6)
                else:
                    localAvatar.guiMgr.createWarning(PLocalizer.FriendlyFireWarning, PiratesGuiGlobals.TextFG6)
                return None

            areaList = self.getAreaList(skillId, ammoSkillId, ship, pos, attackerId)
            result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId, shipId, areaList, pos)
            self.sendSuggestProjectileSkillResult(
                skillId,
                ammoSkillId,
                result,
                shipId,
                areaList,
                [pos[0], pos[1], pos[2]],
                [normal[0], normal[1], normal[2]],
                codes,
                timestamp32,
            )
            effectList = [shipId] + areaList
            propId = hitObject.getNetTag("propId")
            if propId:
                propId = int(propId)
                effectList += [propId]
                prop = self.cr.doId2do.get(propId)
                if prop:
                    result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId, propId, [], pos)
                    self.sendSuggestProjectileSkillResult(
                        skillId,
                        ammoSkillId,
                        result,
                        propId,
                        [],
                        [pos[0], pos[1], pos[2]],
                        [normal[0], normal[1], normal[2]],
                        codes,
                        timestamp32,
                    )

            for doId in effectList:
                target = self.cr.doId2do.get(doId)
                if target:
                    (attackerEffects, targetEffects, itemEffects) = self.cr.battleMgr.getModifiedSkillEffects(
                        attacker, target, skillId, ammoSkillId
                    )
                    target.projectileWeaponHit(
                        skillId, ammoSkillId, result, targetEffects, pos, normal, codes, attacker, itemEffects
                    )
                    continue
Example #23
0
 def simpleShipHit(self, hitObject, entry, skillId, ammoSkillId):
     timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
     ship = hitObject.getNetPythonTag('ship')
     if not ship:
         self.notify.warning('ignoring attack on destroyed ship')
         return
     attackerShipId = entry.getFromNodePath().getNetTag('shipId')
     hullCode = hitObject.getNetTag('Hull Code')
     if hullCode:
         hullCode = int(hullCode)
     else:
         hullCode = 255
     mastCode = hitObject.getNetTag('Mast Code')
     hitSail = hitObject.getNetTag('Sail')
     if not hitSail:
         hitSail = 0
     else:
         hitSail = 1
     if mastCode:
         mastCode = int(mastCode)
     else:
         mastCode = 255
     pos = entry.getSurfacePoint(ship)
     normal = entry.getSurfaceNormal(render)
     attackerId = 0
     attackerStr = entry.getFromNodePath().getNetTag('attackerId')
     if attackerStr:
         attackerId = int(attackerStr)
     attacker = self.cr.doId2do.get(attackerId)
     if not attacker:
         return
     if attackerShipId:
         if int(attackerShipId) == ship.doId:
             return
     if not TeamUtils.damageAllowed(attacker, ship):
         if TeamUtils.friendOrFoe(attacker,
                                  ship) == PiratesGlobals.PVP_FRIEND:
             localAvatar.guiMgr.createWarning(PLocalizer.TeamFireWarning,
                                              PiratesGuiGlobals.TextFG6)
         else:
             localAvatar.guiMgr.createWarning(
                 PLocalizer.FriendlyFireWarning, PiratesGuiGlobals.TextFG6)
         attacker.battleRandom.advanceAttackSeed()
         return
     if ship:
         ship.validateMastCode(mastCode)
     result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId,
                                         ship.doId, [], pos)
     ammo = entry.getFromNodePath().getNetPythonTag('ammo')
     if ammo:
         if ammo.hasTag('newAmmoId'):
             ammoSkillId = int(ammo.getTag('newAmmoId'))
             pos = (0, 0, 0)
     self.sendSuggestProjectileSkillResult(
         skillId, ammoSkillId, result, ship.doId, [],
         [pos[0], pos[1], pos[2]], [normal[0], normal[1], normal[2]],
         [hullCode, mastCode, hitSail], timestamp32)
     attackerEffects, targetEffects, itemEffects = self.cr.battleMgr.getModifiedSkillEffects(
         attacker, ship, skillId, ammoSkillId)
     ship.projectileWeaponHit(skillId, ammoSkillId, result, targetEffects,
                              pos, normal, (hullCode, mastCode, hitSail),
                              attacker, itemEffects)
     return True
    def _WeaponBase__propHit(self, shipId, propId, hitObject, entry, skillId, ammoSkillId):
        cannonCode = 0
        cannonCodeStr = hitObject.getNetTag("cannonCode")
        if cannonCodeStr:
            cannonCode = int(cannonCodeStr)

        hullCode = 0
        hullCodeStr = hitObject.getNetTag("hullCode")
        if hullCodeStr:
            hullCode = int(hullCodeStr)

        sailCode = 0
        sailCodeStr = hitObject.getNetTag("sailCode")
        if sailCodeStr:
            sailCode = int(sailCodeStr)

        codes = [cannonCode, hullCode, sailCode]
        ship = self.cr.doId2do.get(shipId)
        prop = self.cr.doId2do.get(propId)
        if not ship or ship.queryGameState() == "Inactive":
            return None

        if not prop:
            return None

        if self.localAvatarUsingWeapon:
            pos = entry.getSurfacePoint(ship)
            normal = entry.getSurfaceNormal(render)
            timestamp32 = globalClockDelta.getFrameNetworkTime(bits=32)
            attackerId = 0
            attackerStr = entry.getFromNodePath().getNetTag("attackerId")
            if attackerStr:
                attackerId = int(attackerStr)

            attacker = self.cr.doId2do.get(attackerId)
            if not attacker:
                return None

            if not TeamUtils.damageAllowed(attacker, prop) and not TeamUtils.damageAllowed(attacker, ship):
                if hasattr(attacker, "getName") and hasattr(prop, "getName"):
                    if TeamUtils.friendOrFoe(attacker, ship) == PiratesGlobals.PVP_FRIEND:
                        localAvatar.guiMgr.createWarning(PLocalizer.TeamFireWarning, PiratesGuiGlobals.TextFG6)
                    else:
                        localAvatar.guiMgr.createWarning(PLocalizer.FriendlyFireWarning, PiratesGuiGlobals.TextFG6)

                attacker.battleRandom.advanceAttackSeed()
                return None

            areaList = self.getAreaList(skillId, ammoSkillId, ship, pos, attackerId)
            result = self.cr.battleMgr.doAttack(attacker, skillId, ammoSkillId, propId, areaList, pos)
            self.sendSuggestProjectileSkillResult(
                skillId,
                ammoSkillId,
                result,
                propId,
                areaList,
                [pos[0], pos[1], pos[2]],
                [normal[0], normal[1], normal[2]],
                codes,
                timestamp32,
            )
            for doId in [propId] + areaList:
                target = self.cr.doId2do.get(doId)
                (attackerEffects, targetEffects, itemEffects) = self.cr.battleMgr.getModifiedSkillEffects(
                    attacker, target, skillId, ammoSkillId
                )
                target.projectileWeaponHit(
                    skillId, ammoSkillId, result, targetEffects, pos, normal, codes, attacker, itemEffects
                )