用JASS簡單修改魔獸爭霸地圖


大學時候,經常用w3mmaster修改一些未加密地圖的技能,自娛自樂。有一張地圖,神之墓地,有一些改版:“春哥”、“風姐”版,特點是玩家輸入“風姐萬歲”等特定指令時,英雄會得到若干個隨機物品。

想用w3mmaster修改之,但是圖經過SLK優化,解壓后沒有w3u文件(w3mmaster+mpqmaster的改圖教程可以參見這里),只有war3map.j,這不就是傳說中的JASS腳本文件么?隨直接用ue打開,定位“我信春哥!”,找到這段代碼:

function Trig_thisisrhick_Actions takes nothing returns nothing
local trigger array iiitttggg
local integer i=1
loop
exitwhen i>12
if GetPlayerController(ConvertedPlayer(i)) == MAP_CONTROL_USER and GetPlayerSlotState(ConvertedPlayer(i)) == PLAYER_SLOT_STATE_PLAYING then
set iiitttggg[i]=CreateTrigger()
set iiitttggg[i+12]=CreateTrigger()
set iiitttggg[i+24]=CreateTrigger()
call TriggerRegisterPlayerChatEvent(iiitttggg[i], ConvertedPlayer(i), "我信春哥!", true )
call TriggerRegisterPlayerChatEvent(iiitttggg[i+12], ConvertedPlayer(i), "信春哥 得永生", true )
call TriggerRegisterPlayerChatEvent(iiitttggg[i+24], ConvertedPlayer(i), "支持飛飛世界", true )
call TriggerAddAction(iiitttggg[i], function iiitttggg_Actions )
call TriggerAddAction(iiitttggg[i+12], function iiitttggg_Actions )
call TriggerAddAction(iiitttggg[i+24], function iiitttggg_Actions )
endif
set i=i+1
endloop
endfunction


顯然,這是一個函數定義,其中又調用了一些API。單從函數名上判斷,應該是為每個玩家都注冊一個由chat命令觸發的事件,再看iiitttggg_Actions到底做了什么:

function iiitttggg_Actions takes nothing returns nothing
set bj_wantDestroyGroup=true
call ForGroupBJ( GetUnitsOfPlayerMatching(GetTriggerPlayer(), Condition(function iiitttggg_Func001001002)), function iiitttggg_Func001A )
call DestroyTrigger(GetTriggeringTrigger())
endfunction

繼續跟下去,iiitttggg_Func001001002是用來判斷當前單位是否是英雄,而iiitttggg_Func001A代碼如下:

function iiitttggg_Func001A takes nothing returns nothing
set udg_iiitem = CreateItem(ChooseRandomItemBJ(+3), GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()))
call UnitAddItem( GetEnumUnit(), udg_iiitem )
call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ( GetPlayerName(GetTriggerPlayer()) + ( "獲得了由春哥獎勵的 " + GetItemName(udg_iiitem) ) ) )
set udg_iiitem = CreateItem(ChooseRandomItemBJ(+3), GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()))
call UnitAddItem( GetEnumUnit(), udg_iiitem )
call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ( GetPlayerName(GetTriggerPlayer()) + ( "獲得了由春哥獎勵的 " + GetItemName(udg_iiitem) ) ) )
set udg_iiitem = CreateItem(ChooseRandomItemBJ(+8), GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()))
call UnitAddItem( GetEnumUnit(), udg_iiitem )
call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ( GetPlayerName(GetTriggerPlayer()) + ( "獲得了由春哥獎勵的 " + GetItemName(udg_iiitem) ) ) )
set udg_iiitem = CreateItem(ChooseRandomItemBJ(+9), GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()))
call UnitAddItem( GetEnumUnit(), udg_iiitem )
call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ( GetPlayerName(GetTriggerPlayer()) + ( "獲得了由春哥獎勵的 " + GetItemName(udg_iiitem) ) ) )
set udg_iiitem = CreateItem(ChooseRandomItemBJ(+9), GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()))
call UnitAddItem( GetEnumUnit(), udg_iiitem )
call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ( GetPlayerName(GetTriggerPlayer()) + ( "獲得了由春哥獎勵的 " + GetItemName(udg_iiitem) ) ) )
endfunction



顧名思義,ChooseRandomItemBJ就是獲取一個隨機物品(參數是物品等級),而UnitAddItem將它丟到英雄身上……值得注意的是,iiitttggg_Actions中調用了DestroyTrigger來避免該事件被重復調用,而不是我之前猜想的通過全局變量來記錄。

至此,如果要改得更盡興一點,那就在iiitttggg_Func001A里多call幾次相關函數。然后還是照常將war3map.j導回到原地圖文件即可。

題外話:JASS居然是Just Another Scripting Syntax的縮寫,不由得想到Yaf(Yet another Framework)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM