EditorScene.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using CommonLang;
  5. using CommonAI.Zone.Instance;
  6. using CommonAI.Zone.Helper;
  7. using CommonAI.Zone.ZoneEditor.EventTrigger;
  8. using CommonAI.ZoneEditor;
  9. using CommonLang.Property;
  10. using CommonAI.Zone.Attributes;
  11. using CommonAI.ZoneClient;
  12. using CommonLang.Log;
  13. using CommonAI.Zone.EventTrigger;
  14. using CommonAI.Data;
  15. namespace CommonAI.Zone.ZoneEditor
  16. {
  17. public partial class EditorScene : InstanceZone
  18. {
  19. private readonly Logger log = LoggerFactory.GetLogger("EditorScene");
  20. private SceneData mSceneData;
  21. private GSCreateAreaData mCreateData;
  22. private ZoneEventTriggerCollection mZoneEvents;
  23. private HashMap<int, ZoneRegion> mStartRegions = new HashMap<int, ZoneRegion>();
  24. public SceneData Data { get { return mSceneData; } }
  25. //游戏服传过来的数据
  26. public GSCreateAreaData data { get { return mCreateData; } }
  27. public EditorScene(
  28. TemplateManager templates,
  29. InstanceZoneListener listener,
  30. SceneData data, GSCreateAreaData createData,
  31. int spaceDiv, int randomSeed = 1)
  32. : base(templates, listener, data, createData, spaceDiv, data.MaxUnit, randomSeed)
  33. {
  34. this.mSceneData = SyncSceneLevel(data);
  35. this.mZoneEvents = new ZoneEventTriggerCollection(this);
  36. base.mSceneType = data.sceneType;
  37. this.mCreateData = createData;
  38. // 初始化属性 //
  39. BindAttributes(data.Attributes, this);
  40. // 初始化单位 //
  41. {
  42. foreach (RegionData rdata in data.Regions)
  43. {
  44. AddEditRegion(rdata);
  45. }
  46. foreach (PointData rdata in data.Points)
  47. {
  48. AddEditPoint(rdata);
  49. }
  50. foreach (DecorationData rdata in data.Decorations)
  51. {
  52. AddEditDecoration(rdata);
  53. }
  54. foreach (AreaData adata in data.Areas)
  55. {
  56. AddEditArea(adata);
  57. }
  58. foreach (ItemData rdata in data.Items)
  59. {
  60. AddEditItem(rdata);
  61. }
  62. foreach (UnitData rdata in data.Units)
  63. {
  64. AddEditUnit(rdata);
  65. }
  66. }
  67. // 完成初始化单位 //
  68. {
  69. foreach (RegionData rdata in data.Regions)
  70. {
  71. BindEditAbility(rdata);
  72. }
  73. foreach (PointData rdata in data.Points)
  74. {
  75. BindEditAbility(rdata);
  76. }
  77. foreach (DecorationData rdata in data.Decorations)
  78. {
  79. BindEditAbility(rdata);
  80. }
  81. foreach (AreaData adata in data.Areas)
  82. {
  83. BindEditAbility(adata);
  84. }
  85. foreach (ItemData rdata in data.Items)
  86. {
  87. BindEditAbility(rdata);
  88. }
  89. foreach (UnitData rdata in data.Units)
  90. {
  91. BindEditAbility(rdata);
  92. }
  93. }
  94. // 绑定变量 //
  95. BindValuesAdapter var_api = new BindValuesAdapter(this, mZoneEvents);
  96. foreach (ZoneVar v in data.EnvironmentVars)
  97. {
  98. BindZoneVar(v, var_api);
  99. }
  100. // 绑定触发器类型 //
  101. mZoneEvents.Bind(data.Events);
  102. mSceneData.Properties.OnInit(this);
  103. // 绑定脚本适配器 //
  104. //if (mScriptAdapter != null) mScriptAdapter.BindZone(this);
  105. }
  106. public override int GetSceneID()
  107. {
  108. return this.mSceneData == null ? -1 : this.mSceneData.ID;
  109. }
  110. protected override void Disposing()
  111. {
  112. base.Disposing();
  113. mSceneData = null;
  114. mZoneEvents.Dispose();
  115. mZoneEvents = null;
  116. mStartRegions.Clear();
  117. //mScriptAdapter = null;
  118. }
  119. //---------------------------------------------------------------------------------------------------------
  120. #region InitScene
  121. // 根据场景DefaultUnitLevel配置每个单独单位等级
  122. private SceneData SyncSceneLevel(SceneData scene)
  123. {
  124. if (scene.DefaultUnitLevel > 0)
  125. {
  126. List<FieldAttributeValue> attlevels = new List<FieldAttributeValue>();
  127. PropertyUtil.CollectFieldAttributeValues(scene, typeof(TemplateLevelAttribute), attlevels);
  128. foreach (FieldAttributeValue fv in attlevels)
  129. {
  130. int f_value = (int)fv.FieldValue;
  131. if (f_value == 0)
  132. {
  133. log.Info(string.Format("配平单位等级: 场景{0},filed:{1}-{2} -> {3}", scene.TemplateID, fv.FieldOwner, fv.Field.Name, scene.DefaultUnitLevel));
  134. fv.Field.SetValue(fv.FieldOwner, scene.DefaultUnitLevel);
  135. }
  136. }
  137. }
  138. return scene;
  139. }
  140. class StartPointTrigger
  141. {
  142. private readonly IGuardUnit guard;
  143. private readonly InstanceFlag start;
  144. public StartPointTrigger(IGuardUnit guard, InstanceFlag start)
  145. {
  146. this.guard = guard;
  147. this.start = start;
  148. (this.guard as InstanceUnit).OnActivated += this.onUnitStartPoint;
  149. }
  150. private void onUnitStartPoint(InstanceUnit unit)
  151. {
  152. guard.AttackTo(start as ZoneWayPoint);
  153. }
  154. }
  155. private void BindAttributes(string[] attributes, GameEntity unit)
  156. {
  157. if (attributes != null)
  158. {
  159. foreach (string e in attributes)
  160. {
  161. string[] kv = e.Split('=');
  162. if (kv.Length >= 2)
  163. {
  164. unit.SetAttribute(kv[0].Trim(), kv[1].Trim());
  165. }
  166. }
  167. }
  168. }
  169. virtual protected void AddEditUnit(UnitData data)
  170. {
  171. UnitInfo info = Templates.getUnit(data.UnitTemplateID);
  172. if (info != null)
  173. {
  174. AddUnitEvent add;
  175. InstanceUnit unit = this.AddUnit(info, data.Name, data.Force, data.UnitLevel, data.X, data.Y, data.Direction, out add);
  176. if (unit != null)
  177. {
  178. BindAttributes(data.Attributes, unit);
  179. unit.SetAttribute("UnitData", data);
  180. unit.Alias = data.Alias;
  181. unit.UnitTag = data.UnitTag;
  182. unit.Pause(!data.Enable);
  183. add.Sync.Alias = unit.Alias;
  184. if (unit is IGuardUnit && !string.IsNullOrEmpty(data.StartPointName))
  185. {
  186. IGuardUnit guard = unit as IGuardUnit;
  187. InstanceFlag start = getFlag(data.StartPointName);
  188. if (start != null)
  189. {
  190. new StartPointTrigger(guard, start);
  191. }
  192. }
  193. // 绑定脚本适配器
  194. //if (mScriptAdapter != null) mScriptAdapter.BindUnit(unit);
  195. }
  196. }
  197. }
  198. virtual protected void AddEditItem(ItemData data)
  199. {
  200. ItemTemplate info = Templates.getItem(data.ItemTemplateID);
  201. if (info != null)
  202. {
  203. AddItemEvent add;
  204. InstanceItem item = this.AddItem(info, data.Name, data.X, data.Y, data.Direction, data.Force, null, out add, null,0);
  205. if (item != null)
  206. {
  207. item.Alias = data.Alias;
  208. add.Sync.Alias = item.Alias;
  209. BindAttributes(data.Attributes, item);
  210. }
  211. }
  212. }
  213. virtual protected void AddEditRegion(RegionData data)
  214. {
  215. ZoneRegion flag = new ZoneRegion(this, data);
  216. if (addFlag(flag))
  217. {
  218. BindAttributes(data.Attributes, flag);
  219. flag.Enable = data.Enable;
  220. // 绑定脚本适配器
  221. //if (mScriptAdapter != null) mScriptAdapter.BindRegion(flag);
  222. }
  223. else
  224. {
  225. throw new Exception("Already Have Flag : " + data.Name);
  226. }
  227. }
  228. virtual protected void AddEditPoint(PointData data)
  229. {
  230. ZoneWayPoint flag = new ZoneWayPoint(this, data);
  231. if (addFlag(flag))
  232. {
  233. BindAttributes(data.Attributes, flag);
  234. flag.Enable = data.Enable;
  235. // 绑定脚本适配器
  236. //if (mScriptAdapter != null) mScriptAdapter.BindFlag(flag);
  237. }
  238. else
  239. {
  240. throw new Exception("Already Have Flag : " + data.Name);
  241. }
  242. }
  243. virtual protected void AddEditDecoration(DecorationData data)
  244. {
  245. ZoneDecoration flag = new ZoneDecoration(this, data);
  246. if (addFlag(flag))
  247. {
  248. BindAttributes(data.Attributes, flag);
  249. flag.Enable = data.Enable;
  250. // 绑定脚本适配器
  251. //if (mScriptAdapter != null) mScriptAdapter.BindFlag(flag);
  252. }
  253. else
  254. {
  255. throw new Exception("Already Have Flag : " + data.Name);
  256. }
  257. }
  258. virtual protected void AddEditArea(AreaData data)
  259. {
  260. ZoneArea area = new ZoneArea(this, data);
  261. if (addFlag(area))
  262. {
  263. BindAttributes(data.Attributes, area);
  264. area.Enable = data.Enable;
  265. // 绑定脚本适配器
  266. //if (mScriptAdapter != null) mScriptAdapter.BindFlag(flag);
  267. }
  268. else
  269. {
  270. throw new Exception("Already Have Flag : " + data.Name);
  271. }
  272. }
  273. virtual protected void BindEditAbility(SceneObjectData data)
  274. {
  275. if (data is PointData)
  276. {
  277. InitEditPoint(data as PointData);
  278. }
  279. else if (data is RegionData)
  280. {
  281. InitEditRegion(data as RegionData);
  282. }
  283. else if (data is AreaData)
  284. {
  285. InitEditArea(data as AreaData);
  286. }
  287. }
  288. virtual protected void InitEditPoint(PointData data)
  289. {
  290. ZoneWayPoint flag = getFlag(data.Name) as ZoneWayPoint;
  291. if (flag != null && data.NextNames != null)
  292. {
  293. foreach (string nextname in data.NextNames)
  294. {
  295. ZoneWayPoint nextpoint = getFlag(nextname) as ZoneWayPoint;
  296. if (nextpoint != null)
  297. {
  298. flag.AddNext(nextpoint);
  299. }
  300. else
  301. {
  302. log.Error("can not find next point : " + data.Name + " -> " + nextname);
  303. }
  304. }
  305. }
  306. }
  307. virtual protected void InitEditRegion(RegionData rdata)
  308. {
  309. ZoneRegion flag = getFlag(rdata.Name) as ZoneRegion;
  310. if (flag != null && rdata.Abilities != null)
  311. {
  312. foreach (AbilityData td in rdata.Abilities)
  313. {
  314. if (td is SpawnUnitAbilityData)
  315. {
  316. SpawnUnitAbilityData tgd = td as SpawnUnitAbilityData;
  317. SpawnUnitTrigger tg = tgd.CreateTrigger(this);
  318. tg.bindToRegion(flag);
  319. // 绑定脚本适配器
  320. //if (mScriptAdapter != null) mScriptAdapter.BindRegionSpawner(flag, tg);
  321. }
  322. else if (td is SpawnItemAbilityData)
  323. {
  324. SpawnItemAbilityData tgd = td as SpawnItemAbilityData;
  325. SpawnItemTrigger tg = tgd.CreateTrigger(this);
  326. tg.bindToRegion(flag);
  327. // 绑定脚本适配器
  328. //if (mScriptAdapter != null) mScriptAdapter.BindRegionSpawner(flag, tg);
  329. }
  330. else if (td is PlayerStartAbilityData)
  331. {
  332. PlayerStartAbilityData tgd = td as PlayerStartAbilityData;
  333. mStartRegions.Put(tgd.START_Force, flag);
  334. }
  335. else if (td is UnitTransportAbilityData)
  336. {
  337. UnitTransportAbilityData tp = td as UnitTransportAbilityData;
  338. TransportUnitTrigger tg = tp.CreateTrigger(this);
  339. tg.bindToRegion(flag);
  340. }
  341. else if(td is RegionDamageAbilityData)
  342. {
  343. RegionDamageAbilityData trd = td as RegionDamageAbilityData;
  344. RegionDamageTrigger trigger = trd.CreateTrigger(this);
  345. trigger.bindToRegion(flag);
  346. }
  347. }
  348. }
  349. }
  350. virtual protected void InitEditArea(AreaData data)
  351. {
  352. ZoneArea area = getFlag(data.Name) as ZoneArea;
  353. if (area != null)
  354. {
  355. area.BindMapBlock(data);
  356. }
  357. }
  358. #endregion
  359. //---------------------------------------------------------------------------------------------------------
  360. public override void Update(int intervalMS, bool slowRefresh)
  361. {
  362. base.Update(intervalMS, slowRefresh);
  363. }
  364. public ZoneRegion GetEditStartRegion(int force)
  365. {
  366. return mStartRegions.Get(force);
  367. }
  368. [Obsolete]
  369. public List<KeyValuePair<int, ZoneRegion>> GetEditStartRegions()
  370. {
  371. return new List<KeyValuePair<int, ZoneRegion>>(mStartRegions);
  372. }
  373. public void GetEditStartRegions(List<KeyValuePair<int, ZoneRegion>> list)
  374. {
  375. list.AddRange(mStartRegions);
  376. }
  377. public void ForEachEditStartRegions(Action<int, ZoneRegion> action)
  378. {
  379. foreach (var kv in mStartRegions)
  380. {
  381. action(kv.Key, kv.Value);
  382. }
  383. }
  384. public RegionData TryGetTestRegion(out PlayerStartAbilityData start, Random random = null)
  385. {
  386. var list = Data.GetStartRegionsList();
  387. if (list.Count > 0)
  388. {
  389. if (random != null)
  390. {
  391. CUtils.RandomList<RegionData>(random, list);
  392. }
  393. var ret = list[0];
  394. start = ret.GetAbilityOf<PlayerStartAbilityData>();
  395. return ret;
  396. }
  397. start = null;
  398. return null;
  399. }
  400. public bool TryGetTestTemplate(out UnitInfo info, out PlayerStartAbilityData start, Random random = null)
  401. {
  402. var list = Data.GetStartRegionsList();
  403. if (list.Count > 0)
  404. {
  405. if (random != null)
  406. {
  407. CUtils.RandomList<RegionData>(random, list);
  408. }
  409. foreach (CommonAI.Zone.ZoneEditor.RegionData rg in list)
  410. {
  411. if (TryGetTestTemplate(rg, out info, out start))
  412. {
  413. return true;
  414. }
  415. }
  416. }
  417. info = null;
  418. start = null;
  419. return false;
  420. }
  421. private bool TryGetTestTemplate(RegionData startRegion, out UnitInfo info, out PlayerStartAbilityData start)
  422. {
  423. PlayerStartAbilityData tgd = startRegion.GetAbilityOf<PlayerStartAbilityData>();
  424. int actorTemplateID = tgd.TestActorTemplateID;
  425. start = tgd;
  426. info = Templates.getUnit(actorTemplateID);
  427. if (info != null)
  428. {
  429. info = info.Clone() as UnitInfo;
  430. info.UType = UnitInfo.UnitType.TYPE_PLAYER;
  431. return true;
  432. }
  433. return false;
  434. }
  435. }
  436. }