game_sync/worldsrv/transact_addcoin.go

123 lines
3.6 KiB
Go

package main
import (
"time"
"mongo.games.com/game/common"
"mongo.games.com/goserver/core"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/transact"
"mongo.games.com/goserver/srvlib"
)
var TransAddCoinTimeOut = time.Second * 30
const (
TRANSACT_ADDCOIN_CTX = iota
)
type AsyncAddCoinTransactContext struct {
p *Player
coin int64
gainWay int32
oper string
remark string
broadcast bool
writeLog bool
retryCnt int
}
type AddCoinTransactHandler struct {
}
func (this *AddCoinTransactHandler) OnExcute(tNode *transact.TransNode, ud interface{}) transact.TransExeResult {
logger.Logger.Trace("AddCoinTransactHandler.OnExcute ")
if ctx, ok := ud.(*AsyncAddCoinTransactContext); ok {
if ctx.p != nil && ctx.p.scene != nil {
pack := &common.WGAddCoin{
SnId: ctx.p.SnId,
Coin: ctx.coin,
GainWay: ctx.gainWay,
Oper: ctx.oper,
Remark: ctx.remark,
Broadcast: ctx.broadcast,
WriteLog: ctx.writeLog,
}
tnp := &transact.TransNodeParam{
Tt: common.TransTypeAddCoin,
Ot: transact.TransOwnerType(srvlib.GameServerType),
Oid: int(ctx.p.scene.gameSess.GetSrvId()),
AreaID: common.GetSelfAreaId(),
Tct: transact.TransactCommitPolicy_TwoPhase,
}
tNode.TransEnv.SetField(TRANSACT_ADDCOIN_CTX, ud)
tNode.StartChildTrans(tnp, pack, TransAddCoinTimeOut)
}
}
return transact.TransExeResult_Success
}
func (this *AddCoinTransactHandler) OnCommit(tNode *transact.TransNode) transact.TransExeResult {
logger.Logger.Trace("AddCoinTransactHandler.OnCommit ")
ud := tNode.TransEnv.GetField(TRANSACT_ADDCOIN_CTX)
if ctx, ok := ud.(*AsyncAddCoinTransactContext); ok {
p := PlayerMgrSington.GetPlayerBySnId(ctx.p.SnId) //重新获得p
if p != nil {
p.Coin += ctx.coin
p.dirty = true
}
}
return transact.TransExeResult_Success
}
func (this *AddCoinTransactHandler) OnRollBack(tNode *transact.TransNode) transact.TransExeResult {
logger.Logger.Trace("AddCoinTransactHandler.OnRollBack ")
ud := tNode.TransEnv.GetField(TRANSACT_ADDCOIN_CTX)
if ctx, ok := ud.(*AsyncAddCoinTransactContext); ok {
p := PlayerMgrSington.GetPlayerBySnId(ctx.p.SnId) //重新获得p
if p != nil {
p.AddCoinAsync(ctx.coin, 0, ctx.gainWay, ctx.oper, ctx.remark, ctx.broadcast, ctx.retryCnt+1, ctx.writeLog)
} else {
logger.Logger.Errorf("AddCoinTransactHandler.OnRollBack SnId=%v,Coin=%v,GainWay=%v,Oper=%v,Remark=%v,RetryCnt=%v", ctx.p.SnId, ctx.coin, ctx.gainWay, ctx.oper, ctx.remark, ctx.retryCnt)
}
}
return transact.TransExeResult_Success
}
func (this *AddCoinTransactHandler) OnChildTransRep(tNode *transact.TransNode, hChild transact.TransNodeID,
retCode int, ud interface{}) transact.TransExeResult {
logger.Logger.Trace("AddCoinTransactHandler.OnChildTransRep ")
return transact.TransExeResult_Success
}
func StartAsyncAddCoinTransact(p *Player, num int64, gainWay int32, oper, remark string, broadcast bool, retryCnt int, writeLog bool) bool {
tnp := &transact.TransNodeParam{
Tt: common.TransTypeAddCoin,
Ot: transact.TransOwnerType(common.GetSelfSrvType()),
Oid: common.GetSelfSrvId(),
AreaID: common.GetSelfAreaId(),
}
ctx := &AsyncAddCoinTransactContext{
p: p,
coin: num,
gainWay: gainWay,
oper: oper,
remark: remark,
broadcast: broadcast,
writeLog: writeLog,
retryCnt: retryCnt,
}
tNode := transact.DTCModule.StartTrans(tnp, ctx, TransAddCoinTimeOut)
if tNode != nil {
tNode.Go(core.CoreObject())
return true
}
return false
}
func init() {
transact.RegisteHandler(common.TransTypeAddCoin, &AddCoinTransactHandler{})
}