MirScene.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. using Client.MirGraphics;
  2. using Client.MirNetwork;
  3. using Client.MirScenes;
  4. using SlimDX.Direct3D9;
  5. using S = ServerPackets;
  6. namespace Client.MirControls
  7. {
  8. public abstract class MirScene : MirControl
  9. {
  10. public static MirScene ActiveScene = new LoginScene();
  11. private static MouseButtons _buttons;
  12. private static long _lastClickTime;
  13. private static MirControl _clickedControl;
  14. protected MirScene()
  15. {
  16. DrawControlTexture = true;
  17. BackColour = Color.Magenta;
  18. Size = new Size(Settings.ScreenWidth, Settings.ScreenHeight);
  19. }
  20. public override sealed Size Size
  21. {
  22. get { return base.Size; }
  23. set { base.Size = value; }
  24. }
  25. public override void Draw()
  26. {
  27. if (IsDisposed || !Visible)
  28. return;
  29. OnBeforeShown();
  30. DrawControl();
  31. if (CMain.DebugBaseLabel != null && !CMain.DebugBaseLabel.IsDisposed)
  32. CMain.DebugBaseLabel.Draw();
  33. if (CMain.HintBaseLabel != null && !CMain.HintBaseLabel.IsDisposed)
  34. CMain.HintBaseLabel.Draw();
  35. OnShown();
  36. }
  37. protected override void CreateTexture()
  38. {
  39. if (Size != TextureSize)
  40. DisposeTexture();
  41. if (ControlTexture == null || ControlTexture.Disposed)
  42. {
  43. DXManager.ControlList.Add(this);
  44. ControlTexture = new Texture(DXManager.Device, Size.Width, Size.Height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
  45. TextureSize = Size;
  46. }
  47. Surface oldSurface = DXManager.CurrentSurface;
  48. Surface surface = ControlTexture.GetSurfaceLevel(0);
  49. DXManager.SetSurface(surface);
  50. DXManager.Device.Clear(ClearFlags.Target, BackColour, 0, 0);
  51. BeforeDrawControl();
  52. DrawChildControls();
  53. AfterDrawControl();
  54. DXManager.Sprite.Flush();
  55. DXManager.SetSurface(oldSurface);
  56. TextureValid = true;
  57. surface.Dispose();
  58. }
  59. public override void OnMouseDown(MouseEventArgs e)
  60. {
  61. if (!Enabled)
  62. return;
  63. if (MouseControl != null && MouseControl != this)
  64. MouseControl.OnMouseDown(e);
  65. else
  66. base.OnMouseDown(e);
  67. }
  68. public override void OnMouseUp(MouseEventArgs e)
  69. {
  70. if (!Enabled)
  71. return;
  72. if (MouseControl != null && MouseControl != this)
  73. MouseControl.OnMouseUp(e);
  74. else
  75. base.OnMouseUp(e);
  76. }
  77. public override void OnMouseMove(MouseEventArgs e)
  78. {
  79. if (!Enabled)
  80. return;
  81. if (MouseControl != null && MouseControl != this && MouseControl.Moving)
  82. MouseControl.OnMouseMove(e);
  83. else
  84. base.OnMouseMove(e);
  85. }
  86. public override void OnMouseWheel(MouseEventArgs e)
  87. {
  88. if (!Enabled)
  89. return;
  90. if (MouseControl != null && MouseControl != this)
  91. MouseControl.OnMouseWheel(e);
  92. else
  93. base.OnMouseWheel(e);
  94. }
  95. public override void OnMouseClick(MouseEventArgs e)
  96. {
  97. if (!Enabled)
  98. return;
  99. if (_buttons == e.Button)
  100. {
  101. if (_lastClickTime + SystemInformation.DoubleClickTime >= CMain.Time)
  102. {
  103. OnMouseDoubleClick(e);
  104. return;
  105. }
  106. }
  107. else
  108. _lastClickTime = 0;
  109. if (ActiveControl != null && ActiveControl.IsMouseOver(CMain.MPoint) && ActiveControl != this)
  110. ActiveControl.OnMouseClick(e);
  111. else
  112. base.OnMouseClick(e);
  113. _clickedControl = ActiveControl;
  114. _lastClickTime = CMain.Time;
  115. _buttons = e.Button;
  116. }
  117. public override void OnMouseDoubleClick(MouseEventArgs e)
  118. {
  119. if (!Enabled)
  120. return;
  121. _lastClickTime = 0;
  122. _buttons = MouseButtons.None;
  123. if (ActiveControl != null && ActiveControl.IsMouseOver(CMain.MPoint) && ActiveControl != this)
  124. {
  125. if (ActiveControl == _clickedControl)
  126. ActiveControl.OnMouseDoubleClick(e);
  127. else
  128. ActiveControl.OnMouseClick(e);
  129. }
  130. else
  131. {
  132. if (ActiveControl == _clickedControl)
  133. base.OnMouseDoubleClick(e);
  134. else
  135. base.OnMouseClick(e);
  136. }
  137. }
  138. public override void Redraw()
  139. {
  140. TextureValid = false;
  141. }
  142. public virtual void ProcessPacket(Packet p)
  143. {
  144. switch (p.Index)
  145. {
  146. case (short)ServerPacketIds.Disconnect: // Disconnected
  147. Disconnect((S.Disconnect) p);
  148. Network.Disconnect();
  149. break;
  150. case (short)ServerPacketIds.NewItemInfo:
  151. NewItemInfo((S.NewItemInfo) p);
  152. break;
  153. case (short)ServerPacketIds.NewMonsterInfo:
  154. NewMonsterInfo((S.NewMonsterInfo)p);
  155. break;
  156. case (short)ServerPacketIds.NewNPCInfo:
  157. NewNPCInfo((S.NewNPCInfo)p);
  158. break;
  159. case (short)ServerPacketIds.NewChatItem:
  160. NewChatItem((S.NewChatItem)p);
  161. break;
  162. case (short)ServerPacketIds.NewQuestInfo:
  163. NewQuestInfo((S.NewQuestInfo)p);
  164. break;
  165. case (short)ServerPacketIds.NewRecipeInfo:
  166. NewRecipeInfo((S.NewRecipeInfo)p);
  167. break;
  168. case (short)ServerPacketIds.NewHeroInfo:
  169. NewHeroInfo((S.NewHeroInfo)p);
  170. break;
  171. }
  172. }
  173. private void NewItemInfo(S.NewItemInfo info)
  174. {
  175. GameScene.ItemInfoList.Add(info.Info);
  176. GameScene.OnItemInfoReceived(info.Info.Index);
  177. }
  178. private void NewMonsterInfo(S.NewMonsterInfo info)
  179. {
  180. GameScene.MonsterInfoList.RemoveAll(x => x.Index == info.Info.Index);
  181. GameScene.MonsterInfoList.Add(info.Info);
  182. GameScene.OnMonsterInfoReceived(info.Info.Index);
  183. }
  184. private void NewNPCInfo(S.NewNPCInfo info)
  185. {
  186. GameScene.NPCInfoList.RemoveAll(x => x.Index == info.Info.Index);
  187. GameScene.NPCInfoList.Add(info.Info);
  188. GameScene.OnNPCInfoReceived(info.Info.Index);
  189. }
  190. private void NewHeroInfo(S.NewHeroInfo info)
  191. {
  192. AddHeroInformation(info.Info, info.StorageIndex);
  193. }
  194. public void AddHeroInformation(ClientHeroInformation info, int storageIndex = -1)
  195. {
  196. if (info == null) return;
  197. GameScene.HeroInfoList.RemoveAll(x => x.Index == info.Index);
  198. GameScene.HeroInfoList.Add(info);
  199. if (storageIndex < 0) return;
  200. GameScene.HeroStorage[storageIndex] = info;
  201. }
  202. private void NewChatItem(S.NewChatItem p)
  203. {
  204. if (GameScene.ChatItemList.Any(x => x.UniqueID == p.Item.UniqueID)) return;
  205. GameScene.Bind(p.Item);
  206. GameScene.ChatItemList.Add(p.Item);
  207. }
  208. private void NewQuestInfo(S.NewQuestInfo info)
  209. {
  210. GameScene.QuestInfoList.Add(info.Info);
  211. }
  212. private void NewRecipeInfo(S.NewRecipeInfo info)
  213. {
  214. GameScene.RecipeInfoList.Add(info.Info);
  215. GameScene.Bind(info.Info.Item);
  216. for (int j = 0; j < info.Info.Tools.Count; j++)
  217. GameScene.Bind(info.Info.Tools[j]);
  218. for (int j = 0; j < info.Info.Ingredients.Count; j++)
  219. GameScene.Bind(info.Info.Ingredients[j]);
  220. }
  221. private static void Disconnect(S.Disconnect p)
  222. {
  223. switch (p.Reason)
  224. {
  225. case 0:
  226. MirMessageBox.Show(GameLanguage.ClientTextMap.GetLocalization(ClientTextKeys.ShuttingDown), true);
  227. break;
  228. case 1:
  229. MirMessageBox.Show(GameLanguage.ClientTextMap.GetLocalization(ClientTextKeys.DisconnectedAnotherUserLogged), true);
  230. break;
  231. case 2:
  232. MirMessageBox.Show(GameLanguage.ClientTextMap.GetLocalization(ClientTextKeys.DisconnectedPacketError), true);
  233. break;
  234. case 3:
  235. MirMessageBox.Show(GameLanguage.ClientTextMap.GetLocalization(ClientTextKeys.DisconnectedServerCrashed), true);
  236. break;
  237. case 4:
  238. MirMessageBox.Show(GameLanguage.ClientTextMap.GetLocalization(ClientTextKeys.DisconnectedKickedByAdmin), true);
  239. break;
  240. case 5:
  241. MirMessageBox.Show(GameLanguage.ClientTextMap.GetLocalization(ClientTextKeys.DisconnectedMaxConnectionsReached), true);
  242. break;
  243. }
  244. GameScene.LogTime = 0;
  245. }
  246. public abstract void Process();
  247. #region Disposable
  248. protected override void Dispose(bool disposing)
  249. {
  250. base.Dispose(disposing);
  251. if (!disposing) return;
  252. if (ActiveScene == this) ActiveScene = null;
  253. _buttons = 0;
  254. _lastClickTime = 0;
  255. _clickedControl = null;
  256. }
  257. #endregion
  258. }
  259. }