Guest User

Untitled

a guest
Nov 26th, 2018
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.91 KB | None | 0 0
  1. // apologies if this code is hard to read
  2. package me.angrynerd.PvPRank;
  3.  
  4. import java.io.File;
  5. import java.math.BigDecimal;
  6. import java.sql.Connection;
  7. import java.sql.DriverManager;
  8. import java.sql.ResultSet;
  9. import java.sql.Statement;
  10. import java.util.logging.Logger;
  11.  
  12. import org.bukkit.ChatColor;
  13. import org.bukkit.command.Command;
  14. import org.bukkit.command.CommandSender;
  15. import org.bukkit.entity.EntityType;
  16. import org.bukkit.entity.Player;
  17. import org.bukkit.event.EventHandler;
  18. import org.bukkit.event.EventPriority;
  19. import org.bukkit.event.Listener;
  20. import org.bukkit.event.entity.PlayerDeathEvent;
  21. import org.bukkit.event.player.AsyncPlayerChatEvent;
  22. import org.bukkit.event.player.PlayerJoinEvent;
  23. import org.bukkit.plugin.java.JavaPlugin;
  24.  
  25. public class PvPRank extends JavaPlugin implements Listener {
  26. static final Logger log = Logger.getLogger("Minecraft");
  27. public static String colorize(String s){
  28. if(s == null) return null;
  29. return s.replaceAll("&([0-9a-f])", "\u00A7$1");
  30. }
  31. @Override
  32. public void onEnable(){
  33. getServer().getPluginManager().registerEvents(this, this);
  34. // set up the config
  35. if(!(new File(this.getDataFolder(), "config.yml")).exists()) {
  36. saveDefaultConfig();
  37. }
  38.  
  39. // create the data folder
  40. this.getDataFolder().mkdir();
  41.  
  42. // create the plugin table if it does not exist
  43. Connection conn = null;
  44. Statement st = null;
  45. try{
  46. Class.forName("org.sqlite.JDBC");
  47. String dbPath = "jdbc:sqlite:" + this.getDataFolder() + File.separator + "PvPRank.db";
  48. conn = DriverManager.getConnection(dbPath);
  49. st = conn.createStatement();
  50. st.executeUpdate("CREATE TABLE IF NOT EXISTS players (" +
  51. "id INTEGER NOT NULL PRIMARY KEY," +
  52. "username VARCHAR(20) NOT NULL," +
  53. "kills INTEGER NOT NULL," +
  54. "deaths INTEGER NOT NULL," +
  55. "kdr DECIMAL NOT NULL," +
  56. "rank INTEGER NOT NULL)");
  57. }
  58. catch (Exception e){
  59. e.printStackTrace();
  60. }
  61. finally {
  62. try {
  63. st.close();
  64. conn.close();
  65. }
  66. catch (Exception e){
  67. e.printStackTrace();
  68. }
  69. }
  70. log.info(this + " has been enabled!");
  71. }
  72. public void onDisable(){
  73. log.info(this + " has been disabled!");
  74. }
  75. // trigger update when player is killed
  76. @EventHandler(priority = EventPriority.MONITOR)
  77. public void onDeath(PlayerDeathEvent e){
  78. if (e.getEntityType() == EntityType.PLAYER){
  79. Player pvictim = e.getEntity();
  80. Player pkiller = pvictim.getKiller();
  81. if (pkiller != null){
  82. // get the connection
  83. Connection conn = null;
  84. ResultSet rs = null;
  85. Statement st = null;
  86. try{
  87. String killer = pkiller.getDisplayName();
  88. String victim = pvictim.getDisplayName();
  89. log.info("Killer: " + killer + "\nVictim: " + victim);
  90. Class.forName("org.sqlite.JDBC");
  91. String dbPath = "jdbc:sqlite:" + this.getDataFolder() + File.separator + "PvPRank.db";
  92. conn = DriverManager.getConnection(dbPath);
  93. st = conn.createStatement();
  94.  
  95. // update the killers stats
  96. // first the kills...
  97. rs = st.executeQuery("SELECT kills FROM players WHERE username='" + killer + "'");
  98. int irs = rs.getInt("kills");
  99. int nrs = irs + 1;
  100. st.executeUpdate("UPDATE players SET kills='" + nrs + "' WHERE username='" + killer + "'");
  101. // ...then the kdr
  102. rs = st.executeQuery("SELECT deaths FROM players WHERE username='" + killer + "'");
  103. int drs = rs.getInt("deaths");
  104. // avoid dividing by zero
  105. if (drs == 0){
  106. drs = 1;
  107. }
  108. int kkdr = nrs / drs;
  109. st.executeUpdate("UPDATE players SET kdr='" + kkdr + "' WHERE username='" + killer + "'");
  110.  
  111. // update the victim's stats
  112. // first the deaths...
  113. rs = st.executeQuery("SELECT deaths FROM players WHERE username='" + victim + "'");
  114. int jrs = rs.getInt("deaths");
  115. int ors = jrs + 1;
  116. st.executeUpdate("UPDATE players SET deaths='" + ors + "' WHERE username='" + victim + "'");
  117. // ...then the kdr
  118. rs = st.executeQuery("SELECT kills FROM players WHERE username='" + victim + "'");
  119. int krs = rs.getInt("kills");
  120. // avoid dividing by zero
  121. if (ors == 0){
  122. ors = 1;
  123. }
  124. int vkdr = krs / ors;
  125. st.executeUpdate("UPDATE players SET kdr='" + vkdr + "' WHERE username='" + victim + "'");
  126.  
  127. // update everyone's rankings
  128. ResultSet res = st.executeQuery("SELECT id, kdr FROM players");
  129. while(res.next()) {
  130. int id = res.getInt("id");
  131. BigDecimal kdr = new BigDecimal(res.getString("kdr"));
  132. rs = st.executeQuery("SELECT COUNT(*) FROM players WHERE kdr>'" + kdr + "'");
  133. int hkdr = 1;
  134. while (rs.next()){
  135. hkdr = rs.getInt(1);
  136. }
  137. int rank1 = hkdr + 1;
  138. st.executeUpdate("UPDATE players SET rank='" + rank1 + "' WHERE id='" + id + "'");
  139. }
  140. }
  141. catch (Exception f){
  142. f.printStackTrace();
  143. }
  144. finally {
  145. try {
  146. conn.close();
  147. }
  148. catch (Exception g){
  149. g.printStackTrace();
  150. }
  151. }
  152. }
  153. }
  154. }
  155. // modify chat names
  156. @EventHandler(priority = EventPriority.HIGHEST)
  157. public void onPlayerChat(AsyncPlayerChatEvent event){
  158. final Player p = event.getPlayer();
  159. String pl = p.getDisplayName();
  160. // get player's rank
  161. Connection conn = null;
  162. ResultSet rs = null;
  163. Statement st = null;
  164. try{
  165. Class.forName("org.sqlite.JDBC");
  166. String dbPath = "jdbc:sqlite:" + this.getDataFolder() + File.separator + "PvPRank.db";
  167. conn = DriverManager.getConnection(dbPath);
  168. st = conn.createStatement();
  169. rs = st.executeQuery("SELECT rank FROM players WHERE username='" + pl + "'");
  170. final int rank1 = rs.getInt("rank");
  171. final String rank = Integer.toString(rank1);
  172.  
  173. // retrieve rank format from config
  174. // * adding this in in a later update
  175.  
  176. // add rank to username as suffix
  177. if (!event.isCancelled()){
  178. String format = this.getConfig().getString("suffix-format");
  179. format = format.replace("%r", rank);
  180. format = colorize(format);
  181. p.setDisplayName(p.getDisplayName() + format + ChatColor.WHITE);
  182. /*this.getServer().getScheduler().scheduleAsyncDelayedTask(this, new Runnable(){
  183. public void run(){
  184. String name = p.getDisplayName();
  185. name = name.replace(format + ChatColor.WHITE, "");
  186. p.setDisplayName(name);
  187. }
  188. } 1);*/
  189. }
  190. }
  191. catch (Exception e){
  192. e.printStackTrace();
  193. }
  194. finally {
  195. try {
  196. rs.close();
  197. st.close();
  198. conn.close();
  199. }
  200. catch (Exception e){
  201. e.printStackTrace();
  202. }
  203. }
  204. }
  205. // insert row when new player joins
  206. @EventHandler(priority = EventPriority.MONITOR)
  207. public void onPlayerJoin(PlayerJoinEvent event){
  208. Player pl = event.getPlayer();
  209. String player = pl.getDisplayName();
  210. try {
  211. Connection conn = null;
  212. ResultSet rs = null;
  213. Statement st = null;
  214. Class.forName("org.sqlite.JDBC");
  215. String dbPath = "jdbc:sqlite:" + this.getDataFolder() + File.separator + "PvPRank.db";
  216. conn = DriverManager.getConnection(dbPath);
  217. st = conn.createStatement();
  218. rs = st.executeQuery("SELECT EXISTS(SELECT 1 FROM players WHERE username='" + player + "')");
  219. int ex = rs.getInt(1);
  220. if (ex == 0){
  221. int rank = 1;
  222. int count = 0;
  223. ResultSet res = st.executeQuery("SELECT COUNT(*) FROM players");
  224. while (res.next()){
  225. count = res.getInt(1);
  226. }
  227. if (count != 0){
  228. ResultSet rsrank = st.executeQuery("SELECT MAX(rank) FROM players");
  229. rank = rsrank.getInt(1);
  230. }
  231. st.executeUpdate("INSERT INTO players (username, kills, deaths, kdr, rank) VALUES ('" + player + "', 0, 0, 0.00, " + rank + ")");
  232. }
  233. }
  234. catch (Exception e){
  235. e.printStackTrace();
  236. }
  237. }
  238.  
  239. // define onCommand method for config reload
  240. public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
  241. if (commandLabel.equalsIgnoreCase("pr")){
  242. if (args == null){
  243. this.reloadConfig();
  244. sender.sendMessage(this + "Config Reloaded");
  245. }
  246. }
  247. return true;
  248. }
  249. }
Add Comment
Please, Sign In to add comment