onVoid
-
Posts
48 -
Joined
-
Last visited
Posts posted by onVoid
-
-
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.
-
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.
-
3 hours ago, Cadiboo said:
You define the "glassless", "default" and "intricate" in your code, but only have "normal" in your block state.
Yeah, I did that because I was attempting to mirror vanilla, which has a different json for each block (which would be the default, glassless, and intricate ones) of dirt. Is that not doable for my situation?
-
-
-
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:
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.
CommonProxy.java (I guess CommonProxies are a bad thing to have... oh well)
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.
-
28 minutes ago, winnetrie said:
You can set the blocksound with
setSoundType(SoundType.GLASS);
Inside the constructor. Where you have your other setters
Thank you. Does it not come with the material anymore?
-
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.
-
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.
-
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.
-
Make class, implements it and register.
IRecipe allows returning result that can be altered by ingredients - so e.g you can check ingredient NBT or damage and transfer it over to result.
Where is the problem?
I just don't know how to use an IRecipe. Are there any tutorials?
-
I have a recipe where I combine three obsidian with my item to make a more durable version, but the new item has a reset damage value. I have googled and found things stating an "IRecipe" but I have no idea how to use it to achieve this. Can anybody help? Thanks.
-
Why in god's name are you returning null?
Just changed it to return SUCCESS and it worked. Thank you so much!
-
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
-
destroyBlock alone should be enough.
destroyBlock alone doesn't update.
-
destroyBlock alone should be enough.
destroyBlock alone doesn't update.
-
Why are you calling scheduleBlockUpdate?
To attempt to update the block since it is broken but doesn't update until relog. Is there another thing I could use?
-
Why are you calling scheduleBlockUpdate?
To attempt to update the block since it is broken but doesn't update until relog. Is there another thing I could use?
-
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.
-
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.
-
I am using the code
worldIn.destroyBlock(pos.add(0, 0, i), false);
(i being a variable) to destroy multiple blocks at once. The blocks are being removed but aren't updating, still showing as what they were before until I relog. How can I force a block update at the location?
-
I am using the code
worldIn.destroyBlock(pos.add(0, 0, i), false);
(i being a variable) to destroy multiple blocks at once. The blocks are being removed but aren't updating, still showing as what they were before until I relog. How can I force a block update at the location?
-
Well, do you have code in place to synchronize it? Probably not.
In this: http://www.minecraftforge.net/forum/index.php/topic,38900.0.html post I was told energy could be synced automatically using TileEnergyHandler.
-
Why in the world are
charging
,
chargingDC
,
chargingDC2
and
storage
static? Right, because you are using them statically in
GuiCharger#drawGuiContainerForegroundLayer
. But GuiCharger has the TE instance available...
Now that I changed it, the RF doesn't show in the machine anymore.
Updated Gui: http://pastebin.com/U0havBJq
Parameter Mappings
in Modder Support
Posted
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:
Is there a solution to this that I am not privy to? If so please enlighten me.