Commit 2d392edea40830da215800daa51b8e5aebde2e50
1 parent
a5b025b0
热更新 最终版
Showing
5 changed files
with
139 additions
and
17 deletions
 
Show diff stats
src/actions/GmAction.lua
| @@ -16,7 +16,7 @@ function _M.clientRequest(agent, data) | @@ -16,7 +16,7 @@ function _M.clientRequest(agent, data) | ||
| 16 | end | 16 | end | 
| 17 | 17 | ||
| 18 | function _M.testhotfix(role, pms) | 18 | function _M.testhotfix(role, pms) | 
| 19 | - return csvdb["itemCsv"][1]["name"] | 19 | + return csvdb["itemCsv"][1]["name"] .. " -=- " .. csvdb["itemCsv"][2]["name"] .. " -=- " .. role:getItemCount(123) .. " -=- " .. table.pack(next(role.heros))[2]:getBattleValue() | 
| 20 | end | 20 | end | 
| 21 | 21 | ||
| 22 | function _M.hero(role, pms) | 22 | function _M.hero(role, pms) | 
src/actions/HttpAction.lua
| @@ -5,6 +5,22 @@ local codecache = require "skynet.codecache" -- 清空缓存用 | @@ -5,6 +5,22 @@ local codecache = require "skynet.codecache" -- 清空缓存用 | ||
| 5 | 5 | ||
| 6 | local _M = {} | 6 | local _M = {} | 
| 7 | 7 | ||
| 8 | + | ||
| 9 | +--[=[使用python 调用的话eg: | ||
| 10 | + | ||
| 11 | + import requests | ||
| 12 | + | ||
| 13 | + @params 指处理方法中的 query | ||
| 14 | + @data 指处理方法中的 body | ||
| 15 | + @return 'success' 成功 | ||
| 16 | + | ||
| 17 | + status = requests.post("http://127.0.0.1:8001/clearcache", params = {"key": "zhaolu1234dangge"}, data = "", timeout = 300).text | ||
| 18 | + | ||
| 19 | + if status != 'success' : | ||
| 20 | + print("错误") | ||
| 21 | +]=] | ||
| 22 | + | ||
| 23 | + | ||
| 8 | -- 清空缓存 | 24 | -- 清空缓存 | 
| 9 | function _M.clearcache(query, body) | 25 | function _M.clearcache(query, body) | 
| 10 | skynet.error(string.format("clearcache time: %s", skynet.timex())) | 26 | skynet.error(string.format("clearcache time: %s", skynet.timex())) | 
| @@ -12,7 +28,7 @@ function _M.clearcache(query, body) | @@ -12,7 +28,7 @@ function _M.clearcache(query, body) | ||
| 12 | return 'success' | 28 | return 'success' | 
| 13 | end | 29 | end | 
| 14 | 30 | ||
| 15 | ---重新加载 需要修改的csvdb | 31 | +--重新加载 需要修改的csvdb -- 单字段修改 优先使用hotfix_csvdata | 
| 16 | --[=[ eg: | 32 | --[=[ eg: | 
| 17 | body = """ | 33 | body = """ | 
| 18 | csvdb["itemCsv"][1]["name"] = "测试一下" | 34 | csvdb["itemCsv"][1]["name"] = "测试一下" | 
| @@ -21,20 +37,49 @@ end | @@ -21,20 +37,49 @@ end | ||
| 21 | 37 | ||
| 22 | function _M.reload_csvdata(query, body) | 38 | function _M.reload_csvdata(query, body) | 
| 23 | if not body or body == "" then | 39 | if not body or body == "" then | 
| 24 | - return | 40 | + return 'no body' | 
| 25 | end | 41 | end | 
| 26 | 42 | ||
| 27 | local ok = pcall(load, body) | 43 | local ok = pcall(load, body) | 
| 28 | - if not ok then return end | ||
| 29 | - | ||
| 30 | - skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body)) | 44 | + if not ok then | 
| 45 | + return "code error" | ||
| 46 | + end | ||
| 31 | 47 | ||
| 32 | - local status = skynet.call('CSVDATA', "lua", "reload", body) | 48 | + local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "reload", body) | 
| 33 | if status == "ok" then | 49 | if status == "ok" then | 
| 50 | + skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body)) | ||
| 34 | return 'success' | 51 | return 'success' | 
| 52 | + else | ||
| 53 | + return 'error update' | ||
| 35 | end | 54 | end | 
| 36 | end | 55 | end | 
| 37 | 56 | ||
| 57 | +--指定更新某个字段值 | ||
| 58 | +--[=[ | ||
| 59 | + 解码后 | ||
| 60 | + body = { | ||
| 61 | + {"itemCsv", 1, "name", "测试一下"}, | ||
| 62 | + {"itemCsv", 2, "name", "测试一下"} | ||
| 63 | + } | ||
| 64 | +]=] | ||
| 65 | +function _M.hotfix_csvdata(query, body) | ||
| 66 | + if not body or body == "" then | ||
| 67 | + return 'no body' | ||
| 68 | + end | ||
| 69 | + | ||
| 70 | + local ok, result = pcall(json.decode, body) | ||
| 71 | + if not ok or type(result) ~= 'table' then | ||
| 72 | + return "decode error" | ||
| 73 | + end | ||
| 74 | + local ok, status = pcall(skynet.call, 'CSVDATA', "lua", "hotfix", result) | ||
| 75 | + | ||
| 76 | + if status == "ok" then | ||
| 77 | + skynet.error(string.format("hotfix_csvdata time: %s, code: %s", skynet.timex(), body)) | ||
| 78 | + return 'success' | ||
| 79 | + else | ||
| 80 | + return 'error update' | ||
| 81 | + end | ||
| 82 | +end | ||
| 38 | 83 | ||
| 39 | -- 热更新代码 -- 针对 agent 执行发送过来的代码 -- 代码要规范~ | 84 | -- 热更新代码 -- 针对 agent 执行发送过来的代码 -- 代码要规范~ | 
| 40 | 85 | ||
| @@ -59,21 +104,53 @@ end | @@ -59,21 +104,53 @@ end | ||
| 59 | HEHE = 123 | 104 | HEHE = 123 | 
| 60 | """ | 105 | """ | 
| 61 | 106 | ||
| 62 | -3. 修改 role 方法(待定) | ||
| 63 | - | 107 | +3. 修改 class 类 方法 | 
| 108 | + 1. 修改role的方法 | ||
| 109 | + body = """ | ||
| 110 | + local role = ... | ||
| 111 | + _hotfixClass = _hotfixClass or {} | ||
| 112 | + _hotfixClass["Role"] = _hotfixClass["Role"] or {} | ||
| 113 | + local hotfixFunc = function(hotfixclass) | ||
| 114 | + function hotfixclass:getItemCount(itemId) | ||
| 115 | + return self:getProperty("id") .. "__" .. self:getProperty("uid") .. "__" .. itemId | ||
| 116 | + end | ||
| 117 | + end | ||
| 118 | + table.insert(_hotfixClass["Role"], hotfixFunc) | ||
| 119 | + if role then | ||
| 120 | + hotfixFunc(role) | ||
| 121 | + end | ||
| 122 | + """ | ||
| 123 | + 2. 修改hero的方法 | ||
| 64 | body = """ | 124 | body = """ | 
| 65 | - | 125 | + local role = ... | 
| 126 | + _hotfixClass = _hotfixClass or {} | ||
| 127 | + _hotfixClass["Hero"] = _hotfixClass["Hero"] or {} | ||
| 128 | + local hotfixFunc = function(hotfixclass) | ||
| 129 | + function hotfixclass:getBattleValue() | ||
| 130 | + return self:getProperty("id") + "98700000000" | ||
| 131 | + end | ||
| 132 | + end | ||
| 133 | + table.insert(_hotfixClass["Hero"], hotfixFunc) | ||
| 134 | + if role and role.heros then | ||
| 135 | + for _, hero in pairs(role.heros) do | ||
| 136 | + hotfixFunc(hero) | ||
| 137 | + end | ||
| 138 | + end | ||
| 66 | """ | 139 | """ | 
| 140 | + | ||
| 141 | + 3. 其他的类仿照上面的写法 | ||
| 67 | ]=] | 142 | ]=] | 
| 68 | 143 | ||
| 69 | -function _M.hotfix(query, body) | 144 | +function _M.hotfix_code(query, body) | 
| 70 | if not body or body == "" then | 145 | if not body or body == "" then | 
| 71 | - return | 146 | + return "no body" | 
| 72 | end | 147 | end | 
| 73 | local ok = pcall(load, body) | 148 | local ok = pcall(load, body) | 
| 74 | - if not ok then return end | 149 | + if not ok then | 
| 150 | + return "code error" | ||
| 151 | + end | ||
| 75 | 152 | ||
| 76 | - skynet.error(string.format("hotfix time: %s, code: %s", skynet.timex(), body)) | 153 | + skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body)) | 
| 77 | 154 | ||
| 78 | pcall(skynet.call, 'WATCHDOG', "lua", "hotfix", body) | 155 | pcall(skynet.call, 'WATCHDOG', "lua", "hotfix", body) | 
| 79 | return 'success' | 156 | return 'success' | 
src/agent.lua
| @@ -24,6 +24,7 @@ local agentInfo = {} -- { client_fd, role, gate_serv, open_timer} | @@ -24,6 +24,7 @@ local agentInfo = {} -- { client_fd, role, gate_serv, open_timer} | ||
| 24 | local agent_util, cs | 24 | local agent_util, cs | 
| 25 | 25 | ||
| 26 | _hotfixActions = _hotfixActions or {} | 26 | _hotfixActions = _hotfixActions or {} | 
| 27 | +_hotfixClass = _hotfixClass or {} | ||
| 27 | 28 | ||
| 28 | --- {{{ 定时器相关 | 29 | --- {{{ 定时器相关 | 
| 29 | local function handle_timeout() | 30 | local function handle_timeout() | 
| @@ -286,10 +287,10 @@ end | @@ -286,10 +287,10 @@ end | ||
| 286 | function CMD.hotfix(code) | 287 | function CMD.hotfix(code) | 
| 287 | local ok, func = pcall(load, code) | 288 | local ok, func = pcall(load, code) | 
| 288 | if ok then | 289 | if ok then | 
| 289 | - ok = pcall(func) | 290 | + ok = pcall(func, agentInfo.role) | 
| 290 | end | 291 | end | 
| 291 | if not ok then | 292 | if not ok then | 
| 292 | - skynet.error("hotfix error by code " .. code) | 293 | + skynet.error("hotfix_code error by code " .. code) | 
| 293 | end | 294 | end | 
| 294 | end | 295 | end | 
| 295 | 296 | 
src/services/csvdatad.lua
| @@ -61,8 +61,8 @@ end | @@ -61,8 +61,8 @@ end | ||
| 61 | 61 | ||
| 62 | 62 | ||
| 63 | local CMD = {} | 63 | local CMD = {} | 
| 64 | + | ||
| 64 | function CMD.reload(code) | 65 | function CMD.reload(code) | 
| 65 | - -- 重新加载 csvdata | ||
| 66 | csvdb = csvdb or {} | 66 | csvdb = csvdb or {} | 
| 67 | 67 | ||
| 68 | local ok, func = pcall(load, code) | 68 | local ok, func = pcall(load, code) | 
| @@ -78,6 +78,29 @@ function CMD.reload(code) | @@ -78,6 +78,29 @@ function CMD.reload(code) | ||
| 78 | return 'ok' | 78 | return 'ok' | 
| 79 | end | 79 | end | 
| 80 | 80 | ||
| 81 | +--更新已经存在的 | ||
| 82 | +function CMD.hotfix(fieldss) | ||
| 83 | + csvdb = csvdb or {} | ||
| 84 | + for _, fields in ipairs(fieldss) do | ||
| 85 | + if #fields >= 3 and (type(fields[#fields]) == 'number' or type(fields[#fields]) == 'string') then | ||
| 86 | + local temp = csvdb | ||
| 87 | + local ok = false | ||
| 88 | + for i = 1, #fields - 1 do | ||
| 89 | + if type(temp) ~= 'table' then break end | ||
| 90 | + if type(fields[i]) ~= 'number' and type(fields[i]) ~= 'string' then break end | ||
| 91 | + if i == #fields - 1 then | ||
| 92 | + if type(temp[fields[i]]) ~= 'number' and type(temp[fields[i]]) ~= 'string' then break end | ||
| 93 | + temp[fields[i]] = fields[#fields] | ||
| 94 | + else | ||
| 95 | + temp = temp[fields[i]] | ||
| 96 | + end | ||
| 97 | + end | ||
| 98 | + end | ||
| 99 | + end | ||
| 100 | + sharedata.update("csvdata", csvdb) | ||
| 101 | + return 'ok' | ||
| 102 | +end | ||
| 103 | + | ||
| 81 | skynet.start(function () | 104 | skynet.start(function () | 
| 82 | travCsv("src/csvdata", file2timeMap) | 105 | travCsv("src/csvdata", file2timeMap) | 
| 83 | sharedata.new("csvdata", csvdb) | 106 | sharedata.new("csvdata", csvdb) | 
src/shared/functions.lua
| @@ -215,6 +215,17 @@ function class(classname, super) | @@ -215,6 +215,17 @@ function class(classname, super) | ||
| 215 | -- copy fields from class to native object | 215 | -- copy fields from class to native object | 
| 216 | for k,v in pairs(cls) do instance[k] = v end | 216 | for k,v in pairs(cls) do instance[k] = v end | 
| 217 | instance.class = cls | 217 | instance.class = cls | 
| 218 | + | ||
| 219 | + -- 覆盖热更新的方法 | ||
| 220 | + pcall(function() | ||
| 221 | + if _hotfixClass and _hotfixClass[cls.__cname] then | ||
| 222 | + for _, func in ipairs(_hotfixClass[cls.__cname]) do | ||
| 223 | + func(instance) -- 绑定新的方法 | ||
| 224 | + end | ||
| 225 | + end | ||
| 226 | + end) | ||
| 227 | + | ||
| 228 | + | ||
| 218 | instance:ctor(...) | 229 | instance:ctor(...) | 
| 219 | return instance | 230 | return instance | 
| 220 | end | 231 | end | 
| @@ -235,6 +246,16 @@ function class(classname, super) | @@ -235,6 +246,16 @@ function class(classname, super) | ||
| 235 | function cls.new(...) | 246 | function cls.new(...) | 
| 236 | local instance = setmetatable({}, cls) | 247 | local instance = setmetatable({}, cls) | 
| 237 | instance.class = cls | 248 | instance.class = cls | 
| 249 | + | ||
| 250 | + -- 覆盖热更新的方法 | ||
| 251 | + pcall(function() | ||
| 252 | + if _hotfixClass and _hotfixClass[cls.__cname] then | ||
| 253 | + for _, func in ipairs(_hotfixClass[cls.__cname]) do | ||
| 254 | + func(instance) -- 绑定新的方法 | ||
| 255 | + end | ||
| 256 | + end | ||
| 257 | + end) | ||
| 258 | + | ||
| 238 | instance:ctor(...) | 259 | instance:ctor(...) | 
| 239 | return instance | 260 | return instance | 
| 240 | end | 261 | end |