package org.bukkit.craftbukkit; import com.mojang.authlib.GameProfile; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import org.bukkit.BanList; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.Server; import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.entity.Player; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; import org.ultramine.server.data.IDataProvider; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; @SerializableAs("Player") public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializable { private final GameProfile profile; private final CraftServer server; private final IDataProvider storage; protected CraftOfflinePlayer(CraftServer server, GameProfile profile) { this.server = server; this.profile = profile; this.storage = server.console.getConfigurationManager().getDataLoader().getDataProvider(); } public GameProfile getProfile() { return profile; } public boolean isOnline() { return getPlayer() != null; } public String getName() { Player player = getPlayer(); if(player != null) { return player.getName(); } // This might not match lastKnownName but if not it should be more correct if(profile.getName() != null) { return profile.getName(); } NBTTagCompound data = getBukkitData(); if(data != null) { if(data.hasKey("lastKnownName")) { return data.getString("lastKnownName"); } } return null; } public UUID getUniqueId() { return profile.getId(); } public Server getServer() { return server; } public boolean isOp() { return server.getHandle().func_152596_g(profile); } public void setOp(boolean value) { if(value == isOp()) { return; } if(value) { server.getHandle().func_152605_a(profile); } else { server.getHandle().func_152610_b(profile); } } public boolean isBanned() { if(getName() == null) { return false; } return server.getBanList(BanList.Type.NAME).isBanned(getName()); } public void setBanned(boolean value) { if(getName() == null) { return; } if(value) { server.getBanList(BanList.Type.NAME).addBan(getName(), null, null, null); } else { server.getBanList(BanList.Type.NAME).pardon(getName()); } } public boolean isWhitelisted() { return server.getHandle().func_152607_e(profile); // Cauldron } public void setWhitelisted(boolean value) { if(value) { server.getHandle().func_152601_d(profile); } else { server.getHandle().func_152597_c(profile); } } public Map<String, Object> serialize() { Map<String, Object> result = new LinkedHashMap<String, Object>(); result.put("UUID", profile.getId().toString()); return result; } public static OfflinePlayer deserialize(Map<String, Object> args) { // Backwards comparability if(args.get("name") != null) { return Bukkit.getServer().getOfflinePlayer((String) args.get("name")); } return Bukkit.getServer().getOfflinePlayer(UUID.fromString((String) args.get("UUID"))); } @Override public String toString() { return getClass().getSimpleName() + "[UUID=" + profile.getId() + "]"; } public Player getPlayer() { for(Object obj : server.getHandle().playerEntityList) { EntityPlayerMP player = (EntityPlayerMP) obj; if(player.getUniqueID().equals(getUniqueId())) { return (player.playerNetServerHandler != null) ? (Player) ((IMixinEntity) player).getBukkitEntity() : null; // Cauldron } } return null; } @Override public boolean equals(Object obj) { if(obj == null || !(obj instanceof OfflinePlayer)) { return false; } OfflinePlayer other = (OfflinePlayer) obj; if((this.getUniqueId() == null) || (other.getUniqueId() == null)) { return false; } return this.getUniqueId().equals(other.getUniqueId()); } @Override public int hashCode() { int hash = 5; hash = 97 * hash + (this.getUniqueId() != null ? this.getUniqueId().hashCode() : 0); return hash; } private NBTTagCompound getData() { return storage.loadPlayer(getProfile()); } private NBTTagCompound getBukkitData() { NBTTagCompound result = getData(); if(result != null) { if(!result.hasKey("bukkit")) { result.setTag("bukkit", new net.minecraft.nbt.NBTTagCompound()); } result = result.getCompoundTag("bukkit"); } return result; } public long getFirstPlayed() { Player player = getPlayer(); if(player != null) return player.getFirstPlayed(); net.minecraft.nbt.NBTTagCompound data = getBukkitData(); if(data != null) { if(data.hasKey("firstPlayed")) { return data.getLong("firstPlayed"); } else { //File file = getDataFile(); //return file.lastModified(); return 0; } } else { return 0; } } public long getLastPlayed() { Player player = getPlayer(); if(player != null) return player.getLastPlayed(); net.minecraft.nbt.NBTTagCompound data = getBukkitData(); if(data != null) { if(data.hasKey("lastPlayed")) { return data.getLong("lastPlayed"); } else { //File file = getDataFile(); //return file.lastModified(); return 0; } } else { return 0; } } public boolean hasPlayedBefore() { return getData() != null; } public Location getBedSpawnLocation() { net.minecraft.nbt.NBTTagCompound data = getData(); if(data == null) return null; if(data.hasKey("SpawnX") && data.hasKey("SpawnY") && data.hasKey("SpawnZ")) { String spawnWorld = data.getString("SpawnWorld"); if(spawnWorld.equals("")) { spawnWorld = server.getWorlds().get(0).getName(); } return new Location(server.getWorld(spawnWorld), data.getInteger("SpawnX"), data.getInteger("SpawnY"), data.getInteger("SpawnZ")); } return null; } public void setMetadata(String metadataKey, MetadataValue metadataValue) { server.getPlayerMetadata().setMetadata(this, metadataKey, metadataValue); } public List<MetadataValue> getMetadata(String metadataKey) { return server.getPlayerMetadata().getMetadata(this, metadataKey); } public boolean hasMetadata(String metadataKey) { return server.getPlayerMetadata().hasMetadata(this, metadataKey); } public void removeMetadata(String metadataKey, Plugin plugin) { server.getPlayerMetadata().removeMetadata(this, metadataKey, plugin); } }