From f2cb2e378767564d25b92eea0e132a7e1fa22da8 Mon Sep 17 00:00:00 2001 From: Eigeen Date: Thu, 21 Dec 2023 18:23:59 +0800 Subject: [PATCH] 1.0.2 --- EigeenLoader.lua | 253 ++++++++++++++++++++++++++ eigeen_modules/dragon_riding_jump.lua | 44 +++++ eigeen_modules/fast_gathering.lua | 35 ++++ utils/Keypad.lua | 41 +++++ utils/Speed.lua | 79 ++++++++ 5 files changed, 452 insertions(+) create mode 100644 EigeenLoader.lua create mode 100644 eigeen_modules/dragon_riding_jump.lua create mode 100644 eigeen_modules/fast_gathering.lua create mode 100644 utils/Keypad.lua create mode 100644 utils/Speed.lua diff --git a/EigeenLoader.lua b/EigeenLoader.lua new file mode 100644 index 0000000..3810ad2 --- /dev/null +++ b/EigeenLoader.lua @@ -0,0 +1,253 @@ +-- 猫猫虫的 LuaEngine 插件管理框架 +-- @version: 1.0.2 +-- +-- 自动加载以下目录的lua模块: +-- ./eigeen_modules +-- +-- 模块编写: +-- 样例: +-- return { +-- version = 1, +-- name = "chong_qiang", +-- onTime = onTime, +-- conditions = {{ +-- type = "weapon", +-- value = { +-- eq = 7 +-- } +-- }}, +-- priority = 0, +-- } +-- +-- 具体用法请参考具体插件示例 +-- +local Speed = require("utils/Speed") +local Keypad = require("utils/Keypad") + +-- consts +local MODULE_ROOT = "./Lua/eigeen_modules" +-- local NON_ACTIVE_MAPS = {301, 302, 303, 305, 306} + +-- globals +-- 所有模块列表,仅在初始化时加载。后续处理都基于此列表,因此增删改mod需要重载此框架。 +local Modules = {} + +-- 需要执行的模块函数,每次执行前进行处理。 +local ExecuteModules = {} + +-- 上一次使用的武器ID,用于判断武器是否变更。 +local LastWeaponType = 0 +-- 上一次的地图ID +local LastMapID = 0 + +local function isIn(tbl, target) + for key, value in pairs(tbl) do + if target == value then + return true + end + end + return false +end + +local function loadAllModules() + local modules = {} + -- 自动导入 + local moduleFiles = engine.GetAllFiles(MODULE_ROOT) + for _, mFile in pairs(moduleFiles) do + -- 模块合法性判断 + if mFile.file:sub(-4) ~= ".lua" then + goto continueIterModules + end + + local eModule = dofile(MODULE_ROOT .. "/" .. mFile.file) + if eModule == nil or eModule.version ~= 1 then + goto continueIterModules + end + + table.insert(modules, eModule) + + ::continueIterModules:: + end + + return modules +end + +local function _checkCondition(value, condValue) + local result = true + local function setCondResult(_res) + if result == false then + return + end + if result == true and _res == false then + result = false + return + end + end + + for key, condVal in pairs(condValue) do + if key == "eq" then + setCondResult(value == condVal) + elseif key == "gt" then + setCondResult(value > condVal) + elseif key == "lt" then + setCondResult(value < condVal) + elseif key == "ne" then + setCondResult(value ~= condVal) + elseif key == "ge" then + setCondResult(value >= condVal) + elseif key == "le" then + setCondResult(value <= condVal) + elseif key == "in" then + setCondResult(isIn(condVal, value)) + elseif key == "nin" then + setCondResult(not isIn(condVal, value)) + else + setCondResult(false) + end + end + + return result +end + +local function checkCondition(ctx, module) + local conds = module.conditions + if conds == nil or #conds == 0 then + return true + end + + local result = true + local function setCondResult(_res) + if result == false then + return + end + if result == true and _res == false then + result = false + return + end + end + + for _, cond in ipairs(conds) do + if type(cond) == "function" then + setCondResult(cond(ctx)) + elseif cond.type == "weapon" then + setCondResult(_checkCondition(ctx.playerData.Weapon.type, cond.value)) + elseif cond.type == "map" then + setCondResult(_checkCondition(ctx.worldData.MapId, cond.value)) + end + end + return result +end + +local function executeOnInit(modules) + for _, module in ipairs(modules) do + if module.onInit ~= nil then + module.onInit() + end + end +end + +local function executeOnSwitchScenes(ctx, modules) + for _, module in ipairs(modules) do + if module.onSwitchScenes ~= nil then + module.onSwitchScenes(ctx) + end + end +end + +local function executeOnImgui(ctx, modules) + for _, module in ipairs(modules) do + if module.onImgui ~= nil then + module.onImgui(ctx) + end + end +end + +local function executeOnTime(ctx, modules) + for _, module in ipairs(modules) do + if module.onTime ~= nil then + module.onTime(ctx) + end + end +end + +local function buildExecuteModules(ctx) + local exeModules = {} + -- 条件检查 + for _, module in ipairs(Modules) do + if checkCondition(ctx, module) then + table.insert(exeModules, module) + end + end + -- 优先级调整 + for i = 1, #exeModules do + if exeModules[i].priority == nil or exeModules[i].priority < 0 then + exeModules[i].priority = 0 + end + end + table.sort(exeModules, function(m1, m2) + return m1.priority > m2.priority + end) + + return exeModules +end + +-- Hooks + +function on_time() + local playerData = engine.Player:new() + local ctx = { + playerData = playerData, + worldData = engine.World:new(), + questData = engine.Quest:new(), + Speed = Speed:new(playerData), + Keypad = Keypad + } + -- local MetaCtx = { + -- Speed = Speed:new(ctx.playerData), + -- Keypad = Keypad + -- } + -- MetaCtx.__index = MetaCtx + -- setmetatable(ctx, MetaCtx) + -- 建立遍历专用表,而不是遍历modules主表。条件判断操作更改后刷新遍历专用表。 + local wpType = ctx.playerData.Weapon.type + if ctx.playerData.Weapon.type ~= LastWeaponType then + ExecuteModules = buildExecuteModules(ctx) + LastWeaponType = ctx.playerData.Weapon.type + end + if ctx.worldData.MapId ~= LastMapID then + ExecuteModules = buildExecuteModules(ctx) + LastMapID = ctx.worldData.MapId + end + + -- 执行onTime方法 + executeOnTime(ctx, ExecuteModules) +end + +function on_imgui() + local ctx = { + playerData = engine.Player:new(), + worldData = engine.World:new(), + questData = engine.Quest:new() + } + executeOnImgui(ctx, ExecuteModules) +end + +function on_init() + Modules = loadAllModules() + executeOnInit(Modules) +end + +function on_switch_scenes() + local ctx = { + playerData = engine.Player:new(), + worldData = engine.World:new(), + questData = engine.Quest:new() + } + executeOnSwitchScenes(ctx, ExecuteModules) +end + +function on_monster_create() +end + +function on_monster_destroy() +end diff --git a/eigeen_modules/dragon_riding_jump.lua b/eigeen_modules/dragon_riding_jump.lua new file mode 100644 index 0000000..d51d3cc --- /dev/null +++ b/eigeen_modules/dragon_riding_jump.lua @@ -0,0 +1,44 @@ +local ToWayPosition = false +local Camera = false +local function setMotionState(stateFlag) -- 人物状态 + local stateAddress = GetAddress(0x145011760,{0x50,0xE470}) + 0x0B + if stateAddress then + local stateData = SetAddressData(stateAddress,'byte',stateFlag) + end +end + +local function onTime(ctx) + local Data_Player = ctx.playerData + local Data_World = ctx.worldData + if Data_Player.Action.fsm.fsmID == 639 or Data_Player.Action.fsm.fsmID == 640 then + setMotionState(0x8A) + end + if Data_Player.Action.lmtID == 12707 or Data_Player.Action.lmtID == 12708 then + SetCameraData(true, Data_Player.Position.cntrposition.x, Data_Player.Position.cntrposition.y, Data_Player.Position.cntrposition.z) + Camera = true + elseif Camera then + Camera = false + SetCameraData(false,0,0,0) + end + + if Data_Player.Action.lmtID == 12708 then + if not ToWayPosition then + ToWayPosition = true + if not (Data_World.Position.wayPosition.x == 0 and Data_World.Position.wayPosition.y == 0 and Data_World.Position.wayPosition.z == 0) then + Data_Player.Position.position = Data_World.Position.wayPosition + Data_Player.Position.reposition = Data_World.Position.wayPosition + end + end + elseif ToWayPosition then + ToWayPosition = false + end + +end + +return { + version = 1, + name = "dragon_riding_jump", + onTime = onTime, + conditions = nil, + priority = 0, +} \ No newline at end of file diff --git a/eigeen_modules/fast_gathering.lua b/eigeen_modules/fast_gathering.lua new file mode 100644 index 0000000..d00726d --- /dev/null +++ b/eigeen_modules/fast_gathering.lua @@ -0,0 +1,35 @@ +-- 加速挖素材 8273 8274 +-- 挖矿 8377-8379 +-- 采集 8276-8278,8281 +local GATHERING_LMT_ID = {8273, 8274, 8377, 8378, 8379, 8276, 8277, 8278, 8281} + +local function isIn(tbl, target) + for key, value in pairs(tbl) do + if target == value then + return true + end + end + return false +end + +local function isGatheringLmtID(lmtID) + return isIn(GATHERING_LMT_ID, lmtID) +end + +local function onTime(ctx) + local playerData = ctx.playerData + + if isGatheringLmtID(playerData.Action.lmtID) then + ctx.Speed:setSpeedMutex(5, "加速挖素材") + else + ctx.Speed:resetSpeedMutex("加速挖素材") + end +end + +return { + version = 1, + name = "fast_gathering", + onTime = onTime, + conditions = nil, + priority = 10 +} diff --git a/utils/Keypad.lua b/utils/Keypad.lua new file mode 100644 index 0000000..c78a767 --- /dev/null +++ b/utils/Keypad.lua @@ -0,0 +1,41 @@ +-- 猫猫虫的 LuaEngine 工具模块:Keypad +-- @version: 1.0.0 + +local Keypad = {} + +--- 带计时器的按键触发操作(注:暂不支持组合键) +---@param keypadID number|string +---@param chrono number +---@param func fun() +---@param xbox boolean|nil +function Keypad.UseChronoscope(keypadID, chrono, func, xbox) + if keypadID == nil or chrono == nil or func == nil then + return + end + if chrono < 0 then + return + end + if xbox ~= true and xbox ~= false then + xbox = nil + end + + -- TODO: 暂不支持组合键 + if type(keypadID) == "table" then + return + end + + local keypadIDStr = keypadID + if type(keypadID) == "number" then + keypadIDStr = tostring(keypadID) + end + local keypadShortcut = "keypad_keyCD_"..keypadIDStr + + if engine.keypad(keypadID, xbox) and (CheckChronoscope(keypadShortcut) or + not CheckPresenceChronoscope(keypadShortcut)) then + + AddChronoscope(chrono, keypadShortcut) + func() + end +end + +return Keypad \ No newline at end of file diff --git a/utils/Speed.lua b/utils/Speed.lua new file mode 100644 index 0000000..04435df --- /dev/null +++ b/utils/Speed.lua @@ -0,0 +1,79 @@ +-- 猫猫虫的 LuaEngine 工具模块:Speed +-- @version: 1.0.0 + +local Speed = { + lock = nil, + instance = nil +} +Speed.__index = Speed + +function Speed:new(playerData) + if self.instance ~= nil then + self.instance.playerData = playerData + return self.instance + end + + local instance = setmetatable({ + playerData = playerData + }, Speed) + self.instance = instance + return self.instance +end + +function Speed:setSpeed(speed) + self.playerData.Frame.frameSpeedMultiplies = speed +end + +function Speed:resetSpeed() + self.playerData.Frame.frameSpeedMultiplies = 1 +end + +function Speed:withSpeed(speed, func) + if speed == nil or func == nil then + return + end + + self:setSpeed(speed) + func() + self:resetSpeed() +end + +function Speed:checkAndReleaseLock(lockID) + if self.lock == nil then + return true + end + if self.lock == lockID then + self.lock = nil + return true + end + return false +end + +function Speed:checkAndSetupLock(lockID) + if self.lock == nil then + self.lock = lockID + return true + end + if self.lock == lockID then + return true + end + return false +end + +function Speed:setSpeedMutex(speed, lockID) + if self:checkAndSetupLock(lockID) then + self:setSpeed(speed) + end +end + +function Speed:resetSpeedMutex(lockID) + if self:checkAndReleaseLock(lockID) then + self:resetSpeed() + end +end + +function Speed:forceReleaseLock() + self.lock = nil +end + +return Speed