private void FillAddressList(int functionNodeId) { // To set the right window viewData.Items.Clear(); foreach (IAddressNode addressLine in _mainTrainer.GetAddressList()) { if (addressLine.ParentIndex != functionNodeId) { continue; } viewData.Items.Add(new ListViewItem( new string[] { addressLine.Caption, // Caption "", // Original value "" // Modified value })); viewData.Items[viewData.Items.Count - 1].Tag = addressLine; } // To get memory content using (WindowsApi.ProcessMemory mem = new WindowsApi.ProcessMemory(_currentGameContext.ProcessId)) { foreach (ListViewItem currentItem in viewData.Items) { IAddressNode addressLine = currentItem.Tag as IAddressNode; if (addressLine == null) { continue; } Object itemValue; switch (addressLine.ValueType) { case AddressListValueType.Integer: itemValue = mem.ReadInt32((IntPtr)addressLine.Address) / addressLine.ValueScale; break; case AddressListValueType.Float: itemValue = mem.ReadFloat((IntPtr)addressLine.Address) / addressLine.ValueScale; break; case AddressListValueType.Char4: itemValue = mem.ReadChar4((IntPtr)addressLine.Address); break; default: itemValue = ""; break; } currentItem.SubItems[1].Text = itemValue.ToString(); } } }
public override void CreateChildren() { CreateAddress(new NewAddressListEventArgs(_nodeIndex, "经验值", unchecked (_newChildrenArgs.HeroAttributesAddress + 0x8C), AddressListValueType.Integer)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "力量", unchecked (_newChildrenArgs.HeroAttributesAddress + 0x94), AddressListValueType.Integer)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "敏捷", unchecked (_newChildrenArgs.HeroAttributesAddress + 0xA8), AddressListValueType.Integer)); using (WindowsApi.ProcessMemory mem = new WindowsApi.ProcessMemory(_gameContext.ProcessId)) { UInt32 tmpAddress1; Int32 tmpValue1; tmpValue1 = mem.ReadInt32((IntPtr) unchecked (_newChildrenArgs.HeroAttributesAddress + 0x7C + 2 * 4)); tmpAddress1 = War3Common.ReadGameValue1( mem, _gameContext, _newChildrenArgs, tmpValue1); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "智力", tmpAddress1, AddressListValueType.Integer)); } CreateAddress(new NewAddressListEventArgs(_nodeIndex, "可用技能点", unchecked (_newChildrenArgs.HeroAttributesAddress + 0x90), AddressListValueType.Integer)); for (UInt32 LearningAbilityIndex = 1; LearningAbilityIndex <= 5; LearningAbilityIndex++) { CreateAddress(new NewAddressListEventArgs(_nodeIndex, "学习技能" + LearningAbilityIndex.ToString() + " - 名称", unchecked (_newChildrenArgs.HeroAttributesAddress + 0xF0 + LearningAbilityIndex * 4), AddressListValueType.Char4)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "学习技能" + LearningAbilityIndex.ToString() + " - 等级", unchecked (_newChildrenArgs.HeroAttributesAddress + 0x108 + LearningAbilityIndex * 4), AddressListValueType.Integer)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "学习技能" + LearningAbilityIndex.ToString() + " - 要求", unchecked (_newChildrenArgs.HeroAttributesAddress + 0x120 + LearningAbilityIndex * 4), AddressListValueType.Integer)); } }
public override void CreateChildren() { using (WindowsApi.ProcessMemory mem = new WindowsApi.ProcessMemory(_gameContext.ProcessId)) { Int32 list = mem.ReadInt32((IntPtr) unchecked (_newChildrenArgs.ThisUnitAddress + _gameContext.ItemsListOffset)); if (list != 0) { for (Int32 itemIndex = 0; itemIndex < 6; itemIndex++) { UInt32 currentItem = 0; // We assume ItemIndex never go out of bounds to the List Int32 tmpValue1 = mem.ReadInt32((IntPtr) unchecked (list + 0xC * itemIndex + 0x70)); if (tmpValue1 > 0) { UInt32 RawItem = War3Common.ReadFromGameMemory( mem, _gameContext, _newChildrenArgs, tmpValue1); if (RawItem != 0) { UInt32 tmpValue2 = mem.ReadUInt32((IntPtr) unchecked (RawItem + 0x20)); if (tmpValue2 == 0) { currentItem = mem.ReadUInt32((IntPtr) unchecked (RawItem + 0x54)); } } if (currentItem != 0) { _newChildrenArgs.CurrentItemPackAddress = currentItem; base.CreateChild(TrainerNodeType.OneItem, NodeIndex); } } } // foreach items } // Item list exists } // mem } // CreateChildren()
public override void CreateChildren() { using (WindowsApi.ProcessMemory mem = new WindowsApi.ProcessMemory(_gameContext.ProcessId)) { _newChildrenArgs.AttackAttributesAddress = mem.ReadUInt32((IntPtr) unchecked (_newChildrenArgs.ThisUnitAddress + _gameContext.AttackAttributesOffset)); _newChildrenArgs.HeroAttributesAddress = mem.ReadUInt32((IntPtr) unchecked (_newChildrenArgs.ThisUnitAddress + _gameContext.HeroAttributesOffset)); if (_newChildrenArgs.AttackAttributesAddress > 0) { base.CreateChild(TrainerNodeType.AttackAttributes, NodeIndex); // base.CreateChild(TrainerNodeType.UnitAbility, NodeIndex); base.CreateChild(TrainerNodeType.AllItems, NodeIndex); } if (_newChildrenArgs.HeroAttributesAddress > 0) { base.CreateChild(TrainerNodeType.HeroAttributes, NodeIndex); } // Unit self propety(s) CreateAddress(new NewAddressListEventArgs(_nodeIndex, "单位名称", unchecked (_newChildrenArgs.ThisUnitAddress + 0x30), AddressListValueType.Char4)); UInt32 tmpAddress1, tmpAddress2; Int32 tmpValue1, tmpValue2; tmpValue1 = mem.ReadInt32((IntPtr) unchecked (_newChildrenArgs.ThisUnitAddress + 0x98 + 0x8)); tmpAddress1 = War3Common.ReadFromGameMemory( mem, _gameContext, _newChildrenArgs, tmpValue1); tmpAddress1 = unchecked (tmpAddress1 + 0x84); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "HP - 目前", unchecked (tmpAddress1 - 0xC), AddressListValueType.Float)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "HP - 最大", tmpAddress1, AddressListValueType.Float)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "HP - 回复率", unchecked (_newChildrenArgs.ThisUnitAddress + 0xB0), AddressListValueType.Float)); tmpValue1 = mem.ReadInt32((IntPtr) unchecked (_newChildrenArgs.ThisUnitAddress + 0x98 + 0x28)); tmpAddress1 = War3Common.ReadFromGameMemory( mem, _gameContext, _newChildrenArgs, tmpValue1); tmpAddress1 = unchecked (tmpAddress1 + 0x84); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "MP - 目前", unchecked (tmpAddress1 - 0xC), AddressListValueType.Float)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "MP - 最大", tmpAddress1, AddressListValueType.Float)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "MP - 回复率", unchecked (_newChildrenArgs.ThisUnitAddress + 0xD4), AddressListValueType.Float)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "盔甲 - 数量", unchecked (_newChildrenArgs.ThisUnitAddress + 0xE0), AddressListValueType.Float)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "盔甲 - 种类", unchecked (_newChildrenArgs.ThisUnitAddress + 0xE4), AddressListValueType.Integer)); // Move speed tmpAddress1 = unchecked (_newChildrenArgs.ThisUnitAddress + _gameContext.MoveSpeedOffset - 0x24); do { tmpValue1 = mem.ReadInt32((IntPtr) unchecked (tmpAddress1 + 0x24)); tmpAddress1 = War3Common.ReadGameValue2( mem, _gameContext, _newChildrenArgs, tmpValue1); tmpAddress2 = mem.ReadUInt32((IntPtr) unchecked (tmpAddress1 + 0)); tmpValue1 = mem.ReadInt32((IntPtr) unchecked (tmpAddress1 + 0x24)); tmpValue2 = mem.ReadInt32((IntPtr) unchecked (tmpAddress1 + 0x28)); // Note: If new game version released, set breakpoint here // and check tmpAddress2. Set this value as War3AddressMoveSpeed tmpAddress2 = mem.ReadUInt32((IntPtr) unchecked (tmpAddress2 + 0x2D4)); if (_gameContext.MoveSpeedAddress == tmpAddress2) { CreateAddress(new NewAddressListEventArgs(_nodeIndex, "移动速度", unchecked (tmpAddress1 + 0x70), // +70 or +78 are both OK AddressListValueType.Float)); } } while (tmpValue1 > 0 && tmpValue2 > 0); // Coordinate tmpValue1 = mem.ReadInt32((IntPtr) unchecked (_newChildrenArgs.ThisUnitAddress + 0x164 + 8)); tmpAddress1 = War3Common.ReadGameValue1( mem, _gameContext, _newChildrenArgs, tmpValue1); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "坐标 - X", tmpAddress1, AddressListValueType.Float)); CreateAddress(new NewAddressListEventArgs(_nodeIndex, "坐标 - Y", unchecked (tmpAddress1 + 4), AddressListValueType.Float)); } }