Files
chuanqi-server-instance/LogicServer/data/functions/Common/RankMgr.lua
2024-12-16 20:45:03 +08:00

451 lines
13 KiB
Lua
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
]]