Résolu Problème de swap bloc
-
Bonjour bonjour,
Aujourd’hui j’ai un petit problème, je vous explique. J’étais tranquillement en train de créer une magnifique jardinière, tous fonctionnes à la perfection, les fleurs sont belles, la jardinière de même et les oiseaux chante et cetera…
Quand soudain ! Je lance mon serveur Minecraft, je m’apprête à jouer avec ma copine et pose ma première jardinière, ma fleure s’enlève bien de mon inventaire je la vois bien à l’intérieur mais malheureusement ma copine pas, il me suffit de faire un clique droit sur la jardinière pour comprendre la supercherie, ma fleure était revenue dans mon inventaire et la jardinière était en réalité restée vide ! Pa pa pammm ! Bon trêve de bavarderie passont au rome, bavar au rome. J’ai, dans un premier temps, pensais à une mauvaise synchronisation côté client / serveur j’ai donc essayé à coup de :
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { if(world.isRemote) { return false; } }
Sans succès et même pire, ça bugais encore plus :C Mais au final je me suis rendue compte que ça ne pouvais pas être un problème de synchro étant donné que j’avais déjà créais un buisson qui lui aussi se remplaçais lors d’un clique droit et donc je m’en remet à vous, voilà ma fonction complète :
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { ItemStack itemstack = player.inventory.getCurrentItem(); if(world.isRemote) { return false; } if(world.getBlockState(pos).getBlock() == EmotionBlocks.windowBox && itemstack != null) { Comparable current = state.getValue(FACING); int size = player.getCurrentEquippedItem().stackSize; if(player.getCurrentEquippedItem().getIsItemStackEqual(new ItemStack(Item.getItemFromBlock(EmotionBlocks.baseFlower), size, 5))) { world.setBlockState(pos, EmotionBlocks.windowBoxCentus.getDefaultState().withProperty(FACING, current)); if(!player.capabilities.isCreativeMode && –itemstack.stackSize <= 0) { player.inventory.setInventorySlotContents(player.inventory.currentItem, (ItemStack)null); } } return true; } return false; }
Ah une dernière chose comme vous le constatez pas grand chose ne change par rapport à mon buisson :
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) { if(((Integer)state.getValue(STAGE)).intValue() == 0) { if(state.getValue(VARIANT) == EnumType.BLUEBERRY) { world.setBlockState(pos, EmotionBlocks.baseBush.getStateFromMeta(BaseBerry.EnumType.BLUEBERRY.getMetadata()).withProperty(STAGE, 1), 2); } return true; } return false; }
Merci encore une fois d’avance et surtout merci à jglrxavpok qui m’a déjà bien aidé.
-
if(player.getCurrentEquippedItem().getIsItemStackEqual(new ItemStack(Item.getItemFromBlock(EmotionBlocks.baseFlower), size, 5)))
N’utilise pas la comparaison d’item stack, compare plutôt l’item et le metadata.Et sinon je ne vois pas d’autres problèmes
-
Si tu parle de quelque chose qui ressemblerais à ça :
@Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { ItemStack itemstack = player.inventory.getCurrentItem(); Item stack = player.getCurrentEquippedItem().getItem(); int meta = player.getCurrentEquippedItem().getMetadata(); if(world.isRemote) { return false; } if(world.getBlockState(pos).getBlock() == EmotionBlocks.windowBox && itemstack != null) { Comparable current = state.getValue(FACING); int size = player.getCurrentEquippedItem().stackSize; if(stack == Item.getItemFromBlock(EmotionBlocks.baseFlower) && meta == 5) //5 { world.setBlockState(pos, EmotionBlocks.windowBoxCentus.getDefaultState().withProperty(FACING, current)); if(!player.capabilities.isCreativeMode && –itemstack.stackSize <= 0) { player.inventory.setInventorySlotContents(player.inventory.currentItem, (ItemStack)null); } } return true; } return false; }
Ça ne marche même plus en solo
-
Ajoute des System.out.println(“quelque chose”); au niveau des différentes conditions pour voir où est le problème.
Et les lignes
Item stack = player.getCurrentEquippedItem().getItem();
int meta = player.getCurrentEquippedItem().getMetadata();
Devrait être après la condition stack != null, sinon tu vas te manger un NPE. -
Alors j’ai déplacé les conditions après stack != null et ça fonctionne, pas contre c’est très, très, très bugé je devrais sûrement me pencher d’avantage sur les TilesEntity comme les pots de fleur mais ça m’a l’air assez compliqué, je pense que ce serait beaucoup mieux quand même. Merci à toi en tous cas.
Ps: Une dernière chose, tu saurais pas pourquoi mon bloc fait un peu comme l’enclume par hasard ? En gros dès qu’on le touche on glitch presque à travers
Ps 2: A savoir que j’utilise cette fonction qui est peut-être la cause du problème :
@Override public void setBlockBoundsBasedOnState(IBlockAccess access, BlockPos pos) { IBlockState state = access.getBlockState(pos); Comparable value = state.getValue(FACING); float pixel = 1f / 16f; if(value == EnumFacing.NORTH) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F - pixel * 9, 1.0F - 6 * pixel); } else if(value == EnumFacing.SOUTH) { this.setBlockBounds(0.0F, 0.0F, 6 * pixel, 1.0F, 1.0F - pixel * 9, 1.0F); } else if(value == EnumFacing.EAST) { this.setBlockBounds(6 * pixel, 0.0F, 0.0F, 1.0F, 1.0F - pixel * 9, 1.0F); } else if(value == EnumFacing.WEST) { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F - 6 * pixel, 1.0F - pixel * 9, 1.0F); } }
-
Hum non aucune idée.
-
Pas grave ce doit-être un problème de chez Minecraft, merci beaucoup quand même