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$ 无类型限制 存入数据库
---消耗 奖励 检查