A claim plugin based on FTB Chunks
1package dev.keii.keiichunks;
2
3import dev.keii.keiichunks.commands.CommandMap;
4import dev.keii.keiichunks.events.*;
5import dev.keii.keiichunks.saveload.Claim;
6import dev.keii.keiichunks.saveload.ClaimPermission;
7import dev.keii.keiichunks.saveload.User;
8import net.kyori.adventure.text.Component;
9import net.kyori.adventure.text.format.NamedTextColor;
10import org.bukkit.Bukkit;
11import org.bukkit.plugin.PluginManager;
12import org.bukkit.plugin.java.JavaPlugin;
13import org.joml.Vector2i;
14
15import java.io.FileWriter;
16import java.io.IOException;
17import java.sql.Connection;
18import java.sql.ResultSet;
19import java.sql.SQLException;
20import java.sql.Statement;
21import java.util.ArrayList;
22import java.util.HashMap;
23import java.util.List;
24import java.io.File;
25import java.util.Map;
26
27public final class KeiiChunks extends JavaPlugin {
28
29 private static KeiiChunks instance;
30 public static List<RuntimeError> RuntimeErrors = new ArrayList<>();
31
32 public static Map<Vector2i, Claim> claims = new HashMap<>();
33 public static Map<String, User> users = new HashMap<>();
34 public static Map<Long, ClaimPermission> claimPermissions = new HashMap<>();
35
36 public static Config config;
37
38 @Override
39 public void onEnable() {
40 instance = this;
41
42 config = new Config();
43 config.loadConfig();
44
45 File pluginDir = new File("./plugins/KeiiChunks");
46 if (!pluginDir.exists()){
47 if(!pluginDir.mkdirs()) {
48 Bukkit.getServer().sendMessage(Component.text("Creating plugin folders failed").color(NamedTextColor.RED));
49 }
50 }
51 File sqlFile = new File("./plugins/KeiiChunks/database.sql");
52 try {
53 if (!sqlFile.createNewFile()){
54 Bukkit.getServer().sendMessage(Component.text("Creating sql file failed").color(NamedTextColor.RED));
55 } else {
56 FileWriter myWriter = new FileWriter("./plugins/KeiiChunks/database.sql");
57 myWriter.write(DatabaseConnector.createDatabaseSqlMySQL);
58 myWriter.close();
59 Bukkit.getServer().sendMessage(Component.text("Created sql file").color(NamedTextColor.YELLOW));
60 }
61 } catch (IOException e) {
62 throw new RuntimeException(e);
63 }
64 DatabaseConnector.InitializeDatabase();
65
66 registerEvents();
67 registerCommands();
68 }
69
70 public void registerEvents() {
71 //This first line is optional, makes it faster with lots of classes
72 PluginManager pm = Bukkit.getServer().getPluginManager();
73 pm.registerEvents(new PlayerJoin(), this);
74 pm.registerEvents(new PlayerQuit(), this);
75 pm.registerEvents(new BlockBreak(), this);
76 pm.registerEvents(new BlockPlace(), this);
77 pm.registerEvents(new BucketEmpty(), this);
78 pm.registerEvents(new BucketFill(), this);
79 pm.registerEvents(new PlayerInteract(), this);
80 pm.registerEvents(new InventoryClick(), this);
81 pm.registerEvents(new PlayerMove(), this);
82 pm.registerEvents(new EntityExplode(), this);
83 pm.registerEvents(new PlayerChat(), this);
84 pm.registerEvents(new PlayerResourcePack(), this);
85 }
86
87 public void registerCommands() {
88 this.getCommand("map").setExecutor(new CommandMap());
89 }
90
91 @Override
92 public void onDisable() {
93 // Plugin shutdown logic
94 }
95
96 public static KeiiChunks getInstance()
97 {
98 return instance;
99 }
100
101 public static void SaveData()
102 {
103 Connection connection = DatabaseConnector.getConnection();
104 try {
105 connection.setAutoCommit(false);
106 Statement statement = connection.createStatement();
107
108 Bukkit.getServer().broadcast(Component.text("Server is saving! Expect some lag.").color(NamedTextColor.YELLOW));
109
110 statement.execute("DELETE FROM user;");
111 Bukkit.getServer().sendMessage(Component.text("Saving: Deleted users in database").color(NamedTextColor.YELLOW));
112
113 for(User user : users.values())
114 {
115 statement.execute(String.format("INSERT INTO user(id, uuid, timestamp, claim_power) VALUES(%d, %s, %s, %d)", user.id, user.uuid, user.timestamp, user.claimPower));
116 }
117 Bukkit.getServer().sendMessage(Component.text("Saving: Saved new users into database").color(NamedTextColor.YELLOW));
118
119 statement.execute("DELETE FROM claim;");
120 Bukkit.getServer().sendMessage(Component.text("Saving: Deleted claims in database").color(NamedTextColor.YELLOW));
121
122 for(Claim claim : claims.values())
123 {
124 statement.execute(String.format("INSERT INTO claim(id, user_id, chunk_x, chunk_z, created_at, updated_at, allow_explosions) VALUES(%d, %d, %d, %d, %s, %s, %d)", claim.id, claim.userId, claim.chunkX, claim.chunkZ, claim.createdAt, claim.updatedAt, claim.allowExplosions ? 1 : 0));
125 }
126 Bukkit.getServer().sendMessage(Component.text("Saving: Saved new claims into database").color(NamedTextColor.YELLOW));
127
128 statement.execute("DELETE FROM claim_permission;");
129 Bukkit.getServer().sendMessage(Component.text("Saving: Delete claim permissions in database").color(NamedTextColor.YELLOW));
130
131 for(ClaimPermission claimPermission : claimPermissions.values())
132 {
133 statement.execute(String.format("INSERT INTO claim_permission(id, user_id, claim_id, block_break, block_place, bucket_empty, bucket_fill, interact, created_at, updated_at) VALUES(%d, %d, %d, %d, %d, %d, %d, %d, %s, %s)", claimPermission.id, claimPermission.userId, claimPermission.claimId, claimPermission.blockBreak ? 1 : 0, claimPermission.blockPlace ? 1 : 0, claimPermission.bucketEmpty ? 1 : 0, claimPermission.bucketFill ? 1 : 0, claimPermission.interact ? 1 : 0, claimPermission.createdAt, claimPermission.updatedAt));
134 }
135 Bukkit.getServer().sendMessage(Component.text("Saving: Saved new claim permissions into database").color(NamedTextColor.YELLOW));
136
137 Bukkit.getServer().broadcast(Component.text("Save complete!").color(NamedTextColor.GREEN));
138
139 connection.commit();
140 statement.close();
141 connection.close();
142 return;
143 } catch (SQLException e) {
144 Bukkit.getServer().broadcast(Component.text("Save failed!").color(NamedTextColor.RED));
145 try {
146 connection.rollback();
147 } catch (SQLException ex) {
148 throw new RuntimeException(ex);
149 }
150 Bukkit.getServer().sendMessage(Component.text(e.getMessage()).color(NamedTextColor.RED));
151 e.printStackTrace();
152 }
153 }
154
155 public static void LoadData()
156 {
157 Connection connection = DatabaseConnector.getConnection();
158 try {
159 Bukkit.getServer().broadcast(Component.text("Server is saving! Expect some lag.").color(NamedTextColor.YELLOW));
160
161 Statement statement = connection.createStatement();
162
163 ResultSet users = statement.executeQuery("SELECT * FROM user;");
164
165 while(users.next())
166 {
167 long id = users.getLong("id");
168 String uuid = users.getString("uuid");
169 String timestamp = users.getString("timestamp");
170 int claimPower = users.getInt("claimPower");
171
172 KeiiChunks.users.put(uuid, new User(id, uuid, timestamp, claimPower));
173 }
174
175 users.close();
176 Bukkit.getServer().sendMessage(Component.text("Loading: Loaded users").color(NamedTextColor.YELLOW));
177
178 ResultSet claims = statement.executeQuery("SELECT * FROM claim;");
179
180 while(claims.next())
181 {
182 long id = claims.getLong("id");
183 long userId = claims.getLong("user_id");
184 long chunkX = claims.getLong("chunk_x");
185 long chunkZ = claims.getLong("chunk_z");
186 String createdAt = claims.getString("created_at");
187 String updatedAt = claims.getString("updated_at");
188 boolean allowExplosions = claims.getBoolean("allow_explosions");
189
190 KeiiChunks.claims.put(new Vector2i((int) chunkX, (int) chunkZ), new Claim(id, userId, chunkX, chunkZ, createdAt, updatedAt, allowExplosions));
191 }
192
193 claims.close();
194 Bukkit.getServer().sendMessage(Component.text("Loading: Loaded claims").color(NamedTextColor.YELLOW));
195
196 ResultSet claimPermission = statement.executeQuery("SELECT * FROM claim_permission;");
197
198 while(claimPermission.next())
199 {
200 long id = claims.getLong("id");
201 long userId = claims.getLong("user_id");
202 long claimId = claims.getLong("chunk_x");
203 boolean blockBreak = claims.getBoolean("block_break");
204 boolean blockPlace = claims.getBoolean("block_place");
205 boolean bucketEmpty = claims.getBoolean("bucket_empty");
206 boolean bucketFill = claims.getBoolean("bucket_fill");
207 boolean interact = claims.getBoolean("interact");
208 String createdAt = claims.getString("created_at");
209 String updatedAt = claims.getString("updated_at");
210
211 KeiiChunks.claimPermissions.put(claimId, new ClaimPermission(id, userId, claimId, blockBreak, blockPlace, bucketEmpty, bucketFill, interact, createdAt, updatedAt));
212 }
213
214 claimPermission.close();
215 Bukkit.getServer().sendMessage(Component.text("Loading: Loaded claim permissions").color(NamedTextColor.YELLOW));
216
217 Bukkit.getServer().broadcast(Component.text("Load complete!").color(NamedTextColor.GREEN));
218 statement.close();
219 connection.close();
220 } catch (SQLException e) {
221 Bukkit.getServer().broadcast(Component.text("Save failed!").color(NamedTextColor.RED));
222 Bukkit.getServer().broadcast(Component.text(e.getMessage()).color(NamedTextColor.RED));
223 e.printStackTrace();
224 }
225 }
226}