· 7 years ago · Nov 26, 2018, 11:56 PM
1// apologies if this code is hard to read
2package me.angrynerd.PvPRank;
3
4import java.io.File;
5import java.math.BigDecimal;
6import java.sql.Connection;
7import java.sql.DriverManager;
8import java.sql.ResultSet;
9import java.sql.Statement;
10import java.util.logging.Logger;
11
12import org.bukkit.ChatColor;
13import org.bukkit.command.Command;
14import org.bukkit.command.CommandSender;
15import org.bukkit.entity.EntityType;
16import org.bukkit.entity.Player;
17import org.bukkit.event.EventHandler;
18import org.bukkit.event.EventPriority;
19import org.bukkit.event.Listener;
20import org.bukkit.event.entity.PlayerDeathEvent;
21import org.bukkit.event.player.AsyncPlayerChatEvent;
22import org.bukkit.event.player.PlayerJoinEvent;
23import org.bukkit.plugin.java.JavaPlugin;
24
25public 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}