BlockProtectionBank.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package me.km.blockprotections;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import me.km.KajetansMod;
  5. import java.util.ArrayList;
  6. import me.km.databank.IStatement;
  7. import me.km.world.ModDimensions;
  8. import net.minecraft.entity.player.EntityPlayer;
  9. import net.minecraft.util.math.BlockPos;
  10. import net.minecraft.world.World;
  11. public class BlockProtectionBank
  12. {
  13. public BlockProtectionBank()
  14. {
  15. KajetansMod.databank.execute("CREATE TABLE IF NOT EXISTS block ("
  16. + "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, "
  17. + "x int(11) NOT NULL, "
  18. + "y int(11) NOT NULL, "
  19. + "z int(11) NOT NULL, "
  20. + "world_name varchar(20) NOT NULL, "
  21. + "UNIQUE KEY uniq_block_pos (world_name,x,y,z));");
  22. KajetansMod.databank.execute("CREATE TABLE IF NOT EXISTS block_grant ("
  23. + "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, "
  24. + "block_id int(11) NOT NULL, "
  25. + "player_id int(11) NOT NULL, "
  26. + "INDEX block_id (block_id), "
  27. + "UNIQUE KEY (block_id, player_id), "
  28. + "CONSTRAINT block_grant_ibfk_1 FOREIGN KEY (block_id) REFERENCES block (id) ON DELETE CASCADE);");
  29. }
  30. private final IStatement addBlock = KajetansMod.databank.createStatement(
  31. "INSERT IGNORE INTO block (x, y, z, world_name) VALUES (?, ?, ?, ?);");
  32. private final IStatement addBlockGrant = KajetansMod.databank.createStatement(
  33. "INSERT IGNORE INTO block_grant (block_id, player_id) VALUES (LAST_INSERT_ID(), ?);");
  34. public void add(int x, int y, int z, String worldName, int playerId)
  35. {
  36. try
  37. {
  38. addBlock.validate();
  39. addBlock.setInt(1, x);
  40. addBlock.setInt(2, y);
  41. addBlock.setInt(3, z);
  42. addBlock.setString(4, worldName);
  43. addBlock.executeUpdate();
  44. addBlockGrant.validate();
  45. addBlockGrant.setInt(1, playerId);
  46. addBlockGrant.executeUpdate();
  47. }
  48. catch(SQLException ex)
  49. {
  50. ex.printStackTrace();
  51. }
  52. }
  53. private final IStatement deleteBlock = KajetansMod.databank.createStatement(
  54. "DELETE FROM block WHERE x=? AND y=? AND z=? AND world_name=?;");
  55. public void remove(int x, int y, int z, String worldName)
  56. {
  57. try
  58. {
  59. deleteBlock.validate();
  60. deleteBlock.setInt(1, x);
  61. deleteBlock.setInt(2, y);
  62. deleteBlock.setInt(3, z);
  63. deleteBlock.setString(4, worldName);
  64. deleteBlock.executeUpdate();
  65. }
  66. catch(SQLException ex)
  67. {
  68. ex.printStackTrace();
  69. }
  70. }
  71. public void remove(BlockPos pos, World w)
  72. {
  73. remove(pos.getX(), pos.getY(), pos.getZ(), ModDimensions.getWorldName(w));
  74. }
  75. private final IStatement addPlayer = KajetansMod.databank.createStatement(
  76. "INSERT IGNORE INTO block_grant (block_id, player_id) SELECT id, ? FROM block WHERE world_name=? AND x=? AND y=? AND z=?;");
  77. public boolean addPlayer(int x, int y, int z, String worldName, int playerId)
  78. {
  79. if(hasAccess(x, y, z, worldName, playerId))
  80. {
  81. return false;
  82. }
  83. try
  84. {
  85. addPlayer.validate();
  86. addPlayer.setInt(1, playerId);
  87. addPlayer.setString(2, worldName);
  88. addPlayer.setInt(3, x);
  89. addPlayer.setInt(4, y);
  90. addPlayer.setInt(5, z);
  91. addPlayer.executeUpdate();
  92. return true;
  93. }
  94. catch(SQLException ex)
  95. {
  96. ex.printStackTrace();
  97. return false;
  98. }
  99. }
  100. private final IStatement removePlayer = KajetansMod.databank.createStatement(
  101. "DELETE block_grant FROM block_grant LEFT JOIN block ON block.id = block_grant.block_id " +
  102. "WHERE block_grant.player_id = ? AND block.world_name=? AND block.x=? AND block.y=? AND block.z=?;");
  103. public boolean removePlayer(int x, int y, int z, String worldName, int playerId)
  104. {
  105. if(!hasAccess(x, y, z, worldName, playerId))
  106. {
  107. return false;
  108. }
  109. try
  110. {
  111. removePlayer.validate();
  112. removePlayer.setInt(1, playerId);
  113. removePlayer.setString(2, worldName);
  114. removePlayer.setInt(3, x);
  115. removePlayer.setInt(4, y);
  116. removePlayer.setInt(5, z);
  117. removePlayer.executeUpdate();
  118. return true;
  119. }
  120. catch(SQLException ex)
  121. {
  122. ex.printStackTrace();
  123. return false;
  124. }
  125. }
  126. private final IStatement hasAccess = KajetansMod.databank.createStatement(
  127. "Select id from block_grant WHERE id = ? AND player_id = ?;");
  128. public boolean hasAccess(int x, int y, int z, String worldName, int playerId)
  129. {
  130. int id = getId(x, y, z, worldName);
  131. if(id == -1)
  132. {
  133. return true;
  134. }
  135. try
  136. {
  137. hasAccess.validate();
  138. hasAccess.setInt(1, id);
  139. hasAccess.setInt(2, playerId);
  140. try(ResultSet rs = hasAccess.executeQuery())
  141. {
  142. return rs.next();
  143. }
  144. catch(SQLException ex)
  145. {
  146. ex.printStackTrace();
  147. }
  148. }
  149. catch(SQLException ex)
  150. {
  151. ex.printStackTrace();
  152. }
  153. return false;
  154. }
  155. public boolean hasAccess(BlockPos pos, World w, EntityPlayer p)
  156. {
  157. return hasAccess(pos.getX(), pos.getY(), pos.getZ(), ModDimensions.getWorldName(w), KajetansMod.playerbank.getPlayerId(p.getUniqueID()));
  158. }
  159. private final IStatement getId = KajetansMod.databank.createStatement(
  160. "SELECT id FROM block WHERE world_name=? AND x=? AND y=? AND z=?;");
  161. public int getId(int x, int y, int z, String worldName)
  162. {
  163. try
  164. {
  165. getId.validate();
  166. getId.setString(1, worldName);
  167. getId.setInt(2, x);
  168. getId.setInt(3, y);
  169. getId.setInt(4, z);
  170. try(ResultSet rs = getId.executeQuery())
  171. {
  172. if(rs.next())
  173. {
  174. return rs.getInt(1);
  175. }
  176. return -1;
  177. }
  178. catch(SQLException ex)
  179. {
  180. ex.printStackTrace();
  181. }
  182. }
  183. catch(SQLException ex)
  184. {
  185. ex.printStackTrace();
  186. }
  187. return -1;
  188. }
  189. private final IStatement getPlayerIds = KajetansMod.databank.createStatement(
  190. "SELECT player_id FROM block LEFT JOIN block_grant ON block_grant.id = block.id WHERE world_name=? AND x=? AND y=? AND z=?;");
  191. public ArrayList<Integer> getAllIds(int x, int y, int z, String worldName)
  192. {
  193. ArrayList<Integer> list = new ArrayList<>();
  194. try
  195. {
  196. getPlayerIds.validate();
  197. getPlayerIds.setString(1, worldName);
  198. getPlayerIds.setInt(2, x);
  199. getPlayerIds.setInt(3, y);
  200. getPlayerIds.setInt(4, z);
  201. try(ResultSet rs = getPlayerIds.executeQuery())
  202. {
  203. while(rs.next())
  204. {
  205. list.add(rs.getInt(1));
  206. }
  207. return list;
  208. }
  209. catch(SQLException ex)
  210. {
  211. ex.printStackTrace();
  212. }
  213. }
  214. catch(SQLException ex)
  215. {
  216. ex.printStackTrace();
  217. }
  218. return list;
  219. }
  220. }