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)
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)
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)
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)