EditorDatas.cs 34 KB

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