From 52c8e92f334496801219b8de475ec5ae2d3a8f6f Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 1 Nov 2016 20:47:37 +0100 Subject: [PATCH] Re-added the villager and tweaked some dungeon loot --- .../mod/gen/InitVillager.java | 25 ++--- .../mod/gen/JamVillagerTradeHandler.java | 96 ------------------ .../mod/gen/JamVillagerTradeList.java | 45 ++++++++ .../mod/gen/VillageComponentJamHouse.java | 7 ++ .../mod/misc/DungeonLoot.java | 12 +-- .../assets/actuallyadditions/lang/en_US.lang | 3 + .../textures/entity/villager/jamVillager.png | Bin 2214 -> 1916 bytes .../entity/villager/jamVillagerZombie.png | Bin 0 -> 2971 bytes 8 files changed, 74 insertions(+), 114 deletions(-) delete mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeHandler.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeList.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/entity/villager/jamVillagerZombie.png diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/InitVillager.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/InitVillager.java index ddacb3eff..74bc5f53c 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/InitVillager.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/InitVillager.java @@ -11,13 +11,20 @@ package de.ellpeck.actuallyadditions.mod.gen; import de.ellpeck.actuallyadditions.mod.config.values.ConfigBoolValues; +import de.ellpeck.actuallyadditions.mod.items.InitItems; import de.ellpeck.actuallyadditions.mod.util.ModUtil; +import de.ellpeck.actuallyadditions.mod.util.Util; +import net.minecraft.entity.passive.EntityVillager.PriceInfo; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraftforge.fml.common.registry.VillagerRegistry; +import net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerCareer; +import net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession; public final class InitVillager{ - public static final String JAM_HOUSE_CHEST_NAME = ModUtil.MOD_ID+".jamHouseChest"; + public static VillagerProfession jamProfession; public static void init(){ ModUtil.LOGGER.info("Initializing Village Addons..."); @@ -31,19 +38,13 @@ public final class InitVillager{ } private static void initJamVillagePart(){ - //TODO Fix villager - /*int jamID = ConfigIntValues.JAM_VILLAGER_ID.getValue(); - VillagerRegistry.INSTANCE().registerVillagerId(jamID); - VillagerRegistry.INSTANCE().registerVillageTradeHandler(jamID, new JamVillagerTradeHandler()); + jamProfession = new VillagerProfession(ModUtil.MOD_ID+":jamGuy", ModUtil.MOD_ID+":textures/entity/villager/jamVillager.png", ModUtil.MOD_ID+":textures/entity/villager/jamVillagerZombie.png"); + VillagerRegistry.instance().register(jamProfession); - ChestGenHooks jamHouseChest = ChestGenHooks.getInfo(JAM_HOUSE_CHEST_NAME); - jamHouseChest.setMin(5); - jamHouseChest.setMax(10); - for(int i = 0; i < TheJams.values().length; i++){ - ChestGenHooks.addItem(JAM_HOUSE_CHEST_NAME, new WeightedRandomChestContent(new ItemStack(InitItems.itemJams, 1, i), 1, 1, 10)); + VillagerCareer career = new VillagerCareer(jamProfession, ModUtil.MOD_ID+".jammer"); + for(int i = 0; i < 3; i++){ + career.addTrade(i+1, new JamVillagerTradeList()); } - ChestGenHooks.addItem(JAM_HOUSE_CHEST_NAME, new WeightedRandomChestContent(new ItemStack(Items.glass_bottle), 1, 2, 30)); - ChestGenHooks.addItem(JAM_HOUSE_CHEST_NAME, new WeightedRandomChestContent(new ItemStack(Items.potionitem), 1, 1, 20));*/ VillagerRegistry.instance().registerVillageCreationHandler(new VillageJamHouseHandler()); MapGenStructureIO.registerStructureComponent(VillageComponentJamHouse.class, ModUtil.MOD_ID+":jamHouseStructure"); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeHandler.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeHandler.java deleted file mode 100644 index f8f0ab7e6..000000000 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeHandler.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This file ("JamVillagerTradeHandler.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-2016 Ellpeck - */ - -package de.ellpeck.actuallyadditions.mod.gen; - -import de.ellpeck.actuallyadditions.mod.items.InitItems; -import de.ellpeck.actuallyadditions.mod.items.metalists.TheJams; -import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; -import net.minecraft.village.MerchantRecipe; -import net.minecraft.village.MerchantRecipeList; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.Random; - -public class JamVillagerTradeHandler{ - - private final ArrayList trades = new ArrayList(); - - public JamVillagerTradeHandler(){ - this.addWants("ingotGold", 5, 7); - this.addWants("cropWheat", 15, 25); - this.addWants("dustRedstone", 25, 40); - this.addWants(new ItemStack(Items.BUCKET), 5, 9); - this.addWants(new ItemStack(Items.GLASS_BOTTLE), 12, 17); - this.addWants(new ItemStack(Items.POTIONITEM), 1, 1); - this.addWants("ingotIron", 10, 15); - this.addWants("gemDiamond", 1, 2); - this.addWants("dustGlowstone", 12, 22); - } - - public void addWants(String oredictName, int minSize, int maxSize){ - ArrayList stacks = (ArrayList)OreDictionary.getOres(oredictName, false); - this.trades.add(new Trade(stacks, minSize, maxSize)); - } - - public void addWants(ItemStack stack, int minSize, int maxSize){ - this.trades.add(new Trade(stack, minSize, maxSize)); - } - - //@Override - public void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random rand){ - for(int trade = 0; trade < this.trades.size(); trade++){ - for(int want = 0; want < this.trades.get(trade).wants.size(); want++){ - ItemStack wantsOne = this.trades.get(trade).wants.get(want); - wantsOne.stackSize = MathHelper.getRandomIntegerInRange(rand, this.trades.get(trade).minStackSize, this.trades.get(trade).maxStackSize); - - ItemStack wantsTwo = null; - if(rand.nextInt(3) == 0){ - int randomSecondTrade = rand.nextInt(this.trades.size()); - for(int randomSecondWant = 0; randomSecondWant < this.trades.get(randomSecondTrade).wants.size(); randomSecondWant++){ - wantsTwo = this.trades.get(randomSecondTrade).wants.get(randomSecondWant); - wantsTwo.stackSize = MathHelper.getRandomIntegerInRange(rand, this.trades.get(randomSecondTrade).minStackSize, this.trades.get(randomSecondTrade).maxStackSize); - } - } - if(wantsOne == wantsTwo){ - wantsTwo = null; - } - - for(int k = 0; k < TheJams.values().length; k++){ - recipeList.add(new MerchantRecipe(wantsOne, wantsTwo, new ItemStack(InitItems.itemJams, rand.nextInt(3)+1, k))); - } - } - } - } - - public static class Trade{ - - public final ArrayList wants = new ArrayList(); - public final int minStackSize; - public final int maxStackSize; - - public Trade(ArrayList wants, int minStackSize, int maxStackSize){ - this.wants.addAll(wants); - this.minStackSize = minStackSize <= 0 ? 1 : minStackSize; - this.maxStackSize = maxStackSize <= 0 ? 1 : maxStackSize; - } - - public Trade(ItemStack want, int minStackSize, int maxStackSize){ - this.wants.add(want); - this.minStackSize = minStackSize <= 0 ? 1 : minStackSize; - this.maxStackSize = maxStackSize <= 0 ? 1 : maxStackSize; - } - - } -} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeList.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeList.java new file mode 100644 index 000000000..bf084bac1 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/JamVillagerTradeList.java @@ -0,0 +1,45 @@ +/* + * This file ("GenericTrade.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-2016 Ellpeck + */ + +package de.ellpeck.actuallyadditions.mod.gen; + +import de.ellpeck.actuallyadditions.mod.items.InitItems; +import de.ellpeck.actuallyadditions.mod.items.metalists.TheJams; +import net.minecraft.entity.passive.EntityVillager.ITradeList; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.village.MerchantRecipe; +import net.minecraft.village.MerchantRecipeList; + +import java.util.Random; + +public class JamVillagerTradeList implements ITradeList{ + + @Override + public void modifyMerchantRecipeList(MerchantRecipeList recipeList, Random random){ + for(int i = 0; i < random.nextInt(3)+3; i++){ + ItemStack jam = new ItemStack(InitItems.itemJams, 1, random.nextInt(TheJams.values().length)); + ItemStack emerald = new ItemStack(Items.EMERALD); + + if(random.nextFloat() >= 0.65F){ + //Jam as input + jam.stackSize = random.nextInt(3)+1; + emerald.stackSize = random.nextInt(2)+1; + recipeList.add(new MerchantRecipe(jam, emerald)); + } + else{ + //Emeralds as input + jam.stackSize = random.nextInt(4)+2; + emerald.stackSize = random.nextInt(6)+2; + recipeList.add(new MerchantRecipe(emerald, jam)); + } + } + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/VillageComponentJamHouse.java b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/VillageComponentJamHouse.java index f4867c927..0fe89d2b8 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/gen/VillageComponentJamHouse.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/gen/VillageComponentJamHouse.java @@ -19,6 +19,8 @@ import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureVillagePieces; +import net.minecraftforge.fml.common.registry.VillagerRegistry; +import net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession; import java.util.List; import java.util.Random; @@ -195,4 +197,9 @@ public class VillageComponentJamHouse extends StructureVillagePieces.House1{ this.setBlockState(world, Blocks.TORCH.getDefaultState().withProperty(BlockTorch.FACING, EnumFacing.WEST), 8, 3, 2, sbb); this.setBlockState(world, Blocks.TORCH.getDefaultState().withProperty(BlockTorch.FACING, EnumFacing.WEST), 8, 3, 6, sbb); } + + @Override + protected VillagerProfession chooseForgeProfession(int count, VillagerProfession prof){ + return InitVillager.jamProfession; + } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/DungeonLoot.java b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/DungeonLoot.java index d9047b3c1..e9842e6fa 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/DungeonLoot.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/DungeonLoot.java @@ -46,7 +46,7 @@ public class DungeonLoot{ LootPool pool = event.getTable().getPool("main"); if(pool == null){ - pool = new LootPool(new LootEntry[0], noCondition, new RandomValueRange(5, 10), new RandomValueRange(0), "main"); + pool = new LootPool(new LootEntry[0], noCondition, new RandomValueRange(3, 6), new RandomValueRange(0), "main"); event.getTable().addPool(pool); } @@ -83,10 +83,10 @@ public class DungeonLoot{ } else if(JAM_HOUSE.equals(event.getName())){ LootFunction jamDamage = new SetMetadata(noCondition, new RandomValueRange(0, TheJams.values().length-1)); - LootFunction jamAmount = new SetCount(noCondition, new RandomValueRange(1, 8)); + LootFunction jamAmount = new SetCount(noCondition, new RandomValueRange(3, 5)); pool.addEntry(new LootEntryItem(InitItems.itemJams, 2, 0, new LootFunction[]{jamDamage, jamAmount}, noCondition, ModUtil.MOD_ID+":jams")); - LootFunction glassAmount = new SetCount(noCondition, new RandomValueRange(1, 5)); + LootFunction glassAmount = new SetCount(noCondition, new RandomValueRange(2)); pool.addEntry(new LootEntryItem(Items.GLASS_BOTTLE, 1, 0, new LootFunction[]{glassAmount}, noCondition, ModUtil.MOD_ID+":bottles")); } else if(LUSH_CAVES.equals(event.getName())){ @@ -95,10 +95,10 @@ public class DungeonLoot{ addBatWings = true; addCrystals = true; - pool.addEntry(new LootEntryItem(Items.BOOK, 90, 0, new LootFunction[0], noCondition, ModUtil.MOD_ID+":book")); + pool.addEntry(new LootEntryItem(Items.BOOK, 50, 0, new LootFunction[0], noCondition, ModUtil.MOD_ID+":book")); LootFunction bonesAmount = new SetCount(noCondition, new RandomValueRange(1, 12)); - pool.addEntry(new LootEntryItem(Items.BONE, 150, 0, new LootFunction[]{bonesAmount}, noCondition, ModUtil.MOD_ID+":bones")); + pool.addEntry(new LootEntryItem(Items.BONE, 100, 0, new LootFunction[]{bonesAmount}, noCondition, ModUtil.MOD_ID+":bones")); Item[] aiots = new Item[]{InitItems.woodenPaxel, InitItems.stonePaxel, InitItems.quartzPaxel, InitItems.itemPaxelCrystalBlack, InitItems.itemPaxelCrystalWhite}; for(int i = 0; i < aiots.length; i++){ @@ -109,7 +109,7 @@ public class DungeonLoot{ Item[] armor = new Item[]{Items.LEATHER_HELMET, Items.LEATHER_CHESTPLATE, Items.LEATHER_LEGGINGS, Items.LEATHER_BOOTS}; for(int i = 0; i < armor.length; i++){ LootFunction damage = new SetDamage(noCondition, new RandomValueRange(0F, 0.75F)); - pool.addEntry(new LootEntryItem(armor[i], 70, 0, new LootFunction[]{damage}, noCondition, ModUtil.MOD_ID+":armor"+i)); + pool.addEntry(new LootEntryItem(armor[i], 50, 0, new LootFunction[]{damage}, noCondition, ModUtil.MOD_ID+":armor"+i)); } } diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 7fbd9ffac..da7d73a74 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -9,6 +9,9 @@ fluid.actuallyadditions.canolaoil=Canola Oil fluid.actuallyadditions.crystaloil=Crystallized Oil fluid.actuallyadditions.empoweredoil=Empowered Oil +#Entities +entity.Villager.actuallyadditions.jammer=Jam Guy + #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/jamVillager.png b/src/main/resources/assets/actuallyadditions/textures/entity/villager/jamVillager.png index 910912ca69fd4511609ae5ad800cb6fb0bdaf1a5..23025f6a7c373bf81d699233d07261a00a0cf9f6 100644 GIT binary patch delta 1901 zcmV-z2a@=v5&RC2B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ib z000ib0l1NC?EnA(2XskIMF-ym1QanT%ATRW0000PbVXQnQ*UN;cVTj60B~VxZgehg zWpp4kE-)@JFs%v-zyJUS*-1n}RCr$9n$3$GRTRZLCJ+@w1b-LqL`D&^(GUYhf&*re zwFp5nhfU?hZOGWnQ%;Yx7h%D*6+hU^@1l@TVHY|Q^u*6F-o_o+Lts(O05CS@)h z>b-aGeea(0s$TVU&!Eko{C2IV!(VGZWygX1X_~=}lb;pB?`KbpkcM0B*^L{;=Jo4^ zuE6^#tUH59B!33fhg8ICBS4NkZCyoZVPT;H1c=0UDufe$a^*@t1mL=t0*L%86#&AJ z_O^(0DL^E>=K}n>_Tz{s#9x&F5Z`kFoGfi0gG_|{X_}c0!aM^0DD0U4IpUzrpQf4F zL^6_|>m2}r97G^D4(8#9NDfZA3p`(2E5^5YEDX56X@6W-P#2f;=L!P|z#R|;*{wjm z5x{S0wR6vW6LR_Vf#TxWSb$t{w0+Fse#cJz6f8i-$qDNhFBZeorz_A{jDwikE`rbP z{oV*b(Gly*%f;~g`Qq_lurD216&s#8vrPyWzzOHps1<-KIP&p(SrFTl-{#-AdUac2 z!uq94Q-7cEbs`7|5yjB8A^-)&0@aoc{&-1PP+LZBTYi&&GZo_mhG)<2==E0KA#doh z@HuiKKpcz(X!@k54>a=s{mZptKHi{7&#W z;~3YCm6ewQc(Jqr0^I!OXaz0+vAO&<|Hida7=J5rxU@9$hnwNKbCtOu>tl@TIu;;T z7(jp=5TGf)&A(vg>+{>oH&-f#qP zynkOo3Triy%#l}no&xA#`}f|x5jgBP<#kPA(_5DUaGj?BkOzL)2`OxPo3{Y${9Xu< zd*`RH>200@IC;lB1*m%jcnnfly+QQoCm)Wk-+%o@1@4RfZ;yRmoIHG}0>ujQefQPj zZMVP1gqR29J9YfX7_3EK?{tR~mH=)3M1Ol?5S&E-K}F*eAVR?|g4%U?z)3rp&)?@F z$ZhWeH2D+liD}U$g46gN2!J0EbVoS3mZouJzI06vfLxJZJw&+B<{ed2Xh-^t|!V4Rql1aM62k3=9KIDwo1 z{0w4s1l#;7-k)XKDmcPPi7c_?3it&PrY*>q%ATLK5p45E0h~wyYz)4lyQ8(`+TVeMx}qH?%MA-{1AOx3e0jx_^*6<=u|} z?oZP+o5(c^(BSLZL{+y_f0F1|Y5PwN~yB9x4M~ej5 zQHVwXAQXioPcfcLysle)6rhd>1f~&yoEW34`f3Zk6hH@_6W|bR6CmaRaI8s@-~vEsn!JduJ|2Qj1QG(fCLntn#JkV$ n-W|=8a^HFO@L|sc7!3XcWu#%NNdRp(00000NkvXXu0mjfgD8E- delta 2202 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