魔兽地图修改之JASS入门篇(二)

魔兽地图修改之JASS入门篇(二)

上一章我讲解了魔兽地图的常用加密方式与解密方法,这一章我主要讲解JASS语言,首先即然是一种语言,我们当然要先了解一下语法

Jass变量类型

integer
integer(数值)是的范围在 -2147483647 和 2147483647 之间的整数, 不能有小数位

real
real是范围很大的32字节数字, 可以有小数位, 123456.33就是real

boolean
boolean的值只有true(真)和false(假), 多用于条件判断语句
if (条件==true)
then
(符合条件做某事)
else
(不符合条件就做另一件事)
endif

string
string是字符串变量, 可以是null(空值). 注意Jass的字符串是大小写区分的, 赋值时用双引号 “” 引用

handle
handle句柄, 可以是null(空值). 是用于指向Warcraft III定义的数据结构的指针. 比如上表中的location/player等除了

integer/real/boean/string外的的变量实际上就是handle类型的子变量

code
code(程序代码), 可以是null(空值). 函数可以有code类型的传递参数, 表示该函数必须要有其他函数作为参数, 如:
function RunFunctionForAllPlayers takes code theFunction returns nothing
我们可以这样调用函数: call RunFunctionForAllPlayers(function someFunction) //先运行someFunction
也可以: call RunFunctionForAllPlayers(null) //不运行其他函数

trigger
trigger为事件变量,例如trigger gg_trg_mingling01=CreateTrigger( )

Boolean boolean 布尔型(用于真/假判断)
Destructible destructable 可破坏物
Dialog dialog 对话
Dialog Button button 按钮
Floating Text texttag 漂浮文字
Integer integer 数值
Item item 物品
Leaderboard leaderboard 排行榜
Player player 玩家
Player Group force 玩家组
Point location 位置(点)
Real real 真值型数字
Region rect 地区
Special Effect effect 特效
String string 字符串
Terrain Deformation terraindeformation 地形
Timer timer 计时器
Timer Window timerdialog 计时器窗口
Unit unit 单位
Unit Group group 单位组
Player Score playerscore 积分(1.13版新类型)

全局变量声明格式:
globals
变量类型 变量名称 = 初始值 //有初始化的全局变量
变量类型 变量名称 //无初始化的全局变量
变量类型 array 变量名称 //数组全局变量, 不能再次初始化赋值

endglobals

看完语法部分之后,相信大家还不太明白,不过没关系,因为没动手改过JASS,所以当然会有不解,本章将举出实际的例子给大家动手的机会:) ,在动手之前还要讲一讲魔兽脚本文件的工作原理,我将他粗分为两部分,第一部分是”全局变量声明”也就是脚本中globals与endglobals之间的部分,这是此地图用到的所有的变量(JASS中用到的所有的变量都要求先声明,也就是写在globals与endglobals之间,定义变量的类型与数值什么的),第二部分就是函数部分,函数部分包括地图的初始化,创建单位,触发等等,全是在这里完成的,所以他是地图的灵魂。函数是从哪里开始执行的呢?无论哪个地图都有一个固定的入口函数”function main takes

nothing returns nothing”用UltraEdit-32打开war3map.j然后选中搜索->查找 在框中输入”function main”就会查找到入口函数”function main takes nothing returns nothing”函数是以function开头main是函数名(不同的函数名字不同,呵呵傻子都知道)以endfunction结束,其它的函数全是由这个函数开始,一层层的嵌套调用的.

下面我以’猛将传v2.01test1.w3x’这个地图为例,实现输入”give”后+1000钱和1000木的功能
第一,用MPQMaster提取出scripts文件夹下的war3map.j这个文件,然后用UltraEdit-32打开

第二,查找入口函数function main在这个函数中加入
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(0),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(1),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(2),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(3),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(4),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(5),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(6),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(7),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(8),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(9),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(10),”give”,true)
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(11),”give”,true )
call TriggerAddAction(gg_trg_mingling01,function O9981)
这段代码,语句的含义如下
call TriggerRegisterPlayerChatEvent(gg_trg_mingling01,Player(0),”give”,true)为例
call为调用函数的语句,TriggerRegisterPlayerChatEvent是对话的触发器,其中有4个参数,第一个为事件变量,在全局声明中以经建立了,第二个参数为玩家,玩家是从0到11共12个,第三个为触发的语句,也就是我们在对话中输入什么话才会响应,第四个为是否完全匹配,这里是为真,也就是只有输入give后才会响应,如果为假(false)则只要说的话中包含有’give’就可以了,12个触发有任意一个执行了,就会调用call TriggerAddAction(gg_trg_mingling01,function O9981),这个语句也是由call开始调用TriggerAddAction是事件对象,他有两个参数第一个是事件变量,它是和触发器的事件变量是对应的。第二个是调用的子程序,这里用的函数名是O9981(第一个是大写字母O) 如图:

第三,加入function O9981代码如下
function O9981 takes nothing returns nothing
call AdjustPlayerStateBJ(1000,GetTriggerPlayer(),PLAYER_STATE_RESOURCE_GOLD)
call AdjustPlayerStateBJ(1000,GetTriggerPlayer(),PLAYER_STATE_RESOURCE_LUMBER)
endfunction
含义如下AdjustPlayerStateBJ为加资源的函数,其中有三个参数,第一个是加多少资源,第三个是把资源给谁,第三个是加什么资源,其中第二个参数GetTriggerPlayer()是一个函数,他的作用是得到触发的玩家,也就是谁打的give这个命令就给谁钱,第三个参数有很多不同的值,我们这里用到的是钱和木,还有许多其它的,将在以后的文章中介绍了我是简单的把这个子程放在了入口函数的上边,如图:

第四,加入声名的变量,也就是gg_trg_mingling01代码如下:
trigger gg_trg_mingling01=CreateTrigger()
声名是加在globals与endglobals之间,trigger是事件类型,gg_trg_mingling01是变量名,CreateTrigger()是一个建立事件的函数,这条语句的意思就是建立一个事件,放在名叫gg_trg_mingling01的事件变量里.这个语句我就加在了脚本的一开头,如图:

现在脚本的编辑工作就完成了,我们点一下保存,UltraEdit-32会自动生成一个备份文件,防止改动出错时无法回复的问题发生

第五,用MPQMaster把原图中的war3map.j这个文件删除,然后再导入修改过的文件,再从新压缩一下,就大功告成了。:)

我发布了修改过的war3map.j,如果有明白的,下载后,同时用UltraEdit-32打开改前和改后的文件,然后用对比功能,可以看出两个脚本的不同,方便学习。
war3map.j
原图下载

小结:
看完这篇文章后要求独立更改一张地图的脚本,实现上述的功能

本文由小杰(SSJ)原创,转载请保留出处,谢谢合作!!

魔兽地图修改之JASS入门篇(二)》有一个想法

  1. 铁猫

    http://www.epicwar.com/maps/129531/

    这张地图,名字Legion TD 1.51b

    怎样查看作弊的启动指令?
    call TriggerRegisterPlayerEvent(vfai_t7,vfai_p7,EVENT_PLAYER_ARROW_RIGHT_DOWN)
    call TriggerRegisterPlayerEvent(vfai_t8,vfai_p7,EVENT_PLAYER_ARROW_LEFT_DOWN)
    call TriggerRegisterPlayerEvent(vfai_t9,vfai_p7,EVENT_PLAYER_ARROW_LEFT_UP)
    是看这个吗?

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注