Example #1
0
 def _Delete(self, item):
     if item is not None:
         stamp, callback, model, pool = item
         if model is None:
             log.LogError('ExplosionManager::_Delete item has no model')
         if pool is None:
             log.LogError('ExplosionManager::_Delete item has no pool')
         if callback is not None:
             callback(model)
         model.Stop()
         pool.Push(model)
         pool.DecRef(1)
 def _Delete(self, item):
     """
     Calls the CleanupExplosion callback of the item. Returns the model back to it's queue.
     """
     if item is not None:
         stamp, callback, model, pool = item
         if model is None:
             log.LogError('ExplosionManager::_Delete item has no model')
         if pool is None:
             log.LogError('ExplosionManager::_Delete item has no pool')
         if callback is not None:
             callback(model)
         model.Stop()
         model.loadedCallback = None
         pool.Push(model)
         pool.DecRef(1)
Example #3
0
 def Get_FileName_OwnerID_SourceShipID_SourceModuleIDList(self, missileID):
     bp = sm.StartService('michelle').GetBallpark()
     slimItem = bp.GetInvItem(missileID)
     fileName = inventorycommon.typeHelpers.GetGraphicFile(slimItem.typeID)
     ownerID = slimItem.ownerID
     sourceShipID = slimItem.sourceShipID
     sourceAllModulesID = slimItem.launchModules
     if fileName == '':
         log.LogError('missile::LoadModel failed to get red filename for missile typeID ' + str(slimItem.typeID) + ' missileID : ' + str(missileID) + ' sourceShipID: ' + str(sourceShipID))
         return None
     return (fileName,
      ownerID,
      sourceShipID,
      sourceAllModulesID)
Example #4
0
 def Get_FileName_OwnerID_SourceShipID_SourceModuleIDList(self, missileID):
     """
     For a given missileID, return a tuple
     (The graphicFile for the missile object, associated with
     the typeID of the slimItem for this missile, slimItem.ownerID,
     slimItem.sourceShipID, slimItem.launchModules).
     
     All but the first value can be mocked out to return 1 or some other
     ID.
     """
     bp = sm.StartService('michelle').GetBallpark()
     slimItem = bp.GetInvItem(missileID)
     fileName = cfg.invtypes.Get(slimItem.typeID).GraphicFile()
     ownerID = slimItem.ownerID
     sourceShipID = slimItem.sourceShipID
     sourceAllModulesID = slimItem.launchModules
     if fileName == '':
         log.LogError(
             'missile::LoadModel failed to get red filename for missile typeID '
             + str(slimItem.typeID) + ' missileID : ' + str(missileID) +
             ' sourceShipID: ' + str(sourceShipID))
         return None
     return (fileName, ownerID, sourceShipID, sourceAllModulesID)
Example #5
0
    def Prepare(self):
        if not self.enabled:
            return
        if self.collided:
            return
        SpaceObject.Prepare(self)
        if self.model is None:
            return
        if getattr(self, 'sourceModuleIDList', None) is None:
            self.sourceModuleIDList = [0]
        moduleCount = len(self.sourceModuleIDList)
        moduleCount = max(moduleCount, 1)
        timeToTarget = self.EstimateTimeToTarget()
        doSpread = True
        if timeToTarget < 1.6:
            self.DoCollision(self.targetId, 0, 0, 0)
            doSpread = False
        timeToTargetCenter = max(0.5, self.EstimateTimeToTarget(toCenter=True))
        if timeToTarget > 0:
            timeToTarget = (timeToTarget + timeToTargetCenter) * 0.5
        else:
            timeToTarget = timeToTargetCenter * 0.5
        if len(self.model.warheads) != 1:
            log.LogError('There must be one and only one warhead per missile in: ' + str(self.model.name))
            return
        warheadPrime = self.model.warheads[0]
        curvePrime = None
        bindingPrime = None
        curveSetPrime = None
        for cs in self.model.curveSets:
            for bindingToPrime in cs.bindings:
                if bindingToPrime.destinationObject == warheadPrime:
                    bindingToPrime.destinationObject = None
                    bindingPrime = bindingToPrime.CopyTo()
                    curveSetPrime = cs
                    curvePrime = bindingToPrime.sourceObject
                    cs.curves.remove(curvePrime)
                    cs.bindings.remove(bindingToPrime)
                    break

        del self.model.warheads[:]
        audioService = sm.GetService('audio')
        useWarheadBoosterAudio = audioService.GetMissileBoostersUsage()
        useDopplerEmitters = audioService.GetDopplerEmittersUsage()
        for moduleIdx in range(0, moduleCount):
            turret = self._GetModelTurret(moduleIdx)
            if turret is not None:
                turret.StartShooting()
            turretSet = None
            if turret is not None:
                if len(turret.turretSets) > 0:
                    turretSet = turret.turretSets[0]
            firingDelay = 0.0
            if turretSet is not None:
                firingDelay = turretSet.randomFiringDelay
            firingEffect = None
            if turretSet is not None:
                firingEffect = turretSet.firingEffect
            syncWarheadsCount = 1
            if turretSet is not None:
                if turretSet.maxCyclingFirePos == 1:
                    if turretSet.firingEffect is not None:
                        syncWarheadsCount = turretSet.firingEffect.GetPerMuzzleEffectCount()
            whKey = self.missileFileName + ':warhead'
            for i in range(0, syncWarheadsCount):
                wh = blue.recycler.RecycleOrCopy(whKey, warheadPrime)
                if bindingPrime is not None:
                    bd = bindingPrime.CopyTo()
                    bd.destinationObject = wh
                    curve = curvePrime.CopyTo()
                    bd.sourceObject = curve
                    curveSetPrime.curves.append(curve)
                    curveSetPrime.bindings.append(bd)
                startTransform, startSpeed = self._GetModelStartTransformAndSpeed(i, moduleIdx)
                wh.doSpread = doSpread
                muzzleDelay = getattr(firingEffect, 'firingDelay' + str(i + 1), 0.0)
                wh.PrepareLaunch()
                uthread.new(self._StartWarhead, wh, firingDelay + muzzleDelay, i, moduleIdx)
                wh.id = int(moduleIdx * syncWarheadsCount + i)
                if useWarheadBoosterAudio:
                    self._SetupMissileBoosterAudio(wh, useDopplerEmitters)
                self.model.warheads.append(wh)

            if self.targetId:
                targetBall = self.globalsGlob.GetTargetBall(self.targetId)
                if targetBall is not None:
                    self.model.target = targetBall.model
                    self.model.targetRadius = targetBall.radius
            self.model.explosionCallback = self.ExplosionCallback
            self.model.Start(startSpeed, timeToTarget)
            self.totalWarheadCount = syncWarheadsCount * moduleCount

        self.explosionManager.Preload(self.explosionPath, self.totalWarheadCount)