/trunk/Demo.Mmose.GameServer/R.O.S.E.Server/R.O.S.E.Server/CharServer/Network/CharPacketHandlers.cs

# · C# · 3282 lines · 2346 code · 630 blank · 306 comment · 605 complexity · 985caedfed4948a22545067082db1ca5 MD5 · raw file

Large files are truncated click here to view the full file

  1. #region zh-CHS 版权所有 (C) 2006 - 2006 DemoSoft Corporation. 保留所有权利 | en Copyright (C) 2006 - 2006 DemoSoft Corporation. All Rights Reserved.
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // Program.cs : interface for the Program class.
  5. //
  6. // This file is a part of the Demo Toolkit for .NET.
  7. // 2006-2006 Demo Software, All Rights Reserved.
  8. //
  9. // This source code can only be used under the terms and conditions
  10. // outlined in the accompanying license agreement.
  11. //
  12. // mailto:caihuanqing@hotmail.com
  13. #region zh-CHS 包含名字空间 | en Include namespace
  14. using System;
  15. using System.Net;
  16. using System.Reflection;
  17. using System.Diagnostics;
  18. using Demo_G.O.S.E.Data;
  19. using Demo_R.O.S.E.Mobile;
  20. using Demo_G.O.S.E.ServerEngine.Common;
  21. using Demo_G.O.S.E.ServerEngine.Network;
  22. using Demo_R.O.S.E.Database;
  23. using Demo_R.O.S.E.Database.Model;
  24. using Demo_R.O.S.E.CharServer.Common;
  25. using Demo_G.O.S.E.ServerEngine.BuildScripts;
  26. #endregion
  27. namespace Demo_R.O.S.E.CharServer.Network
  28. {
  29. class CharPacketHandlers
  30. {
  31. #region zh-CHS CharacterServer CharServerConnectToWorld - 数据处理 | en CharacterServer CharServerConnectToWorld - OnPacketReceive
  32. /// <summary>
  33. ///
  34. /// </summary>
  35. /// <param name="netState"></param>
  36. /// <param name="packetReader"></param>
  37. internal static void CharServerConnectToWorld( NetState netState, PacketReader packetReader )
  38. {
  39. // 错误 不可能有创建
  40. if ( netState.ExtendData is WorldServerExtendData == true )
  41. {
  42. Debug.WriteLine( "CharPacketHandlers.CharServerConnectToWorld(...) - netState.ExtendData is WorldServerExtendData == true error!" );
  43. return;
  44. }
  45. else
  46. netState.ExtendData = null;
  47. // 不检查网络是否活动
  48. netState.IsCheckActivity = false;
  49. if ( packetReader.Size < 10/*6 + 4 + ?*/ )
  50. {
  51. Debug.WriteLine( "CharPacketHandlers.CharServerConnectToWorld(...) - packetReader.Size < 10 error!" );
  52. return;
  53. }
  54. long l_iWorldGUID = packetReader.ReadUInt32();
  55. long l_iWorldPort = packetReader.ReadUInt32();
  56. string l_strCharPassword = packetReader.ReadStringSafe();
  57. if ( l_strCharPassword == Program.ConfigInfo.CharPassword )
  58. {
  59. WorldServerExtendData l_ExtendData = new WorldServerExtendData();
  60. l_ExtendData.IsLoggedIn = true;
  61. l_ExtendData.WorldGUID = l_iWorldGUID;
  62. l_ExtendData.WorldHost = netState.NetAddress.ToString();
  63. l_ExtendData.WorldPort = l_iWorldPort;
  64. l_ExtendData.NetState = netState;
  65. netState.ExtendData = l_ExtendData;
  66. Program.AddWorldServerList( l_ExtendData );
  67. l_ExtendData.ConnectToWorldServer( l_ExtendData.WorldHost, l_ExtendData.WorldPort );
  68. }
  69. }
  70. #endregion
  71. #region zh-CHS CharacterServer LoginServerConnected - 数据处理 | en CharacterServer LoginConnected - OnPacketReceive
  72. /// <summary>
  73. ///
  74. /// </summary>
  75. /// <param name="netState"></param>
  76. /// <param name="packetReader"></param>
  77. internal static void LoginServerConnected( NetState netState, PacketReader packetReader )
  78. {
  79. // 错误 不可能有创建
  80. if ( netState.ExtendData is LoginServerExtendData == true )
  81. {
  82. Debug.WriteLine( "CharPacketHandlers.LoginConnected(...) - netState.ExtendData is LoginServerExtendData == true error!" );
  83. return;
  84. }
  85. else
  86. netState.ExtendData = null;
  87. if ( packetReader.Size < 6/*6 + ?*/ )
  88. {
  89. Debug.WriteLine( "CharPacketHandlers.LoginConnected(...) - packetReader.Size < 6 error!" );
  90. return;
  91. }
  92. // 不检查网络是否活动
  93. netState.IsCheckActivity = false;
  94. string l_strCharPassword = packetReader.ReadStringSafe();
  95. if ( l_strCharPassword == Program.ConfigInfo.CharPassword )
  96. {
  97. LoginServerExtendData l_ExtendData = new LoginServerExtendData();
  98. l_ExtendData.IsLoggedIn = true;
  99. netState.ExtendData = l_ExtendData;
  100. }
  101. }
  102. #endregion
  103. #region zh-CHS CharacterServer LoginServerAction - 数据处理 | en CharacterServer LoginDSClient - OnPacketReceive
  104. /// <summary>
  105. ///
  106. /// </summary>
  107. /// <param name="netState"></param>
  108. /// <param name="packetReader"></param>
  109. internal static void LoginServerAction( NetState netState, PacketReader packetReader )
  110. {
  111. LoginServerExtendData l_ExtendData = netState.ExtendData as LoginServerExtendData;
  112. if ( l_ExtendData == null )
  113. {
  114. Debug.WriteLine( "CharPacketHandlers.LoginAction(...) - l_ExtendData == null error!" );
  115. return;
  116. }
  117. if ( l_ExtendData.IsLoggedIn == false )
  118. {
  119. Debug.WriteLine( "CharPacketHandlers.LoginAction(...) - l_ExtendData.m_bIsLoggedIn == false error!" );
  120. return;
  121. }
  122. if ( packetReader.Size < 7/*6 + 1 + ?*/ )
  123. {
  124. Debug.WriteLine( "CharPacketHandlers.LoginAction(...) - packetReader.Size < 7 error!" );
  125. return;
  126. }
  127. byte l_Action = packetReader.ReadByte();
  128. switch ( l_Action )
  129. {
  130. case 1:
  131. long l_iAccountGuid = packetReader.ReadUInt32();
  132. LoginServer_Action01( netState, l_iAccountGuid );
  133. break;
  134. default:
  135. break;
  136. }
  137. }
  138. /// <summary>
  139. ///
  140. /// </summary>
  141. /// <param name="netState"></param>
  142. /// <param name="iAccountGuid"></param>
  143. internal static void LoginServer_Action01( NetState netState, long iAccountGuid )
  144. {
  145. NetState l_NetState = ProcessNet.GetClientByAccountGuid( iAccountGuid );
  146. if ( l_NetState == null )
  147. {
  148. Debug.WriteLine( "CharPacketHandlers.LoginAction_01(...) - l_NetState == null error!" );
  149. return;
  150. }
  151. CharServerExtendData l_CharExtendData = l_NetState.ExtendData as CharServerExtendData;
  152. if ( l_CharExtendData == null )
  153. {
  154. Debug.WriteLine( "CharPacketHandlers.LoginAction_01(...) - l_CharExtendData == null error!" );
  155. return;
  156. }
  157. if ( l_CharExtendData.IsLoggedIn == false )
  158. {
  159. Debug.WriteLine( "CharPacketHandlers.LoginAction_01(...) - l_CharExtendData.IsLoggedIn == false error!" );
  160. return;
  161. }
  162. NetState l_WorldNetState = ProcessNet.GetClientByWorldServerGuid( l_CharExtendData.ServerGuid );
  163. if ( l_WorldNetState == null )
  164. {
  165. Debug.WriteLine( "CharPacketHandlers.LoginAction_01(...) - l_WorldNetState == null error!" );
  166. return;
  167. }
  168. WorldServerExtendData l_WorldExtendData = l_WorldNetState.ExtendData as WorldServerExtendData;
  169. if ( l_WorldExtendData == null )
  170. {
  171. Debug.WriteLine( "CharPacketHandlers.LoginAction_01(...) - l_WorldExtendData == null error!" );
  172. return;
  173. }
  174. if ( l_WorldExtendData.IsLoggedIn == false )
  175. {
  176. Debug.WriteLine( "CharPacketHandlers.LoginAction_01(...) - l_WorldExtendData.IsLoggedIn == false error!" );
  177. return;
  178. }
  179. l_WorldExtendData.SendToWorldServer_0x502_Action01( iAccountGuid );
  180. }
  181. #endregion
  182. #region zh-CHS CharacterServer WorldServerAction - 数据处理 | en CharacterServer WSCharSelect - OnPacketReceive
  183. /// <summary>
  184. /// 选择新的人物
  185. /// </summary>
  186. /// <param name="netState"></param>
  187. /// <param name="packetReader"></param>
  188. internal static void WorldServerAction( NetState netState, PacketReader packetReader )
  189. {
  190. WorldServerExtendData l_ExtendData = netState.ExtendData as WorldServerExtendData;
  191. if ( l_ExtendData == null )
  192. {
  193. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_ExtendData == null error!" );
  194. return;
  195. }
  196. if ( l_ExtendData.IsLoggedIn == false )
  197. {
  198. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_ExtendData.m_bIsLoggedIn == false error!" );
  199. return;
  200. }
  201. if ( packetReader.Size < 10/*6 + 4*/ )
  202. {
  203. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - packetReader.Size < 10 error!" );
  204. return;
  205. }
  206. uint iAccountGuid = packetReader.ReadUInt32();
  207. NetState l_NetState = ProcessNet.GetClientByAccountGuid( iAccountGuid );
  208. if ( l_NetState == null )
  209. {
  210. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_NetState == null error!" );
  211. return;
  212. }
  213. CharServerExtendData l_CharExtendData = l_NetState.ExtendData as CharServerExtendData;
  214. if ( l_CharExtendData == null )
  215. {
  216. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_CharExtendData == null error!" );
  217. return;
  218. }
  219. if ( l_CharExtendData.IsLoggedIn == false )
  220. {
  221. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_CharExtendData.IsLoggedIn == false error!" );
  222. return;
  223. }
  224. l_NetState.Send( new WorldActionAck() );
  225. NetState l_WorldNetState = ProcessNet.GetClientByWorldServerGuid( l_CharExtendData.ServerGuid );
  226. if ( l_WorldNetState == null )
  227. {
  228. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_WorldNetState == null error!" );
  229. return;
  230. }
  231. WorldServerExtendData l_WorldExtendData = l_WorldNetState.ExtendData as WorldServerExtendData;
  232. if ( l_WorldExtendData == null )
  233. {
  234. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_WorldExtendData == null error!" );
  235. return;
  236. }
  237. if ( l_WorldExtendData.IsLoggedIn == false )
  238. {
  239. Debug.WriteLine( "CharPacketHandlers.WorldAction(...) - l_WorldExtendData.IsLoggedIn == false error!" );
  240. return;
  241. }
  242. l_WorldExtendData.SendToWorldServer_0x505( iAccountGuid );
  243. }
  244. #endregion
  245. #region zh-CHS CharacterServer DoIdentify - 数据处理 | en CharacterServer DoIdentify - OnPacketReceive
  246. /// <summary>
  247. /// Do player identification
  248. /// </summary>
  249. /// <param name="netState"></param>
  250. /// <param name="packetReader"></param>
  251. internal static void CharacterServerDoIdentify( NetState netState, PacketReader packetReader )
  252. {
  253. CharServerExtendData l_ExtendData = netState.ExtendData as CharServerExtendData;
  254. if ( l_ExtendData == null )
  255. {
  256. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_ExtendData == null error!" );
  257. return;
  258. }
  259. if ( l_ExtendData.IsLoggedIn == true )
  260. {
  261. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_ExtendData.m_bIsLoggedIn == true error!" );
  262. return;
  263. }
  264. if ( packetReader.Size < 42/*( 6 + 4 + 32)*/ )
  265. {
  266. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - packetReader.Size < 42 error!" );
  267. return;
  268. }
  269. int l_iAccountGuid = packetReader.ReadInt32();
  270. string l_strPassword = packetReader.ReadString( 32 );
  271. bool l_bIsReturn = false;
  272. Session l_Session = new Session( BaseDatabase.Domain );
  273. l_Session.BeginTransaction();
  274. {
  275. do
  276. {
  277. Query l_QueryAccounts = new Query( l_Session, "Select Accounts instances where {AccountsGuid}=@AccountGuid" );
  278. l_QueryAccounts.Parameters.Add( "@AccountGuid", l_iAccountGuid );
  279. QueryResult l_AccountsResult = l_QueryAccounts.Execute();
  280. if ( l_AccountsResult == null )
  281. {
  282. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_AccountsResult == null error!" );
  283. l_bIsReturn = true;
  284. break;
  285. }
  286. if ( l_AccountsResult.Count != 1 )
  287. {
  288. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_AccountsResult.Count != 1 error!" );
  289. l_bIsReturn = true;
  290. break;
  291. }
  292. Accounts l_Accounts = l_AccountsResult[0] as Accounts;
  293. if ( l_Accounts == null )
  294. {
  295. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_Accounts == null error!" );
  296. l_bIsReturn = true;
  297. break;
  298. }
  299. if ( l_Accounts.Password != l_strPassword )
  300. {
  301. l_bIsReturn = true;
  302. break;
  303. }
  304. //if ( l_Accounts.Locked == true )
  305. //{
  306. // l_bIsReturn = true;
  307. // break;
  308. //}
  309. //else
  310. // l_Accounts.Locked = true; // 用户已成功登陆 锁定帐户
  311. l_ExtendData.AccountGuid = l_Accounts.AccountsGuid;
  312. l_ExtendData.ServerGuid = l_Accounts.LastServerGuid;
  313. } while ( false );
  314. }
  315. l_Session.Commit();
  316. if ( l_bIsReturn == true )
  317. return;
  318. l_ExtendData.IsLoggedIn = true;
  319. Program.AddCharServerList( l_ExtendData );
  320. netState.Send( new DoIdentifyAck() );
  321. }
  322. /// <summary>
  323. ///
  324. /// </summary>
  325. /// <param name="netState"></param>
  326. internal static void DisconnectNetState( NetState netState )
  327. {
  328. CharServerExtendData l_ExtendData = netState.ExtendData as CharServerExtendData;
  329. if ( l_ExtendData == null )
  330. {
  331. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_ExtendData == null error!" );
  332. return;
  333. }
  334. if ( l_ExtendData.IsLoggedIn == true )
  335. {
  336. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_ExtendData.m_bIsLoggedIn == true error!" );
  337. return;
  338. }
  339. // 该先通知世界服务器人物已经断开
  340. // 。。。。。。
  341. bool l_bIsReturn = false;
  342. Session l_Session = new Session( BaseDatabase.Domain );
  343. l_Session.BeginTransaction();
  344. {
  345. do
  346. {
  347. Query l_QueryAccounts = new Query( l_Session, "Select Accounts instances where {AccountsGuid}=@AccountGuid" );
  348. l_QueryAccounts.Parameters.Add( "@AccountGuid", l_ExtendData.AccountGuid );
  349. QueryResult l_AccountsResult = l_QueryAccounts.Execute();
  350. if ( l_AccountsResult == null )
  351. {
  352. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_AccountsResult == null error!" );
  353. l_bIsReturn = true;
  354. break;
  355. }
  356. if ( l_AccountsResult.Count != 1 )
  357. {
  358. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_AccountsResult.Count != 1 error!" );
  359. l_bIsReturn = true;
  360. break;
  361. }
  362. Accounts l_Accounts = l_AccountsResult[0] as Accounts;
  363. if ( l_Accounts == null )
  364. {
  365. Debug.WriteLine( "CharPacketHandlers.CharacterServerDoIdentify(...) - l_Accounts == null error!" );
  366. l_bIsReturn = true;
  367. break;
  368. }
  369. if ( l_Accounts.Locked )
  370. l_Accounts.Locked = false; // 用户已成功断开 取消锁定的帐户
  371. } while ( false );
  372. }
  373. l_Session.Commit();
  374. if ( l_bIsReturn == true )
  375. return;
  376. l_ExtendData.IsLoggedIn = false;
  377. }
  378. #endregion
  379. #region zh-CHS CharacterServer GetCharacters - 数据处理 | en CharacterServer GetCharacters - OnPacketReceive
  380. /// <summary>
  381. ///
  382. /// </summary>
  383. private static PacketCharacter[] s_CharacterArray = new PacketCharacter[0];
  384. /// <summary>
  385. /// Get this clients character list
  386. /// </summary>
  387. /// <param name="netState"></param>
  388. /// <param name="packetReader"></param>
  389. internal static void CharacterServerGetCharacters( NetState netState, PacketReader packetReader )
  390. {
  391. CharServerExtendData l_ExtendData = netState.ExtendData as CharServerExtendData;
  392. if ( l_ExtendData == null )
  393. {
  394. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_ExtendData == null error!" );
  395. return;
  396. }
  397. if ( l_ExtendData.IsLoggedIn == false )
  398. {
  399. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_ExtendData.m_bIsLoggedIn == false error!" );
  400. return;
  401. }
  402. bool l_bIsReturn = false;
  403. PacketCharacter[] l_CharacterArray = s_CharacterArray;
  404. Session l_Session = new Session( BaseDatabase.Domain );
  405. l_Session.BeginTransaction();
  406. {
  407. do
  408. {
  409. Query l_QueryCharacters = new Query( l_Session, "Select Characters instances where {AccountGuid}=@AccountGuid" );
  410. l_QueryCharacters.Parameters.Add( "@AccountGuid", l_ExtendData.AccountGuid );
  411. QueryResult l_CharactersResult = l_QueryCharacters.Execute();
  412. if ( l_CharactersResult == null )
  413. {
  414. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_CharactersResult == null error!" );
  415. l_bIsReturn = true;
  416. break;
  417. }
  418. if ( l_CharactersResult.Count <= 0 )
  419. {
  420. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_CharactersResult.Count <= 0 error!" );
  421. l_bIsReturn = true;
  422. break;
  423. }
  424. // 如果大于5, 则检测看有效的是否超过5个,其余者为删除的人物
  425. if ( l_CharactersResult.Count > 5 )
  426. {
  427. int l_iCharactersCount = 0;
  428. for ( int iIndex = 0; iIndex < l_CharactersResult.Count; iIndex++ )
  429. {
  430. Characters l_Characters = l_CharactersResult[iIndex] as Characters;
  431. if ( l_Characters == null )
  432. {
  433. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_Characters == null error!" );
  434. l_bIsReturn = true;
  435. break;
  436. }
  437. if ( l_Characters.DeleteTime != null && l_Characters.DeleteTime < DateTime.Now )
  438. l_Characters.IsDelete = true;
  439. if ( l_Characters.IsDelete == false )
  440. ++l_iCharactersCount;
  441. }
  442. if ( l_bIsReturn == true )
  443. break;
  444. if ( l_iCharactersCount > 5 )
  445. {
  446. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_iCharactersCount > 5 error!" );
  447. l_bIsReturn = true;
  448. break;
  449. }
  450. }
  451. l_CharacterArray = new PacketCharacter[l_CharactersResult.Count];
  452. for ( int iIndex = 0; iIndex < l_CharacterArray.Length; iIndex++ )
  453. {
  454. Characters l_Characters = l_CharactersResult[iIndex] as Characters;
  455. if ( l_Characters == null )
  456. {
  457. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_Characters == null error!" );
  458. l_bIsReturn = true;
  459. break;
  460. }
  461. if ( l_Characters.IsDelete == true )
  462. continue;
  463. l_CharacterArray[iIndex] = new PacketCharacter();
  464. l_CharacterArray[iIndex].m_CharacterName = l_Characters.CharacterName;
  465. l_CharacterArray[iIndex].m_CharacterGuid = (uint)l_Characters.CharacterGuid;
  466. l_CharacterArray[iIndex].m_Level = (uint)l_Characters.Level;
  467. l_CharacterArray[iIndex].m_Face = (uint)l_Characters.Face;
  468. l_CharacterArray[iIndex].m_HairStyle = (uint)l_Characters.HairStyle;
  469. l_CharacterArray[iIndex].m_ClassID = (uint)l_Characters.ClassID;
  470. l_CharacterArray[iIndex].m_Sex = l_Characters.Sex;
  471. l_CharacterArray[iIndex].m_DeleteTime = l_Characters.DeleteTime == DateTime.MaxValue ? 0 : GetTime( l_Characters.DeleteTime ) - GetTime();
  472. l_CharacterArray[iIndex].m_Item = new PacketCharacter.PacketItem[10]; // 10 表示的是身上的物件数
  473. for ( int iIndexItem = 0; iIndexItem < l_CharacterArray[iIndex].m_Item.Length; iIndexItem++ )
  474. l_CharacterArray[iIndex].m_Item[iIndexItem] = new PacketCharacter.PacketItem();
  475. Query l_QueryItems = new Query( l_Session, "Select Items instances where {CharacterGuid}=@CharacterGuid and {SlotNumber}<10" );
  476. l_QueryItems.Parameters.Add( "@CharacterGuid", l_Characters.CharacterGuid );
  477. QueryResult l_ItemsResult = l_QueryItems.Execute();
  478. if ( l_ItemsResult == null )
  479. {
  480. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_ItemsResult == null error!" );
  481. l_bIsReturn = true;
  482. break;
  483. }
  484. if ( l_ItemsResult.Count > 10 )
  485. {
  486. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_ItemsResult.Count > 10 error!" );
  487. l_bIsReturn = true;
  488. break;
  489. }
  490. for ( int iIndex2 = 0; iIndex2 < l_ItemsResult.Count; iIndex2++ )
  491. {
  492. Items l_Items = l_ItemsResult[iIndex2] as Items;
  493. if ( l_Items == null )
  494. {
  495. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_Items == null error!" );
  496. l_bIsReturn = true;
  497. break;
  498. }
  499. if ( l_Items.SlotNumber > 10 )
  500. {
  501. Debug.WriteLine( "CharPacketHandlers.CharacterServerGetCharacters(...) - l_Items.SlotNumber > 10 error!" );
  502. l_bIsReturn = true;
  503. break;
  504. }
  505. l_CharacterArray[iIndex].m_Item[l_Items.SlotNumber].m_CharacterGuid = (uint)l_Items.CharacterGuid;
  506. l_CharacterArray[iIndex].m_Item[l_Items.SlotNumber].m_ItemID = (uint)l_Items.ItemID;
  507. l_CharacterArray[iIndex].m_Item[l_Items.SlotNumber].m_ItemType = (uint)l_Items.ItemType;
  508. l_CharacterArray[iIndex].m_Item[l_Items.SlotNumber].m_Refine = (uint)l_Items.Refine;
  509. l_CharacterArray[iIndex].m_Item[l_Items.SlotNumber].m_Durability = (uint)l_Items.Durability;
  510. l_CharacterArray[iIndex].m_Item[l_Items.SlotNumber].m_Lifespan = (uint)l_Items.Lifespan;
  511. }
  512. }
  513. } while ( false );
  514. }
  515. l_Session.Commit();
  516. if ( l_bIsReturn == true )
  517. l_CharacterArray = s_CharacterArray;
  518. netState.Send( new GetCharactersAck( l_CharacterArray ) );
  519. }
  520. /// <summary>
  521. /// Returns the current time/date
  522. /// </summary>
  523. /// <returns></returns>
  524. private static uint GetTime()
  525. {
  526. DateTime l_NowDateTime = DateTime.Now;
  527. uint uCurTime = 0;
  528. uCurTime += (uint)( l_NowDateTime.Second * 1 );
  529. uCurTime += (uint)( l_NowDateTime.Minute * 60 );
  530. uCurTime += (uint)( l_NowDateTime.Hour * 3600 );
  531. uCurTime += (uint)( l_NowDateTime.Day * 86400 );
  532. uCurTime += (uint)( ( l_NowDateTime.Year - 2000 ) * 86400 * 366 );
  533. return uCurTime;
  534. }
  535. /// <summary>
  536. /// Returns the this time/date
  537. /// </summary>
  538. /// <returns></returns>
  539. private static uint GetTime( DateTime dateTime )
  540. {
  541. uint uCurTime = 0;
  542. uCurTime += (uint)( dateTime.Second * 1 );
  543. uCurTime += (uint)( dateTime.Minute * 60 );
  544. uCurTime += (uint)( dateTime.Hour * 3600 );
  545. uCurTime += (uint)( dateTime.Day * 86400 );
  546. uCurTime += (uint)( ( dateTime.Year - 2000 ) * 86400 * 366 );
  547. return uCurTime;
  548. }
  549. #endregion
  550. #region zh-CHS CharacterServer CreateChar - 数据处理 | en CharacterServer CreateChar - OnPacketReceive
  551. /// <summary>
  552. ///
  553. /// </summary>
  554. /// <param name="netState"></param>
  555. /// <param name="packetReader"></param>
  556. internal static void CharacterServerCreateCharacter( NetState netState, PacketReader packetReader )
  557. {
  558. CharServerExtendData l_ExtendData = netState.ExtendData as CharServerExtendData;
  559. if ( l_ExtendData == null )
  560. {
  561. Debug.WriteLine( "CharPacketHandlers.CharacterServerCreateCharacter(...) - l_ExtendData == null error!" );
  562. CreateCharacter_ReplyRej( netState, CCLReason.BadAccountName );
  563. return;
  564. }
  565. if ( l_ExtendData.IsLoggedIn == false )
  566. {
  567. Debug.WriteLine( "CharPacketHandlers.CharacterServerCreateCharacter(...) - l_ExtendData.m_bIsLoggedIn == false error!" );
  568. CreateCharacter_ReplyRej( netState, CCLReason.BadAccountName );
  569. return;
  570. }
  571. if ( packetReader.Size < 13/*6 + 7 + ?*/ )
  572. {
  573. Debug.WriteLine( "CharPacketHandlers.CharacterServerCreateCharacter(...) - packetReader.Size < 13 error!" );
  574. CreateCharacter_ReplyRej( netState, CCLReason.BadAccountName );
  575. return;
  576. }
  577. // 给出需要创建的人物信息
  578. sbyte l_iSex = (sbyte)( packetReader.ReadSByte() % 2 );
  579. sbyte l_iUnknown = packetReader.ReadSByte();
  580. sbyte l_iHairStyle = packetReader.ReadSByte();
  581. sbyte l_iFace = packetReader.ReadSByte();
  582. sbyte l_iUnknown2 = packetReader.ReadSByte();
  583. ushort l_iUnknown3 = packetReader.ReadUInt16();
  584. string l_strNewCharacterName = packetReader.ReadStringSafe();
  585. if ( l_strNewCharacterName == string.Empty )
  586. {
  587. Debug.WriteLine( "CharPacketHandlers.CharacterServerCreateCharacter(...) - l_strNewCharacterName == string.Empty error!" );
  588. CreateCharacter_ReplyRej( netState, CCLReason.BadCharacterName );
  589. return;
  590. }
  591. if ( l_strNewCharacterName.Length > 64 )
  592. {
  593. Debug.WriteLine( "CharPacketHandlers.CharacterServerCreateCharacter(...) - l_strNewCharacterName.Length > 64 error!" );
  594. CreateCharacter_ReplyRej( netState, CCLReason.BadCharacterName );
  595. return;
  596. }
  597. bool l_bIsReturn = false;
  598. Session l_Session = new Session( BaseDatabase.Domain );
  599. l_Session.BeginTransaction();
  600. {
  601. do
  602. {
  603. Query l_QueryCharacters = new Query( l_Session, "Select Characters instances where {AccountGuid}=@AccountGuid" );
  604. l_QueryCharacters.Parameters.Add( "@AccountGuid", l_ExtendData.AccountGuid );
  605. QueryResult l_CharactersResult = l_QueryCharacters.Execute();
  606. if ( l_CharactersResult == null )
  607. {
  608. Debug.WriteLine( "CharPacketHandlers.CharacterServerCreateCharacter(...) - l_CharactersResult == null error!" );
  609. l_bIsReturn = true;
  610. break;
  611. }
  612. // 如果大于3, 则检测看有效的是否超过3个,其余者为删除的人物
  613. // 最多只能创建3个人物,其实可以5个的
  614. if ( l_CharactersResult.Count > 3 )
  615. {
  616. int l_iCharactersCount = 0;
  617. for ( int iIndex = 0; iIndex < l_CharactersResult.Count; iIndex++ )
  618. {
  619. Characters l_Characters = l_CharactersResult[iIndex] as Characters;
  620. if ( l_Characters == null )
  621. {
  622. Debug.WriteLine( "CharPacketHandlers.CharacterServerCreateCharacter(...) - l_Characters == null error!" );
  623. l_bIsReturn = true;
  624. break;
  625. }
  626. if ( l_Characters.IsDelete == false )
  627. ++l_iCharactersCount;
  628. }
  629. if ( l_bIsReturn == true )
  630. break;
  631. if ( l_iCharactersCount >= 3 )
  632. {
  633. l_bIsReturn = true;
  634. break;
  635. }
  636. }
  637. // 检查相同的人物名是否已经存在
  638. Query l_QueryCharactersCheck = new Query( l_Session, "Select Characters instances where {CharacterName}=@CharacterName" );
  639. l_QueryCharactersCheck.Parameters.Add( "@CharacterName", l_strNewCharacterName );
  640. QueryResult l_CharactersCheckResult = l_QueryCharactersCheck.Execute();
  641. if ( l_CharactersCheckResult != null && l_CharactersCheckResult.Count != 0 )
  642. {
  643. l_bIsReturn = true;
  644. break;
  645. }
  646. // 检查相同的帐号名是否已经存在
  647. Query l_QueryAccountsCheck = new Query( l_Session, "Select Accounts instances where {AccountsName}=@CharacterName" );
  648. l_QueryAccountsCheck.Parameters.Add( "@CharacterName", l_strNewCharacterName );
  649. QueryResult l_AccountsCheckResult = l_QueryAccountsCheck.Execute();
  650. if ( l_AccountsCheckResult != null && l_AccountsCheckResult.Count != 0 )
  651. {
  652. l_bIsReturn = true;
  653. break;
  654. }
  655. InitCharacter initCharacter = new InitCharacter();
  656. initCharacter.m_Sex = l_iSex;
  657. initCharacter.m_Face = l_iFace;
  658. initCharacter.m_HairStyle = l_iHairStyle;
  659. initCharacter.m_CharacterName = l_strNewCharacterName;
  660. //////////////////////////////////////////////////////////////////////////
  661. // 开始在编译后的程序集合内获取CreateCharacter
  662. Type l_Type = ScriptCompiler.FindTypeByFullName( "Demo_R.O.S.E.Scripts.CharacterBirth" );
  663. if ( l_Type == null )
  664. CreateCharacter( ref initCharacter );
  665. else
  666. {
  667. MethodInfo l_MethodInfo = l_Type.GetMethod( "CreateCharacter", BindingFlags.Static | BindingFlags.Public );
  668. if ( l_MethodInfo == null )
  669. CreateCharacter( ref initCharacter );
  670. else
  671. {
  672. object[] objectArgs = new object[] { initCharacter };
  673. l_MethodInfo.Invoke( null, objectArgs );
  674. }
  675. }
  676. Characters newCharacter = (Characters)l_Session.CreateObject( typeof( Characters ) );
  677. newCharacter.Sex = l_iSex;
  678. newCharacter.Face = l_iFace;
  679. newCharacter.HairStyle = l_iHairStyle;
  680. newCharacter.CharacterName = l_strNewCharacterName;
  681. newCharacter.CharacterGuid = newCharacter.ID;
  682. newCharacter.AccountGuid = l_ExtendData.AccountGuid;
  683. newCharacter.Zuly = initCharacter.Zuly;
  684. newCharacter.Level = initCharacter.Level;
  685. newCharacter.CurrentHP = initCharacter.CurrentHP;
  686. newCharacter.CurrentMP = initCharacter.CurrentMP;
  687. newCharacter.Strength = initCharacter.Strength;
  688. newCharacter.Convergence = initCharacter.Convergence;
  689. newCharacter.Dexterity = initCharacter.Dexterity;
  690. newCharacter.Intellect = initCharacter.Intellect;
  691. newCharacter.Charm = initCharacter.Charm;
  692. newCharacter.Sense = initCharacter.Sense;
  693. newCharacter.PositionX = initCharacter.PositionX;
  694. newCharacter.PositionY = initCharacter.PositionY;
  695. newCharacter.Experience = initCharacter.Experience;
  696. newCharacter.SkillPoint = initCharacter.SkillPoint;
  697. newCharacter.ClassID = initCharacter.ClassID;
  698. newCharacter.CurrentMap = initCharacter.CurrentMap;
  699. newCharacter.Stamina = initCharacter.Stamina;
  700. newCharacter.QuickBar = initCharacter.QuickBar;
  701. newCharacter.BasicSkills = initCharacter.BasicSkills;
  702. newCharacter.ClassSkills = initCharacter.ClassSkills;
  703. newCharacter.ClassSkillsLevel = initCharacter.ClassSkillsLevel;
  704. newCharacter.Realm = initCharacter.Realm;
  705. newCharacter.ClanGuid = -1;
  706. newCharacter.ClanRank = 0;
  707. newCharacter.TotalTime = 0;
  708. newCharacter.LevelTime = 0;
  709. newCharacter.IsOnline = false;
  710. newCharacter.DeleteTime = DateTime.MaxValue;
  711. newCharacter.IsDelete = false;
  712. for ( int iIndex = 0; iIndex < initCharacter.ItemList.Count; iIndex++ )
  713. {
  714. Items newItem = (Items)l_Session.CreateObject( typeof( Items ) );
  715. newItem.ItemGuid = newItem.ID;
  716. newItem.CharacterGuid = newCharacter.CharacterGuid;
  717. newItem.ItemID = initCharacter.ItemList[iIndex].ItemID;
  718. newItem.ItemType = initCharacter.ItemList[iIndex].ItemType;
  719. newItem.Refine = initCharacter.ItemList[iIndex].Refine;
  720. newItem.Durability = initCharacter.ItemList[iIndex].Durability;
  721. newItem.Lifespan = initCharacter.ItemList[iIndex].Lifespan;
  722. newItem.SlotNumber = initCharacter.ItemList[iIndex].SlotNumber;
  723. newItem.Count = initCharacter.ItemList[iIndex].Count;
  724. newItem.Stats = initCharacter.ItemList[iIndex].Stats;
  725. newItem.Socketed = initCharacter.ItemList[iIndex].Socketed;
  726. newItem.Appraised = initCharacter.ItemList[iIndex].Appraised;
  727. newItem.GemID = initCharacter.ItemList[iIndex].GemID;
  728. newItem.IsDelete = false;
  729. }
  730. } while ( false );
  731. }
  732. l_Session.Commit();
  733. if ( l_bIsReturn == true )
  734. CreateCharacter_ReplyRej( netState, CCLReason.BadCharacterName );
  735. else
  736. CreateCharacter_ReplyAck( netState );
  737. }
  738. /// <summary>
  739. ///
  740. /// </summary>
  741. /// <param name="netState"></param>
  742. private static void CreateCharacter_ReplyAck( NetState netState )
  743. {
  744. netState.Send( new CreateCharacterAck() );
  745. }
  746. /// <summary>
  747. ///
  748. /// </summary>
  749. /// <param name="netState"></param>
  750. /// <param name="cclReason"></param>
  751. private static void CreateCharacter_ReplyRej( NetState netState, CCLReason cclReason )
  752. {
  753. netState.Send( new CreateCharacterRej( cclReason ) );
  754. }
  755. /// <summary>
  756. ///
  757. /// </summary>
  758. /// <param name="newCharacter"></param>
  759. private static void CreateCharacter( ref InitCharacter newCharacter )
  760. {
  761. newCharacter.Level = 1;
  762. newCharacter.CurrentHP = 50;
  763. newCharacter.CurrentMP = 18;
  764. newCharacter.Charm = 10;
  765. newCharacter.Sense = 10;
  766. newCharacter.Strength = 15;
  767. newCharacter.Dexterity = 15;
  768. newCharacter.Intellect = 15;
  769. newCharacter.Convergence = 15;
  770. newCharacter.Stamina = 5000;
  771. newCharacter.CurrentMap = 22;
  772. newCharacter.PositionX = 5098;
  773. newCharacter.PositionY = 5321;
  774. newCharacter.QuickBar = "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0";
  775. newCharacter.BasicSkills = "11,12,13,14,15,16,17,18,19,20,21,22,25,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0";
  776. newCharacter.ClassSkills = "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0";
  777. newCharacter.ClassSkillsLevel = "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
  778. newCharacter.Zuly = 1000;
  779. InitCharacterItem l_Item = new InitCharacterItem();
  780. l_Item.ItemID = 29;
  781. l_Item.ItemType = 3;
  782. l_Item.Refine = 0;
  783. l_Item.Durability = 40;
  784. l_Item.Lifespan = 100;
  785. l_Item.SlotNumber = 3;
  786. l_Item.Count = 1;
  787. l_Item.Stats = 0;
  788. l_Item.Socketed = false;
  789. l_Item.Appraised = false;
  790. l_Item.GemID = 0;
  791. newCharacter.ItemList.Add( l_Item );
  792. InitCharacterItem l_Item2 = new InitCharacterItem();
  793. l_Item2.ItemID = 29;
  794. l_Item2.ItemType = 5;
  795. l_Item2.Refine = 0;
  796. l_Item2.Durability = 40;
  797. l_Item2.Lifespan = 100;
  798. l_Item2.SlotNumber = 6;
  799. l_Item2.Count = 1;
  800. l_Item2.Stats = 0;
  801. l_Item2.Socketed = false;
  802. l_Item2.Appraised = false;
  803. l_Item2.GemID = 0;
  804. newCharacter.ItemList.Add( l_Item2 );
  805. InitCharacterItem l_Item3 = new InitCharacterItem();
  806. l_Item3.ItemID = 1;
  807. l_Item3.ItemType = 8;
  808. l_Item3.Refine = 0;
  809. l_Item3.Durability = 40;
  810. l_Item3.Lifespan = 100;
  811. l_Item3.SlotNumber = 7;
  812. l_Item3.Count = 1;
  813. l_Item3.Stats = 0;
  814. l_Item3.Socketed = false;
  815. l_Item3.Appraised = false;
  816. l_Item3.GemID = 0;
  817. newCharacter.ItemList.Add( l_Item3 );
  818. if ( newCharacter.Sex == 0 )
  819. {
  820. InitCharacterItem l_Item4 = new InitCharacterItem();
  821. l_Item4.ItemID = 222;
  822. l_Item4.ItemType = 2;
  823. l_Item4.Refine = 0;
  824. l_Item4.Durability = 40;
  825. l_Item4.Lifespan = 100;
  826. l_Item4.SlotNumber = 12;
  827. l_Item4.Count = 1;
  828. l_Item4.Stats = 0;
  829. l_Item4.Socketed = false;
  830. l_Item4.Appraised = false;
  831. l_Item4.GemID = 0;
  832. newCharacter.ItemList.Add( l_Item4 );
  833. }
  834. else
  835. {
  836. InitCharacterItem l_Item4 = new InitCharacterItem();
  837. l_Item4.ItemID = 221;
  838. l_Item4.ItemType = 2;
  839. l_Item4.Refine = 0;
  840. l_Item4.Durability = 40;
  841. l_Item4.Lifespan = 100;
  842. l_Item4.SlotNumber = 12;
  843. l_Item4.Count = 1;
  844. l_Item4.Stats = 0;
  845. l_Item4.Socketed = false;
  846. l_Item4.Appraised = false;
  847. l_Item4.GemID = 0;
  848. newCharacter.ItemList.Add( l_Item4 );
  849. }
  850. }
  851. #endregion
  852. #region zh-CHS CharacterServer DeleteCharacter - 数据处理 | en CharacterServer DeleteCharacter - OnPacketReceive
  853. /// <summary>
  854. ///
  855. /// </summary>
  856. /// <param name="netState"></param>
  857. /// <param name="packetReader"></param>
  858. internal static void CharacterServerDeleteCharacter( NetState netState, PacketReader packetReader )
  859. {
  860. CharServerExtendData l_ExtendData = netState.ExtendData as CharServerExtendData;
  861. if ( l_ExtendData == null )
  862. {
  863. Debug.WriteLine( "CharPacketHandlers.CharacterServerDeleteCharacter(...) - l_ExtendData == null error!" );
  864. return;
  865. }
  866. if ( l_ExtendData.IsLoggedIn == false )
  867. {
  868. Debug.WriteLine( "CharPacketHandlers.CharacterServerDeleteCharacter(...) - l_ExtendData.m_bIsLoggedIn == false error!" );
  869. return;
  870. }
  871. if ( packetReader.Size < 8/*6 + 2 + ?*/ )
  872. {
  873. Debug.WriteLine( "CharPacketHandlers.CharacterServerDeleteCharacter(...) - packetReader.Size < 8 error!" );
  874. return;
  875. }
  876. byte l_iUnknown = packetReader.ReadByte();
  877. byte l_iAction = packetReader.ReadByte();
  878. string l_strCharacterName = packetReader.ReadStringSafe();
  879. uint l_iDeleteTime = 0;
  880. bool l_bIsReturn = false;
  881. Session l_Session = new Session( BaseDatabase.Domain );
  882. l_Session.BeginTransaction();
  883. {
  884. do
  885. {
  886. Query l_QueryCharacters = new Query( l_Session, "Select Characters instances where {CharacterName}=@CharacterName" );
  887. l_QueryCharacters.Parameters.Add( "@CharacterName", l_strCharacterName );
  888. QueryResult l_CharactersResult = l_QueryCharacters.Execute();
  889. if ( l_CharactersResult == null )
  890. {
  891. Debug.WriteLine( "CharPacketHandlers.CharacterServerDeleteCharacter(...) - l_CharactersResult == null error!" );
  892. l_bIsReturn = true;
  893. break;
  894. }
  895. if ( l_CharactersResult.Count != 1 )
  896. {
  897. Debug.WriteLine( "CharPacketHandlers.CharacterServerDeleteCharacter(...) - l_CharactersResult.Count != 1 error!" );
  898. l_bIsReturn = true;
  899. break;
  900. }
  901. Characters l_Characters = l_CharactersResult[0] as Characters;
  902. if ( l_Characters == null )
  903. {
  904. Debug.WriteLine( "CharPacketHandlers.CharacterServerDeleteCharacter(...) - l_Characters == null error!" );
  905. l_bIsReturn = true;
  906. break;
  907. }
  908. switch ( l_iAction )
  909. {
  910. case 0x00: // Resurect
  911. l_Characters.IsDelete = false;
  912. l_Characters.DeleteTime = DateTime.MaxValue;
  913. l_iDeleteTime = 0;
  914. break;
  915. case 0x01: // Delete
  916. l_Characters.IsDelete = false;
  917. l_Characters.DeleteTime = DateTime.Now + TimeSpan.FromDays( 7.0 );
  918. l_iDeleteTime = GetTime( l_Characters.DeleteTime ) - GetTime();
  919. break;
  920. default:
  921. break;
  922. }
  923. } while ( false );
  924. }
  925. l_Session.Commit();
  926. if ( l_bIsReturn == true )
  927. return;
  928. netState.Send( new DeleteCharacterAck( l_strCharacterName, l_iDeleteTime ) );
  929. }
  930. #endregion
  931. #region zh-CHS CharacterServer RequestWorld - 数据处理 | en CharacterServer RequestWorld - OnPacketReceive
  932. /// <summary>
  933. ///
  934. /// </summary>
  935. /// <param name="netState"></param>
  936. /// <param name="packetReader"></param>
  937. internal static void CharacterServerRequestWorld( NetState netState, PacketReader packetReader )
  938. {
  939. CharServerExtendData l_ExtendData = netState.ExtendData as CharServerExtendData;
  940. if ( l_ExtendData == null )
  941. {
  942. Debug.WriteLine( "CharPacketHandlers.CharacterServerRequestWorld(...) - l_ExtendData == null error!" );
  943. return;
  944. }
  945. if ( l_ExtendData.IsLoggedIn == false )
  946. {
  947. Debug.WriteLine( "CharPacketHandlers.CharacterServerRequestWorld(...) - l_ExtendData.m_bIsLoggedIn == false error!" );
  948. return;
  949. }
  950. if ( packetReader.Size < 9/*6 + 3 + ?*/ )
  951. {
  952. Debug.WriteLine( "CharPacketHandlers.CharacterServerRequestWorld(...) - packetReader.Size < 9 error!" );
  953. return;
  954. }
  955. ushort l_iUnknown = packetReader.ReadUInt16();
  956. byte l_iUnknown2 = packetReader.ReadByte();
  957. string l_strCharacterName = packetReader.ReadStringSafe();
  958. bool l_bIsReturn = false;
  959. IPEndPoint l_IPEndPoint = null;
  960. Session l_Session = new Session( BaseDatabase.Domain );
  961. l_Session.BeginTransaction();
  962. {
  963. do
  964. {
  965. //////////////////////////////////////////////////////////////////////////
  966. // 设置帐号最后选择的人物
  967. Query l_UpdateAccounts = new Query( l_Session, "Select Accounts instances where {AccountsGu…