blob: c49cbcbd097b4e4b3d9b9298efc9699c409ae8bf [file] [log] [blame] [raw]
package net.glowstone;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import net.glowstone.entity.meta.profile.PlayerProfile;
import net.glowstone.entity.meta.profile.ProfileCache;
import net.glowstone.io.PlayerDataService.PlayerReader;
import org.bukkit.BanList.Type;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.serialization.SerializableAs;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Represents a player which is not connected to the server.
*/
@SerializableAs("Player")
@ToString(of = {"name", "uuid"})
@EqualsAndHashCode(of = "uuid")
public final class GlowOfflinePlayer implements OfflinePlayer {
private final GlowServer server;
private PlayerProfile profile;
private boolean hasPlayed;
private long firstPlayed;
private long lastPlayed;
private String lastName;
private Location bedSpawn;
/**
* Create a new offline player for the given name. If possible, the player's
* UUID will be found and then their data.
*
* @param server The server of the offline player. Must not be null.
* @param profile The profile associated with the player. Must not be null.
*/
public GlowOfflinePlayer(GlowServer server, PlayerProfile profile) {
checkNotNull(server, "server must not be null");
checkNotNull(profile, "profile must not be null");
this.server = server;
this.profile = profile;
loadData();
}
/**
* Create a new offline player for the given UUID. If possible, the
* player's data (including name) will be loaded based on the UUID.
*
* @param server The server of the offline player. Must not be null.
* @param name The name of the player. Must not be null.
*/
public GlowOfflinePlayer(GlowServer server, String name) {
checkNotNull(server, "server must not be null");
checkNotNull(name, "name cannot be null");
this.server = server;
profile = PlayerProfile.getProfile(name);
loadData();
}
/**
* Create a new offline player for the given UUID. If possible, the player's
* data (including name) will be loaded based on the UUID.
*
* @param server The server of the offline player. Must not be null.
* @param uuid The UUID of the player. Must not be null.
*/
public GlowOfflinePlayer(GlowServer server, UUID uuid) {
checkNotNull(server, "server must not be null");
checkNotNull(uuid, "UUID must not be null");
this.server = server;
profile = ProfileCache.getProfile(uuid);
loadData();
}
@SuppressWarnings("UnusedDeclaration")
public static OfflinePlayer deserialize(Map<String, Object> val) {
if (val.get("name") != null) {
// use name
return Bukkit.getServer().getOfflinePlayer(val.get("name").toString());
} else {
// use UUID
return Bukkit.getServer().getOfflinePlayer(UUID.fromString(val.get("UUID").toString()));
}
}
////////////////////////////////////////////////////////////////////////////
// Core properties
private void loadData() {
try (PlayerReader reader = server.getPlayerDataService().beginReadingData(getUniqueId())) {
hasPlayed = reader.hasPlayedBefore();
if (hasPlayed) {
firstPlayed = reader.getFirstPlayed();
lastPlayed = reader.getLastPlayed();
bedSpawn = reader.getBedSpawnLocation();
String lastName = reader.getLastKnownName();
if (lastName != null) {
this.lastName = lastName;
}
}
}
}
@Override
public String getName() {
Player player = getPlayer();
if (player != null) {
return player.getName();
}
if (profile.getName() != null) {
return profile.getName();
}
if (lastName != null) {
return lastName;
}
return null;
}
@Override
public UUID getUniqueId() {
return profile.getUniqueId();
}
@Override
public boolean isOnline() {
return getPlayer() != null;
}
////////////////////////////////////////////////////////////////////////////
// Player properties
@Override
public Player getPlayer() {
if (getUniqueId() != null) {
return server.getPlayer(getUniqueId());
} else {
return server.getPlayerExact(getName());
}
}
@Override
public boolean hasPlayedBefore() {
return hasPlayed;
}
@Override
public long getFirstPlayed() {
return firstPlayed;
}
@Override
public long getLastPlayed() {
return lastPlayed;
}
////////////////////////////////////////////////////////////////////////////
// Ban, op, whitelist
@Override
public Location getBedSpawnLocation() {
return bedSpawn;
}
@Override
public boolean isBanned() {
return server.getBanList(Type.NAME).isBanned(getName());
}
@Override
@Deprecated
public void setBanned(boolean banned) {
server.getBanList(Type.NAME).addBan(getName(), null, null, null);
}
@Override
public boolean isWhitelisted() {
return server.getWhitelist().containsProfile(profile);
}
@Override
public void setWhitelisted(boolean value) {
if (value) {
server.getWhitelist().add(this);
} else {
server.getWhitelist().remove(profile);
}
}
@Override
public boolean isOp() {
return server.getOpsList().containsUUID(getUniqueId());
}
////////////////////////////////////////////////////////////////////////////
// Serialization
@Override
public void setOp(boolean value) {
if (value) {
server.getOpsList().add(this);
} else {
server.getOpsList().remove(profile);
}
}
@Override
public Map<String, Object> serialize() {
Map<String, Object> ret = new HashMap<>();
ret.put("UUID", getUniqueId().toString());
return ret;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GlowOfflinePlayer that = (GlowOfflinePlayer) o;
return profile.equals(that.profile);
}
public int hashCode() {
return getUniqueId() != null ? getUniqueId().hashCode() : 0;
}
@Override
public String toString() {
return "GlowOfflinePlayer{" +
"name='" + getName() + '\'' +
", uuid=" + getUniqueId() +
'}';
}
}