Ante-post-scriptum: Robin a déjà répondu, mais je ne vais quand même pas gâcher ce beau pavé ^c^
Bonjour,
Suffit de copier ce qu'il y a dans le code source de Minecraft. Jette un coup d'œil à BlockTNT#explode(World, BlockPos, EntityLivingBase), c'est lui qui fait apparaître l'entité (lorsque la TNT est activée, le bloc se transforme en une entité), il faut je pense que tu créés une nouvelle entité qui hérite d'EntityTNTPrimed et que tu changes la texture de celle-ci.
Comme la méthode est privée, soit tu passes à coups d'
access transformers pour pouvoir l'override, soit tu copy-pasta cette méthode dans la classe de ta TNT, changes l'entité invoquée par la tienne, et tu surcharges toutes les méthodes qui font appel à cette fonction, sinon certaines portions du code vont appeler la méthode parente, pas ce que tu veux.
Ces méthodes ressemblent plus ou moins à :
- #onExplosionDestroy(World, BlockPos, Explosion)
- #explode(World, BlockPos)
- #onBlockActivated(IBlockState, World, BlockPos, EntityPlayer, EnumHand, EnumFacing, float, float, float)
- #onEntityCollision(IBlockState, World, BlockPos, Entity)
Pour le dispenser, tu dois utiliser BlockDispenser#registerDispenseBehavior(IItemProvider, IBehaviorDispenseItem).
Pour la TNT classique, cet appel est fait comme ça :
Code:
BlockDispenser.registerDispenseBehavior(Blocks.TNT, new BehaviorDefaultDispenseItem() {
/**
* Dispense the specified stack, play the dispense sound and spawn particles.
*/
protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) {
World world = source.getWorld();
BlockPos blockpos = source.getBlockPos().offset(source.getBlockState().get(BlockDispenser.FACING));
EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double)blockpos.getX() + 0.5D, (double)blockpos.getY(), (double)blockpos.getZ() + 0.5D, (EntityLivingBase)null);
world.spawnEntity(entitytntprimed);
world.playSound((EntityPlayer)null, entitytntprimed.posX, entitytntprimed.posY, entitytntprimed.posZ, SoundEvents.ENTITY_TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F);
stack.shrink(1);
return stack;
}
});
Comme toujours, il te suffit de copy pasta, en remplaçant l'entité invoquée par la tienne. La fonction est appelée par le Boostrap, après l'enregistrement des blocs donc je pense que tu peux directement appeler la fonction en même temps que tu enregistres tes blocs.
Bon, sinon ton code source fait mal aux yeux ;
- Tu enregistres tes items et tes blocs dans le proxy client. Il fait comment le serveur pour les avoir ? Enregistre-les dans le proxy commun.
- Les classes enregistrement les items, blocs et recipes (init/) utilisent un singleton, public static final ModFoo INSTANCE = new ModFoo(). C'est complètement inutile, il te suffit de déclarer toutes tes variables/méthodes statique. Tu économiseras ainsi une quantité extrêmement négligeable de mémoire et de vitesse, mais cela augmentera le plaisir charnel que te procurera la lecture du code.
- Évite les fonctions qui appellent une autre fonction avec une seule instruction en plus, style migre les évènements liés aux registres dans tes classes qui contiennent tous les éléments, on s'y perd un peu. Faut aller à contre-courant pour trouver d'où sont appelées tes fonctions, je n'imagine pas à quoi ça ressemble dans ta tête.
Par exemple, dans ModBlocks#registerModels(ModelRegistryEvent), tu itères sur tous tes blocs pour n'appeler qu'une fonction qui fait elle-même une ligne. Et quitte à faire un truc tout con, autant exposer son savoir :
Code:
blocks.forEach(this::registerModel);
Bon je m'emporte un peu, n'hésite pas à me dire où je t'ai perdu.
Sur ce 666ème message, cordialement,
ShE3py.