Cобственный атрибут

Версия Minecraft
1.12.2
47
1
Всем привет. Пытаюсь с помощью гайда сделать атрибут радиации. Работать должно так: есть атрибут, который принимает значения от 0.0 до 100.0, если игрок имеет значение выше 20.0, то он получает урон. Вроде бы несложно, когда под рукой по сути весь код, который взял отсюда AustereTony/Tutorials
Но что-бы я не делал, текущее и максимальное значение всегда стоит на 0.0. Хотя по дефолту должно быть 10.0 и 100.0 соответственно.
Прошу пожалуйста подсказать, где я ошибся)
Вот все нужные классы:
Код:
@Mod.EventBusSubscriber(modid = ExperimentalProject.MODID)
public class RegistryAttributes {
    
    public static final IAttribute RADIATION = new RangedAttribute(null, ExperimentalProject.MODID + ".radiation", 10.0D, 0.0D, 100.0D).setShouldWatch(true);
    
    public static final DataParameter<Float> RAD = EntityDataManager.<Float>createKey(EntityPlayer.class, DataSerializers.FLOAT);
    
    @SubscribeEvent
    public static void onPlayerConstructing(EntityEvent.EntityConstructing event) {
  
        if (event.getEntity() instanceof EntityPlayer) {
      
            EntityPlayer player = (EntityPlayer) event.getEntity(); 
              
            player.getAttributeMap().registerAttribute(RADIATION);
            
            player.getDataManager().register(RAD, (float) RADIATION.getDefaultValue());
        } 
    }
}
Код:
@Mod.EventBusSubscriber(modid = ExperimentalProject.MODID)
public class RadiationHandler {
    
    public static float getMaxRadiation(EntityPlayer player) { 
          
        return (float) player.getEntityAttribute(RegistryAttributes.RADIATION).getAttributeValue();         
    }

    public static float getRadiation(EntityPlayer player) {
        
        return player.getDataManager().get(RegistryAttributes.RAD);
    }
    
    public static void setRadiation(EntityPlayer player, float value) {
        
        player.getDataManager().set(RegistryAttributes.RAD, MathHelper.clamp(value, 0.0F, getMaxRadiation(player)));
    }
 
    public static void refillRadiation(EntityPlayer player) {
    
        player.getDataManager().set(RegistryAttributes.RAD, 0.0F);
    }
    
    public static void decreaseRad(EntityPlayer player, float value) {
        
        player.getDataManager().set(RegistryAttributes.RAD, MathHelper.clamp(getRadiation(player) + value, 0.0F, getMaxRadiation(player)));
    }
 
    public static void increaseRad(EntityPlayer player, float value) {

        player.getDataManager().set(RegistryAttributes.RAD, MathHelper.clamp(getRadiation(player) - value, 0.0F, getMaxRadiation(player)));
    }
    
    private static void saveRadToNBT(EntityPlayer player) {
          
        player.getEntityData().setFloat(ExperimentalProject.MODID + ":radiation", getRadiation(player));
    }

    private static float loadRadFromNBT(EntityPlayer player) {
  
        return player.getEntityData().hasKey(ExperimentalProject.MODID + ":radiation") ? player.getEntityData().getFloat(ExperimentalProject.MODID + ":radiation") : getRadiation(player);
    }
    
    @SubscribeEvent
    public static void onPlayerLogIn(PlayerLoggedInEvent event) {
                      
        setRadiation(event.player, loadRadFromNBT(event.player));
    }

    @SubscribeEvent
    public static void onPlayerLogOut(PlayerLoggedOutEvent event) {
                          
        saveRadToNBT(event.player);
    }
    
    @SubscribeEvent
    public static void onPlayerUpdate(LivingUpdateEvent event) {
        
        if (event.getEntityLiving() instanceof EntityPlayer) {
            
            EntityPlayer pl = (EntityPlayer) event.getEntityLiving();
            if(getRadiation(pl) >= 20.0F) pl.attackEntityFrom(DamageSource.CACTUS, 0.5F);
        }
    }   
    
}
Код:
protected void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player)
    {
        if (!worldIn.isRemote)
        {
            RadiationHandler.increaseRad(player, 5.0F);
        }
    }
 
Сверху