package com.github.jamesnorris.ablockalypse.aspect; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Player; import com.github.jamesnorris.ablockalypse.Ablockalypse; import com.github.jamesnorris.ablockalypse.DataContainer; import com.github.jamesnorris.ablockalypse.behavior.GameAspect; import com.github.jamesnorris.ablockalypse.enumerated.PlayerStatus; import com.github.jamesnorris.ablockalypse.enumerated.Setting; import com.github.jamesnorris.ablockalypse.enumerated.ZASound; import com.github.jamesnorris.ablockalypse.utility.BukkitUtility; public class ZACharacter extends ZALiving implements GameAspect { protected static DataContainer data = Ablockalypse.getData(); private PlayerStatus status = PlayerStatus.NORMAL; private Player player; private Seat seat; private Game game; private double absorption; public ZACharacter(Map<String, Object> savings) { super(savings); player = BukkitUtility.forceObtainPlayer((String) savings.get("name")).getPlayer(); status = PlayerStatus.getById((Integer) savings.get("status_id")); absorption = (Double) savings.get("hit_absorption"); game = Ablockalypse.getData().getGame((String) savings.get("game_name"), true); } public ZACharacter(Player player, Game game) { super(player); this.player = player; this.game = game; data.objects.add(this); game.addObject(this); } @Override public Block getDefiningBlock() { if (player == null) { return null; } return player.getLocation().clone().subtract(0, 1, 0).getBlock(); } /** * Gets the blocks that defines this object as an object. * * @return The blocks assigned to this object */ @Override public ArrayList<Block> getDefiningBlocks() { ArrayList<Block> blocks = new ArrayList<Block>(); blocks.add(getDefiningBlock()); return blocks; } @Override public Game getGame() { return game; } public double getHitAbsorption() { return absorption; } @Override public int getLoadPriority() { return 1; } public Player getPlayer() { return player; } @Override public Map<String, Object> getSave() { Map<String, Object> savings = new HashMap<String, Object>(); savings.put("name", player.getName()); savings.put("status_id", status.getId()); savings.putAll(super.getSave()); return savings; } public Seat getSeat() { if (seat == null) { seat = new Seat(player.getLocation()); } return seat; } public PlayerState getState() { return new PlayerState(player); } public PlayerStatus getStatus() { return status; } @Override public UUID getUUID() { return player.getUniqueId(); } @Override public void onGameEnd() {} @Override public void onGameStart() {} @Override public void onLevelEnd() {} @Override public void onNextLevel() {} @Override public void remove() { if (game != null) { game.removeObject(this); } data.objects.remove(this); } public void rename(String prefix, String name, String suffix) { String mod = name; int cutoff = 16 - (suffix.length() + 1); if (name.length() > cutoff) { mod = name.substring(0, cutoff); } player.setDisplayName(prefix + " " + mod + " " + suffix); } public void sendToMainframe(String message, String reason) { if (message != null) { player.sendMessage(message); } Location loc = game.getMainframe().getLocation().clone().add(0, 1, 0); Chunk c = loc.getChunk(); if (!c.isLoaded()) { c.load(); } ZASound.TELEPORT.play(loc); if ((Boolean) Setting.DEBUG.getSetting()) { System.out.println("[Ablockalypse] [DEBUG] Mainframe TP reason: (" + game.getName() + ") " + reason); } } public void setHitAbsorption(double absorption) { this.absorption = absorption; } public void setSeat(Seat seat) { this.seat = seat; } public void setStatus(PlayerStatus status) { if (this.status == status) { return;// prevents recursion } this.status = status; status.set(this); } public void teleport(Location location, String reason) { player.teleport(location); if ((Boolean) Setting.DEBUG.getSetting()) { System.out.println("[Ablockalypse] [DEBUG] TP reason: (" + game.getName() + ") " + reason); } } public void teleport(World world, int x, int y, int z, String reason) { teleport(world.getBlockAt(x, y, z).getLocation(), reason); } }