mojira.dev
MC-272531

Advancements: `components` does not work with floats

the following advancement should trigger when a player picks up a bucket of tropical fish with the `BucketVariantTag` set to `67502593`:

 

{
  "display": {
    "icon": {
      "id": "minecraft:warped_fungus",
      "count": 1
    },
    "title": {
      "text": "triggered"
    },
    "description": {
      "translate": "advancements.husbandry.tactical_fishing.description"
    }
  },
  "parent": "minecraft:husbandry/fishy_business",
  "criteria": {
    "tropical_fish_bucket": {
      "trigger": "minecraft:inventory_changed",
      "conditions": {
        "items": [
          {
            "items": "minecraft:tropical_fish_bucket",
            "components": {
              "minecraft:bucket_entity_data": {
                "BucketVariantTag":67502593
              }
            }
          }
        ]
      }
    }
  },
  "requirements": [
    [
      "tropical_fish_bucket"
    ]
  ],
  "sends_telemetry_event": false
}

However it doesn't work because the components needs an exact match as most naturally caught tropical fish would have a health tag, an exact match can be created with 

/give @s minecraft:tropical_fish_bucket[minecraft:bucket_entity_data={BucketVariantTag:67502593}]

So the modified version should work: 

{
  "display": {
    "icon": {
      "id": "minecraft:warped_fungus",
      "count": 1
    },
    "title": {
      "text": "triggered"
    },
    "description": {
      "translate": "advancements.husbandry.tactical_fishing.description"
    }
  },
  "parent": "minecraft:husbandry/fishy_business",
  "criteria": {
    "tropical_fish_bucket": {
      "trigger": "minecraft:inventory_changed",
      "conditions": {
        "items": [
          {
            "items": "minecraft:tropical_fish_bucket",
            "components": {
              "minecraft:bucket_entity_data": {
                "Health": 3.0,
                "BucketVariantTag":67502593
              }
            }
          }
        ]
      }
    }
  },
  "requirements": [
    [
      "tropical_fish_bucket"
    ]
  ],
  "sends_telemetry_event": false
}

But this too doesn't work as in json the 3.0 of the health tag will be implicitly casted to an int and result in health:3b where as the natural occuring ones will be floats so health:3.0f. In effect this renders them inaccessible for advancements with the recent changes, `minecraft:bucket_entity_data` should be able to check for the tags given not an exact match (which I presume was simpler to implement with "==").

This can be further proven by using a health value that cannot be casted into an integer, such as 2.5, if you change the advancement to trigger on 2.5 health and then spawn a tropical fish with that BucketVarientTag it will work just fine. Unfortunately fish spawn with 3.0 health. Like with this command:

/give @s minecraft:tropical_fish_bucket[minecraft:bucket_entity_data={BucketVariantTag:67502593,Health:2.5f}]

 

Another way to check this is by giving yourself a fish with interger health with the command below, this will trigger the advancement as it matches the integer 3 for health

/give @s minecraft:tropical_fish_bucket[minecraft:bucket_entity_data={BucketVariantTag:67502593,Health:3d}]

 

How to reproduce:

  1. Add datapack-BucketVariantTag.tag to a world

  2. Spawn a tropical fish with the `BucketVariantTag` set to 67502593

  3. Catch the fish in a water bucket and that should trigger the advancement but it won't

  4. if you use the following command it will as it lacks the health tag "/give @s minecraft:tropical_fish_bucket[minecraft:bucket_entity_data=
    {BucketVariantTag:67502593}]"

  5. The same can be done with datapack-BucketVariantTag&Health.tag and the command would be "/give @s minecraft:tropical_fish_bucket[minecraft:bucket_entity_data=
    {BucketVariantTag:67502593,Health:3b}]" 

Expected result:

  1. the advancement should trigger when a fish with the "BucketVariantTag" of 67502593 is caught and the health is 3.0

Actual result:

  1. the advancements do not trigger be cause the 3.0 is converted into an interger and since "3d" != "3f"

I've attached test datapacks to show these behaviours, one checking for the `BucketVariantTag` another checking for both the tags

Linked issues

Attachments

Comments 4

Please update the description to include expected VS observed results

Can confirm. The files you attached are not data packs, though. I've uploaded a data pack that helps reproduce the issue (it's your data packs but combined and slightly edited).

Thank you for your report!
After consideration, the issue is being closed as Invalid.

This report does not describe a bug.

Quick Links:
📓 Bug Tracker Guidelines – 💬 Community Support – 📧 Mojang Support (Technical Issues) – 📧 Microsoft Support (Account Issues)
📓 Project Summary – ✍️ Feedback and Suggestions – 📖 Game Wiki

To specify specific data types in advancement JSON, the SNBT format (such as in the command) should be used to specify the bucket data:
"minecraft:bucket_entity_data": "{Health:3d,BucketVariantTag:67502593}"

zer0p1us

(Unassigned)

Community Consensus

Advancements, Data Packs

Advancements, components

1.20.6, 24w21b, 1.21 Pre-Release 2, 1.21, 1.21 Release Candidate 1

Retrieved