Пример #1
0
 def readCurrentSettings(self, quiet=True):
     super(ConfigInterface, self).readCurrentSettings()
     self.settings = loadJson(self.ID, 'settings', self.settings, self.configPath)
     self.skinsCache.update(loadJson(self.ID, 'skinsCache', self.skinsCache, self.configPath))
     self.skinsData['priorities'] = loadJson(self.ID, 'skinsPriority', self.skinsData['priorities'], self.configPath)
     if self.data['isDebug']:
         print self.ID + ': loading skin configs:'
     skinDirSect = ResMgr.openSection('vehicles/skins/textures/')
     for sname in () if skinDirSect is None else remDups(skinDirSect.keys()):
         confDict = self.settings.setdefault(sname, self.defaultSkinConfig)
         self.skinsData['models'][sname] = pRecord = {'name': sname, 'whitelist': set()}
         vehiclesDirSect = skinDirSect[sname]['vehicles']
         for curNation in [] if vehiclesDirSect is None else remDups(vehiclesDirSect.keys()):
             nationDirSect = vehiclesDirSect[curNation]
             for vehicleName in [] if nationDirSect is None else remDups(nationDirSect.keys()):
                 vehDirSect = nationDirSect[vehicleName]
                 sections = {'default': vehDirSect}
                 modelsSetsSect = vehDirSect['_skins']
                 if modelsSetsSect is not None:
                     for modelsSet, modelsSetSect in modelsSetsSect.items():
                         sections[modelsSet] = modelsSetSect
                 for modelsSet, modelsSetSect in sections.items():
                     tracksDirSect = modelsSetSect['tracks']
                     if not any(texName.endswith('.dds') for texName in (
                             ([] if modelsSetSect is None else remDups(modelsSetSect.keys())) +
                             ([] if tracksDirSect is None else remDups(tracksDirSect.keys())))):
                         if self.data['isDebug']:
                             print self.ID + ':', vehicleName, 'folder from', sname, 'pack is empty.'
                     else:
                         pRecord['whitelist'].add((vehicleName + '/' + modelsSet).lower())
         for skinType in ('static', 'dynamic'):
             priorities = self.skinsData['priorities'][skinType]
             for tankType in priorities:
                 if not confDict[skinType][tankType]:
                     if self.data['isDebug']:
                         print self.ID + ':', tankType, 'swapping in', sname, 'disabled.'
                     if sname in priorities[tankType]:
                         priorities[tankType].remove(sname)
                 elif sname not in priorities[tankType]:
                     priorities[tankType].append(sname)
             if self.data['isDebug']:
                 print self.ID + ': config for', sname, 'loaded.'
     for sname in self.settings.keys():
         if sname not in self.skinsData['models']:
             del self.settings[sname]
     if not self.skinsData['models']:
         if not quiet:
             print self.ID + ': no skin packs found, skin module standing down.'
     for skinType in self.skinsData['priorities']:
         for key in self.skinsData['priorities'][skinType]:
             for sname in self.skinsData['priorities'][skinType][key]:
                 if sname not in self.skinsData['models']:
                     self.skinsData['priorities'][skinType][key].remove(sname)
     loadJson(self.ID, 'skinsPriority', self.skinsData['priorities'], self.configPath, True, quiet=quiet)
     loadJson(self.ID, 'settings', self.settings, self.configPath, True, quiet=quiet)
Пример #2
0
    def readCurrentSettings(self, quiet=True):
        super(self.__class__, self).readCurrentSettings(quiet)
        self.configsList = []
        self.confMeta.clear()
        self.sectDict = {}
        configPath = self.configPath + 'configs/'
        if os.path.isdir(configPath):
            if not quiet:
                print self.ID + ': loading configs from', configPath + ':'
            for conp in glob.iglob(configPath + '*.json'):
                fileName = os.path.basename(conp)
                confdict = loadJson(self.ID,
                                    fileName.split('.')[0], {},
                                    os.path.dirname(conp) + '/')
                if fileName not in self.configsList:
                    self.configsList.append(fileName)
                self.confMeta[fileName] = metaDict = {
                    'name': '<b>%s</b>' % fileName,
                    'desc': self.i18n['UI_setting_NDA'],
                    'has': False
                }
                if 'meta' in confdict:
                    metaDict['name'] = confdict['meta'].get(
                        'name', metaDict['name'])
                    metaDict['desc'] = confdict['meta'].get(
                        'desc', metaDict['desc'])
                    metaDict['has'] = True
                for key, conf in confdict.iteritems():
                    if key == 'meta':
                        continue
                    section = self.sectDict.setdefault(key, {})
                    section['mode'] = conf['mode']
                    if 'bindToKey' in conf:
                        section['bindToKey'] = conf['bindToKey']
                    textList = section.setdefault('textList', [])
                    text = conf['text']
                    if section['mode'] == 'single':
                        if isinstance(text, list):
                            text = ''.join(x for x in text if x)
                        textList.append(text.rstrip())
                    else:
                        if isinstance(text, str):
                            text = text.split(';')
                        textList.extend(x.rstrip() for x in text if x.rstrip())
            if not quiet:
                print '%s: loaded configs: %s' % (self.ID, ', '.join(
                    self.confMeta))

        elif not quiet:
            print '%s: config directory not found: %s' % (self.ID, configPath)

        for key in self.sectDict:
            self.sectDict[key]['textList'] = remDups(
                self.sectDict[key]['textList'])
Пример #3
0
 def merge_audio_mods(self, mediaPath, bankFiles):
     audio_mods = ResMgr.openSection(mediaPath + '/audio_mods.xml')
     audio_mods_new = ResMgr.openSection(mediaPath + '/audio_mods_edited.xml', True)
     audio_mods_banks = []
     if audio_mods is None:
         print _config.ID + ': audio_mods.xml not found, will be created if needed'
     data_structure = [
         {'name': 'events', 'key': 'event', 'keys': ('name', 'mod'), 'data': ()},
         {'name': 'switches', 'key': 'switch', 'keys': ('name', 'mod'),
          'data': {'name': 'states', 'key': 'state', 'keys': ('name', 'mod'), 'data': ()}},
         {'name': 'RTPCs', 'key': 'RTPC', 'keys': ('name', 'mod'), 'data': ()},
         {'name': 'states', 'key': 'stateGroup', 'keys': ('name', 'mod'),
          'data': {'name': 'stateNames', 'key': 'state', 'keys': ('name', 'mod'), 'data': ()}}]
     data_old, data_new = {}, {}
     for struct in data_structure:
         key = struct['name']
         data_old[key] = self.check_and_collect_data(key, audio_mods[key], struct, True)
     banksData = {}
     for path in ResMgr.openSection(mediaPath).keys():
         if not path.endswith('.xml') or path.replace('.xml', '.bnk') not in bankFiles['all']:
             continue
         sect = ResMgr.openSection(mediaPath + '/' + path)
         bankName = path.replace('.xml', '.bnk')
         if sect is None:
             bankFiles['ignore'].add(bankName)
             print self.ID + ': error while reading', path
             continue
         bankData = banksData[bankName] = {}
         for struct in data_structure:
             key = struct['name']
             if sect.has_key(key):
                 bankData[key] = self.check_and_collect_data(key, sect[key], struct, False)
             data_new.setdefault(key, []).extend(bankData.get(key, []))
     for bankSect in audio_mods['loadBanks'].values():
         bankName = bankSect.asString
         if bankName not in bankFiles['audio_mods_allowed']:
             print self.ID + ': clearing audio_mods section for bank', bankName
             self.editedBanks['delete'].append(bankName)
         else:
             audio_mods_banks.append(bankName)
     self.editedBanks['delete'] = remDups(self.editedBanks['delete'])
     for key in ['loadBanks'] + [struct['name'] for struct in data_structure]:
         audio_mods_new.createSection(key)
     audio_mods_new['loadBanks'].writeStrings('bank', audio_mods_banks)
     for struct in data_structure:
         key = struct['name']
         if data_old[key] != data_new.setdefault(key, []):
             self.editedBanks['remap'].add(key)
         if key in self.editedBanks['remap']:
             print self.ID + ': creating section for setting', key
         self.create_sect_from_data(audio_mods_new[key], data_new[key], struct)
     return audio_mods_new
Пример #4
0
def migrateSettings(g_config, old_data, new_data):
    whitelist = []
    for team in g_config.teams:
        had_WL = (team + 'Whitelist') in old_data
        old_WL = (x.strip()
                  for x in old_data.pop(team + 'Whitelist', '').split(',')
                  if x.strip())
        new_data[team] = new_data.get(
            team,
            old_data.pop('swap' + team.capitalize(), True)
            and (not had_WL or bool(old_WL)))
        whitelist.extend(old_WL)
    new_data['whitelist'] = sorted(
        remDups(whitelist + new_data.get('whitelist', [])))
Пример #5
0
 def tryRestart(self, *_, **__):
     if self.was_declined:
         return
     if not any(self.editedBanks.itervalues()):
         return
     print self.ID + ': requesting client restart...'
     reasons = []
     if self.data['debug']:
         reasons = [
             self.i18n['UI_restart_' + key] + ', '.join('<b>%s</b>' % x for x in remDups(self.editedBanks[key]))
             for key in self.editedBanks if self.editedBanks[key]]
     reasonStr = self.i18n['UI_restart_reason'].format(';\n'.join(reasons)) if reasons else ''
     dialogText = self.i18n['UI_restart_text'].format(reason=reasonStr)
     showConfirmDialog(
         self.i18n['UI_restart_header'], dialogText,
         [self.i18n['UI_restart_button_%s' % key] for key in ('restart', 'shutdown', 'close')], self.onRestartConfirmed)
Пример #6
0
def skinCRC32All(callback):
    global texReplaced, vehicleSkins
    CRC32cache = g_config.skinsCache['CRC32']
    skinsPath = 'vehicles/skins/textures/'
    dirSect = ResMgr.openSection(skinsPath)
    if dirSect is None or not dirSect.keys(
    ) or not g_config.skinsData['models']:
        print g_config.ID + ': skins folder is empty'
        BigWorld.callback(0, callback)
        return
    print g_config.ID + ': listing', skinsPath, 'for CRC32'
    callLoading('addLine', g_config.i18n['UI_loading_skins'])
    CRC32 = 0
    resultList = []
    for skin in remDups(dirSect.keys()):
        completionPercentage = 0
        callLoading(
            'addBar',
            g_config.i18n['UI_loading_skinPack'] % os.path.basename(skin))
        skinCRC32 = 0
        skinSect = dirSect[skin]['vehicles']
        nationsList = [] if skinSect is None else remDups(skinSect.keys())
        natLen = len(nationsList)
        for num, nation in enumerate(nationsList):
            nationSect = skinSect[nation]
            vehiclesList = [] if nationSect is None else remDups(
                nationSect.keys())
            vehLen = len(vehiclesList)
            for vehNum, vehicleName in enumerate(vehiclesList):
                vehicleSkins.setdefault(vehicleName.lower(), []).append(skin)
                texPrefix = 'vehicles/' + nation + '/' + vehicleName + '/'
                vehicleSect = nationSect[vehicleName]
                textures = []
                if vehicleSect is not None:
                    textures = [
                        texPrefix + texName
                        for texName in remDups(vehicleSect.keys())
                        if texName.endswith('.dds')
                    ]
                    modelsSect = vehicleSect['_skins']
                    for modelsSet in modelsSect.keys(
                    ) if modelsSect is not None else ():
                        vehicleSkins.setdefault(
                            (vehicleName + '/' + modelsSet).lower(),
                            []).append(skin)
                        textures.extend(texPrefix + '_skins/' + modelsSet +
                                        '/' + texName for texName in remDups(
                                            modelsSect[modelsSet].keys())
                                        if texName.endswith('.dds'))
                for localPath in textures:
                    texPath = skinsPath + skin + '/' + localPath
                    textureCRC32 = CRC32_from_file(texPath, localPath)
                    skinCRC32 ^= textureCRC32
                yield awaitNextFrame()
                currentPercentage = int(
                    100 * (float(num) + float(vehNum) / float(vehLen)) /
                    float(natLen))
                if currentPercentage != completionPercentage:
                    completionPercentage = currentPercentage
                    callLoading('updatePercentage', completionPercentage)
        callLoading('onBarComplete')
        if skinCRC32 in resultList:
            print g_config.ID + ': detected duplicate skins pack:', skin.replace(
                os.sep, '/')
            continue
        CRC32 ^= skinCRC32
        resultList.append(skinCRC32)
    if str(CRC32) == CRC32cache:
        print g_config.ID + ': skins textures were not changed'
    else:
        print g_config.ID + ': skins textures were', (
            'reinstalled' if CRC32cache is None else 'changed')
        g_config.skinsCache['CRC32'] = str(CRC32)
        texReplaced = True
    ResMgr.purge(skinsPath)
    BigWorld.callback(0, callback)
Пример #7
0
    def readCurrentSettings(self, quiet=True):
        super(ConfigInterface, self).readCurrentSettings(quiet)
        self.settings = loadJson(self.ID, 'settings', self.settings,
                                 self.configPath)
        self.modelsData['models'].clear()
        self.modelsData['selected'] = selectedData = loadJson(
            self.ID, 'remodsCache', self.modelsData['selected'],
            self.configPath)
        changed_xmlNames = set()
        configs_dir = self.configPath + 'remods/'
        for directory, _, fNames in os.walk(configs_dir):
            for fName in fnmatch.filter(fNames, '*.json'):
                remod_name = os.path.join(directory.replace(configs_dir, ''),
                                          fName.split('.')[0]).replace(
                                              os.sep, '/')
                confDict = loadJson(self.ID,
                                    remod_name, {},
                                    configs_dir,
                                    encrypted=True)
                if not confDict:
                    print self.ID + ': error while reading', remod_name + '.json.'
                    continue
                old_settings = None
                old_setting_names = [
                    name for name in self.settings if name in remod_name
                ]
                if old_setting_names and remod_name not in old_setting_names:
                    if len(old_setting_names) > 1:
                        print self.ID + ': multiple possible settings for remod', remod_name + ':', old_setting_names,
                        print 'skipping settings migration'
                    else:
                        old_settings = self.settings.pop(old_setting_names[0])
                settings = self.settings.setdefault(
                    remod_name, old_settings
                    or {team: confDict[team]
                        for team in self.teams})
                self.modelsData['models'][
                    remod_name] = descr = self.modelDescriptor
                descr['name'] = remod_name
                descr['message'] = confDict.get('message', '')
                settings['whitelist'] = descr[
                    'whitelist'] = whitelist = remDups(
                        x.strip() for x in settings.get(
                            'whitelist', confDict['whitelist']) if x.strip())
                for xmlName in whitelist:
                    changed_xmlNames.add(xmlName)
                    for team in selectedData:
                        if xmlName not in selectedData[
                                team] or selectedData[team][xmlName] is None:
                            if settings[team]:
                                selectedData[team][xmlName] = remod_name
                            else:
                                selectedData[team][xmlName] = None
                if self.data['isDebug']:
                    if not whitelist:
                        print self.ID + ': empty whitelist for', remod_name + '.'
                    else:
                        print self.ID + ': whitelist for', remod_name + ':', whitelist
                for key, data in descr.iteritems():
                    if key in ('name', 'message', 'whitelist'):
                        continue
                    if key == 'common':
                        confSubDict = confDict
                    else:
                        confSubDict = confDict.get(key)
                    if not confSubDict:
                        continue
                    if 'undamaged' in data:
                        data['undamaged'] = confSubDict['undamaged']
                    if 'AODecals' in data and 'AODecals' in confSubDict and 'hullPosition' in confSubDict:
                        data['AODecals'] = []
                        for subList in confSubDict['AODecals']:
                            m = Math.Matrix()
                            for strNum, row in enumerate(subList):
                                for colNum, elemNum in enumerate(row):
                                    m.setElement(strNum, colNum, elemNum)
                            data['AODecals'].append(m)
                        data['hullPosition'] = confSubDict['hullPosition']
                    if 'camouflage' in data and 'exclusionMask' in confSubDict.get(
                            'camouflage', {}):
                        data['camouflage']['exclusionMask'] = confSubDict[
                            'camouflage']['exclusionMask']
                        if 'tiling' in confSubDict['camouflage']:
                            data['camouflage']['tiling'] = confSubDict[
                                'camouflage']['tiling']
                    elif key == 'common' and self.data['isDebug']:
                        print self.ID + ': default camomask not found for', remod_name
                    if 'emblemSlots' in data:
                        data['emblemSlots'] = slots = []
                        for subDict in confSubDict.get('emblemSlots', ()):
                            if subDict['type'] not in AES:
                                print g_config.ID + ': not supported emblem slot type:', subDict[
                                    'type'] + ', expected:', AES
                                continue
                            subDict.update({
                                k: Math.Vector3(subDict[k])
                                for k in ('rayStart', 'rayEnd', 'rayUp')
                            })
                            slots.append(EmblemSlot(**subDict))
                    if 'exhaust' in data and 'exhaust' in confSubDict:
                        if 'nodes' in confSubDict['exhaust']:
                            data['exhaust']['nodes'] = confSubDict['exhaust'][
                                'nodes']
                        if 'pixie' in confSubDict['exhaust']:
                            data['exhaust']['pixie'] = confSubDict['exhaust'][
                                'pixie']
                    if key == 'chassis':
                        for k in chassis_params + ('chassisLodDistance', ):
                            data[k] = confSubDict[k]
                    for k in ('soundID', 'drivenJoints'):
                        if k in data and k in confSubDict:
                            data[k] = confSubDict[k]
                if self.data['isDebug']:
                    print self.ID + ': config for', remod_name, 'loaded.'

        for remod_name in self.settings.keys():
            if remod_name not in self.modelsData['models']:
                del self.settings[remod_name]

        if not self.modelsData['models']:
            if not quiet:
                print self.ID + ': no configs found, model module standing down.'
        for team, teamData in selectedData.items():
            for xmlName in teamData.keys():
                if xmlName not in changed_xmlNames:
                    teamData.pop(xmlName)
                    continue
                remod_name = teamData[xmlName]
                if remod_name and remod_name not in self.modelsData['models']:
                    teamData[xmlName] = remod_name = next(
                        (name for name in sorted(self.modelsData['models'])
                         if remod_name in name), None)
                if remod_name is None or (remod_name and remod_name
                                          not in self.modelsData['models']):
                    teamData[xmlName] = next(
                        (name for name in sorted(self.modelsData['models'])
                         if xmlName in self.settings[name]['whitelist']
                         and self.settings[name][team]), None) or ''
        loadJson(self.ID,
                 'remodsCache',
                 selectedData,
                 self.configPath,
                 True,
                 quiet=quiet)
        loadJson(self.ID,
                 'settings',
                 self.settings,
                 self.configPath,
                 True,
                 quiet=quiet)
Пример #8
0
    def readCurrentSettings(self, quiet=True):
        super(ConfigInterface, self).readCurrentSettings()
        self.settings = loadJson(self.ID, 'settings', self.settings, self.configPath)
        self.skinsCache.update(loadJson(self.ID, 'skinsCache', self.skinsCache, self.configPath))
        configsPath = self.configPath + 'remods/*.json'
        self.modelsData['enabled'] = bool(glob.glob(configsPath))
        if self.modelsData['enabled']:
            self.modelsData['selected'] = selectedData = loadJson(
                self.ID, 'remodsCache', self.modelsData['selected'], self.configPath)
            for key in selectedData.keys():
                if not key.islower():
                    selectedData[key.lower()] = selectedData.pop(key)
            snameList = set()
            for configPath in glob.iglob(configsPath):
                sname = os.path.basename(configPath).split('.')[0]
                confDict = loadJson(self.ID, sname, {}, os.path.dirname(configPath) + '/', encrypted=True)
                if not confDict:
                    print self.ID + ': error while reading', os.path.basename(configPath) + '.'
                    continue
                settingsDict = self.settings['remods'].setdefault(sname, {})
                snameList.add(sname)
                if not settingsDict.setdefault('enabled', self.defaultRemodConfig['enabled']):
                    print self.ID + ':', sname, 'disabled, moving on'
                    if sname in self.modelsData['models']:
                        del self.modelsData['models'][sname]
                    continue
                self.modelsData['models'][sname] = pRecord = ModelDescriptor()
                pRecord.name = sname
                pRecord.authorMessage = confDict.get('authorMessage', '')
                for tankType in ('player', 'ally', 'enemy'):
                    selected = selectedData[tankType]
                    swapKey = 'swap' + tankType.capitalize()
                    WLKey = tankType + 'Whitelist'
                    whiteStr = settingsDict.setdefault(WLKey, confDict.get(WLKey, ''))
                    templist = [x.strip() for x in whiteStr.split(',') if x]
                    whitelist = pRecord.whitelists[tankType]
                    whitelist.update(templist)
                    if not whitelist:
                        if self.data['isDebug']:
                            print self.ID + ': empty whitelist for', sname + '. Not applied to', tankType, 'tanks.'
                    else:
                        if self.data['isDebug']:
                            print self.ID + ': whitelist for', tankType + ':', list(whitelist)
                        for xmlName in selected:
                            if sname == selected[xmlName] and xmlName not in whitelist:
                                selected[xmlName] = None
                    if not settingsDict.setdefault(swapKey, confDict.get(swapKey, self.defaultRemodConfig[swapKey])):
                        if self.data['isDebug']:
                            print self.ID + ':', tankType, 'swapping in', sname, 'disabled.'
                        whitelist.clear()
                        for xmlName in selected:
                            if sname == selected[xmlName]:
                                selected[xmlName] = None
                for key, data in pRecord.data.iteritems():
                    if key == 'common':
                        confSubDict = confDict
                    else:
                        confSubDict = confDict.get(key)
                    if not confSubDict:
                        continue
                    if 'undamaged' in data:
                        data['undamaged'] = confSubDict['undamaged']
                    if 'AODecals' in data and 'AODecals' in confSubDict and 'hullPosition' in confSubDict:
                        data['AODecals'] = readAODecals(confSubDict['AODecals'])
                        data['hullPosition'] = Math.Vector3(tuple(confSubDict['hullPosition']))
                    if 'camouflage' in data and 'exclusionMask' in confSubDict.get('camouflage', {}):
                        data['camouflage']['exclusionMask'] = confSubDict['camouflage']['exclusionMask']
                        if 'tiling' in confSubDict['camouflage']:
                            data['camouflage']['tiling'] = tuple(confDict['camouflage']['tiling'])
                    elif key == 'common' and self.data['isDebug']:
                        print self.ID + ': default camomask not found for', sname
                    if 'emblemSlots' in data:
                        data['emblemSlots'] = readEmblemSlots(confSubDict.get('emblemSlots', []))
                    if 'exhaust' in data:
                        if 'nodes' in confSubDict.get('exhaust', {}):
                            data['exhaust']['nodes'] = confSubDict['exhaust']['nodes'].split()
                        if 'pixie' in confSubDict.get('exhaust', {}):
                            data['exhaust']['pixie'] = confSubDict['exhaust']['pixie']
                    if key == 'chassis':
                        for k in ('traces', 'tracks', 'wheels', 'groundNodes', 'trackNodes', 'splineDesc', 'trackParams'):
                            data[k] = confSubDict[k]
                    for subKey in ('effects', 'reloadEffect', 'wwsoundPC', 'wwsoundNPC'):
                        if subKey in data and subKey in confSubDict:
                            data[subKey] = confSubDict[subKey]
                if self.data['isDebug']:
                    print self.ID + ': config for', sname, 'loaded.'

            for sname in self.modelsData['models'].keys():
                if sname not in snameList:
                    del self.modelsData['models'][sname]

            for sname in self.settings['remods'].keys():
                if sname not in snameList:
                    del self.settings['remods'][sname]

            if not self.modelsData['models']:
                if not quiet:
                    print self.ID + ': no configs found, model module standing down.'
                self.modelsData['enabled'] = False
                loadJson(self.ID, 'remodsCache', selectedData, self.configPath, True, quiet=quiet)
            else:
                remodTanks = {key: set() for key in selectedData}
                for modelDesc in self.modelsData['models'].values():
                    for tankType, whitelist in modelDesc.whitelists.iteritems():
                        for xmlName in whitelist:
                            remodTanks[tankType].add(xmlName)
                            if xmlName not in selectedData[tankType]:
                                selectedData[tankType][xmlName] = None
                for tankType in ('player', 'ally', 'enemy'):
                    for xmlName in selectedData[tankType].keys():
                        if (selectedData[tankType][xmlName] and selectedData[tankType][
                            xmlName] not in self.modelsData['models']):
                            selectedData[tankType][xmlName] = None
                        if xmlName not in remodTanks[tankType]:
                            del selectedData[tankType][xmlName]
                if selectedData['remod'] and selectedData['remod'] not in self.modelsData['models']:
                    selectedData['remod'] = ''
                loadJson(self.ID, 'remodsCache', selectedData, self.configPath, True, quiet=quiet)
        else:
            if not quiet:
                print self.ID + ': no remods found, model module standing down.'
            self.modelsData['enabled'] = False
            loadJson(self.ID, 'remodsCache', self.modelsData['selected'], self.configPath, True, quiet=quiet)
        self.skinsData['enabled'] = ResMgr.openSection('vehicles/skins/') is not None and ResMgr.isDir('vehicles/skins/')
        if self.skinsData['enabled']:
            self.skinsData['priorities'] = loadJson(self.ID, 'skinsPriority', self.skinsData['priorities'], self.configPath)
            skinDir = 'vehicles/skins/textures/'
            for skinTypeSuff in ('', '_dynamic'):
                skinType = 'static' if not skinTypeSuff else skinTypeSuff[1:]
                for key in self.skinsData['priorities'][skinType].keys():
                    if not key.islower():
                        self.skinsData['priorities'][skinType][key.lower()] = self.skinsData['priorities'][skinType].pop(key)
                skinsSettings = self.settings['skins' + skinTypeSuff]
                disabledSkins = []
                if self.data['isDebug']:
                    print self.ID + ': loading configs for', skinType, 'skins'
                skinDirSect = ResMgr.openSection(skinDir)
                for sname in [] if skinDirSect is None else remDups(skinDirSect.keys()):
                    confDict = skinsSettings.setdefault(sname, self.defaultSkinConfig[skinType])
                    if not confDict.get('enabled', True):
                        print self.ID + ':', sname, 'disabled, moving on'
                        disabledSkins.append(sname)
                        continue
                    self.skinsData['models'][skinType][sname] = pRecord = {'name': '', 'whitelist': set()}
                    pRecord['name'] = sname
                    priorities = self.skinsData['priorities'][skinType]
                    for tankType in priorities:
                        key = 'swap' + tankType.capitalize()
                        if not confDict.setdefault(key, self.defaultSkinConfig[skinType][key]):
                            if self.data['isDebug']:
                                print self.ID + ':', tankType, 'swapping in', sname, 'disabled.'
                            if sname in priorities[tankType]:
                                priorities[tankType].remove(sname)
                            continue
                        if sname not in priorities[tankType]:
                            priorities[tankType].append(sname)
                    pRecord['whitelist'].clear()
                    vehiclesDirPath = skinDir + sname + '/vehicles/'
                    vehiclesDirSect = ResMgr.openSection(vehiclesDirPath)
                    for curNation in [] if vehiclesDirSect is None else remDups(vehiclesDirSect.keys()):
                        nationDirPath = vehiclesDirPath + curNation + '/'
                        nationDirSect = ResMgr.openSection(nationDirPath)
                        for vehicleName in [] if nationDirSect is None else remDups(nationDirSect.keys()):
                            vehDirPath = nationDirPath + vehicleName + '/'
                            vehDirSect = ResMgr.openSection(vehDirPath)
                            tracksDirPath = vehDirPath + 'tracks/'
                            tracksDirSect = ResMgr.openSection(tracksDirPath)
                            if not any(texName.endswith('.dds') for texName in (
                                    ([] if vehDirSect is None else remDups(vehDirSect.keys())) +
                                    ([] if tracksDirSect is None else remDups(tracksDirSect.keys())))):
                                if self.data['isDebug']:
                                    print self.ID + ':', vehicleName, 'folder from', sname, 'pack is empty.'
                            else:
                                pRecord['whitelist'].add(vehicleName)

                    if self.data['isDebug']:
                        print self.ID + ': config for', sname, 'loaded.'
                snameList = self.skinsData['models'][skinType].keys() + disabledSkins
                for sname in skinsSettings.keys():
                    if sname not in snameList:
                        del skinsSettings[sname]
            if not any(self.skinsData['models'].values()):
                if not quiet:
                    print self.ID + ': no skins configs found, skins module standing down.'
                self.skinsData['enabled'] = False
                for skinType in self.skinsData['priorities']:
                    for key in self.skinsData['priorities'][skinType]:
                        self.skinsData['priorities'][skinType][key] = []
            else:
                for skinType in self.skinsData['priorities']:
                    for key in self.skinsData['priorities'][skinType]:
                        for sname in list(self.skinsData['priorities'][skinType][key]):
                            if sname not in self.skinsData['models'][skinType]:
                                self.skinsData['priorities'][skinType][key].remove(sname)
        else:
            if not quiet:
                print self.ID + ': no skins found, skins module standing down.'
            for skinType in self.skinsData['priorities']:
                for key in self.skinsData['priorities'][skinType]:
                    self.skinsData['priorities'][skinType][key] = []
        loadJson(self.ID, 'skinsPriority', self.skinsData['priorities'], self.configPath, True, quiet=quiet)
        loadJson(self.ID, 'settings', self.settings, self.configPath, True, quiet=quiet)
Пример #9
0
import traceback
from PYmodsCore import overrideMethod, remDups, Analytics
from gui.Scaleform.locale.RES_ICONS import RES_ICONS
from gui.battle_control.arena_info.arena_vos import VehicleArenaInfoVO
from gui.battle_results.components import style
from gui.battle_results.components.vehicles import RegularVehicleStatsBlock
from gui.doc_loaders.badges_loader import getSelectedByLayout, getAvailableBadges
from gui.prb_control.items import PlayerPrbInfo, PlayerUnitInfo
from gui.prb_control.items.prb_seqs import PrbListItem

badges_dir = ResMgr.openSection('gui/AppreciationBadges/')
if badges_dir is not None:
    g_badges = {}
    badges_data = getAvailableBadges()
    message = 'initialised.'
    badges = remDups(os.path.splitext(x)[0] for x in badges_dir.keys())
    for badge_name in badges:
        if '_' not in badge_name:
            print 'AppreciationBadges: wrong badge format:', badge_name
            continue
        strAccID, strBadgeID = badge_name.split('_', 1)
        try:
            accID = int(strAccID)
        except ValueError:
            print 'AppreciationBadges: unrecognized account ID:', strAccID
            continue
        try:
            badgeID = int(strBadgeID)
        except ValueError:
            print 'AppreciationBadges: wrong battle badge ID:', strBadgeID
            continue
Пример #10
0
    def readCurrentSettings(self, quiet=True):
        super(ConfigInterface, self).readCurrentSettings(quiet)
        self.settings = loadJson(self.ID, 'settings', self.settings,
                                 self.configPath)
        self.modelsData['models'].clear()
        self.modelsData['selected'] = selectedData = loadJson(
            self.ID, 'remodsCache', self.modelsData['selected'],
            self.configPath)
        remodTanks = set()
        for root, _, fNames in os.walk(self.configPath + 'remods/'):
            for fName in fnmatch.filter(fNames, '*.json'):
                sName = fName.split('.')[0]
                confDict = loadJson(self.ID, sName, {}, root, encrypted=True)
                if not confDict:
                    print self.ID + ': error while reading', fName + '.'
                    continue
                settingsDict = self.settings.setdefault(
                    sName, {team: confDict[team]
                            for team in self.teams})
                self.modelsData['models'][
                    sName] = pRecord = self.modelDescriptor
                pRecord['name'] = sName
                pRecord['message'] = confDict.get('message', '')
                settingsDict['whitelist'] = pRecord[
                    'whitelist'] = whitelist = remDups(
                        x.strip() for x in settingsDict.get(
                            'whitelist', confDict['whitelist']) if x.strip())
                for xmlName in whitelist:
                    remodTanks.add(xmlName)
                    for team in selectedData:
                        if xmlName not in selectedData[
                                team] or selectedData[team][xmlName] is None:
                            if settingsDict[team]:
                                selectedData[team][xmlName] = sName
                            else:
                                selectedData[team][xmlName] = None
                if self.data['isDebug']:
                    if not whitelist:
                        print self.ID + ': empty whitelist for', sName + '.'
                    else:
                        print self.ID + ': whitelist for', sName + ':', whitelist
                for key, data in pRecord.iteritems():
                    if key in ('name', 'message', 'whitelist'):
                        continue
                    if key == 'common':
                        confSubDict = confDict
                    else:
                        confSubDict = confDict.get(key)
                    if not confSubDict:
                        continue
                    if 'undamaged' in data:
                        data['undamaged'] = confSubDict['undamaged']
                    if 'AODecals' in data and 'AODecals' in confSubDict and 'hullPosition' in confSubDict:
                        data['AODecals'] = []
                        for subList in confSubDict['AODecals']:
                            m = Math.Matrix()
                            for strNum, row in enumerate(subList):
                                for colNum, elemNum in enumerate(row):
                                    m.setElement(strNum, colNum, elemNum)
                            data['AODecals'].append(m)
                        data['hullPosition'] = confSubDict['hullPosition']
                    if 'camouflage' in data and 'exclusionMask' in confSubDict.get(
                            'camouflage', {}):
                        data['camouflage']['exclusionMask'] = confSubDict[
                            'camouflage']['exclusionMask']
                        if 'tiling' in confSubDict['camouflage']:
                            data['camouflage']['tiling'] = confSubDict[
                                'camouflage']['tiling']
                    elif key == 'common' and self.data['isDebug']:
                        print self.ID + ': default camomask not found for', sName
                    if 'emblemSlots' in data:
                        data['emblemSlots'] = slots = []
                        for subDict in confSubDict.get('emblemSlots', []):
                            if subDict['type'] not in AES:
                                print g_config.ID + ': not supported emblem slot type:', subDict[
                                    'type'] + ', expected:', AES
                                continue
                            descr = EmblemSlot(
                                Math.Vector3(tuple(subDict['rayStart'])),
                                Math.Vector3(tuple(subDict['rayEnd'])),
                                Math.Vector3(tuple(subDict['rayUp'])),
                                subDict['size'],
                                subDict.get('hideIfDamaged',
                                            False), subDict['type'],
                                subDict.get('isMirrored', False),
                                subDict.get('isUVProportional', True),
                                subDict.get('emblemId', None),
                                subDict.get(
                                    'slotId',
                                    c11n_constants.customizationSlotIds[key][
                                        subDict['type']][0]),
                                subDict.get('applyToFabric', True))
                            slots.append(descr)
                    if 'exhaust' in data and 'exhaust' in confSubDict:
                        if 'nodes' in confSubDict['exhaust']:
                            data['exhaust']['nodes'] = confSubDict['exhaust'][
                                'nodes']
                        if 'pixie' in confSubDict['exhaust']:
                            data['exhaust']['pixie'] = confSubDict['exhaust'][
                                'pixie']
                    if key == 'chassis':
                        for k in chassis_params + ('chassisLodDistance', ):
                            data[k] = confSubDict[k]
                    for k in ('soundID', 'drivenJoints'):
                        if k in data and k in confSubDict:
                            data[k] = confSubDict[k]
                if self.data['isDebug']:
                    print self.ID + ': config for', sName, 'loaded.'

        for sName in self.settings.keys():
            if sName not in self.modelsData['models']:
                del self.settings[sName]

        if not self.modelsData['models']:
            if not quiet:
                print self.ID + ': no configs found, model module standing down.'
        for team in self.teams:
            for xmlName in selectedData[team].keys():
                if xmlName not in remodTanks:
                    del selectedData[team][xmlName]
                    continue
                if selectedData[team][xmlName] is None or (
                        selectedData[team][xmlName]
                        and selectedData[team][xmlName]
                        not in self.modelsData['models']):
                    selectedData[team][xmlName] = next(
                        (sName for sName in sorted(self.modelsData['models'])
                         if xmlName in self.settings[sName]['whitelist']
                         and self.settings[sName][team]), None) or ''
        loadJson(self.ID,
                 'remodsCache',
                 selectedData,
                 self.configPath,
                 True,
                 quiet=quiet)
        loadJson(self.ID,
                 'settings',
                 self.settings,
                 self.configPath,
                 True,
                 quiet=quiet)
Пример #11
0
 def readCurrentSettings(self, quiet=True):
     super(ConfigInterface, self).readCurrentSettings(quiet)
     self.configFolders.clear()
     self.camouflages = {'remap': {}, 'custom': {}}
     self.outfitCache = loadJson(self.ID, 'outfitCache', self.outfitCache,
                                 self.configPath)
     if os.path.isfile(self.configPath + 'camouflagesCache.json'):
         camouflagesCache = loadJson(self.ID, 'camouflagesCache', {},
                                     self.configPath)
         for nat in camouflagesCache:
             for vehName in camouflagesCache[nat]:
                 for season in camouflagesCache[nat][vehName]:
                     self.outfitCache.setdefault(nat, {}).setdefault(vehName, {}).setdefault(season, {})['camo'] = \
                         camouflagesCache[nat][vehName][season]
         os.remove(self.configPath + 'camouflagesCache.json')
         loadJson(self.ID, 'outfitCache', self.outfitCache, self.configPath,
                  True)
     try:
         camoDirPath = '../' + self.configPath + 'camouflages'
         camoDirSect = ResMgr.openSection(camoDirPath)
         for camoName in remDups((
                 x for x in camoDirSect.keys()
                 if ResMgr.isDir(camoDirPath + '/' +
                                 x)) if camoDirSect is not None else []):
             self.configFolders[camoName] = confFolder = set()
             fileName = self.configPath + 'camouflages/' + camoName + '/'
             settings = loadJson(self.ID, 'settings', {}, fileName)
             for key in settings:
                 conf = settings[key]
                 if 'kinds' in conf:
                     conf['season'] = conf['kinds']
                     del conf['kinds']
                 if 'season' in conf:
                     seasonNames = [
                         x for x in conf['season'].split(',') if x
                     ]
                     seasonType = SeasonType.UNDEFINED
                     for season in seasonNames:
                         if season in SEASONS_CONSTANTS.SEASONS:
                             seasonType |= getattr(SeasonType,
                                                   season.upper())
                         else:
                             print self.ID + ': unknown season name for camouflage', key + ':', season
                             conf['season'] = conf['season'].replace(
                                 season, '')
                     while ',,' in conf['season']:
                         conf['season'] = conf['season'].replace(',,', ',')
                 else:
                     conf['season'] = ','.join(SEASONS_CONSTANTS.SEASONS)
                 confFolder.add(key)
             self.camouflages['custom'].update(settings)
             loadJson(self.ID, 'settings', settings, fileName, True)
     except StandardError:
         traceback.print_exc()
     camouflages = items.vehicles.g_cache.customization20().camouflages
     camoNames = {
         id: getCamoTextureName(x)
         for id, x in camouflages.iteritems()
         if 'custom' not in x.priceGroupTags
     }
     camoIndices = {}
     for camoID, camoName in camoNames.iteritems():
         camoIndices.setdefault(camoName, []).append(camoID)
     self.interCamo = []
     for camoName, indices in camoIndices.iteritems():
         nationsList = []
         for ID in indices:
             for filterNode in camouflages[ID].filter.include:
                 if filterNode.nations:
                     nationsList += filterNode.nations
         if set(nationsList) >= set(
                 idx for idx, name in enumerate(nations.NAMES)
                 if name != 'italy'):
             self.interCamo.append(camoName)
     settings = loadJson(self.ID, 'settings', {}, self.configPath)
     if 'disable' in settings:
         if not settings['disable']:
             del settings['disable']
         else:
             self.disable = settings['disable']
     if 'remap' in settings:
         conf = settings['remap']
         for camoName in conf.keys():
             try:
                 camoName = int(camoName)
             except ValueError:
                 if camoName not in camoIndices:
                     print self.ID + ': unknown camouflage for remapping:', camoName
                 else:
                     for camoID in camoIndices[camoName]:
                         conf[camoID] = conf[camoName].copy()
                 del conf[camoName]
                 continue
             if camoName not in camoNames:
                 print self.ID + ': unknown camouflage for remapping:', camoName
                 del conf[str(camoName)]
             else:
                 conf[camoName] = conf.pop(str(camoName))
         for camoID, camouflage in camouflages.items():
             if camoID not in conf:
                 continue
             camoConf = conf[camoID]
             if camoConf.get('random_mode') == RandMode.RANDOM:
                 del camoConf['random_mode']
             if 'kinds' in camoConf:
                 camoConf['season'] = camoConf['kinds']
                 del camoConf['kinds']
             if 'season' in camoConf:
                 seasonNames = [
                     x for x in camoConf['season'].split(',') if x
                 ]
                 seasonType = SeasonType.UNDEFINED
                 for season in seasonNames:
                     if season in SEASONS_CONSTANTS.SEASONS:
                         seasonType |= getattr(SeasonType, season.upper())
                     else:
                         print self.ID + ': unknown season name for camouflage', camoID + ':', season
                         camoConf['season'] = camoConf['season'].replace(
                             season, '')
                 while ',,' in camoConf['season']:
                     camoConf['season'] = camoConf['season'].replace(
                         ',,', ',')
                 if seasonType == camouflage.season:
                     del camoConf['season']
             for team in ('Ally', 'Enemy'):
                 if camoConf.get('useFor' + team):
                     del camoConf['useFor' + team]
             if not camoConf:
                 del conf[camoID]
         self.camouflages['remap'] = conf
     newSettings = {}
     if self.disable:
         newSettings['disable'] = self.disable
     newSettings['remap'] = settings.get('remap', {})
     loadJson(self.ID, 'settings', newSettings, self.configPath, True)
Пример #12
0
    def checkConfigs(self):
        orig_engine = ResMgr.openSection('engine_config.xml')
        if orig_engine is None:
            LOG_ERROR('engine_config.xml not found')
            return
        new_engine = ResMgr.openSection('engine_config_edited.xml', True)
        new_engine.copy(orig_engine)
        ResMgr.purge('engine_config.xml')
        soundMgr = new_engine['soundMgr']
        mediaPath = soundMgr['wwmediaPath'].asString
        self.check_wotmods(mediaPath)
        if self.editedBanks['wotmod']:
            return
        bankFiles = {
            'mods': set(),
            'pkg': set(),
            'ignore': set(),
            'res': {
                os.path.basename(path)
                for path in glob.iglob('./res/' + mediaPath + '/*')
                if (path.endswith('.bnk') or path.endswith('.pck'))
            }
        }
        for pkgPath in glob.iglob('./res/packages/audioww*.pkg'):
            with zipfile.ZipFile(pkgPath) as pkg:
                bankFiles['pkg'].update(
                    {os.path.basename(name)
                     for name in pkg.namelist()})
        bankFiles['orig'] = bankFiles['res'] | bankFiles['pkg']
        bankFiles['mods'] = set(x
                                for x in ResMgr.openSection(mediaPath).keys()
                                if (x.endswith('.bnk') or x.endswith('.pck'))
                                and x not in bankFiles['orig'])
        bankFiles['all'] = bankFiles['orig'] | bankFiles['mods']
        audio_mods = ResMgr.openSection(mediaPath + '/audio_mods.xml')
        audio_mods_new = ResMgr.openSection(
            mediaPath + '/audio_mods_edited.xml', True)
        if audio_mods is None:
            LOG_NOTE('audio_mods.xml not found, will be created if needed')
        else:
            audio_mods_new.copy(audio_mods)
            ResMgr.purge(mediaPath + '/audio_mods.xml')
        modsKeys = ('events', 'switches', 'RTPCs', 'states')
        confList = [
            x for x in ResMgr.openSection(mediaPath).keys()
            if x.endswith('.xml') and x.replace('.xml', '.bnk') in
            bankFiles['mods'] | bankFiles['orig']
        ]
        for key in ('loadBanks', ) + modsKeys:
            if not audio_mods_new.has_key(key):
                audio_mods_new.createSection(key)
        confData_old = {key: [] for key in modsKeys}
        key_to_sub = {
            'events': 'event',
            'RTPCs': 'RTPC',
            'switches': 'switch',
            'states': 'stateGroup'
        }
        subList = {'switches': 'states', 'states': 'stateNames'}
        for key in modsKeys:
            conf = audio_mods_new[key]
            for sectName, confSect in conf.items():
                if sectName != key_to_sub[key] or not confSect.has_key(
                        'name') or not confSect.has_key('mod'):
                    conf.deleteSection(confSect)
                    self.editedBanks['remap'].add(key)
                    print self.ID + ': cleaned wrong section for setting', key
                    continue
                result = {
                    'name': confSect['name'].asString,
                    'mod': confSect['mod'].asString
                }
                if key in subList:
                    stateList = []
                    for confSubName, confSubSect in confSect[
                            subList[key]].items():
                        if confSubName != 'state' or not confSubSect.has_key(
                                'name') or not confSubSect.has_key('mod'):
                            confSect.deleteSection(confSubSect)
                            self.editedBanks['remap'].add(key)
                            print self.ID + ': cleaned wrong section for setting', key
                            continue
                        stateList.append({
                            'name': confSubSect['name'].asString,
                            'mod': confSubSect['mod'].asString
                        })
                    result[subList[key]] = stateList
                confData_old[key].append(result)
        confData = {key: [] for key in modsKeys}
        bankConfData = {}
        for confPath in confList:
            confSect = ResMgr.openSection(mediaPath + '/' + confPath)
            bankName = confPath.replace('.xml', '.bnk')
            bankData = bankConfData[bankName] = {}
            if confSect is None:
                bankFiles['ignore'].add(bankName)
                print self.ID + ': error while reading', confPath
                continue
            for key in modsKeys:
                if confSect.has_key(key):
                    existingNames = [x['name'] for x in confData[key]]
                    existingMods = [x['mod'] for x in confData[key]]
                    bankEvents = bankData[key] = []
                    for sectName, subSect in confSect[key].items():
                        if sectName != key_to_sub[key] or not subSect.has_key(
                                'name') or not subSect.has_key('mod'):
                            continue
                        name = subSect['name'].asString
                        mod = subSect['mod'].asString
                        if name in existingNames or mod in existingMods:
                            bankFiles['ignore'].add(bankName)
                            print self.ID + ': duplicate events in', confPath + ': name:', name + ', mod:', mod
                            break
                        result = {'name': name, 'mod': mod}
                        if key in subList:
                            stateList = []
                            for subSectName, stateSect in subSect[
                                    subList[key]].items():
                                if subSectName != 'state' or not stateSect.has_key(
                                        'name') or not stateSect.has_key(
                                            'mod'):
                                    continue
                                stateList.append({
                                    'name':
                                    stateSect['name'].asString,
                                    'mod':
                                    stateSect['mod'].asString
                                })
                            result[subList[key]] = stateList
                        bankEvents.append(result)
                if bankName in bankFiles['ignore']:
                    del bankConfData[bankName]
                    break
            for key in confData:
                if bankName not in bankFiles['ignore'] and key in bankData:
                    confData[key].extend(bankData[key])
        for bankSect in audio_mods_new['loadBanks'].values():
            bankName = bankSect.asString
            print self.ID + ': clearing audio_mods section for bank', bankName
            self.editedBanks['delete'].append(bankName)
            audio_mods_new['loadBanks'].deleteSection(bankSect)
        self.editedBanks['delete'] = remDups(self.editedBanks['delete'])
        bankFiles['orig'] = set(map(str.lower, bankFiles['orig']))
        poolKeys = {
            'memoryManager':
            ('defaultPool', 'lowEnginePool', 'streamingPool', 'IOPoolSize'),
            'soundRender': ('max_voices', )
        }
        for mgrKey in ('memoryLimit', ):  # in case they add something later
            value = soundMgr[mgrKey]
            if value is not None and value.asInt != int(self.data[mgrKey]):
                self.editedBanks['memory'].append(mgrKey)
                soundMgr.writeInt(mgrKey, self.data[mgrKey])
                print self.ID + ': changing value for memory setting:', mgrKey
        for profile_name in ('WWISE_active_profile',
                             'WWISE_emergency_profile'):
            moddedExist = set()
            profile_type = profile_name.split('_')[1]
            profile = soundMgr[soundMgr[profile_name].asString]
            for poolKey, poolValuesList in poolKeys.iteritems():
                for poolValue in poolValuesList:
                    value = profile[poolKey][poolValue]
                    if value is not None and value.asInt != int(
                            self.data[poolValue]):
                        self.editedBanks['memory'].append(poolValue)
                        profile[poolKey].writeInt(poolValue,
                                                  self.data[poolValue])
                        print self.ID + ': changing value for', profile_type, 'memory setting:', poolValue
            for name, section in profile.items():
                if 'soundbanks' not in name:
                    continue
                for sectName, project in section.items():
                    if sectName != 'project':
                        continue
                    bankName = project['name'].asString
                    if bankName not in bankFiles['all']:
                        print self.ID + ': clearing engine_config', profile_type, 'section for bank', bankName
                        self.editedBanks['delete'].append(bankName)
                        section.deleteSection(project)
                    elif bankName not in moddedExist:
                        moddedExist.add(bankName)
            for bankName in sorted(bankFiles['mods']):
                if bankName not in bankFiles[
                        'orig'] and bankName not in moddedExist and bankName not in bankFiles[
                            'ignore']:
                    print self.ID + ': creating', profile_type, 'sections for bank', bankName
                    if bankName in self.editedBanks['delete']:
                        self.editedBanks['delete'].remove(bankName)
                        self.editedBanks['move'].append(bankName)
                    else:
                        self.editedBanks['create'].append(bankName)
                    profile.createSection(
                        'SFX_soundbanks_loadonce/project').writeString(
                            'name', bankName)
        for key in modsKeys:
            if confData_old[key] != confData[key]:
                self.editedBanks['remap'].add(key)
            if key in self.editedBanks['remap']:
                print self.ID + ': creating section for setting', key
                audio_mods_new.deleteSection(audio_mods_new[key])
                newSect = audio_mods_new.createSection(key)
                for data in confData[key]:
                    newSubSect = newSect.createSection(key_to_sub[key])
                    for subKey in ('name', 'mod'):
                        newSubSect.createSection(
                            subKey).asString = data[subKey]
                    if key in subList:
                        newSubLSect = newSubSect.createSection(subList[key])
                        for subData in data[subList[key]]:
                            newSubSSect = newSubLSect.createSection('state')
                            for subKey in subData:
                                newSubSSect.createSection(
                                    subKey).asString = subData[subKey]

        if any(self.editedBanks[key]
               for key in ('delete', 'move', 'create', 'memory')):
            new_engine.save()
            xmlOrig = BigWorld.curCV + '/engine_config.xml'
            if os.path.isfile(xmlOrig):
                try:
                    os.remove(xmlOrig)
                except StandardError:
                    traceback.print_exc()
            newXml = './engine_config_edited.xml'
            if os.path.isfile(newXml):
                os.rename(newXml, xmlOrig)
            else:
                newXml = BigWorld.curCV + '/engine_config_edited.xml'
                if os.path.isfile(newXml):
                    os.rename(newXml, xmlOrig)
        else:
            ResMgr.purge('engine_config_edited.xml')
        if any(self.editedBanks[key] for key in ('delete', 'move', 'remap')):
            dirName = BigWorld.curCV + '/' + mediaPath
            if not os.path.exists(dirName):
                os.makedirs(dirName)
            audio_mods_new.save()
            origXml = dirName + '/audio_mods.xml'
            if os.path.isfile(origXml):
                try:
                    os.remove(origXml)
                except StandardError:
                    traceback.print_exc()
            newXml = dirName + '/audio_mods_edited.xml'
            if os.path.isfile(newXml):
                os.rename(newXml, origXml)
        else:
            ResMgr.purge('audio_mods_edited.xml')