Modding:Modding Efficiently/ru: Difference between revisions

From Vintage Story Wiki
(Created page with "Моддинг: советы по эффективности моддинга")
 
(Created page with "{{Navbox/modding/ru|Vintage Story}}")
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
<languages/>{{GameVersion|1.15}}
<languages/>{{GameVersion|1.15}}


Modding and even Game development itself usually requires a lot of trial & error. The more time you can save on those iteration times the better, as it accumulates quickly. Besides being quick to start up, VS offers a bundle more tricks to help you mod fast and efficiently. Here are some of the tricks every serious modder should use.
Моддинг и даже сама разработка игр обычно требует множества проб и ошибок. Чем больше времени вы сможете сэкономить на этих итерациях, тем лучше, так как оно быстро накапливается. Помимо быстрого запуска, VS предлагает множество дополнительных приемов, которые помогут вам делать моды быстро и эффективно. Вот некоторые приемы, которые должен использовать каждый серьезный моддер.


== Shortcuts ==
== Ярлыки ==


* Use macros! Switching from/to creative/survival mode and <code>/time set day</code> bound to a keyboard shortcut is a must have. Hit CTRL+M to open the macro manager which will let you set those up!
* Используйте макросы! Переключение из/в творческий режим/режим выживания и <code>/time set day</code> привязаны к сочетанию клавиш. Нажмите CTRL+M, чтобы открыть диспетчер макросов, который позволит вам их настроить!
* When you edit textures and shape files - these can be reloaded without restart using the commands <code>.reload textures</code> and <code>.reload shapes</code>. The latter may require you to place&remove a block so that the chunk gets redrawn
* Когда вы редактируете файлы текстур и форм - их можно перезагрузить без перезагрузки с помощью команд <code>.reload textures</code> и <code>.reload shape</code>. Последнее может потребовать от вас размещения и удаления блока, чтобы фрагмент перерисовывался.
* Translation entries can be reloaded with <code>.reload lang</code>, the handbook can be reloaded with <code>.reloadhandbook</code>
* Записи перевода можно перезагрузить с помощью <code>.reload lang</code>, руководство можно перезагрузить с помощью <code>.reloadhandbook</code>
* Set up a quickstart.bat script, that contains e.g. <code>VintageStory.exe -oTestWorld -pcreativebuilding</code> - this will insta-launch you into a super flat creative world named "TestWorld"
* Настройте скрипт quickstart.bat, который содержит, например. <code>VintageStory.exe -oTestWorld -pcreativebuilding</code> — мгновенно запустит вас в сверхплоский творческий мир под названием «TestWorld».
* Don't fully restart the game to test out changes! In 95% of cases its enough to just leave the game world and rejoin or use ingame reload commands. You can quickly reload a world using the shortcut <code>CTRL+F1</code>
* Не перезапускайте игру полностью, чтобы проверить изменения! В 95% случаев достаточно просто выйти из игрового мира и вернуться или использовать внутриигровые команды перезагрузки. Вы можете быстро перезагрузить мир, используя сочетание клавиш <code>CTRL+F1</code>.
* Leave your mod unpacked in the mods folder! No need to zip it up, it'll load up just fine unpacked :-)
* Оставьте свой мод распакованным в папке с модами! Его не нужно застегивать, он прекрасно загрузится в распакованном виде :-)
* Use <code>.tfedit</code> to modify the lookings of your item/block inside the GUI, Hands or on the ground - with live preview.
* Используйте <code>.tfedit</code>, чтобы изменить внешний вид вашего предмета/блока в графическом интерфейсе, в руках или на земле — с предварительным просмотром в реальном времени.
* Use <code>.bsedit</code> to edit block selection and collisionboxes ingame - with live preview.  
* Используйте <code>.bsedit</code> для редактирования выбора блоков и коллизий в игре — с предварительным просмотром в реальном времени.
* Use the <code>/expclang</code> command to generate a neatly pre-formatted list of language entries destined for your en.json, it's placed in a file named collectiblelang.json in the same folder where VintageStory.exe is. It creates language entries for any block or item that currently has no translation. Can save you a ton of time by not needing to handwrite your en.json file.
* Используйте команду <code>/expclang</code> для создания аккуратно отформатированного списка языковых записей, предназначенных для вашего en.json, он находится в файле с именем collectiblelang.json в той же папке, что и VintageStory.exe. Он создает языковые записи для любого блока или элемента, который в настоящее время не имеет перевода. Может сэкономить вам массу времени, поскольку вам не нужно вручную писать файл en.json.
* If you modify a json file and want to include only the changes in your mod, you can create a [[Modding:JSON_Patching|JSON patch]]. Usually you can even save the time writing it yourself by using the ModMaker 3000™, a command line tool that ships with the game, to build the patches for you
* Если вы изменяете файл json и хотите включить в свой мод только изменения, вы можете создать [[Modding:JSON_Patching/ru|JSON патч]]. Обычно вы даже можете сэкономить время, написав его самостоятельно, используя ModMaker 3000 ™, инструмент командной строки, который поставляется с игрой, для создания патчей для вас.


== Finding Issues ==
== Поиск проблем ==
* If you are stuck with an asset problem, look through the server-main.txt and client-main.txt! The engine is very talkative when it comes to asset errors.
* Если вы столкнулись с проблемой актива, просмотрите server-main.txt и client-main.txt! Движок очень разговорчив, когда дело доходит до ошибок ассетов.
* Permanently enable the error reporter via <code>/errorreporter 1</code> to save yourself the work of finding and scouring through the log files for problems. This feature will make it so that a dialog pop ups during after up of the game if any errors were encountered.
* Включите отчет об ошибках на постоянной основе через <code>/errorreporter 1</code>, чтобы избавить себя от работы по поиску и просмотру файлов журналов на наличие проблем. Эта функция сделает так, чтобы диалоговое окно появлялось после завершения игры, если были обнаружены какие-либо ошибки.


== When writing C# mods ==
== При написании модов на C# ==
* Use break points for debugging
* Используйте точки останова для отладки
* Browse through the many utility classes provided by the VS API, you might be able to save a lot of coding efforts! (e.g. [https://github.com/anegostudios/vsapi/blob/master/Math/ColorUtil.cs ColorUtil], [https://github.com/anegostudios/vsapi/blob/master/Math/GameMath.cs GameMath], [https://github.com/anegostudios/vsapi/blob/master/Util/ArrayExtensions.cs ArrayExtensions], [https://github.com/anegostudios/vsapi/blob/master/Util/DictExtensions.cs DictExtensions], [https://github.com/anegostudios/vsapi/blob/master/Util/HashsetExtensions.cs HashsetExtensions], [https://github.com/anegostudios/vsapi/blob/master/Util/JsonUtil.cs JsonUtil], [https://github.com/anegostudios/vsapi/blob/master/Util/JsonUtil.cs ReaderWriterExtensions], [https://github.com/anegostudios/vsapi/blob/master/Util/SerializerUtil.cs SerializerUtil], [https://github.com/anegostudios/vsapi/blob/master/Util/WildcardUtil.cs WildcardUtil])
* Просмотрите множество служебных классов, предоставляемых VS API, возможно, вы сможете сэкономить много усилий по написанию кода! (например, [https://github.com/anegostudios/vsapi/blob/master/Math/ColorUtil.cs ColorUtil], [https://github.com/anegostudios/vsapi/blob/master/Math/GameMath.cs GameMath ], [https://github.com/anegostudios/vsapi/blob/master/Util/ArrayExtensions.cs ArrayExtensions], [https://github.com/anegostudios/vsapi/blob/master/Util/DictExtensions.cs DictExtensions ], [https://github.com/anegostudios/vsapi/blob/master/Util/HashsetExtensions.cs HashsetExtensions], [https://github.com/anegostudios/vsapi/blob/master/Util/JsonUtil.cs JsonUtil ], [https://github.com/anegostudios/vsapi/blob/master/Util/JsonUtil.cs ReaderWriterExtensions], [https://github.com/anegostudios/vsapi/blob/master/Util/SerializerUtil.cs SerializerUtil ], [https://github.com/anegostudios/vsapi/blob/master/Util/WildcardUtil.cs WildcardUtil])
* If you don't know it already, the [https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/working-with-linq LINQ] extension, part of the .net framework, is an extremely powerful tool to make code more expressive.
* Если вы еще не знаете, расширение [https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/working-with-linq LINQ], являющееся частью .net framework, является чрезвычайно мощный инструмент, позволяющий сделать код более выразительным.
* Use the [https://devblogs.microsoft.com/dotnet/introducing-net-hot-reload/ Hot reload] feature of Visual Studio to modify code while the game is running, to see your changes immediately without restarting the world.
* Используйте функцию [https://devblogs.microsoft.com/dotnet/introduction-net-hot-reload/ Горячая перезагрузка] Visual Studio для изменения кода во время работы игры, чтобы сразу увидеть изменения, не перезапуская мир.
** Note that this feature works if you use the [[Modding:Setting_up_your_Development_Environment|official mod template]] and set up your mod as a "compiled" mod. It does not work if you set up your mod as a "source" mod, and it may not work with all other development environment setups.
** Обратите внимание, что эта функция работает, если вы используете [[Modding:Setting_up_your_Development_Environment/ru|официальный шаблон мода]] и настроили свой мод как «скомпилированный». Это не работает, если вы настроили свой мод как «исходный» мод, и он может не работать со всеми другими настройками среды разработки.
* If you don't have already make sure the games log output ends up in the Visual Studio output window
* Если вы еще этого не сделали, убедитесь, что вывод игрового журнала заканчивается в окне вывода Visual Studio.
* If you are working with shaders, you can reload them with <code>.reload shaders</code>
* Если вы работаете с шейдерами, вы можете перезагрузить их с помощью <code>.reload shaders</code>
* Do not hold static references unless its primitive data. Static references are not garbage collected when the player leaves a server / game world. Example: Holding a static reference of a <code>Block</code> will keep that block in memory, which in turn keeps the API Instance in memory, which in turn keeps the entire game world in memory.
* Не храните статические ссылки, если только это не примитивные данные. Статические ссылки не удаляются сборщиком мусора, когда игрок покидает сервер/игровой мир. Пример: статическая ссылка на <code>Block</code> сохранит этот блок в памяти, что, в свою очередь, сохранит в памяти экземпляр API, который, в свою очередь, сохранит в памяти весь игровой мир.
* The game client and server have a number of [[Client startup parameters|startup arguments]] to make your live easier
* Игровой клиент и сервер имеют ряд [[Client startup parameters/ru|аргументов запуска]] для облегчения вашей жизни.


=== Efficient Search Methods ===
=== Эффективные методы поиска ===


More often than not, you'd want your code to find something in the game world. As you might already know, computers are not exactly the best at parallel processing like human eyes are, so they have to sequentially look through the entire search space. When doing so, keep in mind that, first and foremost, the most efficient search method is one that never runs, within a search space that is of size zero ;-)<br> In other words, sometimes you can avoid searches altogether through other clever means! If you still need to do a search, here's some more optimal ways than the brute force way:
Чаще всего вы хотите, чтобы ваш код нашел что-то в игровом мире. Как вы, возможно, уже знаете, компьютеры не так хороши в параллельной обработке, как человеческие глаза, поэтому им приходится последовательно просматривать все пространство поиска. При этом имейте в виду, что, в первую очередь, самый эффективный метод поиска — это тот, который никогда не запускается в пространстве поиска нулевого размера ;-)<br> Другими словами, иногда вы можете вообще избежать поиска с помощью другие умные средства! Если вам все же нужно выполнить поиск, вот несколько более оптимальных способов, чем метод грубой силы:


<ul>
<ul>
<li><strong>Entity Search</strong><br>
<li><strong>Поиск объектов</strong><br>
Use [https://github.com/anegostudios/vsessentialsmod/blob/master/Systems/EntityPartitioning.cs EntityPartitioning] - <code>api.ModLoader.GetModSystem<EntityPartitioning>().WalkEntityPartitions()</code>. This system partitions entities into 8x8x8 block buckets through the entire loaded game world, then only searches inside those buckets, within your supplied search radius, greatly reducing the search space.</li>
Используйте [https://github.com/anegostudios/vsessentialsmod/blob/master/Systems/EntityPartitioning.cs EntityPartitioning] - <code>api.ModLoader.GetModSystem<EntityPartitioning>().WalkEntityPartitions()</code>. Эта система разбивает объекты на сегменты блоков 8x8x8 по всему загруженному игровому миру, а затем ищет только внутри этих сегментов в пределах заданного вами радиуса поиска, что значительно сокращает пространство поиска.</li>
<li><strong>Block Search</strong><br>
<li><strong>Поиск блока</strong><br>
a) If you want an entity to find a certain, not extremely common block, use the [https://github.com/anegostudios/vsessentialsmod/blob/master/Systems/POIRegistry.cs POI Registry]. This registry lets block entities register a point of interest that entities can search through very efficiently. They are also partitioned into chunk column buckets to additionally reduce the search space. For a code sample, check out the [https://github.com/anegostudios/vssurvivalmod/blob/master/BlockEntity/BEBerryBush.cs berry bush block entity]<br>
a) Если вы хотите, чтобы сущность нашла определенный, не слишком распространенный блок, используйте [https://github.com/anegostudios/vsessentialsmod/blob/master/Systems/POIRegistry.cs POI Registry]. Этот реестр позволяет блочным объектам регистрировать точки интереса, которые объекты могут очень эффективно искать. Они также разделены на сегменты столбцов фрагментов, чтобы дополнительно сократить пространство поиска. Для примера кода ознакомьтесь с [https://github.com/anegostudios/vssurvivalmod/blob/master/BlockEntity/BEBerryBush.cs блочной сущностью ягодного куста]<br>
b) For regular full chunk scans, I recommend a separate background thread that loads the chunk and access the raw block data via <code>chunk.Blocks</code>. It's an array indexed with <code>(y * chunksize + z) * chunksize + x</code>, where the xyz are local coordinate from 0 to chunkize-1. You should only write to a chunk in the main thread however! If you want to avoid threading for now, you can still iterate through <code>chunk.Blocks</code> in the main thread and even slice up the task across multiple ticks, like vanilla beehives do.<br>
b) Для регулярного полного сканирования чанка я рекомендую отдельный фоновый поток, который загружает чанк и получает доступ к необработанным данным блока через <code>chunk.Blocks</code>. Это массив с индексом <code>(y * размер фрагмента + z) * размер фрагмента + x</code>, где xyz — локальные координаты от 0 до фрагмента-1. Однако вы должны писать только в кусок в основном потоке! Если вы хотите пока избежать многопоточности, вы все равно можете перебирать <code>chunk.Blocks</code> в основном потоке и даже разбивать задачу на несколько тиков, как это делают ванильные ульи.<br>
c) For rare area scans, there is <code>api.World.GetBlockAccessorPrefetch()</code>. This block accessor lets you pre-load an area and then rather efficiently iterate through each block in given area
c) Для сканирования редких областей используется <code>api.World.GetBlockAccessorPrefetch()</code>. Этот метод доступа к блокам позволяет предварительно загрузить область, а затем довольно эффективно перебирать каждый блок в заданной области.
</li>
</li>
</ul>
</ul>


{{Navbox/modding|Vintage Story}}
{{Navbox/modding/ru|Vintage Story}}

Latest revision as of 06:47, 21 February 2022

Other languages:

Эта страница проверялась в последний раз для версии Vintage Story 1.15.


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

Ярлыки

  • Используйте макросы! Переключение из/в творческий режим/режим выживания и /time set day привязаны к сочетанию клавиш. Нажмите CTRL+M, чтобы открыть диспетчер макросов, который позволит вам их настроить!
  • Когда вы редактируете файлы текстур и форм - их можно перезагрузить без перезагрузки с помощью команд .reload textures и .reload shape. Последнее может потребовать от вас размещения и удаления блока, чтобы фрагмент перерисовывался.
  • Записи перевода можно перезагрузить с помощью .reload lang, руководство можно перезагрузить с помощью .reloadhandbook
  • Настройте скрипт quickstart.bat, который содержит, например. VintageStory.exe -oTestWorld -pcreativebuilding — мгновенно запустит вас в сверхплоский творческий мир под названием «TestWorld».
  • Не перезапускайте игру полностью, чтобы проверить изменения! В 95% случаев достаточно просто выйти из игрового мира и вернуться или использовать внутриигровые команды перезагрузки. Вы можете быстро перезагрузить мир, используя сочетание клавиш CTRL+F1.
  • Оставьте свой мод распакованным в папке с модами! Его не нужно застегивать, он прекрасно загрузится в распакованном виде :-)
  • Используйте .tfedit, чтобы изменить внешний вид вашего предмета/блока в графическом интерфейсе, в руках или на земле — с предварительным просмотром в реальном времени.
  • Используйте .bsedit для редактирования выбора блоков и коллизий в игре — с предварительным просмотром в реальном времени.
  • Используйте команду /expclang для создания аккуратно отформатированного списка языковых записей, предназначенных для вашего en.json, он находится в файле с именем collectiblelang.json в той же папке, что и VintageStory.exe. Он создает языковые записи для любого блока или элемента, который в настоящее время не имеет перевода. Может сэкономить вам массу времени, поскольку вам не нужно вручную писать файл en.json.
  • Если вы изменяете файл json и хотите включить в свой мод только изменения, вы можете создать JSON патч. Обычно вы даже можете сэкономить время, написав его самостоятельно, используя ModMaker 3000 ™, инструмент командной строки, который поставляется с игрой, для создания патчей для вас.

Поиск проблем

  • Если вы столкнулись с проблемой актива, просмотрите server-main.txt и client-main.txt! Движок очень разговорчив, когда дело доходит до ошибок ассетов.
  • Включите отчет об ошибках на постоянной основе через /errorreporter 1, чтобы избавить себя от работы по поиску и просмотру файлов журналов на наличие проблем. Эта функция сделает так, чтобы диалоговое окно появлялось после завершения игры, если были обнаружены какие-либо ошибки.

При написании модов на C#

  • Используйте точки останова для отладки
  • Просмотрите множество служебных классов, предоставляемых VS API, возможно, вы сможете сэкономить много усилий по написанию кода! (например, ColorUtil, GameMath , ArrayExtensions, DictExtensions , HashsetExtensions, JsonUtil , ReaderWriterExtensions, SerializerUtil , WildcardUtil)
  • Если вы еще не знаете, расширение LINQ, являющееся частью .net framework, является чрезвычайно мощный инструмент, позволяющий сделать код более выразительным.
  • Используйте функцию Горячая перезагрузка Visual Studio для изменения кода во время работы игры, чтобы сразу увидеть изменения, не перезапуская мир.
    • Обратите внимание, что эта функция работает, если вы используете официальный шаблон мода и настроили свой мод как «скомпилированный». Это не работает, если вы настроили свой мод как «исходный» мод, и он может не работать со всеми другими настройками среды разработки.
  • Если вы еще этого не сделали, убедитесь, что вывод игрового журнала заканчивается в окне вывода Visual Studio.
  • Если вы работаете с шейдерами, вы можете перезагрузить их с помощью .reload shaders
  • Не храните статические ссылки, если только это не примитивные данные. Статические ссылки не удаляются сборщиком мусора, когда игрок покидает сервер/игровой мир. Пример: статическая ссылка на Block сохранит этот блок в памяти, что, в свою очередь, сохранит в памяти экземпляр API, который, в свою очередь, сохранит в памяти весь игровой мир.
  • Игровой клиент и сервер имеют ряд аргументов запуска для облегчения вашей жизни.

Эффективные методы поиска

Чаще всего вы хотите, чтобы ваш код нашел что-то в игровом мире. Как вы, возможно, уже знаете, компьютеры не так хороши в параллельной обработке, как человеческие глаза, поэтому им приходится последовательно просматривать все пространство поиска. При этом имейте в виду, что, в первую очередь, самый эффективный метод поиска — это тот, который никогда не запускается в пространстве поиска нулевого размера ;-)
Другими словами, иногда вы можете вообще избежать поиска с помощью другие умные средства! Если вам все же нужно выполнить поиск, вот несколько более оптимальных способов, чем метод грубой силы:

  • Поиск объектов
    Используйте EntityPartitioning - api.ModLoader.GetModSystem<EntityPartitioning>().WalkEntityPartitions(). Эта система разбивает объекты на сегменты блоков 8x8x8 по всему загруженному игровому миру, а затем ищет только внутри этих сегментов в пределах заданного вами радиуса поиска, что значительно сокращает пространство поиска.
  • Поиск блока
    a) Если вы хотите, чтобы сущность нашла определенный, не слишком распространенный блок, используйте POI Registry. Этот реестр позволяет блочным объектам регистрировать точки интереса, которые объекты могут очень эффективно искать. Они также разделены на сегменты столбцов фрагментов, чтобы дополнительно сократить пространство поиска. Для примера кода ознакомьтесь с блочной сущностью ягодного куста
    b) Для регулярного полного сканирования чанка я рекомендую отдельный фоновый поток, который загружает чанк и получает доступ к необработанным данным блока через chunk.Blocks. Это массив с индексом (y * размер фрагмента + z) * размер фрагмента + x, где xyz — локальные координаты от 0 до фрагмента-1. Однако вы должны писать только в кусок в основном потоке! Если вы хотите пока избежать многопоточности, вы все равно можете перебирать chunk.Blocks в основном потоке и даже разбивать задачу на несколько тиков, как это делают ванильные ульи.
    c) Для сканирования редких областей используется api.World.GetBlockAccessorPrefetch(). Этот метод доступа к блокам позволяет предварительно загрузить область, а затем довольно эффективно перебирать каждый блок в заданной области.
Icon Sign.png

Wondering where some links have gone?
The modding navbox is going through some changes! Check out Navigation Box Updates for more info and help finding specific pages.

Modding
Modding Introduction Getting Started Пакет тем
Content Modding Content Mods Developing a Content Mod Basic Tutorials Intermediate Tutorials Advanced Tutorials Content Mod Concepts
Code Modding Code Mods Setting up your Development Environment
Property Overview ItemEntityBlockBlock BehaviorsBlock ClassesBlock EntitiesBlock Entity BehaviorsWorld properties
Workflows & Infrastructure Modding Efficiency TipsMod-engine compatibilityMod ExtensibilityVS Engine
Additional Resources Community Resources Modding API Updates Programming Languages List of server commandsList of client commandsClient startup parametersServer startup parameters
Example ModsAPI DocsGitHub Repository