You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

396 lines
15 KiB
Lua

local skynet = require "skynet"
local netpack = require "websocketnetpack"
local msgutils = require "msgutils"
local cjson = require "cjson"
local usermodel = require "usermodel"
local bagmodel = require "bagmodel"
local heromodel = require "heromodel"
local settings = require "settings"
local dateutils = require "dateutils"
local fundlogic = require "fundlogic"
local mongohelper = require "mongohelper"
local mqhelper = require "mqhelper"
local coingetmodel = require "coingetmodel"
local dailydealmodel = require "dailydealmodel"
local fundmodel = require "fundmodel"
local fukamodel = require "fukamodel"
local daybuymodel = require "daybuymodel"
local signinmodel = require "signinmodel"
local limitshopmodel = require "limitshopmodel"
local friendmodel = require "friendmodel"
local arenamodel = require "arenamodel"
local signinlogic = require "signinlogic"
local redishelper = require "redishelper"
--竞技场
local function loadbottleusers()
local ok, ret = pcall(skynet.call, ".arenad", "lua", "loaduserscore", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level))
local myscore = checkint(ret[1])
local myrank = checkint(ret[2])
local min = math.max(0, myscore - 200)
local max = checkint(myscore + 200)
local ok, rands = pcall(skynet.call, ".arenad", "lua", "loadbackupusers", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level), min, max, myrank)
local players = {}
for k,v in pairs(rands) do
table.insert(players, v.uid)
end
local ok, users = pcall(skynet.call, ".usercenterd", "lua", "getuserinfolist", players)
local list = {}
for k,v in pairs(rands) do
local u = users[v.uid]
u.score = math.max(1000, checkint(u.score) + 1000)
table.insert(list, u)
end
return list
end
local function loadrandmousers()
local ok, ret = pcall(skynet.call, ".arenad", "lua", "loaduserscore", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level))
assert(ok, "排行榜获取失败")
assert(ret ~= nil)
local myscore = checkint(ret[1])
local myrank = checkint(ret[2])
local min = math.max(0, myscore - 200)
local max = checkint(myscore + 200)
local ok, rands = pcall(skynet.call, ".arenad", "lua", "loadrandmousers", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level), min, max, myrank+1)
local players = {}
for k,v in pairs(rands) do
table.insert(players, v.uid)
end
local ok, users = pcall(skynet.call, ".usercenterd", "lua", "getuserinfolist", players)
local list = {}
for k,v in pairs(rands) do
local u = users[v.uid]
u.score = math.max(1000, checkint(u.score) + 1000)
table.insert(list, u)
end
return list
end
local function checkopen()
local h = dateutils.get_hour()
if h < 6 or h > 22 then
return false
end
return true
end
local function tablesort(ranks)
table.sort( ranks, function(a, b)
if a.score == b.score then
return a.uid < b.uid
end
return a.score > b.score
end)
return ranks
end
--获取我的信息
local function getme(uid, ranks)
for i,v in ipairs(ranks) do
if v.uid == uid then
return i, v.score
end
end
return 99999, 1000
end
local function canlvup(level, rankno)
if level == 1 then
if rankno <= 30 then
return 1
end
end
if level == 2 then
if rankno <= 20 then
return 1
end
if rankno > 40 then
return -1
end
end
if level == 3 then
if rankno <= 30 then
return 1
end
if rankno > 70 then
return -1
end
end
if level == 4 then
if rankno <= 20 then
return 1
end
if rankno > 60 then
return -1
end
end
if level == 5 then
if rankno <= 20 then
return 1
end
if rankno > 120 then
return -1
end
end
return 0
end
local arena = {}
function arena.loadarenamsg(cmd)
local id = cmd.data.id
if not id then
return {c = "arena",m = "loadarenamsg",data = {errcode = 10001,errmsg = "请求异常, 请稍后再试!", data = { }}}
end
id = checkint(id)
if arenamodel._init then
local msgs = skynet.call(".msgcenterd", "lua", "loadarenamsg", arenamodel:calcurserverid(), id)
if #msgs > 0 then
local lastid = msgs[#msgs].id
msgmodel.arenaindex = lastid
end
return {c = "arena",m = "loadarenamsg", data = {errcode = 0, errmsg = "", data = { msgs = table.array(msgs)}}}
end
return {c = "arena",m = "loadarenamsg", data = {errcode = 0, errmsg = "", data = { msgs = table.array({})}}}
end
--加载竞技场
function arena.loadarena(cmd)
if not checkopen() then
return {c = "arena",m = "loadarena", data = {errcode = 10001, errmsg = "竞技场未到开放时间", data = {}}}
end
local groupid = skynet.call(".arenad", "lua", "getgroupid", UID)
if not groupid then
if dateutils.get_week() == 7 and dateutils.get_hour() > 20 then
return {c = "arena",m = "loadarena", data = {errcode = 10002, errmsg = "分组时间已停止", data = {}}}
end
local ok, rank = pcall(skynet.call, ".arenad", "lua", "loadlastweekrank", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level))
local ranks = {}
for k,v in pairs(rank) do
table.insert(ranks, {uid=k, score=math.max(1000, checkint(v) + 1000)})
end
local ranks = tablesort(ranks)
local rankno, _ = getme(UID, ranks)
if checkint(usermodel.arena_level) <= 5 then
local r = canlvup(checkint(usermodel.arena_level), rankno)
usermodel.arena_level = usermodel.arena_level + r
else
local t = #ranks
t = math.floor(t * 0.3)
if rankno > t then
usermodel.arena_level = usermodel.arena_level - 1
end
end
-- DEBUG("usermodel.arena_level = ", usermodel.arena_level)
end
if not arenamodel._init or arenamodel._init ~= dateutils.getday() then
local ok, groupid = pcall(skynet.call, ".arenad", "lua", "joingroup", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level))
assert(ok, "分组失败")
arenamodel:init(usermodel:getArenaServer(), checkint(usermodel.arena_level), groupid)
arenamodel._init = dateutils.getday()
end
local ok, rank = pcall(skynet.call, ".arenad", "lua", "loadrank", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level))
assert(ok, "排行榜获取失败")
assert(rank ~= nil)
local players = {}
for k,v in pairs(rank) do
table.insert(players, checkint(k))
end
local ok, users = pcall(skynet.call, ".usercenterd", "lua", "getuserinfolist", players)
local ranks = {}
for k,v in pairs(rank) do
local u = users[checkint(k)]
u.score = math.max(1000, checkint(v) + 1000)
table.insert(ranks, u)
end
local ranks = tablesort(ranks)
local myrank, myscore = getme(UID, ranks)
assert(myrank ~= nil, "我的数据获取失败")
return {c = "arena",m = "loadarena", data = {errcode = 0, errmsg = "", data = {myrank=myrank, myscore=myscore, ranks=table.array(ranks)}}}
end
--设置防守阵容
function arena.setdeflineup(cmd)
if not checkopen() then
return {c = "arena",m = "setdeflineup", data = {errcode = 10001, errmsg = "竞技场未到开放时间", data = {}}}
end
local lineup = cmd.data.lineup -- {{heroid=heroid, pos=pos}, {heroid=heroid, pos=pos}}
if not lineup then
return {c = "arena",m = "setdeflineup", data = {errcode = 10001, errmsg = "请求异常", data = {}}}
end
if #lineup <= 0 then
return {c = "arena",m = "setdeflineup", data = {errcode = 10002, errmsg = "没有上阵任何武将", data = {}}}
end
local ret = {}
local heros = {}
for _,v in ipairs(lineup) do
local heroid = checkint(v.heroid)
local pos = checkint(v.pos)
local hero = heromodel:serializebyheroid(heroid)
assert(hero ~= nil, "英雄未找到")
hero.pos = pos
table.insert(heros, hero)
end
ret.heros = heros
ret.lord = usermodel:getcurattr()
local ok = pcall(skynet.call, ".arenad", "lua", "setdeflineup", UID, cjson.encode(ret)) --防守阵容
return {c = "arena",m = "setdeflineup", data = {errcode = 0, errmsg = "", data = {}}}
end
--获取挑战用户
function arena.loadbottleusers(cmd)
if not checkopen() then
return {c = "arena",m = "loadbottleusers", data = {errcode = 10001, errmsg = "竞技场未到开放时间", data = {}}}
end
local list = loadbottleusers()
local ok, battlenum = pcall(skynet.call, ".arenad", "lua", "getbattlenum", UID) --获取挑战次数
local ok, refreshnum = pcall(skynet.call, ".arenad", "lua", "getrefreshnum", UID) --获取刷新次数
return {c = "arena",m = "loadbottleusers", data = {errcode = 0, errmsg = "", data = {users=table.array(list), battlenum=battlenum, refreshnum=refreshnum}}}
end
--刷新挑战列表
function arena.refreshbottleusers(cmd)
if not checkopen() then
return {c = "arena",m = "refreshbottleusers", data = {errcode = 10001, errmsg = "竞技场未到开放时间", data = {}}}
end
local ok, num = pcall(skynet.call, ".arenad", "lua", "getrefreshnum", UID) --获取挑战次数
if num >= 1 and bagmodel.gold <= 20 then
return {c = "arena",m = "refreshbottleusers", data = {errcode = 10002, errmsg = "金砖不足", data = {}}}
end
local list = loadrandmousers()
if #list > 0 then
bagmodel:decrBagA("gold", 20)
end
local ok, refreshnum = pcall(skynet.call, ".arenad", "lua", "incrrefreshnum", UID)
return {c = "arena",m = "refreshbottleusers", data = {errcode = 0, errmsg = "", data = {users=table.array(list), refreshnum=refreshnum}}}
end
--获取防守阵容
function arena.loaddeflineup(cmd)
if not checkopen() then
return {c = "arena",m = "loaddeflineup", data = {errcode = 10001, errmsg = "竞技场未到开放时间", data = {}}}
end
local userid = cmd.data.userid
if not userid then
return {c = "arena",m = "loaddeflineup", data = {errcode = 10001, errmsg = "请求异常", data = {}}}
end
local ok, lineup = pcall(skynet.call, ".arenad", "lua", "getdeflineup", userid)
local ok, resp = pcall(cjson.decode, lineup)
if ok then
return {c = "arena",m = "loaddeflineup", data = {errcode = 0, errmsg = "", data = {lineup=resp}}}
end
local ok, lineup = pcall(skynet.call, ".usercenterd", "lua", "loaduserlineup", userid)
return {c = "arena",m = "loaddeflineup", data = {errcode = 0, errmsg = "", data = {lineup=lineup}}}
end
--挑战
function arena.battle(cmd)
if not checkopen() then
return {c = "arena",m = "battle", data = {errcode = 10001, errmsg = "竞技场未到开放时间", data = {}}}
end
local tp = cmd.data.tp
local userid = cmd.data.userid
local battles = cmd.data.battles
if not tp or not userid or not battles then
return {c = "arena",m = "battle", data = {errcode = 10001, errmsg = "请求异常", data = {}}}
end
userid = checkint(userid)
local ok, users = pcall(skynet.call, ".arenad", "lua", "loadbackupusers", UID, usermodel:getArenaServer(), checkint(usermodel.arena_level), min, max) --获取挑战用户列表
local found = false
for i,v in ipairs(users) do
if v.uid == checkint(userid) then
found = true
end
end
if not found then
return {c = "arena",m = "battle", data = {errcode = 10002, errmsg = "挑战用户不存在", data = {}}}
end
local ok, num = pcall(skynet.call, ".arenad", "lua", "getbattlenum", UID) --获取挑战次数
assert(ok, "挑战次数获取失败")
if checkint(num) < 3 then
--TODO:增加经济经验
end
if checkint(num) >= 3 then
if bagmodel.xianshenmenpiao <= 0 then
return {c = "arena",m = "battle", data = {errcode = 10003, errmsg = "门票不足", data = {}}}
end
bagmodel:decrBagA("xianshenmenpiao", 1)
end
local myscore = 0
local youscore = 0
if tp == "success" then
myscore = 20
youscore = -20
local ok, myscore = pcall(skynet.call, ".arenad", "lua", "savescore", UID, userid, usermodel:getArenaServer(), checkint(usermodel.arena_level), myscore, youscore)
elseif tp == "fail" then
myscore = -20
youscore = 20
local ok, myscore = pcall(skynet.call, ".arenad", "lua", "savescore", UID, userid, usermodel:getArenaServer(), checkint(usermodel.arena_level), myscore, youscore)
else
assert(false, "不应该走到这~~~")
end
taskmodel:addtasknum(8, 1)
pcall(skynet.call, ".arenad", "lua", "incrbattlenum", UID)
local list = loadrandmousers()
local id = skynet.call(".id_service", "lua", "genid", "arena")
local log = {
id=id,
atk_uid=UID,
atk_score=myscore,
def_uid=userid,
def_score=youscore,
battles={},
created_at=dateutils.get_datetime()
}
local ok = mqhelper.exec("insert", UID, settings.arena_log_mongodb_key.tname, settings.arena_log_mongodb_key.cname, log)
return {c = "arena",m = "battle", data = {errcode = 0, errmsg = "", data = {myscore=myscore, youscore=youscore, users=table.array(list)}}}
end
--竞技场消息
function arena.sendmsg(cmd)
local content = cmd.data.content
if not content then
return {c = "arena",m = "sendmsg",data = {errcode = 10001, errmsg = "请求异常, 请稍后再试!", data = { }}}
end
if content == "" then
return {c = "arena",m = "sendmsg",data = {errcode = 10002, errmsg = "消息不能为空!", data = { }}}
end
if not arenamodel._init then
return {c = "arena",m = "sendmsg",data = {errcode = 10003, errmsg = "请先加入竞技场", data = { }}}
end
local is_valid = skynet.call(".word_crab", "lua", "is_valid", content)
if not is_valid then
return {c = "arena",m = "sendmsg",data = {errcode = 10004, errmsg = "存在违规词!", data = { }}}
end
local id = skynet.call(".id_service", "lua", "genid", "arenamsg")
assert(id~=nil, "id 获取失败")
local msg = {
id=id,
server=arenamodel:calcurserverid(),
sender=usermodel:get_look_info(),
content=content,
created_at=dateutils.get_datetime()
}
skynet.call(".msgcenterd", "lua", "sendarenamsg", arenamodel:calcurserverid(), msg)
skynet.send(".msgd", "lua", "sendarenamsg", arenamodel:calcurserverid(), msg)
return {c = "arena",m = "sendmsg", data = {errcode = 0, errmsg = "", data = {}}}
end
return arena