Jump to content
Korean Random
ribbed

Mod packages / Пакеты модов

Recommended Posts

1 час назад, jhakonen сказал:

The document is under CC BY-SA 4.0 license. Does that mean that the code examples at chapter 8 are also under that license?

According to Creative Commons's compatible license page that license is compatible with itself, Free Art license and GPLv3. Can I use some other open source license instead, like MIT license or LGPL 2.1 and still use the code in my mod?

Nice question.

 

Code samples were relicensed under WTFPL so you can :)

 

packages_doc_0.6_en.pdf

packages_doc_0.6_ru.pdf

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Мда, 6-й день мод проверялся и так и не проверился модератором. Видимо, не судьба.
Пока проверялся, уже вышла новая версия мода)

Ан нет, не заметил сообщения от модератора...

Edited by Pavel3333

Share this post


Link to post

Short link
Share on other sites
Цитата

6.4 Исполнение Python-кода

После монтирования всех пакетов и разрешения конфликтов, происходит исполнение всех .pyc - файлов из каталога /scripts/client/gui/mods/ в алфавитном порядке, имя которых начинается с mod_ .

Так текущее фактическое поведение, отличное от выделенного утверждения - это баг? Или просто данная часть документации устарела?

Share this post


Link to post

Short link
Share on other sites
2 часа назад, Crus сказал:

Так текущее фактическое поведение, отличное от выделенного утверждения - это баг? Или просто данная часть документации устарела?

И то, и другое. Старый алгоритм моды импортировал по несколько раз (от чего им, кстати, было ни жарко ни холодно, если только импорт не происходил под разными именами, что как раз имело место быть), причем под разными именами (например, если он пытался импортировать mod_CamoSelector и mod_camoselector - мод импортировался дважды). Теперь же список модов обернут в set(), что не явилось истинным решением проблемы (которая решилась тем, что все имена файлов подвергаются lower() перед обработкой), а только лишь сломало порядок инициализации модов.

Share this post


Link to post

Short link
Share on other sites
2 hours ago, Polyacov_Yury said:

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

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

Не самый быстрый, но один из самых коротких вариантов.

uniques = lambda entries: sorted(set(entries), key=entries.index)

З.Ы. Я один не вкуриваю, какого **** *** *** в питоне нет built-in генератора unique по принципу того же reversed?

Share this post


Link to post

Short link
Share on other sites
2 часа назад, GPCracker сказал:

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

Не самый быстрый, но один из самых коротких вариантов.


uniques = lambda entries: sorted(set(entries), key=entries.index)

З.Ы. Я один не вкуриваю, какого **** *** *** в питоне нет built-in генератора unique по принципу того же reversed?

 

Возможно - не смогли в. А насчет реализации - я тоже погуглил в свое время. Нам все же сортировать set() не надо - список и так отсортированный приходит. Загляни в PYmodsCore/utils.py, функция remDups().

Share this post


Link to post

Short link
Share on other sites
3 hours ago, Polyacov_Yury said:

Загляни в PYmodsCore/utils.py, функция remDups().

Юра, на номерах строк на GitHub есть ссылки, если что. И да, этот вариант я тоже видел, правда написан был чуть по-другому. Плюс того варианта, что привел я  - он относительно короткий. Минусы - скорость. Варианты с добавлением с set или list быстрее, по крайней мере на небольших объемах данных. Нативный вариант реализации в виде генератора был бы существенно быстрее, особенно на больших объемах данных. В любом случае, похожий алгоритм используется при создании set. Почему его не добавили в питон, учитывая что это типовая и широко используемая функция - непонятно.

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

Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites
4 minutes ago, GPCracker said:

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

Вот да, в collections рядом с OrderedDict ей самое место.

Да и классы для деревьев хотелось бы там видеть.

Олимпиадное программирование сейчас не для питона, а жаль.

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites
1 minute ago, SkepticalFox said:

Вот да, в collections рядом с OrderedDict ей самое место.

Как по мне - рядом с reversed в built-in.

Share this post


Link to post

Short link
Share on other sites

unique и OrderedSet - это конечно хорошо, но как помогло бы в данном случае? Ведь в сохранении исходного порядка элементов нет необходимости, требуется получить отсортированный по алфавиту список.

Share this post


Link to post

Short link
Share on other sites
20 минут назад, Crus сказал:

unique и OrderedSet - это конечно хорошо, но как помогло бы в данном случае? Ведь в сохранении исходного порядка элементов нет необходимости, требуется получить отсортированный по алфавиту список.

 

Суть в том, что ResMgr.openSection().keys() возвращает уже отсортированный список. Надо только дедупликацию провести без нарушения этой отсортированности. То есть дешевле будет сохранить текущий порядок, чем перемешать (set()), а потом отсортировать обратно.

Share this post


Link to post

Short link
Share on other sites
4 minutes ago, Polyacov_Yury said:

Надо только дедупликацию провести ... дешевле будет сохранить текущий порядок, чем перемешать (set()), а потом отсортировать обратно.

Именно так. Сортировка занимает весьма приличное количество ресурсов. Хотя в данной ситуации это не особенно важно - здесь нет жестких требований по скорости работы алгоритма дедупликации.

Share this post


Link to post

Short link
Share on other sites
2 минуты назад, GPCracker сказал:

Именно так. Сортировка занимает весьма приличное количество ресурсов. Хотя в данной ситуации это не особенно важно - здесь нет жестких требований по скорости работы алгоритма дедупликации.

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

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
11 минут назад, Polyacov_Yury сказал:

Суть в том, что ResMgr.openSection().keys() возвращает уже отсортированный список.

Теперь понятно откуда обсуждение вариантов unique. На текущий момент ResMgr.openSection().keys() уже не возвращает отсортированный список.

Share this post


Link to post

Short link
Share on other sites
Just now, Crus said:

На текущий момент ResMgr.openSection().keys() уже не возвращает отсортированный список.

А что именно возвращает? Пример есть? Я просто немного не на винде, но интересно же :)

Share this post


Link to post

Short link
Share on other sites
52 минуты назад, GPCracker сказал:

А что именно возвращает? Пример есть?



pprint.pprint(ResMgr.openSection('scripts\client\gui\mods').keys())
['mod_pmod.pyc',
 'mod_battlehits.pyc',
 'mod_.py',
 'mod_.pyc',
 'mod_xfw_native.pyc',
 'mod_pro_lasthits.pyc',
 'mod_pro_reduced_armor.pyc',
 'mod_safeshot.pyc',
 'mod_pro_spotted.pyc',
 'mod_wotxp.pyc',
 '__init__.pyc']

Share this post


Link to post

Short link
Share on other sites

@Crus, в этом порядке проглядывается некоторая логика, если сравнивать с выводом set для того же набора элементов... такое ощущение, что это list(set(keys))... или что-то подобное. Просто на разных версиях и других условиях это поведение, как и хэш-функция, на которой базируется set, скорее всего может несколько отличаться, т.к. оно не задокументировано, нужно смотреть исходники питона.

Но вот насчет чего я точно уверен - так это в том, что картошка как всегда.

Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

На бета-тесте 1.0 клиент отказывается импортировать pyc-скрипты из собранных через python пакетов. Причем сами пакеты читаются без ошибок, но при попытке импорта возникает ошибка:

*** WARNING(scripts/client/gui/mods/__init__.py, 72): There is problem while import gui mod ('gui.mods', 'mod_example.pyc')
*** 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
*** ImportError: scripts/client/gui/mods/mod_example.pyc is not a valid Python compiled module file

Если пакет собирать вручную архиватором или положить файлы не в пакет, а в res_mods - все работает.

На текущем релизе (0.9.22.0) те же пакеты спокойно распознаются и импортируются.

 

UPD. Почему-то при наличии чего бы то ни было в поле extra у ZipInfo какого-либо файла ломает этот самый файл (ResMgr просто игнорирует байт, в котором написана длина этого самого extra, и читает контент файла сразу после его имени, срезая вместо этого его данные в конце на то же число байт). Фикс для своего запаковщика сделал, остальным - иметь в виду.

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.

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