game_sync/worldsrv/action_hundredscene.go

489 lines
19 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"mongo.games.com/game/common"
"mongo.games.com/game/proto"
"mongo.games.com/game/protocol/gamehall"
"mongo.games.com/game/srvdata"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"time"
)
type CSHundredSceneGetPlayerNumPacketFactory struct {
}
type CSHundredSceneGetPlayerNumHandler struct {
}
func (this *CSHundredSceneGetPlayerNumPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSHundredSceneGetPlayerNum{}
return pack
}
func (this *CSHundredSceneGetPlayerNumHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSHundredSceneGetPlayerNumHandler Process recv ", data)
if msg, ok := data.(*gamehall.CSHundredSceneGetPlayerNum); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p != nil {
nums := HundredSceneMgrSington.GetPlayerNums(p, msg.GetGameId(), msg.GetGameModel())
pack := &gamehall.SCHundredSceneGetPlayerNum{
Nums: nums,
}
proto.SetDefaults(pack)
p.SendToClient(int(gamehall.HundredScenePacketID_PACKET_SC_HUNDREDSCENE_GETPLAYERNUM), pack)
logger.Logger.Trace("SCHundredSceneGetPlayerNum:", pack)
}
}
return nil
}
type CSHundredSceneOpPacketFactory struct {
}
type CSHundredSceneOpHandler struct {
}
func (this *CSHundredSceneOpPacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSHundredSceneOp{}
return pack
}
func (this *CSHundredSceneOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSHundredSceneOpHandler Process recv ", data)
if msg, ok := data.(*gamehall.CSHundredSceneOp); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p != nil {
var ret gamehall.OpResultCode_Hundred
pack := &gamehall.SCHundredSceneOp{
Id: msg.Id,
OpType: msg.OpType,
}
oldPlatform := p.Platform
switch msg.GetOpType() {
case HundredSceneOp_Enter:
//pt := PlatformMgrSingleton.GetPackageTag(p.PackageID)
//if pt != nil && pt.IsForceBind == 1 {
// if p.BeUnderAgentCode == "" || p.BeUnderAgentCode == "0" {
// ret = gamehall.OpResultCode_Hundred_OPRC_MustBindPromoter_Hundred
// goto done
// }
//}
if p.scene != nil {
logger.Logger.Warnf("CSHundredSceneOpHandler CoinSceneOp_Enter found snid:%v had in scene:%v gameid:%v", p.SnId, p.scene.sceneId, p.scene.gameId)
p.ReturnScene(false)
return nil
}
dbGameFree := srvdata.PBDB_GameFreeMgr.GetData(msg.GetId())
gameId := dbGameFree.GetGameId()
var roomId int32
params := msg.GetOpParams()
if len(params) != 0 {
roomId = params[0]
name, ok := HundredSceneMgrSington.GetPlatformNameBySceneId(roomId)
if p.IsRob {
//机器人先伪装成对应平台的用户
if ok {
p.Platform = name
}
} else if p.GMLevel > 0 && p.Platform == name { //允许GM直接按房间ID进场
roomId = params[0]
}
}
//检测房间状态是否开启
gps := PlatformMgrSingleton.GetGameFree(p.Platform, msg.GetId())
if gps == nil {
ret = gamehall.OpResultCode_Hundred_OPRC_RoomHadClosed_Hundred
goto done
}
dbGameFree = gps.DbGameFree
if len(params) != 0 && p.GMLevel > 0 { //允许GM直接按房间ID进场
s := SceneMgrSingleton.GetScene(int(params[0]))
if s != nil {
if s.limitPlatform.IdStr == p.Platform || (gps.GroupId != 0 && s.groupId == gps.GroupId) {
roomId = params[0]
}
}
}
if dbGameFree == nil {
ret = gamehall.OpResultCode_Hundred_OPRC_RoomHadClosed_Hundred
goto done
}
if dbGameFree.GetLimitCoin() != 0 && int64(dbGameFree.GetLimitCoin()) > p.Coin {
ret = gamehall.OpResultCode_Hundred_OPRC_CoinNotEnough_Hundred
goto done
}
if dbGameFree.GetMaxCoinLimit() != 0 && int64(dbGameFree.GetMaxCoinLimit()) < p.Coin && !p.IsRob {
ret = gamehall.OpResultCode_Hundred_OPRC_CoinTooMore_Hundred
goto done
}
//检查游戏次数限制
if !p.IsRob {
//todayData, _ := p.GetDaliyGameData(int(dbGameFree.GetId()))
//if dbGameFree.GetPlayNumLimit() != 0 &&
// todayData != nil &&
// todayData.GameTimes >= int64(dbGameFree.GetPlayNumLimit()) {
// ret = gamehall.OpResultCode_Hundred_OPRC_RoomGameTimes_Hundred
// goto done
//}
}
gameVers := srvdata.GetGameVers(p.PackageID)
if gameVers != nil {
if ver, ok := gameVers[fmt.Sprintf("%v,%v", gameId, p.Channel)]; ok {
pack.MinApkVer = proto.Int32(ver.MinApkVer)
pack.MinResVer = proto.Int32(ver.MinResVer)
pack.LatestApkVer = proto.Int32(ver.LatestApkVer)
pack.LatestResVer = proto.Int32(ver.LatestResVer)
if msg.GetApkVer() < ver.MinApkVer {
ret = gamehall.OpResultCode_Hundred_OPRC_YourAppVerIsLow_Hundred
goto done
}
if msg.GetResVer() < ver.MinResVer {
ret = gamehall.OpResultCode_Hundred_OPRC_YourResVerIsLow_Hundred
goto done
}
}
}
ret = HundredSceneMgrSington.PlayerEnter(p, msg.GetId())
if p.scene != nil {
pack.OpParams = append(pack.OpParams, msg.GetId())
//TODO 有房间还进入失败尝试returnroom
if ret != gamehall.OpResultCode_Hundred_OPRC_Sucess_Hundred {
p.ReturnScene(false)
return nil
}
}
case HundredSceneOp_Leave:
ret = HundredSceneMgrSington.PlayerTryLeave(p)
case HundredSceneOp_Change:
/*var exclude int32
if p.scene != nil {
exclude = int32(p.scene.sceneId)
}
params := msg.GetOpParams()
if len(params) != 0 {
exclude = params[0]
}
if HundredSceneMgrSington.PlayerInChanging(p) { //换桌中
return nil
}
ret = HundredSceneMgrSington.PlayerTryChange(p, msg.GetId(), exclude)*/
}
done:
//机器人要避免身上的平台标记被污染
if p.IsRob {
if ret != gamehall.OpResultCode_Hundred_OPRC_Sucess_Hundred {
p.Platform = oldPlatform
}
}
pack.OpCode = ret
proto.SetDefaults(pack)
p.SendToClient(int(gamehall.HundredScenePacketID_PACKET_SC_HUNDREDSCENE_OP), pack)
//}
//if msg.GetOpType() == common.CoinSceneOp_Enter && ret == gamehall.OpResultCode_Hundred_OPRC_Sucess_Hundred && p.scene != nil {
// gameName := p.scene.dbGameFree.GetName() + p.scene.dbGameFree.GetTitle()
// ActMonitorMgrSington.SendActMonitorEvent(ActState_Game, p.SnId, p.Name, p.Platform,
// 0, 0, gameName, 0)
//}
}
}
return nil
}
type CSGameObservePacketFactory struct {
}
type CSGameObserveHandler struct {
}
func (this *CSGameObservePacketFactory) CreatePacket() interface{} {
pack := &gamehall.CSGameObserve{}
return pack
}
func (this *CSGameObserveHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSGameObserveHandler Process recv ", data)
if msg, ok := data.(*gamehall.CSGameObserve); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p != nil {
if msg.GetStartOrEnd() {
gameStateMgr.PlayerRegiste(p, msg.GetGameId(), msg.GetStartOrEnd())
pack := &gamehall.SCGameSubList{}
statePack := &gamehall.SCGameState{}
scenes := HundredSceneMgrSington.GetPlatformScene(p.Platform, msg.GetGameId())
for _, value := range scenes {
pack.List = append(pack.List, &gamehall.GameSubRecord{
GameFreeId: proto.Int32(value.dbGameFree.GetId()),
NewLog: proto.Int32(-1),
LogCnt: proto.Int(len(value.GameLog)),
TotleLog: value.GameLog,
})
leftTime := int64(value.StateSec) - (time.Now().Unix() - value.StateTs)
if leftTime < 0 {
leftTime = 0
}
statePack.List = append(statePack.List, &gamehall.GameState{
GameFreeId: proto.Int32(value.dbGameFree.GetId()),
Ts: proto.Int64(leftTime),
Sec: proto.Int32(value.StateSec),
})
}
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_GAMESUBLIST), pack)
logger.Logger.Trace("SCGameSubList:", pack)
p.SendToClient(int(gamehall.GameHallPacketID_PACKET_SC_GAMESTATE), statePack)
logger.Logger.Trace("SCGameState:", statePack)
} else {
gameStateMgr.PlayerClear(p)
}
}
}
return nil
}
//type CSHundredSceneGetGameJackpotPacketFactory struct {
//}
//type CSHundredSceneGetGameJackpotHandler struct {
//}
//
//func (this *CSHundredSceneGetGameJackpotPacketFactory) CreatePacket() interface{} {
// pack := &gamehall.CSHundredSceneGetPlayerNum{}
// return pack
//}
//
//func (this *CSHundredSceneGetGameJackpotHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
// logger.Logger.Trace("CSHundredSceneGetGameJackpotHandler Process recv ", data)
// if _, ok := data.(*gamehall.CSHundredSceneGetPlayerNum); ok {
// p := PlayerMgrSington.GetPlayer(sid)
// if p != nil {
// //gameid := int(msg.GetGameId())
// //// 冰河世纪, 百战成神, 财神, 复仇者联盟, 复活岛
// //if gameid == common.GameId_IceAge || gameid == common.GameId_TamQuoc || gameid == common.GameId_CaiShen ||
// // gameid == common.GameId_Avengers || gameid == common.GameId_EasterIsland {
// // gameStateMgr.PlayerRegiste(p, msg.GetGameId(), true)
// // pack := &gamehall.SCHundredSceneGetGameJackpot{}
// // scenes := HundredSceneMgrSington.GetPlatformScene(p.Platform, msg.GetGameId())
// // for _, v := range scenes {
// // jpfi := &gamehall.GameJackpotFundInfo{
// // GameFreeId: proto.Int32(v.dbGameFree.GetId()),
// // JackPotFund: proto.Int64(v.JackPotFund),
// // }
// // pack.GameJackpotFund = append(pack.GameJackpotFund, jpfi)
// // }
// // proto.SetDefaults(pack)
// // p.SendToClient(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEJACKPOT), pack)
// // logger.Logger.Trace("SCHundredSceneGetGameJackpot:", pack)
// //}
// }
// }
// return nil
//}
//
//type CSHundredSceneGetGameHistoryInfoPacketFactory struct {
//}
//type CSHundredSceneGetGameHistoryInfoHandler struct {
//}
//
//func (this *CSHundredSceneGetGameHistoryInfoPacketFactory) CreatePacket() interface{} {
// pack := &gamehall.CSHundredSceneGetHistoryInfo{}
// return pack
//}
//
//func (this *CSHundredSceneGetGameHistoryInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
// logger.Logger.Trace("World CSHundredSceneGetGameHistoryInfoHandler Process recv ", data)
// if msg, ok := data.(*gamehall.CSHundredSceneGetHistoryInfo); ok {
// gameid := int(msg.GetGameId())
// historyModel := msg.GetGameHistoryModel()
// p := PlayerMgrSington.GetPlayer(sid)
// if p != nil {
// switch historyModel {
// case PLAYER_HISTORY_MODEL: // 历史记录
// task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
// var genPlayerHistoryInfo = func(spinID string, isFree bool, createdTime, totalBetValue, totalPriceValue, totalBonusValue, multiple int64, player *gamehall.PlayerHistoryInfo) {
// player.SpinID = proto.String(spinID)
// player.CreatedTime = proto.Int64(createdTime)
// player.TotalBetValue = proto.Int64(totalBetValue)
// player.TotalPriceValue = proto.Int64(totalPriceValue)
// player.IsFree = proto.Bool(isFree)
// player.TotalBonusValue = proto.Int64(totalBonusValue)
// player.Multiple = proto.Int64(multiple)
// }
//
// var genPlayerHistoryInfoMsg = func(spinid string, v *model.NeedGameRecord, gdl *model.GameDetailedLog, player *gamehall.PlayerHistoryInfo) {
// switch gameid {
// //case common.GameId_IceAge:
// // data, err := model.UnMarshalIceAgeGameNote(gdl.GameDetailedNote)
// // if err != nil {
// // logger.Logger.Errorf("World UnMarshalIceAgeGameNote error:%v", err)
// // }
// // gnd := data.(*model.IceAgeType)
// // genPlayerHistoryInfo(spinid, gnd.IsFree, int64(v.Ts), int64(gnd.Score), gnd.TotalPriceValue, gnd.TotalBonusValue, player)
// //case common.GameId_TamQuoc:
// // data, err := model.UnMarshalTamQuocGameNote(gdl.GameDetailedNote)
// // if err != nil {
// // logger.Logger.Errorf("World UnMarshalTamQuocGameNote error:%v", err)
// // }
// // gnd := data.(*model.TamQuocType)
// // genPlayerHistoryInfo(spinid, gnd.IsFree, int64(v.Ts), int64(gnd.Score), gnd.TotalPriceValue, gnd.TotalBonusValue, player)
// //case common.GameId_CaiShen:
// // data, err := model.UnMarshalCaiShenGameNote(gdl.GameDetailedNote)
// // if err != nil {
// // logger.Logger.Errorf("World UnMarshalCaiShenGameNote error:%v", err)
// // }
// // gnd := data.(*model.CaiShenType)
// // genPlayerHistoryInfo(spinid, gnd.IsFree, int64(v.Ts), int64(gnd.Score), gnd.TotalPriceValue, gnd.TotalBonusValue, player)
// case common.GameId_Crash:
// data, err := model.UnMarshalGameNoteByHUNDRED(gdl.GameDetailedNote)
// if err != nil {
// logger.Logger.Errorf("World UnMarshalAvengersGameNote error:%v", err)
// }
// jsonString, _ := json.Marshal(data)
//
// // convert json to struct
// gnd := model.CrashType{}
// json.Unmarshal(jsonString, &gnd)
//
// //gnd := data.(*model.CrashType)
// for _, curplayer := range gnd.PlayerData {
// if curplayer.UserId == p.SnId {
// genPlayerHistoryInfo(spinid, false, int64(v.Ts), int64(curplayer.UserBetTotal), curplayer.ChangeCoin, 0, int64(curplayer.UserMultiple), player)
// break
// }
// }
// case common.GameId_Avengers:
// data, err := model.UnMarshalAvengersGameNote(gdl.GameDetailedNote)
// if err != nil {
// logger.Logger.Errorf("World UnMarshalAvengersGameNote error:%v", err)
// }
// gnd := data.(*model.GameResultLog)
// genPlayerHistoryInfo(spinid, gnd.BaseResult.IsFree, int64(v.Ts), int64(gnd.BaseResult.TotalBet), gnd.BaseResult.WinTotal, gnd.BaseResult.WinSmallGame, 0, player)
// //case common.GameId_EasterIsland:
// // data, err := model.UnMarshalEasterIslandGameNote(gdl.GameDetailedNote)
// // if err != nil {
// // logger.Logger.Errorf("World UnMarshalEasterIslandGameNote error:%v", err)
// // }
// // gnd := data.(*model.EasterIslandType)
// // genPlayerHistoryInfo(spinid, gnd.IsFree, int64(v.Ts), int64(gnd.Score), gnd.TotalPriceValue, gnd.TotalBonusValue, player)
// default:
// logger.Logger.Errorf("World CSHundredSceneGetGameHistoryInfoHandler receive gameid(%v) error", gameid)
// }
// }
//
// gameclass := int32(2)
// spinid := strconv.FormatInt(int64(p.SnId), 10)
// dbGameFrees := srvdata.PBDB_GameFreeMgr.Datas.Arr //.GetData(data.DbGameFree.Id)
// roomtype := int32(0)
// for _, v := range dbGameFrees {
// if int32(gameid) == v.GetGameId() {
// gameclass = v.GetGameClass()
// roomtype = v.GetSceneType()
// break
// }
// }
//
// gpl := model.GetPlayerListByHallEx(p.SnId, p.Platform, 0, 50, 0, 0, roomtype, gameclass, gameid)
// pack := &gamehall.SCPlayerHistory{}
// for _, v := range gpl.Data {
// if v.GameDetailedLogId == "" {
// logger.Logger.Error("World PlayerHistory GameDetailedLogId is nil")
// break
// }
// gdl := model.GetPlayerHistory(p.Platform, v.GameDetailedLogId)
// player := &gamehall.PlayerHistoryInfo{}
// genPlayerHistoryInfoMsg(spinid, v, gdl, player)
// pack.PlayerHistory = append(pack.PlayerHistory, player)
// }
// proto.SetDefaults(pack)
// logger.Logger.Infof("World gameid:%v PlayerHistory:%v ", gameid, pack)
// return pack
// }), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
// if data == nil {
// logger.Logger.Error("World PlayerHistory data is nil")
// return
// }
// p.SendToClient(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEPLAYERHISTORY), data)
// }), "CSGetPlayerHistoryHandlerWorld").Start()
// case BIGWIN_HISTORY_MODEL: // 爆奖记录
// jackpotList := JackpotListMgrSington.GetJackpotList(gameid)
// //if len(jackpotList) < 1 {
// // JackpotListMgrSington.GenJackpot(gameid) // 初始化爆奖记录
// // JackpotListMgrSington.after(gameid) // 开启定时器
// // jackpotList = JackpotListMgrSington.GetJackpotList(gameid)
// //}
// pack := JackpotListMgrSington.GetStoCMsg(jackpotList)
// pack.GameId = msg.GetGameId()
// logger.Logger.Infof("World BigWinHistory: %v %v", gameid, pack)
// p.SendToClient(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEBIGWINHISTORY), pack)
// case GAME_HISTORY_MODEL:
// task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
// var genGameHistoryInfo = func(gameNumber string, createdTime, multiple int64, hash string, gamehistory *gamehall.GameHistoryInfo) {
// gamehistory.GameNumber = proto.String(gameNumber)
// gamehistory.CreatedTime = proto.Int64(createdTime)
// gamehistory.Hash = proto.String(hash)
// gamehistory.Multiple = proto.Int64(multiple)
// }
//
// gls := model.GetAllGameDetailedLogsByGameIdAndTs(p.Platform, gameid, 20)
//
// pack := &gamehall.SCPlayerHistory{}
// for _, v := range gls {
//
// gamehistory := &gamehall.GameHistoryInfo{}
//
// data, err := model.UnMarshalGameNoteByHUNDRED(v.GameDetailedNote)
// if err != nil {
// logger.Logger.Errorf("World UnMarshalAvengersGameNote error:%v", err)
// }
// jsonString, _ := json.Marshal(data)
//
// // convert json to struct
// gnd := model.CrashType{}
// json.Unmarshal(jsonString, &gnd)
//
// genGameHistoryInfo(v.LogId, int64(v.Ts), int64(gnd.Rate), gnd.Hash, gamehistory)
// pack.GameHistory = append(pack.GameHistory, gamehistory)
// }
// proto.SetDefaults(pack)
// logger.Logger.Infof("World gameid:%v History:%v ", gameid, pack)
// return pack
// }), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
// if data == nil {
// logger.Logger.Error("World GameHistory data is nil")
// return
// }
// p.SendToClient(int(gamehall.HundredScenePacketID_PACKET_SC_GAMEPLAYERHISTORY), data)
// }), "CSGetGameHistoryHandlerWorld").Start()
// default:
// logger.Logger.Errorf("World CSHundredSceneGetGameHistoryInfoHandler receive historyModel(%v) error", historyModel)
// }
// }
// }
// return nil
//}
func init() {
common.RegisterHandler(int(gamehall.HundredScenePacketID_PACKET_CS_HUNDREDSCENE_GETPLAYERNUM), &CSHundredSceneGetPlayerNumHandler{})
netlib.RegisterFactory(int(gamehall.HundredScenePacketID_PACKET_CS_HUNDREDSCENE_GETPLAYERNUM), &CSHundredSceneGetPlayerNumPacketFactory{})
common.RegisterHandler(int(gamehall.HundredScenePacketID_PACKET_CS_HUNDREDSCENE_OP), &CSHundredSceneOpHandler{})
netlib.RegisterFactory(int(gamehall.HundredScenePacketID_PACKET_CS_HUNDREDSCENE_OP), &CSHundredSceneOpPacketFactory{})
//请求游戏列表
common.RegisterHandler(int(gamehall.GameHallPacketID_PACKET_CS_GAMEOBSERVE), &CSGameObserveHandler{})
netlib.RegisterFactory(int(gamehall.GameHallPacketID_PACKET_CS_GAMEOBSERVE), &CSGameObservePacketFactory{})
//// 请求奖池信息
//common.RegisterHandler(int(gamehall.HundredScenePacketID_PACKET_CS_GAMEJACKPOT), &CSHundredSceneGetGameJackpotHandler{})
//netlib.RegisterFactory(int(gamehall.HundredScenePacketID_PACKET_CS_GAMEJACKPOT), &CSHundredSceneGetGameJackpotPacketFactory{})
////// 请求历史记录和爆奖记录
//common.RegisterHandler(int(gamehall.HundredScenePacketID_PACKET_CS_GAMEHISTORYINFO), &CSHundredSceneGetGameHistoryInfoHandler{})
//netlib.RegisterFactory(int(gamehall.HundredScenePacketID_PACKET_CS_GAMEHISTORYINFO), &CSHundredSceneGetGameHistoryInfoPacketFactory{})
}