Jump to content

[MineTweaker3] Учебное пособие: Структуры управления


BazZziliuS
 Share

Recommended Posts

Скриптовый движок MineTweaker (ZenScript) все еще находится в стадии интенсивной разработки. Структуры управления в настоящее время реализованы лишь частично, но уже можно использовать циклические структуры, чтобы помочь вам в разработке.

Когда мы используем циклические структуры, нам обычно приходится сначала сохранять некоторые переменные. При хранении предметов или ингредиентов в переменных вам никогда не приходилось беспокоиться о типах предметов. Аналогично, когда вы используете массивы или словари в рецептах или значениях тегов, вы могли бы просто указать правильный синтаксис, и все заработало.

Однако MineTweaker является *строго типизированным*. Пока он может определять тип из вашего выражения, вам не нужно предоставлять какую-либо информацию о типизации, но когда вы объявляете такую вещь как массив, это больше не будет работать. Это потерпело бы неудачу:

var myItems = [<minecraft:stick>, <minecraft:stone>];

Проблема в том, что MineTweaker не знает ваш тип массива. Это было сделано во всех примерах, приведенных ранее, поскольку он мог вывести тип массива из функции, которую вы вызывали, но когда вы присваиваете его переменной, он не может этого сделать, поскольку он еще не знает ваш тип. Чтобы исправить это, вам нужно привести массив к определенному типу, как таковому:

import minetweaker.item.IItemStack;

var myItems = [<minecraft:stick>, <minecraft:stone>] as IItemStack[];

IItemStack - это тип, который вы получаете, когда разрешаете переменную элемента, такую как <minecraft:stick>. IItemStack обозначает конкретный объект и может использоваться либо как ингредиент для крафта, либо как результат крафта, как вы, скорее всего, уже сделали.

Его друзья - это IIngredient, который является более общим, чем элемент. Например, словарные статьи о руде - это ингредиенты. Они не могут быть использованы в качестве выходных данных, но их можно использовать в качестве входных данных для создания. Кроме того, если вы добавите преобразования или условия в IItemStack, он станет IIngredient:

import minetweaker.item.IIngredient;

var myIngredients = [<ore:plankWood>, <minecraft:stick>.onlyWithTag({display:{Name: "Something"}})] as IIngredient[];
var myIngredients2 = [<minecraft:stick>, <ore:plankWood>] as IIngredient[]; // will work since an IItemStack can be casted to an IIngredient


Когда вы определяете массивы элементов, вы можете использовать операторы цикла для них, чтобы сделать ваши скрипты короче. Например, предположим, мы хотим, чтобы стандартные рецепты "бревно в древесину" имели низкий выход, но улучшали его при обработке топорами, и чтобы тип топора определял количество досок, которые у нас есть:

import minetweaker.item.IItemStack;

var myLogs = [<minecraft:log:0>, <minecraft:log:1>, <minecraft:log:2>, <minecraft:log:3>, <minecraft:log:4>, <minecraft:log:5>] as IItemStack[];
var myPlanks = [<minecraft:planks:0>, <minecraft:planks:1>, <minecraft:planks:2>, <minecraft:planks:3>, <minecraft:planks:4>, <minecraft:planks:5>] as IItemStack[];

var stoneAxe = <minecraft:stone_axe>.anyDamage().transformDamage();
var ironAxe = <minecraft:iron_axe>.anyDamage().transformDamage();
var goldenAxe = <minecraft:golden_axe>.anyDamage().transformDamage();
var diamondAxe = <minecraft:diamond_axe>.anyDamage().transformDamage();

for i, log in myLogs {
    var plank = myPlanks[i];
    
    recipes.removeShapeless(plank, [log]);
    recipes.addShapeless(plank * 2, [log]);
    recipes.addShapeless(plank * 3, [log, stoneAxe]);
    recipes.addShapeless(plank * 4, [log, ironAxe]);
    recipes.addShapeless(plank * 5, [log, goldenAxe]);
    recipes.addShapeless(plank * 6, [log, diamondAxe]);
}

Теперь вы можете поместить все ваши доски, добавленные модом, в массив, а также их журналы, и пусть цикл for сделает всю тяжелую работу за вас!

Иногда может возникнуть необходимость назначить теги NBT внутри цикла for. Вы можете определить значение NBT в переменной вне цикла, но только при приведении его к IData. Данные - это тип данных для тега NBT. Немного расширяем наш предыдущий пример:

import minetweaker.data.IData;
import minetweaker.item.IItemStack;

var myData = {display: {Name: "Axed plank"}} as IData;
var myLogs = [<minecraft:log:0>, <minecraft:log:1>, <minecraft:log:2>, <minecraft:log:3>, <minecraft:log:4>, <minecraft:log:5>] as IItemStack[];
var myPlanks = [<minecraft:planks:0>, <minecraft:planks:1>, <minecraft:planks:2>, <minecraft:planks:3>, <minecraft:planks:4>,<minecraft:planks:5>] as IItemStack[]; 

var stoneAxe = <minecraft:stone_axe>.anyDamage().transformDamage();
var ironAxe = <minecraft:iron_axe>.anyDamage().transformDamage();
var goldenAxe = <minecraft:golden_axe>.anyDamage().transformDamage();
var diamondAxe = <minecraft:diamond_axe>.anyDamage().transformDamage();

for i, log in myLogs {
    var plank = myPlanks[i].withTag(myData);
    
    recipes.removeShapeless(plank, [log]);
    recipes.addShapeless(plank * 2, [log]);
    recipes.addShapeless(plank * 3, [log, stoneAxe]);
    recipes.addShapeless(plank * 4, [log, ironAxe]);
    recipes.addShapeless(plank * 5, [log, goldenAxe]);
    recipes.addShapeless(plank * 6, [log, diamondAxe]);
}

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...