class HangarSpace(IHangarSpace): isPremium = property(lambda self: self.__isSpacePremium if self.__spaceInited else self.__delayedIsPremium) gameSession = dependency.descriptor(IGameSessionController) igrCtrl = dependency.descriptor(IIGRController) statsCollector = dependency.descriptor(IStatisticsCollector) def __init__(self): self.__space = None self.__videoCameraController = HangarVideoCameraController() self.__inited = False self.__spaceInited = False self.__isModelLoaded = False self.__isSpacePremium = False self.__igrSpaceType = constants.IGR_TYPE.NONE self.__delayedIsPremium = False self.__delayedForceRefresh = False self.__delayedRefreshCallback = None self.__spaceDestroyedDuringLoad = False self.__lastUpdatedVehicle = None self.onSpaceRefresh = Event.Event() self.onSpaceRefreshCompleted = Event.Event() self.onSpaceCreating = Event.Event() self.onSpaceCreate = Event.Event() self.onSpaceDestroy = Event.Event() self.onSpaceChanged = Event.Event() self.onMouseEnter = Event.Event() self.onMouseExit = Event.Event() self.onMouseDown = Event.Event() self.onMouseUp = Event.Event() self.onHeroTankReady = Event.Event() self.onVehicleChanged = Event.Event() self.onVehicleChangeStarted = Event.Event() self.onSpaceChangedByAction = Event.Event() self.onNotifyCursorOver3dScene = Event.Event() self.__isCursorOver3DScene = False return @property def space(self): return self.__space if self.spaceInited else None @property def spaceID(self): return self.__space.getSpaceID() if self.__space else None @property def inited(self): return self.__inited @property def spaceInited(self): return self.__spaceInited @property def isCursorOver3DScene(self): return self.__isCursorOver3DScene @property def isModelLoaded(self): return self.__isModelLoaded @property def spacePath(self): return None if self.__space is None else self.__space.spacePath @property def visibilityMask(self): return None if self.__space is None else self.__space.visibilityMask def spaceLoading(self): return self.__space.spaceLoading( ) if self.__space is not None else False def getAnchorParams(self, slotId, areaId, regionId): return self.__space.getAnchorParams(slotId, areaId, regionId) def updateAnchorsParams(self, *args): self.__space.updateAnchorsParams(*args) def __onNotifyCursorOver3dScene(self, event): self.__isCursorOver3DScene = event.ctx.get('isOver3dScene', False) self.onNotifyCursorOver3dScene(self.__isCursorOver3DScene) @uniprof.regionDecorator(label='hangar.space.loading', scope='enter') def init(self, isPremium): if self.__space is None: self.__space = ClientHangarSpace( BoundMethodWeakref(self._changeDone)) self.statsCollector.noteHangarLoadingState( HANGAR_LOADING_STATE.START_LOADING_SPACE) self.__videoCameraController.init() self.__spaceDestroyedDuringLoad = False if not self.__spaceInited: LOG_DEBUG('HangarSpace::init') Waiting.show('loadHangarSpace') self.__inited = True self.__isSpacePremium = isPremium self.__igrSpaceType = self.igrCtrl.getRoomType() self.__space.create(isPremium, self.__spaceDone) self.onSpaceCreating() if self.__lastUpdatedVehicle is not None: self.startToUpdateVehicle(self.__lastUpdatedVehicle) self.gameSession.onPremiumNotify += self.onPremiumChanged g_keyEventHandlers.add(self.__handleKeyEvent) g_eventBus.addListener( events.LobbySimpleEvent.NOTIFY_CURSOR_OVER_3DSCENE, self.__onNotifyCursorOver3dScene) return def refreshSpace(self, isPremium, forceRefresh=False): igrType = self.igrCtrl.getRoomType() if self.__isSpacePremium == isPremium and self.__igrSpaceType == igrType and not forceRefresh: return else: self.onSpaceRefresh() if not self.__spaceInited and self.__space.spaceLoading(): LOG_DEBUG( 'HangarSpace::refreshSpace(isPremium={0!r:s}) - is delayed until space load is done' .format(isPremium)) if self.__delayedRefreshCallback is None: self.__delayedRefreshCallback = BigWorld.callback( 0.1, self.__delayedRefresh) self.__delayedIsPremium = isPremium self.__delayedForceRefresh = forceRefresh return LOG_DEBUG('HangarSpace::refreshSpace(isPremium={0!r:s})'.format( isPremium)) self.destroy() self.init(isPremium) self.__isSpacePremium = isPremium self.__igrSpaceType = igrType self.onSpaceRefreshCompleted() return def destroy(self): if self.__inited: g_keyEventHandlers.remove(self.__handleKeyEvent) g_eventBus.removeListener( events.LobbySimpleEvent.NOTIFY_CURSOR_OVER_3DSCENE, self.__onNotifyCursorOver3dScene) self.onSpaceDestroy(self.__spaceInited and not self.__spaceDestroyedDuringLoad) self.__videoCameraController.destroy() self.__isModelLoaded = False self.__isCursorOver3DScene = False if self.__spaceInited: LOG_DEBUG('HangarSpace::destroy') self.__inited = False self.__spaceInited = False self.__space.destroy() elif self.spaceLoading(): LOG_DEBUG('HangarSpace::destroy - delayed until space load done') self.__spaceDestroyedDuringLoad = True self.__space.destroy() self.__inited = False self.__spaceInited = False if self.__delayedRefreshCallback is not None: BigWorld.cancelCallback(self.__delayedRefreshCallback) self.__delayedRefreshCallback = None self.gameSession.onPremiumNotify -= self.onPremiumChanged return @g_execute_after_hangar_space_inited @uniprof.regionDecorator(label='hangar.vehicle.loading', scope='enter') def updateVehicle(self, vehicle, outfit=None): if self.__inited: self.__isModelLoaded = False self.onVehicleChangeStarted() self.statsCollector.noteHangarLoadingState( HANGAR_LOADING_STATE.START_LOADING_VEHICLE) self.__space.recreateVehicle(vehicle.descriptor, vehicle.modelState, outfit=outfit) self.__lastUpdatedVehicle = vehicle else: Waiting.hide('loadHangarSpaceVehicle') def startToUpdateVehicle(self, vehicle, outfit=None): Waiting.show('loadHangarSpaceVehicle', isSingle=True) self.updateVehicle(vehicle, outfit) def updateVehicleDescriptor(self, descr): if self.__inited: self.__space.updateVehicleDescriptor(descr) def __handleKeyEvent(self, event): if event.key == Keys.KEY_LEFTMOUSE: if event.isKeyDown(): self.onMouseDown() else: self.onMouseUp() @g_execute_after_hangar_space_inited def updatePreviewVehicle(self, vehicle, outfit=None): if self.__inited: self.__isModelLoaded = False self.onVehicleChangeStarted() Waiting.show('loadHangarSpaceVehicle', isSingle=True) self.__space.recreateVehicle(vehicle.descriptor, vehicle.modelState, outfit=outfit) self.__lastUpdatedVehicle = vehicle def getVehicleEntity(self): return self.__space.getVehicleEntity() if self.__inited else None def getVehicleEntityAppearance(self): entity = self.getVehicleEntity() return entity.appearance if entity is not None else None def updateVehicleOutfit(self, outfit): if self.__inited: self.__space.updateVehicleCustomization(outfit) def getCentralPointForArea(self, areaId): return self.__space.getCentralPointForArea( areaId) if self.__inited else Math.Vector3(0.0) @g_execute_after_hangar_space_inited def removeVehicle(self): if self.__inited: self.__isModelLoaded = False self.onVehicleChangeStarted() Waiting.show('loadHangarSpaceVehicle', isSingle=True) if self.__space is not None: self.__space.removeVehicle() Waiting.hide('loadHangarSpaceVehicle') self.__isModelLoaded = True self.onVehicleChanged() self.__lastUpdatedVehicle = None return def setVehicleSelectable(self, flag): self.__space.setVehicleSelectable(flag) def onPremiumChanged(self, isPremium, attrs, premiumExpiryTime): premiumHangar = _getHangarPath(True, self.__igrSpaceType) defaultHangar = _getHangarPath(False, self.__igrSpaceType) if premiumHangar != defaultHangar: self.refreshSpace(isPremium) self.__isSpacePremium = isPremium def resetLastUpdatedVehicle(self): self.__lastUpdatedVehicle = None return @uniprof.regionDecorator(label='hangar.space.loading', scope='exit') def __spaceDone(self): self.__spaceInited = True if self.__spaceDestroyedDuringLoad: self.destroy() self.__spaceDestroyedDuringLoad = False self.onSpaceCreate() Waiting.hide('loadHangarSpace') self.statsCollector.noteHangarLoadingState( HANGAR_LOADING_STATE.FINISH_LOADING_SPACE) self.statsCollector.noteHangarLoadingState( HANGAR_LOADING_STATE.HANGAR_READY) stats = self.statsCollector.getStatistics() player = BigWorld.player() if player is not None: LOG_DEBUG_DEV(stats) if stats['system'] and hasattr(player, 'logClientSystem'): BigWorld.player().logClientSystem(stats['system']) if stats['session'] and hasattr(player, 'logClientSessionStats'): BigWorld.player().logClientSessionStats(stats['session']) self.onHeroTankReady() return @uniprof.regionDecorator(label='hangar.vehicle.loading', scope='exit') def _changeDone(self): Waiting.hide('loadHangarSpaceVehicle') self.__isModelLoaded = True self.onVehicleChanged() self.statsCollector.noteHangarLoadingState( HANGAR_LOADING_STATE.FINISH_LOADING_VEHICLE) def __delayedRefresh(self): self.__delayedRefreshCallback = None if not self.__spaceInited: self.__delayedRefreshCallback = BigWorld.callback( 0.1, self.__delayedRefresh) return else: self.refreshSpace(self.__delayedIsPremium, self.__delayedForceRefresh) return
class _HangarSpace(object): isPremium = property(lambda self: (self.__isSpacePremium if self.__spaceInited else self.__delayedIsPremium)) gameSession = dependency.descriptor(IGameSessionController) igrCtrl = dependency.descriptor(IIGRController) statsCollector = dependency.descriptor(IStatisticsCollector) _customizableObjMgr = dependency.descriptor(ICustomizableObjectsManager) def __init__(self): self.__space = ClientHangarSpace() self.__videoCameraController = HangarVideoCameraController() self.__inited = False self.__spaceInited = False self.__isSpacePremium = False self.__igrSpaceType = constants.IGR_TYPE.NONE self.__delayedIsPremium = False self.__delayedForceRefresh = False self.__delayedRefreshCallback = None self.__spaceDestroyedDuringLoad = False self.__lastUpdatedVehicle = None self.onSpaceCreate = Event.Event() self.onSpaceDestroy = Event.Event() self.onSpaceRefreshed = Event.Event() self.onObjectSelected = Event.Event() self.onObjectUnselected = Event.Event() self.onObjectClicked = Event.Event() return @property def space(self): if self.spaceInited: return self.__space else: return None @property def inited(self): return self.__inited @property def spaceInited(self): return self.__spaceInited @staticmethod def __isNY(): player = BigWorld.player() if not hasattr(player, 'newYear'): return False return player.newYear.state == NY_STATE.IN_PROGRESS def spaceLoading(self): return self.__space.spaceLoading() def getSlotPositions(self): return self.__space.getSlotPositions() def init(self, isPremium): self.statsCollector.noteHangarLoadingState(HANGAR_LOADING_STATE.START_LOADING_SPACE) self.__videoCameraController.init() self.__spaceDestroyedDuringLoad = False if not self.__spaceInited: LOG_DEBUG('_HangarSpace::init') Waiting.show('loadHangarSpace') self.__inited = True self.__isSpacePremium = isPremium self.__igrSpaceType = self.igrCtrl.getRoomType() if not self.__isNY() else constants.IGR_TYPE.NONE self.__space.create(isPremium, self.__spaceDone) if self.__lastUpdatedVehicle is not None: self.updateVehicle(self.__lastUpdatedVehicle) self.gameSession.onPremiumNotify += self.onPremiumChanged return def refreshSpace(self, isPremium, forceRefresh = False): igrType = self.igrCtrl.getRoomType() if not self.__isNY() else constants.IGR_TYPE.NONE if self.__isSpacePremium == isPremium and self.__igrSpaceType == igrType and not forceRefresh: return elif not self.__spaceInited and self.__space.spaceLoading(): LOG_DEBUG('_HangarSpace::refreshSpace(isPremium={0!r:s}) - is delayed until space load is done'.format(isPremium)) if self.__delayedRefreshCallback is None: self.__delayedRefreshCallback = BigWorld.callback(0.1, self.__delayedRefresh) self.__delayedIsPremium = isPremium self.__delayedForceRefresh = forceRefresh return else: LOG_DEBUG('_HangarSpace::refreshSpace(isPremium={0!r:s})'.format(isPremium)) if self._customizableObjMgr.state: from gui.prb_control.events_dispatcher import g_eventDispatcher g_eventDispatcher.loadHangar() self.destroy() self.init(isPremium) self.__isSpacePremium = isPremium self.__igrSpaceType = igrType self.onSpaceRefreshed() return def destroy(self): if self.__spaceInited: self.onSpaceDestroy() self.__videoCameraController.destroy() if self.__spaceInited: LOG_DEBUG('_HangarSpace::destroy') self.__inited = False self.__spaceInited = False self.__space.destroy() elif self.spaceLoading(): LOG_DEBUG('_HangarSpace::destroy - delayed until space load done') self.__spaceDestroyedDuringLoad = True self.__space.destroy() self.__inited = False self.__spaceInited = False if self.__delayedRefreshCallback is not None: BigWorld.cancelCallback(self.__delayedRefreshCallback) self.__delayedRefreshCallback = None self.gameSession.onPremiumNotify -= self.onPremiumChanged return def updateVehicle(self, vehicle): if self.__inited: Waiting.show('loadHangarSpaceVehicle', True) self.statsCollector.noteHangarLoadingState(HANGAR_LOADING_STATE.START_LOADING_VEHICLE) self.__space.recreateVehicle(vehicle.descriptor, vehicle.modelState, self.__changeDone) self.__lastUpdatedVehicle = vehicle def updatePreviewVehicle(self, vehicle): if self.__inited: Waiting.show('loadHangarSpaceVehicle', True) self.__space.recreateVehicle(vehicle.descriptor, vehicle.modelState, self.__changeDone) self.__lastUpdatedVehicle = vehicle def getVehicleEntity(self): """ Get BigWorld entity of the current hangar vehicle. """ if self.__inited: return self.__space.getVehicleEntity() def updateVehicleOutfit(self, outfit): """ Updates outfit of the current vehicle. """ if self.__inited: self.__space.updateVehicleCustomization(outfit) def getCentralPointForArea(self, areaId): if self.__inited: return self.__space.getCentralPointForArea(areaId) return Math.Vector3(0.0) def removeVehicle(self): if self.__inited: Waiting.show('loadHangarSpaceVehicle') if self.__space is not None: self.__space.removeVehicle() Waiting.hide('loadHangarSpaceVehicle') self.__lastUpdatedVehicle = None return def setVehicleSelectable(self, flag): """See comment in HangarVehicle.""" self.__space.setVehicleSelectable(flag) def onPremiumChanged(self, isPremium, attrs, premiumExpiryTime): self.refreshSpace(isPremium) def __spaceDone(self): self.__spaceInited = True if self.__spaceDestroyedDuringLoad: self.__spaceDestroyedDuringLoad = False self.destroy() self.onSpaceCreate() Waiting.hide('loadHangarSpace') self.statsCollector.noteHangarLoadingState(HANGAR_LOADING_STATE.FINISH_LOADING_SPACE) self.statsCollector.noteHangarLoadingState(HANGAR_LOADING_STATE.HANGAR_READY, showSummaryNow=True) def __changeDone(self): Waiting.hide('loadHangarSpaceVehicle') self.statsCollector.noteHangarLoadingState(HANGAR_LOADING_STATE.FINISH_LOADING_VEHICLE) def __delayedRefresh(self): self.__delayedRefreshCallback = None if not self.__spaceInited: self.__delayedRefreshCallback = BigWorld.callback(0.1, self.__delayedRefresh) return else: self.refreshSpace(self.__delayedIsPremium, self.__delayedForceRefresh) return def leftButtonClicked(self): self.onObjectClicked()