430 likes | 591 Views
任务部脚本程序培训. 第一节 SQL 常用数据库操作语言. 一、查询语句 (select) : Select 语句主要被用来对数据库进行查询并返回符合用户 查询标准的结果数据。 select column1 [, column2,etc] from tablename where condition; ( [ ] 表示可选项) 例如:查询 cq_user 表中所有 PM 号,只显示 id 跟 name 字段: Select id,name from cq_user where name like ‘ %[PM] ’ ; 如果要求显示全部字段则写为:
E N D
第一节 SQL常用数据库操作语言 • 一、查询语句(select): Select语句主要被用来对数据库进行查询并返回符合用户 查询标准的结果数据。 select column1 [, column2,etc] from tablename where condition; ([ ]表示可选项) • 例如:查询cq_user表中所有PM号,只显示id跟name字段: Select id,name from cq_user where name like ‘%[PM]’ ; 如果要求显示全部字段则写为: Select * from cq_user where name like ‘%[PM]’ ;
练习: • 将cq_generator表中所有怪物类型(npctype)为900的记录找出来并按照id从大到小的顺序排列。 • Select * from cq_generator where npctype = 900 order by id desc
二、删除语句(delete): • delete语句主要被用来删除符合条件的数据库记录 deletefrom tablename where condition; 例如:删除所有cq_action表中type为502的记录: Delete from cq_action where type=502; 练习: 将cq_itemtype表中,名字带“剑”字的物品全部删除。 Delete from cq_itemtype where name like ‘%剑%’;
三、插入语句(insert): • Insert插入语句主要是用于在数据库某一张表内插入新记录 insert into table_name(column1,column2,….) values (value1,value2,….); 例如:在cq_passway表中插入一条记录: Insert into cq_passway (id,mapid,passway_idx,passway_mapid,passway_mapportal) values (0013,1006,0000,1002,0005); 如果不需要匹配字段插入,上面一句可写为: Insert into cq_passway values (0013,1005,0000,1002,0005);
练习: • 往cq_task表的id,id_next,money,sex,team,metempsychosis字段中插入数值1000,1001,0,999,999,0 • Insert into cq_task (`id`,`id_next`,`money`,`sex`,`team`,`metempsychosis`) values (1000,1001,0,999,999,0);
四、更新语句(update): • Update语句主要用于更新一条数据库中已经存在的表记录的数据 update table_name set column1=XXX(,column2=XXX) where condition; 例如:将数据库cq_npc表中,所有type为2的npc,mapid都改成1000,lookface都改成1002 Update cq_npc set mapid=1000,lookface=1002 where type=2 练习:将数据库cq_itemtype表中所有名字带“剑”字,req_sex为1的物品,price改成0,weight改成0: Update cq_itemtype set weight=0,price=0 where name like ‘%剑%’ and req_sex=1;
以select语句为例,通常条件有如下几个: • 我们经常用的condition条件有以下几个: • Select * from cq_action where id=1000; • 查询cq_action表中id为1000的记录。 • Select * from cq_action where id=1000 or id=1002; • 查询cq_action表中id为1000或者id为1002的记录 • Select * from cq_action where id>1000 and id<1002; • 查询cq_action表中id大于1000并且小于1002的记录,返回值为1001。 • Select * from cq_action where id>=1000 and id<=1002; • 查询cq_action表中id大于等于1000并且小于等于1002的记录,返回1000,1001,1002三个值。 • Select * from cq_action where id in (1000,1005,2004); • 查询cq_action表中id在1000,1005,2004范围内的记录,返回1000,1005,2004。通常用于不连贯少量记录查询。 • Select * from cq_action where id like ‘100%’; • 查询cq_action表中id以100开头的记录。
第二节 基础actiontype讲解 • 我们先来看一下一段正常的npc对白是什么样子的:
下面我们来一步一步看下具体每部分的作用: • (1)101 // 菜单文本。data:显示行数(缺省为0), param=“text”(可选): 显示文本,此类型可包含空格,也可为空行。效果如下: • 一句101最多只能正常显示127字节内容,超出的部分会显示乱码,如下:
(2)102 //菜单超链接。"text task_id align": align(可选): 对齐模式(缺省/0:左对齐; 5:居中; 9:右对齐; a(1-9)b(2-8):不换行,从a/b行宽处开始显示,9为右对齐) 102参数中的空格前部分,程序默认为要显示的文字,空格后部分,程序默认为点击所执行的taskid 像征服这种的选项,不能超过8个,否则客户端会崩溃。
(3)103 // 菜单输入框。"len task_id text": len:可输入的长度;text(可选):显示的文字,align:对齐模式(缺省:文字在左,正整数:输入框嵌入在文字的第几字符处)。★说明:如有多个输入框,由界面用圆按钮区分,每次只上传一个。 • Len没有太大字数限制,适当就好 • Task_id为点击“答”后所执行的 taskid • “我只想”为text内容,可选,最多只能32字节 • 对齐模式暂不支持,一段对话只能显示一条103
(4)104 // 菜单图片。"x y pic_id task_id":task_id(可选):表示图片可以“按”。图片所在区域不显示文本。 • 如果不写104,则效果入下图:
(5)120 // 菜单创建。"cancel_task_id"(可选): 强行关闭菜单时触发的TASK。 • 每段对话都必须以120为结束,它代表的意义是创建了一个完整对话菜单。如果对话后不接120,则对话框无法出现,玩家看到的是就是任务中断或者NPC不对话。如下图的错误范例:
其它一些使对话框不显示对话的错误: • NPC开始的对话没有接相应的task,而是直接从action开始。 • 错误 • 正确 • Task所接的action_id和action不一致
(6)122 // 随机Action “action0 action1... action7”共8个,随机挑一个执行。 ●参数一定要写满8个,如果不够8个参数,可以重复id或者写0充数 (7)123// data为时间类型 0-检查当前服务器详细时间 "%d-%d-%d %d:%d %d-%d-%d %d:%d"; 1-检查年某天时间"%d-%d %d:%d %d-%d %d:%d", 2-检查月某天时间"%d %d:%d %d %d:%d", 3-检查周某天时间"%d %d:%d %d %d:%d", 4-检查日时间"%d:%d %d:%d", 5-检查小时时间"%d %d"(每个小时的第几分到底几分) 系统自动检测时间介绍: 用2030000—2030199(征服)(2000000—2000199魔域)这个范围的ID来做起始。系统会每分钟检测一次有没有处于这个ID段内的action,如果是检测时间,当返回的值为true时,系统便会执行规定时间内的任务 。
(8)201// 修改或检测任务NPC的属性。"attr opt data npc_id",至少3个参数。如果指定npc_id,该NPC必须在本地图组中。attr可选择"ownerid"(=,==)、"ownertype"(=,==)、"lookface"(=,==)、"data?"(=,+=,==,<,<=,>,>=. )、"datastr"(=,==)、"life"(=)、"maxlife"(=) • 该条只对dynanpc有效 • 征服中可以指定npcid
(9)301// 把npc移动到指定的地图、位置(仅用于固定NPC),data 为指定的npc的ID, param为 "idMap nPosX nPosY" 例子:insert into cq_action values (3513395,3513396,3513396,301,4408,’5000 47 90’); 注意:该语句只能用于固定npc的移动(固定npc指cq_npc表里面的记录),不能用于移动动态npc(动态npc指cq_dynanpc表里面的记录) 修改的npc的坐标不会修改数据库里面的坐标值,服务器重启后npc会回到原始坐标。
(10)、302 //判断指定地图中的用户人数 data 为指定地图ID, param为 “cmd opt data”,// cmd支持“map_user”和“alive_user”, opt可以为“==, <=, >=”,data为数量 ◆ data的mapid可以是mapid,也可以是dynamap的id,但不能进行取值数的填写,如%user_home_id. ◆map_user指的是地图上的总人数(包括鬼魂),alive_user指的是地图上活着的人,鬼魂除外
例如: • 玩家PK赛结束前去地图中的领奖npc处领奖,npc判断地图1000内是否只有一个玩家,如果是则给玩家奖励并且将玩家传送到地图1001,如果不是则提示玩家PK赛还没有结束。
(11)314 // 放焰火param不带参数。这条action放的是系统默认的普通焰火。 (12)315 //放文字焰火,文字信息在param中,最大不超过8个字节。 只支持四个汉字。
(13)501 // 添加物品。data=itemtype_id, param="amount amount_limit ident gem1 gem2 magic1 magic2 magic3 reduce_dmg add_life anti_monster color" • param可省略,所有缺省值为0(表示不修改) • data不能为0,若为0则执行失败,服务器产生log • 若要修改属性,则要将参数按顺序填写,但只需要改到哪个参数写到哪个参数为止。其中不修改的填0 • 例如:给玩家添加一件一洞极品的玄武神箍。 • INSERT INTO cq_action VALUES (7500185,0,0,501,112989,'0 0 0 255');
(14)502 // 删除物品。data=itemtype_id, 或者param为物品名 (15)503 // 检测物品。data=itemtype_id, 或者param为物品名
(16)506 // 删除多种物品, param为 "idType0 idType1 num",即删除num个idType0-idType1的物品。 (17)507 // 检测多种物品, param为 "idType0 idType1 num",即检测num个idType0-idType1的物品。
注意: “720001 720010 5”的解释: ①id不需要连贯; ②可以检测同一种物品是否有多个; ③前面一个id一定要比后面一个小
(18)801 // monster被杀死后掉物品或者钱, param "dropitem itemtype"或者"dropmoney money" • Insert into cq_monstertype values (0001,’叫天鸡’,0001,0104,33,00,0006,0005,0000,0000,0036,0000,0000,0000,0000,0001,0006,0000,1000,0500,0001,3,0006,0000,0000,7596900,0500,099,099,099,099,099,099,099,1000000,1001000,0000,0000,0000,0000,10000,01,0,0,100,0); • Insert into cq_action values (7596900,0,0,801,’dropitem 1088000’);
(19)= 1001 // 玩家属性的修改和检查。"attr opt data"。attr可选择 • “life”(+=,==,<)——玩家生命 • “mana”(+=,==,<)——玩家魔法 • “money”(+=,==,<)——玩家游戏币 • “e_money”(+=,==,<)——玩家魔石 • “exp”(+=,==,<)——玩家经验 • “pk”(+=,==,<)——玩家PK值 • “profession”(==, set, >=, <=)——玩家职业 • “level”、(+=,==,<)——玩家等级
(20)1002 // 将玩家的属性加满。"attr"。attr可选"life","mana" (21)1003 // 切地图 param "idMap nPosX nPosY bPrisonChk", bPrisonChk为可选参数,缺省不可以出监狱,设置为1可以出 (22)1004 // 存记录点 param "idMap nMapX nMapY"
(23)1010 // 向玩家发MSGTALK消息。param中为消息内容, data为频道 (24)125 // 全服务器广播文字消息,data为频道,para为内容 • 2002// 动作 • 2003// 队伍 • 2005// 系统 • 2007// 交谈 • 2011// GM频道 • 2105// 打开URL
(25)1025 // 婚姻检查, 已婚返回id_next,未婚返回id_nextfail (26)1026 // 性别检查, 男返回id_next,女返回id_nextfail
(27)1027 // 触发action的人物附加或删除指定特效 • param为“obj effect opt”, obj支持“self”, “couple”, “team”, effect为特效名称, opt支持“add”, “del“(省略) • INSERT INTO cq_action VALUES (7506851,7506860,0000,1027,0,’self firework-2love');
(28)1071 // 设置定时器,倒数记时完成后触发指定的ACTION, 参数为 "delay_time idAction", delay_time单位为秒 (29)126 // 设置定时器,倒数记时完成后触发指定的ACTION, 参数为 "delay_time idAction", delay_time单位为秒 • 注意: • 126是针对服务器的,一个服务器只能同时触发一条;1071是针对玩家的,每个玩家同时只能触发一条。 • 延时同时只能存在一个,如果在延时执行的时候再次触发延时,时间会被重置。
(30)任务统计:1073、1074、1080、1081(征服) • 1073 // 用户统计数据检测,param="stc(event,type) opt data", • // event是统计事件类型,type是统计数据类型, • // opt 支持 " >, >=, == ", data为整数值。 • 1074 // 用户统计数据设置,param="stc(event,type) opt data save",对任务编号进行操作的时候不会影响到stc表的时间,所以如果要对任务时间进行操作请一定用1080和1081来进行。 • // event是统计事件类型, • // type是统计数据类型, • // opt 支持 "+=, = ", • // data为整数值。 • // save为整数,如果不为 0 则存入数据库 • 1080 // 用户统计数据时间戳操作, param = "timestamp(event,type) opr data" • // event是统计事件类型, • // type是统计数据类型, • // opr 支持 "==, >, >=, +=, set", • // data为整数值。如果为0,且操作为(==, >, >=, set),则数据自动替换成当前时间(秒) • 1081 // 用户统计数据时间戳操作, param = "interval(event,type,sort) opr data" • // event是统计事件类型, • // type是统计数据类型, • // sort是时间间隔类型,0为秒,1为天(注意天间隔是决对时间,而不是真实时间差值) • // opr 支持 "==, >, >=", • // data为整数值
例子: 在npcA处每个玩家每天可以领取一次龙珠。例子: 在npcA处每个玩家每天可以领取一次龙珠。
任务统计:1080、1081、1082、1086(魔域) • 1080 //data:任务编号, • //param: 'new' (为创建新记录) • //'delete' (删除记录) • // 'isexit' (任务是否存在) • 1081 //data: 任务编号, 若data == -1 ,则下面的操作是针对 findnext 进行的 • //param: 'ope opt data', data(值) • // ope(phase) opt(>=, ==, +=,=) 对任务阶段操作 • //ope(completenum) opt(>=, ==, +=,=) 对任务完成次数操作 • // ope(begintime) opt(>=, ==, +=,=,reset) 对任务开始时间操作, 对于 += 时 以秒为参数;对于“>=,==,=”时以“yyyy-mm-dd hh:mm:ss”为格式。reset表示 将任务的开始时间设置为当前时间 • 1082 //data: 任务编号, • //param: ‘秒数’ , 当前时间与任务开始时间比较的action;若当前时间与任务的开始时间之差 大于 param ,则返回true.否则返回false • 1086 //data: 任务编号, • //param: ‘天数’, 当前时间与任务开始时间比较的action;若当前时间与任务的开始时间之差 大于 param ,则返回true.否则返回false
例子:在npcA处每个玩家每天可以领取20魔石。 在npcA处每个玩家每小时可以领取20魔石。
(31)2006 // 创建一个MONSTER。param="nOwnerType idOwner idMap nPosX nPosY idGen idType nData szName", 至少7个参数 • // nOwnerType; • // idOwner一般用替代变量设置, 为0时,不存盘; • // idType 为 MONSTER 类型,指向cq_monstertype表的id; • // idMap, nPosX, nPosY 为MONSTER生成的地点; • // generator用于控制怪物活动范围, 即设定基于出生点的范围,指向cq_generator表的id; • // name 为 MONSTER 名字, 如有 accept 则改名; • // nData 为匹配类型, 用于标识某些MONSTER
(32)2007 // 创建一个NPC。param="name type sort lookface ownertype ownerid mapid posx posy life base linkid task0 task1 ... task7 data0 data1 data2 data3 datastr"。至少9个参数。 • 注意: • 创建出来的npc是动态npc,写入cq_dynanpc表(项目不同有所区别); • 动态npc的data字段是可以进行赋值跟检测操作的; • 动态npc不可移动,只能被创建删除
本次内容到此结束 下次培训内容: • 数据库字段解释; • 如何写脚本; • 脚本编写注意事项。