Получить экземпляр класса World

Версия Minecraft
1.18.2
API
Fabric
23
2
1
Добрый день мододелы.
В предыдущей моей теме мне нужно было достать из класса World геймрул и перепесать метод в другом классе через миксин используя геймрул. Однако решение было переписать метод в котором уже есть world
Пример:
@Overwrite
public void scheduledTick(BlockState state, ServerWorld world /** Из world уже и можно вытянуть*/, BlockPos pos, Random random)
{/** тут переписанный код с "вытягиванием"*/}

Однако передо мной встала задача переписать другие методы в других классах, где эти методы уже не получают эту переменную изначально.
Идея такая - получить экземпляр класса World где нибудь отдельно и далее пользоваться им в миксинах, но моих знаний\навыков не хватает в ООП.


Хотел бы услышать предложения как это можно реализовать или услышать человека, который это уже сделал

Спасибо

(PS В классе World есть конструктор, но как в него "впихать" то что надо - беспонятия.. Да и он protected)
 
Решение
Подпишись на ивент запуска сервера и сохрани инстанс серера в переменную, потом делай с ней что хочешь.

Java:
    private static MinecraftServer mcServer;

    @Override
    public void onInitialize() {
        ServerLifecycleEvents.SERVER_STARTED.register(server -> {
            mcServer = server;
        });
    }
    
    public void doSomething(){
        mcServer.getGameRules().getRule(GameRules.RULE_DAYLIGHT).set(false, mcServer);
    }
23
2
1
Из этого метода можно вытянуть ворлд... Но нет! если где-то появится вызов wrld игра должна крашнуться


(PS у меня есть идея, что надо знатно покапаться в исходниках. метод\конструктор в классе World.class вызывается же где-то, а следовательно в него впихается properties - кои мне нужен для getGamerule - ну и через миксин "схаватить" этот properties за горло. - однако полагаю что это иголка в стоге сена... Да и цель полностью получить World, а не взять кусочек и использовать для getGamerule)
 
Последнее редактирование:
23
2
1
Не в каждом методе подается ворлд, а мне надо изменять те, в которых как раз нет. Через миксин насильно запихать в метод еще одну переменную нельзя (ну так то "можно", но так не работает)
В пример мне надо отключить падение факела если он не на твердом блоке через геймрул - там в методе нет world. Даже есля вытяну из другого метода - хорошо - компилятор скажет молодец. Но если все же вызовется метод с world вытянутым из другого метода - маин тупо крашнется, ибо нет гарантий, что вытянутый world уже не null
 
59
3
29
Подпишись на ивент запуска сервера и сохрани инстанс серера в переменную, потом делай с ней что хочешь.

Java:
    private static MinecraftServer mcServer;

    @Override
    public void onInitialize() {
        ServerLifecycleEvents.SERVER_STARTED.register(server -> {
            mcServer = server;
        });
    }
    
    public void doSomething(){
        mcServer.getGameRules().getRule(GameRules.RULE_DAYLIGHT).set(false, mcServer);
    }
 
23
2
1
mcServer.getGameRules().getInt(ТУТКАКОЕТОПРАВИЛО), спокойно вызывается где угодно, только конечно с mcServer надо снять private и ставить public

Так что теперь из world можно вытягивать что угодно

Спасибо!
 
59
3
29
mcServer.getGameRules().getInt(ТУТКАКОЕТОПРАВИЛО), спокойно вызывается где угодно, только конечно с mcServer надо снять private и ставить public

Так что теперь из world можно вытягивать что угодно

Спасибо!
лучше сделать геттер для mcserver
 
Сверху