ZoneLayer.Objects.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. using System;
  2. using System.Collections.Generic;
  3. using CommonAI.Zone;
  4. using CommonLang;
  5. namespace CommonAI.ZoneClient
  6. {
  7. partial class ZoneLayer
  8. {
  9. private LayerObjectMap mObjectes = new LayerObjectMap();
  10. private HashMap<string, ZoneFlag> mFlags = new HashMap<string, ZoneFlag>();
  11. private ZoneActor mActor;
  12. /// <summary>
  13. /// 获取所有单位状态
  14. /// </summary>
  15. public ICollection<ZoneObject> Objects { get { return mObjectes.Objects; } }
  16. public int ObjectsCount { get { return mObjectes.ObjectsCount; } }
  17. public ICollection<ZoneUnit> Units { get { return mObjectes.Units; } }
  18. public int UnitsCount { get { return mObjectes.UnitsCount; } }
  19. public ICollection<ZoneSpell> Spells { get { return mObjectes.Spells; } }
  20. public int SpellsCount { get { return mObjectes.SpellsCount; } }
  21. public ICollection<ZoneItem> Items { get { return mObjectes.Items; } }
  22. public int ItemsCount { get { return mObjectes.ItemsCount; } }
  23. /// <summary>
  24. /// 获取所有装饰物状态
  25. /// </summary>
  26. public ICollection<ZoneFlag> Flags { get { return mFlags.Values; } }
  27. /// <summary>
  28. /// 主角
  29. /// </summary>
  30. public ZoneActor Actor { get { return mActor; } }
  31. /// <summary>
  32. /// 主角ID
  33. /// </summary>
  34. public uint ActorID { get { return mActor != null ? mActor.ObjectID : 0; } }
  35. /// <summary>
  36. /// 获取一个可显示对象
  37. /// </summary>
  38. /// <typeparam name="T">ZoneObject的子类</typeparam>
  39. /// <param name="objID"></param>
  40. /// <returns></returns>
  41. public T GetObject<T>(uint objID) where T : ZoneObject
  42. {
  43. return mObjectes.GetObject<T>(objID);
  44. }
  45. /// <summary>
  46. /// 获取一个可显示对象
  47. /// </summary>
  48. /// <param name="objID"></param>
  49. /// <returns></returns>
  50. public ZoneObject GetObject(uint objID)
  51. {
  52. return mObjectes.GetObject<ZoneObject>(objID);
  53. }
  54. /// <summary>
  55. /// 获取一个单位
  56. /// </summary>
  57. /// <param name="objID"></param>
  58. /// <returns></returns>
  59. public ZoneUnit GetUnit(uint objID)
  60. {
  61. return mObjectes.GetObject<ZoneUnit>(objID);
  62. }
  63. /// <summary>
  64. /// 根据模板找单位
  65. /// </summary>
  66. /// <param name="templateID"></param>
  67. /// <returns></returns>
  68. public ZoneUnit GetUnitByTemplateID(int templateID)
  69. {
  70. foreach (var u in mObjectes.Units)
  71. {
  72. if (u.TemplateID == templateID)
  73. {
  74. return u;
  75. }
  76. }
  77. return null;
  78. }
  79. /// <summary>
  80. /// 获取一个玩家单位
  81. /// </summary>
  82. /// <param name="uuid"></param>
  83. /// <returns></returns>
  84. public ZoneUnit GetPlayerUnit(string uuid)
  85. {
  86. if (mObjectes == null)
  87. {
  88. return null;
  89. }
  90. return mObjectes.GetPlayer(uuid);
  91. }
  92. public virtual bool IsAttackable(ZoneUnit src, ZoneUnit target, SkillTemplate.CastTarget expectTarget)
  93. {
  94. if (target.IsActive)
  95. {
  96. switch (expectTarget)
  97. {
  98. case SkillTemplate.CastTarget.Enemy:
  99. return src.Force != target.Force;
  100. case SkillTemplate.CastTarget.PetForMaster:
  101. if (src.Info.UType == UnitInfo.UnitType.TYPE_PET)
  102. {
  103. return (src != target) && (src.Force == target.Force);
  104. }
  105. return false;
  106. case SkillTemplate.CastTarget.Alias:
  107. return (src != target) && (src.Force == target.Force);
  108. case SkillTemplate.CastTarget.AlliesIncludeSelf:
  109. return (src.Force == target.Force);
  110. case SkillTemplate.CastTarget.AlliesExcludeSelf:
  111. return (src != target) && (src.Force == target.Force);
  112. case SkillTemplate.CastTarget.EveryOne:
  113. return true;
  114. case SkillTemplate.CastTarget.EveryOneExcludeSelf:
  115. return (src != target);
  116. case SkillTemplate.CastTarget.Self:
  117. return src == target;
  118. case SkillTemplate.CastTarget.EnemyAndSelf:
  119. return src.Force != target.Force || src == target;
  120. case SkillTemplate.CastTarget.NA:
  121. default:
  122. return false;
  123. }
  124. }
  125. return false;
  126. }
  127. /// <summary>
  128. /// 获取一个编辑器标记
  129. /// </summary>
  130. /// <param name="name"></param>
  131. /// <returns></returns>
  132. public T GetFlag<T>(string name) where T : ZoneFlag
  133. {
  134. return mFlags.Get(name) as T;
  135. }
  136. public ZoneFlag GetFlag(string name)
  137. {
  138. return mFlags.Get(name);
  139. }
  140. public ZoneEditorUnit GetUnitFlagByTemplateID(int templateID)
  141. {
  142. foreach (var flag in mFlags.Values)
  143. {
  144. if (flag is ZoneEditorUnit)
  145. {
  146. var u = flag as ZoneEditorUnit;
  147. if (u.Data.UnitTemplateID == templateID)
  148. {
  149. return u;
  150. }
  151. }
  152. }
  153. return null;
  154. }
  155. //-------------------------------------------------------------------------------------------------------//
  156. //
  157. //-------------------------------------------------------------------------------------------------------//
  158. private class LayerObjectMap
  159. {
  160. private HashMap<uint, ZoneObject> mObjects = new HashMap<uint, ZoneObject>();
  161. private List<ZoneObject> mObjectsList = new List<ZoneObject>();
  162. private HashMap<uint, ZoneUnit> mObjects_MirrorUnits = new HashMap<uint, ZoneUnit>();
  163. private HashMap<uint, ZoneSpell> mObjects_MirrorSpells = new HashMap<uint, ZoneSpell>();
  164. private HashMap<uint, ZoneItem> mObjects_MirrorItems = new HashMap<uint, ZoneItem>();
  165. private HashMap<string, ZoneUnit> mObjects_MirrorPlayers = new HashMap<string, ZoneUnit>();
  166. public T GetObject<T>(uint id) where T : ZoneObject
  167. {
  168. Type type = typeof(T);
  169. ZoneObject obj;
  170. if (type.IsSubclassOf(typeof(ZoneUnit)))
  171. {
  172. return mObjects_MirrorUnits.Get(id) as T;
  173. }
  174. else if (type.IsSubclassOf(typeof(ZoneSpell)))
  175. {
  176. if (mObjects_MirrorSpells.ContainsKey(id))
  177. {
  178. return mObjects_MirrorSpells.Get(id) as T;
  179. }
  180. }
  181. else if (type.IsSubclassOf(typeof(ZoneItem)))
  182. {
  183. return mObjects_MirrorItems.Get(id) as T;
  184. }
  185. else if (mObjects.TryGetValue(id, out obj))
  186. {
  187. return obj as T;
  188. }
  189. return null;
  190. }
  191. public ZoneUnit GetPlayer(string uuid)
  192. {
  193. return mObjects_MirrorPlayers.Get(uuid);
  194. }
  195. public void Add(ZoneObject obj)
  196. {
  197. mObjects.Add(obj.ObjectID, obj);
  198. mObjectsList.Add(obj);
  199. if (obj is ZoneUnit)
  200. {
  201. var u = obj as ZoneUnit;
  202. mObjects_MirrorUnits.Add(obj.ObjectID, u);
  203. if (!string.IsNullOrEmpty(u.PlayerUUID))
  204. {
  205. mObjects_MirrorPlayers.Put(u.PlayerUUID, u);
  206. }
  207. }
  208. else if (obj is ZoneItem)
  209. {
  210. mObjects_MirrorItems.Add(obj.ObjectID, obj as ZoneItem);
  211. }
  212. else if (obj is ZoneSpell)
  213. {
  214. mObjects_MirrorSpells.Add(obj.ObjectID, obj as ZoneSpell);
  215. }
  216. }
  217. public ZoneObject RemoveObjectByKey(uint id)
  218. {
  219. ZoneObject obj = mObjects.RemoveByKey(id);
  220. if (obj != null)
  221. {
  222. mObjectsList.Remove(obj);
  223. if (obj is ZoneUnit)
  224. {
  225. var u = obj as ZoneUnit;
  226. mObjects_MirrorUnits.Remove(id);
  227. if (!string.IsNullOrEmpty(u.PlayerUUID))
  228. {
  229. mObjects_MirrorPlayers.Remove(u.PlayerUUID);
  230. }
  231. }
  232. else if (obj is ZoneItem)
  233. {
  234. mObjects_MirrorItems.Remove(id);
  235. }
  236. else if (obj is ZoneSpell)
  237. {
  238. mObjects_MirrorSpells.Remove(id);
  239. }
  240. }
  241. return obj;
  242. }
  243. public void Clear()
  244. {
  245. mObjects.Clear();
  246. mObjectsList.Clear();
  247. mObjects_MirrorItems.Clear();
  248. mObjects_MirrorSpells.Clear();
  249. mObjects_MirrorUnits.Clear();
  250. mObjects_MirrorPlayers.Clear();
  251. }
  252. public bool ContainsObjectByKey(uint id)
  253. {
  254. return mObjects.ContainsKey(id);
  255. }
  256. public ZoneItem GetNearPickableItem(ZoneActor owner)
  257. {
  258. var zl = owner.Parent;
  259. ZoneItem item = null;
  260. for (int i = mObjectsList.Count - 1; i >= 0; --i)
  261. {
  262. item = mObjectsList[i] as ZoneItem;
  263. if (item != null && item.Info != null && !item.Info.IsPopPanel && zl.IsCanPickItem(owner, item))
  264. {
  265. return item;
  266. }
  267. }
  268. return null;
  269. }
  270. public ZoneItem GetNearPopPanelItem(ZoneActor owner)
  271. {
  272. var zl = owner.Parent;
  273. ZoneItem item = null;
  274. for (int i = mObjectsList.Count - 1; i >= 0; --i)
  275. {
  276. item = mObjectsList[i] as ZoneItem;
  277. if (item != null && item.Info != null && item.Info.IsPopPanel)
  278. {
  279. if (zl.IsCanPickItem(owner, item)) return item;
  280. }
  281. }
  282. return null;
  283. }
  284. public ZoneItem GetDropItem()
  285. {
  286. ZoneItem item = null;
  287. foreach(ZoneItem i in mObjects_MirrorItems.Values)
  288. {
  289. if(i.SyncInfo.bDrop == true)
  290. {
  291. item = i;
  292. break;
  293. }
  294. }
  295. return item;
  296. }
  297. /// <summary>
  298. /// 遍历所有元素,如果返回True,则立即Break
  299. /// </summary>
  300. /// <param name="action">return true if cancel for each</param>
  301. /// <returns>true if cancel</returns>
  302. public bool ForEachObjects(Predicate<ZoneObject> action)
  303. {
  304. for (int i = mObjectsList.Count - 1; i >= 0; --i)
  305. {
  306. if (action(mObjectsList[i]))
  307. {
  308. return true;
  309. }
  310. }
  311. return false;
  312. }
  313. public void ForEachObjectsDoUpdate()
  314. {
  315. ZoneObject zo;
  316. for (int i = mObjectsList.Count - 1; i >= 0; --i)
  317. {
  318. zo = mObjectsList[i];
  319. zo.Update();
  320. zo.UpdatePos();
  321. }
  322. }
  323. public void ForEachObjectsDoUpdateAI()
  324. {
  325. for (int i = mObjectsList.Count - 1; i >= 0; --i)
  326. {
  327. mObjectsList[i].UpdateAI();
  328. }
  329. }
  330. public List<ZoneObject>.Enumerator GetObjectsEnumerator()
  331. {
  332. return mObjectsList.GetEnumerator();
  333. }
  334. public ICollection<ZoneObject> Objects { get { return mObjects.Values; } }
  335. public int ObjectsCount { get { return mObjects.Count; } }
  336. public ICollection<ZoneUnit> Units { get { return mObjects_MirrorUnits.Values; } }
  337. public int UnitsCount { get { return mObjects_MirrorUnits.Count; } }
  338. public ICollection<ZoneSpell> Spells { get { return mObjects_MirrorSpells.Values; } }
  339. public int SpellsCount { get { return mObjects_MirrorSpells.Count; } }
  340. public ICollection<ZoneItem> Items { get { return mObjects_MirrorItems.Values; } }
  341. public int ItemsCount { get { return mObjects_MirrorItems.Count; } }
  342. }
  343. }
  344. }