大航海时代ol吧 关注:116,224贴子:4,555,024
  • 7回复贴,共1

遍历周围人物算法分析 v12005

只看楼主收藏回复

庆祝回归,发个技术文章~
思路不说了,估计没人看。直接发成品吧,这玩意写脚本还是必须的。用来查找附近NPC ID。
一楼上效果图(战列舰里斯本人就是多!)


IP属地:宁夏1楼2021-08-02 01:34回复
    python的
    import pymem
    PID = 1234 # 你需要自己获取指定航海的PID
    pm = pymem.Pymem()
    pm.open_process_from_id(PID)
    def readaddr(pymem_instance, address: int, data_type: str = None, offset_list: list = None):
    # 如果有偏移地址,则循环读取偏移,得出最终要读的内存地址。没有偏移地址,最终地址=基址+地址
    if offset_list is not None:
    try:
    len(offset_list)
    except TypeError:
    return None
    else:
    if len(offset_list) > 0 and type(offset_list) == list:
    offset_num = 1
    for offset in offset_list:
    address = pymem_instance.read_int(address) + offset
    offset_num += 1
    else:
    return None
    if data_type == "unicode":
    result = ""
    _temp_address = address
    while True:
    _temp = pymem_instance.read_bytes(_temp_address, 2)
    if _temp == b'\x00\x00':
    break
    else:
    try:
    _temp = _temp.decode('utf-16')
    except UnicodeDecodeError:
    _temp = ascii(_temp)
    finally:
    result += _temp
    _temp_address += 2
    elif data_type == "float":
    result = pymem_instance.read_float(address)
    elif data_type == "hex":
    result = hex(pymem_instance.read_int(address)).upper()
    else:
    result = pymem_instance.read_int(address)
    return result
    def enum_liveobj() -> tuple:
    """
    枚举附近的活动对象
    :return: tuple
    枚举出来的附近所有活动对象,包括没名字的、非人类、人类等;
    活动对象数量;
    人类对象数量;
    """
    liveobj_list = []
    found_num = 0
    human_num = 0
    baseaddr = 0x0119E630
    for i in range(readaddr(pm, baseaddr + 4)): # +4是算法内置的循环次数
    nodeaddr = readaddr(pm, readaddr(pm, baseaddr) + i * 4)
    if nodeaddr == 0: # [baseaddr]为0,下一个循环
    continue
    temp_list = []
    while True:
    ID = readaddr(pm, nodeaddr)
    data = readaddr(pm, nodeaddr + 4)
    name = readaddr(pm, nodeaddr + 4, data_type='unicode', offset_list=[0x2c, 0])
    cur_pos_x = readaddr(pm, nodeaddr + 4, data_type='float', offset_list=[0x13c])
    cur_pos_y = readaddr(pm, nodeaddr + 4, data_type='float', offset_list=[0x144])
    cur_altitude = readaddr(pm, nodeaddr + 4, data_type='float', offset_list=[0x140])
    dst_pos_x = readaddr(pm, nodeaddr + 4, data_type='float', offset_list=[0x15c])
    dst_pos_y = readaddr(pm, nodeaddr + 4, data_type='float', offset_list=[0x164])
    dst_altitude = readaddr(pm, nodeaddr + 4, data_type='float', offset_list=[0x160])
    next = readaddr(pm, nodeaddr + 8)
    if len(name) > 0:
    temp_list.append(
    {'ID': ID,
    'name': name,
    '当前坐标X': cur_pos_x,
    '当前坐标Y': cur_pos_y,
    '目的坐标X': dst_pos_x,
    '目的坐标Y': dst_pos_y,
    '当前海拔': cur_altitude,
    '目的海拔': dst_altitude,
    }
    )
    human_num += 1
    found_num += 1
    if next == 0:
    liveobj_list.append({i: temp_list})
    break
    else:
    nodeaddr = readaddr(pm, nodeaddr + 8)
    return liveobj_list, found_num, human_num
    liveobj_list, found_num, human_num = enum_liveobj()
    print(liveobj_list)
    print(f'一共 {found_num} 个活动对象,{human_num} 个人类')


    IP属地:宁夏2楼2021-08-02 01:35
    回复
      问个弱弱的问题,这个是做什么用的?


      IP属地:山东来自Android客户端3楼2021-08-02 08:44
      收起回复
        读内存


        IP属地:广东来自iPhone客户端4楼2021-08-05 23:10
        回复
          请教如何用按键加大漠 后台找npc并且买东西


          IP属地:河北来自iPhone客户端5楼2021-08-11 23:49
          收起回复
            可怜只学过c和vba的我,已经跟不上时代了。


            IP属地:上海6楼2021-08-16 13:29
            回复