Jump to content

onVoid

Members
  • Posts

    48
  • Joined

  • Last visited

Posts posted by onVoid

  1. Are there mappings for parameter names yet? Or does every modder just have to deal with typing in an auto-generated string when referencing a parameter.

    For example:

    pizza.PNG.930491ff3f04c67fa7bf1377e5149e7d.PNG

    Is there a solution to this that I am not privy to? If so please enlighten me.

  2. 1 hour ago, diesieben07 said:

    Those are not your variants. Your block has a single property called variant with values default, glassless and intricate. Therefor your variants are variant=default, variant=glassless and variant=intricate. The log should indicate this to you, please read it.

     

    Moreover, block metadata is gone in 1.13.x. I recommend to flatten your blocks already (i.e. use different blocks instead of one block with variant) to ease future updating.

    You're right. I've changed it now. Solved.

  3. 6 hours ago, Cadiboo said:

    you need to define all your variants in your block state. The variants can point to whatever models you want

    I have edited my light_elemental.json (in blockstates) to this:

    {
        "variants": {
            "default": { "model": "adjunct:light_elemental" },
            "glassless": { "model": "adjunct:light_elemental_glassless" },
            "intricate": { "model": "adjunct:light_elemental_intricate" }
        }
    }

    yet the issue persists.

  4. Aight. I've got this block, BlockElementalLight. It's pretty simple, it lights up.

    Now, I've decided the block should be chiselable, meaning I need to create variants of the block to house the different textures.

    The fruits of my labors are as shown:

    2019-06-29_03_41_09.thumb.png.2a7428cf2650ab8d108d4f7276c19384.png

    item textures working, but not the block ones.

    I based my code, and my json files, off of the vanilla code for dirt (dirt, coarse, podzol). I'd like to know what I can do to fix this. Relevant code is below.

    BlockElementalLight.java

    ItemBlockElementalLight.java

    CommonProxy.java (I guess CommonProxies are a bad thing to have... oh well)

    Blocks class

    Edit: Error Logs

    My json files follow the vanilla format so there is a separate blockstate, item model, and block model for each variant.

    (they are each the same, except have the _glassless or _intricate suffix for those specific ones)

    Here are the samples:

    blockstates/light_elemental.json

    {
        "variants": {
            "normal": { "model": "adjunct:light_elemental" }
        }
    }

    models/block/light_elemental.json

    {
        "parent": "block/cube_all",
        "textures": {
            "all": "adjunct:blocks/light_elemental"
        }
    }

    models/item/light_elemental.json

    {"parent": "adjunct:block/light_elemental"}

     

    Also, to make this post EVEN longer, you know how I said I wanted these to be chiselable. Well, the whole chisel thing isn't working properly.

    I have this (addVariations) function being ran from my init event.

    	public static void addVariations(){
    		addVariation("light_elemental", BlocksAdjunct.lightElemental, 0);
    		addVariation("light_elemental", BlocksAdjunct.lightElemental, 1);
    		addVariation("light_elemental", BlocksAdjunct.lightElemental, 2);
    	}
    	
    	public static void addVariation(String group, Block block, int meta){
    		NBTTagCompound tag = new NBTTagCompound();
    		tag.setString("group", group);
    		tag.setString("block", block.getRegistryName().toString());
    		tag.setInteger("meta", meta);
    		FMLInterModComms.sendMessage("chisel", "add_variation", tag);
    	}

    It seems to register the 0 metadata block as one that can enter the chisel, but it doesn't do the same for the 1 and 2 metadata blocks. When I replace the 1 and 2 metadata blocks with vanilla ones, the chiseling works flawlessly. Any help is appreciated.

     

    Thanks.

  5. Alright, I have a block that I am trying to mimic glowstone with. The problem is, the block always has the sound of stone when it breaks and not the glass sound that I want (and I assume this is due to the material of the block not being set).

     

    Here is my block's class:

    public class BlockElementalLight extends BlockBase
    {
    
        public BlockElementalLight() {
    		super("light_elemental", Material.GLASS);
    		setHardness(0.3F);
    		setResistance(1.5F);
    		setLightLevel(1.0F);
    	}
    
    	public int quantityDroppedWithBonus(int fortune, Random random)
        {
            return MathHelper.clamp(this.quantityDropped(random) + random.nextInt(fortune + 1), 1, 4);
        }
    
        public int quantityDropped(Random random)
        {
            return 2 + random.nextInt(3);
        }
    
        public Item getItemDropped(IBlockState state, Random rand, int fortune)
        {
            return ItemsAdjunct.dustElementalMixture;
        }
    
        public MapColor getMapColor(IBlockState state, IBlockAccess worldIn, BlockPos pos)
        {
            return MapColor.ORANGE_STAINED_HARDENED_CLAY;
        }
    }

    Here is the BlockBase class:

    public class BlockBase extends Block implements IHasModel {
    	
    	public BlockBase(String name, Material material) {
    		super(material);
    		setUnlocalizedName(name);
    		setRegistryName(name);
    		setCreativeTab(CreativeTabsAdjunct.tabAdjunct);
    	}
    	
        @SideOnly(Side.CLIENT)
        public void initModel() {
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory"));
        }
    
    }

    And here's my blocks class where this is registered

    public class BlocksAdjunct {
    	
    	@GameRegistry.ObjectHolder("adjunct:light_elemental")
    	public static BlockElementalLight lightElemental;
    	
        @SideOnly(Side.CLIENT)
        public static void initModels() {
            lightElemental.initModel();
        }
    	
    }

    Thanks.

  6. 30 minutes ago, V0idWa1k3r said:

    In java everything that is an instance of Object is a reference-type. So, for example if you have this code

    
    class Foo
    {
    	public int i = 0;
    }
    
    class Main
    {
    	static void main(string[] args)
    	{
    		Foo foo = new Foo();
    		foo.i = 1;
    		doStuff(foo);
    		System.out.println(foo.i);
    	}
    
    	static void doStuff(Foo foo)
    	{
    		++foo.i;
    	}
    }

    then the statement being printed into console will be 2. This is basic java.

    So you have a Map<String, ItemStack[]>(your map is slightly different but effectively it's the same). Then in your drop class you get an ItemStack from said map and drop it to the player. Now the player has that ItemStack, but it is also still in your map. Thus every modification the player's inventory now does to that ItemStack is also applied to the one inside the map(because they are the same object). So if the player increases the stacksize of your itemstack by 1(say by picking it up) your map now contains the itemstack with the size of 2 and when it is dropped it will have a quantity of 2. Which when the player picks it up will become 4 and so on.

    Basically use ItemStack#copy(or it may be called clone, don't remember and can't look it up rn) to create a copy of the itemstack in your map.

     

    Unrelated issues:

    Don't construct a new Random instance every time, there is no reason to do that.

    Thanks for the help, realizing that objects are universal is something that has tripped me up a few times in Java.

  7. Alright, so I have an item where when I break a block, the drop is changed based on a recipe system I have going.

    The class where the recipes are added is here (yes I know it's ugly, I'll work on it):

    	public static HashMap<String, ArrayList<Object>> blocks = new HashMap<String, ArrayList<Object>>();
    	
    	public static void addRecipe(String block, HashMap<Object, Integer> drops){
    		ArrayList<Object> temp = new ArrayList<Object>();
    		for (Object i : drops.keySet()){
    			int x = drops.get(i);
    			for (int y = 0; y < x; y++){
    				temp.add(i);
    			}
    		}
    		blocks.put(block, new ArrayList<Object>(temp));
    		temp.clear();
    		return;
    	}
    	
    	public static void addRecipe(String block, Object drop){
    		ArrayList<Object> temp = new ArrayList<Object>();
    		temp.add(drop);
    		blocks.put(block, new ArrayList<Object>(temp));
    		temp.clear();
    		return;
    	}
    	
    	public static ArrayList<Object> getDrop(String block, EntityPlayer player){
    		return blocks.get(block);
    	}
    	
    	public static void init(){
    		//LOG
    		HashMap<Object, Integer> LOG = new HashMap<Object, Integer>();{
    		LOG.put("block", 39);
    		LOG.put(new ItemStack(Items.STICK), 45);
    		LOG.put(new ItemStack(ItemsAdjunct.petrifiedWood, 1, 2), 8);
    		LOG.put(new ItemStack(ItemsAdjunct.petrifiedWood, 1, 1), 4);
    		LOG.put(new ItemStack(ItemsAdjunct.petrifiedWood, 1, 0), 4);
    		}
    		addRecipe("logWood", LOG);
    		
    		//LEAVES
    		HashMap<Object, Integer> LEAVES = new HashMap<Object, Integer>();{
    		LEAVES.put(null, 17);
    		LEAVES.put(new ItemStack(ItemsAdjunct.leafDry, 1), 2);
    		LEAVES.put(new ItemStack(ItemsAdjunct.leaf, 1), 1);
    		}
    		addRecipe("treeLeaves", LEAVES);
    		
    		addRecipe("dirt", new ItemStack(Blocks.GOLD_BLOCK, 1));
    	}

    The drop is calculated in the tool class, as a method ran from onBlockStartBreak, and that method is here:

    	public static void calculateDrop(ItemStack itemstack, BlockPos pos, net.minecraft.entity.player.EntityPlayer player){
            IBlockState bs = player.getEntityWorld().getBlockState(pos);
            Block block = bs.getBlock();
            int[] blockIDs = OreDictionary.getOreIDs(new ItemStack(Item.getItemFromBlock(block), 1, block.damageDropped(bs)));
            ArrayList<String> blockNAMEs = new ArrayList<String>();
            for (int id : blockIDs){
            	blockNAMEs.add(OreDictionary.getOreName(id));
            }
            Random rand = new java.util.Random();
            ItemStack drop = ItemStack.EMPTY;
            	for (String name : blockNAMEs){
    	            if (Pruner.blocks.keySet().contains(name)){
    	            	player.getEntityWorld().setBlockToAir(pos);
    	            	int outOf = Pruner.getDrop(name, player).size();
    	            	Object j = Pruner.getDrop(name, player).get(rand.nextInt(outOf));
    	            	if (j instanceof ItemStack){
    	            		drop = (ItemStack)j;
    		            	break;
    	            	} else if (j instanceof String){
    	            		if (((String)j).equals("block")){
    	            			drop = new ItemStack (block.getItemDropped(bs, new Random(), block.damageDropped(bs)), 1, block.damageDropped(bs));
    	    	            	break;
    	            		}
    	            	}
    	            }
            	}
                //
                if (!drop.isEmpty()){
    		        float f = 0.7F;
    		        double d  = (double)(rand.nextFloat() * f) + (double)(1.0F - f) * 0.2D;
    		        double d2 = (double)(rand.nextFloat() * f) + (double)(1.0F - f) * 0.2D;
    		        net.minecraft.entity.item.EntityItem entityitem = new net.minecraft.entity.item.EntityItem(player.getEntityWorld(), (double)pos.getX() + d, (double)pos.getY(), (double)pos.getZ() + d2, drop);
    		        entityitem.setDefaultPickupDelay();
    		        player.getEntityWorld().spawnEntity(entityitem);
    		        return;
                }
    	}

    Now, the issue I am having is that when I break the block that I am using to test (dirt block), at first I receive a single gold block like I am supposed to. But, as I keep breaking more, the amount that drops keeps doubling (I've done some bug testing, and it seems that the actual ItemStack inside of my blocks map is being edited. Now, the only time this map is mentioned in my mod (besides in contains, get, or keySet) is in the class I gave.

    Also, init(), in the recipe class, is ran from my main class' FMLInitializationEvent only.

     

    Help would be much appreciated, thanks.

  8. Just tried it, works just fine with just

    destroyBlock

    :

     

    Mine's done on right click, if that changes anything.

       
    public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
            if (!worldIn.isRemote) {
            	int dir = MathHelper.floor_double((double)((playerIn.rotationYaw * 4F) / 360F) + 0.5D) & 3;
        		if (dir == 0){
            	for (int i = 0; i < 2; i++){
            			if (worldIn.getBlockState(pos.add(0, 0, i)).getBlock().equals(Blocks.STONE)){
            			worldIn.destroyBlock(pos.add(0, 0, i), false);
            			}
            			if (worldIn.getBlockState(pos.add(1, 0, i)).getBlock().equals(Blocks.STONE)){
            			worldIn.destroyBlock(pos.add(1, 0, i), false);
            			}        			if (worldIn.getBlockState(pos.add(-1, 0, i)).getBlock().equals(Blocks.STONE)){
            			worldIn.destroyBlock(pos.add(-1, 0, i), false);
    
            			}
            		}
        		}
            }
    	return null;
        }
    

    Full code

    EDIT: Longer gif

  9. Are you calling this ONLY (!world.isRemote) server side?

    Yes, here is my whole code for the action.

        public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
            if (!worldIn.isRemote) {
            	for (int i = 0; i < 2; i++){
            			if (worldIn.getBlockState(pos.add(0, 0, i)).getBlock().equals(Blocks.STONE) && playerIn.canPlayerEdit(pos.add(0, 0, i), facing, stack)){
            			worldIn.destroyBlock(pos.add(0, 0, i), false);
                			//worldIn.getBlockState(pos.add(0,0,i)).getBlock().removedByPlayer(worldIn.getBlockState(pos.add(0,0,i)),
                					//worldIn, pos.add(0,0,i), playerIn, true);
            			worldIn.scheduleBlockUpdate(pos, worldIn.getBlockState(pos.add(0,0,i)).getBlock(), 1, 100);
            			}
            	}
            }

    The first block is the only one that actually gets updated and is shown breaking. The second one does not update.

  10. Are you calling this ONLY (!world.isRemote) server side?

    Yes, here is my whole code for the action.

        public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
            if (!worldIn.isRemote) {
            	for (int i = 0; i < 2; i++){
            			if (worldIn.getBlockState(pos.add(0, 0, i)).getBlock().equals(Blocks.STONE) && playerIn.canPlayerEdit(pos.add(0, 0, i), facing, stack)){
            			worldIn.destroyBlock(pos.add(0, 0, i), false);
                			//worldIn.getBlockState(pos.add(0,0,i)).getBlock().removedByPlayer(worldIn.getBlockState(pos.add(0,0,i)),
                					//worldIn, pos.add(0,0,i), playerIn, true);
            			worldIn.scheduleBlockUpdate(pos, worldIn.getBlockState(pos.add(0,0,i)).getBlock(), 1, 100);
            			}
            	}
            }

    The first block is the only one that actually gets updated and is shown breaking. The second one does not update.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.