Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.18] Extended villager behavior


Brokkoli3000
 Share

Recommended Posts

Hey guys,

I am trying to extend the vanilla villager behavior. Currently it shall be possible to talk to them via a simple GUI with choosable options like in other games. During these talks the villager shall follow the player with head and body exactly like during trading. I am still trying to figure out vast parts of the Minecraft code of the new version. I think the safest way to go would be to extend the villager CORE activity added in the Villager.registerBrainGoals method. There, an additional behavior could be added which mostly adopts the LookAndFollowTradingPlayerSink class.

But I can't find a way to add this behavior to the activity. I mainly see two possibilities: Intercepting every call to this method and replacing it by a copy including the additional behavior (but I can't find suitable Forge events). Or replacing the villager class by an own class extending Villager. Here I can't figure out how to do it properly in Minecraft 1.18. When I try to replace the entity type there is no error but also no villager shows up at all. But it doesn't seem to be just a rendering problem, because the constructor of my own villager class isn't even called.

Does anyone here have experience with villagers in the new version? Is my behavior approach generally good or would another variant be much easier and better? If the approach is good, how to get the additional behavior into the villager?

 

Thanks in advance! :)

Link to comment
Share on other sites

I did exactly this and added a Behavior there. Problem is, when the profession of the villager is reset, Villager.refreshBrain is called, which removes my behavior. And I can't find a way to listen for such a profession reset to add the behavior afterwards again.

So my updated approaches would be:

- Extend villager, but I couldn't find out how to replace all vanilla villagers with my custom class.

- Extend Brain and override the copyWithoutBehaviors method. Here the problem is that an extending class does not have access to the Brain.MemoryValue class. This could be hacked by using the access transformers maybe but it would be a dirty way...

Any more ideas?🤔

Link to comment
Share on other sites

19 hours ago, Brokkoli3000 said:

Extend villager, but I couldn't find out how to replace all vanilla villagers with my custom class.

"entity joins world" event - make your extended villager, copy data from original (if you care to), spawn your villager into the world instead of the original

19 hours ago, Brokkoli3000 said:

when the profession of the villager is reset, Villager.refreshBrain is called, which removes my behavior

ok, but refreshBrain is public - override it. either let the inherited code do its thing and re-add your stuff, or rewrite the method completely.

and it looks like you'll need ATs sooner or later - no worries, they are not a big problem.

  • Like 1
Link to comment
Share on other sites

1 hour ago, MFMods said:

"entity joins world" event - make your extended villager, copy data from original (if you care to), spawn your villager into the world instead of the original

Ah ok, this copying would be a possibility. I tried with overriding the EntityType for villager, but this led to the aforementioned problems. But than I'll try this other approach.

1 hour ago, MFMods said:

ok, but refreshBrain is public - override it. either let the inherited code do its thing and re-add your stuff, or rewrite the method completely.

Yeah exactly if I already extend the Villager class, then it shouldn't be a problem in the end.

1 hour ago, MFMods said:

and it looks like you'll need ATs sooner or later - no worries, they are not a big problem.

About the ATs: I tried them out and couldn't change visibility of fields. Probably because I used the deobfuscated names but read that it should be obfuscated names. But how do I get the original unreadable names if I already have the readable ones?

I actually don't really understand how Forge plugs different mods with different ATs together. Are the visibilities not available anymore in byte code, such that the ATs are only supposed to ensure that the mod code compiles?

And also: I updated to the newest version of Forge (39.0.8) and the additional jars (e.g. Forge events) are not shown in Eclipse anymore (probably they're gone?). Is this supposed to happen?

If this is already too off-topic, I can of course open a new thread.

Edited by Brokkoli3000
Link to comment
Share on other sites

4 hours ago, Brokkoli3000 said:

If this is already too off-topic, I can of course open a new thread.

you may want to break that up into a few threads, yes.

i'll handle the immediate practical problem.

4 hours ago, Brokkoli3000 said:

Probably because I used the deobfuscated names but read that it should be obfuscated names. But how do I get the original unreadable names if I already have the readable ones?

yes, you need the obfuscated name.
option 1) i think there is a discord bot that you just ask but i never used it. don't ask me.
option 2) minecraft developement plugin for idea ide - right click and say copy AT entry to clipboard.
option 3) find forge-VERSION_HERE-decomp.jar in .gradle directory inside your home folder. it contains game code with SRG names. compare the same class from that jar with the class with mapped names and copy the field name. for method names you need to specify proper signature (param types and return type).

in any case always put a mapped name one row above (comments start with #) so that you know what the row below is.

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

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.