Confirmedusers
409
edits
(Created page with "Создание нашего предмета требует создания пары новых файлов <code>*.cs</code> в нашем проекте.") |
No edit summary |
||
(23 intermediate revisions by 2 users not shown) | |||
Line 32: | Line 32: | ||
<!--T:11--> | <!--T:11--> | ||
Если вы уже читали руководство - {{ll|Modding:Advanced Blocks|Функциональные Блоки}}, это должно быть вам знакомо. | |||
=== Система Мода === <!--T:12--> | |||
=== | Для того чтобы зарегистрировать ваш класс предмета, нам нужно создать мод, который представляет собой класс, наследующийся от ModSystem: | ||
<!--T:13--> | <!--T:13--> | ||
Line 52: | Line 46: | ||
<!--T:14--> | <!--T:14--> | ||
Переопределив метод <code>Start(ICoreAPI)</code>, мы можем зарегистрировать наш класс. Функция <code>RegisterItemClass</code> имеет два параметра: | |||
Первый - идентификатор класса предмета, поскольку именно так мы будем ссылаться на этот класс в наших json-файлах itemtype. Убедитесь, что он идентичен классу, который мы указали в нашем предыдущем файле ассетов. | |||
Второй параметр - тип нашего класса предмета. | |||
<!--T:15--> | <!--T:15--> | ||
Line 69: | 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 87: | 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 140: | 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 174: | Line 149: | ||
<!--T:29--> | <!--T:29--> | ||
Если вы всё сделали правильно, то ваш файл должен быть похож на: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using Vintagestory.API.Common; | using Vintagestory.API.Common; | ||
Line 182: | Line 155: | ||
using Vintagestory.API.MathTools; | using Vintagestory.API.MathTools; | ||
namespace ExampleMods | namespace ExampleMods | ||
{ | { | ||
Line 188: | Line 160: | ||
{ | { | ||
public override void Start(ICoreAPI api) | public override void Start(ICoreAPI api) | ||
{ | { | ||
Line 195: | 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 222: | 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 248: | 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] |