def addGag(self, gagId, curSupply=None, maxSupply=None): if isinstance(gagId, str): gagId = self.avatar.getAttackMgr().getAttackIDByName(gagId) gagName = self.avatar.getAttackMgr().getAttackName(gagId) # Make sure the gag is actually a registered attack and we # don't already have it in our backpack if not self.hasGag(gagId) and gagId in self.avatar.getAttackMgr( ).AttackClasses.keys(): if maxSupply is None: # Sets the max supply if one is not specified. maxSupply = GagGlobals.calculateMaxSupply( self.avatar, gagName, GagGlobals.getGagData(gagName)) # Sets the current supply to the max supply if current supply isn't # specified. if curSupply is None: curSupply = maxSupply gagData = GagGlobals.getGagData(gagName) attackCls = self.avatar.getAttackMgr().getAttackClassByID(gagId) if attackCls: attack = attackCls() attack.setAvatar(self.avatar) attack.setMaxAmmo(maxSupply) attack.setAmmo(curSupply) # ============================================================ # # Horrible hack until we start determining damage # based on the Gag's level. import types baseDamage = GagGlobals.calcBaseDamage( self.avatar, self.avatar.getAttackMgr().getAttackName(gagId), gagData) def getBaseDamage(self): return baseDamage attack.getBaseDamage = types.MethodType(getBaseDamage, attack) damageMaxDistance = float(gagData.get('distance', 10)) def getDamageMaxDistance(self): return damageMaxDistance attack.getDamageMaxDistance = types.MethodType( getDamageMaxDistance, attack) # ============================================================ # attack.load() self.avatar.attacks[gagId] = attack return True return False
def getDefaultMaxSupply(self, gagId): data = GagGlobals.getGagData(gagId) if 'minMaxSupply' in data.keys(): return data.get('minMaxSupply') else: return data.get('maxSupply')
def toonHitByPie(self, avId, gagId): obj = self.air.doId2do.get(avId, None) hp = GagGlobals.getGagData(gagId).get('health', 0) if obj: if obj.getHealth() < obj.getMaxHealth() and not obj.isDead(): if obj.__class__.__name__ == 'DistributedToonAI': obj.toonUp(hp) else: if obj.getHealth() + hp > obj.getMaxHealth(): hp = obj.getMaxHealth() - obj.getHealth() obj.b_setHealth(obj.getHealth() + hp) obj.d_announceHealth(1, hp)
def handleHitByToon(self, player, gagId, distance): if self.isDead(): return gagName = base.cr.attackMgr.getAttackName(gagId) data = dict(GagGlobals.getGagData(gagName)) data['distance'] = distance baseDmg = GagGlobals.calculateDamage(player, gagName, data) hp = self.health - baseDmg self.setHealth(hp) self.announceHealth(0, baseDmg, -1) self.doDamageFade() if self.isDead(): self.doRagdollMode()
def hitByGag(self, gagId, distance): if self.isDead(): return avId = self.air.getAvatarIdFromSender() player = self.air.doId2do.get(avId, None) if not player: return gagName = self.air.attackMgr.getAttackName(gagId) data = dict(GagGlobals.getGagData(gagName)) data['distance'] = distance baseDmg = GagGlobals.calculateDamage(player, gagName, data) hp = self.health - baseDmg self.b_setHealth(hp) self.d_announceHealth(0, baseDmg, -1) if self.isDead(): self.dispatchOutput("OnDie") self.brain.stop() self.d_doRagdollMode()
def takeDamage(self, damageInfo): #, gagId, distance): gagId = damageInfo.attackID distance = damageInfo.damageDistance avId = damageInfo.damager.doId avatar = damageInfo.damager gagName = self.air.attackMgr.getAttackName(gagId) dataRef = GagGlobals.getGagData(gagName) if dataRef: data = dict(dataRef) else: data = {} data['distance'] = distance track = GagGlobals.getTrackOfGag(gagId, getId=True, isAI=True) isPlayer = hasattr(avatar, "trackExperience") if self.canGetHit(): damage = self.__handleTacticalAttacks(avatar.doId, gagName, data, damageInfo, isPlayer) self.setDamageConditions(damage) if isPlayer and self.battleZone: # We only want to award credit when Toons use gags that are less than or at the level of the Cog # they're using them on. gagLevel = GagGlobals.TrackGagNamesByTrackName.get( data.get('track')).index(gagName) if gagLevel <= self.level: self.battleZone.handleGagUse(gagId, avId) if isPlayer and not avId in self.damagers: self.damagers.append(avId) if self.isDead(): self.stopStun() #if self.firstTimeDead: # self.sendUpdate('doStunEffect') deathAnim = self.__getAnimForGag(track, gagName) #self.b_setAnimState(deathAnim, 0) #self.stopAI() # Let's give everyone credit who damaged me. if self.battleZone: for damager in self.damagers: self.battleZone.handleCogDeath(self, damager) self.firstTimeDead = False elif gagName in GagGlobals.Stunnables and not self.stunned: # We have been stunned. self.clearTrack() animName = self.__getAnimForGag(track, gagName) animB4Stun = SuitGlobals.getAnimIdByName(animName) self.sendUpdate('stun', [animB4Stun]) baseStunTime = 6.0 stunTime = (baseStunTime / self.suitPlan.getCogClassAttrs().dmgMod) * ( damage / 95.0) taskMgr.doMethodLater(stunTime, self.__stunTask, self.taskName('stunTask')) self.stunned = True else: # Sound will wake me up. if self.stunned and track == GagType.SOUND: self.stopStun(restart=True) # Do appropriate gag effects. flags = 0 if gagName == GagGlobals.TNT: flags |= GagEffects.GEAsh if flags != 0: self.sendUpdate('doGagEffect', [flags])