Modding:Advanced Blocks/ru: Difference between revisions

From Vintage Story Wiki
no edit summary
(Created page with "Или вы можете попробовать создать ''' продвинутый предмет''', если вы еще этого не сделали.")
No edit summary
 
(39 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages />
<languages />
__FORCETOC__
__FORCETOC__
{{GameVersion|1.15}}
{{GameVersion|1.19.3}}
Настоятельно рекомендуется сначала прочитать про {{ll|Modding:Basic Block|базовые блоки}}. Кроме того, это руководство требует среды разработки. Если у вас её еще нет, прочтите руководство по {{ll|Modding:Setting up your Development Environment|настройке среды для разработки}}.
Этот руководство по '''code mod''' требует наличия среды разработки. Если у вас её еще нет, прочтите руководство по {{ll|Modding:Setting up your Development Environment|настройке среды для разработки}}. Также рекомендуется сначала прочитать про {{ll|Modding:Basic Block|Простые Блоки}} и изучить их устройство если вы не сделали этого ранее.
= Батут =
= Создание Батута =


В этом уроке мы создадим что-то более продвинутое. Блок с функциональностью ... батута!
В этом уроке мы создадим блок с более продвинутой функциональностью: Батут.


== Ассеты блока ==
== Ассеты Блока ==


Первое, что нам понадобится, - это assets блока. Это довольно просто.  
Как и в случае с нашим {{ll|Modding:Basic Block|Простым Блоком}}, первое, что нам нужно - это assets блока. Создайте тип блока <code>trampoline.json</code> на основе нашего блока, созданного в предыдущем руководстве.


динственное новое свойство - это <code>class</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> вашего проекта разработки.
Мы создадим этот класс в нашей среде разработки, чтобы придать блоку желаемую функциональность. Вы можете скачать ассеты мода [https://wiki.vintagestory.at/images/b/b9/Trampoline_-_No_CS_FILE.zip здесь].
Все, что вам нужно сделать, это поместить содержимое этого zip-файла в директорию <code>assets</code> в вашем проекте разработки.


== Класс блока ==
== Класс Блока ==


Теперь нам нужно зарегистрировать наш класс и поэтому нам нужно создать новый файл <code>*.cs</code> в нашем проекте. Назовём его <code>Trampoline.cs</code>.
Чтобы создать наш мод, нам понадобится несколько новых файлов <code>*.cs</code> в нашем проекте.  


=== Система мода ===
=== Система Мода ===


Для создания мода вашему классу необходимо унаследоваться от <code>ModSystem</code>. Это позволит использовать для регистрации кучу всякого, но пока что мы будем придерживаться нашего примера.
Для того чтобы создать мод, нам нужно создать класс, который будет наследоваться от <code>ModSystem</code>. Это позволит регистрировать всевозможные вещи, но пока мы ограничимся регистрацией только нашего класса блока.


<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
Line 33: Line 34:
</syntaxhighlight>
</syntaxhighlight>


Теперь вам нужно переопределить метод <code>Start(ICoreAPI)</code> и зарегистрировать класс. Если вы выбрали другое имя класса, вы должны использовать его вместо Trampoline.
Теперь вам нужно переопределить метод <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 onEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, bool isImpact)</code> выглядит как неплохой вариант для реализации прыгучего функционала. Заметьте, что каждый блок батута поставленный в игре будет {{ll|Modding:Block_Cardinality|совместно использовать}} один и тот же экземпляр <code>TrampolineBlock</code>. Поскольку этот объект используется несколькими блоками, он не имеет поля для позиции блока. Поэтому в обработчике события присутствует параметр <code>pos</code>.
Метод <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>facing.Axis</code>) должен быть <code>Y</code>.
# Сущность должна сталкиваться вертикально. Стороны блока не должны отталкивать сущность. Таким образом, осью стороны <code>axis</code> <code>facing</code> должна быть <code>Y</code>.


'''Как мы можем заставить объект подпрыгивать?'''
'''Как мы можем заставить объект подпрыгивать?'''
Чтобы заставить объект прыгать, нам нужно изменить его направление. Поэтому мы можем просто развернуть его движение. Чем быстрее объект будет, во время столкновения, тем дальше он будет отталкиваться. Но просто развернуть движение было бы не верным. Объект никогда не потеряет своего движения и будет отскакивать бесконечно. Так что, давайте перейдем к чему-то меньшему и заставим сущность терять 20% своей скорости и движения при каждом отскоке:
 
Чтобы заставить объект подпрыгнуть, нам нужно изменить его направление. Поэтому мы можем просто изменить направление его движения. Чем быстрее сущность будет двигаться во время столкновения, тем дальше она будет отброшена. Но простое изменение направления движения не будет идеальным. Сущность никогда не потеряет своего движения и будет бесконечно отскакивать. Поэтому давайте сделаем что-нибудь, что заставит сущность терять 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>


Line 85: Line 93:
         if (isImpact && facing.Axis == EnumAxis.Y)
         if (isImpact && facing.Axis == EnumAxis.Y)
         {
         {
            world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);
             entity.Pos.Motion.Y *= -0.8;
             entity.Pos.Motion.Y *= -0.8;
         }
         }
Line 152: Line 159:
== Распространение ==
== Распространение ==


Чтобы все закончить, откройте modtools и введите <code>pack <your mod id></code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку <code>mods</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]


= Двигаться вперед =
= Дальнейшие Шаги =


Теперь, когда вы успешно создали расширенный блок, вы можете пойти еще дальше, научившись использовать '''[[Moddding:Block Entity/ru| сущность блоков]]''' и как создать своё собственное '''[[Modding:Adding Block Behavior/ru|поведение блоков]]'''. Оба этих урока научат вас, как добавить еще больше механики в ваши пользовательские блоки.
Теперь, когда вы успешно создали функциональный блок, вы можете пойти еще дальше, научившись использовать '''[[Modding:Block Entity| Сущность Блоков]]''' и создавать собственные '''[[Modding:Adding Block Behavior | Поведения Блоков]]'''. Оба эти руководства научат вас добавлять еще больше механики в ваши пользовательские блоки.


Или вы можете попробовать создать '''[[Modding:Advanced Items/ru | продвинутый предмет]]''', если вы еще этого не сделали.  
Или вы можете попробовать создать '''[[Modding:Advanced Items | Функциональный Предмет]]''', если вы еще этого не сделали.  


{{Navbox/modding|Vintage Story}}
{{Navbox/modding|Vintage Story}}
Confirmedusers
409

edits