Posted June 28, 20205 yr 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
June 28, 20205 yr 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.
July 17, 20205 yr Daniel, would you mind putting your code up? I can't seem to get this to work. Thanks.
July 17, 20205 yr 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".
July 18, 20205 yr 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).
July 29, 20205 yr 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?
December 28, 20204 yr @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)?
December 28, 20204 yr 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.