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: