EditorDatas.cs 32 KB

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