Игровые правила 26.1.2
Руководство по добавлению пользовательских игровых правил.
ТРЕБОВАНИЯ
Возможно, вам стоит сначала завершить генерацию переводов, но это не обязательно.
Игровые правила (game rules) действуют как специфические для мира параметры конфигурации, которые игрок может изменять в игре с помощью команды. Эти переменные обычно управляют некоторыми функциями мира, например pvp, spawn_monsters и advance_time определяют, включён ли PvP, спавнятся ли монстры и активен ли временной цикл.
Создание игрового правила
Чтобы создать пользовательское игровое правило, сначала создайте класс GameRules. В нём мы объявим наши правила. Внутри этого класса объявите две константы: идентификатор игрового правила и само правило.
java
public class ExampleModGameRules implements ModInitializer {
// Create and register a boolean gamerule, disabled by default
public static final GameRule<Boolean> BAD_VISION_BOOLEAN_GAMERULE = GameRuleBuilder
.forBoolean(false) // Default value declaration
.category(GameRuleCategory.MISC)
.buildAndRegister(Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "bad_vision"));
}1
2
3
4
5
6
7
2
3
4
5
6
7
Аргумент (.category(GameRuleCategory.MISC)) определяет, в какую категорию правило попадает в экране создания мира. В этом примере используется категория «Разное» (Miscellaneous) из ванильной игры, но можно добавлять и свои категории с помощью GameRuleCategory.register. В примере мы создали булево правило со значением по умолчанию false и идентификатором bad_vision. Хранимые значения в игровых правилах не ограничены булевыми; другие допустимые типы включают Double, Integer и перечисления (Enum).
Пример игрового правила, хранящего значение типа double:
java
public static final GameRule<Double> DOUBLE_GAMERULE = GameRuleBuilder
.forDouble(6.7) // Default value declaration
.category(GameRuleCategory.MISC)
.buildAndRegister(Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "double_example"));1
2
3
4
2
3
4
Доступ к игровому правилу
Теперь, когда у нас есть игровое правило и его идентификатор, вы можете получить к нему доступ в любом месте с помощью метода serverLevel.getGameRules().get(GAMERULE), где аргумент в .get() — это ваша константа игрового правила, а НЕ его строковый идентификатор.
java
// Check for the state of the gamerule
boolean badVisionEnabled = serverLevel.getGameRules().get(ExampleModGameRules.BAD_VISION_BOOLEAN_GAMERULE);1
2
2
Также через этот метод можно получить значения ванильных игровых правил:
java
boolean doMobGriefing = serverLevel.getGameRules().get(GameRules.MOB_GRIEFING);1
Например, для правила, которое накладывает слепоту на каждого игрока, если оно установлено в true, реализация будет такой:
java
// In your mod's onInitialize():
ServerTickEvents.END_LEVEL_TICK.register(serverLevel -> {
// Runs every tick on the server
// Check for the state of the gamerule
boolean badVisionEnabled = serverLevel.getGameRules().get(ExampleModGameRules.BAD_VISION_BOOLEAN_GAMERULE);
if (badVisionEnabled) {
// If the gamerule is true
for (Player player : serverLevel.getPlayers(p -> true)) {
// Apply blindness to every player
player.addEffect(new MobEffectInstance(
MobEffects.BLINDNESS,
40,
1,
false,
false,
false
));
}
}
});1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Переводы
Теперь нужно задать нашему игровому правилу отображаемое имя, чтобы оно было понятно в экране игровых правил. Чтобы сделать это через генерацию данных, добавьте следующие строки в ваш провайдер языков:
java
translationBuilder.add(Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "bad_vision"), "Bad Vision");1
Наконец, нужно дать нашему правилу описание. Чтобы сделать это через генерацию данных, добавьте следующие строки в ваш провайдер языков:
java
translationBuilder.add(
Util.makeDescriptionId("gamerule", Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "bad_vision")),
"Gives every player the blindness effect" // A short description of the game rule
);1
2
3
4
2
3
4
INFO
Эти ключи перевода используются при отображении текста на экране игровых правил. Если вы не используете генерацию данных, вы можете также прописать их вручную в файле assets/example-mod/lang/en_us.json:
json
"example-mod.bad_vision": "Bad Vision",
"gamerule.example-mod.bad_vision": "Gives every player the blindness effect",1
2
2
Изменение игровых правил в игре
Теперь вы сможете изменить значение вашего правила в игре с помощью команды /gamerule следующим образом:
mcfunction
/gamerule example-mod:bad_vision true1
Игровое правило также появится в категории «Разное» на экране «Изменить игровые правила».






