From 2a2f5c6cdcf0b8b9f8f6317bc51cf4806d98305b Mon Sep 17 00:00:00 2001 From: Mrbysco Date: Mon, 11 Mar 2024 20:48:18 +0100 Subject: [PATCH] Add the Engineer villager back --- .../735031f3addf80804addae5e3f53249900116f1e | 4 +- .../b3d91002e8697bb909ea0190b2d5cf717cf18f57 | 2 + .../assets/actuallyadditions/sounds.json | 5 + .../acquirable_job_site.json | 5 + .../data/ActuallyAdditionsData.java | 1 + .../data/PoiTypeTagsGenerator.java | 26 ++++ .../data/SoundsGenerator.java | 1 + .../actuallyadditions/mod/AASounds.java | 1 + .../mod/ActuallyAdditions.java | 6 + .../mod/gen/village/ActuallyPOITypes.java | 25 ++++ .../mod/gen/village/ActuallyVillagers.java | 20 +++ .../mod/gen/village/BasicTradeList.java | 139 +++++++++++------- .../mod/gen/village/InitVillager.java | 22 ++- .../resources/META-INF/accesstransformer.cfg | 4 +- .../assets/actuallyadditions/lang/en_us.json | 2 +- .../entity/villager/profession/engineer.png | Bin 0 -> 3673 bytes 16 files changed, 205 insertions(+), 58 deletions(-) create mode 100644 src/generated/resources/.cache/b3d91002e8697bb909ea0190b2d5cf717cf18f57 create mode 100644 src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json create mode 100644 src/main/java/de/ellpeck/actuallyadditions/data/PoiTypeTagsGenerator.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyPOITypes.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyVillagers.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/entity/villager/profession/engineer.png diff --git a/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e b/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e index 566a17b8e..a9a983a91 100644 --- a/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e +++ b/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e @@ -1,2 +1,2 @@ -// 1.20.4 2024-03-04T22:51:31.6174299 Sound Definitions -5492914eb97f792a830608d663aaf3148987ed3e assets/actuallyadditions/sounds.json +// 1.20.4 2024-03-11T20:19:22.9008098 Sound Definitions +e7a33758b55803bd59c68b8024cb8484dd4f060f assets/actuallyadditions/sounds.json diff --git a/src/generated/resources/.cache/b3d91002e8697bb909ea0190b2d5cf717cf18f57 b/src/generated/resources/.cache/b3d91002e8697bb909ea0190b2d5cf717cf18f57 new file mode 100644 index 000000000..6a1336f98 --- /dev/null +++ b/src/generated/resources/.cache/b3d91002e8697bb909ea0190b2d5cf717cf18f57 @@ -0,0 +1,2 @@ +// 1.20.4 2024-03-11T20:41:48.609238 Tags for minecraft:point_of_interest_type mod id actuallyadditions +65352c4eaf105efa72687c568c2d5b5f5fd11996 data/minecraft/tags/point_of_interest_type/acquirable_job_site.json diff --git a/src/generated/resources/assets/actuallyadditions/sounds.json b/src/generated/resources/assets/actuallyadditions/sounds.json index db24c968b..b9b3ae62b 100644 --- a/src/generated/resources/assets/actuallyadditions/sounds.json +++ b/src/generated/resources/assets/actuallyadditions/sounds.json @@ -18,5 +18,10 @@ "sounds": [ "actuallyadditions:reconstructor" ] + }, + "villager.work_engineer": { + "sounds": [ + "actuallyadditions:coffee_machine" + ] } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json b/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json new file mode 100644 index 000000000..65d8cfb7b --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json @@ -0,0 +1,5 @@ +{ + "values": [ + "actuallyadditions:engineer" + ] +} \ No newline at end of file diff --git a/src/main/java/de/ellpeck/actuallyadditions/data/ActuallyAdditionsData.java b/src/main/java/de/ellpeck/actuallyadditions/data/ActuallyAdditionsData.java index d95cbb2e5..398dc5592 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/data/ActuallyAdditionsData.java +++ b/src/main/java/de/ellpeck/actuallyadditions/data/ActuallyAdditionsData.java @@ -46,6 +46,7 @@ public class ActuallyAdditionsData { generator.addProvider(true, new ItemRecipeGenerator(packOutput)); generator.addProvider(true, generatorBlockTags); generator.addProvider(true, new ItemTagsGenerator(packOutput, lookupProvider, generatorBlockTags, helper)); + generator.addProvider(true, new PoiTypeTagsGenerator(packOutput, lookupProvider, helper)); generator.addProvider(true, new DamageTypeTagsGenerator(packOutput, lookupProvider, helper)); generator.addProvider(true, new BlockStateGenerator(packOutput, helper)); diff --git a/src/main/java/de/ellpeck/actuallyadditions/data/PoiTypeTagsGenerator.java b/src/main/java/de/ellpeck/actuallyadditions/data/PoiTypeTagsGenerator.java new file mode 100644 index 000000000..df9200cf1 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/data/PoiTypeTagsGenerator.java @@ -0,0 +1,26 @@ +package de.ellpeck.actuallyadditions.data; + +import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import de.ellpeck.actuallyadditions.mod.gen.village.ActuallyPOITypes; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.PoiTypeTagsProvider; +import net.minecraft.tags.PoiTypeTags; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class PoiTypeTagsGenerator extends PoiTypeTagsProvider { + public PoiTypeTagsGenerator(PackOutput output, CompletableFuture completableFuture, @Nullable ExistingFileHelper fileHelper) { + super(output, completableFuture, ActuallyAdditions.MODID, fileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider pProvider) { + this.tag(PoiTypeTags.ACQUIRABLE_JOB_SITE) + .add( + ActuallyPOITypes.ENGINEER.getKey() + ); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/data/SoundsGenerator.java b/src/main/java/de/ellpeck/actuallyadditions/data/SoundsGenerator.java index b0b750031..8edbc3fe9 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/data/SoundsGenerator.java +++ b/src/main/java/de/ellpeck/actuallyadditions/data/SoundsGenerator.java @@ -19,5 +19,6 @@ public class SoundsGenerator extends SoundDefinitionsProvider { add(AASounds.CRUSHER, definition().with(sound(new ResourceLocation(ActuallyAdditions.MODID, "crusher")))); add(AASounds.COFFEE_MACHINE, definition().with(sound(new ResourceLocation(ActuallyAdditions.MODID, "coffee_machine")))); add(AASounds.DUH_DUH_DUH_DUUUH, definition().with(sound(new ResourceLocation(ActuallyAdditions.MODID, "duh_duh_duh_duuuh")))); + add(AASounds.VILLAGER_WORK_ENGINEER, definition().with(sound(new ResourceLocation(ActuallyAdditions.MODID, "coffee_machine")))); } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/AASounds.java b/src/main/java/de/ellpeck/actuallyadditions/mod/AASounds.java index e57da7c3e..de78719e2 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/AASounds.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/AASounds.java @@ -14,6 +14,7 @@ public class AASounds { public static DeferredHolder CRUSHER = SOUNDS.register("crusher", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(ActuallyAdditions.MODID, "crusher"))); public static DeferredHolder COFFEE_MACHINE = SOUNDS.register("coffee_machine", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(ActuallyAdditions.MODID, "coffee_machine"))); public static DeferredHolder DUH_DUH_DUH_DUUUH = SOUNDS.register("duh_duh_duh_duuuh", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(ActuallyAdditions.MODID, "duh_duh_duh_duuuh"))); + public static DeferredHolder VILLAGER_WORK_ENGINEER = SOUNDS.register("villager.work_engineer", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(ActuallyAdditions.MODID, "villager.work_engineer"))); public static void init(IEventBus bus) { diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java index aaff4bff6..d6a4f9b64 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java @@ -28,6 +28,9 @@ import de.ellpeck.actuallyadditions.mod.event.CommonEvents; import de.ellpeck.actuallyadditions.mod.fluids.InitFluids; import de.ellpeck.actuallyadditions.mod.gen.ActuallyVillages; import de.ellpeck.actuallyadditions.mod.gen.modifier.BoolConfigFeatureBiomeModifier; +import de.ellpeck.actuallyadditions.mod.gen.village.ActuallyPOITypes; +import de.ellpeck.actuallyadditions.mod.gen.village.ActuallyVillagers; +import de.ellpeck.actuallyadditions.mod.gen.village.InitVillager; import de.ellpeck.actuallyadditions.mod.inventory.ActuallyContainers; import de.ellpeck.actuallyadditions.mod.items.ActuallyItems; import de.ellpeck.actuallyadditions.mod.items.ItemCoffee; @@ -110,6 +113,8 @@ public class ActuallyAdditions { ActuallyTabs.init(eventBus); ActuallyRecipes.init(eventBus); AASounds.init(eventBus); + ActuallyVillagers.init(eventBus); + ActuallyPOITypes.init(eventBus); ActuallyAttachments.init(eventBus); ActuallyContainers.CONTAINERS.register(eventBus); ENTITIES.register(eventBus); @@ -121,6 +126,7 @@ public class ActuallyAdditions { NeoForge.EVENT_BUS.addListener(this::serverStarted); NeoForge.EVENT_BUS.addListener(this::serverStopped); + NeoForge.EVENT_BUS.addListener(InitVillager::setupTrades); NeoForge.EVENT_BUS.register(new CommonEvents()); // NeoForge.EVENT_BUS.register(new DungeonLoot()); NeoForge.EVENT_BUS.addListener(ActuallyAdditions::reloadEvent); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyPOITypes.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyPOITypes.java new file mode 100644 index 000000000..3399f1fcf --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyPOITypes.java @@ -0,0 +1,25 @@ +package de.ellpeck.actuallyadditions.mod.gen.village; + +import com.google.common.collect.ImmutableSet; +import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import de.ellpeck.actuallyadditions.mod.blocks.ActuallyBlocks; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.entity.ai.village.poi.PoiType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.Set; +import java.util.function.Supplier; + +public class ActuallyPOITypes { + public static final DeferredRegister POI_TYPES = DeferredRegister.create(BuiltInRegistries.POINT_OF_INTEREST_TYPE, ActuallyAdditions.MODID); + + public static DeferredHolder ENGINEER = POI_TYPES.register("engineer", () -> new PoiType(ImmutableSet.copyOf(ActuallyBlocks.COFFEE_MACHINE.get().getStateDefinition().getPossibleStates()), 1, 1)); + + public static void init(IEventBus bus) { + POI_TYPES.register(bus); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyVillagers.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyVillagers.java new file mode 100644 index 000000000..96f160981 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/ActuallyVillagers.java @@ -0,0 +1,20 @@ +package de.ellpeck.actuallyadditions.mod.gen.village; + +import com.google.common.collect.ImmutableSet; +import de.ellpeck.actuallyadditions.mod.AASounds; +import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.entity.npc.VillagerProfession; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class ActuallyVillagers { + public static final DeferredRegister VILLAGER_PROFESSIONS = DeferredRegister.create(BuiltInRegistries.VILLAGER_PROFESSION, ActuallyAdditions.MODID); + public static final Supplier ENGINEER = VILLAGER_PROFESSIONS.register("engineer", () -> new VillagerProfession("engineer", holder -> holder.value().equals(ActuallyPOITypes.ENGINEER.get()), holder -> holder.value().equals(ActuallyPOITypes.ENGINEER.get()), ImmutableSet.of(), ImmutableSet.of(), AASounds.VILLAGER_WORK_ENGINEER.get())); + + public static void init(IEventBus bus) { + VILLAGER_PROFESSIONS.register(bus); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/BasicTradeList.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/BasicTradeList.java index 983d7e3f1..a9f57b294 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/BasicTradeList.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/BasicTradeList.java @@ -1,53 +1,86 @@ -///* -// * This file ("BasicTradeList.java") is part of the Actually Additions mod for Minecraft. -// * It is created and owned by Ellpeck and distributed -// * under the Actually Additions License to be found at -// * http://ellpeck.de/actaddlicense -// * View the source code at https://github.com/Ellpeck/ActuallyAdditions -// * -// * © 2015-2017 Ellpeck -// */ -// -//package de.ellpeck.actuallyadditions.mod.gen.village; -// -//import java.util.Random; -// -//import net.minecraft.entity.IMerchant; -//import net.minecraft.entity.passive.EntityVillager.ITradeList; -//import net.minecraft.entity.passive.EntityVillager.PriceInfo; -//import net.minecraft.init.Items; -//import net.minecraft.item.ItemStack; -//import net.minecraft.village.MerchantRecipe; -//import net.minecraft.village.MerchantRecipeList; -// -//public class BasicTradeList implements ITradeList { -// -// private final ItemStack input; -// private final PriceInfo inputAmount; -// private final ItemStack stack; -// private final PriceInfo outputAmount; -// -// public BasicTradeList(ItemStack input, PriceInfo inputAmount, ItemStack stack, PriceInfo outputAmount) { -// this.input = input; -// this.inputAmount = inputAmount; -// this.stack = stack; -// this.outputAmount = outputAmount; -// } -// -// public BasicTradeList(PriceInfo emeraldInput, ItemStack stack, PriceInfo outputAmount) { -// this(new ItemStack(Items.EMERALD), emeraldInput, stack, outputAmount); -// } -// -// public BasicTradeList(ItemStack input, PriceInfo inputAmount, PriceInfo emeraldOutput) { -// this(input, inputAmount, new ItemStack(Items.EMERALD), emeraldOutput); -// } -// -// @Override -// public void addMerchantRecipe(IMerchant merchant, MerchantRecipeList recipeList, Random random) { -// ItemStack in = this.input.copy(); -// in.setCount(this.inputAmount.getPrice(random)); -// ItemStack out = this.stack.copy(); -// out.setCount(this.outputAmount.getPrice(random)); -// recipeList.add(new MerchantRecipe(in, out)); -// } -//} +/* + * This file ("BasicTradeList.java") is part of the Actually Additions mod for Minecraft. + * It is created and owned by Ellpeck and distributed + * under the Actually Additions License to be found at + * http://ellpeck.de/actaddlicense + * View the source code at https://github.com/Ellpeck/ActuallyAdditions + * + * © 2015-2017 Ellpeck + */ + +package de.ellpeck.actuallyadditions.mod.gen.village; + +import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; +import net.minecraft.util.RandomSource; +import net.minecraft.util.Tuple; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.npc.VillagerTrades; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.trading.MerchantOffer; +import org.jetbrains.annotations.Nullable; + +public class BasicTradeList implements VillagerTrades.ItemListing { + + private final ItemStack input; + private final PriceRange inputAmount; + private final ItemStack stack; + private final PriceRange outputAmount; + private int maxUses = 3; + private int villagerXp = 15; + private float priceMultiplier = 0.05F; + + public BasicTradeList(ItemStack input, PriceRange inputAmount, ItemStack stack, PriceRange outputAmount) { + this.input = input; + this.inputAmount = inputAmount; + this.stack = stack; + this.outputAmount = outputAmount; + } + + public BasicTradeList(PriceRange emeraldInput, ItemStack stack, PriceRange outputAmount) { + this(new ItemStack(Items.EMERALD), emeraldInput, stack, outputAmount); + } + + public BasicTradeList(ItemStack input, PriceRange inputAmount, PriceRange emeraldOutput) { + this(input, inputAmount, new ItemStack(Items.EMERALD), emeraldOutput); + } + + public BasicTradeList withMaxUses(int maxUses) { + this.maxUses = maxUses; + return this; + } + + public BasicTradeList withVillagerXp(int villagerXp) { + this.villagerXp = villagerXp; + return this; + } + + public BasicTradeList withPriceMultiplier(float priceMultiplier) { + this.priceMultiplier = priceMultiplier; + return this; + } + + @Nullable + @Override + public MerchantOffer getOffer(Entity trader, RandomSource random) { + ItemStack in = this.input.copy(); + in.setCount(this.inputAmount.getPrice(random)); + ItemStack out = this.stack.copy(); + out.setCount(this.outputAmount.getPrice(random)); + return new MerchantOffer(in, out, this.maxUses, this.villagerXp, this.priceMultiplier); + } + + public static class PriceRange extends Tuple { + public PriceRange(int min, int max) { + super(Integer.valueOf(min), Integer.valueOf(max)); + + if (max < min) { + ActuallyAdditions.LOGGER.warn("PriceRange({}, {}) invalid, {} smaller than {}", Integer.valueOf(min), Integer.valueOf(max), Integer.valueOf(max), Integer.valueOf(min)); + } + } + + public int getPrice(RandomSource rand) { + return this.getA() >= this.getB() ? this.getA() : this.getA() + rand.nextInt(this.getB() - this.getA() + 1); + } + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/InitVillager.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/InitVillager.java index a25d92e8d..1035afe8a 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/InitVillager.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/village/InitVillager.java @@ -10,9 +10,29 @@ package de.ellpeck.actuallyadditions.mod.gen.village; +import de.ellpeck.actuallyadditions.mod.blocks.ActuallyBlocks; +import de.ellpeck.actuallyadditions.mod.items.ActuallyItems; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.world.entity.npc.VillagerTrades; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.event.village.VillagerTradesEvent; + +import java.util.List; + // TODO: [port] ADD BACK public final class InitVillager { - // + public static void setupTrades(VillagerTradesEvent event) { + if (event.getType() == ActuallyVillagers.ENGINEER.get()) { + Int2ObjectMap> trades = event.getTrades(); + + trades.put(1, List.of(new BasicTradeList(new BasicTradeList.PriceRange(1, 2), new ItemStack(ActuallyBlocks.BLACK_QUARTZ_ORE.get()), new BasicTradeList.PriceRange(2, 3)), new BasicTradeList(new BasicTradeList.PriceRange(1, 2), new ItemStack(ActuallyItems.BLACK_QUARTZ.get()), new BasicTradeList.PriceRange(6, 8)), new BasicTradeList(new BasicTradeList.PriceRange(1, 3), new ItemStack(ActuallyItems.LASER_WRENCH.get()), new BasicTradeList.PriceRange(1, 1)))); + trades.put(2, List.of(new BasicTradeList(new ItemStack(ActuallyItems.COFFEE_BEANS.get()), new BasicTradeList.PriceRange(20, 30), new BasicTradeList.PriceRange(1, 2)), new BasicTradeList(new BasicTradeList.PriceRange(3, 5), new ItemStack(ActuallyBlocks.ITEM_INTERFACE.get()), new BasicTradeList.PriceRange(1, 1)), new BasicTradeList(new BasicTradeList.PriceRange(10, 20), new ItemStack(ActuallyBlocks.LASER_RELAY.get()), new BasicTradeList.PriceRange(1, 2)))); + trades.put(3, List.of(new BasicTradeList(new ItemStack(ActuallyBlocks.TINY_TORCH.get()), new BasicTradeList.PriceRange(30, 40), new BasicTradeList.PriceRange(1, 2)), new BasicTradeList(new BasicTradeList.PriceRange(1, 2), new ItemStack(ActuallyBlocks.WOOD_CASING.get()), new BasicTradeList.PriceRange(1, 2)))); + trades.put(4, List.of(new BasicTradeList(new BasicTradeList.PriceRange(3, 5), new ItemStack(ActuallyBlocks.IRON_CASING.get()), new BasicTradeList.PriceRange(1, 2)), new BasicTradeList(new ItemStack(ActuallyBlocks.EMPOWERER.get()), new BasicTradeList.PriceRange(1, 1), new BasicTradeList.PriceRange(15, 20)), new BasicTradeList(new BasicTradeList.PriceRange(30, 40), new ItemStack(ActuallyBlocks.LASER_RELAY_EXTREME.get()), new BasicTradeList.PriceRange(1, 1)))); + } + } + + // // public static VillagerProfession jamProfession; // public static VillagerProfession engineerProfession; // diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 6312b21b9..5054fc344 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -5,4 +5,6 @@ public-f net.minecraft.world.level.levelgen.structure.templatesystem.StructurePr public net.minecraft.world.item.crafting.ShapedRecipe pattern public net.minecraft.world.inventory.InventoryMenu TEXTURE_EMPTY_SLOTS public net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool templates -public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool rawTemplates \ No newline at end of file +public-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool rawTemplates +public net.minecraft.world.entity.npc.VillagerTrades$ItemsForEmeralds +public net.minecraft.world.entity.npc.VillagerTrades$EmeraldForItems \ No newline at end of file diff --git a/src/main/resources/assets/actuallyadditions/lang/en_us.json b/src/main/resources/assets/actuallyadditions/lang/en_us.json index eff028421..d26ae103c 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_us.json +++ b/src/main/resources/assets/actuallyadditions/lang/en_us.json @@ -26,7 +26,7 @@ "_comment": "Entities", "entity.Villager.actuallyadditions.jammer": "Jam Guy", "entity.Villager.actuallyadditions.crystallizer": "Crystallizer", - "entity.Villager.actuallyadditions.engineer": "Engineer", + "entity.minecraft.villager.actuallyadditions.engineer": "Engineer", "_comment": "Banners", "item.banner.actuallyadditionsBook.black": "Black Actually Additions Manual Pattern", "item.banner.actuallyadditionsBook.red": "Red Actually Additions Manual Pattern", diff --git a/src/main/resources/assets/actuallyadditions/textures/entity/villager/profession/engineer.png b/src/main/resources/assets/actuallyadditions/textures/entity/villager/profession/engineer.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1339194ec02b04cd20ee61935c1790917b6a33 GIT binary patch literal 3673 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