kiccer / Soldier76

PUBG - 罗技鼠标宏 | 兴趣使然的项目,完虐收费宏!点个Star支持一下作者![PUBG - Logitech mouse macro | Support 12 kinds of guns without recoil!]
https://kiccer.github.io/Soldier76/
GNU General Public License v3.0
1.73k stars 369 forks source link

Horizontal sensitivy #135

Closed RodrigoBrandao-Git closed 2 years ago

RodrigoBrandao-Git commented 2 years ago

is there any way to increase the horizontal sensitivity, as the horizontal indentation is random it would be easier if the script could adjust the horizontal sensitivity

kiccer commented 2 years ago

Logitech macro has no image recognition and does not read the process memory, so it cannot adapt to the horizontal random trajectory.

RodrigoBrandao-Git commented 2 years ago

look this script, contains function of lean spam very interessant

https://www.unknowncheats.me/forum/pubg-releases/483531-pubg-logitech-lua-script-basic-anti-recoil-lean-peek-spam-toggle.html

RodrigoBrandao-Git commented 2 years ago

You cannot add something similar to your script

RodrigoBrandao-Git commented 2 years ago

Hello sorry for the inconvenience, could you help me insert the Lean-Spam function in your script, this function would help a lot in horizontal recoil, not understanding programming, I even tried to merge the functions but with no success.

Em quinta-feira, 6 de janeiro de 2022 21:49:06 BRT, kiccer ***@***.***> escreveu:  

Logitech macro has no image recognition and does not read the process memory, so it cannot adapt to the horizontal random trajectory.

— Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android. You are receiving this because you authored the thread.Message ID: @.***>

RodrigoBrandao-Git commented 2 years ago

Check what I did wrong the balance function is not activating

Em sexta-feira, 7 de janeiro de 2022 09:06:06 BRT, Rodrigo Brandão ***@***.***> escreveu:  

Hello sorry for the inconvenience, could you help me insert the Lean-Spam function in your script, this function would help a lot in horizontal recoil, not understanding programming, I even tried to merge the functions but with no success.

Em quinta-feira, 6 de janeiro de 2022 21:49:06 BRT, kiccer ***@***.***> escreveu:  

Logitech macro has no image recognition and does not read the process memory, so it cannot adapt to the horizontal random trajectory.

— Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android. You are receiving this because you authored the thread.Message ID: @.***>

--[[ Script Start ]]

------------------------------------------ [[ 玩家自定义 ]] ------------------------------------------ -- 推荐边查阅帮助文档,边对下列内容进行修改。 -- 参考地址: https://github.com/kiccer/Soldier76#%E5%88%9D%E6%AC%A1%E4%BD%BF%E7%94%A8 -- It is recommended to review the help documents and modify the following contents. userInfo = {

-- 是否输出调试信息,关闭后可以减小 CPU 计算压力。建议调试时开启,调试完毕后关闭。(1 - 开启 | 0 - 关闭)
-- Whether to output debugging information, the CPU calculation pressure can be reduced after close.
-- It is recommended to turn it on during debugging and turn it off after debugging.
-- (0 - Disable | 1 - Enable)
debug = 1,

-- CPU 负载等级,建议输入 1 ~ 30 之间的数字,不能小于 1 。值越小,压枪效果越好,值越大,帧数越高。(过分掉帧会直接影响压枪效果,请在保证帧数的情况下减小该值)
-- CPU load level, It is recommended to enter a number between 1 and 30, cannot be less than 1.
-- The lower the value is, the better the effect is, the higher the value, the higher the number of frames.
-- (excessive frame dropping will directly affect the gun pressing effect, please reduce the value while ensuring the frame number)
cpuLoad = 2,

-- 灵敏度调整 | Sensitivity adjustment
sensitivity = {
    -- 开镜 | sighting mirror
    ADS = 100,
    -- 腰射 | take aim
    Aim = 0.55,
    -- 二倍 | twice scope
    scopeX2 = 1.3,
    -- 三倍 | trebling scope
    scopeX3 = 1.3,
    -- 四倍 | quadruple scope
    scopeX4 = 3.9,
    -- 六倍 | sixfold scope
    scopeX6 = 2.3,

},

-- 自动腰射,不使用自动腰射留空,使用则设置为键盘上按键
-- Auto aim, leave blank without auto aim, set as the key on the keyboard when using.
autoPressAimKey = "",

-- 启动控制 (capslock - 使用大写锁定键控制 | numlock - 小键盘锁定键控制 | G_bind - 使用指令控制) | Start up control
startControl = "numlock",

st_k="capslock", --TURN ON/OFF LeanSpan.

-- 瞄准设置 (default - 使用游戏默认设置 | recommend - 使用脚本推荐设置 | custom - 自定义设置 | ctrlmode - 下蹲模式) | Aiming setting
aimingSettings = "recommend",

-- 当 aimingSettings = "custom" ,需要在此处设置自定义判断条件,通常配合 IsMouseButtonPressed 或 IsModifierPressed 使用,使用方法请查阅 G-series Lua API 参考文档.docx
customAimingSettings = {
    -- 开镜判断
    ADS = function ()
        return false -- 判断条件,返回值为布尔型
    end,
    -- 腰射判断
    Aim = function ()
        return false -- 判断条件,返回值为布尔型
    end,
},

-- 支持的枪械,排列顺序即是配置顺序,可以自行调整。
-- 模式:0 - 不启用 | 1 - 启用 | 2 - 开启连点
-- 系数:枪械自身系数,基于 ADS 进行调整 (ADS为全局系数,此处为自身系数)
-- 下蹲系数:下蹲时的系数,基于 ADS 和 自身系数
canUse = {
    [".45"] = {
        -- 枪械             模式         系数        下蹲系数
        { "UMP45",          0,          1,          0.8 }, -- 基础镜 + 扩容,Bizon (基础镜即可),Vector (补偿 + 基础镜 + 扩容) | Reddot + Mag,Bizon (Reddot),Vector (Komp + Reddot + Mag)
        { "Tommy Gun",      0,          1,          0.8 }, -- 扩容 | Mag
    },
        -- 枪械             模式         系数        下蹲系数
    ["9mm"] = {
        { "Vector",         0,          1,          0.8 }, -- 基础镜 + 扩容 | Reddot + Mag
        { "Micro UZI",      0,          1,          0.8 }, -- 扩容 | Mag
    },
    ["5.56"] = {
        -- 枪械             模式         系数        下蹲系数
        { "M416",           1,          1,          0.8 }, -- 补偿 + 基础镜 + 直角 + 枪托 + 扩容 | Komp + Reddot + Triangular grip + Gunstock + Mag
        { "SCAR-L",         0,          1,          0.8 }, -- 补偿 + 基础镜 + 直角 + 扩容 | Komp + Reddot + Triangular grip + Mag
        { "QBZ",            0,          1,          0.8 }, -- 补偿 + 基础镜 + 直角 + 扩容 | Komp + Reddot + Triangular grip + Mag
        { "G36C",           0,          1,          0.8 }, -- 补偿 + 基础镜 + 直角 + 扩容 | Komp + Reddot + Triangular grip + Mag
        { "M16A4",          2,          1,          0.8 }, -- 补偿 + 基础镜 + 枪托 + 扩容 | Komp + Reddot + Gunstock + Mag
    },
    ["7.62"] = {
        -- 枪械             模式         系数        下蹲系数
        { "AKM",            0,          1,          0.8 }, -- 补偿 + 基础镜 + 扩容 | Komp + Reddot + Mag
        { "Beryl M762",     1,          1,          0.8 }, -- 补偿 + 基础镜 + 直角 + 扩容 | Komp + Reddot + Triangular grip + Mag
        { "DP-28",          0,          1,          0.8 }, -- 基础镜 | Reddot
    },
},

-- G键自定义绑定,多余的组合键可以删除
-- 可绑定指令请参考: https://github.com/kiccer/Soldier76#%E6%8C%87%E4%BB%A4%E5%88%97%E8%A1%A8
-- 指令绑定演示参考: https://github.com/kiccer/Soldier76#g_bind-%E6%8C%87%E4%BB%A4%E7%BB%91%E5%AE%9A%E6%BC%94%E7%A4%BA
G_bind = {
    -- G
    ["G3"] = "",
    ["G4"] = "M416|scopeX1",
    ["G5"] = "Beryl M762|scopeX1",
    ["G6"] = "",
    ["G7"] = "M16A4|scopeX1",
    ["G8"] = "fast_pickup",
    ["G9"] = "",
    ["G10"] = "",
    ["G11"] = "",
    -- lalt + G
    ["lalt + G3"] = "",
    ["lalt + G4"] = "scopeX4",
    ["lalt + G5"] = "scopeX3",
    ["lalt + G6"] = "",
    ["lalt + G7"] = "",
    ["lalt + G8"] = "",
    ["lalt + G9"] = "",
    ["lalt + G10"] = "",
    ["lalt + G11"] = "",
    -- lctrl + G
    ["lctrl + G3"] = "",
    ["lctrl + G4"] = "",
    ["lctrl + G5"] = "",
    ["lctrl + G6"] = "",
    ["lctrl + G7"] = "",
    ["lctrl + G8"] = "",
    ["lctrl + G9"] = "",
    ["lctrl + G10"] = "",
    ["lctrl + G11"] = "",
    -- lshift + G
    ["lshift + G3"] = "",
    ["lshift + G4"] = "",
    ["lshift + G5"] = "",
    ["lshift + G6"] = "fast_pickup",
    ["lshift + G7"] = "",
    ["lshift + G8"] = "",
    ["lshift + G9"] = "",
    ["lshift + G10"] = "",
    ["lshift + G11"] = "",
    -- ralt + G
    ["ralt + G3"] = "",
    ["ralt + G4"] = "",
    ["ralt + G5"] = "",
    ["ralt + G6"] = "",
    ["ralt + G7"] = "",
    ["ralt + G8"] = "",
    ["ralt + G9"] = "",
    ["ralt + G10"] = "",
    ["ralt + G11"] = "",
    -- rctrl + G
    ["rctrl + G3"] = "",
    ["rctrl + G4"] = "",
    ["rctrl + G5"] = "",
    ["rctrl + G6"] = "",
    ["rctrl + G7"] = "",
    ["rctrl + G8"] = "",
    ["rctrl + G9"] = "",
    ["rctrl + G10"] = "",
    ["rctrl + G11"] = "",
    -- rshift + G
    ["rshift + G3"] = "",
    ["rshift + G4"] = "",
    ["rshift + G5"] = "",
    ["rshift + G6"] = "",
    ["rshift + G7"] = "",
    ["rshift + G8"] = "",
    ["rshift + G9"] = "",
    ["rshift + G10"] = "",
    ["rshift + G11"] = "",
    -- 非鼠标G键,可以使键盘或者耳机上的G键,默认使用键盘G键,请确保你使用的是可编程的罗技键盘 | F1~12 (Non-mouse G-key)
    ["F1"] = "",
    ["F2"] = "",
    ["F3"] = "",
    ["F4"] = "",
    ["F5"] = "",
    ["F6"] = "",
    ["F7"] = "",
    ["F8"] = "",
    ["F9"] = "",
    ["F10"] = "",
    ["F11"] = "",
    ["F12"] = "",
},

}

----------------------------- [[ 以下是脚本核心代码,非专业人士请勿改动 ]] ----------------------------- ----------------------------- [[ 以下是脚本核心代码,非专业人士请勿改动 ]] ----------------------------- ----------------------------- [[ 以下是脚本核心代码,非专业人士请勿改动 ]] -----------------------------

-- internal configuration pubg = { gun = { [".45"] = {}, ["9mm"] = {}, ["5.56"] = {}, ["7.62"] = {}, }, -- 枪械库 gunOptions = { [".45"] = {}, ["9mm"] = {}, ["5.56"] = {}, ["7.62"] = {}, }, -- 配置库 allCanUse = {}, -- 所有可用枪械 allCanUse_index = 1, -- 所有可用枪械列表索引 allCanUse_count = 0, -- 所有可用总数量 bulletType = "", -- 默认子弹型号 gunIndex = 1, -- 选中枪械下标 counter = 0, -- 计数器 xCounter = 0, -- x计数器 sleep = userInfo.cpuLoad, -- 频率设置 (这里不能设置成0,调试会出BUG) sleepRandom = { userInfo.cpuLoad, userInfo.cpuLoad + 5 }, -- 防检测随机延迟 startTime = 0, -- 鼠标按下时记录脚本运行时间戳 prevTime = 0, -- 记录上一轮脚本运行时间戳 scopeX1 = 1, -- 基瞄压枪倍率 (裸镜、红点、全息、侧瞄) scopeX2 = userInfo.sensitivity.scopeX2, -- 二倍压枪倍率 scopeX3 = userInfo.sensitivity.scopeX3, -- 三倍压枪倍率 scopeX4 = userInfo.sensitivity.scopeX4, -- 四倍压枪倍率 scopeX6 = userInfo.sensitivity.scopeX6, -- 六倍压枪倍率 scope_current = "scopeX1", -- 当前使用倍镜 generalSensitivityRatio = userInfo.sensitivity.ADS / 100, -- 按比例调整灵敏度 isStart = false, -- 是否是启动状态 G1 = false, -- G1键状态 currentTime = 0, -- 此刻 bulletIndex = 0, -- 第几颗子弹 n_r=5, --HOW MANY PIXELS THE MOUSE IS MOVED DOWN DEFAULT: 5 nr_s=40, --INTERVAL BETWEEN MOUSE MOVEMENTS DEFAULT: 40 nr_p=0, --DELAY BEFORE STARTING MOUSE MOVEMENTS EACH TIME DEFAULT: 0 --[[LEAN-SPAM SETTINGS]]--


ll_k="Q", --LEFT PEEK KEY SETTING DEFAULT: "Q"
rl_k="E", --RIGHT PEEK KEY SETTING DEFAULT "E"
m_l=3, --FINE TUNE SETTING FOR LEAN TIME - LOWER NUMBER = FASTER LEANING (MUST BE ODD NUMBER TO WORK PROPERLY) DEFAULT: 3 
l_s = 40*(3/2),
l_st=1,
o_r=o_r,
ls_s=ls_s,
l_k=l_k,

}

pubg.xLengthForDebug = pubg.generalSensitivityRatio * 30 -- 调试模式下的水平移动单元长度 -- 渲染节点 pubg.renderDom = { switchTable = "", separator = "~~~~~~~~~~~~~~~~\n", -- 分割线 combo_key = "G-key", -- 组合键 cmd = "cmd", -- 指令 autoLog = "No operational data yet.\n", -- 压枪过程产生的数据输出 }

-- 是否开镜或瞄准 function pubg.isAimingState (mode) local switch = {

    -- 开镜
    ["ADS"] = function ()
        if userInfo.aimingSettings == "recommend" then
            return IsMouseButtonPressed(3) and not IsModifierPressed("lshift")
        elseif userInfo.aimingSettings == "default" then
            return not IsModifierPressed("lshift") and not IsModifierPressed("lalt")
        elseif userInfo.aimingSettings == "ctrlmode" then
            return IsMouseButtonPressed(3) and not IsModifierPressed("lshift")
        elseif userInfo.aimingSettings == "custom" then
            return userInfo.customAimingSettings.ADS()
        end
    end,

    -- 腰射
    ["Aim"] = function ()
        if userInfo.aimingSettings == "recommend" then
            if userInfo.autoPressAimKey == "" then
                return IsModifierPressed("lctrl")
            else
                return not IsModifierPressed("lshift") and not IsModifierPressed("lalt")
            end
        elseif userInfo.aimingSettings == "default" then
            return IsMouseButtonPressed(3)
        elseif userInfo.aimingSettings == "ctrlmode" then
            return false
        elseif userInfo.aimingSettings == "custom" then
            return userInfo.customAimingSettings.Aim()
        end
    end,

}

return switch[mode]()

end

pubg["M16A4"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 108,
    ballistic = {
        {1, 0},
        {5, 20},
        {40, 24},
    }
})

end

pubg["SCAR-L"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 96,
    ballistic = {
        {1, 0},
        {2, 30},
        {5, 20},
        {10, 24},
        {15, 28},
        {40, 32},
    }
})

end

pubg["Beryl M762"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 86,
    ballistic = {
        {1, 0},
        {2, 44},
        {3, 24},
        {5, 28},
        {10, 33},
        {15, 45},
        {30, 47},
        {40, 51},
    }
})

end

pubg["Tommy Gun"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 84,
    ballistic = {
        {1, 0},
        {3, 20},
        {6, 21},
        {8, 24},
        {10, 30},
        {15, 40},
        {50, 45},
    }
})

end

pubg["G36C"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 86,
    ballistic = {
        {1, 0},
        {2, 40},
        {5, 16},
        {10, 26},
        {15, 30},
        {20, 34},
        {40, 36},
    }
})

end

pubg["Vector"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 55,
    ballistic = {
        {1, 0},
        {6, 16},
        {10, 20},
        {13, 24},
        {15, 28},
        {20, 32},
        {33, 34},
    }
})

end

pubg["Micro UZI"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 46,
    ballistic = {
        {1, 0},
        {2, 13},
        {10, 12},
        {15, 20},
        {35, 30},
    }
})

end

pubg["UMP45"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 94,
    ballistic = {
        {1, 0},
        {5, 18},
        {15, 30},
        {35, 32},
    }
})

end

pubg["AKM"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 99,
    ballistic = {
        {1, 0},
        {2, 42},
        {5, 25},
        {10, 32},
        {40, 40},
    }
})

end

pubg["M416"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 85,
    ballistic = {
        {1, 0},
        {2, 35},
        {4, 18},
        {10, 24},
        {15, 32},
        {30, 30},
        {40, 37},
    }
})

end

pubg["QBZ"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 92,
    ballistic = {
        {1, 0},
        {2, 34},
        {5, 18},
        {10, 22},
        {15, 32},
        {20, 34},
        {40, 36},
    }
})

end

pubg["DP-28"] = function (gunName)

return pubg.execOptions(gunName, {
    interval = 100,
    ballistic = {
        {1, 0},
        {2, 30},
        {5, 20},
        {47, 30},
    }
})

end

-- [[通过枪械名查找在 canuse 中的项]] function pubg.canUseFindByGunName (gunName) local forList = { ".45", "9mm", "5.56", "7.62" }

for i = 1, #forList do
    local bulletType = forList[i]
    for j = 1, #userInfo.canUse[bulletType] do
        local item = userInfo.canUse[bulletType][j]
        if item[1] == gunName then
            return item
        end
    end
end

end

--[[ FormatFactory ]] function pubg.execOptions (gunName, options)

--[[

    from

    {
        { 5, 10 },
        { 10, 24 },
    }

    to

    { 10, 10, 10, 10, 10, 24, 24, 24, 24, 24 }

    to

    { 10, 20, 30, 40, 50, 74, 98, 122, 146, 170 }

]]

local gunInfo = pubg.canUseFindByGunName(gunName)

-- Temporary container
local ballisticConfig1 = {}
-- Temporary container (v3.0)
local ballisticConfig2 = {}

local ballisticIndex = 1
for i = 1, #options.ballistic do
    local nextCount = options.ballistic[i][1]
    if i ~= 1 then
        nextCount = options.ballistic[i][1] - options.ballistic[i - 1][1]
    end
    for j = 1, nextCount do
        ballisticConfig1[ballisticIndex] =
            -- options.ballistic[i][2] * pubg.generalSensitivityRatio * options.ratio
            options.ballistic[i][2] * pubg.generalSensitivityRatio * gunInfo[3]
        ballisticIndex = ballisticIndex + 1
    end
end

for i = 1, #ballisticConfig1 do
    if i == 1 then
        ballisticConfig2[i] = ballisticConfig1[i]
    else
        ballisticConfig2[i] = ballisticConfig2[i - 1] + ballisticConfig1[i]
    end
end

-- 取整
-- for i = 1, #ballisticConfig2 do
--  ballisticConfig2[i] = math.ceil(ballisticConfig2[i])
-- end

return {
    duration = options.interval * #ballisticConfig2, -- Time of duration
    amount = #ballisticConfig2, -- Number of bullets
    interval = options.interval, -- Time of each bullet
    ballistic = ballisticConfig2, -- ballistic data
    ctrlmodeRatio = gunInfo[4], -- Individual recoil coefficient for each gun when squatting
}

end

--[[ Initialization of firearms database ]] function pubg.init ()

-- Clean up the firearms Depot
local forList = { ".45", "9mm", "5.56", "7.62" }

for i = 1, #forList do

    local type = forList[i]
    local gunCount = 0

    for j = 1, #userInfo.canUse[type] do
        local gunName = userInfo.canUse[type][j][1]
        local gunState = userInfo.canUse[type][j][2]

        if gunState >= 1 then
            -- one series
            gunCount = gunCount + 1 -- Accumulative number of firearms configuration files
            pubg.gun[type][gunCount] = gunName -- Adding available firearms to the Arsenal
            pubg.gunOptions[type][gunCount] = pubg[gunName](gunName) -- Get firearms data and add it to the configuration library

            -- 单独设置连发
            pubg.gunOptions[type][gunCount].autoContinuousFiring = ({ 0, 0, 1 })[
                math.max(1, math.min(gunState + 1, 3))
            ]
            -- all canUse
            pubg.allCanUse_count = pubg.allCanUse_count + 1 -- Total plus one
            pubg.allCanUse[pubg.allCanUse_count] = gunName -- All available firearms

            if pubg.bulletType == "" then pubg.bulletType = type end -- Default Bullet type

        end

    end

end

-- Initial setting of random number seeds
pubg.SetRandomseed()
pubg.outputLogRender()
-- console.log(pubg)

end

-- SetRandomseed function pubg.SetRandomseed () math.randomseed(GetRunningTime()) end

-- Function LeanSpam function pubg.lean_spam() if pubg.l_k == pubg.ll_k then pubg.l_k=pubg.rl_k else pubg.l_k=pubg.ll_k end PressKey(pubg.l_k) Sleep(pubg.l_s) ReleaseKey(pubg.l_k) no_recoil=pubg.l_s/pubg.m_l end -- Function LeanDir function pubg.leandir() if pubg.ls_s then if (pubg.l_k == pubg.ll_k) then return (pubg.l_st) else return -(pubg.l_st) end else return 0 end end

function pubg.norecoil() Sleep(pubg.nr_p) repeat pubg.o_r=pubg.n_r if pubg.ls_s then if (pubg.l_st > pubg.m_l) then lean_spam() pubg.l_st=0 else pubg.l_st=pubg.l_st+1 end end pubg.n_r=pubg.o_r MoveMouseRelative(pubg.leandir(),y) Sleep(pubg.nr_s) until not IsMouseButtonPressed(1) or not IsMouseButtonPressed(3) end

--[[MAIN ONEVENT FOR SCRIPT FUNCTIONALITY]]--

function OnEvent(event, arg) if not IsKeyLockOn(st_k) then EnablePrimaryMouseButtonEvents(false) else EnablePrimaryMouseButtonEvents(true) end if IsKeyLockOn(st_k) then pubg.ls_s=true else pubg.ls_s=false end if (IsMouseButtonPressed(1) and IsMouseButtonPressed(3) and IsKeyLockOn(st_k)) then pubg.norecoil() end end

--[[ Before automatic press gun ]] function pubg.auto (options)

-- Accurate aiming press gun
pubg.currentTime = GetRunningTime()
pubg.bulletIndex = math.ceil(((pubg.currentTime - pubg.startTime == 0 and {1} or {pubg.currentTime - pubg.startTime})[1]) / options.interval) + 1

if pubg.bulletIndex > options.amount then return false end
-- Developer Debugging Mode
local d = (IsKeyLockOn("scrolllock") and { (pubg.bulletIndex - 1) * pubg.xLengthForDebug } or { 0 })[1]
local x = math.ceil((pubg.currentTime - pubg.startTime) / (options.interval * (pubg.bulletIndex - 1)) * d) - pubg.xCounter
local y = math.ceil((pubg.currentTime - pubg.startTime) / (options.interval * (pubg.bulletIndex - 1)) * options.ballistic[pubg.bulletIndex]) - pubg.counter
-- 4-fold pressure gun mode
local realY = pubg.getRealY(options, y)
    MoveMouseRelative(x, realY)
-- Whether to issue automatically or not
if options.autoContinuousFiring == 1 then
    PressAndReleaseMouseButton(1)
end

-- Real-time operation parameters
pubg.autoLog(options, y)
pubg.outputLogRender()

pubg.xCounter = pubg.xCounter + x
pubg.counter = pubg.counter + y

pubg.autoSleep(IsKeyLockOn("scrolllock"))

end

--[[ Sleep of pubg.auto ]] function pubg.autoSleep (isTest) local random = 0 if isTest then -- When debugging mode is turned on, Turn off random delays in preventive testing random = math.random(pubg.sleep, pubg.sleep) else random = math.random(pubg.sleepRandom[1], pubg.sleepRandom[2]) end -- Sleep(10) Sleep(random) end

--[[ get real y position ]] function pubg.getRealY (options, y) local realY = y

if pubg.isAimingState("ADS") then
    realY = y * pubg[pubg.scope_current]
elseif pubg.isAimingState("Aim") then
    realY = y * userInfo.sensitivity.Aim * pubg.generalSensitivityRatio
end

if userInfo.aimingSettings == "ctrlmode" and IsModifierPressed("lctrl") then
    realY = realY * options.ctrlmodeRatio
end

return realY

end

--[[ change pubg isStart status ]] function pubg.changeIsStart (isTrue) pubg.isStart = isTrue if isTrue then SetBacklightColor(0, 255, 150, "kb") SetBacklightColor(0, 255, 150, "mouse") else SetBacklightColor(255, 0, 90, "kb") SetBacklightColor(255, 0, 90, "mouse") end end

--[[ set bullet type ]] function pubg.setBulletType (bulletType) pubg.bulletType = bulletType pubg.gunIndex = 1 pubg.allCanUse_index = 0

local forList = { ".45", "9mm", "5.56", "7.62" }

for i = 1, #forList do
    local type = forList[i]
    if type ==  bulletType then
        pubg.allCanUse_index = pubg.allCanUse_index + 1
        break
    else
        pubg.allCanUse_index = pubg.allCanUse_index + #pubg.gun[type]
    end
end

pubg.changeIsStart(true)

end

--[[ set current scope ]] function pubg.setScope (scope) pubg.scope_current = scope end

--[[ set current gun ]] function pubg.setGun (gunName)

local forList = { ".45", "9mm", "5.56", "7.62" }
local allCanUse_index = 0

for i = 1, #forList do

    local type = forList[i]
    local gunIndex = 0
    local selected = false

    for j = 1, #userInfo.canUse[type] do
        if userInfo.canUse[type][j][2] >= 1 then
            gunIndex = gunIndex + 1
            allCanUse_index = allCanUse_index + 1
            if userInfo.canUse[type][j][1] == gunName then
                pubg.bulletType = type
                pubg.gunIndex = gunIndex
                pubg.allCanUse_index = allCanUse_index
                selected = true
                break
            end
        end
    end

    if selected then break end

end

pubg.changeIsStart(true)

end

--[[ Consider all available firearms as an entire list ]] function pubg.findInCanUse (cmd)

if "first_in_canUse" == cmd then
    pubg.allCanUse_index = 1
elseif "next_in_canUse" == cmd then
    if pubg.allCanUse_index < #pubg.allCanUse then
        pubg.allCanUse_index = pubg.allCanUse_index + 1
    end
elseif "last_in_canUse" == cmd then
    pubg.allCanUse_index = #pubg.allCanUse
end

pubg.setGun(pubg.allCanUse[pubg.allCanUse_index])

end

--[[ Switching guns in the same series ]] function pubg.findInSeries (cmd) if "first" == cmd then pubg.gunIndex = 1 elseif "next" == cmd then if pubg.gunIndex < #pubg.gun[pubg.bulletType] then pubg.gunIndex = pubg.gunIndex + 1 end elseif "last" == cmd then pubg.gunIndex = #pubg.gun[pubg.bulletType] end

pubg.setGun(pubg.gun[pubg.bulletType][pubg.gunIndex])

end

--[[ Script running status ]] function pubg.runStatus () if userInfo.startControl == "numlock" then return IsKeyLockOn("numlock") elseif userInfo.startControl == "numlock" then return IsKeyLockOn("numlock") elseif userInfo.startControl == "G_bind" then return pubg.isStart end end

--[[ 一键舔包,仅拾取进背包的物品,无法拾取需穿戴的物品 ]] function pubg.fastLickBox () PressAndReleaseKey("lshift") PressAndReleaseKey("lctrl") PressAndReleaseKey("lalt") PressAndReleaseKey("rshift") PressAndReleaseKey("rctrl") PressAndReleaseKey("ralt") PressAndReleaseKey("tab") Sleep(10 + pubg.sleep) PressAndReleaseMouseButton(1)

local lastItemCp = {
    300 / 2560 * 65535,
    1210 / 1440 * 65535
}
local itemHeight = 83 / 1440 * 65535

-- 重复 3 次动作,强化拾取成功率
for i = 1, 3 do
    for j = 1, 13 do
        MoveMouseTo(lastItemCp[1], lastItemCp[2] - itemHeight * (j - 1))
        PressMouseButton(1)
        MoveMouseTo(670 / 2560 * 65535, 710 / 1440 * 65535) -- 修改为背包的坐标
        ReleaseMouseButton(1)
    end
end

Sleep(10 + pubg.sleep)
MoveMouseTo(lastItemCp[1], lastItemCp[2])
PressAndReleaseKey("tab")

end

--[[ 一键拾取功能,支持所有分辨率 ]] function pubg.fastPickup () PressAndReleaseKey("lshift") PressAndReleaseKey("lctrl") PressAndReleaseKey("lalt") PressAndReleaseKey("rshift") PressAndReleaseKey("rctrl") PressAndReleaseKey("ralt") PressAndReleaseKey("tab") Sleep(10 + pubg.sleep) PressAndReleaseMouseButton(1)

local lastItemCp = {
    300 / 2560 * 65535,
    1210 / 1440 * 65535
}
local itemHeight = 83 / 1440 * 65535

-- 重复 3 次动作,强化拾取成功率
for i = 1, 3 do
    for j = 1, 13 do
        MoveMouseTo(lastItemCp[1], lastItemCp[2] - itemHeight * (j - 1))
        PressMouseButton(1)
        MoveMouseTo(32767, 32767)
        ReleaseMouseButton(1)
    end
end

Sleep(10 + pubg.sleep)
MoveMouseTo(lastItemCp[1], lastItemCp[2])
PressAndReleaseKey("tab")

end

--[[ 背包清空之术,就算战死,也要让敌人舔个空盒! ]] function pubg.fastDiscard () PressAndReleaseKey("lshift") PressAndReleaseKey("lctrl") PressAndReleaseKey("lalt") PressAndReleaseKey("rshift") PressAndReleaseKey("rctrl") PressAndReleaseKey("ralt") PressAndReleaseKey("tab") Sleep(10 + pubg.sleep) PressAndReleaseMouseButton(1) local lastItemCp = { 630 / 2560 65535, 1210 / 1440 65535 } local itemHeight = 83 / 1440 65535 -- 清空背包 第一轮 Sleep(10 + pubg.sleep) for i = 1, 5 do for j = 1, 13 do MoveMouseTo(lastItemCp[1], lastItemCp[2] - itemHeight (j - 1)) PressMouseButton(1) MoveMouseTo(0, 0) ReleaseMouseButton(1) end end -- 清空武器 Sleep(10 + pubg.sleep) local itemPos = { { 1770, 180 }, { 1770, 480 }, { 1770, 780 }, { 1770, 1050 }, { 2120, 1050 } } for i = 1, #itemPos do MoveMouseTo(itemPos[i][1] / 2560 65535, itemPos[i][2] / 1440 65535) PressAndReleaseMouseButton(3) end -- 清空背包 第二轮 Sleep(10 + pubg.sleep) for i = 1, 5 do for j = 1, 13 do MoveMouseTo(lastItemCp[1], lastItemCp[2] - itemHeight (j - 1)) PressMouseButton(1) MoveMouseTo(0, 0) ReleaseMouseButton(1) end end -- 清空装备 Sleep(10 + pubg.sleep) local itemPos2 = { { 900, 392 }, { 900, 630 }, { 900, 720 }, { 900, 808 }, { 1605, 397 }, { 1605, 481 }, { 1605, 632 }, { 1605, 719 }, { 1605, 807 }, { 1605, 1049 }, { 1605, 1229 } } for i = 1, #itemPos2 do MoveMouseTo(itemPos2[i][1] / 2560 65535, itemPos2[i][2] / 1440 * 65535) -- Sleep(300 + pubg.sleep) PressAndReleaseMouseButton(3) end Sleep(10 + pubg.sleep) MoveMouseTo(lastItemCp[1], lastItemCp[2]) PressAndReleaseKey("tab") end

--[[ G key command binding ]] function pubg.runCmd (cmd) if cmd == "" then cmd = "none" end local switch = { ["none"] = function () end, [".45"] = pubg.setBulletType, ["9mm"] = pubg.setBulletType, ["5.56"] = pubg.setBulletType, ["7.62"] = pubg.setBulletType, ["scopeX1"] = pubg.setScope, ["scopeX2"] = pubg.setScope, ["scopeX3"] = pubg.setScope, ["scopeX4"] = pubg.setScope, ["scopeX6"] = pubg.setScope, ["UMP45"] = pubg.setGun, ["Tommy Gun"] = pubg.setGun, ["Vector"] = pubg.setGun, ["Micro UZI"] = pubg.setGun, ["M416"] = pubg.setGun, ["SCAR-L"] = pubg.setGun, ["QBZ"] = pubg.setGun, ["G36C"] = pubg.setGun, ["M16A4"] = pubg.setGun, ["AKM"] = pubg.setGun, ["Beryl M762"] = pubg.setGun, ["DP-28"] = pubg.setGun, ["first"] = pubg.findInSeries, ["next"] = pubg.findInSeries, ["last"] = pubg.findInSeries, ["first_in_canUse"] = pubg.findInCanUse, ["next_in_canUse"] = pubg.findInCanUse, ["last_in_canUse"] = pubg.findInCanUse, ["fast_pickup"] = pubg.fastPickup, ["fast_discard"] = pubg.fastDiscard, ["fast_lick_box"] = pubg.fastLickBox, ["off"] = function () pubg.changeIsStart(false) end, }

local cmdGroup = string.split(cmd, '|')

for i = 1, #cmdGroup do
    local _cmd = cmdGroup[i]
    if switch[_cmd] then
        switch[_cmd](_cmd)
    end
end

end

--[[ autputLog render ]] function pubg.outputLogRender () if userInfo.debug == 0 then return false end if not pubg.G1 then pubg.renderDom.switchTable = pubg.outputLogGunSwitchTable() end local resStr = table.concat({ "\n>> [\"", pubg.renderDom.combo_key, "\"] = \"", pubg.renderDom.cmd, "\" <<\n", pubg.renderDom.separator, pubg.renderDom.switchTable, pubg.renderDom.separator, pubg.outputLogGunInfo(), pubg.renderDom.separator, pubg.renderDom.autoLog, pubg.renderDom.separator, }) ClearLog() OutputLogMessage(resStr) end

--[[ Output switching table ]] function pubg.outputLogGunSwitchTable () local forList = { ".45", "9mm", "5.56", "7.62" } local allCount = 0 local resStr = " canUse_i\t series_i\t Series\t ratio\t ctrl ratio\t Gun Name\n\n"

for i = 1, #forList do
    local type = forList[i]
    local gunCount = 0

    for j = 1, #userInfo.canUse[type] do
        if userInfo.canUse[type][j][2] >= 1 then
            local gunName = userInfo.canUse[type][j][1]
            local tag = gunName == pubg.gun[pubg.bulletType][pubg.gunIndex] and "=> " or "      "
            gunCount = gunCount + 1
            allCount = allCount + 1
            resStr = table.concat({ resStr, tag, allCount, "\t", tag, gunCount, "\t", tag, type, "\t", tag, userInfo.canUse[type][j][3], "\t", tag, userInfo.canUse[type][j][4], "\t", tag, gunName, "\n" })
        end
    end

end

return resStr

end

-- output Log Gun Info function pubg.outputLogGunInfo () local k = pubg.bulletType local i = pubg.gunIndex local gunName = pubg.gun[k][i]

return table.concat({
    "Currently scope: [ " .. pubg.scope_current .. " ]\n",
    "Currently series: [ ", k, " ]\n",
    "Currently index in series: [ ", i, " / ", #pubg.gun[k], " ]\n",
    "Currently index in canUse: [ ", pubg.allCanUse_index, " / ", pubg.allCanUse_count, " ]\n",
    "Recoil table of [ ", gunName, " ]:\n",
    pubg.outputLogRecoilTable(),
})

end

--[[ output recoil table log ]] function pubg.outputLogRecoilTable () local k = pubg.bulletType local i = pubg.gunIndex local resStr = "{ " for j = 1, #pubg.gunOptions[k][i].ballistic do local num = pubg.gunOptions[k][i].ballistic[j] resStr = table.concat({ resStr, num }) if j ~= #pubg.gunOptions[k][i].ballistic then resStr = table.concat({ resStr, ", " }) end end

resStr = table.concat({ resStr, " }\n" })

return resStr

end

--[[ log of pubg.auto ]] function pubg.autoLog (options, y) pubg.renderDom.autoLog = table.concat({ "----------------------------------- Automatically counteracting gun recoil -----------------------------------\n", "------------------------------------------------------------------------------------------------------------------------------\n", "bullet index: ", pubg.bulletIndex, " target counter: ", options.ballistic[pubg.bulletIndex], " current counter: ", pubg.counter, "\n", "D-value(target - current): ", options.ballistic[pubg.bulletIndex], " - ", pubg.counter, " = ", options.ballistic[pubg.bulletIndex] - pubg.counter, "\n", "move: math.ceil((", pubg.currentTime, " - ", pubg.startTime, ") / (", options.interval, " (", pubg.bulletIndex, " - 1)) ", options.ballistic[pubg.bulletIndex], ") - ", pubg.counter, " = ", y, "\n", "------------------------------------------------------------------------------------------------------------------------------\n", }) end

function pubg.PressOrRelaseAimKey (toggle) if userInfo.autoPressAimKey ~= "" then if toggle then PressKey(userInfo.autoPressAimKey) else ReleaseKey(userInfo.autoPressAimKey) end end end

--[[ Automatic press gun ]] function pubg.OnEvent_NoRecoil (event, arg, family) if event == "MOUSE_BUTTON_PRESSED" and arg == 1 and family == "mouse" then if not pubg.runStatus() then return false end if userInfo.aimingSettings ~= "default" and not IsMouseButtonPressed(3) then pubg.PressOrRelaseAimKey(true) end if pubg.isAimingState("ADS") or pubg.isAimingState("Aim") then pubg.startTime = GetRunningTime() pubg.G1 = true SetMKeyState(1, "kb") end end

if event == "MOUSE_BUTTON_RELEASED" and arg == 1 and family == "mouse" then
    pubg.PressOrRelaseAimKey(false)
    pubg.G1 = false
    pubg.counter = 0 -- Initialization counter
    pubg.xCounter = 0 -- Initialization xCounter
    pubg.SetRandomseed() -- Reset random number seeds
end

if event == "M_PRESSED" and arg == 1 and pubg.G1 then
    pubg.auto(pubg.gunOptions[pubg.bulletType][pubg.gunIndex])
    SetMKeyState(1, "kb")
end

end

-- [[ processing instruction ]] function pubg.modifierHandle (modifier) local cmd = userInfo.G_bind[modifier] pubg.renderDom.combo_key = modifier -- Save combination keys

if (cmd) then
    pubg.renderDom.cmd = cmd -- Save instruction name
    pubg.runCmd(cmd) -- Execution instructions
else
    pubg.renderDom.cmd = ""
end

pubg.outputLogRender() -- Call log rendering method to output information

end

--[[ Listener method ]] function OnEvent (event, arg, family)

-- OutputLogMessage("event = %s, arg = %s, family = %s\n", event, arg, family)
-- console.log("event = " .. event .. ", arg = " .. arg .. ", family = " .. family)

pubg.OnEvent_NoRecoil(event, arg, family)

-- Switching arsenals according to different types of ammunition
if event == "MOUSE_BUTTON_PRESSED" and arg >=3 and arg <= 11 and family == "mouse" then
    local modifier = "G" .. arg
    local list = { "lalt", "lctrl", "lshift", "ralt", "rctrl", "rshift" }

    for i = 1, #list do
        if IsModifierPressed(list[i]) then
            modifier = list[i] .. " + " .. modifier
            break
        end
    end

    pubg.modifierHandle(modifier)
elseif event == "G_PRESSED" and arg >=1 and arg <= 12 then
    -- if not pubg.runStatus() and userInfo.startControl ~= "G_bind" then return false end
    local modifier = "F" .. arg

    pubg.modifierHandle(modifier)
end

-- Script deactivated event
if event == "PROFILE_DEACTIVATED" then
    EnablePrimaryMouseButtonEvents(false)
    ReleaseKey("lshift")
    ReleaseKey("lctrl")
    ReleaseKey("lalt")
    ReleaseKey("rshift")
    ReleaseKey("rctrl")
    ReleaseKey("ralt")
    ClearLog()
end

end

--[[ tools ]]

-- split function function string.split (str, s) if string.find(str, s) == nil then return { str } end

local res = {}
local reg = "(.-)" .. s .. "()"
local index = 0
local last_i

--- @diagnostic disable-next-line: undefined-field
for n, i in string.gfind(str, reg) do
    index = index + 1
    res[index] = n
    last_i = i
end

res[index + 1] = string.sub(str, last_i)

return res

end

-- Javascript Array.prototype.reduce function table.reduce (t, c) local res = c(t[1], t[2]) for i = 3, #t do res = c(res, t[i]) end return res end

-- Javascript Array.prototype.map function table.map (t, c) local res = {} for i = 1, #t do res[i] = c(t[i], i) end return res end

-- Javascript Array.prototype.forEach function table.forEach (t, c) for i = 1, #t do c(t[i], i) end end

--[[

-- console console = {} function console.log (str) OutputLogMessage(table.print(str) .. "\n") end

--[[ Other ]] EnablePrimaryMouseButtonEvents(true) -- Enable left mouse button event reporting pubg.GD = GetDate -- Setting aliases pubg.init() -- Script initialization

--[[ Script End ]]