Fabric (API) - GameRules - как получить булен из своего геймрула

Версия Minecraft
1.18.2
API
Fabric
23
2
1
Добрый день, работаю по инструкции с вики Fabric

Задача - через миксины отключить физику падения блока, а точнее - через геймрул отключать\включать проверку возможности падения блока

Собсна код:

Главный класс
Main:
public class swa_init implements ModInitializer {
    public static final Logger LOGGER = LoggerFactory.getLogger("sw_addons");
  
    public static final GameRules.Key<GameRules.BooleanRule> FALLING_BLOCKS_ALLOW=
            GameRuleRegistry.register("FallingBlockAllow", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(true));

    @Override
    public void onInitialize() {
    [B]ПУСТО[/B]
}
}

Класс в миксинах
1652973043391.png


Ругается на World.getGameRules().getBoolean(FALLING_BLOCKS_ALLOW)... на getGameRules()
В классе World.class метод есть 1652973220096.png
Однако он не булен? а .getBoolean()?

Миксин хукается и работает, если заменить тупо на false\true


Собсна сабж - как исправить\ куда мне копать 1652974439302.png
 
Последнее редактирование:
1,560
86
204
В классе World.class метод есть
Этот метод не статичный. Вызывать таким образом можно если метод будет иметь модификатор static, но такого модификатора нету.
Для того чтобы получить доступ к этому методу, надо получить экземпляр класса World. В данном контексте получить его будет сложно, но возможно есть какой-то метод для этого. Лучше и проще сделать такое с помощью конфига, а не с помощью правила.
Однако он не булен? а .getBoolean()?
Этот метод возвращает GameRules, а из GameRules получает boolean. О чём ты?
Класс в миксинах
Не спец по миксинам, но, вроде, надо переписывать не статический, а обычный метод в классе FallingBlock.
 
23
2
1

MaximPixel!!! Спасибо​

Да... я какой-то невнимательный, и вправду там есть world

В scheduledTick есть конструкция if и туда спокойно можно вставить world.getGameRules().getBoolean(FALLING_BLOCKS_ALLOW)
Однако миксин ругается, далее посмотрел по хорошему на класс - sheduledTick вызывает protected метод... переписал через миксин - сделал публичным. Все идеально работает

Итого код
Главный
Класс Main, часть кода до метода onInitilization:
public static final GameRules.Key<GameRules.BooleanRule> FALLING_BLOCKS_ALLOW=
            GameRuleRegistry.register("FallingBlockAllow", GameRules.Category.MISC, GameRuleFactory.createBooleanRule(true));
Миксин
Java:
@Mixin(FallingBlock.class)
public class FallingBlockMixim {

    @Overwrite
    public void configureFallingBlockEntity(FallingBlockEntity entity) {
    }

    @Overwrite
    public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
        if (world.getGameRules().getBoolean(FALLING_BLOCKS_ALLOW) && canFallThrough(world.getBlockState(pos.down())) && pos.getY() >= world.getBottomY()) {
            FallingBlockEntity fallingBlockEntity = FallingBlockEntity.spawnFromBlock(world, pos, state);
            this.configureFallingBlockEntity(fallingBlockEntity);
        }
    }
}

Все успешно работает
1653120241210.png

После включаения правила и обновления блока - падают
1653120276046.png

Вывод лично для меня - надо быть внимательным
Спасибо!
 
23
2
1
Обнаружил интересный недочет у mojang
Наковальня является сыпучим блоком (кэп), и если отключить ей падении и поставить в воздухе - появляются частицы FallingDust, ибо они прописанны всем сыпучим блокам

1653120921526.png
 
Сверху