GuildObject.cs 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066
  1. using Server.MirEnvir;
  2. using Server.MirDatabase;
  3. using Server.Library.MirDatabase;
  4. namespace Server.MirObjects
  5. {
  6. public sealed class GuildObject
  7. {
  8. private static Envir Envir
  9. {
  10. get { return Envir.Main; }
  11. }
  12. public GuildInfo Info;
  13. public int Guildindex
  14. {
  15. get { return Info.GuildIndex; }
  16. set { Info.GuildIndex = value; }
  17. }
  18. public string Name
  19. {
  20. get { return Info.Name; }
  21. set { Info.Name = value; }
  22. }
  23. public bool NeedSave
  24. {
  25. get { return Info.NeedSave; }
  26. set { Info.NeedSave = value; }
  27. }
  28. public List<GuildRank> Ranks
  29. {
  30. get { return Info.Ranks; }
  31. set { Info.Ranks = value; }
  32. }
  33. public List<GuildBuff> BuffList
  34. {
  35. get { return Info.BuffList; }
  36. set { Info.BuffList = value; }
  37. }
  38. public GuildStorageItem[] StoredItems
  39. {
  40. get { return Info.StoredItems; }
  41. set { Info.StoredItems = value; }
  42. }
  43. public uint Gold
  44. {
  45. get { return Info.Gold; }
  46. set { Info.Gold = value; }
  47. }
  48. public long NextExpUpdate = 0;
  49. public List<GuildObject> WarringGuilds = new List<GuildObject>();
  50. public ConquestObject Conquest;
  51. public List<GuildObject> AllyGuilds = new List<GuildObject>();
  52. public int AllyCount;
  53. public DateTime GTRent
  54. {
  55. get { return Info.GTRent; }
  56. set { Info.GTRent = value; }
  57. }
  58. public DateTime GTBegin
  59. {
  60. get { return Info.GTBegin; }
  61. set { Info.GTBegin = value; }
  62. }
  63. public int GTIndex
  64. {
  65. get { return Info.GTIndex; }
  66. set { Info.GTIndex = value; }
  67. }
  68. public int GTKey
  69. {
  70. get { return Info.GTKey; }
  71. set { Info.GTKey = value; }
  72. }
  73. public int GTPrice
  74. {
  75. get { return Info.GTPrice; }
  76. set { Info.GTPrice = value; }
  77. }
  78. public bool HasGT
  79. {
  80. get
  81. {
  82. return GTRent > DateTime.Now;
  83. }
  84. }
  85. public GuildObject(GuildInfo info)
  86. {
  87. Info = info;
  88. if (!Envir.Guilds.Any(x => x.Guildindex == info.GuildIndex))
  89. {
  90. Envir.Guilds.Add(this);
  91. }
  92. }
  93. public void SendMessage(string message, ChatType Type = ChatType.Guild)
  94. {
  95. for (int i = 0; i < Ranks.Count; i++)
  96. {
  97. for (int j = 0; j < Ranks[i].Members.Count; j++)
  98. {
  99. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  100. if (player != null)
  101. {
  102. player.ReceiveChat(message, Type);
  103. }
  104. }
  105. }
  106. }
  107. public void SendOutputMessage(string message, OutputMessageType Type = OutputMessageType.Guild)
  108. {
  109. for (int i = 0; i < Ranks.Count; i++)
  110. {
  111. for (int j = 0; j < Ranks[i].Members.Count; j++)
  112. {
  113. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  114. if (player != null)
  115. {
  116. player.ReceiveOutputMessage(message, Type);
  117. }
  118. }
  119. }
  120. }
  121. public List<PlayerObject> GetOnlinePlayers()
  122. {
  123. List<PlayerObject> players = new List<PlayerObject>();
  124. for (int i = 0; i < Ranks.Count; i++)
  125. {
  126. for (int j = 0; j < Ranks[i].Members.Count; j++)
  127. {
  128. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  129. if (player != null)
  130. {
  131. players.Add(player);
  132. }
  133. }
  134. }
  135. return players;
  136. }
  137. public void PlayerLogged(PlayerObject member, bool online, bool New = false)
  138. {
  139. for (int i = 0; i < Ranks.Count; i++)
  140. {
  141. for (int j = 0; j < Ranks[i].Members.Count; j++)
  142. {
  143. if (Ranks[i].Members[j].Id == member.Info.Index)
  144. {
  145. if (online)
  146. {
  147. Ranks[i].Members[j].Player = member;
  148. Ranks[i].Members[j].Online = true;
  149. }
  150. else
  151. {
  152. Ranks[i].Members[j].LastLogin = Envir.Now;
  153. Ranks[i].Members[j].Player = null;
  154. Ranks[i].Members[j].Online = false;
  155. NeedSave = true;
  156. }
  157. }
  158. }
  159. }
  160. SendServerPacket(new ServerPackets.GuildMemberChange() {Name = member.Name, Status = (byte)(New? 2: online? 1: 0)});
  161. if (online && !New)
  162. {
  163. SendGuildStatus(member);
  164. }
  165. }
  166. public void SendGuildStatus(PlayerObject member)
  167. {
  168. string gName = Name;
  169. if (Conquest != null)
  170. {
  171. gName += "[" + Conquest.Info.Name + "]";
  172. }
  173. member.Enqueue(new ServerPackets.GuildStatus()
  174. {
  175. GuildName = gName,
  176. GuildRankName = member.MyGuildRank != null? member.MyGuildRank.Name: "",
  177. Experience = Info.Experience,
  178. MaxExperience = Info.MaxExperience,
  179. MemberCount = Info.Membercount,
  180. MaxMembers = Info.MemberCap,
  181. Gold = Info.Gold,
  182. Level = Info.Level,
  183. Voting = Info.Voting,
  184. SparePoints = Info.SparePoints,
  185. ItemCount = (byte)Info.StoredItems.Length,
  186. BuffCount = (byte)0,//(byte)BuffList.Count,
  187. MyOptions = member.MyGuildRank != null? member.MyGuildRank.Options: (GuildRankOptions)0,
  188. MyRankId = member.MyGuildRank != null? member.MyGuildRank.Index: 256
  189. });
  190. }
  191. public void NewMember(PlayerObject newMember)
  192. {
  193. if (Ranks.Count < 2)
  194. {
  195. Ranks.Add(new GuildRank() { Name = "Members", Index = 1 });
  196. }
  197. GuildRank lowestRank = Ranks[Ranks.Count - 1];
  198. GuildMember member = new GuildMember() { Name = newMember.Info.Name, Player = newMember, Id = newMember.Info.Index, LastLogin = Envir.Now, Online = true };
  199. lowestRank.Members.Add(member);
  200. PlayerLogged(newMember, true, true);
  201. Info.Membercount++;
  202. NeedSave = true;
  203. }
  204. public bool ChangeRank(PlayerObject self, string memberName, byte rankIndex, string rankName = "Members")
  205. {
  206. if ((self.MyGuild != this) || (self.MyGuildRank == null)) return false;
  207. if (rankIndex >= Ranks.Count) return false;
  208. GuildMember Member = null;
  209. GuildRank MemberRank = null;
  210. for (int i = 0; i < Ranks.Count; i++)
  211. for (int j = 0; j < Ranks[i].Members.Count; j++)
  212. if (Ranks[i].Members[j].Name == memberName)
  213. {
  214. Member = Ranks[i].Members[j];
  215. MemberRank = Ranks[i];
  216. goto Found;
  217. }
  218. Found:
  219. if (Member == null) return false;
  220. MirDatabase.CharacterInfo Character = Envir.GetCharacterInfo(memberName);
  221. if (Character == null) return false;
  222. if ((rankIndex == 0) && (Character.Level < Settings.Guild_RequiredLevel))
  223. {
  224. self.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.GuildLeaderMinLevel), Settings.Guild_RequiredLevel), ChatType.System);
  225. return false;
  226. }
  227. if ((MemberRank.Index >= self.MyGuildRank.Index) && (self.MyGuildRank.Index != 0))return false;
  228. if (MemberRank.Index == 0)
  229. {
  230. if (MemberRank.Members.Count <= 2)
  231. {
  232. self.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.GuildNeedsTwoLeaders), ChatType.System);
  233. return false;
  234. }
  235. for (int i = 0; i < MemberRank.Members.Count; i++)
  236. {
  237. if ((MemberRank.Members[i].Player != null) && (MemberRank.Members[i] != Member))
  238. goto AllOk;
  239. }
  240. self.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.NeedOneLeaderOnline), ChatType.System);
  241. return false;
  242. }
  243. AllOk:
  244. Ranks[rankIndex].Members.Add(Member);
  245. MemberRank.Members.Remove(Member);
  246. MemberRank = Ranks[rankIndex];
  247. List<GuildRank> NewRankList = new List<GuildRank>
  248. {
  249. Ranks[rankIndex]
  250. };
  251. NeedSave = true;
  252. if (HasGT)
  253. {
  254. GTMap GTmap = null;
  255. foreach (var gt in Envir.GTMapList)
  256. {
  257. if (gt.Index == GTIndex)
  258. {
  259. GTmap = gt;
  260. break;
  261. }
  262. }
  263. if (GTmap != null)
  264. {
  265. GTmap.Leader = Ranks[0].Members[0].Name;
  266. if (Ranks[0].Members.Count > 1)
  267. GTmap.Leader2 = Ranks[0].Members[1].Name;
  268. else
  269. GTmap.Leader2 = string.Empty;
  270. }
  271. }
  272. PlayerObject player = (PlayerObject)Member.Player;
  273. if (player != null)
  274. {
  275. player.MyGuildRank = Ranks[rankIndex];
  276. player.Enqueue(new ServerPackets.GuildMemberChange() { Name = self.Info.Name, Status = (byte)8, Ranks = NewRankList });
  277. player.BroadcastInfo();
  278. }
  279. for (int i = 0; i < Ranks.Count; i++)
  280. for (int j = 0; j < Ranks[i].Members.Count; j++)
  281. if ((Ranks[i].Members[j].Player != null) && (Ranks[i].Members[j].Player != Member.Player))
  282. {
  283. player = (PlayerObject)Ranks[i].Members[j].Player;
  284. player.Enqueue(new ServerPackets.GuildMemberChange() { Name = Member.Name, Status = (byte)5, RankIndex = (byte)MemberRank.Index });
  285. player.GuildMembersChanged = true;
  286. }
  287. return true;
  288. }
  289. public bool NewRank(PlayerObject Self)
  290. {
  291. if (Ranks.Count >= byte.MaxValue)
  292. {
  293. Self.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.CannotHaveMoreRanks), ChatType.System);
  294. return false;
  295. }
  296. int NewIndex = Ranks.Count > 1? Ranks.Count -1: 1;
  297. GuildRank NewRank = new GuildRank(){Index = NewIndex, Name = GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.RankNum),NewIndex), Options = (GuildRankOptions)0};
  298. Ranks.Insert(NewIndex, NewRank);
  299. Ranks[Ranks.Count - 1].Index = Ranks.Count - 1;
  300. List<GuildRank> NewRankList = new List<GuildRank>
  301. {
  302. NewRank
  303. };
  304. SendServerPacket(new ServerPackets.GuildMemberChange() { Name = Self.Name, Status = (byte)6, Ranks = NewRankList});
  305. NeedSave = true;
  306. return true;
  307. }
  308. public bool ChangeRankOption(PlayerObject Self, byte RankIndex, int Option, string Enabled)
  309. {
  310. if ((RankIndex >= Ranks.Count) || (Option > 7))
  311. {
  312. Self.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.RankNotFound), ChatType.System);
  313. return false;
  314. }
  315. if (Self.MyGuildRank.Index >= RankIndex)
  316. {
  317. Self.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.CannotChangeOwnRankOptions), ChatType.System);
  318. return false;
  319. }
  320. if ((Enabled != "true") && (Enabled != "false"))
  321. {
  322. return false;
  323. }
  324. Ranks[RankIndex].Options = Enabled == "true" ? Ranks[RankIndex].Options |= (GuildRankOptions)(1 << Option) : Ranks[RankIndex].Options ^= (GuildRankOptions)(1 << Option);
  325. List<GuildRank> NewRankList = new List<GuildRank>
  326. {
  327. Ranks[RankIndex]
  328. };
  329. SendServerPacket(new ServerPackets.GuildMemberChange() { Name = Self.Name, Status = (byte)7, Ranks = NewRankList });
  330. NeedSave = true;
  331. return true;
  332. }
  333. public bool ChangeRankName(PlayerObject Self, string RankName, byte RankIndex)
  334. {
  335. int SelfRankIndex = -1;
  336. for (int i = 0; i < Ranks.Count; i++)
  337. {
  338. for (int j = 0; j < Ranks[i].Members.Count; j++)
  339. {
  340. if (Ranks[i].Members[j].Player == Self)
  341. {
  342. SelfRankIndex = i;
  343. break;
  344. }
  345. }
  346. }
  347. if (SelfRankIndex > RankIndex)
  348. {
  349. Self.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YourRankNotAdequate), ChatType.System);
  350. return false;
  351. }
  352. if (RankIndex >= Ranks.Count)
  353. {
  354. return false;
  355. }
  356. Ranks[RankIndex].Name = RankName;
  357. List<GuildRank> NewRankList = new List<GuildRank>
  358. {
  359. Ranks[RankIndex]
  360. };
  361. for (int i = 0; i < Ranks.Count; i++)
  362. {
  363. for (int j = 0; j < Ranks[i].Members.Count; j++)
  364. {
  365. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  366. if (player != null)
  367. {
  368. player.Enqueue(new ServerPackets.GuildMemberChange() { Name = Self.Info.Name, Status = (byte)7, Ranks = NewRankList });
  369. player.GuildMembersChanged = true;
  370. if (i == RankIndex)
  371. {
  372. player.BroadcastInfo();
  373. }
  374. }
  375. }
  376. }
  377. NeedSave = true;
  378. return true;
  379. }
  380. public bool DeleteMember(PlayerObject Kicker, string membername)
  381. {
  382. //careful this can lead to guild with no ranks or members(or no leader)
  383. GuildMember Member = null;
  384. GuildRank MemberRank = null;
  385. if ((Kicker.MyGuild != this) || (Kicker.MyGuildRank == null)) return false;
  386. for (int i = 0; i < Ranks.Count; i++)
  387. {
  388. for (int j = 0; j < Ranks[i].Members.Count; j++)
  389. {
  390. if (Ranks[i].Members[j].Name == membername)
  391. {
  392. Member = Ranks[i].Members[j];
  393. MemberRank = Ranks[i];
  394. goto Found;
  395. }
  396. }
  397. }
  398. Found:
  399. if (Member == null) return false;
  400. if ((Kicker.MyGuildRank.Index >= MemberRank.Index) && (Kicker.MyGuildRank.Index != 0) && (Kicker.Info.Name != membername))
  401. {
  402. Kicker.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YourRankNotAdequate), ChatType.System);
  403. return false;
  404. }
  405. if (MemberRank.Index == 0)
  406. {
  407. if (MemberRank.Members.Count < 2 && Info.Membercount < 2) //Checks if last remaining member (and leader)
  408. {
  409. goto LeaderOk;
  410. }
  411. else
  412. {
  413. if (MemberRank.Members.Count > 1) //Allows other leaders to leave without another leader online.
  414. goto AllOk;
  415. }
  416. Kicker.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouNeedLastLeaderToDisbandGuild), ChatType.System);
  417. return false;
  418. }
  419. AllOk:
  420. MemberDeleted(membername, (PlayerObject)Member.Player, Member.Name == Kicker.Info.Name);
  421. if (Member.Player != null)
  422. {
  423. PlayerObject LeavingMember = (PlayerObject)Member.Player;
  424. LeavingMember.RefreshStats();
  425. }
  426. MemberRank.Members.Remove(Member);
  427. NeedSave = true;
  428. Info.Membercount--;
  429. return true;
  430. LeaderOk:
  431. MemberDeleted(membername, (PlayerObject)Member.Player, Member.Name == Kicker.Info.Name);
  432. if (Member.Player != null)
  433. {
  434. PlayerObject LeavingMember = (PlayerObject)Member.Player;
  435. LeavingMember.RefreshStats();
  436. }
  437. MemberRank.Members.Remove(Member);
  438. Envir.DeleteGuild(this);
  439. Kicker.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouHaveDisbandedGuild), ChatType.System);
  440. return true;
  441. }
  442. public void DeleteMember(string name)
  443. {//carefull this can lead to guild with no ranks or members(or no leader)
  444. GuildMember Member = null;
  445. GuildRank MemberRank = null;
  446. for (int i = 0; i < Ranks.Count; i++)
  447. for (int j = 0; j < Ranks[i].Members.Count; j++)
  448. {
  449. Member = Ranks[i].Members[j];
  450. MemberRank = Ranks[i];
  451. if (Member.Name != name) continue;
  452. MemberDeleted(Member.Name, (PlayerObject)Member.Player, true);
  453. if (Member.Player != null)
  454. {
  455. PlayerObject LeavingMember = (PlayerObject)Member.Player;
  456. LeavingMember.RefreshStats();
  457. }
  458. MemberRank.Members.Remove(Member);
  459. NeedSave = true;
  460. Info.Membercount--;
  461. break;
  462. }
  463. }
  464. public void MemberDeleted(string name, PlayerObject formerMember, bool kickSelf)
  465. {
  466. for (int i = 0; i < Ranks.Count; i++)
  467. {
  468. for (int j = 0; j < Ranks[i].Members.Count; j++)
  469. {
  470. if ((Ranks[i].Members[j].Player != null) && (Ranks[i].Members[j].Player != formerMember))
  471. {
  472. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  473. player.Enqueue(new ServerPackets.GuildMemberChange() { Name = name, Status = (byte)(kickSelf ? 4 : 3) });
  474. player.GuildMembersChanged = true;
  475. }
  476. }
  477. }
  478. if (formerMember != null)
  479. {
  480. formerMember.Info.GuildIndex = -1;
  481. formerMember.MyGuild = null;
  482. formerMember.MyGuildRank = null;
  483. formerMember.ReceiveChat(kickSelf ? GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouHaveLeftGuild) : GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouRemovedFromGuild), ChatType.Guild);
  484. formerMember.RefreshStats();
  485. formerMember.Enqueue(new ServerPackets.GuildStatus() { GuildName = "", GuildRankName = "", MyOptions = (GuildRankOptions)0 });
  486. formerMember.BroadcastInfo();
  487. }
  488. }
  489. public GuildRank FindRank(string name)
  490. {
  491. for (int i = 0; i < Ranks.Count; i++)
  492. {
  493. for (int j = 0; j < Ranks[i].Members.Count; j++)
  494. {
  495. if (Ranks[i].Members[j].Name == name)
  496. {
  497. return Ranks[i];
  498. }
  499. }
  500. }
  501. return null;
  502. }
  503. public void NewNotice(List<string> notice)
  504. {
  505. Info.Notice = notice;
  506. NeedSave = true;
  507. for (int i = 0; i < Ranks.Count; i++)
  508. {
  509. for (int j = 0; j < Ranks[i].Members.Count; j++)
  510. {
  511. if (Ranks[i].Members[j].Player != null)
  512. {
  513. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  514. player.GuildNoticeChanged = true;
  515. }
  516. }
  517. }
  518. SendServerPacket(new ServerPackets.GuildNoticeChange() { update = -1 });
  519. }
  520. public void SendServerPacket(Packet p)
  521. {
  522. for (int i = 0; i < Ranks.Count; i++)
  523. {
  524. for (int j = 0; j < Ranks[i].Members.Count; j++)
  525. {
  526. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  527. if (player != null)
  528. {
  529. player.Enqueue(p);
  530. }
  531. }
  532. }
  533. }
  534. public void SendItemInfo(UserItem Item)
  535. {
  536. for (int i = 0; i < Ranks.Count; i++)
  537. {
  538. for (int j = 0; j < Ranks[i].Members.Count; j++)
  539. {
  540. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  541. if (player != null)
  542. {
  543. player.CheckItem(Item);
  544. }
  545. }
  546. }
  547. }
  548. public bool HasRoom()
  549. {
  550. if (Info.Level < Settings.Guild_MembercapList.Count)
  551. {
  552. if ((Settings.Guild_MembercapList[Info.Level] != 0) && (Info.Membercount >= Settings.Guild_MembercapList[Info.Level]))
  553. {
  554. return false;
  555. }
  556. }
  557. return true;
  558. }
  559. public void GainExp(uint amount)
  560. {
  561. bool Leveled = false;
  562. if (Info.MaxExperience <= 0) return;
  563. uint expAmount = (uint)(amount * Settings.Guild_ExpRate);
  564. if (expAmount == 0) return;
  565. Info.Experience += expAmount;
  566. var experience = Info.Experience;
  567. while (experience > Info.MaxExperience)
  568. {
  569. Leveled = true;
  570. Info.Level++;
  571. Info.SparePoints = (byte)Math.Min(byte.MaxValue, Info.SparePoints + Settings.Guild_PointPerLevel);
  572. experience -= Info.MaxExperience;
  573. if (Info.Level < Settings.Guild_ExperienceList.Count)
  574. {
  575. Info.MaxExperience = Settings.Guild_ExperienceList[Info.Level];
  576. }
  577. else
  578. {
  579. Info.MaxExperience = 0;
  580. }
  581. if (Info.MaxExperience == 0) break;
  582. if (Info.Level == byte.MaxValue) break;
  583. }
  584. if (Leveled)
  585. {
  586. if (Info.Level < Settings.Guild_MembercapList.Count)
  587. {
  588. Info.MemberCap = Settings.Guild_MembercapList[Info.Level];
  589. }
  590. NextExpUpdate = Envir.Time + 10000;
  591. for (int i = 0; i < Ranks.Count; i++)
  592. {
  593. for (int j = 0; j < Ranks[i].Members.Count; j++)
  594. {
  595. if (Ranks[i].Members[j].Player != null)
  596. {
  597. SendGuildStatus((PlayerObject)Ranks[i].Members[j].Player);
  598. }
  599. }
  600. }
  601. }
  602. else
  603. {
  604. if (NextExpUpdate < Envir.Time)
  605. {
  606. NextExpUpdate = Envir.Time + 10000;
  607. SendServerPacket(new ServerPackets.GuildExpGain() { Amount = expAmount });
  608. }
  609. }
  610. }
  611. #region Guild Wars
  612. public bool GoToWar(GuildObject enemyGuild)
  613. {
  614. if (enemyGuild == null || enemyGuild.Name == Settings.NewbieGuild)
  615. {
  616. return false;
  617. }
  618. if (Envir.GuildsAtWar.Where(e => e.GuildA == this && e.GuildB == enemyGuild).Any() || Envir.GuildsAtWar.Where(e => e.GuildA == enemyGuild && e.GuildB == this).Any())
  619. {
  620. return false;
  621. }
  622. Envir.GuildsAtWar.Add(new GuildAtWar(this, enemyGuild));
  623. UpdatePlayersColours();
  624. enemyGuild.UpdatePlayersColours();
  625. return true;
  626. }
  627. public void UpdatePlayersColours()
  628. {
  629. for (int i = 0; i < Ranks.Count; i++)
  630. {
  631. for (int j = 0; j < Ranks[i].Members.Count; j++)
  632. {
  633. //in a way this is a horrible spam situation, it should only broadcast to your own guild or enemy or allies guild but not sure i wanna code yet another broadcast for that
  634. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  635. if (player != null)
  636. {
  637. //player.Enqueue(player.GetInfoEx(player));
  638. player.Enqueue(new ServerPackets.ColourChanged { NameColour = player.GetNameColour(player) });
  639. player.BroadcastInfo();
  640. }
  641. }
  642. }
  643. }
  644. public bool IsAtWar()
  645. {
  646. if (WarringGuilds.Count == 0) return false;
  647. return true;
  648. }
  649. public string GetName()
  650. {
  651. if (Conquest != null)
  652. {
  653. return Name + "[" + Conquest.Info.Name + "]";
  654. }
  655. else
  656. {
  657. return Name;
  658. }
  659. }
  660. public bool IsEnemy(GuildObject enemyGuild)
  661. {
  662. if (enemyGuild == null) return false;
  663. if (enemyGuild.IsAtWar() != true) return false;
  664. for (int i = 0; i < WarringGuilds.Count; i++)
  665. {
  666. if (WarringGuilds[i] == enemyGuild)
  667. {
  668. return true;
  669. }
  670. }
  671. return false;
  672. }
  673. #endregion
  674. public void RefreshAllStats()
  675. {
  676. for (int i = 0; i < Ranks.Count; i++)
  677. {
  678. for (int j = 0; j < Ranks[i].Members.Count; j++)
  679. {
  680. PlayerObject player = (PlayerObject)Ranks[i].Members[j].Player;
  681. if (player != null)
  682. {
  683. player.RefreshStats();
  684. }
  685. }
  686. }
  687. }
  688. public void Process()
  689. {
  690. //guild buffs
  691. bool NeedUpdate = false;
  692. List<GuildBuff> UpdatedBuffs = new List<GuildBuff>();
  693. for (int k = 0; k < BuffList.Count; k++)
  694. {
  695. if ((BuffList[k].Info == null) || (BuffList[k].Info.TimeLimit == 0)) continue; //dont bother if it's infinite buffs
  696. if (BuffList[k].Active == false) continue;//dont bother if the buff isnt active
  697. BuffList[k].ActiveTimeRemaining -= 1;
  698. if (BuffList[k].ActiveTimeRemaining < 0)
  699. {
  700. NeedUpdate = true;
  701. BuffList[k].Active = false;
  702. UpdatedBuffs.Add(BuffList[k]);
  703. //SendServerPacket(new ServerPackets.RemoveGuildBuff {ObjectID = (uint)BuffList[k].Id});
  704. }
  705. }
  706. if (NeedUpdate)
  707. {
  708. if (UpdatedBuffs.Count > 0)
  709. {
  710. SendServerPacket(new ServerPackets.GuildBuffList { ActiveBuffs = UpdatedBuffs });
  711. }
  712. RefreshAllStats();
  713. }
  714. if (GTIndex > -1)
  715. {
  716. GTMap gt = Envir.GTMapList.First(x => x.Index == GTIndex);
  717. if (GTBegin > Envir.Now)
  718. gt.Begin = (GTBegin - Envir.Now).Seconds;
  719. else
  720. gt.Begin = 0;
  721. if (Envir.Now > GTRent)
  722. {
  723. EndGT();
  724. SendOutputMessage(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.GuildTerritoryExpired));
  725. }
  726. }
  727. }
  728. public void EndGT()
  729. {
  730. GTMap gt = Envir.GTMapList.First(x => x.Index == GTIndex);
  731. gt.Owner = "None";
  732. gt.Price = Settings.BuyGTGold;
  733. gt.Leader = "None";
  734. gt.Days = 0;
  735. gt.Begin = 0;
  736. gt.Key = 0;
  737. for (int i = 0; i < gt.Maps.Count; i++)
  738. {
  739. Map map = gt.Maps[i];
  740. for (int j = 0; j < map.Players.Count; j++)
  741. {
  742. PlayerObject player = map.Players[j];
  743. if (player == null) continue;
  744. player.Teleport(Envir.GetMap(player.BindMapIndex), player.BindLocation);
  745. }
  746. }
  747. GTIndex = -1;
  748. GTRent = DateTime.MinValue;
  749. GTKey = 0;
  750. }
  751. public bool GTForSale(PlayerObject player, int price)
  752. {
  753. GTMap gt = Envir.GTMapList.First(x => x.Index == GTIndex);
  754. if (gt.Price > 0)
  755. {
  756. player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.TerritoryAlreadyForSale), ChatType.System);
  757. return false;
  758. }
  759. gt.Price = price;
  760. GTPrice = price;
  761. return true;
  762. }
  763. public bool EndGTSale(PlayerObject player)
  764. {
  765. GTMap gt = Envir.GTMapList.First(x => x.Index == GTIndex);
  766. if (gt.Price <= 0)
  767. {
  768. player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.TerritoryNotForSale), ChatType.System);
  769. return false;
  770. }
  771. gt.Price = 0;
  772. GTPrice = 0;
  773. return true;
  774. }
  775. public GuildBuff GetBuff(int Id)
  776. {
  777. for (int i = 0; i < BuffList.Count; i++ )
  778. {
  779. if (BuffList[i].Id == Id)
  780. {
  781. return BuffList[i];
  782. }
  783. }
  784. return null;
  785. }
  786. public bool NewBuff(int Id, bool charge = true)
  787. {
  788. GuildBuffInfo info = Envir.FindGuildBuffInfo(Id);
  789. if (info == null)
  790. {
  791. return false;
  792. }
  793. if (GetBuff(Id) != null)
  794. {
  795. return false;
  796. }
  797. if (charge)
  798. {
  799. if (Info.SparePoints < info.PointsRequirement)
  800. return false;
  801. if (info.TimeLimit > 0 && info.ActivationCost > 0)
  802. {
  803. uint activationCost = (uint)info.ActivationCost;
  804. if (Info.Gold < activationCost)
  805. return false;
  806. }
  807. }
  808. GuildBuff buff = new GuildBuff()
  809. {
  810. Id = Id,
  811. Info = info,
  812. Active = true,
  813. };
  814. buff.ActiveTimeRemaining = buff.Info.TimeLimit;
  815. if (charge)
  816. {
  817. ChargeForBuff(buff);
  818. if (info.TimeLimit > 0 && info.ActivationCost > 0)
  819. {
  820. uint activationCost = (uint)info.ActivationCost;
  821. Info.Gold -= activationCost;
  822. SendServerPacket(new ServerPackets.GuildStorageGoldChange() { Type = 2, Name = "", Amount = activationCost });
  823. }
  824. }
  825. BuffList.Add(buff);
  826. List<GuildBuff> NewBuff = new List<GuildBuff>
  827. {
  828. buff
  829. };
  830. SendServerPacket(new ServerPackets.GuildBuffList { ActiveBuffs = NewBuff });
  831. //now tell everyone our new sparepoints
  832. for (int i = 0; i < Ranks.Count; i++)
  833. {
  834. for (int j = 0; j < Ranks[i].Members.Count; j++)
  835. {
  836. if (Ranks[i].Members[j].Player != null)
  837. {
  838. SendGuildStatus((PlayerObject)Ranks[i].Members[j].Player);
  839. }
  840. }
  841. }
  842. NeedSave = true;
  843. RefreshAllStats();
  844. return true;
  845. }
  846. private void ChargeForBuff(GuildBuff buff)
  847. {
  848. if (buff == null) return;
  849. Info.SparePoints -= buff.Info.PointsRequirement;
  850. }
  851. public void ActivateBuff(int Id)
  852. {
  853. GuildBuff buff = GetBuff(Id);
  854. if (buff == null) return;
  855. if (buff.Active) return;//no point activating buffs if they have no time limit anyway
  856. if (Info.Gold < buff.Info.ActivationCost) return;
  857. buff.Active = true;
  858. buff.ActiveTimeRemaining = buff.Info.TimeLimit;
  859. Info.Gold -= (uint)buff.Info.ActivationCost;
  860. List<GuildBuff> NewBuff = new List<GuildBuff>
  861. {
  862. buff
  863. };
  864. SendServerPacket(new ServerPackets.GuildBuffList { ActiveBuffs = NewBuff });
  865. SendServerPacket(new ServerPackets.GuildStorageGoldChange() { Type = 2, Name = "", Amount = (uint)buff.Info.ActivationCost });
  866. NeedSave = true;
  867. RefreshAllStats();
  868. }
  869. public void RemoveAllBuffs()
  870. {
  871. //note this removes them all but doesnt reset the sparepoints!(should make some sort of 'refreshpoints' procedure for that
  872. SendServerPacket(new ServerPackets.GuildBuffList {Remove = 1, ActiveBuffs = BuffList});
  873. BuffList.Clear();
  874. RefreshAllStats();
  875. NeedSave = true;
  876. }
  877. }
  878. public class GuildAtWar
  879. {
  880. public GuildObject GuildA;
  881. public GuildObject GuildB;
  882. public long TimeRemaining;
  883. public GuildAtWar(GuildObject a, GuildObject b)
  884. {
  885. GuildA = a;
  886. GuildB = b;
  887. GuildA.WarringGuilds.Add(GuildB);
  888. GuildB.WarringGuilds.Add(GuildA);
  889. TimeRemaining = Settings.Minute * Settings.Guild_WarTime;
  890. }
  891. public void EndWar()
  892. {
  893. GuildA.WarringGuilds.Remove(GuildB);
  894. GuildB.WarringGuilds.Remove(GuildA);
  895. GuildA.SendMessage(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WarEndedWithGuild), GuildB.Name), ChatType.Guild);
  896. GuildB.SendMessage(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.WarEndedWithGuild), GuildA.Name), ChatType.Guild);
  897. GuildA.UpdatePlayersColours();
  898. GuildB.UpdatePlayersColours();
  899. }
  900. }
  901. public class GuildItemVolume
  902. {
  903. public ItemInfo Item;
  904. public string ItemName;
  905. public uint Amount;
  906. }
  907. }