Интеграция с модификацией The One Probe и WAILA

Перевод Интеграция с модификацией The One Probe и WAILA

Версия(и) Minecraft
1.12.х
Источник
https://wiki.mcjty.eu/modding/index.php?title=OtherMods-1.12
Интеграция с The One Probe

The One Probe - это мод, который показывает оверлей на экране, предоставляя информацию об объекте, на который смотрит игрок. Он похож на WAILA, но более интересный, поскольку для отображения этой информации требуется предмет в качестве зонда (обратите внимание, что это требование можно отключить в конфигурации). Более подробную информацию о The One Probe можно найти на вики:
А скачать его можно с:

Для начала лёгким движением руки добавляем поддержку для вашего мода и The One Probe. В этом уроке мы покажем, как вы можете сделать это, не получая жесткую зависимость от мод.

Сначала вам нужно изменить build.gradle, чтобы мод The One Probe и API автоматически включались в ваш проект. Вам необходимо добавить пару строчек для The One Probe в maven репозитории, а также добавить зависимость:
build.gradle:
repositories {
    maven { // TOP
        name 'tterrag maven'
        url "http://maven.tterrag.com/"
    }
}

...

dependencies {
    deobfCompile "mcjty.theoneprobe:TheOneProbe-1.12:1.12-1.4.14-7"
}

Затем используйте gradlew или другие инструменты/интеграцию в IDEA или Eclipse для повторной настройки проекта, и в таком случае вы автоматически добавите модификацию The One Probe в игру, когда вы запускаете Minecraft из среды разработки.

Следующее, что вам нужно сделать, это убедиться, что интеграция The One Probe включена в вашем моде, но только тогда, когда мод The One Probe действительно загружен. Есть много способов сделать это. Здесь мы показываем один из них. Сначала мы добавляем класс TOPCompatibility. Этот класс будет отправлять сообщение (используя систему IMC Forge) в The One Probe, включая в качестве параметра имя класса, который будет вызываться с необходимой информацией для интеграции. Этот класс в данном случае является внутренним принимающим классом TOPCompatibility, который называется GetTheOneProbe. Внутри этого класса обратного вызова мы получаем доступ к API ITheOneProbe и тем самым можем зарегистрировать ваш собственный провайдер для подсказок The One Probe. Этот провайдер будет проверять, использует ли блок TOPInfoProvider, и если это так, он будет вызывать метод в этом интерфейсе для обновления зонда и информации в окне:
TOPCompatibility.java:
public class TOPCompatibility {

    private static boolean registered;

    public static void register() {
        if (registered)
            return;
        registered = true;
        FMLInterModComms.sendFunctionMessage("theoneprobe", "getTheOneProbe", "mcjty.modtut.compat.top.TOPCompatibility$GetTheOneProbe");
    }


    public static class GetTheOneProbe implements Function<ITheOneProbe, Void> {

        public static ITheOneProbe probe;

        @Nullable
        @Override
        public Void apply(ITheOneProbe theOneProbe) {
            probe = theOneProbe;
            ModTut.logger.log(Level.INFO, "Enabled support for The One Probe");
            probe.registerProvider(new IProbeInfoProvider() {
                @Override
                public String getID() {
                    return "modtut:default";
                }

                @Override
                public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer player, World world, IBlockState blockState, IProbeHitData data) {
                    if (blockState.getBlock() instanceof TOPInfoProvider) {
                        TOPInfoProvider provider = (TOPInfoProvider) blockState.getBlock();
                        provider.addProbeInfo(mode, probeInfo, player, world, blockState, data);
                    }

                }
            });
            return null;
        }
    }
}

Интерфейс TOPInfoProvider очень прост:
public interface TOPInfoProvider:
public interface TOPInfoProvider {
    void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer player, World world, IBlockState blockState, IProbeHitData data);
}

Затем мы добавляем класс MainCompatHandler, который будет обрабатывать совместимость со всеми необходимыми нам модами (TOP, WAILA, и так далее):
MainCompatHandler.java:
public class MainCompatHandler {
   
    public static void registerTOP() {
       
        if (Loader.isModLoaded("theoneprobe")) {
           
            TOPCompatibility.register();
        }
    }

}

И, наконец, мы должны вызвать registerTOP где-нибудь, допустим в CommonProxy:
CommonProxy.java:
public static class CommonProxy {

    public void preInit(FMLPreInitializationEvent e) {
            ...
        MainCompatHandler.registerTOP();
            ...
    }
}

В качестве примера мы будем использовать блок с TileEntity который хранит информацию, чтобы показать, что вы можете сделать с API The One Probe. Сначала убедитесь, что ваш блок использует новый интерфейс TOPInfoProvider, а затем добавьте метод addProbeInfo (). Важно отметить, что этот метод всегда будет вызываться на стороне сервера. Таким образом, нам не нужно делать лишних хлопот, чтобы получить информацию с сервера. Мы можем просто получить доступ ко всему, включая TileEntity напрямую из этого метода:
DataBlock.java:
public class DataBlock extends Block implements ITileEntityProvider, TOPInfoProvider {

    ...

    @Override
    public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer player, World world, IBlockState blockState, IProbeHitData data) {
        TileEntity te = world.getTileEntity(data.getPos());
        if (te instanceof DataTileEntity) {
           
            DataTileEntity dataTileEntity = (DataTileEntity) te;
            //Сначала добавляем горизонтальную линию, показывающую предмет часы, а затем текущее содержимое счетчика в TileEntity
                    probeInfo.horizontal()
                    .item(new ItemStack(Items.CLOCK))
                    .text(TextFormatting.GREEN + "Counter: " + dataTileEntity.getCounter());
                    //Затем добавляем еще одну строку с рамкой.
                    //Внутри границы которой будет лошадь и счетчик, выполненный в виде шкалы заполнения
                    .probeInfo.horizontal(probeInfo.defaultLayoutStyle().borderColor(0xffff0000))
                    .entity("minecraft:horse")
                    .progress(dataTileEntity.getCounter() % 100, 100, probeInfo.defaultProgressStyle().suffix("%"));
        }
    }
  ...
}

Мы также должны добавить публичный геттер для привязки счетчика к вашему TileEntity:
DataTileEntity.java:
public class DataTileEntity extends TileEntity {

    public int getCounter() {
        return counter;
    }
}

Конечный результат выглядит вот так:
i0rYFr7.png


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Интеграция с WAILA
Вы можете взаимодействовать с WAILA (Hwyla для 1.12) так же, как делали это с The One Probe. Для начало надо изменить свой build.gradle:
build.gradle:
repositories {
    maven { //WAILA
        name "Mobius Repo"
        url "http://tehnut.info/maven"
    }
    maven { //The One Probe
        name 'tterrag maven'
        url "http://maven.tterrag.com/"
    }
}

...

dependencies {
    deobfCompile "mcp.mobius.waila:Hwyla:1.8.18-B32_1.12:api"
    deobfCompile "mcjty.theoneprobe:TheOneProbe-1.12:1.12-1.4.11-5"
}

Теперь мы добавляем класс WailaCompatibility, а также интерфейс WailaInfoProvider, аналогично тому, как мы делали это с The One Probe:
WailaCompatibility.java:
public class WailaCompatibility implements IWailaDataProvider {

    public static final WailaCompatibility INSTANCE = new WailaCompatibility();

    private WailaCompatibility() {}

    private static boolean registered;
    private static boolean loaded;

    public static void load(IWailaRegistrar registrar) {
        System.out.println("WailaCompatibility.load");
        if (!registered){
            throw new RuntimeException("Please register this handler using the provided method.");
        }
        if (!loaded) {
            registrar.registerHeadProvider(INSTANCE, DataBlock.class);
            registrar.registerBodyProvider(INSTANCE, DataBlock.class);
            registrar.registerTailProvider(INSTANCE, DataBlock.class);
            loaded = true;
        }
    }

    public static void register(){
        if (registered)
            return;
        registered = true;
        FMLInterModComms.sendMessage("Waila", "register", "mcjty.modtut.compat.waila.WailaCompatibility.load");
    }

    @Override
    public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) {
        return tag;
    }

    @Override
    public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) {
        return null;
    }

    @Override
    public List<String> getWailaHead(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
        return currenttip;
    }

    @Override
    public List<String> getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
        Block block = accessor.getBlock();
        if (block instanceof WailaInfoProvider) {
            return ((WailaInfoProvider) block).getWailaBody(itemStack, currenttip, accessor, config);
        }
        return currenttip;
    }

    @Override
    public List<String> getWailaTail(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
        return currenttip;
    }

}


public interface WailaInfoProvider {
    List<String> getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config);
}

Затем мы изменяем класс MainCompatHandler, чтобы добавить методы для WAILA:
MainCompatHandler.java:
public class MainCompatHandler {
   
    public static void registerWaila() {
       
        if (Loader.isModLoaded("Waila")) {
           
            WailaCompatibility.register();
        }
    }

    public static void registerTOP() {
       
        if (Loader.isModLoaded("theoneprobe")) {
           
            TOPCompatibility.register();
        }
    }

}

И, наконец, мы должны вызвать registerWaila. Мы делаем это в CommonProxy:
CommonProxy.java:
public static class CommonProxy {
   
    public void preInit(FMLPreInitializationEvent e) {
            ...
            MainCompatHandler.registerWaila();
            MainCompatHandler.registerTOP();
    }
}

Затем мы добавляем поддержку в ваш DataBlock.java. Важно отметить, что в отличие от The One Probe метод getWailaBody вызывается на стороне клиента. Это означает, что вы не сможете легко получить доступ к информации, которая присутствует только на сервере. А поскольку ваш DataBlock.java не синхронизирует значение своего счетчика с клиентом, всплывающая подсказка WAILA всегда будет отображать 0. Однако есть способы исправить это с помощью пакетов:
DataBlock.java:
public class DataBlock extends Block implements ITileEntityProvider, TOPInfoProvider, WailaInfoProvider {

    ...

    @Override
    public List<String> getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
        TileEntity te = accessor.getTileEntity();
        if (te instanceof DataTileEntity) {
            DataTileEntity dataTileEntity = (DataTileEntity) te;
            currenttip.add(TextFormatting.GRAY + "Counter: " + dataTileEntity.getCounter());
        }
        return currenttip;
    }
}

Конец!
Автор
Garik
Просмотры
4,171
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Garik

Сверху