Beispiel #1
0
    def postUpdate(self):
        planet = Point3.zero()
        normal = Vec3(self.playernp.getX() - planet.getX(), self.playernp.getY() - planet.getY(), self.playernp.getZ() - planet.getZ())
        normal.normalize()
        fwd = render.getRelativePoint(self.playernp, Vec3(0, 1, 0))
        self.playernp.headsUp(fwd, normal)

        self.__currentPos = self.playernp.getPos()

        #player movement
        #space physcis
        #speed = self.playernp.node().getLinearVelocity()
        #normal physcis
        speed = Vec3(0, 0, 0)
        omega = 0.0
        v = 5.8
        if inputState.isSet('forward'): speed.setY(v)
        if inputState.isSet('reverse'): speed.setY(-v)
        if inputState.isSet('left'):    speed.setX(-v)
        if inputState.isSet('right'):   speed.setX(v)

        if inputState.isSet('flyUp'):   speed.setZ( 2.0)
        if inputState.isSet('flyDown'):   speed.setZ( -2.0)

        if inputState.isSet('turnLeft'):  omega =  40.0
        if inputState.isSet('turnRight'): omega = -40.0

        self.playernp.setH(self.playernp, omega * globalClock.getDt())

        globalVel = self.playernp.getQuat(render).xform(speed) * globalClock.getDt()

        normalVel = Vec3(globalVel)
        normalVel.normalize()

        if globalVel != Vec3():
            globalVelDir = Vec3(globalVel)
            globalVelDir.normalize()

            fn = Vec3(0.0, 0.0, 0.0)
            fn.normalize()

            velDot = 1.0 - globalVelDir.angleDeg(fn) / 180.0
            if velDot < 0.5:
                self.__currentPos -= Vec3(fn.x * globalVel.x, fn.y * globalVel.y, globalVel.z * globalVel.y) * velDot

            globalVel *= velDot

        self.__currentPos += globalVel

        self.playernp.setPos(self.__currentPos)
Beispiel #2
0
    def __init__(self, distributed_object: Character, host: PastryClient):
        self.host = proxy(host)

        # Save the actual game object to this instance
        self.do = distributed_object
        self.do.avatar = proxy(self)
        print(self.do.destination)
        # TODO: Make this the keyframe beginning
        initial_position = Point3.zero()

        # TODO: Make into a list of keyframes to do waypoints
        # TODO: And this kind of info should live on the DO
        self.start_kf = Keyframe(initial_position, time=now())
        self.end_kf = Keyframe(initial_position, time=now())

        # show where the avatar is headed TODO: Use an arrow or something?
        self._marker = base.loader.loadModel('models/Sinbad')
        self._marker.reparentTo(base.render)
        self._marker.setScale(.05, .05, .05)

        super().__init__()
    def __init__(self, quest, parent = aspect2d, **kw):
        self.quest = quest

        # Let's begin building the quest poster.
        bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui.bam')
        questCard = bookModel.find('**/questCard')
        optiondefs = (('relief', None, None),
         ('image', questCard, None),
         ('image_scale', (0.8, 1.0, 0.58), None),
         ('state', DGG.NORMAL, None))
        self.defineoptions(kw, optiondefs)
        DirectFrame.__init__(self, relief = None)
        self.initialiseoptions(QuestPoster)

        self.questFrame = DirectFrame(parent = self, relief = None)

        # Quest title text
        self.headline = DirectLabel(parent = self.questFrame, relief = None,
            text = self.quest.getName(),
            text_font = CIGlobals.getMinnieFont(),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = 0.05,
            text_align = TextNode.ACenter,
            text_wordwrap = 25.0, textMayChange = 1,
        pos = (0, 0, 0.23))

        # Quest information
        self.questInfo = DirectLabel(parent = self.questFrame, relief = None,
            text = '',
            text_font = CIGlobals.getToonFont(),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = 0.04,
            text_align = TextNode.ACenter,
            text_wordwrap = TEXT_WORDWRAP,
            textMayChange = 1,
        pos = (QuestGlobals.DEFAULT_INFO_POS))
        self.questInfo.hide()

        self.questInfo02 = DirectLabel(parent = self.questFrame, relief = None,
            text = '',
            text_font = CIGlobals.getToonFont(),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = 0.04,
            text_align = TextNode.ACenter,
            text_wordwrap = TEXT_WORDWRAP,
            textMayChange = 1,
        pos = (QuestGlobals.DEFAULT_INFO2_POS))
        self.questInfo02.hide()

        self.locationInfo = DirectLabel(parent = self.questFrame, relief = None,
            text = 'N/A',
            text_font = CIGlobals.getToonFont(),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = TEXT_SCALE,
            text_align = TextNode.ACenter,
            text_wordwrap = TEXT_WORDWRAP,
            textMayChange = 1,
        pos = (0, 0, -0.115))
        self.locationInfo.hide()

        # C'mon Brian this one is obvious
        self.rewardText = DirectLabel(parent = self.questFrame, relief = None,
            text = '',
            text_fg = QuestGlobals.REWARD_RED,
            text_scale = 0.0425,
            text_align = TextNode.ALeft,
            text_wordwrap = 17.0,
            textMayChange = 1,
        pos = (-0.36, 0, -0.26))
        self.rewardText.hide()

        self.lPictureFrame = DirectFrame(parent = self.questFrame, relief = None,
            image = bookModel.find('**/questPictureFrame'),
            image_scale = QuestGlobals.IMAGE_SCALE_SMALL,
            text = '',
            text_pos = (0, -0.11),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = TEXT_SCALE,
            text_align = TextNode.ACenter,
            text_wordwrap = 11.0,
            pos = (QuestGlobals.DEFAULT_LEFT_PICTURE_POS),
        textMayChange = 1)
        self.lPictureFrame.hide()

        self.rPictureFrame = DirectFrame(parent = self.questFrame, relief = None,
            image = bookModel.find('**/questPictureFrame'),
            image_scale = QuestGlobals.IMAGE_SCALE_SMALL,
            text = '', text_pos = (0, -0.11),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = TEXT_SCALE,
            text_align = TextNode.ACenter,
            text_wordwrap = 11.0,
            textMayChange = 1,
        pos = (QuestGlobals.DEFAULT_RIGHT_PICTURE_POS))
        self.rPictureFrame['image_color'] = Vec4(*QuestGlobals.GREEN)
        self.rPictureFrame.hide()

        self.lQuestIcon = DirectFrame(parent = self.lPictureFrame, relief = None,
            text = ' ', text_font = CIGlobals.getSuitFont(),
            text_pos = (0, -0.03),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = 0.13,
            text_align = TextNode.ACenter,
            text_wordwrap = 13.0,
        textMayChange = 1)
        self.lQuestIcon.setColorOff(-1)

        self.rQuestIcon = DirectFrame(parent = self.rPictureFrame, relief = None,
            text = ' ',
            text_font = CIGlobals.getSuitFont(),
            text_pos = (0, -0.03),
            text_fg = QuestGlobals.TEXT_COLOR,
            text_scale = 0.13,
            text_align = TextNode.ACenter,
            text_wordwrap = 13.0,
        textMayChange = 1)
        self.rQuestIcon.setColorOff(-1)

        head = SuitBank.PennyPincher.getHead().generate()
        head.setDepthTest(True)
        head.setDepthWrite(True)
        head.setScale(0.25)
        for part in head.getChildren():
            part.setDepthTest(True)
            part.setDepthWrite(True)
        self.fitGeometry(head, fFlip = 1)
        self.rQuestIcon['geom'] = head
        self.rQuestIcon['geom_scale'] = QuestGlobals.IMAGE_SCALE_SMALL
        self.rQuestIcon['geom_pos'] = Point3(0, 10, -0.05)
        self.rQuestIcon['geom_hpr'] = Point3(180, 0, 0)
        self.rQuestIcon.initialiseoptions(DirectFrame)

        self.auxText = DirectLabel(parent = self.questFrame, relief = None,
            text = 'Recover',
            text_font = CIGlobals.getToonFont(),
            text_scale = QuestGlobals.QPauxText,
            text_fg = QuestGlobals.TEXT_COLOR,
            text_align = TextNode.ACenter,
            pos = (QuestGlobals.DEFAULT_AUX_POS),
        textMayChange=1)
        self.auxText.hide()

        self.middleText = DirectLabel(parent = self.questFrame, relief = None,
            text = 'from:',
            text_font = CIGlobals.getToonFont(),
            text_scale = QuestGlobals.QPauxText,
            text_fg = QuestGlobals.TEXT_COLOR,
            text_align = TextNode.ACenter,
            pos = (QuestGlobals.DEFAULT_MIDDLE_POS),
        textMayChange=1)
        self.middleText.hide()

        self.questProgress = DirectWaitBar(parent = self.questFrame, relief = DGG.SUNKEN,
            frameSize=(-0.95, 0.95, -0.1, 0.12),
            borderWidth = (0.025, 0.025),
            scale = 0.2,
            frameColor = (0.945, 0.875, 0.706, 1.0),
            barColor=(0.5, 0.7, 0.5, 1),
            text='0/0',
            text_font = CIGlobals.getToonFont(),
            text_scale = 0.19,
            text_fg = (0.05, 0.14, 0.4, 1),
            text_align = TextNode.ACenter,
            text_pos = (0, -0.05), #-0.02
        pos = (0, 0, -0.2425))
        self.questProgress.hide()

        rewardFrameGeom = loader.loadModel('phase_4/models/gui/gag_shop_purchase_gui.bam')
        self.rewardFrame = DirectFrame(parent = self.questFrame, relief = None,
            geom = rewardFrameGeom.find('**/Goofys_Sign'),
            geom_scale = (0.615, 0, 0.4),
            pos = (-0.01, 0, -0.25)
        )

        jellybeanJar = QuestGlobals.getFilmIcon()
        self.lRewardFrame = DirectFrame(parent = self.rewardFrame, relief = None,
            geom = jellybeanJar,
            geom_scale = QuestGlobals.TP_ACCESS_SCALE,
            sortOrder = 1,
        pos = (QuestGlobals.LEFT_TP_ACCESS_POS))
        self.lRewardFrame.setBin('gui-popup', 30)

        self.lRewardAmt = DirectFrame(parent = self.questFrame, relief = None,
            geom = rewardFrameGeom.find('**/Char_Pnl'),
            geom_scale = (0.15, 0, 0.1275),
            text = '#1',
            text_font = CIGlobals.getToonFont(),
            text_scale = 0.04,
            text_fg = (0, 0, 0, 1),
            text_align = TextNode.ACenter,
            text_pos = (0, -0.01),
            sortOrder = 2,
        pos = (-0.285, 0, -0.255))
        self.lRewardAmt.setBin('gui-popup', 40)

        self.rRewardFrame = DirectFrame(parent = self.rewardFrame, relief = None,
            geom = QuestGlobals.getJBIcon(),
            geom_scale = QuestGlobals.JB_JAR_SCALE,
        pos = QuestGlobals.RIGHT_JB_JAR_POS)

        self.rRewardAmt = DirectFrame(parent = self.questFrame, relief = None,
            geom = rewardFrameGeom.find('**/Char_Pnl'),
            geom_scale = (0.15, 0, 0.1275),
            text = '25',
            text_font = CIGlobals.getToonFont(),
            text_scale = 0.04,
            text_fg = (0, 0, 0, 1),
            text_align = TextNode.ACenter,
            text_pos = (0, -0.01),
        pos = (0.2725, 0, -0.255))
        self.rRewardAmt.setBin('gui-popup', 40)

        rewardFrameGeom.removeNode()

        # This is the rotated text on the side.
        self.sideInfo = DirectLabel(parent = self.questFrame, relief = None,
            text = QuestGlobals.JUST_FOR_FUN,
            text_fg = (0.0, 0.439, 1.0, 1.0),
            text_shadow = (0, 0, 0, 1),
            pos = (-0.2825, 0, 0.2),
        scale = 0.03)
        self.sideInfo.setR(-30)
        self.sideInfo.hide()

        bookModel.removeNode()
        self.laffMeter = None
        
        self.hide()
        return
def getRightOpenPoint(type):
    return Point3(0, 0, 0)
Beispiel #5
0
 def __init__(self, mass=1, location = Point3.zero(), velocity=Vec3.zero(), acceleration=Vec3.zero()):
     # instance variables
     self.mass = mass
     self.location = location
     self.velocity = velocity
     self.acceleration = acceleration
def getRideElevatorInterval(type = ELEVATOR_NORMAL):
    ival = Sequence(Wait(0.5), LerpPosInterval(camera, 0.5, Point3(0, 14, 3.8), startPos=Point3(0, 14, 4), blendType='easeOut'),
        LerpPosInterval(camera, 0.5, Point3(0, 14, 4), startPos=Point3(0, 14, 3.8)),
        Wait(1.0), LerpPosInterval(camera, 0.5, Point3(0, 14, 4.2), startPos=Point3(0, 14, 4), blendType='easeOut'),
        LerpPosInterval(camera, 1.0, Point3(0, 14, 4), startPos=Point3(0, 14, 4.2)))
    return ival
def getRightClosePoint(type):
    width = ElevatorData[type]['width']
    return Point3(-width, 0, 0)
    def __init__(self):
        ShowBase.__init__(self)

        props = WindowProperties()
        props.setCursorHidden(True)
        props.setMouseMode(WindowProperties.MRelative)
        self.win.requestProperties(props)
        self.disableMouse()

        self.environ = self.loader.loadModel('models/environment')
        self.environ.reparentTo(self.render)
        self.environ.setScale(.25, .25, .25)
        self.environ.setPos(-8, 42, 0)

        self.taskMgr.add(self.move_camera_task, 'move_camera_task')
        self.taskMgr.add(self.move_projectiles_task, 'move_projectiles_task')
        self.taskMgr.add(self.print_fps_task, 'print_fps_task')

        self.key_map = {
            'cam-forward': False,
            'cam-backward': False,
            'cam-left': False,
            'cam-right': False,
        }

        self.accept('w', self.set_key, ['cam-forward', True])
        self.accept('w-up', self.set_key, ['cam-forward', False])

        self.accept('s', self.set_key, ['cam-backward', True])
        self.accept('s-up', self.set_key, ['cam-backward', False])

        self.accept('a', self.set_key, ['cam-left', True])
        self.accept('a-up', self.set_key, ['cam-left', False])

        self.accept('d', self.set_key, ['cam-right', True])
        self.accept('d-up', self.set_key, ['cam-right', False])

        self.accept('escape', sys.exit)

        self.accept('mouse1', self.set_teapot)

        self.panda = Actor('models/panda-model',
                           {'walk': 'models/panda-walk4'})
        self.panda.setScale(.01, .01, .01)
        self.panda.reparentTo(self.render)
        self.panda.loop('walk')

        point_a = Point3(0, -10, 0)
        point_b = Point3(0, 10, 0)
        point_c = Point3(180, 0, 0)
        point_d = Point3(0, 0, 0)

        self.panda_pace = Sequence(self.panda.posInterval(3,
                                                          point_a,
                                                          startPos=point_b),
                                   self.panda.hprInterval(1,
                                                          point_c,
                                                          startHpr=point_d),
                                   self.panda.posInterval(3,
                                                          point_b,
                                                          startPos=point_a),
                                   self.panda.hprInterval(1,
                                                          point_d,
                                                          startHpr=point_c),
                                   name='panda_pace')
        self.panda_pace.loop()

        self.teapot = self.loader.loadModel('teapot')
        self.projectiles = []
        self.fps_time = 0
        self.fps = OnscreenText(text='0',
                                style=1,
                                fg=(1, 1, 1, 1),
                                pos=(1.75, .95),
                                align=TextNode.ARight,
                                scale=.05)
Beispiel #9
0
renderStateFactory = builder.setupRenderStateFactory()
# use the factory to produce a renderState from our node
renderState = renderStateFactory.getRenderState(node)
# and finally submit the renderState to get a shader
shader = builder.getShader(renderState)
node.setShader(shader)

## 5 - A Textured Panda, demo of a more compelex shader generator
# this time using the tex.gen script, read the script for info
shaderManager = shadergenerator.manager.getManager(
    ["shadergenerator/library"], "shadergenerator/graph/tex.gen")
shaderManager.genShaders(getNode(True))

## 6 - A Lit Panda, demo of a more compelex shader generator
# this time using the lit.gen script, read the script for info
shaderManager = shadergenerator.manager.getManager(
    ["shadergenerator/library"], "shadergenerator/graph/lit.gen")

node = getNode(True)
# this script requires a dlight input, so add one:
from panda3d.core import DirectionalLight, Vec4, Point3, AmbientLight
dlight = DirectionalLight('dlight')
dlight.setColor(Vec4(4.9, 0.9, 0.8, 1))
dlnp = render.attachNewNode(dlight)
node.setShaderInput('dlight', dlnp)
dayCycle = dlnp.hprInterval(10.0, Point3(0, 360, 0))
dayCycle.loop()
node.setShaderInput('fogDensity', .0001)
shaderManager.genShaders(node)

run()
Beispiel #10
0
    def __init__(self, entity, mesh=None, center=(0, 0, 0)):
        super().__init__()
        if mesh == None and entity.model:
            print('auto gen mesh colider from entity mesh')
            mesh = entity.model

        self.node_path = entity.attachNewNode(CollisionNode('CollisionNode'))
        self.node_path.setP(90)
        node = self.node_path.node()
        if mesh.triangles:
            for tri in mesh.triangles:
                if len(tri) == 3:
                    shape = CollisionPolygon(
                        Point3(tri[0]) + Point3(center),
                        Point3(tri[1]) + Point3(center),
                        Point3(tri[2]) + Point3(center))
                    node.addSolid(shape)
                elif len(tri) == 4:
                    shape = CollisionPolygon(
                        Point3(tri[0]) + Point3(center),
                        Point3(tri[1]) + Point3(center),
                        Point3(tri[2]) + Point3(center))
                    node.addSolid(shape)
                    shape = CollisionPolygon(
                        Point3(tri[2]) + Point3(center),
                        Point3(tri[3]) + Point3(center),
                        Point3(tri[0]) + Point3(center))
                    node.addSolid(shape)
        else:
            for i in range(0, len(mesh.vertices) - 3, 3):
                node.addSolid(
                    CollisionPolygon(
                        Point3(mesh.vertices[i]) + Point3(center),
                        Point3(mesh.vertices[i + 1]) + Point3(center),
                        Point3(mesh.vertices[i + 2]) + Point3(center)))

        self.visible = False
class DistributedDodgeballGame(DistributedToonFPSGame, TeamMinigame):
    notify = directNotify.newCategory('DistributedDodgeballGame')
    TreeData = [
     [
      'prop_snow_tree_small_ur', Point3(23.23, 66.52, 7.46)],
     [
      'prop_snow_tree_small_ul', Point3(-34.03, 88.02, 24.17)],
     [
      'prop_snow_tree_small_ur', Point3(-54.8, 0, 4.19)],
     [
      'prop_snow_tree_small_ul', Point3(54.8, -5, 4.19)],
     [
      'prop_snow_tree_small_ur', Point3(62.71, 62.66, 16.8)],
     [
      'prop_snow_tree_small_ul', Point3(-23.23, -66.52, 6)],
     [
      'prop_snow_tree_small_ur', Point3(34.03, -88.02, 23)],
     [
      'prop_snow_tree_small_ul', Point3(-62.71, -62.66, 16)]]
    SnowballData = [
     Point3(30, 0, 0.75),
     Point3(22.5, 0, 0.75),
     Point3(15, 0, 0.75),
     Point3(7.5, 0, 0.75),
     Point3(0, 0, 0.75),
     Point3(-7.5, 0, 0.75),
     Point3(-15, 0, 0.75),
     Point3(-22.5, 0, 0.75),
     Point3(-30, 0, 0.75)]
    GameSong = 'phase_4/audio/bgm/MG_Dodgeball.ogg'
    GameDesc = 'Welcome to the north! You have been invited to play dodgeball with the penguins!\n\nHow To Play\nWASD to Move and use the mouse to aim.\nLeft click to Throw!\nThrow a snowball at a teammate to unfreeze them!\n\nObjective\nThe first team to freeze everyone!'
    InitCamTrans = [
     Point3(25, 45, 19.5317), Vec3(154.001, -15, 0)]
    SnowBallDmg = 25
    GetSnowBalls = 'Pick up a snowball from the center!'
    Team2OtherBarrier = {BLUE: 'red_barrier_coll', RED: 'blue_barrier_coll'}

    def __init__(self, cr):
        try:
            self.DistributedDodgeballGame_initialized
            return
        except:
            self.DistributedDodgeballGame_initialized = 1

        DistributedToonFPSGame.__init__(self, cr)
        TeamMinigame.__init__(self, 'BlueSnow', ('phase_4/maps/db_blue_neutral.png',
                                                 'phase_4/maps/db_blue_hover.png',
                                                 'phase_4/maps/db_blue_hover.png'), 'RedIce', ('phase_4/maps/db_red_neutral.png',
                                                                                               'phase_4/maps/db_red_hover.png',
                                                                                               'phase_4/maps/db_red_hover.png'))
        self.fsm.addState(State('chooseTeam', self.enterChooseTeam, self.exitChooseTeam, ['waitForOthers']))
        self.fsm.addState(State('scrollBy', self.enterScrollBy, self.exitScrollBy, ['countdown']))
        self.fsm.addState(State('countdown', self.enterCountdown, self.exitCountdown, ['play']))
        self.fsm.addState(State('announceGameOver', self.enterAnnGameOver, self.exitAnnGameOver, ['displayWinners']))
        self.fsm.addState(State('displayWinners', self.enterDisplayWinners, self.exitDisplayWinners, ['gameOver']))
        self.fsm.getStateNamed('waitForOthers').addTransition('chooseTeam')
        self.fsm.getStateNamed('waitForOthers').addTransition('scrollBy')
        self.fsm.getStateNamed('play').addTransition('announceGameOver')
        self.firstPerson = DodgeballFirstPerson(self)
        self.scrollBySeq = None
        self.infoText = None
        self.redScoreLbl = None
        self.blueScoreLbl = None
        self.infoText = getAlertText()
        self.spawnPointsByTeam = {BLUE: [
                [
                 Point3(5, 15, 0), Vec3(180, 0, 0)],
                [
                 Point3(15, 15, 0), Vec3(180, 0, 0)],
                [
                 Point3(-5, 15, 0), Vec3(180, 0, 0)],
                [
                 Point3(-15, 15, 0), Vec3(180, 0, 0)]], 
           RED: [
               [
                Point3(5, -15, 0), Vec3(0, 0, 0)],
               [
                Point3(15, -15, 0), Vec3(0, 0, 0)],
               [
                Point3(-5, -15, 0), Vec3(0, 0, 0)],
               [
                Point3(-15, -15, 0), Vec3(0, 0, 0)]]}
        self.winnerMusic = base.loadMusic('phase_9/audio/bgm/encntr_hall_of_fame.mid')
        self.loserMusic = base.loadMusic('phase_9/audio/bgm/encntr_sting_announce.mid')
        self.danceSound = base.loadSfx('phase_3.5/audio/sfx/ENC_Win.ogg')
        self.sky = None
        self.arena = None
        self.fog = None
        self.snow = None
        self.snowRender = None
        self.trees = []
        self.snowballs = []
        return

    def getTeamDNAColor(self, team):
        print 'getTeamDNAColor'
        if team == TEAM1:
            print 'blue'
            return ToonDNA.colorName2DNAcolor['blue']
        if team == TEAM2:
            print 'bright red'
            return ToonDNA.colorName2DNAcolor['bright red']

    def enterDisplayWinners(self):
        base.localAvatar.stopLookAround()
        base.localAvatar.resetHeadHpr()
        base.localAvatar.getGeomNode().show()
        camera.reparentTo(render)
        camera.setPos((-2.5, 12, 3.5))
        camera.setHpr((-175.074, -5.47218, 0))
        base.transitions.fadeIn()
        base.playSfx(self.danceSound, looping=1)
        if self.winnerTeam == self.team:
            base.playMusic(self.winnerMusic, volume=0.8)
        else:
            base.playMusic(self.loserMusic, volume=0.8)
        winnerPositions = [(-2, 0, 0), (2, 0, 0), (6, 0, 0), (-6, 0, 0)]
        loserPositions = [(-3.5, -10, 0), (-1.5, -15, 0), (3.0, -8, 0), (5.5, -12, 0)]
        for team in [RED, BLUE]:
            for avId in self.playerListByTeam[team]:
                av = self.cr.doId2do.get(avId)
                if av:
                    av.stopSmooth()
                    av.setHpr(0, 0, 0)
                    if team == self.winnerTeam:
                        posList = winnerPositions
                        av.setAnimState('off')
                        av.stop()
                        if not self.getRemoteAvatar(avId).isFrozen:
                            av.loop('win')
                    else:
                        posList = loserPositions
                        av.setAnimState('off')
                        av.stop()
                        if not self.getRemoteAvatar(avId).isFrozen:
                            av.loop('pout')
                    pos = random.choice(posList)
                    posList.remove(pos)
                    av.setPos(pos)

        if self.winnerTeam == team:
            text = 'YOU WIN!'
        else:
            text = 'YOU LOSE!'
        self.gameOverLbl.setText(text)
        self.track = Sequence(Wait(2.0), Func(self.gameOverLbl.setScale, 0.01), Func(self.gameOverLbl.show), getAlertPulse(self.gameOverLbl, 0.27, 0.25))
        self.track.start()

    def exitDisplayWinners(self):
        base.transitions.noTransitions()
        self.danceSound.stop()
        if hasattr(self, 'track'):
            self.track.finish()
            self.track = None
        self.gameOverLbl.hide()
        return

    def enterAnnGameOver(self, timeRanOut=0):
        self.firstPerson.vModel.hide()
        text = 'GAME\nOVER'
        if timeRanOut:
            text = "TIME's\nUP"
        self.gameOverLbl.setText(text)
        self.gameOverLbl.show()
        base.transitions.fadeScreen()
        taskMgr.doMethodLater(3.0, self.__annGameOverTask, self.uniqueName('annGameOverTask'))

    def __annGameOverTask(self, task):
        self.gameOverLbl.hide()
        self.ival = Sequence(base.transitions.getFadeOutIval(), Func(self.fsm.request, 'displayWinners'))
        self.ival.start()
        return task.done

    def exitAnnGameOver(self):
        taskMgr.remove(self.uniqueName('annGameOverTask'))
        if hasattr(self, 'ival'):
            self.ival.finish()
            del self.ival
        self.gameOverLbl.hide()

    def teamWon(self, team):
        self.winnerTeam = team
        base.localAvatar.disableAvatarControls()
        self.firstPerson.end()
        self.deleteTimer()
        self.fsm.request('announceGameOver')

    def incrementTeamScore(self, team):
        TeamMinigame.incrementTeamScore(self, team)
        if team == BLUE:
            self.blueScoreLbl.setText('BLUE: ' + str(self.scoreByTeam[team]))
            ToontownIntervals.start(ToontownIntervals.getPulseLargerIval(self.blueScoreLbl, 'blueScorePulse'))
        else:
            if team == RED:
                self.redScoreLbl.setText('RED: ' + str(self.scoreByTeam[team]))
                ToontownIntervals.start(ToontownIntervals.getPulseLargerIval(self.redScoreLbl, 'redScorePulse'))

    def getWinterDodgeballScoreText(self, color):
        text = OnscreenText(fg=color, font=CIGlobals.getMinnieFont(), scale=0.15, shadow=(0,
                                                                                          0,
                                                                                          0,
                                                                                          1))
        return text

    def snowballHitWall(self, snowballIndex):
        snowball = self.snowballs[snowballIndex]
        snowball.handleHitWallOrPlayer()
        base.playSfx(snowball.impactSound, node=snowball, volume=1.5)

    def snowballHitGround(self, snowballIndex):
        snowball = self.snowballs[snowballIndex]
        snowball.handleHitGround()
        base.playSfx(snowball.impactSound, node=snowball, volume=1.5)

    def snowballHitPlayer(self, damagedPlayer, throwerTeam, snowballIndex):
        av = self.getRemoteAvatar(damagedPlayer)
        if av:
            if throwerTeam == av.team:
                if av.unFreeze():
                    if damagedPlayer == base.localAvatar.doId:
                        self.showAlert('A team member has unfroze you!')
                        self.firstPerson.camFSM.request('unfrozen')
                        self.sendUpdate('teamMateUnfrozeMe', [self.team])
            elif av.freeze():
                if damagedPlayer == base.localAvatar.doId:
                    self.showAlert("You've been frozen by an enemy!")
                    self.firstPerson.camFSM.request('frozen')
                    self.sendUpdate('enemyFrozeMe', [self.team, throwerTeam])
        snowball = self.snowballs[snowballIndex]
        snowball.handleHitWallOrPlayer()
        base.playSfx(snowball.impactSound, node=snowball, volume=1.5)

    def playerCaughtSnowball(self, snowballIndex, catcherId):
        av = self.getRemoteAvatar(catcherId)
        if av:
            snowball = self.snowballs[snowballIndex]
            snowball.pauseThrowIval()
            snowball.pickup(av)

    def setupRemoteAvatar(self, avId):
        av = RemoteDodgeballAvatar(self, self.cr, avId)
        if avId == self.cr.localAvId:
            self.myRemoteAvatar = av
        self.remoteAvatars.append(av)

    def __getSnowTree(self, path):
        trees = loader.loadModel('phase_8/models/props/snow_trees.bam')
        tree = trees.find('**/' + path)
        tree.find('**/*shadow*').removeNode()
        return tree

    def load(self):
        self.setMinigameMusic(DistributedDodgeballGame.GameSong)
        self.setDescription(DistributedDodgeballGame.GameDesc)
        self.setWinnerPrize(200)
        self.setLoserPrize(0)
        self.createWorld()
        self.blueScoreLbl = self.getWinterDodgeballScoreText(VBase4(0, 0, 1, 1))
        self.blueScoreLbl.reparentTo(base.a2dTopLeft)
        self.blueScoreLbl['align'] = TextNode.ALeft
        self.blueScoreLbl.setText('Blue: 0')
        self.blueScoreLbl.setZ(-0.17)
        self.blueScoreLbl.setX(0.05)
        self.blueScoreLbl.hide()
        self.redScoreLbl = self.getWinterDodgeballScoreText(VBase4(1, 0, 0, 1))
        self.redScoreLbl.reparentTo(base.a2dTopLeft)
        self.redScoreLbl['align'] = TextNode.ALeft
        self.redScoreLbl.setText('Red: 0')
        self.redScoreLbl.setZ(-0.35)
        self.redScoreLbl.setX(0.05)
        self.redScoreLbl.hide()
        trans = DistributedDodgeballGame.InitCamTrans
        camera.setPos(trans[0])
        camera.setHpr(trans[1])
        DistributedToonFPSGame.load(self)

    def createWorld(self):
        self.deleteWorld()
        self.sky = loader.loadModel('phase_3.5/models/props/BR_sky.bam')
        self.sky.reparentTo(render)
        self.sky.setZ(-40)
        self.sky.setFogOff()
        self.arena = loader.loadModel('phase_4/models/minigames/dodgeball_arena.egg')
        self.arena.reparentTo(render)
        self.arena.setScale(0.75)
        self.arena.find('**/team_divider').setBin('ground', 18)
        self.arena.find('**/floor').setBin('ground', 18)
        self.arena.find('**/team_divider_coll').setCollideMask(CIGlobals.FloorBitmask)
        for data in DistributedDodgeballGame.TreeData:
            code = data[0]
            pos = data[1]
            tree = self.__getSnowTree(code)
            tree.reparentTo(self.arena)
            tree.setPos(pos)
            self.trees.append(tree)

        for i in xrange(len(DistributedDodgeballGame.SnowballData)):
            snowdata = DistributedDodgeballGame.SnowballData[i]
            snowball = Snowball(self, i)
            snowball.load()
            snowball.reparentTo(render)
            snowball.setPos(snowdata)
            self.snowballs.append(snowball)

        self.snow = ParticleLoader.loadParticleEffect('phase_8/etc/snowdisk.ptf')
        self.snow.setPos(0, 0, 5)
        self.snowRender = self.arena.attachNewNode('snowRender')
        self.snowRender.setDepthWrite(0)
        self.snowRender.setBin('fixed', 1)
        self.snow.start(camera, self.snowRender)
        self.fog = Fog('snowFog')
        self.fog.setColor(0.486, 0.784, 1)
        self.fog.setExpDensity(0.003)
        render.setFog(self.fog)

    def throw(self, snowballIndex, p):
        snowball = self.snowballs[snowballIndex]
        snowball.throw(p)

    def snowballPickup(self, snowballIndex, pickerUpperAvId):
        remoteAv = self.getRemoteAvatar(pickerUpperAvId)
        if remoteAv:
            snowball = self.snowballs[snowballIndex]
            snowball.pickup(remoteAv)

    def deleteWorld(self):
        if self.redScoreLbl:
            self.redScoreLbl.destroy()
            self.redScoreLbl = None
        if self.blueScoreLbl:
            self.blueScoreLbl.destroy()
            self.blueScoreLbl = None
        for snowball in self.snowballs:
            snowball.removeNode()

        self.snowballs = []
        for tree in self.trees:
            tree.removeNode()

        self.trees = []
        if self.snow:
            self.snow.cleanup()
            self.snow = None
        if self.snowRender:
            self.snowRender.removeNode()
            self.snowRender = None
        self.fog = None
        if self.sky:
            self.sky.removeNode()
            self.sky = None
        if self.arena:
            self.arena.removeNode()
            self.arena = None
        render.clearFog()
        return

    def enterPlay(self):
        self.createTimer()
        self.redScoreLbl.show()
        self.blueScoreLbl.show()
        self.firstPerson.camFSM.request('unfrozen')
        self.arena.find('**/' + self.Team2OtherBarrier[self.team]).stash()

    def exitPlay(self):
        self.firstPerson.crosshair.destroy()
        self.firstPerson.crosshair = None
        self.firstPerson.camFSM.request('off')
        DistributedToonFPSGame.exitPlay(self)
        return

    def enterCountdown(self):
        self.firstPerson.start()
        self.firstPerson.disableMouse()
        self.infoText.setText(DistributedDodgeballGame.GetSnowBalls)
        self.countdownText = getGameText()
        self.countdownIval = Parallel(Sequence(Func(self.countdownText.setText, '5'), getCountdownIval(self.countdownText), Func(self.countdownText.setText, '4'), getCountdownIval(self.countdownText), Func(self.countdownText.setText, '3'), getCountdownIval(self.countdownText), Func(self.countdownText.setText, '2'), getCountdownIval(self.countdownText), Func(self.countdownText.setText, '1'), getCountdownIval(self.countdownText)), getAlertPulse(self.infoText), name='COUNTDOWNIVAL')
        self.countdownIval.setDoneEvent(self.countdownIval.getName())
        self.acceptOnce(self.countdownIval.getDoneEvent(), self.__handleCountdownDone)
        self.countdownIval.start()

    def __handleCountdownDone(self):
        self.fsm.request('play')

    def exitCountdown(self):
        if hasattr(self, 'countdownText'):
            self.countdownText.destroy()
            del self.countdownText
        if hasattr(self, 'countdownIval'):
            self.ignore(self.countdownIval.getDoneEvent())
            self.countdownIval.finish()
            del self.countdownIval

    def enterScrollBy(self):
        BLUE_START_POS = Point3(-20, 0, 4)
        BLUE_END_POS = Point3(20, 0, 4)
        BLUE_HPR = Vec3(0, 0, 0)
        RED_START_POS = Point3(20, 0, 4)
        RED_END_POS = Point3(-20, 0, 4)
        RED_HPR = Vec3(180, 0, 0)
        self.playMinigameMusic()
        self.scrollBySeq = Sequence(Func(camera.setHpr, BLUE_HPR), LerpPosInterval(camera, duration=5.0, pos=BLUE_END_POS, startPos=BLUE_START_POS, blendType='easeOut'), Func(base.transitions.fadeOut, 0.4), Wait(0.5), Func(base.transitions.fadeIn, 0.4), Func(camera.setHpr, RED_HPR), LerpPosInterval(camera, duration=5.0, pos=RED_END_POS, startPos=RED_START_POS, blendType='easeOut'), name='SCROLLBYSEQ')
        self.scrollBySeq.setDoneEvent(self.scrollBySeq.getName())
        self.acceptOnce(self.scrollBySeq.getDoneEvent(), self.__handleScrollByDone)
        self.scrollBySeq.start()

    def __handleScrollByDone(self):
        self.fsm.request('countdown')

    def exitScrollBy(self):
        if self.scrollBySeq:
            self.ignore(self.scrollBySeq.getDoneEvent())
            self.scrollBySeq.finish()
            self.scrollBySeq = None
        return

    def allPlayersReady(self):
        self.fsm.request('scrollBy')

    def chooseUrTeam(self):
        self.fsm.request('chooseTeam')

    def enterChooseTeam(self):
        self.makeSelectionGUI()

    def acceptedIntoTeam(self, spawnPoint):
        TeamMinigame.acceptedIntoTeam(self)
        self.sendUpdate('readyToStart')
        self.fsm.request('waitForOthers')
        pos, hpr = self.spawnPointsByTeam[self.team][spawnPoint]
        base.localAvatar.setPos(pos)
        base.localAvatar.setHpr(hpr)

    def exitChooseTeam(self):
        self.destroySelectionGUI()

    def announceGenerate(self):
        DistributedToonFPSGame.announceGenerate(self)
        base.camLens.setMinFov(CIGlobals.GunGameFOV / (4.0 / 3.0))
        self.load()

    def disable(self):
        base.camLens.setMinFov(CIGlobals.DefaultCameraFov / (4.0 / 3.0))
        self.fsm.requestFinalState()
        self.deleteWorld()
        self.trees = None
        self.snowballs = None
        self.spawnPointsByTeam = None
        if self.firstPerson:
            self.firstPerson.reallyEnd()
            self.firstPerson.cleanup()
            self.firstPerson = None
        self.scrollBySeq = None
        self.winnerMusic = None
        self.loserMusic = None
        self.danceSound = None
        self.infoText = None
        base.localAvatar.setWalkSpeedNormal()
        DistributedToonFPSGame.disable(self)
        return
Beispiel #12
0
    def __init__(self):
        DirectObject.__init__(self)

        self.mouseEnabled = False

        self.lastCamRoot2Quat = Quat(Quat.identQuat())

        self.punchAngleVel = Vec3(0)
        self.punchAngle = Vec3(0)

        self.lastFacing = Vec3(0)

        self.lastMousePos = Point2(0)
        self.currMousePos = Point2(0)

        self.bobTime = 0
        self.lastBobTime = 0

        self.lastVMPos = Point3(0)

        self.camRoot = NodePath("camRoot")
        self.camRoot2 = self.camRoot.attachNewNode("camRoot2")
        self.lastPitch = 0

        self.lastEyeHeight = 0.0

        # Updates to the transform of camRoot
        self.vmRender = NodePath(
            BSPRender('vmRender', BSPLoader.getGlobalPtr()))
        self.vmRender.setShaderAuto()
        self.vmRoot = self.vmRender.attachNewNode('vmRoot')
        self.vmRoot2 = self.vmRoot.attachNewNode(ModelRoot('vmRoot2'))
        self.viewModel = Actor(
            "phase_14/models/char/v_toon_arms.bam",
            {
                "zero": "phase_14/models/char/v_toon_arms.egg",

                # Squirt gun viewmodel animations
                "sg_draw": "phase_14/models/char/v_toon_arms-draw.egg",
                "sg_idle": "phase_14/models/char/v_toon_arms-idle.egg",
                "sg_inspect": "phase_14/models/char/v_toon_arms-inspect.egg",
                "sg_shoot_begin":
                "phase_14/models/char/v_toon_arms-shoot_begin.egg",
                "sg_shoot_loop":
                "phase_14/models/char/v_toon_arms-shoot_loop.egg",
                "sg_shoot_end":
                "phase_14/models/char/v_toon_arms-shoot_end.egg",
                "pie_draw": "phase_14/models/char/v_toon_arms-pie_draw.egg",
                "pie_idle": "phase_14/models/char/v_toon_arms-pie_idle.egg",
                "button_draw":
                "phase_14/models/char/v_toon_arms-button_draw.egg",
                "button_idle":
                "phase_14/models/char/v_toon_arms-button_idle.egg",
                "button_press":
                "phase_14/models/char/v_toon_arms-button_press.egg",
                "gumball_draw":
                "phase_14/models/char/v_toon_arms-gumball_draw.egg",
                "gumball_idle":
                "phase_14/models/char/v_toon_arms-gumball_idle.egg",
                "gumball_fire":
                "phase_14/models/char/v_toon_arms-gumball_fire.egg",
                "hose_draw": "phase_14/models/char/v_toon_arms-hose_draw.egg",
                "hose_idle": "phase_14/models/char/v_toon_arms-hose_idle.egg",
                "hose_shoot_begin":
                "phase_14/models/char/v_toon_arms-hose_shoot_begin.egg",
                "hose_shoot_loop":
                "phase_14/models/char/v_toon_arms-hose_shoot_loop.egg",
                "hose_shoot_end":
                "phase_14/models/char/v_toon_arms-hose_shoot_end.egg",
                "tnt_draw": "phase_14/models/char/v_toon_arms-tnt_draw.egg",
                "tnt_idle": "phase_14/models/char/v_toon_arms-tnt_idle.egg",
                "tnt_throw": "phase_14/models/char/v_toon_arms-tnt_throw.egg",
                "slap_idle": "phase_14/models/char/v_toon_arms-slap_idle.egg",
                "slap_hit": "phase_14/models/char/v_toon_arms-slap_hit.egg",
                "sound": "phase_14/models/char/v_toon_arms-sound.egg"
            })
        self.viewModel.setBlend(
            frameBlend=base.config.GetBool("interpolate-frames", False))
        self.viewModel.reparentTo(self.vmRoot2)
        self.viewModel.find("**/hands").setTwoSided(True)
        self.viewModel.hide()

        self.defaultViewModel = self.viewModel
        self.idealFov = self.ViewModelFOV

        precacheActor(self.viewModel)
        #self.viewModel.clearMaterial()
        #self.viewModel.setMaterial(CIGlobals.getCharacterMaterial(specular = (0, 0, 0, 1)), 1)
        self.viewportLens = PerspectiveLens()
        self.viewportLens.setMinFov(self.ViewModelFOV / (4. / 3.))
        self.viewportLens.setNear(0.3)
        # Updates to the transform of base.camera
        self.viewportCam = base.makeCamera(base.win,
                                           clearDepth=True,
                                           camName='fpsViewport',
                                           mask=CIGlobals.ViewModelCamMask,
                                           lens=self.viewportLens)
        # Pretend to be the main camera so the viewmodel gets ambient probes updated
        self.viewportCam.node().setTag("__mainpass__", "1")
        self.viewportCam.reparentTo(self.vmRoot)

        self.vmGag = None
        self.vmAnimTrack = None
        self.dmgFade = OnscreenImage(image="phase_14/maps/damage_effect.png",
                                     parent=render2d)
        self.dmgFade.setBin('gui-popup', 100)
        self.dmgFade.setTransparency(1)
        self.dmgFade.setColorScale(1, 1, 1, 0)
        self.dmgFadeIval = None

        #self.accept('v', self.vmRender.ls)

        #base.bspLoader.addDynamicNode(self.vmRoot)

        if self.PrintAnimLengths:
            print "v_toon_arms animation lengths:"
            for anim in self.viewModel.getAnimNames():
                print "\t{0}\t:\t{1}".format(anim,
                                             self.viewModel.getDuration(anim))

        taskMgr.add(self.__vpDebugTask, "vpdebutask", sort=-100)
Beispiel #13
0
    def __updateTask(self, task):
        # TODO -- This function does a lot of math, I measured it to take .5 ms on my laptop
        #         That's a lot of time for something miniscule like sway and bob.

        dt = globalClock.getDt()
        time = globalClock.getFrameTime()

        if base.localAvatar.isFirstPerson():
            eyePoint = base.localAvatar.getEyePoint()
            if base.localAvatar.walkControls.crouching:
                eyePoint[2] = eyePoint[2] / 2.0
            eyePoint[2] = CIGlobals.lerpWithRatio(eyePoint[2],
                                                  self.lastEyeHeight, 0.4)
            self.lastEyeHeight = eyePoint[2]

        camRootAngles = Vec3(0)

        # Mouse look around
        mw = base.mouseWatcherNode
        if mw.hasMouse():
            md = base.win.getPointer(0)
            center = Point2(base.win.getXSize() / 2, base.win.getYSize() / 2)

            xDist = md.getX() - center.getX()
            yDist = md.getY() - center.getY()

            sens = self.__getMouseSensitivity()

            angular = -(xDist * sens) / dt
            base.localAvatar.walkControls.controller.setAngularMovement(
                angular)
            camRootAngles.setY(self.lastPitch - yDist * sens)

            if camRootAngles.getY() > FPSCamera.MaxP:
                camRootAngles.setY(FPSCamera.MaxP)
                yDist = 0
            elif camRootAngles.getY() < FPSCamera.MinP:
                yDist = 0
                camRootAngles.setY(FPSCamera.MinP)

            base.win.movePointer(0, int(center.getX()), int(center.getY()))

        if base.localAvatar.isFirstPerson():
            # Camera / viewmodel bobbing
            vmBob = Point3(0)
            vmAngles = Vec3(0)
            vmRaise = Point3(0)
            camBob = Point3(0)

            maxSpeed = base.localAvatar.walkControls.BattleRunSpeed * 16.0

            speed = base.localAvatar.walkControls.speeds.length() * 16.0
            speed = max(-maxSpeed, min(maxSpeed, speed))

            bobOffset = CIGlobals.remapVal(speed, 0, maxSpeed, 0.0, 1.0)

            self.bobTime += (time - self.lastBobTime) * bobOffset
            self.lastBobTime = time

            # Calculate the vertical bob
            cycle = self.bobTime - int(
                self.bobTime / self.BobCycleMax) * self.BobCycleMax
            cycle /= self.BobCycleMax
            if cycle < self.BobUp:
                cycle = math.pi * cycle / self.BobUp
            else:
                cycle = math.pi + math.pi * (cycle - self.BobUp) / (1.0 -
                                                                    self.BobUp)

            verticalBob = speed * 0.005
            verticalBob = verticalBob * 0.3 + verticalBob * 0.7 * math.sin(
                cycle)
            verticalBob = max(-7.0, min(4.0, verticalBob))
            verticalBob /= 16.0

            # Calculate the lateral bob
            cycle = self.bobTime - int(
                self.bobTime / self.BobCycleMax * 2) * self.BobCycleMax * 2
            cycle /= self.BobCycleMax * 2
            if cycle < self.BobUp:
                cycle = math.pi * cycle / self.BobUp
            else:
                cycle = math.pi + math.pi * (cycle - self.BobUp) / (1.0 -
                                                                    self.BobUp)

            lateralBob = speed * 0.005
            lateralBob = lateralBob * 0.3 + lateralBob * 0.7 * math.sin(cycle)
            lateralBob = max(-7.0, min(4.0, lateralBob))
            lateralBob /= 16.0

            # Apply bob, but scaled down a bit
            vmBob.set(lateralBob * 0.8, 0, verticalBob * 0.1)
            # Z bob a bit more
            vmBob[2] += verticalBob * 0.1
            # Bob the angles
            vmAngles[2] += verticalBob * 0.5
            vmAngles[1] -= verticalBob * 0.4
            vmAngles[0] -= lateralBob * 0.3

            # ================================================================
            # Viewmodel lag/sway

            angles = self.camRoot.getHpr(render)
            quat = Quat()
            quat.setHpr(angles)
            invQuat = Quat()
            invQuat.invertFrom(quat)

            maxVMLag = 1.5
            lagforward = quat.getForward()
            if dt != 0.0:
                lagdifference = lagforward - self.lastFacing
                lagspeed = 5.0
                lagdiff = lagdifference.length()
                if (lagdiff > maxVMLag) and (maxVMLag > 0.0):
                    lagscale = lagdiff / maxVMLag
                    lagspeed *= lagscale

                self.lastFacing = CIGlobals.extrude(self.lastFacing,
                                                    lagspeed * dt,
                                                    lagdifference)
                self.lastFacing.normalize()
                lfLocal = invQuat.xform(lagdifference)
                vmBob = CIGlobals.extrude(vmBob, 5.0 / 16.0, lfLocal * -1.0)

            pitch = angles[1]
            if pitch > 180:
                pitch -= 360
            elif pitch < -180:
                pitch += 360

            vmBob = CIGlobals.extrude(vmBob, pitch * (0.035 / 16),
                                      Vec3.forward())
            vmBob = CIGlobals.extrude(vmBob, pitch * (0.03 / 16), Vec3.right())
            vmBob = CIGlobals.extrude(vmBob, pitch * (0.02 / 16), Vec3.up())

            # ================================================================

            vmRaise.set(
                0, 0, 0
            )  #(0, abs(camRootAngles.getY()) * -0.002, camRootAngles.getY() * 0.002)
            camBob.set(0, 0, 0)

            # Apply bob, raise, and sway to the viewmodel.
            self.viewModel.setPos(vmBob + vmRaise + self.lastVMPos)
            self.vmRoot2.setHpr(vmAngles)
            self.camRoot.setPos(eyePoint + camBob)

        newPitch = camRootAngles.getY()

        if abs(newPitch - self.lastPitch) > self.PitchUpdateEpsilon:
            # Broadcast where our head is looking
            head = base.localAvatar.getPart("head")
            if head and not head.isEmpty():
                # Constrain the head pitch a little bit so it doesn't look like their head snapped
                headPitch = max(-47, newPitch)
                headPitch = min(75, headPitch)
                base.localAvatar.b_setLookPitch(headPitch)

        self.lastPitch = newPitch

        if base.localAvatar.isFirstPerson():
            # Apply punch angle
            self.decayPunchAngle()
            camRootAngles += self.punchAngle

        self.camRoot.setHpr(camRootAngles)

        return task.cont
Beispiel #14
0
    def __init__(self):
        ShowBase.__init__(self)

        # Load the environment model.
        self.environ = self.loader.loadModel("models/environment")
        # self.environ is now a NodePath, or a handler for the node (the actual model)
        # could load the same model several times with different NodePaths
        # Reparent the NodePath to render, so the engine knows to show it in the scene.
        self.environ.reparentTo(self.render)
        # Apply scale and position transforms on the NodePath.
        self.environ.setScale(0.25, 0.25, 0.25)
        self.environ.setPos(-8, 42, 0)
        # disable the mouse so it does not interfere with camera
        base.disableMouse()
        # set up some keyboard input
        self.accept("escape", sys.exit)  # Escape quits
        self.accept("space", self.toggle_camera_spin)  # spacebar

        # set up a variable to keep track of camera toggle
        self.spin_camera = True
        # variable to keep track of total time spinning
        self.spin_time = 0
        # go ahead and start camera spinning
        self.toggle_camera_spin()

        # Load and transform the panda actor.
        self.panda_actor = Actor("models/panda-model",
                                 {"walk": "models/panda-walk4"})
        self.panda_actor.setScale(0.005, 0.005, 0.005)
        self.panda_actor.reparentTo(self.render)
        # Loop the animation.
        self.panda_actor.loop("walk")

        # Create the four lerp intervals needed for the panda to
        # walk back and forth.
        panda_pos_interval1 = self.panda_actor.posInterval(13,
                                                           Point3(0, -10, 0),
                                                           startPos=Point3(
                                                               0, 10, 0))
        panda_pos_interval2 = self.panda_actor.posInterval(13,
                                                           Point3(0, 10, 0),
                                                           startPos=Point3(
                                                               0, -10, 0))
        panda_hpr_interval1 = self.panda_actor.hprInterval(3,
                                                           Point3(180, 0, 0),
                                                           startHpr=Point3(
                                                               0, 0, 0))
        panda_hpr_interval2 = self.panda_actor.hprInterval(3,
                                                           Point3(0, 0, 0),
                                                           startHpr=Point3(
                                                               180, 0, 0))

        # Create and play the sequence that coordinates the intervals.
        self.panda_pace = Sequence(panda_pos_interval1,
                                   panda_hpr_interval1,
                                   panda_pos_interval2,
                                   panda_hpr_interval2,
                                   name="pandaPace")
        self.panda_pace.loop()

        # Add a smiley for fun.
        self.smiley = self.loader.loadModel("models/smiley")
        self.smiley.setPos(0, 0, 1)
        self.smiley.reparentTo(self.render)

        # velocity adjustment
        self.vel_base = 3
        # add task to allow smiley movement
        self.taskMgr.add(self.game_loop_task, "GameLoop")
Beispiel #15
0
 def getSprayStartPos(self):
     return Point3(0, 0, 0)
Beispiel #16
0
 def calcTargetScale():
     distance = Vec3(target - origin).length()
     yScale = distance / GagGlobals.SPRAY_LEN
     targetScale = Point3(yScale * horizScale, yScale,
                          yScale * vertScale)
     return targetScale
Beispiel #17
0
    def getSprayTrack(self,
                      origin,
                      target,
                      scaleUp,
                      hold,
                      scaleDown,
                      horizScale=1.0,
                      vertScale=1.0):
        if self.sprayJoint.isEmpty():
            self.build()
            self.origin = self.getSprayStartPos()
        base.localAvatar.stop(self.toonAnim)
        self.lastFrame = self.avatar.getCurrentFrame(self.toonAnim)
        track = Sequence()
        sprayProp = loader.loadModel(GagGlobals.SPRAY_MDL)
        sprayProp.setTwoSided(1)
        sprayScale = hidden.attachNewNode('spray-parent')
        sprayRot = hidden.attachNewNode('spray-rotate')
        sprayRot.setColor(GagGlobals.WATER_SPRAY_COLOR)
        sprayRot.setTransparency(1)

        collNode = CollisionNode('Collision')
        spraySphere = CollisionSphere(0, 0, 0, 1)
        spraySphere.setTangible(0)
        collNode.addSolid(spraySphere)
        collNode.setCollideMask(CIGlobals.WallBitmask)
        sprayNP = sprayRot.attachNewNode(collNode)
        sprayNP.setY(1)
        self.sprayNP = sprayNP
        event = CollisionHandlerEvent()
        event.set_in_pattern("%fn-into")
        event.set_out_pattern("%fn-out")
        base.cTrav.add_collider(sprayNP, event)
        self.avatar.acceptOnce(sprayNP.node().getName() + '-into',
                               self.onCollision)

        def showSpray(sprayScale, sprayProp, origin, target):
            objects = [sprayRot, sprayScale, sprayProp]
            for item in objects:
                index = objects.index(item)
                if index == 0:
                    item.reparentTo(self.sprayJoint)
                    item.setPos(0, 0, 0)
                    item.setHpr(self.sprayRotation)
                    item.wrtReparentTo(render)
                else:
                    item.reparentTo(objects[index - 1])

        track.append(Func(showSpray, sprayScale, sprayProp, origin, target))
        self.spray = sprayRot

        def calcTargetScale():
            distance = Vec3(target - origin).length()
            yScale = distance / GagGlobals.SPRAY_LEN
            targetScale = Point3(yScale * horizScale, yScale,
                                 yScale * vertScale)
            return targetScale

        track.append(
            Parallel(
                LerpScaleInterval(sprayScale,
                                  scaleUp,
                                  calcTargetScale,
                                  startScale=GagGlobals.PNT3NEAR0),
                sprayNP.posInterval(
                    0.25,
                    self.spray.getPos(render) + Point3(0, 50, 0),
                    startPos=self.spray.getPos(render) + Point3(0, 5, 0))))
        track.append(Wait(hold))
        track.append(Func(self.handleMiss))
        track.append(LerpScaleInterval(sprayScale, 0.75, GagGlobals.PNT3NEAR0))

        def hideSpray():
            lambda prop: prop.removeNode(), [sprayProp, sprayRot, sprayScale]

        track.append(Func(hideSpray))
        track.append(Func(self.completeSquirt))
        return track
 def doBillboardEffect(self):
     billboardEffect = BillboardEffect.make(Vec3(0, 0, 1), True, False,
                                            self.billboardOffset, base.cam,
                                            Point3(0, 0, 0))
     self.contents.setEffect(billboardEffect)
Beispiel #19
0
    def reposition(self):
        if self.contents is None:
            return

        origin = Point3()

        self.contents.setPos(origin)

        if self.chatBalloon is not None:
            self.chatBalloon.removeNode()
            self.chatBalloon = None

            self.contents.node().removeAllChildren()

            if (self.cell in base.leftCells) or (self.cell in base.rightCells):
                text = self.getChatText().replace('\x01WLDisplay\x01',
                                                  '').replace('\x02', '')
                textWidth = self.chatTextNode.calcWidth(text)
                if (textWidth /
                        self.CHAT_TEXT_WORD_WRAP) > self.CHAT_TEXT_MAX_ROWS:
                    self.chatTextNode.setWordwrap(
                        textWidth / (self.CHAT_TEXT_MAX_ROWS - 0.5))
            else:
                self.chatTextNode.setWordwrap(self.CHAT_TEXT_WORD_WRAP)

            model = self.getChatBalloonModel()
            modelWidth = self.getChatBalloonWidth()
            modelHeight = self.getChatBalloonHeight()
            self.drawChatBalloon(model, modelWidth, modelHeight)

            nodePath = self.chatBalloon.textNodePath

            left, right, bottom, top = self.chatTextNode.getFrameActual()
            left -= self.chatBalloon.BALLOON_X_PADDING
            right += self.chatBalloon.BALLOON_X_PADDING
            bottom -= self.chatBalloon.BALLOON_Z_PADDING
            top += self.chatBalloon.BALLOON_Z_PADDING
        elif self.panel is not None:
            nodePath = self.textNodePath

            left, right, bottom, top = self.textNode.getFrameActual()
            left -= self.PANEL_X_PADDING
            right += self.PANEL_X_PADDING
            bottom -= self.PANEL_Z_PADDING
            top += self.PANEL_Z_PADDING

            # Compensate for the arrow:
            bottom -= self.ARROW_SCALE
        else:
            return

        if self.cell in base.bottomCells:
            # Move the origin to the bottom center of the node path:
            origin = self.contents.getRelativePoint(
                nodePath, ((left + right) / 2.0, 0, bottom))
        elif self.cell in base.leftCells:
            # Move the origin to the left center of the node path:
            origin = self.contents.getRelativePoint(nodePath,
                                                    (left, 0,
                                                     (bottom + top) / 2.0))
        elif self.cell in base.rightCells:
            # Move the origin to the right center of the node path:
            origin = self.contents.getRelativePoint(nodePath,
                                                    (right, 0,
                                                     (bottom + top) / 2.0))

        self.contents.setPos(self.contents, -origin)
Beispiel #20
0
class DistributedBattleTrolley(DistributedObject):
    notify = directNotify.newCategory('DistributedBattleTrolley')

    STAND_POSITIONS = [
        Point3(-4.75, -5, 1.4),
        Point3(-4.75, -1.6, 1.4),
        Point3(-4.75, 1.6, 1.4),
        Point3(-4.75, 5, 1.4),
        Point3(-4.75, -5, 1.4),
        Point3(-4.75, -1.6, 1.4),
        Point3(-4.75, 1.6, 1.4),
        Point3(-4.75, 5, 1.4)
    ]
    TROLLEY_NEUTRAL_POS = Point3(15, 14, -1)
    TROLLEY_GONE_POS = Point3(50, 14.1588, -0.984615)
    TROLLEY_ARRIVING_START_POS = Point3(-20, 14.1588, -0.984615)
    CAM_POS = Point3(-35, 0, 8)
    CAM_HPR = Vec3(-90, 0, 0)

    def __init__(self, cr):
        DistributedObject.__init__(self, cr)
        self.fsm = ClassicFSM.ClassicFSM('DistributedBattleTrolley', [State.State('off', self.enterOff, self.exitOff),
         State.State('wait', self.enterWait, self.exitWait),
         State.State('waitCountdown', self.enterWaitCountdown, self.exitWaitCountdown),
         State.State('leaving', self.enterLeaving, self.exitLeaving),
         State.State('arriving', self.enterArriving, self.exitArriving)], 'off', 'off')
        self.fsm.enterInitialState()
        self.trolleyStation = None
        self.trolleyCar = None
        self.trolleyKey = None
        self.countdownText = None
        self.trolleyAwaySfx = base.audio3d.loadSfx('phase_4/audio/sfx/SZ_trolley_away.ogg')

        if self.cr.holidayManager.getHoliday() == HolidayType.CHRISTMAS:
            self.trolleyAwaySfx = base.audio3d.loadSfx('winter/audio/sfx/SZ_trolley_away.mp3')

        self.trolleyBellSfx = base.audio3d.loadSfx('phase_4/audio/sfx/SZ_trolley_bell.ogg')
        self.toZone = 0
        self.localAvOnTrolley = False
        self.trolleyEnterTrack = None
        self.trolleyExitTrack = None
        self.hoodAbbr = ""
        self.index = 0
        self.mySlot = -1
        
    def setIndex(self, index):
        self.index = index
        
        hood = self.cr.playGame.hood
        hoodAbbr = None
        
        if self.index == 0:
            hoodAbbr = hood.abbr
        elif self.index == 1:
            hoodAbbr = 'TT' #ZoneUtil.ZoneId2HoodAbbr[self.toZone]
        self.hoodAbbr = hoodAbbr
        
        findStr = '**/prop_trolley_station_' + hoodAbbr + '_DNARoot'
        
        self.trolleyStation = hood.loader.geom.find(findStr)
        self.trolleyStation.flattenStrong()
        self.trolleyCar = self.trolleyStation.find('**/trolley_car')
        self.trolleyKey = self.trolleyStation.find('**/key')

        base.audio3d.attachSoundToObject(self.trolleyAwaySfx, self.trolleyCar)
        base.audio3d.attachSoundToObject(self.trolleyBellSfx, self.trolleyCar)

        exitFog = Fog('TrolleyExitFog')
        exitFog.setColor(0.0, 0.0, 0.0)
        exitFog.setLinearOnsetPoint(30.0, 14.0, 0.0)
        exitFog.setLinearOpaquePoint(37.0, 14.0, 0.0)
        exitFog.setLinearFallback(70.0, 999.0, 1000.0)
        self.trolleyExitFog = self.trolleyStation.attachNewNode(exitFog)
        self.trolleyExitFogNode = exitFog
        enterFog = Fog('TrolleyEnterFog')
        enterFog.setColor(0.0, 0.0, 0.0)
        enterFog.setLinearOnsetPoint(0.0, 14.0, 0.0)
        enterFog.setLinearOpaquePoint(-7.0, 14.0, 0.0)
        enterFog.setLinearFallback(70.0, 999.0, 1000.0)
        self.trolleyEnterFog = self.trolleyStation.attachNewNode(enterFog)
        self.trolleyEnterFogNode = enterFog
        self.trolleyCar.setFogOff()

        tn = TextNode('trolleycountdowntext')
        tn.setFont(CIGlobals.getMickeyFont())
        tn.setTextColor(1, 0, 0, 1)
        tn.setAlign(TextNode.ACenter)

        self.keys = self.trolleyCar.findAllMatches('**/key')
        self.numKeys = self.keys.getNumPaths()
        self.keyInit = []
        self.keyRef = []
        for i in range(self.numKeys):
            key = self.keys[i]
            key.setTwoSided(1)
            ref = self.trolleyCar.attachNewNode('key' + `i` + 'ref')
            ref.setPosHpr(key, 0, 0, 0, 0, 0, 0)
            self.keyRef.append(ref)
            self.keyInit.append(key.getTransform())

        self.frontWheels = self.trolleyCar.findAllMatches('**/front_wheels')
        self.numFrontWheels = self.frontWheels.getNumPaths()
        self.frontWheelInit = []
        self.frontWheelRef = []
        for i in range(self.numFrontWheels):
            wheel = self.frontWheels[i]
            ref = self.trolleyCar.attachNewNode('frontWheel' + `i` + 'ref')
            ref.setPosHpr(wheel, 0, 0, 0, 0, 0, 0)
            self.frontWheelRef.append(ref)
            self.frontWheelInit.append(wheel.getTransform())

        self.backWheels = self.trolleyCar.findAllMatches('**/back_wheels')
        self.numBackWheels = self.backWheels.getNumPaths()
        self.backWheelInit = []
        self.backWheelRef = []
        for i in range(self.numBackWheels):
            wheel = self.backWheels[i]
            ref = self.trolleyCar.attachNewNode('backWheel' + `i` + 'ref')
            ref.setPosHpr(wheel, 0, 0, 0, 0, 0, 0)
            self.backWheelRef.append(ref)
            self.backWheelInit.append(wheel.getTransform())

        trolleyAnimationReset = Func(self.resetAnimation)
        trolleyEnterStartPos = Point3(-20, 14, -1)
        trolleyEnterEndPos = Point3(15, 14, -1)
        trolleyEnterPos = Sequence(name='TrolleyEnterPos')
        trolleyEnterPos.append(Func(self.trolleyCar.setFog, self.trolleyEnterFogNode))
        trolleyEnterPos.append(self.trolleyCar.posInterval(TROLLEY_ENTER_TIME, trolleyEnterEndPos, startPos=trolleyEnterStartPos, blendType='easeOut'))
        trolleyEnterPos.append(Func(self.trolleyCar.setFogOff))
        trolleyEnterTrack = Sequence(trolleyAnimationReset, trolleyEnterPos, name='trolleyEnter')
        keyAngle = round(TROLLEY_ENTER_TIME) * 360
        dist = Vec3(trolleyEnterEndPos - trolleyEnterStartPos).length()
        wheelAngle = dist / (2.0 * math.pi * 0.95) * 360
        trolleyEnterAnimateInterval = LerpFunctionInterval(self.animateTrolley, duration=TROLLEY_ENTER_TIME, blendType='easeOut', extraArgs=[keyAngle, wheelAngle], name='TrolleyAnimate')
        trolleyEnterSoundTrack = SoundInterval(self.trolleyAwaySfx, node=self.trolleyCar)
        self.trolleyEnterTrack = Parallel(trolleyEnterTrack, trolleyEnterAnimateInterval, trolleyEnterSoundTrack)
        trolleyExitStartPos = Point3(15, 14, -1)
        trolleyExitEndPos = Point3(50, 14, -1)
        trolleyExitPos = Sequence(name='TrolleyExitPos')
        trolleyExitPos.append(Func(self.trolleyCar.setFog, self.trolleyExitFogNode))
        trolleyExitPos.append(self.trolleyCar.posInterval(TROLLEY_EXIT_TIME, trolleyExitEndPos, startPos=trolleyExitStartPos, blendType='easeIn'))
        trolleyExitPos.append(Func(self.trolleyCar.setFogOff))
        trolleyExitStartPos = Point3(15, 14, -1)
        trolleyExitEndPos = Point3(50, 14, -1)
        trolleyExitBellInterval = SoundInterval(self.trolleyBellSfx, node=self.trolleyCar)
        trolleyExitAwayInterval = SoundInterval(self.trolleyAwaySfx, node=self.trolleyCar)
        keyAngle = round(TROLLEY_EXIT_TIME) * 360
        dist = Vec3(trolleyExitEndPos - trolleyExitStartPos).length()
        wheelAngle = dist / (2.0 * math.pi * 0.95) * 360
        trolleyExitAnimateInterval = LerpFunctionInterval(self.animateTrolley, duration=TROLLEY_EXIT_TIME, blendType='easeIn', extraArgs=[keyAngle, wheelAngle], name='TrolleyAnimate')
        self.trolleyExitTrack = Parallel(trolleyExitPos, trolleyExitBellInterval, trolleyExitAwayInterval, trolleyExitAnimateInterval, name=self.uniqueName('trolleyExit'))

        self.countdownText = self.trolleyStation.attachNewNode(tn)
        self.countdownText.setScale(3.0)
        self.countdownText.setPos(14.58, 10.77, 11.17)
        
        try:
            self.trolleySphere = self.trolleyStation.find('**/trolley_sphere')
            self.trolleySphere.setName('trolley{0}_sphere'.format(hoodAbbr))
        except:
            pass
        
    def getIndex(self):
        return self.index
        
    def putAvatarInTrolley(self, avId, slot):
        av = self.cr.doId2do.get(avId)
        if av:
            print "putAvatarInTrolley:", av.node().getName()
            av.stopSmooth()
            av.wrtReparentTo(self.trolleyCar)
            av.setAnimState('off')
            slotPos = self.STAND_POSITIONS[slot]
            av.setPos(slotPos)
            if slot <= 3:
                av.loop('sit')
            else:
                av.loop('neutral')
            av.setHpr(90, 0, 0)

    def headOff(self):
        if self.index == 1:
            zoneId = base.localAvatar.getLastHood()
            hoodId = ZoneUtil.getHoodId(zoneId)
        else:
            zoneId = self.toZone
            hoodId = ZoneUtil.getHoodId(self.toZone)

        requestStatus = {'zoneId': zoneId,
                    'hoodId': hoodId,
                    'where': 'playground',
                    'avId': base.localAvatar.doId,
                    'loader': 'safeZoneLoader',
                    'shardId': None,
                    'wantLaffMeter': 1,
                    'how': 'teleportIn',
                    'prevZoneId': base.localAvatar.zoneId,
                    'slot': self.mySlot}
        self.cr.playGame.getPlace().doneStatus = requestStatus
        messenger.send(self.cr.playGame.getPlace().doneEvent)
        base.localAvatar.reparentTo(render)
        base.localAvatar.setPos(0, 0, 0)
        base.localAvatar.setHpr(0, 0, 0)
        base.localAvatar.walkControls.setCollisionsActive(1)
        self.localAvOnTrolley = False

    def setToZone(self, zone):
        self.toZone = zone

    def getToZone(self):
        return self.toZone

    def enterOff(self, ts = 0):
        pass

    def exitOff(self):
        pass
        
    def __maybeAcceptCollisions(self):
        if self.fsm.getCurrentState().getName() in ['wait', 'waitCountdown'] and not self.localAvOnTrolley:
            self.acceptOnce('entertrolley{0}_sphere'.format(self.hoodAbbr), self.__handleTrolleyTrigger)
            
    def __ignoreCollisions(self):
        self.ignore('entertrolley{0}_sphere'.format(self.hoodAbbr))

    def enterWait(self, ts = 0):
        self.trolleyCar.setPos(self.TROLLEY_NEUTRAL_POS)
        self.__maybeAcceptCollisions()

    def exitWait(self):
        self.__ignoreCollisions()

    def enterWaitCountdown(self, ts = 0):
        self.trolleyCar.setPos(self.TROLLEY_NEUTRAL_POS)
        self.__maybeAcceptCollisions()
        if self.countdownText:
            self.countdownTrack = Sequence()
            for i in range(10):
                self.countdownTrack.append(Func(self.countdownText.node().setText, str(10 - i)))
                self.countdownTrack.append(Wait(1.0))
            self.countdownTrack.start()

    def exitWaitCountdown(self):
        self.__ignoreCollisions()
        if hasattr(self, 'countdownTrack'):
            self.countdownTrack.finish()
            del self.countdownTrack
        if self.countdownText:
            self.countdownText.node().setText('')
        self.disableExitButton()

    def enterArriving(self, ts = 0):
        if self.localAvOnTrolley == True:
            CIGlobals.hideWaitForOthers()
            camera.wrtReparentTo(self.trolleyCar)
            camera.setPos(0, -18.55, 3.75)
            camera.setHpr(0, 0, 0)
            Sequence(Wait(2.0), camera.posHprInterval(3, self.CAM_POS, self.CAM_HPR, startPos = (0, -18.55, 3.75), startHpr = (0, 0, 0), blendType='easeInOut')).start()
        self.trolleyEnterTrack.start(ts)

    def exitArriving(self):
        if self.trolleyEnterTrack:
            self.trolleyEnterTrack.finish()

    def enterLeaving(self, ts = 0):
        base.playSfx(self.trolleyBellSfx, node = self.trolleyCar)
        if self.localAvOnTrolley == True:
            camera.posHprInterval(3, (0, 18.55, 3.75), (-180, 0, 0), blendType='easeInOut').start()
            self.trolleyExitTrack.append(Sequence(Wait(4.0), Func(base.transitions.fadeOut), Wait(1.0), Func(self.headOff)))
        self.trolleyExitTrack.start(ts)
        self.__ignoreCollisions()

    def exitLeaving(self):
        if self.trolleyExitTrack:
            self.trolleyExitTrack.finish()

    def setState(self, stateName, timestamp):
        ts = globalClockDelta.localElapsedTime(timestamp)
        self.fsm.request(stateName, [ts])

    def __handleTrolleyTrigger(self, collNp):
        # workaround for a bug that i don't understand why it happens
        if not hasattr(self, 'cr') or not self.cr:
            self.cr = base.cr
            
        self.cr.playGame.getPlace().fsm.request('stop')
        base.localAvatar.disableGags()
        self.notify.info('Waiting for response from server to enter trolley')
        self.sendUpdate('requestBoard')
        base.localAvatar.walkControls.setCollisionsActive(0)

    def rejectBoard(self):
        base.localAvatar.walkControls.setCollisionsActive(1)
        self.cr.playGame.getPlace().fsm.request('walk')
        self.__maybeAcceptCollisions()

    def fillSlot(self, index, avId):
        if avId == base.localAvatar.doId:
            self.localAvOnTrolley = True
            base.localAvatar.stopSmartCamera()
            base.camera.wrtReparentTo(self.trolleyCar)
            camTrack = Sequence(Parallel(
             LerpPosInterval(
              base.camera,
              duration = 1.5,
              pos = self.CAM_POS,
              startPos = base.camera.getPos(),
              blendType = 'easeOut'
             ),
             LerpQuatInterval(
              base.camera,
              duration = 1.5,
              hpr = self.CAM_HPR,
              startHpr = base.camera.getHpr(),
              blendType = 'easeOut'
             )
            ), Func(self.enableExitButton))
            camTrack.start()
            self.mySlot = index

        toon = self.cr.doId2do.get(avId)
        toon.stopSmooth()
        if toon:
            toon.wrtReparentTo(self.trolleyCar)
            slotPos = self.STAND_POSITIONS[index]
            toon.headsUp(slotPos)
            track = Sequence(
                Func(toon.setAnimState, 'run'),
                LerpPosInterval(toon, 0.75, slotPos),
                LerpHprInterval(toon, 0.25, Point3(90, 0, 0)))
            if index <= 3:
                sitStartDuration = toon.getDuration('start-sit')
                track.append(Parallel(ActorInterval(toon, 'start-sit'),
                                      Sequence(Wait(sitStartDuration * 0.25),
                                               LerpPosInterval(toon, sitStartDuration * 0.25, Point3(-3.9, -4.5 + index * 3, 3.0)))))
                track.append(Func(toon.loop, 'sit'))
            else:
                track.append(Func(toon.loop, 'neutral'))
            track.start()
        

    def enableExitButton(self):
        if self.fsm.getCurrentState().getName() != 'leaving':
            self.exitButton = CIGlobals.getExitButton(cmd = self.__handleExitButton, pos = (0, 0, -0.8))

    def __handleExitButton(self):
        if self.fsm.getCurrentState().getName() == 'waitCountdown' and self.localAvOnTrolley == True:
            self.disableExitButton()
            self.sendUpdate('requestHopOff')

    def disableExitButton(self):
        if hasattr(self, 'exitButton'):
            self.exitButton.destroy()
            del self.exitButton

    def emptySlot(self, index, avId):
        toon = self.cr.doId2do.get(avId)
        toon.stopSmooth()
        currToonPos = toon.getPos(render)
        toon.wrtReparentTo(render)
        slotPos = self.STAND_POSITIONS[index]
        endPos = (-20, slotPos.getY(), 1.4)
        toon.setPos(self.trolleyCar, endPos)
        endPosWrtRender = toon.getPos(render)
        toon.setPos(currToonPos)
        toon.headsUp(self.trolleyCar, endPos)
        if index <= 3:
            track = Sequence(Parallel(
                ActorInterval(toon, 'start-sit', startTime=1, endTime=0.0),
                Sequence(Wait(0.5),
                    LerpPosInterval(toon, 0.25,
                    Point3(-5, -4.5 + index * 3, 1.4), other=self.trolleyCar))),
                    Func(toon.setAnimState, 'run'),
                    LerpPosInterval(toon, 1, Point3(21 - index * 3, -5, 0.02), other=self.trolleyStation),
                    Func(toon.setAnimState, 'neutral'),
                    Func(toon.startSmooth),
                name=toon.uniqueName('emptyTrolley'), autoPause=1)
        else:
            track = Sequence(
             Func(toon.setAnimState, 'run'),
             LerpPosInterval(
              toon,
              duration = 1.0,
              pos = endPosWrtRender,
              startPos = currToonPos
             ),
             Func(toon.setAnimState, 'neutral'),
             Func(toon.startSmooth)
            )
        if avId == base.localAvatar.doId:
            self.localAvOnTrolley = False
            track.append(Func(self.__hoppedOffTrolley))
        track.start()

    def __hoppedOffTrolley(self):
        #self.acceptOnce('entertrolley_sphere', self.__handleTrolleyTrigger)
        base.localAvatar.walkControls.setCollisionsActive(1)
        self.cr.playGame.getPlace().fsm.request('walk')

    def resetAnimation(self):
        if self.keys:
            for i in range(self.numKeys):
                self.keys[i].setTransform(self.keyInit[i])

            for i in range(self.numFrontWheels):
                self.frontWheels[i].setTransform(self.frontWheelInit[i])

            for i in range(self.numBackWheels):
                self.backWheels[i].setTransform(self.backWheelInit[i])

    def animateTrolley(self, t, keyAngle, wheelAngle):
        if self.keys:
            for i in range(self.numKeys):
                key = self.keys[i]
                ref = self.keyRef[i]
                key.setH(ref, t * keyAngle)

            for i in range(self.numFrontWheels):
                frontWheel = self.frontWheels[i]
                ref = self.frontWheelRef[i]
                frontWheel.setH(ref, t * wheelAngle)

            for i in range(self.numBackWheels):
                backWheel = self.backWheels[i]
                ref = self.backWheelRef[i]
                backWheel.setH(ref, t * wheelAngle)

    def delete(self):
        self.__ignoreCollisions()
    
        self.trolleyStation = None
        self.trolleyKey = None
        self.soundMoving = None
        self.soundBell = None
        self.troleyCar = None
        self.backWheelInit = None
        self.backWheelRef = None
        self.backWheels = None
        self.frontWheelInit = None
        self.frontWheelRef = None
        self.frontWheels = None
        self.keyInit = None
        self.keyRef = None
        self.keys = None
        self.trolleyEnterTrack = None
        self.trolleyExitTrack = None
        self.trolleyExitFog = None
        self.trolleyExitFogNode = None
        self.trolleyEnterFogNode = None
        self.trolleyEnterFog = None
        
        if self.countdownText:
            self.countdownText.removeNode()
            self.countdownText = None

        DistributedObject.delete(self)
Beispiel #21
0
    # left paddle
    base.ecs_world.create_entity(
        panda3d.Model(),
        panda3d.Geometry(file='resources/paddle.bam'),
        panda3d.Scene(node=base.aspect2d),
        panda3d.Position(value=Vec3(-1.1, 0, 0)),
        movement.Movement(direction=Vec3(0, 0, 0)),
        paddles.Paddle(player=paddles.Players.LEFT),
    )

    # right paddle
    base.ecs_world.create_entity(
        panda3d.Model(),
        panda3d.Geometry(file='resources/paddle.bam'),
        panda3d.Scene(node=base.aspect2d),
        panda3d.Position(value=Point3(1.1, 0, 0)),
        movement.Movement(direction=Vec3(0, 0, 0)),
        paddles.Paddle(player=paddles.Players.RIGHT),
    )

    # ball
    base.ecs_world.create_entity(
        panda3d.Position(value=Point3(0, 0, 0)),
        panda3d.Model(),
        panda3d.Geometry(file='resources/ball.bam'),
        panda3d.Scene(node=base.aspect2d),
        ball.Ball(),
        ball.Resting(),
    )

    # another ball - uncomment to enjoy the HARD mode
Beispiel #22
0
    def setIndex(self, index):
        self.index = index
        
        hood = self.cr.playGame.hood
        hoodAbbr = None
        
        if self.index == 0:
            hoodAbbr = hood.abbr
        elif self.index == 1:
            hoodAbbr = 'TT' #ZoneUtil.ZoneId2HoodAbbr[self.toZone]
        self.hoodAbbr = hoodAbbr
        
        findStr = '**/prop_trolley_station_' + hoodAbbr + '_DNARoot'
        
        self.trolleyStation = hood.loader.geom.find(findStr)
        self.trolleyStation.flattenStrong()
        self.trolleyCar = self.trolleyStation.find('**/trolley_car')
        self.trolleyKey = self.trolleyStation.find('**/key')

        base.audio3d.attachSoundToObject(self.trolleyAwaySfx, self.trolleyCar)
        base.audio3d.attachSoundToObject(self.trolleyBellSfx, self.trolleyCar)

        exitFog = Fog('TrolleyExitFog')
        exitFog.setColor(0.0, 0.0, 0.0)
        exitFog.setLinearOnsetPoint(30.0, 14.0, 0.0)
        exitFog.setLinearOpaquePoint(37.0, 14.0, 0.0)
        exitFog.setLinearFallback(70.0, 999.0, 1000.0)
        self.trolleyExitFog = self.trolleyStation.attachNewNode(exitFog)
        self.trolleyExitFogNode = exitFog
        enterFog = Fog('TrolleyEnterFog')
        enterFog.setColor(0.0, 0.0, 0.0)
        enterFog.setLinearOnsetPoint(0.0, 14.0, 0.0)
        enterFog.setLinearOpaquePoint(-7.0, 14.0, 0.0)
        enterFog.setLinearFallback(70.0, 999.0, 1000.0)
        self.trolleyEnterFog = self.trolleyStation.attachNewNode(enterFog)
        self.trolleyEnterFogNode = enterFog
        self.trolleyCar.setFogOff()

        tn = TextNode('trolleycountdowntext')
        tn.setFont(CIGlobals.getMickeyFont())
        tn.setTextColor(1, 0, 0, 1)
        tn.setAlign(TextNode.ACenter)

        self.keys = self.trolleyCar.findAllMatches('**/key')
        self.numKeys = self.keys.getNumPaths()
        self.keyInit = []
        self.keyRef = []
        for i in range(self.numKeys):
            key = self.keys[i]
            key.setTwoSided(1)
            ref = self.trolleyCar.attachNewNode('key' + `i` + 'ref')
            ref.setPosHpr(key, 0, 0, 0, 0, 0, 0)
            self.keyRef.append(ref)
            self.keyInit.append(key.getTransform())

        self.frontWheels = self.trolleyCar.findAllMatches('**/front_wheels')
        self.numFrontWheels = self.frontWheels.getNumPaths()
        self.frontWheelInit = []
        self.frontWheelRef = []
        for i in range(self.numFrontWheels):
            wheel = self.frontWheels[i]
            ref = self.trolleyCar.attachNewNode('frontWheel' + `i` + 'ref')
            ref.setPosHpr(wheel, 0, 0, 0, 0, 0, 0)
            self.frontWheelRef.append(ref)
            self.frontWheelInit.append(wheel.getTransform())

        self.backWheels = self.trolleyCar.findAllMatches('**/back_wheels')
        self.numBackWheels = self.backWheels.getNumPaths()
        self.backWheelInit = []
        self.backWheelRef = []
        for i in range(self.numBackWheels):
            wheel = self.backWheels[i]
            ref = self.trolleyCar.attachNewNode('backWheel' + `i` + 'ref')
            ref.setPosHpr(wheel, 0, 0, 0, 0, 0, 0)
            self.backWheelRef.append(ref)
            self.backWheelInit.append(wheel.getTransform())

        trolleyAnimationReset = Func(self.resetAnimation)
        trolleyEnterStartPos = Point3(-20, 14, -1)
        trolleyEnterEndPos = Point3(15, 14, -1)
        trolleyEnterPos = Sequence(name='TrolleyEnterPos')
        trolleyEnterPos.append(Func(self.trolleyCar.setFog, self.trolleyEnterFogNode))
        trolleyEnterPos.append(self.trolleyCar.posInterval(TROLLEY_ENTER_TIME, trolleyEnterEndPos, startPos=trolleyEnterStartPos, blendType='easeOut'))
        trolleyEnterPos.append(Func(self.trolleyCar.setFogOff))
        trolleyEnterTrack = Sequence(trolleyAnimationReset, trolleyEnterPos, name='trolleyEnter')
        keyAngle = round(TROLLEY_ENTER_TIME) * 360
        dist = Vec3(trolleyEnterEndPos - trolleyEnterStartPos).length()
        wheelAngle = dist / (2.0 * math.pi * 0.95) * 360
        trolleyEnterAnimateInterval = LerpFunctionInterval(self.animateTrolley, duration=TROLLEY_ENTER_TIME, blendType='easeOut', extraArgs=[keyAngle, wheelAngle], name='TrolleyAnimate')
        trolleyEnterSoundTrack = SoundInterval(self.trolleyAwaySfx, node=self.trolleyCar)
        self.trolleyEnterTrack = Parallel(trolleyEnterTrack, trolleyEnterAnimateInterval, trolleyEnterSoundTrack)
        trolleyExitStartPos = Point3(15, 14, -1)
        trolleyExitEndPos = Point3(50, 14, -1)
        trolleyExitPos = Sequence(name='TrolleyExitPos')
        trolleyExitPos.append(Func(self.trolleyCar.setFog, self.trolleyExitFogNode))
        trolleyExitPos.append(self.trolleyCar.posInterval(TROLLEY_EXIT_TIME, trolleyExitEndPos, startPos=trolleyExitStartPos, blendType='easeIn'))
        trolleyExitPos.append(Func(self.trolleyCar.setFogOff))
        trolleyExitStartPos = Point3(15, 14, -1)
        trolleyExitEndPos = Point3(50, 14, -1)
        trolleyExitBellInterval = SoundInterval(self.trolleyBellSfx, node=self.trolleyCar)
        trolleyExitAwayInterval = SoundInterval(self.trolleyAwaySfx, node=self.trolleyCar)
        keyAngle = round(TROLLEY_EXIT_TIME) * 360
        dist = Vec3(trolleyExitEndPos - trolleyExitStartPos).length()
        wheelAngle = dist / (2.0 * math.pi * 0.95) * 360
        trolleyExitAnimateInterval = LerpFunctionInterval(self.animateTrolley, duration=TROLLEY_EXIT_TIME, blendType='easeIn', extraArgs=[keyAngle, wheelAngle], name='TrolleyAnimate')
        self.trolleyExitTrack = Parallel(trolleyExitPos, trolleyExitBellInterval, trolleyExitAwayInterval, trolleyExitAnimateInterval, name=self.uniqueName('trolleyExit'))

        self.countdownText = self.trolleyStation.attachNewNode(tn)
        self.countdownText.setScale(3.0)
        self.countdownText.setPos(14.58, 10.77, 11.17)
        
        try:
            self.trolleySphere = self.trolleyStation.find('**/trolley_sphere')
            self.trolleySphere.setName('trolley{0}_sphere'.format(hoodAbbr))
        except:
            pass
 def __init__(self, cr, doJellyBeans=True, doTricks=False, texture=None):
     DistributedPartyTrampolineActivity.notify.debug('__init__')
     DistributedPartyActivity.__init__(
         self,
         cr,
         PartyGlobals.ActivityIds.PartyTrampoline,
         PartyGlobals.ActivityTypes.GuestInitiated,
         wantLever=False,
         wantRewardGui=True)
     self.doJellyBeans = doJellyBeans
     self.doTricks = doTricks
     self.texture = texture
     self.toon = None
     self.trampHeight = 3.6
     self.trampK = 400.0
     self.normalTrampB = 2.5
     self.leavingTrampB = 8.0
     self.trampB = self.normalTrampB
     self.g = -32.0
     self.jumpBoost = 330.0
     self.beginningBoost = 500.0
     self.beginningBoostThreshold = self.trampHeight + 1.5
     self.earlyJumpThreshold = 75.0
     self.boingThreshold = 300.0
     self.turnFactor = 120.0
     self.stepDT = 0.001
     self.targetCameraPos = Point3(0.0, 40.0, 10.0)
     self.cameraSpeed = 2.0
     self.hopOffPos = Point3(16.0, 0.0, 0.0)
     self.indicatorFactor = 0.0095
     self.dropShadowCutoff = 15.0
     self.minHeightForText = 15.0
     self.heightTextOffset = -0.065
     self.beanOffset = 0.5
     self.guiBeanOffset = -0.02
     self.jumpTextShown = False
     self.toonJumped = False
     self.turnLeft = False
     self.turnRight = False
     self.leavingTrampoline = False
     self.toonVelocity = 0.0
     self.topHeight = 0.0
     self.lastPeak = 0.0
     self.beginRoundInterval = None
     self.hopOnAnim = None
     self.hopOffAnim = None
     self.flashTextInterval = None
     self.numJellyBeans = PartyGlobals.TrampolineNumJellyBeans
     self.jellyBeanBonus = PartyGlobals.TrampolineJellyBeanBonus
     self.jellyBeanStartHeight = 20.0
     self.jellyBeanStopHeight = 90.0
     self.jellyBeanColors = [
         VBase4(1.0, 0.5, 0.5, 1.0),
         VBase4(0.5, 1.0, 0.5, 1.0),
         VBase4(0.5, 1.0, 1.0, 1.0),
         VBase4(1.0, 1.0, 0.4, 1.0),
         VBase4(0.4, 0.4, 1.0, 1.0),
         VBase4(1.0, 0.5, 1.0, 1.0)
     ]
     delta = (self.jellyBeanStopHeight -
              self.jellyBeanStartHeight) / (self.numJellyBeans - 1)
     self.jellyBeanPositions = [
         self.jellyBeanStartHeight + n * delta
         for n in range(self.numJellyBeans)
     ]
     self.doSimulateStep = False
     return
Beispiel #24
0
 def firingWater(self, startX, startY, startZ, endX, endY, endZ):
     origin = Point3(startX, startY, startZ)
     target = Point3(endX, endY, endZ)
     self.fireWater(origin, target)
Beispiel #25
0
class FactorySneakPlayer(DirectObject):
    notify = directNotify.newCategory("FactorySneakPlayer")

    SPAWN_POINT = Point3(21, 14.5, 3.73)

    def __init__(self, mg):
        DirectObject.__init__(self)
        self.actualAvatar = base.localAvatar
        self.beansCollected = 0
        self.moneyGui = None
        self.mg = mg
        self.toonFPS = FactorySneakGameToonFPS(mg)
        self.guardsPursuing = 0

    def guardPursue(self):
        self.mg.gameWorld.showAlert("A guard has noticed you!")
        self.guardsPursuing += 1
        if self.guardsPursuing == 1:
            # Play the "guards pursuing" music.
            self.mg.gameWorld.playMusic(1)

    def guardStopPursue(self):
        self.guardsPursuing -= 1
        if self.guardsPursuing == 0:
            # Play the "sneak around" music.
            self.mg.gameWorld.playMusic(0)
            self.mg.gameWorld.showAlert("You've evaded the guards!")

    def startFPS(self, enableLookAround=True):
        self.toonFPS.load()
        self.toonFPS.start()
        if (enableLookAround == False):
            self.disableLookAround()
        self.toonFPS.gui.hp_meter.hide()
        self.accept("guardPursue", self.guardPursue)
        self.accept("guardStopPursue", self.guardStopPursue)

    def enableLookAround(self):
        self.toonFPS.firstPerson.disableMouse()

    def disableLookAround(self):
        self.toonFPS.firstPerson.enableMouse()

    def enableControls(self):
        self.toonFPS.reallyStart()

    def disableControls(self):
        self.toonFPS.end()

    def cleanupFPS(self):
        self.ignore("guardPursue")
        self.ignore("guardStopPursue")
        self.toonFPS.reallyEnd()
        self.toonFPS.cleanup()

    def spawn(self):
        self.actualAvatar.setPos(self.SPAWN_POINT)

    def setupInterface(self):
        self.moneyGui = MoneyGui()
        self.moneyGui.createGui()
        self.moneyGui.frame.setPos(self.moneyGui.frame.getPos() +
                                   (-0.25, 0, 0.175))

        self.updateBeansCollected()

    def cleanup(self):
        self.actualAvatar = None
        self.beansCollected = None
        self.cleanupFPS()
        if self.moneyGui:
            self.moneyGui.deleteGui()
            self.moneyGui = None
        self.mg = None

    def setBeansCollected(self, amt):
        self.beansCollected = amt
        self.updateBeansCollected()

    def getBeansCollected(self):
        return self.beansCollected

    def updateBeansCollected(self):
        self.moneyGui.update(self.beansCollected)
Beispiel #26
0
 def getSlideToPos(toon=toon):
     return render.getRelativePoint(toon, Point3(0, -10, 0))
def getLeftClosePoint(type):
    width = ElevatorData[type]['width']
    return Point3(width, 0, 0)
Beispiel #28
0
    def getSprayTrack(self,
                      color,
                      origin,
                      target,
                      dScaleUp,
                      dHold,
                      dScaleDown,
                      horizScale=1.0,
                      vertScale=1.0,
                      parent=render):
        track = Sequence()
        SPRAY_LEN = 1.5
        sprayProp = MovieUtil.globalPropPool.getProp('spray')
        sprayScale = hidden.attachNewNode('spray-parent')
        sprayRot = hidden.attachNewNode('spray-rotate')
        spray = sprayRot
        spray.setColor(color)
        if color[3] < 1.0:
            spray.setTransparency(1)

        def showSpray(sprayScale, sprayRot, sprayProp, origin, target, parent):
            if callable(origin):
                origin = origin()
            if callable(target):
                target = target()
            sprayRot.reparentTo(parent)
            sprayRot.clearMat()
            sprayScale.reparentTo(sprayRot)
            sprayScale.clearMat()
            sprayProp.reparentTo(sprayScale)
            sprayProp.clearMat()
            sprayRot.setPos(origin)
            sprayRot.lookAt(Point3(target))

        track.append(
            Func(showSpray, sprayScale, sprayRot, sprayProp, origin, target,
                 parent))

        def calcTargetScale(target=target,
                            origin=origin,
                            horizScale=horizScale,
                            vertScale=vertScale):
            if callable(target):
                target = target()
            if callable(origin):
                origin = origin()
            distance = Vec3(target - origin).length()
            yScale = distance / SPRAY_LEN
            targetScale = Point3(yScale * horizScale, yScale,
                                 yScale * vertScale)
            return targetScale

        track.append(
            LerpScaleInterval(sprayScale,
                              dScaleUp,
                              calcTargetScale,
                              startScale=Point3(0.01, 0.01, 0.01)))
        track.append(Func(self.checkHitObject))
        track.append(Wait(dHold))

        def prepareToShrinkSpray(spray, sprayProp, origin, target):
            if callable(target):
                target = target()
            if callable(origin):
                origin = origin()
            sprayProp.setPos(Point3(0.0, -SPRAY_LEN, 0.0))
            spray.setPos(target)

        track.append(
            Func(prepareToShrinkSpray, spray, sprayProp, origin, target))
        track.append(
            LerpScaleInterval(sprayScale, dScaleDown, Point3(0.01, 0.01,
                                                             0.01)))

        def hideSpray(spray, sprayScale, sprayRot, sprayProp, propPool):
            sprayProp.detachNode()
            MovieUtil.removeProp(sprayProp)
            sprayRot.removeNode()
            sprayScale.removeNode()

        track.append(
            Func(hideSpray, spray, sprayScale, sprayRot, sprayProp,
                 MovieUtil.globalPropPool))
        return track
def getLeftOpenPoint(type):
    return Point3(0, 0, 0)
Beispiel #30
0
 def getRowPos(self, place):
     return Point3(-0.72, -0.01, 0.2 - place * 0.1)
Beispiel #31
0
 def generateWater(self, style):
     print "Generate Water:", self.waterXMin, self.waterXMax, self.waterYMin, self.waterYMax
     '''Generates water
     style 0: blue card
     style 1: reflective card
     style 2: reflective card with shaders
     '''
     self.waterHeight = 22.0
     if self.water:
         self.water.removeNode()
     if style is 0:
         cm = CardMaker("water")
         #cm.setFrame(-1, 1, -1, 1)
         cm.setFrame(self.waterXMin, self.waterXMax, self.waterYMin,
                     self.waterYMax)
         cm.setColor(0, 0, 1, 0.9)
         self.water = render.attachNewNode(cm.generate())
         if self.waterYMax > self.waterXMax:
             size = self.waterYMax
         else:
             size = self.waterXMax
         self.water.lookAt(0, 0, -1)
         self.water.setZ(self.waterHeight)
         messenger.send('makePickable', [self.water])
     elif style is 1:
         # From Prosoft's super awesome terrain demo
         cm = CardMaker("water")
         #cm.setFrame(-1, 1, -1, 1)
         cm.setFrame(self.waterXMin, self.waterXMax, self.waterYMin,
                     self.waterYMax)
         self.water = render.attachNewNode(cm.generate())
         if self.waterYMax > self.waterXMax:
             size = self.waterYMax
         else:
             size = self.waterXMax
         #self.water.setScale(size)
         self.water.lookAt(0, 0, -1)
         self.water.setZ(self.waterHeight)
         self.water.setShaderOff(1)
         self.water.setLightOff(1)
         self.water.setAlphaScale(0.5)
         self.water.setTransparency(TransparencyAttrib.MAlpha)
         wbuffer = base.win.makeTextureBuffer("water", 512, 512)
         wbuffer.setClearColorActive(True)
         wbuffer.setClearColor(base.win.getClearColor())
         self.wcamera = base.makeCamera(wbuffer)
         self.wcamera.reparentTo(render)
         self.wcamera.node().setLens(base.camLens)
         self.wcamera.node().setCameraMask(BitMask32.bit(1))
         self.water.hide(BitMask32.bit(1))
         wtexture = wbuffer.getTexture()
         wtexture.setWrapU(Texture.WMClamp)
         wtexture.setWrapV(Texture.WMClamp)
         wtexture.setMinfilter(Texture.FTLinearMipmapLinear)
         self.wplane = Plane(Vec3(0, 0, 1), Point3(0, 0, self.water.getZ()))
         wplanenp = render.attachNewNode(PlaneNode("water", self.wplane))
         tmpnp = NodePath("StateInitializer")
         tmpnp.setClipPlane(wplanenp)
         tmpnp.setAttrib(CullFaceAttrib.makeReverse())
         self.wcamera.node().setInitialState(tmpnp.getState())
         self.water.projectTexture(TextureStage("reflection"), wtexture,
                                   self.wcamera)
         messenger.send('makePickable', [self.water])
     elif style is 2:
         # From Clcheung just as super awesome demomaster
         self.water_level = Vec4(0.0, 0.0, self.waterHeight, 1.0)
         self.water = water.WaterNode(self.waterXMin, self.waterYMin,
                                      self.waterXMax, self.waterYMax,
                                      self.water_level.getZ())
         self.water.setStandardControl()
         self.water.changeParams(None)
         wl = self.water_level
         wl.setZ(wl.getZ() - 0.05)
         #root.setShaderInput('waterlevel', self.water_level)
         render.setShaderInput('time', 0)
         messenger.send('makePickable', [self.water.waterNP])
class CameraShyLevelLoader:
    notify = directNotify.newCategory('CameraShyLevelLoader')

    levelData = {
        'TT_maze': {
            'name':
            CIGlobals.ToontownCentral,
            'models': {
                'phase_4/models/minigames/maze_1player.bam': {
                    'name': 'maze'
                },
                'phase_4/models/minigames/maze_1player_collisions.egg': {
                    'name': 'maze_collisions'
                },
            },
            'sky':
            'TT',
            'spawnPoints':
            [[Point3(0, 0, 0), Vec3(0, 0, 0)],
             [Point3(-23.89, 18.58, 0.00),
              Vec3(90.00, 0.00, 0.00)],
             [Point3(-23.89, 6.30, 0.00),
              Vec3(0.00, 0.00, 0.00)],
             [Point3(23.78, 6.30, 0.00),
              Vec3(0.00, 0.00, 0.00)],
             [Point3(8.12, -17.79, 0.00),
              Vec3(270.00, 0.00, 0.00)]]
        },
        'DG_playground': {
            'name':
            CIGlobals.DaisyGardens,
            'dna': [
                'phase_8/dna/storage_DG.pdna',
                'phase_8/dna/storage_DG_sz.pdna',
                'phase_8/dna/daisys_garden_sz.pdna'
            ],
            'sky':
            'TT',
            'spawnPoints':
            hoodMgr.dropPoints[CIGlobals.DaisyGardens]
        }
    }

    skyData = {
        'TT': {
            'model': 'phase_3.5/models/props/TT_sky.bam',
            'moving': 1
        }
    }

    def __init__(self):
        self.level = None
        self.dnaStore = DNAStorage()

        self.levelGeom = None
        self.skyUtil = None
        self.skyModel = None

        # To keep track of all the models.
        self.models = []

    def setLevel(self, level):
        self.level = level

    def getLevel(self):
        return self.level

    def load(self):
        if not self.level:
            self.notify.warning('Attempted to load a null level!')
            return

        def loadSky(sky):
            data = self.skyData[sky]

            if data:
                model = data['model']
                moving = 0

                if data.get('moving'):
                    moving = data['moving']

                self.skyModel = loader.loadModel(model)
                self.skyModel.reparentTo(camera)
                self.skyUtil = SkyUtil()
                self.skyUtil.startSky(self.skyModel)

                if moving:
                    compass = CompassEffect.make(
                        NodePath(), CompassEffect.PRot | CompassEffect.PZ)
                    self.skyModel.node().setEffect(compass)

        self.unload()
        data = self.levelData[self.level]
        skyType = data['sky']

        # Are we loading a DNA level?
        if data.get('dna'):
            dnaFiles = data['dna']
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage.pdna')

            for index in range(len(dnaFiles)):
                if 'storage' not in dnaFiles[index]:
                    # It's an environment file, let's load that up and reparent it to render.
                    node = loader.loadDNAFile(self.dnaStore, dnaFiles[index])
                    if node.getNumParents() == 1:
                        self.levelGeom = NodePath(node.getParent(0))
                        self.levelGeom.reparentTo(hidden)
                    else:
                        self.levelGeom = hidden.attachNewNode(node)
                    self.levelGeom.flattenMedium()
                    gsg = base.win.getGsg()
                    if gsg:
                        self.levelGeom.prepareScene(gsg)
                    self.levelGeom.reparentTo(render)
                else:
                    # It's just a storage file, let's just load that up.
                    loadDNAFile(self.dnaStore, dnaFiles[index])
        elif data.get('models'):
            models = data['models']
            for model, modifiers in models.items():
                mdl = loader.loadModel(model)

                if modifiers.get('name'):
                    mdl.setName(modifiers['name'])

                if modifiers.get('hpr'):
                    mdl.setHpr(modifiers['hpr'])

                if modifiers.get('pos'):
                    mdl.setPos(modifiers['pos'])

                if modifiers.get('scale'):
                    mdl.setScale(modifiers['scale'])

                if modifiers.get('parent'):
                    mdl.reparentTo(modifiers['parent'])
                else:
                    mdl.reparentTo(render)
                self.models.append(mdl)
        else:
            self.notify.warning(
                'Attempted to load a level with no data on how to generate it. Level is empty!'
            )
            return
        loadSky(skyType)
        self.levelLoaded()

    def unload(self):
        if self.models:
            if len(self.models) > 0:
                for model in self.models:
                    model.removeNode()
        self.models = []
        if self.levelGeom:
            self.levelGeom.removeNode()
            self.levelGeom = None
        if self.skyUtil:
            self.skyUtil.stopSky()
            self.skyUtil = None
        if self.skyModel:
            self.skyModel.removeNode()
            self.skyModel = None
        if self.dnaStore:
            self.dnaStore.reset_nodes()
            self.dnaStore.reset_hood_nodes()
            self.dnaStore.reset_place_nodes()
            self.dnaStore.reset_hood()
            self.dnaStore.reset_fonts()
            self.dnaStore.reset_DNA_vis_groups()
            self.dnaStore.reset_textures()
            self.dnaStore.reset_block_numbers()
            self.dnaStore.reset_block_zones()
            self.dnaStore.reset_suit_points()

        # This is set outside of the class, so no need to check if it exists.
        hoodMgr = None

    def cleanup(self):
        try:
            self.CameraShyLevelLoader_deleted
        except:
            self.CameraShyLevelLoader_deleted = 1
            if self.dnaStore:
                self.unload()
            self.models = None
            self.levelGeom = None
            self.skyUtil = None
            self.skyModel = None
            self.dnaStore = None
            self.levelData = None

    def levelLoaded(self):
        if self.level == 'TT_maze':
            for model in self.models:
                if model.getName() == 'maze':
                    model.find('**/maze_walls').setSz(1.5)
                elif model.getName() == 'maze_collisions':
                    model.hide()
                    model.setTransparency(1)
                    model.setColorScale(1, 1, 1, 0)
                    for node in model.findAllMatches('**'):
                        node.setSz(1.5)

    def getSpawnPoints(self):
        if self.level:
            points = self.levelData[self.level].get('spawnPoints')

            # Do we need to disect the pos and hpr coordinates?
            if points in hoodMgr.dropPoints.values():
                twoPointArray = []
                for posHpr in points:
                    twoPointArray.append(
                        Point3(posHpr[0], posHpr[1], posHpr[2]),
                        Vec3(posHpr[3], posHpr[4], posHpr[5]))
                points = twoPointArray
            return points
        else:
            self.notify.warning(
                'Attempted to get spawn points of a null level!')
            return None
Beispiel #33
0
    def __init__(self):
        BasePhysicsObjectShared.__init__(self)

        self.waterCheckTask = None
        self.needsWaterCheck = False
        self.__lastPos = Point3(0)
Beispiel #34
0
 def update(self):
     # Apply gravity
     gravity = Point3.zero() - self.playernp.getPos()
     gravity.normalize()
     gravity *= G * M * m / (R ** 2)
     self.playernp.node().applyCentralForce(gravity)