How to reproduce
Place a minecart with command block
Leave and reopen the world
Destroy it in creative mode using your hand, a sword / tool or an arrow
→ The minecart with command block drops a (regular) minecart (item) named "@", whereas an empty / normal minecart would’ve dropped nothing after these steps. Also if you don’t leave and reopen the world first, the minecart with command blocks drops nothing either.
Code analysis
The following is based on decompiled version of Minecraft 1.8 using MCP. All method and class names are the names used in the decompiled version.
The reason why this happens is that the public void writeDataToNBT(NBTTagCompound p_145758_1_)
method of the net.minecraft.command.server.CommandBlockLogic
class always saves the CustomName
in the NBT data. As this only happens when you unload the minecart or reopen the world a MinecartCommandBlock that is summoned and directly destroyed does not cause this. Instead the method should only save the CustomName
if it is not "@".
/**
* Stores data to NBT format.
*/
public void writeDataToNBT(NBTTagCompound p_145758_1_)
{
p_145758_1_.setString("Command", this.commandStored);
p_145758_1_.setInteger("SuccessCount", this.successCount);
// Replaced this
//p_145758_1_.setString("CustomName", this.customName);
if (!this.customName.equals("@")) {
p_145758_1_.setString("CustomName", this.customName);
}
p_145758_1_.setBoolean("TrackOutput", this.trackOutput);
if (this.lastOutput != null && this.trackOutput)
{
p_145758_1_.setString("LastOutput", IChatComponent.Serializer.componentToJson(this.lastOutput));
}
this.field_175575_g.func_179670_b(p_145758_1_);
}
Linked issues
is duplicated by 5
testing discovered 1
Attachments
Comments 23
Please link to this comment in the description
The following is based on decompiled version of Minecraft 1.8 using MCP. All method and class names are the names used in the decompiled version.
The reason why this happens is that the public void writeDataToNBT(NBTTagCompound p_145758_1_)
method of the net.minecraft.command.server.CommandBlockLogic
class always saves the CustomName
in the NBT data. As this only happens when you unload the minecart or reopen the world a MinecartCommandBlock that is summoned and directly destroyed does not cause this. Instead the method should only save the CustomName
if it is not "@".
/**
* Stores data to NBT format.
*/
public void writeDataToNBT(NBTTagCompound p_145758_1_)
{
p_145758_1_.setString("Command", this.commandStored);
p_145758_1_.setInteger("SuccessCount", this.successCount);
// Replaced this
//p_145758_1_.setString("CustomName", this.customName);
if (!this.customName.equals("@")) {
p_145758_1_.setString("CustomName", this.customName);
}
p_145758_1_.setBoolean("TrackOutput", this.trackOutput);
if (this.lastOutput != null && this.trackOutput)
{
p_145758_1_.setString("LastOutput", IChatComponent.Serializer.componentToJson(this.lastOutput));
}
this.field_175575_g.func_179670_b(p_145758_1_);
}
Destroying one that is renamed without relogging drops a regular minecart, with the same name. Though, placing it down and relogging still drops a minecart named "@".
Confirmed