API = {} ----------------------------------------- ---------------通用处理------------------ ----------------------------------------- function API.MapMove(actor, mapCfgId, line, x, y, range) info("接口管理传送") info(mapCfgId, "mapCfgId") if mapCfgId == 0 then mapCfgId = getbaseinfo(actor, "mapid") end if x ~= nil and y ~= nil then maptransfer(actor, x, y, mapCfgId, line, range) else maptransfer(actor, 0, 0, mapCfgId, line, 300) end end --根据角色名获取对象 function API.Name2Guid(name) local rid = getroleidbyname(name) local playerActor = getactor(rid) return playerActor end --获取指定范围内的成员列表 function API.GetRangeTeamList(actor, range) local list = API.GetTeamList(actor) local list1 = {} if next(list) then for i = 1, #list do local player = list[i] if getbaseinfo(actor, "unimapid") == getbaseinfo(player, "unimapid") then local distance = mapobjectdistance(actor, actor, player) if distance <= range then table.insert(list1, player) end end end end -- info(#list1,"#list1") return list1 end --获取队伍成员列表 function API.GetTeamList(actor) local list = {} local teamId = getbaseinfo(actor, "teamid") if teamId ~= 0 then local teamInfo = getteaminfo(actor, teamId) local allteammemberinfo = teamInfo.allteammemberinfo for i = 1, #allteammemberinfo do local rid = allteammemberinfo[i].rid local player = getactor(rid) table.insert(list, player) end end return list end --获取队伍平均等级 function API.GetTeamPingJunLevel(actor) local teamId = getbaseinfo(actor, "teamid") if teamId == 0 then return 0 end local teamInfo = getteaminfo(actor, teamId) local allteammemberinfo = teamInfo.allteammemberinfo local allLevel = 0 for i = 1, #allteammemberinfo do local rid = allteammemberinfo[i].rid local player = getactor(rid) local level = getbaseinfo(player, "level") allLevel = allLevel + level end local pinJunLevel = math.floor(allLevel / #allteammemberinfo) return pinJunLevel end --根据物品的唯一ID获取物品 function API.ItemId2WearBarAndPos(actor, itemId) local equipInfo = getequipinfo(actor, itemId, 1) local cfgid = equipInfo.cfgid local wearBar = ConfigDataManager.getTableValue("cfg_item", "wearBarID", "id", cfgid) local equipPos = ConfigDataManager.getTableValue("cfg_item", "strPart", "id", cfgid) wearBar = tonumber(wearBar) if string.find(equipPos, "#") then local tab = string.split(equipPos, "#") equipPos = tonumber(tab[1]) else equipPos = tonumber(equipPos) end return wearBar, equipPos end --根据权重取下标 function API.GetQZ(tab) local idx = 0 if tab == nil or #tab <= 0 then return 0 end local Min, Max = 0, 0 for i = 1, #tab do Max = Max + tab[i].qz end local RanNum = math.random(1, Max) for i = 1, #tab do Min = Min + tab[i].qz if RanNum <= Min then idx = i break end end return idx end --检测CD function API.checkCD(lastTime, cd) local nowTime = os.time() return nowTime - lastTime > cd end --复制表格 function API.deepCopy(original) local copy if type(original) == "table" then copy = {} for k, v in next, original, nil do copy[API.deepCopy(k)] = API.deepCopy(v) end setmetatable(copy, API.deepCopy(getmetatable(original))) else copy = original end return copy end function API.TableDeepcopy(tmp) if nil == tmp then return nil end local res = {} for key, val in pairs(tmp) do if type(val) == "table" then res[key] = API.TableDeepcopy(val) else res[key] = val end end return res end --道具列表放大 function API.ItemListMulti(itemList, multi) local list = API.deepCopy(itemList) for k, v in pairs(list) do v[2] = v[2] * multi end return list end --道具名字列表转换为id function API.ItemListNameToID(itemList) local list = {} for k, v in pairs(itemList) do local itemName = v[1] local itemNum = tonumber(v[2]) local itemID = ConfigDataManager.getTableValue("cfg_item", "id", "name", itemName) list[tonumber(itemID)] = itemNum end return list end ---消耗 奖励 检查 function API.Check(check_str, have_count, itemNum) check_str = check_str or ">=" info("来了66", check_str, have_count, itemNum, type(have_count), type(itemNum)) local result = true if check_str == ">" or check_str == nil then if have_count <= itemNum then result = false end elseif check_str == "<" then if have_count >= itemNum then result = false end elseif check_str == "==" then if have_count ~= itemNum then result = false end elseif check_str == ">=" then -- info("你干嘛",check_str,have_count,itemNum,type(have_count),type(itemNum),result) if have_count < itemNum then result = false end elseif check_str == "<=" then if have_count > itemNum then result = false end end return result end function API.CheckStrengthenItem(actor, tcl, desc) end function API.CheckItem(actor, tcl, desc) if not next(tcl) then return false end for k, v in pairs(tcl) do if type(k) ~= "string" then local itemName = v[1] --类型为变化或者道具时可用 道具名或者变量名 local itemNum = tonumber(v[2]) --对应类型需要的检查值 local bangding = v[3] or v.bind --是否绑定 道具用 暂无用 local item_type = v[4] or v.mold --类型 1或者nil道具 2 Int变量 3开服天数 4龙魂连击等级 5所有充值挡位 玩家等级 转职 local var_type = v[5] or v.var_type --变量类型 nil 存盘 0日变量 1 缓存小退清零 local check_str = v[6] or v.checkStr -- == > < >= <= local def_str = v[7] or v.desc --检查失败后的默认消息提示 不传没有 -- info(v,itemName) if not item_type or item_type == 1 then --2 Int变量 local itemID = ConfigDataManager.getTableValue("cfg_item", "id", "name", itemName) local hasCount = getbagitemcountbyid(actor, itemID) if hasCount < itemNum then if desc then if desc ~= "" then API.SendCenterMsg(actor, desc) end else API.SendCenterMsg(actor, itemName .. "不足") end return false end elseif item_type == 2 then --3 开服天数 local have_count = API.GetInt(actor, itemName, var_type) -- info(v,itemName,have_count) def_str = def_str or "变量不足!" if API.Check(check_str, have_count, itemNum) == false then if def_str and desc ~= "" then API.SendCenterMsg(actor, def_str) end return false end elseif item_type == 3 then local have_count = tonumber(getserveropendays(actor)) -- info("开服天数",have_count) if API.Check(check_str, have_count, itemNum) == false then if def_str then API.SendCenterMsg(actor, def_str) end return false end elseif item_type == 4 then -- local comboSkill = getrolefield(actor,"role.roleskill.comboskill") -- local have_count = comboSkill.skillLv local have_count = API.GetInt(actor, VarCfg.ZC_NewDragonSoulComboLevel) if not API.Check(check_str, have_count, itemNum) then if desc then if desc ~= "" then API.SendCenterMsg(actor, desc) end else API.SendCenterMsg(actor, "龙魂连击等级不足") end return false end elseif item_type == 5 then if not RechargeStall.checkAllBuy(actor, desc) then return end elseif item_type == "玩家等级" then local cur_level = tonumber(getbaseinfo(actor, "level")) or 0 if API.Check(check_str, cur_level, itemNum) == false then if desc then if desc ~= "" then API.SendCenterMsg(actor, desc) end else API.SendCenterMsg(actor, "等级不足,需要" .. itemNum .. "级") end return false end elseif item_type == "转职" then local data = API.GetTable(actor, VarCfg.ZC_ZhuanZhiVar) or {} local count = data.count or 0 if API.Check(check_str, count, itemNum) == false then if desc then if desc ~= "" then API.SendCenterMsg(actor, desc) end else API.SendCenterMsg(actor, "请" .. itemNum .. "转后再来吧") end return false end end end end return true end function API.CheckItemMap(actor, map) for k, v in pairs(map) do local hasCount = getbagitemcountbyid(actor, k) if hasCount < v then return false end end return true end function API.TakeItemMap(actor, map, desc) for k, v in pairs(map) do removeitemfrombag(actor, k, v, 0, 9999, desc) end end function API.takeItem(actor, tcl, desc) if not next(tcl) then return false end if API.CheckItem(actor, tcl) == false then return false end for k, v in pairs(tcl) do if type(k) ~= "string" then local itemName = v[1] local itemNum = tonumber(v[2]) local bangding = v[3] local item_type = v[4] or v.mold --检查 1或者nil道具 2 Int变量 local var_type = v[5] if not item_type or item_type == 1 then --2 Int变量 local itemID = ConfigDataManager.getTableValue("cfg_item", "id", "name", itemName) removeitemfrombag(actor, itemID, itemNum, 0, 9999, desc) elseif item_type == 2 then local var = API.GetInt(actor, itemName, var_type) var = var - itemNum API.SetInt(actor, itemName, var, var_type) end end end return true end function API.GiveItem(actor, twp, desc, notPush) if not next(twp) then return false end local itemIdList = {} for k, v in pairs(twp) do local newTwp = {} local itemName = v[1] local itemNum = v[2] local bangding = v[3] local item_type = v[4] --检查 1或者nil道具 2 Int变量 local var_type = v[5] if not item_type or item_type == 1 then --2 Int变量 local itemID = ConfigDataManager.getTableValue("cfg_item", "id", "name", itemName) newTwp[itemID] = itemNum local id = Bag.addItemMapToBag(actor, newTwp, bangding, 9999, desc) table.insert(itemIdList, {id = id, cfgId = itemID, count = itemNum}) elseif item_type == 2 then local var = API.GetInt(actor, itemName, var_type) var = var + itemNum API.SetInt(actor, itemName, var, var_type) end end if #itemIdList > 0 and (not notPush) then -- info("走了没",itemIdList,LuaMessageIdToClient.COMMON_REWARD_PANEL) sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, itemIdList) end return true, itemIdList end ---发送消息 function API.SendCenterMsg(actor, msg, color, log) if not color then tipinfo(actor, msg) else tipinfo(actor, "" .. msg .. "") end if log then error(getbaseinfo(actor, "rolename"), msg) end end --打印表格消息 function API.PrintTable(table, level, key) if type(table) ~= "table" then info(table) return end level = level or 1 local indent = "" for i = 1, level do indent = indent .. " " end if key ~= "" and key ~= nil then -- info(tostring(key)..type(key)); info(indent .. key .. " " .. "=" .. " " .. "{") else info(indent .. "{") end key = "" if type(table) == "table" then for k, v in pairs(table) do if type(v) == "table" then key = k API.PrintTable(v, level + 1, key) else local content = string.format("%s%s = %s", indent .. " ", tostring(k), tostring(v)) info(content) end end end info(indent .. "}") end ----------------------------------------- ---------------伤害相关------------------ ----------------------------------------- --获取玩家当前剩余血量百分比 function API.GetHpPctNow(actor) local hpNow = getbaseinfo(actor, "hp") local hpMax = getattrinfo(actor, "maxHP") local hpPctNow = hpNow / hpMax return hpPctNow * 100 end --获取玩家当前剩余蓝量百分比 -- function API.GetMpPctNow(play) -- local hpNow = getbaseinfo(play,11) -- local hpMax = getbaseinfo(play,12) -- local hpPctNow = math.floor(hpNow/hpMax) -- return hpPctNow*100 -- end --获取对应百分比的血量 function API.GetHpPctNum(actor, pct) local hpMax = getattrinfo(actor, "maxHP") local hpPctNum = hpMax * (pct / 100) return hpPctNum end --获取对应百分比的蓝量 -- function API.GetMpPctNum(play,pct) -- local mpMax = getbaseinfo(play,12) -- local mpPctNum = mpMax*(pct/100) -- return mpPctNum -- end --获取指定BUFF堆叠层数 function API.GetBuffState(actor, buffId) local buff_info = getbuffinfo(actor) local idx = 0 if buff_info and next(buff_info) then for i = 1, #buff_info do if buff_info[i].buffcfgid == buffId then idx = buff_info[idx].layers end end end return idx end ----------------------------------------- ---------------变量控制------------------ ----------------------------------------- --物品变量 --获取物品变量(注意此接口服务端只支持一种数据结构 map或list 不能都有) --[[ setDurability:是否初始化过耐久 Durability:耐久度 strengthlv:强化等级 tZhuoYueAttIndex:卓越属性 appendlv:追加等级 IsLuck:是否激活幸运 skillName:激活技能名 zaisheng_attr:再生属性 ]] function API.GetItemData(actor, itemId, varName) local itemData = getitemextdata(actor, itemId) or {} return itemData["" .. varName] end function API.GetItemDataSrc(actor, itemId) local itemData = getitemextdata(actor, itemId) return itemData end function API.GetItemLuck(actor, itemId) local itemData = getequipinfo(actor, itemId, 1) local isLuck = false for index, _ in ipairs(itemData.entries) do if itemData.entries[index].attrid == 900 then isLuck = true break end end return isLuck end --设置物品变量 function API.SetItemData(actor, itemId, varName, var) local itemData = getitemextdata(actor, itemId) or {} itemData["" .. varName] = var setitemextdata(actor, itemId, itemData) end --推送流光数据等级 function API.refreshLiuGuang(actor, itemId, val) -- info("推送流光数据等级") local itemData = {} local val = val or EquipFunc.getEquipStrengthLevel(actor, itemId) itemData.strengthlv = val setequipgmext(actor, itemId, itemData) end ---个人变量说明 ---T$ 无类型限制 自动保存数据库 ---J$ 无类型限制 天变量 存入数据库 ---@ 下线不保存 小退清空 --- 获取玩家Int变量 默认为0 var_type nil 存盘 0日变量 1 缓存小退清零 function API.GetInt(actor, varName, var_type) local val = 0 if var_type == 0 then val = getplaydef(actor, "J$" .. varName) elseif var_type == 1 then val = getplaydef(actor, "@" .. varName) else val = getplaydef(actor, "T$" .. varName) end return val or 0 end ---设置玩家Int变量 val类型必须是number function API.SetInt(actor, varName, val, var_type) if type(val) ~= "number" then return end if var_type == 0 then return setplaydef(actor, "J$" .. varName, val) elseif var_type == 1 then return setplaydef(actor, "@" .. varName, val) else return setplaydef(actor, "T$" .. varName, val) end end ---获取玩家string类型的变量 默认为 "" function API.GetStr(actor, varName, var_type) local val = "" if var_type == 0 then val = getplaydef(actor, "J$" .. varName) elseif var_type == 1 then val = getplaydef(actor, "@" .. varName) else val = getplaydef(actor, "T$" .. varName) end return val or "" end ---设置玩家string变量 val类型必须是string function API.SetStr(actor, varName, val, var_type) if type(val) ~= "string" then return end if var_type == 0 then return setplaydef(actor, "J$" .. varName, val) elseif var_type == 1 then return setplaydef(actor, "@" .. varName, val) else return setplaydef(actor, "T$" .. varName, val) end end ---获取玩家table类型的变量 默认为 nil function API.GetTable(actor, varName, var_type) local val = nil if var_type == 0 then val = getplaydef(actor, "J$" .. varName) elseif var_type == 1 then val = getplaydef(actor, "@" .. varName) else val = getplaydef(actor, "T$" .. varName) end return val end ---设置玩家table变量 val类型必须是table var_type 0天变量 1缓存变量 其它正常保存数据库变量 function API.SetTable(actor, varName, val, var_type) if type(val) ~= "table" then return end if var_type == 0 then setplaydef(actor, "J$" .. varName, val) elseif var_type == 1 then setplaydef(actor, "@" .. varName, val) else -- info("记录成功",val,getplaydef(actor,"T$"..varName)) setplaydef(actor, "T$" .. varName, val) end end --- 获取玩家Int天变量 默认为0 function API.GetDayInt(actor, varName) local val = getplaydef(actor, "J$" .. varName) or 0 return val end ---设置玩家Int天变量 val类型必须是number function API.SetDayInt(actor, varName, val) if type(val) ~= "number" then return end return setplaydef(actor, "J$" .. varName, val) end ---获取玩家string类型的天变量 默认为 "" function API.GetDayStr(actor, varName) local val = getplaydef(actor, "J$" .. varName) or "" return val end ---设置玩家string天变量 val类型必须是string function API.SetDayStr(actor, varName, val) if type(val) ~= "string" then return end return setplaydef(actor, "J$" .. varName, val) end ---获取玩家table类型的天变量 默认为 nil function API.GetDayTable(actor, varName) local val = getplaydef(actor, "J$" .. varName) or nil return val end ---设置玩家table天变量 val类型必须是string function API.SetDayTable(actor, varName, val) if type(val) ~= "table" then return end return setplaydef(actor, "J$" .. varName, val) end ---全局变量说明 ---G$ 服务器重启清除 ---R$ 保存数据库 ---Q$ 天变量 每天0点清空 --- 获取系统Int变量 值默认为0 默认类型为2 varType=1 服务器重启清除 =2存入数据库 =3每天0点清除 function API.GetDBNum(varName, varType) local fh = "R$" if varType == 1 then fh = "G$" elseif varType == 3 then fh = "Q$" end return getsysvar(fh .. "" .. varName) or 0 end --- 设置系统Int变量 值默认为0 默认类型为2 varType=1 服务器重启清除 =2存入数据库 =3每天0点清除 function API.SetDBNum(varName, val, varType) if type(val) ~= "number" then return end local fh = "R$" if varType == 1 then fh = "G$" elseif varType == 3 then fh = "Q$" end return setsysvar(fh .. varName, val) end --- 获取系统string变量 值默认为"" 默认类型为2 varType=1 服务器重启清除 =2存入数据库 =3每天0点清除 function API.GetDBStr(varName, varType) local fh = "R$" if varType == 1 then fh = "G$" elseif varType == 3 then fh = "Q$" end return getsysvar(fh .. "" .. varName) or "" end --- 设置系统string变量 值默认为"" 默认类型为2 varType=1 服务器重启清除 =2存入数据库 =3每天0点清除 function API.SetDBStr(varName, val, varType) if type(val) ~= "string" then return end local fh = "R$" if varType == 1 then fh = "G$" elseif varType == 3 then fh = "Q$" end return setsysvar(fh .. varName, val) end --- 获取系统string变量 值默认为nil 默认类型为2 varType=1 服务器重启清除 =2存入数据库 =3每天0点清除 function API.GetDBTable(varName, varType) local fh = "R$" if varType == 1 then fh = "G$" elseif varType == 3 then fh = "Q$" end return getsysvar(fh .. "" .. varName) or nil end --- 设置系统table变量 值默认为nil 默认类型为2 varType=1 服务器重启清除 =2存入数据库 =3每天0点清除 function API.SetDBTable(varName, val, varType) if type(val) ~= "table" then return end local fh = "R$" if varType == 1 then fh = "G$" elseif varType == 3 then fh = "Q$" end return setsysvar(fh .. varName, val) end function API.SendCenterMsg(actor, msg, color, log) if not color then tipinfo(actor, msg) else tipinfo(actor, "" .. msg .. "") end if log then error(getbaseinfo(actor, "rolename"), msg) end end function API.InsertAndKeepLen(arr, value, len) table.insert(arr, value) -- 末尾插入 if #arr > len then table.remove(arr, 1) -- 删除最早插入的 end end ---战盟变量说明 ---U$ 无类型限制 存入数据库 ---消耗 奖励 检查