451 lines
13 KiB
Lua
451 lines
13 KiB
Lua
|
|
module("RankMgr", package.seeall)
|
|||
|
|
|
|||
|
|
--#include "RankDef.txt" once
|
|||
|
|
--脚本的排行榜统一用ID,因为通过ID可以去拿到默认值
|
|||
|
|
|
|||
|
|
-----------------------------------------------只有一个nPoint的排行榜----------------------------------------------------
|
|||
|
|
--初始化排行榜
|
|||
|
|
function Init(nRankId, numMax)
|
|||
|
|
if(type(nRankId) ~= 'number' or type(numMax) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if(ranking ~= nil)then
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
ranking = Ranking.add( nRankId,rankName, numMax, 1, 10 )
|
|||
|
|
if(ranking == nil)then
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
if not Ranking.load(ranking, nil) then
|
|||
|
|
Ranking.addColumn(ranking, "name")
|
|||
|
|
end
|
|||
|
|
Ranking.addRef( ranking )
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取排行榜数据
|
|||
|
|
function GetValue(actorId, nRankId)
|
|||
|
|
if(type(actorId) ~= 'number' or type(nRankId) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if ranking then
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
|||
|
|
if item then --已经榜上有名
|
|||
|
|
return Ranking.getPoint(item)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--设置排行榜数据
|
|||
|
|
function SetRank(actorId, nRankId, newValue )
|
|||
|
|
if(type(actorId) ~= 'number' or type(nRankId) ~= 'number' or type(newValue) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId ,addValue)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
|||
|
|
if item then --已经榜上有名
|
|||
|
|
Ranking.setItem(ranking, actorId, newValue)
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
local pActor = System.getEntityPtrByActorID(actorId)
|
|||
|
|
if(pActor == nil)then -- 如果没记录,玩家又没在线,不处理
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
item = Ranking.addItem(ranking, actorId, newValue)
|
|||
|
|
if item then
|
|||
|
|
Ranking.setSub(item, 0, Actor.getName(pActor))
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--增加排行榜数据
|
|||
|
|
function AddValue(actorId, nRankId, addValue)
|
|||
|
|
if(type(actorId) ~= 'number' or type(nRankId) ~= 'number' or type(addValue) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId ,addValue)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
|||
|
|
if item then --已经榜上有名
|
|||
|
|
Ranking.updateItem(ranking, actorId, addValue)
|
|||
|
|
return true
|
|||
|
|
end --新加的
|
|||
|
|
local pActor = System.getEntityPtrByActorID(actorId)
|
|||
|
|
if(pActor == nil)then -- 如果没记录,玩家又没在线,不处理
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
item = Ranking.addItem(ranking, actorId, addValue)
|
|||
|
|
if item then
|
|||
|
|
Ranking.setSub(item, 0, Actor.getName(pActor))
|
|||
|
|
end
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
--增加排行榜数据
|
|||
|
|
function AddGuildRankValue(actorId, nRankId, addValue)
|
|||
|
|
if(type(actorId) ~= 'number' or type(nRankId) ~= 'number' or type(addValue) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId ,addValue)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
|||
|
|
if item then --已经榜上有名
|
|||
|
|
Ranking.updateItem(ranking, actorId, addValue)
|
|||
|
|
return true
|
|||
|
|
end --新加的
|
|||
|
|
local name = System.getGuildName(actorId)
|
|||
|
|
if(name == nil)then -- 如果没记录,玩家又没在线,不处理
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
item = Ranking.addItem(ranking, actorId, addValue)
|
|||
|
|
if item then
|
|||
|
|
Ranking.setSub(item, 0, name)
|
|||
|
|
end
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--发送排行榜前num名
|
|||
|
|
function SendToClient(pActor, nRankId, num, rankLimit, systemId, msgId)
|
|||
|
|
if(type(nRankId) ~= 'number' or type(num) ~= 'number' or type(systemId) ~= 'number' or type(msgId) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local itemNum = Ranking.getRankItemCount(ranking)
|
|||
|
|
if num < Ranking.getRankItemCount(ranking) then
|
|||
|
|
itemNum = num
|
|||
|
|
end
|
|||
|
|
local pack = DataPack.allocPacket(pActor, systemId, msgId)
|
|||
|
|
if (pack == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
DataPack.writeByte(pack, itemNum)
|
|||
|
|
for idx=1,itemNum do
|
|||
|
|
local rankItem = Ranking.getItemFromIndex(ranking, idx-1)
|
|||
|
|
if rankItem then
|
|||
|
|
local playerId = Ranking.getId(rankItem)
|
|||
|
|
local value = Ranking.getPoint(rankItem)
|
|||
|
|
local name = Ranking.getSub(rankItem, 0)
|
|||
|
|
DataPack.writeUInt(pack, playerId)
|
|||
|
|
DataPack.writeUInt(pack, value)
|
|||
|
|
DataPack.writeString(pack, name)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
--我的数据
|
|||
|
|
local myId = Actor.getActorId(pActor)
|
|||
|
|
local myStar = 0
|
|||
|
|
local myIdx = 0
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, myId)
|
|||
|
|
if item then
|
|||
|
|
myStar = Ranking.getPoint(item) or 0
|
|||
|
|
if myStar < rankLimit then --未上榜
|
|||
|
|
myIdx = 0
|
|||
|
|
else
|
|||
|
|
myIdx = Ranking.getIndexFromPtr(item) + 1
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
DataPack.writeUInt(pack, myStar)
|
|||
|
|
DataPack.writeWord(pack, myIdx)
|
|||
|
|
DataPack.flush(pack)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--将排行榜前num名放入数据包(不包括自己的排名)
|
|||
|
|
function PushToPack(nRankId, num, pack)
|
|||
|
|
if(type(nRankId) ~= 'number' or type(num) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local itemNum = Ranking.getRankItemCount(ranking)
|
|||
|
|
if num < itemNum then
|
|||
|
|
itemNum = num
|
|||
|
|
end
|
|||
|
|
if (pack == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
DataPack.writeByte(pack, itemNum)
|
|||
|
|
for idx=1,itemNum do
|
|||
|
|
local rankItem = Ranking.getItemFromIndex(ranking, idx-1)
|
|||
|
|
if rankItem then
|
|||
|
|
local playerId = Ranking.getId(rankItem)
|
|||
|
|
local value = Ranking.getPoint(rankItem)
|
|||
|
|
local name = Ranking.getSub(rankItem, 0)
|
|||
|
|
DataPack.writeUInt(pack, playerId)
|
|||
|
|
DataPack.writeUInt(pack, value)
|
|||
|
|
DataPack.writeString(pack, name)
|
|||
|
|
local pActor = Actor.getActorById(playerId);
|
|||
|
|
local handle = Actor.getHandle(pActor);
|
|||
|
|
DataPack.writeUint64(pack, handle)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取我的排名
|
|||
|
|
function GetMyRank(pActor, nRankId)
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
local myId = Actor.getActorId(pActor)
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, myId)
|
|||
|
|
if item then
|
|||
|
|
return Ranking.getIndexFromPtr(item) + 1
|
|||
|
|
else
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取我的排名
|
|||
|
|
function GetMyGuildRank(id, nRankId)
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, id)
|
|||
|
|
if item then
|
|||
|
|
return Ranking.getIndexFromPtr(item) + 1
|
|||
|
|
else
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-----------------------------------------------多个value的排行榜----------------------------------------------------
|
|||
|
|
|
|||
|
|
--排行榜初始化函数
|
|||
|
|
--RankName:排行榜的名称
|
|||
|
|
--sRankFile:排行榜保存文件
|
|||
|
|
--tbColumn:排行榜列 表 tbColumn = {"column0","column1","column2",}, {标题, 是否客户端显示}...}
|
|||
|
|
--nMax:发给客户端最多的行数
|
|||
|
|
function InitEx(nRankId, tbColumn, nMax)
|
|||
|
|
if(type(nRankId) ~= 'number' or type(nMax) ~= 'number')then
|
|||
|
|
return print(nRankId, nMax)
|
|||
|
|
end
|
|||
|
|
rankName = RankList[nRankId].strName
|
|||
|
|
local sRankFile = rankName --默认排行榜的名字就是文件的名字
|
|||
|
|
local ranking = Ranking.getRanking(nRankId) --通过排行名称获取排行对象
|
|||
|
|
if ranking ~= nil then --有排行对象则创建失败
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
ranking = Ranking.add(nRankId,rankName,nMax, 1, 10 ) --创建排行榜
|
|||
|
|
if ranking == nil then
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
local isLoad = Ranking.load(ranking,sRankFile) --读取文件内容
|
|||
|
|
if isLoad == false then --加载排行榜失败,进行标题初始化
|
|||
|
|
for i=1, table.getn(tbColumn) do
|
|||
|
|
Ranking.addColumn(ranking,tbColumn[i]) --添加列名字
|
|||
|
|
end
|
|||
|
|
else
|
|||
|
|
local colCount = Ranking.GetRankColumnCount(ranking)--如果排行榜的文件已经存在
|
|||
|
|
local srcSize= #tbColumn
|
|||
|
|
if colCount < srcSize then
|
|||
|
|
for i = colCount + 1, srcSize do
|
|||
|
|
Ranking.addColumn(ranking, tbColumn[i]) --添加列名字
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
Ranking.addRef(ranking) --增加对此排行对象的引用计数
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--设置排行榜的数据
|
|||
|
|
--colIdx:从1开始,0是name
|
|||
|
|
--在涉及到领取道具的时候,为了避免出现异常,必须判断一下返回值
|
|||
|
|
function SetRankEx(actorId, nRankId, colIdx, newColValue)
|
|||
|
|
if(type(actorId) ~= 'number' or type(nRankId) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, actorId )
|
|||
|
|
if item then --已经榜上有名
|
|||
|
|
Ranking.setSub(item, colIdx, newColValue) --这里不一定能设置成功
|
|||
|
|
if Ranking.getSub(item, colIdx) ~= tostring(newColValue) then --列没有设置成功
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
return true
|
|||
|
|
end --新加的
|
|||
|
|
local pActor = System.getEntityPtrByActorID(actorId)
|
|||
|
|
if(pActor == nil)then -- 如果没记录,玩家又没在线,不处理
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
item = Ranking.addItem(ranking, actorId, newColValue)
|
|||
|
|
if (item == nil) then
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
Ranking.setSub(item, 0, Actor.getName(pActor))
|
|||
|
|
Ranking.setSub(item, colIdx, newColValue)
|
|||
|
|
if Ranking.getSub(item, colIdx) ~= tostring(newColValue) then --列没有设置成功
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--增加排行榜数据
|
|||
|
|
function AddValueEx(actorId, nRankId, colIdx, addValue)
|
|||
|
|
if(type(actorId) ~= 'number' or type(nRankId) ~= 'number' or type(addValue) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId ,addValue)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
|||
|
|
if item then --已经榜上有名
|
|||
|
|
local newColValue = tonumber(Ranking.getSub(item, colIdx)) or 0
|
|||
|
|
newColValue = newColValue + addValue
|
|||
|
|
Ranking.setSub(item, colIdx, newColValue)
|
|||
|
|
return true
|
|||
|
|
end --新加的
|
|||
|
|
local pActor = System.getEntityPtrByActorID(actorId)
|
|||
|
|
if(pActor == nil)then -- 如果没记录,玩家又没在线,不处理
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
item = Ranking.addItem(ranking, actorId, addValue)
|
|||
|
|
if item then
|
|||
|
|
Ranking.setSub(item, 0, Actor.getName(pActor))
|
|||
|
|
end
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local function _getValueByItem(item, colIdx, nRankId)
|
|||
|
|
if (item == nil) then
|
|||
|
|
return nil
|
|||
|
|
end
|
|||
|
|
if(type(colIdx) ~= 'number' or type(nRankId) ~= 'number')then
|
|||
|
|
return print(colIdx, nRankId)
|
|||
|
|
end
|
|||
|
|
local colValue = Ranking.getSub(item, colIdx)
|
|||
|
|
local Default = RankList[nRankId].tabColumn[2][colIdx] --默认值
|
|||
|
|
if(Default == nil)then
|
|||
|
|
return nil
|
|||
|
|
end
|
|||
|
|
if colValue == "-" then --返回默认值
|
|||
|
|
return Default
|
|||
|
|
end
|
|||
|
|
if(type(Default) == 'string') then
|
|||
|
|
return colValue
|
|||
|
|
end
|
|||
|
|
return tonumber(colValue)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 获取第colIdx列的数据
|
|||
|
|
--如果排行榜不存在,必须返回nil,为无效数据,避免异常情况
|
|||
|
|
function GetValueById(actorId, nRankId, colIdx)
|
|||
|
|
if(type(actorId) ~= 'number' or type(nRankId) ~= 'number')then
|
|||
|
|
return print(actorId, nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return nil
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemPtrFromId( ranking, actorId )
|
|||
|
|
return _getValueByItem(item,colIdx,nRankId)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--按名次获取第colIdx列的数据(名次从0开始)
|
|||
|
|
function GetValueByIndx(rankIndx, nRankId, colIdx)
|
|||
|
|
if(type(rankIndx) ~= 'number' or type(nRankId) ~= 'number')then
|
|||
|
|
return print(rankIndx, nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if (ranking == nil) then
|
|||
|
|
return nil
|
|||
|
|
end
|
|||
|
|
local item = Ranking.getItemFromIndex( ranking, rankIndx )
|
|||
|
|
return _getValueByItem(item,rankIndx,nRankId)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-----------------------------------所有排行榜共用接口-----------------------------------
|
|||
|
|
function Clear(nRankId)
|
|||
|
|
if(type(nRankId) ~= 'number')then
|
|||
|
|
return print(nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if(ranking == nil)then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
Ranking.clearRanking(ranking)
|
|||
|
|
Ranking.save(ranking, rankName, true)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--排行榜销毁函数
|
|||
|
|
function Remove(nRankId)
|
|||
|
|
if(type(nRankId) ~= 'number')then
|
|||
|
|
return print(nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local sRankFile = rankName
|
|||
|
|
Ranking.save(ranking,sRankFile)
|
|||
|
|
Ranking.removeRanking(nRankId)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function Save(nRankId)
|
|||
|
|
if(type(nRankId) ~= 'number')then
|
|||
|
|
return print(nRankId)
|
|||
|
|
end
|
|||
|
|
local rankName = RankList[nRankId].strName
|
|||
|
|
local ranking = Ranking.getRanking( nRankId )
|
|||
|
|
if ranking then
|
|||
|
|
Ranking.save(ranking, rankName, true)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--所有排行榜统一初始化
|
|||
|
|
function AutoInit()
|
|||
|
|
--print(" Enter AutoInit")
|
|||
|
|
for RankId,RankInfo in pairs(RankList)do
|
|||
|
|
local tbColumn = RankInfo.tabColumn[1]
|
|||
|
|
local nMax = RankInfo.nMaxRecord
|
|||
|
|
if(0 <#tbColumn)then
|
|||
|
|
InitEx(RankId, tbColumn, nMax)
|
|||
|
|
else
|
|||
|
|
Init(RankId, nMax)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
|
|||
|
|
--[[
|
|||
|
|
-- 使用例子
|
|||
|
|
local actorId = Actor.getIntProperty( pActor, PROP_ENTITY_ID )
|
|||
|
|
local colIdx = 1
|
|||
|
|
local newColValue = 99
|
|||
|
|
RankMgr.SetRankEx(actorId, 2001, colIdx, newColValue)
|
|||
|
|
newColValue = RankMgr.GetValueById(actorId, 2001, colIdx)
|
|||
|
|
print(newColValue)
|
|||
|
|
--2001是排行榜的Id,定义在data\functions\Common\RankDef.txt
|
|||
|
|
]]
|
|||
|
|
|