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