Topic category: Advanced modding
Hello,
I recently came across this awesome tutorial
https://mcreator.net/forum/54347/tutorial-how-use-cauldrons-procedures
and thought that it could help me with my mod.
I'm trying to make my flower pot change material of the pot by right-click with a dye.I made some changes in the pot class,folowing modding tutorials, to create new PropertyInteger for colors.Changes were accepted by a recompilation, the client runs. But when I tried to run a right-click procedure folowing this tutorial, I get plenty of errors.It can't find almost every variable=(The same was with the changed code made by hand,it cannot access PropertyInteger variable from there...
I know, that my silly attempt to do this hard work is not the same as working vanilla cauldron things, but I really want to understand what's wrong.
Thanks in advance for any help or response)
recompilation error:
C:\Users\Dary\MCreatorWorkspaces\travelers_dream_blocks\build\sources\main\java\net\mcreator\travelers_dream_blocks\MCreatorFlowerPotwithflowerOnBlockRightClicked.java:48: error: cannot find symbol
int color = blockState.getValue(MCreatorFlowerPotwithflower.color);
^
symbol: variable color
location: class MCreatorFlowerPotwithflower
C:\Users\Dary\MCreatorWorkspaces\travelers_dream_blocks\build\sources\main\java\net\mcreator\travelers_dream_blocks\MCreatorFlowerPotwithflowerOnBlockRightClicked.java:48: error: cannot find symbol
int color = blockState.getValue(MCreatorFlowerPotwithflower.color);
^
symbol: variable blockState
location: class MCreatorFlowerPotwithflowerOnBlockRightClicked
C:\Users\Dary\MCreatorWorkspaces\travelers_dream_blocks\build\sources\main\java\net\mcreator\travelers_dream_blocks\MCreatorFlowerPotwithflowerOnBlockRightClicked.java:51: error: method withProperty in interface IBlockState cannot be applied to given types;
world.setBlockState(pos, blockState.withProperty(color, Integer.valueOf(4)), 3);
^
required: IProperty<T>,V
found: int,Integer
reason: cannot infer type-variable(s) T,V
(argument mismatch; int cannot be converted to IProperty<T>)
where T,V are type-variables:
T extends Comparable<T> declared in method <T,V>withProperty(IProperty<T>,V)
V extends T declared in method <T,V>withProperty(IProperty<T>,V)
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
3 errors
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileJava'.
> Compilation failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 9s
my flower pot procedure is almost the same as in the tutorial :I check for a flower block pot with "if getblock at x,y,z is flowerpot and item in entity main hand is dye4 do" and then lines in code snippets:
int color = blockState.getValue(MCreatorFlowerPotwithflower.color); // my attempt to get PropertyInteger value from pot class
BlockPos pos = new BlockPos(x, y, z);
IBlockState blockState = world.getBlockState(pos);
world.setBlockState(pos, blockState.withProperty(color, Integer.valueOf(4)), 3);
I don't like the first and the last lines,I don't know exactly how to get access to color property
My flower pot class:
package net.mcreator.travelers_dream_blocks;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraft.world.World;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.Item;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.material.Material;
import net.minecraft.block.SoundType;
import net.minecraft.block.Block;
import java.util.HashMap;
@Elementstravelers_dream_blocks.ModElement.Tag
public class MCreatorFlowerPotwithflower extends Elementstravelers_dream_blocks.ModElement {
@GameRegistry.ObjectHolder("travelers_dream_blocks:flowerpotwithflower")
public static final Block block = null;
public MCreatorFlowerPotwithflower(Elementstravelers_dream_blocks instance) {
super(instance, 161);
}
@Override
public void initElements() {
elements.blocks.add(() -> new BlockCustom());
elements.items.add(() -> new ItemBlock(block).setRegistryName(block.getRegistryName()));
}
@SideOnly(Side.CLIENT)
@Override
public void registerModels(ModelRegistryEvent event) {
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, new ModelResourceLocation(
"travelers_dream_blocks:flowerpotwithflower", "inventory"));
}
public static class BlockCustom extends Block {
public static final PropertyInteger color = PropertyInteger.create("color", 0, 15);
public BlockCustom() {
super(Material.GLASS);
setRegistryName("flowerpotwithflower");
setUnlocalizedName("flowerpotwithflower");
setSoundType(SoundType.STONE);
setHardness(0F);
setResistance(0F);
setLightLevel(0F);
setLightOpacity(0);
setCreativeTab(MCreatorTravelersDream.tab);
this.setDefaultState(this.blockState.getBaseState().withProperty(color, Integer.valueOf(0)));
}
@Override
protected net.minecraft.block.state.BlockStateContainer createBlockState() {
return new net.minecraft.block.state.BlockStateContainer(this, new IProperty[]{color});
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(color);
}
@Override
public IBlockState getStateFromMeta(int meta) {
return this.getDefaultState().withProperty(color, meta);
}
@SideOnly(Side.CLIENT)
@Override
public BlockRenderLayer getBlockLayer() {
return BlockRenderLayer.CUTOUT_MIPPED;
}
@Override
public boolean isOpaqueCube(IBlockState state) {
return false;
}
@Override
public boolean canSilkHarvest(World world, BlockPos pos, IBlockState state, EntityPlayer player) {
return false;
}
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer entity, EnumHand hand, EnumFacing side,
float hitX, float hitY, float hitZ) {
super.onBlockActivated(world, pos, state, entity, hand, side, hitX, hitY, hitZ);
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
Block block = this;
{
java.util.HashMap<String, Object> $_dependencies = new java.util.HashMap<>();
$_dependencies.put("entity", entity);
$_dependencies.put("x", x);
$_dependencies.put("y", y);
$_dependencies.put("z", z);
$_dependencies.put("world", world);
MCreatorFlowerPotwithflowerOnBlockRightClicked.executeProcedure($_dependencies);
}
return true;
}
}
}
Well, after placing code snippets
BlockPos pos = new BlockPos(x, y, z);
IBlockState blockState = world.getBlockState(pos);
int color = blockState.getValue(MCreatorFlowerPotwithflower.color); // my attempt to get PropertyInteger value from pot class
world.setBlockState(pos, blockState.withProperty(color, Integer.valueOf(4)), 3);
in right positions (silly mistake) i'm getting only errors about "color" variable.
I suggest you to ask in the original topic as the author can help you. If you mess with code, you are expected to know a bit about it too.
I can't test the code, but the issue is that the procedure cannot find the variable "color".
The reason is that the classes of MCreator blocks have a different structure. In the case of BlockCauldron, you only have the "block" class itself. Your flower pot instead has:
What you're doing right now is asking the procedure to grab the "color" variable from MCreatorFlowerPotwithflower, and NOT from BlockCustom. The variable cannot be found, so it throws a "cannot find symbol" error.
To tell the procedure to look inside BlockCustom, you should replace "MCreatorFlowerPotwithflower.color" with " MCreatorFlowerPotwithflower.BlockCustom.color" (the same goes for the 4th snippet)
Another minor thing, but when you declare static final variables, their names should be capitalized (the blockstate property in BlockCustom should be "COLOR" instead of "color"). You don't have to, but it's a convention that should be followed anyway. In your case it would make it easier to distinguish between the blockstate property "COLOR", and the int variable "color" that you're declaring in the 3rd snippet. If you do rename the property "color" to "COLOR", remember to adjust all the other places where the "color" property appears.