game_sync/worldsrv/transact_coinscenechange.go

169 lines
5.6 KiB
Go

package main
import (
"time"
"mongo.games.com/game/common"
"mongo.games.com/game/proto"
hall_proto "mongo.games.com/game/protocol/gamehall"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/transact"
"mongo.games.com/goserver/srvlib"
)
var CoinSceneChangeTimeOut = time.Second * 10
var CoinSceneChangeTransactParam int
type CoinSceneChangeCtx struct {
id int32
snid int32
sceneId int32
exclude []int32
isAudience bool
roomId string
isClub bool
clubId int32
}
type CoinSceneChangeTransactHandler struct {
}
func (this *CoinSceneChangeTransactHandler) OnExcute(tNode *transact.TransNode, ud interface{}) transact.TransExeResult {
logger.Logger.Trace("CoinSceneChangeTransactHandler.OnExcute ")
if ctx, ok := ud.(*CoinSceneChangeCtx); ok {
player := PlayerMgrSington.GetPlayerBySnId(ctx.snid)
if player != nil && player.scene != nil {
tnp := &transact.TransNodeParam{
Tt: common.TransType_CoinSceneChange,
Ot: transact.TransOwnerType(srvlib.GameServerType),
Oid: int(player.scene.gameSess.GetSrvId()),
AreaID: common.GetSelfAreaId(),
Tct: transact.TransactCommitPolicy_SelfDecide,
}
pack := &common.WGCoinSceneChange{
SnId: ctx.snid,
SceneId: ctx.sceneId,
}
tNode.TransEnv.SetField(CoinSceneChangeTransactParam, ud)
tNode.StartChildTrans(tnp, pack, CoinSceneChangeTimeOut)
}
}
return transact.TransExeResult_Success
}
func (this *CoinSceneChangeTransactHandler) OnCommit(tNode *transact.TransNode) transact.TransExeResult {
logger.Logger.Trace("CoinSceneChangeTransactHandler.OnCommit ")
ud := tNode.TransEnv.GetField(CoinSceneChangeTransactParam)
if ctx, ok := ud.(*CoinSceneChangeCtx); ok {
player := PlayerMgrSington.GetPlayerBySnId(ctx.snid)
if player != nil {
if ctx.isClub {
//ClubSceneMgrSington.ClearPlayerChanging(player)
} else {
CoinSceneMgrSingleton.ClearPlayerChanging(player)
}
op := common.CoinSceneOp_Change
if ctx.isAudience {
op = common.CoinSceneOp_AudienceChange
}
pack := &hall_proto.SCCoinSceneOp{
Id: proto.Int32(ctx.id),
OpType: proto.Int32(op),
OpParams: ctx.exclude,
}
//此处需要判定是否在线,异步后,可能玩家已经离线,无法再执行此操作了
if player.IsOnLine() == false {
pack := &hall_proto.SCLeaveRoom{
OpRetCode: hall_proto.OpResultCode_Game_OPRC_Sucess_Game,
RoomId: proto.Int32(ctx.sceneId),
}
proto.SetDefaults(pack)
player.SendToClient(int(hall_proto.GameHallPacketID_PACKET_SC_LEAVEROOM), pack)
return transact.TransExeResult_Success
}
var ret hall_proto.OpResultCode
if ctx.isAudience {
noother := false
ret = CoinSceneMgrSingleton.AudienceEnter(player, ctx.id, 0, ctx.exclude, true)
if ret != hall_proto.OpResultCode_OPRC_Sucess { //失败,还进当前桌
ret = CoinSceneMgrSingleton.AudienceEnter(player, ctx.id, 0, nil, true)
if ret == hall_proto.OpResultCode_OPRC_Sucess {
noother = true
}
}
if ret != hall_proto.OpResultCode_OPRC_Sucess { //失败,直接离场
pack := &hall_proto.SCLeaveRoom{
OpRetCode: hall_proto.OpResultCode_Game_OPRC_Sucess_Game,
RoomId: proto.Int32(ctx.sceneId),
}
proto.SetDefaults(pack)
player.SendToClient(int(hall_proto.GameHallPacketID_PACKET_SC_LEAVEROOM), pack)
}
if ret == hall_proto.OpResultCode_OPRC_Sucess && noother {
ret = hall_proto.OpResultCode_OPRC_NoOtherDownTiceRoom
}
} else {
if ctx.isClub {
//ret = ClubSceneMgrSington.ClubPlayerEnter(player, ctx.clubId, ctx.roomId, int(-1), "", true,
// int(ctx.sceneId))
} else {
ret = CoinSceneMgrSingleton.PlayerEnter(player, ctx.id, 0, ctx.exclude, true)
}
if !(ret == hall_proto.OpResultCode_OPRC_Sucess || ret == hall_proto.OpResultCode_OPRC_CoinSceneEnterQueueSucc) { //失败,直接离场
pack := &hall_proto.SCLeaveRoom{
OpRetCode: hall_proto.OpResultCode_Game_OPRC_Sucess_Game,
RoomId: proto.Int32(ctx.sceneId),
}
proto.SetDefaults(pack)
player.SendToClient(int(hall_proto.GameHallPacketID_PACKET_SC_LEAVEROOM), pack)
}
}
pack.OpCode = ret
proto.SetDefaults(pack)
player.SendToClient(int(hall_proto.CoinSceneGamePacketID_PACKET_SC_COINSCENE_OP), pack)
}
}
return transact.TransExeResult_Success
}
func (this *CoinSceneChangeTransactHandler) OnRollBack(tNode *transact.TransNode) transact.TransExeResult {
logger.Logger.Trace("CoinSceneChangeTransactHandler.OnRollBack ")
ud := tNode.TransEnv.GetField(CoinSceneChangeTransactParam)
if ctx, ok := ud.(*CoinSceneChangeCtx); ok {
player := PlayerMgrSington.GetPlayerBySnId(ctx.snid)
if player != nil {
if ctx.isClub {
//ClubSceneMgrSington.ClearPlayerChanging(player)
} else {
CoinSceneMgrSingleton.ClearPlayerChanging(player)
}
op := common.CoinSceneOp_Change
if ctx.isAudience {
op = common.CoinSceneOp_AudienceChange
}
pack := &hall_proto.SCCoinSceneOp{
Id: proto.Int32(ctx.id),
OpType: proto.Int32(op),
OpParams: ctx.exclude,
OpCode: hall_proto.OpResultCode_OPRC_CoinSceneYouAreGaming,
}
proto.SetDefaults(pack)
player.SendToClient(int(hall_proto.CoinSceneGamePacketID_PACKET_SC_COINSCENE_OP), pack)
}
}
return transact.TransExeResult_Success
}
func (this *CoinSceneChangeTransactHandler) OnChildTransRep(tNode *transact.TransNode, hChild transact.TransNodeID,
retCode int, ud interface{}) transact.TransExeResult {
logger.Logger.Trace("CoinSceneChangeTransactHandler.OnChildTransRep ")
return transact.TransExeResult_Success
}
func init() {
transact.RegisteHandler(common.TransType_CoinSceneChange, &CoinSceneChangeTransactHandler{})
}