/trunk/Demo.Mmose.Core/ServerEngine/Entity/Suit/Ability/Aura/BaseAuraHandler.cs

# · C# · 283 lines · 180 code · 26 blank · 77 comment · 16 complexity · 555812e938cb2bc71cc55e0fdd69eed8 MD5 · raw file

  1. #region zh-CHS 2006 - 2008 DemoSoft 团队 | en 2006 - 2008 DemoSoft Team
  2. // NOTES
  3. // ---------------
  4. //
  5. // This file is a part of the MMOSE(Massively Multiplayer Online Server Engine) for .NET.
  6. //
  7. // 2006-2008 DemoSoft Team
  8. //
  9. //
  10. // First Version : by H.Q.Cai - mailto:caihuanqing@hotmail.com
  11. /***************************************************************************
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU Lesser General Public License as published
  15. * by the Free Software Foundation; either version 2.1 of the License, or
  16. * (at your option) any later version.
  17. *
  18. ***************************************************************************/
  19. #region zh-CHS 包含名字空间 | en Include namespace
  20. using System;
  21. using System.Diagnostics;
  22. using System.Threading;
  23. using Demo.Mmose.Core.Common;
  24. using Demo.Mmose.Core.Common.SafeCollections;
  25. using Demo.Mmose.Core.Util;
  26. #endregion
  27. namespace Demo.Mmose.Core.Entity.Suit.Ability.Aura
  28. {
  29. /// <summary>
  30. ///
  31. /// </summary>
  32. public class BaseAuraHandler<T> where T : BaseAura
  33. {
  34. #region zh-CHS 共有属性 | en Public Properties
  35. /// <summary>
  36. ///
  37. /// </summary>
  38. public int Count
  39. {
  40. get { return m_Auras.Count; }
  41. }
  42. #endregion
  43. #region zh-CHS AuraHandler方法 | en Public Methods
  44. #region zh-CHS 私有成员变量 | en Private Member Variables
  45. /// <summary>
  46. ///
  47. /// </summary>
  48. private SafeDictionary<long, T> m_Auras = new SafeDictionary<long, T>();
  49. #endregion
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. /// <param name="baseTaxiNode"></param>
  54. public bool AddAura( long lAuraSerial, T auraT )
  55. {
  56. if ( auraT == null )
  57. {
  58. Debug.WriteLine( "BaseAuraHandler.AddAura(...) - auraT == null error!" );
  59. return false;
  60. }
  61. EventHandler<BeforeAddAuraCallEventArgs<T>> tempBeforeEventArgs = m_ThreadEventBeforeAddAuraCall;
  62. if ( tempBeforeEventArgs != null )
  63. {
  64. BeforeAddAuraCallEventArgs<T> eventArgs = new BeforeAddAuraCallEventArgs<T>( auraT, this );
  65. tempBeforeEventArgs( this, eventArgs );
  66. if ( eventArgs.IsCancel == true )
  67. return false;
  68. }
  69. m_Auras.Add( lAuraSerial, auraT );
  70. EventHandler<AfterAddAuraCallEventArgs<T>> tempAfterEventArgs = m_ThreadEventAfterAddAuraCall;
  71. if ( tempAfterEventArgs != null )
  72. {
  73. AfterAddAuraCallEventArgs<T> eventArgs = new AfterAddAuraCallEventArgs<T>( auraT, this );
  74. tempAfterEventArgs( this, eventArgs );
  75. }
  76. return true;
  77. }
  78. /// <summary>
  79. ///
  80. /// </summary>
  81. /// <returns></returns>
  82. public bool RemoveAura( long lAuraSerial )
  83. {
  84. T auraT = FindAuraOnSerial( lAuraSerial );
  85. if ( auraT == null )
  86. return false;
  87. EventHandler<BeforeRemoveAuraCallEventArgs<T>> tempBeforeEventArgs = m_ThreadEventBeforeRemoveAuraCall;
  88. if ( tempBeforeEventArgs != null )
  89. {
  90. BeforeRemoveAuraCallEventArgs<T> eventArgs = new BeforeRemoveAuraCallEventArgs<T>( auraT, this );
  91. tempBeforeEventArgs( this, eventArgs );
  92. if ( eventArgs.IsCancel == true )
  93. return false;
  94. }
  95. m_Auras.Remove( lAuraSerial );
  96. EventHandler<AfterRemoveAuraCallEventArgs<T>> tempAfterEventArgs = m_ThreadEventAfterRemoveAuraCall;
  97. if ( tempAfterEventArgs != null )
  98. {
  99. AfterRemoveAuraCallEventArgs<T> eventArgs = new AfterRemoveAuraCallEventArgs<T>( auraT, this );
  100. tempAfterEventArgs( this, eventArgs );
  101. }
  102. return true;
  103. }
  104. /// <summary>
  105. ///
  106. /// </summary>
  107. /// <returns></returns>
  108. public T FindAuraOnSerial( long lAuraSerial )
  109. {
  110. return m_Auras.GetValue( lAuraSerial );
  111. }
  112. /// <summary>
  113. ///
  114. /// </summary>
  115. [MultiThreadedWarning( "zh-CHS", "(Aura)当前的数组是列表临时产生的,不能保存数组用于以后操作:警告!" )]
  116. public T[] ToArray()
  117. {
  118. return m_Auras.ToArrayValues();
  119. }
  120. #endregion
  121. #region zh-CHS 共有事件 | en Public Event
  122. #region zh-CHS AddAuraCall事件 | en Public Event
  123. #region zh-CHS 私有成员变量 | en Private Member Variables
  124. /// <summary>
  125. ///
  126. /// </summary>
  127. private EventHandler<BeforeAddAuraCallEventArgs<T>> m_ThreadEventBeforeAddAuraCall;
  128. /// <summary>
  129. ///
  130. /// </summary>
  131. private ReaderWriterLockSlim m_LockThreadEventBeforeAddAuraCall = new ReaderWriterLockSlim();
  132. #endregion
  133. /// <summary>
  134. ///
  135. /// </summary>
  136. public event EventHandler<BeforeAddAuraCallEventArgs<T>> ThreadBeforeAddAuraCall
  137. {
  138. add
  139. {
  140. m_LockThreadEventBeforeAddAuraCall.EnterWriteLock();
  141. {
  142. m_ThreadEventBeforeAddAuraCall += value;
  143. }
  144. m_LockThreadEventBeforeAddAuraCall.ExitWriteLock();
  145. }
  146. remove
  147. {
  148. m_LockThreadEventBeforeAddAuraCall.EnterWriteLock();
  149. {
  150. m_ThreadEventBeforeAddAuraCall -= value;
  151. }
  152. m_LockThreadEventBeforeAddAuraCall.ExitWriteLock();
  153. }
  154. }
  155. #region zh-CHS 私有成员变量 | en Private Member Variables
  156. /// <summary>
  157. ///
  158. /// </summary>
  159. private EventHandler<AfterAddAuraCallEventArgs<T>> m_ThreadEventAfterAddAuraCall;
  160. /// <summary>
  161. ///
  162. /// </summary>
  163. private ReaderWriterLockSlim m_LockThreadEventAfterAddAuraCall = new ReaderWriterLockSlim();
  164. #endregion
  165. /// <summary>
  166. ///
  167. /// </summary>
  168. public event EventHandler<AfterAddAuraCallEventArgs<T>> ThreadAfterAddAuraCall
  169. {
  170. add
  171. {
  172. m_LockThreadEventAfterAddAuraCall.EnterWriteLock();
  173. {
  174. m_ThreadEventAfterAddAuraCall += value;
  175. }
  176. m_LockThreadEventAfterAddAuraCall.ExitWriteLock();
  177. }
  178. remove
  179. {
  180. m_LockThreadEventAfterAddAuraCall.EnterWriteLock();
  181. {
  182. m_ThreadEventAfterAddAuraCall -= value;
  183. }
  184. m_LockThreadEventAfterAddAuraCall.ExitWriteLock();
  185. }
  186. }
  187. #endregion
  188. #region zh-CHS RemoveAuraCall事件 | en Public Event
  189. #region zh-CHS 私有成员变量 | en Private Member Variables
  190. /// <summary>
  191. ///
  192. /// </summary>
  193. private EventHandler<BeforeRemoveAuraCallEventArgs<T>> m_ThreadEventBeforeRemoveAuraCall;
  194. /// <summary>
  195. ///
  196. /// </summary>
  197. private ReaderWriterLockSlim m_LockThreadEventBeforeRemoveAuraCall = new ReaderWriterLockSlim();
  198. #endregion
  199. /// <summary>
  200. ///
  201. /// </summary>
  202. public event EventHandler<BeforeRemoveAuraCallEventArgs<T>> ThreadBeforeRemoveAuraCall
  203. {
  204. add
  205. {
  206. m_LockThreadEventBeforeRemoveAuraCall.EnterWriteLock();
  207. {
  208. m_ThreadEventBeforeRemoveAuraCall += value;
  209. }
  210. m_LockThreadEventBeforeRemoveAuraCall.ExitWriteLock();
  211. }
  212. remove
  213. {
  214. m_LockThreadEventBeforeRemoveAuraCall.EnterWriteLock();
  215. {
  216. m_ThreadEventBeforeRemoveAuraCall -= value;
  217. }
  218. m_LockThreadEventBeforeRemoveAuraCall.ExitWriteLock();
  219. }
  220. }
  221. #region zh-CHS 私有成员变量 | en Private Member Variables
  222. /// <summary>
  223. ///
  224. /// </summary>
  225. private EventHandler<AfterRemoveAuraCallEventArgs<T>> m_ThreadEventAfterRemoveAuraCall;
  226. /// <summary>
  227. ///
  228. /// </summary>
  229. private ReaderWriterLockSlim m_LockThreadEventAfterRemoveAuraCall = new ReaderWriterLockSlim();
  230. #endregion
  231. /// <summary>
  232. ///
  233. /// </summary>
  234. public event EventHandler<AfterRemoveAuraCallEventArgs<T>> ThreadAfterRemoveAuraCall
  235. {
  236. add
  237. {
  238. m_LockThreadEventAfterRemoveAuraCall.EnterWriteLock();
  239. {
  240. m_ThreadEventAfterRemoveAuraCall += value;
  241. }
  242. m_LockThreadEventAfterRemoveAuraCall.ExitWriteLock();
  243. }
  244. remove
  245. {
  246. m_LockThreadEventAfterRemoveAuraCall.EnterWriteLock();
  247. {
  248. m_ThreadEventAfterRemoveAuraCall -= value;
  249. }
  250. m_LockThreadEventAfterRemoveAuraCall.ExitWriteLock();
  251. }
  252. }
  253. #endregion
  254. #endregion
  255. }
  256. }
  257. #endregion