MonsterFunction.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using Mir2Assistant.Common.Models;
  2. using Mir2Assistant.Common.Utils;
  3. using Mir2Assistant.Utils;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Security.Cryptography;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12. namespace Mir2Assistant.Common.Functions;
  13. /// <summary>
  14. /// 读怪、砍怪
  15. /// </summary>
  16. public static class MonsterFunction
  17. {
  18. /// <summary>
  19. /// 读怪
  20. /// </summary>
  21. public static void ReadMonster(MirGameInstanceModel gameInstance)
  22. {
  23. Task.Run(() =>
  24. {
  25. if (gameInstance.IsReadingMonsters)
  26. {
  27. return;
  28. }
  29. gameInstance.IsReadingMonsters = true;
  30. //var Monsters = new List<MonsterModel>();
  31. var memoryUtils = gameInstance!.MemoryUtils!;
  32. var monstersAddr = memoryUtils.ReadToInt(memoryUtils.GetMemoryAddress(gameInstance.MirConfig["角色基址"], -0x4, 0x3528));
  33. var monsterCount = memoryUtils.ReadToInt(monstersAddr + 0x8);
  34. var monsterArrayAddr = memoryUtils.ReadToInt(monstersAddr + 0x4);
  35. byte flag = 0;
  36. ++gameInstance.MonstersUpdateId;
  37. for (int i = 0; i < monsterCount; i++)
  38. {
  39. bool isNew = false;
  40. var monsterAddr = memoryUtils.ReadToInt(monsterArrayAddr + i * 0x4);
  41. var id = memoryUtils.ReadToInt(monsterAddr + 0x4);
  42. gameInstance.Monsters.TryGetValue(id, out MonsterModel? monster);
  43. if (monster == null)
  44. {
  45. monster = new MonsterModel();
  46. isNew = true;
  47. }
  48. monster.UpdateId = gameInstance.MonstersUpdateId;
  49. monster.Id = id;
  50. monster.Type = monster.Type ?? memoryUtils.ReadToShort(monsterAddr + 0x20);
  51. monster.Addr = monsterAddr;
  52. monster.Name = monster.Name ?? memoryUtils.ReadToString(memoryUtils.GetMemoryAddress(monsterAddr + 0x48, 0), 24);
  53. if (monster.TypeStr != "NPC" || monster.X == null)
  54. {
  55. monster.X = memoryUtils.ReadToShort(monsterAddr + 8);
  56. monster.Y = memoryUtils.ReadToShort(monsterAddr + 10);
  57. }
  58. //MonsterModel.Guild = memoryUtils.ReadToString(memoryUtils.GetMemoryAddress(monsterAddr + 0x44, 0));
  59. monster.Flag = flag;
  60. if (monster.Name == gameInstance.CharacterStatus!.Name)
  61. {
  62. monster.Flag = 1;
  63. flag = 2;
  64. }
  65. if (isNew)
  66. {
  67. gameInstance.Monsters.TryAdd(id, monster);
  68. }
  69. }
  70. foreach (var item in gameInstance.Monsters.Values.Where(o => o.UpdateId != gameInstance.MonstersUpdateId))
  71. {
  72. gameInstance.Monsters.TryRemove(item.Id, out MonsterModel? m);
  73. }
  74. gameInstance.IsReadingMonsters = false;
  75. });
  76. }
  77. /// <summary>
  78. /// 锁定怪物,相当物游戏中鼠标指向某个怪
  79. /// </summary>
  80. public static void LockMonster(MirGameInstanceModel gameInstance, int monsterAddr)
  81. {
  82. var memoryUtils = gameInstance!.MemoryUtils!;
  83. memoryUtils.WriteInt(gameInstance.MirConfig["存怪参数"], monsterAddr);
  84. }
  85. /// <summary>
  86. /// 砍怪
  87. /// </summary>
  88. /// <param name="gameInstance"></param>
  89. /// <param name="monsterAddr"></param>
  90. public static void SlayingMonster(MirGameInstanceModel gameInstance, int monsterAddr)
  91. {
  92. var memoryUtils = gameInstance!.MemoryUtils!;
  93. memoryUtils.WriteInt(memoryUtils.GetMemoryAddress(gameInstance.MirConfig["打怪基址"], -0xc), monsterAddr);
  94. }
  95. }