[Tutorial] Делаем почти автоматизированную регистрацию

73
4
5
Bonjour господа(и нет), сегодня мы разберём улучшенную регистрацию для Minecraft 1.12.2
пробовал на 1.18 без автомодели, не работает :(
, которая за нас будет рисовать модели в коде.

Ну что-ж, не будем тянуть кота за хвост, поехали

Первым делом, сделаем наш интерфейс с ыаы(registryModel)методом:

Model.java:
public interface Model {
  void registryModel();
}

Хорошо первый самый сложный этап выполнили, давайте перейдем к лёгкому, а именно к самой ловле регистрации.

RegistryHandler.java:
@Mod.EventBusSubscriber
public class RegisterHandler {
    @SubscribeEvent
    public static void itemRegister(RegistryEvent.Register<Item> register) {
        Item[] itemArray = RegistryArray.ITEMS.toArray(new Item[0]);
        register.getRegistry().registerAll(itemArray);
    }
    @SubscribeEvent
    public static void blockRegister(RegistryEvent.Register<Block> register) {
        Block[] blockArray = RegistryArray.BLOCKS.toArray(new Block[0]);
        register.getRegistry().registerAll(blockArray);
    }

    @SubscribeEvent
    public static void modelRegister(ModelRegistryEvent event) {
        for (Item item : RegistryArray.ITEMS) {
            if (item instanceof Model) {
                ((Model)item).registerModels();
              
            }
        }

        for (Block block : RegistryArray.BLOCKS) {
            if (block instanceof Model) {
                ((Model) block).registerModels();
            
            }
        }
    }
}

Что такое RegistryArray? RegistryArray - это наш класс, который мы сейчас создадим, в нем может храниться наша регистрация блоков, предметов и т.п. ну если короче, класс с листами для регистрации.

RegistryArray.java:
public class RegistryArray {
  public static final List<Block> BLOCKS = new ArrayList<>();
  public static final List<Item> ITEMS = new ArrayList<>();
}

А теперь вопрос, КАК РЕГИСТРИРОВАТЬ ВСЯКОЕ С ПОМОЩЬЮ ЭТОГО?! Все просто(нет), придется создавать классы-базы, которые как раз нужны для регистрации. К сожалению это надо делать обязательно, иначе у нас нечего не получится(эх). Вот вам два примера этих классов и сама регистрация

Предмет:

ItemBase.java:
public class ItemBase extends Item implements Model {
    public ItemBase(String id) {
        this.setRegistryName(id);
        this.setUnlocalizedName(ExampleMod.MOD_ID + "." + id);
        RegistryArray.ITEMS.add(this);
    }


    @Override
    public void registerModels() {
        ExampleMod.proxy.getRender(this, 0, "inventory");
    }
}

Блок:

BlockBase.java:
public class BlockBase extends Block implements Model {
    public BlockBase(String id, Material material) {
        super(material);
        this.setRegistryName(id);
        this.setUnlocalizedName(ExampleMod.MOD_ID + "." + id);
        RegistryArray.BLOCKS.add(this);
        RegistryArray.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
    }

    @Override
    public void registerModels() {
        ExampleMod.proxy.getRender(Item.getItemFromBlock(this), 0, "inventory");
    }
}

А вот и подъехала регистрация:

Registration.java:
public class Registration {
    public static final Item
            E_Item = new ItemBase("e_item");
    public static final BlockBase E_Block = new BlockBase("e_block", Material.ROCK);
}

Теперь нам по сути нечего не надо делать, этот код сделает все за нас :D
 
Последнее редактирование:
73
4
5
Вообще это надо было в туториалы но я чет забыл как туда размещать
 
460
40
148
Я всегда думал, что instanceof - дорогостоящая операция... Видимо ошибался
Дорогостоящая, но это сущий пустяк по сравнению с тем что творится в майне. Немаловажное значение имеет, где используется код и сколько он итераций проходит.
 

Icosider

iMixin
Администратор
3,533
91
629
Сомневаюсь, что данная автоматизация хоть как-то упростит жизнь. По поводу @will0376, это обычный O(n), тут нагрузка мизерная. Ты там небось умножаешь через сдвиги и hex хранишь в 16 виде... :)
 
Последнее редактирование:

will0376

Токсичная личность
1,658
44
428
Ты там небось умножаешь через сдвиги и hex хранишь в 16 виде
ха-ха-ха.

Дорогостоящая, но это сущий пустяк по сравнению с тем что творится в майне.
Согласен, когда это используется только единожны... Но есть индивидумы, которые говнокодят (см. код экстаботании и экстраутилит. обоих авторов я готов кастрировать нахрен.)
 
460
40
148
Согласен, когда это используется только единожны... Но есть индивидумы, которые говнокодят (см. код экстаботании и экстраутилит. обоих авторов я готов кастрировать нахрен.)
Команду Forge вряд ли кто переплюнет) Наворотили своих SRG-трансформеров, чтобы майн на целых 15 сек. запускался дольше, убив смысл в оптимизациях ProGuard.
 

jopi

Попрошайка
1,353
26
233
@TheAndrey говнокод из лавамода вряд-ли кто-то переплюнет скорее, я еще нигде не видел что-бы где-то 10 раз передекомпилированный код адаптировали под какое-то говно с сотней лесенок из ifelse без понимания кода во-о-обще

Bonjour господа(и нет), сегодня мы разберём улучшенную регистрацию для Minecraft 1.12.2
пробовал на 1.18 без автомодели, не работает :(
, которая за нас будет рисовать модели в коде.

Ну что-ж, не будем тянуть кота за хвост, поехали

Первым делом, сделаем наш интерфейс с ыаы(registryModel)методом:

Model.java:
public interface Model {
  void registryModel();
}

Хорошо первый самый сложный этап выполнили, давайте перейдем к лёгкому, а именно к самой ловле регистрации.

RegistryHandler.java:
@Mod.EventBusSubscriber
public class RegisterHandler {
    @SubscribeEvent
    public static void itemRegister(RegistryEvent.Register<Item> register) {
        Item[] itemArray = RegistryArray.ITEMS.toArray(new Item[0]);
        register.getRegistry().registerAll(itemArray);
    }
    @SubscribeEvent
    public static void blockRegister(RegistryEvent.Register<Block> register) {
        Block[] blockArray = RegistryArray.BLOCKS.toArray(new Block[0]);
        register.getRegistry().registerAll(blockArray);
    }

    @SubscribeEvent
    public static void modelRegister(ModelRegistryEvent event) {
        for (Item item : RegistryArray.ITEMS) {
            if (item instanceof Model) {
                ((Model)item).registerModels();
              
            }
        }

        for (Block block : RegistryArray.BLOCKS) {
            if (block instanceof Model) {
                ((Model) block).registerModels();
            
            }
        }
    }
}

Что такое RegistryArray? RegistryArray - это наш класс, который мы сейчас создадим, в нем может храниться наша регистрация блоков, предметов и т.п. ну если короче, класс с листами для регистрации.

RegistryArray.java:
public class RegistryArray {
  public static final List<Block> BLOCKS = new ArrayList<>();
  public static final List<Item> ITEMS = new ArrayList<>();
}

А теперь вопрос, КАК РЕГИСТРИРОВАТЬ ВСЯКОЕ С ПОМОЩЬЮ ЭТОГО?! Все просто(нет), придется создавать классы-базы, которые как раз нужны для регистрации. К сожалению это надо делать обязательно, иначе у нас нечего не получится(эх). Вот вам два примера этих классов и сама регистрация

Предмет:

ItemBase.java:
public class ItemBase extends Item implements Model {
    public ItemBase(String id, CreativeTabs tabs) {
        this.setRegistryName(id);
        this.setUnlocalizedName(ExampleMod.MOD_ID + "." + id);
        this.setCreativeTab(tabs);
        RegistryArray.ITEMS.add(this);
    }


    @Override
    public void registerModels() {
        ExampleMod.proxy.getRender(this, 0, "inventory");
    }
}

Блок:

BlockBase.java:
public class BlockBase extends Block implements Model {
    public BlockBase(String id, Material material, CreativeTabs tabs) {
        super(material);
        this.setRegistryName(id);
        this.setUnlocalizedName(ExampleMod.MOD_ID + "." + id);
        this.setCreativeTab(tabs);
        RegistryArray.BLOCKS.add(this);
        RegistryArray.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
    }

    @Override
    public void registerModels() {
        ExampleMod.proxy.getRender(Item.getItemFromBlock(this), 0, "inventory");
    }
}

А вот и подъехала регистрация:

Registration.java:
public class Registration {
    public static final Item
            E_Item = new ItemBase("e_item", yourItemGroup);
    public static final BlockBase E_Block = new BlockBase("e_block", Material.ROCK, yourItemGroup);
}

Теперь нам по сути нечего не надо делать, этот код сделает все за нас :D
выглядит как дефолт регистрация до 1.7, ток там такого воротить не надо было, само было с предметами, а блоки таки надо было регать доп. строкой
 
73
4
5
вы там что-то про лесенку говорили 1653309292989.png
 

jopi

Попрошайка
1,353
26
233
@AlgorithmLX слабо как-то, тут стейтмент в стейтменте, а то что я видел это

lesenki:
if (something(0)) {
    something();
}
if (something(1)) {
    something();
}
if (something(2)) {
    something();
}
if (something(3)) {
    something();
}
if (something(4)) {
    something();
}
if (something(5)) {
    something();
}
if (something(6)) {
    something();
}
if (something(7)) {
    something();
}
if (something(8)) {
    something();
}
if (something(9)) {
    something();
}
И там то что я видел, было на тысячи 2 строк, и сокращалось всего-лишь 1 циклом до 5 строк
 

GoogleTan

Картошка :3
1,342
42
305
Я всегда думал, что instanceof - дорогостоящая операция... Видимо ошибался
Не знаю, как это реализовано в jvm, но в теории это можно сделать за время +- равное разыменованию 2 указателей. По меркам явы, которая всё хранит в указателях, это не так уж много.
 
4,992
46
765
@AlgorithmLX слабо как-то, тут стейтмент в стейтменте, а то что я видел это

lesenki:
if (something(0)) {
    something();
}
if (something(1)) {
    something();
}
if (something(2)) {
    something();
}
if (something(3)) {
    something();
}
if (something(4)) {
    something();
}
if (something(5)) {
    something();
}
if (something(6)) {
    something();
}
if (something(7)) {
    something();
}
if (something(8)) {
    something();
}
if (something(9)) {
    something();
}
И там то что я видел, было на тысячи 2 строк, и сокращалось всего-лишь 1 циклом до 5 строк
Да это же индусский код!
 
Сверху