def pause(self):
     ProjectileInterval.pause(self)
     self.__stopPitchTask()
 def pause(self):
     ProjectileInterval.pause(self)
     self.__stopPitchTask()
示例#3
0
class DeliveryGamePie(DirectObject):
    def __init__(self, toon, mg):
        self.mg = mg
        self.toon = toon
        self.splat = Actor(GagGlobals.SPLAT_MDL,
                           {'chan': GagGlobals.SPLAT_CHAN})
        self.splat.setScale(0.5)
        self.splat.setColor(
            VBase4(250.0 / 255.0, 241.0 / 255.0, 24.0 / 255.0, 1.0))
        self.splat.setBillboardPointEye()
        self.gc = WholeCreamPie()
        self.gc.build()
        self.gag = self.gc.getGag()
        self.toon.play('toss', fromFrame=60, toFrame=85)
        self.gag.reparentTo(self.toon.find('**/def_joint_right_hold'))
        throwPath = NodePath('ThrowPath')
        throwPath.reparentTo(self.toon)
        throwPath.setScale(render, 1)
        throwPath.setPos(0, 150, -90)
        throwPath.setHpr(90, -90, 90)
        self.gag.wrtReparentTo(render)
        self.gag.setHpr(throwPath.getHpr(render))
        self.track = ProjectileInterval(
            self.gag,
            startPos=self.toon.find('**/def_joint_right_hold').getPos(render),
            endPos=throwPath.getPos(render),
            gravityMult=0.9,
            duration=3)
        self.track.start()
        taskMgr.doMethodLater(3, self.__handleThrowTrackDone,
                              'handleThrowTrackDoneDGP-' + str(hash(self)))

    def splat(self):
        self.mg.pies.remove(self)
        self.track.pause()
        self.splat.play('chan')
        self.splat.reparentTo(render)
        self.splat.setPos(self.gag.getPos(render))
        self.gag.reparentTo(hidden)
        taskMgr.doMethodLater(0.5, self.delSplat,
                              'Delete Splat' + str(hash(self)))

    def delSplat(self, task):
        self.splat.reparentTo(hidden)
        self.cleanup()

    def __handleThrowTrackDone(self, task):
        self.cleanup()
        return task.done

    def cleanup(self):
        if hasattr(self, 'cleanedUp'):
            return
        self.cleanedUp = 1

        del self.mg
        del self.toon
        self.gc.cleanupGag()
        del self.gc
        self.gag.removeNode()
        del self.gag
        del self.track
        self.splat.cleanup()
        del self.splat
        taskMgr.remove('handleThrowTrackDoneDGP-' + str(hash(self)))
        taskMgr.remove('Delete Splat' + str(hash(self)))

    def __handlePieCollision(self, entry):

        self.splat()
        self.mg.sendUpdate('pieSplat', [self.mg.pies.index(self)])

        intoNP = entry.getIntoNodePath()
        avNP = intoNP.getParent()
        fromNP = entry.getFromNodePath().getParent()

        if fromNP.isEmpty():
            return

        for key in base.cr.doId2do.keys():
            obj = base.cr.doId2do[key]
            if obj.__class__.__name__ == "DistributedDeliveryGameSuit":
                if obj.getKey() == avNP.getKey():
                    self.mg.sendUpdate('hitSuitWithPie', [obj.doId])
示例#4
0
class Snowball(NodePath, DirectObject):
    notify = directNotify.newCategory('Snowball')

    def __init__(self, mg, index):
        self.mg = mg
        self.index = index
        self.model = None
        self.collNP = None
        self.isAirborne = False
        self.owner = None
        self.throwIval = None
        self.impactSound = base.loadSfx('phase_4/audio/sfx/snowball_hit.ogg')
        NodePath.__init__(self, 'snowball')
        return

    def load(self):
        self.model = loader.loadModel('phase_5/models/props/snowball.bam')
        self.model.reparentTo(self)
        base.audio3d.attachSoundToObject(self.impactSound, self)
        sphere = CollisionSphere(0, 0, 0, 0.35)
        sphere.setTangible(0)
        node = CollisionNode('snowball-coll-' + str(id(self)))
        node.addSolid(sphere)
        node.setFromCollideMask(CIGlobals.WallBitmask | CIGlobals.FloorBitmask)
        self.collNP = self.attachNewNode(node)
        self.collNP.setCollideMask(BitMask32(0))
        self.collNP.setZ(0.35)
        event = CollisionHandlerEvent()
        event.set_in_pattern('%fn-into')
        event.set_out_pattern('%fn-out')
        base.cTrav.add_collider(self.collNP, event)

    def setOwner(self, owner):
        self.owner = owner

    def getOwner(self):
        return self.owner

    def hasOwner(self):
        return self.owner is not None

    def b_throw(self):
        p = camera.getP(render)
        self.d_throw(p)
        self.throw(p)

    def d_throw(self, p):
        self.mg.sendUpdate('throw', [self.index, p])

    def throw(self, p):
        self.isAirborne = True
        self.owner.avatar.play('pie', partName='torso', fromFrame=60)
        base.playSfx(self.owner.throwSound, node=self.owner.avatar)
        start = NodePath('StartPath')
        start.reparentTo(self.owner.avatar)
        start.setScale(render, 1)
        start.setPos(0, 0, 0)
        start.setP(p)
        end = NodePath('ThrowPath')
        end.reparentTo(start)
        end.setScale(render, 1)
        end.setPos(0, 160, -90)
        end.setHpr(90, -90, 90)
        self.wrtReparentTo(render)
        self.setScale(1.0)
        self.throwIval = ProjectileInterval(
            self,
            startPos=self.owner.avatar.find('**/def_joint_right_hold').getPos(
                render),
            endPos=end.getPos(render),
            gravityMult=0.9,
            duration=3)
        self.throwIval.start()
        if self.owner.avId == base.localAvatar.doId:
            self.accept('snowball-coll-' + str(id(self)) + '-into',
                        self.__handleSnowballCollision)
        start.removeNode()
        del start
        end.removeNode()
        del end

    def pauseThrowIval(self):
        if self.owner:
            if self.owner.throwSound:
                self.owner.throwSound.stop()
        if self.throwIval:
            self.throwIval.pause()
            self.throwIval = None
        return

    def handleHitWallOrPlayer(self):
        self.pauseThrowIval()
        self.reparentTo(render)
        self.setPos(self.mg.SnowballData[self.index])
        self.setHpr(0, 0, 0)
        self.isAirborne = False
        self.owner = None
        return

    def handleHitGround(self):
        self.pauseThrowIval()
        self.reparentTo(render)
        self.setZ(0.5)
        self.setHpr(0, 0, 0)
        self.isAirborne = False
        self.owner = None
        return

    def __handleSnowballCollision(self, entry):
        intoNP = entry.getIntoNodePath()
        avNP = intoNP.getParent()
        name = intoNP.getName()
        if 'barrier' in name:
            return
        self.ignore('snowball-coll-' + str(id(self)) + '-into')
        self.pauseThrowIval()
        if self.owner.avId == base.localAvatar.doId:
            self.mg.firstPerson.mySnowball = None
            self.mg.firstPerson.hasSnowball = False
        self.isAirborne = False
        self.owner = None
        base.playSfx(self.impactSound, node=self, volume=1.5)
        if 'wall' in name or 'fence' in name:
            self.mg.sendUpdate('snowballHitWall', [self.index])
            self.handleHitWallOrPlayer()
        else:
            if 'floor' in name or 'ground' in name or name == 'team_divider':
                self.mg.sendUpdate('snowballHitGround', [self.index])
                self.handleHitGround()
            else:
                for av in self.mg.remoteAvatars:
                    if av.avatar.getKey() == avNP.getKey():
                        self.handleHitWallOrPlayer()
                        friendly = int(av.team == self.mg.team)
                        if friendly:
                            av.unFreeze()
                        else:
                            av.freeze()
                        self.mg.sendUpdate('snowballHitPlayer',
                                           [av.avId, self.mg.team, self.index])

        return

    def b_pickup(self):
        self.d_pickup(self.mg.cr.localAvId)
        self.pickup(self.mg.getMyRemoteAvatar())

    def d_pickup(self, avId):
        self.mg.sendUpdate('snowballPickup', [self.index, avId])

    def pickup(self, remoteAv):
        self.setPosHpr(0, 0, 0, 0, 0, 0)
        self.reparentTo(remoteAv.avatar.find('**/def_joint_right_hold'))
        self.owner = remoteAv
        self.isAirborne = False

    def removeNode(self):
        self.pauseThrowIval()
        if self.model:
            self.model.removeNode()
            self.model = None
        if self.collNP:
            self.collNP.removeNode()
            self.collNP = None
        self.isAirborne = None
        self.owner = None
        self.mg = None
        NodePath.removeNode(self)
        return
class Snowball(NodePath, DirectObject):
    """Represents a useable snowball in Winter Dodgeball minigame (client)"""

    notify = directNotify.newCategory("Snowball")

    def __init__(self, mg, index):
        # The minigame
        self.mg = mg

        self.index = index

        # The snowball geometry
        self.model = None
        self.collNP = None

        self.shadow = None

        # Has the snowball been thrown and is it currently in the air?
        self.isAirborne = False

        # The RemoteDodgeballAvatar that is currently holding this snowball.
        self.owner = None

        self.throwIval = None

        self.impactSound = base.loadSfx('phase_4/audio/sfx/snowball_hit.ogg')

        NodePath.__init__(self, "snowball")

    def load(self):
        self.model = loader.loadModel("phase_5/models/props/snowball.bam")
        self.model.reparentTo(self)

        self.shadow = CIGlobals.makeDropShadow(0.1)
        self.shadow.reparentTo(self)

        base.audio3d.attachSoundToObject(self.impactSound, self)

        # Setup collisions
        sphere = CollisionSphere(0, 0, 0, 0.35)
        sphere.setTangible(0)
        node = CollisionNode('snowball-coll-' + str(id(self)))
        node.addSolid(sphere)
        node.setFromCollideMask(CIGlobals.WallBitmask | CIGlobals.FloorBitmask)
        self.collNP = self.attachNewNode(node)
        self.collNP.setCollideMask(BitMask32(0))
        #self.collNP.show()
        self.collNP.setZ(0.35)

        event = CollisionHandlerEvent()
        event.set_in_pattern("%fn-into")
        event.set_out_pattern("%fn-out")
        base.cTrav.add_collider(self.collNP, event)

    def setOwner(self, owner):
        """
        Sets the owner of this snowball.
        owner - A DodgeballRemoteAvatar instance
        """
        self.owner = owner

    def getOwner(self):
        return self.owner

    def hasOwner(self):
        """Returns whether or not this snowball has an owner."""
        return self.owner is not None

    def b_throw(self):
        p = camera.getP(render)
        self.d_throw(p)
        self.throw(p)

    def d_throw(self, p):
        self.mg.sendUpdate('throw', [self.index, p])

    def throw(self, p):
        if not self.owner or not CIGlobals.isNodePathOk(self.owner.avatar):
            return

        self.isAirborne = True
        self.owner.avatar.play('pie', partName='torso', fromFrame=62)
        base.playSfx(self.owner.throwSound, node=self.owner.avatar)

        start = NodePath('StartPath')
        start.reparentTo(self.owner.avatar)
        start.setScale(render, 1)
        start.setPos(0, 0, 0)
        start.setP(p)

        end = NodePath('ThrowPath')
        end.reparentTo(start)
        end.setScale(render, 1)
        end.setPos(0, 160, -35)
        end.setHpr(90, -90, 90)

        self.wrtReparentTo(render)
        self.setScale(1.0)

        self.throwIval = ProjectileInterval(
            self,
            startPos=self.owner.avatar.find('**/def_joint_right_hold').getPos(
                render),
            endPos=end.getPos(render),
            gravityMult=0.9,
            duration=2)
        self.throwIval.start()
        if self.owner.avId == base.localAvatar.doId:
            self.accept('snowball-coll-' + str(id(self)) + '-into',
                        self.__handleSnowballCollision)

        start.removeNode()
        del start
        end.removeNode()
        del end

    def pauseThrowIval(self):
        if self.owner:
            if self.owner.throwSound:
                self.owner.throwSound.stop()

        if self.throwIval:
            self.throwIval.pause()
            self.throwIval = None

    def handleHitWallOrPlayer(self):
        self.pauseThrowIval()
        CIGlobals.makeSplat(self.getPos(render), (1, 1, 1, 1), 0.25)
        self.reparentTo(render)
        self.setPos(self.mg.SnowballData[self.index])
        self.setHpr(0, 0, 0)
        self.shadow.show()
        self.isAirborne = False
        self.owner = None

    def handleHitGround(self):
        self.pauseThrowIval()
        self.reparentTo(render)
        self.setZ(0)
        self.setHpr(0, 0, 0)
        self.shadow.show()
        self.isAirborne = False
        self.owner = None

    def resetSnowball(self):
        self.mg.sendUpdate('snowballHitWall', [self.index])
        self.handleHitWallOrPlayer()

    def __handleSnowballCollision(self, entry):
        intoNP = entry.getIntoNodePath()
        avNP = intoNP.getParent()
        name = intoNP.getName()

        if 'barrier' in name:
            # Don't react to hitting a team barrier.
            return
        else:
            self.ignore('snowball-coll-' + str(id(self)) + '-into')

        self.pauseThrowIval()
        if self.owner.avId == base.localAvatar.doId:
            self.mg.firstPerson.mySnowball = None
            self.mg.firstPerson.hasSnowball = False
        self.isAirborne = False
        self.owner = None
        base.playSfx(self.impactSound, node=self, volume=1.5)
        if 'wall' in name or 'fence' in name:
            # We hit a wall. Go back to our center position.
            self.resetSnowball()
        elif 'floor' in name or 'ground' in name or name == 'team_divider':
            # We hit the floor. Stay on the ground.
            self.mg.sendUpdate('snowballHitGround', [self.index])
            self.handleHitGround()
        else:
            for av in self.mg.remoteAvatars:
                if av.avatar.getKey() == avNP.getKey():
                    # We hit this toon!
                    self.handleHitWallOrPlayer()
                    friendly = int(av.team == self.mg.team)
                    if friendly:
                        av.unFreeze()
                    else:
                        av.freeze()
                    self.mg.sendUpdate('snowballHitPlayer',
                                       [av.avId, self.mg.team, self.index])

    def b_pickup(self):
        self.d_pickup(self.mg.cr.localAvId)
        self.pickup(self.mg.getMyRemoteAvatar())

    def d_pickup(self, avId):
        self.mg.sendUpdate('snowballPickup', [self.index, avId])

    def pickup(self, remoteAv):
        self.setPosHpr(0, 0, 0, 0, 0, 0)
        self.reparentTo(remoteAv.avatar.find('**/def_joint_right_hold'))
        self.owner = remoteAv
        self.isAirborne = False
        self.shadow.hide()

    def removeNode(self):
        self.pauseThrowIval()
        if self.model:
            self.model.removeNode()
            self.model = None
        if self.collNP:
            self.collNP.removeNode()
            self.collNP = None
        if self.shadow:
            self.shadow.removeNode()
            self.shadow = None
        self.isAirborne = None
        self.owner = None
        self.mg = None
        NodePath.removeNode(self)