From fbacc4d57b9c0839a042f373c47787f99d3fa2f9 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 27 Sep 2024 11:35:07 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DB_GameItem.dat | Bin 18735 -> 18727 bytes data/DB_GameItem.json | 14 ++++++-------- data/DB_PropExchange.dat | Bin 384 -> 384 bytes data/DB_Task.dat | Bin 5439 -> 5439 bytes xlsx/DB_GameItem.xlsx | Bin 35093 -> 35046 bytes 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/data/DB_GameItem.dat b/data/DB_GameItem.dat index 336995f6cdda0a6bb61ba28b92b62f67766fea78..87b65bd8f8c27117e36260931f43efc5d3a7f484 100644 GIT binary patch delta 65 zcmZ2KiE;TP#tnzrxfmE2m6#bB7&OEuA7GQ({G7eQfiY!rf`<{aTm<9fLJ76W`#rcA N6DObY&_@#C1OR7J68ZoD delta 74 zcmZ2JiE;fT#tnzrxfmH4l$e2phWO+IY*L$_vsXAUW=u}-Fkf~b{`sl&{B=!}E diff --git a/data/DB_GameItem.json b/data/DB_GameItem.json index 9cbb9bc..e812325 100644 --- a/data/DB_GameItem.json +++ b/data/DB_GameItem.json @@ -486,13 +486,13 @@ "Id": 40003, "Name": "娃娃卡", "ShowLocation": [ - 1, - 1, - 0 + 0, + 0, + 1 ], "Classify": [ 1, - 1, + 0, 0 ], "Type": 23, @@ -6270,9 +6270,8 @@ 1 ], "SaleType": 1, - "SaleGold": 5000, + "SaleGold": 30, "CompositionMax": 1, - "Time": 360, "Location": "0", "Describe": "可联系客服兑换实物奖励", "Gain": { @@ -6308,9 +6307,8 @@ 1 ], "SaleType": 1, - "SaleGold": 5000, + "SaleGold": 30, "CompositionMax": 1, - "Time": 360, "Location": "0", "Describe": "可联系客服兑换实物奖励", "Gain": { diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat index 8135d9ab8399205b6d78cfe3e0e1344af53a4f88..a6a622f02e12967da63a701c7c9446f3843cac2d 100644 GIT binary patch literal 384 zcmd-w<6snElw#w!+{O&1uR!UmQ2H8_z7C?5I5-yevI!h$vE|a^U;?YZ0hPZArEfv$ z+i2>;IUweP%>mj6(+5@ux;!-i literal 384 zcmd-w<6snElw#w!+{O&1uR!UmQ2H8_z7C?5I5-yevI!h$vE|a^U;?YZ36;MErEf#& z8))joIUwc}vInLgY#-2FU~_;piako4V0SdEeZ;~Q%fSM62)e>MP=~-Qgn0;NFuH?b U9tV3^iJfB+(4$|Nxfo~*0c4^)H2?qr diff --git a/data/DB_Task.dat b/data/DB_Task.dat index 1fa5a6eb59cdcacbcfe26742215d88203c8d46cb..03e6214ba942238311489dd452e551a9b8bf1a77 100644 GIT binary patch delta 334 zcmdn5wO?xkC!-)6$C6$)0WL2Nj)g$_LL2jBDMkyZs0dVaK`-0pWJU?5$tFA^llz(f z39xZoY-1K+gi5bCJb5llAy5xUkOijaklbW>))uHJ-2A0Jlee(801XmgWSZ>B2C``p z&|W5}t^+N$lP9rRLPc4jq79u@lkc!uNkY_ed2xc>dSKc{CN39_iGBi%lQ<+Nd$0>b zwZYs4a&``TFvyP}J7B&6nRbC=n;^u;50(pgLFAbyPv`uP#farxZOl+%xHD(*Y_{Xe PWtwcvFSvP+Kr;&fS@Bzr delta 307 zcmdn5wO?xkC!-(-$HHDVfeUTSUThpofGn=bQj8W*(FMJ1P*IW1$&3 zAew;En|qiU83iER6^9vtsxP)N3rwENQV28RkQ`KyWwJbL3(UHuK2TAv$y>BW)=WI)Kmxn diff --git a/xlsx/DB_GameItem.xlsx b/xlsx/DB_GameItem.xlsx index 260ef289c42cc64aa0930db73605d6429f7c0981..483fab80a0abcfb4c0fe6a448734034ed5423b91 100644 GIT binary patch delta 25007 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 delta 25120 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 P1(VQ-5C&|700000iT{m4 From 53f03c10811007a0ebfe3973c6ecdd11f30dc6b7 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Fri, 27 Sep 2024 11:36:12 +0800 Subject: [PATCH 02/10] no message --- common/action.go | 50 ----------- common/action_srvctrl.go | 59 +++++++------ common/aes.go | 172 ------------------------------------ gamesrv/base/scene.go | 2 +- gamesrv/base/serverctrl.go | 15 ++-- gamesrv/base/serverstate.go | 4 +- gatesrv/serverctrl.go | 15 ++-- worldsrv/action_login.go | 2 +- worldsrv/action_server.go | 12 +-- worldsrv/gamesess.go | 20 ++--- worldsrv/gamesessmgr.go | 41 ++++----- worldsrv/serverctrl.go | 17 ++-- 12 files changed, 89 insertions(+), 320 deletions(-) delete mode 100644 common/action.go delete mode 100644 common/aes.go diff --git a/common/action.go b/common/action.go deleted file mode 100644 index 30234bb..0000000 --- a/common/action.go +++ /dev/null @@ -1,50 +0,0 @@ -package common - -import ( - "mongo.games.com/goserver/core/logger" -) - -const ( - A_USER_BLACK = 1 //增加黑名单 -) - -type Action struct { - ActionID int //执行id - ActionParamInt64 []int //整形参数 - ActionParamFloat []float64 //浮点参数 - ActionParamString []string //字符串参数 -} - -var ActionMgrSington = &ActionMgr{ - pool: make(map[int]ActionBase), -} - -type ActionMgr struct { - pool map[int]ActionBase -} - -func (this *ActionMgr) ActionGroup(need interface{}, action []*Action) bool { - for i := 0; i < len(action); i++ { - this.action(need, action[i]) - } - - return true -} - -func (this *ActionMgr) action(need interface{}, action *Action) bool { - a, ok := this.pool[action.ActionID] - if !ok { - logger.Logger.Warnf("no this action %v", action.ActionID) - return false - } - - return a.Action(need, action) -} - -func (this *ActionMgr) Register(cid int, c ActionBase) { - this.pool[cid] = c -} - -type ActionBase interface { - Action(need interface{}, action *Action) bool -} diff --git a/common/action_srvctrl.go b/common/action_srvctrl.go index 264ad44..ced21ea 100644 --- a/common/action_srvctrl.go +++ b/common/action_srvctrl.go @@ -1,54 +1,55 @@ package common import ( - "mongo.games.com/game/protocol/server" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/module" + "mongo.games.com/goserver/core/mongo" "mongo.games.com/goserver/core/netlib" + + "mongo.games.com/game/protocol/server" ) +// GameSessState 服务状态 type GameSessState int const ( - GAME_SESS_STATE_OFF GameSessState = iota //关闭状态 - GAME_SESS_STATE_ON //开启状态 + GameSessStateOff GameSessState = iota //关闭状态 + GameSessStateOn //开启状态 ) -var ServerCtrlCallback func(int32) +var SrvIsMaintaining = true -func RegisteServerCtrlCallback(cb func(int32)) { +var ServerCtrlCallback func(msg *server.ServerCtrl) + +func RegisterServerCtrlCallback(cb func(msg *server.ServerCtrl)) { ServerCtrlCallback = cb } -type ServerCtrlPacketFactory struct { +func init() { + netlib.Register(int(server.SSPacketID_PACKET_MS_SRVCTRL), &server.ServerCtrl{}, ServerCtrlHandler) } -type ServerCtrlHandler struct { -} +// ServerCtrlHandler 服务器控制,通用事件 +func ServerCtrlHandler(s *netlib.Session, packetid int, data interface{}) error { + logger.Logger.Infof("ServerCtrlHandler %v", data) + msg, ok := data.(*server.ServerCtrl) + if !ok { + return nil + } + switch msg.GetCtrlCode() { + case SrvCtrlCloseCode: + module.Stop() -func (this *ServerCtrlPacketFactory) CreatePacket() interface{} { - pack := &server.ServerCtrl{} - return pack -} + case SrvCtrlResetMgoSession: + mongo.ResetAllSession() -func (this *ServerCtrlHandler) Process(s *netlib.Session, packetid int, data interface{}) error { + default: + logger.Logger.Errorf("unknow server ctrl %v", msg) + } - if sc, ok := data.(*server.ServerCtrl); ok { - logger.Logger.Trace("ServerCtrlHandler.Process== ", *sc) - switch sc.GetCtrlCode() { - case SrvCtrlCloseCode: - module.Stop() - } - - //回调 - if ServerCtrlCallback != nil { - ServerCtrlCallback(sc.GetCtrlCode()) - } + // 服务自己处理的特殊事件 + if ServerCtrlCallback != nil { + ServerCtrlCallback(msg) } return nil } - -func init() { - netlib.RegisterHandler(int(server.SSPacketID_PACKET_MS_SRVCTRL), &ServerCtrlHandler{}) - netlib.RegisterFactory(int(server.SSPacketID_PACKET_MS_SRVCTRL), &ServerCtrlPacketFactory{}) -} diff --git a/common/aes.go b/common/aes.go deleted file mode 100644 index cb7bef6..0000000 --- a/common/aes.go +++ /dev/null @@ -1,172 +0,0 @@ -package common - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "encoding/base64" - "fmt" - "mongo.games.com/goserver/core/logger" - "regexp" - "strconv" -) - -var key = []byte("kjh-vgjhhionoommmkokmokoo$%JH") - -// 加密 -func EnCrypt(orig []byte) (str string) { - defer func() { - err := recover() - if err != nil { - logger.Logger.Errorf("EnCrypt %v Error %v", string(orig), err) - str = string(orig) - } - }() - //将秘钥中的每个字节累加,通过sum实现orig的加密工作 - sum := 0 - for i := 0; i < len(key); i++ { - sum += int(key[0]) - } - - //给明文补码 - var pkcs_code = PKCS5Padding(orig, 8) - - //通过秘钥,对补码后的明文进行加密 - for j := 0; j < len(pkcs_code); j++ { - pkcs_code[j] += byte(sum) - } - //base64.URLEncoding.EncodeToString() - return base64.URLEncoding.EncodeToString(pkcs_code) -} - -// 补码 -func PKCS5Padding(orig []byte, size int) []byte { - //计算明文的长度 - length := len(orig) - padding := size - length%size - //向byte类型的数组中重复添加padding - repeats := bytes.Repeat([]byte{byte(padding)}, padding) - return append(orig, repeats...) -} - -// 解密 -func DeCrypt(text string) (str string) { - defer func() { - err := recover() - if err != nil { - logger.Logger.Errorf("DeCrypt %v Error %v", text, err) - str = text - } - }() - //orig, err := base64.StdEncoding.DecodeString(text) - orig, err := base64.URLEncoding.DecodeString(text) - if err != nil { - return "密文类型错误" - } - sum := 0 - for i := 0; i < len(key); i++ { - sum += int(key[0]) - } - - //解密 - for j := 0; j < len(orig); j++ { - orig[j] -= byte(sum) - } - - //去码 - var pkcs_unCode = PKCS5UnPadding(orig) - return string(pkcs_unCode) -} - -// 去码 -func PKCS5UnPadding(orig []byte) []byte { - //获取最后一位补码的数字 - var tail = int(orig[len(orig)-1]) - return orig[:(len(orig) - tail)] -} - -var aesRule, _ = regexp.Compile(`^[0-9]+$`) - -const ( - aeskey = "DoNotEditThisKeyDoNotEditThisKey" // 加密的密钥,绝不可以更改 -) - -// 下面的字符串,也绝不可以更改 -var defaultLetters = []rune("idjGfiRogsFnkdKgokdfgdow07u6978uxcvvLiPiDfjafOd2fuFJYYGBJuykbvfk") - -func AesEncrypt(origDataStr string) (str string) { - defer func() { - err := recover() - if err != nil { - logger.Logger.Errorf("AesEncrypt %v Error %v", origDataStr, err) - str = origDataStr - } - }() - strlen := len(origDataStr) - b := aesRule.MatchString(origDataStr) - //不全是数字,或长度为零,不加密 - if !b || strlen == 0 { - return origDataStr - } - phonenum, errint := strconv.Atoi(origDataStr) - if errint != nil { - return origDataStr - } - - text := []byte(origDataStr) - //指定加密、解密算法为AES,返回一个AES的Block接口对象 - block, err := aes.NewCipher([]byte(aeskey)) - if err != nil { - panic(err) - } - //指定计数器,长度必须等于block的块尺寸 - iv := string(defaultLetters[phonenum%(len(defaultLetters))]) - count := []byte(fmt.Sprintf("%016v", iv)) - //指定分组模式 - blockMode := cipher.NewCTR(block, count) - //执行加密、解密操作 - message := make([]byte, len(text)) - blockMode.XORKeyStream(message, text) - //返回明文或密文 - return fmt.Sprintf("%v%v", iv, base64.StdEncoding.EncodeToString(message)) - //return base64.StdEncoding.EncodeToString(message) -} - -func AesDecrypt(cryptedstr string) (str string) { - defer func() { - err := recover() - if err != nil { - logger.Logger.Errorf("AesDecrypt %v Error %v", cryptedstr, err) - str = cryptedstr - } - }() - strlen := len(cryptedstr) - b := aesRule.MatchString(cryptedstr) - //全是数字,或长度为零,不解密 - if b || strlen == 0 { - return cryptedstr - } - - iv := cryptedstr[:1] - str = cryptedstr[1:] - text, err := base64.StdEncoding.DecodeString(str) - if err != nil { - logger.Logger.Errorf("AesDecrypt %v Err:%v", cryptedstr, err) - return cryptedstr - } - - //指定加密、解密算法为AES,返回一个AES的Block接口对象 - block, err := aes.NewCipher([]byte(aeskey)) - if err != nil { - panic(err) - } - //指定计数器,长度必须等于block的块尺寸 - count := []byte(fmt.Sprintf("%016v", iv)) - //指定分组模式 - blockMode := cipher.NewCTR(block, count) - //执行加密、解密操作 - message := make([]byte, len(text)) - blockMode.XORKeyStream(message, text) - //返回明文或密文 - return string(message) -} diff --git a/gamesrv/base/scene.go b/gamesrv/base/scene.go index 194322c..6f37806 100644 --- a/gamesrv/base/scene.go +++ b/gamesrv/base/scene.go @@ -1844,7 +1844,7 @@ func (this *Scene) RandInt(args ...int) int { func (this *Scene) CheckNeedDestroy() bool { //if common.IsLocalGame(this.GameId) { - return ServerStateMgr.GetState() == common.GAME_SESS_STATE_OFF || this.graceDestroy + return ServerStateMgr.GetState() == common.GameSessStateOff || this.graceDestroy //} else { // return (ServerStateMgr.GetState() == common.GAME_SESS_STATE_OFF || this.graceDestroy) || (this.IsPrivateScene() && this.NumOfGames >= this.TotalOfGames) //} diff --git a/gamesrv/base/serverctrl.go b/gamesrv/base/serverctrl.go index 1b2c5cf..67359d6 100644 --- a/gamesrv/base/serverctrl.go +++ b/gamesrv/base/serverctrl.go @@ -1,25 +1,26 @@ package base import ( + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/srvlib" + "mongo.games.com/game/common" "mongo.games.com/game/proto" "mongo.games.com/game/protocol/server" - "mongo.games.com/goserver/core/mongo" - "mongo.games.com/goserver/srvlib" ) func init() { - common.RegisteServerCtrlCallback(func(code int32) { - switch code { + common.RegisterServerCtrlCallback(func(msg *server.ServerCtrl) { + switch msg.GetCtrlCode() { case common.SrvCtrlStateSwitchCode: pack := &server.ServerStateSwitch{ SrvType: proto.Int(common.GetSelfSrvType()), SrvId: proto.Int(common.GetSelfSrvId()), } - proto.SetDefaults(pack) srvlib.ServerSessionMgrSington.Broadcast(int(server.SSPacketID_PACKET_GB_STATE_SWITCH), pack, common.GetSelfAreaId(), srvlib.WorldServerType) - case common.SrvCtrlResetMgoSession: - mongo.ResetAllSession() + + default: + logger.Logger.Errorf("unknow server ctrl code:%d", msg.GetCtrlCode()) } }) } diff --git a/gamesrv/base/serverstate.go b/gamesrv/base/serverstate.go index 57e8824..57dd76e 100644 --- a/gamesrv/base/serverstate.go +++ b/gamesrv/base/serverstate.go @@ -5,7 +5,7 @@ import ( ) var ServerStateMgr = &ServerStateManager{ - State: common.GAME_SESS_STATE_ON, + State: common.GameSessStateOn, } type ServerStateManager struct { @@ -13,7 +13,7 @@ type ServerStateManager struct { } func (this *ServerStateManager) Init() { - this.State = common.GAME_SESS_STATE_ON + this.State = common.GameSessStateOn } func (this *ServerStateManager) SetState(state common.GameSessState) { diff --git a/gatesrv/serverctrl.go b/gatesrv/serverctrl.go index 599a84a..4ef62fd 100644 --- a/gatesrv/serverctrl.go +++ b/gatesrv/serverctrl.go @@ -1,25 +1,26 @@ package main import ( + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/srvlib" + "mongo.games.com/game/common" "mongo.games.com/game/proto" "mongo.games.com/game/protocol/server" - "mongo.games.com/goserver/core/mongo" - "mongo.games.com/goserver/srvlib" ) func init() { - common.RegisteServerCtrlCallback(func(code int32) { - switch code { + common.RegisterServerCtrlCallback(func(msg *server.ServerCtrl) { + switch msg.GetCtrlCode() { case common.SrvCtrlStateSwitchCode: pack := &server.ServerStateSwitch{ SrvType: proto.Int(common.GetSelfSrvType()), SrvId: proto.Int(common.GetSelfSrvId()), } - proto.SetDefaults(pack) srvlib.ServerSessionMgrSington.Broadcast(int(server.SSPacketID_PACKET_GB_STATE_SWITCH), pack, common.GetSelfAreaId(), srvlib.WorldServerType) - case common.SrvCtrlResetMgoSession: - mongo.ResetAllSession() + + default: + logger.Logger.Errorf("unknown server ctrl code:%d", msg.GetCtrlCode()) } }) } diff --git a/worldsrv/action_login.go b/worldsrv/action_login.go index 4ab6b14..bf2f107 100644 --- a/worldsrv/action_login.go +++ b/worldsrv/action_login.go @@ -139,7 +139,7 @@ func (this *CSLoginHandler) Process(s *netlib.Session, packetid int, data interf } // 是否正在维护 - if model.GameParamData.SrvMaintain && SrvIsMaintaining { + if model.GameParamData.SrvMaintain && common.SrvIsMaintaining { inWhiteList := false for i := 0; i < len(model.GMACData.WhiteList); i++ { if model.GMACData.WhiteList[i] == csl.GetUsername() { diff --git a/worldsrv/action_server.go b/worldsrv/action_server.go index dfaee80..924c03e 100644 --- a/worldsrv/action_server.go +++ b/worldsrv/action_server.go @@ -296,18 +296,18 @@ func init() { srvid := int(sr.GetSrvId()) gameSess := GameSessMgrSington.GetGameSess(srvid) if gameSess != nil { - if gameSess.state == common.GAME_SESS_STATE_ON { - gameSess.SwitchState(common.GAME_SESS_STATE_OFF) + if gameSess.state == common.GameSessStateOn { + gameSess.SwitchState(common.GameSessStateOff) } else { - gameSess.SwitchState(common.GAME_SESS_STATE_ON) + gameSess.SwitchState(common.GameSessStateOn) } } else { gateSess := GameSessMgrSington.GetGateSess(srvid) if gateSess != nil { - if gateSess.state == common.GAME_SESS_STATE_ON { - gateSess.SwitchState(common.GAME_SESS_STATE_OFF) + if gateSess.state == common.GameSessStateOn { + gateSess.SwitchState(common.GameSessStateOff) } else { - gateSess.SwitchState(common.GAME_SESS_STATE_ON) + gateSess.SwitchState(common.GameSessStateOn) } } } diff --git a/worldsrv/gamesess.go b/worldsrv/gamesess.go index 6dcb5bc..63e3780 100644 --- a/worldsrv/gamesess.go +++ b/worldsrv/gamesess.go @@ -43,13 +43,12 @@ type GameSession struct { gameIds []int32 } -// 构造函数 func NewGameSession(srvId, srvType int, s *netlib.Session) *GameSession { gs := &GameSession{ Session: s, srvId: srvId, srvType: srvType, - state: common.GAME_SESS_STATE_ON, + state: common.GameSessStateOn, players: make(map[int32]*Player), scenes: make(map[int]*Scene), cps: make(map[string]*model.CoinPoolSetting), @@ -57,13 +56,6 @@ func NewGameSession(srvId, srvType int, s *netlib.Session) *GameSession { return gs } -func (this *GameSession) RebindPlayerSnId(oldSnId, newSnId int32) { - if p, exist := this.players[oldSnId]; exist { - delete(this.players, oldSnId) - this.players[newSnId] = p - } -} - func (this *GameSession) GetSrvId() int32 { if this.Session == nil { return 0 @@ -85,7 +77,6 @@ func (this *GameSession) CloseAllScene() { OpRetCode: gamehall_proto.OpResultCode_Game_OPRC_Sucess_Game, IsForce: proto.Int(1), } - proto.SetDefaults(scDestroyRoom) scene.Broadcast(int(gamehall_proto.GameHallPacketID_PACKET_SC_DESTROYROOM), scDestroyRoom, 0) SceneMgrSingleton.DestroyScene(sceneId, true) } @@ -105,11 +96,8 @@ func (this *GameSession) OnRegiste() { // 注销事件 func (this *GameSession) OnUnregiste() { - //销毁比赛 - //MatchMgrSington.DestroyAllMatchByGameSession(this) //解散房间 this.CloseAllScene() - GameSessionListenerSet.Range(func(key, val interface{}) bool { if lis, ok := val.(GameSessionListener); ok { lis.OnGameSessionUnregiste(this) @@ -130,12 +118,13 @@ func (this *GameSession) SwitchState(state common.GameSessState) { } this.state = state switch state { - case common.GAME_SESS_STATE_ON: + case common.GameSessStateOn: this.OnStateOn() - case common.GAME_SESS_STATE_OFF: + case common.GameSessStateOff: this.OnStateOff() } } + func (this *GameSession) OnStateOn() { pack := &server_proto.ServerState{ SrvState: proto.Int(int(this.state)), @@ -143,6 +132,7 @@ func (this *GameSession) OnStateOn() { proto.SetDefaults(pack) this.Send(int(server_proto.SSPacketID_PACKET_WG_SERVER_STATE), pack) } + func (this *GameSession) OnStateOff() { pack := &server_proto.ServerState{ SrvState: proto.Int(int(this.state)), diff --git a/worldsrv/gamesessmgr.go b/worldsrv/gamesessmgr.go index 5dc0682..8fd1a66 100644 --- a/worldsrv/gamesessmgr.go +++ b/worldsrv/gamesessmgr.go @@ -2,21 +2,18 @@ package main import ( "math" - "mongo.games.com/game/protocol/webapi" "strconv" "strings" - "mongo.games.com/game/common" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/srvlib" "mongo.games.com/goserver/srvlib/protocol" -) -//const ( -// ReplayServerType int = 8 -// ReplayServerId = 801 -//) + "mongo.games.com/game/common" + "mongo.games.com/game/model" + "mongo.games.com/game/protocol/webapi" +) var GameSessMgrSington = &GameSessMgr{ servers: make(map[int]*GameSession), @@ -25,9 +22,9 @@ var GameSessMgrSington = &GameSessMgr{ } type GameSessMgr struct { - servers map[int]*GameSession - gamesrvs map[int][]*GameSession - gates map[int]*GameSession + servers map[int]*GameSession // 游戏服务id + gamesrvs map[int][]*GameSession // 游戏id + gates map[int]*GameSession // 网关id } // 注册事件 @@ -134,6 +131,7 @@ func (this *GameSessMgr) OnUnregiste(s *netlib.Session) { } } } + func (this *GameSessMgr) GetGameServerSess(gameid int) []*GameSession { return this.gamesrvs[gameid] } @@ -146,7 +144,7 @@ func (this *GameSessMgr) GetMinLoadSess(gameid int) *GameSession { if gss, exist := this.gamesrvs[gameid]; exist { if gss != nil { for _, s := range gss { - if s.state == common.GAME_SESS_STATE_ON { + if s.state == common.GameSessStateOn { loadFactor = s.GetLoadFactor() if minLoad > loadFactor { minLoad = loadFactor @@ -162,7 +160,7 @@ func (this *GameSessMgr) GetMinLoadSess(gameid int) *GameSession { if gss, exist := this.gamesrvs[0]; exist { if gss != nil { for _, s := range gss { - if s.state == common.GAME_SESS_STATE_ON { + if s.state == common.GameSessStateOn { loadFactor = s.GetLoadFactor() if minLoad > loadFactor { minLoad = loadFactor @@ -184,6 +182,7 @@ func (this *GameSessMgr) GetGameSess(srvId int) *GameSession { } return nil } + func (this *GameSessMgr) GetAllGameSess() []*GameSession { servers := make([]*GameSession, 0) for _, v := range this.servers { @@ -191,17 +190,13 @@ func (this *GameSessMgr) GetAllGameSess() []*GameSession { } return servers } + func (this *GameSessMgr) GetGateSess(srvId int) *GameSession { if gs, exist := this.gates[srvId]; exist { return gs } return nil } -func (this *GameSessMgr) RebindPlayerSnId(oldSnId, newSnId int32) { - for _, gs := range this.servers { - gs.RebindPlayerSnId(oldSnId, newSnId) - } -} func (this *GameSessMgr) ListServerState(srvId, srvType int) []*webapi.ServerInfo { _createGateServerInfo := func(srvId, srvType int, s *GameSession) *webapi.ServerInfo { @@ -299,15 +294,17 @@ func (this *GameSessMgr) ListServerState(srvId, srvType int) []*webapi.ServerInf myInfo := &webapi.ServerInfo{ SrvId: int32(common.GetSelfSrvId()), SrvType: int32(common.GetSelfSrvType()), - State: int32(common.GAME_SESS_STATE_ON), + State: int32(common.GameSessStateOn), PlayerNum: int32(len(PlayerMgrSington.players)), RobotNum: int32(len(PlayerMgrSington.snidMap) - len(PlayerMgrSington.players)), SceneNum: int32(len(SceneMgrSingleton.scenes)), } - if SrvIsMaintaining { - myInfo.State = int32(common.GAME_SESS_STATE_ON) - } else { - myInfo.State = int32(common.GAME_SESS_STATE_OFF) + if model.GameParamData.SrvMaintain { + if !common.SrvIsMaintaining { + myInfo.State = int32(common.GameSessStateOn) + } else { + myInfo.State = int32(common.GameSessStateOff) + } } //把自己加进去 datas = append(datas, myInfo) diff --git a/worldsrv/serverctrl.go b/worldsrv/serverctrl.go index 43c180b..aa744da 100644 --- a/worldsrv/serverctrl.go +++ b/worldsrv/serverctrl.go @@ -1,19 +1,20 @@ package main import ( + "mongo.games.com/goserver/core/logger" + "mongo.games.com/game/common" - "mongo.games.com/goserver/core/mongo" + "mongo.games.com/game/protocol/server" ) -var SrvIsMaintaining = true - func init() { - common.RegisteServerCtrlCallback(func(code int32) { - switch code { + common.RegisterServerCtrlCallback(func(msg *server.ServerCtrl) { + switch msg.GetCtrlCode() { case common.SrvCtrlStateSwitchCode: - SrvIsMaintaining = !SrvIsMaintaining - case common.SrvCtrlResetMgoSession: - mongo.ResetAllSession() + common.SrvIsMaintaining = !common.SrvIsMaintaining + + default: + logger.Logger.Errorf("unknown server ctrl code:%d", msg.GetCtrlCode()) } }) } From 2ed8885e18952b8ff8789bee332b64b247f17a8b Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Fri, 27 Sep 2024 11:38:02 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E7=AB=9E=E6=8A=80=E9=A6=86=E7=82=B8?= =?UTF-8?q?=E5=BC=B9=E6=89=A3=E5=88=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/tienlen/scenedata_tienlen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gamesrv/tienlen/scenedata_tienlen.go b/gamesrv/tienlen/scenedata_tienlen.go index 77d4664..ef51f19 100644 --- a/gamesrv/tienlen/scenedata_tienlen.go +++ b/gamesrv/tienlen/scenedata_tienlen.go @@ -1997,7 +1997,7 @@ func (this *TienLenSceneData) TrySmallGameBilled() { winPlayer.bombRankScore += rankScore * rule.RankBaseScore } //lose - if this.IsMatchScene() && this.IsCustom() { + if this.IsMatchScene() || this.IsCustom() { losePlayer.AddCoinNoLog(-score, 0) } else { losePlayer.AddCoin(-score, common.GainWay_CoinSceneLost, 0, "system", this.GetSceneName()) From 3519bedc0319e55eebc12c14faeb36651248ed58 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Fri, 27 Sep 2024 14:08:49 +0800 Subject: [PATCH 04/10] no message --- worldsrv/serverctrl.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worldsrv/serverctrl.go b/worldsrv/serverctrl.go index aa744da..210e1bd 100644 --- a/worldsrv/serverctrl.go +++ b/worldsrv/serverctrl.go @@ -4,6 +4,7 @@ import ( "mongo.games.com/goserver/core/logger" "mongo.games.com/game/common" + "mongo.games.com/game/model" "mongo.games.com/game/protocol/server" ) @@ -11,7 +12,9 @@ func init() { common.RegisterServerCtrlCallback(func(msg *server.ServerCtrl) { switch msg.GetCtrlCode() { case common.SrvCtrlStateSwitchCode: - common.SrvIsMaintaining = !common.SrvIsMaintaining + if model.GameParamData.SrvMaintain { + common.SrvIsMaintaining = !common.SrvIsMaintaining + } default: logger.Logger.Errorf("unknown server ctrl code:%d", msg.GetCtrlCode()) From 6ac5d365d54f6d2b2c69a909ce53822dcf8d1bdf Mon Sep 17 00:00:00 2001 From: "DESKTOP-45ANQ2C\\unis" <179233648@qq.com> Date: Fri, 27 Sep 2024 14:30:52 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E5=A8=83=E5=A8=83=E5=8D=A1=E5=85=91?= =?UTF-8?q?=E6=8D=A2=E7=A7=AF=E5=88=86=E8=AE=B0=E5=BD=95=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbproxy/svc/l_itemlog.go | 12 ++---------- model/itemdatalog.go | 14 +++++++++++--- worldsrv/action_player.go | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/dbproxy/svc/l_itemlog.go b/dbproxy/svc/l_itemlog.go index 672f1f9..265e18c 100644 --- a/dbproxy/svc/l_itemlog.go +++ b/dbproxy/svc/l_itemlog.go @@ -124,15 +124,7 @@ func (svc *ItemLogSvc) GetClawdollItemLog(args *model.ClawdollItemLogReq, ret *m return } - type RetClawdollItemLog struct { - ItemId int32 //道具ID - Time int64 //时间 - TypeId int32 //道具记录类型 - Num int64 //数量 - LogType int32 //记录类型 0.获取 1.消耗 - } - - err = c.Find(cond).Limit(1000).Select(bson.M{"itemid": 1, "createts": 1, "typeid": 1, "count": 1, "logtype": 1}).All(&ret.Logs) + err = c.Find(cond).Select(bson.M{"itemid": 1, "createts": 1, "typeid": 1, "count": 1, "logtype": 1}).All(&ret.Logs) return } @@ -146,7 +138,7 @@ func (svc *ItemLogSvc) GetClawdollSuccessItemLog(args *model.ClawdollSuccessItem } var datas []model.ItemLog - err = c.Find(cond).Limit(1000).All(&datas) + err = c.Find(cond).All(&datas) if err != nil { logger.Logger.Error("GetClawdollSuccessItemLog error: ", err) return err diff --git a/model/itemdatalog.go b/model/itemdatalog.go index 953f086..9cf73e7 100644 --- a/model/itemdatalog.go +++ b/model/itemdatalog.go @@ -132,11 +132,19 @@ type ClawdollItemLogReq struct { TypeIds []int32 } -type GetClawdollItemLogRet struct { - Logs []ItemLog +type RetClawdollItemLog struct { + ItemId int32 //道具ID + CreateTs int64 //记录时间 + TypeId int32 // 变化类型 + Count int64 //个数 + LogType int32 //记录类型 0.获取 1.消耗 } -func GetClawdollItemLog(plt string, snid int32, typeIds []int32) (logs []ItemLog, err error) { +type GetClawdollItemLogRet struct { + Logs []RetClawdollItemLog +} + +func GetClawdollItemLog(plt string, snid int32, typeIds []int32) (logs []RetClawdollItemLog, err error) { if rpcCli == nil { logger.Logger.Error("model.GetClawdollItemLog rpcCli == nil") diff --git a/worldsrv/action_player.go b/worldsrv/action_player.go index ee7f409..fbdf145 100644 --- a/worldsrv/action_player.go +++ b/worldsrv/action_player.go @@ -3180,7 +3180,7 @@ func CSClawdollItemLog(s *netlib.Session, packetId int, data interface{}, sid in ret.TypeIds = append(ret.TypeIds, msg.TypeIds...) var err error - var ItemUseLogs []model.ItemLog + var ItemUseLogs []model.RetClawdollItemLog //娃娃机道具使用日志 task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { From 93134b7f57a4ae870e133fc97ba7aaa4ad748f2c Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Fri, 27 Sep 2024 14:31:16 +0800 Subject: [PATCH 06/10] no message --- common/clock.go | 95 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/common/clock.go b/common/clock.go index fc00b79..cd68c9e 100644 --- a/common/clock.go +++ b/common/clock.go @@ -6,6 +6,10 @@ import ( "mongo.games.com/goserver/core/module" ) +func init() { + module.RegisteModule(ClockMgrSingleton, time.Millisecond*500, 0) +} + var ClockMgrSingleton = &ClockMgr{ LastHour: -1, LastDay: -1, @@ -99,9 +103,9 @@ func (this *ClockMgr) Update() { this.LastSec = sec this.fireSecondEvent() - min := tNow.Minute() - if min != this.LastMini { - this.LastMini = min + minute := tNow.Minute() + if minute != this.LastMini { + this.LastMini = minute this.fireMinuteEvent() hour := tNow.Hour() @@ -182,6 +186,87 @@ func (this *ClockMgr) GetLast() (int, int, int, int, int, int) { return this.LastSec, this.LastMini, this.LastHour, this.LastDay, this.LastWeek, int(this.LastMonth) } -func init() { - module.RegisteModule(ClockMgrSingleton, time.Millisecond*500, 0) +type ClockFunc struct { + event int + OnSecTimerFunc func() + OnMiniTimerFunc func() + OnHourTimerFunc func() + OnDayTimerFunc func() + OnWeekTimerFunc func() + OnMonthTimerFunc func() + OnShutdownFunc func() +} + +func (s *ClockFunc) InterestClockEvent() int { return s.event } + +func (s *ClockFunc) OnSecTimer() { + if s.OnSecTimerFunc != nil { + s.OnSecTimerFunc() + } +} + +func (s *ClockFunc) OnMiniTimer() { + if s.OnMiniTimerFunc != nil { + s.OnMiniTimerFunc() + } +} + +func (s *ClockFunc) OnHourTimer() { + if s.OnHourTimerFunc != nil { + s.OnHourTimerFunc() + } +} + +func (s *ClockFunc) OnDayTimer() { + if s.OnDayTimerFunc != nil { + s.OnDayTimerFunc() + } +} + +func (s *ClockFunc) OnWeekTimer() { + if s.OnWeekTimerFunc != nil { + s.OnWeekTimerFunc() + } +} + +func (s *ClockFunc) OnMonthTimer() { + if s.OnMonthTimerFunc != nil { + s.OnMonthTimerFunc() + } +} + +func (s *ClockFunc) OnShutdown() { + if s.OnShutdownFunc != nil { + s.OnShutdownFunc() + } +} + +// RegisterClockFunc 注册时钟事件 +func RegisterClockFunc(fs *ClockFunc) { + if fs == nil { + return + } + if fs.OnSecTimerFunc != nil { + fs.event = fs.event ^ ClockEventSecond + } + if fs.OnMiniTimerFunc != nil { + fs.event = fs.event ^ ClockEventMinute + } + if fs.OnHourTimerFunc != nil { + fs.event = fs.event ^ ClockEventHour + } + if fs.OnDayTimerFunc != nil { + fs.event = fs.event ^ ClockEventDay + } + if fs.OnWeekTimerFunc != nil { + fs.event = fs.event ^ ClockEventWeek + } + if fs.OnMonthTimerFunc != nil { + fs.event = fs.event ^ ClockEventMonth + } + if fs.OnShutdownFunc != nil { + fs.event = fs.event ^ ClockEventShutdown + } + + ClockMgrSingleton.RegisterSinker(fs) } From b1298fe25fa2d37e5f35c36a7af4d0a762598595 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Fri, 27 Sep 2024 15:17:40 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9D=9E=E9=A6=96?= =?UTF-8?q?=E6=AC=A1=E7=99=BB=E5=BD=95=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/constant.go | 12 +++++++++--- model/player.go | 17 +++++------------ protocol/player/player.pb.go | 2 +- protocol/player/player.proto | 2 +- worldsrv/action_player.go | 5 +++++ worldsrv/action_server.go | 8 +------- 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/common/constant.go b/common/constant.go index e28931a..fdc1687 100644 --- a/common/constant.go +++ b/common/constant.go @@ -807,9 +807,10 @@ var ( ) const ( - AttributeGuideStep = 1 // 引导步骤 - AttributeGuideSkip = 2 // 跳过引导 - AttributeGuideTest = 3 // 测试引导 + AttributeGuideStep = 1 // 引导步骤 + AttributeGuideSkip = 2 // 跳过引导 + AttributeGuideTest = 3 // 测试引导 + AttributeGuideCustom = 4 // 竞技馆引导页 ) const ( @@ -861,3 +862,8 @@ const ( PlayerChangeTypeCoin = 0 // 金币 PlayerChangeTypeNum = 1 // 积分 ) + +// 玩家状态标记 +const ( + PlayerFlagsGuideCustom = 1 << iota // 竞技馆引导页关闭状态 +) diff --git a/model/player.go b/model/player.go index 27cf053..3d8c6c5 100644 --- a/model/player.go +++ b/model/player.go @@ -29,13 +29,6 @@ const ( VER_PLAYER_MAX ) -const ( - PLAYER_FLAGS_PRIVILEGE int64 = 1 << iota - PLAYER_FLAGS_FIRSTGAME //首次游戏 - PLAYER_FLAGS_FIRSTBINDTEL //首次绑定账号 - PLAYER_FLAGS_CANREBATE //是否能够返利 -) - const ( DEFAULT_PLAYER_SAFEBOX_PWD = "" //保险箱默认密码 ) @@ -402,7 +395,7 @@ type PlayerData struct { InviterHead int32 //邀请人头像 BeUnderAgentCode string //隶属经销商(推广人) SubBeUnderAgentCode string //经销商子id - Flags int64 //标记 + Flags int //标记 GameCoinTs int64 //游服金币对账时间戳 Ver int32 //数据版本号 CheckSum uint32 //校验码(预防暴库修改数据) @@ -501,7 +494,7 @@ type PlayerData struct { DiamondLotteryScore int64 //钻石抽奖幸运值 VCardCost int64 // 消耗v卡数量 MoneyTotal int64 // 现金总充值金额,不包含api加币时的现金 - GuideStep int32 // 引导步骤;跳过引导后,该值会置为-1 + GuideStep int32 // tienlen游戏引导步骤;跳过引导后,该值会置为-1 } // 七日签到数据 @@ -802,15 +795,15 @@ func ConvertPlayerDataToWebData(param *WebPlayerDataParam) *webapi.PlayerData { return pdfw } func (this *PlayerData) IsMarkFlag(flag int) bool { - return this.Flags&(1<= 3 { - if p.Flags&model.PLAYER_FLAGS_PRIVILEGE == 0 { - p.Flags |= model.PLAYER_FLAGS_PRIVILEGE - } else { - p.Flags &= ^model.PLAYER_FLAGS_PRIVILEGE - } - } + } } } From b6a8789fdb1619bf218b0dc197bd3f68b517290c Mon Sep 17 00:00:00 2001 From: "DESKTOP-45ANQ2C\\unis" <179233648@qq.com> Date: Fri, 27 Sep 2024 16:57:11 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E5=A8=83=E5=A8=83=E5=8D=A1=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E5=85=91=E6=8D=A2=E8=AE=B0=E5=BD=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbproxy/svc/l_itemlog.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/dbproxy/svc/l_itemlog.go b/dbproxy/svc/l_itemlog.go index 265e18c..420d038 100644 --- a/dbproxy/svc/l_itemlog.go +++ b/dbproxy/svc/l_itemlog.go @@ -116,15 +116,30 @@ func (svc *ItemLogSvc) UpdateState(req *model.UpdateParam, res *model.UpdateRes) } func (svc *ItemLogSvc) GetClawdollItemLog(args *model.ClawdollItemLogReq, ret *model.GetClawdollItemLogRet) (err error) { - //itemTypeIds := []int32{common.GainWayClawdollCostItem, common.GainWayItemShopChangeDoll} + var sql []bson.M - cond := bson.M{"snid": args.Snid, "typeid": bson.M{"$in": args.TypeIds}} - c := ItemLogsCollection(args.Platform) - if c == nil { - return + var Logs []model.RetClawdollItemLog + for _, typeId := range args.TypeIds { + sql = append(sql, bson.M{"snid": args.Snid, "typeid": typeId}) + + switch typeId { + case common.GainWay_Shop_Buy: // 商城兑换 + sql = append(sql, bson.M{"itemid": common.ItemIDClawdoll}) + case common.GainWayItemShopChangeDoll: // 积分支出 + sql = append(sql, bson.M{"itemid": common.ItemDollCard}) + case common.GainWayItemFenGain: // 积分获取 + sql = append(sql, bson.M{"itemid": common.ItemDollCard}) + } + + c := ItemLogsCollection(args.Platform) + if c == nil { + return + } + + err = c.Find(bson.M{"$and": sql}).Select(bson.M{"itemid": 1, "createts": 1, "typeid": 1, "count": 1, "logtype": 1}).All(&Logs) } - err = c.Find(cond).Select(bson.M{"itemid": 1, "createts": 1, "typeid": 1, "count": 1, "logtype": 1}).All(&ret.Logs) + ret.Logs = Logs return } From fd14654c59f8b95c2a18217fb560c6de0826e879 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Fri, 27 Sep 2024 18:02:00 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E7=AB=9E=E6=8A=80=E9=A6=86=E5=92=8C?= =?UTF-8?q?=E6=AF=94=E8=B5=9B=E5=9C=BA=E5=85=B3=E9=97=AD=E6=96=97=E9=B8=A1?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/clock.go | 18 ++++++++++------- common/comm.go | 29 ++++++++++------------------ gamesrv/tienlen/scenedata_tienlen.go | 2 +- worldsrv/player.go | 19 ------------------ 4 files changed, 22 insertions(+), 46 deletions(-) diff --git a/common/clock.go b/common/clock.go index cd68c9e..7245ee5 100644 --- a/common/clock.go +++ b/common/clock.go @@ -6,6 +6,10 @@ import ( "mongo.games.com/goserver/core/module" ) +/* + 时钟 +*/ + func init() { module.RegisteModule(ClockMgrSingleton, time.Millisecond*500, 0) } @@ -247,25 +251,25 @@ func RegisterClockFunc(fs *ClockFunc) { return } if fs.OnSecTimerFunc != nil { - fs.event = fs.event ^ ClockEventSecond + fs.event = fs.event | ClockEventSecond } if fs.OnMiniTimerFunc != nil { - fs.event = fs.event ^ ClockEventMinute + fs.event = fs.event | ClockEventMinute } if fs.OnHourTimerFunc != nil { - fs.event = fs.event ^ ClockEventHour + fs.event = fs.event | ClockEventHour } if fs.OnDayTimerFunc != nil { - fs.event = fs.event ^ ClockEventDay + fs.event = fs.event | ClockEventDay } if fs.OnWeekTimerFunc != nil { - fs.event = fs.event ^ ClockEventWeek + fs.event = fs.event | ClockEventWeek } if fs.OnMonthTimerFunc != nil { - fs.event = fs.event ^ ClockEventMonth + fs.event = fs.event | ClockEventMonth } if fs.OnShutdownFunc != nil { - fs.event = fs.event ^ ClockEventShutdown + fs.event = fs.event | ClockEventShutdown } ClockMgrSingleton.RegisterSinker(fs) diff --git a/common/comm.go b/common/comm.go index e36b436..e7563b2 100644 --- a/common/comm.go +++ b/common/comm.go @@ -6,7 +6,6 @@ import ( protocol_game "mongo.games.com/game/protocol/server" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/srvlib" "mongo.games.com/goserver/srvlib/protocol" ) @@ -45,11 +44,11 @@ func createMulticastPacket(packetid int, data interface{}, sis ...*protocol.MCSe return pack, nil } -func SendToGate(sid int64, packetid int, rawpack interface{}, s *netlib.Session) bool { - if s == nil || rawpack == nil || sid == 0 { +func SendToGate(sid int64, packetId int, pack interface{}, s *netlib.Session) bool { + if s == nil || pack == nil || sid == 0 { return false } - pack, err := createMulticastPacket(packetid, rawpack, + pack, err := createMulticastPacket(packetId, pack, &protocol.MCSessionUnion{ Mccs: &protocol.MCClientSession{ SId: proto.Int64(sid)}}) @@ -63,25 +62,17 @@ func SendToGate(sid int64, packetid int, rawpack interface{}, s *netlib.Session) return false } -func SendToActThrSrv(packetid int, rawpack interface{}) bool { - if rawpack == nil { - return false - } - - replaySess := srvlib.ServerSessionMgrSington.GetSession(GetSelfAreaId(), ActThrServerType, ActThrServerID) - if replaySess != nil { - return replaySess.Send(int(packetid), rawpack) - } - return false -} - -func TransmitToServer(sid int64, packetid int, rawpack interface{}, s *netlib.Session) bool { - if d, err := netlib.MarshalPacket(packetid, rawpack); err == nil { +// TransmitToServer 转发消息到指定服务器 +// sid: 客户端连接标识 +// packetId: 消息id +// pack: 消息内容 +// s: 接收消息的服务器连接 +func TransmitToServer(sid int64, packetId int, pack interface{}, s *netlib.Session) bool { + if d, err := netlib.MarshalPacket(packetId, pack); err == nil { pack := &protocol_game.SSTransmit{ PacketData: d, SessionId: sid, } - proto.SetDefaults(pack) return s.Send(int(protocol_game.TransmitPacketID_PACKET_SS_PACKET_TRANSMIT), pack, true) } else { logger.Logger.Warn("TransmitToServer err:", err) diff --git a/gamesrv/tienlen/scenedata_tienlen.go b/gamesrv/tienlen/scenedata_tienlen.go index ef51f19..89d13c7 100644 --- a/gamesrv/tienlen/scenedata_tienlen.go +++ b/gamesrv/tienlen/scenedata_tienlen.go @@ -1968,7 +1968,7 @@ func (this *TienLenSceneData) TrySmallGameBilled() { score = losePlayerCoin } //判断宠物技能生不生效 - if losePlayer.PetUseSkill() { + if losePlayer.PetUseSkill() && !this.IsCustom() && !this.IsMatchScene() { score = 0 //通知客户端宠物技能生效 炸弹不扣分 pack := &tienlen.SCTienLenPetSkillRes{} diff --git a/worldsrv/player.go b/worldsrv/player.go index 307b643..fba1f6c 100644 --- a/worldsrv/player.go +++ b/worldsrv/player.go @@ -3161,25 +3161,6 @@ func (this *Player) AddCoinPayTotal(coin int64) { this.CoinPayTotal += coin } -// 当用户充值 -func OnPlayerPay(pd *model.PlayerData, coin int64) { - if pd == nil { - return - } - - buf, err := pd.GetPlayerDataEncoder() - if err == nil { - pack := &serverproto.WTPlayerPay{ - AddCoin: proto.Int64(coin), - PlayerData: buf.Bytes(), - } - proto.SetDefaults(pack) - common.SendToActThrSrv(int(serverproto.SSPacketID_PACKET_WT_PLAYERPAY), pack) - } - - //ActFPayMgrSington.OnPlayerPay(pd.SnId, pd.Platform, coin) -} - func (this *Player) SendPlatformCanUsePromoterBind() { state := int32(0) plt := PlatformMgrSingleton.GetPlatform(this.Platform) From b18e2393b0e96f02caf2edd0305223a04b5e71c5 Mon Sep 17 00:00:00 2001 From: "DESKTOP-45ANQ2C\\unis" <179233648@qq.com> Date: Fri, 27 Sep 2024 18:28:06 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E5=85=91=E6=8D=A2=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbproxy/svc/l_itemlog.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dbproxy/svc/l_itemlog.go b/dbproxy/svc/l_itemlog.go index 420d038..2292a1e 100644 --- a/dbproxy/svc/l_itemlog.go +++ b/dbproxy/svc/l_itemlog.go @@ -120,6 +120,7 @@ func (svc *ItemLogSvc) GetClawdollItemLog(args *model.ClawdollItemLogReq, ret *m var Logs []model.RetClawdollItemLog for _, typeId := range args.TypeIds { + var SubLogs []model.RetClawdollItemLog sql = append(sql, bson.M{"snid": args.Snid, "typeid": typeId}) switch typeId { @@ -136,7 +137,9 @@ func (svc *ItemLogSvc) GetClawdollItemLog(args *model.ClawdollItemLogReq, ret *m return } - err = c.Find(bson.M{"$and": sql}).Select(bson.M{"itemid": 1, "createts": 1, "typeid": 1, "count": 1, "logtype": 1}).All(&Logs) + err = c.Find(bson.M{"$and": sql}).Select(bson.M{"itemid": 1, "createts": 1, "typeid": 1, "count": 1, "logtype": 1}).All(&SubLogs) + + Logs = append(Logs, SubLogs...) } ret.Logs = Logs