You want to do this with scoreboards. My solution won't prevent getting diamond swords, but it will prevent crafting them and using them, i.e. a player can have a diamond sword in their inventory, as long as they never use it. How it gets there without crafting it, though, is pretty much impossible without cheats.
First, you need to set up 2 scoreboard objectives, one for crafting, and one for using:
/scoreboard objectives add craftedDiamondSword stat.craftItem.276
/scoreboard objectives add usedDiamondSword stat.useItem.276
Next, you need to set up two nearly identical chains of command blocks, one for each scoreboard objective. This will run on a clock like you already have. I'll only give the commands for using, so just replace that in the second chain with the crafting objective.
First, clear those players inventories:
clear @a[score_usedDiamondSword_min=1] 276
Next, tell the players that used a diamond sword to not use it, and reset their score:
tell @a[score_usedDiamondSword_min=1] Don't use diamond swords!
scoreboard players set @a[score_usedDiamondSword_min=1] usedDiamondSword 0
This last command block doesn't really need the [score_usedDiamondSword_min=1]
but it's useful.
I got this to work in a single line of command blocks with redstone over top for the uses chain, but it wouldn't work for the crafting. The solution is to pipe the result from the clear command block into the tell and set scoreboard command blocks with comparators. Here's a pic of the two setups:
Use whatever clock you want.
Additionally, if you never, ever want players to have a diamond sword, even in their inventory, and even if they don't use it, you can still clear from @a
, and then just say
to not use diamond swords if one is found.
Update for added 1.8 functionality:
The 1.8 snapshots have added the option to match players against the Inventory
NBT tag when setting or incrementing a scoreboard objective. This means we can set up a dummy scoreboard objective to track whenever someone has a Diamond Sword in their inventory, regardless if they've used it or crafted it. First, set up the scoreboard objective:
/scoreboard objectives add hasDiamondSword dummy
Next, we need to run two command blocks on the same clock; one to set players scores, and another to check those player's scores and clear the diamond swords:
scoreboard players add @a hasDiamondSword 1 {Inventory:[{id:"minecraft:diamond_sword"}]}
clear @a[score_hasDiamondSword_min=1] minecraft:diamond_sword
The second command is fairly similar to the old commands, except instead of using the old ID number, I'm using the name instead. The first is a bit more complicated, so let's walk through it. Basically it says add to all players on their hasDiamondSword
objective the value 1 if that player has an inventory and that inventory contains a diamond sword. So, for anyone that has a diamond sword in their inventory, their hasDiamondSword
objective will be incremented.
Finally, like in the old version, we need to tell
the players to not use diamond swords, and to reset their hasDiamondSword
objective:
tell @a[score_hasDiamondSword_min=1] Don't use diamond swords!
scoreboard players set @a[score_hasDiamondSword_min=1] hasDiamondSword 0
I stacked these two command blocks (with the tell
on bottom) and fed them with a comparator from the clear
command block. This is what it all looks like in the end:
First make sure that the relevant objectives are set up:
/scoreboard objectives add hotbarlock dummy
/scoreboard objectives add inGame dummy
/scoreboard objectives add dropitem dummy
And that you have the correct scores:
/scoreboard players set @p hotbarlock 0
/scoreboard players set @p inGame 1
The first two commands should be fine, but there are a few errors with the third command:
You have missed a space between the first selector and ~
.
You have written "typeItem" rather than "type=Item".
You have not given the full item ID, which is "minecraft:iron_sword".
Correct the third command to:
execute @e[score_inGame_min=1,score_hotbarlock=0] ~ ~ ~ scoreboard players set @e[type=Item,r=2] dropitem 1 {Item:{id:"minecraft:iron_sword",tag:{ench:[],display:{Name:"Vladimir",Lore:["Who names their sword that?!"]}}}}
After setting up the objectives properly, and correcting the third command, the system should work.
Best Answer
This is impossible. Minecraft doesn't have variables like strings. The best you can do is to output the command in chat, like this:
If you have the log output open, you can then copy the command into chat and run it. A modded client could also automatically execute it, but not a regular Vanilla client.