Jump to content
Korean Random

AntonVK

User
  • Content Count

    156
  • Joined

  • Last visited

  • Days Won

    13

Posts posted by AntonVK


  1. On 11/14/2020 at 8:19 AM, beb said:

    Скажите, а как определяются вертикальные координаты объектов (время, дата, день)?
    Повод для вопроса: одинаковые заданные в xml вертикальные координаты дают одинаковое расположение объектов по вертикали только если одинаковы их шрифты и размер шрифта. При этом в никаком случае эти заданные координаты не соответствуют фактическим.

    Горизонтальные координаты у меня также никогда не соответствуют фактическим, но в этом случае, по крайней мере, нет проблемы выровнять элементы друг относительно друга (иными словами, по ширине экрана объекты равноудалены от начала отсчета при одинаковых заданных координатах независимо от шрифта и его размера).

    В итоге, невозможно заранее измерить (например, на скриншоте) желаемое расположение, и потом просто задать его. Всякий раз необходимо вручную подбирать, благо это все же можно сделать на лету, не перезапуская клиент..
    Сейчас для меня это уже не так актуально, так как на данный момент желаемое расположение вроде как найдено, но тут дело принципа, - а вдруг завтра захочется чего-то новенького. 

    На всякий случай, мой современный конфиг (он для меня не идеален, в том числе, ввиду интерфейсных различий в EU и CIS клиентах, что обуславливает не универсальность единой конфигурации, но пока я остановился в изысканиях на таком):

    
    <?xml version="1.0" encoding="utf-8"?>
    <hangarClock align="left" offsetX="0" offsetY="0">
        <ConfigBackground visible="false"></ConfigBackground>
        <ConfigClock visible="true" AMPM="false" blink="true" sepWidth="0">
            <position x="424" y="7"/>
            <text align="left" color="0xffbe4c" size="32" font="UniversCondC"/>
            <formatHrs offsetHrs="0" visible="true">{HH}</formatHrs>
            <formatMin offsetMin="0" visible="true">{mm}</formatMin>
            <formatSec offsetSec="0" visible="false">{ss}</formatSec>
            </ConfigClock>
        <ConfigDate visible="true">
            <position x="504" y="8"/>
            <text align="left" color="0xffbe4c" size="16" font="UniversCondC"/>
            <format dd="true">{fullYear}.{month}.{date}</format>
            </ConfigDate>
        <ConfigDay visible="true">
            <position x="504" y="26"/>
            <text align="left" color="0xffbe4c" size="12" font="UniversCondC"/>
            <format>{day}</format>
            </ConfigDay>
        <Day>
            <Su>НЕДІЛЯ</Su>
            <Mo>ПОНЕДІЛОК</Mo>
            <Tu>ВІВТОРОК</Tu>
            <We>СЕРЕДА</We>
            <Th>ЧЕТВЕР</Th>
            <Fr>П'ЯТНИЦЯ</Fr>
            <Sa>СУБОТА</Sa>
            </Day>
        <Month>
            <Jan>01</Jan>
            <Feb>02</Feb>
            <Mar>03</Mar>
            <Apr>04</Apr>
            <May>05</May>
            <Jun>06</Jun>
            <Jul>07</Jul>
            <Aug>08</Aug>
            <Sep>09</Sep>
            <Oct>10</Oct>
            <Nov>11</Nov>
            <Dec>12</Dec>
            </Month>
    </hangarClock>

     

     

     

    configHangarClock 20201123 sized.png

     

     

    Добрый день.

     

    Прошу прощения, что так поздно увидел ваше сообщение, давно не заходил на форум.

     

    По поводу вашего вопроса, вертикальное выравнивание совсем простое, то, что указано в конфиге, то и применяется. Но обратите внимание, сам текст расположен внутри текстового поля и к нему уже интерпретатор применяет вертикальное выравнивание и горизонтальное в рамках этого поля. Ориентироваться визуально на границы шрифта нельзя.

     

    Обратите внимание на скриншот, вот как раз выравнивание применяется к границам текстовых полей. Горизонтальное выравнивание сложнее, там суммируются значения в зависимости от разных факторов, но суть та же. По шрифту ориентироваться нельзя. Невидимые границы текстовых полей - другие.

     

    1001659486_2021-06-25034552.thumb.png.5213808e46bb991f1295b136ae95d0e1.png

     

    В коде это считается просто совсем для вертикального выравнивания

     

    clockHrs.y = offsetY + Number(configData.ConfigClock.position.@y);

     

    Но еще раз повторю, это применяется к невидимым границам. Сам текст внутри этого поля и там как он уже машинно отрендерится

     

    614201969_2021-06-25035744.thumb.png.3ad83bc26431e5fcc9129a7952680c04.png

     

    #######

    #######

    #######

    #######

    #######

    #######

    #######

    #######

     

    Совершенно не ясно, зачем форум объединяет посты в один, в результате я не могу написать два отдельных поста подряд

     

     

    On 10/26/2020 at 1:23 PM, AntonVK said:

    Обновлено до актуальной версии игры 1.10.1.x

     

    Обновлено до актуальной версии игры 1.13.0.0. Обновления в шапке.

    • Upvote 1

  2. 11 hours ago, Nowik1971 said:

    Нет двоеточия между цифрами часов пришлось поставить так :

    
            <formatHrs offsetHrs="0">{HH} :}</formatHrs>
    		<formatMin offsetMin="0">{mm} :}</formatMin>
    		<formatSec offsetSec="0" visible="true">{ss}</formatSec>
    		<formatAMPM offsetAMPM="4"></formatAMPM >

    Может не правильно , но все работает ...

     

    Двоеточие есть. Я все такие вещи проверяю. Это особенности шрифта Micra, так как он не пропорциональный, о чем я писал. Почему и были сделаны отступы в предыдущих версиях.

     

    Для шрифта Micra нужно примерно как-то так (это есть в примерах конфигураций) и манипулировать этими параметрами

     

    sepWidth="12"

    offsetHrs="4"

    offsetMin="4"

    offsetSec="4"

     

    	<ConfigClock visible="true" AMPM="false" blink="false" sepWidth="12">
    		<position x="-10" y="60"/>
    		<text bold="false" color="0xFFFFCC" font="Micra" size="16"/>
    		<filters enable="true" filter="shadow">
    			<glow blurX="4" blurY="4" color="0x000000" strength="1"/>
    			<shadow angle="45" blurX="2" blurY="2" color="0x000000" distance="2" strength="1"/>
    		</filters>
    		<formatHrs offsetHrs="4">{HH}</formatHrs>
    		<formatMin offsetMin="4">{mm}</formatMin>
    		<formatSec offsetSec="4" visible="true">{ss}</formatSec>
    		<formatAMPM offsetAMPM="4"></formatAMPM>
    	</ConfigClock>

     

    • Upvote 1

  3. On 5/14/2020 at 7:26 PM, beb said:

    Спасибо за развернутый ответ. Хорошо, даже и не буду пытаться что-то возражать в отношении сказанного. Но тем не менее, хотя на функциональность мода это никак не влияет, очевидное отличие вида часов в моде (где цифры отстоят от двоеточий на величину, стремящуюся к ширине цифр) от привычного вида цифровых часов (где эта величина стремится к ширине двоеточий) имеет место быть, во всяком случае для меня.

     

    Ок, забыли даже про <format>{HH}:{mm}:{ss}</format> (здесь ведь видится также проблема избыточного кода для реализации мигания).

     

    Я смотрел код, хотя и далек от программирования, логика подсказывает, что причина вот здесь:

     

    
    ...
                clockSep1.visible = true;
    			clockSep1.width = clockSep1.textWidth + 2;
    			if(clockSep1.width < 10) {
    				clockSep1.width = 10;
    			}
    ...
                clockSep2.visible = true;
    			clockSep2.width = clockSep2.textWidth + 2;
    			if(clockSep2.width < 10) {
    				clockSep2.width = 10;
    			}
    ...

    То есть, если меньше 10, то 10. Это видение автора. Не спорю. Так вот. Но я то думаю, а вдруг, если я не ошибаюсь, - а если дать пользователю возможность самому осознанно задать эту величину через configHangarClock.xml. Если я не ошибаюсь, опять таки, это всего один дополнительный пользовательский параметр в конфиге, какой-нибудь типа, условно, clockSepUserFactor: : <-10 ... +10>.

     

    
     			clockSep2.width = clockSep2.textWidth + 2 + clockSepUserFactor.width;
    			if(clockSep2.width < 10) и clockSepUserFactor.width = 0 {
    				clockSep2.width = 10;
    			}

     

     

    А? Ну позязя =)

     

    P.S. Я бы сам попробовал собрать и испытать такую версию мода, но боюсь что для этого придется ставить столько инструментов, что в этой жизни у меня такой подвиг не получится.

     

    Теперь без отступов, но можно ширину отступа настроить в конфиге

     

    On 10/25/2020 at 2:13 PM, crasovsky.a said:

    Ребята,а XVM настроить не пробовали.Зачем ещё моды грамоздить?

     

    Далеко не все пользуются XVM

    • Upvote 1

  4. Обновлено до актуальной версии игры 1.10.1.x

     

    Обновления в шапке.

     

    Теперь используются при компиляции оригинальные swc библиотеки WG из gui.pkg

     

    ПРОШУ ОБРАТИТЬ ВНИМАНИЕ!

     

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

    hcc-config-AntonVK.jpg.5e68221767cbb819e871bb8158c272f1.jpg

     

    изменения в конфигурационном файле коснулись этой секции.

     

    Параметры:

    sepWidth="0"

    <formatHrs offsetHrs="0">{HH}</formatHrs>
    <formatMin offsetMin="0">{mm}</formatMin>
    <formatSec offsetSec="0" visible="true">{ss}</formatSec>
    <formatAMPM offsetAMPM="4"></formatAMPM >

     

    Необходимо внести соответствующие изменения в ваши конфигуарционные файлы!

     

    Примеры конфигураций актуализированы в шапке.

     

    	<ConfigClock visible="true" AMPM="false" blink="false" sepWidth="0">
    		<position x="-10" y="57"/>
    		<text bold="false" color="0xFFFFCC" font="UniversCondC" size="22"/>
    		<filters enable="true" filter="shadow">
    			<glow blurX="4" blurY="4" color="0x000000" strength="1"/>
    			<shadow angle="45" blurX="2" blurY="2" color="0x000000" distance="2" strength="1"/>
    		</filters>
    		<formatHrs offsetHrs="0">{HH}</formatHrs>
    		<formatMin offsetMin="0">{mm}</formatMin>
    		<formatSec offsetSec="0" visible="true">{ss}</formatSec>
    		<formatAMPM offsetAMPM="4"></formatAMPM >
    	</ConfigClock>

     

    • Upvote 8

  5. On 10/22/2020 at 12:11 AM, Slava7572 said:

    какие то изменения в интерфейсе

    
    2020-10-21 23:56:55.164: WARNING: [WARNING] (scripts/client/gui/mods/__init__.py, 72): There is problem while import gui mod ('gui.mods', 'mod_hangarcalculatorbutton.pyc')
    2020-10-21 23:56:55.165: ERROR: [EXCEPTION] (scripts/client/gui/mods/__init__.py, 74):
    Traceback (most recent call last):
      File "scripts/client/gui/mods/__init__.py", line 67, in _findValidMODs
      File "scripts/common/Lib/importlib/__init__.py", line 37, in import_module
      File "mod_hangarCalculatorButton", line 13, in <module>
    ImportError: cannot import name ViewTypes

    и рядом,думал дубль

    
    2020-10-21 23:56:55.355: WARNING: [WARNING] (scripts/client/gui/mods/__init__.py, 72): There is problem while import gui mod ('gui.mods', 'mod_hangarcalculator.pyc')
    2020-10-21 23:56:55.356: ERROR: [EXCEPTION] (scripts/client/gui/mods/__init__.py, 74):
    Traceback (most recent call last):
      File "scripts/client/gui/mods/__init__.py", line 67, in _findValidMODs
      File "scripts/common/Lib/importlib/__init__.py", line 37, in import_module
      File "mod_hangarCalculator", line 11, in <module>
    ImportError: cannot import name ViewTypes

     

     

    В курсе проблемы. Что-то опять изменилось.

     

    On 10/22/2020 at 12:15 AM, crasovsky.a said:

    Только что играл ,всё норм работает

     

    У меня не работает мод. Как он работает у вас? 


  6. On 5/14/2020 at 7:26 PM, beb said:

    Спасибо за развернутый ответ. Хорошо, даже и не буду пытаться что-то возражать в отношении сказанного. Но тем не менее, хотя на функциональность мода это никак не влияет, очевидное отличие вида часов в моде (где цифры отстоят от двоеточий на величину, стремящуюся к ширине цифр) от привычного вида цифровых часов (где эта величина стремится к ширине двоеточий) имеет место быть, во всяком случае для меня.

     

    Ок, забыли даже про <format>{HH}:{mm}:{ss}</format> (здесь ведь видится также проблема избыточного кода для реализации мигания).

     

    Я смотрел код, хотя и далек от программирования, логика подсказывает, что причина вот здесь:

     

    
    ...
                clockSep1.visible = true;
    			clockSep1.width = clockSep1.textWidth + 2;
    			if(clockSep1.width < 10) {
    				clockSep1.width = 10;
    			}
    ...
                clockSep2.visible = true;
    			clockSep2.width = clockSep2.textWidth + 2;
    			if(clockSep2.width < 10) {
    				clockSep2.width = 10;
    			}
    ...

    То есть, если меньше 10, то 10. Это видение автора. Не спорю. Так вот. Но я то думаю, а вдруг, если я не ошибаюсь, - а если дать пользователю возможность самому осознанно задать эту величину через configHangarClock.xml. Если я не ошибаюсь, опять таки, это всего один дополнительный пользовательский параметр в конфиге, какой-нибудь типа, условно, clockSepUserFactor: : <-10 ... +10>.

     

    
     			clockSep2.width = clockSep2.textWidth + 2 + clockSepUserFactor.width;
    			if(clockSep2.width < 10) и clockSepUserFactor.width = 0 {
    				clockSep2.width = 10;
    			}

     

     

    А? Ну позязя =)

     

    P.S. Я бы сам попробовал собрать и испытать такую версию мода, но боюсь что для этого придется ставить столько инструментов, что в этой жизни у меня такой подвиг не получится.

     

    Вариантов отображения времени на цифровых часах на самом деле  много. Вот, например, в поиске

     

    https://www.google.com/search?q=цифровые+часы&sxsrf=ALeKk037bw6hsU9MdtxvGbXprm_-_zb5MQ:1589696173596&source=lnms&tbm=isch&sa=X&ved=2ahUKEwj-8ujdn7rpAhUIr4sKHR4GBNIQ_AUoAXoECA4QAw&biw=2560&bih=1329

     

    Тут либо полностью полагаться на реалиизацию в шрифте (как я выше написал, пропорциональный для динамического отображения плохо подходит), либо уже самостоятельно размещать элементы. Я согласен, что если пошёл по пути кастомизации, то непплохо бы возможность выбора размера разделителя предоставить.

     

    Что касается приведённого куска кода, с принудительной установкой размера текстового поля в 10px - я не сторонник усложнения, поэтому это не моё видение, а костыль :)  Уже прошло много времени, не помню  с каким элементом было связано, но абсолютно точно с форматированием вывода текста.

     

    В общем, я попробую либо добавить параметр, либо подумать, что можно сделать. 

     

    P.S. Программирование тоже не моя профессиональная деятельность, хоть я и работаю в IT сфере.

     

    ##############################

     

    Сделал аналоговые часы.

     

    Кому интересно - скачать в шапке

     

    shot_317_ed2.jpg.e1dade0b6ba004f0702fd8c7d721e7f4.jpg

     

    shot_317_ed1.thumb.jpg.ff2d44fc24dd5192a3d63bf0768f7589.jpg

    • Upvote 4

  7. On 5/11/2020 at 11:06 PM, beb said:

    Можно ли как-то в часах убрать зазоры/пробелы в двоеточиях? Нет ли (нельзя ли сделать) для этого какого нибудь простого формата типа <format>{HH}:{mm}:{ss}</format> (как в дате) вместо отдельных <formatHrs>{HH}</formatHrs> | <formatMin>{mm}</formatMin> | <formatSec>{ss}</formatSec>?

     

    К сожалению, этого сделать не получится.

     

    <format>{HH}:{mm}:{ss}</format> - так было в самом начале создания мода, пока не появилась возможность расширенного форматирования, выбора шрифта, мигающего разделителя и т.п. Дело в том, что символы у каждого шрифта разные по размерам, в данном случае интересует ширина, у некоторых каждый символ занимает фиксированную позицию, а у некоторых нет. А текст меняется динамически в поле и начинает скакать - смещаться в стороны с каждым новым выводом. Это актуально не для всех шрифтов, но для некоторых выглядит просто отвратительно настолько, что пользоваться такими часами невозможно. В частности для привычного пользователям мода со старых времён  шрифта Micra.

     

    Существуют шрифты proportional и monospaced. Micra является proportional, что в случае динамического отображения информации плохо.

     

    Подробнее можно почитать здесь, для понимания проблемы:

     

    https://blog.usejournal.com/proportional-vs-monospaced-numbers-when-to-use-which-one-in-order-to-avoid-wiggling-labels-e31b1c83e4d0

     

    Ну и вот картинка для представления (в случае <format>{HH}:{mm}:{ss}</format> и шрифта Micra вот так начнают смещаться секунды, минуты. )

     

    1*5Hy8C28ZA4Scy8evCfSZSA.gif

     

    Поэтому каждая выводимая единица времени и разделитель в том числе помещены в отдельное фиксированное текстовое поле, что было делать гораздо более трудозатратно, чем при использовании конструкции <format>{HH}:{mm}:{ss}</format>, так как нужно считать и учитывать размеры всех текстовых полей, а не одного, и выравнивать их относительно экрана.

     

    Здесь похожий момент упоминался.

     

    https://kr.cm/f/t/13505/c/422305/


  8. Обовлено до текущей версии игры. Обновления в шапке.

     

    Исправил проблему определения путей к конфигурационным файлам в скрипте Python, из-за которой путь к конфигурационным файлам \World_of_Tanks\mods\configs не определялся. Теперь снова можно помещать конфиги в эту директорию.

    • Upvote 3

  9. 2 hours ago, Slava7572 said:

    Старый скрипт в принципе работает,но я все же переписал,пока не тестил,если что закину сюда потом:Default:

    П.С:не проканало,не совсем понял трогать ли первую строку там,но в обоих случаях вот что:

     

      Reveal hidden contents

    2019-12-19 17:48:47.067: ERROR: Traceback (most recent call last):


    2019-12-19 17:48:47.067: ERROR:   File "mod_hangarCalculatorButton", line 38, in py_getWoTPath
    2019-12-19 17:48:47.068: ERROR: NameError: global name 're' is not defined
    2019-12-19 17:48:47.319: ERROR: TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at hCalculatorButton/initConfig()
        at hCalculatorButton/initCalculatorButton()
        at hCalculatorButton/frame1()
        at method id: 134()
        at scaleform.clik.core::UIComponent/draw()
        at scaleform.clik.core::UIComponent/validateNow()
        at set scaleform.clik.controls::Button/selected()
        at LoginPageUI/__setProp_bgModeButton_LoginPage_bgModeButton_0()
        at LoginPageUI instance constructor()
        at login_fla::MainTimeline instance constructor()
    2019-12-19 17:48:47.342: ERROR: Traceback (most recent call last):
    2019-12-19 17:48:47.342: ERROR:   File "mod_hangarCalculatorButton", line 38, in py_getWoTPath
    2019-12-19 17:48:47.342: ERROR: NameError: global name 're' is not defined
    2019-12-19 17:48:47.346: INFO: [root] [XFW/Actionscript] getMods: found: {'xvm_lobby': '../../../res_mods/mods/xfw_packages/xvm_lobby/as_lobby/xvm_lobby.swf'}
    2019-12-19 17:48:47.347: ERROR: Traceback (most recent call last):
    2019-12-19 17:48:47.347: ERROR:   File "mod_hangarCalculatorButton", line 38, in py_getWoTPath
    2019-12-19 17:48:47.347: ERROR: NameError: global name 're' is not defined
    2019-12-19 17:48:47.348: ERROR: Traceback (most recent call last):
    2019-12-19 17:48:47.348: ERROR:   File "mod_hangarCalculatorButton", line 38, in py_getWoTPath
    2019-12-19 17:48:47.348: ERROR: NameError: global name 're' is not defined
    2019-12-19 17:48:47.349: ERROR: Traceback (most recent call last):
    2019-12-19 17:48:47.349: ERROR:   File "mod_hangarCalculatorButton", line 38, in py_getWoTPath
    2019-12-19 17:48:47.349: ERROR: NameError: global name 're' is not defined
    2019-12-19 17:48:47.350: ERROR: Traceback (most recent call last):
    2019-12-19 17:48:47.350: ERROR:   File "mod_hangarCalculatorButton", line 38, in py_getWoTPath
    2019-12-19 17:48:47.351: ERROR: NameError: global name 're' is not defined
    2019-12-19 17:48:47.353: ERROR: rudimentaryPopovers: must not load into login screen!
    2019-12-19 17:48:47.357: ERROR: TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at hCalculatorButton/initConfig()
        at hCalculatorButton/initCalculatorButton()
        at hCalculatorButton/frame1()
        at method id: 134()
        at scaleform.clik.core::UIComponent/draw()
        at scaleform.clik.core::UIComponent/validateNow()
        at set scaleform.clik.controls::Button/selected()
        at net.wg.gui.login.impl::LoginPage/as_showLoginVideo()
        at net.wg.infrastructure.base.meta.impl::LoaderManagerMeta/viewLoadedS()
        at net.wg.infrastructure.managers.impl::LoaderManager/onSWFLoaded()
    2019-12-19 17:48:47.357: ERROR: TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at hCalculatorButton/initConfig()
        at hCalculatorButton/initCalculatorButton()
        at hCalculatorButton/frame1()
        at method id: 134()
        at scaleform.clik.core::UIComponent/draw()
        at scaleform.clik.core::UIComponent/validateNow()
        at set scaleform.clik.controls::Button/selected()
        at net.wg.gui.login.impl::LoginPage/as_showLoginVideo()
        at net.wg.infrastructure.base.meta.impl::LoaderManagerMeta/viewLoadedS()
        at net.wg.infrastructure.managers.impl::LoaderManager/onSWFLoaded()
    2019-12-19 17:48:47.357: ERROR: TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at hCalculatorButton/initConfig()
        at hCalculatorButton/initCalculatorButton()
        at hCalculatorButton/frame1()
        at method id: 134()
        at scaleform.clik.core::UIComponent/draw()
        at scaleform.clik.core::UIComponent/validateNow()
        at set scaleform.clik.controls::Button/selected()
        at net.wg.gui.login.impl::LoginPage/as_showLoginVideo()
        at net.wg.infrastructure.base.meta.impl::LoaderManagerMeta/viewLoadedS()
        at net.wg.infrastructure.managers.impl::LoaderManager/onSWFLoaded()
    2019-12-19 17:48:47.357: ERROR: TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at hCalculatorButton/initConfig()
        at hCalculatorButton/initCalculatorButton()
        at hCalculatorButton/frame1()
        at method id: 134()
        at scaleform.clik.core::UIComponent/draw()
        at scaleform.clik.core::UIComponent/validateNow()
        at set scaleform.clik.controls::Button/selected()
        at net.wg.gui.login.impl::LoginPage/as_showLoginVideo()
        at net.wg.infrastructure.base.meta.impl::LoaderManagerMeta/viewLoadedS()
        at net.wg.infrastructure.managers.impl::LoaderManager/onSWFLoaded()
    2019-12-19 17:48:47.357: ERROR: TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at hCalculatorButton/initConfig()
        at hCalculatorButton/initCalculatorButton()
        at hCalculatorButton/frame1()
        at method id: 134()
        at scaleform.clik.core::UIComponent/draw()
        at scaleform.clik.core::UIComponent/validateNow()
        at set scaleform.clik.controls::Button/selected()
        at net.wg.gui.login.impl::LoginPage/as_showLoginVideo()
        at net.wg.infrastructure.base.meta.impl::LoaderManagerMeta/viewLoadedS()
        at net.wg.infrastructure.managers.impl::LoaderManager/onSWFLoaded()

     

     

    Я поправлю все же :) просто никак руки не доходили.

     

    вначале нужно импортировать библиотеку для работы с регулярными выражениями

     

    import re

     

    Ссори, с телефона, не очень удобно подробнее писать.

     

    а так там просто удаляется win32|64 из пути.

     

    если любопытно, ты можешь читать описание к функциям на оф. Документации к питону, ну и много русскоязычных ресурсов с описанием.


  10. 1 minute ago, niZMo said:

    @AntonVK прикольно. Продолжай, пожалуйста работу.

    Сам я выбрал этот вариант: плюсы - компактность и аутентичность.

    image.png.a5f1579916844118c62209b6021fe3e2.png

    Аналоговые подойдут тем, у кого разрешение экрана позволяет размещать такие элементы. Лично мне приходится играть иногда на буке 720р.

     

    Да, с аналоговыми особо не разрисуешься, ну у меня будут занимать 128х128 пикселей, это не особо много, размер калькулятора, например, 260х284


  11. Решил вот такие аналоговые часики сделать. Вроде работает, перенесу в клиент.

     

    Untitled.thumb.jpg.b6f919ecb79beb9842d2e36d11e0667b.jpg

     

    P.S. Все ленюсь подправить переопределенеи путей к конфигам, там одна строчка в скрипте питона

     

    __WoT__ = re.sub(r"(win\d*)([\\]*)", "", __WoT__)

     

    • Upvote 3

  12. 8 hours ago, Nowik1971 said:

    У меня часы работают с конфигом по старому пути... и 1,5 версия и 1,6

     

    странно. По идее не должно.

     

    3 hours ago, niZMo said:

    @AntonVK как вариант, использовать симлинки из старого пути в новые папки win32/win64

     

    это предполагает дополнительное вмешательство со стороны пользователя. Пусть мод делает правильно самостоятельно.

     

    2 hours ago, Nowik1971 said:

    А не проще ли точку в начале пути в скрипте мода к файлу конфига добавить например так: cfg_file = '../mods/configs/AntonVK/configHangarClock.xml'   и все будет правильно работать.

    Хотя я не спец, а просто как вариант... Заранее прошу не пинать.

    У меня и так пока все работает! в 32 директории ничего не создавал, конфиг по старому пути \World_of_Tanks\mods\configs\***

    вот наверное где-то здесь надо исправить:

     def py_getWoTPath(self):
            __WoT__ = os.path.dirname(os.path.abspath(__file__))
            __WoT__ = __WoT__[0:__WoT__.rfind('scripts')]
            return __WoT__

     

    Можно, наверное, и с точкой. Когда создали пакеты модов у меня не получалось путь указать таким образом, поэтому я определял местоположение текущей директории в питоновском скрипте. 

     

    Да, в этой части кода и исправлю. Обрежу правую часть с win(32|64). Можно и во флеше сделать, но в питоне проще. на выходных обновлю, может раньше, если получится.

    • Upvote 3

  13. В этом обновлении опять что-то сломалось, у меня не применяется конфиг, хотя часы с калькулятором работают.

     

    Также ничего не пишется в python.log

     

    Update: понял, поменялись пути

     

    Update2: как временное решение,

     

    скопировать директорию  (если игра установлена в C:\Games\World_of_Tanks ):

     

    C:\Games\World_of_Tanks\mods\configs\AntonVK

     

    в

     

    C:\Games\World_of_Tanks\win32\mods\configs\AntonVK

     

    В win32 директории mods\configs нет, поэтому нужно создать

     

    В ближайшее время я исправлю мод.

    • Upvote 5

  14. On 8/31/2019 at 8:39 AM, Ekspoint said:

    попробуйте
    это
     

    
    def onAppInitialized(event):
        if event.ns == APP_NAME_SPACE.SF_LOBBY:
            app = ServicesLocator.appLoader.getApp(event.ns)
            if app:
                app.loadView(SFViewLoadParams(_windowAlias, _windowAlias))
    
    
    g_eventBus.addListener(events.AppLifeCycleEvent.INITIALIZED, onAppInitialized, scope=EVENT_BUS_SCOPE.GLOBAL)

    на

    
    def onAppInitializing(event):
        if event.ns == APP_NAME_SPACE.SF_LOBBY:
            app = ServicesLocator.appLoader.getApp(event.ns)
            if app:
                app.loadView(SFViewLoadParams(_windowAlias))
    
    
    g_eventBus.addListener(events.AppLifeCycleEvent.INITIALIZING, onAppInitializing)

    удалить

    
    def new_afterCreate(self):
        old_afterCreate(self)
        self.addExternalCallback('hangarCalculatorButton.showCalculator', lambda name, alias: ServicesLocator.appLoader.getApp().loadView(SFViewLoadParams('hangarCalculator', 'hangarCalculator')))
    
    
    old_afterCreate = AppEntry.afterCreate
    AppEntry.afterCreate = new_afterCreate

    и вставить в
     

    
    def _populate(self):
          View._populate(self)
          self._BaseDAAPIModule__app.addExternalCallback('hangarCalculatorButton.showCalculator', lambda name, alias: ServicesLocator.appLoader.getApp().loadView(SFViewLoadParams('hangarCalculator')))

     

     

    Благодаря этим изменениям решены проблемы:

    - пропадание часов и калькулятора при преждевременном выходе из боя (если убили, например)

    - при выборе сервера при входе в танки не надо два раза тыкать на сервер

    - в бою по нажатию клавиши Enter не теряется фокус на окне чата

     

    Это отлично! Скажем спасибо товарищу Ekspoint!

    Привет! Всем добра!

     

    В шапке опубликовал исходные коды модификации.

     

    Это одна из самых старых модификаций, времен Серба и добрых танков. (скриншот специально выбирал того времени, когда артоводы доминировали)

     

    maxresdefault.thumb.jpg.de848410548f3e31882104d6b4b00383.jpg

     

    Жизнь он такая штука, завтра ее может не быть, а часы и калькулятор в ангаре всегда должны быть) 

     

    Пользуйтесь. Все исходники, шрифты в архивах

     

    P.S.

     

    На картинке мод от дикей93. Тогда в танках был другой интерфейс визулизации, на AS2, калькулятор у дикея был взят с просторов Интернета и он не учитывал последовательность действий, но это была идея.

     

    После того, как картошка перешла на AS3, большинство старых модов сломалось... банальность, как калькулятор, исчез из игры, но были часы! Часы поддерживал игрок макс777, если мне не изменяет память...

     

    Это было давно, и тогда моды пихали в logos.swf/

     

    Но настал патч 1.0. и часы по прежнему в ангаре )

     

     

    • Upvote 4

  15. Доброе утро!

     

    В шапке актуальные обновления для текущей версии игры. Кто использует данную модификацию - рекомендую обновиться.

     

    - внесены изменения в код AS3 и Python

    - вроде бы устранилась проблема с пропаданием элементов из ангара при досрочном выходе из боя, но это не точно :)

    - обновлены примеры конфигураций и скриншоты к ним, а то им 5 лет уже.

     

    On 8/31/2019 at 4:52 PM, Slava7572 said:

    Кнопка между ангарами не пропадает и вроде как кликабельна(иконка меняется),но самого калькулятора не появляется.Может я собрал че то криво?Хотя вроде как ошибок нотепад не показывает,нечитаемых не видно+макросом их проверил,скрипт собрался.

    Странно,поставил обратно обычную версию и она работала на обоих ангарах:amazed:

     

    mod_hangarCalculatorButton.pyc 3.29 kB · 3 downloads mod_hangarCalculatorButton.py 2.16 kB · 6 downloads

     

    Функция def _populate(self): уже определена в классе hangarCalculatorButton(View, AbstractViewMeta):

     

    Тебе нужно было добавить строчку в неё, а не писать дописывать целиком вниз. Поэтому и не работало.

    • Upvote 2

  16. 21 hours ago, Slava7572 said:

    У меня несколько раз при переходе между ангарами пропадал калькулятор,потом Андрей подсказал как переписать код,сам собрал,он не запустился,но после этого почему то родной начал работать нормально:amazed:Какой то бред,правда?Сам не понял,что оно такое,раньше он пропадал регулярно и по сути само прошло:Default:

     

    Бывает, что пропадают часы или калькулятор, если выходить в ангар из боя сразу, как убили. Появилось это где-то в патче 0.9.18 или чуть новее. Не знаю, как это исправить.

     

    Попробую собрать с предложенным выше вариантом кода от Ekspoint

    • Upvote 2

  17. On 8/30/2019 at 3:14 PM, Slava7572 said:

    продублирую

    Антон,в этой обнове опять калькулятор сломали...вернее,он есть,но при переключении между ангарами(в он ивенте свой) пропадает и уже не возвращается:(

     

    Добрый день.

     

    Давно не заходил.

     

    Я вроде ничего не наблюдал, чтоб что-то сломалось. 

     

    ивент, стальная охота, всмысле? у меня работало.

     

    Да. На прошлой неделе собрал новую версию, внёс некоторые изменения в код флеша, на днях обновлю.

    • Upvote 3

  18. Рабочая версия калькулятора

     

    Я ещё не закончил, но пользоваться можно

    AntonVK_HangarCalculator_1.5.0.0.wotmod

     

     

    On 6/5/2019 at 10:10 PM, Insomnia said:

     

    Как по мне, компиляция со всеми зависимостями из оригинального lobby.swf это не очень хорошо и не оправданно. Для стабильной работы потребуется её пересобирать чуть ли не каждый микропатч, в котором изменились оригинальные скрипты и которые не имеют никакого отношения к моду вообще.

    В gui.pkg/gui/flash/swc уже давно лежат готовые библиотеки которые нужно подключать как внешние (и не нужно париться с их созданием как было когда-то).

    На всякий случай прикрепил все исходники для файла с этого сообщения, в нём уже настроенный для сборки проект, возможно, это чем-то поможет.

    hangarClock_src.zip 5.14 MB · 7 downloads

     

    Не собирается у меня флешка с подключёнными библиотеками, как и раньше. Пока приведу всё в порядок, потом попробую разобраться с этим механизмом.

    • Upvote 3

  19. Добрый день!

     

    Прошу помочь в следующем вопросе.

     

    До патча 1.5.х  использовал в своем моде следующую конструкцию

     

     

    Python (для кнопки вызова)

    #
    import os
    #
    from gui.app_loader.loader import g_appLoader
    from gui.Scaleform import SCALEFORM_SWF_PATH
    from gui.Scaleform.Flash import Flash
    from gui.Scaleform.framework import g_entitiesFactories, ViewSettings, ViewTypes, ScopeTemplates
    from gui.Scaleform.framework.entities.abstract.AbstractViewMeta import AbstractViewMeta
    from gui.Scaleform.framework.entities.View import View
    from gui.Scaleform.framework.managers.loaders import SFViewLoadParams
    from gui.shared import events
    from gui.app_loader.settings import APP_NAME_SPACE
    from gui.shared import g_eventBus, EVENT_BUS_SCOPE
    
    class hangarCalculatorButton(View, AbstractViewMeta):
    
    	def __init__(self):
    		View.__init__(self)
    
    	def _populate(self):
    		View._populate(self)
    
    	def _dispose(self):
    		View._dispose(self)
    
    	def py_log(self, text):
    		print('[hangarCalculatorButton]: %s' % text)
    
    	def py_getWoTPath(self):
    		__WoT__ = os.path.dirname(os.path.abspath(__file__))
    		__WoT__ = __WoT__[0:__WoT__.rfind('scripts')]
    		return __WoT__
    
    _windowAlias = 'hangarCalculatorButton'
    _url = 'hangarCalculatorButton.swf'
    _type = ViewTypes.WINDOW
    _event = None
    _scope = ScopeTemplates.GLOBAL_SCOPE
    
    _settings = ViewSettings(_windowAlias, hangarCalculatorButton, _url, _type, _event, _scope)
    g_entitiesFactories.addSettings(_settings)
    
    def new_afterCreate(self):
        old_afterCreate(self)
        self.addExternalCallback('hangarCalculatorButton.showCalculator', lambda name, alias: g_appLoader.getApp().loadView(SFViewLoadParams('hangarCalculator', 'hangarCalculator')))
    
    old_afterCreate = Flash.afterCreate
    Flash.afterCreate = new_afterCreate
    
    def onAppInitialized(event):
        if event.ns == APP_NAME_SPACE.SF_LOBBY:
            app = g_appLoader.getApp(event.ns)
            if app:
                app.loadView(SFViewLoadParams(_windowAlias, _windowAlias))
    
    
    g_eventBus.addListener(events.AppLifeCycleEvent.INITIALIZED, onAppInitialized, scope=EVENT_BUS_SCOPE.GLOBAL)

     

    AS3 (для кнопки вызова)

    package  {
    
    	import flash.display.MovieClip;
    	import flash.events.Event;
    	import flash.events.MouseEvent;
    	import flash.external.ExternalInterface;
    	import net.wg.gui.lobby.LobbyPage;
    	import net.wg.infrastructure.base.AbstractView;
    	import net.wg.infrastructure.events.LoaderEvent;
    	import net.wg.infrastructure.interfaces.IView;
    	import scaleform.clik.events.ButtonEvent;
    
    	public class hangarCalculatorButton extends AbstractView implements IhangarCalculatorButton {
    
    		public function hangarCalculatorButton() {
    			super();
    			this.init();
    		}
    
    		public var py_log:Function;
    		public var py_getWoTPath:Function;
    
    		private var lobby:LobbyPage = null;
    		private var current_alias:String = "";
    
    		private var zCalculatorButton:hCalculatorButton;
    
    		private function init(param1:Event = null):void {
    			if(!stage) {
    				addEventListener(Event.ADDED_TO_STAGE,this.init);
    				return;
    			}
    			removeEventListener(Event.ADDED_TO_STAGE,this.init);
    			App.containerMgr.loader.addEventListener(LoaderEvent.VIEW_LOADED,this.onViewLoaded);
    		}
    
    		private function onViewLoaded(param1:LoaderEvent):void {
    			this.processView(param1.view,false);
    		}
    
    		private function processView(param1:IView, param2:Boolean):void {
    			var view:IView = param1;
    			var populated:Boolean = param2;
    			var _WoT_:String = py_getWoTPath();
    			try {
    				this.zCalculatorButton = new hCalculatorButton(_WoT_);
    				this.current_alias = view.as_config.alias;
    				this.zCalculatorButton.addEventListener(ButtonEvent.CLICK,this.onCalcBtnClick);
    				if(this.current_alias == "lobby") {
    					this.lobby = view as LobbyPage;
    					this.lobby.header.addChild(this.zCalculatorButton);
    					//py_log("is loaded");
    				}
    			}
    			catch(error:Error) {
    				py_log("processView" + error.getStackTrace());
    			}
    		}
    
    		override protected function nextFrameAfterPopulateHandler():void {
    			if(this.parent != App.instance) {
    				(App.instance as MovieClip).addChild(this);
    			}
    			visible = false;
    		}
    
    		override protected function onDispose():void {
    			this.zCalculatorButton.removeEventListener(MouseEvent.CLICK,this.onCalcBtnClick);
    		}
    
    		private function onCalcBtnClick(param1:ButtonEvent):void {
    			var external:Array = new Array();
    			external.push(this.current_alias);
    			external.unshift("hangarCalculatorButton.showCalculator","hangarCalculatorButton");
    			ExternalInterface.call.apply(null,external);
    		}
    
    	}
    
    }

     

    Эти две вещи между собой взаимодействовали и далее там уже вызывался собственный код.

     

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

     

    В текущей версии игрового клиента мои попытки что-то исправить ни к чему не привели.

     

    Python исправил следующим образом:

     

    Python (для кнопки вызова)

    #
    import os
    #
    from gui.shared.personality import ServicesLocator
    from gui.Scaleform import SCALEFORM_SWF_PATH
    from gui.Scaleform.flash_wrapper import Flash
    from gui.Scaleform.framework import g_entitiesFactories, ViewSettings, ViewTypes, ScopeTemplates
    from gui.Scaleform.framework.entities.abstract.AbstractViewMeta import AbstractViewMeta
    from gui.Scaleform.framework.entities.View import View
    from gui.Scaleform.framework.managers.loaders import SFViewLoadParams
    from gui.shared import events
    from gui.app_loader.settings import APP_NAME_SPACE
    from gui.shared import g_eventBus, EVENT_BUS_SCOPE
    
    class hangarCalculatorButton(View, AbstractViewMeta):
    
    	def __init__(self):
    		View.__init__(self)
    
    	def _populate(self):
    		View._populate(self)
    
    	def _dispose(self):
    		View._dispose(self)
    
    	def py_log(self, text):
    		print('[hangarCalculatorButton]: %s' % text)
    
    	def py_getWoTPath(self):
    		__WoT__ = os.path.dirname(os.path.abspath(__file__))
    		__WoT__ = __WoT__[0:__WoT__.rfind('scripts')]
    		return __WoT__
    
    _windowAlias = 'hangarCalculatorButton'
    _url = 'hangarCalculatorButton.swf'
    _type = ViewTypes.WINDOW
    _event = None
    _scope = ScopeTemplates.GLOBAL_SCOPE
    
    _settings = ViewSettings(_windowAlias, hangarCalculatorButton, _url, _type, _event, _scope)
    g_entitiesFactories.addSettings(_settings)
    
    def new_afterCreate(self):
        old_afterCreate(self)
        self.addExternalCallback('hangarCalculatorButton.showCalculator', lambda name, alias: ServicesLocator.appLoader.getApp().loadView(SFViewLoadParams('hangarCalculator', 'hangarCalculator')))
    
    old_afterCreate = Flash.afterCreate
    Flash.afterCreate = new_afterCreate
    
    def onAppInitialized(event):
        if event.ns == APP_NAME_SPACE.SF_LOBBY:
            app = ServicesLocator.appLoader.getApp(event.ns)
            if app:
                app.loadView(SFViewLoadParams(_windowAlias, _windowAlias))
    
    
    g_eventBus.addListener(events.AppLifeCycleEvent.INITIALIZED, onAppInitialized, scope=EVENT_BUS_SCOPE.GLOBAL)

    Python (для самого окна)

    #
    from gui.Scaleform import SCALEFORM_SWF_PATH
    from gui.Scaleform.daapi import LobbySubView
    from gui.Scaleform.daapi.view.meta.WindowViewMeta import *
    from gui.Scaleform.flash_wrapper import Flash
    from gui.Scaleform.framework import g_entitiesFactories, ViewSettings, ViewTypes, ScopeTemplates
    from gui.Scaleform.framework.entities.View import View
    
    from gui.shared import events
    
    LobbySubView.__background_alpha__ = 0
    
    class hangarCalculator(LobbySubView, WindowViewMeta):
    
    	def __init__(self):
    		View.__init__(self)
    
    	def _populate(self):
    		View._populate(self)
    
    	def _dispose(self):
    		View._dispose(self)
    
    	def onTryClosing(self):
    		return True
    
    	def onWindowClose(self):
    		self.destroy()
    
    	def py_log(self, text):
    		print('[hangarCalculator]: %s' % text)
    
    _windowAlias = 'hangarCalculator'
    _url = 'hangarCalculator.swf'
    _type = ViewTypes.WINDOW
    _event = None
    _scope = ScopeTemplates.DEFAULT_SCOPE
    
    _settings = ViewSettings(_windowAlias, hangarCalculator, _url, _type, _event, _scope)
    g_entitiesFactories.addSettings(_settings)

     

    Ожидаемо, заменить только g_appLoader на ServicesLocator.appLoader.getApp() ничем не помогло в данном случае.

     

    Для AS3 код части, которая взаимодействует с Python, ничего не менял. Для кнопки код выше для окна вот (на всякий случай)

    package  {
    
    	import flash.display.MovieClip;
    	import net.wg.infrastructure.base.AbstractWindowView;
    
    	public class hangarCalculator extends AbstractWindowView {
    
    		public function hangarCalculator() {
    			super();
    			isCentered = true;
    		}
    
    		public var py_log: Function;
    
    		private var zCalculator:hCalculator;
    
    		override protected function onPopulate():void {
    			super.onPopulate();
    		}
    
    		override protected function onDispose():void {
    			super.onDispose();
    		}
    
    		override protected function configUI():void {
    			try {
    				super.configUI();
    			}
    			catch(error:Error) {
    				py_log("configUI " + error.getStackTrace());
    			}
    		}
    
    	}
    
    }

     

    Что в итоге, кнопка на месте, окно не вызывается.

     

    Буду признателен за помощь в решении проблемы.

     

    Спасибо!

     


  20. 1 hour ago, Ekspoint said:

    @AntonVK в какой программе делаешь флешку?

     

    FlashDevelop хорошо подходит, есть пример создания https://kr.cm/f/t/25477/c/279913/

    на выходе получается https://ekspoint-mods.ru/chasy-v-angare-s-datoj-i-dnjom-nedeli

     

    В Adobe Flash. Да с созданием флэш проблем нет.

     

    Сейчас проблема с вызовом окна калькулятора по кнопке. 

×
×
  • Create New...