Creation d'un arme a distance



  • Bonjour, j'ai actuellement un problème, je ne trouve pas comment faire une arme custom (type arc) mais qui utilisé ces propre munition et ces propre entité(balle), ça fait actuellement plus 1h30 que je testé des truc avec le code de minecraft et de la forge, j'ai regarde en ligne et il y a pas encore de mod de ce type pour s'aidé avec leurs code source.
    Si quelle qu'un a des idée je suis preneurs.

    Au niveau du code j'ai un item qui extend ShootableItem (l'arme), un autre item qui extend Item (la munition) et j'ai aussi une etité qui extend de DamagingProjectileEntity (la balle), et à partir de la je sais plus quoi faire...

    Merci de votre aide en avance. 🙂


  • Moddeurs confirmés Rédacteurs Administrateurs

    Bonsoir,

    Concrètement quels sont les problèmes rencontrés ? L'armure ne tire pas ? Le projectile est invisible ? Le jeu crash ?



  • Euh, déjà le jeux ne se lance pas enfin il dit (Mon mod) encountered an error during the load_registries event phase et je me demande aussi comment on fait pour relié le projectile a l'arme et comment la faire tiré, j'ai lus le code de l'arc et de la crossbow mais c'est asse complexe a comprends et il y a en plus de ça encore du code offusqué.

    j'ai regsiter les entité comme ça et je suis pas sur que se soit le bon truc car j'ai pas encors fait des entité (je me suis inpiré du code mc)..... 😐

    @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents {
        @SubscribeEvent
        public static void onEntityRegistry(final RegistryEvent.Register<EntityType<?>> event) {
            event.getRegistry().register(EntityType.Builder.<SmallFireballEntity>create(SmallFireballEntity::new, EntityClassification.MISC).size(0.3125F, 0.3125F).build("test_bullet"));
        }
    }
    

  • Moddeurs confirmés Rédacteurs Administrateurs

    Il faut le rapport de crash complet.

    Pour les entités, personnellement j'ai ça :

        public static final EntityType<EntityBomberArrow> BOMBER_ARROW = EntityType.Builder.<EntityBomberArrow>create(EntityBomberArrow::new, EntityClassification.MISC).size(0.5F, 0.5F)
                .setShouldReceiveVelocityUpdates(true).setUpdateInterval(2).setTrackingRange(64).setCustomClientFactory((spawnEntity, world) -> new 
    
        @SubscribeEvent
        public static void registerEntity(RegistryEvent.Register<EntityType<?>> event) {
            event.getRegistry().register(BOMBER_ARROW.setRegistryName("bomber_arrow"));
        }
    

    Tu peux garder comme tu as actuellement et utiliser un ObjectHolder (comme montré dans le tutoriel bloc / item 1.13) ça fonctionne aussi. Par contre faut que tu ajoutes les fonctions pour le tracking et le spawn côté client.

    Pour mon item d'arc, j'ai une classe qui hérite de BowItem avec cette fonction :

        @Override
        public void onPlayerStoppedUsing(ItemStack stack, World world, LivingEntity entityLiving, int timeLeft) {
            if(entityLiving instanceof PlayerEntity) {
                PlayerEntity player = (PlayerEntity)entityLiving;
                boolean flag = player.abilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0;
    
                int j = this.getUseDuration(stack) - timeLeft;
                j = ForgeEventFactory.onArrowLoose(stack, world, player, j, true);
    
                if(flag || player.inventory.hasItemStack(new ItemStack(SGItem.BOMBER_ARROW))) {
                    float f = j / 20.0F;
                    f = (f * f + f * 2.0F) / 3.0F;
    
                    if(f < 1.0F) {
                        return;
                    }
    
                    if(f > 1.0F) {
                        f = 1.0F;
                    }
    
                    EntityBomberArrow entityBomberArrow = new EntityBomberArrow(world, player);
                    entityBomberArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, f * 1.0F, 2.0F);
                    stack.damageItem(1, player, p -> {
                        p.sendBreakAnimation(p.getActiveHand());
                    });
                    world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL, 1.0F, 1.0F / (random.nextFloat() * 0.4F + 1.2F) + f + 0.5F);
    
                    int flame = EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack);
                    if(flame > 0) {
                        entityBomberArrow.setFlame(true);
                    }
                    if(!flag) {
                        CommonUtil.consumeItem(player, new ItemStack(SGItem.BOMBER_ARROW));
                    }
    
                    if(!world.isRemote()) {
                        world.addEntity(entityBomberArrow);
                    }
                }
            }
        }
    

    Le but ici est d'ajouter dans le monde l'entité avec joueur qui tire et la puissance en argument du constructeur, ensuite la classe EntityBomberArrow qui hérite de AbstractArrowEntity se charge de tout.


Log in to reply