package org.mctourney.autoreferee.util;
import java.lang.reflect.Method;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
public class SportBukkitUtil
{
private static boolean isSportBukkit = true;
// custom methods, retrieved by reflection
private static Method mAffectsSpawning = null;
private static Method mCollidesWithEntities = null;
private static Method mSetOverheadName = null;
private static Method mOfflinePlayerLocation = null;
static
{
// check server name
isSportBukkit = "SportBukkit".equals(Bukkit.getName());
// reflect to get methods if this is SportBukkit
if (isSportBukkit) try
{
// last_username's affects-spawning API from SportBukkit
mAffectsSpawning = HumanEntity.class.getDeclaredMethod("setAffectsSpawning", boolean.class);
// last_username's collides-with-entities API from SportBukkit
mCollidesWithEntities = Player.class.getDeclaredMethod("setCollidesWithEntities", boolean.class);
// anxuiz's set-overhead-name API from SportBukkit
mSetOverheadName = Player.class.getDeclaredMethod("setOverheadName", String.class);
// md_5's offlineUtil API from SportBukkit
mOfflinePlayerLocation = OfflinePlayer.class.getDeclaredMethod("getLocation");
}
catch (Exception e) { isSportBukkit = false; }
}
/**
* Checks if AutoReferee is installed on a system supporting the SportBukkit API
*
* @return true if SportBukkit is installed, false otherwise
* @see <a href="http://www.github.com/OvercastNetwork/SportBukkit">SportBukkit</a>
*/
public static boolean hasSportBukkitApi()
{ return isSportBukkit; }
/**
* Sets whether player affects spawning via natural spawn and mob spawners.
* Uses last_username's affects-spawning API from SportBukkit
*
* @param affectsSpawning Set whether player affects spawning
* @see <a href="http://www.github.com/OvercastNetwork/SportBukkit">SportBukkit</a>
*/
public static void setAffectsSpawning(Player player, boolean affectsSpawning)
{
if (mAffectsSpawning != null) try
{ mAffectsSpawning.invoke(player, affectsSpawning); }
catch (Throwable ignored) { }
}
/**
* Sets whether player collides with entities, including items and arrows.
* Uses last_username's collides-with-entities API from SportBukkit
*
* @param collidesWithEntities Set whether player collides with entities
* @see <a href="http://www.github.com/OvercastNetwork/SportBukkit">SportBukkit</a>
*/
public static void setCollidesWithEntities(Player player, boolean collidesWithEntities)
{
if (mCollidesWithEntities != null) try
{ mCollidesWithEntities.invoke(player, collidesWithEntities); }
catch (Throwable ignored) { }
}
/**
* Sets the overhead name, allowing for ChatColor characters.
* Uses anxuiz's set-overhead-name API from SportBukkit
*
* @param overheadName New string to display above player's head
* @see <a href="http://www.github.com/OvercastNetwork/SportBukkit">SportBukkit</a>
* @deprecated use built-in scoreboards to change name colors
*/
@Deprecated
public static void setOverheadName(Player player, String overheadName)
{
if (mSetOverheadName != null) try
{ mSetOverheadName.invoke(player, overheadName.trim()
.replaceAll(ChatColor.RESET.toString(), "")); }
catch (Throwable ignored) { }
}
/**
* Gets the logged-out location of an OfflinePlayer
* Uses md_5's offlineUtil API from SportBukkit
*
* @see <a href="http://www.github.com/OvercastNetwork/SportBukkit">SportBukkit</a>
*/
public static Location getOfflinePlayerLocation(OfflinePlayer player)
{
if (mOfflinePlayerLocation != null) try
{ return (Location) mOfflinePlayerLocation.invoke(player); }
catch (Exception e) { } return null;
}
}