package de.tobiyas.racesandclasses.playermanagement.player;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.APIs.InFightAPI;
import de.tobiyas.racesandclasses.APIs.LanguageAPI;
import de.tobiyas.racesandclasses.datacontainer.armorandtool.ArmorToolManager;
import de.tobiyas.racesandclasses.datacontainer.arrow.ArrowManager;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.TraitHolderCombinder;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.classes.ClassContainer;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race.RaceContainer;
import de.tobiyas.racesandclasses.hotkeys.HotKeyInventory;
import de.tobiyas.racesandclasses.pets.PlayerPetManager;
import de.tobiyas.racesandclasses.playermanagement.health.HealthManager;
import de.tobiyas.racesandclasses.playermanagement.leveling.PlayerLevelManager;
import de.tobiyas.racesandclasses.playermanagement.playerdisplay.PlayerActionBarDisplay;
import de.tobiyas.racesandclasses.playermanagement.playerdisplay.scoreboard.PlayerRaCScoreboardManager;
import de.tobiyas.racesandclasses.playermanagement.skilltree.PlayerSkillTreeManager;
import de.tobiyas.racesandclasses.playermanagement.spellmanagement.PlayerSpellManager;
import de.tobiyas.racesandclasses.playermanagement.spellmanagement.mana.ManaManager;
import de.tobiyas.racesandclasses.saving.PlayerSavingData;
import de.tobiyas.racesandclasses.saving.PlayerSavingManager;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.bypasses.StaticTrait;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.TraitWithRestrictions;
import de.tobiyas.racesandclasses.util.bukkit.versioning.compatibility.CompatibilityModifier.BukkitPlayer;
import de.tobiyas.util.player.PlayerUtils;
public class RaCPlayer {
/**
* The UUID of the player
*/
private final UUID playerUUID;
/**
* The real name of the Player.
*/
private final String playerName;
private final RacesAndClasses plugin;
public RaCPlayer(UUID playerUUID, String playerName) {
this.playerUUID = playerUUID;
this.playerName = playerName;
this.plugin = RacesAndClasses.getPlugin();
}
/**
* @return the playerName
*/
public String getName() {
return playerName;
}
/**
* Gets the display name of the player.
* @return the display name.
*/
public String getDisplayName(){
return getPlayer().getDisplayName();
}
/**
* Returns the Race of the Player
*
* @return race
*/
public RaceContainer getRace(){
return (RaceContainer) plugin.getRaceManager().getHolderOfPlayer(this);
}
/**
* Returns the Class of the Player
*/
public ClassContainer getclass(){
return (ClassContainer) plugin.getClassManager().getHolderOfPlayer(this);
}
/**
* Returns the Class of the Player
*/
public PlayerSavingData getPlayerSaveData(){
return PlayerSavingManager.get().getPlayerData(playerUUID);
}
/**
* Sets the Class of this player.
*
* @param container to set
* @return true if worked
*/
public boolean setClass(ClassContainer container){
return plugin.getClassManager().addPlayerToHolder(this, container.getDisplayName(), true);
}
/**
* Sets the Race of this player.
*
* @param container to set
* @return true if worked
*/
public boolean setRace(RaceContainer container){
return plugin.getRaceManager().addPlayerToHolder(this, container.getDisplayName(), true);
}
public Player getRealPlayer() {
if(!hasUUIDSupport()) return PlayerUtils.getPlayer(playerName);
return Bukkit.getPlayer(playerUUID);
}
/**
* Returns a player object for this player.
*
* @return player or null
*/
public OfflinePlayer getOfflinePlayer(){
if(!hasUUIDSupport()) return PlayerUtils.getPlayer(playerName);
return Bukkit.getOfflinePlayer(playerUUID);
}
/**
* Returns if the Player is online.
*
* @return true if online.
*/
public boolean isOnline(){
Player player = getPlayer();
return player != null && player.isOnline();
}
/**
* Returns the current channel.
*
* @return current channel
*/
public String getCurrentChatChannel() {
return plugin.getChannelManager().getCurrentChannel(this);
}
/**
* Sets the new Current channel.
*
* @param newChannel to set.
*/
public void setCurrentChatChannel(String newChannel){
plugin.getChannelManager().changeCurrentChannel(this, newChannel);
}
public Player getPlayer() {
return PlayerUtils.getPlayer(playerUUID);
}
/**
* Returns the OwnManaManager of the Player.
* @return
*/
public ManaManager getManaManager(){
return plugin.getPlayerManager().getContainer(this).getSpellManager().getManaManager();
}
/**
* Returns the Spellmanager of the Player
*
* @return
*/
public PlayerSpellManager getSpellManager(){
return plugin.getPlayerManager().getContainer(this).getSpellManager();
}
/**
* Returns the ActionBar of the Player
* @return the Actionbar Manager.
*/
public PlayerActionBarDisplay getActionbarDisplay(){
return plugin.getPlayerManager().getContainer(this).getActionbarDisplay();
}
/**
* Returns the ArmorManager of the Player
*
* @return
*/
public ArmorToolManager getArmorManager(){
return plugin.getPlayerManager().getContainer(this).getArmorToolManager();
}
/**
* Returns the ArrowManager of the Player
*
* @return the arrow manager
*/
public ArrowManager getArrowManager(){
return plugin.getPlayerManager().getContainer(this).getArrowManager();
}
/**
* Returns the LevelManager of the Player
*
* @return the level manager
*/
public PlayerLevelManager getLevelManager(){
return plugin.getPlayerManager().getContainer(this).getPlayerLevelManager();
}
/**
* Returns the Health manager
*
* @return Health Manager.
*/
public HealthManager getHealthManager() {
return plugin.getPlayerManager().getContainer(this).getHealthManager();
}
/**
* Returns The config for the Player
*
* @return config
*/
public double getHealth(){
return getHealthManager().getCurrentHealth();
}
/**
* Returns The max Health for the Player
*
* @return config
*/
public double getMaxHealth(){
return getHealthManager().getMaxHealth();
}
/**
* Gets the current Mana.
* @return the current mana.
*/
public double getCurrentMana() {
return getManaManager().getCurrentMana();
}
/**
* Returns the max mana of the player.
* @return the max mana.
*/
public double getMaxMana() {
return getManaManager().getMaxMana();
}
/**
* Gets the current level of the player.
* @return the current level.
*/
public int getCurrentLevel(){
return getLevelManager().getCurrentLevel();
}
/**
* Displays the current Health.
*
* @return true if worked.
*/
public boolean displayHealth(){
getHealthManager().forceHPOut();
return true;
}
/**
* Returns the Scoreboard Manager of the player.
*
* @return the scoreboard Manager.
*/
public PlayerRaCScoreboardManager getScoreboardManager(){
return plugin.getPlayerManager().getContainer(this).getPlayerScoreboardManager();
}
public PlayerSkillTreeManager getSkillTreeManager() {
return plugin.getPlayerManager().getContainer(this).getSkillTreeManager();
}
/**
* Returns a list of Traits the Player has.
* <br>This excludes ones that are out of his level range.
*
* @return reduced Trait list.
*/
public List<Trait> getTraits(){
int level = getLevelManager().getCurrentLevel();
List<Trait> returnList = new LinkedList<Trait>();
Set<Trait> traits = TraitHolderCombinder.getSkillTreeReducedTraitsOfPlayer(this);
for(Trait trait : traits){
if(trait instanceof StaticTrait) continue;
if(trait instanceof TraitWithRestrictions){
if(((TraitWithRestrictions) trait).isInLevelRange(level)){
returnList.add(trait);
}
}
}
return returnList;
}
/**
* Returns the PlayerPetmanager of the Player.
*
* @return the PlayerPetManager.
*/
public PlayerPetManager getPlayerPetManager(){
return plugin.getPlayerManager().getContainer(this).getPlayerPetManager();
}
/**
* @return the player
*/
public UUID getUniqueId() {
return playerUUID;
}
private boolean hasUUIDSupport(){
try{
Bukkit.getPlayer(UUID.randomUUID());
return true;
}catch(Throwable exp) { return false; }
}
/**
* Checks if the Player has Permission for this permission.
*
* @param permission to check
*
* @return true if has, false if not.
*/
public boolean hasPermission(String permission){
if(isOnline()){
return plugin.getPermissionManager().checkPermissionsSilent(getPlayer(), permission);
}else{
return plugin.getPermissionManager().checkPermissionsSilent(playerName, permission);
}
}
/**
* Sends a translated Message via the Translation API.
*/
public void sendTranslatedMessage(String tag) {
if(!isOnline()) return;
LanguageAPI.sendTranslatedMessage(getPlayer(), tag);
}
/**
* Sends a translated Message via the Translation API.
*/
public void sendTranslatedMessage(String tag, Map<String,String> replacements) {
if(!isOnline()) return;
LanguageAPI.sendTranslatedMessage(getPlayer(), tag, replacements);
}
/**
* Sends a translated Message via the Translation API.
*/
public void sendTranslatedMessage(String tag, String... replacements) {
if(!isOnline()) return;
LanguageAPI.sendTranslatedMessage(getPlayer(), tag, replacements);
}
/**
* Returns the Hotkey Inventory associated to this player.
*
* @return the associated HotKey Inv.
*/
public HotKeyInventory getHotkeyInventory() {
return plugin.getHotkeyManager().getInv(this);
}
/**
* If the Player is in Fight.
*
* @return true if in fight.
*/
public boolean isInFight(){
return InFightAPI.isInFight(this);
}
/**
* heals the Player by the Value passed.
*
* @param healValue to heal.
*/
public void heal(double healValue) {
BukkitPlayer.safeHeal(healValue, getPlayer());
}
/**
* Gets the Scoreboard or null if not online.
* @return the Scoreboard.
*/
public Scoreboard getScoreboard() {
Player pl = getRealPlayer();
return pl == null ? null : pl.getScoreboard();
}
/**
* Sends a message to the player if online.
* @param message to send
*/
public void sendMessage(String message) {
Player pl = getRealPlayer();
if(pl != null) pl.sendMessage(message);
}
/**
* Gets the location of the player or null if not online.
* @return the location or null.
*/
public Location getLocation() {
Player pl = getRealPlayer();
return pl == null ? null : pl.getLocation();
}
/**
* Gets the Gamemode of the player or SURVIVAL if not online.
* @return the gamemode.
*/
public GameMode getGameMode() {
Player pl = getRealPlayer();
return pl == null ? GameMode.SURVIVAL : pl.getGameMode();
}
/**
* Gets the world of the Player.
* @return the world of the player.
*/
public World getWorld() {
Player pl = getRealPlayer();
return pl == null ? null : pl.getWorld();
}
//BELOW ONLY HASHCODE / EQUALS//
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((playerName == null) ? 0 : playerName.hashCode());
result = prime * result
+ ((playerUUID == null) ? 0 : playerUUID.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RaCPlayer other = (RaCPlayer) obj;
if (playerName == null) {
if (other.playerName != null)
return false;
} else if (!playerName.equals(other.playerName))
return false;
if (playerUUID == null) {
if (other.playerUUID != null)
return false;
} else if (!playerUUID.equals(other.playerUUID))
return false;
return true;
}
}