Modding:Функциональные Блоки
Эта страница проверялась в последний раз для версии Vintage Story 1.15.
Настоятельно рекомендуется сначала прочитать про базовые блоки . Кроме того, это руководство требует среды разработки. Если у вас её еще нет, прочтите руководство по настройке среды для разработки .
Батут
В этом уроке мы создадим что-то более продвинутое. Блок с функциональностью ... батута!
Ассеты блока
Первое, что нам понадобится, - это assets блока. Это довольно просто.
динственное новое свойство - это class
:
class: "trampoline",
Мы создадим этот класс, чтобы дать блоку желаемую функциональность, поэтому убедитесь, что если вы выберете другое имя, оно будет соответствовать приведенному ниже. Вы можете скачать ассеты этого мода отсюда. Все, что вам нужно сделать, это поместить этот zip-файл в каталог assets
вашего проекта разработки.
Класс блока
Теперь нам нужно зарегистрировать наш класс и поэтому нам нужно создать новый файл *.cs
в нашем проекте. Назовём его Trampoline.cs
.
Система мода
Для создания мода вашему классу необходимо унаследоваться от ModSystem
. Это позволит использовать для регистрации кучу всякого, но пока что мы будем придерживаться нашего примера.
public class TrampolineMod : ModSystem
{
}
Теперь вам нужно переопределить метод Start(ICoreAPI)
и зарегистрировать класс. Если вы выбрали другое имя класса, вы должны использовать его вместо Trampoline.
public class TrampolineMod : ModSystem
{
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterBlockClass("trampoline", typeof(TrampolineBlock));
}
}
Так как класса TrampolineBlock
ещё нет, это место будет отображаться как синтаксическая ошибка.
Класс блока
Давайте создадим наш класс блока, который, конечно, должен унаследовать класс Block
:
public class TrampolineBlock : Block
{
}
Это должно решить все синтаксические ошибки.
Итак, как же нам реализовать прыгучий блок? Будет не лишним взглянуть на документацию API, чтобы найти правильный способ.
Метод void onEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, bool isImpact)
выглядит как неплохой вариант для реализации прыгучего функционала. Заметьте, что каждый блок батута поставленный в игре будет совместно использовать один и тот же экземпляр TrampolineBlock
. Поскольку этот объект используется несколькими блоками, он не имеет поля для позиции блока. Поэтому в обработчике события присутствует параметр pos
.
Когда объект должен отскочить?
- Сущность должна отскочить в тот момент, когда она приземляется на вершину блока, а не, когда она уже стоит на нем. Поэтому
isImpact
должно бытьtrue
. - Если объект сталкивается вертикально. Стороны блока не должны отталкивать объект. Таким образом, осью стороны (
facing.Axis
) должен бытьY
.
Как мы можем заставить объект подпрыгивать? Чтобы заставить объект прыгать, нам нужно изменить его направление. Поэтому мы можем просто развернуть его движение. Чем быстрее объект будет, во время столкновения, тем дальше он будет отталкиваться. Но просто развернуть движение было бы не верным. Объект никогда не потеряет своего движения и будет отскакивать бесконечно. Так что, давайте перейдем к чему-то меньшему и заставим сущность терять 20% своей скорости и движения при каждом отскоке:
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)
{
world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);
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 и введите 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 |