雪月Lua框架的热更新非常简单,只需要调用就行了。

代码解释

local storm = require 'jass.storm'

--- 热更新.注意别死循环。
---@param Entry string 入口文件(require用的路径)  一般是 Main
function hotFix( Entry )
    package.loaded[ Entry ] = nil

    xpcall(require, function (msg)
        print(msg, debug.traceback())
    end, Entry)
end
  1. 引入 jass.storm 模块

    local storm = require 'jass.storm'

    这行代码引入了 jass.storm 模块。jass.storm 是魔兽争霸III(Warcraft III)中用于JASS(Jass Ascension Scripting System)的Lua绑定库。它提供了与JASS交互的功能。

  2. 定义 hotFix 函数

    --- 热更新.注意别死循环。
    ---@param Entry string 入口文件(require用的路径)  一般是 Main
    function hotFix( Entry )
    • hotFix 是一个函数,用于执行热更新操作。
    • Entry 是一个字符串参数,表示要加载的入口文件的路径(通常是 Main 或其他模块的路径)。
  3. 清除已加载的模块

    package.loaded[ Entry ] = nil
    • package.loaded 是一个表,存储了所有已加载的模块。通过将 package.loaded[ Entry ] 设置为 nil,可以清除之前加载的模块,以便重新加载最新的版本。
  4. 使用 xpcall 加载模块

    xpcall(require, function (msg)
        print(msg, debug.traceback())
    end, Entry)
    • xpcall 是一个保护调用函数,用于捕获和处理可能发生的错误。
    • require 是Lua的标准函数,用于加载和返回模块。
    • function (msg) 是一个错误处理函数,当 require 执行过程中发生错误时会被调用。
    • msg 是错误信息。
    • debug.traceback() 返回调用堆栈信息,有助于调试。

如何使用

假设你有一个脚本 热更新.lua,并且你希望在游戏运行时动态更新这个脚本。以下是使用 hotFix 函数的步骤:

  1. 创建脚本
    scripts 文件夹中创建一个 热更新.lua 文件,内容如下:

    -- 热更新.lua
    
    print("热更新.lua 加载成功!")
    -- 其他逻辑代码
  2. 调用 hotFix 函数
    在你的入口脚本main.lua中调用 hotFix 函数,以加载和更新 热更新.lua

    -- main.lua
    
    -- 引入热更新脚本
    require 'xLua.Main' --载入框架
    
    -- 可以用一个玩家输入事件来执行热更新
    local trg1 = cj.CreateTrigger()
    cj.TriggerRegisterPlayerChatEvent(trg1, cj.Player(0), "100", true)
    cj.TriggerAddAction(trg1, function ()
    hotFix('热更新')
    cj.DisplayTimedTextToPlayer(cj.Player(0),0,0,30,"热更新成功")
    end)
    
    -- 其他触发器逻辑
    -- ...
  3. 修改并测试

    • 启动魔兽争霸III并加载你的地图。
    • 修改 热更新.lua 文件,例如添加新的打印语句:

      -- 热更新.lua
      
      print("热更新.lua 加载成功!")
      print("这是新的打印语句!")
      -- 其他逻辑代码
    • 保存 热更新.lua 文件。
    • 观察游戏中的输出,确保新的打印语句被正确加载。

注意事项

  1. 路径问题

    • 确保 Entry 参数的路径正确,并且脚本文件在游戏运行时可访问。
    • 路径通常是相对于 scripts 文件夹的相对路径。
  2. 避免死循环

    • 确保 hotFix 函数不会被无限递归调用,否则会导致死循环。
  3. 错误处理

    • 在实际应用中,添加更多的错误处理逻辑,以确保热更新过程中的稳定性。