Non résolu Remplacement de block vanilla
-
Hello !
J’ai pas l’impression qu’il y ai grand monde sur ce forum, ça à l’air mort, peut de réponse mais je tente ma chance quand même.
Je débute en modding minecraft, j’ai plutôt l’habitude de C++ du coup java caca c’est bof ^^'.Le soucis que j’ai est que j’aimerai au final arriver à donner aux escaliers existant la possibilité d’être placé verticalement.
Hors pour y arriver je n’ai pas trouvé de moyen depuis les blockstates d’ajouter une rotation en fonction si le joueur “sneak”.Du coup je me suis tournée sur le fait de remplacer le block vanilla d’escalier par un nouvel escalier qui utilise ma class d’escalier.
Ma class d’escalier fonctionne très bien puisque j’ai créé des escaliers à 4 petites marches, elle gère le faite de poser des escaliers
verticalement si on est en “sneak”.
Le soucis c’est que le jeu me rembarre en me disant que le remplacement vanilla est pas bon car le nouvel objet doit avoir le
même nombre de status et dans le même ordre (FACING, HALF etc …).
Hors moi ma class ajoute 2 states nouvelles car nécessaire justement pour ce placement verticale.
Conclusion pas possible dans ce sens …Du coup je me tourne vers les events afin de détecter quand un joueur pose un block, trigger un event pour cela afin de remplacer
le bloc posé par celui voulu.
Le soucis ici c’est qu’aucun event n’est “fired” et du coup impossible de continuer.Alors l’event pour register les block et item lui fonctionne nickel.
Voici ma class:
package com.plop.cubeplus.common.block; import ... @Mod.EventBusSubscriber(modid = CubePlus.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class CubePlusBlocks { private static final Logger LOGGER = LogManager.getLogger(); public static final EnumProperty<HSide> HSIDE = EnumProperty.create("hside", HSide.class); public static final BooleanProperty SNEAKING = BooleanProperty.create("sneak"); @SubscribeEvent public static void onBlockBreak(final BlockEvent.BreakEvent event) throws IOException { log("[onBlockBreak] Debug 1"); } @SubscribeEvent public static void onPlayerInteract( final PlayerInteractEvent.RightClickItem event) throws IOException { log("[onPlayerInteract] Debug 1"); } @SubscribeEvent public static void onBlockPlace( final BlockEvent.EntityPlaceEvent event) throws IOException { log("[onBlockPlace] Debug 1"); BlockSnapshot block = event.getBlockSnapshot(); BlockState state = event.getPlacedBlock(); World world = event.getEntity().getEntityWorld(); ResourceLocation res = new ResourceLocation("cobblestone_stairs_4steps"); log("[onBlockPlace] Debug 2"); if( state.getBlock() == Blocks.COBBLESTONE_STAIRS ) { log("[onBlockPlace] Debug 3"); BlockState blockstate = Blocks.OAK_STAIRS.getDefaultState().with(FACING, state.get(FACING)).with(HALF, state.get(HALF)).with(WATERLOGGED, state.get(WATERLOGGED)).with(HSIDE, HSide.LEFT).with(SNEAKING, Boolean.FALSE); log("[onBlockPlace] Debug 4"); world.notifyBlockUpdate(block.getPos(), state, blockstate, 3); log("[onBlockPlace] Debug 5"); } } private static void log(String text) throws IOException { String szPath = "debug.txt"; File pFile = new File(szPath); if (pFile.exists() || pFile.createNewFile()) Files.write(Paths.get(szPath), text.getBytes()); LOGGER.info(text); } @ObjectHolder(CubePlus.MOD_ID + ":cobblestone_stairs_4steps") public static final cpStairs COBBLESTONE_STAIRS_4STEPS = new cpStairs(Blocks.COBBLESTONE.getDefaultState(), Block.Properties.create(Material.ROCK)); /*...*/ @SubscribeEvent public static void registerBlock(final RegistryEvent.Register<Block> event) { event.getRegistry().register(COBBLESTONE_STAIRS_4STEPS.setRegistryName("cobblestone_stairs_4steps")); /*...*/ } @SubscribeEvent public static void registerItem(final RegistryEvent.Register<Item> event) { event.getRegistry().register(new BlockItem(COBBLESTONE_STAIRS_4STEPS, new Item.Properties().group(ItemGroup.BUILDING_BLOCKS)).setRegistryName(COBBLESTONE_STAIRS_4STEPS.getRegistryName())); /*...*/ } }
J’ai bien “EventBusSubscriber” sur ma class sinon toute façon registerBlock et registerItem fonctionneraient pas, j’ai bien “@SubscribeEvent” au dessus de mes fonction, elles sont en static, malgré cela, la fonction log qui permet de log dans la console et dans un fichier n’est jamais exécuté …
Du coup je commence à être à court d’idée …
-
Bonjour,
@plop a dit dans Remplacement de block vanilla :
J’ai pas l’impression qu’il y ai grand monde sur ce forum, ça à l’air mort
Ah bon ??? Qu’est ce qui te donne cette impression ?
Il existe deux bus, un spécifique à forge et l’autre au chargeur de mod Java. Actuellement tu écoutes sur le second (
bus = Mod.EventBusSubscriber.Bus.MOD
).
Or sur ce bus seul les événements de registre et de cycle de chargement de mod Java sont déclenché.BlockEvent.BreakEvent, PlayerInteractEvent.RightClickItem et BlockEvent.EntityPlaceEvent sont déclenché sur le bus de Forge.
Je te conseils donc de créer une autre classe qui écoute sur le bus de forge pour y mettre ces événements. -
Et comment on écoute sur le bus forge ?
Ah et concernant mon impression, disons qu’il y a très peu de sujet sur la 1.14, beaucoup de sujet qui date de plus 1 an, des sujets qui n’ont pas de réponse depuis plusieurs mois etc …
-
@EventBusSubscriber(modid = ________.ID, value = {Side.CLIENT})
-
Ah merci, du coup j’ai créé une classe exprès et j’ai mis:
@Mod.EventBusSubscriber(modid = CubePlus.MOD_ID, value = {Dist.CLIENT})
Aytrexois tu avais zapé le Mod. et le Side.CLIENT c’est Dist.CLIENT.
-
Et du coup maintenant, il y a une fonction pour remplacer le block qui doit être placé ?
-
Bon j’ai trouvé la fonction replaceBlock, pour le moment ça fonctionne ‘-’ !
-
@plop a dit dans Remplacement de block vanilla :
Ah et concernant mon impression, disons qu’il y a très peu de sujet sur la 1.14, beaucoup de sujet qui date de plus 1 an, des sujets qui n’ont pas de réponse depuis plusieurs mois etc …
La 1.14 est assez récente, c’est pour ça.
Les sujets sans réponse c’est parce que personne n’a de solution à apporter, malheureusement pour ces cas :/.