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

    • 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"
    • Today I tried downloading 1.16.5 forge (the recommended version) and when installing I selected "download client". At the end just before appeared "These libraries failed to download. Try again." and at the bottom there were "org.apache.logging.log4j:log4j-api:2.15.0 ; org.apache.logging.log4j:log4j-core:2.15.0 and org.apache.logging.log4j:log4j-slf4j18-impl2.15.0" I tried the newest version and the same thing appeared
    • I think the problem is the server doesn't have enough ram, but I need to be sure before buying more. The modpack I use is Craft of exile 2 and the server has 4gb ram. When I try to turn it on I get a bunch of warns and at the end it just says "[Multicraft] Skipped 564 lines due to rate limit (160/s)" Is there a way to increase the rate limit? One time it did start, but without half of the mods. The modpack works perfectly fine on my computer even if I have the launch ram limit to 4gb.
    • Nevermind, RedstoneWireBlock.java had what I needed. Surprised I didn't try looking there until now.
    • I tried to open my Minecraft world normally and got the error "Errors in currently selected data pacts prevented the world from loading." Trying to start in safe mode gives the error "This world contains invalid or corrupted save data." My recent log is too large to make a Pastebin link. Any help would be much appreciated. 
  • Topics

×
×
  • Create New...

Important Information

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