Таблица лута

Версия Minecraft
1.12.2
1,031
19
87
При создании таблицы лута столкнулся с проблемой. Сама таблица работает, но так как впервые её создал то заметил, что моя таблица заменяет ванильную, а мне нужно только дополнить её не меняя ванильной. Что посоветуете?
Java:
@SubscribeEvent
    public void onLoot(LootTableLoadEvent event) {
       
        if (LootTableList.CHESTS_SPAWN_BONUS_CHEST.equals(event.getName())) {
           
            ResourceLocation loc = new ResourceLocation("galaxy", "chests/galaxy_spawn_bonus_chest");
            LootTable customLootTable = event.getLootTableManager().getLootTableFromLocation(loc);
            event.setTable(customLootTable);
           
        }
       
}
Java:
public class RegisterEvent {

    public static void register() {
       
        MinecraftForge.EVENT_BUS.register(new EventLoot());
       
    }
   
}
JSON:
{
    "pools": [
        {
            "name": "chest_1",
            "rolls": 1,
            "entries": [
               {
                    "type": "item",
                    "name": "galaxy:copper_ingot",
                    "weight": 4,
                    "functions": [
                        {
                            "function": "minecraft:set_count",
                            "count": {
                                "min": 1,
                                "max": 4
                            }
                        }
                    ]
                }
            ]
        }
    ]
}
 
Решение
Много кода, сразу видно - хлам.
Можно проще, тем более, тебе всего одну таблицу вставить надо


Java:
//Поле pools приватное, поэтому юзаем рефлексию(или access transformers, но они иногда заводятся)
Field pools = LootTable.class.getDeclasredField("pools",<тут надо указать какой тип у pools, я не помню, сам сделаешь>);
pools.setAccesible(true);

void insert(LootTable t1, LootTable t2) {
    <тут надо указать какой тип у pools, я не помню, сам сделаешь> t2pools = pools.get(t2);
    for(Pool pool:t2pools)
        t1.addPool(pool);
}
Последнее редактирование:
Java:
ResourceLocation loc = new ResourceLocation("galaxy", "chests/galaxy_spawn_bonus_chest");
LootTable customLootTable = event.getLootTableManager().getLootTableFromLocation(loc);
event.getTable().addPool(customLootTable);
 
Да, верно. Нужно получить доступ к полю LootTable#pools и все его элементы добавить
 
@hohserg1, я нарыл код. но помоги понять его работу плиз:
Java:
@SubscribeEvent
    public void lootLoad(LootTableLoadEvent event)
    {
        if(event.getName().getResourceDomain().equals("minecraft"))
            for(ResourceLocation inject : lootInjections)
                if(event.getName().getResourcePath().equals(inject.getResourcePath()))
                {
                    LootPool injectPool = Utils.loadBuiltinLootTable(inject, event.getLootTableManager()).getPool("mod_loot_inject");
                    LootPool mainPool = event.getTable().getPool("main");
                    if(injectPool!=null&&mainPool!=null)
                        try
                        {
                            if(f_lootEntries==null)
                            {
                                f_lootEntries = LootPool.class.getDeclaredField(ObfuscationReflectionHelper.remapFieldNames(LootPool.class.getName(), "field_186453_a")[0]);//field_186453_a is srg for lootEntries
                                f_lootEntries.setAccessible(true);
                            }
                            if(f_lootEntries!=null)
                            {
                                List<LootEntry> entryList = (List<LootEntry>)f_lootEntries.get(injectPool);
                                for(LootEntry entry : entryList)
                                    mainPool.addEntry(entry);
                            }
                        } catch(Exception e)
                        {
                            e.printStackTrace();
                        }
                }
    }
 
Последнее редактирование:
Много кода, сразу видно - хлам.
Можно проще, тем более, тебе всего одну таблицу вставить надо


Java:
//Поле pools приватное, поэтому юзаем рефлексию(или access transformers, но они иногда заводятся)
Field pools = LootTable.class.getDeclasredField("pools",<тут надо указать какой тип у pools, я не помню, сам сделаешь>);
pools.setAccesible(true);

void insert(LootTable t1, LootTable t2) {
    <тут надо указать какой тип у pools, я не помню, сам сделаешь> t2pools = pools.get(t2);
    for(Pool pool:t2pools)
        t1.addPool(pool);
}
 
Хороший мод не обязательно должен состоять из хорошего кода)
 
Назад
Сверху