40731803 发表于 2024-5-26 08:19:16

极品转移脚本之动态勾选物品属性

本脚本并非完整转移脚本,目前只写到了放入装备后动态获取装备属性,然后根据玩家勾选的属性运算需要费用等操作
效果图:












脚本代码:
module('QuestDiary_XH_测试NPC', package.seeall)
--本脚本由黑哥编写,详情咨询QQ:314110995
local LitemValueList = {}--物品极品表类型组,用于存放放入OK框中物品的所有极品属性类型
function main(Npc, Player)--主函数入口
    local S =
      [[
            <>\
            <>\
            <>请放入物品到下面的框中\
            <ItemBox:0:6:513:64:90:32:32:*:放入极品装备>
            <ItemBox:1:6:513:290:90:32:32:*:放入接受极品的装备>\
      ]]
   vvlib:OpenMerchantBigDlg(Player, 4, 402, 1, 4, 0, 0, 1, 400, 1, 1)
Npc:Say(Player, '', S, false) --显示NPC界面
--勾叉图Prguse3.wil 488未选中,489选中 引擎中对应的wil资源序号:6
--物品框Prguse3.wil 513
end
function AllItemInSay(Npc,Player,sfgx)--全部OK框放入物品后触发,所有核心操作都从这里分发
    local say1 = '<>    请勾选要转移的属性:\\<> \\'
    local UserItem =Player:GetCustomBox(0)--提取OK框0的物品
    local S =
      [[
            <>\
            <>\
            <>请放入物品到下面的框中\
            <ItemBox:0:6:513:64:90:32:32:*:放入极品装备>
            <ItemBox:1:6:513:290:90:32:32:*:放入接受极品的装备>\
            <>\<>\<>\<>\<>\
      ]]
      if UserItem ~= nil then
            if sfgx == false then--检查玩家是否点击了勾选按钮,如果没有,证明是放入的新装备,所以要立即获取该装备的全部极品属性
                GetItemValue(Npc,Player)--跳到极品获取的函数进行物品极品枚举操作
            end
            for i =1,#LitemValueList do--根据获取的极品列表数组进行操作
                if LitemValueList.zt == 1 then--检查数组中当前序号的勾选状态
                  LitemValueList.TEXT=string.gsub(LitemValueList.TEXT,'488','489',1)--勾选则打勾
                else
                  LitemValueList.TEXT=string.gsub(LitemValueList.TEXT,'489','488',1)--未勾选则打叉
                end
             say1=say1..LitemValueList.TEXT--显示列表中的文字信息(即极品列表信息)
            end
            say1=say1..GetPir(Npc,Player)--获取勾选后的所需价格运算
      end
    Npc:Say(Player, '', S..say1, false) --显示NPC界面
end
function GetPir(Npc,Player)--获取勾选后的极品转移所需元宝数量
    local x = ''
    local ybz = 0
    for i=1,#LitemValueList do
      if LitemValueList.zt == 1 then
            if LitemValueList.STD == 5 or LitemValueList.STD == 6 then
                ybz =ybz + LitemValueList.Value * 2--如果是武器则设置为单个极品点数*2元宝
            else
                ybz =ybz + LitemValueList.Value * 1--否则设置为单个极品点数*1元宝
            end
      end
    end
   x =x ..'<>                需要元宝数量:'..tostring(ybz)
    return x,ybz--返回对话文字和元宝值
end
function GXBH(Npc,Player,x)--勾选状态设置
    for i = 1,#LitemValueList do--循环数组数量即可进行操作
      if LitemValueList.gxid == tonumber(x) then--查看传入的参数x则能得到玩家勾选的是哪个条目
            if LitemValueList.zt == 0 then --检查该条目的勾选状态是否打勾,如果没有则设置为1(打勾)
                LitemValueList.zt = 1
            else
                LitemValueList.zt = 0--如果该条目已经打勾,证明玩家想取消勾选,所以设置0(取消打勾)
            end
      end
    end
    AllItemInSay(Npc,Player,true)
end
function GetItemValue(Npc,Player)--取得装备上所有允许转移的极品
    --LitemValueList 装备放入后的列表,里面包含放入装备的提示文字和勾选状态
    local UserItem =Player:GetCustomBox(0)
    local StdItem = vvlib:GetStdItemByIndex(UserItem.Index)
    delalldata(Npc, Player)--清空用于缓存的数组,以便放入新的数据
    if UserItem ~= nil then
       if StdItem ~= nil then
      if StdItem.StdMode == 5 or StdItem.StdMode == 6 then--判断物品类型,以便显示不同的文字信息
            for i = 0, 4 do--0-4循环则为极品属性位置0-4对应,如果改为0-13则几乎所有极品都拿出来了,但同时需要写更多文字提示
                --进入循环第一件事是创建一个临时结构,里面包含了:NPC显示文字,物品属性位置,物品类型,和极品点数
                local LS = {TEXT='',gxid=-1,zt=0,STD=StdItem.StdMode,Value=0}
                if UserItem.Value > 0 then--当物品的极品大于0则证明该物品的属性位置存在极品
                  if i == 0 then--根据属性位置设置不同的提示文字,武器的属性位置0则是攻击
                        LS.TEXT='<>   <Img:488:6:0:0/@GXBH(0)><攻击/@GXBH(0)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i == 1 then--根据属性位置设置不同的提示文字,武器的属性位置1则是魔法
                        LS.TEXT='<>   <Img:488:6:0:0/@GXBH(1)><魔法/@GXBH(1)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i == 2 then--根据属性位置设置不同的提示文字,武器的属性位置2则是道术
                        LS.TEXT='<>   <Img:488:6:0:0/@GXBH(2)><道术/@GXBH(2)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i ==3 then--根据属性位置设置不同的提示文字,武器的属性位置3则是幸运
                        LS.TEXT='<>   <Img:488:6:0:0/@GXBH(3)><幸运/@GXBH(3)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i == 4 then--根据属性位置设置不同的提示文字,武器的属性位置4则是诅咒
                        LS.TEXT='<>   <Img:488:6:0:0/@GXBH(4)><诅咒/@GXBH(4)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  end
                  LS.gxid=i--记录下极品序号,用于勾选需要,同时此序号也是对应的物品属性位置
                  LS.Value= UserItem.Value--记录下物品极品点数,用于运算价格
                  LitemValueList[#LitemValueList+1]=LS--将记录的类型加入到数组保存,注意后续所有操作都是依据此数组而操作
                end
            end
      else
            for i = 0, 4 do
                local LS = {TEXT='',gxid=-1,zt=0,STD=StdItem.StdMode,Value=0}
                if UserItem.Value > 0 then
                  if i == 0 then--根据属性位置设置不同的提示文字,非武器物品的属性位置0则是防御
                        LS.TEXT='<>   <Img:488:6:0:0/GXBH(0)><防御/@GXBH(0)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i == 1 then
                        LS.TEXT='<>   <Img:488:6:0:0/GXBH(1)><魔御/@GXBH(1)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i == 2 then
                        LS.TEXT='<>   <Img:488:6:0:0/GXBH(2)><攻击/@GXBH(2)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i ==3 then
                        LS.TEXT='<>   <Img:488:6:0:0/GXBH(3)><魔法/@GXBH(3)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  elseif i == 4 then
                        LS.TEXT='<>   <Img:488:6:0:0/GXBH(4)><道术/@GXBH(4)>:+'.. tostring(UserItem.Value)..'\\<> \\'
                  end
                  LS.gxid=i
                  LS.Value= UserItem.Value
                  LitemValueList[#LitemValueList+1]=LS
                end
            end
      end
       end
    end
   -- return X
end
function delalldata(Npc,Player)--删除缓存的数组
    for i = #LitemValueList, 1, -1 do
      table.remove(LitemValueList,i)
    end
end
function ItemIntoBox0(Npc,Player)--0号框放入物品触发
    local UserItem
    UserItem=Player:GetCustomBox(1)
    if UserItem ~= nil then
      AllItemInSay(Npc,Player,false)
    else
      Player:SysMsg('请向右侧框内放入准备接收极品的装备',249,255,1)
    end
end
function ItemOutBox0(Npc,Player)--0号框拿走物品触发
    AllItemInSay(Npc,Player,false)
end
function ItemIntoBox1(Npc,Player)--1号框放入物品触发
local UserItem
    UserItem=Player:GetCustomBox(0)
    if UserItem ~= nil then
      AllItemInSay(Npc,Player,false)
    else
      Player:SysMsg('请在左侧框内放入带有极品的装备',249,255,1)
    end
end
function ItemOutBox1(Npc,Player)--1号框拿走物品触发
    AllItemInSay(Npc,Player,false)
end

页: [1]
查看完整版本: 极品转移脚本之动态勾选物品属性