mirror of
https://github.com/kaboomserver/icontrolu.git
synced 2024-05-11 23:41:21 +00:00
Compare commits
3 commits
f4055c1233
...
7dbb2aa8f8
Author | SHA1 | Date | |
---|---|---|---|
7dbb2aa8f8 | |||
f3fbd1b633 | |||
1e60f14b3d |
|
@ -1,264 +0,0 @@
|
|||
package pw.kaboom.icontrolu;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerAnimationEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.bukkit.scoreboard.Team;
|
||||
|
||||
import com.destroystokyo.paper.event.server.ServerTickStartEvent;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
|
||||
import pw.kaboom.icontrolu.utilities.PlayerList;
|
||||
|
||||
class ControlPlayer implements Listener {
|
||||
private static String CHAT_PREFIX = "\ud800iControlUChat\ud800";
|
||||
|
||||
@EventHandler
|
||||
private void onAsyncPlayerChat(final AsyncPlayerChatEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (PlayerList.getController(player.getUniqueId()) != null) {
|
||||
if (event.getMessage().startsWith(CHAT_PREFIX)) {
|
||||
final int prefixLength = CHAT_PREFIX.length();
|
||||
|
||||
event.setMessage(
|
||||
event.getMessage().substring(prefixLength)
|
||||
);
|
||||
} else {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
} else if (PlayerList.getTarget(player.getUniqueId()) != null) {
|
||||
final Player target = PlayerList.getTarget(player.getUniqueId());
|
||||
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// Add prefix to prevent messages from being cancelled
|
||||
target.chat(CHAT_PREFIX + event.getMessage());
|
||||
}
|
||||
}.runTask(JavaPlugin.getPlugin(Main.class));
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onEntityDamage(final EntityDamageEvent event) {
|
||||
final Entity player = event.getEntity();
|
||||
|
||||
if (PlayerList.getTarget(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerAnimation(final PlayerAnimationEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (PlayerList.getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (PlayerList.getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerDropItem(final PlayerDropItemEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (PlayerList.getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerInteract(final PlayerInteractEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (PlayerList.getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
|
||||
} else if ((event.getAction() == Action.LEFT_CLICK_AIR
|
||||
|| event.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||
&& PlayerList.getTarget(player.getUniqueId()) != null) {
|
||||
final Player target = PlayerList.getTarget(player.getUniqueId());
|
||||
|
||||
if (event.getHand() == EquipmentSlot.HAND) {
|
||||
target.swingMainHand();
|
||||
} else if (event.getHand() == EquipmentSlot.OFF_HAND) {
|
||||
target.swingOffHand();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerMove(final PlayerMoveEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (PlayerList.getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerQuit(final PlayerQuitEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
for (Player otherPlayer: Bukkit.getOnlinePlayers()) {
|
||||
if (PlayerList.getController(player.getUniqueId()) != null
|
||||
&& PlayerList.getController(player.getUniqueId()).equals(otherPlayer)) {
|
||||
/*
|
||||
Target disconnects
|
||||
*/
|
||||
PlayerList.removeTarget(otherPlayer.getUniqueId());
|
||||
PlayerList.removeController(player.getUniqueId());
|
||||
|
||||
final Player controller = otherPlayer;
|
||||
final int tickDelay = 200;
|
||||
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Player allPlayers: Bukkit.getOnlinePlayers()) {
|
||||
allPlayers.showPlayer(JavaPlugin.getPlugin(Main.class), controller);
|
||||
}
|
||||
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager()
|
||||
.getMainScoreboard();
|
||||
final Team team = scoreboard.getTeam("icuCollision");
|
||||
|
||||
if (team != null
|
||||
&& team.hasEntry(controller.getName())) {
|
||||
team.removeEntry(controller.getName());
|
||||
}
|
||||
|
||||
controller.removePotionEffect(PotionEffectType.INVISIBILITY);
|
||||
controller.sendMessage(Component.text("You are now visible"));
|
||||
}
|
||||
}.runTaskLater(JavaPlugin.getPlugin(Main.class), tickDelay);
|
||||
|
||||
otherPlayer.sendMessage(Component.text("The player you were controlling has "
|
||||
+ "disconnected. You are invisible for 10 seconds."));
|
||||
|
||||
} else if (PlayerList.getTarget(player.getUniqueId()) != null
|
||||
&& PlayerList.getTarget(player.getUniqueId()).equals(otherPlayer)) {
|
||||
/*
|
||||
Controller disconnects
|
||||
*/
|
||||
PlayerList.removeTarget(player.getUniqueId());
|
||||
PlayerList.removeController(otherPlayer.getUniqueId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerRespawn(final PlayerRespawnEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (PlayerList.getController(player.getUniqueId()) != null) {
|
||||
final Player controller = PlayerList.getController(player.getUniqueId());
|
||||
|
||||
controller.teleportAsync(player.getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onTickStart(ServerTickStartEvent event) {
|
||||
for (Player target: Bukkit.getOnlinePlayers()) {
|
||||
final Player controller = PlayerList.getController(target.getUniqueId());
|
||||
|
||||
if (controller != null) {
|
||||
for (int i = 0; i < controller.getInventory().getSize(); i++) {
|
||||
if (controller.getInventory().getItem(i) != null) {
|
||||
if (!controller.getInventory().getItem(i).equals(
|
||||
target.getInventory().getItem(i))) {
|
||||
target.getInventory().setItem(i, controller.getInventory().getItem(i));
|
||||
}
|
||||
} else {
|
||||
target.getInventory().setItem(i, null);
|
||||
}
|
||||
}
|
||||
|
||||
if (target.getHealth() > 0) {
|
||||
target.teleportAsync(controller.getLocation());
|
||||
}
|
||||
|
||||
target.setAllowFlight(controller.getAllowFlight());
|
||||
target.setExhaustion(controller.getExhaustion());
|
||||
target.setFlying(controller.isFlying());
|
||||
target.setFoodLevel(controller.getFoodLevel());
|
||||
|
||||
if (controller.getMaxHealth() > 0) {
|
||||
target.setMaxHealth(controller.getMaxHealth());
|
||||
target.setHealth(controller.getHealth());
|
||||
}
|
||||
|
||||
target.setLevel(controller.getLevel());
|
||||
target.setSneaking(controller.isSneaking());
|
||||
target.setSprinting(controller.isSprinting());
|
||||
|
||||
for (Player player: Bukkit.getOnlinePlayers()) {
|
||||
player.hidePlayer(JavaPlugin.getPlugin(Main.class), controller);
|
||||
}
|
||||
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
Team team = scoreboard.getTeam("icuCollision");
|
||||
|
||||
if (team == null) {
|
||||
team = scoreboard.registerNewTeam("icuCollision");
|
||||
}
|
||||
|
||||
team.setCanSeeFriendlyInvisibles(false);
|
||||
team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
|
||||
|
||||
if (!team.hasEntry(controller.getName())) {
|
||||
team.addEntry(controller.getName());
|
||||
}
|
||||
|
||||
final int duration = 99999;
|
||||
final int amplifier = 0;
|
||||
final boolean ambient = false;
|
||||
final boolean particles = false;
|
||||
|
||||
controller.addPotionEffect(
|
||||
new PotionEffect(
|
||||
PotionEffectType.INVISIBILITY,
|
||||
duration,
|
||||
amplifier,
|
||||
ambient,
|
||||
particles
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,48 +10,21 @@ import org.bukkit.scoreboard.Team;
|
|||
import net.kyori.adventure.text.Component;
|
||||
|
||||
import pw.kaboom.icontrolu.commands.CommandIcu;
|
||||
import pw.kaboom.icontrolu.utilities.PlayerList;
|
||||
import pw.kaboom.icontrolu.PlayerControl;
|
||||
|
||||
public final class Main extends JavaPlugin {
|
||||
@Override
|
||||
public void onEnable() {
|
||||
/* Setup scoreboard team to prevent player collisions */
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
final Team team = scoreboard.getTeam("icuCollision");
|
||||
if (team != null) {
|
||||
team.unregister();
|
||||
}
|
||||
|
||||
/* Commands */
|
||||
this.getCommand("icu").setExecutor(new CommandIcu());
|
||||
|
||||
this.getServer().getPluginManager().registerEvents(new ControlPlayer(), this);
|
||||
/* Modules */
|
||||
PlayerControl.enable();
|
||||
this.getServer().getPluginManager().registerEvents(new PlayerControl(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
for (Player controller: Bukkit.getOnlinePlayers()) {
|
||||
final Player target = PlayerList.getTarget(controller.getUniqueId());
|
||||
|
||||
if (target != null) {
|
||||
for (Player player: Bukkit.getOnlinePlayers()) {
|
||||
player.showPlayer(this, controller);
|
||||
}
|
||||
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
final Team team = scoreboard.getTeam("icuCollision");
|
||||
|
||||
if (team != null) {
|
||||
team.unregister();
|
||||
}
|
||||
|
||||
controller.removePotionEffect(PotionEffectType.INVISIBILITY);
|
||||
controller.sendMessage(
|
||||
Component.text("You are no longer controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\" due to server reload"))
|
||||
);
|
||||
}
|
||||
}
|
||||
PlayerControl.disable();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ import org.bukkit.command.ConsoleCommandSender;
|
|||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.bukkit.scoreboard.Team;
|
||||
|
||||
|
@ -18,106 +17,100 @@ import net.kyori.adventure.text.Component;
|
|||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
|
||||
import pw.kaboom.icontrolu.Main;
|
||||
import pw.kaboom.icontrolu.utilities.PlayerList;
|
||||
import pw.kaboom.icontrolu.PlayerControl;
|
||||
|
||||
public final class CommandIcu implements CommandExecutor {
|
||||
private void controlCommand(final Player controller, final String label, final String[] args) {
|
||||
if (args.length == 1) {
|
||||
controller.sendMessage(Component
|
||||
.text("Usage: /" + label + " control <player>", NamedTextColor.RED));
|
||||
} else {
|
||||
Player target = Bukkit.getPlayer(args[1]);
|
||||
|
||||
if (target == null && args[1].matches("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})")) {
|
||||
target = Bukkit.getPlayer(UUID.fromString(args[1]));
|
||||
}
|
||||
|
||||
if (target != null) {
|
||||
if (target == controller) {
|
||||
controller.sendMessage(Component.text("You are already controlling yourself"));
|
||||
} else if (PlayerList.getTarget(controller.getUniqueId()) != null) {
|
||||
controller.sendMessage(
|
||||
Component.text("You are already controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\""))
|
||||
);
|
||||
} else if (PlayerList.getController(target.getUniqueId()) != null) {
|
||||
controller.sendMessage(
|
||||
Component.text("Player \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\" is already being controlled"))
|
||||
);
|
||||
} else if (PlayerList.getTarget(target.getUniqueId()) != null) {
|
||||
controller.sendMessage(
|
||||
Component.text("Player \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\" is already controlling another player"))
|
||||
);
|
||||
} else if (!controller.canSee(target)) {
|
||||
controller.sendMessage(Component.text("You may not control this player"));
|
||||
} else {
|
||||
controller.teleportAsync(target.getLocation());
|
||||
|
||||
controller.getInventory().setContents(target.getInventory().getContents());
|
||||
|
||||
PlayerList.setTarget(controller.getUniqueId(), target);
|
||||
PlayerList.setController(target.getUniqueId(), controller);
|
||||
|
||||
controller.sendMessage(
|
||||
Component.text("You are now controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\""))
|
||||
);
|
||||
}
|
||||
} else {
|
||||
controller.sendMessage(
|
||||
Component.text("Player \"")
|
||||
.append(Component.text(args[1]))
|
||||
.append(Component.text("\" not found"))
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Player target = Bukkit.getPlayer(args[1]);
|
||||
|
||||
if (target == null && args[1].matches("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})")) {
|
||||
target = Bukkit.getPlayer(UUID.fromString(args[1]));
|
||||
}
|
||||
|
||||
if (target == null) {
|
||||
controller.sendMessage(
|
||||
Component.text("Player \"")
|
||||
.append(Component.text(args[1]))
|
||||
.append(Component.text("\" not found"))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (target == controller) {
|
||||
controller.sendMessage(Component.text("You are already controlling yourself"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (PlayerControl.getTarget(controller.getUniqueId()) != null) {
|
||||
controller.sendMessage(
|
||||
Component.text("You are already controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\""))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (PlayerControl.getController(target.getUniqueId()) != null) {
|
||||
controller.sendMessage(
|
||||
Component.text("Player \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\" is already being controlled"))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (PlayerControl.getTarget(target.getUniqueId()) != null) {
|
||||
controller.sendMessage(
|
||||
Component.text("Player \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\" is already controlling another player"))
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!controller.canSee(target)) {
|
||||
controller.sendMessage(Component.text("You may not control this player"));
|
||||
return;
|
||||
}
|
||||
|
||||
controller.teleportAsync(target.getLocation());
|
||||
controller.getInventory().setContents(target.getInventory().getContents());
|
||||
|
||||
PlayerControl.setTarget(controller.getUniqueId(), target);
|
||||
PlayerControl.setController(target.getUniqueId(), controller);
|
||||
|
||||
controller.sendMessage(
|
||||
Component.text("You are now controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\""))
|
||||
);
|
||||
}
|
||||
|
||||
private void stopCommand(final Player controller) {
|
||||
final Player target = PlayerList.getTarget(controller.getUniqueId());
|
||||
final Player target = PlayerControl.getTarget(controller.getUniqueId());
|
||||
|
||||
if (target != null) {
|
||||
PlayerList.removeTarget(controller.getUniqueId());
|
||||
PlayerList.removeController(target.getUniqueId());
|
||||
|
||||
final int tickDelay = 200;
|
||||
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Player player: Bukkit.getOnlinePlayers()) {
|
||||
player.showPlayer(JavaPlugin.getPlugin(Main.class), controller);
|
||||
}
|
||||
|
||||
Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
Team team = scoreboard.getTeam("icuCollision");
|
||||
if (team != null && team.hasEntry(controller.getName())) {
|
||||
team.removeEntry(controller.getName());
|
||||
}
|
||||
|
||||
controller.removePotionEffect(PotionEffectType.INVISIBILITY);
|
||||
controller.sendMessage(Component.text("You are now visible"));
|
||||
}
|
||||
}.runTaskLater(JavaPlugin.getPlugin(Main.class), tickDelay);
|
||||
|
||||
final int seconds = tickDelay / 20;
|
||||
|
||||
controller.sendMessage(
|
||||
Component.text("You are no longer controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\". You are invisible for "))
|
||||
.append(Component.text(seconds))
|
||||
.append(Component.text(" seconds."))
|
||||
);
|
||||
} else {
|
||||
if (target == null) {
|
||||
controller.sendMessage(Component.text("You are not controlling anyone at the moment"));
|
||||
return;
|
||||
}
|
||||
|
||||
PlayerControl.removeTarget(controller.getUniqueId());
|
||||
PlayerControl.removeController(target.getUniqueId());
|
||||
PlayerControl.scheduleVisibility(controller.getUniqueId());
|
||||
|
||||
controller.sendMessage(
|
||||
Component.text("You are no longer controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\". You are invisible for "))
|
||||
.append(Component.text(PlayerControl.getVisibilityDelay()))
|
||||
.append(Component.text(" seconds."))
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -133,9 +126,15 @@ public final class CommandIcu implements CommandExecutor {
|
|||
if (args.length == 0) {
|
||||
controller.sendMessage(Component
|
||||
.text("Usage: /" + label + " <control|stop>", NamedTextColor.RED));
|
||||
} else if (args[0].equalsIgnoreCase("control")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase("control")) {
|
||||
controlCommand(controller, label, args);
|
||||
} else if (args[0].equalsIgnoreCase("stop")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase("stop")) {
|
||||
stopCommand(controller);
|
||||
}
|
||||
return true;
|
||||
|
|
352
src/main/java/pw/kaboom/icontrolu/modules/PlayerControl.java
Normal file
352
src/main/java/pw/kaboom/icontrolu/modules/PlayerControl.java
Normal file
|
@ -0,0 +1,352 @@
|
|||
package pw.kaboom.icontrolu;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.player.PlayerAnimationEvent;
|
||||
import org.bukkit.event.player.PlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.bukkit.scoreboard.Team;
|
||||
|
||||
import com.destroystokyo.paper.event.server.ServerTickStartEvent;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
|
||||
public final class PlayerControl implements Listener {
|
||||
|
||||
private static final String CHAT_PREFIX = "\ud800iControlUChat\ud800";
|
||||
private static final int VISIBILITY_DELAY_MS = 10000;
|
||||
|
||||
private static Map<UUID, Player> controllers = new HashMap<>();
|
||||
private static Map<UUID, Player> targets = new HashMap<>();
|
||||
private static Map<UUID, Long> scheduledVisibilities = new HashMap<>();
|
||||
|
||||
public static void enable() {
|
||||
/* Setup scoreboard team to prevent player collisions */
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
final Team team = scoreboard.getTeam("icuCollision");
|
||||
if (team != null) {
|
||||
team.unregister();
|
||||
}
|
||||
}
|
||||
|
||||
public static void disable() {
|
||||
for (UUID controllerUUID : targets.keySet()) {
|
||||
final Player controller = Bukkit.getPlayer(controllerUUID);
|
||||
final Player target = getTarget(controller.getUniqueId());
|
||||
|
||||
for (Player player: Bukkit.getOnlinePlayers()) {
|
||||
player.showPlayer(JavaPlugin.getPlugin(Main.class), controller);
|
||||
}
|
||||
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
final Team team = scoreboard.getTeam("icuCollision");
|
||||
|
||||
if (team != null) {
|
||||
team.unregister();
|
||||
}
|
||||
|
||||
controller.removePotionEffect(PotionEffectType.INVISIBILITY);
|
||||
controller.sendMessage(
|
||||
Component.text("You are no longer controlling \"")
|
||||
.append(Component.text(target.getName()))
|
||||
.append(Component.text("\" due to server reload"))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public static Player getController(final UUID playerUUID) {
|
||||
return controllers.get(playerUUID);
|
||||
}
|
||||
|
||||
public static Player getTarget(final UUID playerUUID) {
|
||||
return targets.get(playerUUID);
|
||||
}
|
||||
|
||||
public static int getVisibilityDelay() {
|
||||
return VISIBILITY_DELAY_MS / 1000;
|
||||
}
|
||||
|
||||
public static void removeController(final UUID playerUUID) {
|
||||
controllers.remove(playerUUID);
|
||||
}
|
||||
|
||||
public static void removeTarget(final UUID playerUUID) {
|
||||
targets.remove(playerUUID);
|
||||
}
|
||||
|
||||
public static void setController(final UUID playerUUID, final Player player) {
|
||||
controllers.put(playerUUID, player);
|
||||
}
|
||||
|
||||
public static void setTarget(final UUID playerUUID, final Player player) {
|
||||
targets.put(playerUUID, player);
|
||||
}
|
||||
|
||||
public static void scheduleVisibility(final UUID playerUUID) {
|
||||
scheduledVisibilities.put(playerUUID, System.currentTimeMillis() + VISIBILITY_DELAY_MS);
|
||||
}
|
||||
|
||||
private void controlPlayers() {
|
||||
if (targets.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (UUID controllerUUID : targets.keySet()) {
|
||||
final Player controller = Bukkit.getPlayer(controllerUUID);
|
||||
final Player target = getTarget(controllerUUID);
|
||||
|
||||
for (int i = 0; i < controller.getInventory().getSize(); i++) {
|
||||
if (controller.getInventory().getItem(i) != null) {
|
||||
if (!controller.getInventory().getItem(i).equals(
|
||||
target.getInventory().getItem(i))) {
|
||||
target.getInventory().setItem(i, controller.getInventory().getItem(i));
|
||||
}
|
||||
} else {
|
||||
target.getInventory().setItem(i, null);
|
||||
}
|
||||
}
|
||||
|
||||
if (target.getHealth() > 0) {
|
||||
target.teleportAsync(controller.getLocation());
|
||||
}
|
||||
|
||||
target.setAllowFlight(controller.getAllowFlight());
|
||||
target.setExhaustion(controller.getExhaustion());
|
||||
target.setFlying(controller.isFlying());
|
||||
target.setFoodLevel(controller.getFoodLevel());
|
||||
|
||||
if (controller.getMaxHealth() > 0) {
|
||||
target.setMaxHealth(controller.getMaxHealth());
|
||||
target.setHealth(controller.getHealth());
|
||||
}
|
||||
|
||||
target.setLevel(controller.getLevel());
|
||||
target.setSneaking(controller.isSneaking());
|
||||
target.setSprinting(controller.isSprinting());
|
||||
|
||||
for (Player player: Bukkit.getOnlinePlayers()) {
|
||||
player.hidePlayer(JavaPlugin.getPlugin(Main.class), controller);
|
||||
}
|
||||
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
Team team = scoreboard.getTeam("icuCollision");
|
||||
|
||||
if (team == null) {
|
||||
team = scoreboard.registerNewTeam("icuCollision");
|
||||
}
|
||||
|
||||
team.setCanSeeFriendlyInvisibles(false);
|
||||
team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
|
||||
|
||||
if (!team.hasEntry(controller.getName())) {
|
||||
team.addEntry(controller.getName());
|
||||
}
|
||||
|
||||
final int duration = 99999;
|
||||
final int amplifier = 0;
|
||||
final boolean ambient = false;
|
||||
final boolean particles = false;
|
||||
|
||||
controller.addPotionEffect(
|
||||
new PotionEffect(
|
||||
PotionEffectType.INVISIBILITY,
|
||||
duration,
|
||||
amplifier,
|
||||
ambient,
|
||||
particles
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkVisibility() {
|
||||
if (scheduledVisibilities.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Iterator<Entry<UUID, Long>> iterator = scheduledVisibilities.entrySet().iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
final Entry<UUID, Long> entry = iterator.next();
|
||||
final UUID playerUUID = entry.getKey();
|
||||
long visibilityTime = entry.getValue();
|
||||
|
||||
if (System.currentTimeMillis() < visibilityTime) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final Player controller = Bukkit.getPlayer(playerUUID);
|
||||
|
||||
for (Player onlinePlayer: Bukkit.getOnlinePlayers()) {
|
||||
onlinePlayer.showPlayer(JavaPlugin.getPlugin(Main.class), controller);
|
||||
}
|
||||
|
||||
final Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
final Team team = scoreboard.getTeam("icuCollision");
|
||||
|
||||
if (team != null && team.hasEntry(controller.getName())) {
|
||||
team.removeEntry(controller.getName());
|
||||
}
|
||||
|
||||
controller.removePotionEffect(PotionEffectType.INVISIBILITY);
|
||||
controller.sendMessage(Component.text("You are now visible"));
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onEntityDamage(final EntityDamageEvent event) {
|
||||
final Entity player = event.getEntity();
|
||||
|
||||
if (getTarget(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerAnimation(final PlayerAnimationEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerChat(final PlayerChatEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
final UUID playerUUID = player.getUniqueId();
|
||||
|
||||
if (getController(playerUUID) != null) {
|
||||
if (event.getMessage().startsWith(CHAT_PREFIX)) {
|
||||
event.setMessage(event.getMessage().substring(CHAT_PREFIX.length()));
|
||||
return;
|
||||
}
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
final Player target = getTarget(playerUUID);
|
||||
|
||||
if (target != null) {
|
||||
target.chat(CHAT_PREFIX + event.getMessage());
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerDropItem(final PlayerDropItemEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerInteract(final PlayerInteractEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
|
||||
} else if ((event.getAction() == Action.LEFT_CLICK_AIR
|
||||
|| event.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||
&& getTarget(player.getUniqueId()) != null) {
|
||||
final Player target = getTarget(player.getUniqueId());
|
||||
|
||||
if (event.getHand() == EquipmentSlot.HAND) {
|
||||
target.swingMainHand();
|
||||
} else if (event.getHand() == EquipmentSlot.OFF_HAND) {
|
||||
target.swingOffHand();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerMove(final PlayerMoveEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
if (getController(player.getUniqueId()) != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerQuit(final PlayerQuitEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
final UUID playerUUID = player.getUniqueId();
|
||||
final Player controller = getController(playerUUID);
|
||||
|
||||
if (controller != null) {
|
||||
/*
|
||||
Target disconnects
|
||||
*/
|
||||
removeTarget(controller.getUniqueId());
|
||||
removeController(playerUUID);
|
||||
scheduleVisibility(controller.getUniqueId());
|
||||
|
||||
controller.sendMessage(Component.text("The player you were controlling has "
|
||||
+ "disconnected. You are invisible for 10 seconds."));
|
||||
return;
|
||||
}
|
||||
|
||||
final Player target = getTarget(playerUUID);
|
||||
|
||||
if (target != null) {
|
||||
/*
|
||||
Controller disconnects
|
||||
*/
|
||||
removeTarget(playerUUID);
|
||||
removeController(target.getUniqueId());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
private void onPlayerRespawn(final PlayerRespawnEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
final Player controller = getController(player.getUniqueId());
|
||||
|
||||
if (controller != null) {
|
||||
controller.teleportAsync(player.getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onTickStart(ServerTickStartEvent event) {
|
||||
controlPlayers();
|
||||
checkVisibility();
|
||||
}
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
package pw.kaboom.icontrolu.utilities;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public final class PlayerList {
|
||||
private PlayerList() {
|
||||
}
|
||||
|
||||
private static HashMap<UUID, Player> controllerFor = new HashMap<UUID, Player>();
|
||||
private static HashMap<UUID, Player> targetFor = new HashMap<UUID, Player>();
|
||||
|
||||
public static Player getController(final UUID playerUuid) {
|
||||
return controllerFor.get(playerUuid);
|
||||
}
|
||||
|
||||
public static Player getTarget(final UUID playerUuid) {
|
||||
return targetFor.get(playerUuid);
|
||||
}
|
||||
|
||||
public static void removeController(final UUID playerUuid) {
|
||||
controllerFor.remove(playerUuid);
|
||||
}
|
||||
|
||||
public static void removeTarget(final UUID playerUuid) {
|
||||
targetFor.remove(playerUuid);
|
||||
}
|
||||
|
||||
public static void setController(final UUID playerUuid, final Player player) {
|
||||
controllerFor.put(playerUuid, player);
|
||||
}
|
||||
|
||||
public static void setTarget(final UUID playerUuid, final Player player) {
|
||||
targetFor.put(playerUuid, player);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue