Résolu Sur écrire une fonction personelle
-
Je pensais avoir compris le principe du codage de minecraft avec ce principe de redéfinir les fonctions, mais au final, j’ai du mal comprendre ^^’
Je m’explique (question à la fin) :
J’ai une premier classe JWeapons (Extension de ItemSword). Dans cette classe j’ai définis une nouvelle fonction :
/** * Check Block which can be destroy by special use. * @param block block check * @param pos position of the world check (BlockPos) * @param worldIn actual word * @return Boolean : true if block can be destroy */ public static boolean destructibleBlock(Block block, BlockPos pos, World worldIn) { return false; }
(oui je suis très carré, j’ai documenté mon code, et oui je suis très con, je l’ai documenter en Anglais )
Dans ma classe JScythe (ma premiers sous classe de JWeapons). J’ai redéfinis ma fonction sous la forme suivant :
public static boolean destructibleBlock(Block block, BlockPos pos, World worldIn) { boolean isDestructible = false; if(!block.isAir(worldIn, pos)) { if(block.isReplaceable(worldIn, pos)) { isDestructible = true; } else if (Block.isEqualTo(block, Blocks.fire)) { isDestructible = true; } else if (block instanceof BlockBush) { if(block instanceof BlockCrops) { if(!(((BlockCrops) block).canGrow(worldIn, pos, worldIn.getBlockState(pos), true))) { isDestructible = true; } } else { isDestructible = true; } } } return isDestructible; }
Jusque la pas de problème. Dans cette même classe (JScythe), je fais appel a la fonction suivante un peu plus loin :
JFunction.destroyBlock(playerIn.getPosition(), (int) bonus, worldIn, this, 2, 3);
Cette fonction est la racine de mon problème :
public static void destroyBlock(BlockPos pos, int maxRange, World worldIn, JWeapons itemUse, int minRange, int rangeMultiplier) { int x, z; int posX = pos.getX(); int posY = pos.getY(); int posZ = pos.getZ(); BlockPos temps; Block myBlock; if (maxRange < minRange) { maxRange = minRange; } maxRange *= rangeMultiplier; for (x = 0; x < maxRange; x++) { for (z = 0; z < maxRange - x; z++) { temps = new BlockPos(posX + x, posY, posZ + z); myBlock = worldIn.getBlockState(temps).getBlock(); if(itemUse.destructibleBlock(myBlock, temps, worldIn)) { worldIn.destroyBlock(pos, true); } if(z != 0) { temps = new BlockPos(posX + x, posY, posZ - z); myBlock = worldIn.getBlockState(temps).getBlock(); if(itemUse.destructibleBlock(myBlock, temps, worldIn)) { worldIn.destroyBlock(pos, true); } } if(x != 0) { temps = new BlockPos(posX - x, posY, posZ + z); myBlock = worldIn.getBlockState(temps).getBlock(); if(itemUse.destructibleBlock(myBlock, temps, worldIn)) { worldIn.destroyBlock(pos, true); } if(z != 0) { temps = new BlockPos(posX - x, posY, posZ - z); myBlock = worldIn.getBlockState(temps).getBlock(); if(itemUse.destructibleBlock(myBlock, temps, worldIn)) { worldIn.destroyBlock(pos, true); } } } } // end of for y } // end of for x }
Si vous avez pris le temps de lire, vous aurez remarquer que je fais appel a la fonction “destructibleBlock” Jusqu’à tous a l’heure, cela fonctionnais. C’étais la fonction dans JScythe qui étais utilisé et qui fonctionnais. Mais voila, après avoir tenter un build (et m’être rendu compte que le compilateurs Forge n’acceptais pas les Switch avec String T-T) , ma fonction ne marche plus. Elle refait appel à la fonction contenu dans JWeapons…
Ma question est donc : Ai-je commis une erreur lors d’une modification quelconque qui pourrai expliqué le problème, et surtout, comment je peu fixer le problème ^^’ J’ai beau chercher, je ne vois pas d’ou peu venir
Merci d’avance pour votre aide, et que la caféine soit votre amis
-
C’est ce qu’on appel override une méthode. Et pour faire ça la méthode en question ne doit pas être static. Donc devant destructibleBlock il ne devrait pas avoir static.
-
Ajouter des commentaires est une bonne habitude à prendre, et c’est conseillé de la mettre en anglais, tu n’as rien fait de mal .
Pour le switch : minecraft utilises la version 1.6 de java donc si tu veux utiliser les blocks switch avec des Strings ainsi que toutes les nouvelles fonctionnalités, il faudra rajouter dans la section minecraft de ton build.gradle ces 2 lignes :
"targetCompatibility = ‘1.7’ "
"sourceCompatibility = ‘1.7’ "
(ou avec 1.8 si tu veux utiliser la version 8 de java. Mais attention : certaines personnes utilisent encore java 6 !)Pour la ré-écriture : rajoute l’annotation @Override sur ta classe fille, si eclipse te trouve une erreur, çà veut dire que tu n’as pas mis les bons paramètres ou que ta fonction ne peux pas être ré-écrite, à ce moment fait Alt + shift + S puis “override/implement methods”.
-
Rha mais l’erreur de merddddeeeeee !!! Ça fait 50 fois que j’y passe devant, j’ai même fait la même une erreur similaire en cours
Pour le switch, étant donner que ce n’est pas une fonction destiné a être utilisé tous les 4 matin, j’ai remplacer par un bon vieux if else, j’y perdrai un peu sur l’exécution (encore que), mais uniquement au démarrage du jeu dans le pire des cas.
Bon ducoup je vais profiter de vous avoir sur la main pour vous poser une autre question plus technique : vers qu’elle classe il faut que je me tourne pour animer une entité depuis ma classe d’arme ? Je n’ai pas trouver de fonction très intéressent au niveau des classes d’entités (il faut toujours attendre un tick pour que le joueurs soit uptade, mais a cause de la vitesse d’exécution, seul la dernier modification ce joue)
-
C’est à dire ? Tu veux animer une entité ou une arme ?
-
Animé l’entité porteuse de l’arme pour être exacte. En l’occurance, dans ce cas la, uniquement une rotation à 360, avec un effet sur l’écran type confusion (mais pas celui la, il m’es trop de temps a réagir)
-
IItemRenderer ou event de rendu
-
mouai, bon j’ai rien trouver d’utilisable, je vais me renseigner plus sur le sujet, et au besoin je demanderai peu être un tuto, ou une astuce sur un autre sujet ^^
Merci pour ton aide, et bonne soirée !.. Enfin nuit ^^’