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

1.16.1 Custom Entity attributes


Recommended Posts

Hi,

In 1.15.2 in our custom entity class you had a function called registerAttributes where you could set MAX_HEALTH, MOVEMENT_SPEED, ATTACK_DAMAGE, etc. Like this:

    @Override
    protected void registerAttributes()
    {
        super.registerAttributes();
        this.getAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(20.0D);
        this.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.5D);
        this.getAttributes().registerAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(5.0D);
        this.getAttribute(SWIM_SPEED).setBaseValue(0.030D);
    }

 

That seems to have gone away in 1.16.1. Looking at other entities, each one seems to have a function like this:

   public static AttributeModifierMap.MutableAttribute func_234300_m_() {
      return MobEntity.func_233666_p_().func_233815_a_(Attributes.field_233818_a_, 30.0D);
   }

 

I have been able to determine which fields correspond to health, attack damage, etc. My problem is that i've found that the function name (func_234300_m_() in the example above) is different for each and every entity because they are all called from GlobalEntityTypeAttributes in a private variable that references each and every entity's unique function name instead of just having an inherited method that you can override.

 

Does anyone know the new proper way to set attributes for custom entities in 1.16.1? I'm not looking to create my own attributes, just set things like MAX_HEALTH, etc.

 

Thanks

Link to post
Share on other sites

AttributeModifierMap$MutableAttribute has three main methods: func_233803_a_ which creates an empty instanceof AttributeModifierMap#MutableInstance, func_233814_a_ which adds an attribute to the map that is initialized to the default value, and func_233815_a_ which adds an attribute to the map that is initialized to the value set. Most of the entity types hold a static method of a map that is stored within GlobalEntityTypeAttributes#field_233833_b_. The default map used seems to be based on the closest parent to the child object in question (ChickenEntity would use the one in MobEntity, EndermanEntity would use the one in MonsterEntity). All changes to the base map or additional attributes are applied using MutableAttribute#func_233815_a_.MutableAttribute#func_233814_a_ only seems to be used if the value is the default or where placeholder value is used (such as in LivingEntity until called by each child).

 

As for registering, forge added the method GlobalEntityTypeAttributes#put which satisfies the requirement of where to initialize the MutableAttribute for each custom EntityType. Since the factory used to spawn the EntityType isn't called until the entity needs to be spawned, it can probably be called within your FMLCommonSetupEvent. I'm pretty sure the method is not thread-safe however, so it is best to set it up within a DeferredWorkQueue.

  • Like 2
Link to post
Share on other sites
  • 3 weeks later...
5 hours ago, graz said:

Daniel, would you mind putting your code up? I can't seem to get this to work. Thanks.

Make your own thread and post what you've tried.

It's sad how much time mods spend saying "x is no longer supported on this forum. Please update to a modern version of Minecraft to receive support".

Link to post
Share on other sites

In my entity I made a function like this (you can name the function whatever you want since you are not overriding anything):

    public static AttributeModifierMap.MutableAttribute setCustomAttributes() {
        return MobEntity.func_233666_p_().func_233815_a_(Attributes.MOVEMENT_SPEED, (double)0.5F).func_233815_a_(Attributes.MAX_HEALTH, 20.0D).func_233815_a_(Attributes.ATTACK_DAMAGE, 5.0D);
    }

 

In my main class in the setup function I had a deferredWorkQueue where I dealt with the function above like this:

        DeferredWorkQueue.runLater(() -> {
            GlobalEntityTypeAttributes.put(MyEntities.myCustomEntity, CrewmanEntity.setCustomAttributes().func_233813_a_());
        });

 

Basically the GlobalEntityTypeAttributes.put function takes in your entity class and the function in your entity class the sets the attributes (make sure to add the .func_233813_a_() at the end of your function name). 

Link to post
Share on other sites
  • 2 weeks later...
On 7/18/2020 at 8:24 AM, Daniel Rollins said:

In my entity I made a function like this (you can name the function whatever you want since you are not overriding anything):

    public static AttributeModifierMap.MutableAttribute setCustomAttributes() {
        return MobEntity.func_233666_p_().func_233815_a_(Attributes.MOVEMENT_SPEED, (double)0.5F).func_233815_a_(Attributes.MAX_HEALTH, 20.0D).func_233815_a_(Attributes.ATTACK_DAMAGE, 5.0D);
    }

 

In my main class in the setup function I had a deferredWorkQueue where I dealt with the function above like this:

        DeferredWorkQueue.runLater(() -> {
            GlobalEntityTypeAttributes.put(MyEntities.myCustomEntity, CrewmanEntity.setCustomAttributes().func_233813_a_());
        });

 

Basically the GlobalEntityTypeAttributes.put function takes in your entity class and the function in your entity class the sets the attributes (make sure to add the .func_233813_a_() at the end of your function name). 

Hi Daniel, I don't understand the meaning of the "MyEntities.myCustomEntity" argument. Could you explain it?

Link to post
Share on other sites
  • 4 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

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.



×
×
  • Create New...

Important Information

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