1474 lines
46 KiB
Lua
Executable File
1474 lines
46 KiB
Lua
Executable File
module("CommonFunc", package.seeall)
|
||
----一些公共方法
|
||
|
||
--activetime是{{h1,m1},{h2,m2}}形式(不能跨天)
|
||
function CheckTimeValid(time)
|
||
local nHour,nMin,nSec = System.getTime(0,0,0,0) --当前时间
|
||
local timeBegin = time[1]
|
||
local timeEnd = time[2]
|
||
--print("CheckTimeValid, nHour="..nHour..", nMin="..nMin)
|
||
--print("CheckTimeValid, h1="..timeBegin[1]..", m1="..timeBegin[2]..", h2="..timeEnd[1]..", m2="..timeEnd[2])
|
||
if nHour < timeBegin[1] or nHour > timeEnd[1] then --小开始小时、大于结束小时
|
||
return false
|
||
elseif timeBegin[1] == timeEnd[1] then --起止小时是同一个小时
|
||
if nMin < timeBegin[2] or nMin > timeEnd[2] then --不在分钟范围之内
|
||
return false
|
||
else
|
||
return true
|
||
end
|
||
elseif timeBegin[1] < timeEnd[1] then --开始小时小于结束小时
|
||
if nHour == timeBegin[1] and nMin < timeBegin[2] then
|
||
return false
|
||
elseif nHour == timeEnd[1] and nMin > timeEnd[2] then
|
||
return false
|
||
else
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function CheckTimesValid( times )
|
||
for i,time in ipairs(times) do
|
||
if CheckTimeValid(time) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
--[[某场景内刷怪,不足补足,多了不刷
|
||
{
|
||
monsterId=15, sceneId=1, num=1, range={100,120,200,420}, livetime=86400,
|
||
},
|
||
]]
|
||
function freshSceneMonsterInRange(freshMonCfg)
|
||
--print("freshSceneMonsterInRange, sceneId="..freshMonCfg.sceneId..", monsterId="..freshMonCfg.monsterId)
|
||
local hScene = Fuben.getSceneHandleById(freshMonCfg.sceneId, 0)
|
||
if hScene then
|
||
local num = freshMonCfg.num - Fuben.getMyMonsterCount(hScene, freshMonCfg.monsterId)
|
||
if num > 0 then
|
||
return Fuben.createMonstersInRange(hScene, freshMonCfg.monsterId,
|
||
freshMonCfg.range[1], freshMonCfg.range[2], freshMonCfg.range[3], freshMonCfg.range[4],
|
||
num, freshMonCfg.livetime)
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--[[某场景内刷怪,必定刷出
|
||
]]
|
||
function freshSceneMonsterInRangeForce(freshMonCfg)
|
||
--print("freshSceneMonsterInRangeForce, sceneId="..freshMonCfg.sceneId..", monsterId="..freshMonCfg.monsterId)
|
||
local hScene = Fuben.getSceneHandleById(freshMonCfg.sceneId, 0)
|
||
if hScene then
|
||
local num = freshMonCfg.num
|
||
if num > 0 then
|
||
return Fuben.createMonstersInRange(hScene, freshMonCfg.monsterId,
|
||
freshMonCfg.range[1], freshMonCfg.range[2], freshMonCfg.range[3], freshMonCfg.range[4],
|
||
num, freshMonCfg.livetime)
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--[[某场景内刷怪,不足补足,多了不刷
|
||
{
|
||
monsterId=15, sceneId=1, num=1, pos={122,171}, livetime=86400,
|
||
},
|
||
]]
|
||
function freshSceneMonsterInPos(freshMonCfg)
|
||
--print("freshSceneMonsterInPos, sceneId="..freshMonCfg.sceneId)
|
||
local hScene = Fuben.getSceneHandleById(freshMonCfg.sceneId, 0)
|
||
if hScene then
|
||
local num = freshMonCfg.num - Fuben.getMyMonsterCount(hScene, freshMonCfg.monsterId)
|
||
if num > 0 then
|
||
return Fuben.createMonstersInRange(hScene, freshMonCfg.monsterId,
|
||
freshMonCfg.pos[1], freshMonCfg.pos[2], freshMonCfg.pos[1], freshMonCfg.pos[2],
|
||
num, freshMonCfg.livetime)
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--[[某场景内刷怪,必定刷出
|
||
]]
|
||
function freshSceneMonsterInPosForce(freshMonCfg)
|
||
--print("freshSceneMonsterInPosForce, sceneId="..freshMonCfg.sceneId)
|
||
local hScene = Fuben.getSceneHandleById(freshMonCfg.sceneId, 0)
|
||
if hScene then
|
||
local num = freshMonCfg.num
|
||
if num > 0 then
|
||
return Fuben.createMonstersInRange(hScene, freshMonCfg.monsterId,
|
||
freshMonCfg.pos[1], freshMonCfg.pos[2], freshMonCfg.pos[1], freshMonCfg.pos[2],
|
||
num, freshMonCfg.livetime)
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--获取某个场景中的怪物数量
|
||
function GetSceneMonsterNum( sceneId, fbHandle, monsterId )
|
||
local hScene = Fuben.getSceneHandleById(sceneId, fbHandle)
|
||
if hScene then
|
||
return Fuben.getMyMonsterCount(hScene, monsterId)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--[[ 清除怪物
|
||
freshMonConfig =
|
||
{
|
||
monsterId=15, sceneId=1, num=1, pos={122,171}, livetime=86400,
|
||
},
|
||
]]--
|
||
function clearScenceMonster(freshMonConfig)
|
||
local hScene = Fuben.getSceneHandleById(freshMonConfig.sceneId, 0)
|
||
if hScene then
|
||
Fuben.clearMonster(hScene, freshMonConfig.monsterId)
|
||
end
|
||
end
|
||
|
||
--[[某副本内刷怪
|
||
不支持怪物等级成长
|
||
{ monsterId=15, sceneId=1, num=1, pos={122,171,122,171}, livetime=86400 },
|
||
]]
|
||
function freshFuBenMonsterInRange( hFuben, freshMonCfg )
|
||
local hScene = Fuben.getSceneHandleById(freshMonCfg.sceneId, hFuben)
|
||
return Fuben.createMonstersInRange(hScene, freshMonCfg.monsterId,
|
||
freshMonCfg.pos[1], freshMonCfg.pos[2], freshMonCfg.pos[3], freshMonCfg.pos[4],
|
||
freshMonCfg.num, freshMonCfg.livetime)
|
||
end
|
||
|
||
--[[某副本内刷怪
|
||
支持怪物等级成长,
|
||
注意,用过此方法创建出来的怪等级是nOriginalLevel+nBornLevel (配置等级+传入等级)
|
||
{ monsterId=15, sceneId=1, num=1, pos={122,171,122,171}, livetime=86400 },
|
||
]]
|
||
function freshFuBenMonsterInRangeEx( hFuben, freshMonCfg )
|
||
local hScene = Fuben.getSceneHandleById(freshMonCfg.sceneId, hFuben)
|
||
return Fuben.createMonstersInRange(hScene, freshMonCfg.monsterId,
|
||
freshMonCfg.pos[1], freshMonCfg.pos[2], freshMonCfg.pos[3], freshMonCfg.pos[4],
|
||
freshMonCfg.num, freshMonCfg.livetime, freshMonCfg.level or 0)
|
||
end
|
||
|
||
|
||
--给奖励
|
||
function GiveCommonAward(sysarg, awards, logId, LogDesc)
|
||
for _, v in ipairs(awards) do
|
||
if v.qualityDataIndex then
|
||
Actor.giveAward(sysarg, v.type, v.id, v.count, v.quality or 0, v.strong or 0, v.bind or 0, 0, logId, LogDesc,
|
||
v.qualityDataIndex)
|
||
else
|
||
Actor.giveAward(sysarg, v.type, v.id, v.count, v.quality or 0, v.strong or 0, v.bind or 0, 0, logId, LogDesc)
|
||
end
|
||
end
|
||
end
|
||
--支持sex和job的过滤(sex、job必须要有)
|
||
--由于历史遗留问题和客户端处理,现规定,sex=-1,对性别没有要求,job=0, 对职业没有要求
|
||
function FilterCommonAward( sysarg, award )
|
||
if award.sex ~= nil and award.sex ~= -1 and award.sex ~= Actor.getIntProperty(sysarg,PROP_ACTOR_SEX) then --有性别要求
|
||
return nil
|
||
end
|
||
if award.job ~= nil and award.job ~= 0 and award.job ~= Actor.getIntProperty(sysarg, PROP_ACTOR_VOCATION) then --有职业要求
|
||
return nil
|
||
end
|
||
local myLevel = Actor.getIntProperty(sysarg, PROP_CREATURE_LEVEL)
|
||
if(award.level ~= nil and myLevel < award.level)then
|
||
return nil
|
||
end
|
||
return award
|
||
end
|
||
|
||
--支持sex和job的过滤
|
||
function FilterCommonAwards( sysarg, Awards )
|
||
local fAwards = {}
|
||
for _, award in ipairs( Awards ) do
|
||
local fAward = FilterCommonAward(sysarg, award)
|
||
if fAward then
|
||
table.insert(fAwards, fAward)
|
||
end
|
||
end
|
||
return fAwards
|
||
end
|
||
|
||
--给奖励(支持sex和job的过滤)
|
||
--由于历史遗留问题和客户端处理,现规定,sex=-1,对性别没有要求,job=0, 对职业没有要求
|
||
function GiveCommonAwardEx(sysarg, Awards, logId, LogDesc)
|
||
local fAwards = FilterCommonAwards( sysarg, Awards ) --过滤
|
||
for _, v in ipairs(fAwards) do
|
||
Actor.giveAward(sysarg, v.type, v.id, v.count, v.quality or 0, v.strong or 0, v.bind or 0, 0, logId, LogDesc, v.qualityDataIndex or -1)
|
||
end
|
||
end
|
||
|
||
--检查背包格子是否足够,返回需要空闲的格子数量(支持sex和job的过滤)
|
||
--由于历史遗留问题和客户端处理,现规定,sex=-1,对性别没有要求,job=0, 对职业没有要求
|
||
function CheckBagGridForAwardsEx(sysarg, Awards)
|
||
local fAwards = FilterCommonAwards( sysarg, Awards ) --过滤
|
||
local needGirds = 0
|
||
for _, v in ipairs( fAwards ) do
|
||
if v.type == 0 then
|
||
needGirds = needGirds + Item.getAddItemNeedGridCount( sysarg, v.id, v.count, v.quality or 0, v.strong or 0, v.bind or -1)
|
||
end
|
||
end
|
||
local hasEmptyIdxs = Item.getAllBagMinEmptyGridCount( sysarg)
|
||
--local hasEmptyIdxs = Item.getBagEmptyGridCount( sysarg,packageType)
|
||
if hasEmptyIdxs >= needGirds then
|
||
return 0
|
||
else
|
||
return needGirds
|
||
end
|
||
end
|
||
|
||
--检查背包格子是否足够
|
||
function IsBagGridEnough(sysarg, awards)
|
||
local needGirds = 0
|
||
for _, v in ipairs( awards ) do
|
||
if v.type == 0 then
|
||
needGirds = needGirds + Item.getAddItemNeedGridCount( sysarg, v.id, v.count, v.quality or 0, v.strong or 0, v.bind or -1)
|
||
end
|
||
end
|
||
local hasEmptyIdxs = Item.getAllBagMinEmptyGridCount( sysarg)
|
||
--local hasEmptyIdxs = Item.getBagEmptyGridCount( sysarg )
|
||
if hasEmptyIdxs >= needGirds then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
--获取背包格子是否足够
|
||
function GetBagGridNeed(sysarg, awards)
|
||
local needGirds = 0
|
||
for _, v in ipairs( awards ) do
|
||
if v.type == 0 then
|
||
needGirds = needGirds + Item.getAddItemNeedGridCount( sysarg, v.id, v.count, v.quality or 0, v.strong or 0, v.bind or -1)
|
||
end
|
||
end
|
||
return needGirds
|
||
end
|
||
|
||
function GetElemByRange( elems, value )
|
||
for i,elem in ipairs(elems) do
|
||
if elem.range[1] <= value and value <= elem.range[2] then
|
||
return elem
|
||
end
|
||
end
|
||
return nil
|
||
end
|
||
--判断能否采集,可以采集返回true
|
||
function OnGatherMonster( sysarg, pGathMonster )
|
||
local monId = Actor.getIntProperty(pGathMonster, PROP_ENTITY_ID) --怪物ID
|
||
|
||
if IsSupplyBattleSack( monId ) then
|
||
return CheckGatherSupplyBattleSack(sysarg, monId)
|
||
end
|
||
return true
|
||
end
|
||
|
||
|
||
--随机传送到某个场景的某个区域,避免人数集中在一起
|
||
function SendToSceneInRange(sysarg, sceneId, range)
|
||
local x1 = range[1]
|
||
local y1 = range[2]
|
||
local x2 = range[3]
|
||
local y2 = range[4]
|
||
x = math.random(x1,x2)
|
||
y = math.random(y1,y2)
|
||
return Actor.enterScene(sysarg, sceneId, x, y)
|
||
end
|
||
|
||
--在一个范围之内,随机一个pos
|
||
function RandPosInRange(range)
|
||
local x1 = range[1]
|
||
local y1 = range[2]
|
||
local x2 = range[3]
|
||
local y2 = range[4]
|
||
x = math.random(x1,x2)
|
||
y = math.random(y1,y2)
|
||
return x, y
|
||
end
|
||
|
||
--支持大于21亿的exp
|
||
function AddExpToActor(sysarg, exp, logId )
|
||
--print("AddExpToActor, exp="..exp)
|
||
local expLimit = 50000000000
|
||
if exp <= expLimit then
|
||
Actor.addExp(sysarg, exp, logId, 0)
|
||
else
|
||
local expRate = math.floor(exp/expLimit) --向下取整
|
||
local expMore = math.mod(exp,expLimit)
|
||
|
||
for i=1, expRate do
|
||
Actor.addExp(sysarg, expLimit, logId, 0)
|
||
end
|
||
if expMore > 0 then
|
||
Actor.addExp(sysarg, expMore, logId, 0)
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
function GetEntityPos( entityPtr )
|
||
local posX = Actor.getIntProperty(entityPtr, PROP_ENTITY_POSX)
|
||
local posY = Actor.getIntProperty(entityPtr, PROP_ENTITY_POSY)
|
||
return posX, posY
|
||
end
|
||
|
||
|
||
--[[初始化排行榜
|
||
id, value, name
|
||
]]
|
||
function InitCommonRank(rankName, numMax)
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if not ranking then
|
||
ranking = Ranking.add( rankName, numMax, 1, 10 )
|
||
if ranking then
|
||
if not Ranking.load(ranking, nil) then
|
||
Ranking.addColumn(ranking, "name")
|
||
end
|
||
Ranking.addRef( ranking )
|
||
end
|
||
end
|
||
end
|
||
|
||
function GetCommonRankValueById(actorId, rankName)
|
||
--print("GetCommonRankValueById, rankName="..rankName..", actorId="..actorId)
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if ranking then
|
||
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
||
if item then
|
||
return Ranking.getPoint(item)
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--设置排行榜数据
|
||
function SetCommonRankValueById(actorId, rankName, newValue )
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if ranking then
|
||
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
||
if item then --已经榜上有名
|
||
Ranking.setItem(ranking, actorId, newValue)
|
||
else --新加的
|
||
item = Ranking.addItem(ranking, actorId, newValue)
|
||
end
|
||
end
|
||
end
|
||
|
||
--如果排行榜不存在,必须返回nil,为无效数据,避免异常情况
|
||
function GetCommonRankColumnValueById(actorId, rankName, colIdx)
|
||
--print("GetCommonRankColumnValue, colIdx="..colIdx)
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if ranking then
|
||
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
||
if item then --已经榜上有名
|
||
local colValue = Ranking.getSub(item, colIdx)
|
||
if colValue == "-" then
|
||
return 0
|
||
else
|
||
local numValue = tonumber(colValue)
|
||
--print("GetCommonRankColumnValue, numValue="..numValue)
|
||
if numValue then
|
||
return numValue --返回字符串
|
||
else
|
||
return colValue --返回字符串
|
||
end
|
||
end
|
||
else
|
||
return 0
|
||
end
|
||
end
|
||
return nil
|
||
end
|
||
|
||
--设置排行榜的扩展数据
|
||
--colIdx:从1开始,0是name
|
||
--返回值:true-设置成功,false-设置失败
|
||
--在涉及到领取道具的时候,为了避免出现异常,必须判断一下返回值
|
||
function SetCommonRankColumnValueById(actorId, rankName, value, colIdx, newColValue)
|
||
--print("SetCommonRankColumnValueById actorId="..actorId..", rankName="..rankName..
|
||
-- ", colIdx="..colIdx..", newColValue="..newColValue)
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if ranking then
|
||
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
|
||
else --新加的
|
||
item = Ranking.addItem(ranking, actorId, value)
|
||
if item then
|
||
Ranking.setSub(item, colIdx, newColValue)
|
||
if Ranking.getSub(item, colIdx) ~= tostring(newColValue) then --列没有设置成功
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function AddCommonRankValueById(actorId, rankName, addValue)
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if ranking then
|
||
local item = Ranking.getItemPtrFromId( ranking, actorId)
|
||
if item then --已经榜上有名
|
||
Ranking.updateItem(ranking, actorId, addValue)
|
||
else --新加的
|
||
item = Ranking.addItem(ranking, actorId, addValue)
|
||
end
|
||
|
||
if item then
|
||
local newValue = Ranking.getPoint(item)
|
||
--print("AddCommonRankValueById, newValue="..newValue)
|
||
end
|
||
end
|
||
end
|
||
|
||
function HasCommonRankValueById( key, rankName )
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if ranking then
|
||
local item = Ranking.getItemPtrFromId( ranking, key)
|
||
if item then --已经榜上有名
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
|
||
function ClearCommonRank(rankName)
|
||
--print("ClearCommonRank, rankName="..rankName)
|
||
local ranking = Ranking.getRanking( rankName )
|
||
if ranking then
|
||
Ranking.clearRanking(ranking)
|
||
Ranking.save(ranking, rankName, true)
|
||
end
|
||
end
|
||
|
||
--[[
|
||
levelNeedFee =
|
||
{
|
||
--{cond=等级段,resetItem=重置需要的道具, resetFee=重置需要的费用, finishFee=立即完成的费用
|
||
{ cond={50,59}, resetItem = {510, 1}, resetFee={3, 100}, finishFee={3,50}, },
|
||
{ cond={60,69}, resetItem = {510, 2}, resetFee={3, 200}, finishFee={3,150}, },
|
||
{ cond={70,79}, resetItem = {510, 3}, resetFee={3, 300}, finishFee={3,250}, },
|
||
{ cond={80,89}, resetItem = {510, 4}, resetFee={3, 400}, finishFee={3,350}, },
|
||
{ cond={90,99}, resetItem = {510, 5}, resetFee={3, 500}, finishFee={3,550}, },
|
||
},
|
||
]]
|
||
function GetElemByCond( elems, condValue )
|
||
for i, elem in ipairs(elems) do
|
||
if elem.cond[1] <= condValue and condValue <= elem.cond[2] then
|
||
return elem
|
||
end
|
||
end
|
||
return nil
|
||
end
|
||
|
||
--根据两个条件匹配
|
||
function GetElemMatch2Cond( elems, condValue1, condValue2 )
|
||
--print("GetElemMatch2Cond, condValue1="..condValue1..", condValue2="..condValue2)
|
||
if condValue2 then
|
||
for i, elem in ipairs(elems) do
|
||
if elem.cond[1] == condValue1 and elem.cond[2] == condValue2 then
|
||
--print("GetElemMatch2Cond, xxx1")
|
||
return elem
|
||
end
|
||
end
|
||
else
|
||
for i, elem in ipairs(elems) do
|
||
if elem.cond[1] == condValue1 then
|
||
return elem
|
||
end
|
||
end
|
||
end
|
||
return nil
|
||
end
|
||
|
||
--[[
|
||
通知玩家获得某个活动的实际奖励
|
||
注意:某些奖励可能是动态计算的
|
||
activeId:见enum tagCommonActiveIDDef定义
|
||
result:0-失败,1-胜利
|
||
]]
|
||
function NoticeActiveAward( sysarg, activeId, result, awards )
|
||
--print("NoticeActiveAward, activeId="..activeId..", result="..result)
|
||
local netPack = DataPack.allocPacket(sysarg, 139, enScriptMiscSystemcNoticeActivityAward)
|
||
if netPack then
|
||
DataPack.writeChar(netPack, activeId)
|
||
DataPack.writeChar(netPack, result)
|
||
DataPack.writeChar(netPack, #awards)
|
||
for i,award in ipairs(awards) do
|
||
DataPack.writeChar(netPack, award.type)
|
||
DataPack.writeInt(netPack, award.id)
|
||
DataPack.writeUInt(netPack, award.count)
|
||
--print("NoticeActiveAward, type="..award.type..", id="..award.id..", count="..award.count)
|
||
end
|
||
DataPack.flush(netPack)
|
||
end
|
||
end
|
||
|
||
function BroadMsgInScence( sceneId, msg, flag)
|
||
local playerList = LuaHelp.getSceneActorListById( sceneId ) or {}
|
||
for i,player in ipairs(playerList) do
|
||
Actor.sendTipmsg(player, msg, flag)
|
||
end
|
||
end
|
||
|
||
|
||
function IsElemInList( elemList, value )
|
||
for i, elem in ipairs( elemList or {} ) do
|
||
if value == elem then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
--table to string
|
||
BaseFuc_serialize = function( obj )
|
||
local lua = ""
|
||
local t = type( obj )
|
||
if t == "number" then
|
||
lua = lua .. obj
|
||
elseif t == "boolean" then
|
||
lua = lua .. tostring( obj )
|
||
elseif t == "string" then
|
||
lua = lua .. string.format( "%q", obj )
|
||
elseif t == "table" then
|
||
lua = lua .. "{"
|
||
for k, v in pairs( obj ) do
|
||
lua = lua .. "[" .. BaseFuc_serialize( k ) .. "]=" .. BaseFuc_serialize( v ) .. ","
|
||
end
|
||
local metatable = getmetatable( obj )
|
||
if metatable ~= nil and type( metatable.__index ) == "table" then
|
||
for k, v in pairs( metatable.__index ) do
|
||
lua = lua .. "[" .. BaseFuc_serialize( k ) .. "]=" .. BaseFuc_serialize( v ) .. ","
|
||
end
|
||
end
|
||
lua = lua .. "}"
|
||
elseif t == "nil" then
|
||
return nil
|
||
else
|
||
error( "can not BaseFuc_serialize a " .. t .. " type." )
|
||
end
|
||
return lua
|
||
end
|
||
|
||
--string to table
|
||
BaseFuc_unserialize = function( lua )
|
||
local t = type( lua )
|
||
if t == "nil" or lua == "" then
|
||
return nil
|
||
elseif t == "number" or t == "string" or t == "boolean" then
|
||
lua = tostring( lua )
|
||
else
|
||
error( "can not unserialize a " .. t .. " type." )
|
||
end
|
||
lua = "return " .. lua
|
||
local func = loadstring( lua )
|
||
if func == nil then
|
||
return nil
|
||
end
|
||
return func()
|
||
end
|
||
|
||
--[[
|
||
获取table中元素的数量,key可能是离散分布的
|
||
]]
|
||
function GetElemsNum( elems )
|
||
local num = 0
|
||
for k,v in pairs( elems or {} ) do
|
||
num = num +1
|
||
end
|
||
return num
|
||
end
|
||
|
||
--[[
|
||
--]]
|
||
function GetAwardsByRate( awards, rate )
|
||
local newAwards = {}
|
||
for i, award in ipairs(awards) do
|
||
local newAward={}
|
||
newAward.type = award.type
|
||
newAward.id = award.id
|
||
newAward.count = award.count*rate
|
||
newAward.quality = award.quality
|
||
newAward.strong = award.strong
|
||
newAward.bind = award.bind
|
||
newAward.qualityDataIndex = award.qualityDataIndex
|
||
table.insert(newAwards, newAward)
|
||
end
|
||
return newAwards
|
||
end
|
||
|
||
--[[检查是否满足消费条件
|
||
someConsumes: {consumes1, consumes2, consumes3,...} 多个consumes的集合
|
||
rate:倍数
|
||
]]
|
||
function CheckSomeConsumeCond( sysarg, someConsumes, rate )
|
||
--[[
|
||
local itemConsumes = {} --道具的消费(type为 qatEquipment,道具不可合并)
|
||
local notItemConsumes = {} --非道具消费(type为 非qatEquipment,非道具可以合并)
|
||
|
||
for nType = qatEquipment, qatAwardTypeCount do
|
||
for i1, consumes in ipairs( someConsumes ) do
|
||
for i2, consume in ipairs( consumes ) do
|
||
if consume.type == nType then
|
||
if consume.type == qatEquipment then
|
||
table.insert( itemConsumes, consume )
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
]]
|
||
local consumeRate = rate or 1
|
||
for k, consumes in pairs( someConsumes ) do
|
||
if not CheckConsumeCond( sysarg, consumes, rate ) then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
--[[检查是否满足消费条件
|
||
rate:倍数
|
||
]]
|
||
function CheckConsumeCond( sysarg, consumes, rate )
|
||
local consumeRate = rate or 1
|
||
for k,v in pairs( consumes ) do
|
||
local bCheck = Actor.checkConsume(sysarg, v.type, v.id, v.count*consumeRate, v.quality or 0, v.strong or 0,
|
||
v.bind or -1)
|
||
if bCheck ~= true then
|
||
Actor.sendAwardNotEnough(sysarg, v.type, v.id, v.count)
|
||
return false
|
||
end
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
--[[扣除消费,必须先判断CheckConsumeCond
|
||
rate:倍数
|
||
]]
|
||
function DoConsumeCond( sysarg, consumes, rate, logId, logStr )
|
||
local consumeRate = rate or 1
|
||
for k,v in pairs( consumes ) do
|
||
local removeCount = Actor.removeConsume(sysarg, v.type, v.id, v.count*consumeRate, v.quality or 0, v.strong or 0,
|
||
v.bind or -1, 0, logId,logStr)
|
||
if removeCount < v.count then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
--[[检查是否满足消费条件
|
||
rate :倍数
|
||
replace:是否被替代
|
||
格式:
|
||
consumes =
|
||
{
|
||
{ type = 0, id = 1373, count = 3 }, --需要的道具
|
||
{ type = 10, id = 0, count = 30 }, --替换的道具
|
||
},
|
||
]]
|
||
function CheckConsumeCondReplace( sysarg, consumes, rate, replace )
|
||
local consumeRate = rate or 1
|
||
local consumeReplace = replace or false
|
||
consumeItem = consumes[1] --需要的物品
|
||
replaceItem = consumes[2] --替代的物品
|
||
local bCheck = Actor.checkConsume(sysarg, consumeItem.type, consumeItem.id, consumeItem.count*consumeRate,
|
||
consumeItem.quality or 0, consumeItem.strong or 0, consumeItem.bind or -1)
|
||
if bCheck then --需要的物品足够足够
|
||
return true
|
||
end
|
||
|
||
if replace then --可以替代
|
||
local bReplaceCheck = Actor.checkConsume(sysarg, replaceItem.type, replaceItem.id,
|
||
replaceItem.count*consumeRate, replaceItem.quality or 0, replaceItem.strong or 0, replaceItem.bind or -1)
|
||
if bReplaceCheck then --替代物品足够
|
||
return true
|
||
end
|
||
end
|
||
|
||
Actor.sendAwardNotEnough(sysarg, consumeItem.type, consumeItem.id, consumeItem.count)
|
||
return false
|
||
end
|
||
|
||
--[[检查并使用消费条件
|
||
rate :倍数
|
||
replace:是否被替代
|
||
格式:
|
||
consumes =
|
||
{
|
||
{ type = 0, id = 1373, count = 3 }, --需要的道具
|
||
{ type = 10, id = 0, count = 30 }, --替换的道具
|
||
},
|
||
]]
|
||
function CheckAndUseConsumeCondReplace( sysarg, consumes, rate, replace, logId, logStr )
|
||
local consumeRate = rate or 1
|
||
local consumeReplace = replace or false
|
||
consumeItem = consumes[1] --需要的物品
|
||
replaceItem = consumes[2] --替代的物品
|
||
|
||
local bCheck = Actor.checkConsume(sysarg, consumeItem.type, consumeItem.id, consumeItem.count*consumeRate,
|
||
consumeItem.quality or 0, consumeItem.strong or 0, consumeItem.bind or -1)
|
||
if bCheck then --需要的物品足够足够
|
||
local removeCount = Actor.removeConsume(sysarg, consumeItem.type, consumeItem.id, consumeItem.count*consumeRate,
|
||
consumeItem.quality or 0, consumeItem.strong or 0, consumeItem.bind or -1, 0, logId, logStr )
|
||
if removeCount >= consumeItem.count then --实际扣除足够
|
||
return true
|
||
end
|
||
end
|
||
|
||
if replace then --可以替代
|
||
local bReplaceCheck = Actor.checkConsume(sysarg, replaceItem.type, replaceItem.id,
|
||
replaceItem.count*consumeRate, replaceItem.quality or 0, replaceItem.strong or 0, replaceItem.bind or -1)
|
||
if bReplaceCheck then --替代物品足够
|
||
local removeCount = Actor.removeConsume(sysarg, replaceItem.type, replaceItem.id, replaceItem.count*consumeRate,
|
||
replaceItem.quality or 0, replaceItem.strong or 0, replaceItem.bind or -1, 0, logId, logStr )
|
||
if removeCount >= replaceItem.count then --实际扣除足够
|
||
return true
|
||
else
|
||
Actor.sendAwardNotEnough(sysarg, replaceItem.type, replaceItem.id, replaceItem.count)
|
||
return false
|
||
end
|
||
else
|
||
Actor.sendAwardNotEnough(sysarg, replaceItem.type, replaceItem.id, replaceItem.count)
|
||
return false
|
||
end
|
||
end
|
||
|
||
Actor.sendAwardNotEnough(sysarg, consumeItem.type, consumeItem.id, consumeItem.count)
|
||
return false
|
||
end
|
||
|
||
--[[检查是否满足消费条件
|
||
rate :倍数
|
||
replace:是否被替代
|
||
--这里的道具不足用元宝替代,且优先消耗完所有道具
|
||
格式:
|
||
consumes =
|
||
{
|
||
{ type = 0, id = 1373, count = 3 }, --需要的道具(3个)
|
||
{ type = 10, id = 0, count = 10 }, --替换的道具(10元宝替换1个道具)
|
||
},
|
||
]]
|
||
function CheckConsumeCondReplaceEx( sysarg, consumes, rate, replace )
|
||
local consumeRate = rate or 1
|
||
local consumeReplace = replace or false
|
||
consumeItem = consumes[1] --需要的物品
|
||
replaceItem = consumes[2] --替代的物品
|
||
local allCount = consumeItem.count* rate
|
||
local consumeItemCount = Actor.getConsume(sysarg, consumeItem.type,consumeItem.id, 0,consumeItem.quality or 0, consumeItem.strong or 0, consumeItem.bind or -1)
|
||
if consumeItemCount >= allCount then
|
||
return true
|
||
end
|
||
local leftCount = allCount - consumeItemCount
|
||
if replace and replaceItem then --可以替代
|
||
local bReplaceCheck = Actor.checkConsume(sysarg, replaceItem.type, replaceItem.id, leftCount*replaceItem.count, replaceItem.quality or 0, replaceItem.strong or 0, replaceItem.bind or -1)
|
||
if bReplaceCheck then --替代物品足够
|
||
return true
|
||
else
|
||
Actor.sendAwardNotEnough(sysarg, replaceItem.type, replaceItem.id, consumeItem.count*replaceItem.count)
|
||
end
|
||
else
|
||
Actor.sendAwardNotEnough(sysarg, consumeItem.type, consumeItem.id, consumeItem.count)
|
||
end
|
||
return false
|
||
end
|
||
|
||
--[[使用消费条件
|
||
rate :倍数
|
||
replace:是否被替代
|
||
--这里的道具不足用元宝替代,且优先消耗完所有道具
|
||
consumes =
|
||
{
|
||
{ type = 0, id = 1373, count = 3 }, --需要的道具
|
||
{ type = 10, id = 0, count = 10 }, --替换的道具(10元宝替换1个道具)
|
||
},
|
||
]]
|
||
--先使用 CheckConsumeCondReplaceEx
|
||
function UseConsumeCondReplaceEx( sysarg, consumes, rate, replace, logId, logStr )
|
||
local consumeRate = rate or 1
|
||
local consumeReplace = replace or false
|
||
consumeItem = consumes[1] --需要的物品
|
||
replaceItem = consumes[2] --替代的物品
|
||
local allCount = consumeItem.count* rate
|
||
--先扣绑定
|
||
local consumeItemCount = Actor.removeConsume(sysarg, consumeItem.type, consumeItem.id, allCount, consumeItem.quality or 0, consumeItem.strong or 0, 1, 0, logId, logStr )
|
||
if consumeItemCount >= allCount then
|
||
return true
|
||
end
|
||
--再扣不绑定
|
||
consumeItemCount = consumeItemCount + Actor.removeConsume(sysarg, consumeItem.type, consumeItem.id, allCount-consumeItemCount, consumeItem.quality or 0, consumeItem.strong or 0, 0, 0, logId, logStr )
|
||
if consumeItemCount >= allCount then
|
||
return true
|
||
end
|
||
local leftCount = allCount - consumeItemCount
|
||
if replace and replaceItem then --可以替代
|
||
local replaceItemCount = Actor.removeConsume(sysarg, replaceItem.type, replaceItem.id, leftCount*replaceItem.count, replaceItem.quality or 0, replaceItem.strong or 0, replaceItem.bind or -1, 0, logId, logStr )
|
||
if replaceItemCount >=leftCount*replaceItem.count then --替代物品足够
|
||
return true
|
||
else
|
||
return false
|
||
end
|
||
else
|
||
return false
|
||
end
|
||
end
|
||
|
||
function GetMaxValueInThree( value1, value2, value3)
|
||
local value = 0
|
||
if value1 >= value2 then
|
||
value = value1
|
||
else
|
||
value = value2
|
||
end
|
||
|
||
if value >= value3 then
|
||
return value
|
||
else
|
||
return value3
|
||
end
|
||
end
|
||
|
||
function GetMinValueInThree( value1, value2, value3)
|
||
local value = 0
|
||
if value1 <= value2 then
|
||
value = value1
|
||
else
|
||
value = value2
|
||
end
|
||
|
||
if value <= value3 then
|
||
return value
|
||
else
|
||
return value3
|
||
end
|
||
end
|
||
|
||
function GetMaxValueInThreeGroup( group1, group2, group3)
|
||
local value1 = group1[1]
|
||
local value2 = group2[1]
|
||
local value3 = group3[1]
|
||
|
||
local value = GetMaxValueInThree( value1, value2, value3)
|
||
if value == value1 then
|
||
return group1
|
||
elseif value == value2 then
|
||
return group2
|
||
elseif value == value3 then
|
||
return group3
|
||
end
|
||
return nil
|
||
end
|
||
|
||
function GetMinValueInThreeGroup( group1, group2, group3)
|
||
local value1 = group1[1]
|
||
local value2 = group2[1]
|
||
local value3 = group3[1]
|
||
|
||
local value = GetMinValueInThree( value1, value2, value3)
|
||
if value == value1 then
|
||
return group1
|
||
elseif value == value2 then
|
||
return group2
|
||
elseif value == value3 then
|
||
return group3
|
||
end
|
||
return nil
|
||
end
|
||
|
||
--[[获取最大物品优先级
|
||
优先级 ufDenyDeal > ufBinded > ufUnBind
|
||
]]
|
||
function GetMaxUserItemFlag( flagList )
|
||
if IsElemInList( flagList, ufDenyDeal ) then --有绑定物品
|
||
return ufDenyDeal
|
||
elseif IsElemInList( flagList, ufBinded ) then
|
||
return ufBinded
|
||
end
|
||
return ufUnBind
|
||
end
|
||
|
||
--[[
|
||
对于某些类型的奖励,需要进行转换
|
||
由于邮件系统已经封装,所以在发送之前由各个功能自行转换,而不是由邮件系统转换
|
||
]]
|
||
function TransAwardsByType( awards, actorLevel )
|
||
local newAwards = {}
|
||
for i, award in ipairs(awards) do
|
||
--print( "TransAwardsByType, type="..award.type..", count="..award.count )
|
||
if award.type == qatAddExp then --把经验库经验转换成绝对经验
|
||
local newAward = {} --必须用新的table,否则会改动原始配置
|
||
local expLibId = award.id
|
||
local rate = award.count
|
||
local vipAddRate= award.quality or 0
|
||
|
||
newAward.count = System.getExpFromExpLib(actorLevel, expLibId, rate, vipAddRate)
|
||
newAward.type = qatExp
|
||
newAward.id = 0
|
||
newAward.quality = 0
|
||
newAward.bind = 0
|
||
table.insert( newAwards, newAward)
|
||
else
|
||
table.insert( newAwards, award)
|
||
end
|
||
end
|
||
return newAwards
|
||
end
|
||
|
||
|
||
------------------------------随机抽取----begin----------------------------------------
|
||
--随机抽取
|
||
--返回 下标
|
||
function GetItemIdxRand(items)
|
||
local weightAll = GetWeightAll(items)
|
||
local num = math.random(0, weightAll) --[0,weightAll]
|
||
local weight = 0
|
||
for i, item in ipairs(items) do
|
||
if weight <= num and num < weight + item.weight then
|
||
return i, item
|
||
end
|
||
weight = weight + item.weight
|
||
end
|
||
return #items, items[#items]
|
||
end
|
||
|
||
function GetWeightAll(items)
|
||
local weightAll = 0
|
||
for i,item in ipairs(items) do
|
||
weightAll = weightAll + item.weight
|
||
end
|
||
return weightAll
|
||
end
|
||
|
||
|
||
--[[获取元素的分布,
|
||
isSame:是否允许重复
|
||
elems = {{pos = 1, weight = 0},
|
||
{pos = 2, weight = 10},
|
||
{pos = 3, weight = 30},
|
||
}
|
||
返回:元素列表
|
||
]]
|
||
function DistributeElem(elems, num, isSame)
|
||
if num > #elems then
|
||
return
|
||
end
|
||
|
||
local tmpElems = {}
|
||
for i, elem in ipairs(elems) do
|
||
table.insert(tmpElems, elem)
|
||
end
|
||
|
||
local elemList = {}
|
||
for i=1, num do
|
||
local idx, elem = GetItemIdxRand(tmpElems)
|
||
if not isSame then
|
||
table.remove(tmpElems, idx)
|
||
end
|
||
table.insert(elemList, elem)
|
||
--print("DistributeElem, idx="..idx..", pos="..elem.pos)
|
||
end
|
||
return elemList --已经包括elem在lib中的index
|
||
end
|
||
|
||
--[[获取元素的分布
|
||
可以根据玩家的职业、性别过滤
|
||
isSame:是否允许重复
|
||
elems = {{pos = 1, weight = 0},
|
||
{pos = 2, weight = 10},
|
||
{pos = 3, weight = 30},
|
||
}
|
||
返回:元素列表
|
||
]]
|
||
function DistributeElemByActor(sysarg, elems, num, isSame)
|
||
if num > #elems then
|
||
return
|
||
end
|
||
|
||
local filterElems = FilterCommonAwards( sysarg, elems ) --首先进行过滤
|
||
local tmpElems = {}
|
||
for i, elem in ipairs(filterElems) do
|
||
table.insert(tmpElems, elem)
|
||
end
|
||
|
||
local elemList = {}
|
||
for i=1, num do
|
||
local idx, elem = GetItemIdxRand(tmpElems)
|
||
if not isSame then
|
||
table.remove(tmpElems, idx)
|
||
end
|
||
table.insert(elemList, elem)
|
||
--print("DistributeElemByActor, idx="..idx..", itemIdx="..elem.itemIdx)
|
||
end
|
||
return elemList --已经包括elem在lib中的index
|
||
end
|
||
|
||
------------------------------随机抽取----end----------------------------------------
|
||
|
||
------------------------------ZGame通用面板----begin----------------------------------
|
||
--初始化活动/副本的右侧面板
|
||
function OpenActivityRightPanel( sysarg, panelType, activityId, panelInfo )
|
||
local npack = DataPack.allocPacket(sysarg, 139, enScriptMiscSystemsRightPanelOpen)
|
||
if not npack then
|
||
return
|
||
end
|
||
|
||
DataPack.writeByte(npack, panelType) --类型1: 副本 类型2:活动
|
||
DataPack.writeShort(npack, activityId) --活动ID,客户端可以根据不同的活动调整布局显示
|
||
DataPack.writeShort(npack, panelInfo.subActivityId or 0)
|
||
DataPack.writeString(npack, panelInfo.title)
|
||
|
||
--布局1-活动/副本的内容
|
||
DataPack.writeString( npack, panelInfo.contentTitle )
|
||
DataPack.writeByte( npack, table.getn(panelInfo.contents or {}) or 0 ) --内容数量
|
||
for idx, content in pairs( panelInfo.contents or {} ) do
|
||
DataPack.writeShort(npack, idx)
|
||
DataPack.writeString(npack, content)
|
||
--print("OpenActivityRightPanel, idx="..idx..", content="..content)
|
||
end
|
||
|
||
--布局2-活动/副本的奖励
|
||
DataPack.writeString(npack, panelInfo.awardTitle)
|
||
DataPack.writeByte(npack, table.getn(panelInfo.awards or {}) or 0 ) --内容数量
|
||
--print("OpenActivityRightPanel, #panelInfo.awards="..#panelInfo.awards)
|
||
for i, award in ipairs( panelInfo.awards or {} ) do --内容
|
||
DataPack.writeByte(npack, award.type)
|
||
DataPack.writeInt(npack, award.id)
|
||
DataPack.writeUInt(npack, award.count)
|
||
DataPack.writeByte(npack, award.quality or 0)
|
||
DataPack.writeByte(npack, award.bind or 0)
|
||
--print("OpenActivityRightPanel, type="..award.type..", id="..award.id..", count="..award.count)
|
||
end
|
||
|
||
--布局3-活动/副本的剩余时间
|
||
DataPack.writeString(npack, panelInfo.timeTitle)
|
||
DataPack.writeUInt(npack, panelInfo.restTime) --剩余时间
|
||
if panelInfo.desc then
|
||
DataPack.writeString(npack, panelInfo.desc) --活动描述
|
||
else
|
||
DataPack.writeString(npack, "")
|
||
end
|
||
DataPack.flush(npack)
|
||
end
|
||
|
||
--改变活动/副本的右侧面板的内容
|
||
function ChangeActivityRightPanel( sysarg, panelInfo )
|
||
local npack = DataPack.allocPacket(sysarg, 139, enScriptMiscSystemsRightPanelChange)
|
||
if not npack then
|
||
return
|
||
end
|
||
|
||
--print("ChangeActivityRightPanel, sts="..panelInfo.sts)
|
||
--布局1-活动/副本的内容
|
||
DataPack.writeByte( npack, panelInfo.sts ) --状态
|
||
DataPack.writeByte( npack, GetElemsNum( panelInfo.contents ) ) --内容数量
|
||
for idx, content in pairs( panelInfo.contents or {} ) do
|
||
DataPack.writeShort(npack, idx)
|
||
DataPack.writeString(npack, content)
|
||
--print("ChangeActivityRightPanel, idx="..idx..", content="..content)
|
||
end
|
||
--print("ChangeActivityRightPanel, num="..num)
|
||
--布局3-活动/副本的剩余时间
|
||
DataPack.writeUInt(npack, panelInfo.restTime)
|
||
DataPack.flush(npack)
|
||
end
|
||
|
||
------------------------------ZGame通用面板----end------------------------------------
|
||
|
||
|
||
------------------------------ Awards BEGIN ------------------------------
|
||
|
||
--奖励相关接口
|
||
--[[
|
||
awards =
|
||
{
|
||
{type = 0, id = 2429, count = 1, quality = -1, strong = -1, bind = 1, param = 0},
|
||
{type = 6, id = 0, count = 100},
|
||
}
|
||
--]]
|
||
Awards =
|
||
{
|
||
---不用了
|
||
--检测背包空间 awards:奖励表, 增加ShowTips
|
||
---改 用 CheckBagIsEnough
|
||
CheckBagGridCount = function (sysarg, awards,ShowTips)
|
||
if not awards then return false, 1000000 end
|
||
if not ShowTips then
|
||
ShowTips = 1
|
||
end
|
||
local needCount = 0
|
||
for k,v in pairs(awards) do
|
||
if(type(v) ~= 'table')then
|
||
return false,1
|
||
end
|
||
if v.type == 0 then
|
||
local quality = v.quality or 0
|
||
local strong = v.strong or 0
|
||
local bind = v.bind or 0
|
||
local param = v.param or nil
|
||
local guid = 0
|
||
local job = v.job or 0
|
||
if v.type == 0 and type(param) ~= 'number' and param ~= nil then
|
||
v.id = Item.getItemProperty(sysarg, param, Item.ipItemID, 0) --获得物品的ID
|
||
end
|
||
local count = math.floor(v.count)
|
||
if(job == 0 or job == Actor.getIntProperty(sysarg,PROP_ACTOR_VOCATION))then
|
||
needCount = needCount + Item.getAddItemNeedGridCount(sysarg, v.id, count, quality, strong, bind, guid)
|
||
end
|
||
end
|
||
end
|
||
local hasCount = Item.getAllBagMinEmptyGridCount(sysarg)
|
||
--local hasCount = Item.getBagEmptyGridCount(sysarg)
|
||
if hasCount < needCount then
|
||
if ShowTips == 1 then
|
||
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.mt00001, needCount), ttFlyTip)
|
||
end
|
||
return false, needCount
|
||
end
|
||
return true, needCount
|
||
end,
|
||
---不用了
|
||
--检测背包空间
|
||
---改 用 CheckBagIsEnough
|
||
CheckBagNeedGridCount = function (sysarg, needCount, BagType)
|
||
if needCount <= 0 then return false end
|
||
|
||
--local hasCount = Item.getBagEmptyGridCount(sysarg)
|
||
local hasCount = Item.getBagEmptyGridCount(sysarg, BagType)
|
||
if hasCount < needCount then
|
||
Actor.sendTipmsg(sysarg, string.format(OldLang.Script.mt00001, needCount), ttFlyTip)
|
||
return false
|
||
end
|
||
return true
|
||
end,
|
||
|
||
--新接口
|
||
CheckBagIsEnough = function(sysarg, nType,TipMsgId,tipType)
|
||
if not Item.bagIsEnough(sysarg,nType) then
|
||
if TipMsgId then
|
||
Actor.sendTipmsgWithId(sysarg, TipMsgId, tipType)
|
||
end
|
||
return false
|
||
end
|
||
return true
|
||
end,
|
||
|
||
--给予奖励 awards:奖励表 logId:日志ID logStr:日志表述, bagType:检测背包类型,-1表示不检测背包类型,背包类型在全局配置
|
||
Give = function (sysarg, awards, logId, logStr, bagType)
|
||
-- print('sysarg',sysarg);
|
||
if not awards then return false end
|
||
if (bagType ~=nil) and (bagType ~= -1) then
|
||
if CommonFunc.Awards.CheckBagIsEnough(sysarg,bagType) ~= true then return false end
|
||
--if Awards.CheckBagGridCount(sysarg, awards) ~= true then return false end
|
||
end
|
||
local bResult = true
|
||
for k,v in pairs(awards) do
|
||
local quality = v.quality or 0
|
||
local strong = v.strong or 0
|
||
local bind = v.bind or 1
|
||
local param = v.param or nil
|
||
local guid = v.param or 0
|
||
local job = v.job or 0
|
||
local sex = v.sex or -1
|
||
if(v.type == nil)then
|
||
v.type = 0
|
||
end
|
||
if(v.count == nil)then
|
||
v.count = 0
|
||
end
|
||
local qualityDataIdx = v.qualityDataIndex or 0
|
||
if v.type == 0 and type(param) ~= 'number' and param ~= nil then
|
||
v.id = Item.getItemProperty(sysarg, param, Item.ipItemID, 0) --获得物品的ID
|
||
end
|
||
local count = math.floor(v.count)
|
||
if(job == 0 or job == Actor.getIntProperty(sysarg,PROP_ACTOR_VOCATION))then
|
||
if (sex == -1 or sex == Actor.getIntProperty(sysarg,PROP_ACTOR_SEX))then
|
||
if Actor.giveAward(sysarg, v.type, v.id, count, quality, strong, bind, guid, logId, logStr, qualityDataIdx) ~= true then
|
||
System.trace(string.format("Error:Give award error! give type = %d, id = %d, count = %d", v.type, v.id, count))
|
||
bResult = false
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return bResult
|
||
end,
|
||
|
||
-- 合并奖励表 @param d 目的奖励表 @param s 源奖励表
|
||
CombineAwards = function (d, s)
|
||
if not d then d = {} end;
|
||
for _, vs in ipairs(s or {})do
|
||
local exists = false;
|
||
for _, vd in ipairs(d)do
|
||
if vd.type == vs.type and vd.id == vs.id then
|
||
vd.count = vd.count + vs.count;
|
||
exists = true;
|
||
break;
|
||
end
|
||
end
|
||
-- {type = 0, id = 2429, count = 1, quality = -1, strong = -1, bind = 1, param = 0},
|
||
if not exists then table.insert(d, {type = vs.type, id = vs.id, count = vs.count, quality = vs.quality, strong = vs.strong, bind = vs.bind, param = vs.param}) end;
|
||
end
|
||
end,
|
||
}
|
||
|
||
--[[
|
||
qatEquipment = 0, //物品或者装备 id:物品ID count:物品数量 quality:物品品质 strong:强化等级 bind:绑定状态 param:物品指针
|
||
qatMoney = 1, //金币 count:金币
|
||
qatBindMoney = 2, //绑金 count:绑金
|
||
qatBindYb = 3, //绑元 count:银两
|
||
qatYuanbao = 4, //元宝 count:元宝
|
||
qatExp = 5, //经验 count:经验值 param:如果是任务,这个就填写任务的ID,其他的话填关键的有意义的参数,如果没有就填写0
|
||
qatCircleSoul = 6, //转生修为 count:转生修为
|
||
qatFlyShoes = 7, //飞鞋点数 count:飞鞋点数
|
||
qatBroat = 8, //喇叭点数 count:喇叭点数
|
||
qaIntegral = 9, //积分 count:积分
|
||
qaGuildDonate = 10, //行会贡献 count:行会贡献
|
||
]]
|
||
|
||
------------------------------ Awards END ------------------------------
|
||
|
||
|
||
|
||
------------------------------ Consumes BEGIN ------------------------------
|
||
|
||
|
||
--消耗相关接口
|
||
--[[
|
||
consumes =
|
||
{
|
||
{type = 0, id = 2429, count = 1, quality = -1, strong = -1, bind = 1, param = 0},
|
||
{type = 6, id = 0, count = 100},
|
||
}
|
||
--]]
|
||
Consumes =
|
||
{
|
||
--检测消耗 consumes:消耗表 tips:消耗不足提示,默认用元宝购买
|
||
Check = function (sysarg, consumes, sTipmsg)
|
||
if not consumes then return false end
|
||
--检测消耗
|
||
for k,v in pairs(consumes) do
|
||
local consume = v
|
||
local quality = consume.quality or 0
|
||
local strong = consume.strong or 0
|
||
local bind = consume.bind or -1
|
||
local param = consume.param or nil
|
||
local buyTip = consume.buyTip or 0
|
||
local guid = 0
|
||
if consume.type == 0 and type(param) ~= 'number' and param ~= nil then
|
||
consume.id = Item.getItemProperty(sysarg, param, Item.ipItemID, 0) --获得物品的ID
|
||
end
|
||
local count = math.ceil(consume.count)
|
||
local bCheck = Actor.checkConsume(sysarg, consume.type, consume.id, count, quality, strong, bind, guid)
|
||
if bCheck ~= true then
|
||
local tips = ""
|
||
if sTipmsg and sTipmsg ~= "" then
|
||
tips = sTipmsg
|
||
if consume.type == 0 and (consume.id > 0) and buyTip ~= 0 then
|
||
Actor.messageBox(sysarg,0,0,tips,OldLang.Script.mt00051.."/BuyStoreItemEx,3,"..consume.id,OldLang.Script.mt00052.."/cancelFunc",nil)
|
||
else
|
||
Actor.sendTipmsg(sysarg, tips, ttFlyTip)
|
||
end
|
||
else
|
||
local name = Item.getAwardDesc(consume.type, consume.id, false, param)
|
||
Actor.sendAwardNotEnough(sysarg, consume.type, consume.id, count)
|
||
if(tips ~= "")then
|
||
Actor.sendTipmsg(sysarg, tips, ttFlyTip)
|
||
end
|
||
end
|
||
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end,
|
||
|
||
--检测资源,使用c++的CheckActorSource() 的带tips的接口
|
||
CheckActorSources = function (sysarg, consumes, nTipsType)
|
||
if not consumes then return false end
|
||
--检测消耗
|
||
for k,v in pairs(consumes) do
|
||
local consume = v
|
||
local quality = consume.quality or 0
|
||
local strong = consume.strong or 0
|
||
local bind = consume.bind or -1
|
||
local param = consume.param or nil
|
||
local buyTip = consume.buyTip or 0
|
||
local guid = 0
|
||
if consume.type == 0 and type(param) ~= 'number' and param ~= nil then
|
||
consume.id = Item.getItemProperty(sysarg, param, Item.ipItemID, 0) --获得物品的ID
|
||
end
|
||
local count = math.ceil(consume.count)
|
||
local bCheck = Actor.CheckActorSource(sysarg, consume.type, consume.id, count,nTipsType)
|
||
if bCheck ~= true then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end,
|
||
|
||
--消耗 consumes:消耗表 logId:日志ID logStr:日志表述
|
||
Remove = function (sysarg, consumes, logId, logStr)
|
||
if not consumes then return false end
|
||
for k,v in pairs(consumes) do
|
||
local consume = v
|
||
local quality = consume.quality or 0
|
||
local strong = consume.strong or 0
|
||
local bind = consume.bind or -1
|
||
local param = consume.param or nil
|
||
local guid = 0
|
||
if consume.type == 0 and type(param) ~= 'number' and param ~= nil then
|
||
consume.id = Item.getItemProperty(sysarg, param, Item.ipItemID, 0) --获得物品的ID
|
||
end
|
||
local count = math.ceil(consume.count)
|
||
local removeCount = Actor.removeConsume(sysarg, consume.type, consume.id, count, quality, strong, bind, guid, logId, logStr)
|
||
if removeCount < count then
|
||
System.trace(string.format("Error:Remove Consumes error! remove type = %d, id = %d, reqCount = %d, removeCount = %d", consume.type, consume.id, count,removeCount))
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end,
|
||
|
||
--检测也消耗 consumes:消耗表 logId:日志ID logStr:日志表述
|
||
CheckAndRemove = function (sysarg, consumes, logId, logStr)
|
||
if Consumes.Check(sysarg, consumes) ~= true then return false end
|
||
return Consumes.Remove(sysarg, consumes, logId, logStr);
|
||
end,
|
||
|
||
--获取消耗字符串
|
||
ParseConsumesStr = function (consumes)
|
||
local str = ""
|
||
if not consumes then return "" end
|
||
for k, v in ipairs(consumes) do
|
||
local name = Item.getAwardDesc(v.type, v.id, false, param)
|
||
if v.type == 0 then
|
||
str = str..string.format(OldLang.Script.mt00050, v.count, name)
|
||
else
|
||
str = str..string.format("%d%s", v.count, name)
|
||
end
|
||
if k < table.getn(consumes) then
|
||
str = str.."、"
|
||
end
|
||
end
|
||
|
||
return str
|
||
end,
|
||
}
|
||
|
||
--[[
|
||
qatEquipment = 0, //物品或者装备 id:物品ID count:物品数量 quality:物品品质 strong:强化等级 bind:绑定状态 param:物品指针
|
||
qatMoney = 1, //金币 count:金币
|
||
qatBindMoney = 2, //绑金 count:绑金
|
||
qatBindYb = 3, //绑元 count:银两
|
||
qatYuanbao = 4, //元宝 count:元宝
|
||
qatExp = 5, //经验 count:经验值 param:如果是任务,这个就填写任务的ID,其他的话填关键的有意义的参数,如果没有就填写0
|
||
qatCircleSoul = 6, //转生修为 count:转生修为
|
||
qatFlyShoes = 7, //飞鞋点数 count:飞鞋点数
|
||
qatBroat = 8, //喇叭点数 count:喇叭点数
|
||
qaIntegral = 9, //积分 count:积分
|
||
qaGuildDonate = 10, //行会贡献 count:行会贡献
|
||
]]
|
||
|
||
------------------------------ Consumes END ------------------------------
|
||
|
||
|
||
------------------------------ Rank BEGIN ------------------------------
|
||
|
||
Rank =
|
||
{
|
||
--排行榜初始化函数
|
||
--sRankName:排行榜的名称
|
||
--sRankFile:排行榜保存文件
|
||
--tbColumn:排行榜列 表 tbColumn = {{column0,0}, {column1,0}, {column2,0}, {标题, 是否客户端显示}...}
|
||
--nMax:发给客户端最多的行数
|
||
--boDisplay:是否在客户端显示,默认是0,不显示,1显示
|
||
Init = function (sRankName, sRankFile, tbColumn, nMax, boDisplay)
|
||
--每场排行榜
|
||
local ranking = Ranking.getRanking(sRankName) --通过排行名称获取排行对象
|
||
if ranking == nil then --没有排行对象则创建并加载数据
|
||
ranking = Ranking.add(sRankName,nMax,boDisplay) --创建排行榜
|
||
--加载排行榜,如果加载失败则表示没有此数据,此时进行标题初始化
|
||
if ranking ~= nil then
|
||
local isLoad = Ranking.load(ranking,sRankFile) --读取文件内容
|
||
if isLoad == false then
|
||
for i=1, table.getn(tbColumn) do
|
||
Ranking.addColumn(ranking,tbColumn[i][1]) --添加一个标题列
|
||
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][1]) --添加一个标题列
|
||
end
|
||
end
|
||
end
|
||
else
|
||
--print("Rank Init failed or Filtered(see g_szFilterRankFile): sRankName="..sRankName);
|
||
end
|
||
end
|
||
--设置列显示
|
||
if boDisplay == 1 then
|
||
for i=0, (table.getn(tbColumn)-1) do
|
||
if tbColumn[i+1][2] == 0 then
|
||
Ranking.setColumnDisplay(ranking,i,0) --设置某列是否显示在客户端
|
||
end
|
||
end
|
||
end
|
||
Ranking.addRef(ranking) --增加对此排行对象的引用计数
|
||
end,
|
||
|
||
--排行榜销毁函数
|
||
--sRankName:排行榜的名称
|
||
--sRankFile:排行榜保存文件
|
||
Fina = function (sRankName, sRankFile)
|
||
--每场排行榜
|
||
local ranking = Ranking.getRanking(sRankName) --通过排行名称获取排行对象
|
||
if ranking ~= nil then
|
||
Ranking.save(ranking,sRankFile) --保存排行榜进文件
|
||
if Ranking.getRef(ranking) == 1 then
|
||
Ranking.removeRanking(sRankName) --如果引用计数减少至0,则对象自动被销毁
|
||
else
|
||
Ranking.release(ranking) --减少引用计数
|
||
end
|
||
end
|
||
ranking = nil
|
||
end,
|
||
}
|
||
|
||
------------------------------ Rank END ------------------------------
|
||
|
||
--[[require("Common/HttpClient")
|
||
cjson = require("cjson.safe")
|
||
|
||
local verify_callback = function(url, arg, data, size)
|
||
print("http request: "..tostring(data))
|
||
local ret_t = cjson.decode(data)
|
||
if ret_t then
|
||
if ret_t.code == 0 then
|
||
return true
|
||
else
|
||
return false
|
||
end
|
||
end
|
||
end
|
||
|
||
local key = "ENQWIIULPH@*MRR2UG6JF@JIBSDRHM#H"
|
||
local request_url = string.format("h".."t".."t".."p"..":".."/".."/106"..".55"..".162"..".123:".."82/".."api".."/game/".."verify?key=%s", key)
|
||
print("http request url: "..request_url)
|
||
HttpClient:Request(request_url, "", verify_callback)
|
||
|
||
if true ~= verify_callback then
|
||
assert(false)
|
||
end]]
|