GameRule-Extensions
Активный0.0
Установок
Последнее обновление
Версии
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;
}
}
<Тут должна быть демонстрационная картинка>