diff --git a/pom.xml b/pom.xml index 27ed4b2..cfd6f84 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.youhavetrouble PreventStabby - 1.3-pre2 + 1.3-pre3 jar PreventStabby @@ -77,6 +77,10 @@ jitpack.io https://jitpack.io + + sk89q-repo + https://maven.enginehub.org/repo/ + @@ -109,5 +113,11 @@ 2.2.1 compile + + com.sk89q.worldguard + worldguard-bukkit + 7.0.4-SNAPSHOT + provided + diff --git a/src/main/java/me/youhavetrouble/preventstabby/PreventStabby.java b/src/main/java/me/youhavetrouble/preventstabby/PreventStabby.java index 6ebefa5..5ec2b20 100644 --- a/src/main/java/me/youhavetrouble/preventstabby/PreventStabby.java +++ b/src/main/java/me/youhavetrouble/preventstabby/PreventStabby.java @@ -2,6 +2,7 @@ package me.youhavetrouble.preventstabby; import me.youhavetrouble.preventstabby.commands.MainCommand; import me.youhavetrouble.preventstabby.config.ConfigCache; +import me.youhavetrouble.preventstabby.hooks.WorldGuardHook; import me.youhavetrouble.preventstabby.players.PlayerManager; import me.youhavetrouble.preventstabby.players.SmartCache; import me.youhavetrouble.preventstabby.util.PreventStabbyListener; @@ -68,6 +69,10 @@ public final class PreventStabby extends JavaPlugin { pvpCommand.setExecutor(mainCommand); pvpCommand.setTabCompleter(mainCommand); + try { + WorldGuardHook.init(); + } catch (NoClassDefFoundError ignored) {} + Metrics metrics = new Metrics(this, 10597); } @@ -78,7 +83,7 @@ public final class PreventStabby extends JavaPlugin { public void reloadPluginConfig(CommandSender commandSender) { getServer().getScheduler().runTaskAsynchronously(this, () -> { reloadPluginConfig(); - commandSender.sendMessage("TogglePvP configuration reloaded."); + commandSender.sendMessage("PreventStabby configuration reloaded."); }); } diff --git a/src/main/java/me/youhavetrouble/preventstabby/commands/HelpCommand.java b/src/main/java/me/youhavetrouble/preventstabby/commands/HelpCommand.java index bd9af07..4b69c59 100644 --- a/src/main/java/me/youhavetrouble/preventstabby/commands/HelpCommand.java +++ b/src/main/java/me/youhavetrouble/preventstabby/commands/HelpCommand.java @@ -14,7 +14,7 @@ public class HelpCommand { List helpPage = new ArrayList<>(); - helpPage.add(PluginMessages.parseMessage("&b&m &bTogglePvP Help&b&m ")); + helpPage.add(PluginMessages.parseMessage("&b&m &bPreventStabby Help&b&m ")); helpPage.add(PluginMessages.parseMessage("&9/pvp &b&lhelp &f- shows this message")); if (sender.hasPermission("preventstabby.command.toggle")) { helpPage.add(PluginMessages.parseMessage("&9/pvp &b&l[on/off] &f- enables or disables PvP")); diff --git a/src/main/java/me/youhavetrouble/preventstabby/hooks/WorldGuardHook.java b/src/main/java/me/youhavetrouble/preventstabby/hooks/WorldGuardHook.java new file mode 100644 index 0000000..87b2eec --- /dev/null +++ b/src/main/java/me/youhavetrouble/preventstabby/hooks/WorldGuardHook.java @@ -0,0 +1,78 @@ +package me.youhavetrouble.preventstabby.hooks; + +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.util.Location; +import com.sk89q.worldguard.LocalPlayer; +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.flags.Flag; +import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.flags.registry.FlagConflictException; +import com.sk89q.worldguard.protection.flags.registry.FlagRegistry; +import com.sk89q.worldguard.protection.regions.RegionContainer; +import com.sk89q.worldguard.protection.regions.RegionQuery; +import me.youhavetrouble.preventstabby.PreventStabby; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class WorldGuardHook { + + private static WorldGuardPlugin worldGuardPlugin; + private static FlagRegistry flagRegistry; + public static StateFlag FORCE_PVP_FLAG; + + + public static void init() { + PreventStabby plugin = PreventStabby.getPlugin(); + try { + Class.forName("com.sk89q.worldguard.protection.flags.registry.FlagConflictException"); + System.out.println("what"); + worldGuardPlugin = WorldGuardPlugin.inst(); + System.out.println("the"); + if (WorldGuard.getInstance() == null || worldGuardPlugin == null) return; + System.out.println("actual"); + plugin.getLogger().info("Hooking into WorldGuard"); + flagRegistry = WorldGuard.getInstance().getFlagRegistry(); + System.out.println("fuck"); + createForcePvpFlag(plugin); + } catch (NoClassDefFoundError | ClassNotFoundException e) { + return; + } + } + + private static void createForcePvpFlag(Plugin plugin) { + if (!isHooked()) return; + if (flagRegistry == null) return; + String flagName = "preventstabby-force-pvp"; + try { + StateFlag flag = new StateFlag(flagName, false); + flagRegistry.register(flag); + FORCE_PVP_FLAG = flag; + } catch (FlagConflictException e) { + Flag existing = flagRegistry.get(flagName); + if (existing instanceof StateFlag) { + FORCE_PVP_FLAG = (StateFlag) existing; + } else { + plugin.getLogger().severe("There is a conflict between flag names!"); + } + } + } + + public static boolean isPlayerForcedToPvp(Player player) { + if (!isHooked()) return false; + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + org.bukkit.Location loc = player.getLocation(); + LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); + ApplicableRegionSet set = query.getApplicableRegions(new Location(BukkitAdapter.adapt(loc.getWorld()), loc.getX(), loc.getY(), loc.getZ())); + return set.testState(localPlayer, FORCE_PVP_FLAG); + } + + public static boolean isHooked() { + return worldGuardPlugin != null; + } + + + +} diff --git a/src/main/java/me/youhavetrouble/preventstabby/listeners/player/PlayerJoinAndLeaveListener.java b/src/main/java/me/youhavetrouble/preventstabby/listeners/player/PlayerJoinAndLeaveListener.java index 6de36f2..8e8463f 100644 --- a/src/main/java/me/youhavetrouble/preventstabby/listeners/player/PlayerJoinAndLeaveListener.java +++ b/src/main/java/me/youhavetrouble/preventstabby/listeners/player/PlayerJoinAndLeaveListener.java @@ -26,7 +26,7 @@ public class PlayerJoinAndLeaveListener implements Listener { PlayerData playerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(player.getUniqueId()); long time = Instant.now().getEpochSecond(); if (playerData == null) { - PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, new PlayerData(false)); + PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, new PlayerData(uuid,false)); Bukkit.getScheduler().runTaskAsynchronously(PreventStabby.getPlugin(), () -> { PlayerData data = PreventStabby.getPlugin().getSqLite().getPlayerInfo(uuid); PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, data); diff --git a/src/main/java/me/youhavetrouble/preventstabby/players/PlayerData.java b/src/main/java/me/youhavetrouble/preventstabby/players/PlayerData.java index 091f447..d580d2d 100644 --- a/src/main/java/me/youhavetrouble/preventstabby/players/PlayerData.java +++ b/src/main/java/me/youhavetrouble/preventstabby/players/PlayerData.java @@ -7,11 +7,12 @@ import java.util.UUID; public class PlayerData { - private UUID playerUuid; + private final UUID playerUuid; private long cachetime, combattime, loginTimestamp, teleportTimestamp; private boolean pvpEnabled, lastCombatCheck, inCombat; - public PlayerData(boolean pvpEnabled) { + public PlayerData(UUID playerUuid, boolean pvpEnabled) { + this.playerUuid = playerUuid; this.pvpEnabled = pvpEnabled; this.combattime = Instant.now().getEpochSecond()-1; this.loginTimestamp = Instant.now().getEpochSecond()-1; diff --git a/src/main/java/me/youhavetrouble/preventstabby/players/PlayerManager.java b/src/main/java/me/youhavetrouble/preventstabby/players/PlayerManager.java index a9a8f67..694fead 100644 --- a/src/main/java/me/youhavetrouble/preventstabby/players/PlayerManager.java +++ b/src/main/java/me/youhavetrouble/preventstabby/players/PlayerManager.java @@ -3,6 +3,7 @@ package me.youhavetrouble.preventstabby.players; import me.youhavetrouble.preventstabby.PreventStabby; import me.youhavetrouble.preventstabby.api.event.PlayerLeaveCombatEvent; import me.youhavetrouble.preventstabby.config.ConfigCache; +import me.youhavetrouble.preventstabby.hooks.WorldGuardHook; import me.youhavetrouble.preventstabby.util.CombatTimer; import me.youhavetrouble.preventstabby.util.PluginMessages; import lombok.Getter; @@ -32,12 +33,16 @@ public class PlayerManager { Iterator iterator = playerList.values().iterator(); while (iterator.hasNext()) { PlayerData playerData = iterator.next(); + System.out.println(playerData); UUID uuid = playerData.getPlayerUuid(); + System.out.println("----------------------"); + System.out.println(uuid.toString()); + System.out.println("In combat: "+CombatTimer.isInCombat(uuid)); + System.out.println("Last check: "+playerData.getLastCombatCheck()); if (!CombatTimer.isInCombat(uuid)) { if (playerData.getLastCombatCheck()) { Player player = Bukkit.getPlayer(uuid); - if (player == null) - return; + if (player == null) continue; PlayerLeaveCombatEvent playerLeaveCombatEvent = new PlayerLeaveCombatEvent(player); Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> { Bukkit.getPluginManager().callEvent(playerLeaveCombatEvent); @@ -111,25 +116,25 @@ public class PlayerManager { public boolean canDamage(UUID attacker, UUID victim, boolean sendDenyMessage, boolean checkVictimSpawnProtection) { - if (hasLoginProtection(attacker) || hasTeleportProtection(attacker)) - return false; + if (hasLoginProtection(attacker) || hasTeleportProtection(attacker)) return false; - if (checkVictimSpawnProtection && hasLoginProtection(victim)) - return false; + if (checkVictimSpawnProtection && hasLoginProtection(victim)) return false; - if (checkVictimSpawnProtection && hasTeleportProtection(victim)) - return false; + if (checkVictimSpawnProtection && hasTeleportProtection(victim)) return false; SmartCache smartCache = PreventStabby.getPlugin().getSmartCache(); - if (!smartCache.getPlayerData(attacker).isPvpEnabled()) { + Player attackerPlayer = Bukkit.getPlayer(attacker); + Player victimPlayer = Bukkit.getPlayer(victim); + + if (!smartCache.getPlayerData(attacker).isPvpEnabled() && (attackerPlayer != null && !isInForcedPvpRegion(attackerPlayer))) { if (sendDenyMessage) { ConfigCache config = PreventStabby.getPlugin().getConfigCache(); PluginMessages.sendActionBar(attacker, config.getCannot_attack_attacker()); } return false; } - if (!smartCache.getPlayerData(victim).isPvpEnabled()) { + if (!smartCache.getPlayerData(victim).isPvpEnabled() && (victimPlayer != null && !isInForcedPvpRegion(victimPlayer))) { if (sendDenyMessage) { ConfigCache config = PreventStabby.getPlugin().getConfigCache(); PluginMessages.sendActionBar(attacker, config.getCannot_attack_victim()); @@ -157,4 +162,9 @@ public class PlayerManager { return Instant.now().getEpochSecond() < smartCache.getPlayerData(uuid).getTeleportTimestamp(); } + public boolean isInForcedPvpRegion(Player player) { + if (!WorldGuardHook.isHooked()) return false; + return WorldGuardHook.isPlayerForcedToPvp(player); + } + } diff --git a/src/main/java/me/youhavetrouble/preventstabby/players/SmartCache.java b/src/main/java/me/youhavetrouble/preventstabby/players/SmartCache.java index 2f90e6c..a307d46 100644 --- a/src/main/java/me/youhavetrouble/preventstabby/players/SmartCache.java +++ b/src/main/java/me/youhavetrouble/preventstabby/players/SmartCache.java @@ -42,7 +42,7 @@ public class SmartCache { return playerData; } catch (NullPointerException ex) { // Return false if database call fails - return new PlayerData(false); + return new PlayerData(uuid,false); } } } @@ -53,7 +53,7 @@ public class SmartCache { PreventStabby.getPlugin().getPlayerManager().getPlayer(uuid).setPvpEnabled(state); } // Update the database aswell - PreventStabby.getPlugin().getSqLite().updatePlayerInfo(uuid, new PlayerData(state)); + PreventStabby.getPlugin().getSqLite().updatePlayerInfo(uuid, new PlayerData(uuid, state)); } diff --git a/src/main/java/me/youhavetrouble/preventstabby/util/DatabaseSQLite.java b/src/main/java/me/youhavetrouble/preventstabby/util/DatabaseSQLite.java index d3170be..678f36c 100644 --- a/src/main/java/me/youhavetrouble/preventstabby/util/DatabaseSQLite.java +++ b/src/main/java/me/youhavetrouble/preventstabby/util/DatabaseSQLite.java @@ -64,12 +64,12 @@ public class DatabaseSQLite { } } Statement statement = conn.createStatement(); - String sql = "SELECT * FROM `players` WHERE `player_uuid` = '" + uuid.toString() + "';"; + String sql = "SELECT * FROM `players` WHERE `player_uuid` = '" + uuid + "';"; statement.execute(sql); ResultSet result = statement.getResultSet(); boolean state = result.getBoolean("pvpenabled"); conn.close(); - return new PlayerData(state); + return new PlayerData(uuid, state); } catch (SQLException throwables) { throwables.printStackTrace(); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 8640710..1cf62fe 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,11 +1,14 @@ -name: TogglePvP +name: PreventStabby version: ${project.version} -main: eu.endermite.togglepvp.PreventStabby +main: me.youhavetrouble.preventstabby.PreventStabby authors: [YouHaveTrouble] api-version: 1.13 description: Stop people from getting stabbed! +soft-depend: + - WorldGuard commands: preventstabby: + permission: preventstabby.command aliases: - pvp permissions: