Jump to content

[1.16.4] Custom entity follow player


vassdeniss

Recommended Posts

Vanilla animals already have similar behavior. For example, pigs follow you when you hold a carrot or a carrot on a stick. 
That's achieved by adding the TemptGoal to the registerGoals method. Here's an example from the vanilla pig class:

this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, Ingredient.of(Items.CARROT_ON_A_STICK), false));

You can also use commas where it says Items.CARROT_ON_A_STICK to add more than one item.

P.S.: I'm not sure how you would go about making it follow the player when it's given a specific item, maybe taming?

Link to comment
Share on other sites

12 minutes ago, uSkizzik said:

Vanilla animals already have similar behavior. For example, pigs follow you when you hold a carrot or a carrot on a stick. 
That's achieved by adding the TemptGoal to the registerGoals method. Here's an example from the vanilla pig class:



this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, Ingredient.of(Items.CARROT_ON_A_STICK), false));

You can also use commas where it says Items.CARROT_ON_A_STICK to add more than one item.

P.S.: I'm not sure how you would go about making it follow the player when it's given a specific item, maybe taming?

Ingredient.of doesn't exist for me?

The pig class is:

this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, Ingredient.fromItems(Items.CARROT_ON_A_STICK), false));

I have Ingredient.fromItems() but that gives me a "Cannot resolve constructor" error.

Also how would taming work?

Edited by vassdeniss
Added more info
Link to comment
Share on other sites

Just now, vassdeniss said:

Ingredient.of doesn't exist for me?

I have Ingredient.fromItems() but that gives me a "Cannot resolve constructor" error.

Also how would taming work?

Are you sure? I just checked my old 1.16 project and the class name seems the same.
Are you importing net.minecraft.item.crafting.Ingredient?

Link to comment
Share on other sites

7 minutes ago, uSkizzik said:

P.S.: I'm not sure how you would go about making it follow the player when it's given a specific item, maybe taming?

this is easy, copy the logic of the TemptGoal, and change it to your logic
if the Player gives the item to the entity save the Player,
then check in the goal whether a player has been saved in your entity (! = null check),
if this is the case, take the part of the TemptGoal where the entity follows another entity

Link to comment
Share on other sites

8 minutes ago, vassdeniss said:

Ingredient.of doesn't exist for me?

The pig class is:


this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, Ingredient.fromItems(Items.CARROT_ON_A_STICK), false));

I have Ingredient.fromItems() but that gives me a "Cannot resolve constructor" error.

Also how would taming work?

Oh, so you're using MCP mappings, alright.
Are you using the same line of code? Does Ingridient.fromItems give you a "Cannot resolve contructor" error?

Link to comment
Share on other sites

3 minutes ago, vassdeniss said:

Just fixed it. It was my extension. I was extending bat entity which cant have a temptgoal for some reason?

Any living entity should be able to have TemptGoal. I looked a bit into the class and it requires a PathfinderMob which both MonsterEntity and CreatureEntity / AnimalEntity extend.
Anyway, you can use luis's solution for making the entity follow the player when given the item.

Edit: Turns out the bat is an "AmbientCreature" which is a class that doesn't extend PathfinderMob. Bats seem to not be able to have goals.

Edited by uSkizzik
Link to comment
Share on other sites

1 minute ago, uSkizzik said:

Any living entity should be able to have TemptGoal. I looked a bit into the class and it requires a PathfinderMob which both MonsterEntity and CreatureEntity / AnimalEntity extend.
Anyway, you can use luis's solution for making the entity follow the player when given the item.

Thats the problem then. BatEntity extends AmbientEntity

Link to comment
Share on other sites

Just now, vassdeniss said:

Thats the problem then. BatEntity extends AmbientEntity

Exactly. I hope that solves the issue. If you really need to extend BatEntity, you can extend it and override the customServerAiStep() method.
Add super.customServerAiStep() to keep the bat AI or don't to make completely custom AI. If you override that method you will need to adapt the TemptGoal code to work.
Also, according to forge-bot, customServerAiStep is updateAITasks for you but I'm not sure if that's accurate.

Link to comment
Share on other sites

4 minutes ago, uSkizzik said:

Exactly. I hope that solves the issue. If you really need to extend BatEntity, you can extend it and override the customServerAiStep() method.
Add super.customServerAiStep() to keep the bat AI or don't to make completely custom AI. If you override that method you will need to adapt the TemptGoal code to work.
Also, according to forge-bot, customServerAiStep is updateAITasks for you but I'm not sure if that's accurate.

It is updateAiTasks and i just overridden it and yes i do wanna keep the AI so i kept the super call but the TemptGoal still gives errors? Im missing something?

Link to comment
Share on other sites

5 minutes ago, vassdeniss said:

It is updateAiTasks and i just overridden it and yes i do wanna keep the AI so i kept the super call but the TemptGoal still gives errors? Im missing something?

You aren't supposed to add the goal like the other entities. You literally have to use the code from that class and put it in the updateAITasks.
Also, make sure to check if the bat isn't resting when you run the code to follow the player.

Link to comment
Share on other sites

3 minutes ago, uSkizzik said:

You aren't supposed to add the goal like the other entities. You literally have to use the code from that class and put it in the updateAITasks.
Also, make sure to check if the bat isn't resting when you run the code to follow the player.

Put the temptgoal in?

Link to comment
Share on other sites

2 hours ago, spiceagent11 said:

Vanilla animals already have similar behavior. For example, pigs follow you when you hold a carrot or a carrot on a stick. 
That's achieved by adding the TemptGoal to the registerGoals method. Here's an example from the vanilla pig class:

Bats don't have the registerGoals() method.

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

    • So, lately my modloader (curseforge) has been loading 162 mods instead of the 97 that my modpack only has, appart of that, when I try to join onto my public server the curseforge logs just starts spamming "OpenGL debug message: id=1280, source=API, type=ERROR, severity=HIGH, message='GL error GL_INVALID_ENUM'" and just freezes, my drivers are up to date, I've reinstalled curseforge, same with minecraft launcher, the java is updated, I've got enough ram and I got no viruses, Long after all this happened, my game could enter my online server and it didn't register as many mods, even my game was running at 40 fps, now I can't even play multiplayer, and when I try singleplayer, it goes about 20 fps to 10
    • It does but I'm struggling to see how to make it work in my recipe? (Its structure is the same as OP's, with a serializer subclass)
    • That looks pretty cool, nice!   Sure, so looking at that JSON file I posted, I pretty much made a record class for each "custom" data type in that JSON. The Input is a good example of why ``` "inputs": [ { "ingredient": { "item": "relativedimensions:aberrant_shard" }, "count": 8 } ], ``` So here's the inputs, it's an array, which we can use the Codec builder's builder.listOf to define an array. Each Item is of some arbitrary object with keys "ingredient" (which we know is an Ingredient) and a "count" which is an int. You don't have to have an intermediate class to map this to necessarily but I found that it's just easier to see the data that way, hence the 'ParticleReboundIngredient' represents one of these inputs.   Let me know if that makes sense or not. 
    • Pretty much, although all the recipes im planning to make on it are shapeless. The idea is that the chamber uses energy to "fuse" the items in each of the center slots together, in this case an ingot. The two slots at the sides are fuel. (A special kind of wood in this case). Here is an image of the interface just for reference (The center slot is the output)   As for the code- Can you elaborate a little bit on it? Seeing three different record classes has confused me a lot. (Elaborate as in why make them in three different records. I understand the code itself more or less)
    • Hello im trying to make a mod and the past few days GSON has almost killed me, when i export the mod and then launch it through minecraft launcher i get java.lang.NoSuchMethodError: com.google.gson.JsonParser.parseString(Ljava/lang/String;)Lcom/google/gson/JsonElement; i have literally tried everything here is my build config   dependencies { minecraft("com.mojang:minecraft:1.8.9") mappings("de.oceanlabs.mcp:mcp_stable:22-1.8.9") forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9") compileOnly("cc.polyfrost:oneconfig-1.8.9-forge:0.2.2-alpha+") shadowImpl("cc.polyfrost:oneconfig-wrapper-launchwrapper:1.0.0-beta+") { isTransitive = false exclude(module = "gson") } shadowImpl("org.spongepowered:mixin:0.7.11-SNAPSHOT") { isTransitive = false exclude(module = "gson") } annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT") shadowImpl("org.javassist:javassist:3.15.0-GA") { isTransitive = false exclude(module = "gson") } shadowImpl("com.neovisionaries:nv-i18n:1.28") { isTransitive = false exclude(module = "gson") } shadowImpl("org.apache.commons:commons-lang3:3.4") { isTransitive = false exclude(module = "gson") } shadowImpl("org.apache.httpcomponents:httpcore:4.4.5") { isTransitive = false exclude(module = "gson") } compileOnly("com.google.code.gson:gson:2.8.6") { isTransitive = false } configurations.all { resolutionStrategy { force("com.google.code.gson:gson:2.8.6") } } shadowImpl(fileTree( mapOf( "dir" to "libs", "include" to listOf("*.jar"), "exclude" to listOf( "asm", "asm-commons", "asm-tree", "gson", "unspecified", "nv-i18n" ) ) )) }  
  • Topics

×
×
  • Create New...

Important Information

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