Skip to content

Commit 3fea5db

Browse files
committed
✨ feat: 增加 lite 版脚本
1 parent a9fd6e9 commit 3fea5db

File tree

4 files changed

+256
-1
lines changed

4 files changed

+256
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.history
22
/test/
3+
~*.doc?

.vscode/settings.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
"console",
2222
"GetDate",
2323
"userInfo",
24-
"pubg"
24+
"pubg",
25+
"GetMousePosition",
26+
"MoveMouseToVirtual"
2527
],
2628
"cSpell.words": [
2729
"Bizon",

Soldier76-lite.lua

+156
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
-- 用户配置
2+
UserConfig = {
3+
-- 基础力度
4+
power = 5,
5+
-- 启动控制 (scrolllock, capslock, numlock)
6+
startControl = "capslock",
7+
-- 随机偏差范围 (不要设置为0,偏差值越小越容易被检测)
8+
randomDeviation = 1,
9+
-- 屏幕分辨率
10+
screenResolution = {
11+
width = 2560,
12+
height = 1440
13+
}
14+
}
15+
16+
-- 开发时使用的工具
17+
-- dofile("E:\\Lynch Bel\\github\\Soldier76\\tools\\console.lua")
18+
19+
-- 运行缓存
20+
RunningCache = {
21+
-- 偏差像素 (± userConfig.randomDeviation)
22+
deviationPX = 0,
23+
-- 累计偏差像素
24+
deviationCounterPX = 0,
25+
-- 上一次的 Y 轴位置
26+
lastY = 0
27+
}
28+
29+
-- 是否启动
30+
function IsStart ()
31+
return IsKeyLockOn(UserConfig.startControl)
32+
end
33+
34+
-- 判断是否按下
35+
function IsPressed (key)
36+
if type(key) == "number" then
37+
return IsMouseButtonPressed(key)
38+
elseif type(key) == "string" then
39+
return IsModifierPressed(key)
40+
else
41+
return false
42+
end
43+
end
44+
45+
-- 四舍五入
46+
function Round (num) return math.floor(num + 0.5) end
47+
48+
-- 获取随机力度 (px)
49+
function GetRandomPower ()
50+
return UserConfig.power + RunningCache.deviationPX + Round(RunningCache.deviationCounterPX / 50)
51+
end
52+
53+
-- 主体功能 (压枪循环)
54+
function Main (event, arg, family)
55+
if event == "MOUSE_BUTTON_PRESSED" and arg == 1 and family == "mouse" then
56+
-- 启动前先获取一次 Y 轴位置
57+
local x, y = GetMousePosition()
58+
RunningCache.lastY = y
59+
ClearLog()
60+
61+
while (IsStart() and IsPressed(1) and IsPressed(3)) do
62+
-- while (IsStart() and IsPressed(1)) do
63+
-- ConsoleLog("-------------------------------")
64+
-- 调整偏差 ± userConfig.randomDeviation (px)
65+
RunningCache.deviationPX = math.max(
66+
-UserConfig.randomDeviation,
67+
math.min(
68+
UserConfig.randomDeviation,
69+
RunningCache.deviationPX + math.random(-1, 1) -- 随机偏差 ±1
70+
)
71+
)
72+
-- ConsoleLog(table.concat({ "随机偏差: ", RunningCache.deviation, "px" }))
73+
74+
-- 力度/移动距离 (px) (基础 + 偏差)
75+
local powerPX = GetRandomPower()
76+
-- ConsoleLog(table.concat({ "力度/移动距离: ", power, "px" }))
77+
78+
-- 移动鼠标
79+
MoveMouseRelative(0, powerPX)
80+
81+
Sleep(math.random(15, 17))
82+
83+
-- 获取鼠标位置
84+
local x, y = GetMousePosition()
85+
-- ConsoleLog(table.concat({ "x: ", x, ", y: ", y }))
86+
87+
-- 实际移动像素
88+
local movedPX = Round((y - RunningCache.lastY) / 65535 * UserConfig.screenResolution.height + 1)
89+
90+
-- 偏差像素
91+
local deviationCounterPX = movedPX - powerPX
92+
-- ConsoleLog({ "偏差像素: ", deviationCounterPX })
93+
94+
-- 累计偏差像素
95+
RunningCache.deviationCounterPX = RunningCache.deviationCounterPX + deviationCounterPX
96+
-- ConsoleLog({ "累计偏差像素:", RunningCache.deviationCounterPX })
97+
98+
-- 记录 Y 轴位置
99+
RunningCache.lastY = y
100+
101+
-- 预计下一次移动的距离 (px)
102+
local nextUnitDistance = GetRandomPower()
103+
-- ConsoleLog(table.concat({ "预计下一次移动的距离: ", nextUnitDistance, "px" }))
104+
105+
-- 底部安全距离
106+
local safeDistance = (nextUnitDistance + UserConfig.randomDeviation) / UserConfig.screenResolution.height * 65535
107+
-- ConsoleLog(table.concat({ "底部安全距离: ", safeDistance, "px" }))
108+
109+
-- 当鼠标移到底部,距离底部小于安全距离时,调整到顶部 (小于安全距离会影响下一次计算)
110+
if (y >= 65535 - safeDistance) then
111+
MoveMouseTo(x, 1)
112+
RunningCache.lastY = 1
113+
end
114+
115+
-- ClearLog()
116+
-- ConsoleLog(RunningCache)
117+
end
118+
119+
-- 重置缓存
120+
RunningCache.deviationPX = 0
121+
RunningCache.deviationCounterPX = 0
122+
123+
-- -- 重置鼠标位置
124+
-- PressAndReleaseKey('tab')
125+
-- PressAndReleaseKey('tab')
126+
end
127+
end
128+
129+
-- 入口函数
130+
function OnEvent (event, arg, family)
131+
-- 与 IsMouseButtonPressed 方法统一
132+
if arg == 2 then arg = 3 elseif arg == 3 then arg = 2 end
133+
134+
-- 未启动直接跳过 (安全锁,防止脚本进入死循环后无法退出)
135+
if not IsStart() then return end
136+
137+
-- 进入压枪循环
138+
Main(event, arg, family)
139+
140+
-- 释放所有占用的按键
141+
if event == "PROFILE_DEACTIVATED" then
142+
EnablePrimaryMouseButtonEvents(false)
143+
ReleaseKey("lshift")
144+
ReleaseKey("lctrl")
145+
ReleaseKey("lalt")
146+
ReleaseKey("rshift")
147+
ReleaseKey("rctrl")
148+
ReleaseKey("ralt")
149+
-- ClearLog()
150+
end
151+
end
152+
153+
-- 启用鼠标按键 1 事件报告
154+
EnablePrimaryMouseButtonEvents(true)
155+
-- 设置随机数种子
156+
math.randomseed(GetRunningTime())

tools/console.lua

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
--[[
2+
* 打印 table
3+
* @param {any} val 传入值
4+
* @return {str} 格式化后的文本
5+
]]
6+
function PrintTable (val)
7+
8+
local function loop (val, keyType, _indent)
9+
_indent = _indent or 1
10+
keyType = keyType or "string"
11+
local res = ""
12+
local indentStr = " " -- 缩进空格
13+
local indent = string.rep(indentStr, _indent)
14+
local end_indent = string.rep(indentStr, _indent - 1)
15+
local putline = function (...)
16+
local arr = { res, ... }
17+
for i = 1, #arr do
18+
if type(arr[i]) ~= "string" then arr[i] = tostring(arr[i]) end
19+
end
20+
res = table.concat(arr)
21+
end
22+
23+
if type(val) == "table" then
24+
putline("{ ")
25+
26+
if #val > 0 then
27+
local index = 0
28+
local block = false
29+
30+
for i = 1, #val do
31+
local n = val[i]
32+
if type(n) == "table" or type(n) == "function" then
33+
block = true
34+
break
35+
end
36+
end
37+
38+
if block then
39+
for i = 1, #val do
40+
local n = val[i]
41+
index = index + 1
42+
if index == 1 then putline("\n") end
43+
putline(indent, loop(n, type(i), _indent + 1), "\n")
44+
if index == #val then putline(end_indent) end
45+
end
46+
else
47+
for i = 1, #val do
48+
local n = val[i]
49+
index = index + 1
50+
putline(loop(n, type(i), _indent + 1))
51+
end
52+
end
53+
54+
else
55+
putline("\n")
56+
for k, v in pairs(val) do
57+
putline(indent, k, " = ", loop(v, type(k), _indent + 1), "\n")
58+
end
59+
putline(end_indent)
60+
end
61+
62+
putline("}, ")
63+
elseif type(val) == "string" then
64+
val = string.gsub(val, "\a", "\\a") -- 响铃(BEL)
65+
val = string.gsub(val, "\b", "\\b") -- 退格(BS),将当前位置移到前一列
66+
val = string.gsub(val, "\f", "\\f") -- 换页(FF),将当前位置移到下页开头
67+
val = string.gsub(val, "\n", "\\n") -- 换行(LF),将当前位置移到下一行开头
68+
val = string.gsub(val, "\r", "\\r") -- 回车(CR),将当前位置移到本行开头
69+
val = string.gsub(val, "\t", "\\t") -- 水平指标(HT),(调用下一个TAB位置)
70+
val = string.gsub(val, "\v", "\\v") -- 垂直指标(VT)
71+
putline("\"", val, "\", ")
72+
elseif type(val) == "boolean" then
73+
putline(val and "true, " or "false, ")
74+
elseif type(val) == "function" then
75+
putline(tostring(val), ", ")
76+
elseif type(val) == "nil" then
77+
putline("nil, ")
78+
else
79+
putline(val, ", ")
80+
end
81+
82+
return res
83+
end
84+
85+
local res = loop(val)
86+
res = string.gsub(res, ",(%s*})", "%1")
87+
res = string.gsub(res, ",(%s*)$", "%1")
88+
res = string.gsub(res, "{%s+}", "{}")
89+
90+
return res
91+
end
92+
93+
function ConsoleLog (...)
94+
local arr = {...}
95+
for i = 1, #arr do OutputLogMessage(PrintTable(arr[i]) .. "\n") end
96+
end

0 commit comments

Comments
 (0)