diff --git a/src/main/java/net/minecraft/entity/Entity.java b/src/main/java/net/minecraft/entity/Entity.java index 0ca21cc..95e8248 100644 --- a/src/main/java/net/minecraft/entity/Entity.java +++ b/src/main/java/net/minecraft/entity/Entity.java @@ -11,6 +11,10 @@ import java.util.UUID; import java.util.concurrent.Callable; +import org.ultramine.server.UMHooks; + +import com.mojang.authlib.GameProfile; + import net.minecraft.block.Block; import net.minecraft.block.BlockLiquid; import net.minecraft.block.material.Material; @@ -1302,7 +1306,7 @@ { try { - if(owner != null) p_70109_1_.setString("#", owner); + if(owner != null) UMHooks.writeObjectOwner(p_70109_1_, owner); p_70109_1_.setTag("Pos", this.newDoubleNBTList(new double[] {this.posX, this.posY + (double)this.ySize, this.posZ})); p_70109_1_.setTag("Motion", this.newDoubleNBTList(new double[] {this.motionX, this.motionY, this.motionZ})); p_70109_1_.setTag("Rotation", this.newFloatNBTList(new float[] {this.rotationYaw, this.rotationPitch})); @@ -1359,7 +1363,7 @@ { try { - owner = p_70020_1_.hasKey("#") ? p_70020_1_.getString("#") : null; + if(owner == null) owner = UMHooks.readObjectOwner(p_70020_1_); NBTTagList nbttaglist = p_70020_1_.getTagList("Pos", 6); NBTTagList nbttaglist1 = p_70020_1_.getTagList("Motion", 6); NBTTagList nbttaglist2 = p_70020_1_.getTagList("Rotation", 5); @@ -2476,15 +2480,15 @@ /* ===================================== ULTRAMINE START =====================================*/ - private String owner; + private GameProfile owner; - public final void setObjectOwner(String owner) + public final void setObjectOwner(GameProfile owner) { if(this.owner == null) this.owner = owner; } - public final String getObjectOwner() + public final GameProfile getObjectOwner() { return this.owner; } diff --git a/src/main/java/net/minecraft/tileentity/TileEntity.java b/src/main/java/net/minecraft/tileentity/TileEntity.java index be1b661..f8ffd2a 100644 --- a/src/main/java/net/minecraft/tileentity/TileEntity.java +++ b/src/main/java/net/minecraft/tileentity/TileEntity.java @@ -22,6 +22,9 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.ultramine.server.UMHooks; + +import com.mojang.authlib.GameProfile; public class TileEntity { @@ -67,7 +70,7 @@ public void readFromNBT(NBTTagCompound p_145839_1_) { - if(owner == null && p_145839_1_.hasKey("#")) owner = p_145839_1_.getString("#"); + if(owner == null) owner = UMHooks.readObjectOwner(p_145839_1_); this.xCoord = p_145839_1_.getInteger("x"); this.yCoord = p_145839_1_.getInteger("y"); this.zCoord = p_145839_1_.getInteger("z"); @@ -83,7 +86,7 @@ } else { - if(owner != null) p_145841_1_.setString("#", owner); + if(owner != null) UMHooks.writeObjectOwner(p_145841_1_, owner); p_145841_1_.setString("id", s); p_145841_1_.setInteger("x", this.xCoord); p_145841_1_.setInteger("y", this.yCoord); @@ -376,15 +379,15 @@ /* ======================================== ULTRAMINE START ===================================== */ - private String owner; + private GameProfile owner; - public final void setObjectOwner(String owner) + public final void setObjectOwner(GameProfile owner) { if(this.owner == null) this.owner = owner; } - public final String getObjectOwner() + public final GameProfile getObjectOwner() { return this.owner; } diff --git a/src/main/java/org/ultramine/server/UMHooks.java b/src/main/java/org/ultramine/server/UMHooks.java index 92ff291..b7a0200 100644 --- a/src/main/java/org/ultramine/server/UMHooks.java +++ b/src/main/java/org/ultramine/server/UMHooks.java @@ -1,7 +1,11 @@ package org.ultramine.server; +import java.util.UUID; + import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import org.apache.logging.log4j.LogManager; @@ -9,6 +13,8 @@ import org.ultramine.server.event.WorldEventProxy; import org.ultramine.server.event.WorldUpdateObject; +import com.mojang.authlib.GameProfile; + public class UMHooks { private static final Logger log = LogManager.getLogger(); @@ -71,4 +77,26 @@ log.error("Invoked here", new Throwable("stacktrace")); log.error("Original stacktrace", t); } + + public static GameProfile readObjectOwner(NBTTagCompound nbt) + { + UUID id = nbt.hasKey("$") ? new UUID(nbt.getLong("$"), nbt.getLong("%")) : null; + String username = nbt.hasKey("#") ? nbt.getString("#") : null; + if(id != null || username != null && !username.isEmpty()) + return MinecraftServer.getServer().getConfigurationManager().getDataLoader().internGameProfile(id, username); + return null; + } + + public static void writeObjectOwner(NBTTagCompound nbt, GameProfile owner) + { + UUID id = owner.getId(); + String username = owner.getName(); + if(id != null) + { + nbt.setLong("$", id.getMostSignificantBits()); + nbt.setLong("%", id.getLeastSignificantBits()); + } + if(username != null) + nbt.setString("#", username); + } } diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index 4142f02..3f63473 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -457,6 +457,18 @@ getDataProvider().savePlayer(player.getGameProfile(), nbt); } + public GameProfile internGameProfile(GameProfile profile) + { + PlayerData data = profile.getId() != null ? playerDataCache.get(profile.getId()) : namedPlayerDataCache.get(profile.getName().toLowerCase()); + return data != null ? data.getProfile() : profile; + } + + public GameProfile internGameProfile(UUID id, String username) + { + PlayerData data = id != null ? playerDataCache.get(id) : namedPlayerDataCache.get(username.toLowerCase()); + return data != null ? data.getProfile() : new GameProfile(id, username); + } + private static class LoadedDataStruct { private final NBTTagCompound nbt; diff --git a/src/main/java/org/ultramine/server/event/ServerWorldEventProxy.java b/src/main/java/org/ultramine/server/event/ServerWorldEventProxy.java index acb7386..cedecfc 100644 --- a/src/main/java/org/ultramine/server/event/ServerWorldEventProxy.java +++ b/src/main/java/org/ultramine/server/event/ServerWorldEventProxy.java @@ -2,6 +2,8 @@ import org.ultramine.server.chunk.ChunkHash; +import com.mojang.authlib.GameProfile; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gnu.trove.list.TLongList; @@ -94,7 +96,7 @@ } @Override - public String getObjectOwner() + public GameProfile getObjectOwner() { switch(object.getType()) { @@ -110,7 +112,7 @@ case ENTITY_WEATHER: break; case PLAYER: - return ((EntityPlayer)object.getEntity()).getGameProfile().getName(); + return ((EntityPlayer)object.getEntity()).getGameProfile(); case TILEE_ENTITY: return object.getTileEntity().getObjectOwner(); case UNKNOWN: diff --git a/src/main/java/org/ultramine/server/event/WorldEventProxy.java b/src/main/java/org/ultramine/server/event/WorldEventProxy.java index b46900c..bd6dae2 100644 --- a/src/main/java/org/ultramine/server/event/WorldEventProxy.java +++ b/src/main/java/org/ultramine/server/event/WorldEventProxy.java @@ -1,5 +1,7 @@ package org.ultramine.server.event; +import com.mojang.authlib.GameProfile; + import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; @@ -56,7 +58,7 @@ { } - public String getObjectOwner() + public GameProfile getObjectOwner() { return null; } diff --git a/src/main/java/org/ultramine/server/event/WorldUpdateObject.java b/src/main/java/org/ultramine/server/event/WorldUpdateObject.java index b75ae65..e5dafad 100644 --- a/src/main/java/org/ultramine/server/event/WorldUpdateObject.java +++ b/src/main/java/org/ultramine/server/event/WorldUpdateObject.java @@ -1,5 +1,7 @@ package org.ultramine.server.event; +import com.mojang.authlib.GameProfile; + import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -131,7 +133,7 @@ return intz; } - public String getOwner() + public GameProfile getOwner() { switch(type) { @@ -141,11 +143,11 @@ break; case ENTITY: - return entity.isEntityPlayerMP() ? ((EntityPlayer)entity).getGameProfile().getName() : entity.getObjectOwner(); + return entity.isEntityPlayerMP() ? ((EntityPlayer)entity).getGameProfile() : entity.getObjectOwner(); case ENTITY_WEATHER: break; case PLAYER: - return ((EntityPlayer)getEntity()).getGameProfile().getName(); + return ((EntityPlayer)getEntity()).getGameProfile(); case TILEE_ENTITY: return getTileEntity().getObjectOwner(); case UNKNOWN: