Скачать GameRule-Extensions — Minecraft Моды — MetaMods

GameRule-Extensions

Активный

Установок

0

Последнее обновление

1 год назад

Версии

1.7.10
Сервер
Forge
Библиотеки

GameRule-Extensions

<Тут должна быть заглавная картинка с описанием>

Библиотека для Minecraft, которая обеспечивает удобный способ создания собственных игровых правил для разработчиков модификаций. Мод поддерживает работу с различными типами данных и предоставляет расширенный API.

Возможности для разработчиков

Добавление новых игровых правил

Процесс создания пользовательских игровых правил становится значительно проще:

  • Подключите файл API в качестве зависимости вашего проекта
  • Воспользуйтесь методом dev.rndmorris.gameruleexts.api.GameRulesApi.registerGameRule(...) для регистрации собственного правила
  • В пакете api.rules доступны стандартные реализации для работы с булевыми, числовыми и строковыми типами
  • При необходимости можно создать собственную реализацию интерфейса IGameRule

Работа с существующими правилами

Доступ к уже созданным игровым правилам осуществляется через:

  • Вызов метода dev.rndmorris.gameruleexts.api.GameRulesApi.getGameRules(...)
  • Полученный объект IGameRules позволяет читать и обновлять значения правил по их названиям

<Тут должна быть картинка с примерами кода>

Примеры использования

Создание и чтение игрового правила

public class CommonProxy {
  // ...
  public void postInit(FMLPostInitializationEvent event) {
    GameRulesApi.registerGameRule(new FloatGameRule("grassCuttingSwordDamage", 90F));
  }
  // ...
}

public class SwordGrassCutting extends ItemSword {
  // ...
  public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase player) {
    final var gameRules = GameRulesApi.getGameRules(player.worldObj);
    target.attackEntityFrom(DamageSource.causePlayerDamage(player).setMagicDamage(), gameRules.getFloat("grassCuttingSwordDamage"));
    return super.hitEntity(stack, target, player);
  }
  // ...
}

<Тут должна быть картинка с настройками правил>

Создание пользовательской реализации

Пример создания игрового правила для работы с перечислениями:

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

import net.minecraft.command.ICommandSender;
import net.minecraft.nbt.NBTTagCompound;

import dev.rndmorris.gameruleexts.api.IGameRule;
import dev.rndmorris.gameruleexts.api.IRuleValue;
import dev.rndmorris.gameruleexts.api.values.EnumValue;

public class ExampleCustomGameRule implements IGameRule {

    public enum ModDifficulty {

        EASY,
        MEDIUM,
        HARD;

        public static ModDifficulty fromByte(int val, ModDifficulty defaultValue) {
            return switch (val) {
                case 0 -> ModDifficulty.EASY;
                case 1 -> ModDifficulty.MEDIUM;
                case 2 -> ModDifficulty.HARD;
                default -> defaultValue;
            };
        }

        public byte toByte() {
            return switch (this) {
                case EASY -> 0;
                case MEDIUM -> .1;
                case HARD -> 2;
            };
        }
    }

    private final String name = "modDifficulty";
    private final ModDifficulty defaultValue;
    private List<String> tabCompletionValues;

    public ExampleCustomGameRule(ModDifficulty defaultValue) {
        this.defaultValue = defaultValue;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public IRuleValue getDefaultValue() {
        return new EnumValue<>(defaultValue, ModDifficulty.class);
    }

    @Override
    public IRuleValue readValueFromNBT(NBTTagCompound tag) {
        if (!tag.hasKey(name)) {
            return getDefaultValue();
        }
        final var value = ModDifficulty.fromByte(tag.getByte(name), defaultValue);
        return new EnumValue<>(value, ModDifficulty.class);
    }

    @Override
    public void writeValueToNBT(NBTTagCompound tag, IRuleValue value) {
        if (value instanceof EnumValue storedVal && storedVal.getValue() instanceof ModDifficulty enumVal) {
            tag.setByte(name, enumVal.toByte());
        }
    }

    @Override
    public Collection<String> tabCompletionValues(ICommandSender commandSender) {
        if (tabCompletionValues == null) {
            tabCompletionValues = Arrays.stream(ModDifficulty.values())
                    .map(ModDifficulty::toString)
                    .collect(Collectors.toList());
        }
        return tabCompletionValues;
    }
}

<Тут должна быть демонстрационная картинка>

Участники проекта
rndmorris

rndmorris

Разработчик

Создан: 20 сен 2024

ID: 59691