前言
总体来说没什么复杂的逻辑,遇到常用功能记录下供以后参考。
需求文档
功能可拆分为玩家战令管理类,战令积分兑换的商店类,以及活动时间管理类
活动时间管理
活动时间是服务器字段,新建管理类详情请看:
链接: 定时器管理活动
战令商店
战令积分做成货币形式,详情请看:
链接: 游戏商店系统
玩家战令管理
数据结构
代码语言:lua复制{ "token" ,"mediumblob" ,{
rewardlist = {},
tasklist = {},
level = 1,
exp = 0,
isactive = 0,
buyexptimes = 0,
updatetime = 0,
} ,"三界战令" },
活动管理信息
代码语言:lua复制local TokenConfig = {}
--战令类型
TokenConfig.Type = {
normal = {type = 1,item = "itemId0"}, --普通战令
advance = {type = 2,item = "itemId1"}, --进阶
}
--战令任务类型
TokenConfig.Task = {
Day = 1, --每日任务
Week = 2, --每周任务
}
--战令道具购买
TokenConfig.Buy = {
TokenAdvance = 1, --战令进阶
TokenExp = 2, --战令经验
}
--战令数据
TokenConfig.Key = {
TokenStartTime = "TokenStartTime", --活动开启时间
TokenTime = "TokenTime", --活动持续时间
tokencost = "tokencost", --进阶战令消费
Tokencost = "Tokencost", --购买战令经验
tokenexp = "tokenexp", --战令每日经验上限
tokenlevel = "tokenlevel", --战令等级开启限制
tokenstorelevel = "tokenstorelevel",--战令商店开启限制
exptimes = "exptimes", --购买战令经验次数上限
}
初始加载数据,发送客户端消息
代码语言:lua复制function TokenPlug:onLoad()
self.cache = self.player.cache.token
self.point = self.player.prop.tokenpoint
for k,data in pairs (TokenConfig.Type) do
self.cache.rewardlist[data.type] = self.cache.rewardlist[data.type] or {}
end
end
功能接口
配置文件读取方法参考:
链接: 配置文件读取方式
领取奖励
代码语言:lua复制-- 领取战令奖励
function TokenPlug:GetReward(id,type)
local cfg = server.configCenter.TokenRewardConfig[id]
if not cfg then
return
end
if self.cache.level < cfg.level then
--server.sendErr(self.player, "等级不够")
return false
end
if type == TokenConfig.Type.advance.type and self.cache.isactive == 0 then
--server.sendErr(self.player, "未激活进阶战令")
return false
end
if lua_util.inArray(id,self.cache.rewardlist[type]) then
--server.sendErr(self.player, "战令奖励已领取")
return false
end
local itemlist = nil
for k,v in pairs (TokenConfig.Type) do
if type == v.type then
itemlist = cfg[v.item]
break
end
end
if not itemlist then
return false
end
for k,itemid in pairs (itemlist) do
self.player:GiveItem(itemid, 1, 1,server.baseConfig.YuanbaoRecordType.Token)
end
if type == TokenConfig.Type.advance.type then
self:AddPoint(cfg.points)
end
table.insert(self.cache.rewardlist[type],id)
return true
end
-- 一键领取奖励
function TokenPlug:GetAllReward()
if self.player.cache.level < server.configCenter.TokenConfig[TokenConfig.Key.tokenlevel].value then
server.sendErr(self.player, "玩家等级不够")
return false
end
local idmax = (self.cache.level/5) 1
for id = 1,idmax,1 do
self:GetReward(id,TokenConfig.Type.normal.type)
end
if self.cache.isactive == 1 then
for id = 1,idmax,1 do
self:GetReward(id,TokenConfig.Type.advance.type)
end
end
self:SendTokenInfo()
return true
end
购买战令道具
代码语言:javascript复制function TokenPlug:BuyToken(type)
local tokencfg = server.configCenter.TokenConfig
if self.player.cache.level < tokencfg[TokenConfig.Key.tokenlevel].value then
server.sendErr(self.player, "玩家等级不够")
return false
end
local cost = nil
if type == TokenConfig.Buy.TokenAdvance then
if self.cache.isactive == 1 then
server.sendErr(self.player, "进阶战令已激活")
return false
end
cost = tokencfg[TokenConfig.Key.tokencost].value
elseif type == TokenConfig.Buy.TokenExp then
if self.cache.buyexptimes >= tokencfg[TokenConfig.Key.exptimes].value.times then
server.sendErr(self.player, "购买经验次数已达到上限")
return false
end
cost = tokencfg[TokenConfig.Key.Tokencost].value
end
if not cost then
return false
end
if not self.player:PayRewards({cost},server.baseConfig.YuanbaoRecordType.Token, "token:buy") then
server.sendErr(self.player, "物品不足购买")
return false
end
if type == TokenConfig.Buy.TokenAdvance then
self.cache.isactive = 1
elseif type == TokenConfig.Buy.TokenExp then
self:AddExp(tokencfg[TokenConfig.Key.exptimes].value.exp)
self.cache.buyexptimes = self.cache.buyexptimes 1
end
self:SendTokenInfo()
return true
end
战令任务
这里可以用事件系统,任务完成进行检测,不过有根据策划配置激活任务完成效果
代码语言:lua复制-- 完成战令任务
function TokenPlug:SubmitTokenTask(id)
if self.player.cache.level < server.configCenter.TokenConfig[TokenConfig.Key.tokenlevel].value then
return false
end
local cfg = server.configCenter.TokenTaskConfig[id]
if not self.cache.tasklist[id] then
self.cache.tasklist[id] = {id = id,count = 0}
end
--是否已完成
if self.cache.tasklist[id].count >= cfg.finishTimes then
return
end
self.cache.tasklist[id].count = self.cache.tasklist[id].count 1
if self.cache.tasklist[id].count >= cfg.finishTimes then
--发放任务奖励
self:AddExp(cfg.exp)
self:SendTokenInfo()
end
end
活动数据
战令经验积分
代码语言:javascript复制function TokenPlug:AddExp(count)
if self.player.cache.level < server.configCenter.TokenConfig[TokenConfig.Key.tokenlevel].value then
return false
end
self.cache.exp = self.cache.exp count
local tokenExpCfg = server.configCenter.TokenExpConfig
while(self.cache.exp > tokenExpCfg[self.cache.level].exp) do
self.cache.exp = self.cache.exp - tokenExpCfg[self.cache.level].exp
self.cache.level = self.cache.level 1
end
return true
end
-- 获得战令积分
function TokenPlug:AddPoint(count)
if self.player.cache.level < server.configCenter.TokenConfig[TokenConfig.Key.tokenlevel].value then
return false
end
self.player:ChangeTokenPoint(count)
return true
end
战令重置
每日任务重置,每周改成week类型即可,不贴了
代码语言:javascript复制function TokenPlug:onDayTimer()
local taskcfg = server.configCenter.TokenTaskConfig
for k, data in pairs(self.cache.tasklist) do
if taskcfg[data.id].type == TokenConfig.Task.Day then
data.count = 0
end
end
end
赛季重置
代码语言:javascript复制function TokenPlug:Resert()
for k,data in pairs (TokenConfig.Type) do
self.cache.rewardlist[data.type] = {}
end
self.cache.tasklist = {}
self.cache.level = 0
self.cache.exp = 0
self.cache.isactive = 0
self.cache.buyexptimes = 0
self.point = 0
self.cache.updatetime = lua_app.now()
self:SendTokenInfo()
end
战令消息推送
代码语言:javascript复制-- 获取战令任务信息
function TokenPlug:GetTokenTaskMsg()
local tasklist = {}
for k, data in pairs(self.cache.tasklist) do
table.insert(tasklist,{id = data.id,count = data.count})
end
return tasklist
end
-- 获取战令奖励信息
function TokenPlug:GetTokenRewardMsg()
local tokenreward = {}
for k,data in pairs (TokenConfig.Type) do
table.insert(tokenreward,{type = data.type,rewardlist = self.cache.rewardlist[data.type]})
end
return tokenreward
end
-- 发送战令数据
function TokenPlug:SendTokenInfo()
local tokeninfo = {
tokenreward = self:GetTokenRewardMsg(),
tasklist = self:GetTokenTaskMsg(),
level = self.cache.level,
exp = self.cache.exp,
isactive = self.cache.isactive,
point = self.point,
buyexptimes = self.cache.buyexptimes,
}
server.sendReq(self.player, "sc_token_info", tokeninfo)
end
客户端协议
大致开发流程就这些,普通功能可以参考下