Problème Generation Strucutre



  • Bonjour j'ai générer une structure pour mon custom biome mais elle ne s'affiche pas. J'ai mis un System.out.println("Structure add") a la fin du WorldGenCustomStructure pour voir si il la générait vraiment, et le "Structure add" s'affiche bien. J'ai refais la structure en .nbt dans le dossier "structures" mais ca ne marche toujours pas. Voila mes class:

    WorldGenCustomStructure:

    public static final WorldGenStructure ARMOURY = new WorldGenStructure("armoury");
    	
    	@Override
    	public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) 
    	{
    		switch(world.provider.getDimension())
    		{
    		case 2:
    			
    			break;
    			
    		case 1:
    			
    			break;
    			
    		case 0:
    			
    			generateStructure(ARMOURY, world, random, chunkX, chunkZ, 20, ModBlocks.SEDIMENT_STONE, BiomeCobalte.class);
    			
    			break;
    			
    		case -1:
    			
    		}
    	}
    	
    	private void generateStructure(WorldGenerator generator, World world, Random random, int chunkX, int chunkZ, int chance, Block topBlock, Class<?>... classes)
    	{
    		ArrayList<Class<?>> classesList = new ArrayList<Class<?>>(Arrays.asList(classes));
    		
    		int x = (chunkX * 16) + random.nextInt(15);
    		int z = (chunkZ * 16) + random.nextInt(15);
    		int y = calculateGenerationHeight(world, x, z, topBlock);
    		BlockPos pos = new BlockPos(x,y,z);
    		
    		Class<?> biome = world.provider.getBiomeForCoords(pos).getClass();
    		
    		if(world.getWorldType() != WorldType.FLAT)
    		{
    			if(classesList.contains(biome))
    			{
    				if(random.nextInt(chance) == 0)
    				{
    					generator.generate(world, random, pos);
    				}
    			}
    		}
    		System.out.println("Structure add");
    	}
    	
    	private static int calculateGenerationHeight(World world, int x, int z, Block topBlock)
    	{
    		int y = world.getHeight();
    		boolean foundGround = false;
    		
    		while(!foundGround && y-- >= 0)
    		{
    			Block block = world.getBlockState(new BlockPos(x,y,z)).getBlock();
    			foundGround = block == topBlock;
    		}
    		
    		return y;
    	}
    

    WorldGenStructure:

    public abstract class WorldGenStructure extends WorldGenerator implements IStructure
    {
    	public static String structureName;
    	
    	public WorldGenStructure(String name) 
    	{
    		this.structureName = name;
    	}
    	
    	@Override
    	public boolean generate(World worldIn, Random rand, BlockPos position) 
    	{
    		this.generateStructure(worldIn, position);
    		return true;
    	}
    	
    	public static void generateStructure(World world, BlockPos pos)
    	{
    		MinecraftServer mcServer = world.getMinecraftServer();
    		TemplateManager manager = worldServer.getStructureTemplateManager();
    		ResourceLocation location = new ResourceLocation(refs.MODID, structureName);
    		Template template = manager.get(mcServer, location);
    		
    		if(template != null)
    		{
    			IBlockState state = world.getBlockState(pos);
    			world.notifyBlockUpdate(pos, state, state, 3);
    			template.addBlocksToWorldChunk(world, pos, settings);
    		}
    	}
    @Override
    	public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,
    			IChunkProvider chunkProvider) {
    		// TODO Auto-generated method stub
    		
    	}
    
    
    }
    

    IStructure

    package fr.gregoirelpv.gmv1.utils;
    
    import java.util.Random;
    
    import net.minecraft.util.Mirror;
    import net.minecraft.util.Rotation;
    import net.minecraft.world.World;
    import net.minecraft.world.WorldServer;
    import net.minecraft.world.chunk.IChunkProvider;
    import net.minecraft.world.gen.IChunkGenerator;
    import net.minecraft.world.gen.structure.template.PlacementSettings;
    import net.minecraftforge.fml.common.FMLCommonHandler;
    
    public interface IStructure {
    	public static final WorldServer worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().getWorld(0);
    	public static final PlacementSettings settings = (new PlacementSettings()).setChunk(null).setIgnoreEntities(false).setIgnoreStructureBlock(false).setMirror(Mirror.NONE).setRotation(Rotation.NONE);
    	void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,
    			IChunkProvider chunkProvider);
    }
    
    

    Voila avec ca la structure ne 'affiche pas

    Merci


  • Moddeurs confirmés Rédacteurs Administrateurs

    Non, ça me semble bon, sur un de mes mods j'utilise juste addBlocksToWorldChunk comme toi.

    Ton fichier armoury.nbt se trouve où ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Salut,

    Ton System.out.println("Structure add"); n'est pas au bon endroit pour vérifier la génération, il aurait fallu le mettre au même niveau que generator.generate(world, random, pos);
    à mon avis une des deux conditions ne passent pas.

    (au passage je ne comprends pas l'intérêt de ton interface IStructure, dont tu ne semble pas utiliser la fonction generate).



  • Apres avoir mis le System.out.printl(); après le generator.generate, la console m'indique bien le message. De plus je remarque que le message reapparait dans la console a chaque fois que je me déplace, signe que la structure se génère bien. Je pense que c'est un pb avec le .nbt, il y a t il autre chose à faire avec ce fichier ?

    Voici la structure :

    Structure.png


  • Moddeurs confirmés Rédacteurs Administrateurs

    Non, ça me semble bon, sur un de mes mods j'utilise juste addBlocksToWorldChunk comme toi.

    Ton fichier armoury.nbt se trouve où ?



  • Dans assets.modid.structures et structures avec un S a la fin



  • OKKKKKKKKKKK autant pour moi j'avais appeler le dossier "stuctures" au lieux de structures, comme quoi, les erreurs sont souvent extrêmement bête


Log in to reply