脚本制作变量大全
checkjob (Warr, Wizard, Taos) ;测试职业
checkgold (金币数) ;测试金币
checklevel (等级) ;测试等级
checkitem (物品名) (数量) ;测试物品及数量
give gold (金币数) ;给钱
give (物品名) (数量) ;给物及数量
take gold (金币数) ;拿走钱
take (物品名) (数量) ;拿走物及数量
checkpkpoint (pk值) ;测试PK值
checkluckypoint (幸运值) ;幸运值正值为好,负值为差
checkduraeva (物品名) (数值) ;一般测试矿物等物品的品质
checkhum (地图名) (数值) ;测试这个地图的人数
checkmonmap (地图名) (数值) ;测试这个地图的怪物数
map (地图名) ;移动到这个地图
mapmove (地图名) (坐标A) (坐标B) ;移动到这个地图指定坐标
monclear 地图清除
close 关闭对话框
TimeRecall (设定时间值) ;分钟,一般指进入地图时间限制
BreakTimeRecall ;中断设定时间
ExchangeMap (地图名) ;与指定地图里的人交换位置
daytime sunset ;一天时间
checkbaggage ;测试背包满没
small (变量) (数值) ;测试变量是不是小于指定数值
large (变量) (数值) ;测试变量是不是大于指定数值
equal (变量) (数值) ;测试变量是不是等于指定数值
mov (变量) (数值) ;让变量等于指定数值
sum (变量A) (变量B) ;A+B 注意,如果还要家第3个数直接换行写sum (变量C)
注:关于SUM的详解
首先有MOV (变量X) 0 ;(变量X)清0
sum (变量A) (变量B) ;X=A+B
sum (变量C) ;X=X+C
movr (变量) (数值) ;随机把指定数值以下的数(正数)给变量
inc (变量) (数值) ;让变量自动加指定数值到变量
playdice (骰子数) @xxx ;玩骰子,跳转到标签[@xxx]
random (随机数) ;一般用在#IF语句中作为触发#IF机率,有时随机数=并列#IF语句数用于随机多项选择,既:
#IF RANDOM 3 #SAY() #ELSEACT
#IF RANDOM 3 #SAY() #ELSEACT
#IF RANDOM 3 #SAY() #ELSEACT
Check [条件数] 1 ;测试[条件数]触发与否 1(触发)
SET [条件数] 1 ;设置[条件数]触发
batchDelay (暂停时间) ;一般为1
addbatch (地图名1)
addbatch (地图名2)
addbatch (地图名3)
addbatch (地图名4)
addbatch (地图名5)
batchmove ;一步步到下一个地图直到5
param1 01141 ;01141=(地图名)
param2 10
param3 10
mongen 火焰沃玛2(怪物名) 30 10
;玩骰子脚本解析
#IF
equal p9 1 ;测试 p9是不是等于1
#ACT
goto @cube ;是的,到@cube
BreakTimeRecall (中断设定时间)
break
#IF
equal p9 9 ;测试 p9是不是等于9
#ACT
goto @quit ;是的,到@quit 退出
BreakTimeRecall (中断设定时间)
break
[@main-1]
#IF
#ACT
mov p9 0 ;测试 p9是不是等于0
#SAY
say ;欢迎词
<下一步/@pre_cube>
[@pre_cube]
#IF
checkitem 筹码 1 ;测试有没有筹码
#ACT
mov p9 1 ;有,让p9=1
take 筹码 1 ;给出一个筹码
movr d0 6 ;;随机把6以下的数(正数)给d0
inc d0 1 ;让d0自动加1到d0
playdice 1 @cube ;玩骰子,点击到标签[@cube]
#SAY
正在投骰子. \ <下一个/@cube>
#ELSESAY
quit
<退出/@Quit>
#ELSEACT
mov p9 9 ;转到标签@quit并让P9等于9
[@Quit]
#IF
#ACT
map B011 ;退出到B011地图
[@cube]
#IF
#SAY
骰子的点数 <$STR(D0)> \ ;<$STR(D0)>是变量,把D0数值型转字符型
你可以前进 <$STR(D0)> \ <移动/@next_cube>
[@next_cube]
#IF
equal d0 1 ;如果 d0=1
#ACT
goto @posi1 ;到POSI1
break
#IF
equal d0 2
#ACT
goto @posi2
break
#IF
equal d0 3
#ACT
goto @posi3
break
#IF
equal d0 4
#ACT
goto @posi4
break
#IF
equal d0 5
#ACT
goto @posi5
break
#IF
equal d0 6
#ACT
goto @posi6
break
[@Posi1]
#IF
#ACT
batchDelay 1 ;一般为1(暂停时间)
addbatch B102 ;步进地图名1
batchmove ;移动到最后一个步进地图
[@Posi2]
#IF
#ACT
batchDelay 1
addbatch B102
addbatch B103
batchmove
[@Posi3]
#IF
#ACT
batchDelay 1
addbatch B102
addbatch B103
addbatch B104
batchmove
[@Posi4]
#IF
#ACT
batchDelay 1
addbatch B102
addbatch B103
addbatch B104
addbatch B105
batchmove
[@Posi5]
#IF
#ACT
batchDelay 1
addbatch B102
addbatch B103
addbatch B104
addbatch B105
addbatch B106
batchmove
[@Posi6]
#IF
#ACT
batchDelay 1 ;一般为1(暂停时间)
addbatch B102 ;步进地图名1
addbatch B103 ;步进地图名2
addbatch B104 ;步进地图名3
addbatch B105 ;步进地图名4
addbatch B106 ;步进地图名5
addbatch B107 ;步进地图名6
batchmove ;移动到最后一个步进地图(这里是6)
;结束
SET
语句:
#IF
……
#ACT(SAY)
……
#ELSESAY(ACT) ;ELSE的两句是并列的,都是IF<>(条件)的动作
……
#ELSEACT(SAY)
……
goto (标签名)
break (中断)
\ ;换行
<xxx/@xxx>
变量:
<$USERNAME> 当前用户名
<$GUILDWARFEE>行会战金币数
<$LORD>沙巴克行会头名
<$OWNERGUILD>沙巴克行会名
<$UPGRADEWEAPONFEE>升级武器价格
<$USERWEAPON> 放在对话框里的武器名字
<$STR(变量)> 把变量转换为字符型
check [ ] check [111] 1 检测111是否为1
checkunit
checkopen
random random 6 产生一个小与6的随机整数
gender 检测性别
daytime
checklevel checklevel 10 检测等级是否大于10
checkjob checkjob wizard 检测职业
checkitem检测物品
checktiemw
checkgoldcheckgold 1000检测身上的钱是否大于1000
istakeitem
checkdura 物品的持久
checkduraeve
dayofweek 游戏中的时间
hour
min
checkpkpointcheckpkpoint 2检测人物PK值是否大于2
checkluckpoint检测人物幸运数
checkmonmap
checkmonarea
checkhum 检测地图是否有玩家
checkckbaggage
checknamelist
equalequal d1 2检测变量d1是否等于2
largelarge d1 2检测变量d1是否大于2
smallsmall d1 2检测变量d1是否小于2
set [ ]set [111] 1
reset
setopen
setunit
resetunit
taketake 物品 数量
givegive 物品 数量
takew
close
mapmove
map
breakbreak
timerecall
breaktimerecall
param1
param2
param3
param4
takecheckitem
mongen
monclear
movmov d1 1
incinc d1 1
dec dec d1 1
sumdec d1 1
movrmovr d1 6
exchangemap
recallmap
addbatch
batchdelay
batchmove
playdice掷色子
addnamelist
delnamelist
goquest
endquest
goto
#call []
#act
goto
#sethome
#define
#include
definestxt
@home
@main
#if
#act
#elseact
{quest ***
{~quest [] ***
#rand
[goods]
#say
#elsesay
$pricerate
$upgradeweapenfee
$userweapon
@s_repair
@buy
@sell
@repair
@makedrag
@prices
@storage
@getback
@upgradenow
@getbackupgnow
@exit
@@buildguild
@@guildwar
@@donate
@requestcaselewarnow
$castlegold
$todayincome
broken
open
shut
$castledoorstale
$repairdoorgold
$repairwallgold
$guardfee
$guardrule
@@withdrawal
@@receipts
@openmaindoor
@closemaindoor
@repairdoornow
@repairwallnow1
@repairwallnow2
@repairwallnow3
@hireguardnow
@hireguards
@hirearchernow
第一节 序言
很多人都或多或少的接触过传奇服务器端脚本文件,也很想自己制作一点脚本来试试,但又不敢乱碰生怕改坏一点东西造成不能运行服务器端,其实“脚本语言“(我们暂且称他为一种语言)和C语言等等程序语言比起来那真是不值得一提。看完我给大家写的这篇文章后,你就自己偷着乐吧...
可以说传奇服务器端所有的重点都集中在\mir200\envir\中,这里面记载着所有服务器要在游戏中表现的东西。在游戏中的npc信息也在其中,npcs.txt文件和merchant.txt文件中记载着npc的名称、出现的地图、坐标、范围和形象代码。你要问两个记载的npc有什么不同?为什么不和在一起算了?我来告诉你,npcs.txt中记载的npc是对话型npc,在进入游戏后,不能够使用@reloadnpc刷新信息的npc。而merchant.txt是交易型和任务型npc,可以使用@reloadnpc刷新信息。但我也做过试验,两种npc互换后也可以使用,好像没有太大的限制。
npcs.txt对应的文件在.\npc_def\文件夹中,merchant.txt对应的文件在.\market_def\文件夹中。你如果要添加npc的时候,要注意npc的文件名,例如你要创建一个超级商人的npc要他出现在比奇省330:330的坐标。首先你要在.\market_def\文件夹中创建一个文本文件命名为“超级商人-0“(这里你可以使用英文,也可以使用中文,但后面的数字必须要是这个npc出现的地图代码!),然后把你写好的脚本粘贴在里面。再打开merchant.txt文件,添加以下信息:
;调用的文件 地图 坐标x 坐标y 范围 人物代码 刷新时间
超级商人 0 330 330 0 5 0
相信大家可以看懂吧,这里面的空格不要紧,没有规定信息之间必须空几格。人物代码自己换吧,现在的npc有46种模样。
和脚本的规则一样,这两个文件里面以;开头的行就当作注释部分不做编译。
第2节
现在步入正题,谈谈脚本的制作。
npc脚本分为两种,一种是不做交易的npc,一种是与之交易的npc。我们先来讲不做交易的npc
这类脚本的开头一般以[@main]开头,但并不是必须以他开头,main的英文意思是“主体,主要部分”的意思,所以用他这是个好习惯。
接着就是条件语句#if,和他对应的#act,就是说如果...那么...,我在之前的《脚本语言之不完全公略》一文中提到了一系列的测试语句。#if后面可以跟这个测试语句,比如测试金钱checkgold,测试级别checklevel等等,这些测试语句可以连用,挑选满足这所有值的人。如果你想不要任何条件的话就把他留空,后面直接接#act.
接着就是#act,如果有人满足了上述条件,那么...我们可以使用一些命令应用于他,比如take拿走他身上的什么东西,mapmove把他移动到什么地图,set赋予他什么函数值等等。这些语句你也可以连着使用。后面也可以跟文字,那么就在传奇里面显示为对话。
下面是#ELSEACT,如果没有满足#if条件的,就不再运行#act后面的指令,直接运行#ELSEACT后面的指令。后面也可以跟文字,那么就在传奇里面显示为对话。
#say和#elsesay的用法和#act#elsesay的用法相同。
范例:
----------------------------
;传送猪7的npc脚本
[@main]
#if
checkgold 10000
checklevel 30
#act
take 金币 10000
map d717
break
#elsesay
你有10000个金币吗?要不然就是你没有30级。我不能把你传送到猪7了!自己跑吧。<关 闭/@exit>
----------------------------
这就是一个极其简单的传送脚本。我们下一节讲稍微复杂的段落脚本。
第三节
这一节我们来讲段落脚本。
复杂的脚本需要有数个[@main][@main-1]等等组成,从[@main]到[@main-1]之间称为一个段落,他们之间是由goto命令来衔接的,#if满足条件的话,#act就执行goto @main-1命令,转向[@main-1]段落。值得一提的是goto是脚本自动做出转换段落的命令,还有一种转换段落的方式,那就是要玩家自己选择段落。<go to main-1/@main-1>这部分将在游戏中显示为黄色可以点选的信息,玩家鼠标选择后转向main-1段落。
范例:
----------------------------
;赠送回城卷脚本
[@main]
#if
checkpkpoint 2
#act
goto @main-1
#elseact
give 回城卷 1
[@main-1]
你是红名啊!别想让我可怜你,你是个十足的恶魔!什么?怒视着我干吗?信不信我现在就让你去死?<相信,我很害怕,我现在就走./@exit><不信,我杀人不眨眼,还怕你?/@main-2>
[@main-2]
#if
#act
Param1 t131
Param2 10
Param3
|