def __init__(self):
     self.__space = ClientHangarSpace(self.__changeDone)
     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.onSpaceCreate = Event.Event()
     self.onSpaceDestroy = Event.Event()
     self.onObjectSelected = Event.Event()
     self.onObjectUnselected = Event.Event()
     self.onObjectClicked = Event.Event()
     self.onObjectReleased = Event.Event()
     self.onHeroTankReady = Event.Event()
     self.onVehicleChanged = Event.Event()
     self.onVehicleChangeStarted = Event.Event()
     self.__isCursorOver3DScene = False
     return
Exemplo n.º 2
0
 def __init__(self):
     self.__space = ClientHangarSpace()
     self.__inited = False
     self.__spaceInited = False
     self.__isSpacePremium = False
     self.__delayedIsPremium = False
     self.__delayedForceRefresh = False
     self.__delayedRefreshCallback = None
     self.__spaceDestroyedDuringLoad = False
     self.__lastUpdatedVehicle = None
     return
Exemplo n.º 3
0
 def __init__(self):
     self.__space = ClientHangarSpace()
     self.__inited = False
     self.__isSpacePremium = False
     self.__spaceLoaded = False
     self.__delayedSpaceData = None
     self.__isVechicleLoading = False
     self.__delayedVechicleData = None
     self.__freeze = False
     self.eOnVehicleStart = Event.Event()
     self.eOnVehicleLoaded = Event.Event()
     self.__dbgHangarFlyingMode = False
     return
Exemplo n.º 4
0
 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.onObjectSelected = Event.Event()
     self.onObjectUnselected = Event.Event()
     self.onObjectClicked = Event.Event()
     return
Exemplo n.º 5
0
 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', overlapsUI=False)
         self.__inited = True
         self.__isSpacePremium = isPremium
         self.__igrSpaceType = self.igrCtrl.getRoomType()
         self.__space.create(isPremium, self.__spaceDone)
         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
Exemplo n.º 6
0
 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()
     from helpers.statistics import g_statistics
     g_statistics.subscribeToHangarSpaceCreate(self.onSpaceCreate)
Exemplo n.º 7
0
class _HangarSpace(object):
    isPremium = property(lambda self: (self.__isSpacePremium if self.__spaceInited else self.__delayedIsPremium))

    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()
        from helpers.statistics import g_statistics
        g_statistics.subscribeToHangarSpaceCreate(self.onSpaceCreate)
        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

    def spaceLoading(self):
        return self.__space.spaceLoading()

    def init(self, isPremium):
        self.__videoCameraController.init()
        if not self.__spaceInited:
            LOG_DEBUG('_HangarSpace::init')
            Waiting.show('loadHangarSpace')
            self.__inited = True
            self.__isSpacePremium = isPremium
            self.__igrSpaceType = game_control.g_instance.igr.getRoomType()
            self.__space.create(isPremium, self.__spaceDone)
            if self.__lastUpdatedVehicle is not None:
                self.updateVehicle(self.__lastUpdatedVehicle)
            game_control.g_instance.gameSession.onPremiumNotify += self.onPremiumChanged
        return

    def refreshSpace(self, isPremium, forceRefresh = False):
        igrType = game_control.g_instance.igr.getRoomType()
        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))
            self.destroy()
            self.init(isPremium)
            self.__isSpacePremium = isPremium
            self.__igrSpaceType = igrType
            return

    def destroy(self):
        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
        if self.__delayedRefreshCallback is not None:
            BigWorld.cancelCallback(self.__delayedRefreshCallback)
            self.__delayedRefreshCallback = None
        game_control.g_instance.gameSession.onPremiumNotify -= self.onPremiumChanged
        return

    def _stripVehCompDescrIfRoaming(self, vehCompDescr):
        if game_control.g_instance.roaming.isInRoaming():
            vehCompDescr = vehicles.stripCustomizationFromVehicleCompactDescr(vehCompDescr, True, True, False)[0]
        return vehicles.VehicleDescr(compactDescr=vehCompDescr)

    def updateVehicle(self, vehicle, historicalBattle = None):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle', True)
            historicalBattleDef = None
            if historicalBattle is not None and historicalBattle.canParticipateWith(vehicle.intCD):
                historicalBattleDef = historicalBattle.getData()
            igrRoomType = game_control.g_instance.igr.getRoomType()
            igrLayout = g_itemsCache.items.inventory.getIgrCustomizationsLayout()
            updatedVehCompactDescr = getCustomizedVehCompDescr(igrLayout, vehicle.invID, igrRoomType, vehicle.descriptor.makeCompactDescr(), historicalBattleDef)
            self.__space.recreateVehicle(self._stripVehCompDescrIfRoaming(updatedVehCompactDescr), vehicle.modelState, self.__changeDone)
            self.__lastUpdatedVehicle = vehicle
        return

    def removeVehicle(self):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle')
            if self.__space is not None:
                self.__space.removeVehicle()
            self.__changeDone()
            self.__lastUpdatedVehicle = None
        return

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

    def __changeDone(self):
        Waiting.hide('loadHangarSpaceVehicle')

    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
Exemplo n.º 8
0
class _HangarSpace(object):
    profiler_vehicle = BigWorld.ProfilerEvent('VehicleLoading')

    def __init__(self):
        self.__space = ClientHangarSpace()
        self.__inited = False
        self.__isSpacePremium = False
        self.__spaceLoaded = False
        self.__delayedSpaceData = None
        self.__isVechicleLoading = False
        self.__delayedVechicleData = None
        self.__freeze = False
        self.eOnVehicleStart = Event.Event()
        self.eOnVehicleLoaded = Event.Event()
        self.__dbgHangarFlyingMode = False
        return

    def init(self, hangarConfig, overrideSpace = None):
        if not self.__inited:
            LOG_TRACE('_HangarSpace::init')
            self.setFreeze(False)
            self.__inited = True
            self.__loadHangarSpace(hangarConfig, overrideSpace)

    def destroy(self):
        self.__inited = False
        self.__isVechicleLoading = False
        self.__delayedSpaceData = None
        self.__delayedVechicleData = None
        self.eOnVehicleStart.clear()
        self.eOnVehicleLoaded.clear()
        if self.__spaceLoaded:
            LOG_TRACE('_HangarSpace::destroy')
            self.__spaceLoaded = False
            self.__space.destroy()
        return

    @property
    def isVSEPlansStarted(self):
        if self.space:
            return self.space.vsePlansStarted
        return False

    def refreshDecals(self):
        modelManipulator = self.space.getModelManipulator() if self.space else None
        if modelManipulator is not None:
            modelManipulator.surface.refreshClanEmblem()
        return

    def refreshSpace(self, hangarConfig, overrideSpace = None):
        LOG_TRACE('_HangarSpace::refreshSpace', hangarConfig, self.__inited, self.__freeze, self.__hangarConfig)
        if self.__inited and not self.__freeze:
            if self.__hangarConfig != hangarConfig or overrideSpace:
                self.__loadHangarSpace(hangarConfig, overrideSpace)

    @property
    def isAircraftLoaded(self):
        return self.space is not None and self.space.getModelManipulator() is not None and not self.__inLoading()

    def refreshVehicle(self, vehicleInfo):
        if self.__inited and not self.__freeze:
            if self.__inLoading():
                self.__delayedVechicleData = (vehicleInfo,)
            elif vehicleInfo:
                vehicleInfo.isVehicleLoaded = False
                self.__isVechicleLoading = True
                _HangarSpace.profiler_vehicle.start()
                self.eOnVehicleStart()
                self.__space.recreateVehicle(vehicleInfo, self.__vechicleDone, self.__dbgHangarFlyingMode)
            else:
                self.__space.removeVehicle()

    @property
    def space(self):
        if self.__spaceLoaded:
            return self.__space
        else:
            return None

    def setFreeze(self, freeze):
        LOG_TRACE('_HangarSpace::setFreeze', freeze)
        self.__freeze = freeze

    def refreshSpaceSound(self, category, value):
        if category == 'music':
            self.__space.refreshSpaceSound(value)

    def __vechicleDone(self):
        LOG_TRACE('_HangarSpace::__vechicleDone')
        self.__isVechicleLoading = False
        self.__checkDelayedData()
        self.eOnVehicleLoaded()
        _HangarSpace.profiler_vehicle.end()

    def __inLoading(self):
        return self.__space.spaceLoading() or self.__isVechicleLoading

    def __loadHangarSpace(self, hangarConfig, overrideSpace = None):
        LOG_TRACE('_HangarSpace::__loadHangarSpace', self.__space.spaceLoading(), self.__isVechicleLoading)
        if self.__inLoading():
            LOG_TRACE('_HangarSpace::__loadHangarSpace(hangarConfig=' + str(hangarConfig) + ') - is delayed until space load is done')
            self.__delayedSpaceData = (hangarConfig, overrideSpace)
        else:
            camTargetShifted = False
            if self.__spaceLoaded:
                camTargetShifted = self.__space.hangarCamera.getStateObject().targetShifted
                self.__spaceLoaded = False
                self.__space.destroy()
            waitingID = Waiting.show(HANGAR_LOBBY_WAITING_SCREEN_MESSAGE, WaitingFlags.WORLD_DRAW_DISABLE | WaitingFlags.LOADING_FPS_MODE)
            self.__hangarConfig = hangarConfig
            self.__space.create(hangarConfig, partial(self.__spaceDone, waitingID), overrideSpace=overrideSpace)
            self.__space.hangarCamera.getStateObject().setCameraTargetShift(camTargetShifted)

    def __spaceDone(self, waitingID):
        LOG_TRACE('_HangarSpace::__spaceDone', self.__inited)
        self.__spaceLoaded = True
        self.__space.onSpaceLoaded()
        if not self.__inited:
            self.destroy()
        else:
            self.__checkDelayedData()
        GlobalEvents.onHangarLoaded()
        Waiting.hide(waitingID)

    def __checkDelayedData(self):
        LOG_TRACE('_HangarSpace::__checkDelayedData', self.__inited, self.__delayedSpaceData, self.__delayedVechicleData)
        if self.__inited:
            if self.__delayedSpaceData is not None:
                self.__loadHangarSpace(*self.__delayedSpaceData)
                self.__delayedSpaceData = None
            elif self.__delayedVechicleData:
                vechicleData = self.__delayedVechicleData[0]
                self.__delayedVechicleData = None
                self.refreshVehicle(vechicleData)
        return

    def dbgChangeSpace(self, name):
        if self.__inited and not self.__freeze:
            self.__loadHangarSpace(self.__hangarConfig, overrideSpace=name)
            self.dbgHangarFlyingMode(self.__dbgHangarFlyingMode, forceReload=True)

    def dbgHangarFlyingMode(self, enable = True, forceReload = False):
        if self.__dbgHangarFlyingMode == enable and not forceReload:
            return
        self.__dbgHangarFlyingMode = enable
        from BWPersonality import g_lobbyCarouselHelper
        vehicleInfo = g_lobbyCarouselHelper.getCarouselAirplaneSelected()
        if self.__inited and not self.__freeze:
            self.refreshVehicle(vehicleInfo)

    def dbgSwitchCameraView(self, camView):
        if self.__inited and not self.__freeze:
            self.__space.dbgSwitchCameraView(camView)

    def dbgRotateTurrets(self, command):
        if self.__inited and not self.__freeze:
            self.__space.dbgRotateTurrets(command)

    def dbgShowBBoxes(self, show):
        self.__space.dbgShowBBoxes(show)

    def switchHangarPremiumType(self):
        self.refreshSpace('premium' if self.__hangarConfig == 'basic' else 'basic')
Exemplo n.º 9
0
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)

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

    def spaceLoading(self):
        return self.__space.spaceLoading()

    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()
            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 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))
            self.destroy()
            self.init(isPremium)
            self.__isSpacePremium = isPremium
            self.__igrSpaceType = igrType
            return

    def destroy(self):
        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.getCustomizedDescriptor(),
                                         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 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 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()
Exemplo n.º 10
0
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
Exemplo n.º 11
0
class _HangarSpace(object):
    isPremium = property(lambda self:
                         (self.__isSpacePremium
                          if self.__spaceInited else self.__delayedIsPremium))

    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.onObjectSelected = Event.Event()
        self.onObjectUnselected = Event.Event()
        from helpers.statistics import g_statistics
        g_statistics.subscribeToHangarSpaceCreate(self.onSpaceCreate)

    @property
    def space(self):
        if self.spaceInited:
            return self.__space

    @property
    def inited(self):
        return self.__inited

    @property
    def spaceInited(self):
        return self.__spaceInited

    def spaceLoading(self):
        return self.__space.spaceLoading()

    def init(self, isPremium):
        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 = game_control.g_instance.igr.getRoomType()
            self.__space.create(isPremium, self.__spaceDone)
            if self.__lastUpdatedVehicle is not None:
                self.updateVehicle(self.__lastUpdatedVehicle)
            game_control.g_instance.gameSession.onPremiumNotify += self.onPremiumChanged

    def refreshSpace(self, isPremium, forceRefresh=False):
        igrType = game_control.g_instance.igr.getRoomType()
        if self.__isSpacePremium == isPremium and self.__igrSpaceType == igrType and not forceRefresh:
            return
        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

    def destroy(self):
        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
        game_control.g_instance.gameSession.onPremiumNotify -= self.onPremiumChanged

    def _stripVehCompDescrIfRoaming(self, vehCompDescr):
        serverSettings = g_lobbyContext.getServerSettings()
        if serverSettings is not None and serverSettings.roaming.isInRoaming():
            vehCompDescr = vehicles.stripCustomizationFromVehicleCompactDescr(
                vehCompDescr, True, True, False)[0]
        return vehicles.VehicleDescr(compactDescr=vehCompDescr)

    def updateVehicle(self, vehicle, historicalBattle=None):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle', True)
            historicalBattleDef = None
            if historicalBattle is not None and historicalBattle.canParticipateWith(
                    vehicle.intCD):
                historicalBattleDef = historicalBattle.getData()
            igrRoomType = game_control.g_instance.igr.getRoomType()
            igrLayout = g_itemsCache.items.inventory.getIgrCustomizationsLayout(
            )
            updatedVehCompactDescr = getCustomizedVehCompDescr(
                igrLayout, vehicle.invID, igrRoomType,
                vehicle.descriptor.makeCompactDescr(), historicalBattleDef)
            self.__space.recreateVehicle(
                self._stripVehCompDescrIfRoaming(updatedVehCompactDescr),
                vehicle.modelState, self.__changeDone)
            self.__lastUpdatedVehicle = vehicle

    def removeVehicle(self):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle')
            if self.__space is not None:
                self.__space.removeVehicle()
            self.__changeDone()
            self.__lastUpdatedVehicle = None

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

    def __changeDone(self):
        Waiting.hide('loadHangarSpaceVehicle')

    def __delayedRefresh(self):
        self.__delayedRefreshCallback = None
        if not self.__spaceInited:
            self.__delayedRefreshCallback = BigWorld.callback(
                0.1, self.__delayedRefresh)
            return
        self.refreshSpace(self.__delayedIsPremium, self.__delayedForceRefresh)
Exemplo n.º 12
0
class _HangarSpace(object):
    isPremium = property(lambda self: (self.__isSpacePremium if self.__spaceInited else self.__delayedIsPremium))

    def __init__(self):
        self.__space = ClientHangarSpace()
        self.__inited = False
        self.__spaceInited = False
        self.__isSpacePremium = False
        self.__delayedIsPremium = False
        self.__delayedForceRefresh = False
        self.__delayedRefreshCallback = None
        self.__spaceDestroyedDuringLoad = False
        self.__lastUpdatedVehicle = None
        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

    def spaceLoading(self):
        return self.__space.spaceLoading()

    def init(self, isPremium):
        if not self.__spaceInited:
            LOG_DEBUG('_HangarSpace::init')
            Waiting.show('loadHangarSpace')
            self.__inited = True
            self.__isSpacePremium = isPremium
            self.__space.create(isPremium, self.__spaceDone)
            if self.__lastUpdatedVehicle is not None:
                self.updateVehicle(self.__lastUpdatedVehicle)
        return

    def refreshSpace(self, isPremium, forceRefresh = False):
        if not self.__spaceInited:
            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.__isSpacePremium != isPremium or forceRefresh:
                self.destroy()
                self.init(isPremium)
            self.__isSpacePremium = isPremium
            return

    def destroy(self):
        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
        if self.__delayedRefreshCallback is not None:
            BigWorld.cancelCallback(self.__delayedRefreshCallback)
            self.__delayedRefreshCallback = None
        return

    def _stripVehCompDescrIfRoaming(self, vehCompDescr):
        if game_control.g_instance.roaming.isInRoaming():
            vehCompDescr = vehicles.stripCustomizationFromVehicleCompactDescr(vehCompDescr, True, True, False)[0]
        return vehicles.VehicleDescr(compactDescr=vehCompDescr)

    def updateVehicle(self, vehicle):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle', True)
            self.__space.recreateVehicle(self._stripVehCompDescrIfRoaming(vehicle.descriptor.makeCompactDescr()), vehicle.modelState, self.__changeDone)
            self.__lastUpdatedVehicle = vehicle

    def removeVehicle(self):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle')
            self.__space.removeVehicle()
            self.__changeDone()
            self.__lastUpdatedVehicle = None
        return

    def __spaceDone(self):
        self.__spaceInited = True
        if self.__spaceDestroyedDuringLoad:
            self.__spaceDestroyedDuringLoad = False
            self.destroy()
        Waiting.hide('loadHangarSpace')

    def __changeDone(self):
        Waiting.hide('loadHangarSpaceVehicle')

    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
Exemplo n.º 13
0
class _HangarSpace(object):
    isPremium = property(lambda self: (self.__isSpacePremium if self.__spaceInited else self.__delayedIsPremium))

    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.onObjectSelected = Event.Event()
        self.onObjectUnselected = Event.Event()
        self.onObjectClicked = Event.Event()
        g_statistics.subscribeToHangarSpaceCreate(self.onSpaceCreate)
        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

    def spaceLoading(self):
        return self.__space.spaceLoading()

    def init(self, isPremium):
        g_statistics.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 = game_control.g_instance.igr.getRoomType()
            self.__space.create(isPremium, self.__spaceDone)
            if self.__lastUpdatedVehicle is not None:
                self.updateVehicle(self.__lastUpdatedVehicle)
            game_control.g_instance.gameSession.onPremiumNotify += self.onPremiumChanged
        return

    def refreshSpace(self, isPremium, forceRefresh = False):
        igrType = game_control.g_instance.igr.getRoomType()
        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))
            self.destroy()
            self.init(isPremium)
            self.__isSpacePremium = isPremium
            self.__igrSpaceType = igrType
            return

    def destroy(self):
        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
        game_control.g_instance.gameSession.onPremiumNotify -= self.onPremiumChanged
        return

    def updateVehicle(self, vehicle):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle', True)
            g_statistics.noteHangarLoadingState(HANGAR_LOADING_STATE.START_LOADING_VEHICLE)
            self.__space.recreateVehicle(vehicle.getCustomizedDescriptor(), 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 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 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')
        g_statistics.noteHangarLoadingState(HANGAR_LOADING_STATE.FINISH_LOADING_SPACE)
        g_statistics.noteHangarLoadingState(HANGAR_LOADING_STATE.HANGAR_READY, showSummaryNow=True)

    def __changeDone(self):
        Waiting.hide('loadHangarSpaceVehicle')
        g_statistics.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()
Exemplo n.º 14
0
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()