Player = {} Player.EventCfg = {} Player.Cache = {} Player.sycCfg = {} ---* 同步数据 function Player.syncCfg(actor) for obj_name, cfg in pairs(Player.sycCfg) do Message.sendmsg(actor, ssrNetMsgCfg.sync, nil, nil, nil, { name = obj_name, cfg = cfg }) end sendredvartoclient(actor) end ---* 获得最目标的距离 --检查一个对象的范围 function Player.CheckRange(obj, x, y, range) local cur_x, cur_y = getbaseinfo(obj, ConstCfg.gbase.x), getbaseinfo(obj, ConstCfg.gbase.y) local min_x, max_x = x - range, x + range local min_y, max_y = y - range, y + range if (cur_x >= min_x) and (cur_x <= max_x) and (cur_y >= min_y) and (cur_y <= max_y) then return true end return false end --检查自己与npc的距离 function Player.CheckNPCRange(actor, target, range) if not target then return false end local target_mapid = getbaseinfo(target, ConstCfg.gbase.mapid) local my_mapid = getbaseinfo(actor, ConstCfg.gbase.mapid) if target_mapid ~= my_mapid then return false end local target_x = getbaseinfo(target, ConstCfg.gbase.x) local target_y = getbaseinfo(target, ConstCfg.gbase.y) return Player.CheckRange(actor, target_x, target_y, range) end -------------------------装备信息------------------------------ ---* 获取装备位信息 function Player.get_itemw(actor, id) Player.Cache[id].itemw = {} for i = 0, 220, 1 do local itemObj = GetItemByPos(actor, i) if itemObj ~= "0" then local itemName = Item.GetNameByObj(actor, itemObj) Player.Cache[id].itemw[i] = itemName end end end local function _takeonex(actor, item, where, itemName, makeindex) -- 穿上物品事件 local id = getbaseinfo(actor, ConstCfg.gbase.id) if not Player.Cache[id] then Player.Cache[id] = {} end if not Player.Cache[id].itemw then Player.Cache[id].itemw = {} end Player.Cache[id].itemw[where] = itemName ReloadAttOBJ.main(actor) end GameEvent.add(EventCfg.onTakeOnEx, _takeonex, Player, 2) local function _takeoffex(actor, item, where, itemName, makeindex) -- 脱下物品事件 local id = getbaseinfo(actor, ConstCfg.gbase.id) if not Player.Cache[id] then Player.Cache[id] = {} end if not Player.Cache[id].itemw then Player.Cache[id].itemw = {} end Player.Cache[id].itemw[where] = nil ReloadAttOBJ.main(actor) end GameEvent.add(EventCfg.onTakeOffEx, _takeoffex, Player, 2) -------------------------重读登陆触发------------------------------ ---* 上线缓存 local function login_cache(actor) local id = getbaseinfo(actor, ConstCfg.gbase.id) Player.Cache[id] = {} Player.get_itemw(actor, id) -- ReloadAttOBJ.get_attr(actor, id) Player.syncCfg(actor) end GameEvent.add(EventCfg.onLogin, login_cache, Player, 1) GameEvent.add(EventCfg.onqfloadend, login_cache, Player, 1) ---* 下线清理cache local function _claer_check(actor) local id = getbaseinfo(actor, ConstCfg.gbase.id) Player.Cache[id] = nil ReloadAttOBJ.Cache[id] = nil end GameEvent.add(EventCfg.onExitGame, _claer_check, Player) ---* 获取角色名字 ---* 参数:角色对象 function Player.getname(actor) return getbaseinfo(actor, ConstCfg.gbase.name) end ---* 获取角色所在地图\X坐标\Y坐标 function Player.getmapinfo(actor) local mapinfo = {} mapinfo[1] = getbaseinfo(actor, ConstCfg.gbase.mapid) mapinfo[2] = getbaseinfo(actor, ConstCfg.gbase.x) mapinfo[3] = getbaseinfo(actor, ConstCfg.gbase.y) return mapinfo end ---给物品通过表 --- 参数1 actor 玩家对象 --- 参数2 p_table 给予表格 {物品名,数量,是否绑定} --- 参数3 p_multiple 给予倍率 可空 --- 参数4 p_desc 备注 ---@param actor userdata ---@param p_table table ---@param p_multiple? integer ---@param p_desc string ---@diagnostic disable-next-line: lowercase-global function _giveitemsByNameTbl(actor, p_table, p_multiple, p_desc) local _name = p_table[1] if _name == "金币" then if getflagstatus(actor, VarCfg.Falg_tequan) == 0 then _name = "绑定金币" end end if _name == "元宝" then if getflagstatus(actor, VarCfg.Falg_tequan) == 0 then _name = "绑定元宝" end end local _idx = getstditeminfo(_name, ConstCfg.stditeminfo.idx) local _num = p_table[2] local _bind = p_table[3] or 0 if p_multiple then _num = math.floor(_num * p_multiple) end if _giveitemsIsTitle(actor, p_table) then return end if Item.isCurrency(_idx) then changemoney(actor, _idx, "+", _num, p_desc, true) else giveitem(actor, _name, _num, _bind) end end function Player.giveitemsByNameTbl(actor, p_table, p_multiple, p_desc) if Player.checkbagsize(actor, #p_table) then if not Player.isMultilevelTable(p_table) then _giveitemsByNameTbl(actor, p_table, p_multiple, p_desc) else for _, item in ipairs(p_table) do _giveitemsByNameTbl(actor, item, p_multiple, p_desc) end end else Player.sendmailByNameTbl(actor, p_table, p_multiple, "您的背包已满!") Func.sendmsg9(actor, "您的背包已满!物品已通过邮件的方式发送!请注意查收!") end end -- 检查包裹空格 -- 参数1 玩家对象 -- 参数2 检查空格数 -- 返回值 boolean ---@param actor userdata ---@param remsize integer ---@return boolean function Player.checkbagsize(actor, remsize) local baggridcount = getbaseinfo(actor, 34) local baggridmaxcount = getbaseinfo(actor, 63) if baggridcount + remsize > baggridmaxcount then return false else return true end end ---* 判断一个表是否为多元表 ---* tbl 表格 ---@param tbl table function Player.isMultilevelTable(tbl) for _, value in pairs(tbl) do if type(value) == "table" then return true -- 存在子表,表为多级结构 end end return false -- 不存在子表,表为一维结构 end ---@diagnostic disable-next-line: lowercase-global function _giveitemsIsTitle(actor, p_table) local _titlename = p_table[1] local _stdmode = getstditeminfo(p_table[1], ConstCfg.stditeminfo.stdmode) if _stdmode == 58 then _titlename = string.gsub(_titlename, "“", "") _titlename = string.gsub(_titlename, "”", "") Player.confertitle(actor, _titlename) return true else return false end end ---* 增加称号 ---* 玩家对象 ---* 称号名称 ---* 激活 0 激活 1 不激活 ---* 是否刷新属性 ---@param actor any ---@param name any ---@param use any ---@param upAttr any function Player.confertitle(actor, name, use, upAttr) local _bool = confertitle(actor, name, use) if upAttr then ReloadAttOBJ.main(actor) end return _bool end ---* 增加称号 ---* 玩家对象 ---* 称号名称 ---* 激活 0 激活 1 不激活 ---* 是否刷新属性 ---@param actor any ---@param name any ---@param upAttr any function Player.deprivetitle(actor, name, upAttr) local _bool = deprivetitle(actor, name) if upAttr then ReloadAttOBJ.main(actor) end return _bool end ---* 玩家回血 function Player.humanhp(actor, operate, nvalue, effId, delay, hitter, isSend, isRob) local _map = getbaseinfo(actor, ConstCfg.gbase.mapid) if _map == "渡劫台" then return end humanhp(actor, operate, nvalue, effId, delay, hitter, isSend, isRob) end ---* 玩家回蓝 function Player.humanmp(actor, operate, nvalue) local _map = getbaseinfo(actor, ConstCfg.gbase.mapid) if _map == "渡劫台" then return end humanmp(actor, operate, nvalue) end ---* 玩家百分比回血 function Player.addhpper(actor, operate, nvalue) local _map = getbaseinfo(actor, ConstCfg.gbase.mapid) if _map == "渡劫台" then return end addhpper(actor, operate, nvalue) end ---* 玩家百分比回蓝 function Player.addmpper(actor, operate, nvalue) local _map = getbaseinfo(actor, ConstCfg.gbase.mapid) if _map == "渡劫台" then return end addmpper(actor, operate, nvalue) end --------------* 普通变量----------------- ---* 设置玩家普通str变量 function Player.setstr(actor, key, nValue) if not isnotnull(actor) then return end SetStr(0, actor, key, nValue) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end ---* 设置玩家普通int变量 function Player.setint(actor, key, nValue) if not isnotnull(actor) then return end SetInt(0, actor, key, nValue) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end ---* 设置玩家int变量+值 function Player.addint(actor, key, nValue) if not isnotnull(actor) then return end SetInt(0, actor, key, Player.getint(actor, key) + nValue) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end ---* 获取玩家普通str变量 function Player.getstr(actor, key) return GetStr(0, actor, key) end ---* 获取玩家普通int变量 function Player.getint(actor, key) return GetInt(0, actor, key) end ---* 设置玩家临时str变量 function Player.settempstr(actor, key, nValue) if not isnotnull(actor) then return end SetTempStr(0, actor, key, nValue) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end --------------* 临时变量----------------- ---* 设置玩家临时int变量 function Player.settempint(actor, key, nValue) if not isnotnull(actor) then return end SetTempInt(0, actor, key, nValue) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end ---* 设置玩家临时int变量+值 function Player.additempint(actor, key, nValue) if not isnotnull(actor) then return end SetTempInt(0, actor, key, Player.gettempint(actor, key) + nValue) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end ---* 获取玩家临时str变量 function Player.gettempstr(actor, key) return GetTempStr(0, actor, key) end ---* 获取玩家临时int变量 function Player.gettempint(actor, key) return GetTempInt(0, actor, key) end --------------------------* 期限变量------------------------------ ---* 设置玩家期限str变量 ---* 玩家对象 ---* 变量名 ---* 值 ---* 时间戳 可空 默认明天0点过期 ---@param actor any ---@param key any ---@param value any ---@param time any function Player.setTLstr(actor, key, value, time) if not isnotnull(actor) then return end SetTLStr(0, actor, key, value, time or DateOBJ.getTomorrowZero()) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end ---* 设置玩家期限int变量 ---* 玩家对象 ---* 变量名 ---* 值 ---* 时间戳 可空 默认明天0点过期 ---@param actor any ---@param key any ---@param value any ---@param time any function Player.setTLint(actor, key, value, time) if not isnotnull(actor) then return end SetTLInt(0, actor, key, value, time or DateOBJ.getTomorrowZero()) sendredvartoclient(actor) ---* 修改变量触发事件 if Player.EventCfg[key] then GameEvent.push(Player.EventCfg[key], actor) end end ---* 获取玩家期限str变量 function Player.getTLstr(actor, key) local value, time = GetTLStr(0, actor, key) return value end ---* 获取玩家期限int变量 function Player.getTLint(actor, key) local value, time = GetTLInt(0, actor, key) return value end local Player_getstr = { ["LT"] = function(actor, var) return Player.getTLstr(actor, var) end, ["temp"] = function(actor, var) return Player.gettempstr(actor, var) end, } local Player_setstr = { ["LT"] = function(actor, var, value) return Player.setTLstr(actor, var, value) end, ["temp"] = function(actor, var, value) return Player.settempstr(actor, var, value) end, } -------------------- 键值类 --------------------------- function Player.setkeycount(actor, var, key, value, _type) if not isnotnull(actor) then return end if var == nil then return false end if key == nil then return false end local tempvar = Player.getstr(actor, var) if Player_getstr[_type] then local func = Player_getstr[_type] tempvar = func(actor, var) end local data = tempvar and json2tblex(tempvar) or {} if not data[key] then data["J_" .. key] = value else data["J_" .. key] = value end if not _type then Player.setstr(actor, var, tbl2json(data)) else if Player_setstr[_type] then local func = Player_setstr[_type] if func then func(actor, var, tbl2json(data)) end end end end ----* 获取键值对 ---* @param actor 角色对象 ---* @param var 变量名称 ---* @param key 键名 ---* @param _type 获取类型 默认为空 永久str LT 期限变量 temp 临时变量 ---@param actor any ---@param var any ---@param key any ---@param _type any ---@return boolean function Player.getkeycount(actor, var, key, _type) if not isnotnull(actor) then return end if var == nil then return false end if key == nil then return false end local tempvar = Player.getstr(actor, var) if Player_getstr[_type] then local func = Player_getstr[_type] tempvar = func(actor, var) end local data = tempvar and json2tblex(tempvar) or {} return data["J_" .. key] or nil end -- 获取键值返回键值表 function Player.getkeytbl(actor, var) if not isnotnull(actor) then return end if var == nil then return false end local tempvar = Player.getstr(actor, var) local data = tempvar and json2tblex(tempvar) or {} local newData = {} for key, value in pairs(data or {}) do local new_key = key:gsub("J_", "") newData[tonumber(new_key) and tonumber(new_key) or new_key] = value end return newData end function Player.delcountkey(actor, var, key) if not isnotnull(actor) then return end if var == nil then return false end if key == nil then return false end local tempvar = Player.getstr(actor, var) local data = tempvar and json2tblex(tempvar) or {} if data["J_" .. key] then data["J_" .. key] = nil end Player.setstr(actor, var, tbl2json(data)) end -----* 统一获取类型变量 Player.getvarcalss = { ["永久"] = function(actor, var, calss) if not var then return 0 end if calss == "INT" then return Player.getint(actor, var) end if calss == "STR" then return Player.getstr(actor, var) end return false end, ["临时"] = function(actor, var, calss) if not var then return 0 end if calss == "INT" then return Player.gettempint(actor, var) end if calss == "STR" then return Player.gettempstr(actor, var) end return false end, ["周期"] = function(actor, var, _calss) if not var then return 0 end if _calss == "INT" then return Player.getTLint(actor, var) end if _calss == "STR" then return Player.getTLstr(actor, var) end return false end, } function Player.getVar(actor, var, calss) local func = Player.getvarcalss[calss] if func then local var_splis = Func.splitString(var, "_") local _value = func(actor, var, var_splis[1]) if _value ~= false then return _value else if var_splis[1] == "INT" then return 0 else return "" end end end end -----* 统一设置类型变量 Player.setvarcalss = { ["永久"] = function(actor, var, value, calss) if not var then return 0 end if calss == "INT" then Player.setint(actor, var, value) end if calss == "STR" then Player.setstr(actor, var, value) end end, ["临时"] = function(actor, var, value, calss) if not var then return 0 end if calss == "INT" then Player.settempint(actor, var, value) end if calss == "STR" then Player.settempstr(actor, var, value) end end, ["周期"] = function(actor, var, value, calss) if not var then return 0 end if calss == "INT" then return Player.setTLint(actor, var, value) end if calss == "STR" then return Player.setTLstr(actor, var, value) end return false end, } function Player.setVar(actor, var, value, calss) local func = Player.setvarcalss[calss] if func then local var_splis = Func.splitString(var, "_") func(actor, var, value, var_splis[1]) end end return Player