MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Remplacement de block vanilla

    Planifier Épinglé Verrouillé Déplacé Non résolu Sans suite
    1.14.4
    8 Messages 3 Publieurs 508 Vues 3 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • plopP Hors-ligne
      plop
      dernière édition par

      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 …

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002R Hors-ligne
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
        dernière édition par isador

        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.

        1 réponse Dernière réponse Répondre Citer 0
        • plopP Hors-ligne
          plop
          dernière édition par plop

          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 …

          robin4002R 1 réponse Dernière réponse Répondre Citer 0
          • AytrexoisA Hors-ligne
            Aytrexois
            dernière édition par isador

            @EventBusSubscriber(modid = ________.ID, value = {Side.CLIENT})
            
            1 réponse Dernière réponse Répondre Citer 0
            • plopP Hors-ligne
              plop
              dernière édition par

              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.

              1 réponse Dernière réponse Répondre Citer 0
              • plopP Hors-ligne
                plop
                dernière édition par

                Et du coup maintenant, il y a une fonction pour remplacer le block qui doit être placé ?

                plopP 1 réponse Dernière réponse Répondre Citer 0
                • plopP Hors-ligne
                  plop @plop
                  dernière édition par

                  Bon j’ai trouvé la fonction replaceBlock, pour le moment ça fonctionne ‘-’ !

                  1 réponse Dernière réponse Répondre Citer 0
                  • robin4002R Hors-ligne
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs @plop
                    dernière édition par

                    @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 :/.

                    1 réponse Dernière réponse Répondre Citer 0
                    • 1 / 1
                    • Premier message
                      Dernier message
                    Design by Woryk
                    ContactMentions Légales

                    MINECRAFT FORGE FRANCE © 2024

                    Powered by NodeBB