博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用JASS简单修改魔兽争霸地图
阅读量:5146 次
发布时间:2019-06-13

本文共 3515 字,大约阅读时间需要 11 分钟。

大学时候,经常用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导回到原地图文件即可。

题外话:居然是Just Another Scripting Syntax的缩写,不由得想到(Yet another Framework)。

转载于:https://www.cnblogs.com/weimeng/archive/2012/01/03/2311230.html

你可能感兴趣的文章
java并发编程之lock锁
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>
Redis快速入门
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
inline函数的总结
查看>>
SPSS-生存分析
查看>>
【Jquery】$.Deferred 对象
查看>>
Python字符编码
查看>>
leetcode 49. 字母异位词分组(Group Anagrams)
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
财务结算的目的和一般流程
查看>>
Myeclipse 优化1
查看>>
[BJOI2012]最多的方案(记忆化搜索)
查看>>
生成了一个严重警告并将其发送到远程终结点。这会导致连接终止。TLS 协议所定义的严重错误代码是...
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
vscode 中 eslint 相关配置
查看>>