首页 > 编程问答 >《埃尔登指环》死亡计数器

《埃尔登指环》死亡计数器

时间:2024-07-24 04:03:39浏览次数:15  
标签:python

我正在尝试制作自己的死亡计数器埃尔登戒指,我已经制作了一个手动计数应用程序,但我想自动化该过程,或者有一个脚本,如下面的站点,它将打开一个窗口,其中我还需要加载(A 最好自动确定保存位置 - 并计算死亡人数);问题是: 制作统计死亡人数的脚本的最佳方法是什么?读取游戏内存?但是我怎样才能知道内存中是哪个进程呢?我怎样才能做得更好,请告诉我。

https://eldenringdeaths.com/

这是我手动计算死亡人数的脚本

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QLineEdit, QSpinBox, QFileDialog
from PyQt5.QtGui import QPixmap
import requests
import os

class DeathCounter(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.death_count = 0
        self.webhook_url = ''

        self.setWindowTitle('Death Counter')

        self.death_label = QLabel(f'Deaths: {self.death_count}')
        self.plus_button = QPushButton('+')
        self.minus_button = QPushButton('-')
        self.webhook_input = QLineEdit()
        self.initial_deaths_input = QSpinBox()
        self.update_button = QPushButton('Обновить клиент')
        self.save_button = QPushButton('Сохранить значение')
        self.load_button = QPushButton('Загрузить значение')

        # Загружаем изображение для верхней части приложения
        self.logo_label = QLabel()
        pixmap = QPixmap('plate.png')
        self.logo_label.setPixmap(pixmap)

        # Создаем горизонтальный макет для кнопок + и -
        button_layout = QHBoxLayout()
        button_layout.addWidget(self.plus_button)
        button_layout.addWidget(self.minus_button)

        layout = QVBoxLayout()
        layout.addWidget(self.logo_label)
        layout.addWidget(self.death_label)
        layout.addLayout(button_layout)
        layout.addWidget(QLabel('Discord Webhook URL:'))
        layout.addWidget(self.webhook_input)
        layout.addWidget(QLabel('Initial deaths:'))
        layout.addWidget(self.initial_deaths_input)
        layout.addWidget(QLabel(''))
        layout.addWidget(self.update_button)
        layout.addWidget(self.save_button)
        layout.addWidget(self.load_button)
        self.setLayout(layout)

        # Устанавливаем стили виджетов для оранжевого цвета и толстых надписей
        self.setStyleSheet("""
            QWidget {
                background-color: #121212;
                color: #FFFFFF;
            }
            QLabel {
                background-color: transparent;
                font-weight: bold;
                color: #FFA500;
            }
            QPushButton {
                background-color: #212121;
                border: 1px solid #FFFFFF;
                color: #FFFFFF;
                font-weight: bold;
                color: #FFA500;
                min-width: 50px;
                min-height: 50px;
            }
            QPushButton:pressed {
                background-color: #393939;
            }
            QLineEdit {
                background-color: #212121;
                border: 1px solid #FFFFFF;
                color: #FFFFFF;
            }
            QSpinBox {
                background-color: #212121;
                border: 1px solid #FFFFFF;
                color: #FFFFFF;
            }
        """)

        self.plus_button.clicked.connect(self.increase_death_count)
        self.minus_button.clicked.connect(self.decrease_death_count)
        self.update_button.clicked.connect(self.start_counter)
        self.save_button.clicked.connect(self.save_death_count)
        self.load_button.clicked.connect(self.load_death_count)

    def increase_death_count(self):
        self.death_count += 1
        self.death_label.setText(f'Deaths: {self.death_count}')

        # Отправляем сообщение через Discord Webhook
        if self.webhook_url:
            message = {
                'content': f'Deaths: {self.death_count}',
                'username': 'Death Counter'
            }
            response = requests.post(self.webhook_url, json=message)

            if response.status_code == 204:
                print('Сообщение успешно отправлено')
            else:
                print('Ошибка при отправке сообщения:', response.status_code)

    def decrease_death_count(self):
        if self.death_count > 0:
            self.death_count -= 1
            self.death_label.setText(f'Deaths: {self.death_count}')


    def start_counter(self):
        self.death_count = self.initial_deaths_input.value()
        self.death_label.setText(f'Deaths: {self.death_count}')
        self.webhook_url = self.webhook_input.text()

    def save_death_count(self):
        # Сохраняем значение смертей и Discord Webhook URL в текстовом файле
        data_file = 'death_count.txt'
        with open(data_file, 'w') as file:
            file.write(f'{self.death_count}\n')
            file.write(f'{self.webhook_url}\n')

    def load_death_count(self):
        # Загружаем значение смертей и Discord Webhook URL из текстового файла
        data_file = 'death_count.txt'
        if os.path.exists(data_file):
            with open(data_file, 'r') as file:
                lines = file.readlines()
                if len(lines) >= 2:
                    self.death_count = int(lines[0].strip())
                    self.webhook_url = lines[1].strip()
                    self.webhook_input.setText(self.webhook_url)
                    self.death_label.setText(f'Deaths: {self.death_count}')

        else:
            self.death_count = 0
            self.webhook_url = ''
            self.webhook_input.setText('')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DeathCounter()
    window.load_death_count()
    window.show()
    sys.exit(app.exec_())



制作自动记录《艾尔登法环》死亡次数脚本的最佳方法是读取游戏内存。以下是如何实现的步骤:

1. 选择编程语言和内存读取库:

  • Python 凭借其易用性和丰富的库支持,是一个不错的选择。你可以使用 ReadProcessMemory pymem 等库来访问游戏内存。
  • C++ 提供对内存管理的更大控制权,适合性能敏感的任务。你可以使用 ReadProcessMemory Windows API 函数或其他类似库。

2. 识别死亡计数器内存地址:

  • 这是最棘手的部分。你需要找到存储游戏死亡次数的内存地址。这可以通过以下几种方式实现:
    • 逆向工程: 使用像 Cheat Engine 这样的工具来分析游戏内存,并在角色死亡前后寻找变化的值。这需要一些逆向工程技能,并且可能很耗时。
    • 在线资源: 搜索专门讨论《艾尔登法环》作弊或模组的论坛和网站。其他人可能已经找到了死亡计数器的内存地址,并分享了他们的发现。
    • 游戏内 HUD 元素分析: 一些游戏会在 HUD 上显示死亡次数。你可以尝试找到负责渲染该 HUD 元素的内存地址,该地址可能与死亡计数器相关联。

3. 编写脚本:

  • 一旦你确定了内存地址,就可以开始编写脚本了。该脚本需要执行以下操作:
    • 获取《艾尔登法环》进程的句柄。
    • 使用内存读取库从目标内存地址读取值。
    • 定期更新死亡计数器(例如,每秒更新一次)。
    • (可选)将死亡次数显示在 GUI 或外部文件中。

示例代码 (Python):

import time
from pymem import Pymem

# 替换为实际的死亡计数器内存地址
DEATH_COUNTER_ADDRESS = 0x00000000  

# 初始化 Pymem
pm = Pymem("ELDENRING.exe")

def get_death_count():
  """从内存中读取死亡次数."""
  try:
    death_count = pm.read_int(DEATH_COUNTER_ADDRESS)
    return death_count
  except Exception as e:
    print(f"读取死亡次数时出错: {e}")
    return None

if __name__ == "__main__":
  while True:
    death_count = get_death_count()
    if death_count is not None:
      print(f"当前死亡次数: {death_count}")
    time.sleep(1)

注意事项:

  • 游戏更新可能会改变内存地址,因此你的脚本可能需要更新。
  • 在某些情况下,读取游戏内存可能会被反作弊系统检测到。使用风险自负。
  • 如果你不熟悉内存管理和逆向工程,这个过程可能会很有挑战性。

其他方法:

  • 图像识别: 你可以使用图像识别库(如 OpenCV)来分析游戏画面,并检测死亡次数是否显示在 HUD 上。这种方法可能不太可靠,因为它依赖于游戏分辨率和 HUD 元素。
  • 网络数据包分析: 一些游戏可能会在客户端和服务器之间发送包含死亡次数的数据包。你可以使用网络数据包分析器(如 Wireshark)来捕获和分析这些数据包。这种方法需要对网络协议有深入了解。

希望这些信息能帮助你构建自己的《艾尔登法环》死亡计数器!

标签:python
From: 78785354

相关文章

  • 如何使用 Python API 获取每个模型的活跃用户列表、最后登录信息
    我想通过PythonAPI获取我的dbt项目的所有模型中的活动或非活动用户列表。这可能吗?我尝试列出模型,但无法获取用户信息,如用户名、项目、以及上次活动或上次登录。不幸的是,dbt本身并不跟踪你所寻找的用户活动数据(最后登录、活跃用户等)。dbt的主要功能是转换数据,而不......
  • Python tkinter 窗口不断关闭,我不知道为什么
    我正在尝试制作一个有趣的小程序,其中每小时左右就会有一只毛茸茸的动物走过屏幕。我有一个主窗口,它启动一个循环,每小时左右播放一次动画/声音,但是在口袋妖怪第一次完成行走后,整个程序就会结束。我认为这可能与我设置tkinter窗口的方式有关,但我无法弄清楚。我认为在这里包含......
  • 用于自动访问 MongoDB Atlas CLI 的 Python 脚本
    我想编写一个Python脚本,以便普通用户可以访问他的数据库并从他的终端执行CRUD操作。我正在查看官方文档,但我有点迷失。有人可以给我指点基本教程来开始吗?当然,以下是如何构建Python脚本来访问MongoDBAtlasCLI的基本教程:先决条件:MongoDBAtlas......
  • Python实现简单学生登陆系统
     代码:importhashlibclassStudent:def__init__(self,username,password):#初始化学生对象,存储用户名和加密后的密码self.username=usernameself.password=hashlib.sha256(password.encode()).hexdigest()defcheck_passwo......
  • python猜数字游戏
    好的,下面是一个简单的小游戏代码示例,使用Python编写。这个游戏是一个猜数字游戏,玩家需要猜一个1到100之间的随机数。importrandomdefguess_number_game():print("欢迎来到猜数字游戏!")print("我已经想好了一个1到100之间的数字,请你猜一猜。")secret_num......
  • 【Python正则表达式】:文本解析与模式匹配
    文章目录1.正则表达式2.re模块3.修饰符3.元字符3-1字符匹配元字符3-2重复次数限定元字符3-3字符集合匹配元字符3-4分组元字符3-5边界匹配元字符3-6字符类别匹配元字符4.技巧4-1贪婪与非贪婪5.案例1.正则表达式正则表达式面向什么样的问题?1、判断一个字......
  • 仅需增加2行代码,Python量化策略速度提升20+倍!
    今天分享一个Python量化策略加速的小技巧,不用修改原有代码,只需在原有代码里新增2行,策略执行速度便可能提高20+倍,正文开始~现如今,无论是入门量化投资,还是做数据分析、机器学习和深度学习,Python成为了首选编程语言,直观的原因就是容易上手和资源丰富,但Python有个根深蒂固的标签,......
  • Python基础-Anaconda,Spyder,数据类型
    1、Python与Anaconda在想使用Python之前需先安装Python,以及PythonIDE和Python的库,而用Anaconda就可以一键安装。Anaconda包含了Python,常用的python库以及IDE,还具有强大的环境和python包的管理能力。PythonIDE(IntegratedDevelopmentEnvironment,集成开发环境)是一个为开发......
  • python实现图像特征提取算法2
    python实现广义Hough变换算法、Hough变换算法1.广义Hough变换算法详解算法步骤Python实现详细解释优缺点2.Hough变换算法详解算法步骤Python实现详细解释优缺点实现广义Hough变换算法(GeneralizedHoughTransform)可以用于检测任意形状的......
  • 使用Python自动备份MC服务器存档至轻量COS
    在存档意外炸档时,备份就显得尤为重要。本文以Minecraft1.18.2为例,教你如何使用轻量搭建一个MC服务器,并定时将存档备份入轻量COS,节省本地空间。前期准备一台安装了Linux原版系统的轻量(因为目前轻量COS仅支持挂载Linux系统镜像,不支持容器或自定义镜像)一个和轻量大区相同的轻......