Exemple #1
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)
        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()
        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
        self.playHangarMusic()
        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 _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):
        if self.__inited:
            Waiting.show('loadHangarSpaceVehicle', True)
            igrRoomType = game_control.g_instance.igr.getRoomType()
            igrLayout = g_itemsCache.items.inventory.getIgrCustomizationsLayout()
            updatedVehCompactDescr = getCustomizedVehCompDescr(igrLayout, vehicle.invID, igrRoomType, vehicle.descriptor.makeCompactDescr())
            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
        return

    def playHangarMusic(self, restart = False):
        if self.__space is not None:
            self.__space.playHangarMusic(restart)
        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