Guest User

Untitled

a guest
Sep 10th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 75.72 KB | None | 0 0
  1. #region
  2.  
  3. using db;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Xml.Linq;
  8. using db.data;
  9. using Ionic.Zlib;
  10. using MySql.Data.MySqlClient;
  11. using System.IO;
  12. using System.Text;
  13. using System.Text.RegularExpressions;
  14. using log4net;
  15.  
  16. #endregion
  17.  
  18. namespace db
  19. {
  20. public partial class Database : IDisposable
  21. {
  22. private static readonly List<string> emails = new List<string>();
  23. private static readonly string[] Names =
  24. {
  25. "Unnamed"
  26. };
  27.  
  28. private static string _host, _databaseName, _user, _password;
  29. private readonly MySqlConnection _con;
  30. public MySqlConnection Connection { get { return _con; } }
  31.  
  32. private static readonly ILog log = LogManager.GetLogger(typeof(Database));
  33.  
  34. public Database(string host, string database, string user, string password)
  35. {
  36. _host = host;
  37. _databaseName = database;
  38. _user = user;
  39. _password = password;
  40.  
  41. _con = new MySqlConnection(
  42. String.Format("Server={0};Database={1};uid={2};password={3};convert zero datetime=True;",
  43. host, database ?? "rotmgprod", user ?? "root", password ?? ""));
  44. _con.Open();
  45.  
  46. if (File.Exists("UnlockedAccounts.txt"))
  47. {
  48. using (StreamReader rdr = new StreamReader("UnlockedAccounts.txt"))
  49. {
  50. string s;
  51. do
  52. {
  53. s = rdr.ReadLine();
  54. if (s != null && !s.StartsWith("#"))
  55. if (!emails.Contains(s))
  56. emails.Add(s);
  57. } while (s != null);
  58. }
  59. }
  60. }
  61.  
  62. public Database()
  63. {
  64. _con = new MySqlConnection(
  65. String.Format("Server={0};Database={1};uid={2};password={3};convert zero datetime=True;",
  66. _host, _databaseName, _user, _password));
  67. _con.Open();
  68. }
  69.  
  70. public void Dispose()
  71. {
  72. Dispose(true);
  73. }
  74.  
  75. public void Dispose(bool disposing)
  76. {
  77. if (disposing)
  78. {
  79. if (_con.State == System.Data.ConnectionState.Open)
  80. {
  81. _con.Close();
  82. _con.Dispose();
  83. }
  84. }
  85. //GC.SuppressFinalize(this);//Updated
  86. }
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94. public void AddIp(string ip)
  95. {
  96. MySqlCommand cmd = CreateQuery();
  97. cmd.CommandText = "SELECT COUNT(num) FROM ips WHERE ip=@ip;";
  98. cmd.Parameters.AddWithValue("@ip", ip);
  99. if ((int)(long)cmd.ExecuteScalar() > 0)
  100. {
  101.  
  102. }
  103. else
  104. {
  105. cmd = CreateQuery();
  106. cmd.CommandText = "INSERT INTO ips(ip, banned) VALUES(@ip, 0);";
  107. cmd.Parameters.AddWithValue("@ip", ip);
  108. cmd.ExecuteNonQuery();
  109. }
  110. }
  111. public void UpdateIp(string ip, string accId)
  112. {
  113. MySqlCommand cmd = CreateQuery();
  114. cmd.CommandText = "UPDATE accounts SET lastip=@lastIp WHERE id=@accId;";
  115. cmd.Parameters.AddWithValue("@accId", accId);
  116. cmd.Parameters.AddWithValue("@lastIp", ip);
  117. cmd.ExecuteNonQuery();
  118. }
  119. public Boolean IpExists(string ip)
  120. {
  121. MySqlCommand cmd = CreateQuery();
  122. cmd.CommandText = "SELECT COUNT(num) FROM ips WHERE ip=@ip;";
  123. cmd.Parameters.AddWithValue("@ip", ip);
  124. if ((int)(long)cmd.ExecuteScalar() > 0)
  125. {
  126. return true;
  127. }
  128. else
  129. {
  130. return false;
  131. }
  132. }
  133. public Boolean IsIpBanned(string ip)
  134. {
  135. MySqlCommand cmd = CreateQuery();
  136. cmd.CommandText =
  137. "SELECT banned FROM ips WHERE ip=@ip;";
  138. cmd.Parameters.AddWithValue("@ip", ip);
  139. int IpBanned;
  140. object obj = cmd.ExecuteScalar();
  141. if (obj != null && obj != DBNull.Value)
  142. {
  143. IpBanned = Convert.ToInt32(obj);
  144. if (IpBanned == 1)
  145. return true;
  146. else
  147. return false;
  148. }
  149. return false;
  150. }
  151. public void IpBan(string ip)
  152. {
  153. MySqlCommand cmd = CreateQuery();
  154. cmd.CommandText = "UPDATE ips SET banned=1 WHERE ip=@ip;";
  155. cmd.Parameters.AddWithValue("@ip", ip);
  156. cmd.ExecuteNonQuery();
  157. }
  158.  
  159.  
  160.  
  161. #region Market
  162. public List<string> MarketFindItem(string itemName = "", int id = -1, bool all = false)
  163. {
  164. var ret = new List<string>();
  165. if (itemName != "")
  166. {
  167. MySqlCommand cmd = CreateQuery();
  168. cmd.CommandText = $"SELECT * FROM market WHERE itemname LIKE '%{itemName}%';";
  169. using (MySqlDataReader rdr = cmd.ExecuteReader())
  170. {
  171. while (rdr.Read())
  172. {
  173. try
  174. {
  175. rdr.GetString("buyer");
  176. }
  177. catch (Exception exc)
  178. {
  179. ret.Add($"{rdr.GetInt32("id")},{rdr.GetString("itemname")},{rdr.GetString("seller")},{rdr.GetInt32("fame")},{rdr.GetString("price")}");
  180. }
  181. }
  182. }
  183. }
  184. else if (id != -1)
  185. {
  186. MySqlCommand cmd = CreateQuery();
  187. cmd.CommandText = "SELECT * FROM market WHERE id=@id;";
  188. cmd.Parameters.AddWithValue("@id", id);
  189. using (MySqlDataReader rdr = cmd.ExecuteReader())
  190. {
  191. while (rdr.Read())
  192. {
  193. try
  194. {
  195. rdr.GetString("buyer");
  196. }
  197. catch (Exception exc)
  198. {
  199. ret.Add($"{rdr.GetString("itemname")},{rdr.GetString("seller")},{rdr.GetInt32("fame")},{rdr.GetString("price")}");
  200. }
  201. }
  202. }
  203. }
  204. else if (all)
  205. {
  206. MySqlCommand cmd = CreateQuery();
  207. cmd.CommandText = $"SELECT * FROM market;";
  208. using (MySqlDataReader rdr = cmd.ExecuteReader())
  209. {
  210. while (rdr.Read())
  211. {
  212. try
  213. {
  214. rdr.GetString("buyer");
  215. }
  216. catch (Exception exc)
  217. {
  218. ret.Add($"{rdr.GetInt32("id")},{rdr.GetString("itemname")},{rdr.GetString("seller")},{rdr.GetInt32("fame")},{rdr.GetString("price")}");
  219. }
  220. }
  221. }
  222. }
  223. return ret;
  224. }
  225.  
  226. public void MarketAddItem(string itemName, string seller, bool fameOrItem, string price)
  227. {
  228. MySqlCommand cmd = CreateQuery();
  229. cmd.CommandText = "INSERT INTO market(itemname, seller, fame, price) VALUES(@itemname, @seller, @fame, @price);";
  230. cmd.Parameters.AddWithValue("@itemname", itemName);
  231. cmd.Parameters.AddWithValue("@seller", seller);
  232. if (fameOrItem)
  233. cmd.Parameters.AddWithValue("@fame", 1);
  234. else
  235. cmd.Parameters.AddWithValue("@fame", 0);
  236. cmd.Parameters.AddWithValue("@price", price);
  237. cmd.ExecuteNonQuery();
  238. }
  239.  
  240. public bool MarketSoldItem(int id, string buyer)
  241. {
  242. MySqlCommand cmd = CreateQuery();
  243. cmd.CommandText = "UPDATE market SET buyer=@buyer WHERE id=@id;";
  244. cmd.Parameters.AddWithValue("@id", id);
  245. cmd.Parameters.AddWithValue("@buyer", buyer);
  246. cmd.ExecuteNonQuery();
  247. return false;
  248. }
  249.  
  250. public Dictionary<Tuple<int, string>, Tuple<bool,string>> MarketClaim(string seller)
  251. {
  252. var ret = new Dictionary<Tuple<int,string>,Tuple<bool,string>>();
  253. MySqlCommand cmd = CreateQuery();
  254. cmd.CommandText = "SELECT buyer,hasrewarded,fame,price,itemname,id FROM market WHERE seller=@seller;";
  255. cmd.Parameters.AddWithValue("@seller", seller);
  256. using (MySqlDataReader rdr = cmd.ExecuteReader())
  257. {
  258. while (rdr.Read())
  259. {
  260. try
  261. {
  262. rdr.GetString("buyer");
  263. if (rdr.GetInt32("hasrewarded") == 0)
  264. {
  265. var isFame = rdr.GetInt32("fame") == 1 ? true : false;
  266. var price = rdr.GetString("price");
  267. var id = rdr.GetInt32("id");
  268. var name = rdr.GetString("itemname");
  269. ret.Add(new Tuple<int,string>(id,name), new Tuple<bool,string>(isFame, price));
  270. }
  271. }
  272. catch (Exception exc) { }
  273. }
  274. }
  275. foreach(var i in ret)
  276. {
  277. cmd = CreateQuery();
  278. cmd.CommandText = "UPDATE market SET hasrewarded=1 WHERE id=@id;";
  279. cmd.Parameters.AddWithValue("@id", i.Key.Item1);
  280. cmd.ExecuteNonQuery();
  281. }
  282. return ret;
  283. }
  284. #endregion
  285.  
  286.  
  287.  
  288. public List<Tuple<int,int,bool,bool>> CharacterQuestGet(int charId)
  289. {
  290. var ret = new List<Tuple<int,int,bool,bool>>();
  291. MySqlCommand cmd = CreateQuery();
  292. cmd.CommandText = "SELECT * FROM quests WHERE charid=@charid;";
  293. cmd.Parameters.AddWithValue("@charid", charId);
  294. using (MySqlDataReader rdr = cmd.ExecuteReader())
  295. {
  296. while (rdr.Read())
  297. {
  298. var newTuple = new Tuple<int, int, bool, bool>(
  299. rdr.GetInt32("questid"),
  300. rdr.GetInt32("progress"),
  301. rdr.GetInt32("completed") == 1 ? true : false,
  302. rdr.GetInt32("rewarded") == 1 ? true : false
  303. );
  304. ret.Add(newTuple);
  305. }
  306. }
  307. return ret;
  308. }
  309.  
  310. public void CharacterQuestSave(int charId ,List<Tuple<int,int,bool,bool>> quests)
  311. {
  312. var charGetQuests = CharacterQuestGet(charId);
  313. MySqlCommand cmd = null;
  314. foreach (var i in quests)
  315. {
  316. var foundQuest = false;
  317. log.Info($"Database Test");
  318. foreach(var j in charGetQuests)
  319. {
  320. //log.Info($"Database test, id1:{i.Item1} id2:{j.Item1} progress1:{i.Item2} completed:{i.Item3} rewarded:{i.Item4} count1: {quests.Count} count2:{charGetQuests.Count}");
  321. if (i.Item1 == j.Item1)
  322. {
  323. cmd = CreateQuery();
  324. cmd.CommandText = "UPDATE quests SET progress=@progress,completed=@completed,rewarded=@rewarded WHERE charid=@charid AND questid=@questid;";
  325. cmd.Parameters.AddWithValue("@progress", i.Item2);
  326. cmd.Parameters.AddWithValue("@completed", i.Item3 == true ? 1 : 0);
  327. cmd.Parameters.AddWithValue("@rewarded", i.Item4 == true ? 1 : 0);
  328. cmd.Parameters.AddWithValue("@charid", charId);
  329. cmd.Parameters.AddWithValue("@questid", i.Item1);
  330. cmd.ExecuteNonQuery();
  331. cmd.Dispose();
  332. foundQuest = true;
  333. break;
  334. }
  335. }
  336. if (!foundQuest)
  337. {
  338. cmd = CreateQuery();
  339. cmd.CommandText = "INSERT INTO quests(charid, questid, progress, completed, rewarded) VALUES(@charid, @questid, @progress, @completed, @rewarded);";
  340. cmd.Parameters.AddWithValue("@charid", charId);
  341. cmd.Parameters.AddWithValue("@questid", i.Item1);
  342. cmd.Parameters.AddWithValue("@progress", i.Item2);
  343. cmd.Parameters.AddWithValue("@completed", i.Item3 == true ? 1 : 0);
  344. cmd.Parameters.AddWithValue("@rewarded", i.Item4 == true ? 1 : 0);
  345. cmd.ExecuteNonQuery();
  346. cmd.Dispose();
  347. }
  348. }
  349. }
  350.  
  351.  
  352. private static string UppercaseFirst(string s)
  353. {
  354. if (string.IsNullOrEmpty(s))
  355. {
  356. return string.Empty;
  357. }
  358. return char.ToUpper(s[0]) + s.Substring(1);
  359. }
  360.  
  361. public MySqlCommand CreateQuery()
  362. {
  363. return _con.CreateCommand();
  364. }
  365.  
  366. public static int DateTimeToUnixTimestamp(DateTime dateTime)
  367. {
  368. return (int)(dateTime - new DateTime(1970, 1, 1).ToLocalTime()).TotalSeconds;
  369. }
  370.  
  371. public List<NewsItem> GetNews(XmlData data, Account acc)
  372. {
  373. MySqlCommand cmd = CreateQuery();
  374. cmd.CommandText = "SELECT icon, title, text, link, date FROM news ORDER BY date LIMIT 10;";
  375. List<NewsItem> ret = new List<NewsItem>();
  376. using (MySqlDataReader rdr = cmd.ExecuteReader())
  377. {
  378. while (rdr.Read())
  379. ret.Add(new NewsItem
  380. {
  381. Icon = rdr.GetString("icon"),
  382. Title = rdr.GetString("title"),
  383. TagLine = rdr.GetString("text"),
  384. Link = rdr.GetString("link"),
  385. Date = DateTimeToUnixTimestamp(rdr.GetDateTime("date")),
  386. });
  387. }
  388. if (acc != null)
  389. {
  390. cmd.CommandText = @"SELECT charId, characters.charType, level, death.totalFame, time
  391. FROM characters, death
  392. WHERE dead = TRUE AND
  393. characters.accId=@accId AND death.accId=@accId
  394. AND characters.charId=death.chrId;";
  395. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  396. using (MySqlDataReader rdr = cmd.ExecuteReader())
  397. {
  398. while (rdr.Read())
  399. ret.Add(new NewsItem
  400. {
  401. Icon = "fame",
  402. Title = string.Format("Your {0} died at level {1}",
  403. data.ObjectTypeToId[(ushort)rdr.GetInt32("charType")],
  404. rdr.GetInt32("level")),
  405. TagLine = string.Format("You earned {0} glorious Fame",
  406. rdr.GetInt32("totalFame")),
  407. Link = "fame:" + rdr.GetInt32("charId"),
  408. Date = DateTimeToUnixTimestamp(rdr.GetDateTime("time")),
  409. });
  410. }
  411. }
  412. ret.Sort((a, b) => -Comparer<int>.Default.Compare(a.Date, b.Date));
  413. return ret.Take(10).ToList();
  414. }
  415.  
  416. public static Account CreateGuestAccount(string uuid)
  417. {
  418. return new Account
  419. {
  420. Name = Names[(uint)uuid.GetHashCode() % Names.Length],
  421. AccountId = "0",
  422. Admin = false,
  423. Banned = false,
  424. Rank = 0,
  425. BeginnerPackageTimeLeft = 0,
  426. Converted = false,
  427. Credits = 0,
  428. PetYardType = 1,
  429. Guild = new Guild
  430. {
  431. Name = "",
  432. Id = 0,
  433. Rank = 0
  434. },
  435. NameChosen = false,
  436. NextCharSlotPrice = 2000,
  437. VerifiedEmail = false,
  438. Stats = new Stats
  439. {
  440. BestCharFame = 0,
  441. ClassStates = new List<ClassStats>(),
  442. Fame = 0,
  443. TotalFame = 0
  444. },
  445. Vault = new VaultData
  446. {
  447. Chests = new List<VaultChest>()
  448. },
  449. Gifts = new List<int>(),
  450. OwnedSkins = new List<int>(),
  451. IsGuestAccount = true
  452. };
  453. }
  454.  
  455. public Account Verify(string uuid, string password, XmlData data)
  456. {
  457. var cmd = CreateQuery();
  458. cmd.CommandText = "SELECT * FROM accounts WHERE uuid=@uuid AND password=SHA1(@password);";
  459. cmd.Parameters.AddWithValue("@uuid", uuid);
  460. cmd.Parameters.AddWithValue("@password", password);
  461. string accId = String.Empty;
  462. using (MySqlDataReader rdr = cmd.ExecuteReader())
  463. {
  464. if (!rdr.HasRows) return null;
  465. rdr.Read();
  466. accId = rdr.GetString("id");
  467. }
  468. return GetAccount(accId, data);
  469. }
  470.  
  471. public QuestItem GetDailyQuest(string accId, XmlData data)
  472. {
  473. var cmd = CreateQuery();
  474. cmd.CommandText = "SELECT * FROM dailyQuests WHERE accId=@id;";
  475. cmd.Parameters.AddWithValue("@id", accId);
  476. QuestItem quest = null;
  477. using (var rdr = cmd.ExecuteReader())
  478. {
  479. while (rdr.Read())
  480. {
  481. int[] goals = Utils.FromCommaSepString32(rdr.GetString("goals"));
  482. if (goals.Length < DailyQuestConstants.QuestsPerDay) break;
  483. quest = new QuestItem
  484. {
  485. Description = DailyQuestConstants.GetDescriptionByTier(rdr.GetInt32("tier")),
  486. Image = DailyQuestConstants.GetImageByTier(rdr.GetInt32("tier")),
  487. Goal = goals[rdr.GetInt32("tier") < 0 ? 0 : rdr.GetInt32("tier") - 1].ToString(),
  488. Tier = rdr.GetInt32("tier"),
  489. Time = rdr.GetDateTime("time")
  490. };
  491. }
  492. }
  493.  
  494. DateTime converted;
  495. if (TimeZoneInfo.Local.Id != TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time").Id)
  496. converted = TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
  497. else
  498. converted = DateTime.Now;
  499.  
  500. var fixedTime = new DateTime(converted.Year, converted.Month, converted.Day, 17, 0, 0, 0, DateTimeKind.Unspecified);
  501.  
  502. if (quest == null || ((converted.Hour >= 17 && converted.Day - 1 == quest.Time.Day) || quest.Time.AddDays(1) <= converted))
  503. quest = GenerateDailyQuest(accId, data, fixedTime);
  504. return quest;
  505. }
  506.  
  507. public bool IsMuted(string accId)
  508. {
  509. MySqlCommand cmd = CreateQuery();
  510. cmd.CommandText = "SELECT muted FROM accounts WHERE id=@accId";
  511. cmd.Parameters.AddWithValue("@accId", accId);
  512. if ((int)cmd.ExecuteNonQuery() == 1) return true;
  513. return false;
  514. }
  515.  
  516. public void MuteAccount(string accId)
  517. {
  518. MySqlCommand cmd = CreateQuery();
  519. cmd.CommandText = "UPDATE accounts SET muted=1 WHERE id=@accId";
  520. cmd.Parameters.AddWithValue("@accId", accId);
  521. cmd.ExecuteNonQuery();
  522.  
  523. }
  524. public void UnmuteAccount(string accId)
  525. {
  526. MySqlCommand cmd = CreateQuery();
  527. cmd.CommandText = "UPDATE accounts SET muted=0 WHERE id=@accId";
  528. cmd.Parameters.AddWithValue("@accId", accId);
  529. cmd.ExecuteNonQuery();
  530. }
  531.  
  532. public Account Register(string uuid, string password, bool isGuest, XmlData data)
  533. {
  534. MySqlCommand cmd = CreateQuery();
  535. cmd.CommandText = "SELECT COUNT(id) FROM accounts WHERE uuid=@uuid;";
  536. cmd.Parameters.AddWithValue("@uuid", uuid);
  537. if ((int)(long)cmd.ExecuteScalar() > 0) return null;
  538.  
  539. cmd = CreateQuery();
  540. cmd.CommandText =
  541. "INSERT INTO accounts(uuid, password, name, rank, namechosen, verified, guild, guildRank, guildFame, vaultCount, maxCharSlot, regTime, guest, banned, locked, ignored, gifts, isAgeVerified, authToken) VALUES(@uuid, SHA1(@password), @randomName, @rank, 0, 0, 0, 0, 0, 1, 2, @regTime, @guest, 0, @empty, @empty, @empty, 1, @authToken);";
  542. cmd.Parameters.AddWithValue("@uuid", uuid);
  543. cmd.Parameters.AddWithValue("@randomName", Names[new Random().Next(0, Names.Length)]);
  544. cmd.Parameters.AddWithValue("@password", password);
  545. cmd.Parameters.AddWithValue("@name", Names[(uint)uuid.GetHashCode() % Names.Length]);
  546. cmd.Parameters.AddWithValue("@guest", isGuest);
  547. cmd.Parameters.AddWithValue("@regTime", DateTime.Now);
  548. cmd.Parameters.AddWithValue("@authToken", GenerateRandomString(128));
  549. cmd.Parameters.AddWithValue("@empty", "");
  550.  
  551. if (emails.Contains(uuid))
  552. cmd.Parameters.AddWithValue("@rank", 1);
  553. else
  554. cmd.Parameters.AddWithValue("@rank", 0);
  555.  
  556. var success = cmd.ExecuteNonQuery() > 0;
  557. var accId = cmd.LastInsertedId;
  558.  
  559. if (success)
  560. {
  561. cmd = CreateQuery();
  562. cmd.CommandText =
  563. "INSERT INTO stats(accId, fame, totalFame, credits, totalCredits) VALUES(@accId, 0, 0, 0, 0);";
  564. cmd.Parameters.AddWithValue("@accId", accId);
  565. cmd.ExecuteNonQuery();
  566.  
  567. cmd = CreateQuery();
  568. cmd.CommandText = "INSERT INTO vaults(accId, items) VALUES(@accId, '-1, -1, -1, -1, -1, -1, -1, -1');";
  569. cmd.Parameters.AddWithValue("@accId", accId);
  570. cmd.ExecuteNonQuery();
  571. }
  572. return Verify(uuid, password, data);
  573. }
  574.  
  575. public QuestItem GenerateDailyQuest(string accId, XmlData data, DateTime pst5pm)
  576. {
  577. if (accId == "0") return null;
  578. Random rand = new Random();
  579. List<int> items = new List<int>(DailyQuestConstants.QuestsPerDay);
  580.  
  581. List<Item> candidates = data.Items.Where(_ =>
  582. _.Value.SlotType == 1 || _.Value.SlotType == 2 ||
  583. _.Value.SlotType == 3 || _.Value.SlotType == 6 ||
  584. _.Value.SlotType == 7 || _.Value.SlotType == 8 ||
  585. _.Value.SlotType == 14 || _.Value.SlotType == 17 ||
  586. _.Value.SlotType == 24).Where(_ =>
  587. _.Value.Tier == 6 || _.Value.Tier == 7 ||
  588. _.Value.Tier == 8 || _.Value.Tier == 9 ||
  589. _.Value.Tier == 10).Select(_ => _.Value).ToList();
  590. candidates.AddRange(data.Items.Where(_ =>
  591. _.Value.SlotType == 4 || _.Value.SlotType == 5 ||
  592. _.Value.SlotType == 11 || _.Value.SlotType == 12 ||
  593. _.Value.SlotType == 13 || _.Value.SlotType == 15 ||
  594. _.Value.SlotType == 16 || _.Value.SlotType == 18 ||
  595. _.Value.SlotType == 19 || _.Value.SlotType == 20 ||
  596. _.Value.SlotType == 21 || _.Value.SlotType == 22 ||
  597. _.Value.SlotType == 23 || _.Value.SlotType == 25)
  598. .Where(_ => _.Value.Tier == 3 || _.Value.Tier == 4).Select(_ => _.Value));
  599.  
  600. do
  601. {
  602. int r = -1;
  603. int item = candidates[(r = rand.Next(candidates.Count))].ObjectType;
  604. while (items.Contains(item)) item = candidates[(r = rand.Next(candidates.Count))].ObjectType;
  605. items.Add(item);
  606. }
  607. while (items.Count < DailyQuestConstants.QuestsPerDay);
  608.  
  609. var cmd = CreateQuery();
  610. cmd.CommandText = "INSERT INTO dailyQuests(accId, goals, tier, time) VALUES(@accId, @goals, @tier, @time) ON DUPLICATE KEY UPDATE accId=@accId, goals=@goals, tier=@tier, time=@time;";
  611. cmd.Parameters.AddWithValue("@tier", 1);
  612. cmd.Parameters.AddWithValue("@accId", accId);
  613. cmd.Parameters.AddWithValue("@goals", Utils.GetCommaSepString(items.ToArray()));
  614. cmd.Parameters.AddWithValue("@time", pst5pm.ToString("yyyy-MM-dd HH:mm:ss"));
  615. cmd.ExecuteNonQuery();
  616. return GetDailyQuest(accId, data);
  617. }
  618.  
  619. public static string GenerateRandomString(int size, Random rand = null)
  620. {
  621. var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  622. var builder = new StringBuilder();
  623. var random = rand ?? new Random();
  624. char ch;
  625. for (var i = 0; i < size; i++)
  626. {
  627. ch = chars[random.Next(0, chars.Length - 1)];
  628. builder.Append(ch);
  629. }
  630. return builder.ToString();
  631. }
  632.  
  633. public bool HasUuid(string uuid)
  634. {
  635. MySqlCommand cmd = CreateQuery();
  636. cmd.CommandText = "SELECT COUNT(id) FROM accounts WHERE uuid=@uuid;";
  637. cmd.Parameters.AddWithValue("@uuid", uuid);
  638. return (int)(long)cmd.ExecuteScalar() > 0;
  639. }
  640.  
  641. public Account GetAccountByName(string name, XmlData data)
  642. {
  643. MySqlCommand cmd = CreateQuery();
  644. cmd.CommandText =
  645. "SELECT * FROM accounts WHERE name=@name;";
  646. cmd.Parameters.AddWithValue("@name", name);
  647. string accId = String.Empty;
  648. using (MySqlDataReader rdr = cmd.ExecuteReader())
  649. {
  650. if (!rdr.HasRows) return null;
  651. rdr.Read();
  652. accId = rdr.GetString("id");
  653. }
  654. return GetAccount(accId, data);
  655. }
  656.  
  657. public Account GetAccount(string accId, XmlData data, string uuid = null, string password = null)
  658. {
  659. if (String.IsNullOrWhiteSpace(accId)) return CreateGuestAccount(accId ?? String.Empty);
  660. MySqlCommand cmd = CreateQuery();
  661. cmd.CommandText =
  662. "SELECT * FROM accounts WHERE id=@id;";
  663. cmd.Parameters.AddWithValue("@id", accId);
  664. Account ret;
  665. using (MySqlDataReader rdr = cmd.ExecuteReader())
  666. {
  667. if (!rdr.HasRows) return null;
  668. rdr.Read();
  669. ret = new Account
  670. {
  671. Name = rdr.GetString(UppercaseFirst("name")),
  672. AccountId = rdr.GetString("id"),
  673. Admin = rdr.GetInt32("rank") >= 4,
  674. Email = uuid ?? rdr.GetString("uuid"),
  675. Password = password ?? rdr.GetString("password"),
  676. VisibleMuledump = rdr.GetInt32("publicMuledump") == 1,
  677. Rank = rdr.GetInt32("rank"),
  678. Banned = rdr.GetBoolean("banned"),
  679. BeginnerPackageTimeLeft = 0,
  680. PetYardType = rdr.GetInt32("petYardType"),
  681. Converted = false,
  682. IsProdAccount = rdr.GetInt32("prodAcc") == 1,
  683. Guild = new Guild
  684. {
  685. Id = rdr.GetInt64("guild"),
  686. Rank = rdr.GetInt32("guildRank"),
  687. Fame = rdr.GetInt32("guildFame")
  688. },
  689. NameChosen = rdr.GetBoolean("namechosen"),
  690. NextCharSlotPrice = rdr.GetInt32("maxCharSlot") == 1 ? 300 : rdr.GetInt32("maxCharSlot") == 2 ? 400 : 500,
  691. VerifiedEmail = rdr.GetBoolean("verified"),
  692. Locked = rdr.GetString("locked").Split(',').ToList(),
  693. Ignored = rdr.GetString("ignored").Split(',').ToList(),
  694. _Gifts = rdr.GetString("gifts"),
  695. IsAgeVerified = rdr.GetString("isAgeVerified").ToLower() == "true" ? 1 : 0,
  696. AuthToken = rdr.GetString("authToken"),
  697. NotAcceptedNewTos = rdr.GetInt32("acceptedNewTos") == 1 ? null : String.Empty,
  698. OwnedSkins = Utils.FromCommaSepString32(rdr.GetString("ownedSkins")).ToList()
  699. };
  700. }
  701. ReadStats(ret);
  702. ReadGiftCodes(ret);
  703. ret.Guild.Name = GetGuildName(ret.Guild.Id);
  704. ret.DailyQuest = GetDailyQuest(ret.AccountId, data);
  705. return ret;
  706. }
  707.  
  708. public int UpdateCredit(Account acc, int amount)
  709. {
  710. MySqlCommand cmd = CreateQuery();
  711. if (amount > 0)
  712. {
  713. cmd.CommandText = "UPDATE stats SET totalCredits = totalCredits + @amount WHERE accId=@accId;";
  714. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  715. cmd.Parameters.AddWithValue("@amount", amount);
  716. cmd.ExecuteNonQuery();
  717. cmd = CreateQuery();
  718. }
  719. cmd.CommandText = @"UPDATE stats SET credits = credits + (@amount) WHERE accId=@accId;
  720. SELECT credits FROM stats WHERE accId=@accId;";
  721. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  722. cmd.Parameters.AddWithValue("@amount", amount);
  723. return (int)cmd.ExecuteScalar();
  724. }
  725.  
  726. public int UpdateFame(Account acc, int amount)
  727. {
  728. MySqlCommand cmd = CreateQuery();
  729. if (amount > 0)
  730. {
  731. cmd.CommandText = "UPDATE stats SET totalFame = totalFame + @amount WHERE accId=@accId;";
  732. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  733. cmd.Parameters.AddWithValue("@amount", amount);
  734. cmd.ExecuteNonQuery();
  735. cmd = CreateQuery();
  736. }
  737. cmd.CommandText = @"UPDATE stats SET fame = fame + (@amount) WHERE accId=@accId;
  738. SELECT fame FROM stats WHERE accId=@accId;";
  739. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  740. cmd.Parameters.AddWithValue("@amount", amount);
  741. return (int)cmd.ExecuteScalar();
  742. }
  743.  
  744. public int UpdateFortuneToken(Account acc, int amount)
  745. {
  746. MySqlCommand cmd = CreateQuery();
  747. if (amount > 0)
  748. {
  749. cmd.CommandText = "UPDATE stats SET totalFortuneTokens = totalFortuneTokens + @amount WHERE accId=@accId;";
  750. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  751. cmd.Parameters.AddWithValue("@amount", amount);
  752. cmd.ExecuteNonQuery();
  753. cmd = CreateQuery();
  754. }
  755. cmd.CommandText = @"UPDATE stats SET fortuneTokens = fortuneTokens + (@amount) WHERE accId=@accId;
  756. SELECT credits FROM stats WHERE accId=@accId;";
  757. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  758. cmd.Parameters.AddWithValue("@amount", amount);
  759. return (int)cmd.ExecuteScalar();
  760. }
  761.  
  762. public void ReadStats(Account acc)
  763. {
  764. MySqlCommand cmd = CreateQuery();
  765. cmd.CommandText = "SELECT * FROM stats WHERE accId=@accId;";
  766. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  767. using (MySqlDataReader rdr = cmd.ExecuteReader())
  768. {
  769. if (rdr.HasRows)
  770. {
  771. rdr.Read();
  772. acc.Credits = rdr.GetInt32("credits");
  773. acc.FortuneTokens = rdr.GetInt32("fortuneTokens");
  774. acc.Stats = new Stats
  775. {
  776. Fame = rdr.GetInt32("fame"),
  777. TotalFame = rdr.GetInt32("totalFame")
  778. };
  779. }
  780. else
  781. {
  782. acc.Credits = 0;
  783. acc.Stats = new Stats
  784. {
  785. Fame = 0,
  786. TotalFame = 0,
  787. BestCharFame = 0,
  788. ClassStates = new List<ClassStats>()
  789. };
  790. }
  791. }
  792.  
  793. acc.Stats.ClassStates = ReadClassStates(acc);
  794. if (acc.Stats.ClassStates.Count > 0)
  795. acc.Stats.BestCharFame = acc.Stats.ClassStates.Max(_ => _.BestFame);
  796. acc.Vault = ReadVault(acc);
  797. }
  798.  
  799. public void ReadGiftCodes(Account acc)
  800. {
  801. var cmd = CreateQuery();
  802. cmd.CommandText = "SELECT * FROM giftcodes WHERE accId=@accId;";
  803. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  804. acc.GiftCodes = new List<string>();
  805. using (var rdr = cmd.ExecuteReader())
  806. while (rdr.Read())
  807. acc.GiftCodes.Add(rdr.GetString("code"));
  808. }
  809.  
  810. public List<ClassStats> ReadClassStates(Account acc)
  811. {
  812. MySqlCommand cmd = CreateQuery();
  813. cmd.CommandText = "SELECT objType, bestLv, bestFame FROM classstats WHERE accId=@accId;";
  814. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  815. List<ClassStats> ret = new List<ClassStats>();
  816. using (MySqlDataReader rdr = cmd.ExecuteReader())
  817. {
  818. while (rdr.Read())
  819. ret.Add(new ClassStats
  820. {
  821. ObjectType = Utils.To2Hex((short)rdr.GetInt32("objType")),
  822. BestFame = rdr.GetInt32("bestFame"),
  823. BestLevel = rdr.GetInt32("bestLv")
  824. });
  825. }
  826. return ret;
  827. }
  828.  
  829. public VaultData ReadVault(Account acc)
  830. {
  831. MySqlCommand cmd = CreateQuery();
  832. cmd.CommandText = "SELECT chestId, items FROM vaults WHERE accId=@accId;";
  833. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  834. using (MySqlDataReader rdr = cmd.ExecuteReader())
  835. {
  836. if (rdr.HasRows)
  837. {
  838. VaultData ret = new VaultData { Chests = new List<VaultChest>() };
  839. while (rdr.Read())
  840. {
  841. ret.Chests.Add(new VaultChest
  842. {
  843. ChestId = rdr.GetInt32("chestId"),
  844. _Items = rdr.GetString("items")
  845. });
  846. }
  847. return ret;
  848. }
  849. return new VaultData
  850. {
  851. Chests = new List<VaultChest>()
  852. };
  853. }
  854. }
  855.  
  856. public void SaveChest(string accId, VaultChest chest)
  857. {
  858. MySqlCommand cmd = CreateQuery();
  859. cmd.CommandText = "UPDATE vaults SET items=@items WHERE accId=@accId AND chestId=@chestId;";
  860. cmd.Parameters.AddWithValue("@accId", accId);
  861. cmd.Parameters.AddWithValue("@chestId", chest.ChestId);
  862. cmd.Parameters.AddWithValue("@items", chest._Items);
  863. cmd.ExecuteNonQuery();
  864. }
  865.  
  866. public VaultChest CreateChest(Account acc)
  867. {
  868. MySqlCommand cmd = CreateQuery();
  869. cmd.CommandText = @"INSERT INTO vaults(accId, items) VALUES(@accId, '-1, -1, -1, -1, -1, -1, -1, -1');
  870. SELECT MAX(chestId) FROM vaults WHERE accId = @accId;";
  871. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  872. return new VaultChest
  873. {
  874. ChestId = (int)cmd.ExecuteScalar(),
  875. _Items = "-1, -1, -1, -1, -1, -1, -1, -1"
  876. };
  877. }
  878.  
  879. public void GetCharData(Account acc, Chars chrs)
  880. {
  881. MySqlCommand cmd = CreateQuery();
  882. cmd.CommandText = "SELECT IFNULL(MAX(charId), 0) + 1 FROM characters WHERE accId=@accId;";
  883. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  884. chrs.NextCharId = (int)(long)cmd.ExecuteScalar();
  885.  
  886. cmd = CreateQuery();
  887. cmd.CommandText = "SELECT maxCharSlot FROM accounts WHERE id=@accId;";
  888. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  889. chrs.MaxNumChars = (int)cmd.ExecuteScalar();
  890. }
  891.  
  892. public int GetNextCharId(Account acc)
  893. {
  894. MySqlCommand cmd = CreateQuery();
  895. cmd.CommandText = "SELECT IFNULL(MAX(charId), 0) + 1 FROM characters WHERE accId=@accId;";
  896. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  897. int ret = (int)(long)cmd.ExecuteScalar();
  898. return ret;
  899. }
  900.  
  901. public void LoadCharacters(Account acc, Chars chrs)
  902. {
  903. MySqlCommand cmd = CreateQuery();
  904. cmd.CommandText = "SELECT * FROM characters WHERE accId=@accId AND dead = FALSE;";
  905. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  906. using (MySqlDataReader rdr = cmd.ExecuteReader())
  907. {
  908. while (rdr.Read())
  909. {
  910. int[] stats = Utils.FromCommaSepString32(rdr.GetString("stats"));
  911. chrs.Characters.Add(new Char
  912. {
  913. ObjectType = (ushort)rdr.GetInt32("charType"),
  914. CharacterId = rdr.GetInt32("charId"),
  915. Level = rdr.GetInt32("level"),
  916. Exp = rdr.GetInt32("exp"),
  917. CurrentFame = rdr.GetInt32("fame"),
  918. _Equipment = rdr.GetString("items"),
  919. MaxHitPoints = stats[0],
  920. HitPoints = rdr.GetInt32("hp"),
  921. MaxMagicPoints = stats[1],
  922. MagicPoints = rdr.GetInt32("mp"),
  923. Attack = stats[2],
  924. Defense = stats[3],
  925. Speed = stats[4],
  926. Dexterity = stats[7],
  927. HpRegen = stats[5],
  928. MpRegen = stats[6],
  929. HealthStackCount = rdr.GetInt32("hpPotions"),
  930. MagicStackCount = rdr.GetInt32("mpPotions"),
  931. HasBackpack = rdr.GetInt32("hasBackpack"),
  932. Tex1 = rdr.GetInt32("tex1"),
  933. Tex2 = rdr.GetInt32("tex2"),
  934. Dead = false,
  935. PCStats = rdr.GetString("fameStats"),
  936. Pet = GetPet(rdr.GetInt32("petId"), acc),
  937. Skin = rdr.GetInt32("skin")
  938. });
  939. }
  940. }
  941. foreach (Char i in chrs.Characters)
  942. {
  943. if (i.HasBackpack == 1)
  944. i._Equipment += ", " + Utils.GetCommaSepString(GetBackpack(i, acc));
  945. }
  946. }
  947.  
  948. public PetItem GetPet(int petId, Account acc)
  949. {
  950. using (Database db = new Database())
  951. {
  952. MySqlCommand cmd = db.CreateQuery();
  953. cmd.CommandText = "SELECT * FROM pets WHERE petId=@petId AND accId=@accId";
  954. cmd.Parameters.AddWithValue("@petId", petId);
  955. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  956. using (MySqlDataReader rdr = cmd.ExecuteReader())
  957. {
  958. while (rdr.Read())
  959. {
  960. return new PetItem
  961. {
  962. Abilities = GetPetAbilities(rdr),
  963. Rarity = rdr.GetInt32("rarity"),
  964. MaxAbilityPower = rdr.GetInt32("maxLevel"),
  965. InstanceId = petId,
  966. SkinName = rdr.GetString("skinName"),
  967. Skin = rdr.GetInt32("skin"),
  968. Type = rdr.GetInt32("objType")
  969. };
  970. }
  971. }
  972. }
  973. return null;
  974. }
  975. public List<AbilityItem> GetPetAbilities(MySqlDataReader rdr)
  976. {
  977. List<AbilityItem> ret = new List<AbilityItem>();
  978. int lenght = rdr.GetString("levels").Split(',').Length;
  979. for (int i = 0; i < lenght; i++)
  980. {
  981. ret.Add(new AbilityItem
  982. {
  983. Points = Utils.FromString(rdr.GetString("xp").Split(',')[i]),
  984. Power = Utils.FromString(rdr.GetString("levels").Split(',')[i]),
  985. Type = Utils.FromString(rdr.GetString("abilities").Split(',')[i])
  986. });
  987. }
  988. return ret;
  989. }
  990.  
  991. public static Char CreateCharacter(XmlData data, ushort type, int chrId)
  992. {
  993. XElement cls = data.ObjectTypeToElement[type];
  994. if (cls == null) return null;
  995. Char ret = new Char
  996. {
  997. ObjectType = type,
  998. CharacterId = chrId,
  999. Level = 1,
  1000. Exp = 0,
  1001. CurrentFame = 0,
  1002. HasBackpack = 0,
  1003. _Equipment = cls.Element("Equipment").Value.Replace("0xa22", "-1"),
  1004. MaxHitPoints = int.Parse(cls.Element("MaxHitPoints").Value),
  1005. HitPoints = int.Parse(cls.Element("MaxHitPoints").Value),
  1006. MaxMagicPoints = int.Parse(cls.Element("MaxMagicPoints").Value),
  1007. MagicPoints = int.Parse(cls.Element("MaxMagicPoints").Value),
  1008. Attack = int.Parse(cls.Element("Attack").Value),
  1009. Defense = int.Parse(cls.Element("Defense").Value),
  1010. Speed = int.Parse(cls.Element("Speed").Value),
  1011. Dexterity = int.Parse(cls.Element("Dexterity").Value),
  1012. HpRegen = int.Parse(cls.Element("HpRegen").Value),
  1013. MpRegen = int.Parse(cls.Element("MpRegen").Value),
  1014. HealthStackCount = 1,
  1015. Tex1 = 0,
  1016. Tex2 = 0,
  1017. Dead = false,
  1018. PCStats = "",
  1019. FameStats = new FameStats(),
  1020. Pet = null,
  1021. Skin = 0
  1022. };
  1023. return ret;
  1024. }
  1025.  
  1026. public string GetEmail(string uuid, string password)
  1027. {
  1028. MySqlCommand cmd = CreateQuery();
  1029. cmd.CommandText = "SELECT email WHERE uuid=@uuid AND password=@pass LIMIT 1";
  1030. cmd.Parameters.AddWithValue("@uuid", uuid);
  1031. cmd.Parameters.AddWithValue("@pass", password);
  1032. using (MySqlDataReader rdr = cmd.ExecuteReader())
  1033. {
  1034. if (!rdr.HasRows) return "";
  1035. rdr.Read();
  1036. return rdr.GetString("email");
  1037. }
  1038. }
  1039.  
  1040. public void InsertEmail(string uuid, string password, string hash)
  1041. {
  1042. Console.WriteLine("Adding Email!");
  1043.  
  1044. MySqlCommand cmd = CreateQuery();
  1045. cmd.CommandText =
  1046. "INSERT INTO emails(accId, name, email, accessKey) VALUES(@accId, @name, @email, @accessKey);";
  1047. cmd.Parameters.AddWithValue("@accId", GetAccInfo(uuid, 1));
  1048. cmd.Parameters.AddWithValue("@name", GetAccInfo(uuid, 2));
  1049. cmd.Parameters.AddWithValue("@email", GetAccInfo(uuid, 3));
  1050. cmd.Parameters.AddWithValue("@accessKey", hash);
  1051.  
  1052. cmd.ExecuteNonQuery();
  1053. }
  1054.  
  1055. public string GetAccInfo(string guid, int type)
  1056. {
  1057. string info = "";
  1058. MySqlCommand cmd = CreateQuery();
  1059. cmd.CommandText = "SELECT id, name, email FROM accounts WHERE uuid=@uuid LIMIT 1";
  1060. cmd.Parameters.AddWithValue("@uuid", guid);
  1061. using (MySqlDataReader rdr = cmd.ExecuteReader())
  1062. {
  1063. if (!rdr.HasRows) return "";
  1064. rdr.Read();
  1065. if (type == 1)
  1066. info = rdr.GetInt32("id").ToString();
  1067. if (type == 2)
  1068. info = rdr.GetString("name");
  1069. if (type == 3)
  1070. info = rdr.GetString("email");
  1071. return info;
  1072. }
  1073. }
  1074.  
  1075. public bool HasEmail(string email)
  1076. {
  1077. MySqlCommand cmd = CreateQuery();
  1078. cmd.CommandText = "SELECT COUNT(id) FROM accounts WHERE email=@email;";
  1079. cmd.Parameters.AddWithValue("@email", email);
  1080. return (int)(long)cmd.ExecuteScalar() > 0;
  1081. }
  1082.  
  1083. public Char LoadCharacter(Account acc, int charId)
  1084. {
  1085. MySqlCommand cmd = CreateQuery();
  1086. cmd.CommandText = "SELECT * FROM characters WHERE accId=@accId AND charId=@charId;";
  1087. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1088. cmd.Parameters.AddWithValue("@charId", charId);
  1089. Char ret;
  1090. using (MySqlDataReader rdr = cmd.ExecuteReader())
  1091. {
  1092. if (!rdr.HasRows) return null;
  1093. rdr.Read();
  1094. int[] stats = Utils.FromCommaSepString32(rdr.GetString("stats"));
  1095. ret = new Char
  1096. {
  1097. ObjectType = (ushort)rdr.GetInt32("charType"),
  1098. CharacterId = rdr.GetInt32("charId"),
  1099. Exp = rdr.GetInt32("exp"),
  1100. Level = rdr.GetInt32("level"),
  1101. LDTimer = rdr.GetInt32("ldTimer"),
  1102. LTTimer = rdr.GetInt32("ltTimer"),
  1103. XpTimer = rdr.GetInt32("xpBoosterTime"),
  1104. CurrentFame = rdr.GetInt32("fame"),
  1105. _Equipment = rdr.GetString("items"),
  1106. HasBackpack = rdr.GetInt32("hasBackpack"),
  1107. MaxHitPoints = stats[0],
  1108. HitPoints = rdr.GetInt32("hp"),
  1109. MaxMagicPoints = stats[1],
  1110. MagicPoints = rdr.GetInt32("mp"),
  1111. Attack = stats[2],
  1112. Defense = stats[3],
  1113. Speed = stats[4],
  1114. HpRegen = stats[5],
  1115. MpRegen = stats[6],
  1116. Dexterity = stats[7],
  1117. HealthStackCount = rdr.GetInt32("hpPotions"),
  1118. MagicStackCount = rdr.GetInt32("mpPotions"),
  1119. Tex1 = rdr.GetInt32("tex1"),
  1120. Tex2 = rdr.GetInt32("tex2"),
  1121. Dead = rdr.GetBoolean("dead"),
  1122. Pet = GetPet(rdr.GetInt32("petId"), acc),
  1123. PCStats = rdr.GetString("fameStats"),
  1124. FameStats = new FameStats(),
  1125. Skin = rdr.GetInt32("skin")
  1126. };
  1127. if (!string.IsNullOrEmpty(ret.PCStats) && ret.PCStats != "FameStats")
  1128. try
  1129. {
  1130. ret.FameStats.Read(
  1131. Convert.FromBase64String(ret.PCStats.Replace('-', '+').Replace('_', '/')));
  1132. }
  1133. catch (Exception e)
  1134. {
  1135. Console.WriteLine("[" + DateTime.Now.ToString("h:mm:ss tt") + "] " + e);
  1136. }
  1137. }
  1138. ret.XpBoosted = ret.XpTimer == 0 ? false : true;
  1139. if (ret.HasBackpack == 1)
  1140. ret.Backpack = GetBackpack(ret, acc);
  1141. return ret;
  1142. }
  1143.  
  1144. public void SaveCharacter(Account acc, Char chr)
  1145. {
  1146. if (acc == null || chr == null) return;
  1147. MySqlCommand cmd = CreateQuery();
  1148. cmd.CommandText = @"UPDATE characters SET
  1149. level=@level,
  1150. exp=@exp,
  1151. fame=@fame,
  1152. items=@items,
  1153. hpPotions=@hpPots,
  1154. mpPotions=@mpPots,
  1155. stats=@stats,
  1156. hp=@hp,
  1157. mp=@mp,
  1158. tex1=@tex1,
  1159. tex2=@tex2,
  1160. petId=@pet,
  1161. fameStats=@fameStats,
  1162. hasBackpack=@hasBackpack,
  1163. skin=@skin,
  1164. xpBoosterTime=@xpTime,
  1165. ldTimer=@lootDropTime,
  1166. ltTimer=@lootTierTime
  1167. WHERE accId=@accId AND charId=@charId;";
  1168. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1169. cmd.Parameters.AddWithValue("@charId", chr.CharacterId);
  1170.  
  1171. cmd.Parameters.AddWithValue("@level", chr.Level);
  1172. cmd.Parameters.AddWithValue("@exp", chr.Exp);
  1173. cmd.Parameters.AddWithValue("@fame", chr.CurrentFame);
  1174. cmd.Parameters.AddWithValue("@hpPots", chr.HealthStackCount);
  1175. cmd.Parameters.AddWithValue("@mpPots", chr.MagicStackCount);
  1176. cmd.Parameters.AddWithValue("@items", Utils.GetCommaSepString(chr.EquipSlots()));
  1177. cmd.Parameters.AddWithValue("@stats", Utils.GetCommaSepString(new[]
  1178. {
  1179. chr.MaxHitPoints,
  1180. chr.MaxMagicPoints,
  1181. chr.Attack,
  1182. chr.Defense,
  1183. chr.Speed,
  1184. chr.HpRegen,
  1185. chr.MpRegen,
  1186. chr.Dexterity
  1187. }));
  1188. cmd.Parameters.AddWithValue("@hp", chr.HitPoints);
  1189. cmd.Parameters.AddWithValue("@mp", chr.MagicPoints);
  1190. cmd.Parameters.AddWithValue("@hasBackpack", chr.HasBackpack);
  1191. cmd.Parameters.AddWithValue("@tex1", chr.Tex1);
  1192. cmd.Parameters.AddWithValue("@tex2", chr.Tex2);
  1193. cmd.Parameters.AddWithValue("@pet", chr.Pet == null ? -1 : chr.Pet.InstanceId);
  1194. cmd.Parameters.AddWithValue("@skin", chr.Skin);
  1195. cmd.Parameters.AddWithValue("@xpTime", chr.XpTimer);
  1196. cmd.Parameters.AddWithValue("@lootDropTime", chr.LDTimer);
  1197. cmd.Parameters.AddWithValue("@lootTierTime", chr.LTTimer);
  1198. chr.PCStats =
  1199. Convert.ToBase64String(chr.FameStats.Write())
  1200. .Replace('+', '-')
  1201. .Replace('/', '_');
  1202. cmd.Parameters.AddWithValue("@fameStats", chr.PCStats);
  1203. cmd.ExecuteNonQuery();
  1204.  
  1205. cmd = CreateQuery();
  1206. cmd.CommandText = @"INSERT INTO classstats(accId, objType, bestLv, bestFame)
  1207. VALUES(@accId, @objType, @bestLv, @bestFame)
  1208. ON DUPLICATE KEY UPDATE
  1209. bestLv = GREATEST(bestLv, @bestLv),
  1210. bestFame = GREATEST(bestFame, @bestFame);";
  1211. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1212. cmd.Parameters.AddWithValue("@objType", chr.ObjectType);
  1213. cmd.Parameters.AddWithValue("@bestLv", chr.Level);
  1214. cmd.Parameters.AddWithValue("@bestFame", chr.CurrentFame);
  1215. cmd.ExecuteNonQuery();
  1216.  
  1217. SaveBackpacks(chr, acc);
  1218. }
  1219.  
  1220. public int[] GetBackpack(Char chr, Account acc)
  1221. {
  1222. MySqlCommand cmd = CreateQuery();
  1223. cmd.CommandText = "SELECT * FROM backpacks WHERE charId=@charId AND accId=@accId";
  1224. cmd.Parameters.AddWithValue("@charId", chr.CharacterId);
  1225. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1226. var ret = new int[8];
  1227. using (MySqlDataReader rdr = cmd.ExecuteReader())
  1228. {
  1229. if (!rdr.HasRows)
  1230. return new[] { -1, -1, -1, -1, -1, -1, -1, -1 };
  1231. while (rdr.Read())
  1232. ret = Utils.FromCommaSepString32(rdr.GetString("items"));
  1233. }
  1234. return ret;
  1235. }
  1236.  
  1237. public void SaveBackpacks(Char chr, Account acc)
  1238. {
  1239. if (chr.HasBackpack == 1)
  1240. {
  1241. MySqlCommand cmd = CreateQuery();
  1242. cmd.CommandText = @"INSERT INTO backpacks(accId, charId, items)
  1243. VALUES(@accId, @charId, @items)
  1244. ON DUPLICATE KEY UPDATE
  1245. items = @items;";
  1246. cmd.Parameters.AddWithValue("@charId", chr.CharacterId);
  1247. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1248. cmd.Parameters.AddWithValue("@items", Utils.GetCommaSepString(chr.Backpack));
  1249. cmd.ExecuteNonQuery();
  1250. }
  1251. }
  1252.  
  1253. public void Death(XmlData data, Account acc, Char chr, string killer) //Save first
  1254. {
  1255. MySqlCommand cmd = CreateQuery();
  1256. cmd.CommandText = @"UPDATE characters SET
  1257. dead=TRUE,
  1258. deathTime=NOW()
  1259. WHERE accId=@accId AND charId=@charId;";
  1260. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1261. cmd.Parameters.AddWithValue("@charId", chr.CharacterId);
  1262. cmd.ExecuteNonQuery();
  1263.  
  1264. bool firstBorn;
  1265. int finalFame = chr.FameStats.CalculateTotal(data, acc, chr, chr.CurrentFame, out firstBorn);
  1266.  
  1267. cmd = CreateQuery();
  1268. cmd.CommandText = @"UPDATE stats SET
  1269. fame=fame+@amount,
  1270. totalFame=totalFame+@amount
  1271. WHERE accId=@accId;";
  1272. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1273. cmd.Parameters.AddWithValue("@amount", finalFame);
  1274. cmd.ExecuteNonQuery();
  1275.  
  1276. cmd = CreateQuery();
  1277. cmd.CommandText = @"INSERT INTO classstats(accId, objType, bestLv, bestFame)
  1278. VALUES(@accId, @objType, @bestLv, @bestFame)
  1279. ON DUPLICATE KEY UPDATE
  1280. bestLv = GREATEST(bestLv, @bestLv),
  1281. bestFame = GREATEST(bestFame, @bestFame);";
  1282. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1283. cmd.Parameters.AddWithValue("@objType", chr.ObjectType);
  1284. cmd.Parameters.AddWithValue("@bestLv", chr.Level);
  1285. cmd.Parameters.AddWithValue("@bestFame", finalFame);
  1286. cmd.ExecuteNonQuery();
  1287.  
  1288. if (acc.Guild.Id != 0)
  1289. {
  1290. cmd = CreateQuery();
  1291. cmd.CommandText = @"UPDATE guilds SET
  1292. guildFame=guildFame+@amount,
  1293. totalGuildFame=totalGuildFame+@amount
  1294. WHERE name=@name;";
  1295. cmd.Parameters.AddWithValue("@amount", finalFame);
  1296. cmd.Parameters.AddWithValue("@name", acc.Guild.Name);
  1297. cmd.ExecuteNonQuery();
  1298.  
  1299. cmd = CreateQuery();
  1300. cmd.CommandText = @"UPDATE accounts SET
  1301. guildFame=guildFame+@amount
  1302. WHERE id=@id;";
  1303. cmd.Parameters.AddWithValue("@amount", finalFame);
  1304. cmd.Parameters.AddWithValue("@id", acc.AccountId);
  1305. cmd.ExecuteNonQuery();
  1306. }
  1307.  
  1308. cmd = CreateQuery();
  1309. cmd.CommandText =
  1310. @"INSERT INTO death(accId, chrId, name, charType, tex1, tex2, skin, items, fame, exp, fameStats, totalFame, firstBorn, killer)
  1311. VALUES(@accId, @chrId, @name, @objType, @tex1, @tex2, @skin, @items, @fame, @exp, @fameStats, @totalFame, @firstBorn, @killer);";
  1312. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1313. cmd.Parameters.AddWithValue("@chrId", chr.CharacterId);
  1314. cmd.Parameters.AddWithValue("@name", acc.Name);
  1315. cmd.Parameters.AddWithValue("@objType", chr.ObjectType);
  1316. cmd.Parameters.AddWithValue("@tex1", chr.Tex1);
  1317. cmd.Parameters.AddWithValue("@tex2", chr.Tex2);
  1318. cmd.Parameters.AddWithValue("@skin", chr.Skin);
  1319. cmd.Parameters.AddWithValue("@items", chr._Equipment);
  1320. cmd.Parameters.AddWithValue("@fame", chr.CurrentFame);
  1321. cmd.Parameters.AddWithValue("@exp", chr.Exp);
  1322. cmd.Parameters.AddWithValue("@fameStats", chr.PCStats);
  1323. cmd.Parameters.AddWithValue("@totalFame", finalFame);
  1324. cmd.Parameters.AddWithValue("@firstBorn", firstBorn);
  1325. cmd.Parameters.AddWithValue("@killer", killer);
  1326. cmd.ExecuteNonQuery();
  1327. }
  1328.  
  1329.  
  1330. public void AddToArenaLb(int wave, List<string> participants)
  1331. {
  1332. string players = string.Join(", ", participants.ToArray());
  1333. MySqlCommand cmd = CreateQuery();
  1334. cmd.CommandText = "INSERT INTO arenalb(wave, players) VALUES(@wave, @players)";
  1335. cmd.Parameters.AddWithValue("@wave", wave);
  1336. cmd.Parameters.AddWithValue("@players", players);
  1337. try
  1338. {
  1339. cmd.ExecuteNonQuery();
  1340. }
  1341. catch (Exception e)
  1342. {
  1343. Console.WriteLine("[" + DateTime.Now.ToString("h:mm:ss tt") + "] " + e);
  1344. }
  1345. }
  1346.  
  1347.  
  1348. public string[][] GetArenaLeaderboards(string type, Account acc)
  1349. {
  1350. List<string[]> lbrankings = new List<string[]>();
  1351. MySqlCommand cmd = CreateQuery();
  1352. switch (type)
  1353. {
  1354. case "alltime":
  1355. cmd.CommandText = "SELECT * FROM arenalb ORDER BY wave DESC LIMIT 20";
  1356. break;
  1357. case "weekly":
  1358. cmd.CommandText =
  1359. "SELECT * FROM arenalb WHERE date BETWEEN date_sub(now(), INTERVAL 1 WEEK) AND NOW() ORDER BY wave DESC LIMIT 20";
  1360. break;
  1361. case "personal":
  1362. cmd.CommandText = "SELECT * FROM arenalb WHERE accid = @accid ORDER BY wave DESC LIMIT 20";
  1363. cmd.Parameters.AddWithValue("@acc", acc.AccountId);
  1364. break;
  1365. default:
  1366. return null;
  1367. }
  1368. using (MySqlDataReader rdr = cmd.ExecuteReader())
  1369. {
  1370. while (rdr.Read())
  1371. {
  1372. List<string> ranking = new List<string>();
  1373. ranking.Add(rdr.GetInt32("wave").ToString());
  1374. ranking.Add(rdr.GetInt32("accid").ToString());
  1375. ranking.Add(rdr.GetInt32("charid").ToString());
  1376. ranking.Add(rdr.GetString("petid"));
  1377. ranking.Add(rdr.GetString("time"));
  1378. ranking.Add(rdr.GetString("date"));
  1379. lbrankings.Add(ranking.ToArray());
  1380. }
  1381. }
  1382.  
  1383. return lbrankings.ToArray();
  1384. }
  1385.  
  1386. public string[] GetGuildLeaderboards()
  1387. {
  1388. List<string> guildrankings = new List<string>();
  1389.  
  1390. MySqlCommand cmd = CreateQuery();
  1391.  
  1392. cmd.CommandText = "SELECT * FROM guilds ORDER BY guildFame DESC LIMIT 10";
  1393.  
  1394. using (MySqlDataReader rdr = cmd.ExecuteReader())
  1395. {
  1396. if (!rdr.HasRows) guildrankings.Add("None");
  1397. else
  1398. {
  1399. while (rdr.Read())
  1400. {
  1401. guildrankings.Add(rdr.GetString("name") + " - " + rdr.GetInt32("guildFame") + " Fame");
  1402. }
  1403. }
  1404. }
  1405.  
  1406. return guildrankings.ToArray();
  1407. }
  1408.  
  1409.  
  1410. public List<string> GetLockeds(string accId)
  1411. {
  1412. List<string> ret = new List<string>();
  1413. MySqlCommand cmd = CreateQuery();
  1414. cmd.CommandText = "SELECT locked FROM accounts WHERE id=@accId";
  1415. cmd.Parameters.AddWithValue("@accid", accId);
  1416. try
  1417. {
  1418. string tmp = cmd.ExecuteScalar().ToString();
  1419. if (!String.IsNullOrWhiteSpace(tmp))
  1420. ret = tmp.Split(',').ToList();
  1421. for (int i = 0; i < ret.Count; i++)
  1422. ret[i] = ret[i].Trim();
  1423. return ret;
  1424. }
  1425. catch
  1426. {
  1427. return new List<string>();
  1428. }
  1429. }
  1430.  
  1431. public List<string> GetIgnoreds(string accId)
  1432. {
  1433. List<string> ret = new List<string>();
  1434. MySqlCommand cmd = CreateQuery();
  1435. cmd.CommandText = "SELECT ignored FROM accounts WHERE id=@accId";
  1436. cmd.Parameters.AddWithValue("@accid", accId);
  1437. try
  1438. {
  1439. string tmp = cmd.ExecuteScalar().ToString();
  1440. if (!String.IsNullOrWhiteSpace(tmp))
  1441. ret = tmp.Split(',').ToList();
  1442. for (int i = 0; i < ret.Count; i++)
  1443. ret[i] = ret[i].Trim();
  1444. return ret;
  1445. }
  1446. catch
  1447. {
  1448. return new List<string>();
  1449. }
  1450. }
  1451.  
  1452. public bool AddLock(string accId, string lockId)
  1453. {
  1454. List<string> x = GetLockeds(accId);
  1455. x.Add(lockId.ToString());
  1456. string s = Utils.GetCommaSepString(x.ToArray());
  1457. MySqlCommand cmd = CreateQuery();
  1458. cmd.CommandText = "UPDATE accounts SET locked=@newlocked WHERE id=@accId";
  1459. cmd.Parameters.AddWithValue("@newlocked", s);
  1460. cmd.Parameters.AddWithValue("@accId", accId);
  1461. if (cmd.ExecuteNonQuery() == 0)
  1462. return false;
  1463. return true;
  1464. }
  1465.  
  1466. public bool RemoveLock(string accId, string lockId)
  1467. {
  1468. List<string> x = GetLockeds(accId);
  1469. x.Remove(lockId.ToString());
  1470. string s = Utils.GetCommaSepString(x.ToArray());
  1471. MySqlCommand cmd = CreateQuery();
  1472. cmd.CommandText = "UPDATE accounts SET locked=@newlocked WHERE id=@accId";
  1473. cmd.Parameters.AddWithValue("@newlocked", s);
  1474. cmd.Parameters.AddWithValue("@accId", accId);
  1475. if (cmd.ExecuteNonQuery() == 0)
  1476. return false;
  1477. return true;
  1478. }
  1479.  
  1480. public bool AddIgnore(string accId, string ignoreId)
  1481. {
  1482. List<string> x = GetIgnoreds(accId);
  1483. x.Add(ignoreId.ToString());
  1484. string s = Utils.GetCommaSepString(x.ToArray());
  1485. MySqlCommand cmd = CreateQuery();
  1486. cmd.CommandText = "UPDATE accounts SET ignored=@newignored WHERE id=@accId";
  1487. cmd.Parameters.AddWithValue("@newignored", s);
  1488. cmd.Parameters.AddWithValue("@accId", accId);
  1489. if (cmd.ExecuteNonQuery() == 0)
  1490. return false;
  1491. return true;
  1492. }
  1493.  
  1494. public bool RemoveIgnore(string accId, string ignoreId)
  1495. {
  1496. List<string> x = GetIgnoreds(accId);
  1497. x.Remove(ignoreId.ToString());
  1498. string s = Utils.GetCommaSepString(x.ToArray());
  1499. MySqlCommand cmd = CreateQuery();
  1500. cmd.CommandText = "UPDATE accounts SET ignored=@newignored WHERE id=@accId";
  1501. cmd.Parameters.AddWithValue("@newignored", s);
  1502. cmd.Parameters.AddWithValue("@accId", accId);
  1503. if (cmd.ExecuteNonQuery() == 0)
  1504. return false;
  1505. return true;
  1506. }
  1507.  
  1508. public void CreatePet(Account acc, PetItem item)
  1509. {
  1510. MySqlCommand cmd = CreateQuery();
  1511. cmd.CommandText = "SELECT COUNT(petId) FROM pets WHERE petId=@petId AND accId=@accId;";
  1512. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1513. cmd.Parameters.AddWithValue("@petId", item.InstanceId);
  1514. if ((int)(long)cmd.ExecuteScalar() == 0)
  1515. {
  1516. //Not finished yet.
  1517. cmd = CreateQuery();
  1518. cmd.CommandText =
  1519. @"INSERT INTO pets(accId, petId, objType, skinName, skin, rarity, maxLevel, abilities, levels, xp)
  1520. VALUES(@accId, @petId, @objType, @skinName, @skin, @rarity, @maxLevel, @abilities, @levels, @xp);";
  1521. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1522. cmd.Parameters.AddWithValue("@petId", item.InstanceId);
  1523. cmd.Parameters.AddWithValue("@objType", item.Type);
  1524. cmd.Parameters.AddWithValue("@skinName", item.SkinName);
  1525. cmd.Parameters.AddWithValue("@skin", item.Skin);
  1526. cmd.Parameters.AddWithValue("@rarity", item.Rarity);
  1527. cmd.Parameters.AddWithValue("@maxLevel", item.MaxAbilityPower);
  1528. cmd.Parameters.AddWithValue("@abilities",
  1529. String.Format("{0}, {1}, {2}", item.Abilities[0].Type, item.Abilities[1].Type, item.Abilities[2].Type));
  1530. cmd.Parameters.AddWithValue("@levels",
  1531. String.Format("{0}, {1}, {2}", item.Abilities[0].Power, item.Abilities[1].Power, item.Abilities[2].Power));
  1532. cmd.Parameters.AddWithValue("@xp",
  1533. String.Format("{0}, {1}, {2}", item.Abilities[0].Points, item.Abilities[1].Points, item.Abilities[2].Points));
  1534. try
  1535. {
  1536. cmd.ExecuteNonQuery();
  1537. }
  1538. catch (Exception ex)
  1539. {
  1540. Console.WriteLine(ex);
  1541. }
  1542. }
  1543. }
  1544.  
  1545. public int GetNextPetId(string accId)
  1546. {
  1547. MySqlCommand cmd = CreateQuery();
  1548. cmd.CommandText = "SELECT IFNULL(MAX(petId), 0) FROM pets WHERE accId=@accId;";
  1549. cmd.Parameters.AddWithValue("@accId", accId);
  1550. int ret = (int)(long)cmd.ExecuteScalar() + 1;
  1551. return ret;
  1552. }
  1553.  
  1554. public void UpdateLastSeen(string accId, int charId, string location)
  1555. {
  1556. string currentDate = DateTime.UtcNow.ToString("yyyy-MM-dd:HH-mm-ss");
  1557. MySqlCommand cmd = CreateQuery();
  1558. cmd.CommandText = "UPDATE accounts SET lastSeen=@lastSeen WHERE id=@accId;";
  1559. cmd.Parameters.AddWithValue("@lastSeen", currentDate);
  1560. cmd.Parameters.AddWithValue("@accId", accId);
  1561. cmd.ExecuteScalar();
  1562.  
  1563. cmd = CreateQuery();
  1564. cmd.CommandText = "UPDATE characters SET lastSeen=@lastSeen, lastLocation=@location WHERE accId=@accId AND charId=@charId;";
  1565. cmd.Parameters.AddWithValue("@lastSeen", currentDate);
  1566. cmd.Parameters.AddWithValue("@location", location ?? String.Empty);
  1567. cmd.Parameters.AddWithValue("@accId", accId);
  1568. cmd.Parameters.AddWithValue("@charId", charId);
  1569. cmd.ExecuteScalar();
  1570. }
  1571.  
  1572. public bool CheckAccountInUse(Account acc, ref int? timeout)
  1573. {
  1574. MySqlCommand cmd = CreateQuery();
  1575. cmd.CommandText = "SELECT lastSeen, accountInUse FROM accounts WHERE id=@accId;";
  1576. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1577. using (MySqlDataReader rdr = cmd.ExecuteReader())
  1578. {
  1579. while (rdr.Read())
  1580. {
  1581. DateTime lastSeen = rdr.GetDateTime("lastSeen");
  1582. if (lastSeen == DateTime.MinValue)
  1583. return false;
  1584.  
  1585. int timeInSec = 60 - (int)(DateTime.UtcNow - lastSeen).TotalSeconds;
  1586. bool accInUse = rdr.GetInt32("accountInUse") == 1;
  1587. if (accInUse && timeInSec > 0)
  1588. {
  1589. timeout = timeInSec;
  1590. return true;
  1591. }
  1592. }
  1593. }
  1594. UnlockAccount(acc);
  1595. return false;
  1596. }
  1597.  
  1598. public void LockAccount(Account acc)
  1599. {
  1600. if (acc == null) return;
  1601. MySqlCommand cmd = CreateQuery();
  1602. cmd.CommandText = "UPDATE accounts SET accountInUse=1 WHERE id=@accId;";
  1603. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1604. cmd.ExecuteScalar();
  1605. }
  1606.  
  1607. public void UnlockAccount(Account acc)
  1608. {
  1609. if (acc == null) return;
  1610. MySqlCommand cmd = CreateQuery();
  1611. cmd.CommandText = "UPDATE accounts SET accountInUse=0 WHERE id=@accId;";
  1612. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1613. cmd.ExecuteScalar();
  1614. }
  1615.  
  1616. public string GenerateGiftcode(string contents, string accId)
  1617. {
  1618. var code = generateGiftCode(5, 5);
  1619. while (giftCodeExists(code))
  1620. code = generateGiftCode(5, 5);
  1621.  
  1622. var cmd = CreateQuery();
  1623. cmd.CommandText = "INSERT INTO giftCodes(code, content, accId) VALUES(@code, @contents, @accId);";
  1624. cmd.Parameters.AddWithValue("@code", code);
  1625. cmd.Parameters.AddWithValue("@contents", contents);
  1626. cmd.Parameters.AddWithValue("@accId", accId);
  1627. cmd.ExecuteNonQuery();
  1628. return code;
  1629. }
  1630.  
  1631. private string generateGiftCode(int blocks, int blockLength)
  1632. {
  1633. var builder = new StringBuilder();
  1634. var rand = new Random();
  1635. for (var i = 0; i < blocks; i++)
  1636. {
  1637. builder.Append(GenerateRandomString(blockLength, rand));
  1638. if (i < blocks - 1)
  1639. builder.Append("-");
  1640. }
  1641. return builder.ToString();
  1642. }
  1643.  
  1644. private bool giftCodeExists(string code)
  1645. {
  1646. var cmd = CreateQuery();
  1647. cmd.CommandText = "SELECT code FROM giftCodes WHERE code=@code";
  1648. cmd.Parameters.AddWithValue("@code", code);
  1649. using (var rdr = cmd.ExecuteReader())
  1650. return rdr.HasRows;
  1651. }
  1652.  
  1653. public bool SaveChars(string oldAccId, Chars oldChars, Chars chrs, XmlData data)
  1654. {
  1655. try
  1656. {
  1657. chrs.Account.AccountId = oldAccId;
  1658.  
  1659. var cmd = CreateQuery();
  1660. cmd.CommandText = "UPDATE accounts SET prodAcc=1, name=@name, namechosen=@nameChoosen, vaultCount=@vaults, maxCharSlot=@maxChars, ownedSkins=@skins, gifts=@gifts WHERE id=@oldAccId;";
  1661. cmd.Parameters.AddWithValue("@name", chrs.Account.Name);
  1662. cmd.Parameters.AddWithValue("@nameChoosen", chrs.Account.NameChosen ? 1 : 0);
  1663. cmd.Parameters.AddWithValue("@vaults", chrs.Account.Vault.Chests.Count);
  1664. cmd.Parameters.AddWithValue("@maxChars", chrs.MaxNumChars);
  1665. cmd.Parameters.AddWithValue("@oldAccId", oldAccId);
  1666. cmd.Parameters.AddWithValue("@gifts", chrs.Account._Gifts);
  1667. cmd.Parameters.AddWithValue("@skins", chrs.OwnedSkins);
  1668. cmd.ExecuteNonQuery();
  1669.  
  1670. cmd = CreateQuery();
  1671. cmd.CommandText = "DELETE FROM characters WHERE accId=@accId AND dead=0;";
  1672. cmd.Parameters.AddWithValue("@accId", oldAccId);
  1673. cmd.ExecuteNonQuery();
  1674.  
  1675. cmd = CreateQuery();
  1676. cmd.CommandText = "DELETE FROM vaults WHERE accId=@accId;";
  1677. cmd.Parameters.AddWithValue("@accId", oldAccId);
  1678. cmd.ExecuteNonQuery();
  1679.  
  1680. cmd = CreateQuery();
  1681. cmd.CommandText = "DELETE FROM classstats WHERE accId=@accId";
  1682. cmd.Parameters.AddWithValue("@accId", oldAccId);
  1683. cmd.ExecuteNonQuery();
  1684.  
  1685. foreach (var stat in chrs.Account.Stats.ClassStates)
  1686. {
  1687. cmd = CreateQuery();
  1688. cmd.CommandText = @"INSERT INTO classstats(accId, objType, bestLv, bestFame)
  1689. VALUES(@accId, @objType, @bestLv, @bestFame)
  1690. ON DUPLICATE KEY UPDATE
  1691. bestLv = GREATEST(bestLv, @bestLv),
  1692. bestFame = GREATEST(bestFame, @bestFame);";
  1693. cmd.Parameters.AddWithValue("@accId", oldAccId);
  1694. cmd.Parameters.AddWithValue("@objType", Utils.FromString(stat.ObjectType.ToString()));
  1695. cmd.Parameters.AddWithValue("@bestLv", stat.BestLevel);
  1696. cmd.Parameters.AddWithValue("@bestFame", stat.BestFame);
  1697. cmd.ExecuteNonQuery();
  1698. }
  1699.  
  1700. cmd = CreateQuery();
  1701. cmd.CommandText = "DELETE FROM stats WHERE accId=@accId";
  1702. cmd.Parameters.AddWithValue("@accId", oldAccId);
  1703. cmd.ExecuteNonQuery();
  1704.  
  1705. cmd = CreateQuery();
  1706. cmd.CommandText = "INSERT INTO stats (accId, fame, totalFame, credits, totalCredits, fortuneTokens, totalFortuneTokens) VALUES(@accId, @fame, @fame, @gold, @gold, @tokens, @tokens)";
  1707. cmd.Parameters.AddWithValue("@accId", oldAccId);
  1708. cmd.Parameters.AddWithValue("@fame", chrs.Account.Stats.Fame);
  1709. cmd.Parameters.AddWithValue("@totalFame", chrs.Account.Stats.TotalFame);
  1710. cmd.Parameters.AddWithValue("@gold", chrs.Account.Credits);
  1711. cmd.Parameters.AddWithValue("@tokens", chrs.Account.FortuneTokens);
  1712. cmd.ExecuteNonQuery();
  1713.  
  1714. cmd = CreateQuery();
  1715. cmd.CommandText = "DELETE FROM pets WHERE accId=@accId;";
  1716. cmd.Parameters.AddWithValue("@accId", oldAccId);
  1717. cmd.ExecuteNonQuery();
  1718.  
  1719. foreach (var @char in chrs.Characters)
  1720. {
  1721. var chr = CreateCharacter(data, (ushort)@char.ObjectType, @char.CharacterId);
  1722.  
  1723. int[] stats = new[]
  1724. {
  1725. @char.MaxHitPoints,
  1726. @char.MaxMagicPoints,
  1727. @char.Attack,
  1728. @char.Defense,
  1729. @char.Speed,
  1730. @char.Dexterity,
  1731. @char.HpRegen,
  1732. @char.MpRegen
  1733. };
  1734.  
  1735. cmd = CreateQuery();
  1736. cmd.Parameters.AddWithValue("@accId", chrs.Account.AccountId);
  1737. cmd.Parameters.AddWithValue("@charId", @char.CharacterId);
  1738. cmd.Parameters.AddWithValue("@charType", @char.ObjectType);
  1739. cmd.Parameters.AddWithValue("@items", Utils.GetCommaSepString(@char.EquipSlots()));
  1740. cmd.Parameters.AddWithValue("@stats", Utils.GetCommaSepString(stats));
  1741. cmd.Parameters.AddWithValue("@fameStats", @char.PCStats);
  1742. cmd.Parameters.AddWithValue("@skin", @char.Skin);
  1743. cmd.CommandText =
  1744. "INSERT INTO characters (accId, charId, charType, level, exp, fame, items, hp, mp, stats, dead, pet, fameStats, skin) VALUES (@accId, @charId, @charType, 1, 0, 0, @items, 100, 100, @stats, FALSE, -1, @fameStats, @skin);";
  1745. cmd.ExecuteNonQuery();
  1746.  
  1747. if (@char.Pet != null)
  1748. CreatePet(chrs.Account, @char.Pet);
  1749.  
  1750. @char.FameStats = new FameStats();
  1751. @char.FameStats.Read(
  1752. Convert.FromBase64String(@char.PCStats.Replace('-', '+').Replace('_', '/')));
  1753.  
  1754. if (@char.Equipment.Length > 12)
  1755. {
  1756. @char.Backpack = new int[8];
  1757. Array.Copy(@char.Equipment, 12, @char.Backpack, 0, 8);
  1758. var eq = @char.Equipment;
  1759. Array.Resize(ref eq, 12);
  1760. @char.Equipment = eq;
  1761. @char.HasBackpack = 1;
  1762. }
  1763. chr = @char;
  1764. SaveCharacter(chrs.Account, chr);
  1765. }
  1766.  
  1767. foreach (var chest in chrs.Account.Vault.Chests)
  1768. {
  1769. chest.ChestId = CreateChest(chrs.Account).ChestId;
  1770. if (chest.Items.Length < 8)
  1771. {
  1772. var inv = chest.Items;
  1773. Array.Resize(ref inv, 8);
  1774. for (int i = 0; i < inv.Length; i++)
  1775. if (inv[i] == 0) inv[i] = -1;
  1776. chest.Items = inv;
  1777. }
  1778. SaveChest(chrs.Account.AccountId, chest);
  1779. }
  1780. }
  1781. catch (Exception ex)
  1782. {
  1783. Console.WriteLine(ex);
  1784. return false;
  1785. }
  1786. return true;
  1787. }
  1788.  
  1789. public void AddGifts(Account acc, IEnumerable<int> gifts)
  1790. {
  1791. var tmpGifts = Utils.FromCommaSepString32(acc._Gifts).ToList();
  1792. tmpGifts.AddRange(gifts);
  1793. var cmd = CreateQuery();
  1794. cmd.CommandText = "UPDATE accounts SET gifts=@newGifts WHERE id=@accId;";
  1795. cmd.Parameters.AddWithValue("@accId", acc.AccountId);
  1796. cmd.Parameters.AddWithValue("@newGifts", Utils.GetCommaSepString(tmpGifts.ToArray()));
  1797. cmd.ExecuteNonQuery();
  1798. }
  1799. }
  1800. }
Add Comment
Please, Sign In to add comment