实现类似王者荣耀的战令功能

实现类似王者荣耀的战令功能

Scroll Down

前言

总体来说没什么复杂的逻辑,遇到常用功能记录下供以后参考。

需求文档

功能可拆分为玩家战令管理类,战令积分兑换的商店类,以及活动时间管理类
需求文档

活动时间管理

活动时间是服务器字段,新建管理类详情请看:
链接: 定时器管理活动

战令商店

战令积分做成货币形式,详情请看:
链接: 游戏商店系统

玩家战令管理

数据结构

{ "token"				,"mediumblob"		,{
			rewardlist = {},
			tasklist = {},
			level = 1,
			exp = 0,
			isactive = 0,
			buyexptimes = 0,
			updatetime = 0,
			}		,"三界战令" },

活动管理信息

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",		--购买战令经验次数上限
}

初始加载数据,发送客户端消息

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

功能接口

领取奖励

配置文件读取方法参考:
链接: 配置文件读取方式
在这里插入图片描述

-- 领取战令奖励
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

购买战令道具

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

战令任务

这里用到了事件系统,具体等以后填坑

-- 完成战令任务
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

活动数据

战令经验积分

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类型即可,不贴了

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

赛季重置

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

战令消息推送

-- 获取战令任务信息
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

客户端协议

与客户端协议