44,051
edits
(Created page with "Теперь нам нужно добавить эти новые текстуры в файл json. <syntaxhighlight lang="json"> textures: { all: { base: "block/mygol...") |
(Updating to match new version of source page) |
||
(58 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
<div class="mw-translate-fuzzy"> | |||
{{GameVersion|1.15}} | |||
__FORCETOC__ | __FORCETOC__ | ||
</div> | |||
Пожалуйста, сначала прочитайте руководство | Пожалуйста, сначала прочитайте руководство по {{pll|Modding:Asset_System|системе ассетов}}, если вы этого еще не сделали. Это руководство познакомит вас с основами добавления блоков в игру, используя JSON файлы. Если вы хотите добавить функциональный блок, то вам необходимо изучить руководство по [[Advanced Blocks|Продвинутым блокам]]. С полным списком свойств которые вы можете использовать в json файлах, вы можете ознакомиться [[Block Json Properties|здесь]]. | ||
= Простой блок = | = Простой блок = | ||
Line 14: | Line 17: | ||
== Текстуры == | == Текстуры == | ||
Мы будем использовать эту текстуру для нашего блока: [[File:Gold block.png]]. | Мы будем использовать эту текстуру для нашего блока: [[File:Gold block.png]]. <br> | ||
(Для создания собственных текстур вы можете использовать такие программы, как [https://www.dotpdn.com/downloads/pdn.html/ PaintDotNet(бесплатно)], [https://www.piskelapp.com/ Piskel(бесплатно)], или [https://github.com/aseprite/aseprite/ Aseprite (бесплатный открытый исходный код или оплата за предварительно скомпилированный вариант)]) | |||
Теперь нам нужно поместить текстуру в нужное место, чтобы мы могли использовать ее позже. Поэтому вам необходимо переименовать текстуру в <code>mygoldtexture.png</code> и поместить ее в <code>assets/mygoldblock/textures/block/</code> в вашем рабочем пространстве (сначала вы должны создать эти папки). <code>mygoldblock</code> будет нашим доменом. | Теперь нам нужно поместить текстуру в нужное место, чтобы мы могли использовать ее позже. Поэтому вам необходимо переименовать текстуру в <code>mygoldtexture.png</code> и поместить ее в <code>assets/mygoldblock/textures/block/</code> в вашем рабочем пространстве (сначала вы должны создать эти папки). <code>mygoldblock</code> будет нашим доменом. | ||
Line 22: | Line 26: | ||
Следующее, что нам понадобится, это файл json, который определит свойства блока. Пока мы будем делать это просто и будем работать только с простыми свойствами. Если вы хотите сделать что-то более сложное, вы можете взглянуть на [[Block Json Properties|Обзор свойств блока]]. | Следующее, что нам понадобится, это файл json, который определит свойства блока. Пока мы будем делать это просто и будем работать только с простыми свойствами. Если вы хотите сделать что-то более сложное, вы можете взглянуть на [[Block Json Properties|Обзор свойств блока]]. | ||
Теперь вам нужно создать новый файл json в вашем редакторе (мы рекомендуем использовать редактор с подсветкой синтаксиса, такой как [https://notepad-plus-plus.org/ Notepad++] или Visual Studio). | Теперь вам нужно создать новый файл json в вашем редакторе (мы рекомендуем использовать редактор с подсветкой синтаксиса, такой как [https://notepad-plus-plus.org/ Notepad++] или [https://www.sublimetext.com/ Sublime Text]. Если у вас будет много файлов JSON или немного C#, то [https://code.visualstudio.com/ Visual Studio Code] тоже хороший выбор). | ||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
{ | { | ||
code: "mygoldblock", | "code": "mygoldblock", | ||
creativeinventory: { "general": ["*"] }, | "creativeinventory": { "general": ["*"] }, | ||
blockmaterial: "Stone", | "blockmaterial": "Stone", | ||
drawtype: "Cube", | "drawtype": "Cube", | ||
textures: { | "textures": { | ||
all: { base: "block/mygoldtexture" } | "all": { "base": "block/mygoldtexture" } | ||
}, | }, | ||
resistance: 3.5, | "resistance": 3.5, | ||
sounds: { | "sounds": { | ||
"place": "game:block/anvil", | "place": "game:block/anvil", | ||
"walk": "game:walk/stone" | "walk": "game:walk/stone" | ||
Line 69: | Line 73: | ||
Кроме того, вам нужно добавить файл <code>modinfo.json</code>, посмотрите [[Game_Content_Mod|это руководство]]. | Кроме того, вам нужно добавить файл <code>modinfo.json</code>, посмотрите [[Game_Content_Mod|это руководство]]. | ||
Чтобы установить мод, перейдите к [[ | Чтобы установить мод, перейдите к [[VintagestoryData folder/ru|папке Vintage Story]] и поместите его в папку модов. | ||
[https://wiki.vintagestory.at/images/4/4c/MyGoldBlockMod.zip MyGoldBlockMod.zip] | [https://wiki.vintagestory.at/images/4/4c/MyGoldBlockMod.zip MyGoldBlockMod.zip] | ||
Line 88: | Line 92: | ||
Теперь нам нужно добавить эти новые текстуры в файл json. | Теперь нам нужно добавить эти новые текстуры в файл json. | ||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
textures: { | "textures": { | ||
all: { | "all": { | ||
base: "block/mygoldtexture", | "base": "block/mygoldtexture", | ||
alternates: [{base: "block/mygoldtexture1" }, {base: "block/mygoldtexture2" }, {base: "block/mygoldtexture3" }], | "alternates": [{"base": "block/mygoldtexture1" }, {"base": "block/mygoldtexture2" }, {"base": "block/mygoldtexture3" }], | ||
}, | }, | ||
}, | }, | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Теперь сохраните его и снова запустите Vintagestory. Теперь вы должны увидеть такой результат: | |||
[[File:2017-01-10 14-05-03.png|700px]] | [[File:2017-01-10 14-05-03.png|700px]] | ||
Конечно, вы можете добавить больше текстур, если хотите. | |||
== | == Вариации == | ||
Золото самое хорошо, но железо тоже потрясающее... так что же нам делать? Давайте добавим еще одну вариацию этого блока, потому что мы все любим железо. | |||
Вы можете продублировать blocktype файл и переименовать серебро в золото во всех местах, или вы можете просто добавить другую вариацию к существующему blocktype. | |||
=== | === Вариантгруппа: Тип === | ||
Итак, прежде всего нам снова понадобятся новые текстуры: [[File:Myirontexture.png]] [[File:Myirontexture1.png]] [[File:Myirontexture2.png]] [[File:Myirontexture3.png]] | |||
Теперь нам нужно изменить несколько вещей в нашем файле JSON. Мы можем добавлять все виды различных [[Modding:Registry_Object_JSON_Parsing/ru|групп]], но пока мы сохраняем это простым. Мы добавляем группу под названием <code>type</code>, с состояниями <code>gold</code> и <code>iron</code>. Вы можете использовать любой код группы, который вы хотите. | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
variantgroups: [ | "variantgroups": [ | ||
{ code: "type", states: ["gold", "iron"] } | { "code": "type", "states": ["gold", "iron"] } | ||
], | ], | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Следующее, что нам нужно сделать, это установить текстуры по типу. Поэтому мы удаляем наше свойство <code>texture</code> и заменяем его новым свойством <code>texturesbytype</code>, которое позволит нам устанавливать различные текстуры для каждого типа. | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
texturesbytype: { | "texturesbytype": { | ||
"*-gold": { | "*-gold": { | ||
all: { | "all": { | ||
base: "block/mygoldtexture", | "base": "block/mygoldtexture", | ||
alternates: [{base: "block/mygoldtexture1" }, {base: "block/mygoldtexture2" }, {base: "block/mygoldtexture3" }], | "alternates": [{"base": "block/mygoldtexture1" }, {"base": "block/mygoldtexture2" }, {"base": "block/mygoldtexture3" }], | ||
}, | }, | ||
}, | }, | ||
"*-iron": { | "*-iron": { | ||
all: { | "all": { | ||
base: "block/myirontexture", | "base": "block/myirontexture", | ||
alternates: [{base: "block/myirontexture1" }, {base: "block/myirontexture2" }, {base: "block/myirontexture3" }], | "alternates": [{"base": "block/myirontexture1" }, {"base": "block/myirontexture2" }, {"base": "block/myirontexture3" }], | ||
}, | }, | ||
} | } | ||
Line 139: | Line 143: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Каждая группа будет добавлена после друг друга в код блоков <code>myblockname-mygroup-mysecondgroup</code>. В нашем примере мы можем сэкономить, написав несколько дополнительных букв, используя подстановочный знак <code>*</code>. | |||
Вы также можете использовать более компактное определение. Благодаря тому, как мы назвали наши текстуры, мы можем использовать заполнитель {type} для определения имени текстуры, поэтому вместо индивидуальной обработки каждого случая мы можем написать его так: | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
textures: { | "textures": { | ||
all: { | "all": { | ||
base: "block/my{type}texture", | "base": "block/my{type}texture", | ||
alternates: [{base: "block/my{type}texture1" }, {base: "block/my{type}texture2" }, {base: "block/my{type}texture3" }], | "alternates": [{"base": "block/my{type}texture1" }, {"base": "block/my{type}texture2" }, {"base": "block/my{type}texture3" }], | ||
}, | }, | ||
}, | }, | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Полное определение blocktype может тогда выглядеть так: | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
{ | { | ||
code: "myshinyblock", | "code": "myshinyblock", | ||
creativeinventory: { "general": ["*"] }, | "creativeinventory": { "general": ["*"] }, | ||
variantgroups: [ | "variantgroups": [ | ||
{ code: "type", states: ["gold", "iron"] } | { "code": "type", "states": ["gold", "iron"] } | ||
], | ], | ||
blockmaterial: "Stone", | "blockmaterial": "Stone", | ||
drawtype: "cube", | "drawtype": "cube", | ||
textures: { | "textures": { | ||
all: { | "all": { | ||
base: "block/my{type}texture", | "base": "block/my{type}texture", | ||
alternates: [{base: "block/my{type}texture1" }, {base: "block/my{type}texture2" }, {base: "block/my{type}texture3" }], | "alternates": [{"base": "block/my{type}texture1" }, {"base": "block/my{type}texture2" }, {"base": "block/my{type}texture3" }], | ||
}, | }, | ||
}, | }, | ||
resistance: 3.5, | "resistance": 3.5, | ||
sounds: { | "sounds": { | ||
"place": "game:block/anvil", | "place": "game:block/anvil", | ||
"walk": "game:walk/stone" | "walk": "game:walk/stone" | ||
Line 178: | Line 182: | ||
[[File:2017-01-10 14-36-58.png|700px]] | [[File:2017-01-10 14-36-58.png|700px]] | ||
=== | === Вариантгруппа: Состояние === | ||
Давайте в другой группе к нашему блоку, который будет определять состояние этого блока. Будет два состояния: <code>good</code> и <code>used</code>. Мы можем добавить эту группу, добавив другое свойство в <code>variantgroups[]</code>. | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
variantgroups: [ | "variantgroups": [ | ||
{ code: "type", states: ["gold", "iron"] }, | { "code": "type", "states": ["gold", "iron"] }, | ||
{ code: "condition", states: ["good", "used"]} | { "code": "condition", "states": ["good", "used"]} | ||
], | ], | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Чтобы завершить реализацию этой второй группы, мы должны позаботиться о каждом случае. Мы хотим, чтобы блоки <code>good</code> использовали только базовую текстуру, а блоки <code>used</code> также использовали их случайные текстуры: | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
texturesbytype: { | "texturesbytype": { | ||
"*-good": { | "*-good": { | ||
all: { | "all": { | ||
base: "block/my{type}texture", | "base": "block/my{type}texture", | ||
}, | }, | ||
}, | }, | ||
"*-used": { | "*-used": { | ||
all: { | "all": { | ||
base: "block/my{type}texture", | "base": "block/my{type}texture", | ||
alternates: [{base: "block/my{type}texture1" }, {base: "block/my{type}texture2" }, {base: "block/my{type}texture3" }], | "alternates": [{"base": "block/my{type}texture1" }, {"base": "block/my{type}texture2" }, {"base": "block/my{type}texture3" }], | ||
}, | }, | ||
}, | }, | ||
Line 207: | Line 211: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Блоки в хорошем состоянии или с левой стороны, тогда как использованные находятся справа: | |||
[[File:2017-01-10 15-02-38.png|700px]] | [[File:2017-01-10 15-02-38.png|700px]] | ||
== | == Пользовательские модели == | ||
Чтобы использовать пользовательскую модель, нам нужно сначала ее создать. Движок поддерживает только формат модели / формы, созданные в [[VS Model Creator]]. | |||
После того, как вы создали свою собственную модель, вам нужно экспортировать ее как файл json, создать новую папку <code>assets/myshinyblock/shapes/block/</code> и сохранить файл там. В нашем примере мы будем использовать эту модель [https://wiki.vintagestory.at/images/3/38/Myshinymodel.json Myshinymodel.json] и переместить ее в <code>assets/myshinyblock/shapes/block/myshinymodel.json</code>. | |||
Теперь нам нужно указать модель внутри нашего файла типа json. | |||
Поэтому мы изменим drawtype с <code>cube</code> на <code>json</code>: | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
drawtype: "json", | "drawtype": "json", | ||
</syntaxhighlight> | </syntaxhighlight> | ||
и shape на <code>myshinymodel</code> | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
shape: { base: "block/myshinymodel" }, | "shape": { base: "block/myshinymodel" }, | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Хотя теоретически этого будет достаточно, мы также должны определить, что этот блок не является твердым, чтобы предотвратить графические сбои. | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
sidesolid: { | "sidesolid": { | ||
all: "false" | "all": "false" | ||
}, | }, | ||
sideopaque: { | "sideopaque": { | ||
all: "false" | "all": "false" | ||
}, | }, | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Итак, давайте запустим игру. Вот как это должно выглядеть: | |||
[[File:2017-01-12 14-06-27.png|700px]] | [[File:2017-01-12 14-06-27.png|700px]] | ||
== | == Варианты пользовательских форм (моделей) == | ||
Я создал другую модель для блоков в хорошем состоянии ([https://wiki.vintagestory.at/images/f/fa/Myshinymodel1.json myshinymodel1.json]), потому что они должны выглядеть более круто, чем в использованных условиях. Поэтому нам нужно также скопировать файл json в <code>assets/myshinyblock/shapes/block/</code>. | |||
Чтобы указать форму по типу, нам нужно удалить свойство <code>shape</code> и заменить его на <code>shapebytype</code>: | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
shapebytype: { | "shapebytype": { | ||
"*-good": { | "*-good": { | ||
base: "block/myshinymodel1", | "base": "block/myshinymodel1", | ||
}, | }, | ||
"*-used": { | "*-used": { | ||
base: "block/myshinymodel", | "base": "block/myshinymodel", | ||
}, | }, | ||
}, | }, | ||
Line 260: | Line 264: | ||
[[File:2017-01-12 14-51-45.png|700px]] | [[File:2017-01-12 14-51-45.png|700px]] | ||
= | = Скачать мод = | ||
Вы можете найти полный мод здесь для справки: | |||
[https://wiki.vintagestory.at/images/4/42/MyShinyBlockMod.zip MyShinyBlockMod] | [https://wiki.vintagestory.at/images/4/42/MyShinyBlockMod.zip MyShinyBlockMod] | ||
= | = Дальнейшее продвижение = | ||
Приведенный здесь пример, хотя и выглядит на первый взгляд сложным, показывает только то, на что способны blocktypes в Vintage Story. Настоятельно рекомендуется поэкспериментировать или хотя бы ознакомиться со всеми известными свойствами блоков, прежде чем переходить к кодовым модам. Лучший способ сделать это - просмотреть '''[[Modding:Block Json Properties | Свойства блоков]]''' это страница, которая содержит текущий список всех используемых блоков свойств JSON, которые в настоящее время включены в игру. Большинство свойств в списке также имеют ссылки на файлы, которые можно искать в папке Vintage Story Assets. Если вы не знаете, где это, вы можете найти учебные пособия для каждой операционной системы в {{ll|Modding:The Asset System |nsp=0}}. | |||
Если вы еще этого не сделали, рекомендуется также проверить '''[[Modding:Basic Item | Основа предмета]]''' и '''[[Modding:Basic Entity | Основа существ]]''' страницы, чтобы узнать, как простые элементы и сущности через JSON добавляются в игру. | |||
Однако, если вы чувствуете, что хотите перейти к модам кода, вам следует начать с настройки своей'''[[Modding: Setting up your Development Environment | Среды разработки]]'''. | |||
= Обучающее видео: Как сделать мод без программирования (на Русском) = | |||
Большая благодарность ZigTheHedge за великолепное подробное видео | |||
<br><youtube>BAr7etxj-1o</youtube> <youtube>fnFFh_enXiA</youtube> | |||
<div class="mw-translate-fuzzy"> | |||
{{Navbox/modding|Vintage Story}} | {{Navbox/modding|Vintage Story}} | ||
</div> |