OrangeVillager61 Posted June 23, 2017 Share Posted June 23, 2017 (edited) My mod overrides vanilla villages in order to add many changes to them and for them to go in different biomes. With some assistance from the forum helpers I was able to override the vanilla villages by having a new village file with a new village structures and then overrding the original villages with setting a new gen on InitMapGenEvent. However, this prevents villages and village buildings from other mods from spawning which is a serious issue. How do I override village structures and VILLAGE_SPAWN_BIOMES without overriding village stuff from other mods. (BTW, I'm very very bad with reflecting) The actual act of changing the village gen: public class ChangeVillageGeneration { @SubscribeEvent public void changeVillageGen (InitMapGenEvent event) { if (event.getType() != null && event.getType() == EventType.VILLAGE){ IvMapGenVillage newGen = new IvMapGenVillage(); event.setNewGen(newGen); } } } Current Reflector: ublic class Reflector { public static Object reflectMethod1(List<VillageStructures.PieceWeight> list, Random random, int size){ Class reflectClass = net.minecraftforge.fml.common.registry.VillagerRegistry.class; Method method; try { method = reflectClass.getMethod("addExtraVillageComponents", VillageStructures.PieceWeight.class, Random.class, int.class); Object returnValue = method.invoke(null, list, random, size); return returnValue; } catch (NoSuchMethodException e) { // TODO Auto-generated catch block //e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static Village reflectMethod2(VillageStructures.Start start, VillageStructures.PieceWeight weight, List<StructureComponent> structureComponents, Random rand, int structureMinX, int structureMinY, int structureMinZ, EnumFacing facing, int componentType){ Class reflectClass = net.minecraftforge.fml.common.registry.VillagerRegistry.class; Method method; try { method = reflectClass.getMethod("getVillageComponent", List.class, VillageStructures.Start.class, VillageStructures.PieceWeight.class, StructureComponent.class, Random.class, int.class, EnumFacing.class); Object returnValue = method.invoke(null, weight, start , structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); Village returnObj = (Village) returnValue; return returnObj; } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } { return null; } } } Edited June 24, 2017 by OrangeVillager61 Quote Link to comment Share on other sites More sharing options...
OrangeVillager61 Posted June 25, 2017 Author Share Posted June 25, 2017 (edited) The Village Gen file: public class IvMapGenVillage extends MapGenVillage { private final static List<Biome> VILLAGE_SPAWN_BIOMES = Arrays.<Biome>asList(new Biome[] {Biomes.SAVANNA_PLATEAU, Biomes.PLAINS, Biomes.DESERT, Biomes.SAVANNA, Biomes.FOREST, Biomes.FOREST_HILLS, Biomes.TAIGA, Biomes.TAIGA_HILLS, Biomes.REDWOOD_TAIGA, Biomes.REDWOOD_TAIGA_HILLS, Biomes.MESA, Biomes.MESA_ROCK, Biomes.MESA_CLEAR_ROCK}); /** None */ private int size; private int distance; protected boolean isMetropolis; public Random r = new Random(); private final int minTownSeparation; public IvMapGenVillage() { this.distance = Config.VillageDistance; this.minTownSeparation = 4; this.isMetropolis = true; if (r.nextInt(20) + 1 == 2 && Config.enable_Metro){ this.isMetropolis = true; } } public IvMapGenVillage(Map<String, String> map) { this(); for (Entry<String, String> entry : map.entrySet()) { if (((String)entry.getKey()).equals("size")) { this.size = MathHelper.getInt((String)entry.getValue(), this.size, 0); } else if (((String)entry.getKey()).equals("distance")) { this.distance = MathHelper.getInt((String)entry.getValue(), this.distance, 9); } } } public String getStructureName() { return "Village"; } protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ) { int i = chunkX; int j = chunkZ; if (chunkX < 0) { chunkX -= this.distance - 1; } if (chunkZ < 0) { chunkZ -= this.distance - 1; } int k = chunkX / this.distance; int l = chunkZ / this.distance; Random random = this.world.setRandomSeed(k, l, 10387312); k = k * this.distance; l = l * this.distance; k = k + random.nextInt(this.distance/2); l = l + random.nextInt(this.distance/2); if (i == k && j == l) { boolean flag = this.world.getBiomeProvider().areBiomesViable(i * 16 + 8, j * 16 + 8, 0, VILLAGE_SPAWN_BIOMES); if (flag) { return true; } } return false; } public BlockPos getClosestStrongholdPos(World worldIn, BlockPos pos, boolean p_180706_3_) { this.world = worldIn; return findNearestStructurePosBySpacing(worldIn, this, pos, this.distance, 8, 10387312, false, 100, p_180706_3_); } protected StructureStart getStructureStart(int chunkX, int chunkZ) { if (this.isMetropolis) { this.size = r.nextInt(1) + 4; } return new IvMapGenVillage.Start(this.world, this.rand, chunkX, chunkZ, this.size, this.isMetropolis); } public static class Start extends StructureStart { /** well ... thats what it does */ private boolean hasMoreThanTwoComponents; public Start() { } public Start(World worldIn, Random rand, int x, int z, int size, boolean isMetro) { super(x, z); MapGenStructureIO.registerStructure(Start.class, "Village"); List<VillageStructures.PieceWeight> list = VillageStructures.getStructureVillageWeightedPieceList(rand, size); VillageStructures.Start structurevillagepieces$start = new VillageStructures.Start(worldIn.getBiomeProvider(), 0, rand, (x << 4) + 2, (z << 4) + 2, list, size, isMetro); this.components.add(structurevillagepieces$start); structurevillagepieces$start.buildComponent(structurevillagepieces$start, this.components, rand); List<StructureComponent> list1 = structurevillagepieces$start.pendingRoads; List<StructureComponent> list2 = structurevillagepieces$start.pendingHouses; while (!list1.isEmpty() || !list2.isEmpty()) { if (list1.isEmpty()) { int i = rand.nextInt(list2.size()); StructureComponent structurecomponent = (StructureComponent)list2.remove(i); structurecomponent.buildComponent(structurevillagepieces$start, this.components, rand); } else { int j = rand.nextInt(list1.size()); StructureComponent structurecomponent2 = (StructureComponent)list1.remove(j); structurecomponent2.buildComponent(structurevillagepieces$start, this.components, rand); } } this.updateBoundingBox(); int k = 0; for (StructureComponent structurecomponent1 : this.components) { if (!(structurecomponent1 instanceof VillageStructures.Road)) { ++k; } } this.hasMoreThanTwoComponents = k > 2; } /** * currently only defined for Villages, returns true if Village has more than 2 non-road components */ public boolean isSizeableStructure() { return this.hasMoreThanTwoComponents; } public void writeToNBT(NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); tagCompound.setBoolean("Valid", this.hasMoreThanTwoComponents); } public void readFromNBT(NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); this.hasMoreThanTwoComponents = tagCompound.getBoolean("Valid"); } } } Edited June 25, 2017 by OrangeVillager61 Quote Link to comment Share on other sites More sharing options...
OrangeVillager61 Posted June 27, 2017 Author Share Posted June 27, 2017 Where the generation is actually initialized: @EventHandler public void preInit(FMLPreInitializationEvent e) { if (Config.enableVillages){ MinecraftForge.TERRAIN_GEN_BUS.register(new ChangeVillageGeneration()); } } Quote Link to comment Share on other sites More sharing options...
Dylem Posted June 27, 2017 Share Posted June 27, 2017 (edited) I think you are looking for net.minecraftforge.fml.common.registry.VillagerRegistry.addExtraVillageComponents in public static List<StructureVillagePieces.PieceWeight> getStructureVillageWeightedPieceList Edited June 27, 2017 by Dylem Quote Link to comment Share on other sites More sharing options...
OrangeVillager61 Posted July 2, 2017 Author Share Posted July 2, 2017 On 6/26/2017 at 10:10 PM, Dylem said: I think you are looking for net.minecraftforge.fml.common.registry.VillagerRegistry.addExtraVillageComponents in public static List<StructureVillagePieces.PieceWeight> getStructureVillageWeightedPieceList What do you mean by that? Quote Link to comment Share on other sites More sharing options...
Dylem Posted July 3, 2017 Share Posted July 3, 2017 3 hours ago, OrangeVillager61 said: What do you mean by that? Well, I assume that your function : VillageStructures.getStructureVillageWeightedPieceList(rand, size) function doesn't have the line : net.minecraftforge.fml.common.registry.VillagerRegistry.addExtraVillageComponents(list, random, size); Quote Link to comment Share on other sites More sharing options...
OrangeVillager61 Posted July 3, 2017 Author Share Posted July 3, 2017 I think I do as reflectMethod2 is the method you are talking about: private static VillageStructures.Village findAndCreateComponentFactory(VillageStructures.Start start, VillageStructures.PieceWeight weight, List<StructureComponent> structureComponents, Random rand, int structureMinX, int structureMinY, int structureMinZ, EnumFacing facing, int componentType) { Class <? extends VillageStructures.Village > oclass = weight.villagePieceClass; VillageStructures.Village structurevillagepieces$village = null; if (oclass == VillageStructures.House4Garden.class) { structurevillagepieces$village = VillageStructures.House4Garden.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.Church.class) { structurevillagepieces$village = VillageStructures.Church.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.House1.class) { structurevillagepieces$village = VillageStructures.House1.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.WoodHut.class) { structurevillagepieces$village = VillageStructures.WoodHut.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.Hall.class) { structurevillagepieces$village = VillageStructures.Hall.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.Field1.class) { structurevillagepieces$village = VillageStructures.Field1.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.Field2.class) { structurevillagepieces$village = VillageStructures.Field2.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.House2.class) { structurevillagepieces$village = VillageStructures.House2.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else if (oclass == VillageStructures.House3.class) { structurevillagepieces$village = VillageStructures.House3.createPiece(start, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } else { structurevillagepieces$village = Reflector.reflectMethod2(start, weight, structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); } return structurevillagepieces$village; } public static Village reflectMethod2(VillageStructures.Start start, VillageStructures.PieceWeight weight, List<StructureComponent> structureComponents, Random rand, int structureMinX, int structureMinY, int structureMinZ, EnumFacing facing, int componentType){ Class reflectClass = net.minecraftforge.fml.common.registry.VillagerRegistry.class; Method method; try { method = reflectClass.getMethod("getVillageComponent", List.class, VillageStructures.Start.class, VillageStructures.PieceWeight.class, StructureComponent.class, Random.class, int.class, EnumFacing.class); Object returnValue = method.invoke(null, weight, start , structureComponents, rand, structureMinX, structureMinY, structureMinZ, facing, componentType); Village returnObj = (Village) returnValue; return returnObj; } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } { return null; } } It may not work like that since I'm pretty bad with reflectors. Quote Link to comment Share on other sites More sharing options...
OrangeVillager61 Posted July 10, 2017 Author Share Posted July 10, 2017 Is there an issue or? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.