package com.github.jamesnorris.ablockalypse.aspect;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.WeatherType;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.util.Vector;
import com.github.jamesnorris.ablockalypse.utility.BukkitUtility;
import com.github.jamesnorris.ablockalypse.utility.SerialLocation;
public class PlayerState extends PermanentAspect {
private int level, foodLevel, fireTicks, maxAir, maxNoDamageTicks, noDamageTicks, remainingAir, heldSlot;
private double health, lastDamage, maxHealth;
private ItemStack[] inventoryContents, armorContents;
private float exp, saturation, fallDistance, exhaustion, flySpeed, walkSpeed;
private Location location, bedSpawn, compassTarget;
private boolean sleepingIgnored, allowFlight, canPickupItems, flying, banned, op, sneaking, sprinting, whitelisted;
private Collection<PotionEffect> potionEffects;
private String name, customName, displayName, listName;
private ItemStack itemInHand;
private EntityDamageEvent lastDamageCause;
private long time;
private WeatherType weather;
private Scoreboard scoreboard;
private Vector velocity;
private GameMode gameMode;
@SuppressWarnings("unchecked") public PlayerState(Map<String, Object> save) {
level = (Integer) save.get("level");
foodLevel = (Integer) save.get("food_level");
fireTicks = (Integer) save.get("fire_ticks");
maxAir = (Integer) save.get("max_air");
maxNoDamageTicks = (Integer) save.get("max_no_damage_ticks");
noDamageTicks = (Integer) save.get("no_damage_ticks");
remainingAir = (Integer) save.get("remaining_air");
heldSlot = (Integer) save.get("held_slot");
health = (Double) save.get("health");
lastDamage = (Double) save.get("last_damage");
maxHealth = (Double) save.get("max_health");
List<Map<String, Object>> serialInventoryContents = (List<Map<String, Object>>) save.get("inventory_contents");
ItemStack[] contents = new ItemStack[serialInventoryContents.size()];
for (int i = 0; i < serialInventoryContents.size(); i++) {
contents[i] = ItemStack.deserialize(serialInventoryContents.get(i));
}
inventoryContents = contents;
List<Map<String, Object>> serialArmorContents = (List<Map<String, Object>>) save.get("armor_contents");
ItemStack[] contents2 = new ItemStack[serialArmorContents.size()];
for (int i = 0; i < serialArmorContents.size(); i++) {
contents2[i] = ItemStack.deserialize(serialArmorContents.get(i));
}
armorContents = contents2;
exp = (Float) save.get("exp");
saturation = (Float) save.get("saturation");
fallDistance = (Float) save.get("fall_distance");
exhaustion = (Float) save.get("exhaustion");
flySpeed = (Float) save.get("fly_speed");
walkSpeed = (Float) save.get("walk_speed");
location = SerialLocation.returnLocation((SerialLocation) save.get("location"));
if (save.get("bed_spawn") != null) {
bedSpawn = SerialLocation.returnLocation((SerialLocation) save.get("bed_spawn"));
}
if (save.get("compass_target") != null) {
compassTarget = SerialLocation.returnLocation((SerialLocation) save.get("compass_target"));
}
sleepingIgnored = (Boolean) save.get("sleeping_ignored");
allowFlight = (Boolean) save.get("allow_flight");
canPickupItems = (Boolean) save.get("can_pickup_items");
flying = (Boolean) save.get("flying");
banned = (Boolean) save.get("banned");
op = (Boolean) save.get("op");
sneaking = (Boolean) save.get("sneaking");
sprinting = (Boolean) save.get("sprinting");
whitelisted = (Boolean) save.get("whitelisted");
potionEffects = new ArrayList<PotionEffect>();
List<Map<String, Object>> serialPotionEffects = (List<Map<String, Object>>) save.get("potion_effects");
for (Map<String, Object> serialEffect : serialPotionEffects) {
potionEffects.add(new PotionEffect(serialEffect));
}
name = (String) save.get("name");
customName = (String) save.get("custom_name");
displayName = (String) save.get("display_name");
listName = (String) save.get("list_name");
itemInHand = ItemStack.deserialize((Map<String, Object>) save.get("item_in_hand"));
time = (Long) save.get("time");
weather = save.get("weather_name") == null ? WeatherType.CLEAR : WeatherType.valueOf((String) save.get("weather_name"));// common null pointer
gameMode = GameMode.getByValue((Integer) save.get("game_mode"));
}
public PlayerState(Player player) {
level = player.getLevel();
health = player.getHealth();
foodLevel = player.getFoodLevel();
fireTicks = player.getFireTicks();
lastDamage = player.getLastDamage();
maxHealth = player.getMaxHealth();
maxAir = player.getMaximumAir();
maxNoDamageTicks = player.getMaximumNoDamageTicks();
noDamageTicks = player.getNoDamageTicks();
remainingAir = player.getRemainingAir();
heldSlot = player.getInventory().getHeldItemSlot();
inventoryContents = player.getInventory().getContents();
armorContents = player.getInventory().getArmorContents();
exp = player.getExp();
saturation = player.getSaturation();
fallDistance = player.getFallDistance();
exhaustion = player.getExhaustion();
flySpeed = player.getFlySpeed();
walkSpeed = player.getWalkSpeed();
location = player.getLocation();
bedSpawn = player.getBedSpawnLocation();
compassTarget = player.getCompassTarget();
sleepingIgnored = player.isSleepingIgnored();
allowFlight = player.getAllowFlight();
canPickupItems = player.getCanPickupItems();
flying = player.isFlying();
banned = player.isBanned();
op = player.isOp();
sneaking = player.isSneaking();
sprinting = player.isSprinting();
whitelisted = player.isWhitelisted();
potionEffects = player.getActivePotionEffects();
name = player.getName();
customName = player.getCustomName();
displayName = player.getDisplayName();
listName = player.getPlayerListName();
itemInHand = player.getItemInHand();
lastDamageCause = player.getLastDamageCause();
time = player.getPlayerTime();
weather = player.getPlayerWeather();
scoreboard = player.getScoreboard();
velocity = player.getVelocity();
gameMode = player.getGameMode();
}
@Override public String getHeader() {
return this.getClass().getSimpleName() + " <PLAYER: " + name + ">";
}
public OfflinePlayer getPlayer() {
return BukkitUtility.forceObtainPlayer(name);
}
@Override public Map<String, Object> getSave() {
Map<String, Object> save = new HashMap<String, Object>();
save.put("level", level);
save.put("food_level", foodLevel);
save.put("fire_ticks", fireTicks);
save.put("max_air", maxAir);
save.put("max_no_damage_ticks", maxNoDamageTicks);
save.put("no_damage_ticks", noDamageTicks);
save.put("remaining_air", remainingAir);
save.put("held_slot", heldSlot);
save.put("health", health);
save.put("last_damage", lastDamage);
save.put("max_health", maxHealth);
List<Map<String, Object>> serialInventory = new ArrayList<Map<String, Object>>();
for (ItemStack stack : inventoryContents) {
if (stack == null) {
continue;
}
serialInventory.add(stack.serialize());
}
save.put("inventory_contents", serialInventory);
List<Map<String, Object>> serialArmor = new ArrayList<Map<String, Object>>();
for (ItemStack stack : armorContents) {
if (stack == null) {
continue;
}
serialArmor.add(stack.serialize());
}
save.put("armor_contents", serialArmor);
save.put("exp", exp);
save.put("saturation", saturation);
save.put("fall_distance", fallDistance);
save.put("exhaustion", exhaustion);
save.put("fly_speed", flySpeed);
save.put("walk_speed", walkSpeed);
save.put("location", new SerialLocation(location));
if (bedSpawn != null) {
save.put("bed_spawn", new SerialLocation(bedSpawn));
}
if (compassTarget != null) {
save.put("compass_target", new SerialLocation(compassTarget));
}
save.put("sleeping_ignored", sleepingIgnored);
save.put("allow_flight", allowFlight);
save.put("can_pickup_items", canPickupItems);
save.put("flying", flying);
save.put("banned", banned);
save.put("op", op);
save.put("sneaking", sneaking);
save.put("sprinting", sprinting);
save.put("whitelisted", whitelisted);
List<Map<String, Object>> serialPotionEffects = new ArrayList<Map<String, Object>>();
for (PotionEffect effect : potionEffects) {
serialPotionEffects.add(effect.serialize());
}
save.put("potion_effects", serialPotionEffects);
save.put("name", name);
save.put("custom_name", customName);
save.put("display_name", displayName);
save.put("list_name", listName);
save.put("item_in_hand", itemInHand.serialize());
save.put("time", time);
save.put("weather_name", weather != null ? weather.name() : WeatherType.CLEAR.name());
save.put("game_mode", gameMode.getValue());
return save;
}
public void update() {
Player player = Bukkit.getPlayer(name);
update(player);
}
@SuppressWarnings("deprecation") public void update(Player player) {
player.setLevel(level);
player.setHealth(health);
player.setFoodLevel(foodLevel);
player.setFireTicks(fireTicks);
player.setLastDamage(lastDamage);
player.setMaxHealth(maxHealth);
player.setMaximumAir(maxAir);
player.setMaximumNoDamageTicks(maxNoDamageTicks);
player.setNoDamageTicks(noDamageTicks);
player.setRemainingAir(remainingAir);
player.getInventory().clear();
player.getInventory().setContents(inventoryContents);
player.getInventory().setArmorContents(armorContents);
player.setExp(exp);
player.setSaturation(saturation);
player.setFallDistance(fallDistance);
player.setExhaustion(exhaustion);
player.setFlySpeed(flySpeed);
player.setWalkSpeed(walkSpeed);
player.teleport(location);
player.setBedSpawnLocation(bedSpawn);
player.setCompassTarget(compassTarget);
player.setSleepingIgnored(sleepingIgnored);
player.setAllowFlight(allowFlight);
player.setCanPickupItems(canPickupItems);
player.setFlying(flying);
player.setBanned(banned);
player.setOp(op);
player.setSneaking(sneaking);
player.setSprinting(sprinting);
player.setWhitelisted(whitelisted);
player.addPotionEffects(potionEffects);
player.setCustomName(customName);
player.setDisplayName(displayName);
player.setPlayerListName(listName);
player.getInventory().setHeldItemSlot(heldSlot);
player.setItemInHand(itemInHand);// returned to normal by setting the inventory contents, this only messes it up
player.setLastDamageCause(lastDamageCause);
player.setPlayerTime(time, true);
player.setPlayerWeather(weather);
if (scoreboard != null) {
player.setScoreboard(scoreboard);
}
if (velocity != null) {
player.setVelocity(velocity);
}
player.setGameMode(gameMode);
player.updateInventory();
}
}