mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-04-21 12:04:45 +00:00
add check to stop patches applying to wrong game
previously if you added a patch to a game, but closed the window and opened a different game it would still try to apply the patch, this is now fixed
This commit is contained in:
parent
5377ae9c37
commit
50a359d0eb
5 changed files with 24 additions and 14 deletions
|
@ -10,6 +10,7 @@ namespace MemoryPatcher {
|
|||
|
||||
uintptr_t g_eboot_address;
|
||||
u64 g_eboot_image_size;
|
||||
std::string g_game_serial;
|
||||
|
||||
std::vector<patchInfo> pending_patches;
|
||||
|
||||
|
@ -19,11 +20,12 @@ void AddPatchToQueue(patchInfo patchToAdd) {
|
|||
|
||||
void ApplyPendingPatches() {
|
||||
|
||||
//TODO: need to verify that the patch is actually for the game we open,
|
||||
//if we enable patches but open a different game they will still attempt to load
|
||||
|
||||
for (size_t i = 0; i < pending_patches.size(); ++i) {
|
||||
patchInfo currentPatch = pending_patches[i];
|
||||
|
||||
if (currentPatch.gameSerial != g_game_serial)
|
||||
continue;
|
||||
|
||||
PatchMemory(currentPatch.modNameStr, currentPatch.offsetStr, currentPatch.valueStr,
|
||||
currentPatch.isOffset, currentPatch.littleEndian, currentPatch.patchMask,
|
||||
currentPatch.maskOffset);
|
||||
|
@ -50,7 +52,7 @@ void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valu
|
|||
cheatAddress = reinterpret_cast<void*>(PatternScan(offsetStr) + maskOffset);
|
||||
}
|
||||
|
||||
//TODO: implement mask_jump32
|
||||
// TODO: implement mask_jump32
|
||||
|
||||
if (cheatAddress == nullptr) {
|
||||
LOG_ERROR(Loader, "Failed to get address for patch {}", modNameStr);
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace MemoryPatcher {
|
|||
|
||||
extern uintptr_t g_eboot_address;
|
||||
extern u64 g_eboot_image_size;
|
||||
extern std::string g_game_serial;
|
||||
|
||||
enum PatchMask : uint8_t {
|
||||
None,
|
||||
|
@ -18,6 +19,7 @@ enum PatchMask : uint8_t {
|
|||
};
|
||||
|
||||
struct patchInfo {
|
||||
std::string gameSerial;
|
||||
std::string modNameStr;
|
||||
std::string offsetStr;
|
||||
std::string valueStr;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "common/scm_rev.h"
|
||||
#include "common/singleton.h"
|
||||
#include "common/version.h"
|
||||
#include "common/memory_patcher.h"
|
||||
#include "core/file_format/playgo_chunk.h"
|
||||
#include "core/file_format/psf.h"
|
||||
#include "core/file_format/splash.h"
|
||||
|
@ -93,6 +94,7 @@ void Emulator::Run(const std::filesystem::path& file) {
|
|||
auto* param_sfo = Common::Singleton<PSF>::Instance();
|
||||
param_sfo->open(sce_sys_folder.string() + "/param.sfo", {});
|
||||
id = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9);
|
||||
MemoryPatcher::g_game_serial = id;
|
||||
title = param_sfo->GetString("TITLE");
|
||||
LOG_INFO(Loader, "Game id: {} Title: {}", id, title);
|
||||
u32 fw_version = param_sfo->GetInteger("SYSTEM_VER");
|
||||
|
|
|
@ -748,14 +748,14 @@ void CheatsPatches::loadPatches(const QString& serial) {
|
|||
QXmlStreamAttributes attributes = xmlReader.attributes();
|
||||
QString appVer = attributes.value("AppVer").toString();
|
||||
if (appVer == m_gameVersion) {
|
||||
patchName = attributes.value("Name").toString();
|
||||
patchAuthor = attributes.value("Author").toString();
|
||||
patchNote = attributes.value("Note").toString();
|
||||
patchName = attributes.value("Name").toString();
|
||||
patchAuthor = attributes.value("Author").toString();
|
||||
patchNote = attributes.value("Note").toString();
|
||||
}
|
||||
if (appVer == "mask") {
|
||||
patchName = attributes.value("Name").toString();
|
||||
patchAuthor = attributes.value("Author").toString();
|
||||
patchNote = attributes.value("Note").toString();
|
||||
patchName = attributes.value("Name").toString();
|
||||
patchAuthor = attributes.value("Author").toString();
|
||||
patchNote = attributes.value("Note").toString();
|
||||
}
|
||||
} else if (xmlReader.name() == QStringLiteral("PatchList")) {
|
||||
QJsonArray linesArray;
|
||||
|
@ -778,7 +778,7 @@ void CheatsPatches::loadPatches(const QString& serial) {
|
|||
}
|
||||
|
||||
if (!patchName.isEmpty() && !patchLines.isEmpty()) {
|
||||
addPatchToLayout(patchName, patchAuthor, patchNote, patchLines);
|
||||
addPatchToLayout(patchName, patchAuthor, patchNote, patchLines, serial);
|
||||
patchName.clear();
|
||||
patchAuthor.clear();
|
||||
patchNote.clear();
|
||||
|
@ -791,7 +791,8 @@ void CheatsPatches::loadPatches(const QString& serial) {
|
|||
}
|
||||
|
||||
void CheatsPatches::addPatchToLayout(const QString& name, const QString& author,
|
||||
const QString& note, const QJsonArray& linesArray) {
|
||||
const QString& note, const QJsonArray& linesArray,
|
||||
const QString& serial) {
|
||||
|
||||
QCheckBox* patchCheckBox = new QCheckBox(name);
|
||||
patchesGroupBoxLayout->addWidget(patchCheckBox);
|
||||
|
@ -800,6 +801,7 @@ void CheatsPatches::addPatchToLayout(const QString& name, const QString& author,
|
|||
patchInfo.author = author;
|
||||
patchInfo.note = note;
|
||||
patchInfo.linesArray = linesArray;
|
||||
patchInfo.serial = serial;
|
||||
m_patchInfos[name] = patchInfo;
|
||||
|
||||
// Hook checkbox hover events
|
||||
|
@ -898,7 +900,7 @@ void CheatsPatches::applyPatch(const QString& patchName, bool enabled) {
|
|||
if (type == "mask") {
|
||||
patchMask = MemoryPatcher::PatchMask::Mask;
|
||||
|
||||
//im not sure if this works, there is no games to test the mask offset on yet
|
||||
// im not sure if this works, there is no games to test the mask offset on yet
|
||||
if (!maskOffsetStr.toStdString().empty())
|
||||
maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10);
|
||||
}
|
||||
|
@ -908,6 +910,7 @@ void CheatsPatches::applyPatch(const QString& patchName, bool enabled) {
|
|||
|
||||
if (MemoryPatcher::g_eboot_address == 0) {
|
||||
MemoryPatcher::patchInfo addingPatch;
|
||||
addingPatch.gameSerial = patchInfo.serial.toStdString();
|
||||
addingPatch.modNameStr = patchName.toStdString();
|
||||
addingPatch.offsetStr = address.toStdString();
|
||||
addingPatch.valueStr = patchValue.toStdString();
|
||||
|
|
|
@ -52,7 +52,7 @@ private:
|
|||
|
||||
void addCheatsToLayout(const QJsonArray& modsArray);
|
||||
void addPatchToLayout(const QString& name, const QString& author, const QString& note,
|
||||
const QJsonArray& linesArray);
|
||||
const QJsonArray& linesArray, const QString& serial);
|
||||
|
||||
void createFilesJson();
|
||||
void uncheckAllCheatCheckBoxes();
|
||||
|
@ -85,6 +85,7 @@ private:
|
|||
QString author;
|
||||
QString note;
|
||||
QJsonArray linesArray;
|
||||
QString serial;
|
||||
};
|
||||
|
||||
// Members
|
||||
|
|
Loading…
Add table
Reference in a new issue