Untitled

 avatar
unknown
python
2 days ago
3.6 kB
19
Indexable
import sys
import pymem
import pymem.process
from PyQt5.QtWidgets import QApplication, QWidget, QSlider, QVBoxLayout, QLabel
from PyQt5.QtCore import Qt, QTimer

class MemorySlider(QWidget):
    def __init__(self):
        super().__init__()

        # GUI Setup
        self.setWindowTitle("SimRail test wejście")
        self.setGeometry(100, 100, 400, 100)

        self.layout = QVBoxLayout()
        self.label = QLabel("Wartość: 0.0")
        self.slider = QSlider(Qt.Horizontal)
        self.slider.setMinimum(-100)
        self.slider.setMaximum(100)
        self.slider.setValue(0)
        self.slider.setTickInterval(10)
        self.slider.setTickPosition(QSlider.TicksBelow)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.slider)
        self.setLayout(self.layout)

        # Init memory access
        try:
            self.pm = pymem.Pymem("SimRail.exe")
            self.game_module = pymem.process.module_from_name(self.pm.process_handle, "GameAssembly.dll")
            self.base_address = self.game_module.lpBaseOfDll
            print(f"[INFO] GameAssembly.dll base address: {hex(self.base_address)}")
        except Exception as e:
            self.label.setText("Błąd: Nie znaleziono SimRail.exe lub GameAssembly.dll")
            print(f"[ERROR] {e}")
            self.slider.setEnabled(False)
            return

        # Connect slider movement
        self.slider.valueChanged.connect(self.update_memory_value)

        # Odczyt aktualnej wartości co 0.5s
        self.timer = QTimer()
        self.timer.timeout.connect(self.read_memory_value)
        self.timer.start(500)

    def get_pointer_address(self):
        try:
            # Początkowy offset (z Cheat Engine: "GameAssembly.dll" + 0x6862C78)
            base_ptr_offset = 0x6862C78
            pointer_base = self.base_address + base_ptr_offset
            address = self.pm.read_ulonglong(pointer_base)
            print(f"[DEBUG] Base ptr deref -> {hex(address)}")

            # Offsety zgodnie z kolejnością
            offsets = [0xB8, 0x0, 0x60, 0x160, 0x28, 0x60, 0x20]

            for i, offset in enumerate(offsets[:-1]):
                address = self.pm.read_ulonglong(address + offset)
                print(f"[DEBUG] Level {i+1} +{hex(offset)} => {hex(address)}")

            final_address = address + offsets[-1]
            print(f"[DEBUG] Final address: {hex(final_address)}")
            return final_address

        except Exception as e:
            print(f"[ERROR] Błąd w pointer chain: {e}")
            raise

    def update_memory_value(self):
        """Gdy zmienia się suwak — nadpisujemy wartość w pamięci"""
        try:
            val = self.slider.value() / 100.0
            address = self.get_pointer_address()
            self.pm.write_float(address, val)
            self.label.setText(f"Wartość: {val:.2f}")
        except Exception as e:
            self.label.setText("Błąd zapisu")
            print(f"[ERROR] Zapis: {e}")

    def read_memory_value(self):
        """Co 0.5s odczytuje wartość z pamięci"""
        try:
            address = self.get_pointer_address()
            val = self.pm.read_float(address)
            self.label.setText(f"Wartość: {val:.2f}")
        except Exception as e:
            self.label.setText("Błąd odczytu")
            print(f"[ERROR] Odczyt: {e}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MemorySlider()
    window.show()
    sys.exit(app.exec_())
Editor is loading...
Leave a Comment