魔獸改圖實戰(zhàn):P閃

什么是P閃?

游戲中,玩家單位有一個功能——巡邏(Patrol)。也許正是因為沒怎么被使用,顯得很雞肋,所以被人改造成了P閃——按下 P 鍵,并指定目標地點時,就閃過去。

為什么P閃?

個人認為是因為要加快游戲節(jié)奏,以及更有把握地達到目標,所以想要P閃。

實戰(zhàn)

以“盧溝橋抗擊戰(zhàn) 4.1”為例,進行改圖。

從某一魔獸地圖網(wǎng)站下載地圖,格式通常是w3x。其實w3x是一個壓縮文件,但不能用像WinRAR一樣的軟件進行解壓,我倒推薦用HkeW3mModifier 2.0——它竟然被稱為YD作弊器,也許是因為作者放了自己制作的作弊腳本吧?

如何使用HkeW3mModifier 2.0?

我推薦的使用方法是:

  1. 打開地圖
  2. 分析文件
  3. 全部解壓
  4. 于是,你可以在w3x文件同級的位置,找到解壓結果,進去,找到war3map.j,如果還找不到,那就再進入scripts文件夾,總能找到的。
  5. 找到war3map.j后,就進行修改。修改完后,就回到軟件,鼠標移到war3map.j,點擊鼠標右鍵,彈出菜單,點擊“替換(添加)文件”,完成。
  6. (可選)為了讓w3x文件更加小,你可以點擊重壓縮。
  7. 最后,善始善終嘛!點擊“關閉文件”。

PS:該軟件的使用方法,我只說一次,后面不會再贅述,但我可以通過超鏈接的方式指向這里。該軟件其實還有更多功能,你可以自己研究出怎么用。

用VS Code打開war3map.j后,為了更好地閱讀和編輯它,你可以格式化文檔。然后,找到globals,其實也不用苦找,因為它通常位于最前面,眼睛一瞥就找到了。找到后,就在它下面加入以下代碼:

trigger gg_trg_my_cheat_P = CreateTrigger()
location udg_my_cheat_LOC = null

接下來,使用查找功能,查找“function main”。找到后,在它上面添加以下代碼:

// P閃條件
function Trig_my_cheat_P_Condition takes nothing returns boolean
    return GetIssuedOrderId() == String2OrderIdBJ("Patrol")
endfunction

// P閃
function Trig_my_cheat_P_Action takes nothing returns nothing
    local unit sel_unit = GetTriggerUnit()
    // 獲取發(fā)布命令所指向的點
    set udg_my_cheat_LOC = GetOrderPointLoc()
    // P閃
    call SetUnitPositionLoc(sel_unit, udg_my_cheat_LOC)
    // 排泄,即釋放內存
    call RemoveLocation(udg_my_cheat_LOC)
endfunction

function MyCheat takes nothing returns nothing
    call TriggerRegisterPlayerUnitEventSimple(gg_trg_my_cheat_P, Player(0), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
    call TriggerAddCondition(gg_trg_my_cheat_P, Condition(function Trig_my_cheat_P_Condition))
    call TriggerAddAction(gg_trg_my_cheat_P, function Trig_my_cheat_P_Action)
    call EnableTrigger(gg_trg_my_cheat_P)
endfunction

添加完后,從“function main”開始查找“endfunction”,在它上面添加以下代碼:

call MyCheat()

等等,如果“endfunction”以上存在以下代碼:

call InitCustomTriggers()

則在以上代碼之上添加代碼,因為函數(shù)InitCustomTriggers()可能存在反作弊代碼。

到此,war3map.j改完了。此時,你要用HkeW3mModifier 2.0把修改好的war3map.j替換進w3x里。

為什么要這樣修改?

授人以魚不如授人以漁,現(xiàn)在我講講為什么要這樣修改。

function main是地圖腳本的入口,所以,為了讓自己的作弊代碼能夠生效,有必要往main函數(shù)中添加代碼:

call MyCheat()

以上一行代碼的意思是,當main函數(shù)運行到這里時,調用自己所寫的作弊代碼。它的實現(xiàn)是:

function MyCheat takes nothing returns nothing
    // 事件:當玩家1發(fā)布命令,使單位前往指定地點時,調用指定的觸發(fā)器
    call TriggerRegisterPlayerUnitEventSimple(gg_trg_my_cheat_P, Player(0), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
    // 只有滿足指定條件時,才能調用指定的觸發(fā)器
    call TriggerAddCondition(gg_trg_my_cheat_P, Condition(function Trig_my_cheat_P_Condition))
    // 調用觸發(fā)器時,執(zhí)行指定的回調函數(shù)
    call TriggerAddAction(gg_trg_my_cheat_P, function Trig_my_cheat_P_Action)
    // 啟用觸發(fā)器
    call EnableTrigger(gg_trg_my_cheat_P)
endfunction

其中,Player()函數(shù)的參數(shù)確實是從0開始的,所以Player(0)就是玩家1。gg_trg_my_cheat_P是一個觸發(fā)器變量,我們已經(jīng)在前文定義了。

接下來,我們一起看看Trig_my_cheat_P_Condition的定義:

// P閃條件
function Trig_my_cheat_P_Condition takes nothing returns boolean
    return GetIssuedOrderId() == String2OrderIdBJ("Patrol")
endfunction

首先,我們要知道,玩家發(fā)布的命令其實有很多種,比如移動、保持站位、攻擊、選擇單位、開始建造,等等,而以上函數(shù)的意思是,只有當發(fā)布的命令是巡邏(Patrol)時,才可以執(zhí)行觸發(fā)器。

OK,接下來,當執(zhí)行觸發(fā)器時,要執(zhí)行什么樣的回調函數(shù)?

// P閃
function Trig_my_cheat_P_Action takes nothing returns nothing
    // 獲得觸發(fā)單位
    local unit sel_unit = GetTriggerUnit()
    // 獲取發(fā)布命令所指向的點
    set udg_my_cheat_LOC = GetOrderPointLoc()
    // P閃
    call SetUnitPositionLoc(sel_unit, udg_my_cheat_LOC)
    // 排泄,即釋放內存
    call RemoveLocation(udg_my_cheat_LOC)
endfunction

以上代碼中的注釋寫得清清楚楚、明明白白,相信連賣菜的阿姨都能看得懂。

到此,相信你已經(jīng)完全掌握了P閃。??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容