cgmsv引擎论坛

 找回密码
 注册/Sign up
搜索
查看: 6871|回复: 22

[LUA] 小白30天LUA疾行(一)

[复制链接]

Rank: 1

发表于 2022-4-24 22:22:22 | 显示全部楼层 |阅读模式
本帖最后由 jzh890505 于 2022-4-24 21:56 编辑

(不想看我的自high论文可以直接跳到结尾自取LUA)

感想部分
一个月前得知了现在魔力出了佣兵系统,对于电脑旧,屏幕小,反应慢的我简直是天籁之音。重新安装完魔力,加载完佣兵LUA以后,不免有点小失望,跟我心目中的魔力差别还是有点大的。为了弥补我多年来的心愿,励志完善我心目中的佣兵系统,从此踏上了长达30天的LUA自学不归路,偶有所得,特发出来和大家分享一下,也希望大佬能给予一些指点。
心得计划分三篇阐述,内容包含佣兵系统,自动战斗系统,内挂和战斗辅助相关,我只对魔力自带的系统感兴趣,所有的LUA都是为了更愉快的玩单机游戏。

干货部分
先从ng(内挂)说起,最近最大的热点就是M大佬的新框架,魔友们一边赞叹新框架的无所不能,又一边纠结于新老框架的兼容共存问题,今天以ng为例子说一下talkevent系统的冲突问题。

普遍认为新框架和老框架的ng是冲突的,对,也不对。虽然白皮书上写Module和Modules的作用域是不同的,而且Config中的加载命令也不同(useModule('ng'),loadModule('ng')),但是实际情况是当新老框架中拥有相同名字的LUA时,新框架中的LUA会失效。所以如果你想使用新框架的ng,你可以屏蔽老框架ng或者给老框架的内挂改个名,比如ngold,那么新框架的ng就可以使用了,别切后者两个ng可以一起使用。

那么M大佬的ng怎么使用呢,这不得不佩服M大佬的string功底,我认为他是极简风格主义者,写的代码简单不明了,用最短的行数干做多的事,以至于在msg指令上做不到兼得,所以指令很复杂,研究了N多教程以后,我终于读懂了新ng的指令,以下是新ng的指令总结:

/where                             --当前坐标
/bank                               --远程银行
/daka                               --打卡or停止打卡(打卡附送满卡时)
/redoDp                            --人物洗点
/goHome                          --回东门
/encount                          --立刻遇敌一次
/char healthRepair             --治疗
/char spriteRepair              --招魂
/char addFrame                 --满声望
/item sort                         --整理背包
/item identity                    --鉴定背包所有物品
/item repair                      --修理第一栏(不掉耐久上限)
/pet bp                             --算档(所有宠物)
/pet bp X                          --(算档,指定宠物),(X为宠物栏位置0-4)
/pet rebirth                        --洗档(等级变回1),(X为宠物栏位置0-4)
/rank4                               --四转(需手动实装)
/changeSex X                     --临时改变形象(需手动实装)(X为人物图档编号)

不得不说,功能还是相当的强大的,但是相对于/1,/hc来说指令还是太复杂了,其中还有大小写字母的穿插,对于反美国者可能去大教堂招魂都要比打指令要快一点吧,在不大动ng代码的前提下,是否可以简化呢?
QQ截图20220424205916.png
比如红框这里的healthRepair,其实就是/char healthRepair--治疗的后半段,如果改成zl,那么/char healthRepair就简化为/char zl了,所有args[1]=='XXXX'的内容都可以修改,那还能不能更简化呢?
我们看到上图中的蓝色框中的char,我们把函数名char也改短,比如改成c,那么/char zl就简化成/c zl了,虽然没有/1简单,但是也达到了内挂简单指令化的目的了,所有function commandsNormal.XXXX的内容也可以修改,记得不要改重复。
下边是我自己改完的ng代码,放到/Modules文件夹下,我在原有ng的基础上增加了宠物满档的函数,指令如下,如果你不满意可以按我的方法接着改。
/where                             --当前坐标(没改,有仪式感)
/bank                               --远程银行(没改,有仪式感)
/daka                               --打卡or停止打卡(取消了附送卡时)
/redoDp                            --人物洗点(有洗点道具,用不到)
/hc                                  --回东门
/encount                          --立刻遇敌一次(有遇敌道具,用不到)
/c zl                                 --治疗
/c zh                                --招魂
/c sw                               --满声望
/i zl                                   --整理背包
/i jd                                  --鉴定背包所有物品
/i xl                                   --修理第一栏(不掉耐久上限)
/p bp                                 --算档(所有宠物)
/p bp X                              --(算档,指定宠物),(X为宠物栏位置0-4)
/p xd 0                                 --洗档(等级变回1),(X为宠物栏位置0-4)
/p md 0                               --满档(等级变回1)
/rank4                               --四转(需手动实装)
/changeSex X                     --临时改变形象(需手动实装)(X为人物图档编号)

  1. ---模块类
  2. local ngModule = ModuleBase:createModule('ng')
  3. -- 普通玩家命令
  4. local commandsNormal = {}
  5. local function addFrame(charIndex)
  6.   --Char.DischargeParty(charIndex);
  7.   Char.SetData(charIndex, CONST.CHAR_声望, 200000);
  8. end
  9. local function identity(player)
  10.   local Count = 0
  11.   for itemSlot = 8, 27 do
  12.     local ItemIndex = Char.GetItemIndex(player, itemSlot)
  13.     if ItemIndex > 0 then
  14.       local money = Char.GetData(player, CONST.CHAR_金币);
  15.       local itemLv = Item.GetData(ItemIndex, CONST.道具_等级);
  16.       local price = itemLv * 200;
  17.       if Item.GetData(ItemIndex, CONST.道具_已鉴定) == 0 and money >= (itemLv * 200) then
  18.         Count = Count + 1
  19.         Char.SetData(player, CONST.CHAR_金币, money - price);
  20.         Item.SetData(ItemIndex, CONST.道具_已鉴定, 1)
  21.         NLG.SystemMessage(player, "[系统] 您鉴定的道具等级为" .. itemLv .. "级。扣除魔币" .. price .. "G");
  22.         NLG.SystemMessage(player, "[系统] 你身上的 " .. Item.GetData(ItemIndex, CONST.道具_鉴前名) .. "已鉴定为 " .. Item.GetData(ItemIndex, CONST.道具_名字))
  23.         Item.UpItem(player, itemSlot);
  24.         NLG.UpChar(player);
  25.         return ;
  26.       end
  27.     end
  28.   end
  29.   if Count == 0 then
  30.     NLG.SystemMessage(player, "[系统] 你身上没有需要鉴定的物品【或你的钱不足以鉴定此道具】");
  31.     return ;
  32.   end
  33.   return
  34. end
  35. local function repairEquipment(player)
  36.   local Count = 0
  37.   for ItemSlot = 8, 8 do
  38.     local ItemIndex = Char.GetItemIndex(player, ItemSlot)
  39.     local money = Char.GetData(player, CONST.CHAR_金币);
  40.     local itemLv = Item.GetData(ItemIndex, CONST.道具_等级);
  41.     local itemName = Item.GetData(ItemIndex, CONST.道具_名字);
  42.     local itemDur = Item.GetData(ItemIndex, CONST.道具_耐久);
  43.     local itemMaxDur = Item.GetData(ItemIndex, CONST.道具_最大耐久);
  44.     local repairedDur = itemMaxDur - itemDur
  45.     --local decMaxDur = repairedDur * 1
  46.     local price = repairedDur * 10
  47.     local itemType = Item.GetData(ItemIndex, CONST.道具_类型);
  48.     if money > price and itemMaxDur > itemDur and itemType >= 0 and itemType <= 14 then
  49.       Count = Count + 1
  50.       Char.SetData(player, CONST.CHAR_金币, money - price);
  51.       --Item.SetData(ItemIndex, CONST.道具_耐久, itemDur + xhnj);
  52.       --Item.UpItem(player, ItemSlot);
  53.       -- local djnj1 = Item.GetData(ItemIndex,CONST.道具_耐久);
  54.       -- local djzdnj1 = Item.GetData(ItemIndex,CONST.道具_最大耐久);
  55.       Item.SetData(ItemIndex, CONST.道具_耐久, itemMaxDur);
  56.       Item.SetData(ItemIndex, CONST.道具_最大耐久, itemMaxDur);
  57.       NLG.SystemMessage(player, "[系统] 您修理的装备【" .. itemName .. "】恢复了【" .. repairedDur .. "】耐久。扣除魔币【" .. price .. "G】");
  58.       Item.UpItem(player, ItemSlot);
  59.       NLG.UpChar(player);
  60.       return
  61.     end
  62.   end
  63.   if Count == 0 then
  64.     NLG.SystemMessage(player, "[系统] 你道具栏第一格没有要恢复耐久的装备或者您的修理魔币不足。");
  65.     return
  66.   end
  67.   return
  68. end
  69. local function spriteRepair(player)
  70.   local ZH = Char.GetData(player, CONST.CHAR_掉魂);
  71.   local money = Char.GetData(player, CONST.CHAR_金币);
  72.   local LV = Char.GetData(player, CONST.CHAR_等级);
  73.   local ZHMB = ZH * 200;
  74.   local ZHMBKC = ZHMB * LV
  75.   if ZH <= 0 then
  76.     NLG.SystemMessage(player, "你没有掉魂。");
  77.   end
  78.   if money >= ZHMBKC and ZH > 0 then
  79.     Char.SetData(player, CONST.CHAR_金币, money - ZHMBKC);
  80.     Char.SetData(player, CONST.CHAR_掉魂, 0);
  81.     Char.FeverStop(player);
  82.     NLG.UpChar(player);
  83.     NLG.SystemMessage(player, "招魂完成。招魂数量为【" .. ZH .. "】费用为【" .. ZHMBKC .. "】魔币。");
  84.   end
  85.   if money < ZHMBKC then
  86.     NLG.SystemMessage(player, "连钱都没有你还招魂,一边尿尿玩泥巴去吧。【招魂价格计算 掉魂*1000*等级】");
  87.   end
  88. end
  89. local function healthRepair(player)
  90.   local i = Char.GetData(player, CONST.CHAR_受伤);
  91.   local money = Char.GetData(player, CONST.CHAR_金币);
  92.   if (Char.GetData(player, CONST.CHAR_受伤) < 1) then
  93.     NLG.SystemMessage(player, "您未受伤。");
  94.     return ;
  95.   end
  96.   if (money >= 200) and (Char.GetData(player, CONST.CHAR_受伤) > 0 and Char.GetData(player, CONST.CHAR_受伤) < 26) then
  97.     Char.SetData(player, CONST.CHAR_受伤, 0);
  98.     Char.SetData(player, CONST.CHAR_金币, money - 200);
  99.     NLG.UpdateParty(player);
  100.     NLG.UpChar(player);
  101.     NLG.SystemMessage(player, "恭喜你治疗完毕。");
  102.     NLG.SystemMessage(player, "扣除200魔币。");
  103.     return ;
  104.   end
  105.   if (money >= 400) and (Char.GetData(player, CONST.CHAR_受伤) > 24 and Char.GetData(player, CONST.CHAR_受伤) < 51) then
  106.     Char.SetData(player, CONST.CHAR_受伤, 0);
  107.     Char.SetData(player, CONST.CHAR_金币, money - 400);
  108.     NLG.UpdateParty(player);
  109.     NLG.UpChar(player);
  110.     NLG.SystemMessage(player, "恭喜你治疗完毕。");
  111.     NLG.SystemMessage(player, "扣除400魔币。");
  112.     return ;
  113.   end
  114.   if (money >= 800) and (Char.GetData(player, CONST.CHAR_受伤) > 49 and Char.GetData(player, CONST.CHAR_受伤) < 76) then
  115.     Char.SetData(player, CONST.CHAR_受伤, 0);
  116.     Char.SetData(player, CONST.CHAR_金币, money - 800);
  117.     NLG.UpdateParty(player);
  118.     NLG.UpChar(player);
  119.     NLG.SystemMessage(player, "恭喜你治疗完毕。");
  120.     NLG.SystemMessage(player, "扣除800魔币。");
  121.     return ;
  122.   end
  123.   if (money >= 1000) and (Char.GetData(player, CONST.CHAR_受伤) > 74 and Char.GetData(player, CONST.CHAR_受伤) < 101) then
  124.     Char.SetData(player, CONST.CHAR_受伤, 0);
  125.     Char.SetData(player, CONST.CHAR_金币, money - 1000);
  126.     NLG.UpdateParty(player);
  127.     NLG.UpChar(player);
  128.     NLG.SystemMessage(player, "恭喜你治疗完毕。");
  129.     NLG.SystemMessage(player, "扣除1000魔币。");
  130.     return ;
  131.   else
  132.     NLG.SystemMessage(player, "对不起!您的魔币不足,治疗价格为【白伤200】【黄伤400】【紫伤800】【红伤1000】!");
  133.     return ;
  134.   end
  135.   return 0
  136. end
  137. function commandsNormal.where(charIndex, args)
  138.   local target = charIndex;
  139.   if #args == 1 then
  140.     target = tonumber(args[1])
  141.   end
  142.   NLG.TalkToCli(charIndex, -1, target ..
  143.     ' 地图:' .. tostring(Char.GetData(target, CONST.CHAR_地图)) .. '/' .. tostring(Char.GetData(target, CONST.CHAR_地图类型)) ..
  144.     ', X:' .. tostring(Char.GetData(target, CONST.CHAR_X)) ..
  145.     ', Y:' .. tostring(Char.GetData(target, CONST.CHAR_Y)) ..
  146.     ', 方向:' .. tostring(Char.GetData(target, CONST.CHAR_方向))
  147.   )
  148. end
  149. function commandsNormal.c(charIndex, args)
  150.   if args[1] == 'zl' then
  151.     return healthRepair(charIndex)
  152.   elseif args[1] == 'zh' then
  153.     return spriteRepair(charIndex)
  154.   elseif args[1] == 'sw' then
  155.     return addFrame(charIndex)
  156.   end
  157. end
  158. -- function commandsNormal.rank4(charIndex)
  159. --   if Char.GetData(charIndex, CONST.CHAR_职阶) == 3 and Char.GetData(charIndex, CONST.CHAR_等级) >= 100 then
  160. --     Char.SetData(charIndex, CONST.CHAR_职阶, 4);
  161. --     Char.SetData(charIndex, CONST.CHAR_职业, Char.GetData(charIndex, CONST.CHAR_职业) + 1);
  162. --     NLG.UpChar(charIndex);
  163. --   end
  164. -- end
  165. function commandsNormal.i(charIndex, args)
  166.   if args[1] == 'zl' then
  167.     NLG.SortItem(charIndex)
  168.     NLG.UpChar(charIndex);
  169.   elseif args[1] == 'jd' then
  170.     return identity(charIndex)
  171.   elseif args[1] == 'xl' then
  172.     return repairEquipment(charIndex)
  173.   end
  174. end
  175. function commandsNormal.changeSex(charIndex, args)
  176.   print( Char.GetData(charIndex, CONST.CHAR_形象), Char.GetData(charIndex, CONST.CHAR_原形), Char.GetData(charIndex, CONST.CHAR_原始图档))
  177.   if args[1] then
  178.     Char.SetData(charIndex, CONST.CHAR_形象, args[1]);
  179.   else
  180.     Char.SetData(charIndex, CONST.CHAR_形象, Char.GetData(charIndex, CONST.CHAR_原形));
  181.   end
  182. end
  183. function commandsNormal.daka(charIndex)
  184.   --Char.SetData(charIndex, CONST.CHAR_卡时, 99 * 3600);
  185.   if Char.IsFeverTime(charIndex) == 1 then
  186.     Char.FeverStop(charIndex)
  187.   else
  188.     Char.FeverStart(charIndex)
  189.   end
  190.   NLG.UpChar(charIndex)
  191. end
  192. function commandsNormal.redoDp(charIndex)
  193.   local total = (Char.GetData(charIndex, CONST.CHAR_等级) - 1) * 4 + 30;
  194.   local s = { CONST.CHAR_体力, CONST.CHAR_力量, CONST.CHAR_强度, CONST.CHAR_速度, CONST.CHAR_魔法 }
  195.   for i, v in pairs(s) do
  196.     Char.SetData(charIndex, v, 0);
  197.   end
  198.   Char.SetData(charIndex, CONST.CHAR_升级点, total);
  199.   NLG.UpChar(charIndex)
  200. end
  201. function commandsNormal.encount(charIndex)
  202.   Battle.Encount(charIndex, charIndex);
  203. end
  204. function commandsNormal.hc(charIndex)
  205.   --Char.DischargeParty(charIndex);
  206.   Char.Warp(charIndex, 0, 1000, 236, 88);
  207. end
  208. local function getPetBp(player, args)
  209.   local hasPet = false;
  210.   for i = args[2] or 0, args[2] or 4 do
  211.     local pet = Char.GetPet(player, i);
  212.     if (pet >= 0) then
  213.       hasPet = true;
  214.       local arr_rank1 = Pet.GetArtRank(pet, CONST.PET_体成);
  215.       local arr_rank11 = Pet.FullArtRank(pet, CONST.PET_体成);
  216.       local arr_rank2 = Pet.GetArtRank(pet, CONST.PET_力成);
  217.       local arr_rank21 = Pet.FullArtRank(pet, CONST.PET_力成);
  218.       local arr_rank3 = Pet.GetArtRank(pet, CONST.PET_强成);
  219.       local arr_rank31 = Pet.FullArtRank(pet, CONST.PET_强成);
  220.       local arr_rank4 = Pet.GetArtRank(pet, CONST.PET_敏成);
  221.       local arr_rank41 = Pet.FullArtRank(pet, CONST.PET_敏成);
  222.       local arr_rank5 = Pet.GetArtRank(pet, CONST.PET_魔成);
  223.       local arr_rank51 = Pet.FullArtRank(pet, CONST.PET_魔成);
  224.       local a1 = (arr_rank1 - arr_rank11);
  225.       local a2 = (arr_rank2 - arr_rank21);
  226.       local a3 = (arr_rank3 - arr_rank31);
  227.       local a4 = (arr_rank4 - arr_rank41);
  228.       local a5 = (arr_rank5 - arr_rank51);
  229.       local a6 = a1 + a2 + a3 + a4 + a5;
  230.       local a61 = arr_rank1 + arr_rank2 + arr_rank3 + arr_rank4 + arr_rank5;
  231.       NLG.SystemMessage(player, Char.GetData(pet, CONST.CHAR_名字) .. "总:" .. a61 .. "(" .. a6 .. ')')
  232.       NLG.SystemMessage(player, "体:" .. arr_rank1 .. "(" .. a1 .. ") 力:" .. arr_rank2 .. "(" .. a2 .. ") 强:" .. arr_rank3 .. "(" .. a3 .. ") 敏:" ..
  233.         arr_rank4 .. "(" .. a4 .. ") 魔:" .. arr_rank5 .. "(" .. a5 .. ")");
  234.     end
  235.   end
  236.   if not args[2] then
  237.     if hasPet then
  238.       NLG.SystemMessage(player, "-----------------------------------");
  239.     else
  240.       NLG.SystemMessage(player, "没有宠物");
  241.     end
  242.   end
  243. end
  244. local function petRebirth(player, args)
  245.   local pet = Char.GetPet(player, tonumber(args[2]));
  246.   if pet >= 0 then
  247.     local s = { CONST.PET_体成, CONST.PET_力成, CONST.PET_强成, CONST.PET_敏成, CONST.PET_魔成 };
  248.     for i, v in pairs(s) do
  249.       local r = Pet.FullArtRank(pet, v);
  250.       Pet.SetArtRank(pet, v, r - math.random(0, 4))
  251.     end
  252.     Pet.ReBirth(player, pet);
  253.     local arr_rank1 = Pet.GetArtRank(pet, CONST.PET_体成);
  254.     local arr_rank11 = Pet.FullArtRank(pet, CONST.PET_体成);
  255.     local arr_rank2 = Pet.GetArtRank(pet, CONST.PET_力成);
  256.     local arr_rank21 = Pet.FullArtRank(pet, CONST.PET_力成);
  257.     local arr_rank3 = Pet.GetArtRank(pet, CONST.PET_强成);
  258.     local arr_rank31 = Pet.FullArtRank(pet, CONST.PET_强成);
  259.     local arr_rank4 = Pet.GetArtRank(pet, CONST.PET_敏成);
  260.     local arr_rank41 = Pet.FullArtRank(pet, CONST.PET_敏成);
  261.     local arr_rank5 = Pet.GetArtRank(pet, CONST.PET_魔成);
  262.     local arr_rank51 = Pet.FullArtRank(pet, CONST.PET_魔成);
  263.     local a1 = (arr_rank1 - arr_rank11);
  264.     local a2 = (arr_rank2 - arr_rank21);
  265.     local a3 = (arr_rank3 - arr_rank31);
  266.     local a4 = (arr_rank4 - arr_rank41);
  267.     local a5 = (arr_rank5 - arr_rank51);
  268.     local a6 = a1 + a2 + a3 + a4 + a5;
  269.     local a61 = arr_rank1 + arr_rank2 + arr_rank3 + arr_rank4 + arr_rank5;
  270.     NLG.SystemMessage(player, Char.GetData(pet, CONST.CHAR_名字) .. "总:" .. a61 .. "(" .. a6 .. ')')
  271.     NLG.SystemMessage(player, "体:" .. arr_rank1 .. "(" .. a1 .. ") 力:" .. arr_rank2 .. "(" .. a2 .. ") 强:" .. arr_rank3 .. "(" .. a3 .. ") 敏:" ..
  272.       arr_rank4 .. "(" .. a4 .. ") 魔:" .. arr_rank5 .. "(" .. a5 .. ")");
  273.         NLG.SystemMessage(player, "-----------------------------------");
  274.   end
  275. end
  276. local function FullArtRank(player, args)
  277.   local pet = Char.GetPet(player, tonumber(args[2]));
  278.   if pet >= 0 then
  279.         Pet.SetArtRank(pet,%宠档_体成%,Pet.FullArtRank(pet,%宠档_体成%));
  280.         Pet.SetArtRank(pet,%宠档_力成%,Pet.FullArtRank(pet,%宠档_力成%));
  281.         Pet.SetArtRank(pet,%宠档_强成%,Pet.FullArtRank(pet,%宠档_强成%));
  282.         Pet.SetArtRank(pet,%宠档_敏成%,Pet.FullArtRank(pet,%宠档_敏成%));
  283.         Pet.SetArtRank(pet,%宠档_魔成%,Pet.FullArtRank(pet,%宠档_魔成%));
  284.         Pet.ReBirth(player, pet);
  285.         NLG.SystemMessage(player,Char.GetData(pet, CONST.CHAR_名字).."已经满档");
  286.   end
  287. end
  288. function commandsNormal.p(player, args)
  289.   if args[1] == 'bp' then
  290.     return getPetBp(player, args);
  291.   elseif string.lower(args[1] or '') == 'xd' then
  292.     return petRebirth(player, args);
  293.   elseif string.lower(args[1] or '') == 'md' then
  294.     return FullArtRank(player, args);
  295.   end
  296. end
  297. function commandsNormal.bank(player, args)
  298.   NLG.OpenBank(player, player);
  299. end
  300. function ngModule:handleTalkEvent(charIndex, msg)
  301.   self:logDebug('ng', charIndex, msg);
  302.   local command = msg:match('^/([%w]+)')
  303.   if commandsNormal[command] then
  304.     local arg = msg:match('^/[%w]+ +(.+)$')
  305.     arg = arg and string.split(arg, ' ') or {}
  306.     commandsNormal[command](charIndex, arg);
  307.     return 0
  308.   end
  309.   return 1;
  310. end
  311. --- 加载模块钩子
  312. function ngModule:onLoad()
  313.   self:logInfo('load')
  314.   self:regCallback('TalkEvent', Func.bind(self.handleTalkEvent, self))
  315. end
  316. --- 卸载模块钩子
  317. function ngModule:onUnload()
  318.   self:logInfo('unload')
  319. end
  320. return ngModule;
复制代码
虽然代码已经简化了,但是随着代码的增多是不是也会出现记不住,记错的现象,基于这个问题,我又写了一个ng可视化的lua,代码如下
  1. local Module = ModuleBase:createModule('menu')
  2. local menutable={{"1.回城","/hc"},{"2.整理","/i zl"},{"3.打卡","/daka"},{"4.远程银行","/bank"},{"5.当前坐标","/where"},
  3. {"6.鉴定","/i jd"},{"7.洗档","/p xd 0"},{"8.算档","/p bp"},{"9.满档","/p md 0"},{"10.治疗","/c zl"},
  4. {"11.招魂","/c zh"},{"12.修理","/i xl"},{"13.洗点","/redoDp"}}
  5. local function calcWarp()--计算页数和最后一页数量
  6.   local totalpage = math.modf(#menutable / 8) + 1
  7.   local remainder = math.fmod(#menutable, 8)
  8.   return totalpage, remainder
  9. end
  10. function Module:onLoad()
  11.         self:logInfo('load')
  12.         local menuNPC = self:NPC_createNormal('内挂菜单', 105502, { x = 6, y = 6, mapType = 0, map = 666, direction = 4 });
  13.         self:NPC_regWindowTalkedEvent(menuNPC, function(npc, player, _seqno, _select, _data)
  14.         local column = tonumber(_data)
  15.     local page = tonumber(_seqno)
  16.     local warpPage = page;
  17.     local winMsg = "1\\n请下达指令\\n"
  18.     local winButton = CONST.BUTTON_关闭;
  19.     local totalPage, remainder = calcWarp()
  20.     --上页16 下页32 关闭/取消2
  21.         if _select > 0 then
  22.                 if _select == CONST.BUTTON_下一页 then
  23.                         warpPage = warpPage + 1
  24.                         if (warpPage == totalPage) or ((warpPage == (totalPage - 1) and remainder == 0)) then
  25.                                 winButton = CONST.BUTTON_上取消
  26.                         else
  27.                                 winButton = CONST.BUTTON_上下取消
  28.                         end
  29.                 elseif _select == CONST.BUTTON_上一页 then
  30.                         warpPage = warpPage - 1
  31.                         if warpPage == 1 then
  32.                                 winButton = CONST.BUTTON_下取消
  33.                         else
  34.                                 winButton = CONST.BUTTON_上下取消
  35.                         end
  36.                 elseif _select == 2 then
  37.                         warpPage = 1
  38.                         return
  39.                 end
  40.                 local count = 8 * (warpPage - 1)
  41.                 if warpPage == totalPage then
  42.                         for i = 1 + count, remainder + count do
  43.                                 winMsg = winMsg .. menutable[i][1] .. "\\n"
  44.                         end
  45.                 else
  46.                         for i = 1 + count, 8 + count do
  47.                                 winMsg = winMsg .. menutable[i][1] .. "\\n"
  48.                         end
  49.                 end
  50.                 NLG.ShowWindowTalked(player, npc, CONST.窗口_选择框, winButton, warpPage, winMsg);
  51.         else
  52.                 local count = 8 * (warpPage - 1) + column
  53.                 getModule('ng'):handleTalkEvent(player,menutable[count][2]);
  54.         end
  55.         end)
  56.         self:regCallback('CharActionEvent', function(player, actionID)
  57.                 if actionID == %动作_坐下% then
  58.                         local msg = "1\\n请下达指令\\n"
  59.                         for i = 1, 8 do
  60.                                 msg = msg .. menutable[i][1] .. "\\n"
  61.                         end
  62.                         NLG.ShowWindowTalked(player, menuNPC, CONST.窗口_选择框, CONST.BUTTON_下取消, 1, msg);
  63.                 end
  64.         end)
  65. end
  66. function Module:onUnload()
  67.         self:logInfo('unload');
  68. end
  69. return Module;
复制代码
这个LUA的操作原理是,当人物执行坐下的动作指令时,会呼出窗口,所有的指令可以在窗口中点击进行,由于坐下的快捷指令时ctrl+1,所以每当我们点击ctrl+1时,窗口就会弹出,这也是我们选择他的原因。
QQ截图20220424211953.png QQ截图20220424211938.png QQ截图20220424212009.png QQ截图20220424212057.png
使用我的可视化代码需要注意以下几个问题:
1、将可视化代码放入/lua/Modules/之中,创建txt改名为Bless.lua,将代码复制到其中
2、使用Bless.lua必须配合我写的ng一起使用,将ng代码覆盖/lua/Modules/ng.lua中的代码
3、新的代码要使用M大佬新框架,也不要忘了在/lua/ModuleConfig.lua中加入loadModule('menu')和loadModule('ng')
4、Bless.lua中创建了一个辅助npc叫'内挂辅助',默认放到了666地图中,如果你没有这个地图,请把地图改为任意一个你不用的地图,比如777

最后的最后要感谢帮助过我的大佬们,你们的想法,LUA,解答都帮助了我很多,特此鸣谢!

xman,ahsin,简单的小生活,飘雪,Muscipular


补充内容 (2022-4-25 16:55):
1、将可视化代码放入/lua/Modules/之中,创建txt改名为Bless.lua,将代码复制到其中
修复一处错误,将这里的Bless.lua改成menu.lua

Rank: 1

发表于 2022-4-25 12:50:05 | 显示全部楼层
终于解决了我看不懂新框架内挂直接把新内挂干掉的烦恼

Rank: 1

发表于 2022-4-25 12:54:29 | 显示全部楼层
另外大佬如果不想那么复杂靠做动作触发 能不能支持换成/h 或者/help这样激活呢

Rank: 1

发表于 2022-4-25 14:24:38 | 显示全部楼层
应该是创建menu.lua和在/lua/ModuleConfig.lua中加入loadModule('menu')吧

Rank: 1

发表于 2022-4-25 15:47:02 | 显示全部楼层
Bless.lua这个名字应该是写错了 应该叫menu.lua才对 不过不影响,起什么名字就load什么就可以了

Rank: 1

 楼主| 发表于 2022-4-25 16:58:55 | 显示全部楼层
叛逆小黑 发表于 2022-4-25 12:54
另外大佬如果不想那么复杂靠做动作触发 能不能支持换成/h 或者/help这样激活呢 ...

两段代码上方有一段是教怎么简化新ng代码的,再不大改新内挂的前提下,最短可以缩短到”/h h“这么长

Rank: 1

 楼主| 发表于 2022-4-25 17:00:23 | 显示全部楼层
感谢四楼五楼发现的错误,我看了一眼,无伤大雅的错误还有很多,第一次发帖不是很熟练,写着写着就不让改了
发表于 2022-4-25 23:20:18 | 显示全部楼层
大佬666,30天速成lua

Rank: 1

发表于 2022-4-26 00:16:29 | 显示全部楼层
jzh890505 发表于 2022-4-25 16:58
两段代码上方有一段是教怎么简化新ng代码的,再不大改新内挂的前提下,最短可以缩短到”/h h“这么长 ...

我的意思是通过msg /h or /help 这样来替代坐下这个动作来实现menu的效果

Rank: 1

 楼主| 发表于 2022-4-26 00:52:25 | 显示全部楼层
muscipular 发表于 2022-4-25 23:20
大佬666,30天速成lua

留下了没有技术的眼泪
您需要登录后才可以回帖 登录 | 注册/Sign up

本版积分规则

手机版|cgmsv引擎论坛

GMT+8, 2024-11-21 21:44 , Processed in 0.249743 second(s), 10 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表