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.

290 lines
10 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 friendmodel = require "friendmodel"
local taskmodel = require "taskmodel"
local settings = require "settings"
local bson = require "bson"
local mqhelper = require "mqhelper"
local mongohelper = require "mongohelper"
local dateutils = require "dateutils"
local artifactmodel = require "artifactmodel"
local artifactlogic = require "artifactlogic"
local saltpotlogic = require "saltpotlogic"
local coingetlogic = require "coingetlogic"
--客厅
local room = {}
function room.loadroom(cmd)
local mypot = skynet.call(".usercenterd", "lua", "getusersaltpot", UID)
local robpots = skynet.call(".usercenterd", "lua", "getuserrobsaltpots", UID)
return {c = "room",m = "loadroom", data = {errcode = 0, errmsg = "", data = { mypot=mypot, robpots=robpots}}}
end
--加载战报
function room.loadmail(cmd)
local mails = skynet.call(".maild", "lua", "loadroommail", UID)
return {c = "room",m = "loadmail",data = {errcode = 0, errmsg = "", data = { mails = mails}}}
end
--加载好友
function room.loadfriend(cmd)
local friends = friendmodel:serialize()
local ids = {}
for i,v in ipairs(friends) do
table.insert(ids, v.friendid)
end
local list = skynet.call(".usercenterd", "lua", "getsaltpotlist", ids) --获取盐罐信息
local function getuser(userid, list)
for i,v in ipairs(list) do
if v.uid == userid then
return v
end
end
end
for i,v in ipairs(friends) do
local ret = getuser(v.friendid, list)
if ret then
v.saltpot = ret.saltpot
v.owner = ret.owner
end
end
return {c = "room",m = "loadfriend",data = {errcode = 0, errmsg = "", data = { friends=friends }}}
end
--加载排行榜
function room.loadrank(cmd)
local rank = skynet.call(".usercenterd", "lua", "getsaltpotrank", UID)
return {c = "room",m = "loadrank",data = {errcode = 0, errmsg = "", data = { rank=rank }}}
end
--占领盐罐
function room.robsaltpot(cmd)
local userid = cmd.data.userid
local lineup = cmd.data.lineup --{{heroid=heroid, pos=1}, {heroid=heroid, pos=1}}
if not userid or not lineup or #lineup <= 0 then
return {c = "room",m = "robsaltpot",data = {errcode = 10001,errmsg = "请求异常,请稍后再试", data = { }}}
end
local n = skynet.call(".roomd", "lua", "getsaltpotnum", UID)
if #n >= 3 then
return {c = "room",m = "robsaltpot",data = {errcode = 10002,errmsg = "最多占领3个盐罐", data = { }}}
end
userid = math.floor(userid)
local pot = skynet.call(".usercenterd", "lua", "getusersaltpot", userid)
if not pot then
return {c = "room",m = "robsaltpot",data = {errcode = 10003,errmsg = "不存在的盐罐", data = { }}}
end
local robpots = skynet.call(".roomd", "lua", "getsaltpotlist", UID)
for k, v in pairs(robpots) do
local d = cjson.decode(k)
if checkint(d.level) == pot.level then
return {c = "room",m = "robsaltpot",data = {errcode = 10004,errmsg = "已经占领过这种类型的罐子", data = { }}}
end
end
local lineuped = {}
for k, v in pairs(robpots) do
local d = cjson.decode(k)
for _, v1 in ipairs(d.lineup) do
table.insert(lineuped, v1.heroid)
end
end
local function checkhero(heroid, lineuped)
for _, hid in ipairs(lineuped) do
if hid == heroid then
return true
end
end
return false
end
for _,v in ipairs(lineup) do
if checkhero(v.heroid, lineuped) then
return {c = "room",m = "robsaltpot",data = {errcode = 10005,errmsg = "防守武将设置失败, 请勿重复设置", data = { }}}
end
end
local num = skynet.call(".roomd", "lua", "incrrobnum", UID)
if num > 10 then
return {c = "room",m = "robsaltpot",data = {errcode = 10006,errmsg = "盐罐已达上限", data = { }}}
end
local t = saltpotlogic.gettime(checkint(pot.level), num)
local ok = skynet.call(".usercenterd", "lua", "robsaltpot", UID, userid, lineup, t)
local ok = skynet.call(".roomd", "lua", "robsaltpot", UID, cjson.encode({userid=userid, level=level, lineup=lineup}), os.time()+t)
if pot.rob_id > 0 then
skynet.call(".roomd", "lua", "removesaltpot", pot.rob_id, cjson.encode({userid=pot.rob_id, level=pot.level, lineup=pot.rob_lineup}))
--TODO 发送一个邮件
end
return {c = "room",m = "robsaltpot",data = {errcode = 0, errmsg = "", data = { }}}
end
--收集盐罐
function room.collectsaltpot(cmd)
local level = cmd.data.level
if not level then
return {c = "room",m = "collectsaltpot",data = {errcode = 10001,errmsg = "请求异常,请稍后再试", data = { }}}
end
level = math.floor(level)
local found = false
local robpots = skynet.call(".roomd", "lua", "getsaltpotlist", UID)
local member
for k, v in pairs(robpots) do
local d = cjson.decode(k)
if checkint(d.level) == pot.level then
found = true
member = k
break
end
end
if not found then
return {c = "room",m = "collectsaltpot",data = {errcode = 10003,errmsg = "未占领该等级的盐罐", data = { }}}
end
local ok = skynet.call(".usercenterd", "lua", "collectsaltpot", UID, level)
assert(ok=="ok", "收集盐罐失败")
skynet.call(".roomd", "lua", "removesaltpot", UID, member)
--TODO 发送一个邮件
local coin = coingetlogic.getcoingetnum(usermodel.max_level)
--TODO 计算奖励
local rewards = saltpotlogic.getrewards(level)
local param = {}
for i,v in ipairs(rewards) do
if v.key == "coin" then
v.count = v.value * coin
param[v.key] = param[v.key] or 0
param[v.key] = param[v.key] + v.count
else
param[v.key] = param[v.key] or 0
param[v.key] = param[v.key] + v.value
end
end
bagmodel:incrBagB(param)
taskmodel:addtasknum(10, 1)
return {c = "room",m = "collectsaltpot",data = {errcode = 0,errmsg = "", data = { rewards = rewards }}}
end
--鱼灵升星
function room.qistarup(cmd)
local id = cmd.data.id
if not id then
return {c = "room",m = "qistarup",data = {errcode = 10001,errmsg = "请求异常,请稍后再试", data = { }}}
end
if not artifactmodel:checkstarup(id) then
return {c = "room",m = "qistarup",data = {errcode = 10002,errmsg = "无法升星", data = { }}}
end
artifactmodel:starup(id)
return {c = "room",m = "qistarup",data = {errcode = 0,data = {}}}
end
--钓鱼
function room.fishing(cmd)
local lv = cmd.data.lv
local num = cmd.data.num
if not lv or not num then
return {c = "room",m = "fishing", data = {errcode = 10001, errmsg = "请求异常", data = { }}}
end
lv = math.floor(lv)
num = math.floor(num)
if lv ~= 1 or num > 1 or not usermodel:checkfishing() then
if bagmodel:getyugannum(lv) < num then
return {c = "room",m = "fishing", data = {errcode = 10001, errmsg = "资源不足", data = { }}}
end
end
local rewards = artifactlogic.fishing(lv, num, usermodel:getfishingnum(lv))
if #rewards <= 0 then
return {c = "room",m = "fishing", data = {errcode = 10002, errmsg = "捕获失败", data = { }}}
end
local param = {}
for i,v in ipairs(rewards) do
if v.tp == "qi" then
local art = {}
art.artid = v.id
artifactmodel:add(art)
v.id = artifactmodel:getid(v.id, 1)
else
param[v.id] = param[v.id] or 0
param[v.id] = param[v.id] + 1
end
end
if lv == 1 and num == 1 and usermodel:checkfishing() then
usermodel:updatefishingtime()
else
bagmodel:decrBagA("yugan_lv"..lv, num)
end
if #table.keys(param) > 0 then
bagmodel:incrBagB(param)
end
bagmodel:save2log(param, "捕获成功")
usermodel:incrfishingnum(lv, num)
if lv == 1 then
usermodel:incrfishingscore(num)
-- local s = usermodel.fishing_score%20
-- if s == 0 then
-- bagmodel:incrBagA("yugan_lv2", 1)
-- end
end
return {c = "room",m = "fishing", data = {errcode = 0, errmsg = "", data = { rewards = rewards }}}
end
function room.receiveyuguan(cmd)
local score = usermodel.fishing_score
if score < 20 then
return {c = "room",m = "receiveyuguan", data = {errcode = 10001, errmsg = "积分不足", data = { }}}
end
local n = math.floor(score/20)
if n <= 0 then
return {c = "room",m = "receiveyuguan", data = {errcode = 10002, errmsg = "积分不足", data = { }}}
end
usermodel:decrfishingscore(n)
bagmodel:incrBagA("yugan_lv2", n)
return {c = "room",m = "receiveyuguan", data = {errcode = 0, errmsg = "", data = { }}}
end
--挑战
function room.battle(cmd)
local userid = cmd.data.userid
local tp = cmd.data.tp
if not userid or not tp then
return {c = "room",m = "battle", data = {errcode = 10001, errmsg = "请求异常", data = { }}}
end
local my = skynet.call(".usercenterd", "lua", "getuserbyid", UID)
local user = skynet.call(".usercenterd", "lua", "getuserbyid", userid)
local ownerid = skynet.call(".usercenterd", "lua", "getuserowner", userid)
if ownerid > 0 then
local owner = skynet.call(".usercenterd", "lua", "getuserbyid", ownerid)
skynet.send(".roomd", "lua", "sendcombatreport2myself", tp, my, user, owner) --发送战报
skynet.send(".roomd", "lua", "sendcombatreport2user", tp, my, user, owner)
skynet.send(".roomd", "lua", "sendcombatreportowner", tp, my, user, owner)
else
skynet.send(".roomd", "lua", "sendcombatreport2myself", tp, my, user) --发送战报
skynet.send(".roomd", "lua", "sendcombatreport2user", tp, my, user)
end
if tp == "success" then
skynet.call(".usercenterd", "lua", "updateowner", UID, userid)
end
return {c = "room",m = "battle", data = {errcode = 0, errmsg = "", data = { }}}
end
return room