All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bukkit.craftbukkit.CraftOfflinePlayer Maven / Gradle / Ivy

There is a newer version: 2.4.0
Show newest version
package org.bukkit.craftbukkit;

import com.mojang.authlib.GameProfile;
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.WorldNBTStorage;
import org.bukkit.*;
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 java.io.File;
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 WorldNBTStorage storage;

  protected CraftOfflinePlayer(CraftServer server, GameProfile profile) {
    this.server = server;
    this.profile = profile;
    this.storage = (WorldNBTStorage) (server.console.worlds.get(0).getDataManager());

  }

  public static OfflinePlayer deserialize(Map 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")));
  }

  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().isOp(profile);
  }

  public void setOp(boolean value) {
    if (value == isOp()) {
      return;
    }

    if (value) {
      server.getHandle().addOp(profile);
    } else {
      server.getHandle().removeOp(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().getWhitelist().isWhitelisted(profile);
  }

  public void setWhitelisted(boolean value) {
    if (value) {
      server.getHandle().addWhitelist(profile);
    } else {
      server.getHandle().removeWhitelist(profile);
    }
  }

  public Map serialize() {
    Map result = new LinkedHashMap();

    result.put("UUID", profile.getId().toString());

    return result;
  }

  @Override
  public String toString() {
    return getClass().getSimpleName() + "[UUID=" + profile.getId() + "]";
  }

  public Player getPlayer() {
    return server.getPlayer(getUniqueId());
  }

  @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.getPlayerData(getUniqueId().toString());
  }

  private NBTTagCompound getBukkitData() {
    NBTTagCompound result = getData();

    if (result != null) {
      if (!result.hasKey("bukkit")) {
        result.set("bukkit", new NBTTagCompound());
      }
      result = result.getCompound("bukkit");
    }

    return result;
  }

  private File getDataFile() {
    return new File(storage.getPlayerDir(), getUniqueId() + ".dat");
  }

  public long getFirstPlayed() {
    Player player = getPlayer();
    if (player != null) return player.getFirstPlayed();

    NBTTagCompound data = getBukkitData();

    if (data != null) {
      if (data.hasKey("firstPlayed")) {
        return data.getLong("firstPlayed");
      } else {
        File file = getDataFile();
        return file.lastModified();
      }
    } else {
      return 0;
    }
  }

  public long getLastPlayed() {
    Player player = getPlayer();
    if (player != null) return player.getLastPlayed();

    NBTTagCompound data = getBukkitData();

    if (data != null) {
      if (data.hasKey("lastPlayed")) {
        return data.getLong("lastPlayed");
      } else {
        File file = getDataFile();
        return file.lastModified();
      }
    } else {
      return 0;
    }
  }

  public boolean hasPlayedBefore() {
    return getData() != null;
  }

  public Location getBedSpawnLocation() {
    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.getInt("SpawnX"), data.getInt("SpawnY"), data.getInt("SpawnZ"));
    }
    return null;
  }

  public void setMetadata(String metadataKey, MetadataValue metadataValue) {
    server.getPlayerMetadata().setMetadata(this, metadataKey, metadataValue);
  }

  public List 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);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy