Классы блоков
«Мод написан для Vintage Story версии 1.9 »
Настоятельно рекомендуется сначала прочитать Базовые блоки. Кроме того, это руководство требует среды разработки. Если у вас её еще нет, вам следует прочитать руководство Настройка среды для разработки.
Батут
В этом уроке мы создадим что-то более продвинутое. Блок с функциональностью ... батута!
Assets блоков
Первое, что нам понадобится, - это assets блока. Это довольно просто.
Единственное новое свойство - это class
:
class: "trampoline",
Мы создадим этот класс, чтобы дать блоку желаемую функциональность, поэтому убедитесь, что если вы выберете другое имя, оно будет соответствовать приведенному ниже.
Вы можете скачать assets этого мода тут
Все, что вам нужно сделать, это поместить этот zip-файл в каталог assets
вашего проекта разработки.
Class Блока
Теперь нам нужно зарегистрировать наш class и, следовательно, нам нужно создать новый файл *. 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)
кажется хорошим способом реализации оживленной функциональности.
Когда объект должен отскочить?
- Сущность должна отскочить в тот момент, когда она приземляется на вершину блока, а не, когда она уже стоит на нем. Поэтому
isImpact
должно бытьtrue
- Если объект сталкивается вертикально. Стороны блока не должны отталкивать объект. Таким образом,
axis
of thefacing
, должна быть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;
}
}
}
Although this code works already, some sound effects would be rather nice. We can implement it by adding a sound link field to our block, which can use to play the game:tick
sound.
public AssetLocation tickSound = new AssetLocation("game", "tick");
This tickSound
will played every time an entity bounces:
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 <ваш mod id>
. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку mods
.
Загрузка модов
Вот моя версия:
- Для VS v1.9: Trampoline_vs1.9_v1.0.0.zip
- Для VS v1.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 • Theme Pack |
Content Modding | Content Mods • Developing a Content Mod • Basic Tutorials • Intermediate Tutorials • Advanced Tutorials |
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 • List of server commands • List of client commands • Client startup parameters • Server startup parameters Example Mods • API Docs • GitHub Repository |