Jump to content
Korean Random
Zelenogorec

[0.9.0] XVM Tank Minimap Ranges, забугорный мод.

Recommended Posts

По просьбам, добавил файл с описанием содержания tankrange.xc в редакции evil_rrock.

Share this post


Link to post

Short link
Share on other sites

@evil_rrock, а можно переделать скрипт так, чтобы он не стирал красоту из конфига?

  

потому что при запуске все комментарии удаляются и конфиг становится "унылым и серым"

сам скрипт ничего в настройках конфига не меняет, только вписывает технику в minimapCircles.xc

приведённый мною конфиг, всего лишь пример, какая строка, за что отвечает и что настраивает. за основу взят дефолтный,

в котором не настроено ничего.

для того чтобы круги заиграли всеми цветами, надо взять свой minimapCircles.xc и править ручками, в удобном редакторе,

например notepad++ в шапке темы есть инструмент для подбора цветов, в моём посте есть очень подробное описание, где и что настраивается в конфиге.

По просьбам, добавил файл с описанием содержания tankrange.xc в редакции evil_rrock.

мой маленький труд не пропал даром.

но есть вопрос в тему.

оригинальный скрипт выдаёт системные сообщения о дальности засвета при снятии и монтаже оборудования?

1389202080-clip-13kb.jpg

1389430491-clip-6kb.jpg

если да то всё ОК.

если нет, то параметр

"notify_changes":

там неуместен

 

Добавлено позднее

 

Завтра сам проверю.

 

Добаслено 15.01.2014

проверил. параметр нужен

Edited by evil_rrock

Share this post


Link to post

Short link
Share on other sites

сам скрипт ничего в настройках конфига не меняет, только вписывает технику в minimapCircles.xc приведённый мною конфиг, всего лишь пример, какая строка, за что отвечает и что настраивает. за основу взят дефолтный, в котором не настроено ничего.

я все понимаю, но при первом же запуске игры конфиг становится такого плана:

 

{

 

"circles": {

 

"enabled": true,

 

"major": [

 

{

 

"alpha": 65,

 

"color": "0xFF8000",

 

"distance": 445,

 

"enabled": true,

 

"thickness": 0.75

 

},

 

{

 

"alpha": 40,

 

"color": "0xFFFFFF",

 

"distance": 50,

 

"enabled": true,

 

"thickness": 1.0

 

}

 

],

 

"special": [

 

{

 

"france-AMX50_Foch": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 444.15228000000008

 

}

 

},

 

{

 

"usa-M18_Hellcat": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 407.00000000000006

 

}

 

},

 

{

 

"usa-T32": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 408.57142857142861

 

}

 

},

 

{

 

"japan-Chi_Ha": {

 

"$ref": {

 

"path": "tankrange.circle_binocular"

 

},

 

"distance": 426.73242857142861

 

}

 

},

 

{

 

"japan-Chi_Ha": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 341.38594285714288

 

}

 

},

 

{

 

"germany-JagdTiger": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 454.18597714285721

 

}

 

},

 

{

 

"ussr-Object_704": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 413.46574285714286

 

}

 

},

 

{

 

"uk-GB75_AT7": {

 

"$ref": {

 

"path": "tankrange.circle_binocular"

 

},

 

"distance": 450.10192500000005

 

}

 

},

 

{

 

"uk-GB75_AT7": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 360.08154000000002

 

}

 

}

 

]

 

},

 

"tankrange": {

 

"circle_artillery": {

 

"alpha": 50,

 

"color": "0xFF0000",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.5

 

},

 

"circle_binocular": {

 

"alpha": 60,

 

"color": "0x008DFF",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.69999999999999996

 

},

 

"circle_shell": {

 

"alpha": 60,

 

"color": "0xFF00DC",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.59999999999999998

 

},

 

"circle_view": {

 

"alpha": 70,

 

"color": "0x00EFFF",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.69999999999999996

 

},

 

"ignore_artillery": false,

 

"logging": false,

 

"notify_changes": true,

 

"spotting_limit": false

 

}

 

}

хотя до запуска выглядит вот так:

 

{

 

// отображение всех окружностей на карте

 

"circles": {

 

"enabled": true, // true - вкл., false - выкл.

 

"major": [

 

{

 

// окружность максимальной дальности засвета в игре

 

"alpha": 65, //яркость окружности

 

"color": "0xFF8000", // цвет окружности

 

"distance": 445, // дистанция

 

"enabled": true, // true - вкл., false - выкл.

 

"thickness": 0.75 //толщина линии

 

},

 

{

 

// окружность ренгена

 

"alpha": 40, //яркость окружности

 

"color": "0xFFFFFF", // цвет окружности

 

"distance": 50, // дистанция

 

"enabled": true, // true - вкл., false - выкл.

 

"thickness": 1.0 //толщина линии

 

}

 

],

 

"special": []

 

},

 

// блоки настройки параметров динамических окружностей

 

"tankrange": {

 

// окружность в случае артиллерии

 

"circle_artillery": {

 

"alpha": 50, //яркость окружности

 

"color": "0xFF0000", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.5 //толщина линии

 

},

 

// динамическая окружность с учётом трубы, прокачанности экипажа, перков и доп. пайка. просветлённая оптика не учитывается

 

"circle_binocular": {

 

"alpha": 60, //яркость окружности

 

"color": "0x008DFF", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.7 //толщина линии

 

},

 

// динамическая окружность с учётом просветлённой оптики или её отсутствия, прокачки экипажа, перков и доп. пайка

 

"circle_view": {

 

"alpha": 70, //яркость окружности

 

"color": "0x00EFFF", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.7 //толщина линии

 

},

 

// окружность дальности эффективной стрельбы для лоу левельных пулемётчиков

 

"circle_shell": {

 

"alpha": 60, //яркость окружности

 

"color": "0xFF00DC", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.6 //толщина линии

 

},

 

//не показывать окружность в случае артилерии

 

"ignore_artillery": false, // true - вкл., false выкл.

 

// включение ограничения окружностей, превышающих 445 метров.

 

"spotting_limit": false,

 

//сохранение лога в файл

 

"logging": false, // true - вкл., false - выкл.

 

// системное уведомление о расстоянии обзора, при снятии, или монтаже оборудования, доп. пайков и при изучении перков экипажа на улучшение видимости.

 

"notify_changes": true // true - вкл., false - выкл.

 

}

 

}

Share this post


Link to post

Short link
Share on other sites

я все понимаю, но при первом же запуске игры конфиг становится такого плана:

 

{

 

"circles": {

 

"enabled": true,

 

"major": [

 

{

 

"alpha": 65,

 

"color": "0xFF8000",

 

"distance": 445,

 

"enabled": true,

 

"thickness": 0.75

 

},

 

{

 

"alpha": 40,

 

"color": "0xFFFFFF",

 

"distance": 50,

 

"enabled": true,

 

"thickness": 1.0

 

}

 

],

 

"special": [

 

{

 

"france-AMX50_Foch": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 444.15228000000008

 

}

 

},

 

{

 

"usa-M18_Hellcat": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 407.00000000000006

 

}

 

},

 

{

 

"usa-T32": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 408.57142857142861

 

}

 

},

 

{

 

"japan-Chi_Ha": {

 

"$ref": {

 

"path": "tankrange.circle_binocular"

 

},

 

"distance": 426.73242857142861

 

}

 

},

 

{

 

"japan-Chi_Ha": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 341.38594285714288

 

}

 

},

 

{

 

"germany-JagdTiger": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 454.18597714285721

 

}

 

},

 

{

 

"ussr-Object_704": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 413.46574285714286

 

}

 

},

 

{

 

"uk-GB75_AT7": {

 

"$ref": {

 

"path": "tankrange.circle_binocular"

 

},

 

"distance": 450.10192500000005

 

}

 

},

 

{

 

"uk-GB75_AT7": {

 

"$ref": {

 

"path": "tankrange.circle_view"

 

},

 

"distance": 360.08154000000002

 

}

 

}

 

]

 

},

 

"tankrange": {

 

"circle_artillery": {

 

"alpha": 50,

 

"color": "0xFF0000",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.5

 

},

 

"circle_binocular": {

 

"alpha": 60,

 

"color": "0x008DFF",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.69999999999999996

 

},

 

"circle_shell": {

 

"alpha": 60,

 

"color": "0xFF00DC",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.59999999999999998

 

},

 

"circle_view": {

 

"alpha": 70,

 

"color": "0x00EFFF",

 

"enabled": true,

 

"filled": false,

 

"thickness": 0.69999999999999996

 

},

 

"ignore_artillery": false,

 

"logging": false,

 

"notify_changes": true,

 

"spotting_limit": false

 

}

 

}

хотя до запуска выглядит вот так:

 

{

 

// отображение всех окружностей на карте

 

"circles": {

 

"enabled": true, // true - вкл., false - выкл.

 

"major": [

 

{

 

// окружность максимальной дальности засвета в игре

 

"alpha": 65, //яркость окружности

 

"color": "0xFF8000", // цвет окружности

 

"distance": 445, // дистанция

 

"enabled": true, // true - вкл., false - выкл.

 

"thickness": 0.75 //толщина линии

 

},

 

{

 

// окружность ренгена

 

"alpha": 40, //яркость окружности

 

"color": "0xFFFFFF", // цвет окружности

 

"distance": 50, // дистанция

 

"enabled": true, // true - вкл., false - выкл.

 

"thickness": 1.0 //толщина линии

 

}

 

],

 

"special": []

 

},

 

// блоки настройки параметров динамических окружностей

 

"tankrange": {

 

// окружность в случае артиллерии

 

"circle_artillery": {

 

"alpha": 50, //яркость окружности

 

"color": "0xFF0000", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.5 //толщина линии

 

},

 

// динамическая окружность с учётом трубы, прокачанности экипажа, перков и доп. пайка. просветлённая оптика не учитывается

 

"circle_binocular": {

 

"alpha": 60, //яркость окружности

 

"color": "0x008DFF", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.7 //толщина линии

 

},

 

// динамическая окружность с учётом просветлённой оптики или её отсутствия, прокачки экипажа, перков и доп. пайка

 

"circle_view": {

 

"alpha": 70, //яркость окружности

 

"color": "0x00EFFF", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.7 //толщина линии

 

},

 

// окружность дальности эффективной стрельбы для лоу левельных пулемётчиков

 

"circle_shell": {

 

"alpha": 60, //яркость окружности

 

"color": "0xFF00DC", // цвет окружности

 

"enabled": true, // true - вкл., false - выкл.

 

"filled": false, // заполнение окружности цветом, true - вкл., false - выкл.

 

"thickness": 0.6 //толщина линии

 

},

 

//не показывать окружность в случае артилерии

 

"ignore_artillery": false, // true - вкл., false выкл.

 

// включение ограничения окружностей, превышающих 445 метров.

 

"spotting_limit": false,

 

//сохранение лога в файл

 

"logging": false, // true - вкл., false - выкл.

 

// системное уведомление о расстоянии обзора, при снятии, или монтаже оборудования, доп. пайков и при изучении перков экипажа на улучшение видимости.

 

"notify_changes": true // true - вкл., false - выкл.

 

}

 

}

а надо, что бы до запуска, выглядел так

{
  "circles": {
    "enabled": true, 
    "major": [
      {
        "alpha": 45, 
        "color": "0xFFCC66", 
        "distance": 445, 
        "enabled": false, 
        "thickness": 0.75
      }, 
      {
        "alpha": 100, 
        "color": "0xFFFFFF", 
        "distance": 50, 
        "enabled": false, 
        "thickness": 1.0
      }
    ], 
    "special": []
  }, 
  "tankrange": {
    "circle_artillery": {
      "alpha": 50, 
      "color": "0xFF0000", 
      "enabled": true, 
      "filled": false, 
      "thickness": 0.5
    }, 
    "circle_binocular": {
      "alpha": 50, 
      "color": "0xFFFFFF", 
      "enabled": true, 
      "filled": false, 
      "thickness": 0.5
    }, 
    "circle_view": {
      "alpha": 50, 
      "color": "0xFFFFFF", 
      "enabled": true, 
      "filled": false, 
      "thickness": 0.5
    }, 
    "circle_shell": {
      "alpha": 50, 
      "color": "0x00FF00", 
      "enabled": true, 
      "filled": false, 
      "thickness": 0.5
    },
    "ignore_artillery": true, 
    "logging": false, 
    "notify_changes": true, 
    "spotting_limit": true
  }
}

я ведь в своём посте приложил minimapCircles.xc  вот тут он лежит

Share this post


Link to post

Short link
Share on other sites

 

 

я ведь в своём посте приложил minimapCircles.xc
а нельзя чтобы он выглядел с комментариями?

Share this post


Link to post

Short link
Share on other sites

а нельзя чтобы он выглядел с комментариями?

К сожалению, мод пилил не я и условия выполнения данного скрипта тоже.

И я не могу с полной уверенностью сказать, возможно-ли вообще подобное, так как не умею в кодинг.

Share this post


Link to post

Short link
Share on other sites

На сколько я знаю, коментарии в конфиге недопустимы.

Они удалятся при первом запуске.

По крайней мере, так было при 1.6, после я не пробовал. Но скорее так и осталось.

Share this post


Link to post

Short link
Share on other sites

На сколько я знаю, коментарии в конфиге недопустимы.

Они удалятся при первом запуске.

По крайней мере, так было при 1.6, после я не пробовал. Но скорее так и осталось.

ну какгбэ лочично.

в противном случае, автор бы выложил tankrange.xc с коментариями, а не в том виде, что сейчас

Share this post


Link to post

Short link
Share on other sites

Добавил Инструкцию по настройке квадрата отрисовки на миникарте.

Share this post


Link to post

Short link
Share on other sites

ну какгбэ лочично.

в противном случае, автор бы выложил tankrange.xc с коментариями, а не в том виде, что сейчас

 

Да но то что прописывается по дефолту, находится в скрипте "pyc"

Можно же его изменить, что бы по дефолту конфиг писался с коментами.

Share this post


Link to post

Short link
Share on other sites

Да но то что прописывается по дефолту, находится в скрипте "pyc"

Можно же его изменить, что бы по дефолту конфиг писался с коментами.

 

К сожалению, мод пилил не я и условия выполнения данного скрипта тоже.

И я не могу с полной уверенностью сказать, возможно-ли вообще подобное, так как не умею в кодинг.

ключевые слова  "не умею в кодинг"      :gg: 

а автор не считает нужным это делать.

Edited by evil_rrock

Share this post


Link to post

Short link
Share on other sites

Вот декомпиленный исходник, мода который в первом посте выложен.

import BigWorld
from Event import Event
from items import vehicles
from helpers import isPlayerAccount
from adisp import async, process
from account_helpers.AccountSettings import AccountSettings, CURRENT_VEHICLE
from gui.ClientUpdateManager import g_clientUpdateManager
from gui import prb_control
from gui.shared import g_itemsCache, REQ_CRITERIA
from gui.shared.utils.HangarSpace import g_hangarSpace
from gui.shared.gui_items import GUI_ITEM_TYPE
from gui.shared.gui_items.Vehicle import Vehicle
from gui.Scaleform.locale.MENU import MENU
from gui.Scaleform.Waiting import Waiting
import io, os, json, codecs, math
from items import tankmen
from debug_utils import *

class _CurrentVehicle():

    def __init__(self):
        self.__vehInvID = 0
        self.__changeCallbackID = None
        self.onChanged = Event()
        self.onChangeStarted = Event()
        self.__crew = {}
        return

    def init(self):
        g_clientUpdateManager.addCallbacks({'inventory': self.onInventoryUpdate,
         'cache.vehsLock': self.onLocksUpdate})
        prbVehicle = self.__checkPrebattleLockedVehicle()
        storedVehInvID = AccountSettings.getFavorites(CURRENT_VEHICLE)
        self.selectVehicle(prbVehicle or storedVehInvID)

    def destroy(self):
        self.__vehInvID = 0
        self.__clearChangeCallback()
        self.onChanged.clear()
        self.onChangeStarted.clear()
        g_clientUpdateManager.removeObjectCallbacks(self)
        g_hangarSpace.removeVehicle()
        self.selectNoVehicle()

    def onInventoryUpdate(self, invDiff):
        vehsDiff = invDiff.get(GUI_ITEM_TYPE.VEHICLE, {})
        isVehicleSold = False
        isVehicleDescrChanged = False
        if 'compDescr' in vehsDiff and self.__vehInvID in vehsDiff['compDescr']:
            isVehicleSold = vehsDiff['compDescr'][self.__vehInvID] is None
            isVehicleDescrChanged = not isVehicleSold
        if isVehicleSold or self.__vehInvID == 0:
            self.selectVehicle()
        else:
            isRepaired = False
            if 'repair' in vehsDiff:
                isRepaired = self.__vehInvID in vehsDiff['repair']
            if GUI_ITEM_TYPE.GUN not in invDiff:
                isComponentsChanged = GUI_ITEM_TYPE.TURRET in invDiff
                isVehicleChanged = len(filter(lambda hive: self.__vehInvID in hive, vehsDiff.itervalues())) > 0
                if isComponentsChanged or isRepaired or isVehicleDescrChanged:
                    self.refreshModel()
                (isVehicleChanged or isRepaired) and self.onChanged()
        if self.isPresent():
            self.__updateViewRange()
        return

    def onLocksUpdate(self, locksDiff):
        if self.__vehInvID in locksDiff:
            self.refreshModel()

    def refreshModel(self):
        if self.isPresent() and self.isInHangar() and self.item.modelState:
            g_hangarSpace.updateVehicle(self.item)
        else:
            g_hangarSpace.removeVehicle()

    @property
    def invID(self):
        return self.__vehInvID

    @property
    def item(self):
        if self.__vehInvID > 0:
            return g_itemsCache.items.getVehicle(self.__vehInvID)
        else:
            return None
            return None

    def isPresent(self):
        return self.item is not None

    def isBroken(self):
        return self.isPresent() and self.item.isBroken

    def isDisabledInRoaming(self):
        return self.isPresent() and self.item.isDisabledInRoaming

    def isLocked(self):
        return self.isPresent() and self.item.isLocked

    def isClanLock(self):
        return self.isPresent() and self.item.clanLock > 0

    def isCrewFull(self):
        return self.isPresent() and self.item.isCrewFull

    def isInBattle(self):
        return self.isPresent() and self.item.isInBattle

    def isInHangar(self):
        return self.isPresent() and not self.item.isInBattle

    def isAwaitingBattle(self):
        return self.isPresent() and self.item.isAwaitingBattle

    def isAlive(self):
        return self.isPresent() and self.item.isAlive

    def isReadyToPrebattle(self):
        return self.isPresent() and self.item.isReadyToPrebattle

    def isReadyToFight(self):
        return self.isPresent() and self.item.isReadyToFight

    def isAutoLoadFull(self):
        if self.isPresent() and self.item.isAutoLoad:
            for shell in self.item.shells:
                if shell.count != shell.defaultCount:
                    return False

        return True

    def isAutoEquipFull(self):
        if self.isPresent() and self.item.isAutoEquip:
            return self.item.eqs == self.item.eqsLayout
        return True

    def selectVehicle(self, vehInvID = 0):
        vehicle = g_itemsCache.items.getVehicle(vehInvID)
        if vehicle is None:
            invVehs = g_itemsCache.items.getVehicles(criteria=REQ_CRITERIA.INVENTORY)
            if len(invVehs):
                vehInvID = sorted(invVehs.itervalues())[0].invID
            else:
                vehInvID = 0
        self.__selectVehicle(vehInvID)
        return

    def selectNoVehicle(self):
        self.__selectVehicle(0)

    def getHangarMessage(self):
        if self.isPresent():
            state, stateLvl = self.item.getState()
            return ('#menu:currentVehicleStatus/' + state, stateLvl)
        return (MENU.CURRENTVEHICLESTATUS_NOTPRESENT, Vehicle.VEHICLE_STATE_LEVEL.CRITICAL)

    def __selectVehicle(self, vehInvID):
        if vehInvID == self.__vehInvID:
            return
        Waiting.show('updateCurrentVehicle', isSingle=True)
        self.onChangeStarted()
        self.__vehInvID = vehInvID
        AccountSettings.setFavorites(CURRENT_VEHICLE, vehInvID)
        self.refreshModel()
        if not self.__changeCallbackID:
            self.__changeCallbackID = BigWorld.callback(0.1, self.__changeDone)
        if self.isPresent():
            self.__updateViewRange()

    def __updateViewRange(self):
        xvm_conf = {}
        xvm_configuration_file = os.getcwd() + os.sep + 'res_mods' + os.sep + 'xvm' + os.sep + 'tankrange.xc'
        if not os.path.exists(xvm_configuration_file):
            LOG_NOTE('Configuration file missing (' + xvm_configuration_file + '). Creating.')
        else:
            data = ''
            blockComment = False
            f = codecs.open(xvm_configuration_file, 'r', '"utf-8-sig"')
            for line in f.read().split('\n'):
                line = line.strip()
                if line != '':
                    comment = line.find('/*')
                    if comment != -1 and comment == 0:
                        blockComment = True
                        continue
                    comment = line.find('*/')
                    if comment != -1:
                        blockComment = False
                        continue
                    if blockComment == True:
                        continue
                    comment = line.find('//')
                    if comment != -1 and comment == 0:
                        continue
                    position = 0
                    for i in range(0, line.count('//')):
                        comment = line.find('//', position + 2)
                        if comment != -1:
                            colon = line.find(':')
                            startSpeach = line.find('"', colon + 1)
                            if startSpeach > comment:
                                line = line[:comment].strip()
                            endSpeach = line.find('"', startSpeach + 1)
                            if comment > endSpeach:
                                line = line[:comment].strip()
                        position += comment

                    if line != '':
                        data += line + '\n'

            f.close()
            xvm_conf = json.loads(data)
        if not xvm_conf['tankrange'].has_key('spotting_limit'):
            xvm_conf['tankrange']['spotting_limit'] = True
        tank_name = g_itemsCache.items.getVehicle(self.__vehInvID).descriptor.type.name.replace(':', '-')
        if xvm_conf['tankrange']['logging']:
            LOG_NOTE('Tank Name: ', tank_name)
        if not self.isCrewFull():
            if xvm_conf['tankrange']['logging']:
                LOG_NOTE('no full crew')
            return
        remaining = []
        for tank_data in xvm_conf['circles']['special']:
            if tank_data.keys()[0] != tank_name:
                remaining.append(tank_data)

        xvm_conf['circles']['special'] = remaining
        if xvm_conf['tankrange']['ignore_artillery'] and 'SPG' in g_itemsCache.items.getVehicle(self.__vehInvID).descriptor.type.tags:
            f = codecs.open(xvm_configuration_file, 'w', '"utf-8-sig"')
            f.write(unicode(json.dumps(xvm_conf, ensure_ascii=False, indent=2)))
            f.close()
            if xvm_conf['tankrange']['logging']:
                LOG_NOTE('Ignoring ' + vehicle_type + ' tank.')
            return
        view_distance = g_itemsCache.items.getVehicle(self.__vehInvID).descriptor.turret['circularVisionRadius']
        if xvm_conf['tankrange']['logging']:
            LOG_NOTE('Base View Range: ', view_distance)
        ventilation = self.__isOptionalEquipped('improvedVentilation')
        if xvm_conf['tankrange']['logging'] and ventilation:
            LOG_NOTE('Ventilation Found')
        consumable = False
        if self.__isConsumableEquipped('ration'):
            consumable = True
        if self.__isConsumableEquipped('chocolate'):
            consumable = True
        if self.__isConsumableEquipped('cocacola'):
            consumable = True
        if self.__isConsumableEquipped('hotCoffee'):
            consumable = True
        if xvm_conf['tankrange']['logging'] and consumable:
            LOG_NOTE('Premium Consumable Found')
        self.__updateCrew()
        brothers_in_arms = True
        if len(self.__crew) == 0:
            brothers_in_arms = False
        else:
            for name, data in self.__crew.iteritems():
                if 'brotherhood' not in data['skill']:
                    brothers_in_arms = False

        if xvm_conf['tankrange']['logging'] and brothers_in_arms:
            LOG_NOTE('BIA Found')
        commander_skill = 0
        if 'commander' in self.__crew:
            commander_skill = self.__crew['commander']['level']
            if brothers_in_arms == True:
                commander_skill += 5
            if ventilation == True:
                commander_skill += 5
            if consumable == True:
                commander_skill += 10
            if xvm_conf['tankrange']['logging']:
                LOG_NOTE('Commander Skill: ', commander_skill)
        other_bonus = 1.0
        for name, data in self.__crew.iteritems():
            if 'commander_eagleEye' in data['skill']:
                other_bonus *= 1.0 + 0.0002 * data['skill']['commander_eagleEye']
                if xvm_conf['tankrange']['logging']:
                    LOG_NOTE('Recon Bonus: ', 1.0 + 0.0002 * data['skill']['commander_eagleEye'])
            if 'radioman_finder' in data['skill']:
                other_bonus *= 1.0 + 0.0002 * data['skill']['radioman_finder']
                if xvm_conf['tankrange']['logging']:
                    LOG_NOTE('Situational Awareness Bonus: ', 1.0 + 0.0003 * data['skill']['radioman_finder'])

        binoculars = self.__isOptionalEquipped('stereoscope')
        if xvm_conf['tankrange']['logging'] and binoculars:
            LOG_NOTE('Binoculars Found')
        coated_optics = self.__isOptionalEquipped('coatedOptics')
        if xvm_conf['tankrange']['logging'] and coated_optics:
            LOG_NOTE('Coated Optics Found')
        view_distance = view_distance / 0.875 * (0.00375 * commander_skill + 0.5) * other_bonus
        if xvm_conf['tankrange']['logging']:
            LOG_NOTE('Other Bonus:', other_bonus)
            LOG_NOTE('Final View Range: ', view_distance)
        if xvm_conf['tankrange']['circle_binocular']['enabled'] and binoculars:
            binocular_distance = view_distance * 1.25
            if xvm_conf['tankrange']['spotting_limit']:
                binocular_distance = min(445, binocular_distance)
            if not xvm_conf['tankrange']['circle_binocular']['filled']:
                xvm_conf['circles']['special'].append({tank_name: {'$ref': {'path': 'tankrange.circle_binocular'},
                             'distance': binocular_distance}})
            else:
                xvm_conf['circles']['special'].append({tank_name: {'$ref': {'path': 'tankrange.circle_binocular'},
                             'thickness': binocular_distance * 0.25 - 14,
                             'distance': binocular_distance * 0.5}})
        if coated_optics == True:
            view_distance = min(view_distance * 1.1, 500)
        if xvm_conf['tankrange']['circle_view']['enabled']:
            if xvm_conf['tankrange']['spotting_limit']:
                view_distance = min(445, view_distance)
            if not xvm_conf['tankrange']['circle_view']['filled']:
                xvm_conf['circles']['special'].append({tank_name: {'$ref': {'path': 'tankrange.circle_view'},
                             'distance': view_distance}})
            else:
                xvm_conf['circles']['special'].append({tank_name: {'$ref': {'path': 'tankrange.circle_view'},
                             'thickness': view_distance * 0.25 - 14,
                             'distance': view_distance * 0.5}})
        if xvm_conf['tankrange']['circle_artillery']['enabled'] and 'SPG' in g_itemsCache.items.getVehicle(self.__vehInvID).descriptor.type.tags:
            artillery_range = 0
            for shell in g_itemsCache.items.getVehicle(self.__vehInvID).descriptor.gun['shots']:
                artillery_range = max(artillery_range, round(math.pow(shell['speed'], 2) / shell['gravity']))

            if xvm_conf['tankrange']['logging']:
                LOG_NOTE('Calculated Firing Range:', artillery_range)
            if not xvm_conf['tankrange']['circle_artillery']['filled']:
                xvm_conf['circles']['special'].append({tank_name: {'$ref': {'path': 'tankrange.circle_artillery'},
                             'distance': artillery_range}})
            else:
                xvm_conf['circles']['special'].append({tank_name: {'$ref': {'path': 'tankrange.circle_artillery'},
                             'thickness': artillery_range * 0.25 - 14,
                             'distance': artillery_range * 0.5}})
        f = codecs.open(xvm_configuration_file, 'w', '"utf-8-sig"')
        f.write(unicode(json.dumps(xvm_conf, ensure_ascii=False, indent=2, sort_keys=True)))
        f.close()

    @process
    def __updateCrew(self):
        from gui.shared.utils.requesters import Requester
        self.__crew.clear()
        barracks = yield Requester('tankman').getFromInventory()
        for tankman in barracks:
            for crewman in self.item.crew:
                if crewman[1] is not None and crewman[1].invID == tankman.inventoryId:
                    crew_member = {'level': tankman.descriptor.roleLevel,
                     'skill': {}}
                    skills = []
                    for skill_name in tankman.descriptor.skills:
                        skills.append({'name': skill_name,
                         'level': 100})

                    if len(skills) != 0:
                        skills[-1]['level'] = tankman.descriptor.lastSkillLevel
                    for skill in skills:
                        crew_member['skill'][skill['name']] = skill['level']

                    self.__crew[tankman.descriptor.role] = crew_member

        return

    def __isOptionalEquipped(self, optional_name):
        for item in self.item.descriptor.optionalDevices:
            if item is not None and optional_name in item.name:
                return True

        return False

    def __isConsumableEquipped(self, consumable_name):
        from gui.shared.utils.requesters import VehicleItemsRequester
        for item in self.item.eqsLayout:
            if item is not None and consumable_name in item.descriptor.name:
                return True

        return False

    def __changeDone(self):
        self.__clearChangeCallback()
        if isPlayerAccount():
            self.onChanged()
        Waiting.hide('updateCurrentVehicle')

    def __clearChangeCallback(self):
        if self.__changeCallbackID is not None:
            BigWorld.cancelCallback(self.__changeCallbackID)
            self.__changeCallbackID = None
        return

    def __checkPrebattleLockedVehicle(self):
        clientPrb = prb_control.getClientPrebattle()
        if clientPrb is not None:
            rosters = prb_control.getPrebattleRosters(prebattle=clientPrb)
            for rId, roster in rosters.iteritems():
                if BigWorld.player().id in roster:
                    vehCompDescr = roster[BigWorld.player().id].get('vehCompDescr', '')
                    if len(vehCompDescr):
                        vehDescr = vehicles.VehicleDescr(vehCompDescr)
                        vehicle = g_itemsCache.items.getItemByCD(vehDescr.type.compactDescr)
                        if vehicle is not None:
                            return vehicle.invID

        return 0

    def __repr__(self):
        return 'CurrentVehicle(%s)' % str(self.item)


g_currentVehicle = _CurrentVehicle()


Нельзя сделать то что вы просите, т.е. нельзя добавить запись комментов, т.к. информация о каждом танке формируется в виде json-объекта, который потом записывается в файл встроенными функциями. 
....
f = codecs.open(xvm_configuration_file, 'w', '"utf-8-sig"')
f.write(unicode(json.dumps(xvm_conf, ensure_ascii=False, indent=2)))
f.close()
....

Дописывать комменты просто некуда, весь процесс автоматизирован :)))

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Не, у него есть блок в скрипте который отвечает за комменты. Но, что то он неправильно пашет.

Идет проверка на "есть файл" "нету файла"
Потом идет проверка на комментарии
 

'кусок кода'

        # Load configuration
        xvm_configuration_file = os.getcwd() + os.sep + 'res_mods' + os.sep + 'xvm' + os.sep + 'tankrange.xc'
        if not os.path.exists(xvm_configuration_file):
            LOG_NOTE("Configuration file missing (" + xvm_configuration_file + "). Creating.")
        else:
            data = ""
            blockComment = False

            f = codecs.open(xvm_configuration_file, 'r', '"utf-8-sig"')
            for line in f.read().split('\n'):
                line = line.strip()
                if line != "":
                    # Start of block comment
                    comment = line.find("/*")
                    if comment != -1 and comment == 0:
                        blockComment = True
                        continue

                    # End of block comment
                    comment = line.find("*/")
                    if comment != -1:
                        blockComment = False
                        continue

                    # Block Comment
                    if blockComment == True:
                        continue

                    # Start of line comment
                    comment = line.find("//")
                    if comment != -1 and comment == 0:
                        continue

                    # Remove end of line comments
                    position = 0
                    for i in range(0,line.count("//")):
                        comment = line.find("//", position+2)
                        if comment != -1:
                            colon = line.find(":")

                            startSpeach = line.find("\"", colon+1)
                            if startSpeach > comment:
                                line = line[:comment].strip()

                            endSpeach = line.find("\"", startSpeach+1)
                            if comment > endSpeach:
                                line = line[:comment].strip()

                        position += comment

                    if line != "":
                        data += line + '\n'
            f.close()

Edited by Dimitro

Share this post


Link to post

Short link
Share on other sites

@Dimitro, насколько я понимаю, это алгоритм, который удаляет комменты из блока текста читаемого файла, чтобы потом передать текст в json-парсер и чтобы тот не тупил, похоже json-парсер в питоне не умеет сам игнорировать комменты. К записи этот код отношения то не имеет.


В принципе можно в конце алгоритма записи сделать повторное открытие xc-файла, найти в нем нужные строки и дописать комменты, это не сложно, но так ли уж нужно это? 

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Алгоритм прост как два рубля:

- открывается xc-файл

- читается по строчно

- если в строках есть комменты их удаляют

- получающийся блок текста скармливают json-парсеру

- он анализирует его-

- после этого работаем с объектной json-структурой

- меняем ее или не меняем или создаем новую, смотря какой танк выбран и чего у него есть

- просим json-парсер преобразовать объектную структуру в блок текста******

- записываем блок текста в xc-файл.

 

Думаю можно после **** в блоке текста дописать комменты и всё.

Вместо вот этой строки

f.write(unicode(json.dumps(xvm_conf, ensure_ascii=False, indent=2)))

сделать

data=json.dumps(xvm_conf, ensure_ascii=False, indent=2)
....
<всталяем комменты в нужных местах data>
....
f.write(unicode(data))


А вообще ребята кто со строками в питоне умеет работать, напишите просто алгоритм, который открывает xc-файл и дописывает в нужные места комменты. А потом его можно просто вставить в то место что я указал выше.

f = open('tankrange.xc', 'r')
data = f.read()
f.close()
...
<находим нужные места в data и вставляем комменты>
...
f = open('tankrange.xc', 'w')
f.write(data)
f.close()

Я бы сам сделал, но питон не мой язык, не охота копаться, может кто быстрее сделает.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Ничего не понял,сделал по инструкции,естественно ничего не заработало

0233295771e6.jpg

Пока не поставил tankrange.xc в папку с конфигом.Это не соответствует руководству,да и вряд ли сам скрипт работать будет таким способом.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

, tankrange.xc уже сам не создается, если ты об этом.

Это я видел.Он работает из (т.е. в него записывается инфа и пр.) C:\Games\World_of_Tanks\res_mods\xvm,но в этом случае ломается основной конфиг и происходит...см.скрин выше.Только когда закидываешь tankrange.xc в папку с конфигом(в моем случае это:C:\Games\World_of_Tanks\res_mods\xvm\configs\Slava7572.),только тогда работает сам XVM.

Share this post


Link to post

Short link
Share on other sites

Это я видел.Он работает из (т.е. в него записывается инфа и пр.) C:\Games\World_of_Tanks\res_mods\xvm,но в этом случае ломается основной конфиг и происходит...см.скрин выше.Только когда закидываешь tankrange.xc в папку с конфигом(в моем случае это:C:\Games\World_of_Tanks\res_mods\xvm\configs\Slava7572.),только тогда работает сам XVM.

вот немного оригинальный способ потанцевать с бубном

http://www.koreanrandom.com/forum/topic/8279-0810-xvm-tank-minimap-ranges-забугорный-мод/?p=138630

но возможно наведёт на нужную мысль

 

P.S. tankrange.xc  должен жить тут \res_mods\xvm предусмотрено скриптом.

в minimap.xc  надо внести изменения в блоке

// Круги на миникарте.
        "circles": ${"minimapCircles.xc":"circles"},

заменить на

"circles": ${"../tankrange.xc":"circles"},

P.P.S. ещё как вариант, если конфиг раздельный, могу под ваш путь конфига изменить скрипт который будет напрямую работать с minimapCircles.xc

Edited by evil_rrock

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...