· 6 years ago · Mar 16, 2019, 03:00 PM
1package net.minefs.MineStrike.MySQL;
2
3import java.awt.Color;
4import java.awt.Graphics2D;
5import java.awt.image.BufferedImage;
6import java.lang.reflect.Field;
7import java.net.URL;
8import java.sql.Connection;
9import java.sql.DriverManager;
10import java.sql.PreparedStatement;
11import java.sql.ResultSet;
12import java.sql.SQLException;
13import java.sql.Statement;
14import java.util.ArrayList;
15import java.util.Collections;
16import java.util.HashMap;
17import java.util.LinkedHashMap;
18import java.util.List;
19import java.util.UUID;
20import java.util.logging.Level;
21
22import javax.imageio.ImageIO;
23
24import org.apache.commons.codec.binary.Base64;
25import org.apache.commons.codec.binary.StringUtils;
26import org.bukkit.Bukkit;
27import org.bukkit.Material;
28import org.bukkit.entity.Player;
29import org.bukkit.inventory.ItemFlag;
30import org.bukkit.inventory.ItemStack;
31import org.bukkit.inventory.meta.ItemMeta;
32import org.bukkit.inventory.meta.SkullMeta;
33import org.bukkit.map.MapPalette;
34import org.bukkit.plugin.Plugin;
35import org.bukkit.scheduler.BukkitRunnable;
36
37import com.google.gson.JsonParser;
38import com.mojang.authlib.GameProfile;
39import com.mojang.authlib.properties.Property;
40
41import net.minefs.MineStrike.Main;
42import net.minefs.MineStrike.Cache.CachedGun;
43import net.minefs.MineStrike.Cache.LevelCache;
44import net.minefs.MineStrike.Cache.PlayerStatus;
45import net.minefs.MineStrike.Guns.Gun;
46import net.minefs.MineStrike.Inventory.ItemType;
47import net.minefs.MineStrike.Inventory.MSItem;
48import net.minefs.MineStrike.Inventory.Items.LevelBox;
49import net.minefs.MineStrike.Inventory.Items.MVPAnthemItem;
50import net.minefs.MineStrike.Inventory.Items.UsableItem;
51import net.minefs.MineStrike.Mechanics.MVPAnthem;
52import net.minefs.MineStrike.Quests.PlayerQuest;
53import net.minefs.MineStrike.Quests.Quest;
54import net.minefs.MineStrike.Utils.GameUtils;
55import net.minefs.MineStrike.market.Listing;
56import net.minefs.MineStrike.market.Mail;
57import net.minefs.MineStrike.skin.Knife;
58import net.minefs.MineStrike.skin.Skin;
59import net.minefs.MineStrike.skin.Tomb;
60
61public class MySQL extends BukkitRunnable {
62 // private Statement statement;
63 // private Connection connection;
64 private List<PlayerStatus> status;
65 private Main main;
66 private Connection sql;
67 private Object givegun = new Object();
68
69 private String PLAYER_INSERT = "INSERT INTO minestrike_stats (NAME, KILLS, DEATHS, HEADSHOTS, BOMBPLANTED, BOMBDEFUSED, EXP,"
70 + " KNIFEKILLS, GRENADEKILLS, DKILLS, TRIKILLS, MULTIKILLS, WINS, LOSES, UUID) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
71 private String PLAYER_UPDATE = "update minestrike_stats set NAME=?, KILLS=KILLS+?,DEATHS=DEATHS+?,HEADSHOTS=HEADSHOTS+?,BOMBPLANTED=BOMBPLANTED+?"
72 + ",BOMBDEFUSED=BOMBDEFUSED+?,EXP=EXP+?,KNIFEKILLS=KNIFEKILLS+?,GRENADEKILLS=GRENADEKILLS+?,DKILLS=DKILLS+?,TRIKILLS=TRIKILLS+?"
73 + ",MULTIKILLS=MULTIKILLS+?,WINS=WINS+?,LOSES=LOSES+? where UUID=?;";
74 private String PLAYER_GUNS = "SELECT * FROM minestrike_guns WHERE NAME=? AND (EXPIRE = 0 OR EXPIRE > ?) ORDER BY id DESC";
75 private String PLAYER_GUNS_EXPIRED = "DELETE FROM minestrike_guns WHERE NAME=? AND EXPIRE!=0 AND EXPIRE<=?";
76 private String PLAYER_EXP = "SELECT EXP FROM minestrike_stats WHERE NAME=?";
77 private String PLAYER_EXP_ADD = "insert into minestrike_stats(uuid, name, exp) values (?, ?, @exp:=?) on duplicate key update exp=exp+@exp";
78 private String PLAYER_MONEY = "SELECT money FROM minestrike_eco WHERE player_name=?";
79 private String PLAYER_HAVE_GUN = "select expire from minestrike_guns where name=? and gun=?";
80 private String PLAYER_GUN_INSERT = "insert into minestrike_guns (expire,gun,name) values (?,?,?);";
81 private String PLAYER_GUN_SUB_INSERT = "insert into minestrike_guns_sub (expire,gun,name) values (?,?,?);";
82 private String PLAYER_GUN_SUB_GET = "select gun, expire from minestrike_guns_sub where name = ? order by id desc";
83 private String PLAYER_GUN_UPDATE = "update minestrike_guns set expire=? where gun=? and name=?;";
84// private String PLAYER_GUN_REMOVE_EXPIRED = "delete from minestrike_guns where name=? and expire<?;";
85 private String PLAYER_DATA = "select * from minestrike_stats where name=?";
86
87 private String PLAYER_QPOINTS_GET = "select qpoints from minestrike_stats where name=?";
88 private String PLAYER_QPOINTS_ADD = "update minestrike_stats set qpoints = qpoints + ? where name=?";
89 private String PLAYER_QPOINTS_REMOVE = "update minestrike_stats set qpoints = if(qpoints>@point:=?,qpoints-@point,0) where name=?";
90 private String PLAYER_QPOINTS_TOP = "select name from minestrike_stats where qpoints > 0 order by qpoints desc limit ?";
91// private String PLAYER_QPOINTS_RESET_ALL = "update minestrike_stats set qpoints = 0";
92
93 private String PLAYER_QUEST_SAVE = "insert into minestrike_quests_player(player, quest, done, nextreset, finished, obtained) values (?,?,@done:=?,@nextreset:=?,@finished:=?,@obtained:=?)"
94 + " on duplicate key update done=@done, nextreset=@nextreset, finished=@finished, obtained=@obtained";
95
96 private String PLAYER_INVENTORY_LIST = "select * from minestrike_inventory where player=? and (expire=0 or expire>?) order by obtainedtime desc, id desc";
97 private String PLAYER_INVENTORY_ITEM_INSERT = "insert into minestrike_inventory(player, type, data, expire, obtainedtime, isusing) values (?,?,?,?,?,?)";
98 private String PLAYER_INVENTORY_ITEM_UPDATE = "update minestrike_inventory set player=?, type=?, data=?, expire=?, obtainedtime=?, isusing=? where id = ?";
99
100 private String LOG_GIVE_GUN = "INSERT INTO minestrike_givegunlog (note, `to`, gun, expire, time) VALUES (?,?,?,?,?);";
101
102 private String ECO_PLAYER_EXIST = "select id from minestrike_eco where player_name=?";
103 private String ECO_PLAYER_INSERT = "INSERT INTO minestrike_eco (money, player_name) VALUES (?,?)";
104 private String ECO_PLAYER_ADD = "update minestrike_eco set money=money+? where player_name=?";
105 private String ECO_PLAYER_SUBTRACT = "update minestrike_eco set money=money-? where player_name=?";
106 private String ECO_PLAYER_SET = "update minestrike_eco set money=? where player_name=?";
107
108 private String SKIN_VALUE = "select value from skin where nick=?";
109
110 private String MARKET_LISTINGS = "select * from minestrike_market_listings order by id desc";
111 private String MARKET_LISTINGS_PLAYER = "select * from minestrike_market_listings where seller=? order by id desc";
112 private String MARKET_LISTING_CREATE = "insert into minestrike_market_listings(seller,gun,price,time,expire) values(?,?,?,?,?)";
113 private String MARKET_LISTING_REMOVE = "delete from minestrike_market_listings where id=? and seller=?";
114 private String MARKET_LISTING_GET = "select * from minestrike_market_listings where id=?";
115 private String MARKET_LISTING_EXPIRED_LIST = "select * from minestrike_market_listings where expire<?";
116// private String MARKET_HISTORY_GET = "select * from minestrike_market_history where user=?";
117// private String MARKET_HISTORY_INSERT = "insert into minestrike_market_history(user, action, who, gun, price, time) values(?,?,?,?,?,?)";
118 private String MARKET_MAILS_GET = "select * from minestrike_market_mails where user=? and deleted = 0 order by id desc";
119 private String MARKET_MAILS_REMOVE = "update minestrike_market_mails set deleted = 1 where id=?";
120 private String MARKET_MAILS_SEND = "insert into minestrike_market_mails(user, message, gun, price, time, received) values(?,?,?,?,?,0)";
121 private String MARKET_MAILS_OBTAINABLE_CHECK = "select * from minestrike_market_mails where (gun!=\"null\" or price > 0) and received = 0 and id = ?";
122 private String MARKET_MAILS_OBTAIN = "update minestrike_market_mails set received=1 where id=?";
123 private String MARKET_SELLABLE_GUNS_MAIN = "select * from minestrike_guns where expire=0 and name=? order by id desc";
124 private String MARKET_SELLABLE_GUNS_SUB = "select * from minestrike_guns_sub where expire=0 and name=? order by id desc";
125 private String MARKET_CHECK_GUN_MAIN = "select * from minestrike_guns where name=? and gun=? and expire = 0";
126 private String MARKET_CHECK_GUN_SUB = "select * from minestrike_guns_sub where name=? and gun=? and expire = 0";
127 private String MARKET_GUN_REMOVE_SUB = "delete from minestrike_guns_sub where id=?";
128 private String MARKET_GUN_REMOVE_MAIN = "delete from minestrike_guns where id=?";
129 private String MARKET_MAILS_CHECKNEW = "select * from minestrike_market_mails where user=? and received=0";
130 private String MARKET_COUNT_PLAYER = "select count(id) as count from minestrike_market_listings where seller=?";
131
132 private String GUN_STARTROLE_RESET = "update minestrike_guns set startgun = 0 where name = ? and startgun = ?";
133 private String GUN_STARTROLE_SET = "update minestrike_guns set startgun=? where name = ? and gun = ?";
134
135 public MySQL(Main main, String s, String s2, String s3, String s4, int n, int amountQueue) {
136 // sql.pre
137 try {
138 Class.forName("com.mysql.jdbc.Driver");
139 sql = DriverManager.getConnection("jdbc:mysql://localhost:3306/mcfs", "root", "pass");
140// sql = new lib.PatPeter.SQLibrary.MySQL(main.getLogger(), "[MineStrike] ", "localhost", 3306,
141// "mcfs?autoReconnect=true", "root", "pass");
142// sql.open();
143
144 /*
145 * synchronized (main) { Class.forName("com.mysql.jdbc.Driver"); this.connection
146 * = DriverManager.getConnection("jdbc:mysql://" + s + ":" + n + "/" + s2, s3,
147 * s4); } this.statement = this.connection.createStatement();
148 * this.statement.executeUpdate(
149 * "CREATE TABLE IF NOT EXISTS minestrike_stats (id INTEGER NOT NULL AUTO_INCREMENT, UUID VARCHAR(36) UNIQUE, NAME VARCHAR(16), KILLS INTEGER, DEATHS INTEGER, HEADSHOTS INTEGER, BOMBPLANTED INTEGER, BOMBDEFUSED INTEGER, EXP INTEGER, KNIFEKILLS INTEGER, GRENADEKILLS INTEGER, DKILLS INTEGER, TRIKILLS INTEGER, MULTIKILLS INTEGER, WINS INTEGER, LOSES INTEGER, PRIMARY KEY (id))"
150 * ); this.statement.executeUpdate(
151 * "CREATE TABLE IF NOT EXISTS minestrike_guns (id INTEGER NOT NULL AUTO_INCREMENT UNIQUE, NAME VARCHAR(16), GUN VARCHAR(16), EXPIRE BIGINT(20))"
152 * );
153 */
154
155 this.main = main;
156 this.status = new ArrayList<PlayerStatus>();
157 this.runTaskTimerAsynchronously((Plugin) main, 0L, 200L);
158 Bukkit.getScheduler().runTask(main, new Runnable() {
159 @Override
160 public void run() {
161 for (Player p : Bukkit.getOnlinePlayers()) {
162 try {
163 String name = p.getName();
164 main.getLogger().info("Getting data of " + name);
165 main.getLevelCache().put(name, new LevelCache(name, main));
166 } catch (Exception e) {
167 p.kickPlayer("§eCo loi xay ra, vui long dang nhap lai.");
168 }
169 }
170 }
171 });
172 } catch (Exception ex) {
173 ex.printStackTrace();
174 main.getServer().shutdown();
175 }
176 }
177
178 protected void cleanup(ResultSet result, Statement statement) {
179 if (result != null) {
180 try {
181 result.close();
182 } catch (SQLException e) {
183 main.getLogger().log(Level.SEVERE, "SQLException on cleanup", e);
184 }
185 }
186 if (statement != null) {
187 try {
188 statement.close();
189 } catch (SQLException e) {
190 main.getLogger().log(Level.SEVERE, "SQLException on cleanup", e);
191 }
192 }
193 }
194
195 public void addInQueue(PlayerStatus playerStatus) {
196 if (!this.status.contains(playerStatus)) {
197 playerStatus.resetZombie();
198 this.status.add(playerStatus);
199 }
200 }
201
202 public boolean playerExists(String uuid) {
203 boolean r = false;
204 if (uuid == null || uuid.equals(""))
205 return r;
206 PreparedStatement statement = null;
207 ResultSet result = null;
208 try {
209 statement = sql.prepareStatement("select id from minestrike_stats where UUID=?;");
210 statement.setString(1, uuid);
211 result = statement.executeQuery();
212 if (result.next())
213 r = true;
214 } catch (SQLException e) {
215 main.getLogger().log(Level.SEVERE, "SQL ERROR", e);
216 } finally {
217 cleanup(result, statement);
218 }
219 return r;
220 }
221
222 public void closeConnection() {
223 for (PlayerStatus playerStatus : this.status) {
224 String query;
225 if (playerExists(playerStatus.getUUID()))
226 query = PLAYER_UPDATE;
227 else
228 query = PLAYER_INSERT;
229 PreparedStatement ps = null;
230 try {
231 ps = sql.prepareStatement(query);
232 ps.setString(1, playerStatus.getName());
233 ps.setInt(2, (playerStatus.getRecord()) ? playerStatus.getKills() : 0);
234 ps.setInt(3, (playerStatus.getRecord()) ? playerStatus.getDeaths() : 0);
235 ps.setInt(4, playerStatus.getHeadshotKill());
236 ps.setInt(5, (playerStatus.getRecord()) ? playerStatus.getBombPlanted() : 0);
237 ps.setInt(6, (playerStatus.getRecord()) ? playerStatus.getBombDefused() : 0);
238 ps.setInt(7, playerStatus.getExp());
239 ps.setInt(8, (playerStatus.getRecord()) ? playerStatus.getKnifeKill() : 0);
240 ps.setInt(9, playerStatus.getGrenadeKill());
241 ps.setInt(10, playerStatus.getDKill());
242 ps.setInt(11, playerStatus.getTriKill());
243 ps.setInt(12, playerStatus.getMultiKill());
244 ps.setInt(13, playerStatus.getWins());
245 ps.setInt(14, playerStatus.getLoses());
246 ps.setString(15, playerStatus.getUUID());
247 ps.executeUpdate();
248 } catch (SQLException e) {
249 main.getLogger().log(Level.SEVERE, "Error on saving " + playerStatus.getName() + "'s data", e);
250 } finally {
251 cleanup(null, ps);
252 }
253 }
254// sql.close();
255 this.status.clear();
256 this.cancel();
257 }
258
259 public void restart() {
260 try {
261 sql.close();
262
263 Class.forName("com.mysql.jdbc.Driver");
264 sql = DriverManager.getConnection("jdbc:mysql://localhost:3306/mcfs", "root", "pass");
265// sql = new lib.PatPeter.SQLibrary.MySQL(Logger.getLogger("Minecraft"), "[MineStrike] ", "localhost", 3306,
266// "mcfs", "root", "pass");
267// sql.open();
268 } catch (Exception ex) {
269 ex.printStackTrace();
270 main.getServer().shutdown();
271 }
272 }
273
274 public LinkedHashMap<Gun, Long> getGuns(String player, LevelCache lvl) {
275 LinkedHashMap<Gun, Long> guns = new LinkedHashMap<Gun, Long>();
276 List<Gun> sguns = new ArrayList<Gun>(main.getGuns());
277 for (Gun gun : sguns)
278 if (!gun.isVip())
279 guns.put(gun, 0l);
280 PreparedStatement statement = null;
281 ResultSet s = null;
282 try {
283 statement = sql.prepareStatement(PLAYER_GUNS);
284 statement.setString(1, player);
285 statement.setLong(2, System.currentTimeMillis());
286 s = statement.executeQuery();
287 while (s.next()) {
288 Gun gun = main.getGun(s.getString("GUN"));
289 if (gun != null) {
290 guns.put(gun, s.getLong("EXPIRE"));
291 int startrole = s.getInt("startgun");
292 if (startrole == 1)
293 lvl.setCTStartGun(gun);
294 else if (startrole == 2)
295 lvl.setTStartGun(gun);
296 }
297 }
298 } catch (SQLException e) {
299 main.getLogger().log(Level.SEVERE, "Can not get " + player + "'s guns", e);
300 guns = null;
301 } finally {
302 cleanup(s, statement);
303 s = null;
304 statement = null;
305 }
306 try {
307 statement = sql.prepareStatement(PLAYER_GUNS_EXPIRED);
308 statement.setString(1, player);
309 statement.setLong(2, System.currentTimeMillis());
310 statement.executeUpdate();
311 } catch (SQLException e) {
312 main.getLogger().log(Level.SEVERE, "Can not clean " + player + "'s guns", e);
313 } finally {
314 cleanup(s, statement);
315 }
316 return guns;
317 }
318
319 public int getExp(String player) {
320 int exp = 0;
321 PreparedStatement ps = null;
322 ResultSet rs = null;
323 try {
324 ps = sql.prepareStatement(PLAYER_EXP);
325 ps.setString(1, player);
326 rs = ps.executeQuery();
327 if (rs.next()) {
328 exp = rs.getInt("EXP");
329 }
330 } catch (SQLException e) {
331 main.getLogger().log(Level.SEVERE, "Can not get " + player + "'s EXP", e);
332 } finally {
333 cleanup(rs, ps);
334 }
335 return exp;
336 }
337
338 public double getMoney(String player) {
339 double money = 0;
340 PreparedStatement ps = null;
341 ResultSet rs = null;
342 try {
343 ps = sql.prepareStatement(PLAYER_MONEY);
344 ps.setString(1, player);
345 rs = ps.executeQuery();
346 if (rs.next()) {
347 money = rs.getInt("money");
348 }
349 } catch (SQLException e) {
350 main.getLogger().log(Level.SEVERE, "Can not get" + player + "'s MONEY", e);
351 } finally {
352 cleanup(rs, ps);
353 }
354 return money;
355 }
356
357 @Override
358 public void run() {
359 List<PlayerStatus> status = new ArrayList<PlayerStatus>(this.status);
360 for (PlayerStatus playerStatus : status) {
361 String query;
362 if (playerExists(playerStatus.getUUID()))
363 query = PLAYER_UPDATE;
364 else
365 query = PLAYER_INSERT;
366 PreparedStatement ps = null;
367 try {
368 ps = sql.prepareStatement(query);
369 ps.setString(1, playerStatus.getName());
370 ps.setInt(2, (playerStatus.getRecord()) ? playerStatus.getKills() : 0);
371 ps.setInt(3, (playerStatus.getRecord()) ? playerStatus.getDeaths() : 0);
372 ps.setInt(4, playerStatus.getHeadshotKill());
373 ps.setInt(5, (playerStatus.getRecord()) ? playerStatus.getBombPlanted() : 0);
374 ps.setInt(6, (playerStatus.getRecord()) ? playerStatus.getBombDefused() : 0);
375 ps.setInt(7, playerStatus.getExp());
376 ps.setInt(8, (playerStatus.getRecord()) ? playerStatus.getKnifeKill() : 0);
377 ps.setInt(9, playerStatus.getGrenadeKill());
378 ps.setInt(10, playerStatus.getDKill());
379 ps.setInt(11, playerStatus.getTriKill());
380 ps.setInt(12, playerStatus.getMultiKill());
381 ps.setInt(13, playerStatus.getWins());
382 ps.setInt(14, playerStatus.getLoses());
383 ps.setString(15, playerStatus.getUUID());
384 ps.executeUpdate();
385 this.status.remove(playerStatus);
386 } catch (SQLException e) {
387 main.getLogger().log(Level.SEVERE, "Error on saving " + playerStatus.getName() + "'s data", e);
388 } finally {
389 cleanup(null, ps);
390 }
391 }
392 }
393
394 public long getGunExpire(String player, String gun) {
395 long kq = -1;
396 PreparedStatement ps = null;
397 ResultSet rs = null;
398 try {
399 ps = sql.prepareStatement(PLAYER_HAVE_GUN);
400 ps.setString(1, player);
401 ps.setString(2, gun);
402 rs = ps.executeQuery();
403 if (rs.next())
404 kq = rs.getLong("expire");
405 } catch (SQLException e) {
406 main.getLogger().log(Level.SEVERE, "Can not get " + player + "'s data", e);
407 } finally {
408 cleanup(rs, ps);
409 }
410 return kq;
411 }
412
413 public boolean addGun(String player, String gun, long expire, String note) {
414 synchronized (givegun) {
415 long e = -2;
416 long ee = expire;
417 PreparedStatement ps = null;
418 boolean given = false;
419 boolean sub = false;
420 ResultSet rs = null;
421 try {
422 ps = sql.prepareStatement(PLAYER_HAVE_GUN);
423 ps.setString(1, player);
424 ps.setString(2, gun);
425 rs = ps.executeQuery();
426 if (rs.next())
427 e = rs.getLong("expire");
428 else
429 e = -1;
430 } catch (SQLException e1) {
431 main.getLogger().log(Level.SEVERE, "Can not get " + player + "'s data", e1);
432 } finally {
433 cleanup(rs, ps);
434 ps = null;
435 }
436 if (e == -2)
437 throw new NullPointerException();
438 try {
439 if (e == -1) {
440 ps = sql.prepareStatement(PLAYER_GUN_INSERT);
441 expire += System.currentTimeMillis();
442 } else if (e != 0) {
443 ps = sql.prepareStatement(PLAYER_GUN_UPDATE);
444 expire += e;
445 } else {
446 ps = sql.prepareStatement(PLAYER_GUN_SUB_INSERT);
447 sub = true;
448 }
449 ps.setLong(1, ee == 0 ? 0 : expire);
450 ps.setString(2, gun);
451 ps.setString(3, player);
452 ps.executeUpdate();
453 given = true;
454 } catch (SQLException e1) {
455 main.getLogger().log(Level.SEVERE, "Can not give " + gun + " to " + player + "'s data", e1);
456 } finally {
457 cleanup(null, ps);
458 ps = null;
459 }
460 if (!given)
461 note = "(FAIL) " + note;
462 if (e == 0) {
463 note = "(SUB) " + note;
464 }
465 LevelCache lvl = main.getLevelCache().get(player);
466 if (lvl != null) {
467 if (sub)
468 lvl.reloadCachedGuns();
469 else
470 lvl.reloadGuns();
471 }
472 try {
473 ps = sql.prepareStatement(LOG_GIVE_GUN);
474 ps.setString(1, note);
475 ps.setString(2, player);
476 ps.setString(3, gun);
477 ps.setLong(4, ee);
478 ps.setLong(5, System.currentTimeMillis());
479 ps.executeUpdate();
480 } catch (SQLException e1) {
481 main.getLogger().log(Level.SEVERE, "Can not log " + player + "'s data", e1);
482 } finally {
483 cleanup(null, ps);
484 ps = null;
485 }
486 return given;
487 }
488 }
489
490 public boolean addGun(String player, String gun, String note) {
491 synchronized (givegun) {
492 long e = -2;
493 PreparedStatement ps = null;
494 ResultSet rs = null;
495 boolean given = false, sub = false;
496 try {
497 ps = sql.prepareStatement(PLAYER_HAVE_GUN);
498 ps.setString(1, player);
499 ps.setString(2, gun);
500 rs = ps.executeQuery();
501 if (rs.next())
502 e = rs.getLong("expire");
503 else
504 e = -1;
505 } catch (SQLException e1) {
506 main.getLogger().log(Level.SEVERE, "Can not get " + player + "'s data", e1);
507 } finally {
508 cleanup(rs, ps);
509 rs = null;
510 ps = null;
511 }
512 if (e == -2)
513 throw new NullPointerException();
514 try {
515 if (e == -1)
516 ps = sql.prepareStatement(PLAYER_GUN_INSERT);
517 else if (e != 0)
518 ps = sql.prepareStatement(PLAYER_GUN_UPDATE);
519 else {
520 ps = sql.prepareStatement(PLAYER_GUN_SUB_INSERT);
521 sub = true;
522 }
523 ps.setLong(1, 0);
524 ps.setString(2, gun);
525 ps.setString(3, player);
526 ps.executeUpdate();
527 given = true;
528 } catch (SQLException e1) {
529 main.getLogger().log(Level.SEVERE, "Can not give " + gun + " to " + player + "'s data", e1);
530 } finally {
531 cleanup(rs, ps);
532 rs = null;
533 ps = null;
534 }
535 if (!given)
536 note = "(FAIL) " + note;
537 if (e == 0) {
538 note = "(SUB) " + note;
539 }
540 LevelCache lvl = main.getLevelCache().get(player);
541 if (lvl != null) {
542 if (sub)
543 lvl.reloadCachedGuns();
544 else
545 lvl.reloadGuns();
546 }
547 try {
548 ps = sql.prepareStatement(LOG_GIVE_GUN);
549 ps.setString(1, note);
550 ps.setString(2, player);
551 ps.setString(3, gun);
552 ps.setLong(4, 0);
553 ps.setLong(5, System.currentTimeMillis());
554 ps.executeUpdate();
555 } catch (SQLException e1) {
556 main.getLogger().log(Level.SEVERE, "Can not log " + player + "'s data", e1);
557 } finally {
558 cleanup(rs, ps);
559 rs = null;
560 ps = null;
561 }
562 return given;
563 }
564 }
565
566 public boolean playerEcoExist(String player) {
567 boolean exist = false;
568 PreparedStatement ps = null;
569 ResultSet rs = null;
570 try {
571 ps = sql.prepareStatement(ECO_PLAYER_EXIST);
572 ps.setString(1, player);
573 rs = ps.executeQuery();
574 if (rs.next())
575 exist = true;
576 } catch (SQLException e1) {
577 main.getLogger().log(Level.SEVERE, "Can not get " + player + "'s data", e1);
578 } finally {
579 cleanup(rs, ps);
580 }
581 return exist;
582 }
583
584 public void addMoney(double money, String p) {
585 boolean exist = playerEcoExist(p);
586 PreparedStatement ps = null;
587 ResultSet rs = null;
588 try {
589 if (!exist)
590 ps = sql.prepareStatement(ECO_PLAYER_INSERT);
591 else
592 ps = sql.prepareStatement(ECO_PLAYER_ADD);
593 ps.setDouble(1, money);
594 ps.setString(2, p);
595 ps.executeUpdate();
596 } catch (SQLException e1) {
597 main.getLogger().log(Level.SEVERE, "Can not update " + p + "'s data", e1);
598 } finally {
599 cleanup(rs, ps);
600 }
601 }
602
603 public void subtractMoney(double money, String p) throws SQLException {
604 boolean exist = playerEcoExist(p);
605 PreparedStatement ps = null;
606 ResultSet rs = null;
607 try {
608 if (!exist)
609 ps = sql.prepareStatement(ECO_PLAYER_INSERT);
610 else
611 ps = sql.prepareStatement(ECO_PLAYER_SUBTRACT);
612 ps.setDouble(1, (exist) ? money : -money);
613 ps.setString(2, p);
614 ps.executeUpdate();
615 } catch (SQLException e1) {
616 main.getLogger().log(Level.SEVERE, "Can not update " + p + "'s data", e1);
617 } finally {
618 cleanup(rs, ps);
619 }
620 }
621
622 public void setMoney(double money, String p) throws SQLException {
623 boolean exist = playerEcoExist(p);
624 PreparedStatement ps = null;
625 ResultSet rs = null;
626 try {
627 if (!exist)
628 ps = sql.prepareStatement(ECO_PLAYER_INSERT);
629 else
630 ps = sql.prepareStatement(ECO_PLAYER_SET);
631 ps.setDouble(1, money);
632 ps.setString(2, p);
633 ps.executeUpdate();
634 } catch (SQLException e1) {
635 main.getLogger().log(Level.SEVERE, "Can not update " + p + "'s data", e1);
636 } finally {
637 cleanup(rs, ps);
638 }
639 }
640
641 public void getData(LevelCache c) throws Exception {
642 PreparedStatement ps = null;
643 ResultSet rs = null;
644 try {
645 ps = sql.prepareStatement(PLAYER_DATA);
646 ps.setString(1, c.getPlayer());
647 rs = ps.executeQuery();
648 if (rs.next()) {
649 c.setKill(rs.getInt("KILLS"));
650 c.setDeath(rs.getInt("DEATHS"));
651 c.setWin(rs.getInt("WINS"));
652 c.setLose(rs.getInt("LOSES"));
653 c.setGrenadeKill(rs.getInt("GRENADEKILLS"));
654 c.setHeadShotKill(rs.getInt("HEADSHOTS"));
655 c.setKnifeKill(rs.getInt("KNIFEKILLS"));
656 c.setExp(rs.getInt("EXP"));
657 c.setQPoints(rs.getInt("qpoints"));
658 }
659 } catch (Exception e1) {
660 throw e1;
661 } finally {
662 cleanup(rs, ps);
663 }
664 }
665
666 public void updateData(LevelCache c) {
667 PreparedStatement ps = null;
668 ResultSet rs = null;
669 try {
670 ps = sql.prepareStatement(PLAYER_DATA);
671 ps.setString(1, c.getPlayer());
672 rs = ps.executeQuery();
673 if (rs.next()) {
674 c.setKill(rs.getInt("KILLS"));
675 c.setDeath(rs.getInt("DEATHS"));
676 c.setWin(rs.getInt("WINS"));
677 c.setLose(rs.getInt("LOSES"));
678 c.setGrenadeKill(rs.getInt("GRENADEKILLS"));
679 c.setHeadShotKill(rs.getInt("HEADSHOTS"));
680 c.setKnifeKill(rs.getInt("KNIFEKILLS"));
681 c.setExp(rs.getInt("EXP"));
682 c.setQPoints(rs.getInt("qpoints"));
683 }
684 } catch (SQLException e1) {
685 main.getLogger().log(Level.SEVERE, "Can not get " + c.getPlayer() + "'s data", e1);
686 } finally {
687 cleanup(rs, ps);
688 }
689 }
690
691 public void addKey(String p, String c, int amount) throws SQLException {
692 Statement stm = null;
693 try {
694 stm = sql.createStatement();
695 stm.executeUpdate("INSERT INTO minestrike_casekeys(NAME,CASENAME,AMOUNT) VALUES(\"" + p + "\",\"" + c
696 + "\", " + amount + ") ON DUPLICATE KEY UPDATE AMOUNT=AMOUNT+" + amount + ";");
697 } catch (Exception e) {
698 throw e;
699 } finally {
700 cleanup(null, stm);
701 }
702 }
703
704 public void openCase(Player player, String c) {
705 boolean haskey = false, error = false;
706 int k = 0;
707 String p = player.getName();
708 Statement stm = null;
709 ResultSet s = null;
710 try {
711 stm = sql.createStatement();
712 s = stm.executeQuery("SELECT * FROM minestrike_casekeys WHERE NAME = \"" + p + "\" AND CASENAME = \"" + c
713 + "\" AND AMOUNT > 0");
714 if (s.next()) {
715 haskey = true;
716 k = s.getInt("AMOUNT");
717 }
718 } catch (SQLException e) {
719 main.getLogger().log(Level.SEVERE, "Can not get " + player + "'s key", e);
720 error = true;
721 } finally {
722 cleanup(s, stm);
723 }
724 if (error) {
725 player.sendTitle("", "§c§lCó lỗi xảy ra!", 5, 60, 5);
726 return;
727 }
728 if (haskey) {
729 try {
730 stm = sql.createStatement();
731 stm.executeUpdate("UPDATE minestrike_casekeys SET AMOUNT=AMOUNT-1 WHERE NAME = \"" + p
732 + "\" AND CASENAME = \"" + c + "\"");
733 player.sendMessage("§bÄang bắt đầu quay...");
734 int cc = k - 1;
735 Bukkit.getScheduler().runTask(main, new Runnable() {
736 @Override
737 public void run() {
738 Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "case open " + p + " " + c);
739 player.sendMessage("§eBạn còn §a§l" + cc + " §elượt quay của rương nà y.");
740 }
741 });
742 } catch (SQLException e) {
743 main.getLogger().log(Level.SEVERE, "Can not open case for " + player, e);
744 } finally {
745 cleanup(null, stm);
746 }
747 } else {
748 Bukkit.getScheduler().runTaskLater(main, new Runnable() {
749
750 @Override
751 public void run() {
752 player.closeInventory();
753 player.sendTitle("", "§c§lBạn đã hết lượt quay!", 5, 60, 5);
754 }
755
756 }, 2);
757 }
758 }
759
760 public HashMap<String, Skin> getSkins(Main main) {
761 HashMap<String, Skin> skins = new HashMap<String, Skin>();
762 Statement stm = null;
763 ResultSet s = null;
764 try {
765 stm = sql.createStatement();
766 s = stm.executeQuery(
767 "select ms.*, s.Value, s.Signature from minestrike_skins ms, skin s where ms.lib = s.Nick");
768 while (s.next()) {
769 GameProfile profile = new GameProfile(UUID.randomUUID(), null);
770 profile.getProperties().put("textures",
771 new Property("textures", s.getString("Value"), s.getString("Signature")));
772 ItemStack i = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
773 SkullMeta im = (SkullMeta) i.getItemMeta();
774 Field profileField = null;
775 try {
776 profileField = im.getClass().getDeclaredField("profile");
777 profileField.setAccessible(true);
778 profileField.set(im, profile);
779 } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) {
780 e1.printStackTrace();
781 }
782 i.setItemMeta(im);
783 Skin skin = new Skin(s.getString("name"), s.getString("lib"), s.getString("full_name"),
784 (s.getInt("default") == 1) ? true : false, i, main);
785 skins.put(s.getString("name"), skin);
786 }
787 } catch (SQLException e) {
788 main.getLogger().log(Level.SEVERE, "Can not get skins", e);
789 } finally {
790 cleanup(s, stm);
791 }
792 return skins;
793 }
794
795 public List<Skin> getSkin(String p, Main main) {
796 List<Skin> skins = new ArrayList<Skin>();
797 Statement stm = null;
798 ResultSet s = null;
799 try {
800 stm = sql.createStatement();
801 s = stm.executeQuery("select * from minestrike_skin_inv where name = \"" + p + "\" order by id desc");
802 while (s.next())
803 skins.add(main.getSkins().get(s.getString("skin")));
804 } catch (SQLException e) {
805 main.getLogger().log(Level.SEVERE, "Can not get " + p + "'s skins", e);
806 } finally {
807 cleanup(s, stm);
808 }
809 List<Skin> sk = new ArrayList<Skin>(main.getSkins().values());
810 for (Skin skin : sk)
811 if (skin.isDefault())
812 skins.add(skin);
813 return skins;
814 }
815
816 public void addSkin(String p, Skin skin) throws SQLException {
817 Statement stm = null;
818 try {
819 stm = sql.createStatement();
820 stm.executeUpdate("insert into minestrike_skin_inv(name, skin) values (\"" + p + "\", \"" + skin.getName()
821 + "\") on duplicate key update skin=skin");
822 main.getLevelCache().get(p).addSkin(skin);
823 } catch (Exception e) {
824 throw e;
825 } finally {
826 cleanup(null, stm);
827 }
828 }
829
830 // public void updateEvent(LevelCache c) throws SQLException {
831 // if (c == null)
832 // return;
833 // PreparedStatement statement = sql.prepareStatement("UPDATE minestrike_stats
834 // SET
835 // event1=" + c.event1 + ", event2="
836 // + c.event2 + " WHERE NAME=\"" + c.getPlayer() + "\"");
837 // ResultSet s = statement.executeQuery();
838 // cleanup(s, statement);
839 // }
840
841 public void saveQuestsData(LevelCache c) {
842 if (c == null)
843 return;
844 List<PlayerQuest> list = c.getPlayerQuests();
845 String name = c.getPlayer();
846 synchronized (list) {
847 list.forEach(pq -> saveQuestData(pq, name));
848 }
849 }
850
851 public void saveQuestData(PlayerQuest pq, String name) {
852 PreparedStatement ps = null;
853 try {
854 ps = sql.prepareStatement(PLAYER_QUEST_SAVE);
855 ps.setString(1, name);
856 ps.setString(2, pq.getQuest().getID());
857 ps.setInt(3, pq.getDone());
858 ps.setLong(4, pq.getNextReset());
859 ps.setInt(5, pq.isFinished() ? 1 : 0);
860 ps.setBoolean(6, pq.isObtained());
861 ps.executeUpdate();
862 } catch (Exception e) {
863 main.getLogger().log(Level.SEVERE, "Khong the luu du lieu quest " + pq.getQuest().getID() + " cho " + name,
864 e);
865 } finally {
866 cleanup(null, ps);
867 }
868 }
869
870 public List<Tomb> loadTombs() {
871 List<Tomb> tombs = new ArrayList<Tomb>();
872 ItemStack d = new ItemStack(Material.WOOD_AXE, 1, (short) 2);
873 ItemMeta im = d.getItemMeta();
874 im.setUnbreakable(true);
875 d.setItemMeta(im);
876 tombs.add(new Tomb(0, "§aMặc định", d));
877 Statement stm = null;
878 ResultSet s = null;
879 try {
880 stm = sql.createStatement();
881 s = stm.executeQuery("select * from minestrike_tombs");
882 while (s.next()) {
883 try {
884 ItemStack i = new ItemStack(Material.valueOf(s.getString("material")), 1, (short) s.getInt("data"));
885 im = i.getItemMeta();
886 im.setUnbreakable(true);
887 i.setItemMeta(im);
888 Tomb tomb = new Tomb(s.getInt("id"), s.getString("name"), i);
889 tombs.add(tomb);
890 } catch (Exception e) {
891 System.out.println("Tomb error, ID: " + s.getString("id"));
892 e.printStackTrace();
893 }
894 }
895 } catch (SQLException e) {
896 main.getLogger().log(Level.SEVERE, "Can not get tombs", e);
897 } finally {
898 cleanup(s, stm);
899 }
900 return tombs;
901 }
902
903 public void loadPlayersTombs(LevelCache l) {
904 LinkedHashMap<Tomb, Long> tombs = new LinkedHashMap<Tomb, Long>();
905 ResultSet s = null;
906 Statement stm = null;
907 try {
908 stm = sql.createStatement();
909 s = stm.executeQuery("select * from minestrike_tombs_inv where name = \"" + l.getPlayer()
910 + "\" AND (expire = 0 OR expire > " + System.currentTimeMillis() + ") order by id desc");
911 while (s.next()) {
912 try {
913 Tomb tomb = main.getTomb(s.getInt("tomb"));
914 tombs.put(tomb, s.getLong("expire"));
915 if (s.getInt("isusing") == 1)
916 l.setTombUsing(tomb.getItem());
917 } catch (Exception e) {
918 e.printStackTrace();
919 }
920 }
921 if (l.getUsingTomb() == null)
922 l.setTombUsing(main.getTomb(0).getItem());
923 } catch (SQLException e) {
924 main.getLogger().log(Level.SEVERE, "Can not get " + l.getPlayer() + "'s tombs", e);
925 } finally {
926 cleanup(s, stm);
927 }
928 tombs.put(main.getTomb(0), 0l);
929 l.setTombsList(tombs);
930 try {
931 stm = sql.createStatement();
932 stm.executeUpdate("DELETE FROM minestrike_tombs_inv WHERE name=\"" + l.getPlayer()
933 + "\" AND expire != 0 AND expire <= " + System.currentTimeMillis());
934 } catch (SQLException e) {
935 main.getLogger().log(Level.SEVERE, "Can not clean " + l.getPlayer() + "'s tombs", e);
936 } finally {
937 cleanup(null, stm);
938 }
939 }
940
941 public void useTomb(String player, int id) throws SQLException {
942 Statement stm = null;
943 try {
944 stm = sql.createStatement();
945 stm.executeUpdate("update minestrike_tombs_inv set isusing=0 where name = \"" + player + "\"");
946 stm.executeUpdate(
947 "update minestrike_tombs_inv set isusing=1 where name = \"" + player + "\" and tomb=" + id);
948 } catch (SQLException e) {
949 throw e;
950 } finally {
951 cleanup(null, stm);
952 }
953
954 }
955
956 public void addTomb(String player, int id, long expire, String note) throws SQLException {
957 expire *= 86400000;
958 Statement stm = null;
959 try {
960 stm = sql.createStatement();
961 stm.executeUpdate("INSERT INTO minestrike_tombs_inv (name, tomb, expire) VALUES('" + player + "', " + id
962 + ", " + (System.currentTimeMillis() + expire)
963 + ") ON DUPLICATE KEY UPDATE expire=IF(expire=0,0,IF(expire>" + System.currentTimeMillis()
964 + ",expire+" + expire + ",expire))");
965 stm.executeUpdate("INSERT INTO minestrike_givegunlog (note, `to`, gun, expire, time) VALUES ('" + note
966 + "', '" + player + "', 'tomb_" + id + "', " + expire + ", " + System.currentTimeMillis() + ")");
967 } catch (SQLException e) {
968 throw e;
969 } finally {
970 cleanup(null, stm);
971 }
972 }
973
974 public void addTomb(String player, int id, String note) throws SQLException {
975 Statement stm = null;
976 try {
977 stm = sql.createStatement();
978 stm.executeUpdate("INSERT INTO minestrike_tombs_inv (name, tomb, expire) VALUES('" + player + "', " + id
979 + ", 0) ON DUPLICATE KEY UPDATE expire=IF(expire=0,0,IF(expire>" + System.currentTimeMillis()
980 + ",0,expire))");
981 stm.executeUpdate("INSERT INTO minestrike_givegunlog (note, `to`, gun, expire, time) VALUES ('" + note
982 + "', '" + player + "', 'tomb_" + id + "', 0, " + System.currentTimeMillis() + ")");
983 } catch (SQLException e) {
984 throw e;
985 } finally {
986 cleanup(null, stm);
987 }
988 }
989
990 public List<Knife> loadKnives() {
991 List<Knife> knives = new ArrayList<Knife>();
992 ItemStack k = new ItemStack(Material.IRON_SWORD);
993 k.setDurability((short) 1);
994 ItemMeta im = k.getItemMeta();
995 im.setDisplayName("§aBayonet §f\u928c");
996 im.setUnbreakable(true);
997 im.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);
998 im.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
999 k.setItemMeta(im);
1000 knives.add(new Knife(0, "§aBayonet", "\u928c", "cs.weapons.knifeswing", "cs.weapons.knifehit", k));
1001 ResultSet s = null;
1002 Statement stm = null;
1003 try {
1004 stm = sql.createStatement();
1005 s = stm.executeQuery("select * from minestrike_knives");
1006 while (s.next()) {
1007 try {
1008 String name = s.getString("name");
1009 String symbol = s.getString("symbol");
1010 ItemStack i = new ItemStack(Material.valueOf(s.getString("material")), 1, s.getShort("data"));
1011 im = i.getItemMeta();
1012 im.setDisplayName(name + " §f" + symbol);
1013 im.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);
1014 im.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
1015 im.setUnbreakable(true);
1016 i.setItemMeta(im);
1017 knives.add(new Knife(s.getInt("id"), name, symbol, s.getString("swing"), s.getString("hit"), i));
1018 } catch (Exception e) {
1019 System.out.println("Knife error, ID: " + s.getInt("id"));
1020 e.printStackTrace();
1021 }
1022 }
1023 } catch (SQLException e) {
1024 main.getLogger().log(Level.SEVERE, "Can not get knives", e);
1025 } finally {
1026 cleanup(s, stm);
1027 }
1028 return knives;
1029 }
1030
1031 public void loadPlayersKnives(LevelCache l, boolean sync) {
1032 LinkedHashMap<Knife, Long> knives = new LinkedHashMap<Knife, Long>();
1033 ResultSet s = null;
1034 Statement stm = null;
1035 try {
1036 stm = sql.createStatement();
1037 s = stm.executeQuery("select * from minestrike_knives_inv where name = \"" + l.getPlayer()
1038 + "\" AND (expire = 0 OR expire > " + System.currentTimeMillis() + ") order by id desc");
1039 while (s.next()) {
1040 try {
1041 Knife k = main.getKnife(s.getInt("knife"));
1042 knives.put(k, s.getLong("expire"));
1043 if (s.getBoolean("isusing"))
1044 l.setKnifeUsing(k);
1045 } catch (Exception e) {
1046 e.printStackTrace();
1047 }
1048 }
1049 } catch (SQLException e) {
1050 main.getLogger().log(Level.SEVERE, "Can not get " + l.getPlayer() + "'s knives", e);
1051 } finally {
1052 cleanup(s, stm);
1053 }
1054 if (l.getUsingKnife() == null)
1055 l.setKnifeUsing(main.getKnife(0));
1056 knives.put(main.getKnife(0), 0l);
1057 if (!sync)
1058 l.setKnivesList(knives);
1059 else
1060 Bukkit.getScheduler().runTask(main, new Runnable() {
1061 @Override
1062 public void run() {
1063 if (l != null)
1064 l.setKnivesList(knives);
1065 }
1066 });
1067 try {
1068 stm = sql.createStatement();
1069 stm.executeUpdate("DELETE FROM minestrike_knives_inv WHERE name=\"" + l.getPlayer()
1070 + "\" AND expire != 0 AND expire <= " + System.currentTimeMillis());
1071 } catch (SQLException e) {
1072 main.getLogger().log(Level.SEVERE, "Can not clean " + l.getPlayer() + "'s knives", e);
1073 } finally {
1074 cleanup(null, stm);
1075 }
1076 }
1077
1078 public void useKnife(String player, int id) throws SQLException {
1079 Statement stm = null;
1080 try {
1081 stm = sql.createStatement();
1082 stm.executeUpdate("update minestrike_knives_inv set isusing=0 where name = \"" + player + "\"");
1083 stm.executeUpdate(
1084 "update minestrike_knives_inv set isusing=1 where name = \"" + player + "\" and knife=" + id);
1085 } catch (SQLException e) {
1086 throw e;
1087 } finally {
1088 cleanup(null, stm);
1089 }
1090 }
1091
1092 public void addKnife(String player, int id, long expire, String note) throws SQLException {
1093 expire *= 86400000;
1094 Statement stm = null;
1095 try {
1096 stm = sql.createStatement();
1097 stm.executeUpdate("INSERT INTO minestrike_knives_inv (name, knife, expire) VALUES('" + player + "', " + id
1098 + ", " + (System.currentTimeMillis() + expire)
1099 + ") ON DUPLICATE KEY UPDATE expire=IF(expire=0,0,IF(expire>" + System.currentTimeMillis()
1100 + ",expire+" + expire + ",expire))");
1101 stm.executeUpdate("INSERT INTO minestrike_givegunlog (note, `to`, gun, expire, time) VALUES ('" + note
1102 + "', '" + player + "', 'knife_" + id + "', " + expire + ", " + System.currentTimeMillis() + ")");
1103 } catch (SQLException e) {
1104 throw e;
1105 } finally {
1106 cleanup(null, stm);
1107 }
1108 LevelCache l = main.getLevelCache().get(player);
1109 if (l != null)
1110 loadPlayersKnives(l, true);
1111 }
1112
1113 public void addKnife(String player, int id, String note) throws SQLException {
1114 Statement stm = null;
1115 try {
1116 stm = sql.createStatement();
1117 stm.executeUpdate("INSERT INTO minestrike_knives_inv (name, knife, expire) VALUES('" + player + "', " + id
1118 + ", 0) ON DUPLICATE KEY UPDATE expire=IF(expire=0,0,IF(expire>" + System.currentTimeMillis()
1119 + ",0,expire))");
1120 stm.executeUpdate("INSERT INTO minestrike_givegunlog (note, `to`, gun, expire, time) VALUES ('" + note
1121 + "', '" + player + "', 'knife_" + id + "', 0, " + System.currentTimeMillis() + ")");
1122 } catch (SQLException e) {
1123 throw e;
1124 } finally {
1125 cleanup(null, stm);
1126 }
1127 LevelCache l = main.getLevelCache().get(player);
1128 if (l != null)
1129 loadPlayersKnives(l, true);
1130 }
1131
1132 public List<PlayerQuest> getQuestsData(String player) {
1133 List<PlayerQuest> quests = Collections.synchronizedList(new ArrayList<PlayerQuest>());
1134 ResultSet s = null;
1135 Statement stm = null;
1136 try {
1137 stm = sql.createStatement();
1138 stm.executeUpdate("delete from minestrike_quests_player where player = \"" + player
1139 + "\" and nextreset != 0 and nextreset <= " + System.currentTimeMillis());
1140 s = stm.executeQuery("select * from minestrike_quests_player where player = \"" + player + "\"");
1141 while (s.next()) {
1142 Quest q = main.getQuest(s.getString("quest"));
1143 if (q == null)
1144 continue;
1145 int done = s.getInt("done");
1146 long nextreset = s.getLong("nextreset");
1147 boolean finished = s.getBoolean("finished");
1148 boolean obtained = s.getBoolean("obtained");
1149 quests.add(new PlayerQuest(q, done, nextreset, finished, obtained));
1150 }
1151 } catch (SQLException e) {
1152 main.getLogger().log(Level.SEVERE, "Can not load " + player + "'s quests", e);
1153 quests = null;
1154 } finally {
1155 cleanup(s, stm);
1156 }
1157 if (quests == null)
1158 throw new NullPointerException();
1159 return quests;
1160 }
1161
1162 public void addExp(Player p, int exp) {
1163 PreparedStatement ps = null;
1164 try {
1165 ps = sql.prepareStatement(PLAYER_EXP_ADD);
1166 ps.setString(1, p.getUniqueId().toString());
1167 ps.setString(2, p.getName());
1168 ps.setInt(3, exp);
1169 ps.executeUpdate();
1170 } catch (SQLException e) {
1171 main.getLogger().log(Level.SEVERE, "Can not add " + p.getName() + "'s exp", e);
1172 } finally {
1173 cleanup(null, ps);
1174 }
1175 }
1176
1177 public List<CachedGun> getCachedGuns(String p) {
1178 List<CachedGun> guns = new ArrayList<CachedGun>();
1179 boolean err = false;
1180 PreparedStatement ps = null;
1181 ResultSet rs = null;
1182 try {
1183 ps = sql.prepareStatement(PLAYER_GUN_SUB_GET);
1184 ps.setString(1, p);
1185 rs = ps.executeQuery();
1186 while (rs.next()) {
1187 Gun gun = main.getGun(rs.getString("gun"));
1188 long expire = rs.getLong("expire");
1189 CachedGun cg = new CachedGun(gun, expire);
1190 guns.add(cg);
1191 }
1192 } catch (SQLException e) {
1193 main.getLogger().log(Level.SEVERE, "Can't get " + p + "'s cached guns", e);
1194 err = true;
1195 } finally {
1196 cleanup(rs, ps);
1197 }
1198 if (err)
1199 throw new NullPointerException();
1200 return guns;
1201 }
1202
1203 public List<String[]> getTop3Money() {
1204 List<String[]> kq = new ArrayList<String[]>();
1205 ResultSet s = null;
1206 Statement stm = null;
1207 try {
1208 stm = sql.createStatement();
1209 s = stm.executeQuery("select p.player_name, round(p.money) as m, s.Value, s.Signature from minestrike_eco p"
1210 + " left join skin s on s.Nick = p.player_name order by p.money desc limit 0,3");
1211 while (s.next()) {
1212 String[] a = { s.getString("player_name"), "§0§l" + s.getString("m") + "₫", s.getString("Value"),
1213 s.getString("Signature") };
1214 kq.add(a);
1215 }
1216 } catch (SQLException e) {
1217 main.getLogger().log(Level.SEVERE, "Can't get top 3 money", e);
1218 } finally {
1219 cleanup(s, stm);
1220 }
1221 return kq;
1222 }
1223
1224 public List<String[]> getTop3Level() {
1225 List<String[]> kq = new ArrayList<String[]>();
1226 ResultSet s = null;
1227 Statement stm = null;
1228 try {
1229 stm = sql.createStatement();
1230 s = stm.executeQuery(
1231 "select p.NAME, p.EXP, s.Value, s.Signature from minestrike_stats p left join skin s on s.Nick = p.NAME"
1232 + " order by p.exp desc limit 0,3");
1233 while (s.next()) {
1234 String[] a = { s.getString("NAME"), s.getString("EXP"), s.getString("Value"),
1235 s.getString("Signature") };
1236 kq.add(a);
1237 }
1238 } catch (SQLException e) {
1239 main.getLogger().log(Level.SEVERE, "Can't get top 3 level", e);
1240 } finally {
1241 cleanup(s, stm);
1242 }
1243 return kq;
1244 }
1245
1246 public List<String[]> getTop3Kill() {
1247 List<String[]> kq = new ArrayList<String[]>();
1248 ResultSet s = null;
1249 Statement stm = null;
1250 try {
1251 stm = sql.createStatement();
1252 s = stm.executeQuery(
1253 "select p.NAME, p.KILLS, s.Value, s.Signature from minestrike_stats p left join skin s on s.Nick = p.NAME"
1254 + " order by p.KILLS desc limit 0,3");
1255 while (s.next()) {
1256 String[] a = { s.getString("NAME"), "§0§l" + s.getString("KILLS") + " kills", s.getString("Value"),
1257 s.getString("Signature") };
1258 kq.add(a);
1259 }
1260 } catch (SQLException e) {
1261 main.getLogger().log(Level.SEVERE, "Can't get top 3 kills", e);
1262 } finally {
1263 cleanup(s, stm);
1264 }
1265 return kq;
1266 }
1267
1268 @SuppressWarnings("deprecation")
1269 public byte[][] getSkinIcon(String name) {
1270 byte[][] kq = new byte[8][8];
1271 PreparedStatement ps = null;
1272 ResultSet r = null;
1273 try {
1274 ps = sql.prepareStatement(SKIN_VALUE);
1275 ps.setString(1, name);
1276 r = ps.executeQuery();
1277 if (!r.next())
1278 return null;
1279 String value = r.getString("Value");
1280 String json = StringUtils.newStringUtf8(Base64.decodeBase64(value));
1281 String url = new JsonParser().parse(json).getAsJsonObject().getAsJsonObject("textures")
1282 .getAsJsonObject("SKIN").get("url").getAsString();
1283 BufferedImage base = ImageIO.read(new URL(url));
1284 BufferedImage img2 = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_ARGB);
1285 Graphics2D g = img2.createGraphics();
1286 g.drawImage(base, 0, 0, null);
1287 g.dispose();
1288 for (int i = 0; i < 8; ++i)
1289 for (int j = 0; j < 8; ++j) {
1290 kq[i][j] = MapPalette.matchColor(new Color(img2.getRGB(i + 8, j + 8), true));
1291 byte b = MapPalette.matchColor(new Color(img2.getRGB(i + 40, j + 8), true));
1292 if (b != 0)
1293 kq[i][j] = b;
1294 }
1295 } catch (Exception e) {
1296 main.getLogger().log(Level.WARNING, "Can't get " + name + "'s skin head", e);
1297 return null;
1298 } finally {
1299 cleanup(r, ps);
1300 }
1301 return kq;
1302 }
1303
1304 public List<Listing> getMarketListings() {
1305 List<Listing> list = new ArrayList<>();
1306 ResultSet r = null;
1307 Statement stm = null;
1308 try {
1309 stm = sql.createStatement();
1310 r = stm.executeQuery(MARKET_LISTINGS);
1311 while (r.next()) {
1312 int id = r.getInt("id");
1313 String seller = r.getString("seller");
1314 int price = r.getInt("price");
1315 String gunname = r.getString("gun");
1316 Gun gun = main.getGun(gunname);
1317 long time = r.getLong("time");
1318 long expire = r.getLong("expire");
1319 if (gun == null) {
1320 main.getLogger().log(Level.WARNING, "Gun " + gunname + " in listings #" + id + " doesn't exist");
1321 continue;
1322 }
1323 list.add(new Listing(id, seller, gun, price, time, expire));
1324 }
1325 } catch (Exception ex) {
1326 main.getLogger().log(Level.WARNING, "Can't get market listings", ex);
1327 } finally {
1328 cleanup(r, stm);
1329 }
1330 return list;
1331 }
1332
1333 public List<Listing> getMarketListings(String seller) {
1334 List<Listing> list = new ArrayList<>();
1335 PreparedStatement ps = null;
1336 ResultSet r = null;
1337 try {
1338 ps = sql.prepareStatement(MARKET_LISTINGS_PLAYER);
1339 ps.setString(1, seller);
1340 r = ps.executeQuery();
1341 while (r.next()) {
1342 int id = r.getInt("id");
1343 int price = r.getInt("price");
1344 String gunname = r.getString("gun");
1345 Gun gun = main.getGun(gunname);
1346 long time = r.getLong("time");
1347 long expire = r.getLong("expire");
1348 if (gun == null) {
1349 main.getLogger().log(Level.WARNING, "Gun " + gunname + " in listings #" + id + " doesn't exist");
1350 continue;
1351 }
1352 list.add(new Listing(id, seller, gun, price, time, expire));
1353 }
1354 } catch (Exception ex) {
1355 main.getLogger().log(Level.WARNING, "Can't get market listings", ex);
1356 } finally {
1357 cleanup(r, ps);
1358 }
1359 return list;
1360 }
1361
1362 public List<Gun> getSellableGuns(String p, boolean sub) {
1363 List<Gun> list = new ArrayList<>();
1364 PreparedStatement ps = null;
1365 ResultSet r = null;
1366 try {
1367 ps = sql.prepareStatement((sub) ? MARKET_SELLABLE_GUNS_SUB : MARKET_SELLABLE_GUNS_MAIN);
1368 ps.setString(1, p);
1369 r = ps.executeQuery();
1370 while (r.next()) {
1371 Gun gun = main.getGun(r.getString("gun"));
1372 if (gun != null && gun.isVip())
1373 list.add(gun);
1374 }
1375 } catch (SQLException e) {
1376 main.getLogger().log(Level.WARNING, "Can't get sellable guns of " + p, e);
1377 } finally {
1378 cleanup(r, ps);
1379 }
1380 return list;
1381 }
1382
1383 public int canSell(String p, String gun, boolean sub) {
1384 PreparedStatement ps = null;
1385 ResultSet r = null;
1386 int result = -1;
1387 try {
1388 ps = sql.prepareStatement((sub) ? MARKET_CHECK_GUN_SUB : MARKET_CHECK_GUN_MAIN);
1389 ps.setString(1, p);
1390 ps.setString(2, gun);
1391 r = ps.executeQuery();
1392 if (r.next())
1393 result = r.getInt("id");
1394 } catch (SQLException e) {
1395 main.getLogger().log(Level.WARNING, "Can't check if " + p + " have gun " + gun, e);
1396 } finally {
1397 cleanup(r, ps);
1398 }
1399 return result;
1400 }
1401
1402 public boolean removeGun(int id, boolean sub) {
1403 PreparedStatement ps = null;
1404 try {
1405 ps = sql.prepareStatement((sub) ? MARKET_GUN_REMOVE_SUB : MARKET_GUN_REMOVE_MAIN);
1406 ps.setInt(1, id);
1407 ps.executeUpdate();
1408 return true;
1409 } catch (Exception e) {
1410 main.getLogger().log(Level.SEVERE, "Can't remove gun #" + id + "(" + ((sub) ? "sub" : "main") + ")", e);
1411 } finally {
1412 cleanup(null, ps);
1413 }
1414 return false;
1415 }
1416
1417 public Listing getListting(int id) {
1418 Listing listing = null;
1419 PreparedStatement ps = null;
1420 ResultSet r = null;
1421 try {
1422 ps = sql.prepareStatement(MARKET_LISTING_GET);
1423 ps.setInt(1, id);
1424 r = ps.executeQuery();
1425 if (r.next()) {
1426 String seller = r.getString("seller");
1427 int price = r.getInt("price");
1428 String gunname = r.getString("gun");
1429 Gun gun = main.getGun(gunname);
1430 long time = r.getLong("time");
1431 long expire = r.getLong("expire");
1432 listing = new Listing(id, seller, gun, price, time, expire);
1433 }
1434 } catch (Exception e) {
1435 main.getLogger().log(Level.WARNING, "Can't get listing #" + id, e);
1436 } finally {
1437 cleanup(r, ps);
1438 }
1439 return listing;
1440 }
1441
1442 public List<Mail> getMails(String p) {
1443 List<Mail> mails = new ArrayList<>();
1444 PreparedStatement ps = null;
1445 ResultSet r = null;
1446 try {
1447 ps = sql.prepareStatement(MARKET_MAILS_GET);
1448 ps.setString(1, p);
1449 r = ps.executeQuery();
1450 while (r.next()) {
1451 // user message gun price time received
1452 int id = r.getInt("id");
1453 String user = r.getString("user");
1454 String message = r.getString("message");
1455 String gname = r.getString("gun");
1456 Gun gun = gname.equals("null") ? null : main.getGun(gname);
1457 int price = r.getInt("price");
1458 long time = r.getLong("time");
1459 Mail mail = new Mail(id, user, message, gun, price, time);
1460 if (r.getInt("received") == 1)
1461 mail.receive();
1462 mails.add(mail);
1463 }
1464 } catch (Exception e) {
1465 main.getLogger().log(Level.WARNING, "Can't get " + p + "'s mails", e);
1466 } finally {
1467 cleanup(r, ps);
1468 }
1469 return mails;
1470 }
1471
1472 public void sendMail(Mail mail) {
1473 PreparedStatement ps = null;
1474 try {
1475 ps = sql.prepareStatement(MARKET_MAILS_SEND);
1476 ps.setString(1, mail.getPlayer());
1477 ps.setString(2, mail.getMessage());
1478 Gun gun = mail.getGun();
1479 ps.setString(3, ((gun == null) ? "null" : gun.getName()));
1480 ps.setInt(4, mail.getPoint());
1481 ps.setLong(5, mail.getTime());
1482 ps.executeUpdate();
1483 Player player = Bukkit.getPlayer(mail.getPlayer());
1484 if (player != null) {
1485 Bukkit.getScheduler().runTask(main, () -> GameUtils.glow(player.getInventory().getItem(8)));
1486 player.sendMessage("§d§l* §e§lBạn có thư má»›i trong há»™p thư chợ trá»i, hãy kiểm tra há»™p thư.");
1487 }
1488 } catch (Exception e) {
1489 main.getLogger().log(Level.SEVERE, "Can't send mail. " + mail.getContent(), e);
1490 } finally {
1491 cleanup(null, ps);
1492 }
1493 }
1494
1495 public void sell(Listing listing) {
1496 PreparedStatement ps = null;
1497 try {
1498 ps = sql.prepareStatement(MARKET_LISTING_CREATE);
1499 // seller,gun,price,time,expire
1500 ps.setString(1, listing.getSeller());
1501 ps.setString(2, listing.getGun().getName());
1502 ps.setInt(3, listing.getPrice());
1503 ps.setLong(4, listing.getTime());
1504 ps.setLong(5, listing.getExpire());
1505 ps.executeUpdate();
1506 } catch (Exception e) {
1507 main.getLogger().log(Level.SEVERE, "Can't add listing. " + listing.getContent(), e);
1508 } finally {
1509 cleanup(null, ps);
1510 }
1511 }
1512
1513 public boolean removeListing(int id, String seller) {
1514 PreparedStatement ps = null;
1515 try {
1516 ps = sql.prepareStatement(MARKET_LISTING_REMOVE);
1517 ps.setInt(1, id);
1518 ps.setString(2, seller);
1519 ps.executeUpdate();
1520 return true;
1521 } catch (Exception e) {
1522 main.getLogger().log(Level.SEVERE, "Can't remove listing #" + id, e);
1523 } finally {
1524 cleanup(null, ps);
1525 }
1526 return false;
1527 }
1528
1529 public boolean checkObtainableMail(int id) {
1530 PreparedStatement ps = null;
1531 ResultSet r = null;
1532 try {
1533 ps = sql.prepareStatement(MARKET_MAILS_OBTAINABLE_CHECK);
1534 ps.setInt(1, id);
1535 r = ps.executeQuery();
1536 if (r.next())
1537 return true;
1538 } catch (Exception e) {
1539 main.getLogger().log(Level.SEVERE, "Can't check obtainable mail #" + id, e);
1540 } finally {
1541 cleanup(r, ps);
1542 }
1543 return false;
1544 }
1545
1546 public boolean obtainMail(int id) {
1547 PreparedStatement ps = null;
1548 try {
1549 ps = sql.prepareStatement(MARKET_MAILS_OBTAIN);
1550 ps.setInt(1, id);
1551 ps.executeUpdate();
1552 return true;
1553 } catch (Exception e) {
1554 main.getLogger().log(Level.SEVERE, "Can't obtain mail #" + id, e);
1555 } finally {
1556 cleanup(null, ps);
1557 }
1558 return false;
1559 }
1560
1561 public boolean deleleMail(int id) {
1562 PreparedStatement ps = null;
1563 try {
1564 ps = sql.prepareStatement(MARKET_MAILS_REMOVE);
1565 ps.setInt(1, id);
1566 ps.executeUpdate();
1567 return true;
1568 } catch (Exception e) {
1569 main.getLogger().log(Level.SEVERE, "Can't delete mail #" + id, e);
1570 } finally {
1571 cleanup(null, ps);
1572 }
1573 return false;
1574 }
1575
1576 public List<Listing> expiredListings() {
1577 List<Listing> list = new ArrayList<>();
1578 PreparedStatement ps = null;
1579 ResultSet r = null;
1580 try {
1581 ps = sql.prepareStatement(MARKET_LISTING_EXPIRED_LIST);
1582 ps.setLong(1, System.currentTimeMillis());
1583 r = ps.executeQuery();
1584 while (r.next()) {
1585 int id = r.getInt("id");
1586 String seller = r.getString("seller");
1587 int price = r.getInt("price");
1588 String gunname = r.getString("gun");
1589 Gun gun = main.getGun(gunname);
1590 long time = r.getLong("time");
1591 long expire = r.getLong("expire");
1592 if (gun == null) {
1593 main.getLogger().log(Level.WARNING, "Gun " + gunname + " in listings #" + id + " doesn't exist");
1594 continue;
1595 }
1596 list.add(new Listing(id, seller, gun, price, time, expire));
1597 }
1598 } catch (Exception e) {
1599 main.getLogger().log(Level.SEVERE, "Can't get expired listings", e);
1600 } finally {
1601 cleanup(r, ps);
1602 }
1603 return list;
1604 }
1605
1606 public boolean checkNewMails(String p) {
1607 PreparedStatement ps = null;
1608 ResultSet r = null;
1609 try {
1610 ps = sql.prepareStatement(MARKET_MAILS_CHECKNEW);
1611 ps.setString(1, p);
1612 r = ps.executeQuery();
1613 if (r.next())
1614 return true;
1615 } catch (Exception e) {
1616 main.getLogger().log(Level.SEVERE, "Can't check " + p + "'s new mails", e);
1617 } finally {
1618 cleanup(r, ps);
1619 }
1620 return false;
1621 }
1622
1623 public int countListings(String p) {
1624 PreparedStatement ps = null;
1625 ResultSet r = null;
1626 try {
1627 ps = sql.prepareStatement(MARKET_COUNT_PLAYER);
1628 ps.setString(1, p);
1629 r = ps.executeQuery();
1630 if (r.next())
1631 return r.getInt("count");
1632 } catch (Exception e) {
1633 main.getLogger().log(Level.SEVERE, "Can't count " + p + "'s listings", e);
1634 } finally {
1635 cleanup(r, ps);
1636 }
1637 return -1;
1638 }
1639
1640 public void resetStartRole(String p, int role) throws SQLException {
1641 PreparedStatement ps = null;
1642 try {
1643 ps = sql.prepareStatement(GUN_STARTROLE_RESET);
1644 ps.setString(1, p);
1645 ps.setInt(2, role);
1646 ps.executeUpdate();
1647 } finally {
1648 cleanup(null, ps);
1649 }
1650 }
1651
1652 public void setStartRole(String p, String gun, int role) {
1653 PreparedStatement ps = null;
1654 try {
1655 resetStartRole(p, role);
1656 ps = sql.prepareStatement(GUN_STARTROLE_SET);
1657 ps.setInt(1, role);
1658 ps.setString(2, p);
1659 ps.setString(3, gun);
1660 ps.executeUpdate();
1661 } catch (Exception e) {
1662 main.getLogger().log(Level.SEVERE, "Failed to set start role: " + gun + " for " + p, e);
1663 } finally {
1664 cleanup(null, ps);
1665 }
1666 }
1667
1668 public int getQPoints(String p) {
1669 PreparedStatement ps = null;
1670 ResultSet r = null;
1671 int kq = 0;
1672 try {
1673 ps = sql.prepareStatement(PLAYER_QPOINTS_GET);
1674 ps.setString(1, p);
1675 r = ps.executeQuery();
1676 if (r.next())
1677 kq = r.getInt("qpoints");
1678 } catch (Exception e) {
1679 main.getLogger().log(Level.SEVERE, "Can not get " + p + "'s quest points", e);
1680 } finally {
1681 cleanup(null, ps);
1682 }
1683 return kq;
1684 }
1685
1686 public void addQPoints(String p, int qpoints) throws Exception {
1687 PreparedStatement ps = null;
1688 try {
1689 ps = sql.prepareStatement(PLAYER_QPOINTS_ADD);
1690 ps.setInt(1, qpoints);
1691 ps.setString(2, p);
1692 ps.executeUpdate();
1693 LevelCache lvl = main.getLevelCache().get(p);
1694 if (lvl != null)
1695 lvl.updateQPoints();
1696 } catch (Exception e) {
1697 main.getLogger().log(Level.SEVERE, "Can not add " + p + "'s quest points", e);
1698 throw e;
1699 } finally {
1700 cleanup(null, ps);
1701 }
1702 }
1703
1704 public void removeQPoints(String p, int qpoints) throws Exception {
1705 PreparedStatement ps = null;
1706 try {
1707 ps = sql.prepareStatement(PLAYER_QPOINTS_REMOVE);
1708 ps.setInt(1, qpoints);
1709 ps.setString(2, p);
1710 ps.executeUpdate();
1711 LevelCache lvl = main.getLevelCache().get(p);
1712 if (lvl != null)
1713 lvl.updateQPoints();
1714 } catch (Exception e) {
1715 main.getLogger().log(Level.SEVERE, "Can not add " + p + "'s quest points", e);
1716 throw e;
1717 } finally {
1718 cleanup(null, ps);
1719 }
1720 }
1721
1722 public List<LevelCache> getTopQPoints(int limit) {
1723 List<LevelCache> kq = new ArrayList<LevelCache>();
1724 PreparedStatement ps = null;
1725 ResultSet r = null;
1726 try {
1727 ps = sql.prepareStatement(PLAYER_QPOINTS_TOP);
1728 ps.setInt(1, limit);
1729 r = ps.executeQuery();
1730 while (r.next())
1731 kq.add(new LevelCache(r.getString("name"), main));
1732 } catch (Exception e) {
1733 main.getLogger().log(Level.SEVERE, "Can't get QPoints top", e);
1734 } finally {
1735 cleanup(r, ps);
1736 }
1737 return kq;
1738 }
1739
1740 public List<MSItem> getItems(LevelCache lvl) {
1741 List<MSItem> items = new ArrayList<MSItem>();
1742 PreparedStatement ps = null;
1743 ResultSet r = null;
1744 String p = lvl.getPlayer();
1745 try {
1746 ps = sql.prepareStatement(PLAYER_INVENTORY_LIST);
1747 ps.setString(1, p);
1748 ps.setLong(2, System.currentTimeMillis());
1749 r = ps.executeQuery();
1750 items: while (r.next()) {
1751 try {
1752 MSItem item;
1753 int id = r.getInt("id");
1754 ItemType type = ItemType.valueOf(r.getString("type"));
1755 String json = r.getString("data");
1756 long expire = r.getLong("expire");
1757 long obtained = r.getLong("obtainedtime");
1758 boolean isUsing = r.getBoolean("isusing");
1759 switch (type) {
1760 case LEVEL_BOX:
1761 item = new LevelBox(lvl, id, json, obtained);
1762 break;
1763 case MVP_ANTHEM:
1764 MVPAnthem music = main.getMVPAnthem(json);
1765 if (music == null)
1766 continue items;
1767 item = new MVPAnthemItem(lvl, id, music, expire, obtained, isUsing);
1768 break;
1769 default:
1770 continue items;
1771 }
1772 items.add(item);
1773 } catch (Exception e) {
1774 main.getLogger().log(Level.SEVERE, "Error while loading item #" + r.getInt("id"), e);
1775 }
1776 }
1777 } catch (Exception e) {
1778 main.getLogger().log(Level.SEVERE, "Can not load items for player " + p, e);
1779 } finally {
1780 cleanup(r, ps);
1781 }
1782 return items;
1783 }
1784
1785 public void saveItem(MSItem item) {
1786 PreparedStatement ps = null;
1787 ResultSet r = null;
1788 try {
1789 ps = item.getID() < 0 ? sql.prepareStatement(PLAYER_INVENTORY_ITEM_INSERT, Statement.RETURN_GENERATED_KEYS)
1790 : sql.prepareStatement(PLAYER_INVENTORY_ITEM_UPDATE);
1791 ps.setString(1, item.getOwner().getPlayer());
1792 ps.setString(2, item.getType().name());
1793 ps.setString(3, item.getData());
1794 ps.setLong(4, item.getExpire());
1795 ps.setLong(5, item.getObtainedTime());
1796 ps.setBoolean(6, (item instanceof UsableItem) ? ((UsableItem) item).isUsing() : false);
1797 if (item.getID() < 0) {
1798 ps.executeUpdate();
1799 r = ps.getGeneratedKeys();
1800 while (r.next())
1801 item.setID(r.getInt(1));
1802 main.getLogger().info("saved item #" + item.getID());
1803 } else {
1804 ps.setInt(7, item.getID());
1805 ps.executeUpdate();
1806 }
1807 } catch (Exception e) {
1808 main.getLogger().log(Level.SEVERE,
1809 "Can not save item #" + item.getID() + ", owner: " + item.getOwner().getPlayer() + ", type: "
1810 + item.getType().name() + ", data: " + item.getData() + ", expire: " + item.getExpire()
1811 + ", obtained time: " + item.getObtainedTime() + ", isusing: "
1812 + ((item instanceof UsableItem) ? ((UsableItem) item).isUsing() : false),
1813 e);
1814 } finally {
1815 cleanup(r, ps);
1816 }
1817 }
1818
1819// PreparedStatement ps = null;
1820// ResultSet r = null;
1821// try {
1822//
1823// } catch (Exception e) {
1824//
1825// } finally {
1826// cleanup(r, ps);
1827// }
1828}