MirConnection.cs 77 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366
  1. using System.Collections.Concurrent;
  2. using System.Net.Sockets;
  3. using Server.MirDatabase;
  4. using Server.MirEnvir;
  5. using Server.MirObjects;
  6. using C = ClientPackets;
  7. using S = ServerPackets;
  8. using System.Text.RegularExpressions;
  9. using Server.Utils;
  10. namespace Server.MirNetwork
  11. {
  12. public enum GameStage { None, Login, Select, Game, Observer, Disconnected }
  13. public class MirConnection
  14. {
  15. protected static Envir Envir
  16. {
  17. get { return Envir.Main; }
  18. }
  19. protected static MessageQueue MessageQueue
  20. {
  21. get { return MessageQueue.Instance; }
  22. }
  23. public readonly int SessionID;
  24. public readonly string IPAddress;
  25. public GameStage Stage;
  26. private TcpClient _client;
  27. private ConcurrentQueue<Packet> _receiveList;
  28. private ConcurrentQueue<Packet> _sendList;
  29. private Queue<Packet> _retryList;
  30. private bool _disconnecting;
  31. public bool Connected;
  32. public bool Disconnecting
  33. {
  34. get { return _disconnecting; }
  35. set
  36. {
  37. if (_disconnecting == value) return;
  38. _disconnecting = value;
  39. TimeOutTime = Envir.Time + 500;
  40. }
  41. }
  42. public readonly long TimeConnected;
  43. public long TimeDisconnected, TimeOutTime;
  44. byte[] _rawData = new byte[0];
  45. byte[] _rawBytes = new byte[8 * 1024];
  46. public AccountInfo Account;
  47. public PlayerObject Player;
  48. public List<MirConnection> Observers = new List<MirConnection>();
  49. public MirConnection Observing;
  50. public List<ItemInfo> SentItemInfo = new List<ItemInfo>();
  51. public List<MonsterInfo> SentMonsterInfo = new List<MonsterInfo>();
  52. public List<NPCInfo> SentNPCInfo = new List<NPCInfo>();
  53. public List<QuestInfo> SentQuestInfo = new List<QuestInfo>();
  54. public List<RecipeInfo> SentRecipeInfo = new List<RecipeInfo>();
  55. public List<UserItem> SentChatItem = new List<UserItem>(); //TODO - Add Expiry time
  56. public List<MapInfo> SentMapInfo = new List<MapInfo>();
  57. public List<ulong> SentHeroInfo = new List<ulong>();
  58. public bool WorldMapSetupSent;
  59. public bool StorageSent;
  60. public bool HeroStorageSent;
  61. public Dictionary<long, DateTime> SentRankings = new Dictionary<long, DateTime>();
  62. private DateTime _dataCounterReset;
  63. private int _dataCounter;
  64. private FixedSizedQueue<Packet> _lastPackets;
  65. public MirConnection(int sessionID, TcpClient client)
  66. {
  67. SessionID = sessionID;
  68. IPAddress = client.Client.RemoteEndPoint.ToString().Split(':')[0];
  69. Envir.UpdateIPBlock(IPAddress, TimeSpan.FromSeconds(Settings.IPBlockSeconds));
  70. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IPAddressConnected), IPAddress));
  71. _client = client;
  72. _client.NoDelay = true;
  73. TimeConnected = Envir.Time;
  74. TimeOutTime = TimeConnected + Settings.TimeOut;
  75. _lastPackets = new FixedSizedQueue<Packet>(10);
  76. _receiveList = new ConcurrentQueue<Packet>();
  77. _sendList = new ConcurrentQueue<Packet>();
  78. _sendList.Enqueue(new S.Connected());
  79. _retryList = new Queue<Packet>();
  80. Connected = true;
  81. BeginReceive();
  82. }
  83. public void AddObserver(MirConnection c)
  84. {
  85. Observers.Add(c);
  86. if (c.Observing != null)
  87. c.Observing.Observers.Remove(c);
  88. c.Observing = this;
  89. c.Stage = GameStage.Observer;
  90. }
  91. private void BeginReceive()
  92. {
  93. if (!Connected) return;
  94. try
  95. {
  96. _client.Client.BeginReceive(_rawBytes, 0, _rawBytes.Length, SocketFlags.None, ReceiveData, _rawBytes);
  97. }
  98. catch
  99. {
  100. Disconnecting = true;
  101. }
  102. }
  103. private void ReceiveData(IAsyncResult result)
  104. {
  105. if (!Connected) return;
  106. int dataRead;
  107. try
  108. {
  109. dataRead = _client.Client.EndReceive(result);
  110. }
  111. catch
  112. {
  113. Disconnecting = true;
  114. return;
  115. }
  116. if (dataRead == 0)
  117. {
  118. Disconnecting = true;
  119. return;
  120. }
  121. if (_dataCounterReset < Envir.Now)
  122. {
  123. _dataCounterReset = Envir.Now.AddSeconds(5);
  124. _dataCounter = 0;
  125. }
  126. _dataCounter++;
  127. try
  128. {
  129. byte[] rawBytes = result.AsyncState as byte[];
  130. byte[] temp = _rawData;
  131. _rawData = new byte[dataRead + temp.Length];
  132. Buffer.BlockCopy(temp, 0, _rawData, 0, temp.Length);
  133. Buffer.BlockCopy(rawBytes, 0, _rawData, temp.Length, dataRead);
  134. Packet p;
  135. while ((p = Packet.ReceivePacket(_rawData, out _rawData)) != null)
  136. _receiveList.Enqueue(p);
  137. }
  138. catch
  139. {
  140. Envir.UpdateIPBlock(IPAddress, TimeSpan.FromHours(24));
  141. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IPAddressDisconnectedInvalidPacket), IPAddress));
  142. Disconnecting = true;
  143. return;
  144. }
  145. if (_dataCounter > Settings.MaxPacket)
  146. {
  147. Envir.UpdateIPBlock(IPAddress, TimeSpan.FromHours(24));
  148. List<string> packetList = new List<string>();
  149. while (_lastPackets.Count > 0)
  150. {
  151. _lastPackets.TryDequeue(out Packet pkt);
  152. Enum.TryParse<ClientPacketIds>((pkt?.Index ?? 0).ToString(), out ClientPacketIds cPacket);
  153. packetList.Add(cPacket.ToString());
  154. }
  155. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.IPAddressDisconnectedLargePackets), IPAddress, String.Join(",", packetList.Distinct())));
  156. Disconnecting = true;
  157. return;
  158. }
  159. BeginReceive();
  160. }
  161. private void BeginSend(List<byte> data)
  162. {
  163. if (!Connected || data.Count == 0) return;
  164. //Interlocked.Add(ref Network.Sent, data.Count);
  165. try
  166. {
  167. _client.Client.BeginSend(data.ToArray(), 0, data.Count, SocketFlags.None, SendData, Disconnecting);
  168. }
  169. catch
  170. {
  171. Disconnecting = true;
  172. }
  173. }
  174. private void SendData(IAsyncResult result)
  175. {
  176. try
  177. {
  178. _client.Client.EndSend(result);
  179. }
  180. catch
  181. { }
  182. }
  183. public void Enqueue(Packet p)
  184. {
  185. if (p == null) return;
  186. if (_sendList != null && p != null)
  187. _sendList.Enqueue(p);
  188. if (!p.Observable) return;
  189. foreach (MirConnection c in Observers)
  190. c.Enqueue(p);
  191. }
  192. public void Process()
  193. {
  194. if (_client == null || !_client.Connected)
  195. {
  196. Disconnect(20);
  197. return;
  198. }
  199. while (!_receiveList.IsEmpty && !Disconnecting)
  200. {
  201. Packet p;
  202. if (!_receiveList.TryDequeue(out p)) continue;
  203. _lastPackets.Enqueue(p);
  204. TimeOutTime = Envir.Time + Settings.TimeOut;
  205. ProcessPacket(p);
  206. if (_receiveList == null)
  207. return;
  208. }
  209. while (_retryList.Count > 0)
  210. _receiveList.Enqueue(_retryList.Dequeue());
  211. if (Envir.Time > TimeOutTime)
  212. {
  213. Disconnect(21);
  214. return;
  215. }
  216. if (_sendList == null || _sendList.Count <= 0) return;
  217. List<byte> data = new List<byte>();
  218. while (!_sendList.IsEmpty)
  219. {
  220. Packet p;
  221. if (!_sendList.TryDequeue(out p) || p == null) continue;
  222. data.AddRange(p.GetPacketBytes());
  223. }
  224. BeginSend(data);
  225. }
  226. private void ProcessPacket(Packet p)
  227. {
  228. if (p == null || Disconnecting) return;
  229. switch (p.Index)
  230. {
  231. case (short)ClientPacketIds.ClientVersion:
  232. ClientVersion((C.ClientVersion) p);
  233. break;
  234. case (short)ClientPacketIds.Disconnect:
  235. Disconnect(22);
  236. break;
  237. case (short)ClientPacketIds.KeepAlive: // Keep Alive
  238. ClientKeepAlive((C.KeepAlive)p);
  239. break;
  240. case (short)ClientPacketIds.NewAccount:
  241. NewAccount((C.NewAccount) p);
  242. break;
  243. case (short)ClientPacketIds.ChangePassword:
  244. ChangePassword((C.ChangePassword) p);
  245. break;
  246. case (short)ClientPacketIds.UnlockStorage:
  247. UnlockStorage((C.UnlockStorage)p);
  248. break;
  249. case (short)ClientPacketIds.SetStoragePassword:
  250. SetStoragePassword((C.SetStoragePassword)p);
  251. break;
  252. case (short)ClientPacketIds.RemoveStoragePassword:
  253. RemoveStoragePassword((C.RemoveStoragePassword)p);
  254. break;
  255. case (short)ClientPacketIds.Login:
  256. Login((C.Login) p);
  257. break;
  258. case (short)ClientPacketIds.NewCharacter:
  259. NewCharacter((C.NewCharacter) p);
  260. break;
  261. case (short)ClientPacketIds.DeleteCharacter:
  262. DeleteCharacter((C.DeleteCharacter) p);
  263. break;
  264. case (short)ClientPacketIds.StartGame:
  265. StartGame((C.StartGame) p);
  266. break;
  267. case (short)ClientPacketIds.LogOut:
  268. LogOut();
  269. break;
  270. case (short)ClientPacketIds.Turn:
  271. Turn((C.Turn) p);
  272. break;
  273. case (short)ClientPacketIds.Walk:
  274. Walk((C.Walk) p);
  275. break;
  276. case (short)ClientPacketIds.Run:
  277. Run((C.Run) p);
  278. break;
  279. case (short)ClientPacketIds.Chat:
  280. Chat((C.Chat) p);
  281. break;
  282. case (short)ClientPacketIds.MoveItem:
  283. MoveItem((C.MoveItem) p);
  284. break;
  285. case (short)ClientPacketIds.StoreItem:
  286. StoreItem((C.StoreItem) p);
  287. break;
  288. case (short)ClientPacketIds.DepositRefineItem:
  289. DepositRefineItem((C.DepositRefineItem)p);
  290. break;
  291. case (short)ClientPacketIds.RetrieveRefineItem:
  292. RetrieveRefineItem((C.RetrieveRefineItem)p);
  293. break;
  294. case (short)ClientPacketIds.RefineCancel:
  295. RefineCancel((C.RefineCancel)p);
  296. break;
  297. case (short)ClientPacketIds.RefineItem:
  298. RefineItem((C.RefineItem)p);
  299. break;
  300. case (short)ClientPacketIds.CheckRefine:
  301. CheckRefine((C.CheckRefine)p);
  302. break;
  303. case (short)ClientPacketIds.ReplaceWedRing:
  304. ReplaceWedRing((C.ReplaceWedRing)p);
  305. break;
  306. case (short)ClientPacketIds.DepositTradeItem:
  307. DepositTradeItem((C.DepositTradeItem)p);
  308. break;
  309. case (short)ClientPacketIds.RetrieveTradeItem:
  310. RetrieveTradeItem((C.RetrieveTradeItem)p);
  311. break;
  312. case (short)ClientPacketIds.TakeBackItem:
  313. TakeBackItem((C.TakeBackItem) p);
  314. break;
  315. case (short)ClientPacketIds.MergeItem:
  316. MergeItem((C.MergeItem) p);
  317. break;
  318. case (short)ClientPacketIds.EquipItem:
  319. EquipItem((C.EquipItem) p);
  320. break;
  321. case (short)ClientPacketIds.RemoveItem:
  322. RemoveItem((C.RemoveItem) p);
  323. break;
  324. case (short)ClientPacketIds.RemoveSlotItem:
  325. RemoveSlotItem((C.RemoveSlotItem)p);
  326. break;
  327. case (short)ClientPacketIds.SplitItem:
  328. SplitItem((C.SplitItem) p);
  329. break;
  330. case (short)ClientPacketIds.UseItem:
  331. UseItem((C.UseItem) p);
  332. break;
  333. case (short)ClientPacketIds.DropItem:
  334. DropItem((C.DropItem) p);
  335. break;
  336. case (short)ClientPacketIds.TakeBackHeroItem:
  337. TakeBackHeroItem((C.TakeBackHeroItem)p);
  338. break;
  339. case (short)ClientPacketIds.TransferHeroItem:
  340. TransferHeroItem((C.TransferHeroItem)p);
  341. break;
  342. case (short)ClientPacketIds.DropGold:
  343. DropGold((C.DropGold) p);
  344. break;
  345. case (short)ClientPacketIds.PickUp:
  346. PickUp();
  347. break;
  348. case (short)ClientPacketIds.RequestMapInfo:
  349. RequestMapInfo((C.RequestMapInfo)p);
  350. break;
  351. case (short)ClientPacketIds.RequestMonsterInfo:
  352. RequestMonsterInfo((C.RequestMonsterInfo)p);
  353. break;
  354. case (short)ClientPacketIds.RequestNPCInfo:
  355. RequestNPCInfo((C.RequestNPCInfo)p);
  356. break;
  357. case (short)ClientPacketIds.RequestItemInfo:
  358. RequestItemInfo((C.RequestItemInfo)p);
  359. break;
  360. case (short)ClientPacketIds.TeleportToNPC:
  361. TeleportToNPC((C.TeleportToNPC)p);
  362. break;
  363. case (short)ClientPacketIds.SearchMap:
  364. SearchMap((C.SearchMap)p);
  365. break;
  366. case (short)ClientPacketIds.Inspect:
  367. Inspect((C.Inspect)p);
  368. break;
  369. case (short)ClientPacketIds.Observe:
  370. Observe((C.Observe)p);
  371. break;
  372. case (short)ClientPacketIds.ChangeAMode:
  373. ChangeAMode((C.ChangeAMode)p);
  374. break;
  375. case (short)ClientPacketIds.ChangePMode:
  376. ChangePMode((C.ChangePMode)p);
  377. break;
  378. case (short)ClientPacketIds.ChangeTrade:
  379. ChangeTrade((C.ChangeTrade)p);
  380. break;
  381. case (short)ClientPacketIds.Attack:
  382. Attack((C.Attack)p);
  383. break;
  384. case (short)ClientPacketIds.RangeAttack:
  385. RangeAttack((C.RangeAttack)p);
  386. break;
  387. case (short)ClientPacketIds.Harvest:
  388. Harvest((C.Harvest)p);
  389. break;
  390. case (short)ClientPacketIds.CallNPC:
  391. CallNPC((C.CallNPC)p);
  392. break;
  393. case (short)ClientPacketIds.BuyItem:
  394. BuyItem((C.BuyItem)p);
  395. break;
  396. case (short)ClientPacketIds.CraftItem:
  397. CraftItem((C.CraftItem)p);
  398. break;
  399. case (short)ClientPacketIds.SellItem:
  400. SellItem((C.SellItem)p);
  401. break;
  402. case (short)ClientPacketIds.RepairItem:
  403. RepairItem((C.RepairItem)p);
  404. break;
  405. case (short)ClientPacketIds.BuyItemBack:
  406. BuyItemBack((C.BuyItemBack)p);
  407. break;
  408. case (short)ClientPacketIds.SRepairItem:
  409. SRepairItem((C.SRepairItem)p);
  410. break;
  411. case (short)ClientPacketIds.MagicKey:
  412. MagicKey((C.MagicKey)p);
  413. break;
  414. case (short)ClientPacketIds.Magic:
  415. Magic((C.Magic)p);
  416. break;
  417. case (short)ClientPacketIds.SwitchGroup:
  418. SwitchGroup((C.SwitchGroup)p);
  419. return;
  420. case (short)ClientPacketIds.AddMember:
  421. AddMember((C.AddMember)p);
  422. return;
  423. case (short)ClientPacketIds.DellMember:
  424. DelMember((C.DelMember)p);
  425. return;
  426. case (short)ClientPacketIds.GroupInvite:
  427. GroupInvite((C.GroupInvite)p);
  428. return;
  429. case (short)ClientPacketIds.NewHero:
  430. NewHero((C.NewHero)p);
  431. break;
  432. case (short)ClientPacketIds.SetAutoPotValue:
  433. SetAutoPotValue((C.SetAutoPotValue)p);
  434. break;
  435. case (short)ClientPacketIds.SetAutoPotItem:
  436. SetAutoPotItem((C.SetAutoPotItem)p);
  437. break;
  438. case (short)ClientPacketIds.SetHeroBehaviour:
  439. SetHeroBehaviour((C.SetHeroBehaviour)p);
  440. break;
  441. case (short)ClientPacketIds.ChangeHero:
  442. ChangeHero((C.ChangeHero)p);
  443. break;
  444. case (short)ClientPacketIds.TownRevive:
  445. TownRevive();
  446. return;
  447. case (short)ClientPacketIds.SpellToggle:
  448. SpellToggle((C.SpellToggle)p);
  449. return;
  450. case (short)ClientPacketIds.ConsignItem:
  451. ConsignItem((C.ConsignItem)p);
  452. return;
  453. case (short)ClientPacketIds.MarketSearch:
  454. MarketSearch((C.MarketSearch)p);
  455. return;
  456. case (short)ClientPacketIds.MarketRefresh:
  457. MarketRefresh();
  458. return;
  459. case (short)ClientPacketIds.MarketPage:
  460. MarketPage((C.MarketPage) p);
  461. return;
  462. case (short)ClientPacketIds.MarketBuy:
  463. MarketBuy((C.MarketBuy)p);
  464. return;
  465. case (short)ClientPacketIds.MarketGetBack:
  466. MarketGetBack((C.MarketGetBack)p);
  467. return;
  468. case (short)ClientPacketIds.MarketSellNow:
  469. MarketSellNow((C.MarketSellNow)p);
  470. return;
  471. case (short)ClientPacketIds.RequestUserName:
  472. RequestUserName((C.RequestUserName)p);
  473. return;
  474. case (short)ClientPacketIds.RequestChatItem:
  475. RequestChatItem((C.RequestChatItem)p);
  476. return;
  477. case (short)ClientPacketIds.EditGuildMember:
  478. EditGuildMember((C.EditGuildMember)p);
  479. return;
  480. case (short)ClientPacketIds.EditGuildNotice:
  481. EditGuildNotice((C.EditGuildNotice)p);
  482. return;
  483. case (short)ClientPacketIds.GuildInvite:
  484. GuildInvite((C.GuildInvite)p);
  485. return;
  486. case (short)ClientPacketIds.RequestGuildInfo:
  487. RequestGuildInfo((C.RequestGuildInfo)p);
  488. return;
  489. case (short)ClientPacketIds.GuildNameReturn:
  490. GuildNameReturn((C.GuildNameReturn)p);
  491. return;
  492. case (short)ClientPacketIds.GuildStorageGoldChange:
  493. GuildStorageGoldChange((C.GuildStorageGoldChange)p);
  494. return;
  495. case (short)ClientPacketIds.GuildStorageItemChange:
  496. GuildStorageItemChange((C.GuildStorageItemChange)p);
  497. return;
  498. case (short)ClientPacketIds.GuildWarReturn:
  499. GuildWarReturn((C.GuildWarReturn)p);
  500. return;
  501. case (short)ClientPacketIds.MarriageRequest:
  502. MarriageRequest((C.MarriageRequest)p);
  503. return;
  504. case (short)ClientPacketIds.MarriageReply:
  505. MarriageReply((C.MarriageReply)p);
  506. return;
  507. case (short)ClientPacketIds.ChangeMarriage:
  508. ChangeMarriage((C.ChangeMarriage)p);
  509. return;
  510. case (short)ClientPacketIds.DivorceRequest:
  511. DivorceRequest((C.DivorceRequest)p);
  512. return;
  513. case (short)ClientPacketIds.DivorceReply:
  514. DivorceReply((C.DivorceReply)p);
  515. return;
  516. case (short)ClientPacketIds.AddMentor:
  517. AddMentor((C.AddMentor)p);
  518. return;
  519. case (short)ClientPacketIds.MentorReply:
  520. MentorReply((C.MentorReply)p);
  521. return;
  522. case (short)ClientPacketIds.AllowMentor:
  523. AllowMentor((C.AllowMentor)p);
  524. return;
  525. case (short)ClientPacketIds.CancelMentor:
  526. CancelMentor((C.CancelMentor)p);
  527. return;
  528. case (short)ClientPacketIds.TradeRequest:
  529. TradeRequest((C.TradeRequest)p);
  530. return;
  531. case (short)ClientPacketIds.TradeGold:
  532. TradeGold((C.TradeGold)p);
  533. return;
  534. case (short)ClientPacketIds.TradeReply:
  535. TradeReply((C.TradeReply)p);
  536. return;
  537. case (short)ClientPacketIds.TradeConfirm:
  538. TradeConfirm((C.TradeConfirm)p);
  539. return;
  540. case (short)ClientPacketIds.TradeCancel:
  541. TradeCancel((C.TradeCancel)p);
  542. return;
  543. case (short)ClientPacketIds.EquipSlotItem:
  544. EquipSlotItem((C.EquipSlotItem)p);
  545. break;
  546. case (short)ClientPacketIds.FishingCast:
  547. FishingCast((C.FishingCast)p);
  548. break;
  549. case (short)ClientPacketIds.FishingChangeAutocast:
  550. FishingChangeAutocast((C.FishingChangeAutocast)p);
  551. break;
  552. case (short)ClientPacketIds.AcceptQuest:
  553. AcceptQuest((C.AcceptQuest)p);
  554. break;
  555. case (short)ClientPacketIds.FinishQuest:
  556. FinishQuest((C.FinishQuest)p);
  557. break;
  558. case (short)ClientPacketIds.AbandonQuest:
  559. AbandonQuest((C.AbandonQuest)p);
  560. break;
  561. case (short)ClientPacketIds.ShareQuest:
  562. ShareQuest((C.ShareQuest)p);
  563. break;
  564. case (short)ClientPacketIds.AcceptReincarnation:
  565. AcceptReincarnation();
  566. break;
  567. case (short)ClientPacketIds.CancelReincarnation:
  568. CancelReincarnation();
  569. break;
  570. case (short)ClientPacketIds.CombineItem:
  571. CombineItem((C.CombineItem)p);
  572. break;
  573. case (short)ClientPacketIds.AwakeningNeedMaterials:
  574. AwakeningNeedMaterials((C.AwakeningNeedMaterials)p);
  575. break;
  576. case (short)ClientPacketIds.AwakeningLockedItem:
  577. Enqueue(new S.AwakeningLockedItem { UniqueID = ((C.AwakeningLockedItem)p).UniqueID, Locked = ((C.AwakeningLockedItem)p).Locked });
  578. break;
  579. case (short)ClientPacketIds.Awakening:
  580. Awakening((C.Awakening)p);
  581. break;
  582. case (short)ClientPacketIds.DisassembleItem:
  583. DisassembleItem((C.DisassembleItem)p);
  584. break;
  585. case (short)ClientPacketIds.DowngradeAwakening:
  586. DowngradeAwakening((C.DowngradeAwakening)p);
  587. break;
  588. case (short)ClientPacketIds.ResetAddedItem:
  589. ResetAddedItem((C.ResetAddedItem)p);
  590. break;
  591. case (short)ClientPacketIds.SendMail:
  592. SendMail((C.SendMail)p);
  593. break;
  594. case (short)ClientPacketIds.ReadMail:
  595. ReadMail((C.ReadMail)p);
  596. break;
  597. case (short)ClientPacketIds.CollectParcel:
  598. CollectParcel((C.CollectParcel)p);
  599. break;
  600. case (short)ClientPacketIds.DeleteMail:
  601. DeleteMail((C.DeleteMail)p);
  602. break;
  603. case (short)ClientPacketIds.LockMail:
  604. LockMail((C.LockMail)p);
  605. break;
  606. case (short)ClientPacketIds.MailLockedItem:
  607. Enqueue(new S.MailLockedItem { UniqueID = ((C.MailLockedItem)p).UniqueID, Locked = ((C.MailLockedItem)p).Locked });
  608. break;
  609. case (short)ClientPacketIds.MailCost:
  610. MailCost((C.MailCost)p);
  611. break;
  612. case (short)ClientPacketIds.RequestIntelligentCreatureUpdates:
  613. RequestIntelligentCreatureUpdates((C.RequestIntelligentCreatureUpdates)p);
  614. break;
  615. case (short)ClientPacketIds.UpdateIntelligentCreature:
  616. UpdateIntelligentCreature((C.UpdateIntelligentCreature)p);
  617. break;
  618. case (short)ClientPacketIds.IntelligentCreaturePickup:
  619. IntelligentCreaturePickup((C.IntelligentCreaturePickup)p);
  620. break;
  621. case (short)ClientPacketIds.AddFriend:
  622. AddFriend((C.AddFriend)p);
  623. break;
  624. case (short)ClientPacketIds.RemoveFriend:
  625. RemoveFriend((C.RemoveFriend)p);
  626. break;
  627. case (short)ClientPacketIds.RefreshFriends:
  628. {
  629. if (Stage != GameStage.Game) return;
  630. Player.GetFriends();
  631. break;
  632. }
  633. case (short)ClientPacketIds.AddMemo:
  634. AddMemo((C.AddMemo)p);
  635. break;
  636. case (short)ClientPacketIds.GuildBuffUpdate:
  637. GuildBuffUpdate((C.GuildBuffUpdate)p);
  638. break;
  639. case (short)ClientPacketIds.GameshopBuy:
  640. GameshopBuy((C.GameshopBuy)p);
  641. return;
  642. case (short)ClientPacketIds.NPCConfirmInput:
  643. NPCConfirmInput((C.NPCConfirmInput)p);
  644. break;
  645. case (short)ClientPacketIds.ReportIssue:
  646. ReportIssue((C.ReportIssue)p);
  647. break;
  648. case (short)ClientPacketIds.GetRanking:
  649. GetRanking((C.GetRanking)p);
  650. break;
  651. case (short)ClientPacketIds.Opendoor:
  652. Opendoor((C.Opendoor)p);
  653. break;
  654. case (short)ClientPacketIds.GetRentedItems:
  655. GetRentedItems();
  656. break;
  657. case (short)ClientPacketIds.ItemRentalRequest:
  658. ItemRentalRequest();
  659. break;
  660. case (short)ClientPacketIds.ItemRentalFee:
  661. ItemRentalFee((C.ItemRentalFee)p);
  662. break;
  663. case (short)ClientPacketIds.ItemRentalPeriod:
  664. ItemRentalPeriod((C.ItemRentalPeriod)p);
  665. break;
  666. case (short)ClientPacketIds.DepositRentalItem:
  667. DepositRentalItem((C.DepositRentalItem)p);
  668. break;
  669. case (short)ClientPacketIds.RetrieveRentalItem:
  670. RetrieveRentalItem((C.RetrieveRentalItem)p);
  671. break;
  672. case (short)ClientPacketIds.CancelItemRental:
  673. CancelItemRental();
  674. break;
  675. case (short)ClientPacketIds.ItemRentalLockFee:
  676. ItemRentalLockFee();
  677. break;
  678. case (short)ClientPacketIds.ItemRentalLockItem:
  679. ItemRentalLockItem();
  680. break;
  681. case (short)ClientPacketIds.ConfirmItemRental:
  682. ConfirmItemRental();
  683. break;
  684. case (short)ClientPacketIds.GuildTerritoryPage:
  685. GuildTerritoryPage((C.GuildTerritoryPage)p);
  686. return;
  687. case (short)ClientPacketIds.PurchaseGuildTerritory:
  688. PurchaseGuildTerritory((C.PurchaseGuildTerritory)p);
  689. return;
  690. case (short)ClientPacketIds.DeleteItem:
  691. DeleteItem((C.DeleteItem)p);
  692. break;
  693. default:
  694. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.InvalidPacketReceived), p.Index));
  695. break;
  696. }
  697. }
  698. public void SoftDisconnect(byte reason)
  699. {
  700. Stage = GameStage.Disconnected;
  701. TimeDisconnected = Envir.Time;
  702. lock (Envir.AccountLock)
  703. {
  704. if (Player != null)
  705. Player.StopGame(reason);
  706. if (Account != null && Account.Connection == this)
  707. Account.Connection = null;
  708. }
  709. Account = null;
  710. }
  711. public void Disconnect(byte reason)
  712. {
  713. if (!Connected) return;
  714. Connected = false;
  715. Stage = GameStage.Disconnected;
  716. TimeDisconnected = Envir.Time;
  717. lock (Envir.Connections)
  718. Envir.Connections.Remove(this);
  719. lock (Envir.AccountLock)
  720. {
  721. if (Player != null)
  722. Player.StopGame(reason);
  723. if (Account != null && Account.Connection == this)
  724. Account.Connection = null;
  725. }
  726. if (Observing != null)
  727. Observing.Observers.Remove(this);
  728. Account = null;
  729. _sendList = null;
  730. _receiveList = null;
  731. _retryList = null;
  732. _rawData = null;
  733. if (_client != null) _client.Client.Dispose();
  734. _client = null;
  735. }
  736. public void SendDisconnect(byte reason)
  737. {
  738. if (!Connected)
  739. {
  740. Disconnecting = true;
  741. SoftDisconnect(reason);
  742. return;
  743. }
  744. Disconnecting = true;
  745. List<byte> data = new List<byte>();
  746. data.AddRange(new S.Disconnect { Reason = reason }.GetPacketBytes());
  747. BeginSend(data);
  748. SoftDisconnect(reason);
  749. }
  750. public void CleanObservers()
  751. {
  752. foreach (MirConnection c in Observers)
  753. {
  754. c.Stage = GameStage.Login;
  755. c.Enqueue(new S.ReturnToLogin());
  756. }
  757. }
  758. private void ClientVersion(C.ClientVersion p)
  759. {
  760. if (Stage != GameStage.None) return;
  761. if (Settings.CheckVersion)
  762. {
  763. bool match = false;
  764. foreach (var hash in Settings.VersionHashes)
  765. {
  766. if (Functions.CompareBytes(hash, p.VersionHash))
  767. {
  768. match = true;
  769. break;
  770. }
  771. }
  772. if (!match)
  773. {
  774. Disconnecting = true;
  775. List<byte> data = new List<byte>();
  776. data.AddRange(new S.ClientVersion { Result = 0 }.GetPacketBytes());
  777. BeginSend(data);
  778. SoftDisconnect(10);
  779. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.PlayerDisconnectedWrongClientVersion), SessionID));
  780. return;
  781. }
  782. }
  783. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.ClientVersionMatched), SessionID, IPAddress));
  784. Enqueue(new S.ClientVersion { Result = 1 });
  785. Stage = GameStage.Login;
  786. }
  787. private void ClientKeepAlive(C.KeepAlive p)
  788. {
  789. Enqueue(new S.KeepAlive
  790. {
  791. Time = p.Time
  792. });
  793. }
  794. private void NewAccount(C.NewAccount p)
  795. {
  796. if (Stage != GameStage.Login) return;
  797. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.NewAccountBeingCreated), SessionID, IPAddress));
  798. Envir.NewAccount(p, this);
  799. }
  800. private void ChangePassword(C.ChangePassword p)
  801. {
  802. if (Stage != GameStage.Login) return;
  803. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.PasswordBeingChanged), SessionID, IPAddress));
  804. Envir.ChangePassword(p, this);
  805. }
  806. private void UnlockStorage(C.UnlockStorage p)
  807. {
  808. if (Stage != GameStage.Game || Player == null || Account == null)
  809. {
  810. Enqueue(new S.StorageUnlockResult { Result = 3, HasPassword = Account != null && Account.HasStoragePassword });
  811. return;
  812. }
  813. if (!CanAccessStorageNpc())
  814. {
  815. Enqueue(new S.StorageUnlockResult { Result = 3, HasPassword = Account.HasStoragePassword });
  816. return;
  817. }
  818. if (!Account.HasStoragePassword)
  819. {
  820. Player.SetStorageUnlocked(true);
  821. Enqueue(new S.StorageUnlockResult { Result = 4, HasPassword = false });
  822. return;
  823. }
  824. if (!Envir.IsPasswordValid(p.Password))
  825. {
  826. Enqueue(new S.StorageUnlockResult { Result = 1, HasPassword = true });
  827. return;
  828. }
  829. if (!Account.ValidateStoragePassword(p.Password))
  830. {
  831. Enqueue(new S.StorageUnlockResult { Result = 2, HasPassword = true });
  832. return;
  833. }
  834. Player.SetStorageUnlocked(true);
  835. Enqueue(new S.StorageUnlockResult { Result = 0, HasPassword = true });
  836. Player.SendStorage();
  837. }
  838. private void SetStoragePassword(C.SetStoragePassword p)
  839. {
  840. if (Stage != GameStage.Game || Player == null || Account == null)
  841. {
  842. Enqueue(new S.StoragePasswordResult { Result = 0, Removing = false, HasPassword = Account != null && Account.HasStoragePassword, LastSetTime = Account?.StoragePasswordLastSet ?? DateTime.MinValue });
  843. return;
  844. }
  845. if (!CanAccessStorageNpc())
  846. {
  847. Enqueue(new S.StoragePasswordResult { Result = 0, Removing = false, HasPassword = Account.HasStoragePassword, LastSetTime = Account.StoragePasswordLastSet });
  848. return;
  849. }
  850. if (!Envir.IsPasswordValid(p.NewPassword))
  851. {
  852. Enqueue(new S.StoragePasswordResult { Result = 3, Removing = false, HasPassword = Account.HasStoragePassword, LastSetTime = Account.StoragePasswordLastSet });
  853. return;
  854. }
  855. if (Account.HasStoragePassword)
  856. {
  857. if (!Envir.IsPasswordValid(p.CurrentPassword))
  858. {
  859. Enqueue(new S.StoragePasswordResult { Result = 1, Removing = false, HasPassword = true, LastSetTime = Account.StoragePasswordLastSet });
  860. return;
  861. }
  862. if (!Account.ValidateStoragePassword(p.CurrentPassword))
  863. {
  864. Enqueue(new S.StoragePasswordResult { Result = 2, Removing = false, HasPassword = true, LastSetTime = Account.StoragePasswordLastSet });
  865. return;
  866. }
  867. }
  868. Account.StoragePassword = p.NewPassword;
  869. Account.StoragePasswordLastSet = Envir.Now;
  870. Player.SetStorageUnlocked(true);
  871. Enqueue(new S.StoragePasswordResult { Result = 4, Removing = false, HasPassword = true, LastSetTime = Account.StoragePasswordLastSet });
  872. }
  873. private void RemoveStoragePassword(C.RemoveStoragePassword p)
  874. {
  875. if (Stage != GameStage.Game || Player == null || Account == null)
  876. {
  877. Enqueue(new S.StoragePasswordResult { Result = 0, Removing = true, HasPassword = Account != null && Account.HasStoragePassword, LastSetTime = Account?.StoragePasswordLastSet ?? DateTime.MinValue });
  878. return;
  879. }
  880. if (!CanAccessStorageNpc())
  881. {
  882. Enqueue(new S.StoragePasswordResult { Result = 0, Removing = true, HasPassword = Account.HasStoragePassword, LastSetTime = Account.StoragePasswordLastSet });
  883. return;
  884. }
  885. if (!Account.HasStoragePassword)
  886. {
  887. Enqueue(new S.StoragePasswordResult { Result = 5, Removing = true, HasPassword = false, LastSetTime = DateTime.MinValue });
  888. return;
  889. }
  890. if (!Envir.IsPasswordValid(p.CurrentPassword))
  891. {
  892. Enqueue(new S.StoragePasswordResult { Result = 1, Removing = true, HasPassword = true, LastSetTime = Account.StoragePasswordLastSet });
  893. return;
  894. }
  895. if (!Account.ValidateStoragePassword(p.CurrentPassword))
  896. {
  897. Enqueue(new S.StoragePasswordResult { Result = 2, Removing = true, HasPassword = true, LastSetTime = Account.StoragePasswordLastSet });
  898. return;
  899. }
  900. Account.ClearStoragePassword();
  901. Player.SetStorageUnlocked(true);
  902. Enqueue(new S.StoragePasswordResult { Result = 4, Removing = true, HasPassword = false, LastSetTime = DateTime.MinValue });
  903. }
  904. private bool CanAccessStorageNpc()
  905. {
  906. if (Player == null) return false;
  907. if (Player.NPCPage == null || !String.Equals(Player.NPCPage.Key, NPCScript.StorageKey, StringComparison.CurrentCultureIgnoreCase))
  908. return false;
  909. NPCObject ob = null;
  910. for (int i = 0; i < Player.CurrentMap.NPCs.Count; i++)
  911. {
  912. if (Player.CurrentMap.NPCs[i].ObjectID != Player.NPCObjectID) continue;
  913. ob = Player.CurrentMap.NPCs[i];
  914. break;
  915. }
  916. return ob != null && Functions.InRange(ob.CurrentLocation, Player.CurrentLocation, Globals.DataRange);
  917. }
  918. private void Login(C.Login p)
  919. {
  920. if (Stage != GameStage.Login) return;
  921. MessageQueue.Enqueue(GameLanguage.ServerTextMap.GetLocalization((ServerTextKeys.UserLoggingIn), SessionID, IPAddress));
  922. Envir.Login(p, this);
  923. }
  924. private void NewCharacter(C.NewCharacter p)
  925. {
  926. if (Stage != GameStage.Select) return;
  927. Envir.NewCharacter(p, this, Account.AdminAccount);
  928. }
  929. private void DeleteCharacter(C.DeleteCharacter p)
  930. {
  931. if (Stage != GameStage.Select) return;
  932. if (!Settings.AllowDeleteCharacter)
  933. {
  934. Enqueue(new S.DeleteCharacter { Result = 0 });
  935. return;
  936. }
  937. CharacterInfo temp = null;
  938. for (int i = 0; i < Account.Characters.Count; i++)
  939. {
  940. if (Account.Characters[i].Index != p.CharacterIndex) continue;
  941. temp = Account.Characters[i];
  942. break;
  943. }
  944. if (temp == null)
  945. {
  946. Enqueue(new S.DeleteCharacter { Result = 1 });
  947. return;
  948. }
  949. temp.Deleted = true;
  950. temp.DeleteDate = Envir.Now;
  951. Envir.RemoveRank(temp);
  952. Enqueue(new S.DeleteCharacterSuccess { CharacterIndex = temp.Index });
  953. }
  954. private void StartGame(C.StartGame p)
  955. {
  956. if (Stage != GameStage.Select) return;
  957. if (!Settings.AllowStartGame && (Account == null || (Account != null && !Account.AdminAccount)))
  958. {
  959. Enqueue(new S.StartGame { Result = 0 });
  960. return;
  961. }
  962. if (Account == null)
  963. {
  964. Enqueue(new S.StartGame { Result = 1 });
  965. return;
  966. }
  967. CharacterInfo info = null;
  968. for (int i = 0; i < Account.Characters.Count; i++)
  969. {
  970. if (Account.Characters[i].Index != p.CharacterIndex) continue;
  971. info = Account.Characters[i];
  972. break;
  973. }
  974. if (info == null)
  975. {
  976. Enqueue(new S.StartGame { Result = 2 });
  977. return;
  978. }
  979. if (info.Banned)
  980. {
  981. if (info.ExpiryDate > Envir.Now)
  982. {
  983. Enqueue(new S.StartGameBanned { Reason = info.BanReason, ExpiryDate = info.ExpiryDate });
  984. return;
  985. }
  986. info.Banned = false;
  987. }
  988. info.BanReason = string.Empty;
  989. info.ExpiryDate = DateTime.MinValue;
  990. long delay = (long) (Envir.Now - info.LastLogoutDate).TotalMilliseconds;
  991. //if (delay < Settings.RelogDelay)
  992. //{
  993. // Enqueue(new S.StartGameDelay { Milliseconds = Settings.RelogDelay - delay });
  994. // return;
  995. //}
  996. Player = new PlayerObject(info, this);
  997. Player.StartGame();
  998. }
  999. public void LogOut()
  1000. {
  1001. if (Stage == GameStage.Game)
  1002. {
  1003. if (Envir.Time < Player.LogTime)
  1004. {
  1005. Enqueue(new S.LogOutFailed());
  1006. return;
  1007. }
  1008. Player.StopGame(23);
  1009. Stage = GameStage.Select;
  1010. Player = null;
  1011. Enqueue(new S.LogOutSuccess { Characters = Account.GetSelectInfo() });
  1012. }
  1013. else if (Stage == GameStage.Observer)
  1014. {
  1015. if (Observing != null)
  1016. Observing.Observers.Remove(this);
  1017. Observing = null;
  1018. Stage = GameStage.Select;
  1019. Enqueue(new S.LogOutSuccess { Characters = Account.GetSelectInfo() });
  1020. }
  1021. }
  1022. private void Turn(C.Turn p)
  1023. {
  1024. if (Stage != GameStage.Game) return;
  1025. if (Player.ActionTime > Envir.Time)
  1026. _retryList.Enqueue(p);
  1027. else
  1028. Player.Turn(p.Direction);
  1029. }
  1030. private void Walk(C.Walk p)
  1031. {
  1032. if (Stage != GameStage.Game) return;
  1033. if (Player.ActionTime > Envir.Time)
  1034. _retryList.Enqueue(p);
  1035. else
  1036. Player.Walk(p.Direction);
  1037. }
  1038. private void Run(C.Run p)
  1039. {
  1040. if (Stage != GameStage.Game) return;
  1041. if (Player.ActionTime > Envir.Time)
  1042. _retryList.Enqueue(p);
  1043. else
  1044. Player.Run(p.Direction);
  1045. }
  1046. private void Chat(C.Chat p)
  1047. {
  1048. if (p.Message.Length > Globals.MaxChatLength)
  1049. {
  1050. SendDisconnect(2);
  1051. return;
  1052. }
  1053. if (Stage == GameStage.Game)
  1054. {
  1055. Player.Chat(p.Message, p.LinkedItems);
  1056. }
  1057. else if (Stage == GameStage.Observer)
  1058. {
  1059. if (!p.Message.StartsWith("@")) return;
  1060. string message = p.Message.Remove(0, 1);
  1061. string[] parts = message.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  1062. if (parts.Length == 0) return;
  1063. if (string.Equals(parts[0], "OBSERVE", StringComparison.OrdinalIgnoreCase))
  1064. {
  1065. if (parts.Length < 2) return;
  1066. PlayerObject player = Envir.GetPlayer(parts[1]);
  1067. if (player == null) return;
  1068. if ((!player.AllowObserve || !Settings.AllowObserve) &&
  1069. (Account == null || !Account.AdminAccount)) return;
  1070. player.AddObserver(this);
  1071. }
  1072. }
  1073. }
  1074. private void MoveItem(C.MoveItem p)
  1075. {
  1076. if (Stage != GameStage.Game) return;
  1077. Player.MoveItem(p.Grid, p.From, p.To);
  1078. }
  1079. private void StoreItem(C.StoreItem p)
  1080. {
  1081. if (Stage != GameStage.Game) return;
  1082. Player.StoreItem(p.From, p.To);
  1083. }
  1084. private void DepositRefineItem(C.DepositRefineItem p)
  1085. {
  1086. if (Stage != GameStage.Game) return;
  1087. Player.DepositRefineItem(p.From, p.To);
  1088. }
  1089. private void RetrieveRefineItem(C.RetrieveRefineItem p)
  1090. {
  1091. if (Stage != GameStage.Game) return;
  1092. Player.RetrieveRefineItem(p.From, p.To);
  1093. }
  1094. private void RefineCancel(C.RefineCancel p)
  1095. {
  1096. if (Stage != GameStage.Game) return;
  1097. Player.RefineCancel();
  1098. }
  1099. private void RefineItem(C.RefineItem p)
  1100. {
  1101. if (Stage != GameStage.Game) return;
  1102. Player.RefineItem(p.UniqueID);
  1103. }
  1104. private void CheckRefine(C.CheckRefine p)
  1105. {
  1106. if (Stage != GameStage.Game) return;
  1107. Player.CheckRefine(p.UniqueID);
  1108. }
  1109. private void ReplaceWedRing(C.ReplaceWedRing p)
  1110. {
  1111. if (Stage != GameStage.Game) return;
  1112. Player.ReplaceWeddingRing(p.UniqueID);
  1113. }
  1114. private void DepositTradeItem(C.DepositTradeItem p)
  1115. {
  1116. if (Stage != GameStage.Game) return;
  1117. Player.DepositTradeItem(p.From, p.To);
  1118. }
  1119. private void RetrieveTradeItem(C.RetrieveTradeItem p)
  1120. {
  1121. if (Stage != GameStage.Game) return;
  1122. Player.RetrieveTradeItem(p.From, p.To);
  1123. }
  1124. private void TakeBackItem(C.TakeBackItem p)
  1125. {
  1126. if (Stage != GameStage.Game) return;
  1127. Player.TakeBackItem(p.From, p.To);
  1128. }
  1129. private void MergeItem(C.MergeItem p)
  1130. {
  1131. if (Stage != GameStage.Game) return;
  1132. Player.MergeItem(p.GridFrom, p.GridTo, p.IDFrom, p.IDTo);
  1133. }
  1134. private void EquipItem(C.EquipItem p)
  1135. {
  1136. if (Stage != GameStage.Game) return;
  1137. Player.EquipItem(p.Grid, p.UniqueID, p.To);
  1138. }
  1139. private void RemoveItem(C.RemoveItem p)
  1140. {
  1141. if (Stage != GameStage.Game) return;
  1142. Player.RemoveItem(p.Grid, p.UniqueID, p.To);
  1143. }
  1144. private void RemoveSlotItem(C.RemoveSlotItem p)
  1145. {
  1146. if (Stage != GameStage.Game) return;
  1147. Player.RemoveSlotItem(p.Grid, p.UniqueID, p.To, p.GridTo, p.FromUniqueID);
  1148. }
  1149. private void SplitItem(C.SplitItem p)
  1150. {
  1151. if (Stage != GameStage.Game) return;
  1152. Player.SplitItem(p.Grid, p.UniqueID, p.Count);
  1153. }
  1154. private void UseItem(C.UseItem p)
  1155. {
  1156. if (Stage != GameStage.Game) return;
  1157. switch (p.Grid)
  1158. {
  1159. case MirGridType.Inventory:
  1160. Player.UseItem(p.UniqueID);
  1161. break;
  1162. case MirGridType.HeroInventory:
  1163. Player.HeroUseItem(p.UniqueID);
  1164. break;
  1165. }
  1166. }
  1167. private void DropItem(C.DropItem p)
  1168. {
  1169. if (Stage != GameStage.Game) return;
  1170. Player.DropItem(p.UniqueID, p.Count, p.HeroInventory);
  1171. }
  1172. private void TakeBackHeroItem(C.TakeBackHeroItem p)
  1173. {
  1174. if (Stage != GameStage.Game) return;
  1175. Player.TakeBackHeroItem(p.From, p.To);
  1176. }
  1177. private void TransferHeroItem(C.TransferHeroItem p)
  1178. {
  1179. if (Stage != GameStage.Game) return;
  1180. Player.TransferHeroItem(p.From, p.To);
  1181. }
  1182. private void DropGold(C.DropGold p)
  1183. {
  1184. if (Stage != GameStage.Game) return;
  1185. Player.DropGold(p.Amount);
  1186. }
  1187. private void PickUp()
  1188. {
  1189. if (Stage != GameStage.Game) return;
  1190. Player.PickUp();
  1191. }
  1192. private void RequestMapInfo(C.RequestMapInfo p)
  1193. {
  1194. if (Stage != GameStage.Game) return;
  1195. Player.RequestMapInfo(p.MapIndex);
  1196. }
  1197. private void RequestMonsterInfo(C.RequestMonsterInfo p)
  1198. {
  1199. if (Stage != GameStage.Game) return;
  1200. Player.RequestMonsterInfo(p.MonsterIndex);
  1201. }
  1202. private void RequestNPCInfo(C.RequestNPCInfo p)
  1203. {
  1204. if (Stage != GameStage.Game) return;
  1205. Player.RequestNPCInfo(p.NPCIndex);
  1206. }
  1207. private void RequestItemInfo(C.RequestItemInfo p)
  1208. {
  1209. if (Stage != GameStage.Game) return;
  1210. Player.RequestItemInfo(p.ItemIndex);
  1211. }
  1212. private void TeleportToNPC(C.TeleportToNPC p)
  1213. {
  1214. if (Stage != GameStage.Game) return;
  1215. Player.TeleportToNPC(p.ObjectID);
  1216. }
  1217. private void SearchMap(C.SearchMap p)
  1218. {
  1219. if (Stage != GameStage.Game) return;
  1220. Player.SearchMap(p.Text);
  1221. }
  1222. private void Inspect(C.Inspect p)
  1223. {
  1224. if (Stage != GameStage.Game && Stage != GameStage.Observer) return;
  1225. if (p.Ranking)
  1226. {
  1227. Envir.Inspect(this, (int)p.ObjectID);
  1228. }
  1229. else if (p.Hero)
  1230. {
  1231. Envir.InspectHero(this, (int)p.ObjectID);
  1232. }
  1233. else
  1234. {
  1235. Envir.Inspect(this, p.ObjectID);
  1236. }
  1237. }
  1238. private void Observe(C.Observe p)
  1239. {
  1240. if (Stage != GameStage.Game && Stage != GameStage.Observer) return;
  1241. Envir.Observe(this, p.Name);
  1242. }
  1243. private void ChangeAMode(C.ChangeAMode p)
  1244. {
  1245. if (Stage != GameStage.Game) return;
  1246. Player.AMode = p.Mode;
  1247. Enqueue(new S.ChangeAMode {Mode = Player.AMode});
  1248. }
  1249. private void ChangePMode(C.ChangePMode p)
  1250. {
  1251. if (Stage != GameStage.Game) return;
  1252. Player.PMode = p.Mode;
  1253. Enqueue(new S.ChangePMode { Mode = Player.PMode });
  1254. }
  1255. private void ChangeTrade(C.ChangeTrade p)
  1256. {
  1257. if (Stage != GameStage.Game) return;
  1258. Player.AllowTrade = p.AllowTrade;
  1259. }
  1260. private void Attack(C.Attack p)
  1261. {
  1262. if (Stage != GameStage.Game) return;
  1263. if (!Player.Dead && (Player.ActionTime > Envir.Time || Player.AttackTime > Envir.Time))
  1264. _retryList.Enqueue(p);
  1265. else
  1266. Player.Attack(p.Direction, p.Spell);
  1267. }
  1268. private void RangeAttack(C.RangeAttack p)
  1269. {
  1270. if (Stage != GameStage.Game) return;
  1271. if (!Player.Dead && (Player.ActionTime > Envir.Time || Player.AttackTime > Envir.Time))
  1272. _retryList.Enqueue(p);
  1273. else
  1274. Player.RangeAttack(p.Direction, p.TargetLocation, p.TargetID);
  1275. }
  1276. private void Harvest(C.Harvest p)
  1277. {
  1278. if (Stage != GameStage.Game) return;
  1279. if (!Player.Dead && Player.ActionTime > Envir.Time)
  1280. _retryList.Enqueue(p);
  1281. else
  1282. Player.Harvest(p.Direction);
  1283. }
  1284. private void CallNPC(C.CallNPC p)
  1285. {
  1286. if (Stage != GameStage.Game) return;
  1287. if (p.Key.Length > 30) //No NPC Key should be that long.
  1288. {
  1289. SendDisconnect(2);
  1290. return;
  1291. }
  1292. if (p.ObjectID == Envir.DefaultNPC.LoadedObjectID && Player.NPCObjectID == Envir.DefaultNPC.LoadedObjectID)
  1293. {
  1294. Player.CallDefaultNPC(p.Key);
  1295. return;
  1296. }
  1297. if (p.ObjectID == uint.MaxValue)
  1298. {
  1299. Player.CallDefaultNPC(DefaultNPCType.Client, null);
  1300. return;
  1301. }
  1302. Player.CallNPC(p.ObjectID, p.Key);
  1303. }
  1304. private void BuyItem(C.BuyItem p)
  1305. {
  1306. if (Stage != GameStage.Game) return;
  1307. Player.BuyItem(p.ItemIndex, p.Count, p.Type);
  1308. }
  1309. private void CraftItem(C.CraftItem p)
  1310. {
  1311. if (Stage != GameStage.Game) return;
  1312. Player.CraftItem(p.UniqueID, p.Count, p.Slots);
  1313. }
  1314. private void SellItem(C.SellItem p)
  1315. {
  1316. if (Stage != GameStage.Game) return;
  1317. Player.SellItem(p.UniqueID, p.Count);
  1318. }
  1319. private void RepairItem(C.RepairItem p)
  1320. {
  1321. if (Stage != GameStage.Game) return;
  1322. Player.RepairItem(p.UniqueID);
  1323. }
  1324. private void BuyItemBack(C.BuyItemBack p)
  1325. {
  1326. if (Stage != GameStage.Game) return;
  1327. // Player.BuyItemBack(p.UniqueID, p.Count);
  1328. }
  1329. private void SRepairItem(C.SRepairItem p)
  1330. {
  1331. if (Stage != GameStage.Game) return;
  1332. Player.RepairItem(p.UniqueID, true);
  1333. }
  1334. private void MagicKey(C.MagicKey p)
  1335. {
  1336. if (Stage != GameStage.Game) return;
  1337. HumanObject actor = Player;
  1338. if (p.Key > 16 || p.OldKey > 16)
  1339. {
  1340. if (!Player.HeroSpawned || Player.Hero.Dead) return;
  1341. actor = Player.Hero;
  1342. }
  1343. for (int i = 0; i < actor.Info.Magics.Count; i++)
  1344. {
  1345. UserMagic magic = actor.Info.Magics[i];
  1346. if (magic.Spell != p.Spell)
  1347. {
  1348. if (magic.Key == p.Key)
  1349. magic.Key = 0;
  1350. continue;
  1351. }
  1352. magic.Key = p.Key;
  1353. }
  1354. }
  1355. private void Magic(C.Magic p)
  1356. {
  1357. if (Stage != GameStage.Game) return;
  1358. HumanObject actor = Player;
  1359. if (Player.HeroSpawned && p.ObjectID == Player.Hero.ObjectID)
  1360. actor = Player.Hero;
  1361. if (actor.Dead) return;
  1362. if (!actor.Dead && (actor.ActionTime > Envir.Time || actor.SpellTime > Envir.Time))
  1363. _retryList.Enqueue(p);
  1364. else
  1365. actor.BeginMagic(p.Spell, p.Direction, p.TargetID, p.Location, p.SpellTargetLock);
  1366. }
  1367. private void SwitchGroup(C.SwitchGroup p)
  1368. {
  1369. if (Stage != GameStage.Game) return;
  1370. Player.SwitchGroup(p.AllowGroup);
  1371. }
  1372. private void AddMember(C.AddMember p)
  1373. {
  1374. if (Stage != GameStage.Game) return;
  1375. Player.AddMember(p.Name);
  1376. }
  1377. private void DelMember(C.DelMember p)
  1378. {
  1379. if (Stage != GameStage.Game) return;
  1380. Player.DelMember(p.Name);
  1381. }
  1382. private void GroupInvite(C.GroupInvite p)
  1383. {
  1384. if (Stage != GameStage.Game) return;
  1385. Player.GroupInvite(p.AcceptInvite);
  1386. }
  1387. private void NewHero(C.NewHero p)
  1388. {
  1389. if (Stage != GameStage.Game) return;
  1390. Player.NewHero(p);
  1391. }
  1392. private void SetAutoPotValue(C.SetAutoPotValue p)
  1393. {
  1394. if (Stage != GameStage.Game) return;
  1395. Player.SetAutoPotValue(p.Stat, p.Value);
  1396. }
  1397. private void SetAutoPotItem(C.SetAutoPotItem p)
  1398. {
  1399. if (Stage != GameStage.Game) return;
  1400. Player.SetAutoPotItem(p.Grid, p.ItemIndex);
  1401. }
  1402. private void SetHeroBehaviour(C.SetHeroBehaviour p)
  1403. {
  1404. if (Stage != GameStage.Game) return;
  1405. Player.SetHeroBehaviour(p.Behaviour);
  1406. }
  1407. private void ChangeHero(C.ChangeHero p)
  1408. {
  1409. if (Stage != GameStage.Game) return;
  1410. Player.ChangeHero(p.ListIndex);
  1411. }
  1412. private void TownRevive()
  1413. {
  1414. if (Stage != GameStage.Game) return;
  1415. Player.TownRevive();
  1416. }
  1417. private void SpellToggle(C.SpellToggle p)
  1418. {
  1419. if (Stage != GameStage.Game) return;
  1420. if (p.canUse > SpellToggleState.None)
  1421. {
  1422. Player.SpellToggle(p.Spell, p.canUse);
  1423. return;
  1424. }
  1425. if (Player.HeroSpawned)
  1426. Player.Hero.SpellToggle(p.Spell, p.canUse);
  1427. }
  1428. private void ConsignItem(C.ConsignItem p)
  1429. {
  1430. if (Stage != GameStage.Game) return;
  1431. Player.ConsignItem(p.UniqueID, p.Price, p.Type);
  1432. }
  1433. private void GuildTerritoryPage(C.GuildTerritoryPage p)
  1434. {
  1435. if (Stage != GameStage.Game) return;
  1436. Player.GetGuildTerritories(p.Page);
  1437. }
  1438. private void PurchaseGuildTerritory(C.PurchaseGuildTerritory p)
  1439. {
  1440. if (Stage != GameStage.Game) return;
  1441. Player.PurchaseGuildTerritory(p.Owner);
  1442. }
  1443. private void MarketSearch(C.MarketSearch p)
  1444. {
  1445. if (Stage != GameStage.Game) return;
  1446. Player.UserMatch = p.Usermode;
  1447. Player.MinShapes = p.MinShape;
  1448. Player.MaxShapes = p.MaxShape;
  1449. Player.MarketPanelType = p.MarketType;
  1450. Player.MarketSearch(p.Match, p.Type);
  1451. }
  1452. private void MarketRefresh()
  1453. {
  1454. if (Stage != GameStage.Game) return;
  1455. Player.MarketSearch(string.Empty, Player.MatchType);
  1456. }
  1457. private void MarketPage(C.MarketPage p)
  1458. {
  1459. if (Stage != GameStage.Game) return;
  1460. Player.MarketPage(p.Page);
  1461. }
  1462. private void MarketBuy(C.MarketBuy p)
  1463. {
  1464. if (Stage != GameStage.Game) return;
  1465. Player.MarketBuy(p.AuctionID, p.BidPrice);
  1466. }
  1467. private void MarketSellNow(C.MarketSellNow p)
  1468. {
  1469. if (Stage != GameStage.Game) return;
  1470. Player.MarketSellNow(p.AuctionID);
  1471. }
  1472. private void MarketGetBack(C.MarketGetBack p)
  1473. {
  1474. if (Stage != GameStage.Game) return;
  1475. Player.MarketGetBack(p.Mode, p.AuctionID);
  1476. }
  1477. private void RequestUserName(C.RequestUserName p)
  1478. {
  1479. if (Stage != GameStage.Game) return;
  1480. Player.RequestUserName(p.UserID);
  1481. }
  1482. private void RequestChatItem(C.RequestChatItem p)
  1483. {
  1484. if (Stage != GameStage.Game) return;
  1485. Player.RequestChatItem(p.ChatItemID);
  1486. }
  1487. private void EditGuildMember(C.EditGuildMember p)
  1488. {
  1489. if (Stage != GameStage.Game) return;
  1490. Player.EditGuildMember(p.Name,p.RankName,p.RankIndex,p.ChangeType);
  1491. }
  1492. private void EditGuildNotice(C.EditGuildNotice p)
  1493. {
  1494. if (Stage != GameStage.Game) return;
  1495. Player.EditGuildNotice(p.notice);
  1496. }
  1497. private void GuildInvite(C.GuildInvite p)
  1498. {
  1499. if (Stage != GameStage.Game) return;
  1500. Player.GuildInvite(p.AcceptInvite);
  1501. }
  1502. private void RequestGuildInfo(C.RequestGuildInfo p)
  1503. {
  1504. if (Stage != GameStage.Game) return;
  1505. Player.RequestGuildInfo(p.Type);
  1506. }
  1507. private void GuildNameReturn(C.GuildNameReturn p)
  1508. {
  1509. if (Stage != GameStage.Game) return;
  1510. Player.GuildNameReturn(p.Name);
  1511. }
  1512. private void GuildStorageGoldChange(C.GuildStorageGoldChange p)
  1513. {
  1514. if (Stage != GameStage.Game) return;
  1515. Player.GuildStorageGoldChange(p.Type, p.Amount);
  1516. }
  1517. private void GuildStorageItemChange(C.GuildStorageItemChange p)
  1518. {
  1519. if (Stage != GameStage.Game) return;
  1520. Player.GuildStorageItemChange(p.Type, p.From, p.To);
  1521. }
  1522. private void GuildWarReturn(C.GuildWarReturn p)
  1523. {
  1524. if (Stage != GameStage.Game) return;
  1525. Player.GuildWarReturn(p.Name);
  1526. }
  1527. private void MarriageRequest(C.MarriageRequest p)
  1528. {
  1529. if (Stage != GameStage.Game) return;
  1530. Player.MarriageRequest();
  1531. }
  1532. private void MarriageReply(C.MarriageReply p)
  1533. {
  1534. if (Stage != GameStage.Game) return;
  1535. Player.MarriageReply(p.AcceptInvite);
  1536. }
  1537. private void ChangeMarriage(C.ChangeMarriage p)
  1538. {
  1539. if (Stage != GameStage.Game) return;
  1540. if (Player.Info.Married == 0)
  1541. {
  1542. Player.AllowMarriage = !Player.AllowMarriage;
  1543. if (Player.AllowMarriage)
  1544. Player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouAllowMarriageRequests), ChatType.Hint);
  1545. else
  1546. Player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouBlockMarriageRequests), ChatType.Hint);
  1547. }
  1548. else
  1549. {
  1550. Player.AllowLoverRecall = !Player.AllowLoverRecall;
  1551. if (Player.AllowLoverRecall)
  1552. Player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouAllowRecallFromLover), ChatType.Hint);
  1553. else
  1554. Player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.YouBlockRecallFromLover), ChatType.Hint);
  1555. }
  1556. }
  1557. private void DivorceRequest(C.DivorceRequest p)
  1558. {
  1559. if (Stage != GameStage.Game) return;
  1560. Player.DivorceRequest();
  1561. }
  1562. private void DivorceReply(C.DivorceReply p)
  1563. {
  1564. if (Stage != GameStage.Game) return;
  1565. Player.DivorceReply(p.AcceptInvite);
  1566. }
  1567. private void AddMentor(C.AddMentor p)
  1568. {
  1569. if (Stage != GameStage.Game) return;
  1570. Player.AddMentor(p.Name);
  1571. }
  1572. private void MentorReply(C.MentorReply p)
  1573. {
  1574. if (Stage != GameStage.Game) return;
  1575. Player.MentorReply(p.AcceptInvite);
  1576. }
  1577. private void AllowMentor(C.AllowMentor p)
  1578. {
  1579. if (Stage != GameStage.Game) return;
  1580. Player.AllowMentor = !Player.AllowMentor;
  1581. if (Player.AllowMentor)
  1582. Player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.AllowingMentorRequests), ChatType.Hint);
  1583. else
  1584. Player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.BlockingMentorRequests), ChatType.Hint);
  1585. }
  1586. private void CancelMentor(C.CancelMentor p)
  1587. {
  1588. if (Stage != GameStage.Game) return;
  1589. Player.MentorBreak(true);
  1590. }
  1591. private void TradeRequest(C.TradeRequest p)
  1592. {
  1593. if (Stage != GameStage.Game) return;
  1594. Player.TradeRequest();
  1595. }
  1596. private void TradeGold(C.TradeGold p)
  1597. {
  1598. if (Stage != GameStage.Game) return;
  1599. Player.TradeGold(p.Amount);
  1600. }
  1601. private void TradeReply(C.TradeReply p)
  1602. {
  1603. if (Stage != GameStage.Game) return;
  1604. Player.TradeReply(p.AcceptInvite);
  1605. }
  1606. private void TradeConfirm(C.TradeConfirm p)
  1607. {
  1608. if (Stage != GameStage.Game) return;
  1609. Player.TradeConfirm(p.Locked);
  1610. }
  1611. private void TradeCancel(C.TradeCancel p)
  1612. {
  1613. if (Stage != GameStage.Game) return;
  1614. Player.TradeCancel();
  1615. }
  1616. private void EquipSlotItem(C.EquipSlotItem p)
  1617. {
  1618. if (Stage != GameStage.Game) return;
  1619. Player.EquipSlotItem(p.Grid, p.UniqueID, p.To, p.GridTo, p.ToUniqueID);
  1620. }
  1621. private void FishingCast(C.FishingCast p)
  1622. {
  1623. if (Stage != GameStage.Game) return;
  1624. Player.FishingCast(p.CastOut, true);
  1625. }
  1626. private void FishingChangeAutocast(C.FishingChangeAutocast p)
  1627. {
  1628. if (Stage != GameStage.Game) return;
  1629. Player.FishingChangeAutocast(p.AutoCast);
  1630. }
  1631. private void AcceptQuest(C.AcceptQuest p)
  1632. {
  1633. if (Stage != GameStage.Game) return;
  1634. Player.AcceptQuest(p.QuestIndex); //p.NPCIndex,
  1635. }
  1636. private void FinishQuest(C.FinishQuest p)
  1637. {
  1638. if (Stage != GameStage.Game) return;
  1639. Player.FinishQuest(p.QuestIndex, p.SelectedItemIndex);
  1640. }
  1641. private void AbandonQuest(C.AbandonQuest p)
  1642. {
  1643. if (Stage != GameStage.Game) return;
  1644. Player.AbandonQuest(p.QuestIndex);
  1645. }
  1646. private void ShareQuest(C.ShareQuest p)
  1647. {
  1648. if (Stage != GameStage.Game) return;
  1649. Player.ShareQuest(p.QuestIndex);
  1650. }
  1651. private void AcceptReincarnation()
  1652. {
  1653. if (Stage != GameStage.Game) return;
  1654. if (Player.ReincarnationHost != null && Player.ReincarnationHost.ReincarnationReady)
  1655. {
  1656. Player.Revive(Player.Stats[Stat.HP] / 2, true);
  1657. Player.ReincarnationHost = null;
  1658. return;
  1659. }
  1660. Player.ReceiveChat(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.ReincarnationFailed), ChatType.System);
  1661. }
  1662. private void CancelReincarnation()
  1663. {
  1664. if (Stage != GameStage.Game) return;
  1665. Player.ReincarnationExpireTime = Envir.Time;
  1666. }
  1667. private void CombineItem(C.CombineItem p)
  1668. {
  1669. if (Stage != GameStage.Game) return;
  1670. Player.CombineItem(p.Grid, p.IDFrom, p.IDTo);
  1671. }
  1672. private void Awakening(C.Awakening p)
  1673. {
  1674. if (Stage != GameStage.Game) return;
  1675. Player.Awakening(p.UniqueID, p.Type);
  1676. }
  1677. private void AwakeningNeedMaterials(C.AwakeningNeedMaterials p)
  1678. {
  1679. if (Stage != GameStage.Game) return;
  1680. Player.AwakeningNeedMaterials(p.UniqueID, p.Type);
  1681. }
  1682. private void DisassembleItem(C.DisassembleItem p)
  1683. {
  1684. if (Stage != GameStage.Game) return;
  1685. Player.DisassembleItem(p.UniqueID);
  1686. }
  1687. private void DowngradeAwakening(C.DowngradeAwakening p)
  1688. {
  1689. if (Stage != GameStage.Game) return;
  1690. Player.DowngradeAwakening(p.UniqueID);
  1691. }
  1692. private void ResetAddedItem(C.ResetAddedItem p)
  1693. {
  1694. if (Stage != GameStage.Game) return;
  1695. Player.ResetAddedItem(p.UniqueID);
  1696. }
  1697. public void SendMail(C.SendMail p)
  1698. {
  1699. if (Stage != GameStage.Game) return;
  1700. if (p.Gold > 0 || p.ItemsIdx.Length > 0)
  1701. {
  1702. Player.SendMail(p.Name, p.Message, p.Gold, p.ItemsIdx, p.Stamped);
  1703. }
  1704. else
  1705. {
  1706. Player.SendMail(p.Name, p.Message);
  1707. }
  1708. }
  1709. public void ReadMail(C.ReadMail p)
  1710. {
  1711. if (Stage != GameStage.Game) return;
  1712. Player.ReadMail(p.MailID);
  1713. }
  1714. public void CollectParcel(C.CollectParcel p)
  1715. {
  1716. if (Stage != GameStage.Game) return;
  1717. Player.CollectMail(p.MailID);
  1718. }
  1719. public void DeleteMail(C.DeleteMail p)
  1720. {
  1721. if (Stage != GameStage.Game) return;
  1722. Player.DeleteMail(p.MailID);
  1723. }
  1724. public void LockMail(C.LockMail p)
  1725. {
  1726. if (Stage != GameStage.Game) return;
  1727. Player.LockMail(p.MailID, p.Lock);
  1728. }
  1729. public void MailCost(C.MailCost p)
  1730. {
  1731. if (Stage != GameStage.Game) return;
  1732. uint cost = Player.GetMailCost(p.ItemsIdx, p.Gold, p.Stamped);
  1733. Enqueue(new S.MailCost { Cost = cost });
  1734. }
  1735. private void RequestIntelligentCreatureUpdates(C.RequestIntelligentCreatureUpdates p)
  1736. {
  1737. if (Stage != GameStage.Game) return;
  1738. Player.SendIntelligentCreatureUpdates = p.Update;
  1739. }
  1740. private void UpdateIntelligentCreature(C.UpdateIntelligentCreature p)
  1741. {
  1742. if (Stage != GameStage.Game) return;
  1743. ClientIntelligentCreature petUpdate = p.Creature;
  1744. if (petUpdate == null) return;
  1745. if (p.ReleaseMe)
  1746. {
  1747. Player.ReleaseIntelligentCreature(petUpdate.PetType);
  1748. return;
  1749. }
  1750. else if (p.SummonMe)
  1751. {
  1752. Player.SummonIntelligentCreature(petUpdate.PetType);
  1753. return;
  1754. }
  1755. else if (p.UnSummonMe)
  1756. {
  1757. Player.UnSummonIntelligentCreature(petUpdate.PetType);
  1758. return;
  1759. }
  1760. else
  1761. {
  1762. //Update the creature info
  1763. for (int i = 0; i < Player.Info.IntelligentCreatures.Count; i++)
  1764. {
  1765. if (Player.Info.IntelligentCreatures[i].PetType == petUpdate.PetType)
  1766. {
  1767. var reg = new Regex(@"^[A-Za-z0-9]{" + Globals.MinCharacterNameLength + "," + Globals.MaxCharacterNameLength + "}$");
  1768. if (reg.IsMatch(petUpdate.CustomName))
  1769. {
  1770. Player.Info.IntelligentCreatures[i].CustomName = petUpdate.CustomName;
  1771. }
  1772. Player.Info.IntelligentCreatures[i].SlotIndex = petUpdate.SlotIndex;
  1773. Player.Info.IntelligentCreatures[i].Filter = petUpdate.Filter;
  1774. Player.Info.IntelligentCreatures[i].petMode = petUpdate.petMode;
  1775. }
  1776. else continue;
  1777. }
  1778. if (Player.CreatureSummoned)
  1779. {
  1780. if (Player.SummonedCreatureType == petUpdate.PetType)
  1781. Player.UpdateSummonedCreature(petUpdate.PetType);
  1782. }
  1783. }
  1784. }
  1785. private void IntelligentCreaturePickup(C.IntelligentCreaturePickup p)
  1786. {
  1787. if (Stage != GameStage.Game) return;
  1788. Player.IntelligentCreaturePickup(p.MouseMode, p.Location);
  1789. }
  1790. private void AddFriend(C.AddFriend p)
  1791. {
  1792. if (Stage != GameStage.Game) return;
  1793. Player.AddFriend(p.Name, p.Blocked);
  1794. }
  1795. private void RemoveFriend(C.RemoveFriend p)
  1796. {
  1797. if (Stage != GameStage.Game) return;
  1798. Player.RemoveFriend(p.CharacterIndex);
  1799. }
  1800. private void AddMemo(C.AddMemo p)
  1801. {
  1802. if (Stage != GameStage.Game) return;
  1803. Player.AddMemo(p.CharacterIndex, p.Memo);
  1804. }
  1805. private void GuildBuffUpdate(C.GuildBuffUpdate p)
  1806. {
  1807. if (Stage != GameStage.Game) return;
  1808. Player.GuildBuffUpdate(p.Action,p.Id);
  1809. }
  1810. private void GameshopBuy(C.GameshopBuy p)
  1811. {
  1812. if (Stage != GameStage.Game) return;
  1813. Player.GameshopBuy(p.GIndex, p.Quantity, p.PType);
  1814. }
  1815. private void NPCConfirmInput(C.NPCConfirmInput p)
  1816. {
  1817. if (Stage != GameStage.Game) return;
  1818. Player.NPCData["NPCInputStr"] = p.Value;
  1819. if (p.NPCID == Envir.DefaultNPC.LoadedObjectID && Player.NPCObjectID == Envir.DefaultNPC.LoadedObjectID)
  1820. {
  1821. Player.CallDefaultNPC(p.PageName);
  1822. return;
  1823. }
  1824. Player.CallNPC(Player.NPCObjectID, p.PageName);
  1825. }
  1826. public List<byte[]> Image = new List<byte[]>();
  1827. private void ReportIssue(C.ReportIssue p)
  1828. {
  1829. if (Stage != GameStage.Game) return;
  1830. return;
  1831. // Image.Add(p.Image);
  1832. // if (p.ImageChunk >= p.ImageSize)
  1833. // {
  1834. // System.Drawing.Image image = Functions.ByteArrayToImage(Functions.CombineArray(Image));
  1835. // image.Save("Reported-" + Player.Name + "-" + DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
  1836. // Image.Clear();
  1837. // }
  1838. }
  1839. private void GetRanking(C.GetRanking p)
  1840. {
  1841. if (Stage != GameStage.Game && Stage != GameStage.Observer) return;
  1842. Envir.GetRanking(this, p.RankType, p.RankIndex, p.OnlineOnly);
  1843. }
  1844. private void Opendoor(C.Opendoor p)
  1845. {
  1846. if (Stage != GameStage.Game) return;
  1847. Player.Opendoor(p.DoorIndex);
  1848. }
  1849. private void GetRentedItems()
  1850. {
  1851. if (Stage != GameStage.Game)
  1852. return;
  1853. Player.GetRentedItems();
  1854. }
  1855. private void ItemRentalRequest()
  1856. {
  1857. if (Stage != GameStage.Game)
  1858. return;
  1859. Player.ItemRentalRequest();
  1860. }
  1861. private void ItemRentalFee(C.ItemRentalFee p)
  1862. {
  1863. if (Stage != GameStage.Game)
  1864. return;
  1865. Player.SetItemRentalFee(p.Amount);
  1866. }
  1867. private void ItemRentalPeriod(C.ItemRentalPeriod p)
  1868. {
  1869. if (Stage != GameStage.Game)
  1870. return;
  1871. Player.SetItemRentalPeriodLength(p.Days);
  1872. }
  1873. private void DepositRentalItem(C.DepositRentalItem p)
  1874. {
  1875. if (Stage != GameStage.Game)
  1876. return;
  1877. Player.DepositRentalItem(p.From, p.To);
  1878. }
  1879. private void RetrieveRentalItem(C.RetrieveRentalItem p)
  1880. {
  1881. if (Stage != GameStage.Game)
  1882. return;
  1883. Player.RetrieveRentalItem(p.From, p.To);
  1884. }
  1885. private void CancelItemRental()
  1886. {
  1887. if (Stage != GameStage.Game)
  1888. return;
  1889. Player.CancelItemRental();
  1890. }
  1891. private void ItemRentalLockFee()
  1892. {
  1893. if (Stage != GameStage.Game)
  1894. return;
  1895. Player.ItemRentalLockFee();
  1896. }
  1897. private void ItemRentalLockItem()
  1898. {
  1899. if (Stage != GameStage.Game)
  1900. return;
  1901. Player.ItemRentalLockItem();
  1902. }
  1903. private void ConfirmItemRental()
  1904. {
  1905. if (Stage != GameStage.Game)
  1906. return;
  1907. Player.ConfirmItemRental();
  1908. }
  1909. public void CheckItemInfo(ItemInfo info, bool dontLoop = false)
  1910. {
  1911. if ((dontLoop == false) && (info.ClassBased | info.LevelBased)) //send all potential data so client can display it
  1912. {
  1913. for (int i = 0; i < Envir.ItemInfoList.Count; i++)
  1914. {
  1915. if ((Envir.ItemInfoList[i] != info) && (Envir.ItemInfoList[i].Name.StartsWith(info.Name)))
  1916. CheckItemInfo(Envir.ItemInfoList[i], true);
  1917. }
  1918. }
  1919. foreach (MirConnection observer in Observers)
  1920. observer.CheckItemInfo(info, dontLoop);
  1921. if (SentItemInfo.Contains(info)) return;
  1922. Enqueue(new S.NewItemInfo { Info = info });
  1923. SentItemInfo.Add(info);
  1924. }
  1925. public void CheckMonsterInfo(int monsterIndex)
  1926. {
  1927. CheckMonsterInfo(Envir.GetMonsterInfo(monsterIndex));
  1928. }
  1929. public void CheckMonsterInfo(MonsterInfo info)
  1930. {
  1931. if (info == null) return;
  1932. foreach (MirConnection observer in Observers)
  1933. observer.CheckMonsterInfo(info);
  1934. if (SentMonsterInfo.Contains(info)) return;
  1935. Enqueue(new S.NewMonsterInfo { Info = info.ClientInformation });
  1936. SentMonsterInfo.Add(info);
  1937. }
  1938. public void CheckNPCInfo(int npcIndex)
  1939. {
  1940. CheckNPCInfo(Envir.GetNPCInfo(npcIndex));
  1941. }
  1942. public void CheckNPCInfo(NPCInfo info)
  1943. {
  1944. if (info == null) return;
  1945. foreach (MirConnection observer in Observers)
  1946. observer.CheckNPCInfo(info);
  1947. if (SentNPCInfo.Contains(info)) return;
  1948. Enqueue(new S.NewNPCInfo { Info = info.ClientInformation });
  1949. SentNPCInfo.Add(info);
  1950. }
  1951. public void CheckItem(UserItem item)
  1952. {
  1953. CheckItemInfo(item.Info);
  1954. for (int i = 0; i < item.Slots.Length; i++)
  1955. {
  1956. if (item.Slots[i] == null) continue;
  1957. CheckItemInfo(item.Slots[i].Info);
  1958. }
  1959. CheckHeroInfo(item);
  1960. }
  1961. private void CheckHeroInfo(UserItem item)
  1962. {
  1963. if (item.AddedStats[Stat.Hero] == 0) return;
  1964. if (SentHeroInfo.Contains(item.UniqueID)) return;
  1965. HeroInfo heroInfo = Envir.GetHeroInfo(item.AddedStats[Stat.Hero]);
  1966. if (heroInfo == null) return;
  1967. Enqueue(new S.NewHeroInfo { Info = heroInfo.ClientInformation });
  1968. SentHeroInfo.Add(item.UniqueID);
  1969. }
  1970. private void DeleteItem(C.DeleteItem p)
  1971. {
  1972. if (Stage != GameStage.Game) return;
  1973. Player.DeleteItem(p.UniqueID, p.Count);
  1974. }
  1975. }
  1976. public class MirConnectionLog {
  1977. public string IPAddress = "";
  1978. public List<long> AccountsMade = new List<long>();
  1979. public List<long> CharactersMade = new List<long>();
  1980. }
  1981. }