123 lines
3.6 KiB
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{})
|
|
}
|