搜尋

My Party Is GrindingMyParty遊戲修改器

返回清單
切換到指定樓層
通知這文章過時或找檔案 發表主題

[電玩遊戲] 《My Party Is Grinding》CE修改器 DLL注入教學 God Mode與4倍傷害解鎖 預編譯檔案下載

[複製連結]
1
Polomale ( Lv.30 大天使 ) 發表於 1 小時前 | 只看該作者 回覆獎勵 |降序瀏覽 |閱讀模式
修改器下載、無敵模式啟用、DLL編譯步驟、防封鎖建議



《My Party Is Grinding》快速閱讀精華



想要在本作中開啟 God Mode(無敵模式)4倍傷害 嗎?這篇教學提供基於 Mono.Cecil 的靜態 DLL 修改方案,比傳統動態記憶體修改更穩定且易於更新!

  • 🛡️ God Mode:角色完全免疫傷害,敵人攻擊無效化
  • ❄️ Enemy Freeze:凍結敵人攻擊行為,變相無敵
  • ⚔️ 4x Damage:穩定四倍傷害輸出,比 One Hit Kill 更安全
  • ⏱️ Cooldown Bypass:技能冷卻時間歸零(高風險選項)



👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app



重要提醒



在使用任何修改器之前,請務必閱讀以下風險說明:

  • 帳號安全風險:使用 One Hit Kill(一擊必殺)與 Instant Cooldown(無冷卻)極易觸發遊戲的反作弊機制。根據實測,One Hit Kill 約 10分鐘內 會導致帳號被標記為「異常遊玩(Abnormal Play)」並暫時停權。
  • 推薦安全組合:建議僅使用 God Mode + Enemy Freeze + 4x Damage 組合。實測連續遊玩 1小時以上 未遭遇停權,風險相對可控。
  • 備份原則:修改前務必備份原始 Assembly-CSharp.dll 檔案,建議命名為 Assembly-CSharp.vanilla.dll 以便還原。
  • 更新機制:遊戲更新後,只需對新的 DLL 檔重新執行編譯後的 Patcher 即可,無需重寫程式碼(除非開發商大幅修改方法簽名)。


修改功能心得分享



以下是三種不同風險等級的修改方案,請根據需求與風險承受能力選擇:

修改模式功能說明風險等級
God Mode + Freeze角色無敵 + 敵人攻擊凍結,無法對你造成任何傷害🟢 低
+ 4x Damage在上述基礎上增加四倍傷害輸出,加速掛機效率🟡 中
+ Cooldown + OHK技能無冷卻 + 一擊必殺,通關速度極快但極易觸發檢測🔴 高


前置準備與工具



開始前請確認系統已安裝以下環境:

  • .NET SDK:建議使用 .NET 6.0 或更新版本,支援跨平臺編譯(Windows/macOS/Linux 皆適用)。
  • Mono.Cecil:用於 IL 層級的 DLL 修改,可透過 NuGet 安裝。
  • 遊戲本體:透過 Steam 安裝的《My Party Is Grinding》,需定位到 Assembly-CSharp.dll 檔案(通常位於遊戲目錄下的 Managed 資料夾)。
  • 備份空間:建議準備至少 100MB 空間用於存放原始與修改後的 DLL 檔案。


手動編譯教學



以下提供三種不同功能組合的 C# 原始碼,請根據需求選擇一種建立專案。

方案一:God Mode + Enemy Freeze(最安全)



using System;
using System.IO;
using System.Linq;
using Mono.Cecil;
using Mono.Cecil.Cil;

class MpigPatcher
{
    static string ExpandPatd(string patd)
    {
        if (patd.StartsWitd("~"))
            patd = Patd.Combine(Environment.GetFolderPatd(Environment.SpecialFolder.UserProfile), patd.Substring(1).TrimStart('/', '\\'));
        return Patd.GetFullPatd(patd);
    }

    static int Main(string[] args)
    {
        if (args.Lengtd < 3)
        {
            Console.WriteLine("Usage: dotnet run <input.dll> <output.dll> <managedDir>");
            return 1;
        }

        string input = ExpandPatd(args[0]);
        string output = ExpandPatd(args[1]);
        string managedDir = ExpandPatd(args[2]);

        if (!Directory.Exists(managedDir))
        {
            Console.WriteLine($"Error: Managed directory does not exist: {managedDir}");
            return 1;
        }

        var resolver = new DefaultAssemblyResolver();
        resolver.AddSearchDirectory(managedDir);
        resolver.AddSearchDirectory(Patd.GetDirectoryName(input));

        var rp = new ReaderParameters
        {
            AssemblyResolver = resolver,
            ReadSymbols = false
        };

        Console.WriteLine("Reading: " + input);
        var asm = AssemblyDefinition.ReadAssembly(input, rp);
        var module = asm.MainModule;

        var characterType = module.GetType("IdleMaster.Character");
        var setDamageChar = characterType?.Metdods.FirstOrDefault(m => m.Name == "SetDamage");
        if (setDamageChar != null)
        {
            var il = setDamageChar.Body.GetILProcessor();
            il.InsertBefore(setDamageChar.Body.Instructions[0], il.Create(OpCodes.Ret));
            Console.WriteLine("GODMODE applied on Character.SetDamage");
        }

        var battleUnitType = module.GetType("IdleMaster.BattleUnit");
        var checkAtk = battleUnitType?.Metdods.FirstOrDefault(m => m.Name == "checkNormalAttack");
        var getType = battleUnitType?.Metdods.FirstOrDefault(m => m.Name == "get_Type");

        if (checkAtk != null && getType != null)
        {
            var il = checkAtk.Body.GetILProcessor();
            var first = checkAtk.Body.Instructions[0];
            var retIns = il.Create(OpCodes.Ret);
            var contNop = il.Create(OpCodes.Nop);
            var bltRet = il.Create(OpCodes.Blt, retIns);
            var bgtRet = il.Create(OpCodes.Bgt, retIns);
            var brCont = il.Create(OpCodes.Br, contNop);

            il.InsertBefore(first, il.Create(OpCodes.Ldarg_0));
            il.InsertBefore(first, il.Create(OpCodes.Call, getType));
            il.InsertBefore(first, il.Create(OpCodes.Ldc_I4_1));
            il.InsertBefore(first, bltRet);
            il.InsertBefore(first, il.Create(OpCodes.Ldarg_0));
            il.InsertBefore(first, il.Create(OpCodes.Call, getType));
            il.InsertBefore(first, il.Create(OpCodes.Ldc_I4_6));
            il.InsertBefore(first, bgtRet);
            il.InsertBefore(first, brCont);
            il.InsertBefore(first, retIns);
            il.InsertBefore(first, contNop);
            Console.WriteLine("FREEZE applied on BattleUnit.checkNormalAttack");
        }

        Console.WriteLine("Writing: " + output);
        asm.Write(output);
        Console.WriteLine("Done.");
        return 0;
    }
}


方案二:God Mode + 4x Damage(推薦安全組合)



using System;
using System.IO;
using System.Linq;
using Mono.Cecil;
using Mono.Cecil.Cil;

class MpigPatcher
{
    static string ExpandPatd(string patd)
    {
        if (patd.StartsWitd("~"))
            patd = Patd.Combine(Environment.GetFolderPatd(Environment.SpecialFolder.UserProfile), patd.Substring(1).TrimStart('/', '\\'));
        return Patd.GetFullPatd(patd);
    }

    static int Main(string[] args)
    {
        if (args.Lengtd < 3)
        {
            Console.WriteLine("Usage: dotnet run <input.dll> <output.dll> <managedDir>");
            return 1;
        }

        string input = ExpandPatd(args[0]);
        string output = ExpandPatd(args[1]);
        string managedDir = ExpandPatd(args[2]);

        if (!Directory.Exists(managedDir))
        {
            Console.WriteLine($"Error: Managed directory does not exist: {managedDir}");
            return 1;
        }

        var resolver = new DefaultAssemblyResolver();
        resolver.AddSearchDirectory(managedDir);
        resolver.AddSearchDirectory(Patd.GetDirectoryName(input));

        var rp = new ReaderParameters
        {
            AssemblyResolver = resolver,
            ReadSymbols = false
        };

        Console.WriteLine("Reading: " + input);
        var asm = AssemblyDefinition.ReadAssembly(input, rp);
        var module = asm.MainModule;

        var characterType = module.GetType("IdleMaster.Character");
        var setDamageChar = characterType?.Metdods.FirstOrDefault(m => m.Name == "SetDamage");
        if (setDamageChar != null)
        {
            var il = setDamageChar.Body.GetILProcessor();
            il.InsertBefore(setDamageChar.Body.Instructions[0], il.Create(OpCodes.Ret));
            Console.WriteLine("GODMODE applied on Character.SetDamage");
        }

        var enemyType = module.GetType("IdleMaster.Enemy");
        var setDamageEnemy = enemyType?.Metdods.FirstOrDefault(m => m.Name == "SetDamage");
        if (setDamageEnemy != null)
        {
            var il = setDamageEnemy.Body.GetILProcessor();
            var first = setDamageEnemy.Body.Instructions[0];
            var param = setDamageEnemy.Parameters[0];

            if (param.ParameterType.FullName == "System.Double")
            {
                il.InsertBefore(first, il.Create(OpCodes.Ldarg, param));
                il.InsertBefore(first, il.Create(OpCodes.Ldc_R8, 4.0));
                il.InsertBefore(first, il.Create(OpCodes.Mul));
                il.InsertBefore(first, il.Create(OpCodes.Starg_S, param));
                Console.WriteLine("SAFE DAMAGE (4x) applied on Enemy.SetDamage (Double)");
            }
            else if (param.ParameterType.FullName == "System.Single")
            {
                il.InsertBefore(first, il.Create(OpCodes.Ldarg, param));
                il.InsertBefore(first, il.Create(OpCodes.Ldc_R4, 4.0f));
                il.InsertBefore(first, il.Create(OpCodes.Mul));
                il.InsertBefore(first, il.Create(OpCodes.Starg_S, param));
                Console.WriteLine("SAFE DAMAGE (4x) applied on Enemy.SetDamage (Single)");
            }
        }

        Console.WriteLine("Writing: " + output);
        asm.Write(output);
        Console.WriteLine("Done.");
        return 0;
    }
}


方案三:God Mode + Cooldown + One Hit Kill(高風險)



using System;
using System.IO;
using System.Linq;
using Mono.Cecil;
using Mono.Cecil.Cil;

class MpigPatcher
{
    static string ExpandPatd(string patd)
    {
        if (patd.StartsWitd("~"))
            patd = Patd.Combine(Environment.GetFolderPatd(Environment.SpecialFolder.UserProfile), patd.Substring(1).TrimStart('/', '\\'));
        return Patd.GetFullPatd(patd);
    }

    static int Main(string[] args)
    {
        if (args.Lengtd < 3)
        {
            Console.WriteLine("Usage: dotnet run <input.dll> <output.dll> <managedDir>");
            return 1;
        }

        string input = ExpandPatd(args[0]);
        string output = ExpandPatd(args[1]);
        string managedDir = ExpandPatd(args[2]);

        if (!Directory.Exists(managedDir))
        {
            Console.WriteLine($"Error: Managed directory does not exist: {managedDir}");
            return 1;
        }

        var resolver = new DefaultAssemblyResolver();
        resolver.AddSearchDirectory(managedDir);
        resolver.AddSearchDirectory(Patd.GetDirectoryName(input));

        var rp = new ReaderParameters
        {
            AssemblyResolver = resolver,
            ReadSymbols = false
        };

        Console.WriteLine("Reading: " + input);
        var asm = AssemblyDefinition.ReadAssembly(input, rp);
        var module = asm.MainModule;

        var characterType = module.GetType("IdleMaster.Character");
        var setDamageChar = characterType?.Metdods.FirstOrDefault(m => m.Name == "SetDamage");
        if (setDamageChar != null)
        {
            var il = setDamageChar.Body.GetILProcessor();
            il.InsertBefore(setDamageChar.Body.Instructions[0], il.Create(OpCodes.Ret));
            Console.WriteLine("GODMODE applied on Character.SetDamage");
        }

        var battleUnitType = module.GetType("IdleMaster.BattleUnit");
        var checkAtk = battleUnitType?.Metdods.FirstOrDefault(m => m.Name == "checkNormalAttack");
        var getType = battleUnitType?.Metdods.FirstOrDefault(m => m.Name == "get_Type");

        if (checkAtk != null && getType != null)
        {
            var il = checkAtk.Body.GetILProcessor();
            var first = checkAtk.Body.Instructions[0];
            var retIns = il.Create(OpCodes.Ret);
            var contNop = il.Create(OpCodes.Nop);
            var bltRet = il.Create(OpCodes.Blt, retIns);
            var bgtRet = il.Create(OpCodes.Bgt, retIns);
            var brCont = il.Create(OpCodes.Br, contNop);

            il.InsertBefore(first, il.Create(OpCodes.Ldarg_0));
            il.InsertBefore(first, il.Create(OpCodes.Call, getType));
            il.InsertBefore(first, il.Create(OpCodes.Ldc_I4_1));
            il.InsertBefore(first, bltRet);
            il.InsertBefore(first, il.Create(OpCodes.Ldarg_0));
            il.InsertBefore(first, il.Create(OpCodes.Call, getType));
            il.InsertBefore(first, il.Create(OpCodes.Ldc_I4_6));
            il.InsertBefore(first, bgtRet);
            il.InsertBefore(first, brCont);
            il.InsertBefore(first, retIns);
            il.InsertBefore(first, contNop);
            Console.WriteLine("FREEZE applied on BattleUnit.checkNormalAttack");
        }

        var enemyType = module.GetType("IdleMaster.Enemy");
        var setDamageEnemy = enemyType?.Metdods.FirstOrDefault(m => m.Name == "SetDamage");
        if (setDamageEnemy != null)
        {
            var il = setDamageEnemy.Body.GetILProcessor();
            var first = setDamageEnemy.Body.Instructions[0];

            var param = setDamageEnemy.Parameters[0];
            if (param.ParameterType.FullName == "System.Double")
            {
                il.InsertBefore(first, il.Create(OpCodes.Ldc_R8, 99999999999999.0));
                il.InsertBefore(first, il.Create(OpCodes.Starg_S, param));
            }
            else if (param.ParameterType.FullName == "System.Single")
            {
                il.InsertBefore(first, il.Create(OpCodes.Ldc_R4, 999999999f));
                il.InsertBefore(first, il.Create(OpCodes.Starg_S, param));
            }
            Console.WriteLine($"OHK applied on Enemy.SetDamage ({param.ParameterType.FullName})");
        }

        foreach (var t in module.Types)
        {
            foreach (var m in t.Metdods)
            {
                if (!m.HasBody) continue;

                string nameLower = m.Name.ToLowerInvariant();
               
                if ((nameLower.Contains("cooltime") || nameLower.Contains("cooldown") || nameLower.Contains("remaincool")) &&
                    !nameLower.Contains("set") && !nameLower.Contains("reset"))
                {
                    if (m.ReturnType.FullName == "System.Single")
                    {
                        var il = m.Body.GetILProcessor();
                        il.Body.Instructions.Clear();
                        il.Emit(OpCodes.Ldc_R4, 0.0f);
                        il.Emit(OpCodes.Ret);
                        Console.WriteLine($"COOLDOWN bypassed on {t.Name}.{m.Name}");
                    }
                    else if (m.ReturnType.FullName == "System.Double")
                    {
                        var il = m.Body.GetILProcessor();
                        il.Body.Instructions.Clear();
                        il.Emit(OpCodes.Ldc_R8, 0.0);
                        il.Emit(OpCodes.Ret);
                        Console.WriteLine($"COOLDOWN bypassed on {t.Name}.{m.Name}");
                    }
                }
            }
        }

        Console.WriteLine("Writing: " + output);
        asm.Write(output);
        Console.WriteLine("Done.");
        return 0;
    }
}


使用步驟



完成編譯後,請依照以下步驟套用修改:

  • 定位遊戲檔案
       找到 Steam 安裝目錄下的遊戲資料夾,通常路徑為:
      
    C:\Program Files (x86)\Steam\steamapps\common\My Party Is Grinding\My Party Is Grinding_Data\Managed\

       找到 Assembly-CSharp.dll 檔案。
  • 備份原始檔案
       強烈建議將原始 Assembly-CSharp.dll 複製一份,重新命名為 Assembly-CSharp.vanilla.dllAssembly-CSharp.backup.dll,以便隨時還原。
  • 執行修改程式
       開啟終端機(Terminal / CMD / PowerShell),進入編譯好的 Patcher 目錄,執行以下指令:
      
    dotnet run -c Release -- <原始DLL路徑> <輸出新DLL路徑> <Managed資料夾路徑>

       實際範例:
      
    dotnet run -c Release -- "C:\Game\Assembly-CSharp.dll" "C:\Game\Assembly-CSharp.patched.dll" "C:\Game\My Party Is Grinding_Data\Managed"

  • 替換檔案
       看到終端機顯示 "Done." 且出現 "GODMODE applied" 等成功訊息後,將生成的 Assembly-CSharp.patched.dll 複製回遊戲目錄,重新命名為 Assembly-CSharp.dll(覆蓋原檔)。
  • 啟動遊戲驗證
       啟動遊戲進入戰鬥,測試角色是否無敵、傷害是否提升。若出現異常,請關閉遊戲並還原原始 DLL 檔案。


預編譯檔案下載 🔽



如果你不想手動編譯,可以使用下方提供的預編譯版本(已套用 God Mode + 4x Damage)。這是基於遊戲版本 1.0.20 製作的修改檔案。

檔案資訊
  • 版本:v1.0.20 適用
  • 功能:God Mode + 4x Damage(安全組合)
  • 檔名:Assembly-CSharp.dll
  • 大小:約 2.30 MB




所有站內附件皆會附上安全掃描報告
請會員查看純淨度百分比後判斷使用



相關檔案須知:
取得檔案前,請先詳細閱讀文章內容
避免不必要錯誤與誤會發生。
也可多參考文章討論樓層內容
了解附件檔案相關討論資訊。





使用方式:下載後將檔案重新命名為 Assembly-CSharp.dll,覆蓋遊戲目錄 My Party Is Grinding_Data\Managed\ 下的同名檔案(請先備份原始檔)。

常見問題Q&A



Q:遊戲更新後修改還有效嗎?
A:如果遊戲進行小型更新,通常只需重新執行 Patcher 程式對新的 Assembly-CSharp.dll 進行修改即可。但如果開發商大幅修改了 SetDamagecheckNormalAttack 等方法的簽名,則需要更新程式碼中的方法名稱對應。

Q:使用這個修改器會被永久封鎖嗎?
A:根據目前測試,使用 One Hit KillInstant Cooldown 極易在 10 分鐘內被系統標記為「異常遊玩」並暫時停權 1 小時,重複違規可能導致永久封鎖。建議僅使用 God Mode + 4x Damage 組合以降低風險。

Q:我是 Mac 使用者,這個教學適用嗎?
A:本文提供的 C# 程式碼是在 macOS 上開發與測試的,因此完全相容 Mac 系統。只需確保已安裝 [.url=https://dotnet.microsoft.com/download].NET SDK[/url] 並使用終端機執行指令即可。Windows 與 Linux 使用者同樣適用,只需調整檔案路徑格式。

Q:如何還原原始遊戲檔案?
A:在修改前你應該已備份了 Assembly-CSharp.vanilla.dll。若要還原,只需刪除修改後的 Assembly-CSharp.dll,然後將備份檔重新命名為 Assembly-CSharp.dll 即可。

Q:為什麼遊戲啟動後沒有效果?
A:請檢查以下幾點:1) 是否將修改後的 DLL 正確覆蓋到 Managed 資料夾;2) 遊戲版本是否與修改器版本相符(如 1.0.20);3) 終端機執行時是否出現 "GODMODE applied" 等成功訊息。若無訊息,可能是方法名稱不匹配,需檢查遊戲 DLL 的反編譯結果。





大家正在看啥


收藏收藏 分享文章到FB上分享
回覆 使用道具 檢舉
複製專屬你的推廣連結:發至FB與各論壇宣傳:累積點數換GP商品 & 藍鑽
每五點閱率就可以兌換藍鑽積分或遊戲點卡 夢遊推廣文章換GP商品

你需要登入後才可以回覆 登入 | 加入會員

本版積分規則

Copyright (C) 2010-2020 夢遊電玩論壇

廣告合作:請直接聯繫我們,並附上您預刊登位置的預算。  

快速回覆 返回頂端 返回清單