168 lines
7.8 KiB
Java
168 lines
7.8 KiB
Java
package net.brysonsteck.Resurrection.commands;
|
|
|
|
import net.brysonsteck.Resurrection.Resurrection;
|
|
import net.brysonsteck.Resurrection.player.PlayerData;
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.GameMode;
|
|
import org.bukkit.Sound;
|
|
import org.bukkit.command.Command;
|
|
import org.bukkit.command.CommandExecutor;
|
|
import org.bukkit.command.CommandSender;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
|
import org.bukkit.potion.PotionEffect;
|
|
|
|
public class CommandResurrect implements CommandExecutor {
|
|
boolean DEBUG;
|
|
|
|
public CommandResurrect(String debug) {
|
|
this.DEBUG = Boolean.parseBoolean(debug);
|
|
}
|
|
|
|
@Override
|
|
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {
|
|
Logger log = JavaPlugin.getProvidingPlugin(Resurrection.class).getLogger();
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: The `resurrect` command was ran by " + commandSender.getName());
|
|
}
|
|
|
|
boolean valid = (strings.length == 1);
|
|
|
|
|
|
if (commandSender instanceof Player) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: CommandSender is a player.");
|
|
}
|
|
|
|
Player p = (Player) commandSender;
|
|
if (valid) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: Valid; an argument was specified. Assuming it as name of player to resurrect");
|
|
}
|
|
|
|
Player resurrectPlayer = Bukkit.getPlayer(strings[0]);
|
|
if (resurrectPlayer == null) {
|
|
p.sendMessage(ChatColor.RED + "ERROR: That player is not online/doesn't exist! Failed to resurrect.");
|
|
return false;
|
|
}
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: Specified player \"" + resurrectPlayer.getDisplayName() + "\" exists");
|
|
}
|
|
|
|
if (resurrectPlayer.getGameMode() == GameMode.SPECTATOR) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: Specified player in spectator mode, assuming dead");
|
|
}
|
|
for (PotionEffect effect : resurrectPlayer.getActivePotionEffects())
|
|
resurrectPlayer.removePotionEffect(effect.getType());
|
|
resurrectPlayer.setGameMode(GameMode.SURVIVAL);
|
|
for(Player player : Bukkit.getOnlinePlayers()){
|
|
try {
|
|
player.playSound(player.getLocation(), Sound.ENTITY_ENDER_DRAGON_GROWL, 1, 0);
|
|
} catch (NoSuchFieldError e) {
|
|
log.warning("NoSuchFieldError encountered, playing Wither noise instead.");
|
|
player.playSound(player.getLocation(), Sound.ENTITY_WITHER_DEATH, 1, 0);
|
|
}
|
|
}
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + strings[0] + " has been resurrected manually by an admin!");
|
|
removeDeath(resurrectPlayer);
|
|
if (p.getBedSpawnLocation() != null) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: A bed for the specified player was found. Teleporting");
|
|
}
|
|
|
|
p.teleport(p.getBedSpawnLocation());
|
|
}
|
|
return true;
|
|
} else {
|
|
p.sendMessage(ChatColor.RED + "ERROR: " + strings[0] + " is not dead! Failed to resurrect.");
|
|
return false;
|
|
}
|
|
} else {
|
|
p.sendMessage(ChatColor.RED + "ERROR: Too few arguments!");
|
|
return false;
|
|
}
|
|
} else {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: CommandSender is console.");
|
|
}
|
|
|
|
if (valid) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: Valid; an argument was specified. Assuming it as name of player to resurrect");
|
|
}
|
|
|
|
Player resurrectPlayer = Bukkit.getPlayer(strings[0]);
|
|
if (resurrectPlayer == null) {
|
|
log.warning("ERROR: That player is not online/doesn't exist! Failed to resurrect.");
|
|
return false;
|
|
}
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: Specified player \"" + resurrectPlayer.getDisplayName() + "\" exists");
|
|
}
|
|
|
|
if (resurrectPlayer.getGameMode() == GameMode.SPECTATOR) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: Specified player in spectator mode, assuming dead");
|
|
}
|
|
for (PotionEffect effect : resurrectPlayer.getActivePotionEffects())
|
|
resurrectPlayer.removePotionEffect(effect.getType());
|
|
resurrectPlayer.setGameMode(GameMode.SURVIVAL);
|
|
for(Player player : Bukkit.getOnlinePlayers()){
|
|
try {
|
|
player.playSound(player.getLocation(), Sound.ENTITY_ENDER_DRAGON_GROWL, 1, 0);
|
|
} catch (NoSuchFieldError e) {
|
|
log.warning("NoSuchFieldError encountered, playing Wither noise instead.");
|
|
player.playSound(player.getLocation(), Sound.ENTITY_WITHER_DEATH, 1, 0);
|
|
}
|
|
}
|
|
Bukkit.broadcastMessage(strings[0] + " has been resurrected manually by an admin!");
|
|
removeDeath(resurrectPlayer);
|
|
if (resurrectPlayer.getBedSpawnLocation() != null) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: A bed for the specified player was found. Teleporting");
|
|
}
|
|
|
|
resurrectPlayer.teleport(resurrectPlayer.getBedSpawnLocation());
|
|
}
|
|
return true;
|
|
} else {
|
|
log.warning("ERROR: " + strings[0] + " is not dead! Failed to resurrect.");
|
|
return false;
|
|
}
|
|
} else {
|
|
log.warning("ERROR: Too few arguments!");
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void removeDeath(Player p) {
|
|
PlayerData playerData = new PlayerData();
|
|
playerData.readData();
|
|
String rawData = playerData.getRawData();
|
|
String[] rawPlayers = rawData.split(";");
|
|
int index = 0;
|
|
for (String players : rawPlayers) {
|
|
if (players.startsWith(p.getDisplayName())) {
|
|
if (DEBUG) {
|
|
Bukkit.broadcastMessage(ChatColor.YELLOW +""+ ChatColor.BOLD + "[Res. DEBUG]: Removing the death from the resurrected player");
|
|
}
|
|
String[] playerSplit = players.split(",");
|
|
playerSplit[1] = "false";
|
|
playerSplit[2] = "0";
|
|
|
|
// save data
|
|
rawPlayers[index] = String.join(",", playerSplit);
|
|
rawData = String.join(";", rawPlayers);
|
|
playerData.saveData(rawData);
|
|
break;
|
|
}
|
|
index++;
|
|
}
|
|
}
|
|
}
|