Modding:Advanced Blocks/ru: Difference between revisions
(Created page with "Чтобы все закончить, откройте modtools и введите <code>pack <your mod id></code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку <code>mods</code>.") |
No edit summary |
||
(51 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
<languages /> | <languages /> | ||
__FORCETOC__ | __FORCETOC__ | ||
{{GameVersion|1. | {{GameVersion|1.19.3}} | ||
Этот руководство по '''code mod''' требует наличия среды разработки. Если у вас её еще нет, прочтите руководство по {{ll|Modding:Setting up your Development Environment|настройке среды для разработки}}. Также рекомендуется сначала прочитать про {{ll|Modding:Basic Block|Простые Блоки}} и изучить их устройство если вы не сделали этого ранее. | |||
= | = Создание Батута = | ||
В этом уроке мы создадим | В этом уроке мы создадим блок с более продвинутой функциональностью: Батут. | ||
== Ассеты | == Ассеты Блока == | ||
Как и в случае с нашим {{ll|Modding:Basic Block|Простым Блоком}}, первое, что нам нужно - это assets блока. Создайте тип блока <code>trampoline.json</code> на основе нашего блока, созданного в предыдущем руководстве. | |||
В нашем файле blocktype нам нужно добавить свойство <code>class</code>. Это свойство, по сути, указывает нашему новому блоку, что он будет управляться определенным классом C#. | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
class: "trampoline", | class: "trampoline", | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Мы создадим этот класс, чтобы | Мы создадим этот класс в нашей среде разработки, чтобы придать блоку желаемую функциональность. Вы можете скачать ассеты мода [https://wiki.vintagestory.at/images/b/b9/Trampoline_-_No_CS_FILE.zip здесь]. | ||
Все, что вам нужно сделать, это поместить содержимое этого zip-файла в директорию <code>assets</code> в вашем проекте разработки. | |||
== Класс | == Класс Блока == | ||
Чтобы создать наш мод, нам понадобится несколько новых файлов <code>*.cs</code> в нашем проекте. | |||
=== Система | === Система Мода === | ||
Для | Для того чтобы создать мод, нам нужно создать класс, который будет наследоваться от <code>ModSystem</code>. Это позволит регистрировать всевозможные вещи, но пока мы ограничимся регистрацией только нашего класса блока. | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 33: | Line 34: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Теперь вам нужно переопределить метод <code>Start(ICoreAPI)</code> и зарегистрировать класс. | Теперь вам нужно переопределить метод <code>Start(ICoreAPI)</code> и зарегистрировать класс. | ||
Функция <code>RegisterBlockClass</code> имеет два параметра: первый - идентификатор класса блока, который мы используем в json-файлах blocktype. Убедитесь, что он идентичен классу, который мы указали в нашем предыдущем файле активов. Второй параметр - это тип нашего класса блока. | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 46: | Line 49: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Так как класса <code>TrampolineBlock</code> ещё | Так как класса <code>TrampolineBlock</code> ещё не существует, это место будет отображаться как синтаксическая ошибка. | ||
=== Класс | === Класс Блока === | ||
Давайте создадим наш класс блока, который, конечно, должен унаследовать класс <code>Block</code>: | Давайте создадим наш класс блока, который, конечно, должен унаследовать класс <code>Block</code>: | ||
Давайте создадим наш класс блока. При именовании скриптов блоков рекомендуется называть их в формате "{Name}Block". В случае с батутом мы назовем наш скрипт <code>TrampolineBlock.cs</code>. Любой класс блока должен наследоваться от <code>Block</code>, предоставляющий ему необходимую нам функциональность: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class TrampolineBlock : Block | public class TrampolineBlock : Block | ||
Line 62: | Line 67: | ||
Итак, как же нам реализовать прыгучий блок? Будет не лишним взглянуть на [https://apidocs.vintagestory.at/api/Vintagestory.API.Common.Block.html документацию API], чтобы найти правильный способ. | Итак, как же нам реализовать прыгучий блок? Будет не лишним взглянуть на [https://apidocs.vintagestory.at/api/Vintagestory.API.Common.Block.html документацию API], чтобы найти правильный способ. | ||
Метод <code>void | Метод <code>void OnEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, Vec3d collideSpeed, bool isImpact)</code> выглядит как неплохой вариант для реализации прыгучего функционала. Заметьте, что каждый блок батута размещенный в игре будет {{ll|Modding:Block_Cardinality|совместно использовать}} один и тот же экземпляр <code>TrampolineBlock</code>. Поскольку этот объект используется несколькими блоками, он не имеет поля для позиции блока. Поэтому в обработчике события присутствует параметр <code>pos</code>. | ||
'''Когда объект должен отскочить?''' | '''Когда объект должен отскочить?''' | ||
# Сущность должна отскочить в тот момент, когда она приземляется на вершину блока, а не, когда она уже стоит на нем. Поэтому <code>isImpact</code> должно быть <code>true</code>. | # Сущность должна отскочить в тот момент, когда она приземляется на вершину блока, а не, когда она уже стоит на нем. Поэтому <code>isImpact</code> должно быть <code>true</code>. | ||
# | # Сущность должна сталкиваться вертикально. Стороны блока не должны отталкивать сущность. Таким образом, осью стороны <code>axis</code> <code>facing</code> должна быть <code>Y</code>. | ||
'''Как мы можем заставить объект подпрыгивать?''' | |||
Чтобы заставить объект подпрыгнуть, нам нужно изменить его направление. Поэтому мы можем просто изменить направление его движения. Чем быстрее сущность будет двигаться во время столкновения, тем дальше она будет отброшена. Но простое изменение направления движения не будет идеальным. Сущность никогда не потеряет своего движения и будет бесконечно отскакивать. Поэтому давайте сделаем что-нибудь, что заставит сущность терять 20% своего движения при каждом отскоке: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
entity.Pos.Motion.Y *= -0.8; | entity.Pos.Motion.Y *= -0.8; | ||
</syntaxhighlight>The <code>*=</code> is a shorthand way of writing:<syntaxhighlight lang="c#"> | |||
entity.Pos.Motion.Y = entity.Pos.Motion.Y * -0.8; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
---- | ---- | ||
Если собрать всё воедино, это должно выглядеть так: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 89: | Line 93: | ||
if (isImpact && facing.Axis == EnumAxis.Y) | if (isImpact && facing.Axis == EnumAxis.Y) | ||
{ | { | ||
entity.Pos.Motion.Y *= -0.8; | entity.Pos.Motion.Y *= -0.8; | ||
} | } | ||
Line 96: | Line 99: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Хотя этот код уже работает, некоторые звуковые эффекты были бы весьма кстати. Мы можем реализовать это, добавив в наш блок поле звуковой ссылки, которое можно использовать для воспроизведения звука <code>game:tick</code>. | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 104: | Line 105: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Этот <code>tickSound</code> будет воспроизводиться каждый раз, когда объект отскакивает: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 114: | Line 113: | ||
---- | ---- | ||
Если вы всё сделали правильно, то ваш файл должен быть похож на: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using Vintagestory.API.Common; | using Vintagestory.API.Common; | ||
Line 150: | Line 147: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Конечно, вы можете скачать файл напрямую [https://wiki.vintagestory.at/images/8/8a/Trampoline.cs Trampoline.cs]. | |||
== Тестирование == | == Тестирование == | ||
Наконец мы можем запустить наш первый тест. Выглядит неплохо, так ведь? | |||
<youtube>Kg8J_rNOweU</youtube> | <youtube>Kg8J_rNOweU</youtube> | ||
'''Подсказка''': используйте клиентскую команду {{ll|List_of_client_commands#.tfedit|<code>.tfedit</code>}}, если вы хотите отрегулировать положение, вращение и масштаб блока в руках, в графическом интерфейсе, при падении на землю или в режиме от третьего лица. | |||
''' | |||
== Распространение == | == Распространение == | ||
=== Использование нового шаблона мода === | |||
Если вы используете шаблон мода, следуйте инструкциям [[Modding:Setting up your Development Environment#Packaging the Mod|Настройка среды разработки]], чтобы упаковать ваш мод для дальнейшего распространения. | |||
=== Использование Modtools (старый способ) === | |||
Если вы используете программу modtools, откройте её и введите <code>pack <your mod id></code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку <code>mods</code>. | |||
= Скачать | = Скачать Мод = | ||
Варианты мода из этого руководства: | |||
* для версии 1.9: [https://wiki.vintagestory.at/images/2/24/Trampoline_vs1.9_v1.0.0.zip Trampoline_vs1.9_v1.0.0.zip] | * для версии 1.9: [https://wiki.vintagestory.at/images/2/24/Trampoline_vs1.9_v1.0.0.zip Trampoline_vs1.9_v1.0.0.zip] | ||
* для версии 1.5: [https://wiki.vintagestory.at/images/c/ce/Trampoline.zip Trampoline.zip] | * для версии 1.5: [https://wiki.vintagestory.at/images/c/ce/Trampoline.zip Trampoline.zip] | ||
= | = Дальнейшие Шаги = | ||
Теперь, когда вы успешно создали функциональный блок, вы можете пойти еще дальше, научившись использовать '''[[Modding:Block Entity| Сущность Блоков]]''' и создавать собственные '''[[Modding:Adding Block Behavior | Поведения Блоков]]'''. Оба эти руководства научат вас добавлять еще больше механики в ваши пользовательские блоки. | |||
Или вы можете попробовать создать '''[[Modding:Advanced Items | Функциональный Предмет]]''', если вы еще этого не сделали. | |||
{{Navbox/modding|Vintage Story}} | {{Navbox/modding|Vintage Story}} |
Latest revision as of 15:19, 25 March 2024
Эта страница проверялась в последний раз для версии Vintage Story 1.19.3.
Этот руководство по code mod требует наличия среды разработки. Если у вас её еще нет, прочтите руководство по настройке среды для разработки . Также рекомендуется сначала прочитать про Простые Блоки и изучить их устройство если вы не сделали этого ранее.
Создание Батута
В этом уроке мы создадим блок с более продвинутой функциональностью: Батут.
Ассеты Блока
Как и в случае с нашим Простым Блоком , первое, что нам нужно - это assets блока. Создайте тип блока trampoline.json
на основе нашего блока, созданного в предыдущем руководстве.
В нашем файле blocktype нам нужно добавить свойство class
. Это свойство, по сути, указывает нашему новому блоку, что он будет управляться определенным классом C#.
class: "trampoline",
Мы создадим этот класс в нашей среде разработки, чтобы придать блоку желаемую функциональность. Вы можете скачать ассеты мода здесь.
Все, что вам нужно сделать, это поместить содержимое этого zip-файла в директорию assets
в вашем проекте разработки.
Класс Блока
Чтобы создать наш мод, нам понадобится несколько новых файлов *.cs
в нашем проекте.
Система Мода
Для того чтобы создать мод, нам нужно создать класс, который будет наследоваться от ModSystem
. Это позволит регистрировать всевозможные вещи, но пока мы ограничимся регистрацией только нашего класса блока.
public class TrampolineMod : ModSystem
{
}
Теперь вам нужно переопределить метод Start(ICoreAPI)
и зарегистрировать класс.
Функция RegisterBlockClass
имеет два параметра: первый - идентификатор класса блока, который мы используем в json-файлах blocktype. Убедитесь, что он идентичен классу, который мы указали в нашем предыдущем файле активов. Второй параметр - это тип нашего класса блока.
public class TrampolineMod : ModSystem
{
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterBlockClass("trampoline", typeof(TrampolineBlock));
}
}
Так как класса TrampolineBlock
ещё не существует, это место будет отображаться как синтаксическая ошибка.
Класс Блока
Давайте создадим наш класс блока, который, конечно, должен унаследовать класс Block
:
Давайте создадим наш класс блока. При именовании скриптов блоков рекомендуется называть их в формате "{Name}Block". В случае с батутом мы назовем наш скрипт TrampolineBlock.cs
. Любой класс блока должен наследоваться от Block
, предоставляющий ему необходимую нам функциональность:
public class TrampolineBlock : Block
{
}
Это должно решить все синтаксические ошибки.
Итак, как же нам реализовать прыгучий блок? Будет не лишним взглянуть на документацию API, чтобы найти правильный способ.
Метод void OnEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, Vec3d collideSpeed, bool isImpact)
выглядит как неплохой вариант для реализации прыгучего функционала. Заметьте, что каждый блок батута размещенный в игре будет совместно использовать один и тот же экземпляр TrampolineBlock
. Поскольку этот объект используется несколькими блоками, он не имеет поля для позиции блока. Поэтому в обработчике события присутствует параметр pos
.
Когда объект должен отскочить?
- Сущность должна отскочить в тот момент, когда она приземляется на вершину блока, а не, когда она уже стоит на нем. Поэтому
isImpact
должно бытьtrue
. - Сущность должна сталкиваться вертикально. Стороны блока не должны отталкивать сущность. Таким образом, осью стороны
axis
facing
должна бытьY
.
Как мы можем заставить объект подпрыгивать?
Чтобы заставить объект подпрыгнуть, нам нужно изменить его направление. Поэтому мы можем просто изменить направление его движения. Чем быстрее сущность будет двигаться во время столкновения, тем дальше она будет отброшена. Но простое изменение направления движения не будет идеальным. Сущность никогда не потеряет своего движения и будет бесконечно отскакивать. Поэтому давайте сделаем что-нибудь, что заставит сущность терять 20% своего движения при каждом отскоке:
entity.Pos.Motion.Y *= -0.8;
The *=
is a shorthand way of writing:
entity.Pos.Motion.Y = entity.Pos.Motion.Y * -0.8;
Если собрать всё воедино, это должно выглядеть так:
public class TrampolineBlock : Block
{
public override void OnEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, Vec3d collideSpeed, bool isImpact)
{
if (isImpact && facing.Axis == EnumAxis.Y)
{
entity.Pos.Motion.Y *= -0.8;
}
}
}
Хотя этот код уже работает, некоторые звуковые эффекты были бы весьма кстати. Мы можем реализовать это, добавив в наш блок поле звуковой ссылки, которое можно использовать для воспроизведения звука game:tick
.
public AssetLocation tickSound = new AssetLocation("game", "tick");
Этот tickSound
будет воспроизводиться каждый раз, когда объект отскакивает:
world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);
Если вы всё сделали правильно, то ваш файл должен быть похож на:
using Vintagestory.API.Common;
using Vintagestory.API.Common.Entities;
using Vintagestory.API.MathTools;
namespace VSExampleMods
{
public class TrampolineMod : ModSystem
{
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterBlockClass("trampoline", typeof(TrampolineBlock));
}
}
public class TrampolineBlock : Block
{
public AssetLocation tickSound = new AssetLocation("game", "tick");
public override void OnEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, Vec3d collideSpeed, bool isImpact)
{
if (isImpact && facing.Axis == EnumAxis.Y)
{
world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);
entity.Pos.Motion.Y *= -0.8;
}
}
}
}
Конечно, вы можете скачать файл напрямую Trampoline.cs.
Тестирование
Наконец мы можем запустить наш первый тест. Выглядит неплохо, так ведь?
Подсказка: используйте клиентскую команду .tfedit
, если вы хотите отрегулировать положение, вращение и масштаб блока в руках, в графическом интерфейсе, при падении на землю или в режиме от третьего лица.
Распространение
Использование нового шаблона мода
Если вы используете шаблон мода, следуйте инструкциям Настройка среды разработки, чтобы упаковать ваш мод для дальнейшего распространения.
Использование Modtools (старый способ)
Если вы используете программу modtools, откройте её и введите pack <your mod id>
. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку mods
.
Скачать Мод
Варианты мода из этого руководства:
- для версии 1.9: Trampoline_vs1.9_v1.0.0.zip
- для версии 1.5: Trampoline.zip
Дальнейшие Шаги
Теперь, когда вы успешно создали функциональный блок, вы можете пойти еще дальше, научившись использовать Сущность Блоков и создавать собственные Поведения Блоков. Оба эти руководства научат вас добавлять еще больше механики в ваши пользовательские блоки.
Или вы можете попробовать создать Функциональный Предмет, если вы еще этого не сделали.
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 | Item • Entity • Block • Block Behaviors • Block Classes • Block Entities • Block Entity Behaviors • World properties |
Workflows & Infrastructure | Modding Efficiency Tips • Mod-engine compatibility • Mod Extensibility • VS Engine |
Additional Resources | Community Resources • Modding API Updates • Programming Languages • List of server commands • List of client commands • Client startup parameters • Server startup parameters Example Mods • API Docs • GitHub Repository |