Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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

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.

  • 3 weeks later...

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

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

  • Author

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

  • 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?

  • 4 months later...

@Daniel Rollins thanks for your codes by setting attributes via GlobalEntityTypeAttributes . I wonder for MOVEMENT_SPEED, could I achieve the same goal by calling MobEntity.setAIMoveSpeed(float)?

Those two fields are independent of each other. Specifically, one handles the base speed of the entity while the other handles its implementation within a movement controller.

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

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.