脚本教程之gump编写

编写gump帮助 – nike
选自GG站论坛,可以学习怎样做gump

在sphere上看到一篇关于gump制作的贴子,将其主要内容译过来,希望有所帮助。
BEGINING SECTION//开始部分
所有的gumps都是顺序放置的,如果你以[gumps x1]开始,下一个就是[gump x2],接着是[gumps x3],以此类推。

在第一个[gump xx]里面
例子:
//这里是你放置图像和文本并初始化他们的地方
//(调用文本/按钮)
[gump 60]
0,0

用到的命令(大小写不敏感)
1)gumppic-是你将用到的第一个和最基本的命令,该命令就是用来调用图像的,比如:lord british的图片,书本的背景等,下面是一个gumppic命令的例子
gumppic 100 150 2200
100是图片的x坐标,150是y坐标,2200是图片的十进制代码
获得gump图片:目前得到gump图片代码的唯一办法就是使用insideuo,(但是里面显示的是16进制的代码,你需要转换为十进制),得到代码后,只需简单地把它们放入g umppic命令中即可。
2)text-另一个比较简单的命令,但也是最容易把你的gump搞的一团糟的命令,如果你在其中出现计算和拼写错误,会引起客户端崩溃,要花数小时修正(你最大的敌人)
text命令的例子:
text 145 200 000 3
145是文字的x坐标,200是y坐标,000是文本颜色(颜色你不得不通过自己测试,猜测来确定,000是黑色的代码),3就是要显示哪一行的文本。
文字行数的辨认:你制作gump时候,一共有3部分组成,gump,gump text,gump button,在gump text中,所有的东西都是一行挨着一行写的,第一行是0(text 145 200 000 0),下一行是1,以此类推。。。下面是个例子:
[GUMP XX TEXT]
h*llo
World!
要调用这2句话,在[gump xx]中这样做:
text 145 200 000 0
text 145 215 000 1

下面是我们目前所做完的:
[GUMP XX]
0,0 //这仅是gump中的一个标准的部分,照这样做就可
gumppic 100 150 2200 // 给你一本书的图片,在
x=100,y=150处,图片代码2200
text 145 200 000 0 //从文本部分调用“h*llo”
text 145 215 000 1 //从文本部分调用“world!”

[GUMP XX TEXT]
h*llo // 这是第0行
World! //这是第1行
3)Resizepic -这可能是gump中最有用的命令之一,他从预置的gump图片中创建菜单背景和边界。

又找到一些帮助,都是命令的格式:
resizepic (x 坐标) (y 坐标) (gump的id号) (宽度) (高度) // Gump 的值必须是十进制

tilepic (x 坐标) (y 坐标) (tile id) // Tile的值必
须是十进制

button (x 坐标) (y 坐标) (gump的id号) (降序的gump id) (group to call调用的组) (page to call调用的页) (button index-按钮索引)

checkbox (x 坐标) (y 坐标) (gump的id) (选中以后的 gump id) (0=未选中 >0=选中)

radio (x 坐标) (y 坐标) (gump的id) (选中以后的 gump id) (0=未选中 >0=选中)

[脚本教程之十四]如何编写物品的脚本

[十四]如何编写物品的脚本
从上一个教程到现在,脚本教程的整理停搁了一段时间,向大家表示歉意,让我们一起重新开始后面的学习吧!
在sphere的脚本编写中有几个大类,大家通过前面的帖子有了部分的了解,下面的内容让我们一起学习一下sphere脚本中最为简单的物品脚本的编写。任何学习写脚本的工作也是从物品的编写开始的。所谓物品就是我们在游戏中所手动添加的一些静态物品,如月门、兵器(剑等)、盔甲、食物、药水、卷轴、火把、钱等等。
sphere为这些物品的脚本定义了一些固定的格式和外部形态,也加入了一些触发,物品的属性和参数定义可以参考前面的教程七;触发指令可以参考前面的教程十二。在这里我想建议大家一下,在写任何的脚本的时候,最好自己新建一些文件,放在scripts目录下面的子目录中,子目录可以自己指定,这样每次版本更换的时候,不会进行大的更改,程序的管理方面会变得非常的规范和有序。同时在spheretables.scp中的[RESOURCES]一节定义如下(此例中的子目录为CUSTOM,资源文件最好放在上面的一节[RESOURCES]定义的最上面)。
[RESOURCES]
scripts\web\
Scripts\Custom\
Scripts\speech\
然后您可以按照自己的习惯来编写和命名程序文件,比如物品的和NPC的脚本、任务的脚本都可以分开来加入。
下面我们先开一个Items(物品)的脚本例子,这是一个袍子的定义:
[ITEMDEF 01f03] //物品定义开始标记
DEFNAME=i_robe //DEFNAME值等同于01f03,即ADD i_robe和ADD 01f03是一样的
RESOURCES=16 i_cloth //制作此物品需要的资源16个i_cloth
WEIGHT=3 //此物品的重量
TYPE=T_CLOTHING //此物品的类型为衣服类型
DYE=1 //是否可以被染色 1为可以
ARMOR=7 //防御等级
CATEGORY=Provisions – Clothes //在Axis这个工具里面的Items属性页显示的类别
SUBSECTION=Shirts & Robes //在Axis这个工具里面显示的分类别
DESCRIPTION=Robe //在Axis这个工具里面显示的具体名字
DUPELIST=01f04 //当物品被使用FLIP命令后进行转向后将会变成什么
SKILLMAKE=TAILORING 59.0, t_sewing_kit //制作这个物品需要的相关技能及点数
RESOURCES2=16 i_cloth,1 i_thread //制作这个物品需要那些资源
ON=@Create //被add或其他方式创建的时候触发
HITPOINTS={11 40} //在被打破之前可以被击中后损害的次数

Sphere55I的脚本规定任何物品都以ITEMDEF这个标记为开始直到下一个ITEMDEF标记活着EOF文件结束标记为终止,这其间的内容sphere都认为是一个物品的脚本。

对照一下我们前面的第七个教程中的物品变量,我们来看一下是不是物品的脚本非常简单啊?只是定义一下这个物品的外形和一些参数变量的值就可以了。下面我们在看一个物品脚本,这个物品脚本是一个任务的奖励物品,双击它可在玩家身上进行一系列的操作--添加一定数目的金钱或者是Fame值等等。

[ITEMDEF i_task_award]
ID = 012ab //该物品是卡片的外形
NAME=The Award Tarot //名字
TYPE= T_SCRIPT //类型为自定义
value =500 //出售给npc的价值
CATEGORY=Jarry Task //Axis的类定义描述
SUBSECTION=Task Items //Axis的分类定义描述
DESCRIPTION=Tarot //Axis中的名字

ON=@Create
COLOR=065 //颜色定义
TIMER =10000 //timer值,创建后开始自动倒计时

ON=@click //双击触发,99l版本以后为ON=@USERCLICK
SRC.SAYU “任务奖励物品,请在规定时间内双击领取奖品” //玩家头上显示的中文信息
RETURN 1 //不再显示物品名字,默认为单击显示物品名字

ON=@Dclick //双击触发,99l版本以后为ON=@USERDCLICK
REMOVE //删除此物品
IF <SRC.FAME> <8000 //判断双击人的Fame值是否小于8000
SRC.FAME= <SRC.FAME> + 2000 //如果小于8000则,在该值基础上加2000点
SRC.SYSMESSAGE “Your fame is: <src.fame>” //显示系统提示信息
ENDIF //结束Fame值的判断IF语句
SRC.NEWITEM = I_GOLD //双击人添加一个新物品为I_GOLD(钱)
SRC.ACT.AMOUNT = 2000 //设置钱的数量为2000 golds
SRC.ACT.BOUNCE //弹起,放到双击人包中
SRC.SAY “Wow! 2000 Gold coins and such fames” //双击人头上显示惊喜信息
RETURN 1 //结束返回1

ON=@TIMER //当timer值从10000倒计时到0触发,相当于玩家没有双击
REMOVE //删除此物品
RETURN 1 //结束返回1

大家看,sphere的脚本是不是很有趣又很简单啊?简单的是,任何物品的脚本只要把它的基本参数变量设置为您想要的值就可以了。有趣的是你可以让它具备任何您想要它具备的功能。
再来看一下一个屠龙剑的部分脚本定义:
[ITEMDEF I_Task_DragonSword]
NAME=Dragon Slayer Sword
ID=i_sword_long //长剑的外形
TYPE=13 //类型是武器
DAM=15,30 //该武器的攻击伤害值范围
RESOURCES=40 i_ingot_iron,20 i_ingot_gold,40 i_reag_dragon_blood
SKILLMAKE=Blacksmithing 110.0,TINKERING 110.0,MAGERY 80.0,t_tinker_tools
SKILL=Swordsmanship //使用它需要的技能是剑术
TWOHANDS=N //是否要两只手来拿它
REQSTR=80 //需要的STR值
WEIGHT=4 //重量,该值越小,武器的挥动速度就越快
CATEGORY=POD task
SUBSECTION=TASK common
DESCRIPTION=Dragon Slayer

ON=@Create
ATTR=04 //不掉的新人属性
HITPOINTS={200 310}
COLOR=0494
MORE2={15 20} //初始化一个more2变量的值

ON=@EQUIP //装备的时候触发
IF (<SRC.SWORDSMANSHIP> > 79.9)&&(<SRC.TACTICS> > 79.9)&&(<SRC.HEALING> > 79.9)
//如果剑术大于79.9并且战术大于79.9,同时Healing技能也大于79.9的时候,符合条件
SRC.EFFECT 3,i_fx_BLESS_EFFECT,6,15,1 //装备者身上产生魔法效果
RETURN 0 //动作继续
ELSE //否则
SRC.SAYU “您不具备装备屠龙之剑的能力.” //装备者头上显示提示信息
SRC.EFFECT 3,0374a,6,15,1 //产生魔法效果
REMOVE //删除这把剑
RETURN 1 //结束返回1
ENDIF 结束IF判断语句

ON=@Damage //当伤害的时候触发
SRC.DAMAGE <MORE2> //伤害值等于MORE2的值
RETURN 1

同样您可以在任何物品上添加任何您想要的一些效果,触发条件指令,属性,外形等等信息,这些信息来自于sphere规定的一些参数语句,可以参考前面教程七和教程十三。
怎么样?我说的没有错吧!物品的脚本是非常简单的一种类型脚本。
至于一些物品的特殊more和tdata以及more1 more2 morex morey等等值代表不同物品的不同意义,以后会归纳总结上来。

[脚本教程之四]Sphere的脚本分类介绍

Aha,今天终于可以接触到令人激动和兴奋的脚本编写了,记得我刚学习写脚本的时候接触的是TUS脚本,学习脚本的动机是上网费用太高,自己要建设一个单机版的“免费的服务器”。不过在后来我不能不承认,写脚本也是我爱上UO的一个方面,因为你学会了写脚本后,就会发现这个游戏的设计是有多么的伟大!
   我看过很多很多的关于脚本编写介绍的网站,大多是这样的一些模式……以各种资料收集为主、以具体的脚本讲解为主、以零散的编写经验为主等等,无论是英文的还是中文的网站,反正到现在让我可以从头到尾都能学习编写UO脚本的网站还没有看到。国内的大部分脚本资料直接照搬照抄老外的一些帖子,加入自己的讲解也是少得可怜。不过同样要感谢他们的辛苦努力和付出。在贴整理这些资料前我先声明,我绝对不是那些所谓的“脚本高手”之列的,我只是把自己所看到的,所理解的整理出来给大家一起分享,一起学习,一起提高。
   其实SPHERE的脚本写作和许多编程语言一样,只不过比那些面向过程或对象的语言比如C、C++、Pascal、Basic更为简单些、“专业化”些,和那些可视化的编程语言比起来就更是大大的不同了。任何语言的编写内容都不外乎那么几个:定义变量、给变量赋值、运用这些变量和循环、判断组成一个个函数和事件,再把这些函数和事件相互组合成为一个可以让机器识别并认知运行的程序,所有原本由机器告知你要作的事情,经过你的设计变成了你让机器去如何作,展现在机器使用者前面一个什么样的环境
SPHERE脚本的一些风格和模式,它不同于其他程序设计语言,但是有太多的相似之处,为了更有效的全面认识SPHERE脚本,我们可以把他的脚本分为几大类,分别为:
1、Item Scripts
物品定义脚本 :比如我们的武器、盔甲、矿物、装饰物品等等
例如下面这段代码是一个衣服袖子物品的定义:
[ITEMDEF i_ranger_sleeves]
DEFNAME=i_ranger_sleeves
NAME=studded ranger sleeves
ID=i_studded_sleeves
TYPE=T_ARMOR
RESOURCES=10 i_hides_cut
WEIGHT=8
ARMOR=16
REQSTR=25
CATEGORY=Rares
SUBSECTION=Armor
DESCRIPTION= Ranger Armor Sleeves
SKILLMAKE=TAILORING 100.0, t_sewing_kit
RESOURCES2=8 i_hide,3 i_ingot_iron
ON=@Create
HITPOINTS={36 44}
COLOR=0593
2、NPC Scripts
非玩家角色脚本:NPC即None Player Character,这个词源自于MUD游戏,就是由电脑程序控制的角色,比如我们在UO里面看到的牛、羊、马和鸟类骑宠(动物NPC);在城里的售货的店员(店员NPC);地城里面龙族、怪物(怪物NPC)等等
例如下面这段代码是一个系统自代脚本中怪物NPC的定义:
[CHARDEF 01085]
DEFNAME=c_h_witch_high
NAME=#NAMES_HUMANFEMALE the High Witch
ID=C_WOMAN
CAN=MT_EQUIP|MT_USEHANDS|MT_WALK|MT_FEMALE
DAM=15,20
ARMOR=15,20

TSPEECH=spk_human_prime
TSPEECH=spk_human_default

ON=@Create
COLOR=0599
STR={90 110}
DEX={81 95}
INT={80 100}

MAGICRESISTANCE={90.0 95.0}
TACTICS={80.0 90.0}
WRESTLING={40.0 55.0}
MACEFIGHTING={75.0 95.0}
MAGERY={75.0 95.0}
NPC=BRAIN_HUMAN

KARMA={-3000 -5000}
FAME={2000 4000}

ITEMNEWBIE=i_hair_long
COLOR=color_gray_dk

ON=@NPCRestock
ITEM=i_dress_plain
COLOR=1
ITEM=i_hat_wizards
COLOR=1
ITEM=i_boots_calf
COLOR=1
ITEM=random_potion
ITEM=random_potion
ITEM=i_reag_BATWING
ITEM=i_reag_BATWING
ITEM=i_reag_eye_of_newt,{ 1 5 }
ITEM=I_STAFF_BLACK
ITEM=i_gold,{100 200}

CATEGORY=Civilized
SUBSECTION=Witches (Evil)
DESCRIPTION=High Witch
3、Function Scripts
函数脚本:函数脚本的编写会有效的减少你的代码重复冗余,我们可以把一些常用的功能和语句,放到一个函数定义里面,调用的时候只需要给出这个函数以及它们所需要的变量就可以了。还比如我们装备一套甲需要先把背包打开,然后从头到脚依次双击,但如果我们把这些动作设计成函数的话,那么我们只要在游戏中输入这个函数的名字(就是命令),那么就可以一次性完成这些个动作。
下面这段代码就是自动将一个物品放在背包里面的命令函数:

[FUNCTION put]
src.newitem=<args>
src.act.bounce
return 1

在spheretables.scp文件里面加上这个函数名:
[PLEVE 4]
put

4、Event Scripts
触发事件脚本:触发事件即一种交互式的编程,他首先有编译程序定义一些触发的事件(也可以由自己来编写这些触发事件),当某种于定义条件满足了这个触发条件,则开始执行其下面的代码。这个触发和函数一样,有一些是由系统自带的,有一些是要自己编写的,比如怪物NPC的AI(智能性)设计。
例如下面这段代码是怪物NPC的一个自动驱魔AI设计:
[EVENTS e_Dispel_Human]
ON=@GetHit
if ( <src.flags>&statf_conjured )
if rand(2) = 1
SAY An Ort
Src.SpellEffect s_dispel,1000
endif
endif

5、Dialog Scripts
对话框及菜单脚本:为了能让玩家或程序使用者所接触到的画面更为人性化和舒适一些,程序设计者们常常在对话框、菜单的界面和功能编写上煞费苦心,比如我们在游戏中输入”ALT+K”,可以打开技能菜单(MENU),”ALT+O”可以打开系统的带有属性页标签的配置对话框等等。还比如在jarry的玩家,单击NPC,就可以弹出来一个命令快捷菜单,这些都是输于本类的程序设计。
下面的例子是一个传送的菜单定义:
[DIALOG d_TEST_TELEPORT]
40,40
resizepic 0 0 5054 420 370
gumppictiled 10 10 400 60 82
gumppictiled 10 80 400 280 82
CheckerTrans 10 10 400 350
button 60 90 4006 4007 1 0 1
button 60 130 4006 4007 1 0 2
button 60 170 4006 4007 1 0 3
button 60 210 4006 4007 1 0 4
button 60 250 4006 4007 1 0 5
button 60 290 4009 4010 1 0 6
gumppic 340 90 10830
gumppic 340 130 10830
gumppic 340 170 10830
gumppic 340 210 10830
gumppic 340 250 10830
gumppic 340 290 10830
text 105 30 72 0
text 110 90 1152 1
text 110 130 1152 2
text 110 170 1152 3
text 110 210 1152 4
text 110 250 1152 5
text 110 290 1152 6

[DIALOG d_TEST_TELEPORT BUTTON]
ON=0
return 1
ON=1
SRC.GO britain
return 1
ON=2
SRC.GO jail
return 1
ON=3
SRC.GO cove
return 1
ON=4
SRC.GO minoc
return 1
ON=5
SRC.GO vesper
return 1
ON=6
SRC.GO 1415,1520,13
return 1

[DIALOG d_TEST_TELEPORT text]
脚本学习传送系统之传送菜单例子
传送位置一
传送位置二
传送位置三
传送位置四
传送位置五
传送位置六

6、Misc. Scripts
其他类的一些脚本:这类的脚本更为游戏化一些,比如地图和城市的定义、一些系统BUG的修复、魔法的定义、技能设置、技能相关选项、服务器登陆选项、一些特色的系统编写(如种族系统、城市系统、耕种系统)等等我们把这些都归纳到这一类里面,看起来有些比较复杂和混乱。
下面的例子是一个地图区域和房间的定义
[ROOM Watch Gates]
P=5311,3972,57
RECT=5308,3944,5313,4038
RECT=5273,4054,5297,4060
RECT=5199,3945,5221,3950
CLASS=12
FLAGS=0180
GROUP=Delucia
[AREA Trinsic Jail]
P=1851,2773
RECT=1838,2754,1863,2776
CLASS=51
FLAGS=06c9f
GROUP=Jails

7、Multis & Web scripts
一些房屋和主页的相关设计脚本:比如如何用第三方程序设计系统的房屋和新式建筑外形、物品和世界的固定、主页相关显示游戏中的变量编程等等。
下面例子是一个灯塔的代码:
6 version
0 template id
-1 item version
29 num components
6864 2 1 0 0
6863 -1 -3 0 0
6855 -1 0 0 0
6858 -1 -1 0 0
6860 0 -2 0 0
6862 -2 -3 0 0
6859 -1 -2 0 0
6861 -2 -2 0 0
6852 -1 1 0 0
6849 -2 0 0 0
6846 -2 -1 0 0
6844 -3 -3 0 0
6845 -3 -2 0 0
6835 1 -3 0 0
6838 0 -3 0 0
6843 -3 -4 0 0
6842 -2 -4 0 0
6841 -1 -4 0 0
6829 2 -2 0 0
6832 1 -2 0 0
6828 3 -2 0 0
6825 3 1 0 0
6823 2 2 0 0
6826 3 0 0 0
6822 1 2 0 0
6824 3 2 0 0
6827 3 -1 0 0
6821 0 2 0 0
6820 -1 2 0 0

8、Type scripts
类型脚本定义:这是一个应用非常多的一个类型的脚本,但遗憾的是我所见到的BBS或主页上除了介绍Sphere v.55i脚本里面自代的185个类型含义外,几乎没有把他单独辟出一类来的,或许这类脚本真的是太简单?类,在编程语言中来自于面向对象的C++,每个类都会有自己的相同特点,如果某个变量或物品输于这个类,那么它将具备这个类的所有特点。灵活运用这个类的定义,你会发现这是一个非常有趣和有意义的事情。
下面例子是一个陷阱踏板的类型定义,任何可以行走的物品具备了这个类型,都变成了陷阱和机关:
[TYPEDEF T_trap_floor]
ON=@STEP
IF <src.npc>
return 0
ENDIF
IF <src.isgm>
return 0
ENDIF
IF <SRC.HITS> >30
SRC.DAMAGE={10 30}
SRC.Anim 20
SRC.Bark 3
ELSE
SRC.HITS=0
ENDIF
return 1

怎么样?看到这里是不是对sphere的脚本充满了兴趣?通过上面的讲解,相信您对sphere的脚本有了一个全面的认识。我们以后的内容就是围绕着这几类的脚本进行一起研究学习,但在学习这些脚本的同时,我们必须具备也就是我下一个帖子要描述的内容
“语法”,和所有编程语言一样,sphere的脚本语言同样具备它的一些规则,只有把这些基本的规则和语法掌握透彻,你才能在编程的时候做到游刃有余。

[脚本教程之十八]其他脚本如类型、模板等编写讲解

[十八]其他脚本如类型、模板等编写讲解
终于到这一节了,这一节里面,我会将所有的sphere的脚本类型一一列出,不包括前面所讲解的一些特殊脚本(物品、NPCs、函数、事件)等等。
(一)类型脚本(TYPE)
我没有仔细研究过RunUo的系统,C#对于那些普通的热爱UO的人来说无疑是一座大山,我当初只是粗略的看了一下,不过就我个人而言,从脚本的开放性和功能的设计上是非常有创意和伟大的。一个好的编程环境不仅仅在于他有多强的功能,而是更于他的易用性和创造性。
类型好似C++中的类的概念,比如”车”这个类,可以有很多形式,轿车、火车、卡车、自行车等等,它们有一个共同的特点就是是交通工具,只是速度不同,外形不同而已,而TYPE和这个概念相似,加入一个物品具备了同样一个TYPE,它就会具备这个类型所有的特征,并可以派生出若干个不同的应用形式。
Sphere认为以[TYPEDEF T_xxxx]开始的部分到下一个有效定义标记之间的部分为一个类型定义,TYPE可以是一系列的触发和判断语句的组合。
我们下面定义一个陷阱类型,只要具备了这个类型的地板或者其他物品,就会达到我们所给它定义的一些特征,比如走上去,可以杀死角色等等。
[TYPEDEF T_Custom_trapFloor] //类型名字
ON=@STEP //经过触发
if <src.npc> //如果是NPC就结束返回0
return 0
endif //结束判断
if <src.isgm> //如果是GM也结束返回0
return 0
endif //结束判断
IF <SRC.HITS> >30 //如果角色的hits值(血)大于30
SRC.DAMAGE={10 30} //伤害角色的值在10-30这个范围中
SRC.Anim 20 //角色作一个被伤害的动作
SRC.Bark 3 //角色伤害后发出痛苦的叫声
ELSE //否则,指hits小于30
SRC.HITS=0 //直接设置hits=0,等于杀死了角色
ENDIF //结束IF判断

这样,你就可以用命令或者脚本设置任意一个地板类的物品的type值为上面这个type了
比如:
.STATIC 049b
.SET TYPE T_CUSTOM_TRAPFLOOR
然后你走上去看看,前提是要关掉gm和无敌哦。。。
很简单的一个脚本,你也可以写得更复杂一些,当然看你自己的创意了。

(二)loot模板定义(TEMPLATE)
这个是一个经常用到的一类脚本,它也可以通过add命令来添加出来,主要用于NPC的尸体上可以loot到的物品或者店员NPC的销售的物品,我们看两个例子:
Sphere将[TEMPLATE XXXX]开头的到下一个有效定义之间的部分当作是模板的定义脚本
一个补鞋匠的销售清单:

[TEMPLATE 102108] //模板头部定义
DEFNAME=VENDOR_S_COBBLER //102108和这个名字相同意义
CATEGORY=Vendor Templates //AXIS里面的显示类别
SUBSECTION=Sell Templates
DESCRIPTION=Cobbler //AXIS里面显示的描述
SELL=i_sandals,{2 12} //物品i_sandals,数量是2-12个
SELL=i_boots_thigh,{2 6}
SELL=i_shoes_plain,{2 6}
SELL=i_boots_calf,{2 6}

一个Poor Backpack的loot物品内容:

[TEMPLATE 101505]
DEFNAME=backpack_poor
CATEGORY=Item Templates
SUBSECTION=Loot Templates
DESCRIPTION=Poor Backpack
CONTAINER=i_backpack //容器为一个小包,下面所有物品都在这个包内
ITEM={ random_food 1 0 3 },{ 1 3 } //随机食物,1-3个
ITEM={ random_bottle 1 0 8 }
ITEM={ random_light 1 0 8 }
ITEM={ random_male_tops 1 0 4 }
COLOR=colors_all
ITEM={ random_male_pants 1 0 4 }
COLOR=colors_all
ITEM=POOR_GOLD_PILE

(三)谈话内容脚本(SPEECH)
想不想你的NPC能听懂你设计的语言呢?OK,当然没有问题,你只要定义一个SPEECH名字,然后在NPC的定义里面用TSPEECH=spk_xxx来引用就可以了。
看下面一段例子:

[SPEECH spk_AllPlayers] //这个是默认的所有玩家都能被下面的语句触发
ON=home home home //当玩家说home home home的时候,鬼魂?
if <statf> & STATF_DEAD //如果状态是鬼魂
go 1485,1611,20 //传送到Britain医院
src.fix //fix一下修正一下z坐标
endif //结束判断

ON=I must consider my sins //语言内容
sysmessage “You have <KILLS> Murder counts” //显示你有几个kills
Return 1 //结束返回1

好来我们定义一个SPEECH
[SPEECH spk_kiss]
ON=Kiss //角色听到kiss这个词
SRC.EMOTE See Fairy make a kiss on your face //角色头上显示一个红色的emote
sayu “<SRC.NAME>,你真勇敢,太感谢您了” //NPC说的内容
RETURN 1 //结束返回1

再定义一个PL的NPC,最好是MM
[CHARDEF C_Test_kiss]
NAME=#NAMES_HUMANFEMALE Fairy
ID=C_WOMAN
CAN=MT_WALK|MT_RUN|MT_USEHANDS|MT_EQUIP
DAM=100,120
ARMOR=100
TSPEECH=spk_human_prime
TSPEECH=spk_human_default
CATEGORY=Custom Npcs
SUBSECTION=Boss NPCs
DESCRIPTION=Fairy
ON=@Create
SPEECH +spk_kiss //sphere99l用这种方式引用,否则存盘后npc将听不懂你的话了:)
NPC=brain_human
COLOR=083f3
STR={1061 1575}
DEX={666 980}
INT={151 168}
PARRYING={115.0 138.0}
SWORDSMANSHIP={115.0 138.0}
WRESTLING={115.0 138.0}
TACTICS={115.0 138.0}
ITEMNEWBIE=i_hair_long
COLOR=colors_hair

在游戏里面.ADDNPC C_test_KISS,然后对她说”kiss“试试看。hoho

(四)魔法定义(spell)

[Spell 1] //魔法序号,定义的头部
DEFNAME=s_Clumsy //1=S_Clumsy
NAME=Clumsy //魔法的名字
SOUND=snd_SPELL_CLUMSY //魔法释放时候的声音
RUNES=UJ //咒语
RESOURCES=i_reag_blood_moss,i_reag_nightshade //施展该魔法需要的药材
RUNE_ITEM=i_rune_CLUMSY //魔法图符
SCROLL_ITEM=i_scroll_CLUMSY //魔法卷轴
FLAGS=SPELLFLAG_TARG_CHAR | SPELLFLAG_DIR_ANIM | SPELLFLAG_HARM |SPELLFLAG_FX_TARG | SPELLFLAG_RESIST //魔法效果标记
EFFECT_ID=i_fx_curse //魔法效果
EFFECT=3,15 //效果影响的程度,一般魔法的伤害值在这里调节
DURATION=36.0,120.0 //魔法作用的时间
MANAUSE=4 //施展魔法耗费几点mana
CAST_TIME=1.5 //魔法施展的时间
SKILLREQ=MAGERY 10.0 //施展魔法需要多少点技能

(五)技能定义(skill)

[SKILL 1] //技能定义头部,开始部分
DEFNAME=SKILL_ANATOMY //1=SKILL_ANATOMY
KEY=Anatomy //名字
TITLE=Scholar //该技能的头衔称呼
PROMPT_MSG=Whom shall I examine? //使用技能时候的提示信息

DELAY=3.0,1.0 //使用技能的间隔时间
ADV_RATE=2.5,50.0,200.0 //技能提升的速度

BONUS_STATS=50
BONUS_STR=0
BONUS_DEX=0
BONUS_INT=100

STAT_STR=15
STAT_INT=70
STAT_DEX=15

ON=@Fail SRC.MESSAGE You can’t think of anything about this creature //失败时候的信息

(六)技能制造物品时候的菜单定义(skill menu)

其实这个应该放在DIALOG一节来讲解,可是我写那个的时候把它给忘了,:(
不管了,我们来看一个抄写技能的菜单定义:

[SKILLMENU sm_inscription] //菜单名字
// dclick on blank scroll //系统内定的双击一个空卷轴的时候触发这个菜单
Spell Circles //显示的名字
ON=i_spell_circle_1 //选择第一环的时候
SKILLMENU=sm_inscrip_1 //调用第一环的抄写菜单
ON=i_spell_circle_2 //选择第二环的时候
SKILLMENU=sm_inscrip_2
ON=i_spell_circle_3
SKILLMENU=sm_inscrip_3
ON=i_spell_circle_4
SKILLMENU=sm_inscrip_4
ON=i_spell_circle_5
SKILLMENU=sm_inscrip_5
ON=i_spell_circle_6
SKILLMENU=sm_inscrip_6
ON=i_spell_circle_7
SKILLMENU=sm_inscrip_7
ON=i_spell_circle_8
SKILLMENU=sm_inscrip_8
ON=i_spellbook //选择一个魔法书的时候
SKILLMENU=sm_inscription_Runebook //调用魔法书抄写菜单

[SKILLMENU sm_inscrip_1] //第一环魔法抄写菜单
Spell Circle 1 //显示的名字

ON=i_rune_clumsy //选择了这个魔法图符
TESTIF=<cancast s_clumsy> //如果能够施展这个魔法
MAKEITEM=i_scroll_clumsy //制造一个魔法卷轴

(七)资源的定义(REGION RESOURCE)
你的服务器建立以后是不是挖不到矿,然后又砍不了树、钓不到鱼啊?那是因为你的资源没有定义或者定义了,没有在地图定义里面引用。

[REGIONRESOURCE mr_fish1] //资源名字的定义
SKILL=1.0,100.0 //挖掘它需要的技能
AMOUNT=9,30 //数量
REAPAMOUNT=1,3
REAP=i_fish_big_1 //该资源所具备的物品的ID
REGEN=60*60*10

[REGIONTYPE r_spooky_rock t_rock] //资源的分配类型定义
RESOURCES=60.0 mr_nothing //资源出现的几率
RESOURCES=30.0 mr_iron
RESOURCES=5.0 mr_shadow
RESOURCES=0.1 mr_egg
ON=@ENTER //进入具备这个资源类型的地区时候
SRC.MIDILIST=midi_Approach //播放音乐
ON=@CLIPERIODIC //环境影响的时候触发
SRC.MIDILIST=midi_Approach

(八)地图的定义(MAP)
看看下面的例子:

[AREA Skara Brae Field] //地区的定义,地区名字是Skara Brae Field
P=814,2164 //如果go 这个地区名字的时候,到达的坐标
RECT=796,2152,832,2176 //该地区的范围
FLAGS=region_flag_nobuilding //标记,这里是不能建筑房屋
GROUP=Skara Brae
RESOURCES=r_newbie_rock, r_water, r_newbie_tree, r_default_grass

//引用资源这些资源就是REGIONTYPE的名字。

[ROOM House] //房间定义
P=812,2192
RECT=807,2183,817,2201
RECT=817,2191,824,2201
FLAGS=region_flag_nobuilding|region_flag_guarded
CLASS=8
GROUP=Skara Brae //定义组

再来看一个传送的定义,为什么我们go一个地点会有一阵烟,而进出地城的洞口时候却没有,这个区别就在这里:
1424,1675=3647,2517=tp_Britian_to_haven=1
//开始坐标是1424,1675,走上去就会传送到3647,2517

这里需要记住的是,地图定义的更改以及资源定义的更改,每次刷新脚本的时候需要重新启动服务器才行。

(九)新人物品的定义(NEWBIE)
想让你的服务器上,新人一登陆就可以拥有很多物品么?那么修改这类定义吧:

[NEWBIE MALE_DEFAULT] //定义的头部
ITEMNEWBIE=i_shirt_plain //新人属性的物品
COLOR=colors_all //颜色
ITEMNEWBIE=random_pants
COLOR=colors_neutral
ITEMNEWBIE=random_shoes
COLOR=colors_neutral
ITEMNEWBIE=i_dagger
ITEMNEWBIE=i_candle
ITEMNEWBIE=i_book_sm
ITEMNEWBIE=i_gold,500

(十)名字序列的定义(NAME)
如果不想你所定义的npc都叫一个名字就定义这个吧:
在NPC定义中可以这样引用:
NAME=#NAMES_RATMAN Fairy

[NAMES NAMES_RATMAN] //定义的头部
205
Ccketakiki
Chachak
Chachaktak
Chackuk
Chak
Chaki
Chakreki
Chaktuki
Chakukki
Charitiki
Chatuki
Chectik
Chek
Chekeckaki
Cheki
Chekkakii
Cherek
Chetak //以上为名字的序列

(十一)其他脚本的定义(Other)

[HELP ACTION] //帮助信息定义
Performs the selected (#) skill based action.
.line
Privilege(s):
GM, Councilor
.line
Syntax:
.ACTION #

[SCROLL SCROLL_MOTD] // 提示信息的定义,下面是登陆时候的提示
Welcome to SphereServer!
A lot of effort went into bringing you this new version. We hope you love it.
If you need help check out the readme in the docs folder. If that doesn’t solve your problem, ask on the forums at http://www.sphereserver.com/ or join us on irc.sphereserver.com in channel #sphereserver.

[BOOK b_OrcGrammar 2] //一些书的内容信息的定义
of Britannia –
The Orcish tongue
may fall unpleasingly
‘pon the ear, yet it
has within it a
complex grammar oft

[脚本教程之十六]如何编写Function函数的脚本

[十六]如何编写FUNCTION函数的脚本
终于光荣出狱了(没有了PL的护士MM的眷顾,多少有些失落)!开始我们的下面的教程吧,接下来的教程应该是这样的顺序“函数脚本”、“菜单脚本”、“其他脚本如模板、房屋等”、“特殊变量介绍”、“脚本编写技巧”等等。
我出院后的第一个新闻就是听说伟大的pmouse结婚并且暂时辞职去度蜜月去了,哎呀,好难过而且好痛恨的说,因为从他身上我学过和积累了好多好多知识,子曰:三人行,必有我师焉,诚哉斯言!他可不能离开我们,否则那可是UO界一大悲哀和损失,更何况他那个蓝蓝MM我还没有来得及认识。。。。
OK,不废话罗嗦了,开始我们的这一课吧:
函数(FUNCTION)这个如果你学过编程语言的话,应该不难理解,记得我学Delphi的时候,关于函数和过程的说明是这样的:过程是没有返回值的例程,而函数是可以返回值的例程,当然Sphere的函数没有那么复杂,但原理大概差不多。
举个简单的例子,你在UO中设置一个热键:
F1
say An Ex Por
say open my bank
say guards
这样一个热键按下去,你会连续说出这三句话,而F1可以代表你一次操作就可以完成这个过程,而F1就可以理解成这个过程的名字。
函数就是这样一些过程语句的组合,只不过能够在结束后返回一个特定值,假如你在UO中输入一个”.where”这个命令,一定会在头上出现你的所在位置的信息,这个where我们称之为命令,实际上,我们可以通过定义一个函数来实现它的功能,而这个函数名字就叫where。where这类的命令函数在sphere内核中就已经定义过。
合理的使用函数可以让你的脚本可读性变得非常好,最重要的是可以做到有效节省避免代码重复造成资源浪费。我们可以通过调用一个函数的名字,从而达到轻松完成一个需要多语句才可以实现的功能。sphere认为[FUNCTION 函数名]这个语句是一个函数的头部,也就是定义的开始,直到下一个有效定义标记结束,sphere认为这段之间是一个函数的定义和内容。
看一个例子代码:
[Function makeCutCloth] //定义函数名为makecutcloth的函数
src.newitem 01766 //添加一个代码为01766的物品
SRC.ACT.P=<SRC.P> //该物品的P值(位置)和src(源)的位置相同
IF (<ARGN>>0) //如果输入的值大于0
SRC.ACT.AMOUNT=<ARGN> //该物品的数量等于argn值
ENDIF //结束IF判断
src.act.bounce //物品弹起
SRC.ACT.CONT=<SRC.UID> //设置该物品的容器为源的UID
这样我们调用这个函数可以有这样两种方法:
1、脚本中调用
src.makecutcloth 200
2、画面命令行调用
makecutcloth 200
得到的效果是一样的,即添加200个ID为01766的这个物品。
下面我们作一个付钱的函数,做过脚本的人都知道,当从玩家包里面收钱的时候,经常不能收取超过65536的golds,如果要实现这个功能,往往需要写好多句脚本,我们可以作这样一个函数,只要输入一个函数名字paygold xxx(xxx为数量),就可以自动从玩家包里面或者银行里面支付指定数目的金钱。

[FUNCTION paygold] // FUNCTION函数头部定义,名字为paygold
IF !(<args>) //如果只输入paygold,后面不跟数量
return 1 //结束函数返回1,什么都不作
ENDIF //结束IF判断

var.enough=0 //定义一个变量enough,如果没有足够的钱该值为0
var.totalgold=<SRC.FINDLAYER.21.rescount i_gold> + <SRC.FINDLAYER.29.rescount i_gold>

//定义一个变量totalgold,该值是玩家的包内和银行里面的钱的总和

IF (<eval <args>> > <var.totalgold>) //如果函数后面输入的值超过了这个变量值

ELSE //否则,代表总钱数够
var.enough=1 //设置enough变量值为1
IF (<eval <args>> <= <SRC.FINDLAYER.29.rescount i_gold>)
//如果该值小于等于银行里面的钱的总数
goldtopack <args> //调用函数goldtopack,详见下面的该函数的定义
ELSE
goldtopackall //否则调用函数goldtopackall
ENDIF //结束IF判断
payamount <args> //调用函数payamount函数

ENDIF //结束IF判断

[FUNCTION goldtopackall]
//定义函数名字为goldtopackall的函数,这个函数的功能是把银行里面的钱移动到背包中
IF (<SRC.FINDLAYER.29.findid.i_gold.uid>) //如果发现银行中有钱

SRC.FINDLAYER.29.findid.i_gold.cont=<SRC.FINDLAYER.21.uid> //就移动到包中
goldtopackall //调用函数goldtopackall

ENDIF // 结束IF判断

[FUNCTION goldtopack] //定义函数goldtopack
var.counter=<eval <args>> // 定义变量counter,代表将付的钱值
var.found=(<var.counter> – <SRC.FINDLAYER.29.findid.i_gold.amount>)
//定义变量found,该变量值为要付款的数量减去银行里面的每堆钱的数量
IF (<var.found> > 0) //如果变量found大于0,代表可以付款

SRC.FINDLAYER.29.findid.i_gold.cont=<SRC.FINDLAYER.21.uid> //移动钱从bank到背包中
goldtopack <var.found> //判断下一堆钱

ELSE //否则,变量found小于等于0

var.left=(0 – <var.found>) //定义变量left

IF (<var.left>) //如果left为1
SRC.FINDLAYER.29.findid.i_gold.amount <var.left> //设置left值,即数量
ELSE //否则left非1
SRC.FINDLAYER.29.findid.i_gold.remove //删除钱
ENDIF //结束IF判断

SRC.newitem i_gold //创建一个gold
SRC.act.amount <args> //数量等于需要的数量
SRC.act.cont=<SRC.FINDLAYER.21.uid>

ENDIF

[FUNCTION payamount] //定义函数名为payamount的函数

var.counter=<eval <args>> //定义变量counter等于输入的函数参数

IF (<var.counter> > 65000) // 如果counter的值超过65000
SRC.consume 65000 i_gold //收取65000个gold
var.counter=(<var.counter> – 65000) //减去65000
payamount <var.counter> //继续
ELSE
SRC.consume <args> i_gold //收取需要的数量的gold
ENDIF //结束IF判断

调用这个函数的时候,就可以用这样的方法:

ON=@UserDClick //双击触发
SRC.paygold 7000000 //调用函数paygold 700万golds
IF (<var.enough>) //如果enough值为1,代表已经付清款
SRC.NEWITEM=i_deed_evil_compound //添加一个恶魔城堡的契约
SRC.act.bounce //弹起放到包内
ELSE
SRC.SYSMESSAGE You do not have enough money for that. //否则提示钱不够
ENDIF //结束IF判断

怎么样?函数的脚本是不是很有趣啊?你也来编写一个函数试试看吧!

它会让你的程序和脚本非常简介有效方便。函数的定义可以放到任何一个非特定脚本文件中,建议你建立一个新的文件名字,比如叫作sphere_custom_functions.scp,里面放一些你自己编写的函数脚本,这样你就可以在任何一个脚本中调用和使用这些函数了。别忘了在文件最后要加上[EOF]文件结束标志。。。

[脚本教程之七]最新Sphere物品变量详细列表[55i]

三、物品变量(Item Variables)
(1)AMOUNT
变量类型:整型(Integer)
功能描述: 物品的数量
(2)ARMOR
变量类型:整型(Integer)
功能描述: 如果物品的类型被设置为T_ARMOR, 这个值将决定这个物品将会具备的防御等级,这不是一个绝对的值,而是一个相对的值。根据角色装备的不同部位,这个物品将给予这个值基础上的一个百分比,装备一套完整的这个物品后,实际防御值则为这个完整装备armor总值的一个百分比数。

(3)ATTR
变量类型:十六进制(Hexmask)
功能描述: 物品的属性值,合法值内容及列表如下:
attr_identified00001// 物品被鉴定过
attr_decay00002// timer值到0就消失
attr_newbie00004// 新人属性,不掉
attr_move_always00008// 可变动的,可移动的不会消失的
attr_move_never00010// 不可变动的,不可移动的,不会消失
attr_magic00020// 具备魔法属性物品
attr_owned00040// 城镇里面固有物品,不会消失和被偷
attr_invis00080// 隐形物品
attr_cursed00100 // 被诅咒过的物品
attr_cursed200200// 被邪恶的诅咒过的
attr_blessed00400 // 被祝福过的
attr_blessed200800// 被神圣的祝福过的
attr_forsale01000// NPC销售物品
attr_stolen02000// 被偷窃过 m_uidLink = previous owner.
attr_can_decay04000// 可以正常腐烂消失的物品
attr_static08000// 世界固化静态物品,不能被适用

(4)BASEID
变量类型:字符型(String)
功能描述:物品的DEFNAME参数值,如果物品没有这个项则和ID参数值同

(5)CATEGORY
变量类型:字符型(String)
功能描述: Axis里面的物品种类名

(6)COLOR
变量类型:十六进制数(Hexadecimal)
功能描述: 物品的颜色,详细调色定义在客户端的hue.mul里面

(7)DAM
变量类型:十进制数(Decimal)
功能描述: 如果一个物品具备了武器类型,则这个变量表示该武器的攻击伤害值范围

(8)DEFNAME
变量类型:字符型(String)
功能描述: 添加一个物品的标示,等同于51a以前的物品编号,便于记忆和规范

(9)DESCRIPTION
变量类型:字符型(String)
功能描述: Axis里面的物品的描述

(10)DISPID
变量类型:字符型(String)
功能描述: 一个物品被使用时候的实际ID(物理图形)

(11)DISPIDDEC
变量类型:整型(Integer)
功能描述: DISPID参数的十进制数表示

(12)DUPE
变量类型:字符型(String)
功能描述: 复制一个或多个物品,使复制品和原始物品的ID完全相同,一般可以这样使用: DUPE <integer>,来复制添加的钱或者其他物品,后面的整型数不能大于199,否则会让服务器crash 。

(13)DUPELIST
变量类型:字符串(String Array)
功能描述:当物品被使用FLIP命令后进行转向后将会变成什么

(14)DYE
变量类型:布尔型(Boolean)
功能描述: 物品是否可以染色

(15)FLIP
变量类型:布尔型(Boolean)
功能描述: 物品是否可以被翻转

(16)HITPOINTS
变量类型:整型(Integer)
功能描述:当物品被设置为盔甲或盾牌等装备物品时,这个变量表示该物品在被打破之前可以被击中后损害的次数;如果物品是武器的类型,则表示物品在被打破前可以击中目标多少次。

(17)HOME
功能描述:同角色的变量HOME

(18)ID
变量类型:字符型(String)
功能描述:在脚本ITEMDEF里面的一个物品的ID名字

(19)INSTANCES
变量类型:整型(Integer)
功能描述:这类物品在世界里面有多少数量

(20)LAYER
变量类型:整型(Integer)
功能描述:物品被装备的时候放在的位置Layer号,合法的取值如下:
layer_hand11 //右手(武器)
layer_hand22 //左手(盾牌)
layer_shoes3 //足部位穿戴
layer_pants4 //短裤类
layer_shirt5 //衬衫内衣
layer_helm6 //头盔
layer_gloves7 //手套
layer_ring8 //手指(戒指)
layer_light9 //装备火把或蜡烛(ITEMID_LIGHT_SRC)
layer_collar10 //护喉或护颈
layer_hair11 //头发
layer_half_apron 12 //围裙
layer_chest13 //胸部
layer_wrist14 //手镯或腕部
layer_hidden15 //未知
layer_beard16 //胡须
layer_tunic17 //束腰外衣或者大围裙
layer_ears18 //耳环饰品
layer_arms19 //臂部
layer_cape20 //披风类
layer_pack21 //背包(ITEMID_BACKPACK)
layer_robe22 //长袍
layer_skirt23 //衬衫或长裙(skirt or kilt)
layer_legs24 //大腿部 0x18 = plate legs

// 下列层号所表示物品或部位不能象上面24个那样可以显示在纸人框中:
layer_horse25 //坐骑类
layer_vendor_stock26 //店员NPC重新进货后卖给角色时候会用到
layer_vendor_extra27 //店员NPC不需要进货而是卖给角色时候会用到
layer_vendor_buys28 //店员NPC从玩家处买进但不能卖
layer_bankbox29 //角色银行

//系统内部使用的layers – 不会发送数据给客户端
layer_special30//多种类型的memory物品
layer_dragging31 //玩家拖曳的物品

//魔法作用标记,32以后的LAYER没有开放使用,但在以后的55i/99l版本中可能会出现
LAYER_SPELL_STATS32 // Stats effecting spell
//LAYER_SPELL_Reactive, // 33 =
//LAYER_SPELL_Night_Sight,
//LAYER_SPELL_Protection,
//LAYER_SPELL_Incognito,
//LAYER_SPELL_Magic_Reflect,
//LAYER_SPELL_Paralyze, //麻痹石化效果
//LAYER_SPELL_Invis,
//LAYER_SPELL_Polymorph,
//LAYER_SPELL_Summon, //魔法召唤
//LAYER_FLAG_Poison,
//LAYER_FLAG_Criminal, //罪犯或杀人犯
//LAYER_FLAG_Potion, //一些魔法类型使用了中毒效果,不能被驱散
//LAYER_FLAG_SpiritSpeak,
//LAYER_FLAG_Wool, //毛的再生?regrowing wool.
//LAYER_FLAG_Drunk, //喝酒的效果? Booze effect.
//LAYER_FLAG_ClientLinger,
//LAYER_FLAG_Hallucination,//shrooms etc.
//LAYER_FLAG_PotionUsed, //track the time till we can use a potion again.
//LAYER_FLAG_Stuck, // In a trap or web.
layer_flag_murders52 //玩家的杀人数和杀人标记消失的时间
layer_flag_bandage53 //绷带用于治疗

(21)LINK
变量类型:十六进制数(Hexadecimal)
功能描述:一个物品或角色的UID的连接关联属性,更多的时候,如物品使用门的属性,可以把一个物品和它作个连接,当双击的时候会自动激活另外一个物品

(22)MORE, MORE1, more1h, more1l, MORE2, more2h, more2l, MOREM, MOREP, MOREX, MOREY, MOREZ
功能描述:特殊变量,以后会专门介绍

(23)NAME
变量类型:字符型(String)
功能描述:物品的名字,当单击的时候会显示这个名字

(24)P
变量类型:整数序列(Integer Array)
功能描述:物品的位置,格式:P=X,Y,Z

(25)RESOURCES
变量类型:字符串(String Array)
功能描述:表示制作物品所需要的物品资源的数量和名字,在sphereitemx.scp文件中可以见到好多这样的应用,如:
RESOURCES=3 i_ingot_iron,1 i_cloth

(26)RESOURCES2 / RESOURCES3
变量类型:字符串(String Array)
功能描述:和RESOURCES类似功能

(27)REQSTR
变量类型:整型(Integer)
功能描述:装备该物品所必须要的STR值

(28)SERIAL
变量类型:十六进制数(Hexadecimal)
功能描述:物品在创建的时候自动添加的一个唯一的用以标识的序列号

(29)SKILLMAKE
使用格式: SKILLMAKE=
例如: SKILLMAKE=tinkering 56.7, blacksmithing 12.8, t_sewing_kit
功能描述:制作物品所需要的技能点数和必须的技能物品

(30)SUBSECTION
变量类型:字符型(String)
功能描述:用于在Axis里面显示该物品的类目

(31)TDATA1, TDATA2, TDATA3, TDATA4
功能描述:以后会专门介绍

(32)TIMER
变量类型:整型(Integer)
功能描述:标识物品消失腐烂的时间,当倒计时到0的时候,物品就会自动消失,如果设置为-1,则永远不会消失,但当时间出现溢出的时候,服务器会出现报错,避免这个问题,在@TIMER一段后面加上一句return 1

(33)TIMERD
变量类型:整型(Integer)
功能描述: 这个变量就类似一个计时器,但值得注意的是只能用在TIMERS计时开始,以及当物品在地上的时候。

(34)TWOHANDS
变量类型:布尔类型(Boolean)
功能描述:装备该物品是否需要两只手

(35)TYPE
变量类型:字符型(String)
功能描述:物品具备的类型,合法类型值如下:
t_normal0 //普通物品
t_container1 //不锁的容器或尸体
t_container_locked2 //锁住的容器
t_door3 //未锁的门
t_door_locked4 //锁住的门
t_key5 //钥匙
t_light_lit6 //发光体已经发光
t_light_out7 //可以被照亮
t_food8 //可以吃的食物
t_food_raw9 //生的食物
t_armor10 //盔甲类
t_weapon_mace_smith11 //锤类在锻造的时候使用
t_weapon_mace_sharp12 //战斗斧类物品,可以砍树
t_weapon_sword13 //剑类物品,可以砍树
t_weapon_fence14 //刺枪类物品,可以砍树(可以用于制造火柴类)
t_weapon_bow15 //弓弩类
t_wand16 //法杖类
t_telepad17 //传送类
t_switch18 //开关类可以被双击触发
t_book19 //可以读的书,里面的文字可以是动态或静态的
t_rune20 //符石类可以重新命名
t_booze21 //酒类
t_potion22 //魔法药水
t_fire23 //具备烧伤能力的火类
t_clock24 //时钟类或表类
t_trap25 //陷阱类
t_trap_active26 //动态陷阱类
t_musical27 //乐器类
t_spell28 //魔法效果类
t_gem29 //宝石类
t_water30 //水类,可以钓鱼
t_clothing31 //服装衣服类
t_scroll32 //魔法卷轴类
t_carpentry33 //木匠工具类
t_spawn_char34 //NPC重生点类,必须是隐形的
t_game_piece35 //不能从游戏中移除的组合物品类
t_portculis36 //可以改变Z坐标的门类
t_figurine37 //具备魔法外形的当激活的时候可以生成生物
t_shrine38 //复活类,可以复活角色
t_moongate39 //月门类
t_chair40 //椅类,可以坐
t_forge41 //铁匠熔炉类
t_ore42 //矿石类
t_log43 //木类,可以作家具
t_tree44 //树类,可以被砍
t_rock45 //矿区,可以被挖到矿
t_carpentry_chop46 //木匠工具
t_multi47 //房子和船类
t_reagent48 //药品类
t_ship49 //船类
t_ship_plank50 //船板
t_ship_side51 //跳板
t_ship_side_locked52 //被锁的跳板
t_ship_tiller53 //舵手
t_eq_trade_window54 //交易窗口
t_fish55 //鱼类
t_sign_gump56 //墓碑或标记类
t_stone_guild57 //工会石头
t_anim_active58 //动态物品
t_advance_gate59 //动态门m_AdvanceGateType = CREID_TYPE
t_cloth60 //用于纺布类
t_hair61 //头发类
t_beard62 //胡须类
t_ingot63 //矿类
t_coin64 //金币类
t_crops65 //再生类植物,可以被收割
t_drink66 //饮料类酒类
t_anvil67 //铁砧用于修补
t_port_locked68 //必须被触发的吊闸门
t_spawn_item69 //物品再生点
t_telescope70 //大的望远镜
t_bed71 //床类
t_gold72 //黄金类
t_map73 //地图类
t_eq_memory_obj74 //角色的memory类物品可以link一些目标
t_weapon_mace_staff75 //棒类物品
t_eq_horse76 //坐骑类
t_comm_crystal77 //通信水晶类
t_game_board78 //碎片容器
t_trash_can79 //垃圾桶
t_cannon_muzzle80 //炮筒
t_cannon81 //大炮的其他部分
t_cannon_ball82 //炮弹
t_armor_leather83 //皮革类
t_seed84 //种子
t_junk85 //垃圾
t_crystal_ball86 //水晶球

//t_old_cashiers_check 87 //数量巨大的现金描述

t_message88 //用户可以用来留言的信息板
t_reagent_raw89 //生长的药材
t_eq_client_linger90 //暂时改变玩家为NPC
t_dream_gate91 //让你转移到另外一个服务器
t_it_stone92 //双击可以得到物品
t_metronome93 //节拍器
t_explosion94 //爆炸类
t_eq_npc_script95 //关于NPC脚本的书 (在 m_Events事件下去除?)
t_web96 //经过后会变成另外物品,如蜘蛛网
t_grass97 //可以放牧动物的草地
t_arock98 //石块或焦石,可以被投掷的
t_tracker99 //指向连接的物品
t_sound100 //声源
t_stone_town101 //城镇石,每个人可以自由加入
t_weapon_mace_crook102 //鞭类
t_weapon_mace_pick103 //镐类
t_leather104 //皮革类,不能被穿戴
t_ship_other105 //船的其他部分
t_bboard106 //公告板
t_spellbook107 //魔法书
t_corpse108 //物品的特殊类型,尸体
t_track_item109 //追踪物品的ID外形
t_track_char110 //追踪一个角色或者角色ID的范围
t_weapon_arrow111 //箭
t_weapon_bolt112 //箭干
t_eq_vendor_box113 //店员NPC存货箱
t_eq_bank_box114 //银行箱
t_deed115 //契约
t_loom116 //织布机
t_bee_hive117 //蜂巢
t_archery_butte118 //箭靶子
t_eq_murder_count119 //杀人数的标记
t_eq_stuck120 //蜘蛛网
t_trap_inactive121 //一个安全的机关
t_stone_room122 //石头类型房屋
t_bandage123 //绷带
t_campfire124 //篝火
t_map_blank125 //空的地图
t_spy_glass126 //月相镜,双击的时候会给出当前的相位
t_sextant127 //六分仪
t_scroll_blank128 //空卷轴
t_fruit129 //果实
t_water_wash130 //没有鱼的水域
t_weapon_axe131 //斧类
t_weapon_xbow132 //弩类
t_spellicon133 //魔法图标
t_door_open134 //打开的门
t_meat_raw135 //生肉
t_garbage136 //垃圾
t_keyring137 //钥匙环
t_table138 //桌子
t_floor139 //地板
t_roof140 //房顶
t_feather141 //鸟的羽毛
t_wool142 //羊毛
t_fur143 //毛皮
t_blood144 //血
t_foliage145 //树叶
t_grain146 //谷类
t_scissors147 //剪刀
t_thread148 //线
t_yarn149 //纺线
t_spinwheel150 //纺毛成线的纺车
t_bandage_blood151 //脏的绷带,不能补血
t_fish_pole152 //鱼杆
t_shaft153 //箭干
t_lockpick154 //撬锁工具
t_kindling155 //碎木屑
t_train_dummy156 //练习人偶
t_train_pickpocket157 //练习偷窃的人偶
t_bedroll158 //床
t_bellows159 //风箱
t_hide160 //兽皮
t_cloth_bolt161 //布料
t_board162 //平板
t_pitcher163 //水罐
t_pitcher_empty164 //空罐
t_dye_vat165 //染缸
t_dye166 //燃料
t_potion_empty167 //空瓶
t_mortar168 //磨药樽
t_hair_dye169 //染发水
t_sewing_kit170 //裁缝工具
t_tinker_tools171 //补锅工具
t_wall172 //墙类建筑
t_window173 //窗类建筑
t_cotton174 //棉花
t_bone175 //骨
t_eq_script176 //抽象memory对像
t_ship_hold177 //舵
t_ship_hold_lock178 //锁住的舵
t_lava179 //熔岩
t_shield180 //盾
t_jewelry181 //珠宝
t_dirt182 //泥土,可以培植物品
t_script183 //自定义
t_eq_message184 //信息memory对像
t_shovel185 //铁铲

(36)UID
变量类型:十六进制数(Hexadecimal)
功能描述:请参看SERIAL变量

(37)value
变量类型:整型(Integer)
功能描述:代表该物品被NPC买卖的时候的价格

(38)WEIGHT
变量类型:整型(Integer)
功能描述: 物品的重量

[脚本教程之八]最新Sphere服务器变量详细列表[55i]

这些变量大部分在SPHERE.INI文件中使用到,有些作为命令在控制台和命令行中多次用到
真正在脚本程序中用的比较少。
四、服务器变量(Server Variables)
这些变量在游戏中也可以使用,就象和在控制台上使用一样
(1)ACCOUNTS
变量类型:整型(Integer)
变量描述: 当前服务器总的帐号连接数。
(2)ADMIN
变量类型:字符型(String)
功能描述:ADMINEMAIL的简单格式

(4)ADMINEMAIL
格式: SERV.ADMINEMAIL
例如(在游戏中使用):
.xshow SERV.ADMINEMAIL
.SERV.ADMINEMAIL=admin@email.com
例如(在控制台使用):
show ADMINEMAIL
ADMINEMAIL=admin@email.com
功能描述:返回SPHERE.INI中的关于Admin的EMAIL设置内容

(5)ALLCLIENTS
见命令解释

(6)ALLOCS
变量类型:整型(Integer)
功能描述:不详

(7)BLOCKIP
命令格式: SERV.BLOCKIP …
例如: SERV.BLOCKIP 192.250.250.251
功能描述: 锁定指定的IP列表

(8)CLIENTS
变量类型:整型(Integer)
功能描述:服务器当前连接的客户端数

(9)CLIENTSAVG
变量类型:整型(Integer)
功能描述: 服务器平均连线人数。

(10)DECAYTIMER
变量类型:整型(Integer)
功能描述:在sphere.ini中定义的物品放在地上消失或腐烂的时间

(11)EMAILLINK
变量类型:字符型(String)
功能描述:Administrator的E-Mail地址,在HTML里面的连接变量

(12)FILES
变量类型:字符型(String)
功能描述:在SPHERE.INI里面定义的MUL文件的路径

(13)GUILDS
变量类型:整型(Integer)
功能描述:服务器的注册工会数

(14)IP
变量类型:整型(Integer)
功能描述:服务器的IP地址,在SPHERE.INI里面的变量

(15)ITEMS
变量类型:整型(Integer)
功能描述:服务器世界目前的所存在的物品总数

(16)LANG
变量类型:整型(Integer)
功能描述:服务器使用的语言

(17)NAME
变量类型:字符型(String)
功能描述:服务器的名字,在SPHERE.INI里面的变量

(18)PORT
变量类型:整型(Integer)
功能描述:服务器当前运行使用的端口

(19)RCLOCK
使用格式: SERV.RCLOCK
命令行例子: .show SERV.RCLOCK
脚本例子: <EVAL(<SERV.RCLOCK>)>
功能描述:和TIMEUP类似,服务器启动开始后的时间,数千秒

(20)REGEN0
变量类型:整型(Integer)
功能描述: SPHERE.INI里面的变量,定义玩家复活后的血恢复一点需要多少秒

(21)REGEN1
变量类型:整型(Integer)
功能描述:SPHERE.INI里面的变量,定义玩家复活后的MANA恢复一点需要多少秒

(22)REGEN2
变量类型:整型(Integer)
功能描述:SPHERE.INI里面的变量,定义玩家复活后的STAM恢复一点需要多少秒

(23)REGEN3
变量类型:整型(Integer)
功能描述:SPHERE.INI里面的变量,定义玩家食物恢复一点需要多少秒

(24)RTIME
使用格式: SERV.RTIME
例如: .show SERV.RTIME
功能描述:显示服务器当前的时间和日期格式:2001/10/30 02:09:57

(25)RTIMETEXT
使用格式: SERV.RTIME
例如: .show SERV.RTIME
功能描述: 显示服务器当前的时间和日期: 2001/10/30 02:09:57和RTIME完全一样

(26)SAVECOUNT
使用格式: SAVECOUNT
例如: .show SERV.SAVECOUNT
功能描述:到下一次世界存盘剩余秒数

(27)STATACCOUNTS
变量类型:整型(Integer)
功能描述:类似ACCOUNTS

(28)STATCLIENTS
变量类型:整型(Integer)
功能描述:类似CLIENTS?

(29)STATGUILDS
变量类型:整型(Integer)
功能描述:类似GUILDS?

(30)STATITEMS
变量类型:整型(Integer)
功能描述:类似ITEMS?

(31)STATNPCS
变量类型:整型(Integer)
功能描述:世界里面的NPCs的数量

(32)TIME
使用格式: SERV.TIME
例子: .show SERV.TIME
功能描述:服务器已运行的秒数。这个变量存在sphereworld.scp和spherechars.scp中

(33)TIMEUP
使用格式: SERV.TIMEUP
例子: .show SERV.TIMEUP
功能描述:服务器上一次启动到现在运行的时间

(34)TIMEZONE
使用格式: SERV.TIMEZONE
例子: .show SERV.TIMEZONE
功能描述:显示服务器的所在时区

(35)URLLINK
变量类型:字符型(String)
功能描述: 服务器的主页WEB地址
By: Daleth

(36)VERSION
变量类型:整型(Integer)
功能描述:服务器的版本
By: Daleth

(37)WORLDSAVE
变量类型:字符型(String)
功能描述:服务器世界存盘路径

[脚本教程之九]最新Sphere环境变量详细列表[55i]

五、环境变量(Sector Variables)
(1)COLDCHANCE
命令格式: SECTOR.COLDCHANCE <integer>
例如: SECTOR.COLDCHANCE 50
功能描述: 设置64X64范围内的下雪机率,系统会存盘

(2)DRY
命令格式: SECTOR.DRY
功能描述: 将会打开或关闭雨雪天气在64X64的区域,保存在世界文件中

(3)LIGHT
命令格式: SECTOR.LIGHT <integer>
例如: SECTOR.LIGHT 30
功能描述:设置64X64区域的亮度,合法取值范围0-30,0 是最亮,30最黑,保存在世界文件中

(4)LOCALLIGHT
命令举例 .show LOCALLIGHT
脚本应用: <LOCALLIGHT>
功能描述:显示区域亮度等级

(5)LOCALTIME
命令举例: .show LOCALTIME
脚本应用: <LOCALTIME>
功能描述: 以字符形式显示游戏中某个地区的时间,在游戏中输入会返回一个时间信息上午或者下午的某某时间。

(6)LOCALTOD
命令举例: .show LOCALTOD
脚本应用: <LOCALTOD>
功能描述: 显示游戏中的某个地区的从0开始的分钟数,通过它可以计算出小时或者天数。

(7)RAIN
命令格式: SECTOR.RAIN
功能描述:在64X64地区开始下雨,会保存在世界文件中.

(8)RAINCHANCE
命令格式: SECTOR.RAINCHANCE <integer>
例如: SECTOR.RAINCHANCE 60
功能描述: 设置64X64区域的下雨的比率(100%),会保存在世界文件

(9)SNOW
命令格式: SECTOR.SNOW
功能描述:在64X64区域开始下雪,会保存在世界文件中。

[脚本教程之二十]脚本教程之终结篇

[二十]脚本教程之终结篇

让我们开始最后的教程吧:
我看过很多Sphere的脚本教程,有人从分析每个文件的语法开始,也有人从这个能力一些变量开始,自从我看过Sphere99Z这个版本,越发觉得MENACE的思路真是的非常之清晰,他的设计让这个游戏更加具有魅力。当然,万事万物,没有十全十美的,关键是要不懈努力和持之以恒。
对于一些字符处理方面的函数特殊用法,这里不再介绍,您可以参考一些例子和系统自带的脚本来琢磨,因为在Sphere的新版本中和旧版本中的差别比较大。

技巧一:快速查找
编写Sphere脚本的最好工具是UltraEdit-32这个编辑器,他可以帮你在瞬间搜索到你想要的内容,当你遇到不会写的脚本的时候,就打开”搜索”菜单-》”批量文件查找”-》查找栏中输入你想要查找的内容-》文件类型为*.scp-》目标目录选择scripts目录-》将搜索子目录打勾
这些操作看起来简单,但却是最常用到的功能,它可以帮你快速定位物品ID、角色ID、语句等等

技巧二:单机调试服务器
SPHERE99L版本不再可以再win98平台下调试,但经常会遇到这样的情况,就是如果网卡的状态标识物理状态无法链接,这样的时候你就无法顺利用client登陆你的sphere服务器,最方便的解决办法就是在网卡上插一根线,另外一头可以连接到其他PC网卡或者HUB、ADSL路由器上等等,这样就好了

技巧三:最好的脚本范本
经常在写脚本的时候,无法确定自己的脚本问题是否有效或者无法定位问题,这时候建议你经常翻看spheretest.scp这个文件,这里面几乎涵盖了70%的sphere脚本格式用法,你可以和这个上面的相关语句进行对照,来对比自己的编辑。

技巧四:让AXIS顺利读取所有物品
AXIS0.13a版本有个小问题,就是有的物品的定义无法读取到,其实你只要打开spheretables.scp文件,将里面的[RESOURCES]定义一节,所有设计到路径的脚本都指定完整盘符路径就行了。

技巧五:学会看Sphere的版本更新文件
Sphere每个版本更新都会有很多变化,想知道这些变化你就要留意sphere所带的那个SPHERESVR_REVISION.TXT文件了,几乎所有的变化,那里面都会有。

技巧六:哪里看SPHERE的全部语句函数或者参数?
从SPHERE99x版本以后,sphere会发布一些sphere99z_tables类的文件,这些文件的扩展名是.tbl,可以用UltraEdit-32打开,里面就是全部sphere的命令语句和参数了。

技巧七:一些常用判断语句
(一)判断目标是否是GM,或者NPC
if <src.isgm>
return 0
endif
if <src.npc>
return 1
endif
(二)判断是否在城里,即guard区
if (<src.region.flags> & 04000)
return 0
endif

如果判断其他地区,比如是否可以建房可以把04000该成080,具体可以查看region的flags。

(三)判断是否是鬼魂
IF <SRC.FLAGS>&02
RETURN 0
ENDIF

02是角色flags标记

(四)判断距离角色的距离
if <Distance> > 4
return 0
endif

(五)判断是否有足够的钱
IF <SRC.RESTEST 500 i_gold>
SRC.CONSUME 500 i_gold
ENDIF

前提是钱必须放在包内

(六)判断角色技能是否满足一定值
IF <SRC.TINKERING>>=60.0
return 1
endif
判断角色补锅技能是否大于等于60
if ( <eval <skilltotal>> >=6500 )
return 0
endif
判断角色总技能是否超过650

(七)对所有在线人操作
SERV.ALLCLIENTS IF <HITS>>2
SERV.ALLCLIENTS SAY Hello!
SERV.ALLCLIENTS ENDIF

(八)判断是否工会成员
IF (!<MEMORYFINDTYPE.memory_guild.UID>)
SYSMESSAGE You are not in a guild!
RETURN 1
ENDIF
(九)判断一个随机数是否等于某数
IF (<EVAL RAND(10)>==1)
say hello
ENDIF

先整理这么多吧,我是想到哪里就写哪里的,欢迎大家继续补充。

[脚本教程之三]设置sphere.ini的详细讲解

在编写脚本工作中,设置sphere.ini不算编程,只能算是其中的一项必不可少又非常重要
的设置参数工作,很多网站都介绍了sphere.ini的设置,但大多不是很详细,下面我们结合
sphere99l版本中的自带sphere.ini文件来详细介绍一下
在sphere脚本文件中”//”这个符号是表示注释,系统在读取到这个标记的时候,会认为
“//”以后均为注释或说明的内容,不予运行。
下面贴出sphere.ini的文件内容,重要的部分,我用中文注释一下:


//MENASOFT: SPHERE (公司名字及系统名称)
//All SPHERE script files and formats are copyright 1997-2001 Menasoft and Partners.(版权声明)
//
// values: (参数值)
// <string>表示的是一些文字字符内容
// <html>一个HTML标记
// <path>硬盘上一个合法的完整的路径信息
// <boolean>布尔变量0 (off, 假值, 否) 或者 1 (on,真值, 是)
// x, x1, etc一个整型数值
// <hex>一个十六进制
// %代表0-100
[SPHERE]
//#######################################################################
//# 基本Sphere信息
//#######################################################################
// 语句格式:SERVNAME=<string>
// 指定你的服务器名字,玩家们在登陆的时候将会看到它
// 主页接口参数也可以使用它

SERVNAME=New Server Name

// 语句格式:ADMINEMAIL=<string>
// 功能说明:administrator管理员的Email地址

ADMINEMAIL=your-email@here.com

// 语句格式:URL=<string>
// 功能说明:主页的网址

URL=www.sphereserver.com

// 语句格式:TIMEZONE=x
// 功能说明:时区设置 Greenwhich(格林威治), England(英格兰), UK
// x 取值范围-12 ~ +12 东部= 5. 西部= 6, 或其他的时间

TIMEZONE=5

//##############################################################
//# 系统配置
//##############################################################
// 语句格式:SERVIP=x1.x2.x3.x4
// 功能说明:这里永远设置为127.0.0.1. 如果你配置了一个并不能指向你这
// 台计算机的IP地址那么sphere将不能够绑定相关的端口

SERVIP=127.0.0.1

// 语句格式:SERVPORT=x
// 功能说明:服务器运行中的通讯端口号,几乎所有的SPHERE服务器的端口都是2593

SERVPORT=2593

// 语句格式:NTSERVICE=<boolean>
// 功能描述:指定服务器工作在NT4.0还是Windows 2000下面,在99L版本后加了一句
// 不能工作在WINDOWS 9X的操作系统上,建议不设置
// NTSERVICE=0

// 语句格式:CLIENTVERSION=<string>
// 功能描述:描述允许登陆到服务器的客户端版本号,不过好象没有什么用处
// 99L版本后加了句”SPHEREClient can ALWAYS log onto a SPHERE
// shard”……不限制版本?吓!
//CLIENTVERSION=1.26.01
//CLIENTVERSION=2.0.0.0

//############################################################
// # 文件系统设置
//############################################################
// 语句格式:WORLDSAVE=<path>
// 功能描述:世界文件存盘的路径,类似其他游戏的存档文件
// 包括了SPHEREWORLD.SCP和所有的备份文档
WORLDSAVE=c:\sphere\save

// 语句格式:SCPFILES=<path>
// 功能描述:你要运行的sphere脚本文件所在的完整路径
SCPFILES=c:\sphere\scripts\

//语句格式:SCPINBOXDIR=<path>
//功能描述:下面这个语句不知道什么意思这个路径将脚本引向何方?还是为
// 了哪个程序?Axis?
SCPINBOXDIR=c:\sphere\scripts\

// 语句格式:ACCTFILES=<path>
// 功能描述:服务器运行时读去的所有玩家账号文件所在完整的路径
ACCTFILES=c:\sphere\accounts\

// 语句格式:MULFILES=<path>
// 功能描述:UO客户端安装的完整路径,缺省的非T2A版本路径设置是C:\UO
// 缺省的T2A客户端路径是C:\Program Files\Ultima Online
// 缺省的LBR客户端路径是C:\Program Files\Ultima Online 2D
// 也就是mul文件所在目录
MULFILES=C:\Ultima Online\Raymond\

// 语句格式:LOG=<path>
// 功能描述:服务器运行日志文件所在路径
LOG=c:\sphere\logs\

//#########################################################
//# sphere列表参数
//##########################################################
//REGISTERFLAG=??

// 语句格式:REGPASS=<string>
//功能描述:登记到spheresvr.com网站服务器列表的密码,没有必要设
//REGPASS=

// 语句格式:REGISTERSERVER=<string>
// 功能描述:机器名字和网络名字的列表,同上
//REGISTERSERVER=menace.ne.mediaone.net

// 语句格式:NOTES=<string>
// 功能描述: 在sphere的注册列表上显示的介绍信息,也不需要设置
//NOTES=

// 语句格式:LANG=English
// 功能描述:服务器的基本语言
LANG=English

//########################################################
//# 游戏环境设置
//#########################################################
// 语句格式:LIGHTDAY=x
// 功能描述:在白天明亮度的等级,合法值范围:0-19, 0 = 最亮
// 19 = 最暗 (在T2A客户端,30=最黑)
LIGHTDAY=0

// 语句格式:LIGHTNIGHT=x
/// 功能描述:在夜晚明亮度的等级,合法值范围:0-19, 0 = 最亮
// 19 = 最暗 (在T2A客户端,30=最黑)
LIGHTNIGHT=19

// 语句格式:DUNGEONLIGHT=x
// 功能描述:在地牢里面明亮度的等级,合法值范围:0-19, 0 = 最亮
// 19 = 最暗 (在T2A客户端,30=最黑)
DUNGEONLIGHT=19

// 语句格式:GAMEMINUTELENGTH=x
// 功能描述:游戏中的一分钟相当于现实中的几秒
GAMEMINUTELENGTH=60

// 语句格式:ARRIVEDEPARTMSG=<boolean>
// 功能描述:关闭或打开玩家登陆或退出的信息提示
ARRIVEDEPARTMSG=1

// 语句格式:NOWEATHER=<boolean>
// 功能描述:打开或关闭天气效果
NOWEATHER=0

// 语句格式:CHARTAGS=<boolean>
// 功能描述:打开或关闭npc名字后是否显示[NPC]
CHARTAGS=0

// 语句格式:MOUNTHEIGHT=x
// 功能描述:设置玩家骑马的Z坐标高度,如果设置成20,则玩家骑在马上不能通过正
// 常的具有天花板的建筑物,如果设置为0,则不限制
MOUNTHEIGHT=0

//#############################################################
//#游戏中的物理参数设置
//#############################################################

// 语句格式:STAMINALOSSATWEIGHT=x
// 功能描述:这是一个设置精力stamina消失与人的负重weight的关系百分比
// 如果设置成200,将取消这个效果限制,如果设置成100则任何移动
// 一步都会让你的stamina值消失殆尽
STAMINALOSSATWEIGHT=70

// 语句格式:RUNNINGPENALTY=x
// 功能描述:当人在奔跑时,负重增加的百分比(缺省是50) (0是没有影响).
RUNNINGPENALTY=50

// 语句格式:BANKMAXITEMS=x
// 功能描述:玩家银行里面可以容纳的最大物品数目
BANKMAXITEMS=700

// 语句格式:BANKMAXWEIGHT=x
// 功能描述:玩家银行里面可以容纳的最大物品重量
BANKMAXWEIGHT=1000

// 语句格式:FLIPDROPPEDITEMS=<boolean>
// 功能描述:开启过关闭,在丢下物品的时候是否进行方向翻转
FLIPDROPPEDITEMS=0

// 语句格式:AUTONEWBIEKEYS=<boolean>
// 功能描述:如果设置成1(打开),则房屋和船的钥匙在创建时候自动具备不掉属性
AUTONEWBIEKEYS=1

PLAYERGHOSTSOUNDS=1

// 语句格式:CLIENTLINGER=x
// 功能描述:玩家离线后,角色在游戏中滞留的时间秒数
CLIENTLINGER=15

// 语句格式:HITPOINTPERCENTONREZ=%
// 功能描述:玩家复活后hits恢复的百分比

HITPOINTPERCENTONREZ=10
// 语句格式:MAXBASESKILL=<decimal>
// 功能描述:新人物建立时系统随机分配的最大技能点数
MAXBASESKILL=25.0

// 语句格式:REGEN1=x
// 功能描述:每恢复一点mana所需要的秒数
// REGEN1=30

// 语句格式:REGEN2=x
// 功能描述:每恢复一点stamina所需要的秒数
// REGEN2=10

// 语句格式:REGEN3=x
// 功能描述:食物点数再生需要的分钟数,缺省= 1*60*24 (1为现实生活中的一)
// REGEN3=1*60*24

//##############################################################
//# 游戏里面NPC的控制
//##############################################################

// 语句格式:VENDORMAXSELL=x
// 功能描述:NPC一次卖给任何一个人的最大物品数量
VENDORMAXSELL=300

// 语句格式:MONSTERFEAR=<boolean>
// 功能描述:打开或关闭一些NPC在受伤或者看到强劲对手时候是否逃跑
MONSTERFEAR=1

// 语句格式:MONSTERFIGHT=<boolean>
// 功能描述:打开和或关闭NPC是否攻击其同种类生物
MONSTERFIGHT=0

// 语句格式:NPCTRAINMAX=x
// 功能描述:NPC可传授玩家的最大技能数
NPCTRAINMAX=300

// 语句格式:NPCTRAINPERCENT=%
// 功能描述:NPC能传授给玩家他自己技能数的百分比,如果设置成20,那么
// 当NPC具备100点技能的时候,玩家只能从他身上学习到20点技能
NPCTRAINPERCENT=30

//############################################################
//#游戏中魔法参数设置
//#############################################################

// 语句格式:WOPPLAYER=<boolean>
// 功能描述:开启或关闭玩家施展魔法是否念咒语
WOPPLAYER=1

// 语句格式:WOPSTAFF=<boolean>
// 功能描述:开启或关闭游戏管理员们施展魔法是否念咒语(GM、Counselors、seer等)
WOPSTAFF=0

// 语句格式:REAGENTLOSSFAIL=<boolean>
// 功能描述:开启或关闭玩家施展魔法失败后是否浪费药材
REAGENTLOSSFAIL=1

// 语句格式:REAGENTSREQUIRED=<boolean>
// 功能描述:开启或关闭玩家施展魔法时候是否需要药材
REAGENTSREQUIRED=0

// 语句格式:EQUIPPEDCAST=<boolean>
// 功能描述:开启或关闭玩家施展魔法时候手里面是否可以装备武器
EQUIPPEDCAST=0

// 语句格式:MAGICUNLOCKDOOR=<decimal>
// 功能描述:这个设定是指开锁者的必须具备多少开锁技能点数才能够打开
// 用魔法”magic lock”锁定的门
MAGICUNLOCKDOOR=900

//########################################################
//#游戏中的物品腐烂时间设置
//#########################################################

// 语句格式:CORPSENPCDECAY=x
// 功能描述:NPC尸体的消失分钟数
CORPSENPCDECAY=10

// 语句格式:CORPSEPLAYERDECAY=x
// 功能描述:玩家尸体的消失分钟数
CORPSEPLAYERDECAY=15

// 语句格式:DECAYTIMER=x
// 功能描述:物品消失的分钟数
DECAYTIMER=30

//#############################################################
//#账号方式设定
//#############################################################
// 语句格式:ACCAPP=# 账号注册方式.
//0=不接受注册
//1=必须用Email注册
//2=自由注册,在线申请账号
//3=登陆者自动成为guest用户,并且系统自动发给他一个随机的新密码
//4=登陆者自动成为guest用户,直到Admin接受该用户
//5=指定清单
//6=未指定的
//7=主页申请账号,EMAIL答复
//8=主页申请账号并自动创建
ACCAPP=7

// 语句格式:REQUIREEMAIL=<boolean>
// 功能描述:不太了解,设定为1时,需要玩家设定一个Email地址
REQUIREEMAIL=0

// 语句格式:MINCHARDELETETIME=x
// 功能描述:玩家人物在创建后至少要多少分钟才能被删除,缺省=3*24*60
// (现实生活中的3天)
MINCHARDELETETIME=3*24*60

// 语句格式: MAXCHARSPERACCOUNT=x
// 功能描述:玩家一个账号能够创建的角色个数,合法值是1~5
MAXCHARSPERACCOUNT=5

// 语句格式:GUESTSMAX=x
// 功能描述:允许的最大guest用户账号数目
GUESTSMAX=5

// 语句格式:CLIENTMAX=x
// 功能描述:允许最多同时连入多少个客户端
CLIENTMAX=256

//LOCALIPADMIN=

//#########################################################
//#罪犯、名望、善恶和杀人系统设置
//#########################################################
// 语句格式:SNOOPCRIMINAL=x
// 功能描述:玩家偷看NPC或玩家包后被标记为罪犯的秒数
SNOOPCRIMINAL=300

// 语句格式:PLAYERNEUTRAL=x
// 功能描述:合法值是-10000~10000,标记当Karma低于多少的时候,被标记为罪犯
PLAYERNEUTRAL=-2000

// 语句格式:MURDERDECAYTIME=x
// 功能描述:在线多久才会减少1个杀人数,缺省=8*60*60 (8小时)
MURDERDECAYTIME=8*60*60

// 语句格式:MURDERMINCOUNT=x
// 功能描述: 玩家杀多少人以后被标记为杀人犯 murderer
MURDERMINCOUNT=5

// 语句格式:CRIMINALTIMER=x
// 功能描述:玩家被标记为罪犯criminal的时间多少分钟后取消该标记
CRIMINALTIMER=3

// 语句格式:GUARDLINGER=x
// 功能描述:guards被激活后,逗留原地多少分钟
GUARDLINGER=3

// 语句格式:GUARDSINSTANTKILL=<boolean>
// 功能描述:开启或关闭守卫一击必杀
GUARDSINSTANTKILL=1

// 语句格式:HELPINGCRIMINALSISACRIME=<boolean>
// 功能描述:当玩家有帮助一个PK/罪犯/neutral玩家的行为时候,是否标记为慷慨
// 的罪犯good criminal)
HELPINGCRIMINALSISACRIME=1

// 语句格式:LOOTINGISACRIME=<boolean>
// 功能描述:开启或关闭当玩家解剖蓝名尸体(或者非罪犯/good cirminal)时
// 候是否标记为罪犯 (non criminal/good)
LOOTINGISACRIME=1

//################################################################
//# 游戏存盘设置
//################################################################
// 语句格式:SAVEBACKGROUND=<boolean>
// 功能描述:是否开启后台存盘模式,当开启的时候,服务器将会自动在后台存盘
// 这样会减少lag,整个存盘过程中,服务器将不会停顿,但存盘文件在
// 服务器意外瘫痪后会丢失
SAVEBACKGROUND=0

// 语句格式:SAVEPERIOD=x
// 功能描述:服务器每隔多久存盘一次
SAVEPERIOD=60

// WRITENUMIDS=

// 语句格式:BACKUPLEVELS=x
// 功能描述:设置服务器世界文件和character角色文件的存盘等级,如果设置为7的
// 话将会保存49个backups
BACKUPLEVELS=3

//##############################################################
//# 登陆选项
//##############################################################
// 语句格式:VERBOSE=<boolean>
// 功能描述:详细信息显示开关,如果设置为1,则服务器控制台和logs文件里面将
// 显示更多的错误提示信息
VERBOSE=0

// 语句格式:LOGMASK=<hex>
// 功能描述:设置服务器将哪类信息放到log文件里面,这些选项包括:
// INIT0x0100启动信息
// SAVE0x0200世界存盘状态信息
// CLIENTS_LOG0x0400所有客户端的登陆和退出信息
// GM_PAGE0x0800玩家的page GM信息
// PLAYER_SPEAK0x1000所有玩家的谈话
// GM_CMDS0x2000所有GM的命令信息
// LOGMASK=03f00