681
edits
Akellagray (talk | contribs) (Created page with "== Создание поведения ==") |
Akellagray (talk | contribs) (Created page with "Блок будет толкать два блока вместо одного, и игрок может тянуть его, крадясь, щелкая правой кно...") |
||
(28 intermediate revisions by the same user not shown) | |||
Line 15: | Line 15: | ||
== Создание поведения == | == Создание поведения == | ||
Итак, прежде всего нам нужно создать само поведение, которое является классом, расширяющим BlockBehavior | |||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
class Moving : BlockBehavior | class Moving : BlockBehavior | ||
Line 26: | Line 26: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Этот класс предоставляет несколько методов, которые мы можем переопределить. Когда вы используете Visual Studio, вы можете найти полный список методов, наведя курсор мыши на «BlockBehavior» и нажав «F12». | |||
---- | ---- | ||
Метод <code> bool OnPlayerInteract (IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling) </code> выглядит идеально подходящим для наших целей. | |||
Что это должно сделать? | |||
# | # Рассчитать новую позицию блока в зависимости от стороны, в которую смотрит игрок | ||
# | # Проверить, можно ли разместить блок в этой позиции | ||
# | # Удалить оригинальный блок | ||
# | # Поместить новый блок, используя ранее рассчитанную позицию | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling) | public override bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling) | ||
{ | { | ||
// | // Находим целевую позицию | ||
BlockPos pos = blockSel.Position.AddCopy(blockSel.Face.GetOpposite()); | BlockPos pos = blockSel.Position.AddCopy(blockSel.Face.GetOpposite()); | ||
// | // Можем ли мы разместить блок там? | ||
if (world.BlockAccessor.GetBlock(pos).IsReplacableBy(block)) | |||
{ | { | ||
// Remove the block at the current position and place it at the target position | // Remove the block at the current position and place it at the target position | ||
Line 53: | Line 53: | ||
} | } | ||
// | // Сообщаем игровому движку о других действиях блока, которые мы обрабатывали при взаимодействии игроков с блоком. | ||
// | // Если бы мы не установили поле обработки, игрок все равно мог бы размещать блоки, если бы он держал их в руках. | ||
handling = EnumHandling.PreventDefault; | |||
return true; | return true; | ||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Регистрация == | ||
Чтобы зарегистрировать BlockBehavior, нам нужно создать класс мода, переопределить <code> Start (ICoreAPI) </code> и зарегистрировать его с заданным именем: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 77: | Line 77: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Распределение == | ||
Чтобы закончить все, откройте modtools и введите <code> pack <ваш mod id> </ code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. | |||
* | * Для VS 1.9: [https://wiki.vintagestory.at/images/2/2a/Moving_v1.0.0.zip Moving_v1.0.0.zip] | ||
* | * Для VS 1.6: [https://wiki.vintagestory.at/images/c/cb/Moving.zip Moving.zip] | ||
== | == Тестирование == | ||
<youtube>8eVG0uQF2xs</youtube> | <youtube>8eVG0uQF2xs</youtube> | ||
= | = Расширенное поведение = | ||
Наше поведение все еще довольно просто, но возможностей гораздо больше. Поведение может иметь специальные свойства, которые могут быть определены самим типом блока. | |||
== | == Пример == | ||
Поведение жидкости поддерживает некоторые специальные свойства, как показано в этом примере типа водяного блока: | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
Line 110: | Line 110: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Разбор свойств == | ||
Чтобы позаботиться о специальных свойствах, существует метод <code> Initialize (JsonObject) </code>. Каждый тип блока создает новый экземпляр поведения, поэтому метод может использоваться для анализа свойств. | |||
Итак, какие свойства мы можем добавить? | |||
* | * толчок расстояние | ||
* | * собрать блок, если игрок крадется | ||
Прежде всего, нам нужно переопределить метод в нашем классе поведения блока ... | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 127: | Line 127: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Кроме того, нам нужно добавить два поля, одно для расстояния и другое, если игрок должен вытащить блок когда крадется ... | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 134: | Line 134: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Теперь мы можем проанализировать два свойства следующим образом: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
Line 143: | Line 143: | ||
---- | ---- | ||
Следующее, что нам нужно изменить, - это сам метод взаимодействия, чтобы он позаботился о расстоянии и свойствах вытягивания ... | |||
== | == Добавление другого блока == | ||
Давайте создадим еще один блок, используя это поведение, но на этот раз мы настроим некоторые дополнительные свойства ... | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
Line 174: | Line 161: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Блок будет толкать два блока вместо одного, и игрок может тянуть его, крадясь, щелкая правой кнопкой мыши. | |||
= | = Загрузка мода = | ||
* | * Для VS 1.9: [https://wiki.vintagestory.at/images/7/7b/Advancedmoving_v1.0.0.zip AdvancedMoving_v1.0.0.zip] | ||
* | * Для VS 1.6: [https://wiki.vintagestory.at/images/7/72/AdvancedMoving.zip AdvancedMoving.zip] | ||
{{Navbox/modding|Vintage Story}} | {{Navbox/modding|Vintage Story}} |
edits