def setupCollisions(self): sphere = CollisionSphere(0, 0, 0, 0.1) collnode = CollisionNode('bulletCollNode-' + str(id(self))) collnode.addSolid(sphere) self.collnp = self.bullet.attachNewNode(collnode) self.collnp.setCollideMask(BitMask32(0)) self.collnp.node().setFromCollideMask(CIGlobals.WallBitmask | CIGlobals.FloorBitmask | CIGlobals.EventBitmask) event = CollisionHandlerEvent() event.setInPattern('%fn-into') event.setOutPattern('%fn-out') base.cTrav.addCollider(self.collnp, event)
def buildCollisions(self): TrapGag.buildCollisions(self) gagSph = CollisionSphere(0, 0, 0, 1) gagSph.setTangible(0) gagNode = CollisionNode('gagSensor') gagNode.addSolid(gagSph) gagNP = self.gag.attachNewNode(gagNode) gagNP.setScale(0.75, 0.8, 0.75) gagNP.setPos(0.0, 0.1, 0.5) gagNP.setCollideMask(BitMask32.bit(0)) gagNP.node().setFromCollideMask(CIGlobals.FloorBitmask) event = CollisionHandlerEvent() event.setInPattern('%fn-into') event.setOutPattern('%fn-out') base.cTrav.addCollider(gagNP, event)
def buildCollisions(self): TrapGag.buildCollisions(self) gagSph = CollisionSphere(0, 0, 0, 1) gagSph.setTangible(0) gagNode = CollisionNode('gagSensor') gagNode.addSolid(gagSph) gagNP = self.entity.attachNewNode(gagNode) gagNP.setScale(0.75, 0.8, 0.75) gagNP.setPos(0.0, 0.1, 0.5) gagNP.setCollideMask(BitMask32.bit(0)) gagNP.node().setFromCollideMask(CIGlobals.FloorBitmask) event = CollisionHandlerEvent() event.setInPattern('%fn-into') event.setOutPattern('%fn-out') base.cTrav.addCollider(gagNP, event) self.avatar.acceptOnce('gagSensor-into', self.onCollision)
class BounceCheckAttack(ThrowAttack): notify = directNotify.newCategory('BounceCheckAttack') MaxBounces = 3 WeaponHitDistance = 0.5 def __init__(self, attacksClass, suit): ThrowAttack.__init__(self, attacksClass, suit) self.attack = 'bouncecheck' self.bounceSound = None self.numBounces = 0 return def __pollCheckDistance(self, task): if base.localAvatar.getDistance(self.weapon) <= self.WeaponHitDistance: self.handleWeaponCollision(None) return Task.done else: return Task.cont return def loadAttack(self): self.weapon = loader.loadModel('phase_5/models/props/bounced-check.bam') self.weapon.setScale(10) self.weapon.setTwoSided(1) self.bounceSound = base.audio3d.loadSfx('phase_5/audio/sfx/SA_bounce_check_bounce.mp3') base.audio3d.attachSoundToObject(self.bounceSound, self.suit) cSphere = CollisionSphere(0, 0, 0, 0.1) cSphere.setTangible(0) if hasattr(self, 'uniqueName'): name = self.uniqueName('bounced_check_collision') else: name = 'bounced_check_collision' cNode = CollisionNode(name) cNode.addSolid(cSphere) cNode.setFromCollideMask(CIGlobals.FloorBitmask) cNP = self.weapon.attachNewNode(cNode) cNP.setCollideMask(BitMask32(0)) self.event = CollisionHandlerEvent() self.event.setInPattern('%fn-into') self.event.setOutPattern('%fn-out') base.cTrav.addCollider(cNP, self.event) self.wsnp = cNP self.wsnp.show() def doAttack(self, ts = 0): ThrowAttack.doAttack(self, ts) self.loadAttack() if hasattr(self, 'uniqueName'): name = self.uniqueName('doBounceCheckAttack') else: name = 'doBounceCheckAttack' self.suitTrack = Sequence(name=name) self.weapon.reparentTo(self.suit.find('**/joint_Rhold')) if self.suit.type == 'C': self.suitTrack.append(Wait(2.3)) else: self.suitTrack.append(Wait(3)) self.suit.play('throw-paper') self.suitTrack.append(Func(self.throwObject)) self.suitTrack.start(ts) def throwObject(self): ThrowAttack.throwObject(self) taskMgr.add(self.__pollCheckDistance, 'pollCheckDistance') self.__doThrow(0) def __doThrow(self, alreadyThrown): self.weapon.setScale(1) pathNP = NodePath('throwPath') if not alreadyThrown: pathNP.reparentTo(self.suit) else: pathNP.reparentTo(self.weapon) pathNP.setScale(render, 1.0) pathNP.setPos(0, 30, -100) pathNP.setHpr(90, -90, 90) print pathNP.getPos(base.render) if self.throwTrajectory: self.throwTrajectory.pause() self.throwTrajectory = None if alreadyThrown: startPos = self.weapon.getPos(base.render) gravity = 0.7 else: gravity = 0.7 startPos = self.suit.find('**/joint_Rhold').getPos(base.render) self.throwTrajectory = ProjectileInterval(self.weapon, startPos=startPos, endPos=pathNP.getPos(base.render), gravityMult=gravity, duration=3.0) self.throwTrajectory.start() self.weapon.setScale(10) self.weapon.reparentTo(render) self.weapon.setHpr(pathNP.getHpr(render)) self.weapon_state = 'released' self.acceptOnce(self.wsnp.node().getName() + '-into', self.__handleHitFloor) return def __handleHitFloor(self, entry): self.numBounces += 1 if self.numBounces >= self.MaxBounces: self.cleanup() return base.playSfx(self.bounceSound) self.__doThrow(1) def cleanup(self): taskMgr.remove('pollCheckDistance') self.ignore(self.wsnp.node().getName() + '-into') self.bounceSound = None ThrowAttack.cleanup(self) return
class BounceCheckAttack(ThrowAttack): notify = directNotify.newCategory('BounceCheckAttack') MaxBounces = 3 WeaponHitDistance = 0.5 def __init__(self, attacksClass, suit): ThrowAttack.__init__(self, attacksClass, suit) self.attack = 'bouncecheck' self.bounceSound = None self.numBounces = 0 return def __pollCheckDistance(self, task): if base.localAvatar.getDistance(self.weapon) <= self.WeaponHitDistance: self.handleWeaponCollision(None) return Task.done return Task.cont return def loadAttack(self): self.weapon = loader.loadModel('phase_5/models/props/bounced-check.bam') self.weapon.setScale(10) self.weapon.setTwoSided(1) self.bounceSound = base.audio3d.loadSfx('phase_5/audio/sfx/SA_bounce_check_bounce.ogg') base.audio3d.attachSoundToObject(self.bounceSound, self.suit) cSphere = CollisionSphere(0, 0, 0, 0.1) cSphere.setTangible(0) if hasattr(self, 'uniqueName'): name = self.uniqueName('bounced_check_collision') else: name = 'bounced_check_collision' cNode = CollisionNode(name) cNode.addSolid(cSphere) cNode.setFromCollideMask(CIGlobals.FloorBitmask) cNP = self.weapon.attachNewNode(cNode) cNP.setCollideMask(BitMask32(0)) self.event = CollisionHandlerEvent() self.event.setInPattern('%fn-into') self.event.setOutPattern('%fn-out') base.cTrav.addCollider(cNP, self.event) self.wsnp = cNP self.wsnp.show() def doAttack(self, ts=0): ThrowAttack.doAttack(self, ts) self.loadAttack() if hasattr(self, 'uniqueName'): name = self.uniqueName('doBounceCheckAttack') else: name = 'doBounceCheckAttack' self.suitTrack = Sequence(name=name) self.weapon.reparentTo(self.suit.find('**/joint_Rhold')) if self.suit.type == 'C': self.suitTrack.append(Wait(2.3)) else: self.suitTrack.append(Wait(3)) self.suit.play('throw-paper') self.suitTrack.append(Func(self.throwObject)) self.suitTrack.start(ts) def throwObject(self): ThrowAttack.throwObject(self) taskMgr.add(self.__pollCheckDistance, 'pollCheckDistance') self.__doThrow(0) def __doThrow(self, alreadyThrown): self.weapon.setScale(1) pathNP = NodePath('throwPath') if not alreadyThrown: pathNP.reparentTo(self.suit) else: pathNP.reparentTo(self.weapon) pathNP.setScale(render, 1.0) pathNP.setPos(0, 30, -100) pathNP.setHpr(90, -90, 90) print pathNP.getPos(base.render) if self.throwTrajectory: self.throwTrajectory.pause() self.throwTrajectory = None if alreadyThrown: startPos = self.weapon.getPos(base.render) gravity = 0.7 else: gravity = 0.7 startPos = self.suit.find('**/joint_Rhold').getPos(base.render) self.throwTrajectory = ProjectileInterval(self.weapon, startPos=startPos, endPos=pathNP.getPos(base.render), gravityMult=gravity, duration=3.0) self.throwTrajectory.start() self.weapon.setScale(10) self.weapon.reparentTo(render) self.weapon.setHpr(pathNP.getHpr(render)) self.weapon_state = 'released' self.acceptOnce(self.wsnp.node().getName() + '-into', self.__handleHitFloor) return def __handleHitFloor(self, entry): self.numBounces += 1 if self.numBounces >= self.MaxBounces: self.cleanup() return base.playSfx(self.bounceSound) self.__doThrow(1) def cleanup(self): taskMgr.remove('pollCheckDistance') self.ignore(self.wsnp.node().getName() + '-into') self.bounceSound = None ThrowAttack.cleanup(self) return
class CameraShyFirstPerson(FirstPerson): toonInFocusColor = VBase4(0.25, 1.0, 0.25, 1.0) toonOutOfFocusColor = VBase4(1.0, 1.0, 1.0, 1.0) fullyChargedState = 5 def __init__(self, mg): self.mg = mg self.cameraFocus = None self.batteryFrame = None self.batteryBg = None self.batteryBar = None self.rechargeSound = None self.fullyChargedSound = None self.hasToonInFocus = False self.toonToTakePicOf = None self.cameraRechargeState = None self.cameraRechargingLabel = None self.cameraFlashSeq = None self.camFSM = ClassicFSM('CameraFSM', [State('off', self.enterOff, self.exitOff), State('ready', self.enterCameraReady, self.exitCameraReady), State('recharge', self.enterCameraRecharge, self.exitCameraRecharge)], 'off', 'off') self.camFSM.enterInitialState() FirstPerson.__init__(self) return def movementTask(self, task): if not inputState.isSet('jump') and not base.localAvatar.walkControls.isAirborne and inputState.isSet('forward') or inputState.isSet('reverse') or inputState.isSet('slideLeft') or inputState.isSet('slideRight'): if base.localAvatar.getAnimState() != 'run': base.localAvatar.setAnimState('run') base.localAvatar.playMovementSfx('run') self.mg.sendUpdate('runningAvatar', [base.localAvatar.doId]) elif inputState.isSet('jump') or base.localAvatar.walkControls.isAirborne: if base.localAvatar.getAnimState() != 'jump': base.localAvatar.setAnimState('jump') base.localAvatar.playMovementSfx(None) self.mg.sendUpdate('jumpingAvatar', [base.localAvatar.doId]) elif base.localAvatar.getAnimState() != 'neutral': base.localAvatar.setAnimState('neutral') base.localAvatar.playMovementSfx(None) self.mg.sendUpdate('standingAvatar', [base.localAvatar.doId]) return task.cont def enterOff(self): pass def exitOff(self): pass def enterCameraReady(self): self.acceptOnce('mouse1', self.__mouse1Pressed) def stopCameraFlash(self): if self.cameraFlashSeq: self.cameraFlashSeq.finish() self.cameraFlashSeq = None return def __mouse1Pressed(self): self.cameraFlashSeq = Sequence(Func(base.transitions.setFadeColor, 1, 1, 1), Func(base.transitions.fadeOut, 0.1), Wait(0.1), Func(base.transitions.fadeIn, 0.1), Wait(0.1), Func(base.transitions.setFadeColor, 0, 0, 0)) self.cameraFlashSeq.start() self.mg.sendUpdate('remoteAvatarTakePicture', [base.localAvatar.doId]) self.mg.myRemoteAvatar.takePicture() if self.hasToonInFocus and self.toonToTakePicOf: self.mg.sendUpdate('tookPictureOfToon', [self.toonToTakePicOf.doId]) self.camFSM.request('recharge') def exitCameraReady(self): self.ignore('mouse1') def enterCameraRecharge(self): self.batteryBar.update(0) taskMgr.add(self.__rechargeNextState, 'rechargeCamera') def __rechargeNextState(self, task): if self.cameraRechargeState == None: self.cameraRechargeState = -1 self.cameraRechargeState += 1 if self.cameraRechargeState > 0: base.playSfx(self.rechargeSound) self.batteryBar.update(self.cameraRechargeState) if self.cameraRechargeState == self.fullyChargedState: base.playSfx(self.fullyChargedSound) self.camFSM.request('ready') return task.done else: task.delayTime = 1.0 return task.again def exitCameraRecharge(self): taskMgr.remove('rechargeCamera') self.cameraRechargeState = None return def __handleRayInto(self, entry): intoNP = entry.getIntoNodePath() toonNP = intoNP.getParent() for key in base.cr.doId2do.keys(): obj = base.cr.doId2do[key] if obj.__class__.__name__ == 'DistributedToon': if obj.getKey() == toonNP.getKey(): self.__handleToonInFocus(obj) def __handleRayOut(self, entry): intoNP = entry.getIntoNodePath() toonNP = intoNP.getParent() for key in base.cr.doId2do.keys(): obj = base.cr.doId2do[key] if obj.__class__.__name__ == 'DistributedToon': if obj.getKey() == toonNP.getKey(): self.toonToTakePicOf = None self.hasToonInFocus = False if self.cameraFocus.getColorScale() == self.toonInFocusColor: self.cameraFocus.setColorScale(self.toonOutOfFocusColor) return def __handleToonInFocus(self, toon): if not self.hasToonInFocus or self.toonToTakePicOf is not None or self.toonToTakePicOf.doId != toon.doId: self.toonToTakePicOf = toon self.hasToonInFocus = True self.cameraFocus.setColorScale(self.toonInFocusColor) return def start(self): self.fullyChargedSound = base.loadSfx('phase_4/audio/sfx/MG_pairing_match.mp3') self.rechargeSound = base.loadSfx('phase_4/audio/sfx/MG_sfx_travel_game_blue_arrow.mp3') self.batteryFrame = DirectFrame(parent=base.a2dBottomRight, pos=(-0.2, 0, 0.1), scale=(0.8, 0, 1)) self.batteryBg = OnscreenImage(image='phase_4/maps/battery_charge_frame.png', parent=self.batteryFrame) self.batteryBg.setTransparency(1) self.batteryBg.setX(0.03) self.batteryBg.setScale(0.17, 0, 0.05) self.batteryBar = DirectWaitBar(value=0, range=5, barColor=(1, 1, 1, 1), relief=None, scale=(0.12, 0.0, 0.3), parent=self.batteryFrame) self.cameraFocus = loader.loadModel('phase_4/models/minigames/photo_game_viewfinder.bam') self.cameraFocus.reparentTo(base.aspect2d) self.focusCollHandler = CollisionHandlerEvent() self.focusCollHandler.setInPattern('%fn-into') self.focusCollHandler.setOutPattern('%fn-out') self.focusCollNode = CollisionNode('mouseRay') self.focusCollNP = base.camera.attachNewNode(self.focusCollNode) self.focusCollNode.setCollideMask(BitMask32(0)) self.focusCollNode.setFromCollideMask(CIGlobals.WallBitmask) self.focusRay = CollisionRay() self.focusRay.setFromLens(base.camNode, 0.0, 0.0) self.focusCollNode.addSolid(self.focusRay) base.cTrav.addCollider(self.focusCollNP, self.focusCollHandler) base.localAvatar.walkControls.setWalkSpeed(CIGlobals.ToonForwardSpeed, 0.0, CIGlobals.ToonReverseSpeed, CIGlobals.ToonRotateSpeed) FirstPerson.start(self) return def reallyStart(self): self.accept('mouseRay-into', self.__handleRayInto) self.accept('mouseRay-out', self.__handleRayOut) self.camFSM.request('recharge') taskMgr.add(self.movementTask, 'movementTask') FirstPerson.reallyStart(self) def end(self): self.camFSM.request('off') taskMgr.remove('movementTask') self.ignore('mouseRay-into') self.ignore('mouseRay-out') FirstPerson.end(self) def reallyEnd(self): self.batteryBar.destroy() self.batteryBar = None self.batteryBg.destroy() self.batteryBg = None self.batteryFrame.destroy() self.batteryFrame = None self.cameraFocus.removeNode() self.cameraFocus = None self.focusCollHandler = None self.focusCollNode = None self.focusCollNP.removeNode() self.focusCollNP = None self.focusRay = None self.hasToonInFocus = None self.toonToTakePicOf = None self.fullyChargedSound = None self.rechargeSound = None self.stopCameraFlash() FirstPerson.reallyEnd(self) base.localAvatar.walkControls.setWalkSpeed(CIGlobals.ToonForwardSpeed, CIGlobals.ToonJumpForce, CIGlobals.ToonReverseSpeed, CIGlobals.ToonRotateSpeed) return def cleanup(self): self.camFSM.requestFinalState() self.camFSM = None FirstPerson.cleanup(self) return