package org.bukkit.craftbukkit.entity;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import net.minecraft.server.EntityHuman;
import net.minecraft.server.EntityPlayer;
import net.minecraft.server.ItemInWorldManager;
import net.minecraft.server.Packet;
import net.minecraft.server.Packet3Chat;
import net.minecraft.server.Packet6SpawnPosition;
import net.minecraft.server.ServerConfigurationManager;
import net.minecraft.server.WorldServer;
import org.buckit.Config;
import org.buckit.access.AccessLevel;
import org.buckit.model.UserDataHolder;
import org.bukkit.Location;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.TextWrapper;
import org.bukkit.entity.Player;
public class CraftPlayer extends CraftHumanEntity implements Player {
public CraftPlayer(CraftServer server, EntityPlayer entity) {
super(server, entity);
//Buck - It
loadBuckItData();
}
public boolean isOp() {
return server.getHandle().h(getName());
}
public boolean isPlayer() {
return true;
}
public boolean isOnline() {
for (Object obj: server.getHandle().b) {
EntityPlayer player = (EntityPlayer) obj;
if (player.name.equalsIgnoreCase(getName())) {
return true;
}
}
return false;
}
public InetSocketAddress getAddress() {
SocketAddress addr = getHandle().a.b.b();
if (addr instanceof InetSocketAddress) {
return (InetSocketAddress) addr;
} else {
return null;
}
}
@Override
public EntityPlayer getHandle() {
return (EntityPlayer) entity;
}
public double getEyeHeight() {
return getEyeHeight(false);
}
public double getEyeHeight(boolean ignoreSneaking) {
if (ignoreSneaking) {
return 1.62D;
} else {
if (isSneaking()) {
return 1.42D;
} else {
return 1.62D;
}
}
}
public void setHandle(final EntityPlayer entity) {
super.setHandle((EntityHuman) entity);
this.entity = entity;
}
public void sendRawMessage(String message) {
getHandle().a.b(new Packet3Chat(message));
}
public void sendMessage(String message) {
for (final String line: TextWrapper.wrapText(message)) {
getHandle().a.b(new Packet3Chat(line));
}
}
public String getDisplayName() {
return getHandle().displayName;
}
public void setDisplayName(final String name) {
getHandle().displayName = name;
}
@Override
public String toString() {
return "CraftPlayer{" + "name=" + getName() + '}';
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final CraftPlayer other = (CraftPlayer) obj;
if ((this.getName() == null) ? (other.getName() != null) : !this.getName().equals(other.getName())) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 97 * hash + (this.getName() != null ? this.getName().hashCode() : 0);
return hash;
}
public void kickPlayer(String message) {
getHandle().a.a(message == null ? "" : message);
}
public void setCompassTarget(Location loc) {
// Do not directly assign here, from the packethandler we'll assign it.
getHandle().a.b((Packet) new Packet6SpawnPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
}
public Location getCompassTarget() {
return getHandle().compassTarget;
}
public void chat(String msg) {
getHandle().a.chat(msg);
}
public boolean performCommand(String command) {
return server.dispatchCommand(this, command);
}
@Override
public boolean teleport(Location location) {
WorldServer oldWorld = ((CraftWorld)getWorld()).getHandle();
WorldServer newWorld = ((CraftWorld)location.getWorld()).getHandle();
ServerConfigurationManager manager = server.getHandle();
EntityPlayer entity = getHandle();
boolean teleportSuccess;
if (oldWorld != newWorld) {
EntityPlayer newEntity = new EntityPlayer(manager.c, newWorld, entity.name, new ItemInWorldManager(newWorld));
newEntity.id = entity.id;
newEntity.a = entity.a;
newEntity.health = entity.health;
newEntity.fireTicks = entity.fireTicks;
newEntity.inventory = entity.inventory;
newEntity.inventory.d = newEntity;
newEntity.activeContainer = entity.activeContainer;
newEntity.defaultContainer = entity.defaultContainer;
newEntity.lastwarp = entity.lastwarp;// Buck - It
newEntity.locX = location.getX();
newEntity.locY = location.getY();
newEntity.locZ = location.getZ();
newEntity.displayName = entity.displayName;
newEntity.compassTarget = entity.compassTarget;
newEntity.fauxSleeping = entity.fauxSleeping;
newWorld.u.c((int) location.getBlockX() >> 4, (int) location.getBlockZ() >> 4);
teleportSuccess = newEntity.a.teleport(location);
if (teleportSuccess) {
manager.c.k.a(entity);
manager.c.k.b(entity);
oldWorld.manager.b(entity);
manager.b.remove(entity);
oldWorld.e(entity);
newWorld.manager.a(newEntity);
newWorld.a(newEntity);
manager.b.add(newEntity);
entity.a.e = newEntity;
this.entity = newEntity;
setCompassTarget(getCompassTarget());
}
return teleportSuccess;
} else {
return entity.a.teleport(location);
}
}
public void setSneaking(boolean sneak) {
getHandle().e(sneak);
}
public boolean isSneaking() {
return getHandle().Z();
}
public void loadData() {
server.getHandle().n.b(getHandle());
}
public void saveData() {
server.getHandle().n.a(getHandle());
}
public void updateInventory() {
getHandle().m();
}
public void setSleepingIgnored(boolean isSleeping) {
getHandle().fauxSleeping = isSleeping;
((CraftWorld)getWorld()).getHandle().checkSleepStatus();
}
public boolean isSleepingIgnored() {
return getHandle().fauxSleeping;
}
/*
* Buck - It functions
*
*/
private UserDataHolder dataholder;
private void loadBuckItData(){
dataholder = server.getDataSourceManager().getUserDataSource().getUserData(getName().toLowerCase());
dataholder.setOnline(true);
String format = Config.DEFAULT_USER_FORMAT;
if(dataholder.getUsernameformat() != null && !dataholder.getUsernameformat().equals(""))
format = dataholder.getUsernameformat();
else if(getAccessLevel().getUsernameformat() != null && !getAccessLevel().getUsernameformat().equals(""))
format = getAccessLevel().getUsernameformat();
setDisplayName(format.replace("{$username}", getName()).replace("{$group}", getAccessLevel().getName()).replace("^", "\u00A7"));
}
public void reloadBuckItData() {
try {
loadBuckItData();
} catch(Throwable t) {
server.getLogger().warning("Error reloading Buck - It data of player " + getName() + ", error:");
t.printStackTrace();
}
}
@Override
public boolean canBuild() {
return getAccessLevel().canBuild() || dataholder.canbuild();
}
@Override
// TODO: optimize
public boolean canUseCommand(String command) {
if(dataholder.canUseCommand(command, getWorld().getName()))
return true;
if(dataholder.canUseCommand(Config.FULL_ACCESS_STRING, getWorld().getName()))
return true;
String[] split = command.split(".");
if(split.length > 1){
for(int i = 0;i < split.length;i++){
String t = split[0];
for(int x = 1;x <= i;x++)
t += "." + split[x];
t += "."+Config.FULL_ACCESS_STRING;
if(dataholder.canUseCommand(t, getWorld().getName()))
return true;
}
}
return false;
}
@Override
public boolean isAdmin() {
return getAccessLevel().isAdmin() || dataholder.isAdmin();
}
@Override
public AccessLevel getAccessLevel() {
return dataholder.getAccessLevel();
}
@Override
public int getPlayerId() {
return dataholder.getId();
}
@Override
public UserDataHolder getUserDataHolder() {
return dataholder;
}
}