Problème json fence gate
-
Justement ce modèle n’est pas sensé être appelé étant donné que le fichier json dans blockstates ne les appelles pas. Exemple pour la barrière quasi identique qui elle fonctionne très bien :
- La classe -
package mods.emotion.blocks.base; import java.util.List; import mods.emotion.creativeTabs.EmotionTab; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemLead; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class BaseFence extends BaseBlock { public static final PropertyBool NORTH = PropertyBool.create("north"); public static final PropertyBool EAST = PropertyBool.create("east"); public static final PropertyBool SOUTH = PropertyBool.create("south"); public static final PropertyBool WEST = PropertyBool.create("west"); public BaseFence() { super(Material.wood); this.setDefaultState(this.blockState.getBaseState().withProperty(NORTH, Boolean.valueOf(false)).withProperty(EAST, Boolean.valueOf(false)).withProperty(SOUTH, Boolean.valueOf(false)).withProperty(WEST, Boolean.valueOf(false))); this.setHardness(2.0F); this.setResistance(5.0F); this.setStepSound(soundTypeWood); this.setCreativeTab(EmotionTab.EmotionCreativeTab5); } @Override public void addCollisionBoxesToList(World world, BlockPos pos, IBlockState state, AxisAlignedBB mask, List list, Entity collidingEntity) { boolean flag = this.canConnectTo(world, pos.north()); boolean flag1 = this.canConnectTo(world, pos.south()); boolean flag2 = this.canConnectTo(world, pos.west()); boolean flag3 = this.canConnectTo(world, pos.east()); float f = 0.375F; float f1 = 0.625F; float f2 = 0.375F; float f3 = 0.625F; if(flag) { f2 = 0.0F; } if(flag1) { f3 = 1.0F; } if(flag || flag1) { this.setBlockBounds(f, 0.0F, f2, f1, 1.5F, f3); super.addCollisionBoxesToList(world, pos, state, mask, list, collidingEntity); } f2 = 0.375F; f3 = 0.625F; if(flag2) { f = 0.0F; } if(flag3) { f1 = 1.0F; } if(flag2 || flag3 || !flag && !flag1) { this.setBlockBounds(f, 0.0F, f2, f1, 1.5F, f3); super.addCollisionBoxesToList(world, pos, state, mask, list, collidingEntity); } if(flag) { f2 = 0.0F; } if(flag1) { f3 = 1.0F; } this.setBlockBounds(f, 0.0F, f2, f1, 1.0F, f3); } @Override public void setBlockBoundsBasedOnState(IBlockAccess world, BlockPos pos) { boolean flag = this.canConnectTo(world, pos.north()); boolean flag1 = this.canConnectTo(world, pos.south()); boolean flag2 = this.canConnectTo(world, pos.west()); boolean flag3 = this.canConnectTo(world, pos.east()); float f = 0.375F; float f1 = 0.625F; float f2 = 0.375F; float f3 = 0.625F; if(flag) { f2 = 0.0F; } if(flag1) { f3 = 1.0F; } if(flag2) { f = 0.0F; } if(flag3) { f1 = 1.0F; } this.setBlockBounds(f, 0.0F, f2, f1, 1.0F, f3); } @Override public boolean isOpaqueCube() { return false; } @Override public boolean isFullCube() { return false; } @Override public boolean isPassable(IBlockAccess world, BlockPos pos) { return false; } public boolean canConnectTo(IBlockAccess world, BlockPos pos) { Block block = world.getBlockState(pos).getBlock(); return block == Blocks.barrier ? false : ((!(block instanceof BaseFence) || block.getMaterial() != this.blockMaterial) && !(block instanceof BaseFenceGate) ? (block.getMaterial().isOpaque() && block.isFullCube() ? block.getMaterial() != Material.gourd : false) : true); } @SideOnly(Side.CLIENT) @Override public boolean shouldSideBeRendered(IBlockAccess world, BlockPos pos, EnumFacing side) { return true; } @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { return world.isRemote ? true : ItemLead.attachToFence(player, world, pos); } @Override public int getMetaFromState(IBlockState state) { return 0; } @Override public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { return state.withProperty(NORTH, Boolean.valueOf(this.canConnectTo(world, pos.north()))).withProperty(EAST, Boolean.valueOf(this.canConnectTo(world, pos.east()))).withProperty(SOUTH, Boolean.valueOf(this.canConnectTo(world, pos.south()))).withProperty(WEST, Boolean.valueOf(this.canConnectTo(world, pos.west()))); } @Override protected BlockState createBlockState() { return new BlockState(this, new IProperty[] {NORTH, EAST, WEST, SOUTH}); } }- blockstates\atlas_fence.json -
{ "variants": { "east=false,north=false,south=false,west=false": { "model": "emomod:atlas_fence_post" }, "east=false,north=true,south=false,west=false": { "model": "emomod:atlas_fence_n", "uvlock": true }, "east=true,north=false,south=false,west=false": { "model": "emomod:atlas_fence_n", "y": 90, "uvlock": true }, "east=false,north=false,south=true,west=false": { "model": "emomod:atlas_fence_n", "y": 180, "uvlock": true }, "east=false,north=false,south=false,west=true": { "model": "emomod:atlas_fence_n", "y": 270, "uvlock": true }, "east=true,north=true,south=false,west=false": { "model": "emomod:atlas_fence_ne", "uvlock": true }, "east=true,north=false,south=true,west=false": { "model": "emomod:atlas_fence_ne", "y": 90, "uvlock": true }, "east=false,north=false,south=true,west=true": { "model": "emomod:atlas_fence_ne", "y": 180, "uvlock": true }, "east=false,north=true,south=false,west=true": { "model": "emomod:atlas_fence_ne", "y": 270, "uvlock": true }, "east=false,north=true,south=true,west=false": { "model": "emomod:atlas_fence_ns", "uvlock": true }, "east=true,north=false,south=false,west=true": { "model": "emomod:atlas_fence_ns", "y": 90, "uvlock": true }, "east=true,north=true,south=true,west=false": { "model": "emomod:atlas_fence_nse", "uvlock": true }, "east=true,north=false,south=true,west=true": { "model": "emomod:atlas_fence_nse", "y": 90, "uvlock": true }, "east=false,north=true,south=true,west=true": { "model": "emomod:atlas_fence_nse", "y": 180, "uvlock": true }, "east=true,north=true,south=false,west=true": { "model": "emomod:atlas_fence_nse", "y": 270, "uvlock": true }, "east=true,north=true,south=true,west=true": { "model": "emomod:atlas_fence_nsew", "uvlock": true } } }- models\block\atlas_fence_n.json -
{ "parent": "block/fence_n", "textures": { "texture": "emomod:blocks/planks_atlas" } }- models\block\atlas_fence_ne.json -
{ "parent": "block/fence_ne", "textures": { "texture": "emomod:blocks/planks_atlas" } }- models\block\atlas_fence_ns.json -
{ "parent": "block/fence_ns", "textures": { "texture": "emomod:blocks/planks_atlas" } }- models\block\atlas_fence_nse.json -
{ "parent": "block/fence_nse", "textures": { "texture": "emomod:blocks/planks_atlas" } }- models\block\atlas_fence_nsew.json -
{ "parent": "block/fence_nsew", "textures": { "texture": "emomod:blocks/planks_atlas" } }- models\block\atlas_fence_post.json -
{ "parent": "block/fence_post", "textures": { "texture": "emomod:blocks/planks_atlas" } }- models\item\atlas_fence.json -
{ "parent": "emomod:block/atlas_fence_inventory", "display": { "thirdperson": { "rotation": [ 0, 0, 180 ], "translation": [ 0, 1.5, -2.75 ], "scale": [ 0.375, 0.375, 0.375 ] }, "gui": { "rotation": [ 0, 90, 0 ] } } } -
Il cherche le fichier emomod:models/block/coco_fence_gate.json
mais il ne le trouve pas.
Vérifies qu’il existe bien, car dans ce que tu as donné il n’est pas présent. -
Justement c’est ça le probléme, tout comme la barrière, le portillon à lui aussi des states qui ont chacun un modèle (Exemple : modèle au nord, modèle au sud etc…). Normalement c’est le but du fichier json à l’intérieur du dossier blockstates de donner le chemin des modèles mais dans le cas du portillon il ne le fait pas et le jeu me demande donc un modèle “normal” avec comme nom celui du json de blockstates.
-
Ton bloc s’appelle comment ? (ce que tu as mit dans GameRegistry.registerBlock)
-
Le bloc ce nome “atlas_fence_gate” comme le fichier json qui ce trouve dans blockstates, le probléme c’est que si je crée un fichier json “atlas_fence_gate” dans les modèles mon bloc auras toujours celui-ci peut-importe ces states (c’est pour ça que normalement il y a pas ce probléme).
C’est assez difficile à expliquer mais en gros tous mes autres blocs avec des states non pas besoin d’un modèle du même nom étant donné qu’ils ont tous plusieurs modèles (à voir la barrière), sauf que celui-là apparemment me demande un modèle fixe et je pense sérieusement que c’est un probléme au niveau de l’enregistrement des blocs mais j’ai aucune idée pour fixer ce truc…
Ps: Regardez pour la barrière, elle ne demande en aucun cas un fichier json “atlas_fence” vue qu’il n’existe pas et que j’ai aucune erreur.
-
-* Up *-
Apparemment j’ai tester sans ma méthode pour enregistrer les blocs et l’erreur survient quand même, je sais vraiment pas quoi faire…
Surtout que le probléme est présent aussi pour la porte et demie-dalle. -
Sinon envoies-moi un zip / 7z de ton dossier src, je vais faire des tests de mon côté car là je ne vois pas d’où le problème vient.
-
J’ai trouvé le problème.
Dans ton fichier tu as :
“facing=south,in_wall=false,open=false”: { “model”: “emomod:atlas_fence_gate_closed” },
Or il cherche :
[11:18:28] [Client thread/ERROR] [FML]: Model definition for location emomod:atlas_fence_gate#facing=south,in_wall=true,open=true,powered=true not foundAvec powered en plus.
Dans la classe net.minecraft.client.renderer.BlockModelShapes il y a ça :
this.registerBlockWithStateMapper(Blocks.oak_fence_gate, (new StateMap.Builder()).addPropertiesToIgnore(new IProperty[] {BlockFenceGate.POWERED}).build());
Donc voila pourquoi dans le json de Minecraft il n’y a pas ce powered.
Donc soit tu adapte les lignes pour mettre power=true et power=false en plus à chaque fois (donc le fichier sera deux fois plus long)
Soit faut trouver une méthode pour ignorer cette propriété.Édit : trouvé ! Forge ajoute ce qu’il faut :
ModelLoader.setCustomStateMapper(EmotionBlocks.atlasFenceGate, (new StateMap.Builder()).addPropertiesToIgnore(new IProperty[] {BaseFenceGate.POWERED}).build());
Par contre, j’ai essayé de le mettre dans ta méthode registerRenderThings de ton client proxy au début et ça n’a pas fonctionné. Donc j’ai supposé que c’était dû au fait que la méthode ModelLoader.onRegisterAllBlocks était appelé avant l’event FMLInitializationEvent et c’est le cas, il faut donc mettre cette méthode dans la fonction preInit, puis ça fonctionne. (J’ai fait comme ça : @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { // Load All Other Class By Type EmotionTab.mainRegistry(); EmotionBlocks.mainRegistry(); EmotionItems.mainRegistry(); EmotionWorld.mainRegistry(); EmotionEntity.mainRegistry(); EmotionAchievement.mainRegistry(); EnchantManager.mainRegistry(); CraftingManager.mainRegistry(); BiomeRegistry.mainRegistry(); if(event.getSide().isClient()) { ModelLoader.setCustomStateMapper(EmotionBlocks.atlasFenceGate, (new StateMap.Builder()).addPropertiesToIgnore(new IProperty[] {BaseFenceGate.POWERED}).build()); } }Mais tu peux aussi faire un méthode dans ton proxy nommé preInitRender et mettre cette fonction dedans puis appeler proxy.preInitRender(); dans la fonction preInit de ta classe principale.
Par contre attention à ce que les blocs soient initialisés avant de faire cette fonction, sinon EmotionBlocks.atlasFenceGate va être null et donc ça ne va pas fonctionner.Je sens que ces vacance je vais devoir faire un tutoriel complet sur les états de blocs et les rendus avec les jsons car il y en a des choses à dire …
-
Alors déjà merci énormément, ça à due être un gros travaille de recherche cependant pour les imports c’est bien :
import net.minecraftforge.client.model.ModelLoader;
Si oui il me dit :
The method setCustomStateMapper(Block, StateMap) is undefined for the type ModelLoader
Une solution ?
Ps: Je suppose que ça va être la même méthode pour porte et demie-dalle, si oui comment à tu sue que c’était ça le problème ?
-
Oula, si cette méthode n’existe pas c’est que tu utilises une très veille version de Forge : https://github.com/MinecraftForge/MinecraftForge/commit/b8add23d9bc1c225ca0e25a3e3419e6ed89b1879
cette méthode a été ajouté le 4 février. Faut mettre à jour de temps en temps ! -
Alors oui parlons en x) Non j’ai jamais mis à jour depuis le début, j’avais aucun idée qu’il fallait le faire. Je suppose que ça :
http://www.minecraftforgefrance.fr/showthread.php?tid=777
Va mettre utile, merci encore et j’imagine que ça fonctionne alors je passe le sujet en résolue.
-
Tu as juste à modifier la version de Forge dans le build.gradle et refaire un setup.
