Добавление сделки к существующей профессии жителя

Версия Minecraft
1.12.2
API
Forge
198
1
24
Есть предмет, который показывает определённые характеристики игрока. Предмет работает как и задумано. Хотелось бы сделать, чтобы его нужно было не крафтить, а покупать у жителя, в данном случае у священника. Как сделать, чтобы священники в деревнях предлагали этот предмет в числе прочих своих товаров? Все что удалось нагуглить годно только чтобы испортить мод, сделав его вообще нерабочим - настолько всё обрывочно и запутано.
 
198
1
24
Короче, хотя в игре священник называется cleric в коде он "minecraft : priest", но совершенно непонятно какое значение надо указывать в getCareer() - что ни укажи, всё пишет что нету такого. Пробовал и на сайтах искать, и через NBTEdit подсмотреть - фигушки, там написано что значение 1 но оно не подходит. Как и 0,2,3,4... Я в тупике...
 

sk9zist :l

Исправился
981
18
157
@Alchemist вот,
Java:
VillagerRegistry.VillagerProfession cleric = ForgeRegistries.VILLAGER_PROFESSIONS.getValue(new ResourceLocation("minecraft", "priest"));
//int careerId = accessor.getNBTData().getInteger("careerId");

Random rand = new Random();
int careerId = cleric.getRandomCareer(rand);
careerId.addTrade(1, new Trades());
 

sk9zist :l

Исправился
981
18
157

sk9zist :l

Исправился
981
18
157
ну на:
(тоже самое, но подругому)
Java:
VillagerRegistry.VillagerProfession cleric = ForgeRegistries.VILLAGER_PROFESSIONS.getValue(new ResourceLocation("minecraft", "priest"));
//int careerId = accessor.getNBTData().getInteger("careerId");

Random rand = new Random();
cleric.getRandomCareer(rand);
VillagerCareer career = cleric.getCareer(cleric.getRandomCareer(rand));
career.addTrade(1, new Trades());

P.S. А ты Random то импортировал?
 
Последнее редактирование:

sk9zist :l

Исправился
981
18
157
@Alchemist я изменил, пробуй. Там просто лишнее попалось кое-что.
 

sk9zist :l

Исправился
981
18
157
Вот так работает:
Да) Это почти тоже самое что я написал в посте #28 :)
(я там просто зачем-то изначально из careerId получал getCareer, а надо было из cleric. Ну или же profession, как у тебя в данный момент)

UPD: Можно лучший ответ?)

выложить как туториал
хорошая идея.
 
198
1
24
Т.к. писать в туториалы у меня допуска нет, выкладываю тут:
Trades.java (В данном случае заменил предмет из своего мода на ванильную элитру):
// Подсказываем NPC выгодный бизнес, до которого они сами не додумались...
import java.util.Random;

import net.minecraft.entity.IMerchant;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.village.MerchantRecipe;
import net.minecraft.village.MerchantRecipeList;

public class Trades implements EntityVillager.ITradeList
{
   @Override
   public void addMerchantRecipe(IMerchant merchant, MerchantRecipeList recipeList, Random random)
   {
      //Первый ItemStack - то, что непись покупает, второй - то, что продаёт
      recipeList.add(new MerchantRecipe(new ItemStack(Items.EMERALD,64),new ItemStack(Items.ELYTRA,1)));
   }
}

EventsHandler.java:
// Добавление новой сделки существующей профессии жителей. Сделка будет добавлена только к новым NPC,
// ранее заспавненые так ничему и не научатся...
import java.util.Random;

import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.common.registry.VillagerRegistry;
import net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerCareer;
import net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession;

public class EventsHandler {

    // Учим священника продавать элитры за стак изумрудов
    private static VillagerRegistry.VillagerProfession profession;
    @SubscribeEvent
    public void onRegisterVillagers(RegistryEvent.Register<VillagerProfession> event) {
        //Вот тут крашнет если нет такой профессии.
        ResourceLocation location = new ResourceLocation("minecraft", "priest");
        //Тут тоже может крашнуть, по той же причине.
        profession = ForgeRegistries.VILLAGER_PROFESSIONS.getValue(location);
        Random rand = new Random();
        //Генерируем случайное значение careerId - подсмотреть где-то или угадать не получится.
        //Я пробовал. Точно не получится.
        int careerId = profession.getRandomCareer(rand);
        //Ну и вот наконец самая лёгкая часть. Добавляем сделку из вышеуказанного класса Trades.java
        profession.getCareer(careerId).addTrade(1, new Trades());              
    }
}
//Всё. Запускайте и молитесь.

У кого есть права писать в туториалы, пожалуйста, добавьте туда это, и заодно добавьте благодарность тем кто помог мне разобраться самому как всё это работает.
 

sk9zist :l

Исправился
981
18
157
Походу да... В туториалах нет кнопки создать тему, хотя я раньше и не проверял)
 
198
1
24
А в самом низу написано "у вас недостаточно прав". Не самый продуктивный способ избежать дезинформации. Уместнее было бы, вместо того чтобы ждать, когда (и если) кто-то с правами на добавление тутора прочитает тему и добавит, дать возможность писать туторы всем, но публиковать только после проверки на достоверность.
 

sk9zist :l

Исправился
981
18
157
публиковать только после проверки на достоверность.
Это уже как идея на следующее обновление форума или как это можно назвать,
Кстати, чтобы добавлять туториалы вроде лигу надо иметь

извеняюсь за оффтоп..
 
Сверху