[十八]其他脚本如类型、模板等编写讲解
终于到这一节了,这一节里面,我会将所有的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

留言
还没有留言,来坐个沙发吧。
留个言