Классы блоков: Difference between revisions

From Vintage Story Wiki
(Created page with "__FORCETOC__ «Мод написан для Vintage Story версии 1.9 » Настоятельно рекомендуется сначала прочитать Баз...")
 
(Moved to Modding:Advanced Blocks/ru, no need for redirect)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
__FORCETOC__
{{Delete|Moved to [[Modding:Advanced Blocks/ru]], no need for redirect.}}
 
«Мод написан для Vintage Story версии 1.9 »
 
Настоятельно рекомендуется сначала прочитать [[Базовые блоки]]. Кроме того, это руководство требует среды разработки. Если у вас её еще нет, вам следует прочитать руководство [[Настройка среды для разработки]].
 
= Батут =
 
В этом уроке мы создадим что-то более продвинутое. Блок с функциональностью ... батута!
 
= Assets блоков =
 
Первое, что нам понадобится, - это assets блока. Это довольно просто.
 
Единственное новое свойство - это <code> class </code>:
 
<syntaxhighlight lang="json">
class: "trampoline",
</syntaxhighlight>
 
Мы создадим этот класс, чтобы дать блоку желаемую функциональность, поэтому убедитесь, что если вы выберете другое имя, оно будет соответствовать приведенному ниже.
Вы можете скачать assets этого мода [https://wiki.vintagestory.at/images/b/b9/Trampoline_-_No_CS_FILE.zip тут]
Все, что вам нужно сделать, это поместить этот zip-файл в каталог <code> assets </code> вашего проекта разработки.
 
== Class Блока ==
 
Теперь нам нужно зарегистрировать наш class и, следовательно, нам нужно создать новый файл <code> *. Cs </code> в нашем проекте. Я назову это <code> Trampoline.cs </code>.
 
=== Система мода ===
 
Для создания мода вашему классу необходимо расширить <code> ModSystem </code>. Это позволит использовать для регистрации все виды обращений, но сейчас мы будем придерживаться нашего примера класса блока.
 
<syntaxhighlight lang="c#">
public class TrampolineMod : ModSystem
{
   
}
</syntaxhighlight>
 
Теперь вам нужно переопределить метод <code> Start (ICoreAPI) </code> и зарегистрировать класс. Если вы выбрали другое имя класса, вы должны использовать его вместо Trampoline.
 
<syntaxhighlight lang="c#">
public class TrampolineMod : ModSystem
{
    public override void Start(ICoreAPI api)
    {
        base.Start(api);
        api.RegisterBlockClass("trampoline", typeof(TrampolineBlock));
    }
}
</syntaxhighlight>
 
Это должно быть помечено как синтаксическая ошибка, потому что еще нет класса <code> TrampolineBlock </code>.
 
=== Класс Блока ===
 
Давайте создадим наш класс блоков, который, конечно, должен расширять <code> Block </code>:
 
<syntaxhighlight lang="c#">
public class TrampolineBlock : Block
{
 
}
</syntaxhighlight>
 
Это должно решить все синтаксические ошибки.
 
Так, как мы реализуем оживленный блок? Очень полезно взглянуть на [https://apidocs.vintagestory.at/api/Vintagestory.API.Common.Block.html api документацию], чтобы найти правильный способ ее реализации.
 
Метод <code>void onEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, bool isImpact)</code> кажется хорошим способом реализации оживленной функциональности.
 
'''Когда объект должен отскочить?'''
# Сущность должна отскочить в тот момент, когда она приземляется на вершину блока, а не, когда она уже стоит на нем. Поэтому <code> isImpact </code> должно быть <code> true </code>
# Если объект сталкивается вертикально. Стороны блока не должны отталкивать объект. Таким образом, <code>axis</code> of the <code>facing</code>, должна быть <code> Y</code>.
 
 
'''Как мы можем заставить объект подпрыгивать?'''
Чтобы заставить объект отскочить, нам нужно изменить его направление. Поэтому мы можем просто вернуть ему движение. Чем быстрее объект будет, во время столкновения, тем дальше он будет отталкиваться. Но просто возвращать движение было бы не верным. Объект никогда не потеряет своего движения и Будет отскакивать бесконечно. Итак, давайте перейдем к чему-то меньшему и заставим сущность терять 20% своей скорости и движения при каждом отскоке:
 
<syntaxhighlight lang="c#">
entity.Pos.Motion.Y *= -0.8;
</syntaxhighlight>
 
----
 
Если мы соберем все вместе, это должно выглядеть так:
 
<syntaxhighlight lang="c#">
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;
        }
    }
}
</syntaxhighlight>
 
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 <code>game:tick</code> sound.
 
<syntaxhighlight lang="c#">
public AssetLocation tickSound = new AssetLocation("game", "tick");
</syntaxhighlight>
 
This <code>tickSound</code> will played every time an entity bounces:
 
<syntaxhighlight lang="c#">
world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);
</syntaxhighlight>
 
----
 
Если вы все сделали правильно, ваш файл должен выглядеть примерно так:
 
<syntaxhighlight lang="c#">
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;
            }
        }
    }
}
</syntaxhighlight>
 
 
Конечно, вы можете загрузить файл напрямую [https://wiki.vintagestory.at/images/8/8a/Trampoline.cs Trampoline.cs].
 
== Тестирование ==
 
Наконец мы можем запустить наш первый тест. Выглядит неплохо, правда?
 
<youtube>Kg8J_rNOweU</youtube>
 
'''Подсказка''': используйте клиентскую команду <code> .tfedit </code>, если вы хотите отрегулировать положение блока, его вращение и масштаб в руках, в графическом интерфейсе, при падении на землю или в режиме от третьего лица.
 
== Распределение ==
 
Чтобы всё закончить, откройте modtools и введите <code> pack <ваш mod id> </code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку <code> mods </code>.
 
= Загрузка модов =
 
Вот моя версия:
* Для VS v1.9: [https://wiki.vintagestory.at/images/2/24/Trampoline_vs1.9_v1.0.0.zip Trampoline_vs1.9_v1.0.0.zip]
* Для VS v1.5: [https://wiki.vintagestory.at/images/c/ce/Trampoline.zip Trampoline.zip]
 
{{Navbox/modding|Vintage Story}}

Latest revision as of 01:06, 12 November 2023

Delete.png

This article is a candidate for deletion.
Reason: Moved to Modding:Advanced Blocks/ru, no need for redirect.
Before deletion, check what links to this page, the page history, and the page log.