Confirmedusers
409
edits
(Created page with "Этот руководство по '''code mod''' требует наличия среды разработки. Если у вас её еще нет, прочтите руководство по {{ll|Modding:Setting up your Development Environment|настройке среды для разработки}}. Также рекомендуется сначала прочитать про {{ll|Modding:Basic Item|Простые Предметы}} и изучить их у...") |
No edit summary |
||
(31 intermediate revisions by 2 users not shown) | |||
Line 7: | Line 7: | ||
Этот руководство по '''code mod''' требует наличия среды разработки. Если у вас её еще нет, прочтите руководство по {{ll|Modding:Setting up your Development Environment|настройке среды для разработки}}. Также рекомендуется сначала прочитать про {{ll|Modding:Basic Item|Простые Предметы}} и изучить их устройство если вы не сделали этого ранее. | Этот руководство по '''code mod''' требует наличия среды разработки. Если у вас её еще нет, прочтите руководство по {{ll|Modding:Setting up your Development Environment|настройке среды для разработки}}. Также рекомендуется сначала прочитать про {{ll|Modding:Basic Item|Простые Предметы}} и изучить их устройство если вы не сделали этого ранее. | ||
= Создание Туннельной Кирки = <!--T:3--> | |||
<!--T:4--> | <!--T:4--> | ||
В этом уроке мы создадим предмет с более продвинутой функциональностью: Кирка, которая позволяет вырыть туннель 3x3, добыв всего один блок. | |||
== Ассеты Предмета == <!--T:5--> | |||
= | |||
<!--T:6--> | <!--T:6--> | ||
Как и в случае с {{ll|Modding:Basic Item|Простым Предметом}}, нам нужно создать ассеты для нашего предмета, включая тип предмета, текстуру и lang-файл. Эти ассеты довольно простые, и вы можете скачать их [https://wiki.vintagestory.at/images/c/cd/Tunnler_-_No_CS_File.zip здесь]. Распакуйте файл в папку mods, и что бы приступить к программированию. | |||
<!--T:7--> | <!--T:7--> | ||
В json вашего itemtype есть только одно новое свойство, <code>class</code>. Это свойство указывает нашему новому предмету, что он будет управляться определенным классом C#. | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
class: "tunnler", | class: "tunnler", | ||
Line 34: | Line 24: | ||
<!--T:8--> | <!--T:8--> | ||
Мы создадим этот класс, чтобы придать предмету желаемую функциональность. | |||
== Класс Предмета == <!--T:9--> | |||
= | |||
<!--T:10--> | <!--T:10--> | ||
Создание нашего предмета требует создания пары новых файлов <code>*.cs</code> в нашем проекте. | |||
<!--T:11--> | <!--T:11--> | ||
Если вы уже читали руководство - {{ll|Modding:Advanced Blocks|Функциональные Блоки}}, это должно быть вам знакомо. | |||
=== Система Мода === <!--T:12--> | |||
=== | Для того чтобы зарегистрировать ваш класс предмета, нам нужно создать мод, который представляет собой класс, наследующийся от ModSystem: | ||
<!--T:13--> | <!--T:13--> | ||
Line 68: | Line 46: | ||
<!--T:14--> | <!--T:14--> | ||
Переопределив метод <code>Start(ICoreAPI)</code>, мы можем зарегистрировать наш класс. Функция <code>RegisterItemClass</code> имеет два параметра: | |||
Первый - идентификатор класса предмета, поскольку именно так мы будем ссылаться на этот класс в наших json-файлах itemtype. Убедитесь, что он идентичен классу, который мы указали в нашем предыдущем файле ассетов. | |||
Второй параметр - тип нашего класса предмета. | |||
<!--T:15--> | <!--T:15--> | ||
Line 85: | Line 63: | ||
<!--T:16--> | <!--T:16--> | ||
Так как класса <code>TunnlerItem</code> ещё не существует, это место будет отображаться как синтаксическая ошибка. | |||
=== Класс Предмета === <!--T:17--> | |||
=== | |||
<!--T:18--> | <!--T:18--> | ||
При наименовании скриптов предметов рекомендуется называть их в формате "{Name}Item". В случае с туннельной киркой мы назовем наш скрипт <code>TunnlerItem.cs</code>. Любой itemclass должен наследоваться от Item, предоставляющий ему необходимую нам функциональность: | |||
<!--T:19--> | <!--T:19--> | ||
Line 103: | Line 75: | ||
{ | { | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:21--> | <!--T:21--> | ||
Это должно решить все синтаксические ошибки. | |||
<!--T:22--> | <!--T:22--> | ||
'''Так что же должен делать наш инструмент?''' Когда игрок добывает блок с помощью этого инструмента, все блоки вокруг него также должны быть добыты. | |||
''' | |||
<!--T:23--> | <!--T:23--> | ||
Как обычно, мы можем обратиться к [https://apidocs.vintagestory.at/api/Vintagestory.API.Common.Item.html#methods item api docs], чтобы найти функцию, которую мы можем использовать. Хотя сам класс item не содержит соответствующей функции, мы также можем обратиться к [https://apidocs.vintagestory.at/api/Vintagestory.API.Common.CollectibleObject.html CollectibleObject api docs], от которого класс item наследуется. | |||
<!--T:24--> | <!--T:24--> | ||
В нашем конкретном случае мы можем переопределить метод <code>bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1)</code>. | |||
<!--T:25--> | <!--T:25--> | ||
Нам нужно знать, с какой стороны стоит игрок (на какую сторону он ориентируется) и находится ли он в творческом режиме или режиме выживания (нужно ли сбрасывать добытые предметы или нет). Прежде чем переопределять <code>OnBlockBrokenWith</code>, мы должны создать метод, который уничтожает все блоки между двумя позициями блока (min и max). Он также должен сбрасывать предметы, только если игрок находится в режиме выживания: | |||
<!--T:26--> | <!--T:26--> | ||
Line 156: | Line 117: | ||
<!--T:27--> | <!--T:27--> | ||
Теперь мы можем реализовать <code>OnBlockBroken</code> довольно легко, позаботившись обо всех возможных осях, с которыми может столкнуться игрок: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1) | public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1) | ||
Line 190: | Line 149: | ||
<!--T:29--> | <!--T:29--> | ||
Если вы всё сделали правильно, то ваш файл должен быть похож на: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using Vintagestory.API.Common; | using Vintagestory.API.Common; | ||
Line 198: | Line 155: | ||
using Vintagestory.API.MathTools; | using Vintagestory.API.MathTools; | ||
namespace ExampleMods | namespace ExampleMods | ||
{ | { | ||
Line 204: | Line 160: | ||
{ | { | ||
public override void Start(ICoreAPI api) | public override void Start(ICoreAPI api) | ||
{ | { | ||
Line 211: | Line 166: | ||
} | } | ||
} | } | ||
public class TunnlerItem : Item | public class TunnlerItem : Item | ||
{ | { | ||
public void DestroyBlocks(IWorldAccessor world, BlockPos min, BlockPos max, IPlayer player) | public void DestroyBlocks(IWorldAccessor world, BlockPos min, BlockPos max, IPlayer player) | ||
{ | { | ||
Line 238: | Line 190: | ||
} | } | ||
public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1) | public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1) | ||
{ | { | ||
Line 264: | Line 215: | ||
} | } | ||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:38--> | <!--T:38--> | ||
Вы также можете скачать файл напрямую: [https://wiki.vintagestory.at/images/a/ad/Tunnler.cs Tunnler.cs]. | |||
== Тестирование == <!--T:39--> | |||
= | |||
<!--T:40--> | <!--T:40--> | ||
Вот как это выглядит в игре: | |||
<!--T:41--> | <!--T:41--> | ||
<youtube>2MRzYKguVFY</youtube> | <youtube>2MRzYKguVFY</youtube> | ||
== Распространение == <!--T:42--> | |||
= | |||
=== Использование нового Шаблона Мода === <!--T:43--> | |||
Если вы используете шаблон мода, следуйте инструкциям [[Modding:Setting up your Development Environment#Packaging the Mod|Настройка среды разработки]], чтобы упаковать ваш мод для дальнейшего распространения. | |||
=== Использование Modtools (старый способ) === <!--T:44--> | |||
Если вы используете программу modtools, откройте её и введите <code>pack <your mod id></code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку <code>mods</code>. | |||
= Скачать Мод = | |||
<!--T:45--> | <!--T:45--> | ||
Варианты мода из этого руководства: | |||
* for VS v1.9: [https://wiki.vintagestory.at/images/7/7b/Tunnler_vs1.9_v1.0.0.zip Tunnler_vs1.9_v1.0.0.zip] | * for VS v1.9: [https://wiki.vintagestory.at/images/7/7b/Tunnler_vs1.9_v1.0.0.zip Tunnler_vs1.9_v1.0.0.zip] | ||
* for VS v1.8: [https://wiki.vintagestory.at/images/6/66/Tunnler.zip Tunnler.zip] | * for VS v1.8: [https://wiki.vintagestory.at/images/6/66/Tunnler.zip Tunnler.zip] |