335 lines
14 KiB
Java
335 lines
14 KiB
Java
package me.arcodeskel.uwpmcutils;
|
|
import me.arcodeskel.uwpmcutils.commands.*;
|
|
import org.bukkit.*;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.command.CommandExecutor;
|
|
import org.bukkit.entity.Entity;
|
|
import org.bukkit.entity.EntityType;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
import org.bukkit.event.player.*;
|
|
import org.bukkit.inventory.ItemStack;
|
|
import org.bukkit.inventory.meta.ItemMeta;
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
|
import org.bukkit.event.Listener;
|
|
|
|
import java.sql.*;
|
|
import java.util.*;
|
|
|
|
|
|
public class Main extends JavaPlugin implements CommandExecutor, Listener, Maps {
|
|
|
|
|
|
// Claim Tool
|
|
|
|
ItemStack itemStack = new ItemStack(Material.GOLDEN_SHOVEL);
|
|
|
|
// Ranks
|
|
|
|
String[] ranks = {"GUEST", "MEMBER", "BUILDER" , "MOD", "DEV", "OWNER"};
|
|
ChatColor[] colors = {ChatColor.GRAY, ChatColor.GREEN, ChatColor.DARK_AQUA ,ChatColor.LIGHT_PURPLE, ChatColor.RED, ChatColor.RED};
|
|
String CreateHome = "CREATE TABLE IF NOT EXISTS 'homes' ('username' TEXT UNIQUE, 'x' INTEGER, 'y' INTEGER, 'z' INTEGER, 'yaw' INTEGER, 'pitch' INTEGER)";
|
|
String CreateRank = "CREATE TABLE IF NOT EXISTS 'rank' ('username' TEXT UNIQUE, 'rank' TEXT)";
|
|
String CreateSpawn = "CREATE TABLE IF NOT EXISTS 'spawn' ('x' INTEGER DEFAULT 0, 'y' INTEGER DEFAULT 0, 'z' INTEGER DEFAULT 0, 'yaw' INTEGER DEFAULT 0, 'pitch' INTEGER DEFAULT 0)";
|
|
|
|
// Survival World
|
|
|
|
World main = Bukkit.getServer().getWorld("world");
|
|
|
|
@Override
|
|
public void onEnable() {
|
|
getServer().getPluginManager().registerEvents(this, this);
|
|
Objects.requireNonNull(getCommand("spawn")).setExecutor(new Spawn());
|
|
Objects.requireNonNull(getCommand("sethome")).setExecutor(new SetHome());
|
|
Objects.requireNonNull(getCommand("home")).setExecutor(new Home());
|
|
Objects.requireNonNull(getCommand("rtp")).setExecutor(new Rtp());
|
|
Objects.requireNonNull(getCommand("rank")).setExecutor(new Rank());
|
|
Objects.requireNonNull(getCommand("setspawn")).setExecutor(new SetSpawn());
|
|
Objects.requireNonNull(getCommand("tpbuild")).setExecutor(new tpbuild());
|
|
Objects.requireNonNull(getCommand("help")).setExecutor(new Help());
|
|
|
|
try {
|
|
Connection connection = DatabaseConnection.getConnection();
|
|
Statement statement = connection.createStatement();
|
|
statement.addBatch(CreateHome);
|
|
statement.addBatch(CreateRank);
|
|
statement.addBatch(CreateSpawn);
|
|
statement.executeBatch();
|
|
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
getLogger().info("Utils Plugin Started");
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onDisable() {
|
|
getLogger().info("Utils Plugin Disabled");
|
|
}
|
|
|
|
@EventHandler(priority = EventPriority.HIGH)
|
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
|
|
|
|
|
|
|
String rank = "SELECT rank FROM rank WHERE username= ?";
|
|
|
|
if (event.getPlayer().hasPlayedBefore()) {
|
|
event.getPlayer().sendMessage("Welcome back, " + event.getPlayer().getName() + "! There are currently " + getServer().getOnlinePlayers().size() + " players online.");
|
|
|
|
/*
|
|
try (Connection connection = DatabaseConnection.getConnection();) {
|
|
try (PreparedStatement psUpdate = connection.prepareStatement(rank)) {
|
|
psUpdate.setString(1, event.getPlayer().getName());
|
|
psUpdate.executeQuery();
|
|
for (String s : ranks) {
|
|
if (s.equals(psUpdate.getResultSet().toString())) {
|
|
event.getPlayer().setPlayerListName(rank + " " + event.getPlayer().getName());
|
|
break;
|
|
}
|
|
}
|
|
connection.close();
|
|
}
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
} else if (!event.getPlayer().hasPlayedBefore()) {
|
|
|
|
String insertUser = "INSERT OR IGNORE INTO rank (username) VALUES (?)";
|
|
|
|
try (Connection connection = DatabaseConnection.getConnection()) {
|
|
try (PreparedStatement psUpdate = connection.prepareStatement(insertUser)) {
|
|
psUpdate.setString(1, event.getPlayer().getName());
|
|
|
|
Rank.addGuest(event.getPlayer().getName());
|
|
//event.getPlayer().setPlayerListName(ranks[0] + " " + event.getPlayer().getName());
|
|
event.getPlayer().sendMessage("Welcome to UWP MC! Go through the mineshaft elevator to get started.");
|
|
|
|
ItemMeta meta = itemStack.getItemMeta();
|
|
assert meta != null;
|
|
meta.setDisplayName("Claim Tool");
|
|
itemStack.setItemMeta(meta);
|
|
event.getPlayer().getInventory().setItem(0, itemStack);
|
|
|
|
// Execute the SELECT statement
|
|
try (PreparedStatement selectStmt = connection.prepareStatement("SELECT x, y, z FROM spawn LIMIT 1")) {
|
|
try (ResultSet resultSet = selectStmt.executeQuery()) { // Execute the query
|
|
if (resultSet.next()) { // Move to the first row
|
|
double x = resultSet.getDouble("x");
|
|
double y = resultSet.getDouble("y");
|
|
double z = resultSet.getDouble("z");
|
|
|
|
psUpdate.executeUpdate(); // Now execute the update
|
|
Location location = new Location(Bukkit.getServer().getWorld("world"), x, y, z);
|
|
event.getPlayer().teleport(location);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (SQLException e) {
|
|
getLogger().info("SQLite ran into an exception. If the exception relates to unique constraints, it can be safely ignored.");
|
|
getLogger().info(e.toString());
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
@EventHandler
|
|
public void onPlayerRespawn(PlayerRespawnEvent event) throws SQLException {
|
|
try {
|
|
String result = "SELECT x,y,z FROM spawn";
|
|
Connection connection = DatabaseConnection.getConnection();
|
|
Statement statement = connection.createStatement();
|
|
var resultset = statement.executeQuery(result);
|
|
double x = resultset.getDouble(1);
|
|
double y = resultset.getDouble(2);
|
|
double z = resultset.getDouble(3);
|
|
|
|
ItemMeta meta = itemStack.getItemMeta();
|
|
assert meta != null;
|
|
meta.setDisplayName("Claim Tool");
|
|
itemStack.setItemMeta(meta);
|
|
|
|
if (enteringEndPortal.contains(event.getPlayer().getUniqueId().toString())) {
|
|
enteringEndPortal.remove(event.getPlayer().getUniqueId().toString());
|
|
}
|
|
|
|
if (event.getPlayer().getWorld().getName().equals("world")) {
|
|
event.getPlayer().getInventory().setItem(0, itemStack);
|
|
}
|
|
|
|
if (!event.getPlayer().getWorld().getName().equals("world")) {
|
|
Location loc = new Location(Bukkit.getWorld("world"), x, y, z);
|
|
Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L);
|
|
}
|
|
|
|
if (event.getPlayer().getBedSpawnLocation() != null) {
|
|
if (!event.getPlayer().getBedSpawnLocation().getWorld().getName().equals("world")) {
|
|
Location loc = new Location(Bukkit.getWorld("world"), x, y, z);
|
|
Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L);
|
|
return;
|
|
}
|
|
Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(event.getPlayer().getBedSpawnLocation()), 1L);
|
|
}
|
|
|
|
if (event.getPlayer().getBedSpawnLocation() == null) {
|
|
Location loc = new Location(Bukkit.getWorld("world"), x, y, z);
|
|
Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L);
|
|
}
|
|
|
|
else {
|
|
Location loc = new Location(Bukkit.getWorld("world"), x, y, z);
|
|
Bukkit.getScheduler().runTaskLater(this, () -> event.getPlayer().teleport(loc), 1L);
|
|
}
|
|
|
|
|
|
|
|
connection.close();
|
|
|
|
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
@EventHandler
|
|
public boolean loggedOff(PlayerQuitEvent event) {
|
|
if (activeCommands.contains(event.getPlayer())) {
|
|
double velocity = originalVelocity.get(event.getPlayer());
|
|
event.getPlayer().setVelocity(event.getPlayer().getLocation().getDirection().multiply(velocity));
|
|
frozenPlayers.remove(event.getPlayer());
|
|
originalVelocity.remove(event.getPlayer());
|
|
sneakingPlayers.remove(event.getPlayer());
|
|
event.getPlayer().setWalkSpeed(0.2F);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
@EventHandler
|
|
public boolean AsyncPlayerChatEvent(AsyncPlayerChatEvent event) throws SQLException {
|
|
String playerName = event.getPlayer().getName();
|
|
|
|
// Use Bukkit's runAsync method to handle the database operation asynchronously
|
|
try (Connection connection = DatabaseConnection.getConnection();
|
|
PreparedStatement ps = connection.prepareStatement("SELECT rank FROM rank WHERE username = ?")) {
|
|
|
|
ps.setString(1, playerName);
|
|
ResultSet resultSet = ps.executeQuery();
|
|
|
|
if (resultSet.next()) {
|
|
String rank = resultSet.getString("rank");
|
|
|
|
for (int i = 0; i < ranks.length; i++) {
|
|
if (ranks[i].equalsIgnoreCase(rank)) {
|
|
// Set the chat format in the main thread
|
|
String formattedMessage = colors[i] + ranks[i] + " " + ChatColor.AQUA + playerName + " >> " + ChatColor.GOLD + event.getMessage();
|
|
event.setFormat(formattedMessage);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} catch (SQLException e) {
|
|
e.printStackTrace(); // Handle the exception appropriately
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@EventHandler
|
|
public void onPlayerMove(PlayerMoveEvent event) {
|
|
if (frozenPlayers.contains(event.getPlayer())) {
|
|
event.setCancelled(true); // Cancel movement
|
|
}
|
|
}
|
|
|
|
public void onPlayerDamage(EntityDamageByEntityEvent event) {
|
|
if (event.getDamager() instanceof Player) {
|
|
// Check if the damaged entity is a mob
|
|
Entity damager = event.getDamager();
|
|
Player player = (Player) damager;
|
|
if (activeCommands.contains(player)) {
|
|
if (event.getEntity().getType() != EntityType.PLAYER || event.getEntity().getType() == EntityType.PLAYER) {
|
|
event.setCancelled(true); // Cancel the damage event
|
|
event.getDamager().sendMessage(ChatColor.RED + "You cannot attack while teleporting! (SHIFT TO CANCEL)");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onPlayerPortal(PlayerPortalEvent event) {
|
|
if (event.getTo().getWorld().getName().equals("world_the_end") || event.getTo().getWorld().getName().equals("anarchy_end")) {
|
|
enteringEndPortal.add(event.getPlayer().getUniqueId().toString());
|
|
}
|
|
}
|
|
|
|
|
|
@EventHandler
|
|
public void onPlayerCommandPreprocess (PlayerCommandPreprocessEvent event){
|
|
String command = event.getMessage();
|
|
|
|
if (command.equalsIgnoreCase("/home")) {
|
|
if (!event.getPlayer().getWorld().getName().equals("world") && !event.getPlayer().getWorld().getName().equals("world_nether") && !event.getPlayer().getWorld().getName().equals("world_the_end")) {
|
|
event.getPlayer().sendMessage(ChatColor.RED + "Cannot use this command in " + event.getPlayer().getWorld().getName() + ", enter spawn to execute this command!");
|
|
event.setCancelled(true);
|
|
}
|
|
}
|
|
|
|
if (command.equalsIgnoreCase("/rtp")) {
|
|
if (!event.getPlayer().getWorld().getName().equals("world")) {
|
|
event.getPlayer().sendMessage(ChatColor.RED + "Cannot use this command in " + event.getPlayer().getWorld().getName() + ", you can only use this in the survival over world or at spawn!");
|
|
event.setCancelled(true);
|
|
}
|
|
}
|
|
|
|
if (command.equalsIgnoreCase("/home") || command.equalsIgnoreCase("/spawn") || command.equalsIgnoreCase("/rtp")) {
|
|
|
|
Block blockBelow = event.getPlayer().getLocation().subtract(0, 1, 0).getBlock();
|
|
|
|
if (!blockBelow.getType().isSolid()) {
|
|
event.getPlayer().sendMessage(ChatColor.RED + "Cannot teleport while falling!");
|
|
event.setCancelled(true); // Cancel the command
|
|
}
|
|
|
|
if (activeCommands.contains(event.getPlayer())) {
|
|
event.getPlayer().sendMessage(ChatColor.RED + "You already have a command in progress!");
|
|
event.setCancelled(true); // Cancel the new command
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|