Регистрация биома с конкретным id

Версия Minecraft
1.12.2
API
Forge
567
56
165
Подскажите пожалуйста способ зарегистрировать биом с конкретным числовым ID (Кроме как вживляться в Biome#registerBiomes)
Java:
private static <T extends Biome> T reg(T biome){
    Biome.registerBiome(201, biome.getRegistryName().getPath(), biome);
    //не работает ^^ и просит использовать код ниже
    ForgeRegistries.BIOMES.register(biome);
    //не позволяет указать конкретный числовой ID
    return biome;
}
 
Решение
сделать публичным и вытащить из него биомы, подменить своим, а те что достал положить как новые.
Это натолкнуло меня на мысль ,,дописать нужный метод,, прямо в ForgeRegistry, оставлю решение для потомков
(Таким образом можно вообще все что угодно регистрировать с конкретным числовым ID)

Java:
public interface PForgeRegistry<V extends IForgeRegistryEntry<V>> extends IForgeRegistry<V> {
    default void register(int id, V obj){};
}
Java:
@Mixin(value = ForgeRegistry.class, remap = false)
public abstract class ForgeRegistryPatch<V extends IForgeRegistryEntry<V>> implements PForgeRegistry<V> {
    @Shadow abstract int add(int id, V value);

    @Override
    public void register(int id, V obj) {
        add(id, obj);
    }
}
Java:
...
Мне удалось найти net.minecraftforge.common.BiomeManager, там как я понимаю хранятся все биомы
Biome.REGISTRY хранит также сами биомы и их ID, который в свою очередь просто выдаётся как порядковый номер. Соответственно ты можешь написать ID произвольный, но если будут другие биомы из стандартных, ты рискуешь с ними пересечься и нарушить их логику.
Но думаю чисто теоретически никто не мешает тебе засунуть свои ручки в работу алгоритма получения ID)))


Тебе оно надо сильно? Хоть какую то подсказку напиши для чего.
 
Последнее редактирование:
Тебе оно надо сильно? Хоть какую то подсказку напиши для чего.
Для генерации естественно. Генерация мира у меня задана tson-конфигом, и биомы так-же из него строятся.
Во время генерации слоев я подчеркнул, что очень быстро и удобно оперировать числами, вместо экземпляров биомов, и писал всю логику на числах

В регистре биомов есть такая нехорошая вещь как ...
Biome.REGISTRY хранит также сами биомы и их ID, который в свою очередь просто выдаётся как порядковый номер
невозможность контролировать этот ID, и для разных миров я не могу гарантировать одинаковый id для 1-го и того-же биома ->
1 и тот-же tson, в которых записаны числовые биомы (и из к-го строится генерация мира) при малейшем изминении, в новосозданном мире может перестать правильно работать

БИОМЫ:
{biomes=[
{biomes=[
    {
        id=(221),
        name="big_mushrooms",
        block_top="minecraft:dirt:2",
        properties={
            display="Big Mushrums",
            height=(1.5),
            height_var=(0.2)
        },
        decorator={
            big_mushrooms=(3)
        },
        generator={
            base={
                water_lakes=(false),
                lava_likes=(false),
                sea_lvl=(3)
            }
        }
    },
    {
        id=(222),
        name="stone_teeth",
        block_top="minecraft:gravel",
        properties={
            display="Stone Teeth",
            height=(1.85),
            height_var=(0.1)
        },
        decorator={
            threes="+1",
            dead_bush="+2"
        },
        color={
            grass="3fc07d"
        },
        noises=[
            [(1.5), "minecraft:grass", "minecraft:dirt"]
        ],
        generator={
            base={
                water_lakes=(false),
                lava_likes=(false),
                rivers=(false)
            },
            ore={
                coal={size="+5", max_height=(250)},
                iron={size="+4", max_height="+16"},
                andesite={size="+12", max_height=(250), count="+3"}
            }
        },
        structures=[
            {
                id=(200), chance=(2), structure="--stn/platform_7x7x4",    pos=[(0),(-2),(0)],settings="any", add=[(207)],
                sub=[
                    {type=">#", id=(201), structure="--stn/stn_ruins0_5x5x10", pos=[(2),(4),(2)], settings="any"},
                    {type=">#", id=(202), structure="--stn/stn_ruins1_5x5x5",  pos=[(2),(4),(2)], settings="any"},
                    {type=">#", id=(203), structure="--stn/stn_ruins2_3x3x8",  pos=[(2),(4),(2)], settings="any"},
                    {type=">#", id=(204), structure="--stn/stn_ruins3_5x5x6",  pos=[(2),(4),(2)], settings="any"},
                    {type=">#", id=(205), structure="--stn/stn_ruins4_3x3x5",  pos=[(2),(4),(2)], settings="any"},
                    {type=">#", id=(206), structure="--stn/stn_ruins5_5x5x10", pos=[(2),(4),(2)], settings="any"},
                    {type="<%>",id=(207),add=[(201),(202),(203),(204),(205),(206)],weights=[(0.5),(0.5),(0.5),(0.5),(0.5),(0.5)]}
                ]
            },{
                id=(208), chance=(0.5), structure="--stn/stn_ruins4_3x3x5", settings="any"
            },{
                id=(209), chance=(0.5), structure="--stn/stn_ruins1_5x5x5", settings="any"
            }
        ]
    },
    {
        id=(223),
        name="hight_sea",
        block_top="minecraft:gravel",
        properties={
            display="Hight Sea",
            height=(1.42),
            height_var=(0.22)
        },
        generator={
            base={
                water_lakes=(false),
                lava_likes=(false),
                sea_lvl=(26),
                rivers=(false)
            },
            ore={
                andesite={size="+16", max_height=(250), count="+3"}
            }
        }
    }
    
]}
]}
ГЕНЕРАЦИЯ:
{
    normal=[(3), (4), (221), (223)],
    hot=[(35), (36)],
    cool=[(5), (223)],
    cold=[(10), (221), (223)],
    bounds=[
        [[(223), (222)]],
        [[(223), (222)]],
        [[(223), (222)]],
        [[(223), (222)]],
        [[(223), (222)]]
    ]
}
image.png
 
Последнее редактирование:
BiomeRegistry.registerBiome(0, new ResourceLocation("yourmodid", "custom_biome"), customBiome);

Обратите внимание, что параметр "yourmodid" должен быть заменен на идентификатор вашего мода, а "custom_biome" - на уникальный идентификатор вашего биома. customBiome - это экземпляр вашего класса биома.
ну не привязывайся к числам, используй его unique_name
Я работал только с генераторами мира (структур).

ты можешь этот список (я не умею работать с трансформерами или миксинами, в наше время они были не нужны))
сделать публичным и вытащить из него биомы, подменить своим, а те что достал положить как новые.
 
сделать публичным и вытащить из него биомы, подменить своим, а те что достал положить как новые.
Это натолкнуло меня на мысль ,,дописать нужный метод,, прямо в ForgeRegistry, оставлю решение для потомков
(Таким образом можно вообще все что угодно регистрировать с конкретным числовым ID)

Java:
public interface PForgeRegistry<V extends IForgeRegistryEntry<V>> extends IForgeRegistry<V> {
    default void register(int id, V obj){};
}
Java:
@Mixin(value = ForgeRegistry.class, remap = false)
public abstract class ForgeRegistryPatch<V extends IForgeRegistryEntry<V>> implements PForgeRegistry<V> {
    @Shadow abstract int add(int id, V value);

    @Override
    public void register(int id, V obj) {
        add(id, obj);
    }
}
Java:
//ловим событие и передаем биомы
void registerAll(RegistryEvent.Register<Biome> e){
    List<Tuple<Integer, Biome>> biomes = ...
    PForgeRegistry<Biome> registry = (PForgeRegistry<Biome>) e.getRegistry();
  
    for(Tuple<Biome, Integer> pair:biomes)
        registry.register(pair.A /*ID*/, pair.B /*Биом*/);
}
 
perfect!
 
Назад
Сверху