A claim plugin based on FTB Chunks
1package dev.keii.keiichunks.events;
2
3import dev.keii.keiichunks.DatabaseConnector;
4import dev.keii.keiichunks.KeiiChunks;
5import dev.keii.keiichunks.PlayerChunk;
6import net.kyori.adventure.text.Component;
7import net.kyori.adventure.text.format.NamedTextColor;
8import org.bukkit.Bukkit;
9import org.bukkit.Chunk;
10import org.bukkit.entity.Player;
11import org.bukkit.event.EventHandler;
12import org.bukkit.event.Listener;
13import org.bukkit.event.block.BlockBreakEvent;
14
15import java.sql.Connection;
16import java.sql.ResultSet;
17import java.sql.SQLException;
18import java.sql.Statement;
19
20import static dev.keii.keiichunks.PlayerChunk.getChunkPermissionString;
21
22public class BlockBreak implements Listener {
23
24 public static boolean getPlayerPermissionForChunk(Player player, Chunk chunk, PlayerChunk.ChunkPermission perm)
25 {
26 boolean canBreak = true;
27
28 try {
29 Connection connection = DatabaseConnector.getConnection();
30 Statement statement = connection.createStatement();
31
32 ResultSet claimResultSet = statement.executeQuery("SELECT * FROM claim WHERE chunk_x = " + chunk.getX() + " AND chunk_z = " + chunk.getZ());
33
34 if(!claimResultSet.next()) // Claim doesn't exist
35 {
36 claimResultSet.close();
37 statement.close();
38 connection.close();
39 return true;
40 }
41
42 long claimId = claimResultSet.getLong("id");
43 long claimOwnerId = claimResultSet.getLong("user_id");
44 claimResultSet.close();
45
46 ResultSet claimPermissionResultSet = statement.executeQuery("SELECT * FROM claim_permission WHERE user_id IS NULL AND claim_id = " + claimId);
47
48 if(claimPermissionResultSet.next())
49 {
50 canBreak = claimPermissionResultSet.getBoolean(getChunkPermissionString(perm));
51 }
52
53 claimPermissionResultSet.close();
54
55 ResultSet userResultSet = statement.executeQuery( "SELECT id FROM user WHERE uuid = \"" + player.getUniqueId().toString() + "\"");
56
57 if(userResultSet.next()) {
58 if(userResultSet.getLong("id") == claimOwnerId)
59 {
60 canBreak = true;
61 } else {
62 ResultSet claimPermissionUserResultSet = statement.executeQuery("SELECT * FROM claim_permission WHERE user_id = " + userResultSet.getLong("id") + " AND claim_id = " + claimId);
63
64 if (claimPermissionUserResultSet.next()) {
65 canBreak = claimPermissionUserResultSet.getBoolean(getChunkPermissionString(perm));
66 }
67
68 claimPermissionUserResultSet.close();
69 }
70 }
71
72 userResultSet.close();
73
74 statement.close();
75 connection.close();
76 } catch (SQLException e) {
77 Bukkit.getServer().broadcast(Component.text("Fatal Database Error: " + e.getMessage()).color(NamedTextColor.RED));
78 }
79
80 return canBreak;
81 }
82
83 @EventHandler
84 public void onBlockBreak(BlockBreakEvent event)
85 {
86 Player player = event.getPlayer();
87 Chunk chunk = event.getBlock().getChunk();
88
89 boolean canBreak = getPlayerPermissionForChunk(player, chunk, PlayerChunk.ChunkPermission.BlockBreak);
90
91 event.setCancelled(!canBreak);
92 if(!canBreak)
93 {
94 player.sendActionBar(Component.text("You do not have the rights to break blocks in this chunk!").color(NamedTextColor.RED));
95 }
96 }
97}