Je ferai plutôt une for qui commence à y et qui augmente y jusqu’à trouver de l’aire et de l’herbe. Ensuite tu poses le bloc et tu break
Je n’ai pas vraiment compris.
Sinon, je vais expliquer pourquoi j’ai mis ce code et comment je l’ai interprété :
A l’époque de la 1.7, le code était comme ça et marchait :
package This_is_Halloween.Generation;
import java.util.Random;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;
public class WorldGenPumpkinLantern extends WorldGenerator
{
@Override
public boolean generate(World world, Random random, int x, int y, int z)
{
boolean isAir = world.isAirBlock(x, y , z);
if((world.getBlock(x, y - 1, z) == Blocks.grass && isAir)|| (world.getBlock(x, y - 1, z) == Blocks.dirt && isAir)||(world.getBlock(x, y - 1, z) == Blocks.sand && isAir)||(world.getBlock(x, y - 1, z) == Blocks.stone && isAir)||(world.getBlock(x, y - 1, z) == Blocks.snow && isAir)||(world.getBlock(x, y - 1, z) == Blocks.monster_egg && isAir)||(world.getBlock(x, y - 1, z) == Blocks.cobblestone && isAir)|| (world.getBlock(x, y - 1, z) == Blocks.gravel && isAir)||(world.getBlock(x, y - 1, z) == Blocks.ice && isAir)||(world.getBlock(x, y - 1, z) == Blocks.mycelium && isAir)||(world.getBlock(x, y - 1, z) == Blocks.obsidian && isAir)||(world.getBlock(x, y - 1, z) == Blocks.sandstone && isAir)||(world.getBlock(x, y - 1, z) == Blocks.stonebrick && isAir)||(world.getBlock(x, y - 1, z) == Blocks.monster_egg && isAir)|| (world.getBlock(x, y - 1, z) == Blocks.end_stone && isAir)|| (world.getBlock(x, y - 1, z) == Blocks.netherrack && isAir))
{
world.setBlock(x, y, z, Blocks.lit_pumpkin, 4, 2);
return true;
}
else
{
return false;
}
}
}
Au passage à la 1.8, ça me demandait d’enelever l’Override et de mettre les méthodes non-implémentées (un autre generate, mais à la place de int x, int y, int z mettre BlockPos pos)
J’ai donc modifié la première méthode en remplaçant par BlockPos pos. Mais à l’intérieur de la méthode, les x, y et z n’étaient plus initialisées. J’ai donc passer des jours à réfléchir comment je pourrais faire (j’ai en parralèlle continuer le reste du mod).
j’ai finalement trouvé, et j’ai mis ça : (mon interprétation sera en commentaire)
package This_is_Halloween.Generation;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;
public class WorldGenPumpkinLantern extends WorldGenerator
{
@Override
public boolean generate(World world, Random random, BlockPos pos)
{
for(int x = pos.getX(); x == pos.getX();) //comme le x n'était plus initialisée, je l'ai fait comme ça. Au départ, je comprenait : pour x égale à la postion x qui est égale à x (donc à la postion x (j'étais obligé de faire comme ça, sion erreur))
{
for(int y = pos.getY(); y == pos.getY();) //pareil
{
for(int z = pos.getZ(); z == pos.getZ();) //pareil
{
boolean isAir = world.isAirBlock(new BlockPos(x, y, z));
if((world.getBlockState(new BlockPos(x, y - 1, z)) == Blocks.grass && isAir)) //Ca vérifie si le block à la position était le block "énoncé" (ici de l'herbe) (j'ai enlevé presque tout les blocks par rapport à la 1.7, je les remettrais quand ça remarchera
{
System.out.println("CITROUILLE");
world.setBlockState(new BlockPos(x, y, z), Blocks.lit_pumpkin.getDefaultState()); //Si la condition est vérifié, ça fait spawner une citrouille aux coordonnées données (ici, juste au-dessus de l'herbe). Sinon, ça ne fait rien
return true;
}
else
{
System.out.println("pas citrouille");
return false;
}
}
return false; //Je pensait qu'il faillait mettre un return pour chaque for.
}
return false;//Pareil
}
return false;//Pareil + c'est le return de la méthode
}
}
Moi, j’ai compris comme ça. Mais a ce que j’ai lue au dessus, j’ai mal interprétées certaines choses, nottemment les for.
EDIT : J’ai trouvé, ça remarche. Il suffit d’ajouter (IBlockState) avant le block à vérifier dans la condition et .getDefaultState après. Voilà la classe :
package This_is_Halloween.Generation;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;
public class WorldGenPumpkinLantern extends WorldGenerator
{
@Override
public boolean generate(World world, Random random, BlockPos pos)
{
boolean isAir = world.isAirBlock(new BlockPos(pos.getX(), pos.getY(), pos.getZ()));
if((world.getBlockState(new BlockPos(pos.getX(), pos.getY() - 1, pos.getZ())) == (IBlockState) Blocks.grass.getDefaultState() && isAir))
{
System.out.println("CITROUILLE");
world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.lit_pumpkin.getDefaultState());
return true;
}
else
{
System.out.println("pas citrouille");
return false;
}
}
}
(ligne 23 la modif)