Confirmedusers
409
edits
(Created page with "Это должно быть отмечено как синтаксическая ошибка, потому что класса <code>TunnlerItem</code> пока не существует.") |
No edit summary |
||
(59 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
<!--T:1--> | |||
__FORCETOC__ | __FORCETOC__ | ||
{{GameVersion|1.19.3}} | {{GameVersion|1.19.3}} | ||
<!--T:2--> | |||
Этот руководство по '''code mod''' требует наличия среды разработки. Если у вас её еще нет, прочтите руководство по {{ll|Modding:Setting up your Development Environment|настройке среды для разработки}}. Также рекомендуется сначала прочитать про {{ll|Modding:Basic Item|Простые Предметы}} и изучить их устройство если вы не сделали этого ранее. | |||
= Создание | = Создание Туннельной Кирки = <!--T:3--> | ||
<!--T:4--> | |||
В этом уроке мы создадим предмет с более продвинутой функциональностью: Кирка, которая позволяет вырыть туннель 3x3, добыв всего один блок. | В этом уроке мы создадим предмет с более продвинутой функциональностью: Кирка, которая позволяет вырыть туннель 3x3, добыв всего один блок. | ||
== | == Ассеты Предмета == <!--T:5--> | ||
Как и в случае с {{ll|Modding:Basic Item|Простым | <!--T:6--> | ||
Как и в случае с {{ll|Modding:Basic Item|Простым Предметом}}, нам нужно создать ассеты для нашего предмета, включая тип предмета, текстуру и lang-файл. Эти ассеты довольно простые, и вы можете скачать их [https://wiki.vintagestory.at/images/c/cd/Tunnler_-_No_CS_File.zip здесь]. Распакуйте файл в папку mods, и что бы приступить к программированию. | |||
В json вашего itemtype есть только одно новое свойство, <code>class</code>. Это свойство указывает нашему новому | <!--T:7--> | ||
В json вашего itemtype есть только одно новое свойство, <code>class</code>. Это свойство указывает нашему новому предмету, что он будет управляться определенным классом C#. | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
class: "tunnler", | class: "tunnler", | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Мы создадим этот класс, чтобы придать | <!--T:8--> | ||
Мы создадим этот класс, чтобы придать предмету желаемую функциональность. | |||
== Класс Предмета == | == Класс Предмета == <!--T:9--> | ||
Создание нашего | <!--T:10--> | ||
Создание нашего предмета требует создания пары новых файлов <code>*.cs</code> в нашем проекте. | |||
Если вы уже читали руководство - {{ll|Modding:Advanced Blocks| | <!--T:11--> | ||
Если вы уже читали руководство - {{ll|Modding:Advanced Blocks|Функциональные Блоки}}, это должно быть вам знакомо. | |||
=== Система | === Система Мода === <!--T:12--> | ||
Для того чтобы зарегистрировать класс предмета, нам нужно создать мод, который представляет собой класс, | Для того чтобы зарегистрировать ваш класс предмета, нам нужно создать мод, который представляет собой класс, наследующийся от ModSystem: | ||
<!--T:13--> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class TunnlerMod : ModSystem | public class TunnlerMod : ModSystem | ||
Line 37: | Line 45: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:14--> | |||
Переопределив метод <code>Start(ICoreAPI)</code>, мы можем зарегистрировать наш класс. Функция <code>RegisterItemClass</code> имеет два параметра: | Переопределив метод <code>Start(ICoreAPI)</code>, мы можем зарегистрировать наш класс. Функция <code>RegisterItemClass</code> имеет два параметра: | ||
Первый - идентификатор | Первый - идентификатор класса предмета, поскольку именно так мы будем ссылаться на этот класс в наших json-файлах itemtype. Убедитесь, что он идентичен классу, который мы указали в нашем предыдущем файле ассетов. | ||
Второй параметр - тип нашего | Второй параметр - тип нашего класса предмета. | ||
<!--T:15--> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class TunnlerMod : ModSystem | public class TunnlerMod : ModSystem | ||
Line 52: | Line 62: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:16--> | |||
Так как класса <code>TunnlerItem</code> ещё не существует, это место будет отображаться как синтаксическая ошибка. | |||
=== Класс Предмета === <!--T:17--> | |||
=== | |||
< | |||
< | <!--T:18--> | ||
При наименовании скриптов предметов рекомендуется называть их в формате "{Name}Item". В случае с туннельной киркой мы назовем наш скрипт <code>TunnlerItem.cs</code>. Любой itemclass должен наследоваться от Item, предоставляющий ему необходимую нам функциональность: | |||
< | <!--T:19--> | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class TunnlerItem : Item | public class TunnlerItem : Item | ||
{ | { | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <!--T:21--> | ||
Это должно решить все синтаксические ошибки. | |||
< | <!--T:22--> | ||
''' | '''Так что же должен делать наш инструмент?''' Когда игрок добывает блок с помощью этого инструмента, все блоки вокруг него также должны быть добыты. | ||
< | <!--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--> | ||
В нашем конкретном случае мы можем переопределить метод <code>bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1)</code>. | |||
< | <!--T:25--> | ||
Нам нужно знать, с какой стороны стоит игрок (на какую сторону он ориентируется) и находится ли он в творческом режиме или режиме выживания (нужно ли сбрасывать добытые предметы или нет). Прежде чем переопределять <code>OnBlockBrokenWith</code>, мы должны создать метод, который уничтожает все блоки между двумя позициями блока (min и max). Он также должен сбрасывать предметы, только если игрок находится в режиме выживания: | |||
< | <!--T:26--> | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public void DestroyBlocks(IWorldAccessor world, BlockPos min, BlockPos max, IPlayer player) | public void DestroyBlocks(IWorldAccessor world, BlockPos min, BlockPos max, IPlayer player) | ||
Line 115: | Line 115: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <!--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 145: | Line 144: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <!--T:28--> | ||
---- | ---- | ||
< | <!--T:29--> | ||
Если вы всё сделали правильно, то ваш файл должен быть похож на: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using Vintagestory.API.Common; | using Vintagestory.API.Common; | ||
using Vintagestory.API.Common.Entities; | using Vintagestory.API.Common.Entities; | ||
using Vintagestory.API.MathTools; | using Vintagestory.API.MathTools; | ||
namespace ExampleMods | namespace ExampleMods | ||
{ | { | ||
public class TunnlerMod : ModSystem | public class TunnlerMod : ModSystem | ||
{ | { | ||
public override void Start(ICoreAPI api) | public override void Start(ICoreAPI api) | ||
{ | { | ||
Line 172: | Line 165: | ||
api.RegisterItemClass("tunnler", typeof(TunnlerItem)); | api.RegisterItemClass("tunnler", typeof(TunnlerItem)); | ||
} | } | ||
} | } | ||
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 202: | Line 189: | ||
} | } | ||
} | } | ||
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 229: | Line 214: | ||
return false; | return false; | ||
} | } | ||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
< | <!--T:38--> | ||
Вы также можете скачать файл напрямую: [https://wiki.vintagestory.at/images/a/ad/Tunnler.cs Tunnler.cs]. | |||
== Тестирование == <!--T:39--> | |||
< | <!--T:40--> | ||
Вот как это выглядит в игре: | |||
< | <!--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--> | ||
Варианты мода из этого руководства: | |||
* 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] | ||
< | <!--T:46--> | ||
{{Navbox/modding|Vintage Story}} | {{Navbox/modding|Vintage Story}} | ||