def think(self): elapsed = self.getEntityStateElapsed() state = self.getEntityState() if state == self.StateUp: if self.timeInAir >= 0 and elapsed >= (self.timeInAir + self.startDelay): self.b_setEntityState(self.StateStomp) elif state == self.StateDown: if self.timeOnGround >= 0 and elapsed >= self.timeOnGround: self.b_setEntityState(self.StateRaise) if not self.stomped: self.stomped = True result = self.dispatch.getPhysicsWorld().contactTest( self.floorColl.node()) for contact in result.getContacts(): node = contact.getNode1() if node == self.floorColl.node(): node = contact.getNode0() if node.isOfType(BulletGhostNode.getClassType()): continue avNP = NodePath(node).getParent() for obj in self.air.avatars[self.dispatch.zoneId]: if (CIGlobals.isAvatar(obj) and obj.getKey() == avNP.getKey() and obj not in self.damaged): if self.damage != -1: obj.takeDamage( TakeDamageInfo(self, damageAmount=self.damage, damageType=DMG_FORCE)) else: obj.takeDamage( TakeDamageInfo( self, damageAmount=obj.getHealth(), damageType=DMG_FORCE)) self.damaged.append(obj) break elif state == self.StateStomp: self.startDelay = 0.0 if elapsed >= self.height / self.stompSpeed: self.b_setEntityState(self.StateDown) elif state == self.StateRaise: if elapsed >= self.height / self.raiseSpeed: self.b_setEntityState(self.StateUp)
def doesLineTraceToPlayer(self, plyr): # Do we have a clear LOS to the player? world = self.battleZone.physicsWorld result = PhysicsUtils.rayTestClosestNotMe(self, self.getPos(render) + self.getEyePosition(), plyr.getPos(render) + plyr.getEyePosition(), CIGlobals.WorldGroup | CIGlobals.CharacterGroup, world) # Assume clear LOS if ray hit nothing if not result: return True # Also clear LOS if ray hits the player np = NodePath(result.getNode()).getParent() return np.getKey() == plyr.getKey()