def announceGenerate(self): DistributedObject.DistributedObject.announceGenerate(self) if not self.nodePath: self.makeNodePath() self.delta = -globalClockDelta.networkToLocalTime( self.initTime, globalClock.getFrameTime(), 16, 100) + globalClock.getFrameTime() if self.type == 0: self.name = self.uniqueName('tnt') elif self.type == 1: self.name = self.uniqueName('birthday-cake') self.nodePath.reparentTo(self.race.geom) if self.ownerId == localAvatar.doId: base.race.thrownGags[0].removeNode() base.race.thrownGags = base.race.thrownGags[1:] self.nodePath.setPos(self.pos[0], self.pos[1], self.pos[2]) else: startPos = base.cr.doId2do[self.ownerId].getPos(render) endPos = Vec3(self.pos[0], self.pos[1], self.pos[2]) throwIt = ProjectileInterval(self.nodePath, startPos=startPos, endPos=endPos, duration=1) throwIt.start() taskMgr.doMethodLater(0.8 - self.delta, self.addCollider, self.uniqueName('addCollider'))
def announceGenerate(self): DistributedObject.DistributedObject.announceGenerate(self) if not self.nodePath: self.makeNodePath() self.delta = -globalClockDelta.networkToLocalTime( self.initTime, globalClock.getFrameTime(), 16, 100) + globalClock.getFrameTime() if self.type == 0: self.name = self.uniqueName('banana') elif self.type == 1: self.name = self.uniqueName('pie') self.nodePath.reparentTo(self.race.geom) if self.ownerId == localAvatar.doId: base.race.thrownGags[0].removeNode() base.race.thrownGags = base.race.thrownGags[1:] self.nodePath.setPos(self.pos[0], self.pos[1], self.pos[2]) else: startPos = base.cr.doId2do[self.ownerId].getPos(render) endPos = Vec3(self.pos[0], self.pos[1], self.pos[2]) throwIt = ProjectileInterval( self.nodePath, startPos=startPos, endPos=endPos, duration=1) throwIt.start() taskMgr.doMethodLater( 0.8 - self.delta, self.addCollider, self.uniqueName('addCollider'))
def playAttack(self, skillId, ammoSkillId, pos = 0, startVel = 0, targetPos = None, flightTime = 0): if not WeaponGlobals.isProjectileSkill(skillId, ammoSkillId): if self.localAvatarUsingWeapon: localAvatar.composeRequestTargetedSkill(skillId, ammoSkillId) return None self.ammoSequence = self.ammoSequence + 1 & 255 buffs = [] if self.av: buffs = self.av.getSkillEffects() ammo = self.getProjectile(ammoSkillId, self.projectileHitEvent, buffs) ammo.setPos(pos) if skillId == EnemySkills.LEFT_BROADSIDE: ammo.setH(render, self.ship.getH(render) + 90) elif skillId == EnemySkills.RIGHT_BROADSIDE: ammo.setH(render, self.ship.getH(render) - 90) collNode = ammo.getCollNode() collNode.reparentTo(render) ammo.setTag('ammoSequence', str(self.ammoSequence)) ammo.setTag('skillId', str(int(skillId))) ammo.setTag('ammoSkillId', str(int(ammoSkillId))) if self.av: ammo.setTag('attackerId', str(self.av.doId)) startPos = pos endPlaneZ = -10 if self.ship: ammo.setTag('shipId', str(self.ship.doId)) self.shotNum += 1 if self.shotNum > 100000: self.shotNum = 0 ammo.setTag('shotNum', str(self.shotNum)) self.baseVel = self.ship.worldVelocity if startPos[2] < endPlaneZ: self.notify.warning('bad startPos Z: %s' % startPos[2]) return None if targetPos is None: startVel += self.baseVel pi = ProjectileInterval(ammo, startPos = startPos, startVel = startVel, endZ = endPlaneZ, gravityMult = 2.0, collNode = collNode) elif self.ship.getNPCship(): pi = ProjectileInterval(ammo, endZ = endPlaneZ, startPos = startPos, wayPoint = targetPos, timeToWayPoint = flightTime, gravityMult = 0.5, collNode = collNode) else: pi = ProjectileInterval(ammo, endZ = endPlaneZ, startPos = startPos, wayPoint = targetPos, timeToWayPoint = flightTime, gravityMult = 1.2, collNode = collNode) if base.cr.cannonballCollisionDebug == 1 or base.cr.cannonballCollisionDebug == 2: addFunc = Func(base.cTrav.addCollider, collNode, ammo.collHandler) delFunc = Func(base.cTrav.removeCollider, collNode) else: addFunc = Wait(0) delFunc = Wait(0) s = Parallel(Sequence(Wait(0.10000000000000001), addFunc), Sequence(pi, Func(ammo.destroy), delFunc)) ammo.setIval(s, start = True)
def announceGenerate(self): DistributedObject.announceGenerate(self) if self.ship is None or self.pirateTarget is None or self.ship.isEmpty() or self.pirateTarget.isEmpty(): self.sendUpdate('shotDown') return self.barrelModel = loader.loadModel('models/ammunition/pir_m_gam_can_powderKeg') self.barrelModel.setScale(2.0) base.playSfx(self.launchSound, node=self.barrelModel, cutoff=2000) self.barrelModel.reparentTo(self.ship) self.barrelModel.setPos(0, 0, 10) self.barrelModel.wrtReparentTo(self.pirateTarget) self.makeCollNode() self.barrelModel.setTag('objType', str(PiratesGlobals.COLL_FLAMING_BARREL)) self.collNode.setPythonTag('barrel', self) self.projectileInterval = Parallel(ProjectileInterval(self.barrelModel, endPos=Point3(0.0, 0.0, 4.5), duration=self.flightDuration, gravityMult=CannonDefenseGlobals.BARREL_GRAVITY), self.barrelModel.hprInterval(self.flightDuration, Vec3(720, 640, 440)), Sequence(Wait(self.flightDuration - 1.2), Func(base.playSfx, self.closeSound, node=self.barrelModel, cutoff=2000), Wait(1.2), Func(self.hitTarget)), name=self.uniqueName('FlamingBarrelFlying')) self.collNode.reparentTo(self.barrelModel) self.projectileInterval.start() base.cTrav.addCollider(self.collNode, self.collHandler) base.cr.activeWorld.flamingBarrels.append(self) self.trailEffect = FireTrail.getEffect() if self.trailEffect: self.trailEffect.reparentTo(self.barrelModel) self.trailEffect.wantGlow = base.options.getSpecialEffectsSetting() >= base.options.SpecialEffectsMedium self.trailEffect.wantBlur = base.options.getSpecialEffectsSetting() >= base.options.SpecialEffectsHigh self.trailEffect.startLoop() return
def updateTarget(self, task=None): if self.target.isEmpty(): return Task.done self.duration *= 0.5 if self.getWorldPos: self.newEndPos = base.cr.activeWorld.getWorldPos(self.target) else: self.newEndPos = self.target.getPos() if self.newEndPos is None: return self.pauseIval(True) self.collNode.node().clearSolids() addFunc = Func(base.cTrav.addCollider, self.collNode, self.collHandler) delFunc = Func(base.cTrav.removeCollider, self.collNode) pi = ProjectileInterval(self, startPos=self.getPos(), endZ=-1000, wayPoint=self.newEndPos, timeToWayPoint=self.duration, collNode=self.collNode) s = Sequence(addFunc, pi, Func(self.destroy), delFunc) self.setIval(s, True) taskMgr.doMethodLater(0.2, self.updateTarget, self.uniqueName('updateTarget')) return Task.done
def sinkFloatingAmmo(self, task=None): self.collNode.node().setIntoCollideMask(BitMask32.allOff()) base.cTrav.removeCollider(self.collNode) self.collNode.node().clearSolids() if self.ammoSkillId in [ InventoryType.DefenseCannonMine, InventoryType.DefenseCannonPowderKeg ]: afterSinkingPos = self.getPos() afterSinkingPos.setZ(-20) pi = ProjectileInterval(self, startPos=self.getPos(), duration=1, endPos=afterSinkingPos) s = Sequence(pi, Func(self.destroy)) self.setIval(s, start=True) else: if self.ammoSkillId == InventoryType.DefenseCannonColdShot: s = Sequence( LerpColorInterval(self.model, 4.0, color=VBase4(0.0, 0.0, 0.0, 0.0), blendType='easeOut'), Func(self.destroy)) s.start() else: self.destroy()
def ATT(self): if self.fired==False: self.fired=True self.AnimON() self.time=self.dist/self.vel self.trajectory = ProjectileInterval(self.missile,startPos =self.weilder,endPos =self.target, duration =self.time) self.trajectory.start() taskMgr.doMethodLater(self.atkspeed,self.setFired,"Fire")
class Attack: def __init__(self,hero,target,atkspeed): self.vel=120 self.missile = loader.loadModel("/c/miss") self.missile.setScale(0.09,0.09,0.09) self.missile.reparentTo(render) self.missile.setPos(25,25,0) self.weilder=0 self.target=0 self.dist=0 self.fired=False self.atkspeed=atkspeed self.Animate=False def ATT(self): if self.fired==False: self.fired=True self.AnimON() self.time=self.dist/self.vel self.trajectory = ProjectileInterval(self.missile,startPos =self.weilder,endPos =self.target, duration =self.time) self.trajectory.start() taskMgr.doMethodLater(self.atkspeed,self.setFired,"Fire") def setFired(self,task): self.fired=False self.AnimOFF() taskMgr.remove("Fire") return task.done def setWeil(self,arg): self.weilder=arg.getPos() def setTarg(self,arg): self.target=arg.getPos() def setDist(self,arg): self.dist=arg def setAtkSpeed(self): self.atkspeed=atkspeed def AnimON(self): return True def AnimOFF(self): return False
def dropOnHim(self, timestamp): self.anvil.setScale(10, 13, 10) self.anvil.setPos(0, 0, 75) self.anvil.reparentTo(self) anvilDrop = ProjectileInterval(self.anvil, startPos=Point3(0, 0, 100), endPos=Point3(0, 0, 0), duration=1) shadowScale = self.dropShadow.scaleInterval(1, self.ShadowScale * 4) fadeOut = LerpFunc(self.anvil.setAlphaScale, fromData=1, toData=0, duration=0.5) flattenMe = self.geom[0].scaleInterval(0.08, Vec3(1, 1, 0.1)) unFlatten = Sequence(self.geom[0].scaleInterval(0.2, Vec3(1, 1, 2)), self.geom[0].scaleInterval(0.1, 1)) anvilSquish = Parallel(Parallel(anvilDrop, shadowScale), Sequence(Wait(0.92), flattenMe)) anvilStretchFade = Sequence(Parallel(self.anvil.scaleInterval(0.2, Vec3(10, 13, 4)), Func(self.lookUp)), fadeOut) self.gagMovie = Sequence(anvilSquish, anvilStretchFade, Wait(0.5), Parallel(unFlatten, Func(self.lookNormal)), Func(self.hideAnvil)) self.gagMovie.start()
def playAttack(self, skillId, ammoSkillId, projectileHitEvent, targetPos = None, wantCollisions = 0, flightTime = None, preciseHit = False, buffs = [], timestamp = None, numShots = 1, shotNum = -1): if base.cr.wantSpecialEffects != 0: self.playFireEffect(ammoSkillId, buffs) if ammoSkillId == InventoryType.CannonGrapeShot: numShots = 7 disperseAmount = (35, 0.0) else: disperseAmount = (40, 20.0) wantCollisions = 1 self.ammoSequence = self.ammoSequence + 1 & 255 if ammoSkillId in (InventoryType.DefenseCannonScatterShot, InventoryType.CannonGrapeShot): scatterOffset = random.uniform(0, 360) for i in range(numShots): ammo = self.getProjectile(ammoSkillId, projectileHitEvent, buffs) collNode = None if self.localAvatarUsingWeapon or wantCollisions: collNode = ammo.getCollNode() collNode.reparentTo(render) if shotNum > -1: self.shotNum = shotNum else: self.shotNum += 1 if self.shotNum > 100000: self.shotNum = 0 ammo.setTag('shotNum', str(self.shotNum)) ammo.setTag('ammoSequence', str(self.ammoSequence)) ammo.setTag('skillId', str(int(skillId))) ammo.setTag('ammoSkillId', str(int(ammoSkillId))) if self.av: ammo.setTag('attackerId', str(self.av.doId)) if hasattr(self, 'fortId'): ammo.setTag('fortId', str(self.fortId)) if hasattr(self, 'ship') and self.ship and hasattr(self.ship, 'doId'): setShipTag = True if setShipTag: ammo.setTag('shipId', str(self.ship.doId)) startPos = self.cannonExitPoint.getPos(render) ammo.setPos(startPos) ammo.setH(self.hNode.getH(render)) ammo.setP(self.pivot.getP(render)) endPlaneZ = -100 if startPos[2] < endPlaneZ: self.notify.warning('bad startPos Z: %s' % startPos[2]) return None m = ammo.getMat(render) curPower = WeaponGlobals.getAttackProjectilePower(skillId, ammoSkillId) * 0.59999999999999998 if targetPos is None: if ammoSkillId in (InventoryType.DefenseCannonScatterShot, InventoryType.CannonGrapeShot) and i > 0: dist = Vec3(math.fabs(random.gauss(0, disperseAmount[0])) + disperseAmount[1], curPower, 0.0) angle = Mat3.rotateMatNormaxis(random.uniform(0, 360 / numShots) + i * 360 / (numShots - 1) + scatterOffset, Vec3.forward()) dist = angle.xform(dist) startVel = m.xformVec(dist) else: startVel = m.xformVec(Vec3(0, curPower, 0)) if self.ship: fvel = self.ship.smoother.getSmoothForwardVelocity() * 0.5 faxis = self.ship.smoother.getForwardAxis() self.baseVel = faxis * fvel startVel += self.baseVel else: startVel = m.xformVec(Vec3(0, 20, 2)) def attachRope(): if ammoSkillId == InventoryType.CannonGrappleHook and self.cannonPost: rope = self.getRope() rope.reparentTo(ammo) rope.setup(3, ((None, Point3(0, 0, 0)), (self.cannonPost, Point3(2, 5, 10)), (self.cannonPost, Point3(2, 0, 0)))) if preciseHit: if flightTime is None: flightTime = CannonGlobals.AI_FIRE_TIME pi = ProjectileInterval(ammo, startPos = startPos, endPos = targetPos, duration = flightTime, collNode = collNode) elif targetPos: if flightTime is None: flightTime = CannonGlobals.getCannonballFlightTime(startPos, targetPos, curPower) pi = ProjectileInterval(ammo, endZ = endPlaneZ, startPos = startPos, wayPoint = targetPos, timeToWayPoint = flightTime, gravityMult = 2.5, collNode = collNode) else: pi = ProjectileInterval(ammo, startPos = startPos, startVel = startVel, endZ = endPlaneZ, gravityMult = 4.0, collNode = collNode) if self.localAvatarUsingWeapon or wantCollisions: if base.cr.cannonballCollisionDebug == 1 or base.cr.cannonballCollisionDebug == 3: addFunc = Func(base.cTrav.addCollider, collNode, ammo.collHandler) delFunc = Func(base.cTrav.removeCollider, collNode) else: addFunc = Wait(0) delFunc = Wait(0) s = Sequence(addFunc, Func(attachRope), pi, Func(ammo.destroy), delFunc) else: s = Sequence(Func(attachRope), pi, Func(ammo.destroy)) ts = 0 if timestamp: ts = globalClockDelta.localElapsedTime(timestamp) ammo.setIval(s, start = True, offset = ts)