EditorDatas.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using CommonAI.Zone.Instance;
  5. using CommonAI.Zone;
  6. using CommonLang.Property;
  7. using System.Globalization;
  8. using CommonAI.Zone.Attributes;
  9. using CommonLang.Xml;
  10. using System.Xml;
  11. using CommonLang.Log;
  12. using CommonLang.IO;
  13. using CommonLang;
  14. using CommonAI.ZoneEditor;
  15. using CommonLang.IO.Attribute;
  16. using CommonLang.Vector;
  17. namespace CommonAI.Zone.ZoneEditor
  18. {
  19. // ----------------------------------------------------------------------------------
  20. #region SceneObjectData
  21. [TableClassAttribute("Name")]
  22. public abstract class SceneObjectData : IExternalizable
  23. {
  24. [DescAttribute("Name", "", false)]
  25. public string Name;
  26. [DescAttribute("别名")]
  27. public string Alias;
  28. [DescAttribute("坐标X")]
  29. public float X;
  30. [DescAttribute("坐标Y")]
  31. public float Y;
  32. [DescAttribute("", "", false)]
  33. public string SavePath;
  34. [ColorValueAttribute]
  35. [DescAttribute("Color(ARGB)", "扩展", true, null)]
  36. public int Color = ColorValueAttribute.COLOR_GREEN;
  37. [DescAttribute("扩展属性", "扩展")]
  38. public string[] Attributes;
  39. [DescAttribute("逻辑开关", "扩展")]
  40. public bool Enable = true;
  41. [DescAttribute("地图显示", "地图显示")]
  42. public bool MapShow = false;
  43. [DescAttribute("地图名称", "地图显示")]
  44. public string UnitName = "";
  45. [DescAttribute("地图icon", "地图显示")]
  46. public string UnitIcon = "";
  47. [DescAttribute("坐标OffsetX", "地图显示")]
  48. public float OffsetX = 0;
  49. [DescAttribute("坐标OffsetX", "地图显示")]
  50. public float OffsetY = 0;
  51. [DescAttribute("坐标LableOffsetX", "地图显示")]
  52. public float LableOffsetX = 0;
  53. [DescAttribute("坐标LableOffsetY", "地图显示")]
  54. public float LableOffsetY = 15;
  55. [DescAttribute("事件", "事件")]
  56. [SceneScriptIDAttribute]
  57. public string Script;
  58. [DescAttribute("Tag")]
  59. public string Tag;
  60. public abstract float Radius { get; }
  61. public abstract IEnumerable<AbilityData> GetAbilities();
  62. public T GetAbilityOf<T>() where T : AbilityData
  63. {
  64. foreach (var ab in this.GetAbilities())
  65. {
  66. if (ab is T)
  67. {
  68. return ab as T;
  69. }
  70. }
  71. return null;
  72. }
  73. public override string ToString()
  74. {
  75. return Name + "";
  76. }
  77. public virtual void WriteExternal(IOutputStream output)
  78. {
  79. output.PutUTF(this.Name);
  80. output.PutUTF(this.Alias);
  81. output.PutF32(this.X);
  82. output.PutF32(this.Y);
  83. output.PutUTF(this.SavePath);
  84. output.PutS32(this.Color);
  85. output.PutArray(this.Attributes, output.PutUTF);
  86. output.PutBool(this.Enable);
  87. output.PutBool(this.MapShow);
  88. output.PutUTF(this.UnitName);
  89. output.PutUTF(this.UnitIcon);
  90. output.PutF32(this.OffsetX);
  91. output.PutF32(this.OffsetY);
  92. output.PutF32(this.LableOffsetX);
  93. output.PutF32(this.LableOffsetY);
  94. output.PutUTF(this.Script);
  95. output.PutUTF(this.Tag);
  96. }
  97. public virtual void ReadExternal(IInputStream input)
  98. {
  99. this.Name = input.GetUTF();
  100. this.Alias = input.GetUTF();
  101. this.X = input.GetF32();
  102. this.Y = input.GetF32();
  103. this.SavePath = input.GetUTF();
  104. this.Color = input.GetS32();
  105. this.Attributes = input.GetUTFArray();
  106. this.Enable = input.GetBool();
  107. this.MapShow = input.GetBool();
  108. this.UnitName = input.GetUTF();
  109. this.UnitIcon = input.GetUTF();
  110. this.OffsetX = input.GetF32();
  111. this.OffsetY = input.GetF32();
  112. this.LableOffsetX = input.GetF32();
  113. this.LableOffsetY = input.GetF32();
  114. this.Script = input.GetUTF();
  115. this.Tag = input.GetUTF();
  116. }
  117. }
  118. [MessageType(0x4301)]
  119. [DescAttribute("场景区域数据")]
  120. public class RegionData : SceneObjectData
  121. {
  122. public enum Shape
  123. {
  124. RECTANGLE,
  125. ROUND,
  126. STRIP,
  127. }
  128. public bool IsRound { get { return RegionType == Shape.ROUND; } }
  129. [DescAttribute("区域类型")]
  130. public RegionData.Shape RegionType = RegionData.Shape.ROUND;
  131. [DescAttribute("宽度")]
  132. public float W = 10;
  133. [DescAttribute("长度")]
  134. [DependOnProperty("IsRound", false)]
  135. public float H = 10;
  136. [DescAttribute("区域方向")]
  137. [DependOnProperty("ShapDirectionality")]
  138. public float StripDirection;
  139. [DescAttribute("绑定的能力", "能力")]
  140. [ListAttribute(typeof(RegionAbilityData))]
  141. public List<RegionAbilityData> Abilities = new List<RegionAbilityData>();
  142. public bool ShapDirectionality { get { return RegionType == Shape.STRIP; } }
  143. public override float Radius
  144. {
  145. get { return ((IsRound) ? W : Math.Max(W, H)) / 2; }
  146. }
  147. public override IEnumerable<AbilityData> GetAbilities() { return Abilities.ToArray(); }
  148. public override void WriteExternal(IOutputStream output)
  149. {
  150. base.WriteExternal(output);
  151. output.PutS32((int)RegionType);
  152. output.PutF32(W);
  153. output.PutF32(H);
  154. output.PutList(this.Abilities, output.PutExt);
  155. output.PutF32(this.StripDirection);
  156. }
  157. public override void ReadExternal(IInputStream input)
  158. {
  159. base.ReadExternal(input);
  160. this.RegionType = (RegionData.Shape)input.GetS32();
  161. this.W = input.GetF32();
  162. this.H = input.GetF32();
  163. this.Abilities = input.GetListAny<RegionAbilityData>();
  164. this.StripDirection = input.GetF32();
  165. }
  166. }
  167. [MessageType(0x4302)]
  168. [DescAttribute("场景路点数据")]
  169. public class PointData : SceneObjectData
  170. {
  171. [DescAttribute("临近的所有点")]
  172. [NotNull]
  173. public List<string> NextNames = new List<string>();
  174. [DescAttribute("绑定的能力", "能力")]
  175. [ListAttribute(typeof(PointAbilityData))]
  176. public List<PointAbilityData> Abilities = new List<PointAbilityData>();
  177. public override IEnumerable<AbilityData> GetAbilities() { return Abilities.ToArray(); }
  178. public override float Radius
  179. {
  180. get { return 1; }
  181. }
  182. public override void WriteExternal(IOutputStream output)
  183. {
  184. base.WriteExternal(output);
  185. output.PutList(NextNames, output.PutUTF);
  186. output.PutList(Abilities, output.PutExt);
  187. }
  188. public override void ReadExternal(IInputStream input)
  189. {
  190. base.ReadExternal(input);
  191. this.NextNames = input.GetUTFList();
  192. this.Abilities = input.GetListAny<PointAbilityData>();
  193. }
  194. }
  195. [MessageType(0x4303)]
  196. [DescAttribute("场景装饰物")]
  197. public class DecorationData : SceneObjectData
  198. {
  199. public enum Shape
  200. {
  201. RECTANGLE,
  202. ROUND,
  203. STRIP,
  204. }
  205. [DescAttribute("区域类型", "基础")]
  206. public Shape RegionType = Shape.ROUND;
  207. [DescAttribute("宽度", "基础")]
  208. public float W = 10;
  209. [DescAttribute("长度", "基础")]
  210. public float H = 10;
  211. [DescAttribute("高度", "基础")]
  212. public float Height;
  213. [DescAttribute("区域方向", "基础")]
  214. [DependOnProperty("ShapDirectionality")]
  215. public float StripDirection;
  216. public bool ShapDirectionality { get { return RegionType == Shape.STRIP; } }
  217. [DescAttribute("是否为阻挡", "阻挡")]
  218. public bool Blockable = false;
  219. [ColorValueAttribute]
  220. [DependOnProperty("Blockable")]
  221. [DescAttribute("若为阻挡,则阻挡值(ARGB)", "阻挡", true, null)]
  222. public int BlockValue = ColorValueAttribute.COLOR_GREEN;
  223. [DescAttribute("空气墙内部平铺网格(宽)", "显示")]
  224. public float GridSizeW;
  225. [DescAttribute("空气墙内部平铺网格(高)", "显示")]
  226. public float GridSizeH;
  227. [DescAttribute("对应的模型文件名", "显示")]
  228. [ResourceIDAttribute]
  229. public string ResourceID;
  230. [DescAttribute("出生特效", "显示")]
  231. [ResourceIDAttribute]
  232. public string ResourceID_Enabled;
  233. [DescAttribute("消亡特效", "显示")]
  234. [ResourceIDAttribute]
  235. public string ResourceID_Disabled;
  236. [DescAttribute("特效方向", "显示")]
  237. public float Direction;
  238. [DescAttribute("当前动画名字", "显示")]
  239. public string AnimName;
  240. [DescAttribute("缩放", "显示")]
  241. public float Scale;
  242. [DescAttribute("环境音效", "声音")]
  243. [ResourceIDAttribute]
  244. public string SoundAmbient;
  245. [DescAttribute("绑定的能力", "能力")]
  246. [ListAttribute(typeof(DecorationAbilityData))]
  247. public List<DecorationAbilityData> Abilities = new List<DecorationAbilityData>();
  248. public override float Radius
  249. {
  250. get { return ((RegionType == Shape.ROUND) ? W : Math.Max(W, H)) / 2; }
  251. }
  252. public override IEnumerable<AbilityData> GetAbilities() { return Abilities.ToArray(); }
  253. public override void WriteExternal(IOutputStream output)
  254. {
  255. base.WriteExternal(output);
  256. output.PutS32((int)this.RegionType);
  257. output.PutF32(this.W);
  258. output.PutF32(this.H);
  259. output.PutF32(this.Height);
  260. output.PutF32(this.StripDirection);
  261. output.PutBool(this.Blockable);
  262. output.PutS32(this.BlockValue);
  263. output.PutF32(this.GridSizeW);
  264. output.PutF32(this.GridSizeH);
  265. output.PutUTF(this.ResourceID);
  266. output.PutUTF(this.ResourceID_Enabled);
  267. output.PutUTF(this.ResourceID_Disabled);
  268. output.PutUTF(this.AnimName);
  269. output.PutF32(this.Direction);
  270. output.PutF32(this.Scale);
  271. output.PutUTF(this.SoundAmbient);
  272. output.PutList(Abilities, output.PutExt);
  273. }
  274. public override void ReadExternal(IInputStream input)
  275. {
  276. base.ReadExternal(input);
  277. this.RegionType = (DecorationData.Shape)input.GetS32();
  278. this.W = input.GetF32();
  279. this.H = input.GetF32();
  280. this.Height = input.GetF32();
  281. this.StripDirection = input.GetF32();
  282. this.Blockable = input.GetBool();
  283. this.BlockValue = input.GetS32();
  284. this.GridSizeW = input.GetF32();
  285. this.GridSizeH = input.GetF32();
  286. this.ResourceID = input.GetUTF();
  287. this.ResourceID_Enabled = input.GetUTF();
  288. this.ResourceID_Disabled = input.GetUTF();
  289. this.AnimName = input.GetUTF();
  290. this.Direction = input.GetF32();
  291. this.Scale = input.GetF32();
  292. this.SoundAmbient = input.GetUTF();
  293. this.Abilities = input.GetListAny<DecorationAbilityData>();
  294. }
  295. public void GetResourcePoints(List<CommonLang.Geometry.Vector2> list)
  296. {
  297. switch (RegionType)
  298. {
  299. case Shape.RECTANGLE:
  300. ForEachExpand(this.GridSizeW, this.W, (rx) =>
  301. {
  302. ForEachExpand(this.GridSizeH, this.H, (ry) =>
  303. {
  304. list.Add(new CommonLang.Geometry.Vector2(rx, ry));
  305. });
  306. });
  307. break;
  308. case Shape.ROUND:
  309. ForEachExpand(this.GridSizeW, this.W, (rx) =>
  310. {
  311. ForEachExpand(this.GridSizeH, this.H, (ry) =>
  312. {
  313. if (CMath.includeEllipsePoint(0, 0, W / 2, H / 2, rx, ry))
  314. {
  315. list.Add(new CommonLang.Geometry.Vector2(rx, ry));
  316. }
  317. });
  318. });
  319. break;
  320. case Shape.STRIP:
  321. ForEachExpand(this.GridSizeW, this.W, (rx) =>
  322. {
  323. ForEachExpand(this.GridSizeH, this.H, (ry) =>
  324. {
  325. list.Add(new CommonLang.Geometry.Vector2(ry, rx));
  326. });
  327. });
  328. break;
  329. }
  330. }
  331. public static void ForEachExpand(float cell, float len, Action<float> action)
  332. {
  333. action(0);
  334. if (cell > 0 && len > 0)
  335. {
  336. float half = len / 2;
  337. for (float r = cell; r < half; r += cell)
  338. {
  339. action(+r);
  340. action(-r);
  341. }
  342. }
  343. }
  344. }
  345. [MessageType(0x4304)]
  346. [DescAttribute("场景单位数据")]
  347. public class UnitData : SceneObjectData
  348. {
  349. [DescAttribute("单位模板ID")]
  350. [TemplateIDAttribute(typeof(UnitInfo))]
  351. public int UnitTemplateID;
  352. [DescAttribute("等级")]
  353. [TemplateLevelAttribute]
  354. public int UnitLevel;
  355. [DescAttribute("阵营")]
  356. public byte Force;
  357. [DescAttribute("单位方向")]
  358. public float Direction;
  359. [DescAttribute("单位尺寸")]
  360. public float Scale = 1;
  361. [DescAttribute("单位标记")]
  362. public string UnitTag;
  363. [SceneObjectIDAttribute(typeof(PointData))]
  364. [DescAttribute("单位初始路点")]
  365. public string StartPointName;
  366. [DescAttribute("绑定的能力", "能力")]
  367. [ListAttribute(typeof(UnitAbilityData))]
  368. public List<UnitAbilityData> Abilities = new List<UnitAbilityData>();
  369. public override float Radius
  370. {
  371. get { return 1; }
  372. }
  373. public override IEnumerable<AbilityData> GetAbilities() { return Abilities.ToArray(); }
  374. public override void WriteExternal(IOutputStream output)
  375. {
  376. base.WriteExternal(output);
  377. output.PutS32(UnitTemplateID);
  378. output.PutS32(UnitLevel);
  379. output.PutU8(Force);
  380. output.PutF32(Direction);
  381. output.PutF32(Scale);
  382. output.PutUTF(UnitTag);
  383. output.PutUTF(StartPointName);
  384. output.PutList(Abilities, output.PutExt);
  385. }
  386. public override void ReadExternal(IInputStream input)
  387. {
  388. base.ReadExternal(input);
  389. this.UnitTemplateID = input.GetS32();
  390. this.UnitLevel = input.GetS32();
  391. this.Force = input.GetU8();
  392. this.Direction = input.GetF32();
  393. this.Scale = input.GetF32();
  394. this.UnitTag = input.GetUTF();
  395. this.StartPointName = input.GetUTF();
  396. this.Abilities = input.GetListAny<UnitAbilityData>();
  397. }
  398. }
  399. [MessageType(0x4305)]
  400. [DescAttribute("场景物品数据")]
  401. public class ItemData : SceneObjectData
  402. {
  403. [DescAttribute("物品模板ID")]
  404. [TemplateIDAttribute(typeof(ItemTemplate))]
  405. public int ItemTemplateID;
  406. [DescAttribute("阵营")]
  407. public byte Force;
  408. [DescAttribute("方向")]
  409. public float Direction;
  410. [DescAttribute("绑定的能力", "能力")]
  411. [ListAttribute(typeof(ItemAbilityData))]
  412. public List<ItemAbilityData> Abilities = new List<ItemAbilityData>();
  413. public override float Radius
  414. {
  415. get { return 1; }
  416. }
  417. public override IEnumerable<AbilityData> GetAbilities() { return Abilities.ToArray(); }
  418. public override void WriteExternal(IOutputStream output)
  419. {
  420. base.WriteExternal(output);
  421. output.PutS32(ItemTemplateID);
  422. output.PutU8(Force);
  423. output.PutF32(Direction);
  424. output.PutList(Abilities, output.PutExt);
  425. }
  426. public override void ReadExternal(IInputStream input)
  427. {
  428. base.ReadExternal(input);
  429. this.ItemTemplateID = input.GetS32();
  430. this.Force = input.GetU8();
  431. this.Direction = input.GetF32();
  432. this.Abilities = input.GetListAny<ItemAbilityData>();
  433. }
  434. }
  435. [MessageType(0x4306)]
  436. [DescAttribute("场景Area标识数据")]
  437. public class AreaData : SceneObjectData
  438. {
  439. [DescAttribute("阵营")]
  440. public byte Force;
  441. [LocalizationTextAttribute]
  442. [DescAttribute("显示名字")]
  443. public string DisplayName;
  444. [DescAttribute("宽度", "基础")]
  445. public float W = 10;
  446. [DescAttribute("长度", "基础")]
  447. public float H = 10;
  448. [DescAttribute("绑定的能力", "能力")]
  449. [ListAttribute(typeof(AreaAbilityData))]
  450. public List<AreaAbilityData> Abilities = new List<AreaAbilityData>();
  451. public override float Radius
  452. {
  453. get { return Math.Max(W, H) / 2; }
  454. }
  455. public override IEnumerable<AbilityData> GetAbilities() { return Abilities.ToArray(); }
  456. public override void WriteExternal(IOutputStream output)
  457. {
  458. base.WriteExternal(output);
  459. output.PutU8(Force);
  460. output.PutUTF(DisplayName);
  461. output.PutF32(W);
  462. output.PutF32(H);
  463. output.PutList(Abilities, output.PutExt);
  464. }
  465. public override void ReadExternal(IInputStream input)
  466. {
  467. base.ReadExternal(input);
  468. this.Force = input.GetU8();
  469. this.DisplayName = input.GetUTF();
  470. this.W = input.GetF32();
  471. this.H = input.GetF32();
  472. this.Abilities = input.GetListAny<AreaAbilityData>();
  473. }
  474. }
  475. #endregion
  476. // ----------------------------------------------------------------------------------
  477. [MessageType(0x4310)]
  478. [DescAttribute("地形数据")]
  479. public class TerrainData : IExternalizable
  480. {
  481. //---------------------------------------------------------
  482. [DescAttribute("宽(格子)", "地形", false)]
  483. public int XCount = 100;
  484. [DescAttribute("高(格子)", "地形", false)]
  485. public int YCount = 100;
  486. [DescAttribute("每格宽", "地形", false)]
  487. public int GridCellW = 32;
  488. [DescAttribute("每格高", "地形", false)]
  489. public int GridCellH = 32;
  490. [DescAttribute("地形数据", "地形", false)]
  491. public string TerrainTextData;
  492. //---------------------------------------------------------
  493. private ZoneInfo mZoneData;
  494. public ZoneInfo ZoneData
  495. {
  496. get
  497. {
  498. if (mZoneData == null)
  499. mZoneData = ToZoneData();
  500. return mZoneData;
  501. }
  502. }
  503. //---------------------------------------------------------
  504. public void SetTerrain(ZoneInfo zonedata)
  505. {
  506. mZoneData = zonedata;
  507. int[,] terrain = zonedata.TerrainMatrix;
  508. int gridW = zonedata.GridCellW;
  509. int gridH = zonedata.GridCellH;
  510. StringBuilder sb = new StringBuilder();
  511. sb.AppendLine();
  512. this.GridCellW = gridW;
  513. this.GridCellH = gridH;
  514. this.XCount = terrain.GetLength(0);
  515. this.YCount = terrain.GetLength(1);
  516. for (int y = 0; y < YCount; y++)
  517. {
  518. sb.Append("{");
  519. for (int x = 0; x < XCount; x++)
  520. {
  521. sb.Append(terrain[x, y].ToString("X"));
  522. if (x < XCount - 1)
  523. {
  524. sb.Append(',');
  525. }
  526. }
  527. sb.Append("},");
  528. sb.AppendLine();
  529. }
  530. this.TerrainTextData = sb.ToString();
  531. }
  532. private ZoneInfo ToZoneData()
  533. {
  534. ZoneInfo info = new ZoneInfo(XCount, YCount, GridCellW, GridCellH);
  535. if (TerrainTextData != null)
  536. {
  537. int pos = 1;
  538. for (int y = 0; y < YCount; y++)
  539. {
  540. ReadLineY(y, info, ref pos);
  541. }
  542. }
  543. return info;
  544. }
  545. private void ReadLineY(int y, ZoneInfo info, ref int pos)
  546. {
  547. pos = TerrainTextData.IndexOf('{', pos);
  548. if (pos >= 0)
  549. {
  550. int old_pos = pos + 1;
  551. int len = 0;
  552. string num = null;
  553. int last_x = XCount - 1;
  554. for (int x = 0; x < XCount; x++)
  555. {
  556. if (x == last_x)
  557. {
  558. pos = TerrainTextData.IndexOf('}', old_pos);
  559. }
  560. else
  561. {
  562. pos = TerrainTextData.IndexOf(',', old_pos);
  563. }
  564. if (pos > old_pos)
  565. {
  566. len = pos - old_pos;
  567. num = TerrainTextData.Substring(old_pos, len);
  568. info.mTerrainMatrix[x, y] = int.Parse(num, NumberStyles.HexNumber);
  569. }
  570. pos += 1;
  571. old_pos = pos;
  572. }
  573. }
  574. }
  575. public void WriteExternal(IOutputStream output)
  576. {
  577. output.PutS32(this.XCount);
  578. output.PutS32(this.YCount);
  579. output.PutS32(this.GridCellW);
  580. output.PutS32(this.GridCellH);
  581. output.PutExt(this.ZoneData);
  582. }
  583. public void ReadExternal(IInputStream input)
  584. {
  585. this.XCount = input.GetS32();
  586. this.YCount = input.GetS32();
  587. this.GridCellW = input.GetS32();
  588. this.GridCellH = input.GetS32();
  589. this.SetTerrain(input.GetExt<ZoneInfo>());
  590. }
  591. }
  592. //--------------------------------------------------------------------------------------------------------
  593. [MessageType(0x4300)]
  594. [DescAttribute("关卡数据")]
  595. [TableClassAttribute("ID")]
  596. public class SceneData : ITemplateData, IExternalizable
  597. {
  598. public int TemplateID { get { return ID; } }
  599. [XmlSerializable()]
  600. public string EditorPath { get; set; }
  601. [DescAttribute("阻挡检测,寻找附近点的最大半径(目前仅客户端用)", "属性", true)]
  602. public float BlockSeekCritical = 5.0f;
  603. [DescAttribute("", "属性", false)]
  604. public int ID;
  605. [DescAttribute("场景资源", "属性", true)]
  606. [ResourceIDAttribute]
  607. public string FileName;
  608. [DescAttribute("场景背景音乐", "属性", true)]
  609. [ResourceIDAttribute]
  610. public string BGM;
  611. [DescAttribute("游戏总时间,0表示无限制", "属性", true)]
  612. public int TotalTimeLimitSEC;
  613. [DescAttribute("场景资源属性", "属性", true)]
  614. public string ResourceProperty;
  615. [LocalizationTextAttribute]
  616. [DescAttribute("场景名字", "属性", true)]
  617. public string Name;
  618. [DescAttribute("是否可以骑马,编辑器填写无效", "属性", true)]
  619. public bool canRiding=true;
  620. [LocalizationTextAttribute]
  621. [DescAttribute("场景简介", "属性", true)]
  622. public string Desc;
  623. [DescAttribute("自定义字段", "属性", true)]
  624. public string[] Attributes;
  625. [DescAttribute("", "", false)]
  626. public TerrainData Terrain = new TerrainData();
  627. //---------------------------------------------------------
  628. [DescAttribute("最大支持玩家数量-废弃", "战斗")]
  629. public int MaxPlayer = 10;
  630. [DescAttribute("最大单位数量", "战斗")]
  631. public int MaxUnit = 500;
  632. [DescAttribute("连斩时间间隔", "战斗")]
  633. public int killInterval = 0;
  634. [DescAttribute("连斩上限", "战斗")]
  635. public int killMax = 0;
  636. [DescAttribute("连斩上限后,连斩数冷却时间", "战斗")]
  637. public int killMaxCoolTime = 0;
  638. [DescAttribute("是否是队伍", "战斗")]
  639. public bool isTeam = false;
  640. [DescAttribute("场景类型", "场景")]
  641. public CommonAI.Data.SceneType sceneType = CommonAI.Data.SceneType.Normal;
  642. //---------------------------------------------------------
  643. [DescAttribute("单位掉线即离开场景", "网络")]
  644. public bool RemoveUnitOnDisconnect = false;
  645. [DescAttribute("客户端同步范围", "网络")]
  646. public float ClientSyncRange = 20;
  647. //---------------------------------------------------------
  648. [DescAttribute("默认单位等级", "单位 - 某个单位")]
  649. [TemplateLevelAttribute]
  650. public int DefaultUnitLevel = 0;
  651. [DescAttribute("每层怪物属性增加比率", "单位 - 某个单位")]
  652. public double MonsterAddPropPercentWithFloor = 0;
  653. [DescAttribute("怪物每等级属性成长系数", "单位 - 某个单位")]
  654. public double MonsterAddPropRatioWithLv = 0;
  655. //---------------------------------------------------------s
  656. [DescAttribute("所有路点", "单位", false)]
  657. public List<PointData> Points = new List<PointData>();
  658. [DescAttribute("所有区域", "单位", false)]
  659. public List<RegionData> Regions = new List<RegionData>();
  660. [DescAttribute("所有装饰物", "单位", false)]
  661. public List<DecorationData> Decorations = new List<DecorationData>();
  662. [DescAttribute("所有单位", "单位", false)]
  663. public List<UnitData> Units = new List<UnitData>();
  664. [DescAttribute("所有物品", "单位", false)]
  665. public List<ItemData> Items = new List<ItemData>();
  666. [DescAttribute("所有区域", "单位", false)]
  667. public List<AreaData> Areas = new List<AreaData>();
  668. //---------------------------------------------------------
  669. [DescAttribute("所有能力", "能力 - 服务端", false)]
  670. public List<SceneAbilityData> Abilities = new List<SceneAbilityData>();
  671. //---------------------------------------------------------
  672. [DescAttribute("脚本", "事件 - 服务端", false)]
  673. [SceneScriptIDAttribute]
  674. public string Script;
  675. [DescAttribute("事件", "事件 - 服务端", false)]
  676. public List<ZoneEvent> Events = new List<ZoneEvent>();
  677. [DescAttribute("事件", "事件 - 服务端", false)]
  678. public List<ZoneVar> EnvironmentVars = new List<ZoneVar>();
  679. //---------------------------------------------------------
  680. [DescAttribute("扩展属性", "扩展")]
  681. [Expandable]
  682. [NotNull]
  683. public ISceneProperties Properties = TemplateManager.Factory.CreateSceneProperties();
  684. //---------------------------------------------------------
  685. public int GetID()
  686. {
  687. return ID;
  688. }
  689. public override string ToString()
  690. {
  691. return Name + "(" + ID + ")";
  692. }
  693. public void SetTerrain(ZoneInfo zonedata)
  694. {
  695. this.Terrain.SetTerrain(zonedata);
  696. }
  697. public ZoneInfo ZoneData
  698. {
  699. get
  700. {
  701. return this.Terrain.ZoneData;
  702. }
  703. }
  704. public HashMap<int, RegionData> GetStartRegions()
  705. {
  706. HashMap<int, RegionData> ret = new HashMap<int, RegionData>();
  707. foreach (RegionData rdata in this.Regions)
  708. {
  709. if (rdata.Abilities != null)
  710. {
  711. foreach (AbilityData td in rdata.Abilities)
  712. {
  713. if (td is PlayerStartAbilityData)
  714. {
  715. PlayerStartAbilityData tgd = td as PlayerStartAbilityData;
  716. ret.Put(tgd.START_Force, rdata);
  717. }
  718. }
  719. }
  720. }
  721. return ret;
  722. }
  723. public List<RegionData> GetStartRegionsList()
  724. {
  725. List<RegionData> ret = new List<RegionData>();
  726. foreach (RegionData rdata in this.Regions)
  727. {
  728. if (rdata.Abilities != null)
  729. {
  730. foreach (AbilityData td in rdata.Abilities)
  731. {
  732. if (td is PlayerStartAbilityData)
  733. {
  734. PlayerStartAbilityData tgd = td as PlayerStartAbilityData;
  735. ret.Add(rdata);
  736. }
  737. }
  738. }
  739. }
  740. return ret;
  741. }
  742. public T GetAbilityOf<T>() where T : AbilityData
  743. {
  744. foreach (var ab in this.Abilities)
  745. {
  746. if (ab is T)
  747. {
  748. return ab as T;
  749. }
  750. }
  751. return null;
  752. }
  753. //---------------------------------------------------------
  754. [DescAttribute("仅在保存时,用于缓存当前场景所有SN序列号", "", false)]
  755. private List<ISNData> serial_datas;
  756. public List<ISNData> GetSerialDatas()
  757. {
  758. if (serial_datas == null)
  759. {
  760. this.serial_datas = new List<ISNData>();
  761. PropertyUtil.CollectFieldTypeValues<ISNData>(this, serial_datas);
  762. }
  763. return serial_datas;
  764. }
  765. //---------------------------------------------------------
  766. public void WriteExternal(IOutputStream output)
  767. {
  768. output.PutUTF(this.EditorPath);
  769. output.PutF32(this.BlockSeekCritical);
  770. output.PutS32(this.ID);
  771. output.PutUTF(this.FileName);
  772. output.PutUTF(this.BGM);
  773. output.PutS32(this.TotalTimeLimitSEC);
  774. output.PutUTF(this.ResourceProperty);
  775. output.PutUTF(this.Name);
  776. output.PutUTF(this.Desc);
  777. output.PutArray<string>(this.Attributes, output.PutUTF);
  778. output.PutExt(this.Terrain);
  779. output.PutS32(this.MaxPlayer);
  780. output.PutS32(this.MaxUnit);
  781. output.PutS32(this.DefaultUnitLevel);
  782. output.PutBool(this.RemoveUnitOnDisconnect);
  783. output.PutF32(this.ClientSyncRange);
  784. output.PutList<PointData>(this.Points, output.PutExt);
  785. output.PutList<RegionData>(this.Regions, output.PutExt);
  786. output.PutList<DecorationData>(this.Decorations, output.PutExt);
  787. output.PutList<UnitData>(this.Units, output.PutExt);
  788. output.PutList<ItemData>(this.Items, output.PutExt);
  789. output.PutList<AreaData>(this.Areas, output.PutExt);
  790. output.PutExt(this.Properties);
  791. {
  792. this.serial_datas = new List<ISNData>();
  793. PropertyUtil.CollectFieldTypeValues<ISNData>(this, serial_datas);
  794. output.PutList(GetSerialDatas(), output.PutExt);
  795. }
  796. output.PutList<SceneAbilityData>(this.Abilities, output.PutExt);
  797. output.PutUTF(this.Script);
  798. output.PutList<ZoneEvent>(this.Events, output.PutExt);
  799. output.PutList<ZoneVar>(this.EnvironmentVars, output.PutExt);
  800. }
  801. public void ReadExternalByClient(IInputStream input)
  802. {
  803. this.EditorPath = input.GetUTF();
  804. this.BlockSeekCritical = input.GetF32();
  805. this.ID = input.GetS32();
  806. this.FileName = input.GetUTF();
  807. this.BGM = input.GetUTF();
  808. this.TotalTimeLimitSEC = input.GetS32();
  809. this.ResourceProperty = input.GetUTF();
  810. this.Name = input.GetUTF();
  811. this.Desc = input.GetUTF();
  812. this.Attributes = input.GetUTFArray();
  813. this.Terrain = input.GetExt<TerrainData>();
  814. this.MaxPlayer = input.GetS32();
  815. this.MaxUnit = input.GetS32();
  816. this.DefaultUnitLevel = input.GetS32();
  817. this.RemoveUnitOnDisconnect = input.GetBool();
  818. this.ClientSyncRange = input.GetF32();
  819. this.Points = input.GetList<PointData>(input.GetExt<PointData>);
  820. this.Regions = input.GetList<RegionData>(input.GetExt<RegionData>);
  821. this.Decorations = input.GetList<DecorationData>(input.GetExt<DecorationData>);
  822. this.Units = input.GetList<UnitData>(input.GetExt<UnitData>);
  823. this.Items = input.GetList<ItemData>(input.GetExt<ItemData>);
  824. this.Areas = input.GetList<AreaData>(input.GetExt<AreaData>);
  825. this.Properties = input.GetExt<ISceneProperties>(this.Properties);
  826. {
  827. this.serial_datas = input.GetListAny<ISNData>();
  828. }
  829. }
  830. public void ReadExternal(IInputStream input)
  831. {
  832. ReadExternalByClient(input);
  833. this.Abilities = input.GetListAny<SceneAbilityData>();
  834. this.Script = input.GetUTF();
  835. this.Events = input.GetList<ZoneEvent>(input.GetExt<ZoneEvent>);
  836. this.EnvironmentVars = input.GetList<ZoneVar>(input.GetExt<ZoneVar>);
  837. }
  838. }
  839. //--------------------------------------------------------------------------------------------------------
  840. // ----------------------------------------------------------------------------------
  841. }