lua脚本外挂写法[全网最全最早发布]

本文由周某(既本人)整理。


——


function split(szFullString, szSeparator) 
local nFindStartIndex = 1 
local nSplitIndex = 1 
local nSplitArray = {} 
while true do 
local nFindLastIndex = string.find
(szFullString, szSeparator, nFindStartIndex) 
if not nFindLastIndex then 
nSplitArray[nSplitIndex] = 
string.sub(szFullString, nFindStartIndex, string.len
(szFullString)) 
break end 
nSplitArray[nSplitIndex] = string.sub
(szFullString, nFindStartIndex, nFindLastIndex - 1) 
nFindStartIndex = nFindLastIndex + string.len
(szSeparator) 
nSplitIndex = nSplitIndex + 1 end return 
nSplitArray end 
function xgxc(szpy, qmxg) 
for x = 1, #(qmxg) do 
xgpy = szpy + qmxg[x]["offset"] 
xglx = qmxg[x]["type"] 
xgsz = qmxg[x]["value"]
xgdj = qmxg[x]["freeze"] 
if xgdj == nil or xgdj == "" then
gg.setValues({[1] 
= {address = xgpy, flags = xglx, value = xgsz}}) 
else
gg.addListItems({[1] 
= {address = xgpy, flags = xglx, 
freeze = xgdj, value = xgsz}}) end 
xgsl = xgsl + 1 xgjg = true end end 
function xqmnb(qmnb)
  gg.clearResults()
  gg.setRanges(qmnb[1]["memory"])
  gg.toast("开始搜索") gg.setVisible(false)
  gg.searchNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
  if gg.getResultCount() == 0 then gg.setVisible(false)
    gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false)
   else
    gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
    gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
    gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
gg.setVisible(false)    if gg.getResultCount() == 0 then
gg.setVisible(false)      gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false)
gg.setVisible(false)     else
gg.setVisible(false)      sl = gg.getResults(999999)
gg.setVisible(false)      sz = gg.getResultCount()
gg.setVisible(false)      xgsl = 0 if sz > 999999 then
gg.setVisible(false)        sz = 999999 end for i = 1, sz do
        pdsz = true for v = 4, #(qmnb) do if
            pdsz == true then gg.setVisible(false)
            pysz = {} pysz[1]
            = {} pysz[1].address
            = sl[i].address + qmnb[v]["offset"] pysz[1].flags
            = qmnb[v]["type"]
            szpy = gg.getValues(pysz)
            pdpd = qmnb[v]["lv"] .. ";" .. szpy[1].value szpd
            = split(pdpd, ";") tzszpd
            = szpd[1] pyszpd = szpd[2]
            if tzszpd == pyszpd then
              pdjg = true pdsz = true else
              pdjg = false pdsz = false end end end if
          pdjg == true then szpy
          = sl[i].address xgxc(szpy, qmxg) end end
gg.setVisible(false)      if xgjg == true then
gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "成功") 
       else
gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "失败") 
end end end end

D=gg.TYPE_DWORD  E=gg.TYPE_DOUBLE  F=gg.TYPE_FLOAT W=gg.TYPE_WORD B=gg.TYPE_BYTE X=gg.TYPE_XOR Q=gg.TYPE_QWORD

-------------------------------------------------------------------------------------------------------------------------------
gg.alert("输入一开始提示的文字一般是欢迎之类的")
function main()--这个是当运行main时显示这个页面
  aa=gg.choice({
    "◎第一个分类◎",
    "◎第二个分类◎",
    "◎退出◎",
  },0,"输入页面上方显示的文字,一般是这里是主菜单")
if aa==1 then a1() end--前面的1是指按下第一个按钮,后面的a1是指运行a1文件
if aa==2 then a2() end--前面的2是指按下第二个按钮,后面的a2是指运行a2文件
if aa==3 then gg.toast("已退出\n感谢使用")print("已退出")os.exit() end--没什么好说的
end
-------------------------------------------------------------------------------------------------------------------------------
function a1()--这个是当运行main时显示这个页面联系到上面的代码意思是按下菜单的第一个按钮运行这个页面
    aa=gg.choice({
        "丨☔功能1🔥丨",
        "丨☔功能2🔥丨",
        "丨☔功能3🔥丨",
        "丨☔功能4🔥丨",
        "丨☔返回主菜单🔥丨",
      },0,"输入页面上方显示的文字,一般是这里是分类的名字概括里面功能")
if aa==1 then dd1() end--前面的1是指按下第一个按钮,后面的dd1是指运行dd1文件{注意:所有调用的a1、dd1之类的不能重复}
if aa==2 then dd2() end--前面的2是指按下第二个按钮,后面的dd2是指运行dd2文件
if aa==3 then dd3() end--前面的3是指按下第三个按钮,后面的dd3是指运行dd3文件
if aa==4 then dd4() end--前面的4是指按下第四个按钮,后面的dd4是指运行dd4文件
if aa==5 then main() end--前面的5是指按下第五个按钮,后面的main是指运行main文件而main是对应的主菜单所以就回到了主菜单
------------------------------------------------------------------------------------------------------------------------------------------------下面是放上源码就好了
--如:
function dd1()
----此处放功能
----此处放功能
----此处放功能
----此处放功能
----此处放功能
--功能长度没有限制
end--这个end很重要,是结束这个功能的没有这个end会直接报错如果你得到的功能源码里有end则不需要单独加
------------------------------------------------------------------------------------------------------------------------------------------------如:
function t2()
qmnb = {
{["memory"] = 16384},
{["name"] = "加速"},
{["value"] = 0.0010000000474974513, ["type"] = 16},
{["lv"] = 0.20000000298023224, ["offset"] = -4, ["type"] = 16},
{["lv"] = 0.0, ["offset"] = 4, ["type"] = 16},
{["lv"] = 0.10000000149011612, ["offset"] = 8, ["type"] = 16},
}
qmxg = {
{["value"] = 0.2, ["offset"] = 0, ["type"] = 16},
}
xqmnb(qmnb)
end
--这是你得到的源码,想要加到功能里只需要把function t2()这个改成对应被运行的
--如:加到功能一里面只需要改成function dd1()即可
function dd1()
qmnb = {
{["memory"] = 16384},
{["name"] = "加速"},
{["value"] = 0.0010000000474974513, ["type"] = 16},
{["lv"] = 0.20000000298023224, ["offset"] = -4, ["type"] = 16},
{["lv"] = 0.0, ["offset"] = 4, ["type"] = 16},
{["lv"] = 0.10000000149011612, ["offset"] = 8, ["type"] = 16},
}
qmxg = {
{["value"] = 0.2, ["offset"] = 0, ["type"] = 16},
}
xqmnb(qmnb)
end
--这样就好了其他的功能一样
--这就是功能调用
------------------------------------------------------------------------------------------------------------------------------------------------下面的脚本的结束,也就是脚本必须要有的部分
while true do
if gg.isVisible(true) then
    gg.setVisible(false)
    main()
    gg.clearResults()
    gg.setVisible(false)
end end
--这一段必须放到最后,意思是脚本运行完了必须要有不然报错
--注意:这个脚本无法运行因为为了讲解我没有在意语法错误,只是作为一个讲解,所以不要作为模板使用
--
--这个教程是单纯的得到源码用模板写脚本的教程

--下面的是模板需要自取
-------------------------------------------------------------------------------------------------------------------------------------------------------------
function split(szFullString, szSeparator) 
local nFindStartIndex = 1 
local nSplitIndex = 1 
local nSplitArray = {} 
while true do 
local nFindLastIndex = string.find
(szFullString, szSeparator, nFindStartIndex) 
if not nFindLastIndex then 
nSplitArray[nSplitIndex] = 
string.sub(szFullString, nFindStartIndex, string.len
(szFullString)) 
break end 
nSplitArray[nSplitIndex] = string.sub
(szFullString, nFindStartIndex, nFindLastIndex - 1) 
nFindStartIndex = nFindLastIndex + string.len
(szSeparator) 
nSplitIndex = nSplitIndex + 1 end return 
nSplitArray end 
function xgxc(szpy, qmxg) 
for x = 1, #(qmxg) do 
xgpy = szpy + qmxg[x]["offset"] 
xglx = qmxg[x]["type"] 
xgsz = qmxg[x]["value"]
xgdj = qmxg[x]["freeze"] 
if xgdj == nil or xgdj == "" then
gg.setValues({[1] 
= {address = xgpy, flags = xglx, value = xgsz}}) 
else
gg.addListItems({[1] 
= {address = xgpy, flags = xglx, 
freeze = xgdj, value = xgsz}}) end 
xgsl = xgsl + 1 xgjg = true end end 
function xqmnb(qmnb)
  gg.clearResults()
  gg.setRanges(qmnb[1]["memory"])
  gg.toast("开始搜索") gg.setVisible(false)
  gg.searchNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
  if gg.getResultCount() == 0 then gg.setVisible(false)
    gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false)
   else
    gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
    gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
    gg.refineNumber(qmnb[3]["value"], qmnb[3]["type"]) gg.setVisible(false)
gg.setVisible(false)    if gg.getResultCount() == 0 then
gg.setVisible(false)      gg.toast(qmnb[2]["name"] .. "失败") gg.setVisible(false)
gg.setVisible(false)     else
gg.setVisible(false)      sl = gg.getResults(999999)
gg.setVisible(false)      sz = gg.getResultCount()
gg.setVisible(false)      xgsl = 0 if sz > 999999 then
gg.setVisible(false)        sz = 999999 end for i = 1, sz do
        pdsz = true for v = 4, #(qmnb) do if
            pdsz == true then gg.setVisible(false)
            pysz = {} pysz[1]
            = {} pysz[1].address
            = sl[i].address + qmnb[v]["offset"] pysz[1].flags
            = qmnb[v]["type"]
            szpy = gg.getValues(pysz)
            pdpd = qmnb[v]["lv"] .. ";" .. szpy[1].value szpd
            = split(pdpd, ";") tzszpd
            = szpd[1] pyszpd = szpd[2]
            if tzszpd == pyszpd then
              pdjg = true pdsz = true else
              pdjg = false pdsz = false end end end if
          pdjg == true then szpy
          = sl[i].address xgxc(szpy, qmxg) end end
gg.setVisible(false)      if xgjg == true then
gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "成功") 
       else
gg.setVisible(false)        gg.toast(qmnb[2]["name"] .. "失败") 
end end end end
function editData(qmnb,qmxg)gg.setVisible(false)gg.clearResults()qmnbv=qmnb[3]["value"]or qmnb[3][1]qmnbt=qmnb[3]["type"]or qmnb[3][2]qmnbn=qmnb[2]["name"]or qmnb[2][1]gg.setRanges(qmnb[1]["memory"]or qmnb[1][1])gg.searchNumber(qmnbv,qmnbt)gg.refineNumber(qmnbv,qmnbt)sz=gg.getResultCount()if sz==0 then gg.toast(qmnbn.."开启失败")else sl=gg.getResults(999999)for i=1,sz do pdsz=true for v=4,#qmnb do if pdsz==true then pysz={{}}pysz[1].address=sl[i].address+(qmnb[v]["offset"]or qmnb[v][2])pysz[1].flags=qmnb[v]["type"]or qmnb[v][3]szpy=gg.getValues(pysz)tzszpd=tostring(qmnb[v]["lv"]or qmnb[v][1]):gsub(",","")pyszpd=tostring(szpy[1].value):gsub(",","")if tzszpd==pyszpd then pdjg=true pdsz=true else pdjg=false pdsz=false end end end if pdjg==true then szpy=sl[i].address for x=1,#qmxg do xgsz=qmxg[x]["value"]or qmxg[x][1]xgpy=szpy+(qmxg[x]["offset"]or qmxg[x][2])xglx=qmxg[x]["type"]or qmxg[x][3]xgdj=qmxg[x]["freeze"]or qmxg[x][4]xg={{address=xgpy,flags=xglx,value=xgsz}}if xgdj==true then xg[1].freeze=xgdj gg.addListItems(xg)else gg.setValues(xg)end end xgjg=true end end if xgjg==true then gg.toast(qmnbn.."开启成功")else gg.toast(qmnbn.."开启失败")end end end
D=gg.TYPE_DWORD  E=gg.TYPE_DOUBLE  F=gg.TYPE_FLOAT W=gg.TYPE_WORD B=gg.TYPE_BYTE X=gg.TYPE_XOR Q=gg.TYPE_QWORD
-------------------------------------------------------------------------------------------------------------------------------------------------------------
gg.alert("输入一开始提示的文字")
function main()
  aa=gg.choice({
    "◎第一个分类◎",
    "◎第二个分类◎",
    "◎退出◎",
  },0,"主菜单")
if aa==1 then a1() end
if aa==2 then a2() end
if aa==3 then gg.toast("已退出\n感谢使用")print("已退出")os.exit() end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------
function a1()
    aa=gg.choice({
        "丨☔功能1🔥丨",
        "丨☔功能2🔥丨",
        "丨☔功能3🔥丨",
        "丨☔功能4🔥丨",
        "丨☔返回主菜单🔥丨",
      },0,"功能")
if aa==1 then aa1() end
if aa==2 then aa2() end
if aa==3 then aa3() end
if aa==4 then aa4() end
if aa==5 then main() end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------
function a2()
    aa=gg.choice({
        "丨☔功能1🔥丨",
        "丨☔功能2🔥丨",
        "丨☔功能3🔥丨",
        "丨☔功能4🔥丨",
        "丨☔返回主菜单🔥丨",
      },0,"功能")
if aa==1 then dd1() end
if aa==2 then dd2() end
if aa==3 then dd3() end
if aa==4 then dd4() end
if aa==5 then main() end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------
放入功能


-------------------------------------------------------------------------------------------------------------------------------------------------------------
while true do
if gg.isVisible(true) then
    gg.setVisible(false)
    main()
    gg.clearResults()
    gg.setVisible(false)
end end

第二课:
普通写法:
function aa1()--早说过了
gg.clearResults()--意思是清楚搜索记录
gg.setRanges(gg.REGION_C_ALLOC)--设置内存范围
gg.searchNumber("搜索的值", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_DWORD内存类型
gg.searchNumber("改善的值", gg.TYPE_DWORD, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_DWORD内存类型
gg.getResults(100)--设置改多少个100是改前一百个
gg.editAll("修改的值", gg.TYPE_FLOAT)-- gg.TYPE_FLOAT内存类型
gg.clearResults()--意思是清楚搜索记录
gg.toast("提示的文字")
end

--下面是普通写法冻结模板
function HS16()
     gg.clearResults()--意思是清楚搜索记录
     gg.setRanges(262207)--设置内存范围ps内存
     gg.searchNumber("搜索的值", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_FLOAT内存类型
     gg.searchNumber("改善的值", gg.TYPE_FLOAT, false, gg.SIGN_EQUAL, 0, -1)-- gg.TYPE_FLOAT内存类型
     jg=gg.getResults(100)--设置改多少个100是改前一百个
     sl=gg.getResultCount()
     for i = 1, sl do
          dzy=jg[i].address
          gg.addListItems({[1] = {address = dzy,flags = gg.TYPE_FLOAT,freeze = true,value = 修改的值}})
     end
     gg.toast("提示文字")
     gg.clearResults()
end


freeze = false--不冻结
freeze = true--冻结


-------------------------------------------------------------------------------------------------------------------------------------------------------------
1. function:函数,功能

2. gg.alert  弹出提示窗口

3. gg.toast 屏幕下方弹出提示条( 会自动消失 )

3. gg.prompt 弹出带有控件的提示窗口

4. gg.choice 弹出单选列表窗口

5. gg.clearResults 清除搜索结果

6. gg.editAll 修改搜索结果

7. gg.getFile 获取当前脚本所在目录

8. gg.getResults 获取搜索结果

9. gg.getResultCount 获取搜索结果数量

10. gg.setRanges 设置搜索内存

下面是内存范围
Jh内存: ['REGION_JAVA_HEAP'] = 2,

Ch内存: ['REGION_C_HEAP'] = 1,

Ca内存: ['REGION_C_ALLOC'] = 4,

Cd内存: ['REGION_C_DATA'] = 8,

Cb内存: ['REGION_C_BSS'] = 16,

Ps内存:['REGION_PPSSPP'] = 262144,

A内存: ['REGION_ANONYMOUS'] = 32,

J内存: ['REGION_JAVA'] = 65536,

S内存: ['REGION_STACK'] = 64,

As内存: ['REGION_ASHMEM'] = 524288,

V内存: ['REGION_VIDEO'] = 1048576,

O内存 ['REGION_OTHER'] = -2080896,

B内存: ['REGION_BAD'] = 131072,

Xa内存: ['REGION_CODE_APP'] = 16384,

Xs内存: ['REGION_CODE_SYS'] = 32768,
数字是内存的代号可以这么理解在偏移写法中比较常见普通写法也可以用
比如:gg.setRanges(gg.REGION_C_ALLOC)=gg.setRanges(4)意思都是设置范围是ca


内存种类
A类搜: ['TYPE_AUTO'] = 127,

B类搜: ['TYPE_BYTE'] = 1,

E类搜: ['TYPE_DOUBLE'] = 64,

D类搜: ['TYPE_DWORD'] = 4,

F类搜: ['TYPE_FLOAT'] = 16,

Q类搜: ['TYPE_QWORD'] = 32,

W类搜: ['TYPE_WORD'] = 2,

X类搜: ['TYPE_XOR'] = 8, 
数字代表同上
不同内存管理的数据不一样
人物一般在f内存
改物附魔在w内存
个数,模式在d内存


偏移写法:

function ab7()--同上
qmnb = {
{["memory"] = 内存范围用数字写},
{["name"] = "名字"},
{["value"] = 主特征码, ["type"] = 内存类型},一个永远不变的值
{["lv"] = 副特征码, ["offset"] = 偏移, ["type"] = 内存类型},一个永远不变的值,偏移是这个值到主特征中间值的个数
}
qmxg = {
{["value"] = 修改后的值, ["offset"] = 偏移, ["type"] = 内存类型,["freeze"] = false},偏移是到主特征的值的个数
}
end


["freeze"] = false--不冻结
["freeze"] = true--冻结


--建议用内存工具找特征

----------------------------------------------------------------------------------------------------------------------------------------------------------
指针写法:
function 功能名称()
    gg.setRanges(gg.REGION_BAD) --设定搜索范围
    local dataType = gg.TYPE_FLOAT --数据类型
    gg.clearResults()--意思是清楚搜索记录
    local 搜索数组 = {
                    {主特征码, 主特征码偏移}, {副特征码1, 副特征码偏移}, {副特征码2, 副特征码偏移2},
                    }
    local 写入数组 = {
                    {数值1, 相对主特征码偏移1, 是否冻结(可以留空, 表示不冻结 true表示冻结)}, {数值2, 相对主特征码偏移2, 是否冻结}, 
                    }

end

偏移的计算与xs的方法相同

----------------------------------------------------------------------------------------------------------------------------------------------------------基址写法:

function a3()
gg.clearResults()--意思是清楚搜索记录
local t = {"libUE4.so:bss", "Cb"}
local tt = {0x1B7B8, 0x5E8, 0x640, 0x53C,0x690}
local ttt = S_Pointer(t, tt, true)
gg.setValues({{address = ttt, flags = 4, value = 41792}})
gg.toast("提示")
end


libUE4.so:bss基址
Cb范围
0x1B7B8, 0x5E8, 0x640, 0x53C,0x690指针
找到基址然后一层一层的跳最后找到那个真值
如找一个人
基址是中国国门
第一个0x1B7B8相当于省
第二个0x5E8相当于市
第三个0x640相当于区
第四个0x53C相当于镇
第五个0x690相当于门牌号
这样你就找到这个人了
值也一样这样就都找到了
然后修改
gg.setValues({{address = ttt, flags = 4, value = 41792}})
这个是修改了
--


 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在Lua中跨脚本调用事件可以通过以下步骤实现: 1. 定义事件名称和处理函数 在一个脚本中定义事件名称和对应的处理函数,例如: ```lua local function onPlayerDeath(playerName) print(playerName .. " has died!") end Events.Subscribe("PlayerDeath", onPlayerDeath) ``` 2. 触发事件 在另一个脚本中,通过`Events.Call`函数触发事件,例如: ```lua Events.Call("PlayerDeath", "John") ``` 这个调用会触发之前定义的`onPlayerDeath`函数,并输出`John has died!`。 3. 取消事件订阅(可选) 如果不再需要监听某个事件,可以取消订阅,例如: ```lua Events.Unsubscribe("PlayerDeath", onPlayerDeath) ``` 这将从事件列表中移除`onPlayerDeath`函数,不再接收对应事件的通知。 以上就是Lua脚本调用事件的基本写法。注意,不同脚本之间需要事先约定好事件名称和参数格式,以确保调用正确。 ### 回答2: 在lua中,跨脚本调用事件的写法可以通过使用回调函数来实现。下面是一个示例: 首先,在第一个lua脚本中定义一个事件函数eventHandler: ```lua function eventHandler(data) print("Event received: " .. data) -- 在这里处理事件 end ``` 然后,在第二个lua脚本中需要调用事件的地方,可以通过调用第一个脚本中定义的eventHandler函数,并传递对应的数据作为参数: ```lua local script1 = require("script1") -- 引入第一个脚本 -- 调用事件函数,并传递数据 script1.eventHandler("Hello, Lua!") ``` 通过这种方式,可以在不同的lua脚本中进行跨脚本的事件调用。当第二个脚本执行到调用eventHandler函数的地方时,将会触发第一个脚本中定义的事件处理逻辑。 需要注意的是,为了使事件函数能够跨脚本调用,需要在第二个脚本中先引入第一个脚本,使得第一个脚本中的函数能够被第二个脚本访问到。 以上就是在lua中实现跨脚本调用事件的一种常用写法。 ### 回答3: 在Lua中,跨脚本调用事件的写法可以通过使用Lua中的全局函数来实现。以下是一种常见的方法: 1. 首先,在调用脚本中定义一个事件函数(例如,函数名为"onEvent"),并在这个函数中编写需要执行的代码。 ```lua function onEvent() -- 在这里编写您的代码逻辑 print("事件已触发") end ``` 2. 在另一个脚本中需要调用这个事件的位置,可以使用`dofile`或者`require`函数加载并运行这个事件所在的脚本文件。 ```lua dofile("event_script.lua") -- 加载并执行事件脚本 ``` 3. 调用事件函数:在需要触发事件的位置,直接调用之前定义的事件函数。 ```lua onEvent() -- 调用事件函数 ``` 通过以上步骤,您可以实现从一个脚本中调用另一个脚本中定义的事件函数。请注意,在使用`dofile`或者`require`加载脚本时,务必保证脚本的路径正确并且脚本文件可被正确加载。另外,跨脚本调用事件时,需要确保所调用的函数已被定义和加载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值