本帖最后由 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代码的前提下,是否可以简化呢?
比如红框这里的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为人物图档编号)
- ---模块类
- local ngModule = ModuleBase:createModule('ng')
-
- -- 普通玩家命令
- local commandsNormal = {}
-
- local function addFrame(charIndex)
- --Char.DischargeParty(charIndex);
- Char.SetData(charIndex, CONST.CHAR_声望, 200000);
- end
-
- local function identity(player)
- local Count = 0
- for itemSlot = 8, 27 do
- local ItemIndex = Char.GetItemIndex(player, itemSlot)
- if ItemIndex > 0 then
- local money = Char.GetData(player, CONST.CHAR_金币);
- local itemLv = Item.GetData(ItemIndex, CONST.道具_等级);
- local price = itemLv * 200;
- if Item.GetData(ItemIndex, CONST.道具_已鉴定) == 0 and money >= (itemLv * 200) then
- Count = Count + 1
- Char.SetData(player, CONST.CHAR_金币, money - price);
- Item.SetData(ItemIndex, CONST.道具_已鉴定, 1)
- NLG.SystemMessage(player, "[系统] 您鉴定的道具等级为" .. itemLv .. "级。扣除魔币" .. price .. "G");
- NLG.SystemMessage(player, "[系统] 你身上的 " .. Item.GetData(ItemIndex, CONST.道具_鉴前名) .. "已鉴定为 " .. Item.GetData(ItemIndex, CONST.道具_名字))
- Item.UpItem(player, itemSlot);
- NLG.UpChar(player);
- return ;
- end
- end
- end
- if Count == 0 then
- NLG.SystemMessage(player, "[系统] 你身上没有需要鉴定的物品【或你的钱不足以鉴定此道具】");
- return ;
- end
- return
- end
-
- local function repairEquipment(player)
- local Count = 0
- for ItemSlot = 8, 8 do
- local ItemIndex = Char.GetItemIndex(player, ItemSlot)
- local money = Char.GetData(player, CONST.CHAR_金币);
- local itemLv = Item.GetData(ItemIndex, CONST.道具_等级);
- local itemName = Item.GetData(ItemIndex, CONST.道具_名字);
- local itemDur = Item.GetData(ItemIndex, CONST.道具_耐久);
- local itemMaxDur = Item.GetData(ItemIndex, CONST.道具_最大耐久);
- local repairedDur = itemMaxDur - itemDur
- --local decMaxDur = repairedDur * 1
- local price = repairedDur * 10
- local itemType = Item.GetData(ItemIndex, CONST.道具_类型);
- if money > price and itemMaxDur > itemDur and itemType >= 0 and itemType <= 14 then
- Count = Count + 1
- Char.SetData(player, CONST.CHAR_金币, money - price);
- --Item.SetData(ItemIndex, CONST.道具_耐久, itemDur + xhnj);
- --Item.UpItem(player, ItemSlot);
- -- local djnj1 = Item.GetData(ItemIndex,CONST.道具_耐久);
- -- local djzdnj1 = Item.GetData(ItemIndex,CONST.道具_最大耐久);
- Item.SetData(ItemIndex, CONST.道具_耐久, itemMaxDur);
- Item.SetData(ItemIndex, CONST.道具_最大耐久, itemMaxDur);
- NLG.SystemMessage(player, "[系统] 您修理的装备【" .. itemName .. "】恢复了【" .. repairedDur .. "】耐久。扣除魔币【" .. price .. "G】");
- Item.UpItem(player, ItemSlot);
- NLG.UpChar(player);
- return
- end
- end
- if Count == 0 then
- NLG.SystemMessage(player, "[系统] 你道具栏第一格没有要恢复耐久的装备或者您的修理魔币不足。");
- return
- end
- return
- end
-
- local function spriteRepair(player)
- local ZH = Char.GetData(player, CONST.CHAR_掉魂);
- local money = Char.GetData(player, CONST.CHAR_金币);
- local LV = Char.GetData(player, CONST.CHAR_等级);
- local ZHMB = ZH * 200;
- local ZHMBKC = ZHMB * LV
- if ZH <= 0 then
- NLG.SystemMessage(player, "你没有掉魂。");
- end
- if money >= ZHMBKC and ZH > 0 then
- Char.SetData(player, CONST.CHAR_金币, money - ZHMBKC);
- Char.SetData(player, CONST.CHAR_掉魂, 0);
- Char.FeverStop(player);
- NLG.UpChar(player);
- NLG.SystemMessage(player, "招魂完成。招魂数量为【" .. ZH .. "】费用为【" .. ZHMBKC .. "】魔币。");
- end
- if money < ZHMBKC then
- NLG.SystemMessage(player, "连钱都没有你还招魂,一边尿尿玩泥巴去吧。【招魂价格计算 掉魂*1000*等级】");
- end
- end
-
- local function healthRepair(player)
- local i = Char.GetData(player, CONST.CHAR_受伤);
- local money = Char.GetData(player, CONST.CHAR_金币);
- if (Char.GetData(player, CONST.CHAR_受伤) < 1) then
- NLG.SystemMessage(player, "您未受伤。");
- return ;
- end
- if (money >= 200) and (Char.GetData(player, CONST.CHAR_受伤) > 0 and Char.GetData(player, CONST.CHAR_受伤) < 26) then
- Char.SetData(player, CONST.CHAR_受伤, 0);
- Char.SetData(player, CONST.CHAR_金币, money - 200);
- NLG.UpdateParty(player);
- NLG.UpChar(player);
- NLG.SystemMessage(player, "恭喜你治疗完毕。");
- NLG.SystemMessage(player, "扣除200魔币。");
- return ;
- end
- if (money >= 400) and (Char.GetData(player, CONST.CHAR_受伤) > 24 and Char.GetData(player, CONST.CHAR_受伤) < 51) then
- Char.SetData(player, CONST.CHAR_受伤, 0);
- Char.SetData(player, CONST.CHAR_金币, money - 400);
- NLG.UpdateParty(player);
- NLG.UpChar(player);
- NLG.SystemMessage(player, "恭喜你治疗完毕。");
- NLG.SystemMessage(player, "扣除400魔币。");
- return ;
- end
- if (money >= 800) and (Char.GetData(player, CONST.CHAR_受伤) > 49 and Char.GetData(player, CONST.CHAR_受伤) < 76) then
- Char.SetData(player, CONST.CHAR_受伤, 0);
- Char.SetData(player, CONST.CHAR_金币, money - 800);
- NLG.UpdateParty(player);
- NLG.UpChar(player);
- NLG.SystemMessage(player, "恭喜你治疗完毕。");
- NLG.SystemMessage(player, "扣除800魔币。");
- return ;
- end
- if (money >= 1000) and (Char.GetData(player, CONST.CHAR_受伤) > 74 and Char.GetData(player, CONST.CHAR_受伤) < 101) then
- Char.SetData(player, CONST.CHAR_受伤, 0);
- Char.SetData(player, CONST.CHAR_金币, money - 1000);
- NLG.UpdateParty(player);
- NLG.UpChar(player);
- NLG.SystemMessage(player, "恭喜你治疗完毕。");
- NLG.SystemMessage(player, "扣除1000魔币。");
- return ;
- else
- NLG.SystemMessage(player, "对不起!您的魔币不足,治疗价格为【白伤200】【黄伤400】【紫伤800】【红伤1000】!");
- return ;
- end
- return 0
- end
-
- function commandsNormal.where(charIndex, args)
- local target = charIndex;
- if #args == 1 then
- target = tonumber(args[1])
- end
- NLG.TalkToCli(charIndex, -1, target ..
- ' 地图:' .. tostring(Char.GetData(target, CONST.CHAR_地图)) .. '/' .. tostring(Char.GetData(target, CONST.CHAR_地图类型)) ..
- ', X:' .. tostring(Char.GetData(target, CONST.CHAR_X)) ..
- ', Y:' .. tostring(Char.GetData(target, CONST.CHAR_Y)) ..
- ', 方向:' .. tostring(Char.GetData(target, CONST.CHAR_方向))
- )
- end
-
- function commandsNormal.c(charIndex, args)
- if args[1] == 'zl' then
- return healthRepair(charIndex)
- elseif args[1] == 'zh' then
- return spriteRepair(charIndex)
- elseif args[1] == 'sw' then
- return addFrame(charIndex)
- end
- end
-
- -- function commandsNormal.rank4(charIndex)
- -- if Char.GetData(charIndex, CONST.CHAR_职阶) == 3 and Char.GetData(charIndex, CONST.CHAR_等级) >= 100 then
- -- Char.SetData(charIndex, CONST.CHAR_职阶, 4);
- -- Char.SetData(charIndex, CONST.CHAR_职业, Char.GetData(charIndex, CONST.CHAR_职业) + 1);
- -- NLG.UpChar(charIndex);
- -- end
- -- end
-
- function commandsNormal.i(charIndex, args)
- if args[1] == 'zl' then
- NLG.SortItem(charIndex)
- NLG.UpChar(charIndex);
- elseif args[1] == 'jd' then
- return identity(charIndex)
- elseif args[1] == 'xl' then
- return repairEquipment(charIndex)
- end
- end
-
- function commandsNormal.changeSex(charIndex, args)
- print( Char.GetData(charIndex, CONST.CHAR_形象), Char.GetData(charIndex, CONST.CHAR_原形), Char.GetData(charIndex, CONST.CHAR_原始图档))
- if args[1] then
- Char.SetData(charIndex, CONST.CHAR_形象, args[1]);
- else
- Char.SetData(charIndex, CONST.CHAR_形象, Char.GetData(charIndex, CONST.CHAR_原形));
- end
- end
-
- function commandsNormal.daka(charIndex)
- --Char.SetData(charIndex, CONST.CHAR_卡时, 99 * 3600);
- if Char.IsFeverTime(charIndex) == 1 then
- Char.FeverStop(charIndex)
- else
- Char.FeverStart(charIndex)
- end
- NLG.UpChar(charIndex)
- end
-
- function commandsNormal.redoDp(charIndex)
- local total = (Char.GetData(charIndex, CONST.CHAR_等级) - 1) * 4 + 30;
- local s = { CONST.CHAR_体力, CONST.CHAR_力量, CONST.CHAR_强度, CONST.CHAR_速度, CONST.CHAR_魔法 }
- for i, v in pairs(s) do
- Char.SetData(charIndex, v, 0);
- end
- Char.SetData(charIndex, CONST.CHAR_升级点, total);
- NLG.UpChar(charIndex)
- end
-
- function commandsNormal.encount(charIndex)
- Battle.Encount(charIndex, charIndex);
- end
-
- function commandsNormal.hc(charIndex)
- --Char.DischargeParty(charIndex);
- Char.Warp(charIndex, 0, 1000, 236, 88);
- end
-
- local function getPetBp(player, args)
- local hasPet = false;
- for i = args[2] or 0, args[2] or 4 do
- local pet = Char.GetPet(player, i);
- if (pet >= 0) then
- hasPet = true;
- local arr_rank1 = Pet.GetArtRank(pet, CONST.PET_体成);
- local arr_rank11 = Pet.FullArtRank(pet, CONST.PET_体成);
- local arr_rank2 = Pet.GetArtRank(pet, CONST.PET_力成);
- local arr_rank21 = Pet.FullArtRank(pet, CONST.PET_力成);
- local arr_rank3 = Pet.GetArtRank(pet, CONST.PET_强成);
- local arr_rank31 = Pet.FullArtRank(pet, CONST.PET_强成);
- local arr_rank4 = Pet.GetArtRank(pet, CONST.PET_敏成);
- local arr_rank41 = Pet.FullArtRank(pet, CONST.PET_敏成);
- local arr_rank5 = Pet.GetArtRank(pet, CONST.PET_魔成);
- local arr_rank51 = Pet.FullArtRank(pet, CONST.PET_魔成);
- local a1 = (arr_rank1 - arr_rank11);
- local a2 = (arr_rank2 - arr_rank21);
- local a3 = (arr_rank3 - arr_rank31);
- local a4 = (arr_rank4 - arr_rank41);
- local a5 = (arr_rank5 - arr_rank51);
- local a6 = a1 + a2 + a3 + a4 + a5;
- local a61 = arr_rank1 + arr_rank2 + arr_rank3 + arr_rank4 + arr_rank5;
- NLG.SystemMessage(player, Char.GetData(pet, CONST.CHAR_名字) .. "总:" .. a61 .. "(" .. a6 .. ')')
- NLG.SystemMessage(player, "体:" .. arr_rank1 .. "(" .. a1 .. ") 力:" .. arr_rank2 .. "(" .. a2 .. ") 强:" .. arr_rank3 .. "(" .. a3 .. ") 敏:" ..
- arr_rank4 .. "(" .. a4 .. ") 魔:" .. arr_rank5 .. "(" .. a5 .. ")");
- end
- end
- if not args[2] then
- if hasPet then
- NLG.SystemMessage(player, "-----------------------------------");
- else
- NLG.SystemMessage(player, "没有宠物");
- end
- end
- end
-
- local function petRebirth(player, args)
- local pet = Char.GetPet(player, tonumber(args[2]));
- if pet >= 0 then
- local s = { CONST.PET_体成, CONST.PET_力成, CONST.PET_强成, CONST.PET_敏成, CONST.PET_魔成 };
- for i, v in pairs(s) do
- local r = Pet.FullArtRank(pet, v);
- Pet.SetArtRank(pet, v, r - math.random(0, 4))
- end
- Pet.ReBirth(player, pet);
- local arr_rank1 = Pet.GetArtRank(pet, CONST.PET_体成);
- local arr_rank11 = Pet.FullArtRank(pet, CONST.PET_体成);
- local arr_rank2 = Pet.GetArtRank(pet, CONST.PET_力成);
- local arr_rank21 = Pet.FullArtRank(pet, CONST.PET_力成);
- local arr_rank3 = Pet.GetArtRank(pet, CONST.PET_强成);
- local arr_rank31 = Pet.FullArtRank(pet, CONST.PET_强成);
- local arr_rank4 = Pet.GetArtRank(pet, CONST.PET_敏成);
- local arr_rank41 = Pet.FullArtRank(pet, CONST.PET_敏成);
- local arr_rank5 = Pet.GetArtRank(pet, CONST.PET_魔成);
- local arr_rank51 = Pet.FullArtRank(pet, CONST.PET_魔成);
- local a1 = (arr_rank1 - arr_rank11);
- local a2 = (arr_rank2 - arr_rank21);
- local a3 = (arr_rank3 - arr_rank31);
- local a4 = (arr_rank4 - arr_rank41);
- local a5 = (arr_rank5 - arr_rank51);
- local a6 = a1 + a2 + a3 + a4 + a5;
- local a61 = arr_rank1 + arr_rank2 + arr_rank3 + arr_rank4 + arr_rank5;
- NLG.SystemMessage(player, Char.GetData(pet, CONST.CHAR_名字) .. "总:" .. a61 .. "(" .. a6 .. ')')
- NLG.SystemMessage(player, "体:" .. arr_rank1 .. "(" .. a1 .. ") 力:" .. arr_rank2 .. "(" .. a2 .. ") 强:" .. arr_rank3 .. "(" .. a3 .. ") 敏:" ..
- arr_rank4 .. "(" .. a4 .. ") 魔:" .. arr_rank5 .. "(" .. a5 .. ")");
- NLG.SystemMessage(player, "-----------------------------------");
- end
- end
-
- local function FullArtRank(player, args)
- local pet = Char.GetPet(player, tonumber(args[2]));
- if pet >= 0 then
- Pet.SetArtRank(pet,%宠档_体成%,Pet.FullArtRank(pet,%宠档_体成%));
- Pet.SetArtRank(pet,%宠档_力成%,Pet.FullArtRank(pet,%宠档_力成%));
- Pet.SetArtRank(pet,%宠档_强成%,Pet.FullArtRank(pet,%宠档_强成%));
- Pet.SetArtRank(pet,%宠档_敏成%,Pet.FullArtRank(pet,%宠档_敏成%));
- Pet.SetArtRank(pet,%宠档_魔成%,Pet.FullArtRank(pet,%宠档_魔成%));
- Pet.ReBirth(player, pet);
- NLG.SystemMessage(player,Char.GetData(pet, CONST.CHAR_名字).."已经满档");
- end
- end
-
- function commandsNormal.p(player, args)
- if args[1] == 'bp' then
- return getPetBp(player, args);
- elseif string.lower(args[1] or '') == 'xd' then
- return petRebirth(player, args);
- elseif string.lower(args[1] or '') == 'md' then
- return FullArtRank(player, args);
- end
- end
-
- function commandsNormal.bank(player, args)
- NLG.OpenBank(player, player);
- end
-
- function ngModule:handleTalkEvent(charIndex, msg)
- self:logDebug('ng', charIndex, msg);
- local command = msg:match('^/([%w]+)')
- if commandsNormal[command] then
- local arg = msg:match('^/[%w]+ +(.+)$')
- arg = arg and string.split(arg, ' ') or {}
- commandsNormal[command](charIndex, arg);
- return 0
- end
- return 1;
- end
-
- --- 加载模块钩子
- function ngModule:onLoad()
- self:logInfo('load')
- self:regCallback('TalkEvent', Func.bind(self.handleTalkEvent, self))
- end
-
- --- 卸载模块钩子
- function ngModule:onUnload()
- self:logInfo('unload')
- end
-
- return ngModule;
复制代码
虽然代码已经简化了,但是随着代码的增多是不是也会出现记不住,记错的现象,基于这个问题,我又写了一个ng可视化的lua,代码如下- local Module = ModuleBase:createModule('menu')
-
- local menutable={{"1.回城","/hc"},{"2.整理","/i zl"},{"3.打卡","/daka"},{"4.远程银行","/bank"},{"5.当前坐标","/where"},
- {"6.鉴定","/i jd"},{"7.洗档","/p xd 0"},{"8.算档","/p bp"},{"9.满档","/p md 0"},{"10.治疗","/c zl"},
- {"11.招魂","/c zh"},{"12.修理","/i xl"},{"13.洗点","/redoDp"}}
-
- local function calcWarp()--计算页数和最后一页数量
- local totalpage = math.modf(#menutable / 8) + 1
- local remainder = math.fmod(#menutable, 8)
- return totalpage, remainder
- end
-
- function Module:onLoad()
- self:logInfo('load')
- local menuNPC = self:NPC_createNormal('内挂菜单', 105502, { x = 6, y = 6, mapType = 0, map = 666, direction = 4 });
- self:NPC_regWindowTalkedEvent(menuNPC, function(npc, player, _seqno, _select, _data)
- local column = tonumber(_data)
- local page = tonumber(_seqno)
- local warpPage = page;
- local winMsg = "1\\n请下达指令\\n"
- local winButton = CONST.BUTTON_关闭;
- local totalPage, remainder = calcWarp()
- --上页16 下页32 关闭/取消2
-
- if _select > 0 then
- if _select == CONST.BUTTON_下一页 then
- warpPage = warpPage + 1
- if (warpPage == totalPage) or ((warpPage == (totalPage - 1) and remainder == 0)) then
- winButton = CONST.BUTTON_上取消
- else
- winButton = CONST.BUTTON_上下取消
- end
- elseif _select == CONST.BUTTON_上一页 then
- warpPage = warpPage - 1
- if warpPage == 1 then
- winButton = CONST.BUTTON_下取消
- else
- winButton = CONST.BUTTON_上下取消
- end
- elseif _select == 2 then
- warpPage = 1
- return
- end
- local count = 8 * (warpPage - 1)
- if warpPage == totalPage then
- for i = 1 + count, remainder + count do
- winMsg = winMsg .. menutable[i][1] .. "\\n"
- end
- else
- for i = 1 + count, 8 + count do
- winMsg = winMsg .. menutable[i][1] .. "\\n"
- end
- end
- NLG.ShowWindowTalked(player, npc, CONST.窗口_选择框, winButton, warpPage, winMsg);
- else
- local count = 8 * (warpPage - 1) + column
- getModule('ng'):handleTalkEvent(player,menutable[count][2]);
- end
- end)
-
- self:regCallback('CharActionEvent', function(player, actionID)
- if actionID == %动作_坐下% then
- local msg = "1\\n请下达指令\\n"
- for i = 1, 8 do
- msg = msg .. menutable[i][1] .. "\\n"
- end
- NLG.ShowWindowTalked(player, menuNPC, CONST.窗口_选择框, CONST.BUTTON_下取消, 1, msg);
- end
- end)
- end
-
-
- function Module:onUnload()
- self:logInfo('unload');
- end
-
- return Module;
复制代码
这个LUA的操作原理是,当人物执行坐下的动作指令时,会呼出窗口,所有的指令可以在窗口中点击进行,由于坐下的快捷指令时ctrl+1,所以每当我们点击ctrl+1时,窗口就会弹出,这也是我们选择他的原因。
使用我的可视化代码需要注意以下几个问题:
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 |