Jump to content

[1.11.2][Solved] Issues with Data Parameter variables with a Custom Mob


Recommended Posts

After a long hiatus from modding, I am debuging my code and update my mod. However, an issue I had right before my hiatus was that my data parameters were not working correctly and always showed the value from the register.

 

My original goal was to give each villager a name and gender when spawned, however, the code according to printlns does assign names but the villagers have "None" over them.

 

Below, there is a time when the code assigns names and printlns "Something went wrong with gender, please report." but this never appears in the printlns.

 

Custom Mob(Some unrelated stuff was removed and changes that fix some of the original issues are in it):

 

public class IvVillager extends EntityVillager{
	
	protected Village villageObj; 
	public String name;
	public int gender;
    protected boolean isWillingToMate;
    protected int wealth;
    protected MerchantRecipeList buyingList;
    protected static final DataParameter<String> Name = EntityDataManager.<String>createKey(IvVillager.class, DataSerializers.STRING);
    protected static final DataParameter<Integer> Gender = EntityDataManager.<Integer>createKey(IvVillager.class, DataSerializers.VARINT);
    private int careerId;
    private int careerLevel;
    private boolean isLookingForHome;
    private boolean areAdditionalTasksSet;
    protected final InventoryBasic villagerInventory;
    Random r = new Random();

    /** A multi-dimensional array mapping the various professions, careers and career levels that a Villager may offer */
	protected String[] male_list = {"Bob", "Joseph", "Aaron", "Philp", "Adam", "Paul", "Donald", "Ryan", 
									"Mark", "Brian", "Robert", "Willam", "Harold", "Anthony", "Julius", 
									"Mathew", "Tyler", "Noah", "Patrick", "Caden", "Michael", "Jeffery",
									"James", "John", "Thomas", "Otto", "Bill", "Sheldon", "Leonard", 
									"Howard", "Carter", "Theodore", "Herbert"};
	protected String[] female_list = {"Karen", "Lessie", "Kayla", "Brianna", "Isabella", "Elizabeth",
									  "Kira", "Jadzia", "Abigail", "Chloe", "Olivia", "Sophia", "Emily", 
									  "Charlotte", "Amelia", "Maria", "Daria", "Sarah", "Theodora",
									  "Tia", "Jennifer", "Anglica", "Denna", "Tasha", "Catherine", "Lily",
									  "Amy", "Penny", "Julina", "Audrey", "Avery"};
	
	public IvVillager(World world) {
		super(world);
        this.villagerInventory = new InventoryBasic("Items", false, 20);
	}
	public IvVillager(World world, int professionId) {
		super(world, professionId);
	    this.setProfession(professionId);
        this.villagerInventory = new InventoryBasic("Items", false, 20);
	}
	public InventoryBasic getVillagerInventory()
    {
        return this.villagerInventory;
    }
	@Override
	protected void entityInit()
    {
		super.entityInit();
		this.getDataManager().register(Gender, Integer.valueOf(0));
		this.getDataManager().register(Name, String.valueOf("None"));
    }
	public int getGender()
    {
        return ((Integer)this.getDataManager().get(Gender)).intValue();
    }
	public void setGender(int value)
	{
		this.getDataManager().set(Gender, Integer.valueOf(value));
	}
	public String getName()
	{
        return ((String)this.getDataManager().get(Name));
	}
	public void setName(String value)
	{
		this.getDataManager().set(Name, String.valueOf(value));
	}
	 @Override
	 public void writeEntityToNBT(NBTTagCompound compound)
	    {
	        super.writeEntityToNBT(compound);
	         if (world.isRemote == false){
		        compound.setInteger("Profession", this.getProfession());
		        compound.setString("ProfessionName", this.getProfessionForge().getRegistryName().toString());
		        compound.setInteger("Riches", this.wealth);
		        compound.setInteger("Career", this.careerId);
		        compound.setInteger("CareerLevel", this.careerLevel);
		        compound.setBoolean("Willing", this.isWillingToMate);
	
		        if (this.buyingList != null)
		        {
		            compound.setTag("Offers", this.buyingList.getRecipiesAsTags());
		        }
	        }

	        NBTTagList nbttaglist = new NBTTagList();

	        for (int i = 0; i < this.getVillagerInventory().getSizeInventory(); ++i)
	        {
	            ItemStack itemstack = this.villagerInventory.getStackInSlot(i);

	            if (!itemstack.isEmpty())
	            {
	                nbttaglist.appendTag(itemstack.writeToNBT(new NBTTagCompound()));
	            }
	        }

	        compound.setTag("Inventory", nbttaglist);
	        if (world.isRemote == false){
	        	if (this.getGender() != 1 || this.getGender() != 2){
	        		this.gender = r.nextInt(2) + 1;
	        	}
	        	compound.setInteger("Gender", this.gender);
	        	if (this.getName() == null || this.getName() == "None"){
	        		if (this.gender == 1){
	        			this.name = male_list[r.nextInt(male_list.length)];
	        			System.out.println("Male Name");
	        		}
	        		else if (this.gender == 2){
	        			this.name = female_list[r.nextInt(male_list.length)];
	        			System.out.println("Female Name");
	        		}
	        		else if (this.gender != 1|| this.gender != 2){
	        			this.name = "None";
	        			System.out.println("Something went wrong with gender, please report.");
	        			System.out.println("No Name");
	        		}
	        	compound.setString("Name", this.name);
	        	this.setGender(this.gender);
	        	this.setName(this.name);
	        	System.out.println(this.getName());
	        }
	        }
	        
	    }
	 @Override
	 public void readEntityFromNBT(NBTTagCompound compound){
		 super.readEntityFromNBT(compound);
		 if (world.isRemote == false){
			 this.gender = compound.getInteger("Gender");
			 this.name = compound.getString("Name");
			 this.getGender();
			 this.getName();
			 this.setCustomNameTag(this.getName());
		 }
		 this.setProfession(compound.getInteger("Profession"));
	        if (compound.hasKey("ProfessionName"))
	        {
	            net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession p =
	                net.minecraftforge.fml.common.registry.VillagerRegistry.instance().getRegistry().getValue(new net.minecraft.util.ResourceLocation(compound.getString("ProfessionName")));
	            if (p == null)
	                p = net.minecraftforge.fml.common.registry.VillagerRegistry.instance().getRegistry().getValue(new net.minecraft.util.ResourceLocation("minecraft:farmer"));
	            this.setProfession(p);
	        }
	        this.wealth = compound.getInteger("Riches");
	        this.careerId = compound.getInteger("Career");
	        this.careerLevel = compound.getInteger("CareerLevel");
	        this.isWillingToMate = compound.getBoolean("Willing");

	        if (compound.hasKey("Offers", 10))
	        {
	            NBTTagCompound nbttagcompound = compound.getCompoundTag("Offers");
	            this.buyingList = new MerchantRecipeList(nbttagcompound);
	        }

	        NBTTagList nbttaglist = compound.getTagList("Inventory", 10);

	        for (int i = 0; i < nbttaglist.tagCount(); ++i)
	        {
	            ItemStack itemstack = new ItemStack(nbttaglist.getCompoundTagAt(i));

	            if (!itemstack.isEmpty())
	            {
	                this.villagerInventory.addItem(itemstack);
	            }
	        }

	        this.setCanPickUpLoot(true);
	        this.setAdditionalAItasks();
		 
	 }
}

 

Common Proxy (Some unrelated stuff was removed):

public class CommonProxy {

	@EventHandler
    public void preInit(FMLPreInitializationEvent e) {
		ResourceLocation resourceLocation1 = new ResourceLocation("iv", "villager");
		EntityRegistry.registerModEntity(resourceLocation1, IvVillager.class, "IvVillager", 0, Iv.instance, 32, 1, true);
		
	}
	@EventHandler
    public void init(FMLInitializationEvent e) {
		
	}
    @EventHandler
    public void postInit(FMLPostInitializationEvent e) {

    }
}

Please comment if you need more information, it has been a while so I am still figuring out some of the buginess,

Edited by OrangeVillager61
Fixes an issue
Link to comment
Share on other sites

After further testing, I've discovered that professions (they are reset to farmers) are also deleted when I use this code. Also, when the game is reloaded, the names for each villager is set to "None" then to one of the random names. But this is not seen, instead, the game permanently shows "None".

Link to comment
Share on other sites

On 5/2/2017 at 6:10 PM, OrangeVillager61 said:

public void readEntityFromNBT(NBTTagCompound compound)

{

super.writeEntityToNBT(compound);

So, read or write? :D

On 5/2/2017 at 6:10 PM, OrangeVillager61 said:

if (world.isRemote == false)

That... is a very specific way to check booleans. Very... strict. Also you should not even need this unless you are explicitly reading entity nbt on the client. I do not think that readEntityFromNBT is ever called on the client.

 

On 5/2/2017 at 6:10 PM, OrangeVillager61 said:

this.gender = compound.getInteger("Gender");

this.name = compound.getString("Name");

this.getGender();

this.getName();

Erm... why? Why are you setting your variables and then redundantly calling getters? They do not do anything on their own... Maybe you ment to invoke your setters? ;)

13 minutes ago, OrangeVillager61 said:

Looking at the code, I think the issue may be in the write/read nbt, I'm going to use printlns to confirm this.

You should use breakpoints to confirm this, not printlns which can get lost in the console. Breakpoints are the way to debug your code, trust me :)

 

  • Like 1
Link to comment
Share on other sites

10 minutes ago, V0idWa1k3r said:

So, read or write? :D

That... is a very specific way to check booleans. Very... strict. Also you should not even need this unless you are explicitly reading entity nbt on the client. I do not think that readEntityFromNBT is ever called on the client.

 

Erm... why? Why are you setting your variables and then redundantly calling getters? They do not do anything on their own... Maybe you ment to invoke your setters? ;)

You should use breakpoints to confirm this, not printlns which can get lost in the console. Breakpoints are the way to debug your code, trust me :)

 

  1. Good catch, that fixes the profession issue (no clue why I put it there right before my hiatus).
  2. I had issues with proxies in the past with stuff being in the wrong proxy, so I put that there in bugged situations.
  3. Yeah, probably, as stated in the first post, I did some weird stuff right before I left.
  4. I should switch from printlns to breakpoints, I am not very good with the latter but it does seem to work better according to most debuggers. 
Link to comment
Share on other sites

13 minutes ago, diesieben07 said:

Either store your data in a DataParameter or in a field. Not both. Currently you do both.

Which would you recommend? The original reason why I used a DataParameter is because it took a reload for those values to applied with the first method I did (mainly the villagers didn't get named until said reload).

Edited by OrangeVillager61
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I had been using a mobile wallet to store around $200,000 worth of Bitcoin, and everything was going smoothly until my phone was stolen. At first, I wasn’t too worried. I thought I had written down the backup phrase somewhere safe, so I figured I could easily recover my funds. But after tearing my home apart, checking every drawer, notebook, and folder I could think of, I came to a horrible realization—I hadn’t been as careful as I thought. The backup phrase was nowhere to be found. Panic started to set in. Losing access to that much Bitcoin was like watching years of hard work and financial progress vanish right before my eyes. It wasn’t just about the money; it felt like my future had been snatched away in an instant. I couldn’t believe I had been so careless. It was a nightmare that I wouldn’t wish on anyone. Desperate to find a solution, I started searching online for recovery options. That’s when I came across Cyber Constable Intelligence, recommended by someone in a cryptocurrency forum. At first, I was hesitant—there are so many scams in the crypto space, and the last thing I wanted was to get ripped off while trying to recover my funds. But the positive reviews gave me a glimmer of hope, so I decided to reach out. From the moment I contacted Cyber Constable Intelligence on Email at support (AT) cyberconstableintelligence.com, they made me feel understood and reassured. They didn’t make me feel stupid for my mistake, which was something I really appreciated. They explained the recovery process clearly and thoroughly, and they reassured me that they had successfully handled cases like mine before. Even though I was still anxious—after all, this was $200,000 on the line—I felt like I was in good hands. The next few days were tense, but then I received the news I had been praying for: Cyber Constable Intelligence had managed to recover my Bitcoin. I honestly didn’t believe it until I logged in and saw my balance restored. It was like a second chance at life. The relief was overwhelming. If you’ve lost access to your wallet, no matter how hopeless the situation may seem, I can’t recommend Cyber Constable Intelligence enough. They turned my nightmare into a success story, and I’m forever grateful for their expertise and professionalism. Here's Their info below What Sapp Info: 1. (2. 5.  2.  ) 3.  7.  8.  (7. 6. 1. 1.) Website Info : www. cyber constable intelligence   com
    • So I'm creating yet another minecraft modpack and stumbled upon error I've never encoutered.. I tried to troubleshoot it myself and it always worked but this time I didn't manage.. Here is minecraft crash report: https://pastebin.com/EVqzdDKg I can't find how or from where to post debug.log  I'm sorry, can someone help me? (as a disclaimer - i've tried already reinstalling minecraft and java)
    • It works without mods, I've ran it through the launcher by itself and runs perfectly fine, when I open it through Forge I can get through to the launcher but when I go to open the world it loads then gives me the error code 1. Is there anymore info that could help diagnose it?
    • Also had the issue. GLAD TO TELL YOU I HAVE THE FIX! Create: Applied Kinetic literally says "Replace all inscriber recipes with Create's sequenced assembly recipe". When I turned off this mod it worked fine. I also didn't use that mod of the pack i played so it didn't matter for me.
    • Right now im trying to make an own mod for minecraft for the version 1.16.5 with forge but whatever i do it still doesnt fix the error this is my build.gradle : buildscript { repositories { maven { url = "https://maven.minecraftforge.net" } mavenCentral() } dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+' } } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'java' group = 'com.example' // Modify to your package name version = '1.0' archivesBaseName = 'flippermod' java { toolchain { languageVersion = JavaLanguageVersion.of(8) } } minecraft { version = "1.16.5-36.2.42" // Ensure this matches your Forge version mappings channel: 'official', version: '1.16.5' runs { client { workingDirectory project.file('run') property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' mods { flipper_mod { sourceSets.main.output } } } } } repositories { maven { url = "https://maven.minecraftforge.net/" } mavenCentral() } dependencies { minecraft "net.minecraftforge:forge:1.16.5-36.2.42" } and this one is my settings.gradle:  pluginManagement { repositories { gradlePluginPortal() maven { name = 'MinecraftForge' url = 'https://maven.minecraftforge.net/' } } } plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' } rootProject.name = 'flippermod' this one is the mods.tml    modLoader="javafml" loaderVersion="[36,)" modId="flippermod" version="1.0.0" displayName="Flippermod" and the last one is the gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip dc :"code_slivki"
  • Topics

×
×
  • Create New...

Important Information

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