'store result score @s' storing a 0 to the scoreboard no matter what

I have a an area with lots of armour stands. Under each one is a dispenser with 1 - 54 items in the first slot, which is its sort of 'id'. I need to temporarily save the number of items in each of those dispensers to a scoreboard which I am doing like so:

execute as @e[tag=char] at @e[tag=char] store result score @s temp run data get block ~ ~-1 ~ Items[0].Count

however, no matter the number of items inside or anything, it will always store a 0. enter image description here I run one similar command before which is:

execute as @e[tag=getblock] at @e[tag=getblock] unless block ~ ~-1 ~ minecraft:air store result score blockCount load run data get block ~ ~-1 ~ Items[0].Count

and this runs perfectly. There is only one amour stand with that tag but that shouldn't matter because I am running the other command using @s which will just use the UUID of the entity.

What could be the reason for this?


Solution 1:

If there is more than one armour stand, your at argument should be @s instead of @e[tag=char].

It's a complicated explanation why.

Place down two armour stands in your test world, name them One and Two respectively, and tag them test. Let's run a few commands on them (paste them into your chat):

/execute as @e[tag=test] run say Hello, World!

Result:

[Armour Stand] Hello, World!
[Armour Stand] Hello, World!

Now let's try using at instead of as:

/execute at @e[tag=test] run say Hello, World!

Result:

[ExpertCoder14] Hello, World!
[ExpertCoder14] Hello, World!

It looks like the command is executed twice, by your player, once at each position.à

Now let's combine them. Try the following:

/execute as @e[tag=test] at @e[tag=test] run say Hello, World!

... and you get 4 messages, 2 from each armour stand.

What is happening with your old command is that each armour stand is executing the /data get with each armour stand, not with itself. So armour stand 1 will execute /data get with all the other armour stands, not just itself.

Fixed command:

execute as @e[tag=char] at @s store result score @s temp run data get block ~ ~-1 ~ Items[0].Count