资料作者:旅途
资料分享:小黑
天龙函数整理.lua
------------以下方法函数由旅途查询测试整理 由于引擎问题 可能不适用于所有端 请自行斟酌--------------
LuaFnSetXinFaLevel(sceneId,selfId,x901031_g_XinFaInfo[nMenPai+1][i],119) ---设置心法为119级 这里需要心法 心法可以参考下面的定义的
x901030_g_XinFaInfo = {
{1,2,3,4,5,6,55},
{7,8,9,10,11,12,56},
{13,14,15,16,17,18,57},
{19,20,21,22,23,24,58},
{25,26,27,28,29,30,59},
{31,32,33,34,35,36,60},
{37,38,39,40,41,42,61},
{43,44,45,46,47,48,62},
{49,50,51,52,53,54,63},
{0,0,0,0,0,0,0,0},
{64,65,66,67,68,69,70},
{81,82,83,84,85,86,87},
{64,65,66,67,68,69,70},
}
----这里可以使用for循环来设置1-7心法全部为119级
for i =1,7 do --循环1-7心法
LuaFnSetXinFaLevel(sceneId,selfId,x901031_g_XinFaInfo[nMenPai+1][i],119)
end
--***************************以下函数由旅途查询测试整理 由于引擎问题 可能不适用于所有端 不足和错的地方劳驾各位大佬纠正补充***********-----------------------------------
sceneId-----场景ID
selfId-----人物ID
targetId-----目标ID
GetName(sceneId,selfId); --- 人物的名字获取 后面是场景的ID 和人物的ID
GetLevel(sceneId,selfId); -----人物等级获取
GetMenPai(sceneId,selfId);----------获取当前门派的ID号
LuaFnJoinMenpai(sceneId,selfId,targetId,6) ----加入门派 6就是天龙 其中(少林","明教","丐帮","武当","峨眉","星宿","天龙","天山","逍遥","无门派","慕容","唐门","鬼谷","桃花岛) 从0开始的 9为无门派
GetSceneName(sceneId);----获取当前场景的名称
TryRecieveItem(sceneId,selfId,50321101,1)---------物品领取 50321101为物品的ID 1为领取一次 这里可以使用for循环获取多次 太多了会卡
ZengDian(sceneId,selfId,-1,1,10000) -- 绑元增加后面的这个1是增加的意思 最后是数量 2的话就是减去 ZengDian(sceneId,selfId,targetId,3,0); --3就是查询剩余绑定元宝数量
YuanBao(sceneId,selfId,-1,1,10000)-- 元宝同理和上面的绑元是一样的
GetMoney(sceneId,selfId) -----获取剩余金币---这里获取的到的数量为铜板的数量 金币需要*10000
AddMoney(sceneId,selfId,10000)--增加1金币 比例为10000铜板=1金币
LuaFnCostMoney(sceneId,selfId,1*10000) ----扣除金币 后面的*10000就是金币数量 不加的话就是铜板 意思就是如果单是1 就是扣除了一个铜板 *10000就是扣除了一个金币
CallScriptFunction( 888899, "BuyRet", sceneId, selfId, 2,1,999) ---这里是增加充值点数的 CALL就是调用脚本 更新数据 ()中的第一个参数为调用的目标的脚本号 第二个就是方法名字 后面的1为增加的具体的数量
LuaFnGetAvailableItemCount(sceneId, selfId, 10157001)--获取某个物品的数量
GetItemCount(sceneId,selfId,10157001)--获取某个物品的数量-----只从玩家的装备和物品包中查找---已经穿戴的装备可以获取到
GetMissionData(sceneId,selfId,XYJ_HONGLI)---获取当前红利
SetMissionData(sceneId,selfId,XYJ_HONGLI,GetMissionData(sceneId,selfId,XYJ_HONGLI)-100000) --扣除红利 减号后面为扣除的具体的数量 换成+ 就是增加 这里的XYJ_HONGLI就代表 全局变量中 这个常量的名字
AddSkill(sceneId,selfId,4609)-------学习技能 后面的4609为技能的编号具体去Public Config SkillTemplate_V1.txt查找 不能乱加 因为门派和心法数据对应不上 可以自己新加
LuaFnDelSkill(sceneId,selfId,4609) -----删除某一个技能 --暂时还没测试
LuaFnHaveImpactOfSpecificDataIndex(sceneId, selfId) ---查询BUFF 返回1就是有
LuaFnCancelSpecificImpact(sceneId,selfId) --删除BUFF
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfId,selfId,7524,0) ---增加BUFF 7524 为具体的 BUFF ID
GetMissionData(sceneId, selfId, MD_PET_HETI) ----附体状态查询 == 0 就是没有附体的状态
SetMissionData(sceneId, selfId, MD_PET_HETI, 0 ) ---设置附体状态分离
CallScriptFunction((400900),"TransferFunc",sceneId,selfId,723,160,193,10); ----这里是传送的()里面的第一个参数为脚本号,第二个为函数名 貌似用于验证任务 漕运 坐骑等状态下限制传送 723,160,193,10 723就是需要传送到的场景ID 160.193 就是坐标 10为限制的等级
RestoreHp( sceneId, selfId ) ------满血
RestoreMp( sceneId, selfId ) ------满气
RestoreRage( sceneId, selfId ) ------满怒
LuaFnDelAvailableItem(sceneId,selfId,10157001,1)--------删除物品 倒数第二个为物品ID 后面为物品数量
LuaFnGetMaterialBagSpace( sceneId, selfId) ---道具栏
LuaFnGetPropertyBagSpace( sceneId, selfId )----材料栏
LuaFnGetItemCountInBagPos( sceneId, selfId )---得到某一个格子中物品的数量
LuaFnGetMenPaiMaster( sceneId, selfId ) ---获取玩家当前所在门派的帮主名称
LuaFnGetWorldPos( sceneId, selfId )---得到当前角色的坐标返回x和z的FLOAT类型值
LuaFnIsTeamLeader( sceneId, selfId )---判当前玩家是否为队长 返回0 和1 0代表不是 1代表是
LuaFnGetSex(sceneId,selfId)----返回玩家性别 返回值 0 和 1 0为女 1为男
GetHp(sceneId,selfId)--获取到当前玩家的最大生命值
GetMp(sceneId,selfId)--获取到当前玩家的最大内力就是蓝
AddXinFa(sceneId,selfId,56)---给当前玩家某一个心法 56就是心法ID
DelXinFa(sceneId,selfId,56)----删除玩家的某一个心法
HaveItem(sceneId,selfId,10157002)----判断玩家是否拥有某一个道具 返回0和1 0表示没有 1表示有
HaveItemInBag(sceneId,selfId,10157001)----效果和返回值同上 --只检测包裹是否拥有这个道具 装备穿戴后查询不到 上面的那个穿戴后也可以查询到
LuaFnEraseItem(sceneId,selfId,0)---删除背包中某一个格子的道具 0为格子的编号 0开始 最大看你的背包的数量
LuaFnHasTeam(sceneId,selfId) ---判断当前玩家是否为组队状态 返回0和1 0是没有 1是正在组队
GetNearTeamCount(sceneId,selfId) ---获取当前玩家附近所有队友的个数(包括自己) 没有队伍则返回-1
LuaFnGetTeamSize(sceneId,selfId)---返回当前队伍所在人数
GetTeamId(sceneId,selfId)---返回当前玩家所在队伍的ID
GetMonsterCount(sceneId,selfId)---返回当前场景所有NPC/怪物的数量
LuaFnGetCopyScene_HumanCount(sceneId) --返回当前场景存在人数
GetHumanMenpaiPoint(sceneId,selfId);---查询当前角色的门派贡献值
SetHumanMenpaiPoint(sceneId,selfId,3)---设置当前角色的门派贡献度 这里是直接设置后面的数字 不是增加 增加的需要先查询SetHumanMenpaiPoint(sceneId,selfId,GetHumanMenpaiPoint(sceneId,selfId)+3) 这样是增加3
SetPos(sceneId,selfId,250,128) ----跳转到当前地图的坐标 X Y
NewWorld(sceneId,selfId,1,250,128)----跳转到某一个场景的坐标 场景ID自行查看
HaveXinFa(sceneId,selfId,19)----检测当前角色有没有学习心法 19 为心法ID 返回0 就是没学习 学习了就返回心法等级
AddGlobalCountNews(sceneId,"公告:")----发布公告--可以打印字符串和数组
LuaFnAwardTitle( sceneId, selfId,11,394)----替换称号
SetCurTitle(sceneId,selfId,11,394)---显示称号 和上面的一起用 否者报错
LuaFnDispatchAllTitle(sceneId, selfId)---刷新客户端称号
AddGlobalCountNews(sceneId,"2222")--公告
--删宝石
local isEraseSuc = LuaFnEraseGemEx(sceneId,selfId,Xiaohei_minggezi,1)
if( isEraseSuc == 0 ) then
x900051_NotifyTip(sceneId,selfId,"请不要加锁冥石")
return
end
local isEraseSuc = LuaFnEraseGemEx(sceneId,selfId,Xiaohei_jinggezi,3)
if( isEraseSuc == 0 ) then
x900051_NotifyTip(sceneId,selfId,"请不要加锁晶石")
return
end
GetMissionDataEx(sceneId,selfId,MDEX_SEVENDAYTIME_DATA)------全局变量里面的常量数据获取(登陆时间/天数,充值点,消费情况等。。。。)和GetMissionData不晓得为啥不一样 获取到的值不一样 不过有的端不能用Ex的 看具体情况
---这里全局变量中常量的 接口一般最大为511 除非的你的端是花了大价钱 或者有无限的MD 插件
BeginUICommand( sceneId ) --开始通知客户端刷新数据
UICommand_AddInt( sceneId,a2) --向客户端传递一个数据。Tnt为整数类型
UICommand_AddString( sceneId,"30503157") ---想客户端传递一个字符串类型的值,客户端接受到以后要改成数组类型
EndUICommand( sceneId ) --参数结束
DispatchUICommand( sceneId, selfId, 20240401 ) --UI的传值接受目的地 --这里可以在客户端 if agr0 接受
LuaFnGetGUID(sceneId,selfId)----获取到当前玩家的GUID 这个是 在服务器的唯一识别表示 注册时生成 具体从哪个值开始 去找数据库
LuaFnMtl_GetCostNum(sceneId,selfId,Baoshi[i])----获取背包中存在 的数量 ---可以加数组使用for循环获取 也可以直接写宝石的ID---当然也可以便利的背包的索引 和宝石的ID 来获取数量 这里要注意 材料的启示索引和结束索引位置
LuaFnGetItemTableIndexByIndex(sceneId,selfId,i) ---背包中的索引位置 后面的参数就是背包道具栏的中的第几个各自 如果你的背包道具栏为50格子 那么50应该就是材料栏的第一个
local nItemId = LuaFnGetItemTableIndexByIndex( sceneId, selfId, nPos )--获取背包某个格子的物品id
local Have = LuaFnGetAvailableItemCount(sceneId,selfId,nItemId)--判断某个id的物品是否符合数量
GetItemName(sceneId,newitem)--获得物品名
LuaFnCancelSpecificImpact(sceneId,selfId) ---应该是判断BUFF是否存在
LuaFnHaveImpactOfSpecificDataIndex(sceneId,selfId)-----BUFF的索引
---------待添加--------
-------------------***************服务端一些脚本或者文本的作用************----------------------
Script.dat-------脚本的索引或者说是总控 -----添加脚本的时候 注意不要重复 重复的话可能只会调用同一脚本号的最下面的一个
---------------***Server > Config ***------
AllowableScriptFunc.txt------客户端向服务端请求的一些函数 允许客户端向服务端查询或者传值的函数名字 需要在这里添加白名单 不然游戏掉线
AttrLevelUpTable.txt-----好像是各门派的成长率
BaseValueTable.ini------各个门派的 初始值和影响系数
ConfigInfo.ini-----移动速度,经验,上限,和一些东西的修正
DefaultChar.ini----初始的出生点 金币等
DropBoxContent.txt-----掉包添加 价值 是否绑定设置
ItemSegAffect.txt----段几 几率
ItemValue.txt---属性编号
ItemSegRate.txt----品质段 对应的属性值
StandardImpact.txt-----BUFF的效果ID 对用的属性值领取时间等---
---待添加--------
---------------***Pubilc > Config ***------
CharTitle.txt---称号
CommonItem.txt-------物品材料
EquipBase.txt-----装备
EquipSetAttr.txt---套装 件数 效果修改 效果对应ItemValue.txt
GemInfo.txt----宝石
ImpactSEData_V1.txt-----BUFF的右上角显示
ImpactSEData_V1.txt---材料物品 装备宝石规则 ---是否拾取绑定 可否丢弃 叠加等--
ItemSegValue.txt---装备属性 -1表示没有只能修改1或者-1 具体的效果值去另一个文件找 具体请参考潇湘工具
MonsterAttrExTable.txt----怪物或者NPC模型ID
PetAttrTable.txt---宠物
SkillData_V1.txt---技能效果
SkillTemplate_V1.txt---技能设置添加修改
XinFa_V1.txt-----看名就知道是心法
XinFaStudySpend_V1.txt---升级心法参数修改
---------对话固定格式-----------------
----------事件列表入口
function x901030_OnDefaultEvent( sceneId, selfId, targetId ) --x901030脚本号 OnDefaultEvent 函数的名字 sceneId 场景的ID selfId人物的ID targetId目标NPC的ID
BeginEvent(sceneId)
AddNumText(sceneId, 901030, "#Y#旅途整理", 3, 1) --前面的3就是每个列表中前面的小图标 -1----11 都可以用 后面的 "1" 给这个列表或者选项定义一个编号 方便下面查找
EndEvent()
DispatchEventList(sceneId, selfId, targetId)
end
------获取上面事件列表选中一项
function x901030_OnEventRequest( sceneId, selfId, targetId, eventId)
local Num == GetNumText(); ---- local的意思创建一个就是本地的 局部的变量 Num 为自己定义的局部变量的名称 ---GetNumText(); 获取到上面列表定义的编号
if Num == 1 then ---这里的if 是如果的意思 如果获取到的上面的编号等于1 执行这里
end
end
-------------------分隔符------------------------------------
----------------------for循环--------------------------
---------for 是便利循环的意思 可以用来查找 便利背包 查到物品, BUFF 等 这里我们可以这样写
lvtu_JiNeng = {4608,4609} --这里的{} 按照应该就是定义类 方法 和循环等语言结构的开始和结束,这里我们就是定义了一个名为lvtu_JiNeng的循环
for i =1,2 do
if HaveSkill(sceneId,selfId,lvtu_JiNeng[i]) == 1 then ----HaveSkill 获取技能的函数 使用for 循环查找 有没有学习这两个技能的其中一个--从1 开始循环到2结束
x901031_NotifyTip( sceneId, selfId,"#Y你已经过技能") ---如果循环到学习了其中一个技能 可以给一个提示 并且返回
return --return是返回的意思 不在往下执行
end
end
天龙学习笔记.lua
setmetatable(_G, {__index =MainMenuBar_Env});
local skillnum=GetActionNum("skill")
Button_Action5=35
for i=1,skillnum do
local theAction=EnumAction(i-1,"skill")
if theAction:GetDefineID()==35 then
Button_Action5:SetActionItem(theAction:GetID())
Button_Action5:Bright()
break
end
end
if DataPool:IsCanDoAction() then
MAINMENUBAR_BUTTONS[nIndex]:DoAction();
else
PushDebugMessage("你不能这么做。")
return;
end
第一步
服务端lua
strlen 获取字符串长度
strsub(字符串,开始位置,结束位置) 提取字符串
split(字符串,分隔符) 分割字符串
strfing(字符串,要查找的字符) 返回要查找的字符在字符串中的位置
天龙CDK应用部分
strchar(ASC码) 返回ASC码对应的字符
strbyte("字符") 返回字符对应的ASC码
local name="lingyun"
local wz=strfind(name,"yun")
此时 wz=5 说明yun这个字符串出现在 lingyun 这个字符串的第5个位置
如果要查找的字符串未出现在 原字符串中 则返回 nil 所以后面可跟判断
if wz==nil then
说明没有找到相关信息
end
gsub(原字符串,要被替换的字符串,替换成的字符串) 字符串替换
代码local str=gsub(Data,"&BS%w%w%w","")的解释如下:
gsub(Data, pattern, replacement): 这是一个gsub函数的调用,它会对字符串Data执行全局替换。
"&BS%w%w%w": 这是要查找的模式。
&BS: 匹配字面字符串&BS。
%w: 匹配任何单个字母数字字符,等价于[a-zA-Z0-9_]。
%w%w%w: 因此,这部分匹配三个连续的字母数字字符。
"": 这是替换的字符串。在这里,它是一个空字符串,意味着所有匹配&BS%w%w%w模式的子串都会被替换为空字符串,即被删除。
local str = ...: 这部分将gsub函数的结果赋值给局部变量str。gsub函数返回替换后的新字符串和替换的次数。但是在这里,你只关心替换后的新字符串,因此str将包含替换后的字符串。
综上所述,这行代码的作用是从Data字符串中删除所有以&BS开头并跟随三个字母数字字符的子串,并将结果存储在str中。
nSign = "&DZ("..strrep("%d",8)..")".."(%w)".."("..strrep("%d",8)..")".."(%w)".."("..strrep("%d",8)..")"
strrep(s, n): 这是一个字符串重复函数,它将字符串s重复n次。在这里,它被用来生成由8个数字字符(%d)组成的字符串。
"..": 这是Lua中的字符串连接操作符,用于将多个字符串片段连接成一个字符串。
"%d": 这是一个模式,用于匹配任何单个数字字符。
"%w": 这是一个模式,用于匹配任何单个字母数字字符,等价于[a-zA-Z0-9_]。
现在,让我们逐步解析这个字符串的构建过程:
strrep("%d",8): 这将生成一个由8个%d组成的字符串,即"%d%d%d%d%d%d%d%d"。
"&DZ("..strrep("%d",8)..")": 这将生成一个字符串,以&DZ(开头,后面跟着8个%d,然后以)结尾。例如:&DZ(%d%d%d%d%d%d%d%d)。
"..(%w)..": 这将在上一步生成的字符串后面添加一个%w模式。
"..("..strrep("%d",8)..")": 这将再次添加一个由8个%d组成的字符串,并用括号括起来。
"..(%w)..": 这将在上一步生成的字符串后面再次添加一个%w模式。
"..("..strrep("%d",8)..")": 这将再次添加一个由8个%d组成的字符串,并用括号括起来。
最终,nSign变量将包含以下字符串:
复制代码
&DZ(%d%d%d%d%d%d%d%d)(%w)(%d%d%d%d%d%d%d%d)(%w)(%d%d%d%d%d%d%d%d)
这个字符串是一个Lua模式,它可能用于后续的string.match、string.gmatch或string.find等函数中来查找匹配此模式的子串。该模式描述了一个特定的格式,其中包括一个固定的字符串&DZ,后面跟着三个括号包裹的由8个数字字符组成的序列,并且在第二个和第三个数字序列之间有一个字母数字字符。
例如,字符串"&DZ(12345678)a(98765432)b(01234567)"将匹配这个模式。
local name="lingyun"
local newname=gsub(name,"yun","wu")
此时 newname="lingwu" 将“lingyun”中的“yun”替换成"wu"
local name,level="lingyun",15
local str=format("玩家%s,现在等级%d",tostring(name),level)
format格式化字符串 %s 则后面需要对应一个 字符串类型 %d 后面跟整数型
此语句后 str 的值为 "玩家lingyun,现在等级15"
数值运算学习
ceil(15/14) 无论结果小数点后是几 都将整数部分+1 例如15/14=1.1 则返回2 15/7=2.1 返回3 15/10=1.5 返回 2
mod(15,10) 取余数 返回5
floor(15/11) 取整数部分 返回 1 例如floor(15/7) 返回2 无视小数点后的数字
数组列表学习
local myarr={1,2,3}
getn(myarr) 返回数组中的元素数量 例如这里 返回3 表示数组中有3个元素
local name={}
tinsert(name,"lingyun")
tinsert(name,"xuewu")
此时 name[1]="lingyun" name[2]=xuewu
tremove(name,1)
此时 删除name数组中的第一个元素 第二个元素向前移name[1]="xuewu" name[2]=nil
local myarr={[102]={1,2,3},[115]={4,5,6},}
local tmparr={0,0,0}
for i,tmp in myarr do
--进入第一次循环 此时 tmp[i] = myarr[102] i=102
for j=1,3 do
tmparr[j]=tmparr[j]+tmp[j]
--进入第一次循环 此时tmp[j] 相当于 myarr[102][1] 此时 j=1
end
end
客户端部分lua
local PrizeAction = GemMelting:UpdateProductAction(tonumber(shuzu[i])) --这里tonumber(shuzu[i]) 是获取到的物品ID
XiaoXiang_DuiHuanUI2_Bk_Icon[i]:SetActionItem(PrizeAction:GetID()); --这里显示出对应的图标信息
local theAction = EnumAction(nIndex-1, "packageitem") --这里获取到背包位置的物品信息
if theAction:GetID() ~= 0 then
local nPacketItemID = tonumber(theAction:GetDefineID()) --获取到该物品的真实ID
:SetActionItem(PrizeAction:GetID()); --设置容器需要显示的 图标信息
strName = Pet : GetStrAptitude(nIndex); --获取力量资质
Pet_StrAptitude : SetText( strName );
strName = Pet : GetIntAptitude(nIndex); --获取灵气资质
Pet_NimbusAptitude : SetText( strName );
strName = Pet : GetPFAptitude(nIndex); --获取体力资质
Pet_PhysicalStrengthAptitude : SetText( strName );
strName = Pet : GetStaAptitude(nIndex); --获取定力资质
Pet_StabilityAptitude : SetText( strName );
strName = Pet : GetDexAptitude(nIndex); --获取身法资质
Pet_DexterityAptitude : SetText( strName );
strName = Pet : GetStr(nIndex);--获取力量属性
XB_PetLL_SX : SetText( strName );
strName = Pet : GetInt(nIndex);--获取灵气属性
XB_PetLQ_SX : SetText( strName );
strName = Pet : GetPF(nIndex);--获取体力属性
XB_PetTL_SX : SetText( strName );
strName = Pet : GetSta(nIndex);--获取定力属性
XB_PetDL_SX : SetText( strName );
strName = Pet : GetDex(nIndex);--获取身法属性
XB_PetSF_SX : SetText( strName );
以上是客户端
function x830004_jiance(sceneId,selfId,parmPetIndex,petGUID_H,petGUID_L)
local shuxing={}
local nStrPer = LuaFnGetPet_StrPerception(sceneId,selfId,parmPetIndex);
if nStrPer > x830004_g_ZZSX then
LuaFnSetPetData(sceneId,selfId,petGUID_H,petGUID_L,6,x830004_g_ZZSX)
x830004_Tip( sceneId,selfId,"当前宠物力量资质已达上限" )
return
end
local nSprPer = LuaFnGetPet_SprPerception(sceneId,selfId,parmPetIndex);
if nSprPer > x830004_g_ZZSX then
LuaFnSetPetData(sceneId,selfId,petGUID_H,petGUID_L,7,x830004_g_ZZSX)
x830004_Tip( sceneId,selfId,"当前宠物灵气资质已达上限" )
return
end
local nConPer = LuaFnGetPet_ConPerception(sceneId,selfId,parmPetIndex);
if nConPer > x830004_g_ZZSX then
LuaFnSetPetData(sceneId,selfId,petGUID_H,petGUID_L,8,x830004_g_ZZSX)
x830004_Tip( sceneId,selfId,"当前宠物体力资质已达上限" )
return
end
local nIntPer = LuaFnGetPet_IntPerception(sceneId,selfId,parmPetIndex);
if nIntPer >x830004_g_ZZSX then
LuaFnSetPetData(sceneId,selfId,petGUID_H,petGUID_L,9,x830004_g_ZZSX)
x830004_Tip( sceneId,selfId,"当前宠物定力资质已达上限" )
return
end
local nDexPer = LuaFnGetPet_DexPerception(sceneId,selfId,parmPetIndex);
if nDexPer > x830004_g_ZZSX then
LuaFnSetPetData(sceneId,selfId,petGUID_H,petGUID_L,10,x830004_g_ZZSX) --改回最大值
x830004_Tip( sceneId,selfId,"当前宠物身法资质已达上限" )
return
end
for i=0 ,4 do
shuxing[i+1]=LuaFnGetPet_AttrLevel1(sceneId,selfId,parmPetIndex,i) --这里获取到宠物的 力量 灵气 体力 定力 身法 的属性
if shuxing[i+1] >x830004_g_ZZSX then
LuaFnSetPetData(sceneId,selfId,petGUID_H,petGUID_L,i,x830004_g_ZZSX) --改回最大值
end
end
end
以上是服务端