Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.11.2] [Unsolved] Overriding Village for Compatibility


OrangeVillager61
 Share

Recommended Posts

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 by OrangeVillager61
Link to comment
Share on other sites

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 by OrangeVillager61
Link to comment
Share on other sites

I think you are looking for net.minecraftforge.fml.common.registry.VillagerRegistry.addExtraVillageComponents in 

public static List<StructureVillagePieces.PieceWeight> getStructureVillageWeightedPieceList

Edited by Dylem
Link to comment
Share on other sites

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);

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • How can I create a crop block that is 2 blocks tall? I already have the basic crop code, now I only need to make the crop 2 blocks tall. Any help would be greatly appreciated.
    • Im trying to make an Pixelmon Addon, but it doesn't compile, throws errors. There are no errors in the code and I have all Dependencies jar inside of my Project Structure scoped "Compile". I'm using IntelliJ IDEA 2021.1.3 I get this: error: package com.pixelmonmod.pixelmon.api.events does not exist import com.pixelmonmod.pixelmon.api.events.AggressionEvent; ^ 23 errors :compileJava FAILED   Here is my build.gradle buildscript { repositories { // These repositories are only for Gradle plugins, put any other repositories in the repository block further below maven { url = 'https://maven.minecraftforge.net' } mavenCentral() } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true } } apply plugin: 'net.minecraftforge.gradle' group = 'PixelmonEvents' version = '1.0-SNAPSHOT' java { archivesBaseName = 'PixelmonEvents' toolchain.languageVersion = JavaLanguageVersion.of(8) } minecraft { // The mappings can be changed at any time and must be in the following format. // Channel: Version: // snapshot YYYYMMDD Snapshot are built nightly. // stable # Stables are built at the discretion of the MCP team. // official MCVersion Official field/method names from Mojang mapping files // // You must be aware of the Mojang license when using the 'official' mappings. // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md // // Use non-default mappings at your own risk. They may not always work. // Simply re-run your setup task after changing the mappings to update your workspace. mappings channel: 'stable', version: '39-1.12' // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Default run configurations. // These can be tweaked, removed, or duplicated as needed. runs { client { workingDirectory project.file('run') // Recommended logging data for a userdev environment // The markers can be added/removed as needed separated by commas. // "SCAN": For mods scan. // "REGISTRIES": For firing of registry events. // "REGISTRYDUMP": For getting the contents of all registries. property 'forge.logging.markers', 'REGISTRIES' // Recommended logging level for the console // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' mods { pixelmonevents { source sourceSets.main } } } server { workingDirectory project.file('run') // Recommended logging data for a userdev environment // The markers can be added/removed as needed separated by commas. // "SCAN": For mods scan. // "REGISTRIES": For firing of registry events. // "REGISTRYDUMP": For getting the contents of all registries. property 'forge.logging.markers', 'REGISTRIES' // Recommended logging level for the console // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' mods { pixelmonevents { source sourceSets.main } } } } } // Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } //repositories { // Put repositories for dependencies here // ForgeGradle automatically adds the Forge maven and Maven Central for you // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: //flatDir { //dir 'libs' //} //} dependencies { // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft' it is assumed // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. // The userdev artifact is a special name and will get all sorts of transformations applied to it. minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2860' compile files('libs/Pixelmon-1.12.2-8.3.6-universal.jar', 'Magma.jar', 'Skript.jar') // Real mod deobf dependency examples - these get remapped to your current mappings // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency // Examples using mod jars from ./libs // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") // For more info... // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/dependency_management.html } // Example for how to get properties into the manifest for reading at runtime. jar { manifest { attributes([ "Specification-Title" : "pixelmonevents", //"Specification-Vendor": "pixelmonevents authors", "Specification-Version" : "1", // We are version 1 of ourselves "Implementation-Title" : project.name, "Implementation-Version" : project.jar.archiveVersion, //"Implementation-Vendor": "pixelmonevents authors", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) } } jar.finalizedBy('reobfJar')  
    • What exactly did you download?
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.