那爱 发表于 2022-3-26 15:18:40

天晴魔域脚本程序员培训文档

本帖最后由 那爱 于 2022-3-26 15:57 编辑

第一节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 ‘%’ ;

如果要求显示全部字段则写为:
Select * from cq_user where name like ‘%’ ;

练习:
将cq_generator表中所有怪物类型(npctype)为900的记录找出来并按照id从大到小的顺序排列。


Select * from cq_generator where npctype = 900 order by id desc

二、删除语句(delete):
delete语句主要被用来删除符合条件的数据库记录

   delete from 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对白是什么样子的:


相应的action对应如下:

下面我们来一步一步看下具体每部分的作用:
(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处每个玩家每天可以领取一次龙珠。


任务统计: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 owneridmapid posx posylife base linkidtask0 task1 ... task7data0 data1 data2 data3 datastr"。至少9个参数。
注意:
创建出来的npc是动态npc,写入cq_dynanpc表(项目不同有所区别);
动态npc的data字段是可以进行赋值跟检测操作的;
动态npc不可移动,只能被创建删除

419405763 发表于 2022-6-13 09:44:37

这个可是好东西,存钱来买
页: [1]
查看完整版本: 天晴魔域脚本程序员培训文档