Enregistrer des items à la volée [MC 1.12]



  • Bonjour,
    Je souhaite créer de nouveaux record. Jusque là, tout va bien, je peux en créer autant que je veux et modifier de manière simple la musique de chacun. Mon problème, au lancement d'un monde, je ne sais pas combien d'item doivent être créer.
    Existe-t-il un moyen de les créer à la volée ?

    Merci.


  • Administrateurs

    Salut,
    Le moteur n'est pas prévu pour ajouter des items à la volé.

    Par contre ce que tu peux faire sans trop de difficulté, c'est utilisé le tab nbt de l'item, dans celui-ci tu pourra mettre des valeurs à la volés.
    Ensuite tu pourra les utiliser, par exemple pour le nom du cd ou pour avoir le nom de la musique à jouer.



  • Pourrais-tu préciser un peu ? Ou aurais-tu un exemple ?


  • Administrateurs

    Je viens de regarder la classe ItemRecord pour te proposer un exemple, mais visiblement ce que je propose ne va pas non plus.
    Pour le nom du cd pas de soucis vu les arguments de la fonction addInformation. Par contre pour jouer du son cela passer par la fonction getSound qui n'a aucun argument, donc impossible de jouer un son différent en fonction du nbt ou du metadata de l'item 😕



  • J'ai fait un peu de filoutage pour ma class recordItem:

    public class ItemBeatRecord extends ItemRecord {
    	
        private static final Map<SoundEvent, ItemBeatRecord> RECORDS = Maps.<SoundEvent, ItemBeatRecord>newHashMap();
        private static SoundEvent sound ;
        public static final String NAME = "item_beat_record";
        public static final SoundEvent soundIn = new SoundEvent(new ResourceLocation(BeatboxMod.MODID, "default"));
        private final String displayName;
    	
    	public ItemBeatRecord() {
    		super(NAME, soundIn);
    		
    		this.displayName = "item.record." + NAME+ ".desc";
    		BeatboxItems.setItemName(this, NAME);
    		setCreativeTab(CreativeTabs.MISC);
    		setMaxStackSize(1);
    		this.sound = soundIn;
    		RECORDS.put(this.sound, this);
    	}
    	
    	public ItemBeatRecord(String Name, SoundEvent soundOut) {
    		super(Name, soundOut);
    		
    		this.displayName = Name;
    		BeatboxItems.setItemName(this, Name);
    		setCreativeTab(CreativeTabs.MISC);
    		setMaxStackSize(1);
    		this.sound = soundOut;
    		RECORDS.put(this.sound, this);
    		System.out.println("Item registred");
    		BeatboxItems.registerModel(this, 0);
    	}
    	
    	public static void setSound(SoundEvent music) {
    		sound = music;
    	}
    	
    	public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
            IBlockState iblockstate = worldIn.getBlockState(pos);
    
            if (iblockstate.getBlock() == Blocks.JUKEBOX && !((Boolean)iblockstate.getValue(BlockJukebox.HAS_RECORD)).booleanValue())
            {
                if (!worldIn.isRemote)
                {
                    ItemStack itemstack = player.getHeldItem(hand);
                    ((BlockJukebox)Blocks.JUKEBOX).insertRecord(worldIn, pos, iblockstate, itemstack);
                    worldIn.playEvent((EntityPlayer)null, 1010, pos, Item.getIdFromItem(this));
                    itemstack.shrink(1);
                    player.addStat(StatList.RECORD_PLAYED);
                }
    
                return EnumActionResult.SUCCESS;
            }
            else
            {
                return EnumActionResult.PASS;
            }
        }
    	
    	/**
         * allows items to add custom lines of information to the mouseover description
         */
        @SideOnly(Side.CLIENT)
        public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn)
        {
            tooltip.add(this.getRecordNameLocal());
        }
    
        @SideOnly(Side.CLIENT)
        public String getRecordNameLocal()
        {
            return I18n.translateToLocal(this.displayName);
        }
    
        /**
         * Return an item rarity from EnumRarity
         */
        public EnumRarity getRarity(ItemStack stack)
        {
            return EnumRarity.RARE;
        }
    
        @Nullable
        @SideOnly(Side.CLIENT)
        public static ItemBeatRecord getBySound(SoundEvent soundIn)
        {
            return RECORDS.get(soundIn);
        }
    
        @SideOnly(Side.CLIENT)
        public SoundEvent getSound()
        {
            return this.sound;
        }
    
    }
    

    Pour le moment sa fonctionne si sa peut t'aider à visualiser en fonction de ton idée.