Is there any way in Minecraft to detect who deposited a diamond into a chest using command blocks?

[BACK]
Is there any way in Minecraft to detect who deposited a diamond into a chest using command blocks?
Posted On: April 26, 2024

So far, I've been able to detect when a diamond is placed into a chest's inventory but how can I detect who placed that diamond?


I'd prefer not to use the nearest player because someone else could potentially be falsely identified. (I have a command chain that trades players emeralds in exchange for experience levels and it also sometimes robs random nearby players.).


Some context: I'm making a race to be the first to deposit a diamond. I could constrain the player accessing the chest and just check who is standing on a block, but if I did that, I could also just test the player's inventory directly. But that seems boring. Adding the chest adds to the drama, I feel. Like, if someone fumbles last minute and deposits dirt on accident, someone else could easily win, which is fun.


My command chain is currently:.


if block x y z chest{Items:[{id:"minecraft:diamond"}]}.


say Diamond Detected.


Edit: The diamonds are mined and as such, I will not necessarily be able to tag them for each player. Another user suggested I could scan the inventories of the users at every tick and tag the diamonds in their inventory with their name. I don't know how to do this, though I believe this is the direction where I will find my answer.


Question from user Robert Talada at gaming.stackexchange.com.


Answer:

If you don't know who has each diamond.


Minecraft 1.20.5 changed the syntax of some of the commands a bit but the concept behind this answer should still be valid.


Step one.


Give each player a unique scoreboard ID. See this related question for how to do that.


Step two.


Run the following command in a repeating, always active command block:.


execute as @e[type=item,nbt={Item:{id:"minecraft:diamond"}}] run data merge entity @s {Item:{tag:{Unclaimed:1b}}.


This gives each diamond item on the ground a custom Unclaimed tag, allowing you implement Step 3 without 30+ command blocks per player.


Step three.


Once for each player who could be playing the map, run in a repeating command block:.


clear @a[scores={Id=1}] diamond{Unclaimed:1b} 1.


and then, in a conditional chain command block that the repeating command block is pointing to.


give @a[scores={Id=1}] diamond{PlayerOwns:1b} 1.


Repeat this for each player, using scores={Id=2} and PlayerOwns:2b for the second player and so on.


Step four.


Now that each diamond has a tag describing whose it is, you can use the technique described in ExpertCoder14's answer to determine who put a diamond in the chest.


This has a known bug that if Alice puts a diamond in a container, and then Bob takes the diamond out of the container (and never drops and picks it up again), the diamond is still interpreted as belonging to Alice -- but I actually like that if I understand what you're doing correctly; if you stole someone else's diamond from a chest instead of mining your own, that means you're trying to cheat… karma!.


If you want a more seamless experience, you may want to interest yourself in player inventory modification. With the method above, the diamond is visibly replaced by a different one, you can use this to make a seamless replacement.


Answer from user pppery at gaming.stackexchange.com.


[BACK]
Is there any way in Minecraft to detect who deposited a diamond into a chest using command blocks?
Posted On: April 26, 2024

So far, I've been able to detect when a diamond is placed into a chest's inventory but how can I detect who placed that diamond?


I'd prefer not to use the nearest player because someone else could potentially be falsely identified. (I have a command chain that trades players emeralds in exchange for experience levels and it also sometimes robs random nearby players.).


Some context: I'm making a race to be the first to deposit a diamond. I could constrain the player accessing the chest and just check who is standing on a block, but if I did that, I could also just test the player's inventory directly. But that seems boring. Adding the chest adds to the drama, I feel. Like, if someone fumbles last minute and deposits dirt on accident, someone else could easily win, which is fun.


My command chain is currently:.


if block x y z chest{Items:[{id:"minecraft:diamond"}]}.


say Diamond Detected.


Edit: The diamonds are mined and as such, I will not necessarily be able to tag them for each player. Another user suggested I could scan the inventories of the users at every tick and tag the diamonds in their inventory with their name. I don't know how to do this, though I believe this is the direction where I will find my answer.


Question from user Robert Talada at gaming.stackexchange.com.


Answer:

If you don't know who has each diamond.


Minecraft 1.20.5 changed the syntax of some of the commands a bit but the concept behind this answer should still be valid.


Step one.


Give each player a unique scoreboard ID. See this related question for how to do that.


Step two.


Run the following command in a repeating, always active command block:.


execute as @e[type=item,nbt={Item:{id:"minecraft:diamond"}}] run data merge entity @s {Item:{tag:{Unclaimed:1b}}.


This gives each diamond item on the ground a custom Unclaimed tag, allowing you implement Step 3 without 30+ command blocks per player.


Step three.


Once for each player who could be playing the map, run in a repeating command block:.


clear @a[scores={Id=1}] diamond{Unclaimed:1b} 1.


and then, in a conditional chain command block that the repeating command block is pointing to.


give @a[scores={Id=1}] diamond{PlayerOwns:1b} 1.


Repeat this for each player, using scores={Id=2} and PlayerOwns:2b for the second player and so on.


Step four.


Now that each diamond has a tag describing whose it is, you can use the technique described in ExpertCoder14's answer to determine who put a diamond in the chest.


This has a known bug that if Alice puts a diamond in a container, and then Bob takes the diamond out of the container (and never drops and picks it up again), the diamond is still interpreted as belonging to Alice -- but I actually like that if I understand what you're doing correctly; if you stole someone else's diamond from a chest instead of mining your own, that means you're trying to cheat… karma!.


If you want a more seamless experience, you may want to interest yourself in player inventory modification. With the method above, the diamond is visibly replaced by a different one, you can use this to make a seamless replacement.


Answer from user pppery at gaming.stackexchange.com.


[BACK]

Why does a voice say That won't work when missing attacks? Why does a voice say That won't work when missing attacks?

Posted On: October 5, 2023
Question from user greygryphon98 at BaldursGate3 at reddit. Answer: Adding onto other peoples answers - an ineffective strategy, under the guardians definition, seems to be one that doesnt activ...[More]


Whats a good strategy to get the Flower Power achievement? Whats a good strategy to get the Flower Power achievement?

Posted On: August 5, 2023
I'm playing Plants vs. Zombies on the iPhone and one of the achievements is "Flower Power: Keep 10 Twin Sunflowers Alive in a Single Level". I've tried on many different levels &mdas...[More]


I caught an Eevee, which of its evolutions will it evolve into? I caught an Eevee, which of its evolutions will it evolve into?

Posted On: February 14, 2023
So I just caught an Eevee. Now, I need 25 candies to evolve it. The fact is that in the GameBoy color versions, that Pokémon needed a stone to evolve instead of experience. Depending of the sto...[More]


Is there a limit for the waiting queue outside the vault? Is there a limit for the waiting queue outside the vault?

Posted On: December 13, 2023
Inspired by this question i wondered how many Dwellers can wait outside the vault. Even if there is no gameplay limit, what happens when more dwellers are waiting then can be graphically displayed bec...[More]


What does the Runescape Dismiss familiar button do when it is a pet? What does the Runescape Dismiss familiar button do when it is a pet?

Posted On: May 14, 2023
What happens when you click on the "Dismiss familiar" button when it's not a summon but a pet? By that I mean the rightmost button in: . Does the pet return to inventory? Does it go a...[More]


What does disliking a player do in DOTA 2? What does disliking a player do in DOTA 2?

Posted On: October 18, 2023
If I click "dislike player" after a match, what does that do? Question from user nightblade9 at stackexchange. Answer: Dota 2 Summer 2023 Patch notes state:. Additionally, we&rsq...[More]


What is the hidden trophy below Lore Master? What is the hidden trophy below Lore Master?

Posted On: August 25, 2023
In Lucky Luna's trophy list there is a hidden Story Mode trophy marked ??? near the bottom of the list. It sits between the trophies for Lore master and Taking flight. What are the requirements fo...[More]


In Skyrim How do I unselect a completed quest? In Skyrim How do I unselect a completed quest?

Posted On: May 3, 2023
A completed quest in my journal is selected, as shown below:. This causes new quests to not be selected immediately. How can I unselect it? Clicking on the quest title does not deselect it. Q...[More]


Is Pokemon Mystery Dungeon: Explorers of Darkness region-locked? Is Pokemon Mystery Dungeon: Explorers of Darkness region-locked?

Posted On: March 24, 2023
I have an Italian 3DS and I've bought a second-hand English Mystery Dungeon: Explorers of Darkness. I should be able to play it, but I can't, and I don't know why. According to this que...[More]


Making Money in Pokemon First Generation Making Money in Pokemon First Generation

Posted On: July 14, 2023
In the first generation of pokemon games, you can't do a rematch on trainers you have beat during the course of the game. Since you only get money by fighting trainers, how are you supposed to ...[More]