game_sync/worldsrv/actsignmgr.go

164 lines
4.5 KiB
Go

package main
import (
"github.com/globalsign/mgo"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
"mongo.games.com/game/protocol/activity"
"mongo.games.com/game/protocol/server"
"mongo.games.com/game/srvdata"
"mongo.games.com/goserver/core/logger"
"strconv"
"time"
)
var ActSignMgrSington = &ActSignMgr{
SignConfigs: make(map[int]*server.DB_ActSign),
}
type ActSignMgr struct {
SignConfigs map[int]*server.DB_ActSign
}
func (this *ActSignMgr) Init() {
if this.SignConfigs == nil {
this.SignConfigs = make(map[int]*server.DB_ActSign)
}
for _, v := range srvdata.PBDB_ActSignMgr.Datas.GetArr() {
this.SignConfigs[int(v.Id)] = v
}
}
func (this *ActSignMgr) GetConfig(id int) *server.DB_ActSign {
signConfig, ok := this.SignConfigs[id]
if ok {
return signConfig
}
return nil
}
func (this *ActSignMgr) OnPlayerLogin(player *Player) error {
return this.RefixedPlayerData(player)
}
func (this *ActSignMgr) OnDayChanged(player *Player) error {
//跨天不需要
//this.RefixedPlayerData(player)
//this.SendSignDataToPlayer(player)
return nil
}
func (this *ActSignMgr) RefixedPlayerData(player *Player) error {
if player.IsRob {
return nil
}
if player.SignData == nil {
player.SignData = &model.SignData{
SignIndex: 0,
LastSignTickets: 0,
}
}
return nil
}
func (this *ActSignMgr) SendSignDataToPlayer(player *Player) {
if player.IsRob {
return
}
pack := &activity.SCSignData{}
//已经领取第几个
pack.SignCount = proto.Int(player.SignData.SignIndex)
if player.SignData.LastSignTickets != 0 {
lastSignTime := time.Unix(player.SignData.LastSignTickets, 0)
dayDiff := int32(common.DiffDay(time.Now(), lastSignTime))
if dayDiff == 0 {
pack.TodaySign = proto.Int32(1)
} else {
pack.TodaySign = proto.Int32(0)
}
} else {
pack.TodaySign = proto.Int32(0)
}
proto.SetDefaults(pack)
player.SendToClient(int(activity.ActSignPacketID_PACKET_SCSignData), pack)
logger.Logger.Trace("SCSignData: ", pack)
}
func (this *ActSignMgr) CanSign(player *Player, signIndex int) activity.OpResultCode_ActSign {
signConfig := this.GetConfig(signIndex)
if signConfig == nil {
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Error
}
if player.SignData.LastSignTickets != 0 {
lastSignTime := time.Unix(player.SignData.LastSignTickets, 0)
dayDiff := int32(common.DiffDay(time.Now(), lastSignTime))
if dayDiff == 0 {
if player.SignData.SignIndex == signIndex {
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Repeat
} else {
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Config_Day_Error
}
}
if player.SignData.SignIndex != (signIndex - 1) {
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Config_Day_Error
}
} else {
if signIndex != 1 {
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Config_Day_Error
}
}
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Sucess
}
func (this *ActSignMgr) Sign(player *Player, signIndex int, signType int32) activity.OpResultCode_ActSign {
errCode := this.CanSign(player, signIndex)
if errCode != activity.OpResultCode_ActSign_OPRC_Activity_Sign_Sucess {
return errCode
}
signConfig := this.GetConfig(signIndex)
if signConfig == nil {
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Error
}
player.SignData.LastSignTickets = time.Now().Unix()
player.SignData.SignIndex = signIndex
logger.Logger.Info("签到成功: ", signConfig)
grade := signConfig.Grade
switch signType {
case 0: //普通签到
case 1: //双倍签到
grade *= 2
}
switch signConfig.Type {
case 1: //金币
player.AddCoin(int64(grade), 0, common.GainWay_ActSign, strconv.Itoa(signIndex), time.Now().Format("2006-01-02 15:04:05"))
case 2: //钻石
player.AddDiamond(int64(grade), 0, common.GainWay_ActSign, strconv.Itoa(signIndex), time.Now().Format("2006-01-02 15:04:05"))
case 3: //道具
item := &Item{
ItemId: signConfig.Item_Id,
ItemNum: int64(grade),
}
BagMgrSingleton.AddJybBagInfo(player, []*Item{item}, 0, common.GainWay_ActSign, strconv.Itoa(signIndex), time.Now().Format("2006-01-02 15:04:05"))
data := srvdata.PBDB_GameItemMgr.GetData(item.ItemId)
if data != nil {
BagMgrSingleton.RecordItemLog(player.Platform, player.SnId, ItemObtain, item.ItemId, data.Name, item.ItemNum, "14日签到获得")
}
}
return activity.OpResultCode_ActSign_OPRC_Activity_Sign_Sucess
}
func init() {
mgo.SetStats(true)
RegisterParallelLoadFunc("14日签到", func() error {
ActSignMgrSington.Init()
return nil
})
}