Skip to content

Commit

Permalink
Updated CombatTagInterface to new API.
Browse files Browse the repository at this point in the history
BattleArena was using the old CombatTag api, which was simply their
JavaPlugin extension class. Older versions accept player names whereas
newer versions accept player UUIDs.

Luckily, the new CombatTagApi simply accepts Player objects and works for
Minecraft servers with & without UUID support.
  • Loading branch information
Europia79 committed Feb 23, 2015
1 parent ba35d60 commit 8972ece
Show file tree
Hide file tree
Showing 9 changed files with 458 additions and 378 deletions.
218 changes: 114 additions & 104 deletions src/java/mc/alk/arena/controllers/TeleportController.java
@@ -1,9 +1,15 @@
package mc.alk.arena.controllers;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import mc.alk.arena.BattleArena;
import mc.alk.arena.Defaults;
import mc.alk.arena.Permissions;
import mc.alk.arena.controllers.plugins.CombatTagInterface;
import mc.alk.arena.controllers.plugins.EssentialsController;
import mc.alk.arena.controllers.plugins.VanishNoPacketInterface;
import mc.alk.arena.listeners.BAPlayerListener;
Expand All @@ -13,6 +19,7 @@
import mc.alk.arena.util.PermissionsUtil;
import mc.alk.arena.util.PlayerUtil;
import mc.alk.arena.util.ServerUtil;
import mc.alk.arena.util.plugins.CombatTagUtil;

import org.bukkit.Bukkit;
import org.bukkit.Location;
Expand All @@ -26,28 +33,24 @@
import org.bukkit.plugin.Plugin;
import org.bukkit.util.Vector;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class TeleportController implements Listener {

public class TeleportController implements Listener{
final static Set<UUID> teleporting = Collections.synchronizedSet(new HashSet<UUID>());
private static final int TELEPORT_FIX_DELAY = 15; // ticks

public static boolean teleport(final Player player, final Location location) {
return teleport(BattleArena.toArenaPlayer(player), location, false);
}

public static boolean teleport(final ArenaPlayer player, final Location location){
return teleport(player,location,false);
}
public static boolean teleport(final ArenaPlayer player, final Location location) {
return teleport(player, location, false);
}

public static boolean teleport(final ArenaPlayer arenaPlayer, final Location location, boolean giveBypassPerms) {
Player player = arenaPlayer.getPlayer();
if (Defaults.DEBUG_TRACE) Log.info("BattleArena beginning teleport player=" + player.getDisplayName());
if (Defaults.DEBUG_TRACE) {
Log.info("BattleArena beginning teleport player=" + player.getDisplayName());
}
try {
teleporting.add(arenaPlayer.getID());
player.setVelocity(new Vector(0, Defaults.TELEPORT_Y_VELOCITY, 0));
Expand All @@ -59,28 +62,30 @@ public static boolean teleport(final ArenaPlayer arenaPlayer, final Location loc
player.setFireTicks(0);
arenaPlayer.despawnMobs();


/// Deal with vehicles
if (player.isInsideVehicle()) {
try {
player.leaveVehicle();
} catch (Exception e) {/*ignore*/}
} catch (Exception e) {/*ignore*/

}
}

/// Load the chunk if its not already loaded
try {
if (!loc.getWorld().isChunkLoaded(loc.getBlock().getChunk())) {
loc.getWorld().loadChunk(loc.getBlock().getChunk());
}
} catch (Exception e) {/*ignore*/}
} catch (Exception e) {/*ignore*/

}

/// MultiInv and Multiverse-Inventories stores/restores items when changing worlds
/// or game states ... lets not let this happen
PermissionsUtil.givePlayerInventoryPerms(player);

/// CombatTag will prevent teleports
if (CombatTagInterface.enabled())
CombatTagInterface.untag(player);
CombatTagUtil.untag(player);

/// Give bypass perms for Teleport checks like noTeleport, and noChangeWorld
if (giveBypassPerms && BattleArena.getSelf().isEnabled() && !Defaults.DEBUG_STRESS) {
Expand All @@ -91,8 +96,8 @@ public static boolean teleport(final ArenaPlayer arenaPlayer, final Location loc
/// To deal with this, reget the world
World w = Bukkit.getWorld(loc.getWorld().getName());
Location nl = new Location(w, loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
if (!player.teleport(nl, PlayerTeleportEvent.TeleportCause.PLUGIN) ||
(Defaults.DEBUG_VIRTUAL && !player.isOnline())) {
if (!player.teleport(nl, PlayerTeleportEvent.TeleportCause.PLUGIN)
|| (Defaults.DEBUG_VIRTUAL && !player.isOnline())) {
BAPlayerListener.teleportOnReenter(BattleArena.toArenaPlayer(player), nl, player.getLocation());
//noinspection PointlessBooleanExpression,ConstantConditions
return false;
Expand All @@ -107,7 +112,9 @@ public static boolean teleport(final ArenaPlayer arenaPlayer, final Location loc
}
}

if (Defaults.DEBUG_TRACE) Log.info("BattleArena ending teleport player=" + player.getDisplayName());
if (Defaults.DEBUG_TRACE) {
Log.info("BattleArena ending teleport player=" + player.getDisplayName());
}
} catch (Exception e) {
if (!Defaults.DEBUG_VIRTUAL) {
Log.err("[BA Error] teleporting player=" + player.getDisplayName() + " to " + location + " " + giveBypassPerms);
Expand All @@ -118,89 +125,92 @@ public static boolean teleport(final ArenaPlayer arenaPlayer, final Location loc
return true;
}

/**
* This prevents other plugins from cancelling the teleport
* removes the player from the set after allowing the tp.
* Additionally as a
* @param event PlayerTeleportEvent
*/
@EventHandler(priority=EventPriority.MONITOR)
public void onPlayerTeleport(PlayerTeleportEvent event){
if (teleporting.remove(PlayerUtil.getID(event.getPlayer()))){
event.setCancelled(false);
if (Defaults.ENABLE_TELEPORT_FIX){
invisbleTeleportWorkaround(event.getPlayer());
}
}
}

///TODO remove these work around teleport hacks when bukkit fixes the invisibility on teleport issue
/// modified from the teleportFix2 found online
private void invisbleTeleportWorkaround(final Player player) {
final Server server = Bukkit.getServer();
final Plugin plugin = BattleArena.getSelf();
final int visibleDistance = server.getViewDistance() * 16;
// Fix the visibility issue one tick later
server.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
if (!player.isOnline())
return;
// Refresh nearby clients
final List<Player> nearby = getPlayersWithinDistance(player, visibleDistance);
// Hide every player
updateEntities(player, nearby, false);
// Then show them again
server.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
// Refresh nearby clients
final List<Player> nearby = getPlayersWithinDistance(player, visibleDistance);
updateEntities(player, nearby, true);
}
}, 2);
}
}, TELEPORT_FIX_DELAY);
}

private void updateEntities(final Player tpedPlayer, final List<Player> players, boolean visible) {
// Hide or show every player to tpedPlayer
// and hide or show tpedPlayer to every player.
for (Player player : players) {
if (!player.isOnline())
continue;
if (VanishNoPacketInterface.isVanished(player)) {
if (!BattleArena.inArena(player))
continue;
VanishNoPacketInterface.toggleVanish(player);
}
if (visible){
tpedPlayer.showPlayer(player);
player.showPlayer(tpedPlayer);
} else {
tpedPlayer.hidePlayer(player);
player.hidePlayer(tpedPlayer);
}
}
}

private List<Player> getPlayersWithinDistance(final Player player, final int distance) {
List<Player> res = new ArrayList<Player>();
final int d2 = distance * distance;
final UUID uid = player.getWorld().getUID();
for (Player p : ServerUtil.getOnlinePlayers()) {
try{
if (p.getWorld().getUID() == uid &&
p != player && p.getLocation().distanceSquared(player.getLocation()) <= d2) {
res.add(p);
}
} catch (IllegalArgumentException e){
Log.info(e.getMessage());
} catch(Exception e){
Log.printStackTrace(e);
}
}
return res;
}
/**
* This prevents other plugins from cancelling the teleport removes the
* player from the set after allowing the tp. Additionally as a
*
* @param event PlayerTeleportEvent
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerTeleport(PlayerTeleportEvent event) {
if (teleporting.remove(PlayerUtil.getID(event.getPlayer()))) {
event.setCancelled(false);
if (Defaults.ENABLE_TELEPORT_FIX) {
invisbleTeleportWorkaround(event.getPlayer());
}
}
}

///TODO remove these work around teleport hacks when bukkit fixes the invisibility on teleport issue
/// modified from the teleportFix2 found online
private void invisbleTeleportWorkaround(final Player player) {
final Server server = Bukkit.getServer();
final Plugin plugin = BattleArena.getSelf();
final int visibleDistance = server.getViewDistance() * 16;
// Fix the visibility issue one tick later
server.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
if (!player.isOnline()) {
return;
}
// Refresh nearby clients
final List<Player> nearby = getPlayersWithinDistance(player, visibleDistance);
// Hide every player
updateEntities(player, nearby, false);
// Then show them again
server.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
// Refresh nearby clients
final List<Player> nearby = getPlayersWithinDistance(player, visibleDistance);
updateEntities(player, nearby, true);
}
}, 2);
}
}, TELEPORT_FIX_DELAY);
}

private void updateEntities(final Player tpedPlayer, final List<Player> players, boolean visible) {
// Hide or show every player to tpedPlayer
// and hide or show tpedPlayer to every player.
for (Player player : players) {
if (!player.isOnline()) {
continue;
}
if (VanishNoPacketInterface.isVanished(player)) {
if (!BattleArena.inArena(player)) {
continue;
}
VanishNoPacketInterface.toggleVanish(player);
}
if (visible) {
tpedPlayer.showPlayer(player);
player.showPlayer(tpedPlayer);
} else {
tpedPlayer.hidePlayer(player);
player.hidePlayer(tpedPlayer);
}
}
}

private List<Player> getPlayersWithinDistance(final Player player, final int distance) {
List<Player> res = new ArrayList<Player>();
final int d2 = distance * distance;
final UUID uid = player.getWorld().getUID();
for (Player p : ServerUtil.getOnlinePlayers()) {
try {
if (p.getWorld().getUID() == uid
&& p != player && p.getLocation().distanceSquared(player.getLocation()) <= d2) {
res.add(p);
}
} catch (IllegalArgumentException e) {
Log.info(e.getMessage());
} catch (Exception e) {
Log.printStackTrace(e);
}
}
return res;
}

}
15 changes: 2 additions & 13 deletions src/java/mc/alk/arena/controllers/plugins/CombatTagInterface.java
Expand Up @@ -2,27 +2,16 @@

import mc.alk.arena.util.plugins.CombatTagUtil;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

@Deprecated
public class CombatTagInterface {
private static boolean enabled = false;

public static void setPlugin(Plugin plugin) {
CombatTagUtil.setPlugin(plugin);
enabled = true;
}

public static boolean enabled(){
return enabled;
}

public static void untag(Player player) {
if (!enabled) return;
CombatTagUtil.untag(player);
}

public static boolean isTagged(Player player) {
return enabled && CombatTagUtil.isTagged(player);
return CombatTagUtil.isTagged(player);
}

}
4 changes: 2 additions & 2 deletions src/java/mc/alk/arena/executors/BAExecutor.java
Expand Up @@ -24,7 +24,6 @@
import mc.alk.arena.controllers.containers.RoomContainer;
import mc.alk.arena.controllers.joining.AbstractJoinHandler;
import mc.alk.arena.controllers.messaging.MessageHandler;
import mc.alk.arena.controllers.plugins.CombatTagInterface;
import mc.alk.arena.controllers.plugins.EssentialsController;
import mc.alk.arena.controllers.plugins.HeroesController;
import mc.alk.arena.controllers.plugins.MobArenaInterface;
Expand Down Expand Up @@ -95,6 +94,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import mc.alk.arena.util.plugins.CombatTagUtil;

/**
*
Expand Down Expand Up @@ -1502,7 +1502,7 @@ private boolean _canJoin(ArenaPlayer player, boolean showMessages, boolean teamm
}

/// Check for player in combat
if (CombatTagInterface.isTagged(player.getPlayer())
if (CombatTagUtil.isTagged(player.getPlayer())
|| (HeroesController.enabled() && HeroesController.isInCombat(player.getPlayer()))) {
if (showMessages) {
sendMessage(player, "&cYou are in combat!");
Expand Down

0 comments on commit 8972ece

Please sign in to comment.