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)
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
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
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)
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 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
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 )
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
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
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
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 )