Jump to content

Recommended Posts

Posted (edited)

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
Posted

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".

Posted
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
Posted
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. 
Posted (edited)
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
Posted (edited)
1 hour ago, diesieben07 said:

If you want the data synced from server to client: DataParameter. Otherwise a field.

So if I use setCustomNameTag to show the name from the variable, I would want a field then?

Edited by OrangeVillager61

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



×
×
  • Create New...

Important Information

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