MapInfo.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. using System.Drawing;
  2. using Server.MirEnvir;
  3. namespace Server.MirDatabase
  4. {
  5. public class MapInfo
  6. {
  7. protected static Envir Envir
  8. {
  9. get { return Envir.Main; }
  10. }
  11. protected static Envir EditEnvir
  12. {
  13. get { return Envir.Edit; }
  14. }
  15. public int Index;
  16. public string FileName = string.Empty, Title = string.Empty;
  17. public ushort MiniMap, BigMap, Music;
  18. public LightSetting Light;
  19. public byte MapDarkLight = 0, MineIndex = 0, GTIndex = 0;
  20. public bool NoTeleport, NoReconnect, NoRandom, NoEscape, NoRecall, NoDrug, NoPosition, NoFight,
  21. NoThrowItem, NoDropPlayer, NoDropMonster, NoNames, NoMount, NeedBridle, Fight, NeedHole, Fire, Lightning,
  22. NoTownTeleport, NoReincarnation, GT, NoExperience, NoGroup = false, NoPets, NoIntelligentCreatures, NoHero, RequiredGroup = false, FireWallLimit;
  23. public int RequiredGroupSize = 0, FireWallCount = 0;
  24. public string NoReconnectMap = string.Empty;
  25. public int FireDamage, LightningDamage;
  26. public List<SafeZoneInfo> SafeZones = new List<SafeZoneInfo>();
  27. public List<MovementInfo> Movements = new List<MovementInfo>();
  28. public List<RespawnInfo> Respawns = new List<RespawnInfo>();
  29. public List<NPCInfo> NPCs = new List<NPCInfo>();
  30. public List<MineZone> MineZones = new List<MineZone>();
  31. public List<Point> ActiveCoords = new List<Point>();
  32. public WeatherSetting WeatherParticles = WeatherSetting.None;
  33. public MapInfo()
  34. {
  35. }
  36. public MapInfo(BinaryReader reader)
  37. {
  38. Index = reader.ReadInt32();
  39. FileName = reader.ReadString();
  40. Title = reader.ReadString();
  41. MiniMap = reader.ReadUInt16();
  42. Light = (LightSetting)reader.ReadByte();
  43. BigMap = reader.ReadUInt16();
  44. int count = reader.ReadInt32();
  45. for (int i = 0; i < count; i++)
  46. SafeZones.Add(new SafeZoneInfo(reader) { Info = this });
  47. count = reader.ReadInt32();
  48. for (int i = 0; i < count; i++)
  49. Respawns.Add(new RespawnInfo(reader, Envir.LoadVersion, Envir.LoadCustomVersion));
  50. count = reader.ReadInt32();
  51. for (int i = 0; i < count; i++)
  52. Movements.Add(new MovementInfo(reader));
  53. NoTeleport = reader.ReadBoolean();
  54. NoReconnect = reader.ReadBoolean();
  55. NoReconnectMap = reader.ReadString();
  56. NoRandom = reader.ReadBoolean();
  57. NoEscape = reader.ReadBoolean();
  58. NoRecall = reader.ReadBoolean();
  59. NoDrug = reader.ReadBoolean();
  60. NoPosition = reader.ReadBoolean();
  61. NoThrowItem = reader.ReadBoolean();
  62. NoDropPlayer = reader.ReadBoolean();
  63. NoDropMonster = reader.ReadBoolean();
  64. NoNames = reader.ReadBoolean();
  65. Fight = reader.ReadBoolean();
  66. Fire = reader.ReadBoolean();
  67. FireDamage = reader.ReadInt32();
  68. Lightning = reader.ReadBoolean();
  69. LightningDamage = reader.ReadInt32();
  70. MapDarkLight = reader.ReadByte();
  71. count = reader.ReadInt32();
  72. for (int i = 0; i < count; i++)
  73. MineZones.Add(new MineZone(reader));
  74. MineIndex = reader.ReadByte();
  75. NoMount = reader.ReadBoolean();
  76. NeedBridle = reader.ReadBoolean();
  77. NoFight = reader.ReadBoolean();
  78. Music = reader.ReadUInt16();
  79. if (Envir.LoadVersion < 78) return;
  80. NoTownTeleport = reader.ReadBoolean();
  81. if (Envir.LoadVersion < 79) return;
  82. NoReincarnation = reader.ReadBoolean();
  83. if (Envir.LoadVersion >= 110)
  84. {
  85. WeatherParticles = (WeatherSetting)reader.ReadUInt16();
  86. }
  87. if (Envir.LoadVersion >= 111)
  88. {
  89. GT = reader.ReadBoolean();
  90. GTIndex = reader.ReadByte();
  91. }
  92. if (Envir.LoadVersion >= 114)
  93. {
  94. NoExperience = reader.ReadBoolean();
  95. NoGroup = reader.ReadBoolean();
  96. NoPets = reader.ReadBoolean();
  97. NoIntelligentCreatures = reader.ReadBoolean();
  98. NoHero = reader.ReadBoolean();
  99. RequiredGroupSize = reader.ReadInt32();
  100. RequiredGroup = reader.ReadBoolean();
  101. FireWallLimit = reader.ReadBoolean();
  102. FireWallCount = reader.ReadInt32();
  103. }
  104. }
  105. public void Save(BinaryWriter writer)
  106. {
  107. writer.Write(Index);
  108. writer.Write(FileName);
  109. writer.Write(Title);
  110. writer.Write(MiniMap);
  111. writer.Write((byte)Light);
  112. writer.Write(BigMap);
  113. writer.Write(SafeZones.Count);
  114. for (int i = 0; i < SafeZones.Count; i++)
  115. SafeZones[i].Save(writer);
  116. writer.Write(Respawns.Count);
  117. for (int i = 0; i < Respawns.Count; i++)
  118. Respawns[i].Save(writer);
  119. writer.Write(Movements.Count);
  120. for (int i = 0; i < Movements.Count; i++)
  121. Movements[i].Save(writer);
  122. writer.Write(NoTeleport);
  123. writer.Write(NoReconnect);
  124. writer.Write(NoReconnectMap);
  125. writer.Write(NoRandom);
  126. writer.Write(NoEscape);
  127. writer.Write(NoRecall);
  128. writer.Write(NoDrug);
  129. writer.Write(NoPosition);
  130. writer.Write(NoThrowItem);
  131. writer.Write(NoDropPlayer);
  132. writer.Write(NoDropMonster);
  133. writer.Write(NoNames);
  134. writer.Write(Fight);
  135. writer.Write(Fire);
  136. writer.Write(FireDamage);
  137. writer.Write(Lightning);
  138. writer.Write(LightningDamage);
  139. writer.Write(MapDarkLight);
  140. writer.Write(MineZones.Count);
  141. for (int i = 0; i < MineZones.Count; i++)
  142. MineZones[i].Save(writer);
  143. writer.Write(MineIndex);
  144. writer.Write(NoMount);
  145. writer.Write(NeedBridle);
  146. writer.Write(NoFight);
  147. writer.Write(Music);
  148. writer.Write(NoTownTeleport);
  149. writer.Write(NoReincarnation);
  150. writer.Write((UInt16)WeatherParticles);
  151. writer.Write(GT);
  152. writer.Write(GTIndex);
  153. writer.Write(NoExperience);
  154. writer.Write(NoGroup);
  155. writer.Write(NoPets);
  156. writer.Write(NoIntelligentCreatures);
  157. writer.Write(NoHero);
  158. writer.Write(RequiredGroupSize);
  159. writer.Write(RequiredGroup);
  160. writer.Write(FireWallLimit);
  161. writer.Write(FireWallCount);
  162. }
  163. public void CreateMap()
  164. {
  165. for (int j = 0; j < Envir.NPCInfoList.Count; j++)
  166. {
  167. if (Envir.NPCInfoList[j].MapIndex != Index) continue;
  168. NPCs.Add(Envir.NPCInfoList[j]);
  169. }
  170. Map map = new Map(this);
  171. if (!map.Load()) return;
  172. Envir.MapList.Add(map);
  173. for (int i = 0; i < SafeZones.Count; i++)
  174. if (SafeZones[i].StartPoint)
  175. Envir.StartPoints.Add(SafeZones[i]);
  176. }
  177. public void CreateSafeZone()
  178. {
  179. SafeZones.Add(new SafeZoneInfo { Info = this });
  180. }
  181. public void CreateRespawnInfo()
  182. {
  183. Respawns.Add(new RespawnInfo { RespawnIndex = ++EditEnvir.RespawnIndex });
  184. }
  185. public override string ToString()
  186. {
  187. return string.Format("{0}: {1}", Index, Title);
  188. }
  189. public void CreateNPCInfo()
  190. {
  191. NPCs.Add(new NPCInfo());
  192. }
  193. public void CreateMovementInfo()
  194. {
  195. Movements.Add(new MovementInfo());
  196. }
  197. public static void FromText(string text)
  198. {
  199. string[] data = text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  200. if (data.Length < 8) return;
  201. MapInfo info = new MapInfo {FileName = data[0], Title = data[1]};
  202. if (!ushort.TryParse(data[2], out info.MiniMap)) return;
  203. if (!Enum.TryParse(data[3], out info.Light)) return;
  204. int sziCount, miCount, riCount, npcCount;
  205. if (!int.TryParse(data[4], out sziCount)) return;
  206. if (!int.TryParse(data[5], out miCount)) return;
  207. if (!int.TryParse(data[6], out riCount)) return;
  208. if (!int.TryParse(data[7], out npcCount)) return;
  209. int start = 8;
  210. for (int i = 0; i < sziCount; i++)
  211. {
  212. SafeZoneInfo temp = new SafeZoneInfo { Info = info };
  213. int x, y;
  214. if (!int.TryParse(data[start + (i * 4)], out x)) return;
  215. if (!int.TryParse(data[start + 1 + (i * 4)], out y)) return;
  216. if (!ushort.TryParse(data[start + 2 + (i * 4)], out temp.Size)) return;
  217. if (!bool.TryParse(data[start + 3 + (i * 4)], out temp.StartPoint)) return;
  218. temp.Location = new Point(x, y);
  219. info.SafeZones.Add(temp);
  220. }
  221. start += sziCount * 4;
  222. for (int i = 0; i < miCount; i++)
  223. {
  224. MovementInfo temp = new MovementInfo();
  225. int x, y;
  226. if (!int.TryParse(data[start + (i * 5)], out x)) return;
  227. if (!int.TryParse(data[start + 1 + (i * 5)], out y)) return;
  228. temp.Source = new Point(x, y);
  229. if (!int.TryParse(data[start + 2 + (i * 5)], out temp.MapIndex)) return;
  230. if (!int.TryParse(data[start + 3 + (i * 5)], out x)) return;
  231. if (!int.TryParse(data[start + 4 + (i * 5)], out y)) return;
  232. temp.Destination = new Point(x, y);
  233. info.Movements.Add(temp);
  234. }
  235. start += miCount * 5;
  236. for (int i = 0; i < riCount; i++)
  237. {
  238. RespawnInfo temp = new RespawnInfo();
  239. int x, y;
  240. if (!int.TryParse(data[start + (i * 7)], out temp.MonsterIndex)) return;
  241. if (!int.TryParse(data[start + 1 + (i * 7)], out x)) return;
  242. if (!int.TryParse(data[start + 2 + (i * 7)], out y)) return;
  243. temp.Location = new Point(x, y);
  244. if (!ushort.TryParse(data[start + 3 + (i * 7)], out temp.Count)) return;
  245. if (!ushort.TryParse(data[start + 4 + (i * 7)], out temp.Spread)) return;
  246. if (!ushort.TryParse(data[start + 5 + (i * 7)], out temp.Delay)) return;
  247. if (!byte.TryParse(data[start + 6 + (i * 7)], out temp.Direction)) return;
  248. if (!int.TryParse(data[start + 7 + (i * 7)], out temp.RespawnIndex)) return;
  249. if (!bool.TryParse(data[start + 8 + (i * 7)], out temp.SaveRespawnTime)) return;
  250. if (!ushort.TryParse(data[start + 9 + (i * 7)], out temp.RespawnTicks)) return;
  251. info.Respawns.Add(temp);
  252. }
  253. start += riCount * 7;
  254. for (int i = 0; i < npcCount; i++)
  255. {
  256. NPCInfo temp = new NPCInfo { FileName = data[start + (i * 6)], Name = data[start + 1 + (i * 6)] };
  257. int x, y;
  258. if (!int.TryParse(data[start + 2 + (i * 6)], out x)) return;
  259. if (!int.TryParse(data[start + 3 + (i * 6)], out y)) return;
  260. temp.Location = new Point(x, y);
  261. if (!ushort.TryParse(data[start + 4 + (i * 6)], out temp.Rate)) return;
  262. if (!ushort.TryParse(data[start + 5 + (i * 6)], out temp.Image)) return;
  263. info.NPCs.Add(temp);
  264. }
  265. info.Index = ++EditEnvir.MapIndex;
  266. EditEnvir.MapInfoList.Add(info);
  267. }
  268. public static string GetMapTitleByIndex(int index) // For Players Online tab
  269. {
  270. var mapInfo = Envir.MapInfoList.FirstOrDefault(m => m.Index == index);
  271. return mapInfo != null ? mapInfo.Title : $"UnknownMap({index})";
  272. }
  273. }
  274. }