Advertisement
Guest User

Untitled

a guest
May 27th, 2016
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.89 KB | None | 0 0
  1. package com.astrect.rs2.saving;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.Paths;
  10. import java.util.LinkedList;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.concurrent.ExecutorService;
  14. import java.util.concurrent.Executors;
  15.  
  16. import com.astrect.AstrectConstants;
  17. import com.astrect.rs2.commands.Command;
  18. import com.astrect.rs2.commands.CommandHandler;
  19. import com.astrect.rs2.model.Location;
  20. import com.astrect.rs2.model.item.Item;
  21. import com.astrect.rs2.model.players.DonatorStatus;
  22. import com.astrect.rs2.model.players.PkStatus;
  23. import com.astrect.rs2.model.players.Player;
  24. import com.astrect.rs2.model.players.PlayerRights;
  25. import com.astrect.rs2.util.TextUtils;
  26.  
  27. public class PlayerSaving
  28. {
  29.  
  30. /**
  31. * The saving directory.
  32. */
  33. public static final File CHARACTER_FILE_DIRECTORY = new File(System.getProperty("user.home"), ""+AstrectConstants.SERVER_NAME+"-data/users/");
  34.  
  35. /**
  36. * The buffer size used for saving and loading.
  37. */
  38. public static final int BUFFER_SIZE = 1024;
  39.  
  40. /**
  41. * The single thread work service used for queued saving.
  42. */
  43. private final ExecutorService saveThread = Executors.newSingleThreadExecutor();
  44.  
  45.  
  46. /**
  47. * The PlayerSaving singleton.
  48. */
  49. private final static PlayerSaving singleton = new PlayerSaving();
  50.  
  51. public static void saveGame(Player player) {
  52. String username = player.getName();
  53. Path path = Paths.get(CHARACTER_FILE_DIRECTORY + File.separator + username.charAt(0) + "/", username + ".txt");
  54.  
  55. if (Files.notExists(path)) {
  56. try {
  57. Files.createDirectories(path.getParent());
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. }
  61. }
  62.  
  63. try (BufferedWriter writer = Files.newBufferedWriter(path)) {
  64. writer.write("PLAYER_INFO"); writer.newLine();
  65. writer.write("username = " + username); writer.newLine();
  66. writer.write("password = " + player.getPassword()); writer.newLine();
  67. writer.write("ip-address = " + player.getFullIP()); writer.newLine();
  68. writer.write("rights = " + player.getRights().toString()); writer.newLine();
  69. writer.write("donator-rights = " + player.getDonatorStatus().toString()); writer.newLine();
  70. writer.write("location = " + player.getLocation().getX() + "\t" + player.getLocation().getY() + "\t" + player.getLocation().getZ()); writer.newLine();
  71.  
  72. writer.write("PLAYER_POINTS"); writer.newLine();
  73. writer.write("donator-points = " + player.getPoints().getDonatorPoints()); writer.newLine();
  74. writer.write("total-donated = " + player.getPoints().getDonatorPointsBought()); writer.newLine();
  75. writer.write("killcount = " + player.getKillCount()); writer.newLine();
  76. writer.write("death-count = " + player.getDeathCount()); writer.newLine();
  77. writer.write("pk-points = " + player.getPoints().getPkPoints()); writer.newLine();
  78. writer.write("bounty-points = " + player.getPoints().getBountyPoints()); writer.newLine();
  79. writer.write("loyalty-points = " + player.getPoints().getLoyaltyPoints()); writer.newLine();
  80. writer.write("vote-points = " + player.getPoints().getVotingPoints()); writer.newLine();
  81.  
  82. writer.write("PLAYER_MISC"); writer.newLine();
  83. writer.write("godwars-kills = " + player.godWarsKillCount[0] + "\t" + player.godWarsKillCount[1] + "\t" + player.godWarsKillCount[2] + "\t" + player.godWarsKillCount[3]); writer.newLine();
  84. writer.write("attack-type = " + player.getCombatEntity().getAtkType()); writer.newLine();
  85. writer.write("clan-chat = " + player.getAttribute().getString("clan_chat_name")); writer.newLine();
  86. writer.write("player-diced = " + player.getDiced()); writer.newLine();
  87. writer.write("earning-potential = " + player.earningPotential); writer.newLine();
  88. writer.write("energy = " + player.getAttribute().getInt("ENERGY")); writer.newLine();
  89. writer.write("fight-caves-wave = " + player.fightCavesWave); writer.newLine();
  90. writer.write("exp-lock = " + player.xpLock); writer.newLine();
  91. writer.write("bounty-hunting = " + player.isBountyHunting()); writer.newLine();
  92. writer.write("skull-timer = " + player.getSkullTimer()); writer.newLine();
  93. writer.write("special-energy = " + player.getSpecBar().getAmount()); writer.newLine();
  94. writer.write("slayer-task = " + player.slayerTask); writer.newLine();
  95. writer.write("slayer-amount = " + player.slayerAm); writer.newLine();
  96. writer.write("pk-status = " + player.getPkStatus().name()); writer.newLine();
  97. writer.write("magic-book = " + player.getSpellBook().toInteger()); writer.newLine();
  98. writer.write("prayer-book = " + player.getPrayers().isDefaultPrayerbook());
  99. writer.write("last-voted = " + player.getLastVoted()); writer.newLine();
  100. writer.write("new-character = " + player.isNew()); writer.newLine();
  101.  
  102. writer.write("PLAYER_APPEARANCE"); writer.newLine();
  103. for (int i = 0; i < player.getAppearance().getLook().length; i++) {
  104. writer.write("character-look = " + i + "\t" + player.getAppearance().getLook()[i]);
  105. writer.newLine();
  106. }
  107. writer.newLine();
  108.  
  109. writer.write("PLAYER_INVENTORY"); writer.newLine();
  110. for (int i = 0; i < player.getInventory().toArray().length; i++) {
  111. Item item = player.getInventory().toArray()[i];
  112. if (item != null) {
  113. writer.write("inventory-slot = " + i + "\t" + item.getId() + "\t" + item.getCount());
  114. writer.newLine();
  115. }
  116. }
  117. writer.newLine();
  118.  
  119. writer.write("PLAYER_EQUIPMENT");
  120. writer.newLine();
  121. for (int i = 0; i < player.getEquipment().toArray().length; i++) {
  122. Item item = player.getEquipment().toArray()[i];
  123. writer.write("equip-slot = " + i + "\t" + item.getId() + "\t" + item.getCount());
  124. writer.newLine();
  125. }
  126. writer.newLine();
  127.  
  128. writer.write("PLAYER_BANK");
  129. writer.newLine();
  130. for (int i = 0; i < player.getBank().toArray().length; i++) {
  131. Item item = player.getBank().toArray()[i];
  132. if (item != null) {
  133. writer.write("bank-slot = " + i + "\t" + item.getId() + "\t" + item.getCount());
  134. writer.newLine();
  135. }
  136. }
  137. writer.newLine();
  138.  
  139. writer.write("PLAYER_CUSTOM_EQUIPMENT");
  140. writer.newLine();
  141. for (int i = 0; i < player.getCustomEquipment().toArray().length; i++) {
  142. Item item = player.getCustomEquipment().toArray()[i];
  143. if (item != null) {
  144. writer.write("custom-equip-slot = " + i + "\t" + item.getId() + "\t" + item.getCount());
  145. writer.newLine();
  146. }
  147. }
  148. writer.newLine();
  149.  
  150. writer.write("PLAYER_FRIENDS"); writer.newLine();
  151. for (int i = 0; i < player.getFriends().toArray().length; i++) {
  152. if (player.getFriends().toArray()[i] > 0) {
  153. writer.write("character-friend = ");
  154. writer.write(Integer.toString(i));
  155. writer.write("\t");
  156. writer.write(Long.toString(player.getFriends().toArray()[i]));
  157. writer.newLine();
  158. }
  159. }
  160. writer.newLine();
  161.  
  162. /*
  163. * Dont add anything after this
  164. */
  165. writer.write("[EOF]");
  166. } catch (IOException e) {
  167. e.printStackTrace();
  168. }
  169. }
  170.  
  171. private static final int PLAYER_DETAILS = 0, PLAYER_POINTS = 1, PLAYER_MISC = 2, PLAYER_INVENTORY = 3, PLAYER_EQUIPMENT = 4, PLAYER_BANK = 5, PLAYER_CUSTOM_EQUIPMENT = 6, PLAYER_APPEARANCE = 7, PLAYER_SKILLS = 8, PLAYER_FRIENDS = 9;
  172.  
  173. public static boolean loadGame(Player player, String password) {
  174. String username = player.getName();
  175. Path path = Paths.get(CHARACTER_FILE_DIRECTORY + File.separator + username.charAt(0) + "/", username + ".txt");
  176.  
  177. if (Files.notExists(path)) {
  178. return false;
  179. }
  180.  
  181. try (BufferedReader reader = Files.newBufferedReader(path)) {
  182. String line;
  183. int mode = 0;
  184. while ((line = reader.readLine()) != null) {
  185. line = line.trim();
  186. int spot = line.indexOf("=");
  187. if (spot > -1) {
  188. String key = line.substring(0, spot).trim();
  189. String dataValue = line.substring(spot + 1).trim();
  190. String[] dataValues = dataValue.split("\t");
  191. switch (mode) {
  192.  
  193. case PLAYER_DETAILS:
  194. switch (key) {
  195.  
  196. case "password":
  197. if (!password.equalsIgnoreCase(dataValue)) {
  198. return false;
  199. }
  200. break;
  201.  
  202. case "rights":
  203. PlayerRights rights = PlayerRights.PLAYER;
  204. try {
  205. rights = PlayerRights.valueOf(dataValue);
  206. } catch (Exception e) {
  207.  
  208. }
  209. player.setRights(rights);
  210. break;
  211.  
  212. case "donator-rights":
  213. DonatorStatus donator = DonatorStatus.NON_DONATOR;
  214. try {
  215. donator = DonatorStatus.valueOf(dataValue);
  216. } catch (Exception e) {
  217.  
  218. }
  219. player.setDonatorStatus(donator);
  220. break;
  221.  
  222. case "location":
  223. int x = Integer.parseInt(dataValues[0]);
  224. int y = Integer.parseInt(dataValues[1]);
  225. int z = Integer.parseInt(dataValues[2]);
  226. player.setLocation(Location.create(x, y, z));
  227. break;
  228. }
  229.  
  230. case PLAYER_POINTS:
  231. switch (key) {
  232. case "donator-points":
  233. player.getPoints().setDonatorPoints(Integer.parseInt(dataValue));
  234. break;
  235. case "total-donated":
  236. player.getPoints().setDonatorsBought(Integer.parseInt(dataValue));
  237. break;
  238.  
  239. case "killcount":
  240. player.setKillCount(Integer.parseInt(dataValue));
  241. break;
  242.  
  243. case "death-count":
  244. player.setDeathCount(Integer.parseInt(dataValue));
  245. break;
  246.  
  247. case "pk-points":
  248. player.getPoints().setPkPoints(Integer.parseInt(dataValue));
  249. break;
  250. case "bounty-points":
  251. player.getPoints().setBountyPoints(Integer.parseInt(dataValue));
  252. break;
  253. case "loyalty-points":
  254. player.getPoints().setLoyaltyPoints(Integer.parseInt(dataValue));
  255. break;
  256. case "vote-points":
  257. player.getPoints().setVotingPoints(Integer.parseInt(dataValue));
  258. break;
  259. }
  260.  
  261. case PLAYER_MISC:
  262. switch (key) {
  263.  
  264. case "godwars-kills":
  265. for (int i = 0; i < dataValues.length; i++) {
  266. player.godWarsKillCount[i] = Integer.parseInt(dataValues[i]);
  267. }
  268. break;
  269.  
  270. case "attack-type":
  271. player.getCombatEntity().setAtkType(Integer.parseInt(dataValue));
  272. break;
  273.  
  274. case "clan-chat":
  275. player.getAttribute().put("clan_chat_name", dataValue);
  276. break;
  277.  
  278. case "player-diced":
  279. player.setDiced(Integer.parseInt(dataValue));
  280. break;
  281.  
  282. case "earning-potential":
  283. player.earningPotential = Integer.parseInt(dataValue);
  284. break;
  285. case "energy":
  286. player.getAttribute().put("ENERGY", Integer.parseInt(dataValue));
  287. break;
  288.  
  289. case "fight-caves-wave":
  290. player.fightCavesWave = Integer.parseInt(dataValue);
  291. break;
  292. case "exp-lock":
  293. player.xpLock = Boolean.parseBoolean(dataValue);
  294. break;
  295.  
  296. case "bounty-hunting":
  297. player.setBountyHunting(Boolean.parseBoolean(dataValue));
  298. break;
  299.  
  300. case "skull-timer":
  301. player.setSkullTimer(Integer.parseInt(dataValue));
  302. break;
  303. case "special-energy":
  304. player.getSpecBar().setAmount(Integer.parseInt(dataValue));
  305. break;
  306.  
  307. case "slayer-task":
  308. player.slayerTask = Integer.parseInt(dataValue);
  309. break;
  310.  
  311. case "slayer-amount":
  312. player.slayerAm = Integer.parseInt(dataValue);
  313. break;
  314.  
  315. case "pk-status":
  316. player.setStatus(PkStatus.valueOf(dataValue));
  317. break;
  318. case "magic-book":
  319. player.getSpellBook().changeSpellBook(Integer.parseInt(dataValue));
  320. break;
  321.  
  322. case "prayer-book":
  323. player.getPrayers().setPrayerbook(Boolean.parseBoolean(dataValue));
  324. break;
  325.  
  326. case "last-voted":
  327. player.setLastVoted(Long.parseLong(dataValue));
  328. break;
  329.  
  330. case "new-character":
  331. player.newCharacter = Boolean.parseBoolean(dataValue);
  332. break;
  333. }
  334. break;
  335.  
  336. case PLAYER_APPEARANCE:
  337. if (key.equals("character-look")) {
  338. player.getAppearance().getLook()[Integer.parseInt(dataValues[0])] = Integer.parseInt(dataValues[1]);
  339. }
  340. break;
  341.  
  342. case PLAYER_SKILLS:
  343. if (key.equals("character-skill")) {
  344. final int level = Integer.parseInt(dataValues[1]);
  345. double experience = Double.parseDouble(dataValues[2]);
  346.  
  347. if (experience < 0) {
  348. experience = 0;
  349. } else if (experience > 200000000) {
  350. experience = 200000000;
  351. }
  352. player.getSkills().setLevel(Integer.parseInt(dataValues[0]), level);
  353. player.getSkills().setExperience(Integer.parseInt(dataValues[0]), (int) experience);
  354. }
  355. break;
  356.  
  357. case PLAYER_INVENTORY:
  358. if (key.equals("inventory-slot")) {
  359. int index = Integer.parseInt(dataValues[0]);
  360. int id = Integer.parseInt(dataValues[1]);
  361. int amount = Integer.parseInt(dataValues[2]);
  362. player.getInventory().add(new Item(id, amount), index);
  363. }
  364. break;
  365.  
  366. case PLAYER_EQUIPMENT:
  367. if (key.equals("equip-slot")) {
  368. int index = Integer.parseInt(dataValues[0]);
  369. int item = Integer.parseInt(dataValues[1]);
  370. int amount = Integer.parseInt(dataValues[2]);
  371. player.getEquipment().set(index, new Item(item, amount));
  372. }
  373. break;
  374.  
  375. case PLAYER_BANK:
  376. if (key.equals("bank-slot")) {
  377. int index = Integer.parseInt(dataValues[0]);
  378. int id = Integer.parseInt(dataValues[1]);
  379. int amount = Integer.parseInt(dataValues[2]);
  380. player.getBank().add(new Item(id, amount), index);
  381. }
  382. break;
  383.  
  384. case PLAYER_CUSTOM_EQUIPMENT:
  385. if (key.equals("custom-equip-slot")) {
  386. int index = Integer.parseInt(dataValues[0]);
  387. int id = Integer.parseInt(dataValues[1]);
  388. int amount = Integer.parseInt(dataValues[2]);
  389. player.getCustomEquipment().add(new Item(id, amount), index);
  390. }
  391. break;
  392.  
  393. case PLAYER_FRIENDS:
  394. if (key.equals("character-friend")) {
  395. player.getFriends().toArray()[Integer.parseInt(dataValues[0])] = Long.parseLong(dataValues[1]);
  396. }
  397. break;
  398.  
  399. }
  400. } else {
  401. if (line.equals("PLAYER_DETAILS")) {
  402. mode = PLAYER_DETAILS;
  403. } else if (line.equals("PLAYER_POINTS")) {
  404. mode = PLAYER_POINTS;
  405. } else if (line.equals("PLAYER_MISC")) {
  406. mode = PLAYER_MISC;
  407. } else if (line.equals("PLAYER_EQUIPMENT")) {
  408. mode = PLAYER_EQUIPMENT;
  409. } else if (line.equals("PLAYER_APPEARANCE")) {
  410. mode = PLAYER_APPEARANCE;
  411. } else if (line.equals("PLAYER_SKILLS")) {
  412. mode = PLAYER_SKILLS;
  413. } else if (line.equals("PLAYER_INVENTORY")) {
  414. mode = PLAYER_INVENTORY;
  415. } else if (line.equals("PLAYER_BANK")) {
  416. mode = PLAYER_BANK;
  417. } else if (line.equals("CUSTOM_EQUIPMENT")) {
  418. mode = PLAYER_CUSTOM_EQUIPMENT;
  419. } else if (line.equals("FRIENDS")) {
  420. mode = PLAYER_FRIENDS;
  421. }else if (line.equals("[EOF]")) {
  422. try {
  423. reader.close();
  424. return true;
  425. } catch (IOException ignored) {
  426. }
  427. }
  428. }
  429. }
  430. } catch (IOException e) {
  431. e.printStackTrace();
  432. }
  433. return true;
  434. }
  435.  
  436.  
  437. /**
  438. * @param player
  439. * @param message
  440. */
  441. public void save(Player player, String message)
  442. {
  443. if (player.getRights().superiorTo(PlayerRights.ADMINISTRATOR))
  444. {
  445. player.getActionSender().sendMessage(message);
  446. }
  447.  
  448. save(player);
  449. }
  450.  
  451. /**
  452. * Saves the player's data to his character file.
  453. *
  454. * @param player
  455. * @return true if successful, false if not
  456. */
  457. public boolean save(Player player)
  458. {
  459. // try (BufferedWriter out = new BufferedWriter(new FileWriter(getCharFile(player)), BUFFER_SIZE))
  460. // {
  461. // for (SaveObject so : saveList)
  462. // {
  463. // boolean saved = so.save(player, out);
  464. //
  465. // if (saved)
  466. // {
  467. // out.newLine();
  468. // }
  469. // }
  470. //
  471. // return true;
  472. // }
  473. // catch (IOException ex)
  474. // {
  475. // System.out.println("Player's name: " + player.getName());
  476. // ex.printStackTrace();
  477. // return false;
  478. // }
  479. saveGame(player);
  480. return true;
  481. }
  482.  
  483.  
  484.  
  485. public void saveLog(final String file, LinkedList<String> lines)
  486. {
  487. saveLog(new File(file), lines);
  488. }
  489.  
  490. /**
  491. * Saves a line to the specified log file.
  492. *
  493. * @param file
  494. * @param line
  495. */
  496. public void saveLog(final File file, List<String> lines)
  497. {
  498. String[] stringArray = new String[lines.size()];
  499. int idx = 0;
  500.  
  501. for (String line : lines)
  502. {
  503. stringArray[idx++] = line;
  504. }
  505.  
  506. saveLog(file, stringArray);
  507. }
  508.  
  509. /**
  510. * Saves a line to the specified log file.
  511. *
  512. * @param file
  513. * @param line
  514. */
  515. public void saveLog(final String file, final String... lines)
  516. {
  517. saveLog(new File(file), lines);
  518. }
  519.  
  520. public void saveLog(final File file, final String... lines)
  521. {
  522. Runnable runnable = () -> TextUtils.writeToFile(file, lines);
  523. saveThread.submit(runnable);
  524. }
  525.  
  526. /**
  527. * Executes the runnable on the save thread.
  528. *
  529. * @param runnable
  530. */
  531. public void submit(Runnable runnable)
  532. {
  533. saveThread.submit(runnable);
  534. }
  535.  
  536. /**
  537. * Gets the character file for specified player.
  538. *
  539. * @param username The player username.
  540. * @returns The players save file.
  541. */
  542. public static File getCharFile(String username)
  543. {
  544. return new File(CHARACTER_FILE_DIRECTORY + File.separator + username.charAt(0) + "/", username + ".txt");
  545. }
  546.  
  547. /**
  548. * Gets the character file for specified player.
  549. *
  550. * @param player The player.
  551. * @returns The players save file.
  552. */
  553. public static File getCharFile(Player player)
  554. {
  555. String username = player.getName();
  556. return getCharFile(username);
  557. }
  558.  
  559. /**
  560. * Gets the PlayerSaving singleton.
  561. */
  562. public static PlayerSaving getSaving()
  563. {
  564. return singleton;
  565. }
  566.  
  567. static
  568. {
  569. CommandHandler.submit(new Command("create", PlayerRights.OWNER)
  570. {
  571.  
  572. @Override
  573. public boolean execute(Player player, String input) throws Exception
  574. {
  575. System.out.println("Creating!");
  576. PlayerSaving.getSaving().save(player);
  577. return false;
  578. }
  579.  
  580. });
  581. }
  582.  
  583. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement