搜尋

燕雲十六聲遊戲修改器

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

[電玩遊戲] 《燕雲十六聲》Lua腳本修改器 v1.4 【程式碼解說】免費下載 完整源碼注入、DLL編譯教學、熱鍵自訂指南

[複製連結]
1
o122334234 ( Lv.70 熾天使 ) 發表於 前天 00:11 | 只看該作者 |只看大圖 回覆獎勵 |降序瀏覽 |閱讀模式


《燕雲十六聲》Lua腳本修改器 v1.4 快速閱讀精華


想在《燕雲十六聲》的世界裡玩得更自由嗎?這份Lua腳本修改器懶人包,讓你輕鬆掌握各種強大功能,體驗前所未有的江湖冒險!

  • 🚀 核心功能一覽:
    • ✅ 上帝模式 (Godmode)
    • ✅ 一擊必殺 (One-Hit Kill)
    • ✅ 無限耐力 (Infinite Stamina)
    • ✅ 自動拾取 (Auto Loot)
    • ✅ 瞬殺敵人 (Kill NPC)
    • 遊戲加速
    • ✅ 自訂BUFF增益
    • ✅ 隨機傳送
  • 🔑 快速上手四步驟:
    • 下載並準備好所有檔案(DLL原始碼、Lua腳本、注入器)。
    • 使用 Visual Studio 將提供的完整C++原始碼自行編譯成 .dll 檔案
    • 設定好注入器(安全模式 + 手動映射)。
    • 直接啟動遊戲主程式,進入遊戲後再進行注入,並按下 F3 啟動腳本。
  • ⚠️ 風險聲明: 使用任何第三方工具都存在帳號被封鎖的風險,這不是危言聳聽。請務必在單人模式下低調使用,並自行承擔一切後果。
  • 💡 疑難排解: 如果菜單沒出現,請嘗試將遊戲設定為 DX11 + 全螢幕模式,並確保你是在能看到角色的遊戲場景中,而非主選單。




各位在《燕雲十六聲》江湖中闖蕩的俠客們,安好!你是否曾夢想過能像武俠小說主角一樣,擁有刀槍不入的神功護體,或是輕輕一揮手便能將敵人擊潰?又或者,只是單純厭倦了重複撿拾戰利品的繁瑣過程?

這篇教學將為你揭開 Lua 腳本修改器的神秘面紗,帶領大家一步步了解如何使用這個強大的工具。從上帝模式到自動拾取,從遊戲加速到自訂增益效果,讓你用全新的視角,更自由地探索這個風起雲湧的武林世界!

Kv5ees0.jpg


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




風險聲明:使用前必讀的真心話


【警告】使用任何非官方工具,皆有帳號被封鎖的風險!

在我們開始之前,有些重要的話必須說在最前面。這份教學是基於技術研究與分享,但修改遊戲本身就是一種「走鋼索」的行為。


  • 帳號安全:遊戲開發商有權利對任何使用外掛、腳本或修改器的玩家帳號進行處罰,最嚴重的情況就是永久封鎖。雖然本教學中的方法採用了一些反偵測手段,但沒有任何方法是100%絕對安全的

  • 遊戲體驗:過度使用修改器可能會嚴重破壞遊戲的挑戰性與樂趣。我們建議你只在卡關、測試或純粹想體驗不同玩法時使用。

  • 使用範圍:請務必在單人遊戲模式下低調使用。在任何多人連線的環境中使用,不僅會影響他人,也大幅提高了被抓包的風險。

  • 責任歸屬:您必須理解並同意,因使用本教學內容而導致的任何後果(包括但不限於帳號封鎖、遊戲資料損毀),都將由您個人全權負責

如果你已經閱讀並理解以上所有風險,願意為自己的行為負責,那麼,就讓我們繼續這趟刺激的旅程吧!


檔案下載點 🔽


工欲善其事,必先利其器。開始之前,請先下載我們為你準備好的整合包,裡面包含了所有你會用到的工具。


以下廣告滑動後還有帖子內容





安裝與注入完整教學


別被「編譯」、「注入」這些詞嚇到了!整個過程其實不複雜,就像是照著食譜做菜一樣。跟著下面的步驟,保證你能順利上手。


步驟一:編譯你的專屬 DLL 檔案 (安全第一)


為了提高安全性,也為了確保腳本能完美地在你的電腦上運行,我們需要自己動手,將 C++ 原始碼編譯成遊戲能讀取的 .dll 檔案。

【小知識】 什麼是 DLL?你可以把它想像成一把「特製的鑰匙」。每台電腦的環境都有些微不同,自己編譯就等於是為你的電腦量身打造這把最合適的鑰匙,而不是用可能不合身的萬用鑰匙。

  • 首先,你需要安裝程式開發工具 Visual Studio Community (免費版即可)。安裝時,務必在「工作負載」分頁中勾選 「使用 C++ 的桌面開發」 選項。
  • 解壓縮你下載的整合包,找到 C++ 原始碼檔案 (通常是結尾為 .cpp 或 .h 的檔案)。
  • 打開 Visual Studio,在起始畫面選擇「建立新專案」。
  • 在專案類型中,搜尋並選擇 「動態連結程式庫 (DLL)」 模板。
  • 將整合包中提供的 C++ 原始碼,完整地複製並貼到 Visual Studio 中對應的檔案裡。(完整原始碼請參考文末
  • 點擊上方主選單的「建置」->「建置解決方案」。如果一切順利,Visual Studio 就會開始編譯。
  • 編譯成功後,你可以在專案資料夾的 `x64\Debug` 或 `x64\Release` 子目錄中,找到一個熱騰騰剛出爐的 .dll 檔案。這就是你的專屬鑰匙!

  • 【關鍵提醒】:請不要移動這個編譯好的 .dll 檔案!讓它靜靜地待在原本的專案資料夾裡。直接從那個位置來選取注入,可以避免很多不必要的麻煩,成功率也最高。



步驟二:準備 Lua 腳本與設定檔 (打好地基)


如果說 DLL 是引擎,那 Lua 腳本和設定檔就是控制引擎的儀表板和說明書。我們需要把它們放在一個固定的地方,讓 DLL 能夠找到。

  • 打開你的 C 槽 根目錄。
  • 在 C 槽建立一個新資料夾,並將其命名為 temp
  • 進入 `C:\temp` 資料夾,在裡面再建立一個名為 Where Winds Meet 的新資料夾。
  • 進入 `C:\temp\Where Winds Meet`,再建立最後一個名為 Scripts 的新資料夾。

  • 【路徑確認】 你的最終路徑必須是:C:\temp\Where Winds Meet\Scripts\ (一個字都不能錯!)
  • 將整合包裡所有的 `.lua` 和 `.txt` 檔案 (例如:`Test.lua`, `buff_config.txt`),全部複製到這個 `Scripts` 資料夾底下。

【小知識】 為什麼路徑要這麼固定?因為這個路徑已經被寫死在我們剛剛編譯的 DLL 程式碼裡了。DLL 啟動後,會像個聽話的機器人,直直地往這個地址去找它的指令稿,如果放錯地方,它就找不到路囉!


步驟三:設定注入器 (精準打擊)


注入器是個關鍵的「投送工具」,它負責神不知鬼不覺地將我們的 DLL (鑰匙) 送進正在運行的遊戲中。

  • 打開整合包裡的注入器 Extreme Injector.exe。如果你的防毒軟體跳出警告,這是正常的,請暫時允許它運行或將其加入信任清單。
  • 在「Process Name」欄位點擊「Select」,在跳出的視窗中找到並選擇遊戲的主程式 wwm.exe
  • 點擊「Add DLL」按鈕,找到你在步驟一中編譯好的那個 .dll 檔案並選取它。
  • 點擊右下角的「Settings」按鈕,進行最重要的兩項設定:
    • ✅ 勾選 Secure Mode (安全模式),這是最重要的反偵測機制之一!
    • ✅ 在「Injection Method」(注入方式) 的下拉選單中,選擇 Manual Map (手動映射)。
  • 設定完成後,再次確認介面是否如下圖所示,然後關閉設定視窗。

【小知識】 什麼是「手動映射」?想像一下,一般的注入方式就像是直接踹開遊戲的大門說「我來了!」,很容易被警衛(反作弊系統)發現。而「手動映射」則更像是喬裝成遊戲的一部分,悄悄地溜進去,大大降低了被發現的風險。




步驟四:啟動遊戲與注入腳本 (見證奇蹟)


萬事俱備,只差臨門一腳!

  • 【啟動方式注意】:如果你是透過官方啟動器來更新遊戲,請在更新完成後,直接到遊戲的安裝目錄裡執行 wwm.exe。絕對不要透過官方啟動器來啟動遊戲!路徑通常在:`WWM\Engine\Binaries\Win64r\wwm.exe`。
  • 正常進入遊戲,直到你載入存檔,能看到自己的角色,並且可以在場景中自由活動為止。
  • 用 `Alt+Tab` 切換回桌面,回到 Extreme Injector 的介面。
  • 深呼吸,然後點下大大的「Inject」按鈕。
  • 如果一切順利,你不會看到任何成功的提示。這很正常!現在,切換回遊戲。
  • 在遊戲中,按下鍵盤上的 F3 鍵。如果你的螢幕上出現了修改器菜單,恭喜你,大功告成!



修改器功能與預設熱鍵


成功注入後,你就可以透過鍵盤右側的數字區 (Numpad) 來稱霸武林了!

菜單控制
  • Numpad -:顯示 / 隱藏菜單
  • Numpad 8 / 2:向上 / 向下選擇
  • Numpad 4 / 6:向左 / 向右切換選項值
  • Numpad 5:確認 / 啟用當前選中的功能


功能快捷鍵 (需按住 Alt)
  • Alt + Numpad 1:循環切換遊戲速度
  • Alt + Numpad 2:切換自動拾取模式 (關閉 -> 單次 -> 循環)
  • Alt + Numpad 3:切換自動BUFF模式 (關閉 -> 單次 -> 循環)
  • Alt + Numpad 5:瞬殺附近所有敵人
  • Alt + Numpad 7:恢復生命與耐力 (關閉 -> 單次 -> 循環)
  • Alt + Numpad 8:手動施放一次性BUFF
  • Alt + Numpad 9:手動拾取一次


系統熱鍵
  • F3:首次載入菜單邏輯 (進入遊戲後務必先按一次!)
  • END:從遊戲中卸載腳本 (關閉修改器)



進階教學:自訂你的專屬熱鍵


覺得預設的按鍵不順手?沒問題,我們可以動手把它改成你習慣的配置。這個過程需要修改 C++ 原始碼後,重新編譯一次 DLL。


  • 第一步:找到按鍵定義
    用 Visual Studio 打開你的 C++ 原始碼檔案,找到 `MainThread` 函式中 `while (true)` 迴圈的部分。你會看到類似 `GetAsyncKeyState(VK_F3)` 或 `GetAsyncKeyState(VK_NUMPAD8)` 的程式碼。這些 `VK_` 開頭的常數就是按鍵的定義。

  • 第二步:挑選新按鍵的代碼
    你可以上網搜尋「Windows Virtual-Key Codes」,找到所有鍵盤按鍵對應的虛擬鍵碼。例如:
    • `0x01`: Left_Button (滑鼠左鍵)
    • `0x08`: Backspace
    • `0x0D`: Enter
    • `0x10`: Shift
    • `0x11`: Ctrl
    • `0x1B`: Esc
    • `0x21`: Page_Up
    • `0x22`: Page_Down
    • `0x23`: End
    • `0x24`: Home
    • `0x2D`: Insert
    • `0x2E`: Delete
    • `0x70` - `0x7B`: F1 - F12
    • `0x41` - `0x5A`: A - Z

  • 第三步:修改程式碼並重新編譯
    假設你想把「顯示/隱藏菜單」的功能從 `Numpad -` (VK_SUBTRACT) 改成 `Delete` 鍵 (0x2E)。你只需要在原始碼中找到這一行:
    if (GetAsyncKeyState(VK_SUBTRACT) & 1) SendCommand(GetCmd_MenuVisible());
    把它改成:
    if (GetAsyncKeyState(0x2E) & 1) SendCommand(GetCmd_MenuVisible());
    修改完成後,儲存檔案,然後回到 Visual Studio 重新「建置解決方案」,產生一個新的 .dll。用這個新的 DLL 注入遊戲,你的自訂熱鍵就生效了!

  • 第四步:調整 `Alt` 組合鍵 (可選)
    在原始碼中,你會看到一個 `if (GetAsyncKeyState(VK_MENU) & 0x8000)` 的判斷式,這句話的意思就是「如果玩家按住了 Alt 鍵」。
    • 所有寫在這個大括號 `{}` 裡面的功能,都必須按住 `Alt` 才能觸發。
    • 所有寫在大括號 `{}` 外面的功能,則可以直接按鍵觸發。

    你可以透過移動程式碼的位置,來決定哪些功能需要組合鍵,哪些不需要。改完同樣需要重新編譯 DLL。



核心源碼與腳本參考


為了讓進階玩家能夠深入了解其運作原理或進行客製化修改,我們在此附上完整的核心程式碼。


C++ DLL 完整原始碼


這是你需要使用 Visual Studio 編譯成 .dll 檔案的所有內容。它包含了注入邏輯、熱鍵監聽以及與 Lua 腳本溝通的核心功能。
#include <Windows.h>
#include <vector>
#include <string>
#include <IOStream>
#include <thread>
#include <MinHook.h>
#include <mutex>

// =================================================================================
// String (Enhancing Security by Hiding Strings in DLLs)"
// =================================================================================

template <int X> struct XorStr {
    char data[X];
    constexpr XorStr(const char* input) : data{} {
        for (int i = 0; i < X; ++i) data = input ^ (0x55 + i % 5);
    }
};

#define _XOR(s) ([]() -> std::string { \
    constexpr XorStr<sizeof(s)/sizeof(char)> x(s); \
    std::string r; \
    r.resize(sizeof(x.data)); \
    for(int i=0; i<sizeof(x.data); ++i) r = x.data ^ (0x55 + i % 5); \
    if (!r.empty() && r.back() == '\0') r.pop_back(); \
    return r; \
}())

// =================================================================================
// LUA PAYLOAD
// =================================================================================


const char* LUA_LOADER_SCRIPT = R"LUA(
    local path = [[C:\temp\Where Winds Meet\Scripts\Test.lua]]
    local f, err = loadfile(path)
    if f then
        pcall(f)
    end
)LUA";

// =================================================================================
// Commands and Instructions (Applying XOR Encryption for Stealth)"
// =================================================================================

std::string GetCmd_MenuVisible() { return _XOR("if _G.ToggleGMMenu then _G.ToggleGMMenu() elseif _G.GM_MENU then _G.GM_MENU:setVisible(not _G.GM_MENU:isVisible()) end"); }

std::string GetCmd_NavUp() { return _XOR("if _G.MenuUp then _G.MenuUp() end"); }
std::string GetCmd_NavDown() { return _XOR("if _G.MenuDown then _G.MenuDown() end"); }
std::string GetCmd_NavLeft() { return _XOR("if _G.MenuLeft then _G.MenuLeft() end"); }
std::string GetCmd_NavRight() { return _XOR("if _G.MenuRight then _G.MenuRight() end"); }
std::string GetCmd_NavConfirm() { return _XOR("if _G.MenuConfirm then _G.MenuConfirm() end"); }

std::string GetCmd_Speed() { return _XOR("if _G.ToggleSpeed then _G.ToggleSpeed() end"); }
std::string GetCmd_LootLoop() { return _XOR("if _G.ToggleAutoLootLoop then _G.ToggleAutoLootLoop() end"); }
std::string GetCmd_KillNPC() { return _XOR("if _G.RunKillNPC then _G.RunKillNPC() end"); }
std::string GetCmd_Recover() { return _XOR("if _G.RunRecover then _G.RunRecover() end"); }
std::string GetCmd_AutoLoot() { return _XOR("if _G.RunAutoLoot then _G.RunAutoLoot() end"); }

// =================================================================================
// HOOK
// =================================================================================

typedef int(__fastcall* tLua_Load)(void* L, void* reader, void* dt, const char* chunkname, const char* mode);
typedef int(__fastcall* tLua_Pcall)(void* L, int nargs, int nresults, int errfunc, void* k, void* ctx);

tLua_Load oLua_Load = nullptr;
tLua_Pcall oLua_Pcall = nullptr;

struct ReaderData { const char* s; size_t size; };
const char* __fastcall MyLuaReader(void* L, void* ud, size_t* size) {
    ReaderData* data = (ReaderData*)ud;
    if (data->size == 0) { *size = 0; return nullptr; }
    *size = data->size; data->size = 0; return data->s;
}

// Global Flags
bool bInjectPayload = false;
std::string cmdQueue = "";
std::mutex mtx;

int __fastcall hkLua_Pcall(void* L, int nargs, int nresults, int errfunc, void* k, void* ctx) {

    // 1. Inject Menu (F3)
    if (bInjectPayload) {
        bInjectPayload = false;

        ReaderData data = { LUA_LOADER_SCRIPT, strlen(LUA_LOADER_SCRIPT) };


        if (oLua_Load(L, &MyLuaReader, &data, _XOR("@SysInit").c_str(), _XOR("t").c_str()) == 0) {
            oLua_Pcall(L, 0, 0, 0, nullptr, nullptr);
        }
    }
    // 2. Normal Commands
    else {
        std::string cmdToRun = "";

        {
            std::lock_guard<std::mutex> lock(mtx);
            if (!cmdQueue.empty()) {
                cmdToRun = cmdQueue;
                cmdQueue = "";
            }
        }

        if (!cmdToRun.empty()) {
            ReaderData data = { cmdToRun.c_str(), cmdToRun.length() };
            if (oLua_Load(L, &MyLuaReader, &data, _XOR("@SysCmd").c_str(), _XOR("t").c_str()) == 0) {
                oLua_Pcall(L, 0, 0, 0, nullptr, nullptr);
            }
        }
    }

    return oLua_Pcall(L, nargs, nresults, errfunc, k, ctx);
}

uintptr_t PatternScan(const char* signature) {
    auto dos = (PIMAGE_DOS_HEADER)GetModuleHandleA(NULL); // Scan module ตัวเอง (เกม)
    if (!dos) return 0;
    auto nt = (PIMAGE_NT_HEADERS)((std::uint8_t*)dos + dos->e_lfanew);
    auto size = nt->OptionalHeader.SizeOfImage;
    auto bytes = reinterpret_cast<std::uint8_t*>(dos);
    std::vector<int> pattern;
    const char* cur = signature;
    while (*cur) {
        if (*cur == ' ') { cur++; continue; }
        if (*cur == '?') { pattern.push_back(-1); cur++; if (*cur == '?') cur++; }
        else { pattern.push_back(strtoul(cur, (char**)&cur, 16)); }
    }
    for (size_t i = 0; i < size - pattern.size(); ++i) {
        bool found = true;
        for (size_t j = 0; j < pattern.size(); ++j) {
            if (bytes[i + j] != pattern[j] && pattern[j] != -1) { found = false; break; }
        }
        if (found) return (uintptr_t)&bytes;
    }
    return 0;
}

void SendCommand(std::string cmd) {
    std::lock_guard<std::mutex> lock(mtx);
    cmdQueue = cmd;
}

DWORD WINAPI MainThread(LPVOID lpReserved) {
    // Scan Signatures
    uintptr_t load = PatternScan("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 50 48 8B E9 49 8B F1");
    if (!load) load = PatternScan("48 89 5C 24 10 56 48 83 EC 50 49 8B D9 48 8B F1 4D 8B C8 4C 8B C2 48 8D 54 24");
    uintptr_t pcall = PatternScan("48 89 74 24 18 57 48 83 EC 40 33 F6 48 89 6C 24 58 49 63 C1 41 8B E8 48 8B F9 45 85 C9");

    if (!load || !pcall) {
        FreeLibraryAndExitThread((HMODULE)lpReserved, 0);
        return 0;
    }

    oLua_Load = (tLua_Load)load;
    MH_Initialize();
    MH_CreateHook((void*)pcall, &hkLua_Pcall, (void**)&oLua_Pcall);
    MH_EnableHook(MH_ALL_HOOKS);

    while (true) {
        HWND foreground = GetForegroundWindow();
        DWORD foregroundPid = 0;
        if (foreground) GetWindowThreadProcessId(foreground, &foregroundPid);

        if (foregroundPid == GetCurrentProcessId()) {

            // --- 1. Main Inject Key (F3) ---
            if (GetAsyncKeyState(VK_F3) & 1) {
                bInjectPayload = true;
            }

            // --- 2. Menu Visibility (Numpad -) ---

            if (GetAsyncKeyState(VK_SUBTRACT) & 1) SendCommand(GetCmd_MenuVisible());

            // --- 3. Navigation ---
            if (GetAsyncKeyState(VK_NUMPAD8) & 1) SendCommand(GetCmd_NavUp());
            if (GetAsyncKeyState(VK_NUMPAD2) & 1) SendCommand(GetCmd_NavDown());
            if (GetAsyncKeyState(VK_NUMPAD4) & 1) SendCommand(GetCmd_NavLeft());
            if (GetAsyncKeyState(VK_NUMPAD6) & 1) SendCommand(GetCmd_NavRight());
            if (GetAsyncKeyState(VK_NUMPAD5) & 1) SendCommand(GetCmd_NavConfirm());

            // --- 4. Alt Shortcuts ---
            if (GetAsyncKeyState(VK_MENU) & 0x8000) {
                if (GetAsyncKeyState(VK_NUMPAD1) & 1) SendCommand(GetCmd_Speed());
                if (GetAsyncKeyState(VK_NUMPAD2) & 1) SendCommand(GetCmd_LootLoop());
                if (GetAsyncKeyState(VK_NUMPAD5) & 1) SendCommand(GetCmd_KillNPC());
                if (GetAsyncKeyState(VK_NUMPAD7) & 1) SendCommand(GetCmd_Recover());
                if (GetAsyncKeyState(VK_NUMPAD9) & 1) SendCommand(GetCmd_AutoLoot());
            }

            // --- 5. Unload (END Key) ---
            if (GetAsyncKeyState(VK_END) & 1) {
                break;
            }
        }
        Sleep(50);
    }

    MH_DisableHook(MH_ALL_HOOKS);
    MH_Uninitialize();
    FreeLibraryAndExitThread((HMODULE)lpReserved, 0);
    return 0;
}

BOOL WINAPI DllMain(HMODULE hMod, DWORD dwReason, LPVOID lpReserved) {
    if (dwReason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hMod);
        CreateThread(nullptr, 0, MainThread, hMod, 0, nullptr);
    }
    return TRUE;
}



Test.lua 核心腳本 (部分)


這個檔案是所有功能的大腦。它定義了菜單介面、按鈕功能、以及如何呼叫遊戲內的各種指令來實現上帝模式、一擊必殺等效果。你可以修改這個檔案來調整菜單外觀或功能邏輯。
-- SCRIPT START TEST 1.4.2
print("=== SCRIPT IS RUNNING ===")

-- =================================================================================
-- SECTION 1: DEBUG & SETUP
-- =================================================================================
local DEBUG_FILE_ENABLED = true
local DEBUG_FILE_PATH    = "C:\\temp\\Where Winds Meet\\Scripts\\script_debug.txt"

local function write_debug(message)
    if DEBUG_FILE_ENABLED then
        pcall(function()
            local file = io.open(DEBUG_FILE_PATH, "a")
            if file then
                file:write(os.date("%H:%M:%S") .. " " .. message .. "\n")
                file:close()
            end
        end)
    end
    print(message)
end

-- (中間省略了大量的環境設定與功能函式定義)

-- =================================================================================
-- SECTION 5: UI CONSTRUCTION
-- =================================================================================

-- DIMENSIONS (Doubled Size)
local btnHeight   = 90
local spacing     = 16
local headerSpace = 160
local footerSpace = 400
local panelWidth  = 940

-- --- 1. DEFINE BUTTONS ---

-- GROUP 1: EXECUTE ONCE (Top)
queueButton("Kill All NPC (Alt+5)", _G.RunKillNPC, nil, nil, nil, false)
queueButton("Permanent Buffs", _G.RunPermanentBuffs, nil, nil, nil, false)
queueButton("Remove Buffs", _G.RunRemoveBuffs, nil, nil, nil, false)
-- (此處為節選,完整程式碼請見整合包)



Buff 設定檔範例 (buff_config.txt)


這個文字檔是你客製化各種增益效果(BUFF)的地方。你可以透過修改 `auto`, `perm`, `remove` 這些參數來決定哪些 BUFF 要在「自動施放」、「永久施放」或「全部移除」時觸發。
-- Shared buff list used by AutoBuff, PermanentBuffs, and RemoveBuffs
-- Fields:
--   id     : buff id (number)
--   note   : buff description
--   auto   : apply in Auto Buff (true/false)
--   perm   : apply in Permanent Buffs (true/false)
--   remove : Remove Buffs (true/false)
local BUFF_LIST = {
    -- Damage Buffs
    { id = 30302,  note = "increase damage", auto = true,  perm = true,  remove = true },
    { id = 107031, note = "increase damage (stacks)", auto = true,  perm = true,  remove = true },
    { id = 109040, note = "increase HP and crit Fledgling", auto = true,  perm = true,  remove = true },
   
    -- Defense Buffs
    { id = 30303, note = "increase defense", auto = true,  perm = true,  remove = true },
    { id = 30379, note = "reduce 30% damage received", auto = true,  perm = true,  remove = true },
   
    -- Healing Buffs
    { id = 107011, note = "increase healing damage", auto = true,  perm = true,  remove = true },
    { id = 30314,  note = "drunk, damage + lifesteal", auto = true,  perm = true,  remove = true },
   
    -- Utility Buffs
    { id = 30407,  note = "untargettable", auto = true,  perm = true,  remove = true },
    { id = 70108,  note = "remove silence status", auto = true,  perm = true,  remove = true },
   
    -- (此處為節選,完整列表請見整合包)
}



疑難排解與注意事項



  • 菜單沒出現?
    這是最常見的問題。請依序檢查:1. 遊戲影像設定是否為 DirectX 11 (DX11) 且為全螢幕模式? 2. 你是否在能操作角色的遊戲場景中,而不是在主選單或讀取畫面? 3. 注入後,你是否按了 F3 來啟動菜單?

  • 注入器無法啟動或閃退?
    請嘗試以「系統管理員身分」執行注入器。同時,確認你的防毒軟體或 Windows Defender 沒有在背景偷偷把它擋下來或刪除。

  • 遊戲更新後腳本失效了?
    非常正常。遊戲每次大更新後,記憶體位址都可能會改變,導致舊的腳本找不到正確位置而失效。這時候就需要等待腳本作者釋出對應新版本的更新。

  • 注入後遊戲崩潰 (閃退)?
    可能的原因有:遊戲版本與腳本不符、DLL 檔案損毀、注入器設定錯誤,或是與其他背景程式衝突。請重新檢查一遍所有步驟,確保一切都正確。

  • 除錯日誌檔
    如果遇到棘手的問題,可以到 `C:\temp\Where Winds Meet\Scripts\` 路徑下找到 script_debug.txt 檔案。它會記錄腳本運行的詳細資訊,有助於你或社群大神幫你排查問題。



重點回顧



  • 安全第一:堅持自己動手編譯 DLL,這是保障帳號與電腦安全的第一道防線。

  • 路徑為王:`C:\temp\Where Winds Meet\Scripts\` 這個路徑絕對不能錯,所有腳本相關檔案都要放在這裡。

  • 設定關鍵:注入器務必開啟「安全模式 (Secure Mode)」並使用「手動映射 (Manual Map)」注入。

  • 啟動時機:務必在進入遊戲世界、可以自由移動角色後再進行注入,並按下 F3 啟動菜單。




《燕雲十六聲》Lua腳本修改器 常見問題Q&A


Q:為什麼我需要自己編譯 DLL 檔案,不能直接用別人編好的嗎?
A:自己編譯有兩大好處:第一,可以確保檔案是乾淨無毒的,來源就是你看到的原始碼;第二,針對你自己的系統環境編譯,可以最大程度地避免相容性問題,提高注入的成功率和穩定性。這是一種更安全的作法。

Q:我的防毒軟體一直跳警告,這個工具安全嗎?
A:這類遊戲修改工具的運作原理(讀取和修改遊戲記憶體)很容易被防毒軟體誤判為惡意程式。我們提供的原始碼是透明的,但無法保證注入器本身100%安全。建議在受信任的環境下使用,並將相關檔案加入防毒軟體的白名單或例外清單。

Q:這跟 Cheat Engine (CE) 有什麼不一樣?
A:Cheat Engine 主要是透過搜尋和修改記憶體數值來達成效果,比較像是在外部動手術。而這個 Lua 腳本則是透過 DLL 注入,直接在遊戲內部呼叫遊戲本身的函式(Functions)來執行命令,更深入、功能也更強大穩定,但製作和使用的技術門檻也相對較高。

Q:我可以自己修改 Test.lua 來增加或改變功能嗎?
A:當然可以!如果你懂 Lua 語言,這正是 Lua 腳本的魅力所在。你可以打開 `Test.lua` 和 `buff_config.txt`,研究裡面的程式碼,嘗試修改數值、增減功能,打造出完全屬於你自己的客製化修改器。

Q:我真的會因為用這個被官方封鎖帳號嗎?
A:是的,風險確實存在。任何修改遊戲客戶端的行為都違反了大多數遊戲的使用者條款。雖然本工具使用了一些技術(如安全模式注入)來降低被偵測的機率,但無法保證100%不被發現。所以,請務必低調使用,並有承擔風險的心理準備。






大家正在看啥


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

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

本版積分規則

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

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

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