Ejemplo n.º 1
0
 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'))
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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()
Ejemplo n.º 7
0
 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")
Ejemplo n.º 8
0
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()
Ejemplo n.º 10
0
    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)