Пример #1
0
    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)
Пример #2
0
    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()