什么是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?
我推薦的使用方法是:
- 打開地圖
- 分析文件
- 全部解壓
- 于是,你可以在w3x文件同級的位置,找到解壓結果,進去,找到war3map.j,如果還找不到,那就再進入scripts文件夾,總能找到的。
- 找到war3map.j后,就進行修改。修改完后,就回到軟件,鼠標移到war3map.j,點擊鼠標右鍵,彈出菜單,點擊“替換(添加)文件”,完成。
- (可選)為了讓w3x文件更加小,你可以點擊重壓縮。
- 最后,善始善終嘛!點擊“關閉文件”。
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閃。??