Example #1
0
    def getPhysBody(self):
        from panda3d.bullet import BulletRigidBodyNode, BulletBoxShape
        from panda3d.core import TransformState

        bnode = BulletRigidBodyNode('entity-phys')
        bnode.setMass(self.mass)

        bnode.setCcdMotionThreshold(1e-7)
        bnode.setCcdSweptSphereRadius(0.5)

        if self.solidType == self.SOLID_MESH:
            convexHull = PhysicsUtils.makeBulletConvexHullFromCollisionSolids(
                self.model.find("**/+CollisionNode").node())
            bnode.addShape(convexHull)
        elif self.solidType == self.SOLID_BBOX:
            mins = Point3()
            maxs = Point3()
            self.calcTightBounds(mins, maxs)
            extents = PhysicsUtils.extentsFromMinMax(mins, maxs)
            tsCenter = TransformState.makePos(
                PhysicsUtils.centerFromMinMax(mins, maxs))
            shape = BulletBoxShape(extents)
            bnode.addShape(shape, tsCenter)

        return bnode
Example #2
0
    def announceGenerate(self):
        DistributedEntity.announceGenerate(self)

        self.addSound("press", "sound/buttons/blip1.wav")
        self.addSound("denied", "sound/buttons/button2.wav")
        self.addSound("access", "sound/buttons/button3.wav")

        PhysicsUtils.makeBulletCollFromPandaColl(self.getModelNP())
        for np in self.getModelNP().findAllMatches("**/trigger_*"):
            btn = KeypadButton(self, np)
            self.buttons.append(btn)

        self.setEffect(LightingOriginEffect.make((0, 0.1, 0)))
    def addAvatar(self, avatar, zoneId=None):
        if zoneId is None:
            if hasattr(avatar, 'getZoneId'):
                zoneId = avatar.getZoneId()
            else:
                zoneId = avatar.zoneId

        if not zoneId in self.avatars:
            self.avatars[zoneId] = []

        self.avatars[zoneId].append(avatar)
        self.numAvatars += 1

        if zoneId in self.battleZones:
            print "Adding avatar to battle zone at {0}".format(zoneId)
            avatar.battleZone = self.battleZones[zoneId]
            avatar.addToPhysicsWorld(avatar.battleZone.physicsWorld)

        if DO_SIMULATION:
            # Setup simulation physics environment for each
            # zone, we will pretend they are battle zones
            if zoneId not in self.zonePhysics:
                print "Making phys world in zone {0}".format(zoneId)
                physicsWorld = BulletWorld()
                # Panda units are in feet, so the gravity is 32 feet per second,
                # not 9.8 meters per second.
                physicsWorld.setGravity(Vec3(0, 0, -32.1740))

                # Add the static collision world (worldspawn faces)
                PhysicsUtils.attachBulletNodes(self.bspLoader.getResult(),
                                               physicsWorld)

                # Add objects that would be dynamic
                # (Avatar capsules, weapon collisions, door collisions, etc)
                dynObjects = 50  #random.randint(15, 50)
                for i in xrange(dynObjects):
                    box = BulletCapsuleShape(0.5, 1.0, ZUp)
                    rbnode = BulletRigidBodyNode("testrb")
                    rbnode.setKinematic(True)
                    rbnode.setDeactivationEnabled(True)
                    rbnode.setDeactivationTime(5.0)
                    rbnode.addShape(box, TransformState.makePos((0, 0, 0)))
                    NodePath(rbnode).setPos(random.uniform(-100, 100),
                                            random.uniform(-100, 100),
                                            random.uniform(-50, 50))
                    physicsWorld.attach(rbnode)

                self.zonePhysics[zoneId] = physicsWorld
Example #4
0
    def setAction(self, action):
        BaseGagAI.setAction(self, action)

        if action == self.StateThrow:
            if not isinstance(self.avatar, BaseNPCAI):
                self.takeAmmo(-1)

            throwVector = PhysicsUtils.getThrowVector(
                self.avatar.getViewOrigin(), self.traceVector,
                self.avatar.getViewOrigin(), self.avatar,
                self.avatar.getBattleZone().getPhysicsWorld())
            endPos = CIGlobals.extrude(self.avatar.getViewOrigin(),
                                       self.ThrowPower,
                                       throwVector) - (0, 0, 90)

            proj = WholeCreamPieProjectileAI(base.air)
            proj.setProjectile(2.5, self.avatar.getViewOrigin(), endPos, 1.07,
                               globalClockDelta.getFrameNetworkTime())
            proj.generateWithRequired(self.avatar.getBattleZone().zoneId)
            proj.addHitCallback(self.onProjectileHit)
            proj.addExclusion(self.avatar)

            self.avatar.emitSound(SOUND_COMBAT,
                                  self.avatar.getViewOrigin(),
                                  duration=0.5)

            self.throwTime = globalClock.getFrameTime()
Example #5
0
    def doJump(self):

        self.emitSound(SOUND_COMBAT, self.getViewOrigin(), volume=3.0)

        for av in self.air.avatars[self.getBattleZone().zoneId]:
            if self.battleZone.getGameRules().canDamage(self, av, None):
                result = False
                if av.doId == ModGlobals.LocalAvatarID:
                    # Check if on ground
                    result = PhysicsUtils.rayTestClosestNotMe(
                        av,
                        av.getPos() + (0, 0, 0.1),
                        av.getPos() - (0, 0, 0.3), CIGlobals.FloorGroup,
                        self.battleZone.physicsWorld)
                else:
                    if av.getActivity()[0] != ACT_JUMP:
                        result = True
                        av.onHitByVPJump()
                if result:
                    # On ground, damage
                    dmgInfo = TakeDamageInfo(self, -1, 10, av.getPos(),
                                             self.getPos())
                    av.takeDamage(dmgInfo)
                    if av.doId == ModGlobals.LocalAvatarID:
                        av.sendUpdateToAvatarId(av.doId, 'doVPJumpCameraShake',
                                                [])
Example #6
0
    def announceGenerate(self):
        DistributedTNT.announceGenerate(self)
        self.stopSmooth()
        self.startPosHprBroadcast()

        pos = base.localAvatar.getPos(render)
        # Make sure to start the TNT out in front of our capsule to prevent weird physics
        extrude = base.localAvatar.getQuat(render).xform(
            Vec3(0, 1.0 + 0.3925,
                 base.localAvatar.getHeight() / 2.0))
        self.setPos(pos + extrude)

        push = ((pos + (0, 0, base.localAvatar.getHeight() / 2.0)) -
                camera.getPos(render)).length()
        self.lookAt(render, PhysicsUtils.getHitPosFromCamera(push=push))
        self.d_clearSmoothing()
        self.d_broadcastPosHpr()

        power = 50.0
        bp = base.localAvatar.backpack
        if bp:
            gag = bp.getGagByID(GagGlobals.gagIdByName[GagGlobals.TNT])
            if gag and gag.powerBar:
                power = gag.powerBar.getPower()
        self.toss(power)
    def handleCameraFloorInteraction(self):
        if self.__onLevelGround or not base.localAvatarReachable() or (
                base.localAvatarReachable()
                and base.localAvatar.battleControls):
            return

        self.putCameraFloorRayOnCamera()

        pointA = render.getRelativePoint(camera.getParent(),
                                         self.floorLineStart)
        pointB = pointA + (Vec3.down() * 1000)
        result = PhysicsUtils.rayTestClosestNotMe(base.localAvatar, pointA,
                                                  pointB, CIGlobals.FloorGroup)
        if not result:
            return

        camObstrCollisionEntry = result
        camHeightFromFloor = (camera.getRelativePoint(
            render, camObstrCollisionEntry.getHitPos())).getZ()
        heightOfFloorUnderCamera = (camera.getPos()[2] -
                                    CIGlobals.FloorOffset) + camHeightFromFloor
        self.cameraZOffset = camera.getPos()[2] + camHeightFromFloor
        if self.cameraZOffset < 0:
            self.cameraZOffset = self.cameraZOffset * 0.33333333329999998
            camHeight = max(base.localAvatar.getHeight(), 3.0)
            if self.cameraZOffset < -(camHeight * 0.5):
                if self.cameraZOffset < -camHeight:
                    self.cameraZOffset = 0.0
                else:
                    self.cameraZOffset = -(camHeight * 0.5)
        if self.__floorDetected == 0:
            self.__floorDetected = 1
            self.popCameraToDest()
Example #8
0
 def load(self):
     DistributedEntity.load(self)
     self.powerUpSound = base.loadSfxOnNode("phase_14/audio/sfx/sewer_generator_windup.ogg", self.cEntity.getModelNp())
     self.powerDownSound = base.loadSfxOnNode("phase_14/audio/sfx/sewer_generator_winddown.ogg", self.cEntity.getModelNp())
     self.runSound = base.loadSfxOnNode("phase_14/audio/sfx/sewer_generator_hum.ogg", self.cEntity.getModelNp())
     self.runSound.setLoop(True)
     base.materialData.update(PhysicsUtils.makeBulletCollFromGeoms(self.cEntity.getModelNp()))
Example #9
0
    def fireLaser(self):
        result = PhysicsUtils.rayTestClosestNotMe(
            self, self.laserVec[0], self.laserVec[1],
            CIGlobals.WorldGroup | CIGlobals.CharacterGroup,
            self.getBattleZone().getPhysicsWorld())
        traceEnd = self.laserVec[1]
        if result:
            traceEnd = result.getHitPos()
            hitNode = NodePath(result.getNode())

            avNP = hitNode.getParent()

            for obj in base.air.avatars[self.getBattleZone().zoneId]:
                if (CIGlobals.isAvatar(obj) and obj.getKey() == avNP.getKey()
                        and self.getBattleZone().getGameRules().canDamage(
                            self, obj, None)):

                    dmgInfo = TakeDamageInfo(self, -1, 10, traceEnd,
                                             self.laserVec[0])

                    obj.takeDamage(dmgInfo)

                    break

        self.getBattleZone().getTempEnts().makeLaser(self.laserVec[0],
                                                     traceEnd,
                                                     Vec4(1, 0, 0, 1), 1.0)
    def __init__(self, baseChannel, stateServerChannel):
        CogInvasionInternalRepository.__init__(
            self,
            baseChannel,
            stateServerChannel, [
                'resources/phase_3/etc/direct.dc',
                'resources/phase_3/etc/toon.dc'
            ],
            dcSuffix='AI')
        self.notify.setInfo(True)
        self.district = None
        self.zoneAllocator = UniqueIdAllocator(ZoneUtil.DynamicZonesBegin,
                                               ZoneUtil.DynamicZonesEnd)
        self.zoneDataStore = AIZoneDataStore()
        self.hoods = {}
        self.dnaStoreMap = {}
        self.dnaDataMap = {}
        self.districtNameMgr = self.generateGlobalObject(
            DO_ID_DISTRICT_NAME_MANAGER, 'DistrictNameManager')
        self.holidayMgr = self.generateGlobalObject(DO_ID_HOLIDAY_MANAGER,
                                                    'HolidayManager')
        self.uin = self.generateGlobalObject(DO_ID_UNIQUE_INTEREST_NOTIFIER,
                                             'UniqueInterestNotifier')
        self.csm = self.generateGlobalObject(DO_ID_CLIENT_SERVICES_MANAGER,
                                             'ClientServicesManager')
        self.statsMgr = self.generateGlobalObject(DO_ID_STATS_MANAGER,
                                                  'StatsManager')

        # Anything that is a DistributedAvatarAI (Toons, Suits, etc).
        # This is a per-zone list of avatars.
        self.avatars = {}
        self.numAvatars = 0

        self.battleZones = {}

        if DO_SIMULATION:
            self.zonePhysics = {}
            self.bspLoader = BSPLoader()
            self.bspLoader.setAi(True)
            self.bspLoader.setMaterialsFile("phase_14/etc/materials.txt")
            #self.bspLoader.setTextureContentsFile("phase_14/etc/texturecontents.txt")
            #self.bspLoader.setServerEntityDispatcher(self)
            self.bspLoader.read(
                "phase_14/etc/sewer_entrance_room_indoors/sewer_entrance_room_indoors.bsp"
            )
            PhysicsUtils.makeBulletCollFromGeoms(self.bspLoader.getResult(),
                                                 enableNow=False)
Example #11
0
    def __updateParticleParent(self):
        if not CIGlobals.isNodePathOk(self.waterStreamParent):
            return

        time = globalClock.getFrameTime()

        streamPos = self.waterStreamParent.getPos(render)
        distance = self.sprayParticleDist

        if self.isLocal():
            camQuat = camera.getQuat(render)
            pFrom = camera.getPos(render)
            push = (streamPos - pFrom).length()
            pFrom += camQuat.xform(Vec3.forward()) * push
            pTo = pFrom + camQuat.xform(
                Vec3.forward()) * (self.sprayParticleDist +
                                   (pFrom - streamPos).length())
            hitPos = Point3(pTo)
            result = base.physicsWorld.rayTestClosest(pFrom, pTo,
                                                      CIGlobals.WorldGroup)
            if result.hasHit():
                node = result.getNode()
                hitPos = result.getHitPos()
                distance = (hitPos - streamPos).length()

            if time - self.lastSprayTime >= self.SprayTraceIval and not self.released:
                if result.hasHit():
                    self.__doSplat(distance, hitPos)
                self.getFPSCam().addViewPunch(
                    Vec3(random.uniform(-0.6, 0.6), random.uniform(0.25, 1.0),
                         0.0))
                self.primaryFirePress(True)
                self.lastSprayTime = time

        else:
            pFrom = self.avatar.getPos(render) + self.avatar.getEyePoint() + (
                1, 0, 0)
            quat = Quat()
            quat.setHpr(
                self.avatar.getHpr(render) + (0, self.avatar.lookPitch, 0))
            pTo = pFrom + quat.xform(
                Vec3.forward()) * (self.sprayParticleDist +
                                   (pFrom - streamPos).length())
            hitPos = Point3(pTo)
            hit = PhysicsUtils.rayTestClosestNotMe(
                self.avatar, pFrom, pTo,
                CIGlobals.WorldGroup | CIGlobals.LocalAvGroup)
            if hit is not None:
                hitPos = hit.getHitPos()
                distance = (hitPos - streamPos).length()

        self.waterStreamParent.lookAt(render, hitPos)

        if self.sprayParticle:
            system = self.sprayParticle.getParticlesNamed('particles-1')
            # Make the particles die off at the hit point.
            lifespan = min(
                1, distance / self.sprayParticleDist) * self.sprayParticleLife
            system.factory.setLifespanBase(lifespan)
    def load(self):
        DistributedEntity.load(self)

        self.axis = base.bspLoader.getEntityValueVector(self.entnum, "axis")
        self.speed = base.bspLoader.getEntityValueFloat(self.entnum, "speed")
        self.timeToFull = base.bspLoader.getEntityValueFloat(self.entnum, "timeToFull")

        base.materialData.update(PhysicsUtils.makeBulletCollFromGeoms(self.cEntity.getModelNp()))
Example #13
0
    def start(self):
        Gag.start(self)

        self.hitSfx.play()

        gag = self.gag
        if self.isLocal():
            vm = self.getViewModel()
            fpsCam = self.getFPSCam()
            fpsCam.setVMAnimTrack(
                Sequence(ActorInterval(vm, "sg_shoot_begin"),
                         ActorInterval(vm, "sg_shoot_end"),
                         Func(vm.loop, "sg_idle")))
            gag = self.getVMGag()

        nozzle = gag.find("**/joint_nozzle")

        if self.isLocal() and base.localAvatar.battleControls:
            if base.localAvatar.isFirstPerson():
                self.getFPSCam().resetViewPunch()
                self.getFPSCam().addViewPunch(
                    Vec3(random.uniform(-0.6, 0.6),
                         random.uniform(-0.25, -0.5), 0.0))
                startPos = camera.getPos(render)
            else:
                startPos = nozzle.getPos(render)
            hitPos = PhysicsUtils.getHitPosFromCamera()
        else:
            startPos = nozzle.getPos(render)
            quat = Quat()
            quat.setHpr(
                self.avatar.getHpr(render) + (0, self.avatar.lookPitch, 0))
            hitPos = quat.xform(Vec3.forward() * 10000)
            hit = PhysicsUtils.rayTestClosestNotMe(
                self.avatar, startPos, hitPos,
                CIGlobals.WorldGroup | CIGlobals.LocalAvGroup)
            if hit is not None:
                hitPos = hit.getHitPos()

        pellet = WaterPellet(self.isLocal())
        pellet.addToWorld(nozzle.getPos(render),
                          lookAt=hitPos,
                          velo=Vec3.forward() * self.pelletSpeed)

        if self.isLocal():
            base.localAvatar.sendUpdate('usedGag', [self.id])
Example #14
0
 def load(self):
     Entity.load(self)
     loader = self.cEntity.getLoader()
     entnum = self.cEntity.getEntnum()
     rbnode = BulletRigidBodyNode('func_physics')
     mass = loader.getEntityValueFloat(entnum, "mass")
     rbnode.setMass(100)
     min = Point3(0)
     max = Point3(0)
     self.cEntity.getModelBounds(min, max)
     center = PhysicsUtils.centerFromMinMax(min, max)
     extents = PhysicsUtils.extentsFromMinMax(min, max)
     shape = BulletBoxShape(extents)
     rbnode.addShape(shape)
     self.assign(base.bspLoader.getResult().find(
         "**/brushroot").attachNewNode(rbnode))
     self.setPos(center)
     self.cEntity.getModelNp().wrtReparentTo(self)
     base.physicsWorld.attachRigidBody(rbnode)
Example #15
0
    def __handleUse(self, task):
        #if self.mode == LocalControls.MThirdPerson:
        #    return task.cont

        time = globalClock.getFrameTime()
        use = inputState.isSet('use')
        if use:
            # see if there is anything for us to use.

            distance = 7.5
            camQuat = base.camera.getQuat(render)
            camFwd = camQuat.xform(Vec3.forward())
            camPos = base.camera.getPos(render)
            if self.mode == self.MFirstPerson:
                start = camPos
            else:
                # Move the line out to their character.
                # This prevents the player from using things that
                # are behind their character, but in front of
                # the camera.
                laPos = base.localAvatar.getPos(render)
                camToPlyr = (camPos.getXy() - laPos.getXy()).length()
                start = camPos + (camFwd * camToPlyr)
            stop = start + (camFwd * distance)
            hit = PhysicsUtils.rayTestClosestNotMe(base.localAvatar, start,
                                                   stop,
                                                   CIGlobals.UseableGroup)

            somethingToUse = False
            if hit is not None:
                node = hit.getNode()
                if node.hasPythonTag("useableObject"):
                    somethingToUse = True
                    obj = node.getPythonTag("useableObject")
                    if obj.canUse():
                        if self.currentObjectUsing != obj:
                            if self.currentObjectUsing is not None:
                                self.currentObjectUsing.stopUse()
                            obj.startUse()
                            self.lastUseObjectTime = time
                        elif time - self.lastUseObjectTime >= obj.useIval:
                            obj.use()
                            self.lastUseObjectTime = time

                        self.currentObjectUsing = obj

            if not somethingToUse and not self.lastUse:
                self.useInvalidSound.play()
        else:
            if self.currentObjectUsing is not None:
                self.currentObjectUsing.stopUse()
                self.currentObjectUsing = None

        self.lastUse = use
        return task.cont
Example #16
0
 def consider(self, node, pos, eyeHeight):
     self.reparentTo(node)
     self.setPos(pos)
     
     result = None
     
     floorLineStart = self.getPos(render) + (0, 0, 0.1)
     floorLineEnd = floorLineStart - (0, 0, 10000)
     floorResult = base.physicsWorld.rayTestClosest(floorLineStart, floorLineEnd, CIGlobals.FloorMask)
     if floorResult.hasHit():
         floorPoint = self.getRelativePoint(render, floorResult.getHitPos())
         if abs(floorPoint[2]) <= 4.0:
             pos += floorPoint
             
             self.setPos(pos)
             
             base.physicsWorld.attach(self.cSphereNodePath.node())
             self.cSphereNodePath.node().setTransformDirty()
             sphereContactResult = base.physicsWorld.contactTest(self.cSphereNodePath.node())
             base.physicsWorld.remove(self.cSphereNodePath.node())
             
             wallEntry = False
             
             for iContact in range(sphereContactResult.getNumContacts()):
                 contact = sphereContactResult.getContact(iContact)
                 node0 = NodePath(contact.getNode0())
                 node1 = NodePath(contact.getNode1())
                 
                 if (node0 == self.cSphereNodePath and
                 not base.localAvatar.isAncestorOf(node1) and
                 not node.isAncestorOf(node1)):
                     
                     if not (node1.getCollideMask() & CIGlobals.WallGroup).isZero():
                         wallEntry = True
                         break
                         
                 elif (node1 == self.cSphereNodePath and
                 not base.localAvatar.isAncestorOf(node0) and
                 not node.isAncestorOf(node0)):
                     
                     if not (node0.getCollideMask() & CIGlobals.WallGroup).isZero():
                         wallEntry = True
                         break
                         
             if not wallEntry:
                 lineStart = render.getRelativePoint(self, (0, 0, eyeHeight))
                 lineEnd = render.getRelativePoint(self, (-pos[0], -pos[1], eyeHeight))
                 lineResult = PhysicsUtils.rayTestClosestNotMe(node, lineStart, lineEnd, CIGlobals.WallGroup)
                 if not lineResult:
                     result = pos
                     
     self.reparentTo(hidden)
     return result
Example #17
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()
    def load(self):
        if self.autoPhysBox:
            min = Point3(0)
            max = Point3(0)
            self.getUseableBounds(min, max)

            min -= Point3(0.1, 0.1, 0.1)
            max += Point3(0.1, 0.1, 0.1)

            center = PhysicsUtils.centerFromMinMax(min, max)
            extents = PhysicsUtils.extentsFromMinMax(min, max)

            shape = BulletBoxShape(extents)
            # Use the box as a trigger and collision geometry.
            if self.hasPhysGeom:
                bodyNode = BulletGhostNode('useableObject')
            else:
                bodyNode = BulletRigidBodyNode('useableObject')
            bodyNode.setKinematic(True)
            bodyNode.addShape(shape, TransformState.makePos(center))

            self.setupPhysics(bodyNode)
        if self.bodyNP:
            self.bodyNP.setPythonTag('useableObject', self)
Example #19
0
    def load(self, physName='useableObject'):
        if self.autoPhysBox:
            min = Point3(0)
            max = Point3(0)
            self.getUseableBounds(min, max)

            min -= Point3(0.1, 0.1, 0.1)
            max += Point3(0.1, 0.1, 0.1)

            extents = PhysicsUtils.extentsFromMinMax(min, max)

            shape = BulletBoxShape(extents)
            # Use the box as a trigger and collision geometry.
            if self.hasPhysGeom:
                bodyNode = BulletGhostNode(physName)
            else:
                bodyNode = BulletRigidBodyNode(physName)
            bodyNode.setKinematic(True)

            if not self.underneathSelf:
                center = PhysicsUtils.centerFromMinMax(min, max)
                bodyNode.addShape(shape, TransformState.makePos(center))
            else:
                bodyNode.addShape(shape)

            self.setupPhysics(bodyNode)
        else:
            for np in self.findAllMatches("**/+BulletRigidBodyNode"):
                if (np.getCollideMask() & CIGlobals.WallGroup) != 0:
                    np.setCollideMask(np.getCollideMask()
                                      | CIGlobals.UseableGroup)
                    self.bodyNP = np
                    self.bodyNode = np.node()

        if self.bodyNP:
            self.bodyNP.setPythonTag('useableObject', self)
Example #20
0
    def doTraceAndDamage(self, origin, dir, dist, traces=1, impact=True):
        # Trace a line from the trace origin outward along the trace direction
        # to find out what we hit, and adjust the direction of the hitscan
        traceEnd = origin + (dir * dist)
        hit = PhysicsUtils.rayTestClosestNotMe(
            self.avatar, origin, traceEnd, self.TraceMask,
            self.avatar.getBattleZone().getPhysicsWorld())
        if hit is not None:
            node = hit.getNode()
            hitPos = hit.getHitPos()
            distance = (hitPos - origin).length()
            self.__handleHitSomething_trace(NodePath(node), hitPos, distance,
                                            origin, traces, impact)
            return node

        return None
 def __updateEyeRay(self):
     fromOrigin = camera.getPos(render)
     toOrigin = fromOrigin + (camera.getQuat(render).getForward() * 100)
     result = PhysicsUtils.rayTestClosestNotMe(self.movementParent, fromOrigin, toOrigin)
     if self.__eyeRayNode and ((not result) or (result.getNode() != self.__eyeRayNode)):
         node = self.__eyeRayNode
         messenger.send('rayexit' + node.getName(), [NodePath(node)])
         self.__eyeRayNode = None
         
     if result:
         if (self.__eyeRayNode != result.getNode()):
             node = result.getNode()
             messenger.send('rayenter' + node.getName(), [NodePath(node)])
             self.__eyeRayNode = node
     else:
         self.__eyeRayNode = None
Example #22
0
    def onSetAction(self, action):
        if action == self.StateThrow:
            self.takeAmmo(-1)

            av = self.getAvatar()

            throwVector = PhysicsUtils.getThrowVector(
                self.traceOrigin, self.traceVector, self.throwOrigin, av,
                av.getBattleZone().getPhysicsWorld()) + (0, 0, 0.1)

            proj = TNTProjectileAI(base.air, self.avatar, self)
            proj.generateWithRequired(self.avatar.getBattleZone().zoneId)
            proj.setPos(self.throwOrigin)
            proj.lookAt(throwVector)
            proj.node().setLinearVelocity(throwVector * self.ThrowPower)
            proj.d_clearSmoothing()
            proj.d_broadcastPosHpr()
Example #23
0
    def addExitWaypoint(self):
        vpos = self.getPos()
        quat = self.getQuat()
        if self.rearOrFront == 0:
            endPos = vpos + quat.xform((0, 11, 0))
        else:
            endPos = vpos + quat.xform((0, -11, 0))

        # Snap to floor
        result = PhysicsUtils.rayTestClosestNotMe(
            self, endPos + (0, 0, 0.5), endPos - (0, 0, 20),
            CIGlobals.WorldGroup,
            self.getBattleZone().getPhysicsWorld())
        if result:
            endPos = result.getHitPos()

        self.motor.setWaypoints([endPos])
        self.motor.setFwdSpeed(5.0)
Example #24
0
    def think(self):
        BaseAttackAI.think(self)

        time = self.ThrowAfterTime
        if not time:
            try:
                time = self.__calculateThrowAfterTime()
            except:
                pass

        if self.action == self.StateThrow:

            if not CIGlobals.isNodePathOk(self.target):
                return

            # Lock onto the target
            self.avatar.headsUp(self.target)

            if self.getActionTime() >= time and not self.didThrow:
                self.calibrate(self.target)
                # Trace a line from the trace origin outward along the trace direction
                # to find out what we hit, and adjust the direction of the projectile launch
                traceEnd = self.traceOrigin + (self.traceVector * 10000)
                hit = PhysicsUtils.rayTestClosestNotMe(
                    self.avatar, self.traceOrigin, traceEnd,
                    CIGlobals.WorldGroup | CIGlobals.CharacterGroup,
                    self.avatar.getBattleZone().getPhysicsWorld())
                if hit is not None:
                    hitPos = hit.getHitPos()
                else:
                    hitPos = traceEnd

                vecThrow = (hitPos - self.throwOrigin).normalized()
                endPos = self.throwOrigin + (vecThrow * self.ThrowPower)

                proj = GenericThrowableLinearProjectileAI(base.air)
                proj.setData(self.ID)
                proj.setLinear(1.5, self.throwOrigin, endPos,
                               globalClockDelta.getFrameNetworkTime())
                proj.generateWithRequired(self.avatar.getBattleZone().zoneId)
                proj.addHitCallback(self.onProjectileHit)
                proj.addExclusion(self.avatar)

                self.didThrow = True
    def updateSmartCamera(self, task):
        if base.localAvatarReachable(
        ) and base.localAvatar.battleControls and base.localAvatar.isFirstPerson(
        ):
            return Task.cont

        if not self.__camCollCanMove and not self.__cameraHasBeenMoved:
            if self.__lastPosWrtRender == camera.getPos(render):
                if self.__lastHprWrtRender == camera.getHpr(render):
                    return Task.cont
        self.__cameraHasBeenMoved = 0
        self.__lastPosWrtRender = camera.getPos(render)
        self.__lastHprWrtRender = camera.getHpr(render)
        self.__idealCameraObstructed = 0

        self.updateSmartCameraCollisionLineSegment()

        if not self.__disableSmartCam:

            pointA = render.getRelativePoint(camera.getParent(), self.pointA)
            pointB = render.getRelativePoint(camera.getParent(), self.pointB)

            mask = CIGlobals.WallGroup | CIGlobals.CameraGroup
            if base.localAvatarReachable():
                if base.localAvatar.battleControls:
                    mask |= (CIGlobals.FloorGroup | CIGlobals.StreetVisGroup)

                result = PhysicsUtils.rayTestClosestNotMe(
                    base.localAvatar, pointA, pointB, mask)
                if result:
                    self.handleCameraObstruction(result)

            if not self.__onLevelGround:
                self.handleCameraFloorInteraction()
        if not self.__idealCameraObstructed:
            self.nudgeCamera()

        return Task.cont
Example #26
0
    def think(self):
        BaseHitscanAI.think(self)

        if self.action == self.StateFire:

            if self.isAIUser():
                if CIGlobals.isNodePathOk(self.target):
                    self.avatar.headsUp(self.target)
                    self.calibrate(self.target)
                else:
                    return

            if (self.gumballsToFire > 0
                    and globalClock.getFrameTime() >= self.nextFireTime):

                throwVector = PhysicsUtils.getThrowVector(
                    self.traceOrigin, self.traceVector, self.fireOrigin,
                    self.avatar,
                    self.avatar.getBattleZone().getPhysicsWorld())

                endPos = CIGlobals.extrude(self.fireOrigin, self.FirePower,
                                           throwVector) - (0, 0, 90)

                if self.isAIUser():
                    endPos = endPos + Point3(random.uniform(-2.5, 2.5),
                                             random.uniform(-2.5, 2.5),
                                             random.uniform(-2.5, 2.5))

                self.takeAmmo(-1)
                self.fireProjectile(endPos)
                self.gumballsToFire = self.gumballsToFire - 1

                if (self.gumballsToFire > 0):
                    self.nextFireTime = globalClock.getFrameTime(
                    ) + random.uniform(self.MIN_BURST_DELAY,
                                       self.MAX_BURST_DELAY)
Example #27
0
    def __updateParticleParent(self, task=None):
        time = globalClock.getFrameTime()

        streamPos = self.waterStreamParent.getPos(render)
        distance = self.sprayParticleDist

        if self.isLocal():
            if base.localAvatar.backpack.getSupply(self.id) <= 0:
                base.localAvatar.b_gagThrow(self.id)
                return task.done

            camQuat = camera.getQuat(render)
            pFrom = camera.getPos(render)
            push = (streamPos - pFrom).length()
            pFrom += camQuat.xform(Vec3.forward()) * push
            pTo = pFrom + camQuat.xform(
                Vec3.forward()) * (self.sprayParticleDist +
                                   (pFrom - streamPos).length())
            hitPos = Point3(pTo)
            result = base.physicsWorld.rayTestClosest(pFrom, pTo,
                                                      CIGlobals.WorldGroup)
            if result.hasHit():
                node = result.getNode()
                hitPos = result.getHitPos()
                distance = (hitPos - streamPos).length()
                if time - self.lastDmgTime >= self.dmgIval:
                    self._handleSprayCollision(NodePath(node), hitPos,
                                               distance)
                    self.lastDmgTime = time

            if time - self.lastSprayTime >= self.dmgIval:
                self.getFPSCam().addViewPunch(
                    Vec3(random.uniform(-0.6, 0.6), random.uniform(0.25, 1.0),
                         0.0))
                base.localAvatar.sendUpdate('usedGag', [self.id])
                self.lastSprayTime = time

        else:
            pFrom = self.avatar.getPos(render) + self.avatar.getEyePoint() + (
                1, 0, 0)
            quat = Quat()
            quat.setHpr(
                self.avatar.getHpr(render) + (0, self.avatar.lookPitch, 0))
            pTo = pFrom + quat.xform(
                Vec3.forward()) * (self.sprayParticleDist +
                                   (pFrom - streamPos).length())
            hitPos = Point3(pTo)
            hit = PhysicsUtils.rayTestClosestNotMe(
                self.avatar, pFrom, pTo,
                CIGlobals.WorldGroup | CIGlobals.LocalAvGroup)
            if hit is not None:
                hitPos = hit.getHitPos()
                distance = (hitPos - streamPos).length()

        self.waterStreamParent.lookAt(render, hitPos)

        if self.sprayParticle:
            system = self.sprayParticle.getParticlesNamed('particles-1')
            # Make the particles die off at the hit point.
            lifespan = min(
                1, distance / self.sprayParticleDist) * self.sprayParticleLife
            system.factory.setLifespanBase(lifespan)

        if task:
            return task.cont
 def disableAndRemovePhysicsNodes(self, rootNode):
     PhysicsUtils.detachAndRemoveBulletNodes(rootNode)
 def removePhysicsNodes(self, rootNode):
     PhysicsUtils.removeBulletNodes(rootNode)
 def createPhysicsNodes(self, rootNode):
     PhysicsUtils.makeBulletCollFromPandaColl(rootNode)