From d703046f633786e1c2b7fcc06e784b8f3e6169b0 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Tue, 13 Aug 2024 14:47:12 +0800 Subject: [PATCH 01/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/action/action_machine.go | 49 ++- gamesrv/clawdoll/scene_clawdoll.go | 28 +- gamesrv/clawdoll/scenepolicy_clawdoll.go | 28 +- machine/machinedoll/machinemgr.go | 23 +- protocol/dollmachine/dollmachine.pb.go | 537 ----------------------- protocol/dollmachine/dollmachine.proto | 43 -- protocol/machine/machine.pb.go | 157 +++++-- protocol/machine/machine.proto | 6 + public | 2 +- 9 files changed, 226 insertions(+), 647 deletions(-) delete mode 100644 protocol/dollmachine/dollmachine.pb.go delete mode 100644 protocol/dollmachine/dollmachine.proto diff --git a/gamesrv/action/action_machine.go b/gamesrv/action/action_machine.go index 92d56e6..61d61a9 100644 --- a/gamesrv/action/action_machine.go +++ b/gamesrv/action/action_machine.go @@ -4,22 +4,65 @@ import ( "mongo.games.com/game/protocol/machine" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" + "sync" ) -var MachineMap = make(map[int]string) +var MachineMap = make(map[int]*DollMachine) +var MachineMapLock = sync.Mutex{} + +type DollMachine struct { + Id int + MachineStatus int32 //娃娃机链接状态 0:离线 1:在线 + Status bool //是否空闲 + VideoAddr string +} func MSDollMachineList(session *netlib.Session, packetId int, data interface{}) error { logger.Logger.Tracef("TestHandler %v", data) - MachineMap = make(map[int]string) + MachineMap = make(map[int]*DollMachine) if msg, ok := data.(*machine.MSDollMachineList); ok { for i, info := range msg.Data { - MachineMap[i+1] = info.VideoAddr + MachineMap[i+1] = &DollMachine{ + Id: i + 1, + Status: false, + VideoAddr: info.VideoAddr, + MachineStatus: 1, + } logger.Logger.Tracef("MachineMap[%v] = %v", i, info.VideoAddr) } } return nil } +// 获取空闲娃娃机标识 +func GetFreeDollMachineId() int { + // 获取互斥锁 + MachineMapLock.Lock() + defer MachineMapLock.Unlock() + for i, v := range MachineMap { + if v.Status == false { + v.Status = true + return i + } + } + return 0 +} + +// 获取指定娃娃机链接状态 +func GetDollMachineStatus(id int) int32 { + return MachineMap[id].MachineStatus +} + +func MSUpdateDollMachineStatusHandler(session *netlib.Session, packetId int, data interface{}) error { + logger.Logger.Tracef("MSUpdateDollMachineStatusHandler %v", data) + if msg, ok := data.(*machine.MSUpdateDollMachineStatus); ok { + MachineMap[int(msg.Id)].MachineStatus = msg.Status + logger.Logger.Tracef("更新娃娃机连接状态 id = %d,status= %d", msg.Id, msg.GetStatus()) + } + return nil +} func init() { netlib.Register(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), &machine.MSDollMachineList{}, MSDollMachineList) + //更新娃娃机链接状态 + netlib.Register(int(machine.DollMachinePacketID_PACKET_MSUpdateDollMachineStatus), &machine.MSUpdateDollMachineStatus{}, MSUpdateDollMachineStatusHandler) } diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index fd6a518..b663a30 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -1,13 +1,14 @@ package clawdoll import ( - "mongo.games.com/game/protocol/clawdoll" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/game/common" rule "mongo.games.com/game/gamerule/clawdoll" "mongo.games.com/game/gamesrv/base" "mongo.games.com/game/proto" + "mongo.games.com/game/protocol/clawdoll" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/netlib" + "mongo.games.com/goserver/srvlib" ) type PlayerData struct { @@ -41,9 +42,12 @@ type SceneEx struct { PlayerBackup map[int32]*PlayerData // 本局离场玩家数据备份 seats []*PlayerEx // 本局游戏中的玩家状态数据 - RoundId int // 局数,第几局 - robotNum int // 参与游戏的机器人数量 - logid string + RoundId int // 局数,第几局 + robotNum int // 参与游戏的机器人数量 + logid string + machineId int //娃娃机ID + machineConn *netlib.Session //娃娃机链接 + machineStatus int32 //娃娃机链接状态 0:离线 1:在线 } // 游戏是否能开始 @@ -203,3 +207,15 @@ func (this *SceneEx) BackupPlayer(p *PlayerEx, isBilled bool) { BeUnderAgentCode: p.BeUnderAgentCode, } } + +// 向娃娃机主机发送消息 +func (this *SceneEx) SendToMachine(pid int, msg interface{}) { + if this.machineConn == nil { + this.machineConn = srvlib.ServerSessionMgrSington.GetSession(1, 10, 1001) + } + if this.machineConn != nil { + this.machineConn.Send(pid, msg) + } else { + logger.Logger.Error("MachineConn is nil !") + } +} diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 46bc199..4b8ef1e 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -1,6 +1,7 @@ package clawdoll import ( + "mongo.games.com/game/gamesrv/action" "mongo.games.com/game/protocol/clawdoll" "time" @@ -61,15 +62,38 @@ func (this *PolicyClawdoll) OnTick(s *base.Scene) { if s.SceneState != nil { s.SceneState.OnTick(s) } + + sceneEx, ok := s.ExtraData.(*SceneEx) + if ok { + if sceneEx.machineId == 0 { + sceneEx.machineId = action.GetFreeDollMachineId() + } + if sceneEx.machineId != 0 { + machineStatus := action.GetDollMachineStatus(sceneEx.machineId) + if machineStatus == 0 { + //链接状态不可用 踢出所有玩家 + for _, p := range sceneEx.players { + sceneEx.delPlayer(p.Player) + } + sceneEx.machineStatus = 0 + logger.Logger.Trace("娃娃机离线,当前场景暂停服务!") + //通知客户单房间不可用 + } else { + if sceneEx.machineStatus == 0 { + sceneEx.machineStatus = machineStatus + //通知客户端房间可用 + } + } + } + } + } func (this *PolicyClawdoll) OnPlayerEnter(s *base.Scene, p *base.Player) { if s == nil || p == nil { return } - logger.Logger.Trace("(this *PolicyClawdoll) OnPlayerEnter, sceneId=", s.GetSceneId(), " player=", p.SnId) - if sceneEx, ok := s.ExtraData.(*SceneEx); ok { pos := -1 for i := 0; i < sceneEx.GetPlayerNum(); i++ { diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index eaece9c..196850e 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -89,7 +89,7 @@ func (this *MachineManager) StartHeartbeat(id int, conn *net.Conn, addr string) delete(ConnMap, id) this.DelConnMap[id] = addr //通知游戏服 - this.UpdateToGameServer() + this.UpdateToGameServer(id, 0) fmt.Println("删除链接!!!!!!addr = ", addr) go timer.StartTimer(timer.TimerActionWrapper(func(h timer.TimerHandle, ud interface{}) bool { this.ReConnect() @@ -105,7 +105,6 @@ func (this *MachineManager) StartHeartbeat(id int, conn *net.Conn, addr string) func (this *MachineManager) ReConnect() bool { fmt.Println("================重连============") delIds := []int{} - status := false for id, addr := range this.DelConnMap { conn, err := net.DialTimeout("tcp", addr, 5*time.Second) if err != nil { @@ -113,28 +112,20 @@ func (this *MachineManager) ReConnect() bool { } ConnMap[id] = conn delIds = append(delIds, id) - status = true + this.UpdateToGameServer(id, 1) } for _, id := range delIds { delete(this.DelConnMap, id) fmt.Println("重新链接成功!!!!!!id = ", id) } - if status { - this.UpdateToGameServer() - return true - } return false } -func (this *MachineManager) UpdateToGameServer() { - msg := &machine.MSDollMachineList{} - for i, _ := range ConnMap { - info := &machine.DollMachine{} - info.Id = int32(i) - info.VideoAddr = "www.baidu.com" - msg.Data = append(msg.Data, info) - } - SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), msg) +func (this *MachineManager) UpdateToGameServer(id int, status int32) { + msg := &machine.MSUpdateDollMachineStatus{} + msg.Status = status + msg.Id = int32(id) + SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSUpdateDollMachineStatus), msg) } func SendToGameServer(pid int, msg interface{}) { diff --git a/protocol/dollmachine/dollmachine.pb.go b/protocol/dollmachine/dollmachine.pb.go deleted file mode 100644 index 6624f68..0000000 --- a/protocol/dollmachine/dollmachine.pb.go +++ /dev/null @@ -1,537 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1-devel -// protoc v3.19.4 -// source: dollmachine.proto - -package dollmachine - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -//S-GAME M-娃娃机主机 -//娃娃机协议 -type DollMachinePacketID int32 - -const ( - DollMachinePacketID_PACKET_SMDollMachineZero DollMachinePacketID = 0 - DollMachinePacketID_PACKET_SMDollMachineMove DollMachinePacketID = 3001 - DollMachinePacketID_PACKET_SMDollMachineGrab DollMachinePacketID = 3002 - DollMachinePacketID_PACKET_MSDollMachineGrab DollMachinePacketID = 3003 - DollMachinePacketID_PACKET_MSDollMachineList DollMachinePacketID = 3004 -) - -// Enum value maps for DollMachinePacketID. -var ( - DollMachinePacketID_name = map[int32]string{ - 0: "PACKET_SMDollMachineZero", - 3001: "PACKET_SMDollMachineMove", - 3002: "PACKET_SMDollMachineGrab", - 3003: "PACKET_MSDollMachineGrab", - 3004: "PACKET_MSDollMachineList", - } - DollMachinePacketID_value = map[string]int32{ - "PACKET_SMDollMachineZero": 0, - "PACKET_SMDollMachineMove": 3001, - "PACKET_SMDollMachineGrab": 3002, - "PACKET_MSDollMachineGrab": 3003, - "PACKET_MSDollMachineList": 3004, - } -) - -func (x DollMachinePacketID) Enum() *DollMachinePacketID { - p := new(DollMachinePacketID) - *p = x - return p -} - -func (x DollMachinePacketID) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (DollMachinePacketID) Descriptor() protoreflect.EnumDescriptor { - return file_dollmachine_proto_enumTypes[0].Descriptor() -} - -func (DollMachinePacketID) Type() protoreflect.EnumType { - return &file_dollmachine_proto_enumTypes[0] -} - -func (x DollMachinePacketID) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use DollMachinePacketID.Descriptor instead. -func (DollMachinePacketID) EnumDescriptor() ([]byte, []int) { - return file_dollmachine_proto_rawDescGZIP(), []int{0} -} - -//移动 -type SMDollMachineMove struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` - Id int32 `protobuf:"varint,2,opt,name=Id,proto3" json:"Id,omitempty"` //娃娃机标识 - Direction int32 `protobuf:"varint,3,opt,name=Direction,proto3" json:"Direction,omitempty"` // 1-前 2-后 3-左 4-右 -} - -func (x *SMDollMachineMove) Reset() { - *x = SMDollMachineMove{} - if protoimpl.UnsafeEnabled { - mi := &file_dollmachine_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SMDollMachineMove) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SMDollMachineMove) ProtoMessage() {} - -func (x *SMDollMachineMove) ProtoReflect() protoreflect.Message { - mi := &file_dollmachine_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SMDollMachineMove.ProtoReflect.Descriptor instead. -func (*SMDollMachineMove) Descriptor() ([]byte, []int) { - return file_dollmachine_proto_rawDescGZIP(), []int{0} -} - -func (x *SMDollMachineMove) GetSnid() int32 { - if x != nil { - return x.Snid - } - return 0 -} - -func (x *SMDollMachineMove) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *SMDollMachineMove) GetDirection() int32 { - if x != nil { - return x.Direction - } - return 0 -} - -//下抓 -type SMDollMachineGrab struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TypeId int32 `protobuf:"varint,1,opt,name=TypeId,proto3" json:"TypeId,omitempty"` //1-弱力抓 2 -强力抓 3-必出抓 - Id int32 `protobuf:"varint,2,opt,name=Id,proto3" json:"Id,omitempty"` //娃娃机标识 - Snid int32 `protobuf:"varint,3,opt,name=Snid,proto3" json:"Snid,omitempty"` -} - -func (x *SMDollMachineGrab) Reset() { - *x = SMDollMachineGrab{} - if protoimpl.UnsafeEnabled { - mi := &file_dollmachine_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SMDollMachineGrab) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SMDollMachineGrab) ProtoMessage() {} - -func (x *SMDollMachineGrab) ProtoReflect() protoreflect.Message { - mi := &file_dollmachine_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SMDollMachineGrab.ProtoReflect.Descriptor instead. -func (*SMDollMachineGrab) Descriptor() ([]byte, []int) { - return file_dollmachine_proto_rawDescGZIP(), []int{1} -} - -func (x *SMDollMachineGrab) GetTypeId() int32 { - if x != nil { - return x.TypeId - } - return 0 -} - -func (x *SMDollMachineGrab) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *SMDollMachineGrab) GetSnid() int32 { - if x != nil { - return x.Snid - } - return 0 -} - -//返回下抓结果 -type MSDollMachineGrab struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` - Id int32 `protobuf:"varint,2,opt,name=Id,proto3" json:"Id,omitempty"` //娃娃机标识 - Result int32 `protobuf:"varint,3,opt,name=Result,proto3" json:"Result,omitempty"` //1-中奖 其他未中奖 -} - -func (x *MSDollMachineGrab) Reset() { - *x = MSDollMachineGrab{} - if protoimpl.UnsafeEnabled { - mi := &file_dollmachine_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MSDollMachineGrab) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MSDollMachineGrab) ProtoMessage() {} - -func (x *MSDollMachineGrab) ProtoReflect() protoreflect.Message { - mi := &file_dollmachine_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MSDollMachineGrab.ProtoReflect.Descriptor instead. -func (*MSDollMachineGrab) Descriptor() ([]byte, []int) { - return file_dollmachine_proto_rawDescGZIP(), []int{2} -} - -func (x *MSDollMachineGrab) GetSnid() int32 { - if x != nil { - return x.Snid - } - return 0 -} - -func (x *MSDollMachineGrab) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *MSDollMachineGrab) GetResult() int32 { - if x != nil { - return x.Result - } - return 0 -} - -//返回所有娃娃机连接 -type MSDollMachineList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data []*DollMachine `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"` -} - -func (x *MSDollMachineList) Reset() { - *x = MSDollMachineList{} - if protoimpl.UnsafeEnabled { - mi := &file_dollmachine_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MSDollMachineList) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MSDollMachineList) ProtoMessage() {} - -func (x *MSDollMachineList) ProtoReflect() protoreflect.Message { - mi := &file_dollmachine_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MSDollMachineList.ProtoReflect.Descriptor instead. -func (*MSDollMachineList) Descriptor() ([]byte, []int) { - return file_dollmachine_proto_rawDescGZIP(), []int{3} -} - -func (x *MSDollMachineList) GetData() []*DollMachine { - if x != nil { - return x.Data - } - return nil -} - -type DollMachine struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` - Status int32 `protobuf:"varint,2,opt,name=Status,proto3" json:"Status,omitempty"` //1-空闲 2-无法使用 -} - -func (x *DollMachine) Reset() { - *x = DollMachine{} - if protoimpl.UnsafeEnabled { - mi := &file_dollmachine_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DollMachine) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DollMachine) ProtoMessage() {} - -func (x *DollMachine) ProtoReflect() protoreflect.Message { - mi := &file_dollmachine_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DollMachine.ProtoReflect.Descriptor instead. -func (*DollMachine) Descriptor() ([]byte, []int) { - return file_dollmachine_proto_rawDescGZIP(), []int{4} -} - -func (x *DollMachine) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *DollMachine) GetStatus() int32 { - if x != nil { - return x.Status - } - return 0 -} - -var File_dollmachine_proto protoreflect.FileDescriptor - -var file_dollmachine_proto_rawDesc = []byte{ - 0x0a, 0x11, 0x64, 0x6f, 0x6c, 0x6c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x64, 0x6f, 0x6c, 0x6c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x22, 0x55, 0x0a, 0x11, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x4d, 0x6f, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x11, 0x53, 0x4d, 0x44, 0x6f, 0x6c, - 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x12, 0x16, 0x0a, 0x06, - 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x54, 0x79, - 0x70, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x02, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x11, 0x4d, 0x53, 0x44, 0x6f, - 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x12, 0x12, 0x0a, - 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x69, - 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x41, 0x0a, 0x11, 0x4d, 0x53, 0x44, - 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2c, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, - 0x6f, 0x6c, 0x6c, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x35, 0x0a, 0x0b, - 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x2a, 0xaf, 0x01, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x4d, 0x6f, 0x76, 0x65, 0x10, 0xb9, 0x17, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x47, 0x72, 0x61, 0x62, 0x10, 0xba, 0x17, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, - 0x72, 0x61, 0x62, 0x10, 0xbb, 0x17, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x10, 0xbc, 0x17, 0x42, 0x2b, 0x5a, 0x29, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, - 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x64, 0x6f, 0x6c, 0x6c, 0x6d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_dollmachine_proto_rawDescOnce sync.Once - file_dollmachine_proto_rawDescData = file_dollmachine_proto_rawDesc -) - -func file_dollmachine_proto_rawDescGZIP() []byte { - file_dollmachine_proto_rawDescOnce.Do(func() { - file_dollmachine_proto_rawDescData = protoimpl.X.CompressGZIP(file_dollmachine_proto_rawDescData) - }) - return file_dollmachine_proto_rawDescData -} - -var file_dollmachine_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_dollmachine_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_dollmachine_proto_goTypes = []interface{}{ - (DollMachinePacketID)(0), // 0: dollmachine.DollMachinePacketID - (*SMDollMachineMove)(nil), // 1: dollmachine.SMDollMachineMove - (*SMDollMachineGrab)(nil), // 2: dollmachine.SMDollMachineGrab - (*MSDollMachineGrab)(nil), // 3: dollmachine.MSDollMachineGrab - (*MSDollMachineList)(nil), // 4: dollmachine.MSDollMachineList - (*DollMachine)(nil), // 5: dollmachine.DollMachine -} -var file_dollmachine_proto_depIdxs = []int32{ - 5, // 0: dollmachine.MSDollMachineList.data:type_name -> dollmachine.DollMachine - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_dollmachine_proto_init() } -func file_dollmachine_proto_init() { - if File_dollmachine_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_dollmachine_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SMDollMachineMove); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_dollmachine_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SMDollMachineGrab); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_dollmachine_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSDollMachineGrab); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_dollmachine_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSDollMachineList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_dollmachine_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DollMachine); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_dollmachine_proto_rawDesc, - NumEnums: 1, - NumMessages: 5, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_dollmachine_proto_goTypes, - DependencyIndexes: file_dollmachine_proto_depIdxs, - EnumInfos: file_dollmachine_proto_enumTypes, - MessageInfos: file_dollmachine_proto_msgTypes, - }.Build() - File_dollmachine_proto = out.File - file_dollmachine_proto_rawDesc = nil - file_dollmachine_proto_goTypes = nil - file_dollmachine_proto_depIdxs = nil -} diff --git a/protocol/dollmachine/dollmachine.proto b/protocol/dollmachine/dollmachine.proto deleted file mode 100644 index 450795e..0000000 --- a/protocol/dollmachine/dollmachine.proto +++ /dev/null @@ -1,43 +0,0 @@ -syntax = "proto3"; -package dollmachine; -option go_package = "mongo.games.com/game/protocol/dollmachine"; - -//S-GAME M-娃娃机主机 -//娃娃机协议 -enum DollMachinePacketID { - PACKET_SMDollMachineZero = 0; - PACKET_SMDollMachineMove = 3001; - PACKET_SMDollMachineGrab = 3002; - PACKET_MSDollMachineGrab = 3003; - PACKET_MSDollMachineList = 3004; -} - -//移动 -message SMDollMachineMove{ - int32 Snid = 1; - int32 Id = 2; //娃娃机标识 - int32 Direction = 3; // 1-前 2-后 3-左 4-右 -} - -//下抓 -message SMDollMachineGrab{ - int32 TypeId = 1;//1-弱力抓 2 -强力抓 3-必出抓 - int32 Id =2; //娃娃机标识 - int32 Snid = 3; -} - -//返回下抓结果 -message MSDollMachineGrab{ - int32 Snid = 1; - int32 Id = 2; //娃娃机标识 - int32 Result = 3;//1-中奖 其他未中奖 -} - -//返回所有娃娃机连接 -message MSDollMachineList{ - repeated DollMachine data = 1; -} -message DollMachine{ - int32 Id = 1; - int32 Status = 2; //1-空闲 2-无法使用 -} \ No newline at end of file diff --git a/protocol/machine/machine.pb.go b/protocol/machine/machine.pb.go index 576911a..257ca48 100644 --- a/protocol/machine/machine.pb.go +++ b/protocol/machine/machine.pb.go @@ -24,12 +24,13 @@ const ( type DollMachinePacketID int32 const ( - DollMachinePacketID_PACKET_SMDollMachineZero DollMachinePacketID = 0 - DollMachinePacketID_PACKET_SMGameLinkSucceed DollMachinePacketID = 20000 - DollMachinePacketID_PACKET_SMDollMachinePerate DollMachinePacketID = 20001 - DollMachinePacketID_PACKET_SMDollMachineGrab DollMachinePacketID = 20002 - DollMachinePacketID_PACKET_MSDollMachineGrab DollMachinePacketID = 20003 - DollMachinePacketID_PACKET_MSDollMachineList DollMachinePacketID = 20004 + DollMachinePacketID_PACKET_SMDollMachineZero DollMachinePacketID = 0 + DollMachinePacketID_PACKET_SMGameLinkSucceed DollMachinePacketID = 20000 + DollMachinePacketID_PACKET_SMDollMachinePerate DollMachinePacketID = 20001 + DollMachinePacketID_PACKET_SMDollMachineGrab DollMachinePacketID = 20002 + DollMachinePacketID_PACKET_MSDollMachineGrab DollMachinePacketID = 20003 + DollMachinePacketID_PACKET_MSDollMachineList DollMachinePacketID = 20004 + DollMachinePacketID_PACKET_MSUpdateDollMachineStatus DollMachinePacketID = 20005 ) // Enum value maps for DollMachinePacketID. @@ -41,14 +42,16 @@ var ( 20002: "PACKET_SMDollMachineGrab", 20003: "PACKET_MSDollMachineGrab", 20004: "PACKET_MSDollMachineList", + 20005: "PACKET_MSUpdateDollMachineStatus", } DollMachinePacketID_value = map[string]int32{ - "PACKET_SMDollMachineZero": 0, - "PACKET_SMGameLinkSucceed": 20000, - "PACKET_SMDollMachinePerate": 20001, - "PACKET_SMDollMachineGrab": 20002, - "PACKET_MSDollMachineGrab": 20003, - "PACKET_MSDollMachineList": 20004, + "PACKET_SMDollMachineZero": 0, + "PACKET_SMGameLinkSucceed": 20000, + "PACKET_SMDollMachinePerate": 20001, + "PACKET_SMDollMachineGrab": 20002, + "PACKET_MSDollMachineGrab": 20003, + "PACKET_MSDollMachineList": 20004, + "PACKET_MSUpdateDollMachineStatus": 20005, } ) @@ -413,6 +416,62 @@ func (x *DollMachine) GetVideoAddr() string { return "" } +//更新娃娃机状态 +type MSUpdateDollMachineStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` + Status int32 `protobuf:"varint,2,opt,name=Status,proto3" json:"Status,omitempty"` //1-空闲 0-无法使用 +} + +func (x *MSUpdateDollMachineStatus) Reset() { + *x = MSUpdateDollMachineStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_machine_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MSUpdateDollMachineStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MSUpdateDollMachineStatus) ProtoMessage() {} + +func (x *MSUpdateDollMachineStatus) ProtoReflect() protoreflect.Message { + mi := &file_machine_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MSUpdateDollMachineStatus.ProtoReflect.Descriptor instead. +func (*MSUpdateDollMachineStatus) Descriptor() ([]byte, []int) { + return file_machine_proto_rawDescGZIP(), []int{6} +} + +func (x *MSUpdateDollMachineStatus) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *MSUpdateDollMachineStatus) GetStatus() int32 { + if x != nil { + return x.Status + } + return 0 +} + var File_machine_proto protoreflect.FileDescriptor var file_machine_proto_rawDesc = []byte{ @@ -441,24 +500,31 @@ var file_machine_proto_rawDesc = []byte{ 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x2a, - 0xd5, 0x01, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5a, - 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, - 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, - 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, - 0x72, 0x61, 0x62, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x10, 0xa4, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x22, + 0x43, 0x0a, 0x19, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x2a, 0xfd, 0x01, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa4, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x10, 0xa5, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, + 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -474,15 +540,16 @@ func file_machine_proto_rawDescGZIP() []byte { } var file_machine_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_machine_proto_goTypes = []interface{}{ - (DollMachinePacketID)(0), // 0: machine.DollMachinePacketID - (*SMGameLinkSucceed)(nil), // 1: machine.SMGameLinkSucceed - (*SMDollMachineoPerate)(nil), // 2: machine.SMDollMachineoPerate - (*SMDollMachineGrab)(nil), // 3: machine.SMDollMachineGrab - (*MSDollMachineGrab)(nil), // 4: machine.MSDollMachineGrab - (*MSDollMachineList)(nil), // 5: machine.MSDollMachineList - (*DollMachine)(nil), // 6: machine.DollMachine + (DollMachinePacketID)(0), // 0: machine.DollMachinePacketID + (*SMGameLinkSucceed)(nil), // 1: machine.SMGameLinkSucceed + (*SMDollMachineoPerate)(nil), // 2: machine.SMDollMachineoPerate + (*SMDollMachineGrab)(nil), // 3: machine.SMDollMachineGrab + (*MSDollMachineGrab)(nil), // 4: machine.MSDollMachineGrab + (*MSDollMachineList)(nil), // 5: machine.MSDollMachineList + (*DollMachine)(nil), // 6: machine.DollMachine + (*MSUpdateDollMachineStatus)(nil), // 7: machine.MSUpdateDollMachineStatus } var file_machine_proto_depIdxs = []int32{ 6, // 0: machine.MSDollMachineList.data:type_name -> machine.DollMachine @@ -571,6 +638,18 @@ func file_machine_proto_init() { return nil } } + file_machine_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MSUpdateDollMachineStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -578,7 +657,7 @@ func file_machine_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_machine_proto_rawDesc, NumEnums: 1, - NumMessages: 6, + NumMessages: 7, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/machine/machine.proto b/protocol/machine/machine.proto index 00b6124..642b236 100644 --- a/protocol/machine/machine.proto +++ b/protocol/machine/machine.proto @@ -12,6 +12,7 @@ enum DollMachinePacketID { PACKET_SMDollMachineGrab = 20002; PACKET_MSDollMachineGrab = 20003; PACKET_MSDollMachineList = 20004; + PACKET_MSUpdateDollMachineStatus = 20005; } //通知链接成功 message SMGameLinkSucceed{ @@ -45,4 +46,9 @@ message MSDollMachineList{ message DollMachine{ int32 Id = 1; string VideoAddr = 2; +} +//更新娃娃机状态 +message MSUpdateDollMachineStatus{ + int32 Id = 1; + int32 Status = 2; //1-空闲 0-无法使用 } \ No newline at end of file diff --git a/public b/public index 682e8f3..d789cca 160000 --- a/public +++ b/public @@ -1 +1 @@ -Subproject commit 682e8f3ccf7d1056210c3ee68c9d1db271d9069d +Subproject commit d789cca81a36ddbaf30e5414b6c4fe530e0631f6 From 49b0c6cc00bf2b8654066f4de28c39251036e3bc Mon Sep 17 00:00:00 2001 From: kxdd <88655@163.com> Date: Tue, 13 Aug 2024 15:33:44 +0800 Subject: [PATCH 02/56] =?UTF-8?q?=E4=B8=8B=E6=8A=93=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DB_GiftCard.dat | Bin 57 -> 57 bytes data/DB_PropExchange.dat | Bin 384 -> 384 bytes data/DB_Task.dat | Bin 5299 -> 5299 bytes gamerule/clawdoll/constants.go | 30 +++++++++++++++---- gamesrv/clawdoll/player_clawdoll.go | 2 +- gamesrv/clawdoll/scene_clawdoll.go | 2 +- gamesrv/clawdoll/scenepolicy_clawdoll.go | 36 +++++++++++++++++++++++ protocol/clawdoll/clawdoll.pb.go | 8 ++--- protocol/clawdoll/clawdoll.proto | 10 ++++--- 9 files changed, 72 insertions(+), 16 deletions(-) diff --git a/data/DB_GiftCard.dat b/data/DB_GiftCard.dat index 15600367ff42a73b75826e6378f02a3bde3a8661..96640b07f274cbbbda035ee3e52503c8356a73cb 100644 GIT binary patch delta 38 pcmcDtoFJjd$+57PP2j+^jZ8{x92eV|1-P_0AVMv+2JBXh3;@YB39kSE delta 38 pcmcDtoFJjd#&NNYS%6E4lVf2oo4|o-8=15?Aj}q919mG$1^~Z739kSE diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat index 9d60e50768e4d0593912d1e8d1e4301c7adb3da3..ddbdc0089ad7d52d32fd9b49f8b652cfbc000798 100644 GIT binary patch literal 384 zcmd-w<6snElw#w!+{O&1uR!UmQ2H8_z7C?5I5-yevI!h$vE|a^U;?YZ4VAwErEfy% zTWIRTIUweP#j)52vj^QAm^;As1NDLJQ{n`>qhakM7Oq$h7O+EL3SkDJI0U8;Ik1}#(+9I3#Xg|BVCJKm%L#Tz!`eqIT(KN1V26Mm2-E;G5bOXTAExmR)L}4- WaCsDLp%OdCBA`dVFmo}`76JfeB0Mz! diff --git a/data/DB_Task.dat b/data/DB_Task.dat index 95a4c56dab6ed585319eb9356a5fbd5cf6678ac7..e5e5cb7cb8e0a7edfd0f1ab65b428863d457a5f7 100644 GIT binary patch delta 238 zcmdn2xmk0=d#1@H93qpMnKuctaV+X(6JYe>;8+Nx546~BKE@o#2o%29#w@@E6~3_4 zXR`*YIHMp$RYPZ$7epWHs%v&daWffp#+O&67pgMK-hZNHfVo?1dSy;E-Gt6C)#+1IJaM9kP=hc*Q4&@lBds!XY^MC*L!$ MgSa+-;6Ka)0H{ee@c;k- diff --git a/gamerule/clawdoll/constants.go b/gamerule/clawdoll/constants.go index 5f361d0..735ee60 100644 --- a/gamerule/clawdoll/constants.go +++ b/gamerule/clawdoll/constants.go @@ -12,14 +12,32 @@ const ( ) const ( - ClawDollSceneWaitTimeout = time.Second * 2 //等待倒计时 - ClawDollSceneStartTimeout = time.Second * 6 //开始倒计时 - ClawDollSceneBilledTimeout = time.Second * 2 //结算 + ClawDollSceneWaitTimeout = time.Second * 6 //等待倒计时 + ClawDollSceneStartTimeout = time.Second * 15 //开始倒计时 + ClawDollSceneBilledTimeout = time.Second * 2 //结算 ) // 玩家操作 const ( - ClawDollPlayerOpScore = iota + 1 // 上分 - ClawDollPlayerOpGo // 下抓 - ClawDollPlayerOpMove // 移动方向 + ClawDollPlayerOpPayCoin = iota + 1 // 上分 投币 + ClawDollPlayerOpGo // 下抓 + ClawDollPlayerOpMove // 玩家操控动作 // 1-前 2-后 3-左 4-右 +) + +const ( + ButtonFront = iota + 1 /*前*/ + ButtonBack /*后*/ + ButtonLeft /*左*/ + ButtonRight /*右*/ +) + +const ( + MoveStop = 0 /*移动停止*/ + MoveStar = 1 /*移动开始*/ +) + +const ( + ClawWeak = iota + 1 //弱力抓 + ClawStrong //强力抓 + ClawGain //必出抓 ) diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index e7559b3..bba7f72 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -31,7 +31,7 @@ func (this *PlayerEx) CanOp(sceneEx *SceneEx) bool { return true } -func (this *PlayerEx) CanPayCoinByPos() bool { +func (this *PlayerEx) CanPayCoin() bool { return false } diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index b663a30..994eb68 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -92,7 +92,7 @@ func (e *SceneEx) playerOpPack(snId int32, opcode int, opRetCode clawdoll.OpResu SnId: proto.Int32(snId), OpCode: proto.Int32(int32(opcode)), Params: params, - OpRetCode: clawdoll.OpResultCode_OPRC_Success, + OpRetCode: opRetCode, } proto.SetDefaults(pack) diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 4b8ef1e..0ef2a83 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -3,6 +3,7 @@ package clawdoll import ( "mongo.games.com/game/gamesrv/action" "mongo.games.com/game/protocol/clawdoll" + "mongo.games.com/game/protocol/machine" "time" "mongo.games.com/goserver/core" @@ -444,6 +445,11 @@ func (this *StateStart) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, pa return true } + switch opcode { + case rule.ClawDollPlayerOpPayCoin: + + } + return false } @@ -503,6 +509,36 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para return true } + sceneEx, ok := s.ExtraData.(*SceneEx) + if !ok { + return false + } + playerEx, ok := p.ExtraData.(*PlayerEx) + if !ok { + return false + } + + switch opcode { + case rule.ClawDollPlayerOpPayCoin: + // 投币检测 + if !playerEx.CanPayCoin() { + return false + } + sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) + + case rule.ClawDollPlayerOpGo: + + pack := &machine.SMDollMachineGrab{ + Snid: proto.Int32(playerEx.SnId), + Id: proto.Int32(int32(sceneEx.machineId)), + TypeId: proto.Int32(int32(1)), + } + + sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), pack) + case rule.ClawDollPlayerOpMove: + + } + return false } diff --git a/protocol/clawdoll/clawdoll.pb.go b/protocol/clawdoll/clawdoll.pb.go index e395726..437be49 100644 --- a/protocol/clawdoll/clawdoll.pb.go +++ b/protocol/clawdoll/clawdoll.pb.go @@ -394,8 +394,8 @@ type CSCLAWDOLLOp struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OpCode int32 `protobuf:"varint,1,opt,name=OpCode,proto3" json:"OpCode,omitempty"` - Params []int64 `protobuf:"varint,2,rep,packed,name=Params,proto3" json:"Params,omitempty"` + OpCode int32 `protobuf:"varint,1,opt,name=OpCode,proto3" json:"OpCode,omitempty"` //操作码 1:上分 投币 2:下抓 3:玩家操控动作 + Params []int64 `protobuf:"varint,2,rep,packed,name=Params,proto3" json:"Params,omitempty"` //操作参数 1:无 } func (x *CSCLAWDOLLOp) Reset() { @@ -522,8 +522,8 @@ type SCCLAWDOLLRoundGameBilled struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RoundId int32 `protobuf:"varint,1,opt,name=RoundId,proto3" json:"RoundId,omitempty"` //牌局ID - ClowResult int32 `protobuf:"varint,2,opt,name=ClowResult,proto3" json:"ClowResult,omitempty"` //抓取结果 + RoundId int32 `protobuf:"varint,1,opt,name=RoundId,proto3" json:"RoundId,omitempty"` //局ID + ClowResult int32 `protobuf:"varint,2,opt,name=ClowResult,proto3" json:"ClowResult,omitempty"` //抓取结果 0: 没有抓住, 1:抓住娃娃 Award int64 `protobuf:"varint,3,opt,name=Award,proto3" json:"Award,omitempty"` //获奖金额 Balance int64 `protobuf:"varint,4,opt,name=Balance,proto3" json:"Balance,omitempty"` //玩家余额 } diff --git a/protocol/clawdoll/clawdoll.proto b/protocol/clawdoll/clawdoll.proto index e7091b2..579ae56 100644 --- a/protocol/clawdoll/clawdoll.proto +++ b/protocol/clawdoll/clawdoll.proto @@ -56,8 +56,10 @@ message SCCLAWDOLLRoomInfo { //玩家操作 message CSCLAWDOLLOp { - int32 OpCode = 1; - repeated int64 Params = 2; + int32 OpCode = 1; //操作码 1:上分 投币 2:下抓 3:玩家操控动作 + repeated int64 Params = 2; //操作参数 1:无 + //操作参数 2:无 + //操作参数 3:Params[0] 1-前 2-后 3-左 4-右 } //玩家操作返回 @@ -70,8 +72,8 @@ message SCCLAWDOLLOp { //发送给客户端的数据 单局结算 message SCCLAWDOLLRoundGameBilled { - int32 RoundId = 1; //牌局ID - int32 ClowResult = 2; //抓取结果 + int32 RoundId = 1; //局ID + int32 ClowResult = 2; //抓取结果 0: 没有抓住, 1:抓住娃娃 int64 Award = 3; //获奖金额 int64 Balance = 4; //玩家余额 } From 775280e03f334423dab2d5ca2991f9b52a8232f3 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Wed, 14 Aug 2024 11:33:03 +0800 Subject: [PATCH 03/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 132 ++++++++++++-------- machine/machinedoll/command.go | 195 +++++++++++++++++++++--------- machine/machinedoll/machinemgr.go | 166 ++++++++++++++----------- 3 files changed, 320 insertions(+), 173 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 36963fe..b67ff98 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -2,99 +2,131 @@ package action import ( "fmt" - "mongo.games.com/game/machine/machinedoll" - "mongo.games.com/game/protocol/machine" + "net" + "time" + + "mongo.games.com/goserver/core/basic" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" - "time" + "mongo.games.com/goserver/core/task" + "mongo.games.com/goserver/core/timer" + + "mongo.games.com/game/machine/machinedoll" + "mongo.games.com/game/protocol/machine" ) +type DoneFunc func(c net.Conn) + +func Process(conn *machinedoll.Conn, sec time.Duration, f1, f2 []DoneFunc, isSync bool) { + var ch chan struct{} + if isSync { + ch = make(chan struct{}, 1) + } + task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { + for _, v := range f1 { + v(conn) + } + if len(f2) > 0 { + timer.AfterTimer(func(h timer.TimerHandle, ud interface{}) bool { + Process(conn, 0, f2, nil, isSync) + if isSync { + ch <- struct{}{} + } + return true + }, nil, sec) + } else { + if isSync { + ch <- struct{}{} + } + } + return nil + }), nil).StartByFixExecutor(fmt.Sprintf("Machine%v", conn.Addr)) + if isSync { + <-ch + } +} + // 移动 func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data interface{}) error { + logger.Logger.Tracef("SMDollMachinePerateHandler %v", data) msg, ok := data.(*machine.SMDollMachineoPerate) if !ok { return nil } - conn := machinedoll.ConnMap[int(msg.Id)] - if conn == nil { + + conn, ok := machinedoll.MachineMgr.ConnMap[int(msg.GetId())] + if !ok || conn == nil { return nil } - if msg.Perate == 1 { + + switch msg.Perate { + case 1: //向前移动 - machinedoll.Backward(conn) - time.Sleep(200 * time.Millisecond) - machinedoll.BackwardStop(conn) - } else if msg.Perate == 2 { + Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Backward}, []DoneFunc{machinedoll.BackwardStop}, false) + case 2: //向后移动 - machinedoll.Forward(conn) - time.Sleep(200 * time.Millisecond) - machinedoll.ForwardStop(conn) - } else if msg.Perate == 3 { + Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Forward}, []DoneFunc{machinedoll.ForwardStop}, false) + case 3: //向左移动 - machinedoll.Left(conn) - time.Sleep(200 * time.Millisecond) - machinedoll.LeftStop(conn) - } else if msg.Perate == 4 { + Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Left}, []DoneFunc{machinedoll.LeftStop}, false) + case 4: //向右移动 - machinedoll.Right(conn) - time.Sleep(200 * time.Millisecond) - machinedoll.RightStop(conn) - } else if msg.Perate == 5 { + Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Right}, []DoneFunc{machinedoll.RightStop}, false) + case 5: //投币 - machinedoll.Coin(conn) - machinedoll.Backward(conn) - time.Sleep(200 * time.Millisecond) - machinedoll.BackwardStop(conn) + Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Coin, machinedoll.Backward}, []DoneFunc{machinedoll.BackwardStop}, false) } return nil } // 下抓 func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interface{}) error { + logger.Logger.Tracef("SMDollMachineGrabHandler %v", data) msg, ok := data.(*machine.SMDollMachineGrab) if !ok { return nil } - conn := machinedoll.ConnMap[int(msg.Id)] - if conn == nil { + + conn, ok := machinedoll.MachineMgr.ConnMap[int(msg.GetId())] + if !ok || conn == nil { return nil } - typeId := msg.TypeId - if typeId == 1 { - //弱抓 - machinedoll.WeakGrab(conn) - } else if typeId == 2 { - //强力抓 - machinedoll.Grab(conn) - } else if typeId == 3 { - //必中抓 - machinedoll.SetPower(conn) - time.Sleep(200 * time.Millisecond) - machinedoll.Grab(conn) + + send := func(net.Conn) { + session.Send(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), &machine.MSDollMachineGrab{ + Snid: msg.Snid, + Id: msg.GetId(), + Result: 1, + }) + } + + switch msg.GetTypeId() { + case 1: + //弱抓 + Process(conn, 0, []DoneFunc{machinedoll.WeakGrab}, []DoneFunc{send}, false) + case 2: + //强力抓 + Process(conn, 0, []DoneFunc{machinedoll.Grab}, []DoneFunc{send}, false) + case 3: + //必中抓 + Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.SetPower}, []DoneFunc{machinedoll.Grab, send}, false) } - //返回消息 - session.Send(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), &machine.MSDollMachineGrab{ - Snid: msg.Snid, - Id: msg.GetId(), - Result: 1, - }) return nil } // 与游戏服务器连接成功,向游戏服务器推送所有娃娃机连接 func SMGameLinkSucceedHandler(session *netlib.Session, packetId int, data interface{}) error { - logger.Logger.Trace("与游戏服务器连接成功!!\n") - fmt.Printf("与游戏服务器连接成功!!\n") + logger.Logger.Trace("与游戏服务器连接成功") //开始向游戏服务器发送娃娃机连接信息 msg := &machine.MSDollMachineList{} - for i, _ := range machinedoll.ConnMap { + for i, _ := range machinedoll.MachineMgr.ConnMap { info := &machine.DollMachine{} info.Id = int32(i) info.VideoAddr = "www.baidu.com" msg.Data = append(msg.Data, info) } session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), msg) - fmt.Printf("开始向游戏服务器发送娃娃机连接信息!\n", msg) + logger.Logger.Tracef("向游戏服务器发送娃娃机连接信息:%v", msg) return nil } func init() { diff --git a/machine/machinedoll/command.go b/machine/machinedoll/command.go index ea8b82b..9e56bb7 100644 --- a/machine/machinedoll/command.go +++ b/machine/machinedoll/command.go @@ -110,6 +110,32 @@ func Grab(conn net.Conn) { fmt.Println("Failed to read response from server:", err) return } + instruction = []byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd} + _, err = conn.Write(instruction) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } +} + +// 必中抓 +func Grab2(conn net.Conn) { + //设置电压 + + instruction := []byte{0xAA, 0x05, 0x01, 0x50, 0x06, 0x01} + instruction = calculateChecksum(instruction) + _, err := conn.Write(instruction) + if err != nil { + fmt.Println("Failed to send command to server:", err) + return + } + // 读取服务端的响应 + buf := make([]byte, 1024) + _, err = conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } } // 弱抓aa 05 01 50 06 00 52 dd @@ -187,6 +213,7 @@ func OpenMusic(conn net.Conn) { instruction := []byte{0xAA, 0x33, 0x01, 0x06} instruction = append(instruction, data...) instruction = calculateChecksum(instruction) + //instruction[1] = byte(len(instruction) - 3) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -303,15 +330,11 @@ func queryBaseParam(conn net.Conn) { fmt.Println("n", n) } -// 设置强力 +// 设置出奖模式 func SetPower(conn net.Conn) { - data[3] = 0x00 - data[16] = 0x01 - data[17] = 0xE0 - data[18] = 0x13 - data[19] = 0x88 + data[3] = 0x01 fmt.Println("data.len = ", len(data)) - instruction := []byte{0xAA, 0x33, 0x01, 0x06} + instruction := []byte{0xAA, 0x04, 0x01, 0x06} instruction = append(instruction, data...) instruction = calculateChecksum(instruction) _, err := conn.Write(instruction) @@ -330,52 +353,114 @@ func SetPower(conn net.Conn) { } var data = []byte{ - 0x65, - 0x00, - 0x0F, - 0x02, - 0x0F, - 0x00, - 0x01, - 0x00, - 0x00, - 0x01, - 0xC8, - 0x00, - 0x7C, - 0x01, - 0x5A, - 0x00, - 0xE0, - 0x01, - 0xC8, - 0x00, - 0x14, - 0x32, - 0x32, - 0x50, - 0x34, - 0x08, - 0x00, - 0x00, - 0x00, - 0x00, - 0x78, - 0x00, - 0x32, - 0x02, - 0x00, - 0x00, - 0xC8, - 0x00, - 0x96, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x0F, - 0x07, - 0x08, - 0x00, + 0x65, //0 几币几玩 + 0x00, //1 几币几玩占用位 + 0x1E, //2 游戏时间 + 0x00, //3 出奖模式 + 0x0F, //4 出奖概率 + 0x00, //5 出奖概率占用位 + 0x00, //6 空中抓物 0关闭 1开启 + 0x00, //7 连续投币赠送 范围0~100 + 0x00, //8 保夹次数 范围0~6, 6为无限次 + 0x01, //9 保夹赠送模式 0送游戏 1送中奖 2送游戏和中奖 + + 0x04, //10 强抓力电压 + 0x50, //11 强抓力电压占用位 + 0x7C, //12 中抓力电压 + 0x00, //13 中抓力电压占用位 + 0x5A, //14 弱抓力电压 + 0x00, //15 弱抓力电压占用位 + 0xE0, //16 中奖电压 + 0x01, //17 中奖电压占用位 + 0xC8, //18 强抓力时间 + 0x00, //19 强抓力时间占用位 + + 0x14, //20 放抓时间 + 0x32, //21 前后速度 + 0x32, //22 左右速度 + 0x50, //23 上下速度 + 0x34, //24 放线长度 + 0x08, //25 放线长度占用位 + 0x00, //26 礼品下放高度 + 0x00, //27 礼品下放高度占用位 + 0x00, //28 甩抓长度 + 0x00, //29 甩抓保护 + + 0x78, //30 甩抓电压 + 0x00, //31 甩抓电压占用位 + 0x32, //32 上拉保护 + 0x02, //33 天车自救时间 + 0x00, //34 下抓延时 + 0x00, //35 下抓延时占用位 + 0xC8, //36 抓物延时 + 0x00, //37 抓物延时占用位 + 0x96, //38 上停延时 + 0x00, //39 上停延时占用位 + + 0x00, //40 摇杆延时 + 0x00, //41 摇杆延时占用位 + 0x00, //42 抓物二收 + 0x00, //43 待机音乐开关 + 0x0F, //44 音量大小调整 + 0x07, //45 待机音乐选择 + 0x08, //46 游戏音乐选择 + 0x00, //47 概率队列自动 } + +/* +var data = []byte{ + 101, //0 几币几玩 + 0, //1 几币几玩占用位 + 30, //2 游戏时间 + 0, //3 出奖模式0无概率 1随机模式 2固定模式 3冠兴模式 + 15, //4 出奖概率 + 0, //5 出奖概率占用位 + 1, //6 空中抓物 0关闭 1开启 + 0, //7 连续投币赠送 范围0~100 + 0, //8 保夹次数 范围0~6, 6为无限次 + 1, //9 保夹赠送模式 0送游戏 1送中奖 2送游戏和中奖 + + 200, //10 强抓力电压 + 0, //11 强抓力电压占用位 + 124, //12 中抓力电压 + 1, //13 中抓力电压占用位 + 90, //14 弱抓力电压 + 0, //15 弱抓力电压占用位 + 224, //16 中奖电压 + 1, //17 中奖电压占用位 + 200, //18 强抓力时间 + 0, //19 强抓力时间占用位 + + 20, //20 放抓时间 + 50, //21 前后速度 + 50, //22 左右速度 + 80, //23 上下速度 + 52, //24 放线长度 + 8, //25 放线长度占用位 + 0, //26 礼品下放高度 + 0, //27 礼品下放高度占用位 + 0, //28 甩抓长度 + 0, //29 甩抓保护 + + 120, //30 甩抓电压 + 0, //31 甩抓电压占用位 + 50, //32 上拉保护 + 2, //33 天车自救时间 + 0, //34 下抓延时 + 0, //35 下抓延时占用位 + 200, //36 抓物延时 + 0, //37 抓物延时占用位 + 150, //38 上停延时 + 0, //39 上停延时占用位 + + 0, //40 摇杆延时 + 0, //41 摇杆延时占用位 + 0, //42 抓物二收 + 1, //43 待机音乐开关 + 15, //44 音量大小调整 + 7, //45 待机音乐选择 + 8, //46 游戏音乐选择 + 0, //47 概率队列自动 +} + +*/ diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index 196850e..db51ca6 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -3,38 +3,45 @@ package machinedoll import ( "encoding/json" "fmt" - "mongo.games.com/goserver/core/timer" - "os/signal" - "syscall" - - "mongo.games.com/game/protocol/machine" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/srvlib" "net" "os" + "os/signal" "path/filepath" + "syscall" "time" + + "mongo.games.com/goserver/core/basic" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/module" + "mongo.games.com/goserver/core/netlib" + "mongo.games.com/goserver/core/task" + "mongo.games.com/goserver/srvlib" + + "mongo.games.com/game/protocol/machine" ) var GameConn *netlib.Session -var ConnMap = make(map[int]net.Conn) - -type MachineManager struct { - DelConnMap map[int]string -} var MachineMgr = &MachineManager{ + ConnMap: map[int]*Conn{}, DelConnMap: make(map[int]string), } +type Conn struct { + Id int + net.Conn + Addr string +} + +type MachineManager struct { + ConnMap map[int]*Conn + DelConnMap map[int]string +} + func (this *MachineManager) ModuleName() string { return "MachineManager" } -// 心跳间隔时间(秒) -const heartbeatInterval = 1 - func (this *MachineManager) Init() { var serverAddrs []string programDir, err := os.Getwd() @@ -62,70 +69,91 @@ func (this *MachineManager) Init() { fmt.Println("Failed to connect to server:", err) continue } - ConnMap[i+1] = conn - go this.StartHeartbeat(i+1, &conn, addr) + this.ConnMap[i+1] = &Conn{ + Id: i + 1, + Conn: conn, + Addr: addr, + } + } - fmt.Println("Connected to server:\n", ConnMap[1].RemoteAddr()) + fmt.Println("Connected to server:\n", this.ConnMap[1].RemoteAddr()) fmt.Println("投币请按Q!!!!") fmt.Println("w向前s向后a向左d向右 j强力抓取k弱力抓取!") // 监听 WASD 按键事件 - /* go listenKeyboardEvents(ConnMap[1]) + go listenKeyboardEvents(this.ConnMap[1]) + + // 监听中断信号,等待用户退出 + waitForUserExit() - // 监听中断信号,等待用户退出 - waitForUserExit()*/ } -func (this *MachineManager) StartHeartbeat(id int, conn *net.Conn, addr string) { - // 定期发送心跳包 - ticker := time.NewTicker(heartbeatInterval * time.Second) - defer ticker.Stop() - for { - select { - case <-ticker.C: - // 发送心跳包 - _, err := (*conn).Write([]byte("heartbeat")) +func (this *MachineManager) Update() { + var delConn []*Conn + task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { + for _, v := range this.ConnMap { + _, err := v.Write([]byte("heartbeat")) if err != nil { - fmt.Println("Failed to send heartbeat:", err) - delete(ConnMap, id) - this.DelConnMap[id] = addr - //通知游戏服 - this.UpdateToGameServer(id, 0) - fmt.Println("删除链接!!!!!!addr = ", addr) - go timer.StartTimer(timer.TimerActionWrapper(func(h timer.TimerHandle, ud interface{}) bool { - this.ReConnect() - return true - }), nil, time.Duration(5)*time.Second, 100) - return + delConn = append(delConn, v) + v.Close() + logger.Logger.Tracef("断开连接:%v", v.Addr) } } - } -} - -// 重连 -func (this *MachineManager) ReConnect() bool { - fmt.Println("================重连============") - delIds := []int{} - for id, addr := range this.DelConnMap { - conn, err := net.DialTimeout("tcp", addr, 5*time.Second) - if err != nil { - continue + return nil + }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { + for _, v := range delConn { + delete(this.ConnMap, v.Id) + this.DelConnMap[v.Id] = v.Addr } - ConnMap[id] = conn - delIds = append(delIds, id) - this.UpdateToGameServer(id, 1) - } - for _, id := range delIds { - delete(this.DelConnMap, id) - fmt.Println("重新链接成功!!!!!!id = ", id) - } - return false + if len(delConn) > 0 { + this.UpdateToGameServer() + } + // 重连 + var delIds []*Conn + status := false + task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { + for id, addr := range this.DelConnMap { + conn, err := net.DialTimeout("tcp", addr, 5*time.Second) + if err != nil { + continue + } + logger.Logger.Tracef("重连成功:%v", addr) + delIds = append(delIds, &Conn{ + Id: id, + Conn: conn, + Addr: addr, + }) + status = true + } + return nil + }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { + for _, v := range delIds { + this.ConnMap[v.Id] = v + delete(this.DelConnMap, v.Id) + } + if status { + this.UpdateToGameServer() + } + })).StartByFixExecutor(this.ModuleName()) + })).StartByFixExecutor(this.ModuleName()) } -func (this *MachineManager) UpdateToGameServer(id int, status int32) { - msg := &machine.MSUpdateDollMachineStatus{} - msg.Status = status - msg.Id = int32(id) - SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSUpdateDollMachineStatus), msg) +func (this *MachineManager) Shutdown() { + for _, v := range this.ConnMap { + v.Close() + } + this.UpdateToGameServer() + module.UnregisteModule(this) +} + +func (this *MachineManager) UpdateToGameServer() { + msg := &machine.MSDollMachineList{} + for i, _ := range this.ConnMap { + info := &machine.DollMachine{} + info.Id = int32(i) + info.VideoAddr = "www.baidu.com" + msg.Data = append(msg.Data, info) + } + SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), msg) } func SendToGameServer(pid int, msg interface{}) { @@ -140,7 +168,7 @@ func SendToGameServer(pid int, msg interface{}) { } func init() { - MachineMgr.Init() + module.RegisteModule(MachineMgr, time.Second, 0) } func listenKeyboardEvents(conn net.Conn) { @@ -218,6 +246,8 @@ func listenKeyboardEvents(conn net.Conn) { SetPower(conn) case "8": CloseMusic(conn) + case "9": + queryBaseParam(conn) } } } From 6ea5fb3943f058d6ea62e5fd7a02700bf2179efe Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Wed, 14 Aug 2024 11:37:03 +0800 Subject: [PATCH 04/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E6=8A=95?= =?UTF-8?q?=E5=B8=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index b67ff98..7be9270 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -74,7 +74,7 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Right}, []DoneFunc{machinedoll.RightStop}, false) case 5: //投币 - Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Coin, machinedoll.Backward}, []DoneFunc{machinedoll.BackwardStop}, false) + Process(conn, 0*time.Millisecond, []DoneFunc{machinedoll.Coin, machinedoll.Coin}, []DoneFunc{}, false) } return nil } From d2a8b0e6189e7fe919064ac53d67fc660048aab0 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Wed, 14 Aug 2024 12:06:15 +0800 Subject: [PATCH 05/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/action/action_machine.go | 14 +++++++- machine/machinedoll/machinemgr.go | 43 +++++++++++------------- protocol/machine/machine.pb.go | 54 ++++++++++++++++++------------- protocol/machine/machine.proto | 1 + 4 files changed, 64 insertions(+), 48 deletions(-) diff --git a/gamesrv/action/action_machine.go b/gamesrv/action/action_machine.go index 61d61a9..d6a5b9c 100644 --- a/gamesrv/action/action_machine.go +++ b/gamesrv/action/action_machine.go @@ -50,13 +50,25 @@ func GetFreeDollMachineId() int { // 获取指定娃娃机链接状态 func GetDollMachineStatus(id int) int32 { + if MachineMap[id] == nil { + return 0 + } return MachineMap[id].MachineStatus } func MSUpdateDollMachineStatusHandler(session *netlib.Session, packetId int, data interface{}) error { logger.Logger.Tracef("MSUpdateDollMachineStatusHandler %v", data) if msg, ok := data.(*machine.MSUpdateDollMachineStatus); ok { - MachineMap[int(msg.Id)].MachineStatus = msg.Status + if MachineMap[int(msg.Id)] == nil { + MachineMap[int(msg.Id)] = &DollMachine{ + Id: int(msg.Id), + Status: false, + VideoAddr: msg.VideoAddr, + MachineStatus: msg.Status, + } + } else { + MachineMap[int(msg.Id)].MachineStatus = msg.Status + } logger.Logger.Tracef("更新娃娃机连接状态 id = %d,status= %d", msg.Id, msg.GetStatus()) } return nil diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index db51ca6..cc40046 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -76,14 +76,14 @@ func (this *MachineManager) Init() { } } - fmt.Println("Connected to server:\n", this.ConnMap[1].RemoteAddr()) - fmt.Println("投币请按Q!!!!") - fmt.Println("w向前s向后a向左d向右 j强力抓取k弱力抓取!") - // 监听 WASD 按键事件 - go listenKeyboardEvents(this.ConnMap[1]) + /* fmt.Println("Connected to server:\n", this.ConnMap[1].RemoteAddr()) + fmt.Println("投币请按Q!!!!") + fmt.Println("w向前s向后a向左d向右 j强力抓取k弱力抓取!") + // 监听 WASD 按键事件 + go listenKeyboardEvents(this.ConnMap[1]) - // 监听中断信号,等待用户退出 - waitForUserExit() + // 监听中断信号,等待用户退出 + waitForUserExit()*/ } @@ -96,6 +96,7 @@ func (this *MachineManager) Update() { delConn = append(delConn, v) v.Close() logger.Logger.Tracef("断开连接:%v", v.Addr) + this.UpdateToGameServer(int32(v.Id), 0, v.Addr) } } return nil @@ -104,12 +105,9 @@ func (this *MachineManager) Update() { delete(this.ConnMap, v.Id) this.DelConnMap[v.Id] = v.Addr } - if len(delConn) > 0 { - this.UpdateToGameServer() - } + // 重连 var delIds []*Conn - status := false task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { for id, addr := range this.DelConnMap { conn, err := net.DialTimeout("tcp", addr, 5*time.Second) @@ -122,16 +120,13 @@ func (this *MachineManager) Update() { Conn: conn, Addr: addr, }) - status = true } return nil }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { for _, v := range delIds { this.ConnMap[v.Id] = v delete(this.DelConnMap, v.Id) - } - if status { - this.UpdateToGameServer() + this.UpdateToGameServer(int32(v.Id), 1, v.Addr) } })).StartByFixExecutor(this.ModuleName()) })).StartByFixExecutor(this.ModuleName()) @@ -140,20 +135,18 @@ func (this *MachineManager) Update() { func (this *MachineManager) Shutdown() { for _, v := range this.ConnMap { v.Close() + this.UpdateToGameServer(int32(v.Id), 0, v.Addr) } - this.UpdateToGameServer() + module.UnregisteModule(this) } -func (this *MachineManager) UpdateToGameServer() { - msg := &machine.MSDollMachineList{} - for i, _ := range this.ConnMap { - info := &machine.DollMachine{} - info.Id = int32(i) - info.VideoAddr = "www.baidu.com" - msg.Data = append(msg.Data, info) - } - SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), msg) +func (this *MachineManager) UpdateToGameServer(id int32, status int32, VideoAddr string) { + msg := &machine.MSUpdateDollMachineStatus{} + msg.Id = id + msg.Status = status + msg.VideoAddr = VideoAddr + SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSUpdateDollMachineStatus), msg) } func SendToGameServer(pid int, msg interface{}) { diff --git a/protocol/machine/machine.pb.go b/protocol/machine/machine.pb.go index 257ca48..b7f2ec9 100644 --- a/protocol/machine/machine.pb.go +++ b/protocol/machine/machine.pb.go @@ -422,8 +422,9 @@ type MSUpdateDollMachineStatus struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` - Status int32 `protobuf:"varint,2,opt,name=Status,proto3" json:"Status,omitempty"` //1-空闲 0-无法使用 + Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` + Status int32 `protobuf:"varint,2,opt,name=Status,proto3" json:"Status,omitempty"` //1-空闲 0-无法使用 + VideoAddr string `protobuf:"bytes,3,opt,name=VideoAddr,proto3" json:"VideoAddr,omitempty"` } func (x *MSUpdateDollMachineStatus) Reset() { @@ -472,6 +473,13 @@ func (x *MSUpdateDollMachineStatus) GetStatus() int32 { return 0 } +func (x *MSUpdateDollMachineStatus) GetVideoAddr() string { + if x != nil { + return x.VideoAddr + } + return "" +} + var File_machine_proto protoreflect.FileDescriptor var file_machine_proto_rawDesc = []byte{ @@ -501,30 +509,32 @@ var file_machine_proto_rawDesc = []byte{ 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x22, - 0x43, 0x0a, 0x19, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, + 0x61, 0x0a, 0x19, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x2a, 0xfd, 0x01, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, + 0x64, 0x72, 0x2a, 0xfd, 0x01, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa4, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, - 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x10, 0xa5, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, - 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa4, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, + 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0xa5, + 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, + 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/protocol/machine/machine.proto b/protocol/machine/machine.proto index 642b236..8d941c7 100644 --- a/protocol/machine/machine.proto +++ b/protocol/machine/machine.proto @@ -51,4 +51,5 @@ message DollMachine{ message MSUpdateDollMachineStatus{ int32 Id = 1; int32 Status = 2; //1-空闲 0-无法使用 + string VideoAddr = 3; } \ No newline at end of file From b9191e05380e3c838033cbeb558de57761e1015a Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Wed, 14 Aug 2024 13:43:42 +0800 Subject: [PATCH 06/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/machinedoll/machinemgr.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index cc40046..3c6827d 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -96,7 +96,7 @@ func (this *MachineManager) Update() { delConn = append(delConn, v) v.Close() logger.Logger.Tracef("断开连接:%v", v.Addr) - this.UpdateToGameServer(int32(v.Id), 0, v.Addr) + this.UpdateToGameServer(v, 0) } } return nil @@ -126,7 +126,7 @@ func (this *MachineManager) Update() { for _, v := range delIds { this.ConnMap[v.Id] = v delete(this.DelConnMap, v.Id) - this.UpdateToGameServer(int32(v.Id), 1, v.Addr) + this.UpdateToGameServer(v, 1) } })).StartByFixExecutor(this.ModuleName()) })).StartByFixExecutor(this.ModuleName()) @@ -135,17 +135,17 @@ func (this *MachineManager) Update() { func (this *MachineManager) Shutdown() { for _, v := range this.ConnMap { v.Close() - this.UpdateToGameServer(int32(v.Id), 0, v.Addr) + this.UpdateToGameServer(v, 0) } module.UnregisteModule(this) } -func (this *MachineManager) UpdateToGameServer(id int32, status int32, VideoAddr string) { +func (this *MachineManager) UpdateToGameServer(conn *Conn, status int32) { msg := &machine.MSUpdateDollMachineStatus{} - msg.Id = id + msg.Id = int32(conn.Id) msg.Status = status - msg.VideoAddr = VideoAddr + msg.VideoAddr = conn.Addr SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSUpdateDollMachineStatus), msg) } From 1fff8b2ebbd63db125f053336e5ac16a18b46b15 Mon Sep 17 00:00:00 2001 From: kxdd <88655@163.com> Date: Wed, 14 Aug 2024 14:09:05 +0800 Subject: [PATCH 07/56] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/scenepolicy_clawdoll.go | 10 +++++++++- gamesrv/main.go | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 0ef2a83..89cf7c2 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -529,7 +529,7 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para case rule.ClawDollPlayerOpGo: pack := &machine.SMDollMachineGrab{ - Snid: proto.Int32(playerEx.SnId), + Snid: proto.Int32(p.SnId), Id: proto.Int32(int32(sceneEx.machineId)), TypeId: proto.Int32(int32(1)), } @@ -537,6 +537,14 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), pack) case rule.ClawDollPlayerOpMove: + // 1-前 2-后 3-左 4-右 5-投币 + pack := &machine.SMDollMachineoPerate{ + Snid: proto.Int32(p.SnId), + Id: proto.Int32(int32(sceneEx.machineId)), + Perate: proto.Int32(int32(params[0])), + } + + sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), pack) } return false diff --git a/gamesrv/main.go b/gamesrv/main.go index 78d6f35..391ee70 100644 --- a/gamesrv/main.go +++ b/gamesrv/main.go @@ -19,6 +19,7 @@ import ( // game _ "mongo.games.com/game/gamesrv/chess" + _ "mongo.games.com/game/gamesrv/clawdoll" _ "mongo.games.com/game/gamesrv/fishing" _ "mongo.games.com/game/gamesrv/smallrocket" _ "mongo.games.com/game/gamesrv/thirteen" From 4a86c552f5fe13e5b09c5697039e130b150caf74 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Wed, 14 Aug 2024 14:42:20 +0800 Subject: [PATCH 08/56] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DB_GameFree.dat | Bin 22776 -> 22919 bytes data/DB_GameFree.json | 46 +++++++++++++++++++++++++++++++++++++++ data/DB_GiftCard.dat | Bin 57 -> 57 bytes data/DB_PropExchange.dat | Bin 384 -> 384 bytes data/DB_Task.dat | Bin 5299 -> 5299 bytes xlsx/DB_GameFree.xlsx | Bin 61827 -> 62185 bytes 6 files changed, 46 insertions(+) diff --git a/data/DB_GameFree.dat b/data/DB_GameFree.dat index 7ee49a4984bcbd19cd6046bf42d8b3f9d1c9f6b9..a674eca727daa6495aea27d5d883d7ced0202473 100644 GIT binary patch delta 78 zcmV-U0I~o0u>ps(0kHE*F^mBSfsFG45((v~gXO4$=A6133FU>X<%O~4oQ)vg1UP`( k13&>t0b&6#Xak4=fZLOmN(o145@`2aSL24(;N diff --git a/data/DB_GameFree.json b/data/DB_GameFree.json index 0ddecf2..f395c70 100644 --- a/data/DB_GameFree.json +++ b/data/DB_GameFree.json @@ -5363,6 +5363,52 @@ "PlayerWaterRate": 100, "BetWaterRate": 100 }, + { + "Id": 6080001, + "Name": "娃娃机", + "Title": "公共服", + "GameId": 607, + "GameRule": 60800, + "GameType": 1, + "SceneType": 1, + "Desc": "0", + "ShowType": 3, + "ShowId": 60800, + "BaseScore": 1000000, + "BetDec": "0", + "Ai": [ + 0 + ], + "MaxChip": 100000000, + "OtherIntParams": [ + 0 + ], + "Jackpot": [ + 0 + ], + "RobotNumRng": [ + 1, + 1 + ], + "RobotTakeCoin": [ + 80000, + 500000 + ], + "RobotLimitCoin": [ + 1000000, + 2000000 + ], + "BetLimit": 1000000, + "SameIpLimit": 1, + "GameDif": "608", + "GameClass": 1, + "PlatformName": "越南棋牌", + "MaxBetCoin": [ + 0 + ], + "PlayerWaterRate": 100, + "BetWaterRate": 100 + }, { "Id": 3010001, "Name": "财运神", diff --git a/data/DB_GiftCard.dat b/data/DB_GiftCard.dat index 96640b07f274cbbbda035ee3e52503c8356a73cb..15600367ff42a73b75826e6378f02a3bde3a8661 100644 GIT binary patch delta 38 pcmcDtoFJjd#&NNYS%6E4lVf2oo4|o-8=15?Aj}q919mG$1^~Z739kSE delta 38 pcmcDtoFJjd$+57PP2j+^jZ8{x92eV|1-P_0AVMv+2JBXh3;@YB39kSE diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat index ddbdc0089ad7d52d32fd9b49f8b652cfbc000798..1360bf44c744c6df84887525147cad8375e4fae5 100644 GIT binary patch literal 384 zcmd-w<6snElw#w!+{O&1uR!UmQ2H8_z7C?5I5-yevI!h$vE|a^U;?YZ0hPZArEfv$ z+i2>;Ik1}#RtK~nT|dk{DE0%@f$dY`1iPbQ?IRYhSPm8xhrk?g2kH=*L3lle2i-EQf0A(^fH2?qr literal 384 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 delta 45616 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Ⓢ03GE7cPC{)e=S_6Mk`;|axM-de>FUJTN{G49rsvtqvx>KL? zq;wNU&RSkb7!`R?;B|t+jW9{X=0P^MRjp8%pH@o@U8Jj~YL(SR)(W4&8)_({u-^q! z0^#jFDj^T=2IOPwAi?OaVEE?6ojfv8(21Gx3z;iGtI=%+x|U4Mby~Q!_X*t6NB%Vl z27WZ)6eezNcotCmB3Gt+2*dB~4!^kNX~*ACoFxb7+vXgh$vO#Pp2^n!opmwF9*C)_ zt1-3QU_dZ-Zg$UY*7V3A;m%&MqDzzx2aX-cLZxpRYnG?e6ea1+7+snR*paLYszSRT zrR@Ot|K7hS1y(!cHJ@dFNx{K2?-cRp6DHWta=mR$GZchOOBrQI`pAA1D<609k^H$N zF=UhF#XkRl@Y&3gpwlebO%CIE|CpLTwG#*aJ%7(XnAJHVD^CKB0a-|)S{WasCyGR5YkA90MrB8tY zWbi|^?;yUd>QzN-FY^Mnd&z7F8>8BGnh1;dC_6&SsK6$l-&MGv&f)V`;D;)!FsoUV zLd70!wORTLNm*8op^YGR?eFI7Cfi{)bvU9yxT+*a$An$%r6=D>?K$djpRnk6U~4`E z2R!!8VU$+S%5?DD%TZ}lv(=$<&JvLV1@k?KUUiZDKVDz!54nu$>cWpn8MB}MaYa<9 zkrgDbcCAyyBPZ4VCx;cobm-R)zfOAEV7W0wZD6y;@`lGAfi zayEE%cjHfo zX+S_&>p}PQ<)2vZX~^;(%JD3~!IUUhTlkL3dlG#pqzJ4SV#(skt^Nx_#t4H=XZ!HQZyAG;{`s|ei} zPgYsxb1l`h$P7teIV#vJ36?=Knbj(^!J70xo>i%k>{TXnJ^Q3d|0Md$lyGzciVmt0#4!_(!kWFD9;6Y4NcQ{xh~@s0u@)x4GS&4rP`0Wr%w$ zlK}6x&b@*Qi{G!XyWR8Rl&ONgQv8b<{oer5RekxZTNDsT1|0+0lyRi&RN z(k$n21<1|#Qnbe}p6Jvc5+%zy27U3OEse2Xzqwj^T>UMN!l$FQ5aOp1>Wv1N*AI|m zeEzA>$Ru)|N)TX6ZT`}%o!TYe=ayyrDJn`1S|*Kd4A!K|m}>D|wH4}nNRg@o!)wP} z&R+Xsk3MxnqW)?gWtGN`vMyz>$#}!Qr{se+x&Xw|h`1NWp`&fgJO9)s^E9w*F_NgP zSi&gq#56!#rYA-iJ@^!7F^VCae4SRuaefPOAqY>%Cuh6{-$R7bh=AqT1;&T1&`kYTl+m zwRMI^E}j}DzMrsj>7z^B5zMpATjS8^E7M#oRNR#GL9Zd77rCmyRg5a+c>~-6Jun0r z&TIm>LY$=HWM|l0>G;U$=9&n`s<~?^cr=#HLq3hnnHSbgwv~;~%IEQ+Eo>0peUg2T z5>H)YwQGlh&TxH91s~mG2ZkNG`G^#*LjDG&`f)G4mBUV`;RtbBxS zz&8EBfD)_U3im+pV&lI32k-E+eu`}1{oZwC$oEAIt`)HXAC@lRR|6QfN6O(c=3(AO zWT9btW*)hehpcz~LPv&>u0cPp%MZ`g@G^v`+WbUyV+Nk~=PM*8s|%~~?Z;S7v8HbI z@uj3*{N}Z7|7SHg2~Wssunq{&P>1&6lt)tN8`~fd{PdU{?z2mThcq4#3Wx!D#n^$z z93^7&2XM2gAWcgj&VDRRUV{YQ%||3eOjdml@qc*2{G`A~Uw;lGb* z!2bZhLlVrOfk4#%k^V37>s>hWi6Y8pxWkDgN-wtO;I(5JD|)g0CT1!T-Ng_`lz2 z-h?xrN}wFVO;06I!}s9nr_!iRd+_B`A+RG|_$t9S5D0A-4Mh1L>;Gj=feq)!riLq> dJx4VzLsrS);b*+4qLu$u$Ii$wLJ$AZ{~rMmp Date: Wed, 14 Aug 2024 14:48:28 +0800 Subject: [PATCH 09/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DB_GameFree.dat | Bin 22919 -> 22919 bytes data/DB_GameFree.json | 2 +- data/DB_PropExchange.dat | Bin 384 -> 384 bytes data/DB_Task.dat | Bin 5299 -> 5299 bytes xlsx/DB_GameFree.xlsx | Bin 62185 -> 62170 bytes 5 files changed, 1 insertion(+), 1 deletion(-) diff --git a/data/DB_GameFree.dat b/data/DB_GameFree.dat index a674eca727daa6495aea27d5d883d7ced0202473..c6c3839bde5091c19fa3eee95313d65914f6add5 100644 GIT binary patch delta 18 ZcmZqQ%-Ft}af6`uWTQy2&FbC>d;mhE21)<` delta 16 XcmZqQ%-Ft}af6^Y;IZ(|<*9TS)bO(xkNbZ8U2W-9)C)gbgYag+2#d5HqcmTx#Km%YJ!5#qeVID+x Xz#XW=!46Pj=U4>v=oe-#2HHXZW?DQo literal 384 zcmd-w<6snElw#w!+{O&1uR!UmQ2H8_z7C?5I5-yevI!h$vE|a^U;?YZ0hPZArEfv$ z+i2>;Ik1}#RtK~nT|dk{DE0%@f$dY`1iPbQ?IRYhSPm8xhrk?g2kH=*L3lle2i-EQf0A(^fH2?qr diff --git a/data/DB_Task.dat b/data/DB_Task.dat index b5ad45cb989814a1334be32cdd22e06206ac58ca..0e66ff123b0c2af28f6783605ae16d224ac67253 100644 GIT binary patch delta 250 zcmdn2xmk0=d#1@H93qpMnG3*lJG0*86g~k)#>vN+_Xu)uEbL_ySa3+ri;d%A8?yk* z=E*EcjFYeP2rx2DW@EF2Dro4e0xDPpRLZ(JfK7#Iaxt^WhY0x=(zv1F!gG fQNBr&Re1#`@8B~4+9^2sCtoJiE@VTC`5jmRcTP$H diff --git a/xlsx/DB_GameFree.xlsx b/xlsx/DB_GameFree.xlsx index 5bf483027ef2adf58a458fa70fba802c43366fe3..d230553a0f33583f6b00591abb59082f35bdf38d 100644 GIT binary patch delta 42681 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 delta 42702 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 From 2c8ce6a46715ae38391044167b5fbf3cc1b609d8 Mon Sep 17 00:00:00 2001 From: kxdd <88655@163.com> Date: Wed, 14 Aug 2024 15:53:27 +0800 Subject: [PATCH 10/56] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=8A=E5=88=86?= =?UTF-8?q?=E6=8A=95=E5=B8=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/player_clawdoll.go | 2 +- gamesrv/clawdoll/scenepolicy_clawdoll.go | 33 ++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index bba7f72..f69670f 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -33,7 +33,7 @@ func (this *PlayerEx) CanOp(sceneEx *SceneEx) bool { func (this *PlayerEx) CanPayCoin() bool { - return false + return true } // 游戏新一局 设置数据 diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 89cf7c2..146a682 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -445,9 +445,29 @@ func (this *StateStart) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, pa return true } + sceneEx, ok := s.ExtraData.(*SceneEx) + if !ok { + return false + } + playerEx, ok := p.ExtraData.(*PlayerEx) + if !ok { + return false + } + switch opcode { case rule.ClawDollPlayerOpPayCoin: + if !playerEx.CanPayCoin() { + return false + } + // 1-前 2-后 3-左 4-右 5-投币 + pack := &machine.SMDollMachineoPerate{ + Snid: proto.Int32(p.SnId), + Id: proto.Int32(int32(sceneEx.machineId)), + Perate: proto.Int32(int32(5)), + } + + sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), pack) } return false @@ -524,14 +544,23 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para if !playerEx.CanPayCoin() { return false } - sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) + // 1-前 2-后 3-左 4-右 5-投币 + pack := &machine.SMDollMachineoPerate{ + Snid: proto.Int32(p.SnId), + Id: proto.Int32(int32(sceneEx.machineId)), + Perate: proto.Int32(int32(5)), + } + + sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), pack) + + //sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) case rule.ClawDollPlayerOpGo: pack := &machine.SMDollMachineGrab{ Snid: proto.Int32(p.SnId), Id: proto.Int32(int32(sceneEx.machineId)), - TypeId: proto.Int32(int32(1)), + TypeId: proto.Int32(int32(2)), } sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), pack) From 8ff978db72ccf8f1b61ec16e7d3e89452f8b3b27 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Wed, 14 Aug 2024 16:22:57 +0800 Subject: [PATCH 11/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=93=8D=E4=BD=9C=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/action/action_machine.go | 4 +- gamesrv/clawdoll/action_clawdoll.go | 23 +++- gamesrv/clawdoll/scene_clawdoll.go | 4 +- machine/action/action_server.go | 24 +++- protocol/machine/machine.pb.go | 168 +++++++++++++++------------- protocol/machine/machine.proto | 18 +-- 6 files changed, 146 insertions(+), 95 deletions(-) diff --git a/gamesrv/action/action_machine.go b/gamesrv/action/action_machine.go index d6a5b9c..4f2f1d5 100644 --- a/gamesrv/action/action_machine.go +++ b/gamesrv/action/action_machine.go @@ -17,7 +17,7 @@ type DollMachine struct { VideoAddr string } -func MSDollMachineList(session *netlib.Session, packetId int, data interface{}) error { +func MSDollMachineListHandler(session *netlib.Session, packetId int, data interface{}) error { logger.Logger.Tracef("TestHandler %v", data) MachineMap = make(map[int]*DollMachine) if msg, ok := data.(*machine.MSDollMachineList); ok { @@ -74,7 +74,7 @@ func MSUpdateDollMachineStatusHandler(session *netlib.Session, packetId int, dat return nil } func init() { - netlib.Register(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), &machine.MSDollMachineList{}, MSDollMachineList) + netlib.Register(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), &machine.MSDollMachineList{}, MSDollMachineListHandler) //更新娃娃机链接状态 netlib.Register(int(machine.DollMachinePacketID_PACKET_MSUpdateDollMachineStatus), &machine.MSUpdateDollMachineStatus{}, MSUpdateDollMachineStatusHandler) } diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index 591aca8..2340d03 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -4,6 +4,7 @@ import ( "mongo.games.com/game/common" "mongo.games.com/game/gamesrv/base" "mongo.games.com/game/protocol/clawdoll" + "mongo.games.com/game/protocol/machine" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" ) @@ -48,8 +49,28 @@ func (h *CSPlayerOpHandler) Process(s *netlib.Session, packetid int, data interf } return nil } - +func MSDollMachineoCoinResultHandler(session *netlib.Session, packetId int, data interface{}) error { + logger.Logger.Tracef("收到返回上分结果!!!!!!!!!!") + if msg, ok := data.(*machine.MSDollMachineoPerateResult); ok { + switch msg.TypeId { + case 1: + if msg.Result == 1 { + logger.Logger.Tracef("上分成功!!!!!!!!!!!!snid = ", msg.Snid) + } else { + logger.Logger.Tracef("上分失败!!!!!!!!!!!!snid = ", msg.Snid) + } + case 2: + if msg.Result == 1 { + logger.Logger.Tracef("下抓成功!!!!!!!!!!!!snid = ", msg.Snid) + } else { + logger.Logger.Tracef("下抓失败!!!!!!!!!!!!snid = ", msg.Snid) + } + } + } + return nil +} func init() { common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSPlayerOpHandler{}) netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSPlayerOpPacketFactory{}) + netlib.Register(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{}, MSDollMachineoCoinResultHandler) } diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index 994eb68..e363fcc 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -210,9 +210,7 @@ func (this *SceneEx) BackupPlayer(p *PlayerEx, isBilled bool) { // 向娃娃机主机发送消息 func (this *SceneEx) SendToMachine(pid int, msg interface{}) { - if this.machineConn == nil { - this.machineConn = srvlib.ServerSessionMgrSington.GetSession(1, 10, 1001) - } + this.machineConn = srvlib.ServerSessionMgrSington.GetSession(1, 10, 1001) if this.machineConn != nil { this.machineConn.Send(pid, msg) } else { diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 7be9270..e7acc8d 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -75,6 +75,25 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte case 5: //投币 Process(conn, 0*time.Millisecond, []DoneFunc{machinedoll.Coin, machinedoll.Coin}, []DoneFunc{}, false) + // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return nil + } + if buf[4] == 1 { + fmt.Println("上分成功!!!!n = ", n) + } + if buf[4] == 0 { + fmt.Println("上分失败!!!") + } + //返回消息 + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ + Snid: msg.Snid, + Id: msg.GetId(), + Result: int32(buf[4]), + }) } return nil } @@ -93,7 +112,7 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf } send := func(net.Conn) { - session.Send(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), &machine.MSDollMachineGrab{ + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineGrab), &machine.MSDollMachineGrab{ Snid: msg.Snid, Id: msg.GetId(), Result: 1, @@ -107,9 +126,6 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf case 2: //强力抓 Process(conn, 0, []DoneFunc{machinedoll.Grab}, []DoneFunc{send}, false) - case 3: - //必中抓 - Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.SetPower}, []DoneFunc{machinedoll.Grab, send}, false) } return nil } diff --git a/protocol/machine/machine.pb.go b/protocol/machine/machine.pb.go index b7f2ec9..65ef2f3 100644 --- a/protocol/machine/machine.pb.go +++ b/protocol/machine/machine.pb.go @@ -24,13 +24,13 @@ const ( type DollMachinePacketID int32 const ( - DollMachinePacketID_PACKET_SMDollMachineZero DollMachinePacketID = 0 - DollMachinePacketID_PACKET_SMGameLinkSucceed DollMachinePacketID = 20000 - DollMachinePacketID_PACKET_SMDollMachinePerate DollMachinePacketID = 20001 - DollMachinePacketID_PACKET_SMDollMachineGrab DollMachinePacketID = 20002 - DollMachinePacketID_PACKET_MSDollMachineGrab DollMachinePacketID = 20003 - DollMachinePacketID_PACKET_MSDollMachineList DollMachinePacketID = 20004 - DollMachinePacketID_PACKET_MSUpdateDollMachineStatus DollMachinePacketID = 20005 + DollMachinePacketID_PACKET_SMDollMachineZero DollMachinePacketID = 0 + DollMachinePacketID_PACKET_SMGameLinkSucceed DollMachinePacketID = 20000 + DollMachinePacketID_PACKET_SMDollMachinePerate DollMachinePacketID = 20001 + DollMachinePacketID_PACKET_SMDollMachineGrab DollMachinePacketID = 20002 + DollMachinePacketID_PACKET_MSDollMachineList DollMachinePacketID = 20003 + DollMachinePacketID_PACKET_MSUpdateDollMachineStatus DollMachinePacketID = 20004 + DollMachinePacketID_PACKET_MSDollMachineoPerateResult DollMachinePacketID = 20005 ) // Enum value maps for DollMachinePacketID. @@ -40,18 +40,18 @@ var ( 20000: "PACKET_SMGameLinkSucceed", 20001: "PACKET_SMDollMachinePerate", 20002: "PACKET_SMDollMachineGrab", - 20003: "PACKET_MSDollMachineGrab", - 20004: "PACKET_MSDollMachineList", - 20005: "PACKET_MSUpdateDollMachineStatus", + 20003: "PACKET_MSDollMachineList", + 20004: "PACKET_MSUpdateDollMachineStatus", + 20005: "PACKET_MSDollMachineoPerateResult", } DollMachinePacketID_value = map[string]int32{ - "PACKET_SMDollMachineZero": 0, - "PACKET_SMGameLinkSucceed": 20000, - "PACKET_SMDollMachinePerate": 20001, - "PACKET_SMDollMachineGrab": 20002, - "PACKET_MSDollMachineGrab": 20003, - "PACKET_MSDollMachineList": 20004, - "PACKET_MSUpdateDollMachineStatus": 20005, + "PACKET_SMDollMachineZero": 0, + "PACKET_SMGameLinkSucceed": 20000, + "PACKET_SMDollMachinePerate": 20001, + "PACKET_SMDollMachineGrab": 20002, + "PACKET_MSDollMachineList": 20003, + "PACKET_MSUpdateDollMachineStatus": 20004, + "PACKET_MSDollMachineoPerateResult": 20005, } ) @@ -83,6 +83,7 @@ func (DollMachinePacketID) EnumDescriptor() ([]byte, []int) { } //通知链接成功 +//PACKET_SMDollMachinePerate type SMGameLinkSucceed struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -122,6 +123,7 @@ func (*SMGameLinkSucceed) Descriptor() ([]byte, []int) { } //操作 +//PACKET_SMDollMachinePerate type SMDollMachineoPerate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -249,19 +251,20 @@ func (x *SMDollMachineGrab) GetSnid() int32 { return 0 } -//返回下抓结果 -type MSDollMachineGrab struct { +//PACKET_MSDollMachineoPerateResult +type MSDollMachineoPerateResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` Id int32 `protobuf:"varint,2,opt,name=Id,proto3" json:"Id,omitempty"` //娃娃机标识 - Result int32 `protobuf:"varint,3,opt,name=Result,proto3" json:"Result,omitempty"` //1-中奖 其他未中奖 + Result int32 `protobuf:"varint,3,opt,name=Result,proto3" json:"Result,omitempty"` // 1-成功 0-失败 + TypeId int32 `protobuf:"varint,4,opt,name=TypeId,proto3" json:"TypeId,omitempty"` //1 投币 2 下抓结果 } -func (x *MSDollMachineGrab) Reset() { - *x = MSDollMachineGrab{} +func (x *MSDollMachineoPerateResult) Reset() { + *x = MSDollMachineoPerateResult{} if protoimpl.UnsafeEnabled { mi := &file_machine_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -269,13 +272,13 @@ func (x *MSDollMachineGrab) Reset() { } } -func (x *MSDollMachineGrab) String() string { +func (x *MSDollMachineoPerateResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MSDollMachineGrab) ProtoMessage() {} +func (*MSDollMachineoPerateResult) ProtoMessage() {} -func (x *MSDollMachineGrab) ProtoReflect() protoreflect.Message { +func (x *MSDollMachineoPerateResult) ProtoReflect() protoreflect.Message { mi := &file_machine_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -287,32 +290,39 @@ func (x *MSDollMachineGrab) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MSDollMachineGrab.ProtoReflect.Descriptor instead. -func (*MSDollMachineGrab) Descriptor() ([]byte, []int) { +// Deprecated: Use MSDollMachineoPerateResult.ProtoReflect.Descriptor instead. +func (*MSDollMachineoPerateResult) Descriptor() ([]byte, []int) { return file_machine_proto_rawDescGZIP(), []int{3} } -func (x *MSDollMachineGrab) GetSnid() int32 { +func (x *MSDollMachineoPerateResult) GetSnid() int32 { if x != nil { return x.Snid } return 0 } -func (x *MSDollMachineGrab) GetId() int32 { +func (x *MSDollMachineoPerateResult) GetId() int32 { if x != nil { return x.Id } return 0 } -func (x *MSDollMachineGrab) GetResult() int32 { +func (x *MSDollMachineoPerateResult) GetResult() int32 { if x != nil { return x.Result } return 0 } +func (x *MSDollMachineoPerateResult) GetTypeId() int32 { + if x != nil { + return x.TypeId + } + return 0 +} + //返回所有娃娃机连接 type MSDollMachineList struct { state protoimpl.MessageState @@ -496,45 +506,47 @@ var file_machine_proto_rawDesc = []byte{ 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, - 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x11, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x3d, 0x0a, 0x11, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x2e, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x22, - 0x61, 0x0a, 0x19, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, - 0x64, 0x72, 0x2a, 0xfd, 0x01, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa4, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, - 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0xa5, - 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, - 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x69, 0x64, 0x22, 0x70, 0x0a, 0x1a, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x6f, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x53, 0x6e, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x54, 0x79, + 0x70, 0x65, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x11, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x2e, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, + 0x22, 0x61, 0x0a, 0x19, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, + 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, + 0x64, 0x64, 0x72, 0x2a, 0x86, 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, + 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, + 0xa4, 0x9c, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, + 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x6f, 0x50, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x10, 0xa5, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -552,14 +564,14 @@ func file_machine_proto_rawDescGZIP() []byte { var file_machine_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_machine_proto_goTypes = []interface{}{ - (DollMachinePacketID)(0), // 0: machine.DollMachinePacketID - (*SMGameLinkSucceed)(nil), // 1: machine.SMGameLinkSucceed - (*SMDollMachineoPerate)(nil), // 2: machine.SMDollMachineoPerate - (*SMDollMachineGrab)(nil), // 3: machine.SMDollMachineGrab - (*MSDollMachineGrab)(nil), // 4: machine.MSDollMachineGrab - (*MSDollMachineList)(nil), // 5: machine.MSDollMachineList - (*DollMachine)(nil), // 6: machine.DollMachine - (*MSUpdateDollMachineStatus)(nil), // 7: machine.MSUpdateDollMachineStatus + (DollMachinePacketID)(0), // 0: machine.DollMachinePacketID + (*SMGameLinkSucceed)(nil), // 1: machine.SMGameLinkSucceed + (*SMDollMachineoPerate)(nil), // 2: machine.SMDollMachineoPerate + (*SMDollMachineGrab)(nil), // 3: machine.SMDollMachineGrab + (*MSDollMachineoPerateResult)(nil), // 4: machine.MSDollMachineoPerateResult + (*MSDollMachineList)(nil), // 5: machine.MSDollMachineList + (*DollMachine)(nil), // 6: machine.DollMachine + (*MSUpdateDollMachineStatus)(nil), // 7: machine.MSUpdateDollMachineStatus } var file_machine_proto_depIdxs = []int32{ 6, // 0: machine.MSDollMachineList.data:type_name -> machine.DollMachine @@ -613,7 +625,7 @@ func file_machine_proto_init() { } } file_machine_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSDollMachineGrab); i { + switch v := v.(*MSDollMachineoPerateResult); i { case 0: return &v.state case 1: diff --git a/protocol/machine/machine.proto b/protocol/machine/machine.proto index 8d941c7..1e4933d 100644 --- a/protocol/machine/machine.proto +++ b/protocol/machine/machine.proto @@ -10,15 +10,17 @@ enum DollMachinePacketID { PACKET_SMGameLinkSucceed = 20000; PACKET_SMDollMachinePerate = 20001; PACKET_SMDollMachineGrab = 20002; - PACKET_MSDollMachineGrab = 20003; - PACKET_MSDollMachineList = 20004; - PACKET_MSUpdateDollMachineStatus = 20005; + PACKET_MSDollMachineList = 20003; + PACKET_MSUpdateDollMachineStatus = 20004; + PACKET_MSDollMachineoPerateResult = 20005; } //通知链接成功 +//PACKET_SMDollMachinePerate message SMGameLinkSucceed{ } //操作 +//PACKET_SMDollMachinePerate message SMDollMachineoPerate{ int32 Snid = 1; int32 Id = 2; //娃娃机标识 @@ -32,13 +34,15 @@ message SMDollMachineGrab{ int32 Snid = 3; } -//返回下抓结果 -message MSDollMachineGrab{ +//PACKET_MSDollMachineoPerateResult +message MSDollMachineoPerateResult{ int32 Snid = 1; - int32 Id = 2; //娃娃机标识 - int32 Result = 3;//1-中奖 其他未中奖 + int32 Id = 2; //娃娃机标识 + int32 Result = 3;// 1-成功 0-失败 + int32 TypeId = 4;//1 投币 2 下抓结果 } + //返回所有娃娃机连接 message MSDollMachineList{ repeated DollMachine data = 1; From a4b4a0b2a0abd019563b026d6dfd1c904579aee6 Mon Sep 17 00:00:00 2001 From: kxdd <88655@163.com> Date: Wed, 14 Aug 2024 16:23:58 +0800 Subject: [PATCH 12/56] =?UTF-8?q?=E5=B0=81=E8=A3=85=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E6=8A=95=E5=B8=81=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/player_clawdoll.go | 13 ++++++++ gamesrv/clawdoll/scene_clawdoll.go | 25 +++++++++++++++ gamesrv/clawdoll/scenepolicy_clawdoll.go | 39 ++++++------------------ 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index f69670f..1ec2c43 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -31,11 +31,24 @@ func (this *PlayerEx) CanOp(sceneEx *SceneEx) bool { return true } +// 能否投币 func (this *PlayerEx) CanPayCoin() bool { return true } +// 能否移动 +func (this *PlayerEx) CanMove() bool { + + return true +} + +// 能否下抓 +func (this *PlayerEx) CanGrab() bool { + + return true +} + // 游戏新一局 设置数据 func (this *PlayerEx) ReStartGame() { this.ReDataStartGame() diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index 994eb68..df6e0c7 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -6,6 +6,7 @@ import ( "mongo.games.com/game/gamesrv/base" "mongo.games.com/game/proto" "mongo.games.com/game/protocol/clawdoll" + "mongo.games.com/game/protocol/machine" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" "mongo.games.com/goserver/srvlib" @@ -208,6 +209,30 @@ func (this *SceneEx) BackupPlayer(p *PlayerEx, isBilled bool) { } } +// OnPlayerSMGrabOp 下抓 //1-弱力抓 2 -强力抓 3-必出抓 +func (this *SceneEx) OnPlayerSMGrabOp(SnId, Id, GrabType int32) { + + pack := &machine.SMDollMachineGrab{ + Snid: proto.Int32(SnId), + Id: proto.Int32(Id), + TypeId: proto.Int32(GrabType), + } + + this.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), pack) +} + +// OnPlayerSCOp 发送玩家操作情况 1-前 2-后 3-左 4-右 5-投币 +func (this *SceneEx) OnPlayerSMPerateOp(SnId, Id, Perate int32) { + + pack := &machine.SMDollMachineoPerate{ + Snid: proto.Int32(SnId), + Id: proto.Int32(Id), + Perate: proto.Int32(Perate), + } + + this.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), pack) +} + // 向娃娃机主机发送消息 func (this *SceneEx) SendToMachine(pid int, msg interface{}) { if this.machineConn == nil { diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 146a682..14db059 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -3,7 +3,6 @@ package clawdoll import ( "mongo.games.com/game/gamesrv/action" "mongo.games.com/game/protocol/clawdoll" - "mongo.games.com/game/protocol/machine" "time" "mongo.games.com/goserver/core" @@ -461,13 +460,7 @@ func (this *StateStart) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, pa } // 1-前 2-后 3-左 4-右 5-投币 - pack := &machine.SMDollMachineoPerate{ - Snid: proto.Int32(p.SnId), - Id: proto.Int32(int32(sceneEx.machineId)), - Perate: proto.Int32(int32(5)), - } - - sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), pack) + sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), int32(5)) } return false @@ -546,34 +539,22 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para } // 1-前 2-后 3-左 4-右 5-投币 - pack := &machine.SMDollMachineoPerate{ - Snid: proto.Int32(p.SnId), - Id: proto.Int32(int32(sceneEx.machineId)), - Perate: proto.Int32(int32(5)), - } - - sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), pack) - + sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), int32(5)) //sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) case rule.ClawDollPlayerOpGo: - - pack := &machine.SMDollMachineGrab{ - Snid: proto.Int32(p.SnId), - Id: proto.Int32(int32(sceneEx.machineId)), - TypeId: proto.Int32(int32(2)), + if !playerEx.CanGrab() { + return false } - sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), pack) + //1-弱力抓 2 -强力抓 + sceneEx.OnPlayerSMGrabOp(p.SnId, int32(sceneEx.machineId), int32(2)) case rule.ClawDollPlayerOpMove: + if !playerEx.CanMove() { + return false + } // 1-前 2-后 3-左 4-右 5-投币 - pack := &machine.SMDollMachineoPerate{ - Snid: proto.Int32(p.SnId), - Id: proto.Int32(int32(sceneEx.machineId)), - Perate: proto.Int32(int32(params[0])), - } - - sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), pack) + sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), int32(params[0])) } return false From 4dc78ff468b153492e2e287d855a6e28f04be000 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Wed, 14 Aug 2024 16:23:59 +0800 Subject: [PATCH 13/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=93=8D=E4=BD=9C=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index e7acc8d..117cea1 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -93,6 +93,7 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte Snid: msg.Snid, Id: msg.GetId(), Result: int32(buf[4]), + TypeId: 1, }) } return nil @@ -112,10 +113,11 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf } send := func(net.Conn) { - session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineGrab), &machine.MSDollMachineGrab{ + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ Snid: msg.Snid, Id: msg.GetId(), Result: 1, + TypeId: 2, }) } From 154a037e08d1a3d3377e608a2fb522017ce50fe6 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 15 Aug 2024 11:31:45 +0800 Subject: [PATCH 14/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/action/action_machine.go | 2 +- machine/action/action_server.go | 110 +++++++++++++++++++++++++------ machine/machinedoll/command.go | 71 ++++++++++---------- 3 files changed, 126 insertions(+), 57 deletions(-) diff --git a/gamesrv/action/action_machine.go b/gamesrv/action/action_machine.go index 4f2f1d5..c577f4e 100644 --- a/gamesrv/action/action_machine.go +++ b/gamesrv/action/action_machine.go @@ -13,7 +13,7 @@ var MachineMapLock = sync.Mutex{} type DollMachine struct { Id int MachineStatus int32 //娃娃机链接状态 0:离线 1:在线 - Status bool //是否空闲 + Status bool //标记是否被占用 VideoAddr string } diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 117cea1..c67697e 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -1,6 +1,7 @@ package action import ( + "bytes" "fmt" "net" "time" @@ -74,27 +75,9 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Right}, []DoneFunc{machinedoll.RightStop}, false) case 5: //投币 - Process(conn, 0*time.Millisecond, []DoneFunc{machinedoll.Coin, machinedoll.Coin}, []DoneFunc{}, false) - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return nil - } - if buf[4] == 1 { - fmt.Println("上分成功!!!!n = ", n) - } - if buf[4] == 0 { - fmt.Println("上分失败!!!") - } - //返回消息 - session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ - Snid: msg.Snid, - Id: msg.GetId(), - Result: int32(buf[4]), - TypeId: 1, - }) + //Process(conn, 0*time.Millisecond, []DoneFunc{machinedoll.Coin}, []DoneFunc{}, false) + machinedoll.Coin(conn) + go CoinResult(session, conn, msg.Snid, msg.GetId()) } return nil } @@ -129,9 +112,94 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf //强力抓 Process(conn, 0, []DoneFunc{machinedoll.Grab}, []DoneFunc{send}, false) } + go DollMachineGrabResult(session, conn, msg.Snid, msg.GetId()) return nil } +// 监听抓取结果返回 +func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid, id int32) { + for { + // 读取数据 + fmt.Println("监听抓取结果返回!") + buf := make([]byte, 1024) + conn.SetDeadline(time.Now().Add(10 * time.Second)) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from client:", err) + return + } + + // 将读取到的数据按照 221 进行分割 + parts := bytes.Split(buf[:n], []byte{221}) + fmt.Println("获取到的返回值:", parts) + instruction := []byte{0xAA, 0x05, 0x02, 0x50, 0x09, 0x00} + instruction1 := []byte{0xAA, 0x05, 0x02, 0x50, 0x09, 0x01} + // 遍历分割结果,打印出每个部分 + for i, part := range parts { + if len(part) > 0 { + part = part[:len(part)-1] // 去除最后一个字节,该字节为分隔符 + fmt.Println("比较返回结果 part = ", part) + if bytes.Contains(part, instruction) { + fmt.Printf("Part %d: %s\n", i+1, part) + //回应数据 + _, err = conn.Write([]byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd}) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ + Snid: snid, + Id: id, + Result: 0, + TypeId: 2, + }) + fmt.Println("没有抓到礼品!!!!!!!!") + return + } + if bytes.Contains(part, instruction1) { + fmt.Printf("Part %d: %s\n", i+1, part) + //回应数据 + _, err = conn.Write([]byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd}) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ + Snid: snid, + Id: id, + Result: 1, + TypeId: 2, + }) + fmt.Println("抓到礼品了!!!!!!!!") + return + } + } + } + } +} +func CoinResult(session *netlib.Session, conn *machinedoll.Conn, snid, id int32) { + // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + if buf[4] == 1 { + fmt.Println("上分成功!!!!n = ", n) + } + if buf[4] == 0 { + fmt.Println("上分失败!!!") + } + //返回消息 + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ + Snid: snid, + Id: id, + Result: int32(buf[4]), + TypeId: 1, + }) +} + // 与游戏服务器连接成功,向游戏服务器推送所有娃娃机连接 func SMGameLinkSucceedHandler(session *netlib.Session, packetId int, data interface{}) error { logger.Logger.Trace("与游戏服务器连接成功") diff --git a/machine/machinedoll/command.go b/machine/machinedoll/command.go index 9e56bb7..8932d5a 100644 --- a/machine/machinedoll/command.go +++ b/machine/machinedoll/command.go @@ -8,7 +8,7 @@ import ( // 向前aa 05 01 50 01 01 54 dd func Forward(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x01, 0x01} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -19,7 +19,7 @@ func Forward(conn net.Conn) { // 向前停止aa 05 01 50 01 00 55 dd func ForwardStop(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x01, 0x00} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -31,7 +31,7 @@ func ForwardStop(conn net.Conn) { // aa 05 01 50 02 01 57 dd func Backward(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x02, 0x01} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -42,7 +42,7 @@ func Backward(conn net.Conn) { // 向后停止aa 05 01 50 02 00 56 dd func BackwardStop(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x02, 0x00} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -53,7 +53,7 @@ func BackwardStop(conn net.Conn) { // 向左aa 05 01 50 03 01 56 dd func Left(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x03, 0x01} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -64,7 +64,7 @@ func Left(conn net.Conn) { // 向左停止aa 05 01 50 03 00 57 dd func LeftStop(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x03, 0x00} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -75,7 +75,7 @@ func LeftStop(conn net.Conn) { // 向右 func Right(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x04, 0x01} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -86,7 +86,7 @@ func Right(conn net.Conn) { // 向右停止aa 05 01 50 04 00 50 dd func RightStop(conn net.Conn) { instruction := []byte{0xaa, 0x05, 0x01, 0x50, 0x04, 0x00} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -97,25 +97,26 @@ func RightStop(conn net.Conn) { // 强抓下抓 func Grab(conn net.Conn) { instruction := []byte{0xAA, 0x05, 0x01, 0x50, 0x06, 0x01} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - _, err = conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - instruction = []byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd} - _, err = conn.Write(instruction) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } + /* + // 读取服务端的响应 + buf := make([]byte, 1024) + _, err = conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + instruction = []byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd} + _, err = conn.Write(instruction) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + }*/ } // 必中抓 @@ -123,7 +124,7 @@ func Grab2(conn net.Conn) { //设置电压 instruction := []byte{0xAA, 0x05, 0x01, 0x50, 0x06, 0x01} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -141,7 +142,7 @@ func Grab2(conn net.Conn) { // 弱抓aa 05 01 50 06 00 52 dd func WeakGrab(conn net.Conn) { instruction := []byte{0xAA, 0x05, 0x01, 0x50, 0x06, 0x00} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -152,7 +153,7 @@ func WeakGrab(conn net.Conn) { // 投币 func Coin(conn net.Conn) { moveCommand := []byte{0xaa, 0x08, 0x01, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00} - moveCommand = calculateChecksum(moveCommand) + moveCommand = CalculateChecksum(moveCommand) // 发送指令到服务端 _, err := conn.Write(moveCommand) if err != nil { @@ -177,7 +178,7 @@ func Coin(conn net.Conn) { // 剩余局数清零 func ClearRemainingGames(conn net.Conn) { instruction := []byte{0xAA, 0x03, 0x01, 0x32} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -194,7 +195,7 @@ func ClearRemainingGames(conn net.Conn) { } // 计算校验码 -func calculateChecksum(data []byte) []byte { +func CalculateChecksum(data []byte) []byte { var value = byte(0) for i, datum := range data { if i > 0 { @@ -212,7 +213,7 @@ func OpenMusic(conn net.Conn) { data[43] = 0x01 instruction := []byte{0xAA, 0x33, 0x01, 0x06} instruction = append(instruction, data...) - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) //instruction[1] = byte(len(instruction) - 3) _, err := conn.Write(instruction) if err != nil { @@ -234,7 +235,7 @@ func CloseMusic(conn net.Conn) { data[43] = 0x00 instruction := []byte{0xAA, 0x33, 0x01, 0x06} instruction = append(instruction, data...) - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -253,7 +254,7 @@ func CloseMusic(conn net.Conn) { // 恢复出厂设置 func RestoreFactorySettings(conn net.Conn) { instruction := []byte{0xAA, 0x03, 0x01, 0x38} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -272,7 +273,7 @@ func RestoreFactorySettings(conn net.Conn) { // 重启主板 func Reboot(conn net.Conn) { instruction := []byte{0xAA, 0x03, 0x01, 0x39} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -291,7 +292,7 @@ func Reboot(conn net.Conn) { // 暂停服务 func StopServer(conn net.Conn) { instruction := []byte{0xAA, 0x03, 0x01, 0x37} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -302,7 +303,7 @@ func StopServer(conn net.Conn) { // 开启服务 func StartServer(conn net.Conn) { instruction := []byte{0xAA, 0x03, 0x01, 0x36} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -313,7 +314,7 @@ func StartServer(conn net.Conn) { // 查询基础参数 func queryBaseParam(conn net.Conn) { instruction := []byte{0xAA, 0x03, 0x01, 0x05} - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) @@ -336,7 +337,7 @@ func SetPower(conn net.Conn) { fmt.Println("data.len = ", len(data)) instruction := []byte{0xAA, 0x04, 0x01, 0x06} instruction = append(instruction, data...) - instruction = calculateChecksum(instruction) + instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) if err != nil { fmt.Println("Failed to send command to server:", err) From afe8d3f0b1f0d72a9a9a06d18cb51cf8ae11d9cb Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 15 Aug 2024 14:37:08 +0800 Subject: [PATCH 15/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=B6=88=E6=81=AF=E9=98=9F=E5=88=97=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 206 ++++++++++++++++++++------------ machine/machinedoll/command.go | 138 ++++++++++----------- 2 files changed, 201 insertions(+), 143 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index c67697e..445c2c2 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -3,47 +3,69 @@ package action import ( "bytes" "fmt" - "net" - "time" - - "mongo.games.com/goserver/core/basic" - "mongo.games.com/goserver/core/logger" - "mongo.games.com/goserver/core/netlib" - "mongo.games.com/goserver/core/task" - "mongo.games.com/goserver/core/timer" - "mongo.games.com/game/machine/machinedoll" "mongo.games.com/game/protocol/machine" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/netlib" + "mongo.games.com/goserver/core/timer" + "sync" + "time" ) -type DoneFunc func(c net.Conn) +type ConnMessageQueue struct { + queue chan []interface{} + conn *machinedoll.Conn + waitGroup *sync.WaitGroup +} -func Process(conn *machinedoll.Conn, sec time.Duration, f1, f2 []DoneFunc, isSync bool) { - var ch chan struct{} - if isSync { - ch = make(chan struct{}, 1) +var connMessageQueues = make(map[*machinedoll.Conn]*ConnMessageQueue) + +func Process(conn *machinedoll.Conn, f1 []func(), f2 []func()) { + // 获取或创建该 conn 对应的消息队列 + queue, ok := connMessageQueues[conn] + if !ok { + queue = &ConnMessageQueue{ + queue: make(chan []interface{}, 100), + conn: conn, + waitGroup: new(sync.WaitGroup), + } + connMessageQueues[conn] = queue + go processConnMessageQueue(queue) } - task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { - for _, v := range f1 { - v(conn) + + // 将消息添加到队列中 + queue.queue <- []interface{}{f1, f2} +} + +func processConnMessageQueue(queue *ConnMessageQueue) { + for msg := range queue.queue { + f1 := msg[0].([]func()) + f2 := msg[1].([]func()) + + queue.waitGroup.Add(len(f1)) + for _, f := range f1 { + go func(f func()) { + defer queue.waitGroup.Done() + f() + }(f) } + queue.waitGroup.Wait() + if len(f2) > 0 { - timer.AfterTimer(func(h timer.TimerHandle, ud interface{}) bool { - Process(conn, 0, f2, nil, isSync) - if isSync { - ch <- struct{}{} - } - return true - }, nil, sec) - } else { - if isSync { - ch <- struct{}{} - } + queue.waitGroup.Add(1) + go func() { + defer queue.waitGroup.Done() + timer.AfterTimer(func(h timer.TimerHandle, ud interface{}) bool { + for _, f := range f2 { + f() + } + return true + }, nil, 200*time.Millisecond) + }() + } - return nil - }), nil).StartByFixExecutor(fmt.Sprintf("Machine%v", conn.Addr)) - if isSync { - <-ch + + queue.waitGroup.Wait() } } @@ -63,21 +85,48 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte switch msg.Perate { case 1: //向前移动 - Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Backward}, []DoneFunc{machinedoll.BackwardStop}, false) + f1 := []func(){ + func() { machinedoll.Backward(conn) }, + } + f2 := []func(){ + func() { machinedoll.BackwardStop(conn) }, + } + Process(conn, f1, f2) case 2: //向后移动 - Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Forward}, []DoneFunc{machinedoll.ForwardStop}, false) + f1 := []func(){ + func() { machinedoll.Forward(conn) }, + } + f2 := []func(){ + func() { machinedoll.ForwardStop(conn) }, + } + Process(conn, f1, f2) + //Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Forward}, []DoneFunc{machinedoll.ForwardStop}, false) case 3: //向左移动 - Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Left}, []DoneFunc{machinedoll.LeftStop}, false) + f1 := []func(){ + func() { machinedoll.Left(conn) }, + } + f2 := []func(){ + func() { machinedoll.LeftStop(conn) }, + } + Process(conn, f1, f2) + //Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Left}, []DoneFunc{machinedoll.LeftStop}, false) case 4: //向右移动 - Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Right}, []DoneFunc{machinedoll.RightStop}, false) + f1 := []func(){ + func() { machinedoll.Right(conn) }, + } + f2 := []func(){ + func() { machinedoll.RightStop(conn) }, + } + Process(conn, f1, f2) + //Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Right}, []DoneFunc{machinedoll.RightStop}, false) case 5: //投币 //Process(conn, 0*time.Millisecond, []DoneFunc{machinedoll.Coin}, []DoneFunc{}, false) machinedoll.Coin(conn) - go CoinResult(session, conn, msg.Snid, msg.GetId()) + go DollMachineGrabResult(session, conn, msg.Snid, msg.GetId()) } return nil } @@ -95,24 +144,30 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf return nil } - send := func(net.Conn) { - session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ - Snid: msg.Snid, - Id: msg.GetId(), - Result: 1, - TypeId: 2, - }) - } - switch msg.GetTypeId() { case 1: //弱抓 - Process(conn, 0, []DoneFunc{machinedoll.WeakGrab}, []DoneFunc{send}, false) + f1 := []func(){ + func() { machinedoll.WeakGrab(conn) }, + } + f2 := []func(){} + Process(conn, f1, f2) + //Process(conn, 0, []DoneFunc{machinedoll.WeakGrab}, []DoneFunc{send}, false) case 2: //强力抓 - Process(conn, 0, []DoneFunc{machinedoll.Grab}, []DoneFunc{send}, false) + f1 := []func(){ + func() { machinedoll.Grab(conn) }, + } + f2 := []func(){} + Process(conn, f1, f2) + //Process(conn, 0, []DoneFunc{machinedoll.Grab}, []DoneFunc{send}, false) + } + //go DollMachineGrabResult(session, conn, msg.Snid, msg.GetId()) + err := conn.SetDeadline(time.Now().Add(15 * time.Second)) + if err != nil { + fmt.Println("Error setting deadline:", err) + return err } - go DollMachineGrabResult(session, conn, msg.Snid, msg.GetId()) return nil } @@ -122,7 +177,6 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid // 读取数据 fmt.Println("监听抓取结果返回!") buf := make([]byte, 1024) - conn.SetDeadline(time.Now().Add(10 * time.Second)) n, err := conn.Read(buf) if err != nil { fmt.Println("Failed to read response from client:", err) @@ -153,7 +207,8 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid Result: 0, TypeId: 2, }) - fmt.Println("没有抓到礼品!!!!!!!!") + fmt.Println("没有抓到礼品!!!!!!!!snid = ", snid) + conn.SetDeadline(time.Time{}) return } if bytes.Contains(part, instruction1) { @@ -170,35 +225,38 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid Result: 1, TypeId: 2, }) - fmt.Println("抓到礼品了!!!!!!!!") + fmt.Println("抓到礼品了!!!!!!!!snid = ", snid) + conn.SetDeadline(time.Time{}) return } + //上分成功 + coinData := []byte{0xAA, 0x04, 0x02, 0x03, 0x01} + if bytes.Contains(part, coinData) { + //返回消息 + fmt.Println("上分成功!") + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ + Snid: snid, + Id: id, + Result: 1, + TypeId: 1, + }) + } + //上分失败 + coinData = []byte{0xAA, 0x04, 0x02, 0x03, 0x00} + if bytes.Contains(part, coinData) { + //返回消息 + fmt.Println("上分失败!") + session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ + Snid: snid, + Id: id, + Result: 0, + TypeId: 1, + }) + } } } } } -func CoinResult(session *netlib.Session, conn *machinedoll.Conn, snid, id int32) { - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - if buf[4] == 1 { - fmt.Println("上分成功!!!!n = ", n) - } - if buf[4] == 0 { - fmt.Println("上分失败!!!") - } - //返回消息 - session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ - Snid: snid, - Id: id, - Result: int32(buf[4]), - TypeId: 1, - }) -} // 与游戏服务器连接成功,向游戏服务器推送所有娃娃机连接 func SMGameLinkSucceedHandler(session *netlib.Session, packetId int, data interface{}) error { diff --git a/machine/machinedoll/command.go b/machine/machinedoll/command.go index 8932d5a..ad56c9a 100644 --- a/machine/machinedoll/command.go +++ b/machine/machinedoll/command.go @@ -160,19 +160,19 @@ func Coin(conn net.Conn) { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - if buf[4] == 1 { - fmt.Println("上分成功!!!!n = ", n) - } - if buf[4] == 0 { - fmt.Println("上分失败!!!") - } + /* // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + if buf[4] == 1 { + fmt.Println("上分成功!!!!n = ", n) + } + if buf[4] == 0 { + fmt.Println("上分失败!!!") + }*/ } // 剩余局数清零 @@ -184,14 +184,14 @@ func ClearRemainingGames(conn net.Conn) { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - fmt.Println("n", n) + /* // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + fmt.Println("n", n)*/ } // 计算校验码 @@ -202,7 +202,7 @@ func CalculateChecksum(data []byte) []byte { value ^= datum } } - fmt.Println("校验码 value = ", value) + //fmt.Println("校验码 value = ", value) data = append(data, value, 0xdd) return data @@ -221,13 +221,13 @@ func OpenMusic(conn net.Conn) { return } // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - fmt.Println("n", n) + /* buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + fmt.Println("n", n)*/ } // 关闭音乐 @@ -241,14 +241,14 @@ func CloseMusic(conn net.Conn) { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - fmt.Println("n", n) + /* // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + fmt.Println("n", n)*/ } // 恢复出厂设置 @@ -260,14 +260,14 @@ func RestoreFactorySettings(conn net.Conn) { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - fmt.Println("n", n) + /* // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + fmt.Println("n", n)*/ } // 重启主板 @@ -279,14 +279,14 @@ func Reboot(conn net.Conn) { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - fmt.Println("n", n) + /* // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + fmt.Println("n", n)*/ } // 暂停服务 @@ -320,15 +320,15 @@ func queryBaseParam(conn net.Conn) { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } + /* // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } - fmt.Println("n", n) + fmt.Println("n", n)*/ } // 设置出奖模式 @@ -343,14 +343,14 @@ func SetPower(conn net.Conn) { fmt.Println("Failed to send command to server:", err) return } - // 读取服务端的响应 - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - fmt.Println("Failed to read response from server:", err) - return - } - fmt.Println("n", n) + /* // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + fmt.Println("n", n)*/ } var data = []byte{ From 5e60434b6005446cf316992317b57f261fe6ad0c Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 15 Aug 2024 14:38:21 +0800 Subject: [PATCH 16/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 445c2c2..1fcb37e 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -101,7 +101,6 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte func() { machinedoll.ForwardStop(conn) }, } Process(conn, f1, f2) - //Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Forward}, []DoneFunc{machinedoll.ForwardStop}, false) case 3: //向左移动 f1 := []func(){ @@ -111,7 +110,6 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte func() { machinedoll.LeftStop(conn) }, } Process(conn, f1, f2) - //Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Left}, []DoneFunc{machinedoll.LeftStop}, false) case 4: //向右移动 f1 := []func(){ @@ -121,10 +119,8 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte func() { machinedoll.RightStop(conn) }, } Process(conn, f1, f2) - //Process(conn, 200*time.Millisecond, []DoneFunc{machinedoll.Right}, []DoneFunc{machinedoll.RightStop}, false) case 5: //投币 - //Process(conn, 0*time.Millisecond, []DoneFunc{machinedoll.Coin}, []DoneFunc{}, false) machinedoll.Coin(conn) go DollMachineGrabResult(session, conn, msg.Snid, msg.GetId()) } @@ -152,7 +148,6 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf } f2 := []func(){} Process(conn, f1, f2) - //Process(conn, 0, []DoneFunc{machinedoll.WeakGrab}, []DoneFunc{send}, false) case 2: //强力抓 f1 := []func(){ @@ -160,9 +155,7 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf } f2 := []func(){} Process(conn, f1, f2) - //Process(conn, 0, []DoneFunc{machinedoll.Grab}, []DoneFunc{send}, false) } - //go DollMachineGrabResult(session, conn, msg.Snid, msg.GetId()) err := conn.SetDeadline(time.Now().Add(15 * time.Second)) if err != nil { fmt.Println("Error setting deadline:", err) From 6b8e24cba35615d85e87bbabc0e062b61c78b233 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 15 Aug 2024 16:07:50 +0800 Subject: [PATCH 17/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E6=8A=95?= =?UTF-8?q?=E5=B8=81=E6=B6=88=E6=81=AF=E5=8A=A0=E5=85=A5=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=98=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 1fcb37e..f6f1771 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -121,7 +121,13 @@ func SMDollMachinePerateHandler(session *netlib.Session, packetId int, data inte Process(conn, f1, f2) case 5: //投币 - machinedoll.Coin(conn) + f1 := []func(){ + func() { machinedoll.Coin(conn) }, + } + f2 := []func(){ + func() {}, + } + Process(conn, f1, f2) go DollMachineGrabResult(session, conn, msg.Snid, msg.GetId()) } return nil From 37f6b4163e95706bd4f841e58a0337cc3f8f13e1 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 15 Aug 2024 18:35:22 +0800 Subject: [PATCH 18/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 11 +++++++---- machine/machinedoll/machinemgr.go | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index f6f1771..373f439 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -62,10 +62,7 @@ func processConnMessageQueue(queue *ConnMessageQueue) { return true }, nil, 200*time.Millisecond) }() - } - - queue.waitGroup.Wait() } } @@ -172,6 +169,7 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf // 监听抓取结果返回 func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid, id int32) { + num := 1 for { // 读取数据 fmt.Println("监听抓取结果返回!") @@ -181,7 +179,12 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid fmt.Println("Failed to read response from client:", err) return } - + if n != 0 && num == 1 { + num += 1 + fmt.Println("清除脏数据!!!!!!!!!!!!!buf = ", buf[:n]) + continue + } + num++ // 将读取到的数据按照 221 进行分割 parts := bytes.Split(buf[:n], []byte{221}) fmt.Println("获取到的返回值:", parts) diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index 3c6827d..efaaf73 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -96,6 +96,7 @@ func (this *MachineManager) Update() { delConn = append(delConn, v) v.Close() logger.Logger.Tracef("断开连接:%v", v.Addr) + fmt.Println("娃娃机断开连接!!!!!!!!!!!") this.UpdateToGameServer(v, 0) } } @@ -115,6 +116,7 @@ func (this *MachineManager) Update() { continue } logger.Logger.Tracef("重连成功:%v", addr) + fmt.Println("娃娃机重连成功!!!!!!!!!!!") delIds = append(delIds, &Conn{ Id: id, Conn: conn, From 7a2c11d92e394fe7138dd3a6537f11d377797e7a Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 16 Aug 2024 09:10:15 +0800 Subject: [PATCH 19/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 373f439..68ad3b6 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -3,6 +3,7 @@ package action import ( "bytes" "fmt" + "math" "mongo.games.com/game/machine/machinedoll" "mongo.games.com/game/protocol/machine" "mongo.games.com/goserver/core/logger" @@ -169,7 +170,7 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf // 监听抓取结果返回 func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid, id int32) { - num := 1 + num := int64(1) for { // 读取数据 fmt.Println("监听抓取结果返回!") @@ -179,12 +180,6 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid fmt.Println("Failed to read response from client:", err) return } - if n != 0 && num == 1 { - num += 1 - fmt.Println("清除脏数据!!!!!!!!!!!!!buf = ", buf[:n]) - continue - } - num++ // 将读取到的数据按照 221 进行分割 parts := bytes.Split(buf[:n], []byte{221}) fmt.Println("获取到的返回值:", parts) @@ -195,7 +190,7 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid if len(part) > 0 { part = part[:len(part)-1] // 去除最后一个字节,该字节为分隔符 fmt.Println("比较返回结果 part = ", part) - if bytes.Contains(part, instruction) { + if bytes.Contains(part, instruction) && num != 1 { fmt.Printf("Part %d: %s\n", i+1, part) //回应数据 _, err = conn.Write([]byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd}) @@ -213,7 +208,7 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid conn.SetDeadline(time.Time{}) return } - if bytes.Contains(part, instruction1) { + if bytes.Contains(part, instruction1) && num != 1 { fmt.Printf("Part %d: %s\n", i+1, part) //回应数据 _, err = conn.Write([]byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd}) @@ -257,6 +252,10 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid } } } + num++ + if num >= math.MaxInt64 { + num = 2 + } } } From 3b2c207627d49170df0d80a12d754adf86b4e293 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 16 Aug 2024 10:58:45 +0800 Subject: [PATCH 20/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/machinedoll/command.go | 91 ++++++++++--------------------- machine/machinedoll/machinemgr.go | 2 + 2 files changed, 31 insertions(+), 62 deletions(-) diff --git a/machine/machinedoll/command.go b/machine/machinedoll/command.go index ad56c9a..745b590 100644 --- a/machine/machinedoll/command.go +++ b/machine/machinedoll/command.go @@ -335,7 +335,7 @@ func queryBaseParam(conn net.Conn) { func SetPower(conn net.Conn) { data[3] = 0x01 fmt.Println("data.len = ", len(data)) - instruction := []byte{0xAA, 0x04, 0x01, 0x06} + instruction := []byte{0xAA, 0x33, 0x01, 0x06} instruction = append(instruction, data...) instruction = CalculateChecksum(instruction) _, err := conn.Write(instruction) @@ -353,10 +353,35 @@ func SetPower(conn net.Conn) { fmt.Println("n", n)*/ } +// 基础设置 +func SetBaseParam(conn net.Conn) { + instruction := []byte{0xAA, 0x33, 0x01, 0x06} + instruction = append(instruction, data...) + instruction = CalculateChecksum(instruction) + _, err := conn.Write(instruction) + if err != nil { + fmt.Println("Failed to send command to server:", err) + return + } + // 读取服务端的响应 + buf := make([]byte, 1024) + n, err := conn.Read(buf) + if err != nil { + fmt.Println("Failed to read response from server:", err) + return + } + fmt.Println("n", n) + if buf[4] == 1 { + fmt.Println("设置成功!") + } else { + fmt.Println("设置失败!") + } +} + var data = []byte{ 0x65, //0 几币几玩 0x00, //1 几币几玩占用位 - 0x1E, //2 游戏时间 + 0x2D, //2 游戏时间 0x00, //3 出奖模式 0x0F, //4 出奖概率 0x00, //5 出奖概率占用位 @@ -380,8 +405,8 @@ var data = []byte{ 0x32, //21 前后速度 0x32, //22 左右速度 0x50, //23 上下速度 - 0x34, //24 放线长度 - 0x08, //25 放线长度占用位 + 0x9A, //24 放线长度 + 0x06, //25 放线长度占用位 0x00, //26 礼品下放高度 0x00, //27 礼品下放高度占用位 0x00, //28 甩抓长度 @@ -407,61 +432,3 @@ var data = []byte{ 0x08, //46 游戏音乐选择 0x00, //47 概率队列自动 } - -/* -var data = []byte{ - 101, //0 几币几玩 - 0, //1 几币几玩占用位 - 30, //2 游戏时间 - 0, //3 出奖模式0无概率 1随机模式 2固定模式 3冠兴模式 - 15, //4 出奖概率 - 0, //5 出奖概率占用位 - 1, //6 空中抓物 0关闭 1开启 - 0, //7 连续投币赠送 范围0~100 - 0, //8 保夹次数 范围0~6, 6为无限次 - 1, //9 保夹赠送模式 0送游戏 1送中奖 2送游戏和中奖 - - 200, //10 强抓力电压 - 0, //11 强抓力电压占用位 - 124, //12 中抓力电压 - 1, //13 中抓力电压占用位 - 90, //14 弱抓力电压 - 0, //15 弱抓力电压占用位 - 224, //16 中奖电压 - 1, //17 中奖电压占用位 - 200, //18 强抓力时间 - 0, //19 强抓力时间占用位 - - 20, //20 放抓时间 - 50, //21 前后速度 - 50, //22 左右速度 - 80, //23 上下速度 - 52, //24 放线长度 - 8, //25 放线长度占用位 - 0, //26 礼品下放高度 - 0, //27 礼品下放高度占用位 - 0, //28 甩抓长度 - 0, //29 甩抓保护 - - 120, //30 甩抓电压 - 0, //31 甩抓电压占用位 - 50, //32 上拉保护 - 2, //33 天车自救时间 - 0, //34 下抓延时 - 0, //35 下抓延时占用位 - 200, //36 抓物延时 - 0, //37 抓物延时占用位 - 150, //38 上停延时 - 0, //39 上停延时占用位 - - 0, //40 摇杆延时 - 0, //41 摇杆延时占用位 - 0, //42 抓物二收 - 1, //43 待机音乐开关 - 15, //44 音量大小调整 - 7, //45 待机音乐选择 - 8, //46 游戏音乐选择 - 0, //47 概率队列自动 -} - -*/ diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index efaaf73..57ad3d2 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -74,6 +74,8 @@ func (this *MachineManager) Init() { Conn: conn, Addr: addr, } + SetBaseParam(conn) + fmt.Println("设置每台娃娃机基础配置!") } /* fmt.Println("Connected to server:\n", this.ConnMap[1].RemoteAddr()) From 33e82b00951c68c259a0265559c5ab8d136b7520 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 16 Aug 2024 18:05:45 +0800 Subject: [PATCH 21/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 68ad3b6..f044962 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -160,11 +160,6 @@ func SMDollMachineGrabHandler(session *netlib.Session, packetId int, data interf f2 := []func(){} Process(conn, f1, f2) } - err := conn.SetDeadline(time.Now().Add(15 * time.Second)) - if err != nil { - fmt.Println("Error setting deadline:", err) - return err - } return nil } @@ -205,7 +200,6 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid TypeId: 2, }) fmt.Println("没有抓到礼品!!!!!!!!snid = ", snid) - conn.SetDeadline(time.Time{}) return } if bytes.Contains(part, instruction1) && num != 1 { @@ -223,7 +217,6 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid TypeId: 2, }) fmt.Println("抓到礼品了!!!!!!!!snid = ", snid) - conn.SetDeadline(time.Time{}) return } //上分成功 From b5e23404c0f47a80c502ae23473adbae613f31be Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 16 Aug 2024 18:24:05 +0800 Subject: [PATCH 22/56] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=9F=B3=E4=B9=90?= =?UTF-8?q?=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/machinedoll/command.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machine/machinedoll/command.go b/machine/machinedoll/command.go index 745b590..bde15af 100644 --- a/machine/machinedoll/command.go +++ b/machine/machinedoll/command.go @@ -427,7 +427,7 @@ var data = []byte{ 0x00, //41 摇杆延时占用位 0x00, //42 抓物二收 0x00, //43 待机音乐开关 - 0x0F, //44 音量大小调整 + 0x00, //44 音量大小调整 0x07, //45 待机音乐选择 0x08, //46 游戏音乐选择 0x00, //47 概率队列自动 From 88db5712d897ec2a8f491cb626ca515502efb2d4 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 22 Aug 2024 15:43:28 +0800 Subject: [PATCH 23/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E8=8E=B7?= =?UTF-8?q?=E5=8F=96token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/action_clawdoll.go | 61 ++++++++ machine/action/action_server.go | 45 +++++- protocol/clawdoll/clawdoll.pb.go | 211 +++++++++++++++++++++++----- protocol/clawdoll/clawdoll.proto | 11 ++ protocol/machine/machine.pb.go | 209 ++++++++++++++++++++++++--- protocol/machine/machine.proto | 13 ++ 6 files changed, 494 insertions(+), 56 deletions(-) diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index 2340d03..6cd153c 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -69,8 +69,69 @@ func MSDollMachineoCoinResultHandler(session *netlib.Session, packetId int, data } return nil } + +type CSGetTokenPacketFactory struct { +} + +type CSGetTokenHandler struct { +} + +func (f *CSGetTokenPacketFactory) CreatePacket() interface{} { + pack := &clawdoll.CSCLAWDOLLGetToken{} + return pack +} + +func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { + //转发到娃娃机主机 + logger.Logger.Tracef("CSGetTokenHandler") + if msg, ok := data.(*clawdoll.CSCLAWDOLLGetToken); ok { + p := base.PlayerMgrSington.GetPlayer(sid) + if p == nil { + logger.Logger.Warn("CSGetTokenHandler p == nil") + return nil + } + pack := &machine.SMGetToken{} + pack.Snid = p.SnId + pack.AppId = msg.Appid + pack.ServerSecret = msg.ServerSecret + scene := p.GetScene() + if scene == nil { + return nil + } + sceneEx, ok := scene.ExtraData.(*SceneEx) + if !ok { + return nil + } + sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMGetToken), pack) + } + return nil +} + +// 娃娃机返回token 通知客户端 +func MSSendTokenHandler(session *netlib.Session, packetId int, data interface{}) error { + logger.Logger.Tracef("MSSendTokenHandler") + if msg, ok := data.(*machine.MSSendToken); ok { + //给客户端返回token + token := msg.Token + p := base.PlayerMgrSington.GetPlayer(int64(msg.Snid)) + if p == nil { + logger.Logger.Warn("MSSendTokenHandler p == nil") + return nil + } + pack := &clawdoll.SCCLAWDOLLSendToken{ + Token: token, + } + p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_SENDTOKEN), pack) + } + return nil +} func init() { common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSPlayerOpHandler{}) netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSPlayerOpPacketFactory{}) netlib.Register(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{}, MSDollMachineoCoinResultHandler) + //客户端请求token + common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSGetTokenHandler{}) + netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSGetTokenPacketFactory{}) + //获取token返回 + netlib.Register(int(machine.DollMachinePacketID_PACKET_MSSendToken), &machine.MSSendToken{}, MSSendTokenHandler) } diff --git a/machine/action/action_server.go b/machine/action/action_server.go index f044962..f102677 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -3,6 +3,7 @@ package action import ( "bytes" "fmt" + "github.com/zegoim/zego_server_assistant/token/go/src/token04" "math" "mongo.games.com/game/machine/machinedoll" "mongo.games.com/game/protocol/machine" @@ -199,7 +200,7 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid Result: 0, TypeId: 2, }) - fmt.Println("没有抓到礼品!!!!!!!!snid = ", snid) + fmt.Println("没有抓到礼品!!!!!!!!snid = ", snid, "num = ", num) return } if bytes.Contains(part, instruction1) && num != 1 { @@ -216,7 +217,7 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid Result: 1, TypeId: 2, }) - fmt.Println("抓到礼品了!!!!!!!!snid = ", snid) + fmt.Println("抓到礼品了!!!!!!!!snid = ", snid, "num = ", num) return } //上分成功 @@ -267,9 +268,49 @@ func SMGameLinkSucceedHandler(session *netlib.Session, packetId int, data interf logger.Logger.Tracef("向游戏服务器发送娃娃机连接信息:%v", msg) return nil } + +// 获取进入视频房间token +func SMGetTokenHandler(session *netlib.Session, packetId int, data interface{}) error { + logger.Logger.Tracef("SMGetTokenHandler %v", data) + msg, ok := data.(*machine.SMGetToken) + if !ok { + return nil + } + // 请将 appId 修改为你的 appId,appid 为数字,从即构控制台获取 + // 举例:1234567890 + var appId uint32 = uint32(msg.GetAppId()) + + // 请修改为你的 serverSecret,serverSecret 为字符串,从即构控制台获取 + // 举例: "fa94dd0f974cf2e293728a526b028271" + serverSecret := msg.ServerSecret + + // 请将 userId 修改为用户的 user_id + userId := msg.GetSnid() + + // token 的有效时长,单位:秒 + var effectiveTimeInSeconds int64 = 3600 + // token业务认证扩展,基础鉴权token此处填空字符串 + var payload string = "" + + //生成token + token, err := token04.GenerateToken04(appId, string(userId), serverSecret, effectiveTimeInSeconds, payload) + if err != nil { + fmt.Println(err) + return err + } + fmt.Println(token) + info := &machine.MSSendToken{} + info.Snid = msg.Snid + info.Token = token + session.Send(int(machine.DollMachinePacketID_PACKET_MSSendToken), info) + logger.Logger.Tracef("向游戏服务器发送娃娃机连接信息:%v", info) + return nil +} + func init() { netlib.Register(int(machine.DollMachinePacketID_PACKET_SMDollMachinePerate), &machine.SMDollMachineoPerate{}, SMDollMachinePerateHandler) netlib.Register(int(machine.DollMachinePacketID_PACKET_SMDollMachineGrab), &machine.SMDollMachineGrab{}, SMDollMachineGrabHandler) //链接成功 返回消息 netlib.Register(int(machine.DollMachinePacketID_PACKET_SMGameLinkSucceed), &machine.SMGameLinkSucceed{}, SMGameLinkSucceedHandler) + netlib.Register(int(machine.DollMachinePacketID_PACKET_SMGetToken), &machine.SMGetToken{}, SMGetTokenHandler) } diff --git a/protocol/clawdoll/clawdoll.pb.go b/protocol/clawdoll/clawdoll.pb.go index 437be49..30f9f00 100644 --- a/protocol/clawdoll/clawdoll.pb.go +++ b/protocol/clawdoll/clawdoll.pb.go @@ -33,6 +33,8 @@ const ( CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PlayerEnter CLAWDOLLPacketID = 5606 // 玩家进入 CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PlayerLeave CLAWDOLLPacketID = 5607 // 玩家离开 CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PLAYERINFO CLAWDOLLPacketID = 5608 // 玩家状态信息变化 + CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_GETTOKEN CLAWDOLLPacketID = 5609 // 获取token + CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_SENDTOKEN CLAWDOLLPacketID = 5610 // 获取token ) // Enum value maps for CLAWDOLLPacketID. @@ -47,6 +49,8 @@ var ( 5606: "PACKET_SC_CLAWDOLL_PlayerEnter", 5607: "PACKET_SC_CLAWDOLL_PlayerLeave", 5608: "PACKET_SC_CLAWDOLL_PLAYERINFO", + 5609: "PACKET_CS_CLAWDOLL_GETTOKEN", + 5610: "PACKET_SC_CLAWDOLL_SENDTOKEN", } CLAWDOLLPacketID_value = map[string]int32{ "PACKET_CLAWDOLL_ZERO": 0, @@ -58,6 +62,8 @@ var ( "PACKET_SC_CLAWDOLL_PlayerEnter": 5606, "PACKET_SC_CLAWDOLL_PlayerLeave": 5607, "PACKET_SC_CLAWDOLL_PLAYERINFO": 5608, + "PACKET_CS_CLAWDOLL_GETTOKEN": 5609, + "PACKET_SC_CLAWDOLL_SENDTOKEN": 5610, } ) @@ -806,6 +812,109 @@ func (x *SCCLAWDOLLPlayerLeave) GetPos() int32 { return 0 } +//玩家请求进入视频地址token +type CSCLAWDOLLGetToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Appid int64 `protobuf:"varint,1,opt,name=Appid,proto3" json:"Appid,omitempty"` + ServerSecret string `protobuf:"bytes,2,opt,name=serverSecret,proto3" json:"serverSecret,omitempty"` +} + +func (x *CSCLAWDOLLGetToken) Reset() { + *x = CSCLAWDOLLGetToken{} + if protoimpl.UnsafeEnabled { + mi := &file_clawdoll_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CSCLAWDOLLGetToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSCLAWDOLLGetToken) ProtoMessage() {} + +func (x *CSCLAWDOLLGetToken) ProtoReflect() protoreflect.Message { + mi := &file_clawdoll_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CSCLAWDOLLGetToken.ProtoReflect.Descriptor instead. +func (*CSCLAWDOLLGetToken) Descriptor() ([]byte, []int) { + return file_clawdoll_proto_rawDescGZIP(), []int{9} +} + +func (x *CSCLAWDOLLGetToken) GetAppid() int64 { + if x != nil { + return x.Appid + } + return 0 +} + +func (x *CSCLAWDOLLGetToken) GetServerSecret() string { + if x != nil { + return x.ServerSecret + } + return "" +} + +type SCCLAWDOLLSendToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=Token,proto3" json:"Token,omitempty"` +} + +func (x *SCCLAWDOLLSendToken) Reset() { + *x = SCCLAWDOLLSendToken{} + if protoimpl.UnsafeEnabled { + mi := &file_clawdoll_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCCLAWDOLLSendToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCCLAWDOLLSendToken) ProtoMessage() {} + +func (x *SCCLAWDOLLSendToken) ProtoReflect() protoreflect.Message { + mi := &file_clawdoll_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCCLAWDOLLSendToken.ProtoReflect.Descriptor instead. +func (*SCCLAWDOLLSendToken) Descriptor() ([]byte, []int) { + return file_clawdoll_proto_rawDescGZIP(), []int{10} +} + +func (x *SCCLAWDOLLSendToken) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + var File_clawdoll_proto protoreflect.FileDescriptor var file_clawdoll_proto_rawDesc = []byte{ @@ -886,37 +995,49 @@ var file_clawdoll_proto_rawDesc = []byte{ 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x29, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x6f, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x2a, 0xc7, 0x02, 0x0a, 0x10, 0x43, 0x4c, 0x41, - 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x18, 0x0a, - 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, - 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x52, 0x4f, - 0x4f, 0x4d, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, - 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, + 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, 0x12, 0x43, 0x53, 0x43, 0x4c, + 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, + 0x70, 0x70, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x2b, 0x0a, 0x13, 0x53, 0x43, 0x43, 0x4c, + 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0x8c, 0x03, 0x0a, 0x10, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, + 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x5a, 0x45, + 0x52, 0x4f, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x49, + 0x4e, 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, + 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, + 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, + 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, 0x2b, 0x12, 0x22, 0x0a, + 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, + 0x4f, 0x4c, 0x4c, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, + 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, + 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, - 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x21, 0x0a, - 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, - 0x4f, 0x4c, 0x4c, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, 0x2b, - 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, - 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, - 0x44, 0x10, 0xe5, 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, - 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x22, - 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, - 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, 0x10, - 0xe8, 0x2b, 0x2a, 0x64, 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, - 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, - 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x50, - 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, - 0x6c, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe8, 0x2b, 0x12, + 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, + 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x47, 0x45, 0x54, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, + 0x2b, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, + 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, 0x4b, 0x45, + 0x4e, 0x10, 0xea, 0x2b, 0x2a, 0x64, 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, + 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, + 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, + 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, + 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -932,7 +1053,7 @@ func file_clawdoll_proto_rawDescGZIP() []byte { } var file_clawdoll_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_clawdoll_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_clawdoll_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_clawdoll_proto_goTypes = []interface{}{ (CLAWDOLLPacketID)(0), // 0: clawdoll.CLAWDOLLPacketID (OpResultCode)(0), // 1: clawdoll.OpResultCode @@ -945,6 +1066,8 @@ var file_clawdoll_proto_goTypes = []interface{}{ (*SCCLAWDOLLPlayerInfo)(nil), // 8: clawdoll.SCCLAWDOLLPlayerInfo (*SCCLAWDOLLPlayerEnter)(nil), // 9: clawdoll.SCCLAWDOLLPlayerEnter (*SCCLAWDOLLPlayerLeave)(nil), // 10: clawdoll.SCCLAWDOLLPlayerLeave + (*CSCLAWDOLLGetToken)(nil), // 11: clawdoll.CSCLAWDOLLGetToken + (*SCCLAWDOLLSendToken)(nil), // 12: clawdoll.SCCLAWDOLLSendToken } var file_clawdoll_proto_depIdxs = []int32{ 2, // 0: clawdoll.SCCLAWDOLLRoomInfo.Players:type_name -> clawdoll.CLAWDOLLPlayerData @@ -1071,6 +1194,30 @@ func file_clawdoll_proto_init() { return nil } } + file_clawdoll_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CSCLAWDOLLGetToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clawdoll_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCCLAWDOLLSendToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1078,7 +1225,7 @@ func file_clawdoll_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clawdoll_proto_rawDesc, NumEnums: 2, - NumMessages: 9, + NumMessages: 11, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/clawdoll/clawdoll.proto b/protocol/clawdoll/clawdoll.proto index 579ae56..a2d08c4 100644 --- a/protocol/clawdoll/clawdoll.proto +++ b/protocol/clawdoll/clawdoll.proto @@ -13,6 +13,8 @@ enum CLAWDOLLPacketID { PACKET_SC_CLAWDOLL_PlayerEnter = 5606; // 玩家进入 PACKET_SC_CLAWDOLL_PlayerLeave = 5607; // 玩家离开 PACKET_SC_CLAWDOLL_PLAYERINFO = 5608; // 玩家状态信息变化 + PACKET_CS_CLAWDOLL_GETTOKEN = 5609; // 获取token + PACKET_SC_CLAWDOLL_SENDTOKEN = 5610; // 获取token } //操作结果 @@ -102,4 +104,13 @@ message SCCLAWDOLLPlayerEnter { //PACKET_SCCLAWDOLLPlayerLeave message SCCLAWDOLLPlayerLeave { int32 Pos = 1; //玩家位置 +} +//玩家请求进入视频地址token +message CSCLAWDOLLGetToken { + int64 Appid = 1; + string serverSecret = 2; +} + +message SCCLAWDOLLSendToken { + string Token = 1; } \ No newline at end of file diff --git a/protocol/machine/machine.pb.go b/protocol/machine/machine.pb.go index 65ef2f3..1f7d7f4 100644 --- a/protocol/machine/machine.pb.go +++ b/protocol/machine/machine.pb.go @@ -31,6 +31,8 @@ const ( DollMachinePacketID_PACKET_MSDollMachineList DollMachinePacketID = 20003 DollMachinePacketID_PACKET_MSUpdateDollMachineStatus DollMachinePacketID = 20004 DollMachinePacketID_PACKET_MSDollMachineoPerateResult DollMachinePacketID = 20005 + DollMachinePacketID_PACKET_SMGetToken DollMachinePacketID = 20006 + DollMachinePacketID_PACKET_MSSendToken DollMachinePacketID = 20007 ) // Enum value maps for DollMachinePacketID. @@ -43,6 +45,8 @@ var ( 20003: "PACKET_MSDollMachineList", 20004: "PACKET_MSUpdateDollMachineStatus", 20005: "PACKET_MSDollMachineoPerateResult", + 20006: "PACKET_SMGetToken", + 20007: "PACKET_MSSendToken", } DollMachinePacketID_value = map[string]int32{ "PACKET_SMDollMachineZero": 0, @@ -52,6 +56,8 @@ var ( "PACKET_MSDollMachineList": 20003, "PACKET_MSUpdateDollMachineStatus": 20004, "PACKET_MSDollMachineoPerateResult": 20005, + "PACKET_SMGetToken": 20006, + "PACKET_MSSendToken": 20007, } ) @@ -490,6 +496,126 @@ func (x *MSUpdateDollMachineStatus) GetVideoAddr() string { return "" } +//获取token +type SMGetToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` + AppId int64 `protobuf:"varint,2,opt,name=AppId,proto3" json:"AppId,omitempty"` + ServerSecret string `protobuf:"bytes,3,opt,name=ServerSecret,proto3" json:"ServerSecret,omitempty"` +} + +func (x *SMGetToken) Reset() { + *x = SMGetToken{} + if protoimpl.UnsafeEnabled { + mi := &file_machine_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SMGetToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SMGetToken) ProtoMessage() {} + +func (x *SMGetToken) ProtoReflect() protoreflect.Message { + mi := &file_machine_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SMGetToken.ProtoReflect.Descriptor instead. +func (*SMGetToken) Descriptor() ([]byte, []int) { + return file_machine_proto_rawDescGZIP(), []int{7} +} + +func (x *SMGetToken) GetSnid() int32 { + if x != nil { + return x.Snid + } + return 0 +} + +func (x *SMGetToken) GetAppId() int64 { + if x != nil { + return x.AppId + } + return 0 +} + +func (x *SMGetToken) GetServerSecret() string { + if x != nil { + return x.ServerSecret + } + return "" +} + +//返回token +type MSSendToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` + Token string `protobuf:"bytes,2,opt,name=Token,proto3" json:"Token,omitempty"` +} + +func (x *MSSendToken) Reset() { + *x = MSSendToken{} + if protoimpl.UnsafeEnabled { + mi := &file_machine_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MSSendToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MSSendToken) ProtoMessage() {} + +func (x *MSSendToken) ProtoReflect() protoreflect.Message { + mi := &file_machine_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MSSendToken.ProtoReflect.Descriptor instead. +func (*MSSendToken) Descriptor() ([]byte, []int) { + return file_machine_proto_rawDescGZIP(), []int{8} +} + +func (x *MSSendToken) GetSnid() int32 { + if x != nil { + return x.Snid + } + return 0 +} + +func (x *MSSendToken) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + var File_machine_proto protoreflect.FileDescriptor var file_machine_proto_rawDesc = []byte{ @@ -527,26 +653,39 @@ var file_machine_proto_rawDesc = []byte{ 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, - 0x64, 0x64, 0x72, 0x2a, 0x86, 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, - 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, - 0xa4, 0x9c, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, - 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x6f, 0x50, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x10, 0xa5, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x64, 0x72, 0x22, 0x5a, 0x0a, 0x0a, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x53, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, + 0x37, 0x0a, 0x0b, 0x4d, 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0xb9, 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x6c, + 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, + 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, + 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, + 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, + 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, + 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, + 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, + 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, + 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, + 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa3, 0x9c, 0x01, + 0x12, 0x26, 0x0a, 0x20, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x10, 0xa4, 0x9c, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x6f, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x10, 0xa5, 0x9c, + 0x01, 0x12, 0x17, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x65, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0xa6, 0x9c, 0x01, 0x12, 0x18, 0x0a, 0x12, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x10, 0xa7, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, + 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -562,7 +701,7 @@ func file_machine_proto_rawDescGZIP() []byte { } var file_machine_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_machine_proto_goTypes = []interface{}{ (DollMachinePacketID)(0), // 0: machine.DollMachinePacketID (*SMGameLinkSucceed)(nil), // 1: machine.SMGameLinkSucceed @@ -572,6 +711,8 @@ var file_machine_proto_goTypes = []interface{}{ (*MSDollMachineList)(nil), // 5: machine.MSDollMachineList (*DollMachine)(nil), // 6: machine.DollMachine (*MSUpdateDollMachineStatus)(nil), // 7: machine.MSUpdateDollMachineStatus + (*SMGetToken)(nil), // 8: machine.SMGetToken + (*MSSendToken)(nil), // 9: machine.MSSendToken } var file_machine_proto_depIdxs = []int32{ 6, // 0: machine.MSDollMachineList.data:type_name -> machine.DollMachine @@ -672,6 +813,30 @@ func file_machine_proto_init() { return nil } } + file_machine_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SMGetToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_machine_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MSSendToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -679,7 +844,7 @@ func file_machine_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_machine_proto_rawDesc, NumEnums: 1, - NumMessages: 7, + NumMessages: 9, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/machine/machine.proto b/protocol/machine/machine.proto index 1e4933d..a5b5e5c 100644 --- a/protocol/machine/machine.proto +++ b/protocol/machine/machine.proto @@ -13,6 +13,8 @@ enum DollMachinePacketID { PACKET_MSDollMachineList = 20003; PACKET_MSUpdateDollMachineStatus = 20004; PACKET_MSDollMachineoPerateResult = 20005; + PACKET_SMGetToken = 20006; + PACKET_MSSendToken = 20007; } //通知链接成功 //PACKET_SMDollMachinePerate @@ -56,4 +58,15 @@ message MSUpdateDollMachineStatus{ int32 Id = 1; int32 Status = 2; //1-空闲 0-无法使用 string VideoAddr = 3; +} +//获取token +message SMGetToken{ + int32 Snid = 1; + int64 AppId = 2; + string ServerSecret = 3; +} +//返回token +message MSSendToken{ + int32 Snid = 1; + string Token = 2; } \ No newline at end of file From b98b2246eb4aef06d56a276e4b137c8dc14cd87c Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 23 Aug 2024 16:35:58 +0800 Subject: [PATCH 24/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E8=8E=B7?= =?UTF-8?q?=E5=8F=96token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index f102677..f42592d 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -303,7 +303,7 @@ func SMGetTokenHandler(session *netlib.Session, packetId int, data interface{}) info.Snid = msg.Snid info.Token = token session.Send(int(machine.DollMachinePacketID_PACKET_MSSendToken), info) - logger.Logger.Tracef("向游戏服务器发送娃娃机连接信息:%v", info) + logger.Logger.Tracef("向游戏服务器发送娃娃机token:%v", info) return nil } From c6ee48573b2a2d054fac259cb0cd0491ae403cbd Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Sat, 24 Aug 2024 12:03:54 +0800 Subject: [PATCH 25/56] =?UTF-8?q?=E7=94=B5=E5=8E=8B=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/machinedoll/command.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/machine/machinedoll/command.go b/machine/machinedoll/command.go index bde15af..26c0031 100644 --- a/machine/machinedoll/command.go +++ b/machine/machinedoll/command.go @@ -382,7 +382,7 @@ var data = []byte{ 0x65, //0 几币几玩 0x00, //1 几币几玩占用位 0x2D, //2 游戏时间 - 0x00, //3 出奖模式 + 0x00, //3 出奖模式0 无概率 1 随机模式 2 固定模式 3 冠兴模式 0x0F, //4 出奖概率 0x00, //5 出奖概率占用位 0x00, //6 空中抓物 0关闭 1开启 @@ -390,11 +390,11 @@ var data = []byte{ 0x00, //8 保夹次数 范围0~6, 6为无限次 0x01, //9 保夹赠送模式 0送游戏 1送中奖 2送游戏和中奖 - 0x04, //10 强抓力电压 - 0x50, //11 强抓力电压占用位 - 0x7C, //12 中抓力电压 - 0x00, //13 中抓力电压占用位 - 0x5A, //14 弱抓力电压 + 0x80, //10 强抓力电压 + 0x01, //11 强抓力电压占用位 + 0x80, //12 中抓力电压 + 0x01, //13 中抓力电压占用位 + 0x78, //14 弱抓力电压 0x00, //15 弱抓力电压占用位 0xE0, //16 中奖电压 0x01, //17 中奖电压占用位 From 87486f1a485f391a98fa8459683d6408016b04d5 Mon Sep 17 00:00:00 2001 From: kxdd <88655@163.com> Date: Sat, 24 Aug 2024 15:13:22 +0800 Subject: [PATCH 26/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=B5=81=E7=A8=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamerule/clawdoll/constants.go | 20 +- gamerule/clawdoll/queue.go | 221 +++++++++++++++++++++ gamesrv/clawdoll/player_clawdoll.go | 5 +- gamesrv/clawdoll/scene_clawdoll.go | 69 +++++++ gamesrv/clawdoll/scenepolicy_clawdoll.go | 241 ++++++++++++++++------- 5 files changed, 473 insertions(+), 83 deletions(-) create mode 100644 gamerule/clawdoll/queue.go diff --git a/gamerule/clawdoll/constants.go b/gamerule/clawdoll/constants.go index 735ee60..abcd61a 100644 --- a/gamerule/clawdoll/constants.go +++ b/gamerule/clawdoll/constants.go @@ -8,13 +8,17 @@ const ( ClawDollSceneStateStart //开始倒计时 ClawDollSceneStatePlayGame //游戏中 ClawDollSceneStateBilled //结算 + ClawDollSceneWaitPayCoin //等待下一局投币 ClawDollSceneStateMax ) const ( - ClawDollSceneWaitTimeout = time.Second * 6 //等待倒计时 - ClawDollSceneStartTimeout = time.Second * 15 //开始倒计时 - ClawDollSceneBilledTimeout = time.Second * 2 //结算 + ClawDollSceneWaitTimeout = time.Second * 6 //等待倒计时 + ClawDollSceneStartTimeout = time.Second * 5 //开始倒计时 + ClawDollScenePlayTimeout = time.Second * 30 //娃娃机下抓倒计时 + ClawDollSceneBilledTimeout = time.Second * 2 //结算 + ClawDollSceneWaitPayCoinimeout = time.Second * 10 //等待下一局投币 + ) // 玩家操作 @@ -24,11 +28,13 @@ const ( ClawDollPlayerOpMove // 玩家操控动作 // 1-前 2-后 3-左 4-右 ) +// 1-前 2-后 3-左 4-右 5-投币 const ( - ButtonFront = iota + 1 /*前*/ - ButtonBack /*后*/ - ButtonLeft /*左*/ - ButtonRight /*右*/ + ButtonFront = iota + 1 /*前*/ + ButtonBack /*后*/ + ButtonLeft /*左*/ + ButtonRight /*右*/ + ButtonPayCoin /*投币*/ ) const ( diff --git a/gamerule/clawdoll/queue.go b/gamerule/clawdoll/queue.go new file mode 100644 index 0000000..c051bae --- /dev/null +++ b/gamerule/clawdoll/queue.go @@ -0,0 +1,221 @@ +package clawdoll + +// queue队列容器包 +// 以动态数组的形式实现 +// 该容器可以在尾部实现线性增加元素,在首部实现线性减少元素 +// 队列的扩容和缩容同vector一样,即数组小采用翻倍扩缩容/折半缩容,数组大时采用固定扩/缩容 +// 该容器满足FIFO的先进先出模式 +// 可接纳不同类型的元素 + +// queue队列结构体 +// 包含泛型切片和该切片的首尾位的下标 +// 当删除节点时仅仅需要后移首位一位即可 +// 当剩余长度较小时采用缩容策略进行缩容以释放空间 +// 当添加节点时若未占满全部已分配空间则尾指针后移一位同时进行覆盖存放 +// 当添加节点时尾指针大于已分配空间长度,则先去掉首部多出来的空间,如果还不足则进行扩容 +// 首节点指针始终不能超过尾节点指针 +type Queue struct { + data []interface{} //泛型切片 + begin uint64 //首节点下标 + end uint64 //尾节点下标 + cap uint64 //容量 +} + +//queue队列容器接口 +//存放了queue容器可使用的函数 +//对应函数介绍见下方 + +type queuer interface { + Size() (size uint64) //返回该队列中元素的使用空间大小 + Clear() //清空该队列 + Empty() (b bool) //判断该队列是否为空 + Push(e interface{}) //将元素e添加到该队列末尾 + Pop() (e interface{}) //将该队列首元素弹出并返回 + Front() (e interface{}) //获取该队列首元素 + Back() (e interface{}) //获取该队列尾元素 +} + +// 新建一个queue队列容器并返回 +// 初始queue的切片数组为空 +// 初始queue的首尾指针均置零 +// +// @receiver nil +// @param nil +// @return q *Queue 新建的queue指针 +func New() (q *Queue) { + return &Queue{ + data: make([]interface{}, 1, 1), + begin: 0, + end: 0, + cap: 1, + } +} + +// 返回该容器当前含有元素的数量 +// 该长度并非实际占用空间数量 +// 若容器为空则返回0 +// +// @receiver q *Queue 接受者queue的指针 +// @param nil +// @return size uint64 容器中实际使用元素所占空间大小 +func (q *Queue) Size() (size uint64) { + if q == nil { + q = New() + } + return q.end - q.begin +} + +// 以queue队列容器做接收者 +// 将该容器中所承载的元素清空 +// 将该容器的首尾指针均置0,容量设为1 +// +// @receiver q *Queue 接受者queue的指针 +// @param nil +// @return nil +func (q *Queue) Clear() { + if q == nil { + q = New() + } + + q.data = make([]interface{}, 1, 1) + q.begin = 0 + q.end = 0 + q.cap = 1 +} + +// 判断该queue队列容器是否含有元素 +// 如果含有元素则不为空,返回false +// 如果不含有元素则说明为空,返回true +// 如果容器不存在,返回true +// 该判断过程通过首尾指针数值进行判断 +// 当尾指针数值等于首指针时说明不含有元素 +// 当尾指针数值大于首指针时说明含有元素 +// +// @receiver q *Queue 接受者queue的指针 +// @param nil +// @return b bool 该容器是空的吗? +func (q *Queue) Empty() (b bool) { + if q == nil { + q = New() + } + return q.Size() <= 0 +} + +// 在容器尾部插入元素 +// 若尾指针小于切片实际使用长度,则对当前指针位置进行覆盖,同时尾下标后移一位 +// 若尾指针等于切片实际使用长度,则对实际使用量和实际占用量进行判断 +// 当首部还有冗余时则删将实际使用整体前移到首部,否则对尾部进行扩容即可 +// +// @receiver q *Queue 接受者queue的指针 +// @param e interface{} 待插入元素 +// @return nil +func (q *Queue) Push(e interface{}) { + if q == nil { + q = New() + } + + if q.end < q.cap { + //不需要扩容 + q.data[q.end] = e + } else { + //需要扩容 + if q.begin > 0 { + //首部有冗余,整体前移 + for i := uint64(0); i < q.end-q.begin; i++ { + q.data[i] = q.data[i+q.begin] + } + q.end -= q.begin + q.begin = 0 + } else { + //冗余不足,需要扩容 + if q.cap <= 65536 { + //容量翻倍 + if q.cap == 0 { + q.cap = 1 + } + q.cap *= 2 + } else { + //容量增加2^16 + q.cap += 2 ^ 16 + } + //复制扩容前的元素 + tmp := make([]interface{}, q.cap, q.cap) + copy(tmp, q.data) + q.data = tmp + } + q.data[q.end] = e + } + q.end++ +} + +// 弹出容器第一个元素,同时首下标后移一位 +// 若容器为空,则不进行弹出 +// 弹出结束后,进行缩容判断,考虑到queue的冗余会存在于前后两个方向 +// 所以需要对前后两方分别做判断, 但由于首部主要是减少,并不会增加,所以不需要太多冗余量,而尾部只做添加,所以需要更多的冗余 +// 所以可以对首部预留2^10的冗余,当超过时直接对首部冗余清除即可,释放首部空间时尾部空间仍然保留不变 +// 当首部冗余不足2^10时,但冗余超过实际使用空间,也会对首部进行缩容,尾部不变 +// 同时返回队首元素 +// +// @receiver q *Queue 接受者queue的指针 +// @param nil +// @return e interface{} 队首元素 +func (q *Queue) Pop() (e interface{}) { + if q == nil { + q = New() + return nil + } + if q.Empty() { + q.Clear() + return nil + } + + e = q.data[q.begin] + q.begin++ + if q.begin >= 1024 || q.begin*2 > q.end { + //首部冗余超过2^10或首部冗余超过实际使用 + q.cap -= q.begin + q.end -= q.begin + tmp := make([]interface{}, q.cap, q.cap) + copy(tmp, q.data[q.begin:]) + q.data = tmp + q.begin = 0 + } + + return e +} + +// 返回该容器的第一个元素 +// 若该容器当前为空,则返回nil +// +// @receiver q *Queue 接受者queue的指针 +// @param nil +// @return e interface{} 容器的第一个元素 +func (q *Queue) Front() (e interface{}) { + if q == nil { + q = New() + return nil + } + if q.Empty() { + q.Clear() + return nil + } + return q.data[q.begin] +} + +// 返回该容器的最后一个元素 +// 若该容器当前为空,则返回nil +// +// @receiver q *Queue 接受者queue的指针 +// @param nil +// @return e interface{} 容器的最后一个元素 +func (q *Queue) Back() (e interface{}) { + if q == nil { + q = New() + return nil + } + if q.Empty() { + q.Clear() + return nil + } + return q.data[q.end-1] +} diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index 1ec2c43..68887da 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -8,6 +8,8 @@ import ( type PlayerEx struct { *base.Player //玩家信息 + dollCardsCnt int32 // 娃娃卡数量 + gainCoin int64 // 本局赢的金币 taxCoin int64 // 本局税收 odds int32 @@ -33,7 +35,6 @@ func (this *PlayerEx) CanOp(sceneEx *SceneEx) bool { // 能否投币 func (this *PlayerEx) CanPayCoin() bool { - return true } @@ -62,7 +63,7 @@ func (this *PlayerEx) InitData(baseScore int32) { } -// 重置下注数据 +// 重置数据 func (this *PlayerEx) ResetData() { } diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index 340b7cc..d794269 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -1,6 +1,7 @@ package clawdoll import ( + "container/list" "mongo.games.com/game/common" rule "mongo.games.com/game/gamerule/clawdoll" "mongo.games.com/game/gamesrv/base" @@ -43,6 +44,9 @@ type SceneEx struct { PlayerBackup map[int32]*PlayerData // 本局离场玩家数据备份 seats []*PlayerEx // 本局游戏中的玩家状态数据 + waitPlayers *list.List + playingSnid int32 // 正在玩的玩家snid + RoundId int // 局数,第几局 robotNum int // 参与游戏的机器人数量 logid string @@ -65,6 +69,7 @@ func (this *SceneEx) delPlayer(p *base.Player) { if p, exist := this.players[p.SnId]; exist { this.seats[p.GetPos()] = nil delete(this.players, p.SnId) + this.RemoveWaitPlayer(p.SnId) } } @@ -159,6 +164,7 @@ func NewClawdollSceneData(s *base.Scene) *SceneEx { players: make(map[int32]*PlayerEx), seats: make([]*PlayerEx, s.GetPlayerNum()), PlayerBackup: make(map[int32]*PlayerData), + waitPlayers: list.New(), } return sceneEx @@ -179,11 +185,34 @@ func (this *SceneEx) Clear() { this.PlayerBackup = make(map[int32]*PlayerData) this.RoundId = 0 + for e := this.waitPlayers.Front(); e != nil; e = e.Next() { + if e != nil { + p := e.Value.(*PlayerEx) + p.Clear(0) + } + } + for i := 0; i < this.GetPlayerNum(); i++ { if this.seats[i] != nil { this.seats[i].Clear(this.GetBaseScore()) } } + +} + +// 是否有玩家正在玩 +func (this *SceneEx) IsHasPlaying() bool { + if this.playingSnid == 0 { + return false + } + + return true +} + +// 等待下一个玩家 +func (this *SceneEx) WaitNextPlayer() { + this.playingSnid = 0 + } func (this *SceneEx) BackupPlayer(p *PlayerEx, isBilled bool) { @@ -209,6 +238,46 @@ func (this *SceneEx) BackupPlayer(p *PlayerEx, isBilled bool) { } } +func (this *SceneEx) GetPlayGrabType(player *PlayerEx) int32 { + if player == nil { + return rule.ClawWeak + } + + if this.RoundId%100 == 0 && this.RoundId != 0 { + return rule.ClawStrong + } + + return rule.ClawWeak +} + +func (this *SceneEx) AddWaitPlayer(player *PlayerEx) { + if player == nil { + return + } + + this.waitPlayers.PushBack(player) +} + +func (this *SceneEx) RemoveWaitPlayer(SnId int32) bool { + l := this.waitPlayers + for e := l.Front(); e != nil; e = e.Next() { + if p := e.Value.(*PlayerEx); p.SnId == SnId { + this.waitPlayers.Remove(e) + return true + } + } + + return false +} + +// 时间到 系统开始下抓 +func (this *SceneEx) TimeOutPlayGrab() bool { + + this.OnPlayerSMGrabOp(this.playingSnid, int32(this.machineId), rule.ClawWeak) + + return true +} + // OnPlayerSMGrabOp 下抓 //1-弱力抓 2 -强力抓 3-必出抓 func (this *SceneEx) OnPlayerSMGrabOp(SnId, Id, GrabType int32) { diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 14db059..64884fa 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -93,35 +93,26 @@ func (this *PolicyClawdoll) OnPlayerEnter(s *base.Scene, p *base.Player) { if s == nil || p == nil { return } + logger.Logger.Trace("(this *PolicyClawdoll) OnPlayerEnter, sceneId=", s.GetSceneId(), " player=", p.SnId) if sceneEx, ok := s.ExtraData.(*SceneEx); ok { - pos := -1 - for i := 0; i < sceneEx.GetPlayerNum(); i++ { - if sceneEx.seats[i] == nil { - pos = i - break - } + playerEx := &PlayerEx{Player: p} + sceneEx.players[p.SnId] = playerEx + baseScore := sceneEx.GetBaseScore() + p.ExtraData = playerEx + playerEx.Clear(baseScore) + + if sceneEx.playingSnid == 0 { + p.MarkFlag(base.PlayerState_WaitNext) + p.UnmarkFlag(base.PlayerState_Ready) + sceneEx.playingSnid = p.GetSnId() } - if pos != -1 { - playerEx := &PlayerEx{Player: p} - sceneEx.seats[pos] = playerEx - sceneEx.players[p.SnId] = playerEx - baseScore := sceneEx.GetBaseScore() + sceneEx.AddWaitPlayer(playerEx) - p.Pos = pos - p.ExtraData = playerEx - playerEx.Clear(baseScore) - - if sceneEx.Gaming { - p.MarkFlag(base.PlayerState_WaitNext) - p.UnmarkFlag(base.PlayerState_Ready) - } - - //给自己发送房间信息 - this.SendRoomInfo(s, p, sceneEx) - s.FirePlayerEvent(p, base.PlayerEventEnter, nil) - } + //给自己发送房间信息 + this.SendRoomInfo(s, p, sceneEx) + s.FirePlayerEvent(p, base.PlayerEventEnter, nil) } } @@ -231,9 +222,6 @@ func (this *PolicyClawdoll) IsCompleted(s *base.Scene) bool { } func (this *PolicyClawdoll) IsCanForceStart(s *base.Scene) bool { - if sceneEx, ok := s.ExtraData.(*SceneEx); ok { - return len(s.Players) >= 2 && !sceneEx.Gaming - } return false } @@ -342,7 +330,6 @@ func (this *StateWait) CanChangeTo(s base.SceneState) bool { } func (this *StateWait) GetTimeout(s *base.Scene) int { - return this.BaseState.GetTimeout(s) } @@ -354,7 +341,7 @@ func (this *StateWait) OnEnter(s *base.Scene) { } s.Gaming = false - ClawdollBroadcastRoomState(s, float32(0), float32(0)) + ClawdollBroadcastRoomState(s, float32(0)) if sceneEx.CanStart() { s.ChangeSceneState(rule.ClawDollSceneStateStart) @@ -385,13 +372,42 @@ func (this *StateWait) OnTick(s *base.Scene) { sceneEx.SceneDestroy(true) return } - if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollSceneWaitTimeout { - //切换到准备开局状态 - if sceneEx.CanStart() { - s.ChangeSceneState(rule.ClawDollSceneStateStart) - } + } +} + +func (this *StateWait) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + if this.BaseState.OnPlayerOp(s, p, opcode, params) { + return true + } + + sceneEx, ok := s.ExtraData.(*SceneEx) + if !ok { + return false + } + playerEx, ok := p.ExtraData.(*PlayerEx) + if !ok { + return false + } + + switch opcode { + case rule.ClawDollPlayerOpPayCoin: + if sceneEx.IsHasPlaying() { + return false + } + + if !playerEx.CanPayCoin() { + return false + } + + // 1-前 2-后 3-左 4-右 5-投币 + sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), rule.ButtonPayCoin) + + if sceneEx.CanStart() { + s.ChangeSceneState(rule.ClawDollSceneStateStart) } } + + return false } //===================================== @@ -409,6 +425,7 @@ func (this *StateStart) GetState() int { func (this *StateStart) CanChangeTo(s base.SceneState) bool { switch s.GetState() { case rule.ClawDollSceneStatePlayGame: + case rule.ClawDollSceneStateWait: return true } return false @@ -417,11 +434,10 @@ func (this *StateStart) CanChangeTo(s base.SceneState) bool { func (this *StateStart) OnEnter(s *base.Scene) { this.BaseState.OnEnter(s) if sceneEx, ok := s.ExtraData.(*SceneEx); ok { - ClawdollBroadcastRoomState(s, float32(0), float32(0)) + ClawdollBroadcastRoomState(s) s.Gaming = false sceneEx.GameNowTime = time.Now() sceneEx.NumOfGames++ - } } @@ -440,29 +456,6 @@ func (this *StateStart) OnTick(s *base.Scene) { } func (this *StateStart) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { - if this.BaseState.OnPlayerOp(s, p, opcode, params) { - return true - } - - sceneEx, ok := s.ExtraData.(*SceneEx) - if !ok { - return false - } - playerEx, ok := p.ExtraData.(*PlayerEx) - if !ok { - return false - } - - switch opcode { - case rule.ClawDollPlayerOpPayCoin: - if !playerEx.CanPayCoin() { - return false - } - - // 1-前 2-后 3-左 4-右 5-投币 - sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), int32(5)) - } - return false } @@ -532,27 +525,26 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para } switch opcode { - case rule.ClawDollPlayerOpPayCoin: - // 投币检测 - if !playerEx.CanPayCoin() { - return false - } - - // 1-前 2-后 3-左 4-右 5-投币 - sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), int32(5)) - //sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) case rule.ClawDollPlayerOpGo: if !playerEx.CanGrab() { return false } + grapType := sceneEx.GetPlayGrabType(playerEx) + + logger.Logger.Trace("StatePlayGame OnPlayerOp-----SnId:", p.SnId, " grapType: ", grapType) //1-弱力抓 2 -强力抓 - sceneEx.OnPlayerSMGrabOp(p.SnId, int32(sceneEx.machineId), int32(2)) + sceneEx.OnPlayerSMGrabOp(p.SnId, int32(sceneEx.machineId), grapType) + case rule.ClawDollPlayerOpMove: if !playerEx.CanMove() { return false } + if params[0] < rule.ButtonFront || params[0] > rule.ButtonRight { + logger.Logger.Trace("StatePlayGame OnPlayerOp-----SnId:", p.SnId, " opcode: ", opcode, " params:", params) + return false + } // 1-前 2-后 3-左 4-右 5-投币 sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), int32(params[0])) } @@ -562,6 +554,17 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para func (this *PlayGame) OnTick(s *base.Scene) { this.BaseState.OnTick(s) + if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollScenePlayTimeout { + + if sceneEx.TimeOutPlayGrab() { + + } + + s.ChangeSceneState(rule.ClawDollSceneStateBilled) + return + } + } } //===================================== @@ -610,11 +613,100 @@ func (this *StateBilled) OnTick(s *base.Scene) { this.BaseState.OnTick(s) if sceneEx, ok := s.ExtraData.(*SceneEx); ok { if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollSceneBilledTimeout { - if sceneEx.CanStart() { - s.ChangeSceneState(rule.ClawDollSceneStateStart) - } else { - s.ChangeSceneState(rule.ClawDollSceneStateWait) - } + + s.ChangeSceneState(rule.ClawDollSceneWaitPayCoin) + + return + } + } +} + +//===================================== +// StateWaitPayCoin 等待下一局投币 +//===================================== + +type StateWaitPayCoin struct { + BaseState +} + +func (this *StateWaitPayCoin) GetState() int { + return rule.ClawDollSceneWaitPayCoin +} + +func (this *StateWaitPayCoin) CanChangeTo(s base.SceneState) bool { + switch s.GetState() { + case rule.ClawDollSceneStateStart: + case rule.ClawDollSceneStateWait: + return true + } + return false +} + +func (this *StateWaitPayCoin) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + logger.Logger.Trace("StatePlayGame OnPlayerOp-----SnId:", p.SnId, " opcode: ", opcode, " params:", params) + + if this.BaseState.OnPlayerOp(s, p, opcode, params) { + return true + } + + sceneEx, ok := s.ExtraData.(*SceneEx) + if !ok { + return false + } + playerEx, ok := p.ExtraData.(*PlayerEx) + if !ok { + return false + } + + switch opcode { + case rule.ClawDollPlayerOpPayCoin: + + if sceneEx.playingSnid != playerEx.SnId { + logger.Logger.Trace("StateWaitPayCoin OnPlayerOp-----sceneEx.playingSnid:", sceneEx.playingSnid, " playerEx.SnId: ", playerEx.SnId) + return false + } + + // 投币检测 + if !playerEx.CanPayCoin() { + logger.Logger.Trace("StateWaitPayCoin OnPlayerOp-----CanPayCoin: false") + return false + } + + sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), rule.ButtonPayCoin) + + s.ChangeSceneState(rule.ClawDollSceneStateStart) + //sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) + } + return false +} + +func (this *StateWaitPayCoin) OnEnter(s *base.Scene) { + logger.Logger.Trace("(this *StateWaitPayCoin) OnEnter, sceneid=", s.GetSceneId()) + this.BaseState.OnEnter(s) +} + +func (this *StateWaitPayCoin) OnLeave(s *base.Scene) { + logger.Logger.Trace("(this *StateWaitPayCoin) OnLeave, sceneid=", s.GetSceneId()) + this.BaseState.OnLeave(s) + if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + + sceneEx.PlayerBackup = make(map[int32]*PlayerData) + + if s.CheckNeedDestroy() { + sceneEx.SceneDestroy(true) + } + } +} + +func (this *StateWaitPayCoin) OnTick(s *base.Scene) { + this.BaseState.OnTick(s) + if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollSceneWaitPayCoinimeout { + + // 时间到,重置scene数据 + sceneEx.WaitNextPlayer() + + s.ChangeSceneState(rule.ClawDollSceneStateWait) return } } @@ -645,6 +737,7 @@ func init() { PolicyClawdollSingleton.RegisteSceneState(&StateStart{}) PolicyClawdollSingleton.RegisteSceneState(&PlayGame{}) PolicyClawdollSingleton.RegisteSceneState(&StateBilled{}) + PolicyClawdollSingleton.RegisteSceneState(&StateWaitPayCoin{}) core.RegisteHook(core.HOOK_BEFORE_START, func() error { base.RegisteScenePolicy(common.GameId_Clawdoll, 0, PolicyClawdollSingleton) From 4580f69514e221f64f164ba22d90cd55c8124de5 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Sat, 24 Aug 2024 16:10:28 +0800 Subject: [PATCH 27/56] =?UTF-8?q?=E8=AF=B7=E6=B1=82token=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/action_clawdoll.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index 6cd153c..72a0692 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -130,8 +130,8 @@ func init() { netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSPlayerOpPacketFactory{}) netlib.Register(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{}, MSDollMachineoCoinResultHandler) //客户端请求token - common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSGetTokenHandler{}) - netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSGetTokenPacketFactory{}) + common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_GETTOKEN), &CSGetTokenHandler{}) + netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_GETTOKEN), &CSGetTokenPacketFactory{}) //获取token返回 netlib.Register(int(machine.DollMachinePacketID_PACKET_MSSendToken), &machine.MSSendToken{}, MSSendTokenHandler) } From 377482ce6d47c598dd5b395be0e25a9245efbc68 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Mon, 26 Aug 2024 10:50:03 +0800 Subject: [PATCH 28/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BAlog=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 18 ++++++++---------- machine/machinedoll/machinemgr.go | 12 ++++++------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index f42592d..7f7acd6 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -169,11 +169,11 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid num := int64(1) for { // 读取数据 - fmt.Println("监听抓取结果返回!") + logger.Logger.Trace("监听抓取结果返回!") buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { - fmt.Println("Failed to read response from client:", err) + logger.Logger.Error("Failed to read response from client:", err) return } // 将读取到的数据按照 221 进行分割 @@ -185,7 +185,7 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid for i, part := range parts { if len(part) > 0 { part = part[:len(part)-1] // 去除最后一个字节,该字节为分隔符 - fmt.Println("比较返回结果 part = ", part) + //fmt.Println("比较返回结果 part = ", part) if bytes.Contains(part, instruction) && num != 1 { fmt.Printf("Part %d: %s\n", i+1, part) //回应数据 @@ -200,7 +200,7 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid Result: 0, TypeId: 2, }) - fmt.Println("没有抓到礼品!!!!!!!!snid = ", snid, "num = ", num) + logger.Logger.Trace("没有抓到礼品!!!!!!!!snid = ", snid, "num = ", num) return } if bytes.Contains(part, instruction1) && num != 1 { @@ -208,7 +208,7 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid //回应数据 _, err = conn.Write([]byte{0xAA, 0x04, 0x01, 0x50, 0x09, 0x5c, 0xdd}) if err != nil { - fmt.Println("Failed to read response from server:", err) + logger.Logger.Error("Failed to read response from server:", err) return } session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ @@ -217,14 +217,13 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid Result: 1, TypeId: 2, }) - fmt.Println("抓到礼品了!!!!!!!!snid = ", snid, "num = ", num) + logger.Logger.Trace("抓到礼品了!!!!!!!!snid = ", snid, "num = ", num) return } //上分成功 coinData := []byte{0xAA, 0x04, 0x02, 0x03, 0x01} if bytes.Contains(part, coinData) { //返回消息 - fmt.Println("上分成功!") session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ Snid: snid, Id: id, @@ -236,7 +235,6 @@ func DollMachineGrabResult(session *netlib.Session, conn *machinedoll.Conn, snid coinData = []byte{0xAA, 0x04, 0x02, 0x03, 0x00} if bytes.Contains(part, coinData) { //返回消息 - fmt.Println("上分失败!") session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{ Snid: snid, Id: id, @@ -295,10 +293,10 @@ func SMGetTokenHandler(session *netlib.Session, packetId int, data interface{}) //生成token token, err := token04.GenerateToken04(appId, string(userId), serverSecret, effectiveTimeInSeconds, payload) if err != nil { - fmt.Println(err) + logger.Logger.Error(err) return err } - fmt.Println(token) + logger.Logger.Trace(token) info := &machine.MSSendToken{} info.Snid = msg.Snid info.Token = token diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index 57ad3d2..b385e46 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -46,11 +46,11 @@ func (this *MachineManager) Init() { var serverAddrs []string programDir, err := os.Getwd() if err != nil { - fmt.Println("Error getting working directory:", err) + logger.Logger.Error("Error getting working directory:", err) return } configFile := filepath.Join(programDir, "machineIPConfig.json") - fmt.Println("构建配置文件的路径", configFile) + logger.Logger.Trace("构建配置文件的路径", configFile) fileData, err := os.ReadFile(configFile) if err != nil { logger.Logger.Error("Read robot account file error:", err) @@ -66,7 +66,7 @@ func (this *MachineManager) Init() { for i, addr := range serverAddrs { conn, err := net.DialTimeout("tcp", addr, 5*time.Second) if err != nil { - fmt.Println("Failed to connect to server:", err) + logger.Logger.Error("Failed to connect to server:", err) continue } this.ConnMap[i+1] = &Conn{ @@ -75,7 +75,7 @@ func (this *MachineManager) Init() { Addr: addr, } SetBaseParam(conn) - fmt.Println("设置每台娃娃机基础配置!") + logger.Logger.Trace("设置每台娃娃机基础配置!") } /* fmt.Println("Connected to server:\n", this.ConnMap[1].RemoteAddr()) @@ -98,7 +98,7 @@ func (this *MachineManager) Update() { delConn = append(delConn, v) v.Close() logger.Logger.Tracef("断开连接:%v", v.Addr) - fmt.Println("娃娃机断开连接!!!!!!!!!!!") + logger.Logger.Error("娃娃机断开连接!!!!!!!!!!!") this.UpdateToGameServer(v, 0) } } @@ -118,7 +118,7 @@ func (this *MachineManager) Update() { continue } logger.Logger.Tracef("重连成功:%v", addr) - fmt.Println("娃娃机重连成功!!!!!!!!!!!") + logger.Logger.Trace("娃娃机重连成功!!!!!!!!!!!") delIds = append(delIds, &Conn{ Id: id, Conn: conn, From dcc68130d234d83a99c965e73dde7bee52507bc8 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Mon, 26 Aug 2024 10:53:25 +0800 Subject: [PATCH 29/56] =?UTF-8?q?log=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/machinedoll/machinemgr.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/machine/machinedoll/machinemgr.go b/machine/machinedoll/machinemgr.go index b385e46..3fc997e 100644 --- a/machine/machinedoll/machinemgr.go +++ b/machine/machinedoll/machinemgr.go @@ -98,7 +98,6 @@ func (this *MachineManager) Update() { delConn = append(delConn, v) v.Close() logger.Logger.Tracef("断开连接:%v", v.Addr) - logger.Logger.Error("娃娃机断开连接!!!!!!!!!!!") this.UpdateToGameServer(v, 0) } } @@ -117,8 +116,7 @@ func (this *MachineManager) Update() { if err != nil { continue } - logger.Logger.Tracef("重连成功:%v", addr) - logger.Logger.Trace("娃娃机重连成功!!!!!!!!!!!") + logger.Logger.Tracef("娃娃机重连成功!addr = %v", addr) delIds = append(delIds, &Conn{ Id: id, Conn: conn, From cbd00bf0f863a81b81590dabad7428361f38aba4 Mon Sep 17 00:00:00 2001 From: kxdd Date: Tue, 27 Aug 2024 15:13:32 +0800 Subject: [PATCH 30/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamerule/clawdoll/constants.go | 2 +- gamesrv/clawdoll/player_clawdoll.go | 5 +++ gamesrv/clawdoll/scene_clawdoll.go | 49 +++++++++++++++------ gamesrv/clawdoll/scenepolicy_clawdoll.go | 55 ++++++++++++++++-------- 4 files changed, 79 insertions(+), 32 deletions(-) diff --git a/gamerule/clawdoll/constants.go b/gamerule/clawdoll/constants.go index abcd61a..9bdb60f 100644 --- a/gamerule/clawdoll/constants.go +++ b/gamerule/clawdoll/constants.go @@ -15,7 +15,7 @@ const ( const ( ClawDollSceneWaitTimeout = time.Second * 6 //等待倒计时 ClawDollSceneStartTimeout = time.Second * 5 //开始倒计时 - ClawDollScenePlayTimeout = time.Second * 30 //娃娃机下抓倒计时 + ClawDollScenePlayTimeout = time.Second * 10 //娃娃机下抓倒计时 ClawDollSceneBilledTimeout = time.Second * 2 //结算 ClawDollSceneWaitPayCoinimeout = time.Second * 10 //等待下一局投币 diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index 68887da..ab0ff68 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -53,6 +53,11 @@ func (this *PlayerEx) CanGrab() bool { // 游戏新一局 设置数据 func (this *PlayerEx) ReStartGame() { this.ReDataStartGame() + + this.UnmarkFlag(base.PlayerState_WaitNext) + this.UnmarkFlag(base.PlayerState_GameBreak) + this.MarkFlag(base.PlayerState_Ready) + this.gainCoin = 0 this.taxCoin = 0 this.odds = 0 diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index d794269..b3423f4 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -58,7 +58,7 @@ type SceneEx struct { // 游戏是否能开始 func (this *SceneEx) CanStart() bool { //人数>=1自动开始 - if len(this.players) >= 0 && (this.GetRealPlayerNum() >= 0 || this.IsPreCreateScene()) { + if len(this.players) >= 1 && (this.GetRealPlayerNum() >= 1 || this.IsPreCreateScene() || this.IsHasPlaying()) { return true } return false @@ -67,7 +67,7 @@ func (this *SceneEx) CanStart() bool { // 从房间删除玩家 func (this *SceneEx) delPlayer(p *base.Player) { if p, exist := this.players[p.SnId]; exist { - this.seats[p.GetPos()] = nil + //this.seats[p.GetPos()] = nil delete(this.players, p.SnId) this.RemoveWaitPlayer(p.SnId) } @@ -162,7 +162,6 @@ func NewClawdollSceneData(s *base.Scene) *SceneEx { Scene: s, logic: new(rule.Logic), players: make(map[int32]*PlayerEx), - seats: make([]*PlayerEx, s.GetPlayerNum()), PlayerBackup: make(map[int32]*PlayerData), waitPlayers: list.New(), } @@ -175,9 +174,40 @@ func (this *SceneEx) init() bool { return true } -// 检查上分是否合法 -func (this *SceneEx) CheckPayOp(betVal int64, takeMul int64) bool { //游戏底分 - return true +// 检查上分投币是否合法 +func (this *SceneEx) CheckPayCoinOp(p *PlayerEx) bool { + if p == nil { + return false + } + + if p.SnId == this.playingSnid { + return true + } + return false +} + +// 检查移动是否合法 +func (this *SceneEx) CheckMoveOp(p *PlayerEx) bool { + if p == nil { + return false + } + + if p.SnId == this.playingSnid { + return true + } + return false +} + +// 下抓是否合法 +func (this *SceneEx) CheckGrapOp(p *PlayerEx) bool { + if p == nil { + return false + } + + if p.SnId == this.playingSnid { + return true + } + return false } func (this *SceneEx) Clear() { @@ -191,13 +221,6 @@ func (this *SceneEx) Clear() { p.Clear(0) } } - - for i := 0; i < this.GetPlayerNum(); i++ { - if this.seats[i] != nil { - this.seats[i].Clear(this.GetBaseScore()) - } - } - } // 是否有玩家正在玩 diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 64884fa..419b8ce 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -103,11 +103,12 @@ func (this *PolicyClawdoll) OnPlayerEnter(s *base.Scene, p *base.Player) { playerEx.Clear(baseScore) if sceneEx.playingSnid == 0 { - p.MarkFlag(base.PlayerState_WaitNext) - p.UnmarkFlag(base.PlayerState_Ready) - sceneEx.playingSnid = p.GetSnId() + //sceneEx.playingSnid = p.GetSnId() } + p.MarkFlag(base.PlayerState_WaitNext) + p.UnmarkFlag(base.PlayerState_Ready) + sceneEx.AddWaitPlayer(playerEx) //给自己发送房间信息 @@ -247,6 +248,7 @@ func (this *PolicyClawdoll) CanChangeCoinScene(s *base.Scene, p *base.Player) bo func (this *PolicyClawdoll) SendRoomInfo(s *base.Scene, p *base.Player, sceneEx *SceneEx) { pack := sceneEx.ClawdollCreateRoomInfoPacket(s, p) + p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_ROOMINFO), pack) } @@ -279,14 +281,14 @@ func (this *BaseState) CanChangeTo(s base.SceneState) bool { func (this *BaseState) CanChangeCoinScene(s *base.Scene, p *base.Player) bool { - //playerEx, ok := p.ExtraData.(*PlayerEx) - //if !ok { - // return false - //} - // - //if !playerEx.CanLeaveScene(s.GetSceneState().GetState()) { - // return false - //} + playerEx, ok := p.ExtraData.(*PlayerEx) + if !ok { + return false + } + + if !playerEx.CanLeaveScene(s.GetSceneState().GetState()) { + return false + } return true } @@ -335,17 +337,13 @@ func (this *StateWait) GetTimeout(s *base.Scene) int { func (this *StateWait) OnEnter(s *base.Scene) { this.BaseState.OnEnter(s) - if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + if _, ok := s.ExtraData.(*SceneEx); ok { if s.Gaming { s.NotifySceneRoundPause() } s.Gaming = false ClawdollBroadcastRoomState(s, float32(0)) - - if sceneEx.CanStart() { - s.ChangeSceneState(rule.ClawDollSceneStateStart) - } } } @@ -404,6 +402,7 @@ func (this *StateWait) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, par if sceneEx.CanStart() { s.ChangeSceneState(rule.ClawDollSceneStateStart) + sceneEx.playingSnid = playerEx.SnId } } @@ -425,6 +424,7 @@ func (this *StateStart) GetState() int { func (this *StateStart) CanChangeTo(s base.SceneState) bool { switch s.GetState() { case rule.ClawDollSceneStatePlayGame: + return true case rule.ClawDollSceneStateWait: return true } @@ -526,6 +526,11 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para switch opcode { case rule.ClawDollPlayerOpGo: + + if !sceneEx.CheckGrapOp(playerEx) { + return false + } + if !playerEx.CanGrab() { return false } @@ -537,6 +542,11 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para sceneEx.OnPlayerSMGrabOp(p.SnId, int32(sceneEx.machineId), grapType) case rule.ClawDollPlayerOpMove: + + if !sceneEx.CheckMoveOp(playerEx) { + return false + } + if !playerEx.CanMove() { return false } @@ -581,7 +591,7 @@ func (this *StateBilled) GetState() int { func (this *StateBilled) CanChangeTo(s base.SceneState) bool { switch s.GetState() { - case rule.ClawDollSceneStateStart: + case rule.ClawDollSceneWaitPayCoin: return true } return false @@ -636,6 +646,7 @@ func (this *StateWaitPayCoin) GetState() int { func (this *StateWaitPayCoin) CanChangeTo(s base.SceneState) bool { switch s.GetState() { case rule.ClawDollSceneStateStart: + return true case rule.ClawDollSceneStateWait: return true } @@ -674,6 +685,8 @@ func (this *StateWaitPayCoin) OnPlayerOp(s *base.Scene, p *base.Player, opcode i sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), rule.ButtonPayCoin) + playerEx.ReStartGame() + s.ChangeSceneState(rule.ClawDollSceneStateStart) //sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) } @@ -703,7 +716,13 @@ func (this *StateWaitPayCoin) OnTick(s *base.Scene) { if sceneEx, ok := s.ExtraData.(*SceneEx); ok { if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollSceneWaitPayCoinimeout { - // 时间到,重置scene数据 + // 先设置时间 + playingEx := sceneEx.players[sceneEx.playingSnid] + if playingEx != nil { + playingEx.ReStartGame() + } + + // 后重置scene数据 sceneEx.WaitNextPlayer() s.ChangeSceneState(rule.ClawDollSceneStateWait) From 0792e35863faade01e2287230049bb5948cbceaa Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Tue, 27 Aug 2024 16:03:07 +0800 Subject: [PATCH 31/56] =?UTF-8?q?=E5=BC=80=E5=90=AF=E7=94=A9=E6=8A=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/machinedoll/command.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machine/machinedoll/command.go b/machine/machinedoll/command.go index 26c0031..5ed8a95 100644 --- a/machine/machinedoll/command.go +++ b/machine/machinedoll/command.go @@ -409,7 +409,7 @@ var data = []byte{ 0x06, //25 放线长度占用位 0x00, //26 礼品下放高度 0x00, //27 礼品下放高度占用位 - 0x00, //28 甩抓长度 + 0x14, //28 甩抓长度 0x00, //29 甩抓保护 0x78, //30 甩抓电压 From ebe7b1c4c8d06934ede63baca080bca850e9e891 Mon Sep 17 00:00:00 2001 From: kxdd Date: Wed, 28 Aug 2024 17:00:31 +0800 Subject: [PATCH 32/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamerule/clawdoll/constants.go | 14 +- gamesrv/clawdoll/action_clawdoll.go | 10 +- gamesrv/clawdoll/player_clawdoll.go | 15 +- gamesrv/clawdoll/scene_clawdoll.go | 28 +- gamesrv/clawdoll/scenepolicy_clawdoll.go | 95 +++++-- protocol/clawdoll/clawdoll.pb.go | 336 +++++++++++++---------- protocol/clawdoll/clawdoll.proto | 35 ++- 7 files changed, 326 insertions(+), 207 deletions(-) diff --git a/gamerule/clawdoll/constants.go b/gamerule/clawdoll/constants.go index 9bdb60f..b207785 100644 --- a/gamerule/clawdoll/constants.go +++ b/gamerule/clawdoll/constants.go @@ -12,10 +12,20 @@ const ( ClawDollSceneStateMax ) +// 玩家状态 +const ( + ClawDollPlayerStateWait int32 = iota //等待状态 + ClawDollPlayerStateStart //开始倒计时 + ClawDollPlayerStatePlayGame //游戏中 + ClawDollPlayerStateBilled //结算 + ClawDollPlayerWaitPayCoin //等待下一局投币 + ClawDollPlayerStateMax +) + const ( ClawDollSceneWaitTimeout = time.Second * 6 //等待倒计时 - ClawDollSceneStartTimeout = time.Second * 5 //开始倒计时 - ClawDollScenePlayTimeout = time.Second * 10 //娃娃机下抓倒计时 + ClawDollSceneStartTimeout = time.Second * 1 //开始倒计时 + ClawDollScenePlayTimeout = time.Second * 30 //娃娃机下抓倒计时 ClawDollSceneBilledTimeout = time.Second * 2 //结算 ClawDollSceneWaitPayCoinimeout = time.Second * 10 //等待下一局投币 diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index 72a0692..1971bec 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -121,17 +121,17 @@ func MSSendTokenHandler(session *netlib.Session, packetId int, data interface{}) pack := &clawdoll.SCCLAWDOLLSendToken{ Token: token, } - p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_SENDTOKEN), pack) + p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_SENDTOKEN), pack) } return nil } func init() { - common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSPlayerOpHandler{}) - netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP), &CSPlayerOpPacketFactory{}) + common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_PLAYEROP), &CSPlayerOpHandler{}) + netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_PLAYEROP), &CSPlayerOpPacketFactory{}) netlib.Register(int(machine.DollMachinePacketID_PACKET_MSDollMachineoPerateResult), &machine.MSDollMachineoPerateResult{}, MSDollMachineoCoinResultHandler) //客户端请求token - common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_GETTOKEN), &CSGetTokenHandler{}) - netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_GETTOKEN), &CSGetTokenPacketFactory{}) + common.RegisterHandler(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_GETTOKEN), &CSGetTokenHandler{}) + netlib.RegisterFactory(int(clawdoll.CLAWDOLLPacketID_PACKET_CS_GETTOKEN), &CSGetTokenPacketFactory{}) //获取token返回 netlib.Register(int(machine.DollMachinePacketID_PACKET_MSSendToken), &machine.MSSendToken{}, MSSendTokenHandler) } diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index ab0ff68..18d6283 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -1,6 +1,7 @@ package clawdoll import ( + rule "mongo.games.com/game/gamerule/clawdoll" "mongo.games.com/game/gamesrv/base" "mongo.games.com/goserver/core/logger" ) @@ -8,7 +9,8 @@ import ( type PlayerEx struct { *base.Player //玩家信息 - dollCardsCnt int32 // 娃娃卡数量 + clawDollState int32 // 抓娃娃状态 + dollCardsCnt int32 // 娃娃卡数量 gainCoin int64 // 本局赢的金币 taxCoin int64 // 本局税收 @@ -61,6 +63,7 @@ func (this *PlayerEx) ReStartGame() { this.gainCoin = 0 this.taxCoin = 0 this.odds = 0 + this.clawDollState = rule.ClawDollPlayerStateWait } // 初始化 @@ -88,3 +91,13 @@ func (this *PlayerEx) CanLeaveScene(sceneState int) bool { return true } + +// 获取状态 +func (this *PlayerEx) GetClawState() int32 { + return this.clawDollState +} + +// 设置状态 +func (this *PlayerEx) SetClawState(state int32) { + this.clawDollState = state +} diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index b3423f4..f43ee22 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -80,7 +80,7 @@ func (this *SceneEx) BroadcastPlayerLeave(p *base.Player, reason int) { } proto.SetDefaults(scLeavePack) - this.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PlayerLeave), scLeavePack, p.GetSid()) + this.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PlayerLeave), scLeavePack, p.GetSid()) } // 玩家离开事件 @@ -108,7 +108,7 @@ func (e *SceneEx) playerOpPack(snId int32, opcode int, opRetCode clawdoll.OpResu // OnPlayerSCOp 发送玩家操作情况 func (e *SceneEx) OnPlayerSCOp(p *base.Player, opcode int, opRetCode clawdoll.OpResultCode, params []int64) { pack := e.playerOpPack(p.SnId, opcode, opRetCode, params) - p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PLAYEROP), pack) + p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PLAYEROP), pack) logger.Logger.Tracef("OnPlayerSCOp %s", pack) } @@ -142,7 +142,8 @@ func (this *SceneEx) ClawdollCreateRoomInfoPacket(s *base.Scene, p *base.Player) HeadOutLine: proto.Int32(playerEx.HeadOutLine), VIP: proto.Int32(playerEx.VIP), - WinCoin: proto.Int64(playerEx.gainCoin), + WinCoin: proto.Int64(playerEx.gainCoin), + ClawDollState: proto.Int32(playerEx.clawDollState), } pack.Players = append(pack.Players, pd) @@ -233,7 +234,7 @@ func (this *SceneEx) IsHasPlaying() bool { } // 等待下一个玩家 -func (this *SceneEx) WaitNextPlayer() { +func (this *SceneEx) ReStartGame() { this.playingSnid = 0 } @@ -293,6 +294,25 @@ func (this *SceneEx) RemoveWaitPlayer(SnId int32) bool { return false } +func (this *SceneEx) GetPlayingEx() *PlayerEx { + if this.playingSnid == 0 { + return nil + } + + return this.players[this.playingSnid] +} + +func (this *SceneEx) SetPlayingState(state int32) { + if this.playingSnid == 0 { + return + } + + playerEx := this.players[this.playingSnid] + if playerEx != nil { + playerEx.SetClawState(state) + } +} + // 时间到 系统开始下抓 func (this *SceneEx) TimeOutPlayGrab() bool { diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 419b8ce..ec08dd2 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -109,10 +109,9 @@ func (this *PolicyClawdoll) OnPlayerEnter(s *base.Scene, p *base.Player) { p.MarkFlag(base.PlayerState_WaitNext) p.UnmarkFlag(base.PlayerState_Ready) - sceneEx.AddWaitPlayer(playerEx) - //给自己发送房间信息 this.SendRoomInfo(s, p, sceneEx) + s.FirePlayerEvent(p, base.PlayerEventEnter, nil) } } @@ -249,7 +248,7 @@ func (this *PolicyClawdoll) CanChangeCoinScene(s *base.Scene, p *base.Player) bo func (this *PolicyClawdoll) SendRoomInfo(s *base.Scene, p *base.Player, sceneEx *SceneEx) { pack := sceneEx.ClawdollCreateRoomInfoPacket(s, p) - p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_ROOMINFO), pack) + p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_ROOMINFO), pack) } // 广播房间状态 @@ -258,7 +257,25 @@ func ClawdollBroadcastRoomState(s *base.Scene, params ...float32) { State: proto.Int(s.SceneState.GetState()), Params: params, } - s.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_ROOMSTATE), pack, 0) + s.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_ROOMSTATE), pack, 0) +} + +// 玩家状态信息变化 +func ClawdollSendPlayerInfo(s *base.Scene) { + + if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + playerEx := sceneEx.GetPlayingEx() + if playerEx != nil && playerEx.SnId == sceneEx.playingSnid { + pack := &clawdoll.SCCLAWDOLLPlayerInfo{ + SnId: proto.Int32(playerEx.SnId), + ClawDollState: proto.Int32(playerEx.GetClawState()), + Coin: proto.Int64(playerEx.Coin), + GainCoin: proto.Int64(playerEx.gainCoin), + } + + playerEx.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PLAYERINFO), pack) + } + } } //===================================== @@ -343,7 +360,8 @@ func (this *StateWait) OnEnter(s *base.Scene) { } s.Gaming = false - ClawdollBroadcastRoomState(s, float32(0)) + ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) } } @@ -401,8 +419,14 @@ func (this *StateWait) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, par sceneEx.OnPlayerSMPerateOp(p.SnId, int32(sceneEx.machineId), rule.ButtonPayCoin) if sceneEx.CanStart() { - s.ChangeSceneState(rule.ClawDollSceneStateStart) sceneEx.playingSnid = playerEx.SnId + s.ChangeSceneState(rule.ClawDollSceneStateStart) + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateStart)) + + ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) + + sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) } } @@ -435,6 +459,8 @@ func (this *StateStart) OnEnter(s *base.Scene) { this.BaseState.OnEnter(s) if sceneEx, ok := s.ExtraData.(*SceneEx); ok { ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) + s.Gaming = false sceneEx.GameNowTime = time.Now() sceneEx.NumOfGames++ @@ -446,11 +472,11 @@ func (this *StateStart) OnTick(s *base.Scene) { if sceneEx, ok := s.ExtraData.(*SceneEx); ok { if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollSceneStartTimeout { //切换到等待操作状态 - if sceneEx.CanStart() { - s.ChangeSceneState(rule.ClawDollSceneStatePlayGame) - } else { - s.ChangeSceneState(rule.ClawDollSceneStateWait) - } + s.ChangeSceneState(rule.ClawDollSceneStatePlayGame) + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStatePlayGame)) + + ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) } } } @@ -462,12 +488,8 @@ func (this *StateStart) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, pa func (this *StateStart) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { logger.Logger.Trace("(this *StateStart) OnPlayerEvent, sceneId=", s.GetSceneId(), " player=", p.SnId, " evtcode=", evtcode) this.BaseState.OnPlayerEvent(s, p, evtcode, params) - if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + if _, ok := s.ExtraData.(*SceneEx); ok { switch evtcode { - case base.PlayerEventLeave: - if !sceneEx.CanStart() { - s.ChangeSceneState(rule.ClawDollSceneStateWait) - } case base.PlayerEventEnter: if !p.IsReady() { p.MarkFlag(base.PlayerState_Ready) @@ -503,7 +525,8 @@ func (this *PlayGame) OnEnter(s *base.Scene) { s.Gaming = true - ClawdollBroadcastRoomState(s, float32(0), float32(0)) + ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) } @@ -541,6 +564,10 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para //1-弱力抓 2 -强力抓 sceneEx.OnPlayerSMGrabOp(p.SnId, int32(sceneEx.machineId), grapType) + s.ChangeSceneState(rule.ClawDollSceneStateBilled) + + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateBilled)) + case rule.ClawDollPlayerOpMove: if !sceneEx.CheckMoveOp(playerEx) { @@ -572,6 +599,11 @@ func (this *PlayGame) OnTick(s *base.Scene) { } s.ChangeSceneState(rule.ClawDollSceneStateBilled) + + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateBilled)) + + ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) return } } @@ -625,7 +657,10 @@ func (this *StateBilled) OnTick(s *base.Scene) { if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollSceneBilledTimeout { s.ChangeSceneState(rule.ClawDollSceneWaitPayCoin) + sceneEx.SetPlayingState(int32(rule.ClawDollSceneWaitPayCoin)) + ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) return } } @@ -688,7 +723,12 @@ func (this *StateWaitPayCoin) OnPlayerOp(s *base.Scene, p *base.Player, opcode i playerEx.ReStartGame() s.ChangeSceneState(rule.ClawDollSceneStateStart) - //sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateStart)) + + ClawdollBroadcastRoomState(s) + ClawdollSendPlayerInfo(s) + + sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) } return false } @@ -701,14 +741,6 @@ func (this *StateWaitPayCoin) OnEnter(s *base.Scene) { func (this *StateWaitPayCoin) OnLeave(s *base.Scene) { logger.Logger.Trace("(this *StateWaitPayCoin) OnLeave, sceneid=", s.GetSceneId()) this.BaseState.OnLeave(s) - if sceneEx, ok := s.ExtraData.(*SceneEx); ok { - - sceneEx.PlayerBackup = make(map[int32]*PlayerData) - - if s.CheckNeedDestroy() { - sceneEx.SceneDestroy(true) - } - } } func (this *StateWaitPayCoin) OnTick(s *base.Scene) { @@ -717,15 +749,20 @@ func (this *StateWaitPayCoin) OnTick(s *base.Scene) { if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollSceneWaitPayCoinimeout { // 先设置时间 - playingEx := sceneEx.players[sceneEx.playingSnid] + playingEx := sceneEx.GetPlayingEx() if playingEx != nil { playingEx.ReStartGame() + ClawdollSendPlayerInfo(s) } - // 后重置scene数据 - sceneEx.WaitNextPlayer() + // 再重置scene数据 + sceneEx.ReStartGame() s.ChangeSceneState(rule.ClawDollSceneStateWait) + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateWait)) + + ClawdollBroadcastRoomState(s) + return } } diff --git a/protocol/clawdoll/clawdoll.pb.go b/protocol/clawdoll/clawdoll.pb.go index 30f9f00..cc583f3 100644 --- a/protocol/clawdoll/clawdoll.pb.go +++ b/protocol/clawdoll/clawdoll.pb.go @@ -24,46 +24,52 @@ const ( type CLAWDOLLPacketID int32 const ( - CLAWDOLLPacketID_PACKET_CLAWDOLL_ZERO CLAWDOLLPacketID = 0 //弃用消息号 - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_ROOMINFO CLAWDOLLPacketID = 5601 //房间信息 - CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_PLAYEROP CLAWDOLLPacketID = 5602 //玩家操作(客户->服务) - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PLAYEROP CLAWDOLLPacketID = 5603 //玩家操作(服务->客户) - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_ROOMSTATE CLAWDOLLPacketID = 5604 //房间状态 - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_GAMEBILLED CLAWDOLLPacketID = 5605 //游戏结算 - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PlayerEnter CLAWDOLLPacketID = 5606 // 玩家进入 - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PlayerLeave CLAWDOLLPacketID = 5607 // 玩家离开 - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_PLAYERINFO CLAWDOLLPacketID = 5608 // 玩家状态信息变化 - CLAWDOLLPacketID_PACKET_CS_CLAWDOLL_GETTOKEN CLAWDOLLPacketID = 5609 // 获取token - CLAWDOLLPacketID_PACKET_SC_CLAWDOLL_SENDTOKEN CLAWDOLLPacketID = 5610 // 获取token + CLAWDOLLPacketID_PACKET_ZERO CLAWDOLLPacketID = 0 //弃用消息号 + CLAWDOLLPacketID_PACKET_SC_ROOMINFO CLAWDOLLPacketID = 5601 //房间信息 + CLAWDOLLPacketID_PACKET_CS_PLAYEROP CLAWDOLLPacketID = 5602 //玩家操作(客户->服务) + CLAWDOLLPacketID_PACKET_SC_PLAYEROP CLAWDOLLPacketID = 5603 //玩家操作(服务->客户) + CLAWDOLLPacketID_PACKET_SC_ROOMSTATE CLAWDOLLPacketID = 5604 //房间状态 + CLAWDOLLPacketID_PACKET_SC_GAMEBILLED CLAWDOLLPacketID = 5605 //游戏结算 + CLAWDOLLPacketID_PACKET_SC_PlayerEnter CLAWDOLLPacketID = 5606 // 玩家进入 + CLAWDOLLPacketID_PACKET_SC_PlayerLeave CLAWDOLLPacketID = 5607 // 玩家离开 + CLAWDOLLPacketID_PACKET_SC_PLAYERINFO CLAWDOLLPacketID = 5608 // 玩家状态信息变化 + CLAWDOLLPacketID_PACKET_CS_GETTOKEN CLAWDOLLPacketID = 5609 // 获取token + CLAWDOLLPacketID_PACKET_SC_SENDTOKEN CLAWDOLLPacketID = 5610 // 获取token + CLAWDOLLPacketID_PACKET_CS_WAITPLAYERS CLAWDOLLPacketID = 5611 // 获取等待玩家信息 (客户->服务) + CLAWDOLLPacketID_PACKET_SC_WAITPLAYERS CLAWDOLLPacketID = 5612 // 获取等待玩家信息 (服务->客户) ) // Enum value maps for CLAWDOLLPacketID. var ( CLAWDOLLPacketID_name = map[int32]string{ - 0: "PACKET_CLAWDOLL_ZERO", - 5601: "PACKET_SC_CLAWDOLL_ROOMINFO", - 5602: "PACKET_CS_CLAWDOLL_PLAYEROP", - 5603: "PACKET_SC_CLAWDOLL_PLAYEROP", - 5604: "PACKET_SC_CLAWDOLL_ROOMSTATE", - 5605: "PACKET_SC_CLAWDOLL_GAMEBILLED", - 5606: "PACKET_SC_CLAWDOLL_PlayerEnter", - 5607: "PACKET_SC_CLAWDOLL_PlayerLeave", - 5608: "PACKET_SC_CLAWDOLL_PLAYERINFO", - 5609: "PACKET_CS_CLAWDOLL_GETTOKEN", - 5610: "PACKET_SC_CLAWDOLL_SENDTOKEN", + 0: "PACKET_ZERO", + 5601: "PACKET_SC_ROOMINFO", + 5602: "PACKET_CS_PLAYEROP", + 5603: "PACKET_SC_PLAYEROP", + 5604: "PACKET_SC_ROOMSTATE", + 5605: "PACKET_SC_GAMEBILLED", + 5606: "PACKET_SC_PlayerEnter", + 5607: "PACKET_SC_PlayerLeave", + 5608: "PACKET_SC_PLAYERINFO", + 5609: "PACKET_CS_GETTOKEN", + 5610: "PACKET_SC_SENDTOKEN", + 5611: "PACKET_CS_WAITPLAYERS", + 5612: "PACKET_SC_WAITPLAYERS", } CLAWDOLLPacketID_value = map[string]int32{ - "PACKET_CLAWDOLL_ZERO": 0, - "PACKET_SC_CLAWDOLL_ROOMINFO": 5601, - "PACKET_CS_CLAWDOLL_PLAYEROP": 5602, - "PACKET_SC_CLAWDOLL_PLAYEROP": 5603, - "PACKET_SC_CLAWDOLL_ROOMSTATE": 5604, - "PACKET_SC_CLAWDOLL_GAMEBILLED": 5605, - "PACKET_SC_CLAWDOLL_PlayerEnter": 5606, - "PACKET_SC_CLAWDOLL_PlayerLeave": 5607, - "PACKET_SC_CLAWDOLL_PLAYERINFO": 5608, - "PACKET_CS_CLAWDOLL_GETTOKEN": 5609, - "PACKET_SC_CLAWDOLL_SENDTOKEN": 5610, + "PACKET_ZERO": 0, + "PACKET_SC_ROOMINFO": 5601, + "PACKET_CS_PLAYEROP": 5602, + "PACKET_SC_PLAYEROP": 5603, + "PACKET_SC_ROOMSTATE": 5604, + "PACKET_SC_GAMEBILLED": 5605, + "PACKET_SC_PlayerEnter": 5606, + "PACKET_SC_PlayerLeave": 5607, + "PACKET_SC_PLAYERINFO": 5608, + "PACKET_CS_GETTOKEN": 5609, + "PACKET_SC_SENDTOKEN": 5610, + "PACKET_CS_WAITPLAYERS": 5611, + "PACKET_SC_WAITPLAYERS": 5612, } ) @@ -152,15 +158,16 @@ type CLAWDOLLPlayerData struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` //名字 - SnId int32 `protobuf:"varint,2,opt,name=SnId,proto3" json:"SnId,omitempty"` //账号 - Head int32 `protobuf:"varint,3,opt,name=Head,proto3" json:"Head,omitempty"` //头像 - Sex int32 `protobuf:"varint,4,opt,name=Sex,proto3" json:"Sex,omitempty"` //性别 - Coin int64 `protobuf:"varint,5,opt,name=Coin,proto3" json:"Coin,omitempty"` //金币 - HeadOutLine int32 `protobuf:"varint,6,opt,name=HeadOutLine,proto3" json:"HeadOutLine,omitempty"` //头像框 - VIP int32 `protobuf:"varint,7,opt,name=VIP,proto3" json:"VIP,omitempty"` - Flag int32 `protobuf:"varint,8,opt,name=Flag,proto3" json:"Flag,omitempty"` //二进制标记 第一位:是否掉线(0:在线 1:掉线) 第二位:是否准备(0:未准备 1:已准备) - WinCoin int64 `protobuf:"varint,9,opt,name=WinCoin,proto3" json:"WinCoin,omitempty"` // 本局赢分 + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` //名字 + SnId int32 `protobuf:"varint,2,opt,name=SnId,proto3" json:"SnId,omitempty"` //账号 + Head int32 `protobuf:"varint,3,opt,name=Head,proto3" json:"Head,omitempty"` //头像 + Sex int32 `protobuf:"varint,4,opt,name=Sex,proto3" json:"Sex,omitempty"` //性别 + Coin int64 `protobuf:"varint,5,opt,name=Coin,proto3" json:"Coin,omitempty"` //金币 + HeadOutLine int32 `protobuf:"varint,6,opt,name=HeadOutLine,proto3" json:"HeadOutLine,omitempty"` //头像框 + VIP int32 `protobuf:"varint,7,opt,name=VIP,proto3" json:"VIP,omitempty"` + Flag int32 `protobuf:"varint,8,opt,name=Flag,proto3" json:"Flag,omitempty"` //二进制标记 第一位:是否掉线(0:在线 1:掉线) 第二位:是否准备(0:未准备 1:已准备) + WinCoin int64 `protobuf:"varint,9,opt,name=WinCoin,proto3" json:"WinCoin,omitempty"` // 本局赢分 + ClawDollState int32 `protobuf:"varint,10,opt,name=clawDollState,proto3" json:"clawDollState,omitempty"` // 玩家状态 } func (x *CLAWDOLLPlayerData) Reset() { @@ -258,6 +265,13 @@ func (x *CLAWDOLLPlayerData) GetWinCoin() int64 { return 0 } +func (x *CLAWDOLLPlayerData) GetClawDollState() int32 { + if x != nil { + return x.ClawDollState + } + return 0 +} + //房间信息 type SCCLAWDOLLRoomInfo struct { state protoimpl.MessageState @@ -656,9 +670,11 @@ type SCCLAWDOLLPlayerInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SnId int32 `protobuf:"varint,1,opt,name=SnId,proto3" json:"SnId,omitempty"` //玩家ID - GainCoin int64 `protobuf:"varint,2,opt,name=gainCoin,proto3" json:"gainCoin,omitempty"` //本局赢取 - Coin int64 `protobuf:"varint,3,opt,name=Coin,proto3" json:"Coin,omitempty"` // 玩家 + SnId int32 `protobuf:"varint,1,opt,name=SnId,proto3" json:"SnId,omitempty"` // 玩家ID + ClawDollState int32 `protobuf:"varint,2,opt,name=clawDollState,proto3" json:"clawDollState,omitempty"` // 玩家状态 + GainCoin int64 `protobuf:"varint,3,opt,name=gainCoin,proto3" json:"gainCoin,omitempty"` // 本局赢取 + Coin int64 `protobuf:"varint,4,opt,name=Coin,proto3" json:"Coin,omitempty"` // 玩家 + Params []int64 `protobuf:"varint,5,rep,packed,name=Params,proto3" json:"Params,omitempty"` //操作参数 } func (x *SCCLAWDOLLPlayerInfo) Reset() { @@ -700,6 +716,13 @@ func (x *SCCLAWDOLLPlayerInfo) GetSnId() int32 { return 0 } +func (x *SCCLAWDOLLPlayerInfo) GetClawDollState() int32 { + if x != nil { + return x.ClawDollState + } + return 0 +} + func (x *SCCLAWDOLLPlayerInfo) GetGainCoin() int64 { if x != nil { return x.GainCoin @@ -714,6 +737,13 @@ func (x *SCCLAWDOLLPlayerInfo) GetCoin() int64 { return 0 } +func (x *SCCLAWDOLLPlayerInfo) GetParams() []int64 { + if x != nil { + return x.Params + } + return nil +} + //玩家进入 //PACKET_SCCLAWDOLLPlayerEnter type SCCLAWDOLLPlayerEnter struct { @@ -919,7 +949,7 @@ var File_clawdoll_proto protoreflect.FileDescriptor var file_clawdoll_proto_rawDesc = []byte{ 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x08, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x22, 0xd8, 0x01, 0x0a, 0x12, 0x43, + 0x12, 0x08, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x22, 0xfe, 0x01, 0x0a, 0x12, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, @@ -933,111 +963,115 @@ var file_clawdoll_proto_rawDesc = []byte{ 0x28, 0x05, 0x52, 0x03, 0x56, 0x49, 0x50, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x57, 0x69, - 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x22, 0xf6, 0x02, 0x0a, 0x12, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, - 0x44, 0x4f, 0x4c, 0x4c, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, - 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x52, 0x6f, - 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x75, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x75, 0x74, - 0x12, 0x36, 0x0a, 0x07, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x2e, 0x43, 0x4c, 0x41, - 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x07, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x6f, - 0x75, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x52, 0x6f, 0x75, - 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x78, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x05, 0x52, 0x08, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x78, - 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x65, 0x65, 0x49, 0x64, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x65, 0x65, 0x49, 0x64, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x42, 0x61, 0x73, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x3e, - 0x0a, 0x0c, 0x43, 0x53, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x4f, 0x70, 0x12, 0x16, - 0x0a, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x88, - 0x01, 0x0a, 0x0c, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x4f, 0x70, 0x12, - 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, - 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x4f, 0x70, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, - 0x6c, 0x2e, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x09, - 0x4f, 0x70, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x19, 0x53, 0x43, - 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x47, 0x61, 0x6d, - 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x6e, 0x64, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x43, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x77, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x41, 0x77, 0x61, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x22, 0x43, 0x0a, 0x13, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x52, - 0x6f, 0x6f, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x02, 0x52, 0x06, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x5a, 0x0a, 0x14, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, - 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x67, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x43, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x43, 0x6f, - 0x69, 0x6e, 0x22, 0x49, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, - 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x61, 0x77, - 0x64, 0x6f, 0x6c, 0x6c, 0x2e, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x29, 0x0a, - 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x6f, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, 0x12, 0x43, 0x53, 0x43, 0x4c, - 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, - 0x70, 0x70, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x2b, 0x0a, 0x13, 0x53, 0x43, 0x43, 0x4c, - 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0x8c, 0x03, 0x0a, 0x10, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, - 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x5a, 0x45, - 0x52, 0x4f, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x49, - 0x4e, 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, - 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, - 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, - 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, 0x2b, 0x12, 0x22, 0x0a, - 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, - 0x4f, 0x4c, 0x4c, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, - 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, - 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x22, 0x0a, 0x1d, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, - 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe8, 0x2b, 0x12, - 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, - 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x47, 0x45, 0x54, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, - 0x2b, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, - 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, 0x4b, 0x45, - 0x4e, 0x10, 0xea, 0x2b, 0x2a, 0x64, 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, - 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, - 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, - 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, - 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, - 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x61, 0x77, 0x44, 0x6f, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x6c, + 0x61, 0x77, 0x44, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xf6, 0x02, 0x0a, 0x12, + 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x61, + 0x6d, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x47, 0x61, 0x6d, 0x65, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x54, + 0x69, 0x6d, 0x65, 0x4f, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, + 0x6c, 0x6c, 0x2e, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x20, + 0x0a, 0x0b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x45, 0x78, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x05, 0x52, 0x08, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x45, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, + 0x65, 0x65, 0x49, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x47, 0x61, 0x6d, 0x65, + 0x46, 0x72, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x65, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x42, 0x61, 0x73, 0x65, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x22, 0x3e, 0x0a, 0x0c, 0x43, 0x53, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, + 0x4c, 0x4c, 0x4f, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, + 0x4f, 0x4c, 0x4c, 0x4f, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x03, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x4f, 0x70, 0x52, + 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, + 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x2e, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x43, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x4f, 0x70, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, + 0x85, 0x01, 0x0a, 0x19, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x52, 0x6f, + 0x75, 0x6e, 0x64, 0x47, 0x61, 0x6d, 0x65, 0x42, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x43, 0x6c, 0x6f, + 0x77, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x77, 0x61, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x77, 0x61, 0x72, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x43, 0x0a, 0x13, 0x53, 0x43, 0x43, 0x4c, 0x41, + 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x02, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x98, 0x01, 0x0a, + 0x14, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x61, + 0x77, 0x44, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x63, 0x6c, 0x61, 0x77, 0x44, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x67, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x43, + 0x6f, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x43, 0x6f, 0x69, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, + 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x49, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, + 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, + 0x12, 0x30, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x2e, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, + 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x29, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x50, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, + 0x12, 0x43, 0x53, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x47, 0x65, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x2b, 0x0a, + 0x13, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0xe1, 0x02, 0x0a, 0x10, 0x43, + 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, + 0x0f, 0x0a, 0x0b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, + 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, + 0x4f, 0x4d, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, + 0xe2, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, + 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x18, 0x0a, 0x13, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x10, 0xe4, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x53, 0x43, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, 0x2b, + 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x1a, 0x0a, 0x15, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, + 0x10, 0xe8, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, + 0x5f, 0x47, 0x45, 0x54, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, 0x2b, 0x12, 0x18, 0x0a, 0x13, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, + 0x4b, 0x45, 0x4e, 0x10, 0xea, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, + 0xeb, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, + 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, 0xec, 0x2b, 0x2a, 0x64, + 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, + 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, + 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, + 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, + 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, + 0x5f, 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, + 0x6e, 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, + 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protocol/clawdoll/clawdoll.proto b/protocol/clawdoll/clawdoll.proto index a2d08c4..527b635 100644 --- a/protocol/clawdoll/clawdoll.proto +++ b/protocol/clawdoll/clawdoll.proto @@ -4,17 +4,19 @@ option go_package = "mongo.games.com/game/protocol/clawdoll"; //娃娃机 enum CLAWDOLLPacketID { - PACKET_CLAWDOLL_ZERO = 0; //弃用消息号 - PACKET_SC_CLAWDOLL_ROOMINFO = 5601; //房间信息 - PACKET_CS_CLAWDOLL_PLAYEROP = 5602; //玩家操作(客户->服务) - PACKET_SC_CLAWDOLL_PLAYEROP = 5603; //玩家操作(服务->客户) - PACKET_SC_CLAWDOLL_ROOMSTATE = 5604; //房间状态 - PACKET_SC_CLAWDOLL_GAMEBILLED = 5605; //游戏结算 - PACKET_SC_CLAWDOLL_PlayerEnter = 5606; // 玩家进入 - PACKET_SC_CLAWDOLL_PlayerLeave = 5607; // 玩家离开 - PACKET_SC_CLAWDOLL_PLAYERINFO = 5608; // 玩家状态信息变化 - PACKET_CS_CLAWDOLL_GETTOKEN = 5609; // 获取token - PACKET_SC_CLAWDOLL_SENDTOKEN = 5610; // 获取token + PACKET_ZERO = 0; //弃用消息号 + PACKET_SC_ROOMINFO = 5601; //房间信息 + PACKET_CS_PLAYEROP = 5602; //玩家操作(客户->服务) + PACKET_SC_PLAYEROP = 5603; //玩家操作(服务->客户) + PACKET_SC_ROOMSTATE = 5604; //房间状态 + PACKET_SC_GAMEBILLED = 5605; //游戏结算 + PACKET_SC_PlayerEnter = 5606; // 玩家进入 + PACKET_SC_PlayerLeave = 5607; // 玩家离开 + PACKET_SC_PLAYERINFO = 5608; // 玩家状态信息变化 + PACKET_CS_GETTOKEN = 5609; // 获取token + PACKET_SC_SENDTOKEN = 5610; // 获取token + PACKET_CS_WAITPLAYERS = 5611; // 获取等待玩家信息 (客户->服务) + PACKET_SC_WAITPLAYERS = 5612; // 获取等待玩家信息 (服务->客户) } //操作结果 @@ -36,7 +38,7 @@ message CLAWDOLLPlayerData { int32 Flag = 8; //二进制标记 第一位:是否掉线(0:在线 1:掉线) 第二位:是否准备(0:未准备 1:已准备) int64 WinCoin = 9; // 本局赢分 - + int32 clawDollState = 10; // 玩家状态 } //房间信息 @@ -88,9 +90,12 @@ message SCCLAWDOLLRoomState { //玩家信息 message SCCLAWDOLLPlayerInfo { - int32 SnId = 1; //玩家ID - int64 gainCoin = 2; //本局赢取 - int64 Coin = 3; // 玩家 + int32 SnId = 1; // 玩家ID + int32 clawDollState = 2; // 玩家状态 + int64 gainCoin = 3; // 本局赢取 + int64 Coin = 4; // 玩家 + + repeated int64 Params = 5; //操作参数 } From 46c68b978545c6b12081b0f04265e20e1aed119b Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 29 Aug 2024 11:32:55 +0800 Subject: [PATCH 33/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BAetcd=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etcd/keyconf.go | 2 + gamesrv/base/etcd.go | 4 + gamesrv/base/scene.go | 9 ++ gamesrv/clawdoll/action_clawdoll.go | 7 +- model/config.go | 2 + protocol/clawdoll/clawdoll.pb.go | 90 +++++------ protocol/clawdoll/clawdoll.proto | 1 - protocol/webapi/common.pb.go | 230 +++++++++++++++++++++++----- protocol/webapi/common.proto | 12 ++ protocol/webapi/webapi.proto | 1 + 10 files changed, 270 insertions(+), 88 deletions(-) diff --git a/etcd/keyconf.go b/etcd/keyconf.go index 8482f5d..938e012 100644 --- a/etcd/keyconf.go +++ b/etcd/keyconf.go @@ -39,4 +39,6 @@ const ( ETCDKEY_RANK_TYPE = "/game/RankType" // 排行榜奖励配置 ETCDKEY_AWARD_CONFIG = "/game/awardlog_config" //获奖记录 ETCDKEY_GUIDE = "/game/guide_config" //新手引导配置 + ETCDKEY_MACHINE = "/game/machine_config" //娃娃机配置 + ) diff --git a/gamesrv/base/etcd.go b/gamesrv/base/etcd.go index bce9a3e..5452a21 100644 --- a/gamesrv/base/etcd.go +++ b/gamesrv/base/etcd.go @@ -24,6 +24,8 @@ func init() { etcd.Register(etcd.ETCDKEY_ChannelSwitch, webapi.ChannelSwitchConfig{}, platformConfigEtcd) // 皮肤配置 etcd.Register(etcd.ETCDKEY_SKin, webapi.SkinConfig{}, platformConfigEtcd) + // 娃娃机配置 + etcd.Register(etcd.ETCDKEY_MACHINE, webapi.MachineConfig{}, platformConfigEtcd) } func platformConfigEtcd(ctx context.Context, completeKey string, isInit bool, event *clientv3.Event, data interface{}) { @@ -41,6 +43,8 @@ func platformConfigEtcd(ctx context.Context, completeKey string, isInit bool, ev ConfigMgrInst.GetConfig(d.Platform).ChannelSwitch[d.GetTp()] = d case *webapi.SkinConfig: ConfigMgrInst.GetConfig(d.Platform).SkinConfig = d + case *webapi.MachineConfig: + ConfigMgrInst.GetConfig(d.Platform).MachineConfig = d default: logger.Logger.Errorf("etcd completeKey:%s, Not processed", completeKey) } diff --git a/gamesrv/base/scene.go b/gamesrv/base/scene.go index f638b54..5ab27bc 100644 --- a/gamesrv/base/scene.go +++ b/gamesrv/base/scene.go @@ -2755,3 +2755,12 @@ func (this *Scene) TryRelease() { this.Destroy(true) } } +func (this *Scene) GetMachineServerSecret(Appid int64, platform string) string { + config := ConfigMgrInst.GetConfig(platform).MachineConfig + for _, info := range config.Info { + if info.AppId == Appid { + return info.ServerSecret + } + } + return "" +} diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index 72a0692..8c35ebe 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -93,7 +93,6 @@ func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interf pack := &machine.SMGetToken{} pack.Snid = p.SnId pack.AppId = msg.Appid - pack.ServerSecret = msg.ServerSecret scene := p.GetScene() if scene == nil { return nil @@ -102,6 +101,12 @@ func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interf if !ok { return nil } + serverSecret := sceneEx.GetMachineServerSecret(msg.Appid, p.Platform) + logger.Logger.Tracef("获取娃娃机serverSecret = %v", serverSecret) + if serverSecret == "" { + return nil + } + pack.ServerSecret = serverSecret sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMGetToken), pack) } return nil diff --git a/model/config.go b/model/config.go index ce926e0..661d4f6 100644 --- a/model/config.go +++ b/model/config.go @@ -135,6 +135,8 @@ type AllConfig struct { *webapi.AwardLogConfig // 新手引导配置 *webapi.GuideConfig + //娃娃机配置 + *webapi.MachineConfig } type GlobalConfig struct { diff --git a/protocol/clawdoll/clawdoll.pb.go b/protocol/clawdoll/clawdoll.pb.go index 30f9f00..ce78bf4 100644 --- a/protocol/clawdoll/clawdoll.pb.go +++ b/protocol/clawdoll/clawdoll.pb.go @@ -818,8 +818,7 @@ type CSCLAWDOLLGetToken struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Appid int64 `protobuf:"varint,1,opt,name=Appid,proto3" json:"Appid,omitempty"` - ServerSecret string `protobuf:"bytes,2,opt,name=serverSecret,proto3" json:"serverSecret,omitempty"` + Appid int64 `protobuf:"varint,1,opt,name=Appid,proto3" json:"Appid,omitempty"` } func (x *CSCLAWDOLLGetToken) Reset() { @@ -861,13 +860,6 @@ func (x *CSCLAWDOLLGetToken) GetAppid() int64 { return 0 } -func (x *CSCLAWDOLLGetToken) GetServerSecret() string { - if x != nil { - return x.ServerSecret - } - return "" -} - type SCCLAWDOLLSendToken struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -995,49 +987,47 @@ var file_clawdoll_proto_rawDesc = []byte{ 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x29, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x6f, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, 0x12, 0x43, 0x53, 0x43, 0x4c, + 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x43, 0x53, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, - 0x70, 0x70, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x2b, 0x0a, 0x13, 0x53, 0x43, 0x43, 0x4c, - 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0x8c, 0x03, 0x0a, 0x10, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, - 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x5a, 0x45, - 0x52, 0x4f, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x49, - 0x4e, 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, - 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, - 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, - 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, 0x2b, 0x12, 0x22, 0x0a, - 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, - 0x4f, 0x4c, 0x4c, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, - 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, - 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, - 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x22, 0x0a, 0x1d, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, - 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe8, 0x2b, 0x12, - 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, - 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x47, 0x45, 0x54, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, - 0x2b, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, - 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, 0x4b, 0x45, - 0x4e, 0x10, 0xea, 0x2b, 0x2a, 0x64, 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, - 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, - 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, - 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, - 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, - 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x70, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x13, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, + 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x2a, 0x8c, 0x03, 0x0a, 0x10, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, + 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, + 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x49, 0x4e, 0x46, 0x4f, 0x10, + 0xe1, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, + 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, + 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, + 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x52, 0x4f, 0x4f, + 0x4d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, 0x2b, 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, + 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, 0x2b, 0x12, 0x23, 0x0a, + 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, + 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x10, + 0xe6, 0x2b, 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, + 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, + 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, + 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe8, 0x2b, 0x12, 0x20, 0x0a, 0x1b, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, + 0x4c, 0x5f, 0x47, 0x45, 0x54, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, 0x2b, 0x12, 0x21, 0x0a, + 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x41, 0x57, 0x44, + 0x4f, 0x4c, 0x4c, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xea, 0x2b, + 0x2a, 0x64, 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x4e, + 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x50, + 0x52, 0x43, 0x5f, 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x50, 0x6c, 0x61, + 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, + 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protocol/clawdoll/clawdoll.proto b/protocol/clawdoll/clawdoll.proto index a2d08c4..b2522bb 100644 --- a/protocol/clawdoll/clawdoll.proto +++ b/protocol/clawdoll/clawdoll.proto @@ -108,7 +108,6 @@ message SCCLAWDOLLPlayerLeave { //玩家请求进入视频地址token message CSCLAWDOLLGetToken { int64 Appid = 1; - string serverSecret = 2; } message SCCLAWDOLLSendToken { diff --git a/protocol/webapi/common.pb.go b/protocol/webapi/common.pb.go index 37d0471..db47b49 100644 --- a/protocol/webapi/common.pb.go +++ b/protocol/webapi/common.pb.go @@ -8137,6 +8137,126 @@ func (x *GuideConfig) GetSkip() int32 { return 0 } +//娃娃机配置视频 +// etcd /game/machine_config +type MachineConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Platform string `protobuf:"bytes,1,opt,name=Platform,proto3" json:"Platform,omitempty"` // 平台 + Info []*MachineInfo `protobuf:"bytes,2,rep,name=Info,proto3" json:"Info,omitempty"` +} + +func (x *MachineConfig) Reset() { + *x = MachineConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_common_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineConfig) ProtoMessage() {} + +func (x *MachineConfig) ProtoReflect() protoreflect.Message { + mi := &file_common_proto_msgTypes[86] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineConfig.ProtoReflect.Descriptor instead. +func (*MachineConfig) Descriptor() ([]byte, []int) { + return file_common_proto_rawDescGZIP(), []int{86} +} + +func (x *MachineConfig) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +func (x *MachineConfig) GetInfo() []*MachineInfo { + if x != nil { + return x.Info + } + return nil +} + +type MachineInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MachineId int32 `protobuf:"varint,1,opt,name=MachineId,proto3" json:"MachineId,omitempty"` //娃娃机Id + AppId int64 `protobuf:"varint,2,opt,name=AppId,proto3" json:"AppId,omitempty"` + ServerSecret string `protobuf:"bytes,3,opt,name=ServerSecret,proto3" json:"ServerSecret,omitempty"` +} + +func (x *MachineInfo) Reset() { + *x = MachineInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_common_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineInfo) ProtoMessage() {} + +func (x *MachineInfo) ProtoReflect() protoreflect.Message { + mi := &file_common_proto_msgTypes[87] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineInfo.ProtoReflect.Descriptor instead. +func (*MachineInfo) Descriptor() ([]byte, []int) { + return file_common_proto_rawDescGZIP(), []int{87} +} + +func (x *MachineInfo) GetMachineId() int32 { + if x != nil { + return x.MachineId + } + return 0 +} + +func (x *MachineInfo) GetAppId() int64 { + if x != nil { + return x.AppId + } + return 0 +} + +func (x *MachineInfo) GetServerSecret() string { + if x != nil { + return x.ServerSecret + } + return "" +} + var File_common_proto protoreflect.FileDescriptor var file_common_proto_rawDesc = []byte{ @@ -9421,10 +9541,21 @@ var file_common_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x4f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, - 0x6b, 0x69, 0x70, 0x42, 0x26, 0x5a, 0x24, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, - 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x6b, 0x69, 0x70, 0x22, 0x54, 0x0a, 0x0d, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x12, 0x27, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x65, 0x0a, 0x0b, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x42, 0x26, 0x5a, 0x24, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2f, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9439,7 +9570,7 @@ func file_common_proto_rawDescGZIP() []byte { return file_common_proto_rawDescData } -var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 96) +var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 98) var file_common_proto_goTypes = []interface{}{ (*MysqlDbSetting)(nil), // 0: webapi.MysqlDbSetting (*MongoDbSetting)(nil), // 1: webapi.MongoDbSetting @@ -9527,32 +9658,34 @@ var file_common_proto_goTypes = []interface{}{ (*AwardLogInfo)(nil), // 83: webapi.AwardLogInfo (*AnnouncerLogInfo)(nil), // 84: webapi.AnnouncerLogInfo (*GuideConfig)(nil), // 85: webapi.GuideConfig - nil, // 86: webapi.Platform.BindTelRewardEntry - nil, // 87: webapi.PlayerData.RankScoreEntry - nil, // 88: webapi.ItemShop.AwardEntry - nil, // 89: webapi.VIPcfg.AwardEntry - nil, // 90: webapi.VIPcfg.Privilege1Entry - nil, // 91: webapi.VIPcfg.Privilege7Entry - nil, // 92: webapi.VIPcfg.Privilege9Entry - nil, // 93: webapi.ActInviteConfig.PayScoreEntry - nil, // 94: webapi.SkinLevel.UpItemEntry - nil, // 95: webapi.SkinItem.UnlockParamEntry - (*server.DB_GameFree)(nil), // 96: server.DB_GameFree - (*server.DB_GameItem)(nil), // 97: server.DB_GameItem + (*MachineConfig)(nil), // 86: webapi.MachineConfig + (*MachineInfo)(nil), // 87: webapi.MachineInfo + nil, // 88: webapi.Platform.BindTelRewardEntry + nil, // 89: webapi.PlayerData.RankScoreEntry + nil, // 90: webapi.ItemShop.AwardEntry + nil, // 91: webapi.VIPcfg.AwardEntry + nil, // 92: webapi.VIPcfg.Privilege1Entry + nil, // 93: webapi.VIPcfg.Privilege7Entry + nil, // 94: webapi.VIPcfg.Privilege9Entry + nil, // 95: webapi.ActInviteConfig.PayScoreEntry + nil, // 96: webapi.SkinLevel.UpItemEntry + nil, // 97: webapi.SkinItem.UnlockParamEntry + (*server.DB_GameFree)(nil), // 98: server.DB_GameFree + (*server.DB_GameItem)(nil), // 99: server.DB_GameItem } var file_common_proto_depIdxs = []int32{ 2, // 0: webapi.Platform.Leaderboard:type_name -> webapi.RankSwitch 3, // 1: webapi.Platform.ClubConfig:type_name -> webapi.ClubConfig 4, // 2: webapi.Platform.ThirdGameMerchant:type_name -> webapi.ThirdGame - 86, // 3: webapi.Platform.BindTelReward:type_name -> webapi.Platform.BindTelRewardEntry + 88, // 3: webapi.Platform.BindTelReward:type_name -> webapi.Platform.BindTelRewardEntry 6, // 4: webapi.GameConfigGlobal.GameStatus:type_name -> webapi.GameStatus - 96, // 5: webapi.GameFree.DbGameFree:type_name -> server.DB_GameFree + 98, // 5: webapi.GameFree.DbGameFree:type_name -> server.DB_GameFree 8, // 6: webapi.PlatformGameConfig.DbGameFrees:type_name -> webapi.GameFree 0, // 7: webapi.PlatformDbConfig.Mysql:type_name -> webapi.MysqlDbSetting 1, // 8: webapi.PlatformDbConfig.MongoDb:type_name -> webapi.MongoDbSetting 1, // 9: webapi.PlatformDbConfig.MongoDbLog:type_name -> webapi.MongoDbSetting - 96, // 10: webapi.GameConfigGroup.DbGameFree:type_name -> server.DB_GameFree - 87, // 11: webapi.PlayerData.RankScore:type_name -> webapi.PlayerData.RankScoreEntry + 98, // 10: webapi.GameConfigGroup.DbGameFree:type_name -> server.DB_GameFree + 89, // 11: webapi.PlayerData.RankScore:type_name -> webapi.PlayerData.RankScoreEntry 32, // 12: webapi.PlayerData.Items:type_name -> webapi.ItemInfo 14, // 13: webapi.PlayerData.RoleUnlockList:type_name -> webapi.ModInfo 14, // 14: webapi.PlayerData.PetUnlockList:type_name -> webapi.ModInfo @@ -9565,7 +9698,7 @@ var file_common_proto_depIdxs = []int32{ 32, // 21: webapi.ExchangeShop.Items:type_name -> webapi.ItemInfo 25, // 22: webapi.ExchangeShopList.List:type_name -> webapi.ExchangeShop 29, // 23: webapi.ExchangeShopList.Weight:type_name -> webapi.ShopWeight - 88, // 24: webapi.ItemShop.Award:type_name -> webapi.ItemShop.AwardEntry + 90, // 24: webapi.ItemShop.Award:type_name -> webapi.ItemShop.AwardEntry 30, // 25: webapi.ItemShopList.List:type_name -> webapi.ItemShop 32, // 26: webapi.MatchInfoAward.ItemId:type_name -> webapi.ItemInfo 33, // 27: webapi.GameMatchDate.Award:type_name -> webapi.MatchInfoAward @@ -9586,14 +9719,14 @@ var file_common_proto_depIdxs = []int32{ 38, // 42: webapi.WelfareSpree.Item:type_name -> webapi.WelfareDate 48, // 43: webapi.WelfareFirstPayDataList.List:type_name -> webapi.WelfareSpree 48, // 44: webapi.WelfareContinuousPayDataList.List:type_name -> webapi.WelfareSpree - 89, // 45: webapi.VIPcfg.Award:type_name -> webapi.VIPcfg.AwardEntry - 90, // 46: webapi.VIPcfg.Privilege1:type_name -> webapi.VIPcfg.Privilege1Entry - 91, // 47: webapi.VIPcfg.Privilege7:type_name -> webapi.VIPcfg.Privilege7Entry - 92, // 48: webapi.VIPcfg.Privilege9:type_name -> webapi.VIPcfg.Privilege9Entry + 91, // 45: webapi.VIPcfg.Award:type_name -> webapi.VIPcfg.AwardEntry + 92, // 46: webapi.VIPcfg.Privilege1:type_name -> webapi.VIPcfg.Privilege1Entry + 93, // 47: webapi.VIPcfg.Privilege7:type_name -> webapi.VIPcfg.Privilege7Entry + 94, // 48: webapi.VIPcfg.Privilege9:type_name -> webapi.VIPcfg.Privilege9Entry 51, // 49: webapi.VIPcfgDataList.List:type_name -> webapi.VIPcfg 38, // 50: webapi.ChessRankConfig.Item:type_name -> webapi.WelfareDate 55, // 51: webapi.ChessRankcfgData.Datas:type_name -> webapi.ChessRankConfig - 93, // 52: webapi.ActInviteConfig.PayScore:type_name -> webapi.ActInviteConfig.PayScoreEntry + 95, // 52: webapi.ActInviteConfig.PayScore:type_name -> webapi.ActInviteConfig.PayScoreEntry 62, // 53: webapi.ActInviteConfig.Awards1:type_name -> webapi.RankAward 62, // 54: webapi.ActInviteConfig.Awards2:type_name -> webapi.RankAward 62, // 55: webapi.ActInviteConfig.Awards3:type_name -> webapi.RankAward @@ -9610,22 +9743,23 @@ var file_common_proto_depIdxs = []int32{ 69, // 66: webapi.DiamondLotteryData.Info:type_name -> webapi.DiamondLotteryInfo 70, // 67: webapi.DiamondLotteryData.Players:type_name -> webapi.DiamondLotteryPlayers 72, // 68: webapi.DiamondLotteryConfig.LotteryData:type_name -> webapi.DiamondLotteryData - 97, // 69: webapi.ItemConfig.Items:type_name -> server.DB_GameItem + 99, // 69: webapi.ItemConfig.Items:type_name -> server.DB_GameItem 32, // 70: webapi.RankAwardInfo.Item:type_name -> webapi.ItemInfo 75, // 71: webapi.RankTypeInfo.Award:type_name -> webapi.RankAwardInfo 76, // 72: webapi.RankTypeConfig.Info:type_name -> webapi.RankTypeInfo - 94, // 73: webapi.SkinLevel.UpItem:type_name -> webapi.SkinLevel.UpItemEntry - 95, // 74: webapi.SkinItem.UnlockParam:type_name -> webapi.SkinItem.UnlockParamEntry + 96, // 73: webapi.SkinLevel.UpItem:type_name -> webapi.SkinLevel.UpItemEntry + 97, // 74: webapi.SkinItem.UnlockParam:type_name -> webapi.SkinItem.UnlockParamEntry 78, // 75: webapi.SkinItem.Levels:type_name -> webapi.SkinLevel 79, // 76: webapi.SkinConfig.Items:type_name -> webapi.SkinItem 82, // 77: webapi.AwardLogConfig.AwardLog:type_name -> webapi.AwardLogData 84, // 78: webapi.AwardLogConfig.AnnouncerLog:type_name -> webapi.AnnouncerLogInfo 83, // 79: webapi.AwardLogData.AwardLog:type_name -> webapi.AwardLogInfo - 80, // [80:80] is the sub-list for method output_type - 80, // [80:80] is the sub-list for method input_type - 80, // [80:80] is the sub-list for extension type_name - 80, // [80:80] is the sub-list for extension extendee - 0, // [0:80] is the sub-list for field type_name + 87, // 80: webapi.MachineConfig.Info:type_name -> webapi.MachineInfo + 81, // [81:81] is the sub-list for method output_type + 81, // [81:81] is the sub-list for method input_type + 81, // [81:81] is the sub-list for extension type_name + 81, // [81:81] is the sub-list for extension extendee + 0, // [0:81] is the sub-list for field type_name } func init() { file_common_proto_init() } @@ -10666,6 +10800,30 @@ func file_common_proto_init() { return nil } } + file_common_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MachineInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -10673,7 +10831,7 @@ func file_common_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_proto_rawDesc, NumEnums: 0, - NumMessages: 96, + NumMessages: 98, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/webapi/common.proto b/protocol/webapi/common.proto index a62f0da..c3b53b9 100644 --- a/protocol/webapi/common.proto +++ b/protocol/webapi/common.proto @@ -889,4 +889,16 @@ message GuideConfig { string Platform = 1; // 平台 int32 On = 2; // 引导开关 1开启 2关闭 int32 Skip = 3; // 引导跳过开关 1开启 2关闭 +} + +//娃娃机配置视频 +// etcd /game/machine_config +message MachineConfig{ + string Platform = 1; // 平台 + repeated MachineInfo Info = 2; +} +message MachineInfo{ + int32 MachineId = 1; //娃娃机Id + int64 AppId = 2; + string ServerSecret = 3; } \ No newline at end of file diff --git a/protocol/webapi/webapi.proto b/protocol/webapi/webapi.proto index d5aedaa..d0b9589 100644 --- a/protocol/webapi/webapi.proto +++ b/protocol/webapi/webapi.proto @@ -969,3 +969,4 @@ message WindowsInfo{ int32 PartNum = 4;//参与人数 int32 GainNum = 5;//领取人数 } + From 6bd95be413053c03543d3479b13584096d67ef52 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 29 Aug 2024 11:33:52 +0800 Subject: [PATCH 34/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BAetcd=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/clawdoll/clawdoll.pb.go | 84 ++++++++++++++------------------ 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/protocol/clawdoll/clawdoll.pb.go b/protocol/clawdoll/clawdoll.pb.go index cc583f3..b0f6fc1 100644 --- a/protocol/clawdoll/clawdoll.pb.go +++ b/protocol/clawdoll/clawdoll.pb.go @@ -848,8 +848,7 @@ type CSCLAWDOLLGetToken struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Appid int64 `protobuf:"varint,1,opt,name=Appid,proto3" json:"Appid,omitempty"` - ServerSecret string `protobuf:"bytes,2,opt,name=serverSecret,proto3" json:"serverSecret,omitempty"` + Appid int64 `protobuf:"varint,1,opt,name=Appid,proto3" json:"Appid,omitempty"` } func (x *CSCLAWDOLLGetToken) Reset() { @@ -891,13 +890,6 @@ func (x *CSCLAWDOLLGetToken) GetAppid() int64 { return 0 } -func (x *CSCLAWDOLLGetToken) GetServerSecret() string { - if x != nil { - return x.ServerSecret - } - return "" -} - type SCCLAWDOLLSendToken struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1031,47 +1023,45 @@ var file_clawdoll_proto_rawDesc = []byte{ 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x29, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x50, - 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x43, 0x53, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x2b, 0x0a, - 0x13, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0xe1, 0x02, 0x0a, 0x10, 0x43, - 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, - 0x0f, 0x0a, 0x0b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, - 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, - 0x4f, 0x4d, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, - 0xe2, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, - 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x18, 0x0a, 0x13, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x10, 0xe4, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, 0x2b, - 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x1a, 0x0a, 0x15, + 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x13, 0x53, 0x43, 0x43, + 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0xe1, 0x02, 0x0a, 0x10, 0x43, 0x4c, 0x41, 0x57, 0x44, + 0x4f, 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x0f, 0x0a, 0x0b, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x49, 0x4e, + 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x17, + 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, + 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, + 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, + 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, - 0x10, 0xe8, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, - 0x5f, 0x47, 0x45, 0x54, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, 0x2b, 0x12, 0x18, 0x0a, 0x13, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, - 0x4b, 0x45, 0x4e, 0x10, 0xea, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, - 0xeb, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, - 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, 0xec, 0x2b, 0x2a, 0x64, - 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, - 0x0a, 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, - 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, - 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, - 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, - 0x5f, 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, - 0x6e, 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, - 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x6e, 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe8, 0x2b, 0x12, + 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, + 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, 0x2b, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, + 0xea, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, + 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, 0xeb, 0x2b, 0x12, 0x1a, + 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x57, 0x41, 0x49, 0x54, + 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, 0xec, 0x2b, 0x2a, 0x64, 0x0a, 0x0c, 0x4f, 0x70, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, + 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, + 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6f, 0x73, + 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, + 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( From ccc0e976350c18fed7c9103ac24be0433a286207 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Thu, 29 Aug 2024 11:55:57 +0800 Subject: [PATCH 35/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BAetcd=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/base/scene.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gamesrv/base/scene.go b/gamesrv/base/scene.go index 5ab27bc..c431b64 100644 --- a/gamesrv/base/scene.go +++ b/gamesrv/base/scene.go @@ -2757,6 +2757,9 @@ func (this *Scene) TryRelease() { } func (this *Scene) GetMachineServerSecret(Appid int64, platform string) string { config := ConfigMgrInst.GetConfig(platform).MachineConfig + if config == nil { + return "" + } for _, info := range config.Info { if info.AppId == Appid { return info.ServerSecret From 958a3b1ba4c2dbe3fa66eee19da998c6daab2c4b Mon Sep 17 00:00:00 2001 From: kxdd Date: Fri, 30 Aug 2024 11:56:15 +0800 Subject: [PATCH 36/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E7=AD=89?= =?UTF-8?q?=E5=BE=85=E7=8E=A9=E5=AE=B6=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamerule/clawdoll/constants.go | 7 +- gamesrv/clawdoll/player_clawdoll.go | 2 - gamesrv/clawdoll/scene_clawdoll.go | 34 ++- gamesrv/clawdoll/scenepolicy_clawdoll.go | 112 ++++++++- protocol/clawdoll/clawdoll.pb.go | 297 +++++++++++++++++------ protocol/clawdoll/clawdoll.proto | 21 +- 6 files changed, 390 insertions(+), 83 deletions(-) diff --git a/gamerule/clawdoll/constants.go b/gamerule/clawdoll/constants.go index b207785..b1c0813 100644 --- a/gamerule/clawdoll/constants.go +++ b/gamerule/clawdoll/constants.go @@ -33,9 +33,10 @@ const ( // 玩家操作 const ( - ClawDollPlayerOpPayCoin = iota + 1 // 上分 投币 - ClawDollPlayerOpGo // 下抓 - ClawDollPlayerOpMove // 玩家操控动作 // 1-前 2-后 3-左 4-右 + ClawDollPlayerOpPayCoin = iota + 1 // 上分 投币 + ClawDollPlayerOpGo // 下抓 + ClawDollPlayerOpMove // 玩家操控动作 // 1-前 2-后 3-左 4-右 + ClawDollPlayerCancelPayCoin // 取消投币 ) // 1-前 2-后 3-左 4-右 5-投币 diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index 18d6283..34f3441 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -1,7 +1,6 @@ package clawdoll import ( - rule "mongo.games.com/game/gamerule/clawdoll" "mongo.games.com/game/gamesrv/base" "mongo.games.com/goserver/core/logger" ) @@ -63,7 +62,6 @@ func (this *PlayerEx) ReStartGame() { this.gainCoin = 0 this.taxCoin = 0 this.odds = 0 - this.clawDollState = rule.ClawDollPlayerStateWait } // 初始化 diff --git a/gamesrv/clawdoll/scene_clawdoll.go b/gamesrv/clawdoll/scene_clawdoll.go index f43ee22..3347ea6 100644 --- a/gamesrv/clawdoll/scene_clawdoll.go +++ b/gamesrv/clawdoll/scene_clawdoll.go @@ -73,16 +73,37 @@ func (this *SceneEx) delPlayer(p *base.Player) { } } +// 广播玩家进入 +func (this *SceneEx) BroadcastPlayerEnter(p *base.Player, reason int) { + pack := &clawdoll.SCCLAWDOLLPlayerEnter{} + + pack.Data = &clawdoll.CLAWDOLLPlayerDigestInfo{} + + pack.Data.SnId = p.GetSnId() + pack.Data.Head = p.Head + pack.Data.HeadUrl = p.HeadUrl + pack.Data.Name = p.Name + + proto.SetDefaults(pack) + + this.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PlayerEnter), pack, p.GetSid()) +} + // 广播玩家离开 func (this *SceneEx) BroadcastPlayerLeave(p *base.Player, reason int) { scLeavePack := &clawdoll.SCCLAWDOLLPlayerLeave{ - Pos: proto.Int(p.GetPos()), + SnId: proto.Int32(p.SnId), } proto.SetDefaults(scLeavePack) this.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PlayerLeave), scLeavePack, p.GetSid()) } +// 玩家进入事件 +func (this *SceneEx) OnPlayerEnter(p *base.Player, reason int) { + this.BroadcastPlayerEnter(p, reason) +} + // 玩家离开事件 func (this *SceneEx) OnPlayerLeave(p *base.Player, reason int) { this.delPlayer(p) @@ -309,6 +330,17 @@ func (this *SceneEx) SetPlayingState(state int32) { playerEx := this.players[this.playingSnid] if playerEx != nil { + oldState := playerEx.GetClawState() + if oldState != state { + if oldState == rule.ClawDollPlayerStateWait && (state >= rule.ClawDollPlayerStateStart && state <= rule.ClawDollPlayerWaitPayCoin) { + ClawdollBroadcastPlayingInfo(this.Scene) + } + + if state == rule.ClawDollPlayerStateWait && (oldState >= rule.ClawDollPlayerStateStart && oldState <= rule.ClawDollPlayerWaitPayCoin) { + ClawdollBroadcastPlayingInfo(this.Scene) + } + } + playerEx.SetClawState(state) } } diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index ec08dd2..4128a09 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -112,6 +112,11 @@ func (this *PolicyClawdoll) OnPlayerEnter(s *base.Scene, p *base.Player) { //给自己发送房间信息 this.SendRoomInfo(s, p, sceneEx) + ClawdollBroadcastRoomWaitPlayers(s) + ClawdollBroadcastPlayingInfo(s) + + // 玩家数据发送 + sceneEx.OnPlayerEnter(p, 0) s.FirePlayerEvent(p, base.PlayerEventEnter, nil) } } @@ -166,6 +171,8 @@ func (this *PolicyClawdoll) OnPlayerRehold(s *base.Scene, p *base.Player) { p.MarkFlag(base.PlayerState_Ready) } this.SendRoomInfo(s, p, sceneEx) + ClawdollBroadcastRoomWaitPlayers(s) + ClawdollBroadcastPlayingInfo(s) s.FirePlayerEvent(p, base.PlayerEventRehold, nil) } } @@ -183,6 +190,9 @@ func (this *PolicyClawdoll) OnPlayerReturn(s *base.Scene, p *base.Player) { p.MarkFlag(base.PlayerState_Ready) } this.SendRoomInfo(s, p, sceneEx) + ClawdollBroadcastRoomWaitPlayers(s) + ClawdollBroadcastPlayingInfo(s) + s.FirePlayerEvent(p, base.PlayerEventReturn, nil) } } @@ -273,11 +283,65 @@ func ClawdollSendPlayerInfo(s *base.Scene) { GainCoin: proto.Int64(playerEx.gainCoin), } + proto.SetDefaults(pack) + playerEx.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PLAYERINFO), pack) } } } +// 广播房间里所有等待玩家信息 +func ClawdollBroadcastRoomWaitPlayers(s *base.Scene) { + pack := &clawdoll.CLAWDOLLWaitPlayers{} + + if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + for _, playerEx := range sceneEx.players { + // 玩家信息 + if playerEx.SnId != sceneEx.playingSnid { + pd := &clawdoll.CLAWDOLLPlayerDigestInfo{ + SnId: proto.Int32(playerEx.SnId), + Head: proto.Int32(playerEx.Head), + HeadUrl: proto.String(playerEx.HeadUrl), + Name: proto.String(playerEx.Name), + } + + pack.WaitPlayersInfo = append(pack.WaitPlayersInfo, pd) + } + } + + s.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_WAITPLAYERS), pack, 0) + } +} + +// 广播房间正在控制娃娃机的玩家信息 +func ClawdollBroadcastPlayingInfo(s *base.Scene) { + if sceneEx, ok := s.ExtraData.(*SceneEx); ok { + + if !sceneEx.IsHasPlaying() { + pack := &clawdoll.CLAWDOLLPlayerDigestInfo{ + SnId: proto.Int32(0), + Head: proto.Int32(0), + } + + s.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PLAYINGINFO), pack, 0) + return + } + + playerEx := sceneEx.GetPlayingEx() + if playerEx != nil && playerEx.SnId == sceneEx.playingSnid { + pack := &clawdoll.CLAWDOLLPlayerDigestInfo{ + SnId: proto.Int32(playerEx.SnId), + Head: proto.Int32(playerEx.Head), + HeadUrl: proto.String(playerEx.HeadUrl), + Name: proto.String(playerEx.Name), + } + + s.Broadcast(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PLAYINGINFO), pack, 0) + //playerEx.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_PLAYERINFO), pack) + } + } +} + //===================================== // BaseState 状态基类 //===================================== @@ -426,6 +490,8 @@ func (this *StateWait) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, par ClawdollBroadcastRoomState(s) ClawdollSendPlayerInfo(s) + ClawdollBroadcastPlayingInfo(s) + sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) } } @@ -636,6 +702,26 @@ func (this *StateBilled) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, p func (this *StateBilled) OnEnter(s *base.Scene) { logger.Logger.Trace("(this *StateBilled) OnEnter, sceneid=", s.GetSceneId()) this.BaseState.OnEnter(s) + + sceneEx, ok := s.ExtraData.(*SceneEx) + if !ok { + return + } + + playerEx := sceneEx.GetPlayingEx() + if playerEx != nil { + pack := &clawdoll.SCCLAWDOLLRoundGameBilled{ + RoundId: proto.Int32(int32(sceneEx.RoundId)), + ClowResult: proto.Int32(0), + Award: proto.Int64(playerEx.gainCoin), + Balance: proto.Int64(playerEx.Coin), + } + + // logger.Logger.Trace("SCSmallRocketRoundGameBilled is pack: ", pack) + proto.SetDefaults(pack) + + playerEx.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_GAMEBILLED), pack) + } } func (this *StateBilled) OnLeave(s *base.Scene) { @@ -661,6 +747,7 @@ func (this *StateBilled) OnTick(s *base.Scene) { ClawdollBroadcastRoomState(s) ClawdollSendPlayerInfo(s) + return } } @@ -729,7 +816,30 @@ func (this *StateWaitPayCoin) OnPlayerOp(s *base.Scene, p *base.Player, opcode i ClawdollSendPlayerInfo(s) sceneEx.OnPlayerSCOp(p, opcode, clawdoll.OpResultCode_OPRC_Success, params) + + case rule.ClawDollPlayerCancelPayCoin: + if sceneEx.playingSnid != playerEx.SnId { + logger.Logger.Trace("StateWaitPayCoin OnPlayerOp-----sceneEx.playingSnid:", sceneEx.playingSnid, " playerEx.SnId: ", playerEx.SnId) + return false + } + + // 先设置时间 + playingEx := sceneEx.GetPlayingEx() + if playingEx != nil { + playingEx.ReStartGame() + ClawdollSendPlayerInfo(s) + } + + // 再重置scene数据 + sceneEx.ReStartGame() + + s.ChangeSceneState(rule.ClawDollSceneStateWait) + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateWait)) + + ClawdollBroadcastRoomState(s) + ClawdollBroadcastPlayingInfo(s) } + return false } @@ -762,7 +872,7 @@ func (this *StateWaitPayCoin) OnTick(s *base.Scene) { sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateWait)) ClawdollBroadcastRoomState(s) - + ClawdollBroadcastPlayingInfo(s) return } } diff --git a/protocol/clawdoll/clawdoll.pb.go b/protocol/clawdoll/clawdoll.pb.go index b0f6fc1..04e9a9f 100644 --- a/protocol/clawdoll/clawdoll.pb.go +++ b/protocol/clawdoll/clawdoll.pb.go @@ -37,6 +37,7 @@ const ( CLAWDOLLPacketID_PACKET_SC_SENDTOKEN CLAWDOLLPacketID = 5610 // 获取token CLAWDOLLPacketID_PACKET_CS_WAITPLAYERS CLAWDOLLPacketID = 5611 // 获取等待玩家信息 (客户->服务) CLAWDOLLPacketID_PACKET_SC_WAITPLAYERS CLAWDOLLPacketID = 5612 // 获取等待玩家信息 (服务->客户) + CLAWDOLLPacketID_PACKET_SC_PLAYINGINFO CLAWDOLLPacketID = 5613 // 正在控制娃娃机的玩家信息 (服务->客户) ) // Enum value maps for CLAWDOLLPacketID. @@ -55,6 +56,7 @@ var ( 5610: "PACKET_SC_SENDTOKEN", 5611: "PACKET_CS_WAITPLAYERS", 5612: "PACKET_SC_WAITPLAYERS", + 5613: "PACKET_SC_PLAYINGINFO", } CLAWDOLLPacketID_value = map[string]int32{ "PACKET_ZERO": 0, @@ -70,6 +72,7 @@ var ( "PACKET_SC_SENDTOKEN": 5610, "PACKET_CS_WAITPLAYERS": 5611, "PACKET_SC_WAITPLAYERS": 5612, + "PACKET_SC_PLAYINGINFO": 5613, } ) @@ -670,11 +673,10 @@ type SCCLAWDOLLPlayerInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SnId int32 `protobuf:"varint,1,opt,name=SnId,proto3" json:"SnId,omitempty"` // 玩家ID - ClawDollState int32 `protobuf:"varint,2,opt,name=clawDollState,proto3" json:"clawDollState,omitempty"` // 玩家状态 - GainCoin int64 `protobuf:"varint,3,opt,name=gainCoin,proto3" json:"gainCoin,omitempty"` // 本局赢取 - Coin int64 `protobuf:"varint,4,opt,name=Coin,proto3" json:"Coin,omitempty"` // 玩家 - Params []int64 `protobuf:"varint,5,rep,packed,name=Params,proto3" json:"Params,omitempty"` //操作参数 + SnId int32 `protobuf:"varint,1,opt,name=SnId,proto3" json:"SnId,omitempty"` // 玩家ID + ClawDollState int32 `protobuf:"varint,2,opt,name=clawDollState,proto3" json:"clawDollState,omitempty"` // 玩家状态 + GainCoin int64 `protobuf:"varint,3,opt,name=gainCoin,proto3" json:"gainCoin,omitempty"` // 本局赢取 + Coin int64 `protobuf:"varint,4,opt,name=Coin,proto3" json:"Coin,omitempty"` // 玩家 } func (x *SCCLAWDOLLPlayerInfo) Reset() { @@ -737,13 +739,6 @@ func (x *SCCLAWDOLLPlayerInfo) GetCoin() int64 { return 0 } -func (x *SCCLAWDOLLPlayerInfo) GetParams() []int64 { - if x != nil { - return x.Params - } - return nil -} - //玩家进入 //PACKET_SCCLAWDOLLPlayerEnter type SCCLAWDOLLPlayerEnter struct { @@ -751,7 +746,7 @@ type SCCLAWDOLLPlayerEnter struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Data *CLAWDOLLPlayerData `protobuf:"bytes,1,opt,name=Data,proto3" json:"Data,omitempty"` + Data *CLAWDOLLPlayerDigestInfo `protobuf:"bytes,1,opt,name=Data,proto3" json:"Data,omitempty"` } func (x *SCCLAWDOLLPlayerEnter) Reset() { @@ -786,7 +781,7 @@ func (*SCCLAWDOLLPlayerEnter) Descriptor() ([]byte, []int) { return file_clawdoll_proto_rawDescGZIP(), []int{7} } -func (x *SCCLAWDOLLPlayerEnter) GetData() *CLAWDOLLPlayerData { +func (x *SCCLAWDOLLPlayerEnter) GetData() *CLAWDOLLPlayerDigestInfo { if x != nil { return x.Data } @@ -800,7 +795,7 @@ type SCCLAWDOLLPlayerLeave struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Pos int32 `protobuf:"varint,1,opt,name=Pos,proto3" json:"Pos,omitempty"` //玩家位置 + SnId int32 `protobuf:"varint,1,opt,name=SnId,proto3" json:"SnId,omitempty"` //玩家id } func (x *SCCLAWDOLLPlayerLeave) Reset() { @@ -835,9 +830,9 @@ func (*SCCLAWDOLLPlayerLeave) Descriptor() ([]byte, []int) { return file_clawdoll_proto_rawDescGZIP(), []int{8} } -func (x *SCCLAWDOLLPlayerLeave) GetPos() int32 { +func (x *SCCLAWDOLLPlayerLeave) GetSnId() int32 { if x != nil { - return x.Pos + return x.SnId } return 0 } @@ -937,6 +932,125 @@ func (x *SCCLAWDOLLSendToken) GetToken() string { return "" } +type CLAWDOLLWaitPlayers struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WaitPlayersInfo []*CLAWDOLLPlayerDigestInfo `protobuf:"bytes,1,rep,name=WaitPlayersInfo,proto3" json:"WaitPlayersInfo,omitempty"` +} + +func (x *CLAWDOLLWaitPlayers) Reset() { + *x = CLAWDOLLWaitPlayers{} + if protoimpl.UnsafeEnabled { + mi := &file_clawdoll_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CLAWDOLLWaitPlayers) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CLAWDOLLWaitPlayers) ProtoMessage() {} + +func (x *CLAWDOLLWaitPlayers) ProtoReflect() protoreflect.Message { + mi := &file_clawdoll_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CLAWDOLLWaitPlayers.ProtoReflect.Descriptor instead. +func (*CLAWDOLLWaitPlayers) Descriptor() ([]byte, []int) { + return file_clawdoll_proto_rawDescGZIP(), []int{11} +} + +func (x *CLAWDOLLWaitPlayers) GetWaitPlayersInfo() []*CLAWDOLLPlayerDigestInfo { + if x != nil { + return x.WaitPlayersInfo + } + return nil +} + +// 玩家摘要信息 +type CLAWDOLLPlayerDigestInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SnId int32 `protobuf:"varint,1,opt,name=SnId,proto3" json:"SnId,omitempty"` //账号 + Head int32 `protobuf:"varint,2,opt,name=Head,proto3" json:"Head,omitempty"` //头像 + HeadUrl string `protobuf:"bytes,3,opt,name=HeadUrl,proto3" json:"HeadUrl,omitempty"` //头像 + Name string `protobuf:"bytes,4,opt,name=Name,proto3" json:"Name,omitempty"` //名字 +} + +func (x *CLAWDOLLPlayerDigestInfo) Reset() { + *x = CLAWDOLLPlayerDigestInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_clawdoll_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CLAWDOLLPlayerDigestInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CLAWDOLLPlayerDigestInfo) ProtoMessage() {} + +func (x *CLAWDOLLPlayerDigestInfo) ProtoReflect() protoreflect.Message { + mi := &file_clawdoll_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CLAWDOLLPlayerDigestInfo.ProtoReflect.Descriptor instead. +func (*CLAWDOLLPlayerDigestInfo) Descriptor() ([]byte, []int) { + return file_clawdoll_proto_rawDescGZIP(), []int{12} +} + +func (x *CLAWDOLLPlayerDigestInfo) GetSnId() int32 { + if x != nil { + return x.SnId + } + return 0 +} + +func (x *CLAWDOLLPlayerDigestInfo) GetHead() int32 { + if x != nil { + return x.Head + } + return 0 +} + +func (x *CLAWDOLLPlayerDigestInfo) GetHeadUrl() string { + if x != nil { + return x.HeadUrl + } + return "" +} + +func (x *CLAWDOLLPlayerDigestInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + var File_clawdoll_proto protoreflect.FileDescriptor var file_clawdoll_proto_rawDesc = []byte{ @@ -1006,7 +1120,7 @@ var file_clawdoll_proto_rawDesc = []byte{ 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x02, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x98, 0x01, 0x0a, + 0x20, 0x03, 0x28, 0x02, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x14, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x61, @@ -1014,54 +1128,68 @@ var file_clawdoll_proto_rawDesc = []byte{ 0x52, 0x0d, 0x63, 0x6c, 0x61, 0x77, 0x44, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x67, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x43, - 0x6f, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x43, 0x6f, 0x69, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, - 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x49, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, - 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, - 0x12, 0x30, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x2e, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, - 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x22, 0x29, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, - 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x50, - 0x6f, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x22, 0x2a, 0x0a, + 0x6f, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x43, 0x6f, 0x69, 0x6e, 0x22, + 0x4f, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, + 0x6c, 0x2e, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x22, 0x2a, 0x0a, 0x12, 0x43, 0x53, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x13, 0x53, 0x43, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0xe1, 0x02, 0x0a, 0x10, 0x43, 0x4c, 0x41, 0x57, 0x44, - 0x4f, 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x0f, 0x0a, 0x0b, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x49, 0x4e, - 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x17, - 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, - 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, - 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, - 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe5, 0x2b, 0x12, 0x1a, 0x0a, 0x15, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x45, 0x6e, 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe8, 0x2b, 0x12, - 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, - 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, 0x2b, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, - 0xea, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, - 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, 0xeb, 0x2b, 0x12, 0x1a, - 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x57, 0x41, 0x49, 0x54, - 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, 0xec, 0x2b, 0x2a, 0x64, 0x0a, 0x0c, 0x4f, 0x70, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, - 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, - 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, - 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6f, 0x73, - 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x03, - 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x63, 0x0a, 0x13, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, + 0x4c, 0x4c, 0x57, 0x61, 0x69, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x4c, 0x0a, + 0x0f, 0x57, 0x61, 0x69, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, + 0x6c, 0x2e, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x57, 0x61, 0x69, 0x74, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x70, 0x0a, 0x18, 0x43, + 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x48, + 0x65, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x48, 0x65, 0x61, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0xfd, 0x02, + 0x0a, 0x10, 0x43, 0x4c, 0x41, 0x57, 0x44, 0x4f, 0x4c, 0x4c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x49, 0x44, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x5a, 0x45, 0x52, + 0x4f, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe1, 0x2b, 0x12, 0x17, 0x0a, 0x12, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, + 0x4f, 0x50, 0x10, 0xe2, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x10, 0xe3, 0x2b, 0x12, 0x18, + 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0xe4, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x42, 0x49, 0x4c, 0x4c, 0x45, 0x44, + 0x10, 0xe5, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x10, 0xe6, 0x2b, 0x12, + 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xe7, 0x2b, 0x12, 0x19, 0x0a, 0x14, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x49, + 0x4e, 0x46, 0x4f, 0x10, 0xe8, 0x2b, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xe9, 0x2b, 0x12, + 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x45, 0x4e, + 0x44, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xea, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, + 0x52, 0x53, 0x10, 0xeb, 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x53, 0x43, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x53, 0x10, 0xec, + 0x2b, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, + 0x4c, 0x41, 0x59, 0x49, 0x4e, 0x47, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xed, 0x2b, 0x2a, 0x64, 0x0a, + 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, + 0x0c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, + 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, + 0x16, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, + 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, + 0x50, 0x6f, 0x73, 0x41, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, + 0x67, 0x10, 0x03, 0x42, 0x28, 0x5a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, + 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x63, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1077,7 +1205,7 @@ func file_clawdoll_proto_rawDescGZIP() []byte { } var file_clawdoll_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_clawdoll_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_clawdoll_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_clawdoll_proto_goTypes = []interface{}{ (CLAWDOLLPacketID)(0), // 0: clawdoll.CLAWDOLLPacketID (OpResultCode)(0), // 1: clawdoll.OpResultCode @@ -1092,16 +1220,19 @@ var file_clawdoll_proto_goTypes = []interface{}{ (*SCCLAWDOLLPlayerLeave)(nil), // 10: clawdoll.SCCLAWDOLLPlayerLeave (*CSCLAWDOLLGetToken)(nil), // 11: clawdoll.CSCLAWDOLLGetToken (*SCCLAWDOLLSendToken)(nil), // 12: clawdoll.SCCLAWDOLLSendToken + (*CLAWDOLLWaitPlayers)(nil), // 13: clawdoll.CLAWDOLLWaitPlayers + (*CLAWDOLLPlayerDigestInfo)(nil), // 14: clawdoll.CLAWDOLLPlayerDigestInfo } var file_clawdoll_proto_depIdxs = []int32{ - 2, // 0: clawdoll.SCCLAWDOLLRoomInfo.Players:type_name -> clawdoll.CLAWDOLLPlayerData - 1, // 1: clawdoll.SCCLAWDOLLOp.OpRetCode:type_name -> clawdoll.OpResultCode - 2, // 2: clawdoll.SCCLAWDOLLPlayerEnter.Data:type_name -> clawdoll.CLAWDOLLPlayerData - 3, // [3:3] is the sub-list for method output_type - 3, // [3:3] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 2, // 0: clawdoll.SCCLAWDOLLRoomInfo.Players:type_name -> clawdoll.CLAWDOLLPlayerData + 1, // 1: clawdoll.SCCLAWDOLLOp.OpRetCode:type_name -> clawdoll.OpResultCode + 14, // 2: clawdoll.SCCLAWDOLLPlayerEnter.Data:type_name -> clawdoll.CLAWDOLLPlayerDigestInfo + 14, // 3: clawdoll.CLAWDOLLWaitPlayers.WaitPlayersInfo:type_name -> clawdoll.CLAWDOLLPlayerDigestInfo + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_clawdoll_proto_init() } @@ -1242,6 +1373,30 @@ func file_clawdoll_proto_init() { return nil } } + file_clawdoll_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CLAWDOLLWaitPlayers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clawdoll_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CLAWDOLLPlayerDigestInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1249,7 +1404,7 @@ func file_clawdoll_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clawdoll_proto_rawDesc, NumEnums: 2, - NumMessages: 11, + NumMessages: 13, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/clawdoll/clawdoll.proto b/protocol/clawdoll/clawdoll.proto index 893b281..68e1b44 100644 --- a/protocol/clawdoll/clawdoll.proto +++ b/protocol/clawdoll/clawdoll.proto @@ -17,6 +17,7 @@ enum CLAWDOLLPacketID { PACKET_SC_SENDTOKEN = 5610; // 获取token PACKET_CS_WAITPLAYERS = 5611; // 获取等待玩家信息 (客户->服务) PACKET_SC_WAITPLAYERS = 5612; // 获取等待玩家信息 (服务->客户) + PACKET_SC_PLAYINGINFO = 5613; // 正在控制娃娃机的玩家信息 (服务->客户) } //操作结果 @@ -94,21 +95,19 @@ message SCCLAWDOLLPlayerInfo { int32 clawDollState = 2; // 玩家状态 int64 gainCoin = 3; // 本局赢取 int64 Coin = 4; // 玩家 - - repeated int64 Params = 5; //操作参数 } //玩家进入 //PACKET_SCCLAWDOLLPlayerEnter message SCCLAWDOLLPlayerEnter { - CLAWDOLLPlayerData Data = 1; + CLAWDOLLPlayerDigestInfo Data = 1; } //玩家离开 //PACKET_SCCLAWDOLLPlayerLeave message SCCLAWDOLLPlayerLeave { - int32 Pos = 1; //玩家位置 + int32 SnId = 1; //玩家id } //玩家请求进入视频地址token message CSCLAWDOLLGetToken { @@ -117,4 +116,16 @@ message CSCLAWDOLLGetToken { message SCCLAWDOLLSendToken { string Token = 1; -} \ No newline at end of file +} + +message CLAWDOLLWaitPlayers { + repeated CLAWDOLLPlayerDigestInfo WaitPlayersInfo = 1; +} + +// 玩家摘要信息 +message CLAWDOLLPlayerDigestInfo { + int32 SnId = 1; //账号 + int32 Head = 2; //头像 + string HeadUrl = 3; //头像 + string Name = 4; //名字 +} From 3a6e420e987b4340279a2c28964269af6cc8d90e Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 30 Aug 2024 15:34:28 +0800 Subject: [PATCH 37/56] =?UTF-8?q?token=E6=B5=8B=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/action_clawdoll.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index e999d63..58f05f2 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -101,11 +101,12 @@ func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interf if !ok { return nil } - serverSecret := sceneEx.GetMachineServerSecret(msg.Appid, p.Platform) + //serverSecret := sceneEx.GetMachineServerSecret(msg.Appid, p.Platform) + serverSecret := "cd542003758ffce2ef28b0801f60c2ca" logger.Logger.Tracef("获取娃娃机serverSecret = %v", serverSecret) - if serverSecret == "" { - return nil - } + /* if serverSecret == "" { + return nil + }*/ pack.ServerSecret = serverSecret sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMGetToken), pack) } From ece16ac947cfcae4e99e82b8bc00532ec015413d Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Fri, 30 Aug 2024 16:45:07 +0800 Subject: [PATCH 38/56] =?UTF-8?q?=E8=8E=B7=E5=8F=96token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/action_clawdoll.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index 58f05f2..e999d63 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -101,12 +101,11 @@ func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interf if !ok { return nil } - //serverSecret := sceneEx.GetMachineServerSecret(msg.Appid, p.Platform) - serverSecret := "cd542003758ffce2ef28b0801f60c2ca" + serverSecret := sceneEx.GetMachineServerSecret(msg.Appid, p.Platform) logger.Logger.Tracef("获取娃娃机serverSecret = %v", serverSecret) - /* if serverSecret == "" { - return nil - }*/ + if serverSecret == "" { + return nil + } pack.ServerSecret = serverSecret sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMGetToken), pack) } From fe26aa3d37f10477747d34e39c7139dbb9a54d5b Mon Sep 17 00:00:00 2001 From: kxdd Date: Fri, 30 Aug 2024 18:15:44 +0800 Subject: [PATCH 39/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=A7=86=E9=A2=91=E6=B5=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DB_GameFree.dat | Bin 22919 -> 23284 bytes data/DB_GameFree.json | 101 ++++++++++++++++++++- gamesrv/base/scene.go | 10 +-- gamesrv/clawdoll/action_clawdoll.go | 24 +++-- protocol/clawdoll/clawdoll.pb.go | 134 +++++++++++++++------------- protocol/clawdoll/clawdoll.proto | 5 +- protocol/machine/machine.pb.go | 63 +++++++------ protocol/machine/machine.proto | 3 +- xlsx/DB_GameFree.xlsx | Bin 62170 -> 62948 bytes 9 files changed, 235 insertions(+), 105 deletions(-) diff --git a/data/DB_GameFree.dat b/data/DB_GameFree.dat index c6c3839bde5091c19fa3eee95313d65914f6add5..ff8a119357821ffc092bb98270782e597ebcac4d 100644 GIT binary patch delta 213 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 delta 50765 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 a|BmSY{~NMvfNk}7z==CFm_Mg~U-Vx=!r=1& From 9f490a7aca0e4177a461a1f79bb7833fa9f91681 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 2 Sep 2024 11:05:45 +0800 Subject: [PATCH 40/56] =?UTF-8?q?=E7=AB=9E=E6=8A=80=E9=A6=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/base/logchannel.go | 3 +++ gamesrv/tienlen/scenedata_tienlen.go | 1 + gamesrv/tienlen/scenepolicy_tienlen.go | 2 +- model/customlog.go | 33 +++++++++++--------------- model/gameplayerlistlog.go | 1 + worldsrv/action_game.go | 2 ++ worldsrv/playernotify.go | 3 +++ worldsrv/scenemgr.go | 2 +- 8 files changed, 26 insertions(+), 21 deletions(-) diff --git a/gamesrv/base/logchannel.go b/gamesrv/base/logchannel.go index 4f77a44..de78540 100644 --- a/gamesrv/base/logchannel.go +++ b/gamesrv/base/logchannel.go @@ -3,6 +3,8 @@ package base import ( "reflect" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/game/model" "mongo.games.com/game/mq" ) @@ -38,6 +40,7 @@ func (c *LogChannel) WriteLog(log interface{}) { if cname == "" { cname = "_null_" } + logger.Logger.Tracef("LogChannel ==> %#v", log) mq.Send(cname, log) } diff --git a/gamesrv/tienlen/scenedata_tienlen.go b/gamesrv/tienlen/scenedata_tienlen.go index f5c8548..e581d75 100644 --- a/gamesrv/tienlen/scenedata_tienlen.go +++ b/gamesrv/tienlen/scenedata_tienlen.go @@ -2114,6 +2114,7 @@ func (this *TienLenSceneData) SaveCustomLog() { state = 1 } log := &model.CustomLog{ + Platform: this.Platform, CycleId: this.CycleID, RoomConfigId: this.GetCustom().GetRoomConfigId(), RoomId: this.SceneId, diff --git a/gamesrv/tienlen/scenepolicy_tienlen.go b/gamesrv/tienlen/scenepolicy_tienlen.go index 5e654e1..020508a 100644 --- a/gamesrv/tienlen/scenepolicy_tienlen.go +++ b/gamesrv/tienlen/scenepolicy_tienlen.go @@ -2608,7 +2608,7 @@ func (this *SceneBilledStateTienLen) OnEnter(s *base.Scene) { if p != nil { var items []*model.Item for _, v := range packBilled.List[0].Award { - itemData := srvdata.GameItemMgr.Get(p.Platform, p.SnId) + itemData := srvdata.GameItemMgr.Get(p.Platform, v.GetId()) if itemData != nil { items = append(items, &model.Item{ ItemId: v.GetId(), diff --git a/model/customlog.go b/model/customlog.go index 08e6a27..67b82ec 100644 --- a/model/customlog.go +++ b/model/customlog.go @@ -1,9 +1,5 @@ package model -import ( - "github.com/globalsign/mgo/bson" -) - var ( DbCustomLogDBName = "log" DbCustomLogCollName = "log_custom" @@ -22,19 +18,18 @@ type RoundInfo struct { } type CustomLog struct { - Id bson.ObjectId `bson:"_id"` - Platform string `bson:"-"` - CycleId string // 本轮id,多局游戏属于同一轮 - RoomConfigId int32 // 房间配置id - GameFreeId int32 // 场次id - TotalRound int32 // 总局数 - PlayerNum int32 // 最大人数 - Password string // 密码 - CostType int32 // 付费方式 1房主 2AA - Voice int32 // 是否开启语音 1开启 - RoomId int32 // 房间id - SnId []PlayerInfo // 所有玩家 - List []RoundInfo // 对局记录 - StartTs, EndTs int64 // 开始,结束时间 - State int32 // 0正常结束 1后台中途解散 + Platform string `bson:"-"` + CycleId string // 本轮id,多局游戏属于同一轮 + RoomConfigId int32 // 房间配置id + GameFreeId int32 // 场次id + TotalRound int32 // 总局数 + PlayerNum int32 // 最大人数 + Password string // 密码 + CostType int32 // 付费方式 1房主 2AA + Voice int32 // 是否开启语音 1开启 + RoomId int32 // 房间id + SnId []PlayerInfo // 所有玩家 + List []RoundInfo // 对局记录 + StartTs, EndTs int64 // 开始,结束时间 + State int32 // 0正常结束 1后台中途解散 } diff --git a/model/gameplayerlistlog.go b/model/gameplayerlistlog.go index 4bbd768..4441b2d 100644 --- a/model/gameplayerlistlog.go +++ b/model/gameplayerlistlog.go @@ -99,6 +99,7 @@ func NewGamePlayerListLogEx(snid int32, gamedetailedlogid string, platform, chan cl.Time = tNow cl.MatchId = matchid cl.MatchType = matchType + cl.CycleId = cycleId return cl } diff --git a/worldsrv/action_game.go b/worldsrv/action_game.go index d53bca5..a080fc6 100644 --- a/worldsrv/action_game.go +++ b/worldsrv/action_game.go @@ -1348,6 +1348,8 @@ func CSGetPrivateRoomListHandler(s *netlib.Session, packetId int, data interface return nil } + PlayerNotifySingle.AddTime(p.SnId, common.NotifyPrivateRoomList, time.Second*15) + pack := &gamehall.SCGetPrivateRoomList{} scenes := SceneMgrSingleton.FindRoomList(&FindRoomParam{ Platform: p.Platform, diff --git a/worldsrv/playernotify.go b/worldsrv/playernotify.go index 7999b8e..e944769 100644 --- a/worldsrv/playernotify.go +++ b/worldsrv/playernotify.go @@ -3,6 +3,8 @@ package main import ( "time" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/game/common" ) @@ -76,4 +78,5 @@ func (p *PlayerNotify) GetPlayers(tp common.NotifyType) []int32 { func (p *PlayerNotify) SendToClient(tp common.NotifyType, packetId int, pack interface{}) { ids := p.GetPlayers(tp) PlayerMgrSington.BroadcastMessageToTarget(ids, packetId, pack) + logger.Logger.Tracef("PlayerNotify SendToClient tp:%v ids:%v", tp, ids) } diff --git a/worldsrv/scenemgr.go b/worldsrv/scenemgr.go index 4938b49..864f2ca 100644 --- a/worldsrv/scenemgr.go +++ b/worldsrv/scenemgr.go @@ -85,7 +85,7 @@ func (m *SceneMgr) GenOneMatchSceneId() int { func (m *SceneMgr) GenPassword() string { for i := 0; i < 100; i++ { - s := strconv.Itoa(common.RandInt(10000, 100000)) + s := strconv.Itoa(common.RandInt(100000, 1000000)) if _, ok := m.password[s]; !ok { m.password[s] = struct{}{} return s From 04a0772415850ef732d37a6d46117977085bc985 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 2 Sep 2024 14:35:10 +0800 Subject: [PATCH 41/56] =?UTF-8?q?=E7=AB=9E=E6=8A=80=E9=A6=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worldsrv/scene.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/worldsrv/scene.go b/worldsrv/scene.go index bd5e0eb..cba5275 100644 --- a/worldsrv/scene.go +++ b/worldsrv/scene.go @@ -422,6 +422,7 @@ func (this *Scene) PlayerEnter(p *Player, pos int, ischangeroom bool) bool { } this.gameSess.AddPlayer(p) FirePlayerEnterScene(p, this) + this.sp.OnPlayerEnter(this, p) return true } @@ -507,6 +508,8 @@ func (this *Scene) lastScene(p *Player) { } func (this *Scene) DelPlayer(p *Player) bool { + FirePlayerLeaveScene(p, this) + this.sp.OnPlayerLeave(this, p) if p.scene != this { roomId := 0 if p.scene != nil { From 26db8f4b21924dbaf2efcd80a6b67ff557871e69 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 2 Sep 2024 14:55:18 +0800 Subject: [PATCH 42/56] =?UTF-8?q?=E7=AB=9E=E6=8A=80=E9=A6=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamerule/tienlen/constants.go | 1 + gamesrv/tienlen/scenepolicy_tienlen.go | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/gamerule/tienlen/constants.go b/gamerule/tienlen/constants.go index 24ff3bc..024f6a2 100644 --- a/gamerule/tienlen/constants.go +++ b/gamerule/tienlen/constants.go @@ -29,6 +29,7 @@ const ( TIenLenTianhuTimeout = time.Second * 2 // 天胡动画时长 TienLenHandNotExceedTimeLimit = time.Second * 3 //玩家没有牌可以接上家的牌,出牌时间上限 TienLenHandAutoStateTimeOut = time.Second * 1 //玩家托管出牌时间上限 + TienLenCustomWaiteStatTimeout = time.Millisecond * 1500 ) // 场景状态 diff --git a/gamesrv/tienlen/scenepolicy_tienlen.go b/gamesrv/tienlen/scenepolicy_tienlen.go index 020508a..b679abd 100644 --- a/gamesrv/tienlen/scenepolicy_tienlen.go +++ b/gamesrv/tienlen/scenepolicy_tienlen.go @@ -914,10 +914,12 @@ func (this *SceneWaitStartStateTienLen) OnTick(s *base.Scene) { } } if sceneEx.IsCustom() { - if sceneEx.CanStart() { - s.ChangeSceneState(rule.TienLenSceneStateHandCard) - } else { - s.ChangeSceneState(rule.TienLenSceneStateWaitPlayer) + if time.Now().Sub(sceneEx.StateStartTime) > rule.TienLenCustomWaiteStatTimeout { + if sceneEx.CanStart() { + s.ChangeSceneState(rule.TienLenSceneStateHandCard) + } else { + s.ChangeSceneState(rule.TienLenSceneStateWaitPlayer) + } } } } From 00dcc3199f2b3dd1bb753958888dde3b67a3d3ef Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 2 Sep 2024 16:13:23 +0800 Subject: [PATCH 43/56] =?UTF-8?q?=E7=AB=9E=E6=8A=80=E9=A6=86=E6=88=BF?= =?UTF-8?q?=E4=B8=BB=E4=BB=98=E8=B4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/tienlen/scenepolicy_tienlen.go | 2 +- worldsrv/action_game.go | 4 ++ worldsrv/bagmgr.go | 2 +- worldsrv/scenepolicydata.go | 66 +++++++++++++++++++++++--- worldsrv/trascate_webapi.go | 26 +++++++--- 5 files changed, 84 insertions(+), 16 deletions(-) diff --git a/gamesrv/tienlen/scenepolicy_tienlen.go b/gamesrv/tienlen/scenepolicy_tienlen.go index b679abd..a64bbd5 100644 --- a/gamesrv/tienlen/scenepolicy_tienlen.go +++ b/gamesrv/tienlen/scenepolicy_tienlen.go @@ -825,7 +825,7 @@ func (this *SceneWaitStartStateTienLen) OnEnter(s *base.Scene) { if sceneEx, ok := s.GetExtraData().(*TienLenSceneData); ok { sceneEx.Clear() sceneEx.SetGaming(false) - this.BroadcastRoomState(s, this.GetState()) + this.BroadcastRoomState(s, this.GetState(), int64(sceneEx.NumOfGames)) logger.Logger.Trace("(this *SceneWaitStartStateTienLen) OnEnter", this.GetState()) } } diff --git a/worldsrv/action_game.go b/worldsrv/action_game.go index a080fc6..7785ce8 100644 --- a/worldsrv/action_game.go +++ b/worldsrv/action_game.go @@ -1319,6 +1319,10 @@ func CSCreatePrivateRoomHandler(s *netlib.Session, packetId int, data interface{ return nil } + if cfg.GetCostType() == 1 { + sp.CostPayment(scene, p) + } + pack = &gamehall.SCCreatePrivateRoom{ OpRetCode: gamehall.OpResultCode_Game_OPRC_Sucess_Game, GameFreeId: msg.GetGameFreeId(), diff --git a/worldsrv/bagmgr.go b/worldsrv/bagmgr.go index 497c69d..acb0556 100644 --- a/worldsrv/bagmgr.go +++ b/worldsrv/bagmgr.go @@ -450,7 +450,7 @@ func (this *BagMgr) AddItem(p *Player, itemId, itemNum int64, add int64, gainWay return this.AddItems(p, []*Item{{ItemId: int32(itemId), ItemNum: itemNum}}, add, gainWay, operator, remark, gameId, gameFreeId, noLog, params...) } -func (this *BagMgr) AddItemsOffline(platform string, snid int32, addItems []*Item, gainWay int32, operator, remark string, +func (this *BagMgr) AddItemsOffline(platform string, snid int32, addItems []*model.Item, gainWay int32, operator, remark string, gameId, gameFreeId int64, noLog bool, callback func(err error)) { var findPlayer *model.PlayerBaseInfo task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { diff --git a/worldsrv/scenepolicydata.go b/worldsrv/scenepolicydata.go index 015e7b0..2aa2754 100644 --- a/worldsrv/scenepolicydata.go +++ b/worldsrv/scenepolicydata.go @@ -2,6 +2,8 @@ package main import ( "math" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/game/common" "mongo.games.com/game/model" hallproto "mongo.games.com/game/protocol/gamehall" @@ -29,6 +31,10 @@ func (spd *ScenePolicyData) OnStart(s *Scene) { // 场景关闭事件 func (spd *ScenePolicyData) OnStop(s *Scene) { s.NotifyPrivateRoom(common.ListDel) + // 房主付费,房间没有玩就解散了,返还房主建房费用 + if s.IsCustom() && s.GetCostType() == 1 && s.currRound == 0 { + spd.GiveCostPayment(s, s.creator) + } } // 场景心跳事件 @@ -60,8 +66,10 @@ func (spd *ScenePolicyData) OnSceneState(s *Scene, state int) { case common.SceneStateStart: s.NotifyPrivateRoom(common.ListModify) if s.IsCustom() { - for _, v := range s.players { - spd.CostPayment(s, v) + if s.GetCostType() == 2 { + for _, v := range s.players { + spd.CostPayment(s, v) + } } } @@ -85,13 +93,13 @@ func (spd *ScenePolicyData) CanEnter(s *Scene, p *Player) int { return 0 } -func (spd *ScenePolicyData) costEnough(costType, playerNum int, roomConfig *webapi.RoomConfig, p *Player, f func(items []*model.Item)) bool { +func (spd *ScenePolicyData) costEnough(costType, playerNum int, roomConfig *webapi.RoomConfig, snid int32, f func(items []*model.Item)) bool { isEnough := true var items []*model.Item if costType == 1 { // 房主 for _, v := range roomConfig.GetCost() { - if item := BagMgrSingleton.GetItem(p.SnId, v.GetItemId()); item == nil || item.ItemNum < v.GetItemNum() { + if item := BagMgrSingleton.GetItem(snid, v.GetItemId()); item == nil || item.ItemNum < v.GetItemNum() { isEnough = false break } else { @@ -105,7 +113,7 @@ func (spd *ScenePolicyData) costEnough(costType, playerNum int, roomConfig *weba // AA for _, v := range roomConfig.GetCost() { n := int64(math.Ceil(float64(v.GetItemNum()) / float64(playerNum))) - if item := BagMgrSingleton.GetItem(p.SnId, v.GetItemId()); item == nil || item.ItemNum < n { + if item := BagMgrSingleton.GetItem(snid, v.GetItemId()); item == nil || item.ItemNum < n { isEnough = false break } else { @@ -126,7 +134,7 @@ func (spd *ScenePolicyData) CostEnough(costType, playerNum int, roomConfig *weba if roomConfig == nil { return false } - return spd.costEnough(costType, playerNum, roomConfig, p, func(items []*model.Item) {}) + return spd.costEnough(costType, playerNum, roomConfig, p.SnId, func(items []*model.Item) {}) } func (spd *ScenePolicyData) CostPayment(s *Scene, p *Player) bool { @@ -134,7 +142,10 @@ func (spd *ScenePolicyData) CostPayment(s *Scene, p *Player) bool { if roomConfig == nil { return false } - return spd.costEnough(int(roomConfig.GetCostType()), s.playerNum, roomConfig, p, func(items []*model.Item) { + return spd.costEnough(int(roomConfig.GetCostType()), s.playerNum, roomConfig, p.SnId, func(items []*model.Item) { + for _, v := range items { + v.ItemNum = -v.ItemNum + } BagMgrSingleton.AddItemsV2(&model.AddItemParam{ P: p.PlayerData, Change: items, @@ -148,6 +159,47 @@ func (spd *ScenePolicyData) CostPayment(s *Scene, p *Player) bool { }) } +// GiveCostPayment 退房费 +func (spd *ScenePolicyData) GiveCostPayment(s *Scene, snid int32) bool { + roomConfig := PlatformMgrSingleton.GetConfig(s.limitPlatform.IdStr).RoomConfig[s.GetRoomConfigId()] + if roomConfig == nil { + return false + } + + if roomConfig.GetCostType() != 1 { // 只有房主付费才有返还 + return false + } + + var items []*model.Item + for _, v := range roomConfig.GetCost() { + items = append(items, &model.Item{ + ItemId: v.GetItemId(), + ItemNum: v.GetItemNum(), + }) + } + + p := PlayerMgrSington.GetPlayerBySnId(snid) + if p != nil { + BagMgrSingleton.AddItemsV2(&model.AddItemParam{ + P: p.PlayerData, + Change: items, + GainWay: common.GainWayRoomCost, + Operator: "system", + Remark: "竞技场房间费用返还", + GameId: int64(s.gameId), + GameFreeId: int64(s.dbGameFree.GetId()), + NoLog: false, + RoomConfigId: roomConfig.GetId(), + }) + } else { + BagMgrSingleton.AddItemsOffline(s.limitPlatform.IdStr, snid, items, common.GainWayRoomCost, "system", + "竞技场费用返还", int64(s.gameId), int64(s.dbGameFree.GetId()), false, func(err error) { + logger.Logger.Errorf("竞技场房间费用返还失败, err: %v", err) + }) + } + return false +} + func (spd *ScenePolicyData) GetBetState() int32 { return spd.BetState } diff --git a/worldsrv/trascate_webapi.go b/worldsrv/trascate_webapi.go index 7106457..454fedd 100644 --- a/worldsrv/trascate_webapi.go +++ b/worldsrv/trascate_webapi.go @@ -3375,19 +3375,25 @@ func init() { } addvcoin := msg.NeedNum jPrice := msg.JPrice - var items []*Item + var items []*model.Item //V卡 if addvcoin > 0 { - items = append(items, &Item{ItemId: common.ItemIDVCard, ItemNum: int64(addvcoin)}) + items = append(items, &model.Item{ItemId: common.ItemIDVCard, ItemNum: int64(addvcoin)}) } //金券 if jPrice > 0 { - items = append(items, &Item{ItemId: common.ItemIDJCard, ItemNum: int64(jPrice)}) + items = append(items, &model.Item{ItemId: common.ItemIDJCard, ItemNum: int64(jPrice)}) } remark := fmt.Sprintf("兑换撤单 %v-%v", msg.GoodsId, msg.Name) if player != nil { // 在线 - if _, code, _ := BagMgrSingleton.AddItems(player, items, 0, common.GainWay_Exchange, "system", remark, 0, 0, false); code != bag.OpResultCode_OPRC_Sucess { // 领取失败 + if _, code, _ := BagMgrSingleton.AddItemsV2(&model.AddItemParam{ + P: player.PlayerData, + Change: items, + GainWay: common.GainWay_Exchange, + Operator: "system", + Remark: remark, + }); code != bag.OpResultCode_OPRC_Sucess { // 领取失败 logger.Logger.Errorf("UpExchangeStatus AddItems err", code) pack.Msg = "AddItems err" return common.ResponseTag_ParamError, pack @@ -3744,9 +3750,9 @@ func init() { pack.Msg = "参数错误" return common.ResponseTag_ParamError, pack } - var items []*Item + var items []*model.Item for _, info := range msg.ItemInfo { - items = append(items, &Item{ + items = append(items, &model.Item{ ItemId: info.ItemId, // 物品id ItemNum: info.ItemNum, // 数量 ObtainTime: time.Now().Unix(), @@ -3755,7 +3761,13 @@ func init() { p := PlayerMgrSington.GetPlayerBySnId(msg.GetSnid()) if p != nil { //获取道具Id - BagMgrSingleton.AddItems(p, items, 0, msg.GetTypeId(), "system", msg.GetRemark(), 0, 0, false) + BagMgrSingleton.AddItemsV2(&model.AddItemParam{ + P: p.PlayerData, + Change: items, + GainWay: msg.GetTypeId(), + Operator: "system", + Remark: msg.GetRemark(), + }) pack.Tag = webapiproto.TagCode_SUCCESS pack.Msg = "AddItem success" return common.ResponseTag_Ok, pack From 6a9c6a988b1069de06f7ee8d210a5f356f9715ca Mon Sep 17 00:00:00 2001 From: kxdd Date: Mon, 2 Sep 2024 16:23:45 +0800 Subject: [PATCH 44/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E8=8E=B7?= =?UTF-8?q?=E5=8F=96token=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/action_clawdoll.go | 3 +- gamesrv/clawdoll/scenepolicy_clawdoll.go | 36 +++++++++++ machine/action/action_server.go | 3 + protocol/machine/machine.pb.go | 78 +++++++++++++++--------- protocol/machine/machine.proto | 2 + 5 files changed, 91 insertions(+), 31 deletions(-) diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index fa25bf6..7036746 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -92,6 +92,7 @@ func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interf } pack := &machine.SMGetToken{} pack.Snid = p.SnId + pack.Sid = p.GetSid() scene := p.GetScene() if scene == nil { @@ -122,7 +123,7 @@ func MSSendTokenHandler(session *netlib.Session, packetId int, data interface{}) if msg, ok := data.(*machine.MSSendToken); ok { //给客户端返回token token := msg.Token - p := base.PlayerMgrSington.GetPlayer(int64(msg.Snid)) + p := base.PlayerMgrSington.GetPlayer(int64(msg.GetSid())) if p == nil { logger.Logger.Warn("MSSendTokenHandler p == nil") return nil diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 4128a09..6246929 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -3,6 +3,7 @@ package clawdoll import ( "mongo.games.com/game/gamesrv/action" "mongo.games.com/game/protocol/clawdoll" + "mongo.games.com/game/protocol/machine" "time" "mongo.games.com/goserver/core" @@ -117,6 +118,8 @@ func (this *PolicyClawdoll) OnPlayerEnter(s *base.Scene, p *base.Player) { // 玩家数据发送 sceneEx.OnPlayerEnter(p, 0) + + this.SendGetVideoToken(s, p, sceneEx) s.FirePlayerEvent(p, base.PlayerEventEnter, nil) } } @@ -173,6 +176,8 @@ func (this *PolicyClawdoll) OnPlayerRehold(s *base.Scene, p *base.Player) { this.SendRoomInfo(s, p, sceneEx) ClawdollBroadcastRoomWaitPlayers(s) ClawdollBroadcastPlayingInfo(s) + + this.SendGetVideoToken(s, p, sceneEx) s.FirePlayerEvent(p, base.PlayerEventRehold, nil) } } @@ -193,6 +198,7 @@ func (this *PolicyClawdoll) OnPlayerReturn(s *base.Scene, p *base.Player) { ClawdollBroadcastRoomWaitPlayers(s) ClawdollBroadcastPlayingInfo(s) + this.SendGetVideoToken(s, p, sceneEx) s.FirePlayerEvent(p, base.PlayerEventReturn, nil) } } @@ -256,11 +262,41 @@ func (this *PolicyClawdoll) CanChangeCoinScene(s *base.Scene, p *base.Player) bo } func (this *PolicyClawdoll) SendRoomInfo(s *base.Scene, p *base.Player, sceneEx *SceneEx) { + if s == nil || p == nil || sceneEx == nil { + return + } + pack := sceneEx.ClawdollCreateRoomInfoPacket(s, p) p.SendToClient(int(clawdoll.CLAWDOLLPacketID_PACKET_SC_ROOMINFO), pack) } +func (this *PolicyClawdoll) SendGetVideoToken(s *base.Scene, p *base.Player, sceneEx *SceneEx) { + //转发到娃娃机主机 + if s == nil || p == nil || sceneEx == nil { + return + } + logger.Logger.Tracef("ClawdollGetVideoToken") + if p == nil { + logger.Logger.Warn("ClawdollGetVideoToken p == nil") + return + } + pack := &machine.SMGetToken{} + pack.Snid = p.SnId + pack.Sid = p.GetSid() + + machineId := s.DbGameFree.GetId() % 6080000 + appId, serverSecret := sceneEx.GetMachineServerSecret(machineId, p.Platform) + logger.Logger.Tracef("获取娃娃机 appId = %v, serverSecret = %v", appId, serverSecret) + if serverSecret == "" || appId == 0 { + return + } + + pack.ServerSecret = serverSecret + pack.AppId = appId + sceneEx.SendToMachine(int(machine.DollMachinePacketID_PACKET_SMGetToken), pack) +} + // 广播房间状态 func ClawdollBroadcastRoomState(s *base.Scene, params ...float32) { pack := &clawdoll.SCCLAWDOLLRoomState{ diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 7f7acd6..561f364 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -300,6 +300,9 @@ func SMGetTokenHandler(session *netlib.Session, packetId int, data interface{}) info := &machine.MSSendToken{} info.Snid = msg.Snid info.Token = token + info.Sid = msg.GetSid() + info.Appid = msg.AppId + session.Send(int(machine.DollMachinePacketID_PACKET_MSSendToken), info) logger.Logger.Tracef("向游戏服务器发送娃娃机token:%v", info) return nil diff --git a/protocol/machine/machine.pb.go b/protocol/machine/machine.pb.go index 464b384..39a1133 100644 --- a/protocol/machine/machine.pb.go +++ b/protocol/machine/machine.pb.go @@ -505,6 +505,7 @@ type SMGetToken struct { Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` AppId int64 `protobuf:"varint,2,opt,name=AppId,proto3" json:"AppId,omitempty"` ServerSecret string `protobuf:"bytes,3,opt,name=ServerSecret,proto3" json:"ServerSecret,omitempty"` + Sid int64 `protobuf:"varint,4,opt,name=Sid,proto3" json:"Sid,omitempty"` } func (x *SMGetToken) Reset() { @@ -560,6 +561,13 @@ func (x *SMGetToken) GetServerSecret() string { return "" } +func (x *SMGetToken) GetSid() int64 { + if x != nil { + return x.Sid + } + return 0 +} + //返回token type MSSendToken struct { state protoimpl.MessageState @@ -569,6 +577,7 @@ type MSSendToken struct { Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` Appid int64 `protobuf:"varint,2,opt,name=Appid,proto3" json:"Appid,omitempty"` Token string `protobuf:"bytes,3,opt,name=Token,proto3" json:"Token,omitempty"` + Sid int64 `protobuf:"varint,4,opt,name=Sid,proto3" json:"Sid,omitempty"` } func (x *MSSendToken) Reset() { @@ -624,6 +633,13 @@ func (x *MSSendToken) GetToken() string { return "" } +func (x *MSSendToken) GetSid() int64 { + if x != nil { + return x.Sid + } + return 0 +} + var File_machine_proto protoreflect.FileDescriptor var file_machine_proto_rawDesc = []byte{ @@ -661,40 +677,42 @@ var file_machine_proto_rawDesc = []byte{ 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, - 0x64, 0x64, 0x72, 0x22, 0x5a, 0x0a, 0x0a, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x64, 0x64, 0x72, 0x22, 0x6c, 0x0a, 0x0a, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, - 0x4d, 0x0a, 0x0b, 0x4d, 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, - 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0xb9, - 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5a, 0x65, - 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, - 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, - 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0xa4, 0x9c, 0x01, 0x12, 0x27, - 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x6f, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x10, 0xa5, 0x9c, 0x01, 0x12, 0x17, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0xa6, 0x9c, 0x01, - 0x12, 0x18, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x53, 0x65, 0x6e, - 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0xa7, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, - 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x53, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x53, 0x69, + 0x64, 0x22, 0x5f, 0x0a, 0x0b, 0x4d, 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x53, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x53, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x53, + 0x69, 0x64, 0x2a, 0xb9, 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, + 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0xa4, + 0x9c, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, + 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x6f, 0x50, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x10, 0xa5, 0x9c, 0x01, 0x12, 0x17, 0x0a, 0x11, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x10, 0xa6, 0x9c, 0x01, 0x12, 0x18, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, + 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0xa7, 0x9c, 0x01, 0x42, 0x27, + 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protocol/machine/machine.proto b/protocol/machine/machine.proto index 472cb4b..5cbb18e 100644 --- a/protocol/machine/machine.proto +++ b/protocol/machine/machine.proto @@ -64,10 +64,12 @@ message SMGetToken{ int32 Snid = 1; int64 AppId = 2; string ServerSecret = 3; + int64 Sid = 4; } //返回token message MSSendToken{ int32 Snid = 1; int64 Appid = 2; string Token = 3; + int64 Sid = 4; } \ No newline at end of file From 151a739dab201f7bbbb9cdf49647248a52cf2917 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 2 Sep 2024 16:25:46 +0800 Subject: [PATCH 45/56] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worldsrv/scene.go | 6 ++++++ worldsrv/scenemgr.go | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/worldsrv/scene.go b/worldsrv/scene.go index cba5275..333f90e 100644 --- a/worldsrv/scene.go +++ b/worldsrv/scene.go @@ -135,6 +135,12 @@ func NewScene(args *CreateSceneParam) *Scene { } } } + if s.MatchParam == nil { + s.MatchParam = new(serverproto.MatchParam) + } + if s.CustomParam == nil { + s.CustomParam = new(serverproto.CustomParam) + } s.sp.OnStart(s) return s } diff --git a/worldsrv/scenemgr.go b/worldsrv/scenemgr.go index 864f2ca..42c33e6 100644 --- a/worldsrv/scenemgr.go +++ b/worldsrv/scenemgr.go @@ -155,7 +155,7 @@ func (m *SceneMgr) GetScenesByGameFreeId(gameFreeId int32) []*Scene { func (m *SceneMgr) GetMatchRoom(sortId int64) []*Scene { var scenes []*Scene for _, value := range m.scenes { - if value.MatchSortId == sortId { + if value.GetMatchSortId() == sortId { s := m.GetScene(value.sceneId) if s != nil { scenes = append(scenes, value) From d2c5c4f1599d81ad5832931912b4416225a7ea52 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 2 Sep 2024 17:31:45 +0800 Subject: [PATCH 46/56] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E7=A4=BC=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbproxy/svc/l_jybuser.go | 6 ++++-- model/jyb.go | 2 +- worldsrv/hundredscenemgr.go | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dbproxy/svc/l_jybuser.go b/dbproxy/svc/l_jybuser.go index efa1a00..a8dc343 100644 --- a/dbproxy/svc/l_jybuser.go +++ b/dbproxy/svc/l_jybuser.go @@ -156,10 +156,12 @@ func upJybUser(cjybuse, cjyb *mongo.Collection, snId, codeType int32, plt, useCo if jybuser.JybInfos == nil { jybuser.JybInfos = make(map[string]int32) } else if _, exist := jybuser.JybInfos[jybuseerid]; exist { // 该类型礼包玩家已经领取过 - return model.ErrJYBPlCode + if ret.CodeType != 3 { + return model.ErrJYBPlCode + } } - jybuser.JybInfos[jybuseerid] = 1 + jybuser.JybInfos[jybuseerid]++ err = cjybuse.Update(bson.M{"_id": jybuser.JybUserId}, bson.D{{"$set", bson.D{{"jybinfos", jybuser.JybInfos}}}}) if err != nil { diff --git a/model/jyb.go b/model/jyb.go index c365ef4..78b60f0 100644 --- a/model/jyb.go +++ b/model/jyb.go @@ -53,7 +53,7 @@ type JybInfo struct { JybId bson.ObjectId `bson:"_id"` // 礼包ID Platform string //平台 Name string // 礼包名称 - CodeType int32 // 礼包类型 1 通用 2 特殊 + CodeType int32 // 礼包类型 1 通用 2专属(自动生成兑换码,每个玩家领一个) 3活动(自动生产兑换码,每个兑换码领一个) StartTime int64 // 开始时间 Unix EndTime int64 // 结束时间 Content string // 礼包内容 diff --git a/worldsrv/hundredscenemgr.go b/worldsrv/hundredscenemgr.go index 2766caa..70c59e0 100644 --- a/worldsrv/hundredscenemgr.go +++ b/worldsrv/hundredscenemgr.go @@ -346,7 +346,7 @@ func (this *HundredSceneMgr) ModuleName() string { } func (this *HundredSceneMgr) Init() { - this.TryCreateRoom() + //this.TryCreateRoom() } func (this *HundredSceneMgr) Update() { From 05a54af2db8c5218d6fdf4a9720e87f690864ae9 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 2 Sep 2024 17:31:45 +0800 Subject: [PATCH 47/56] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E7=A4=BC=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbproxy/svc/l_jybuser.go | 6 ++++-- model/config.go | 4 ++-- model/jyb.go | 2 +- worldsrv/hundredscenemgr.go | 2 +- worldsrv/shopmgr.go | 30 +++++++++++++++--------------- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/dbproxy/svc/l_jybuser.go b/dbproxy/svc/l_jybuser.go index efa1a00..a8dc343 100644 --- a/dbproxy/svc/l_jybuser.go +++ b/dbproxy/svc/l_jybuser.go @@ -156,10 +156,12 @@ func upJybUser(cjybuse, cjyb *mongo.Collection, snId, codeType int32, plt, useCo if jybuser.JybInfos == nil { jybuser.JybInfos = make(map[string]int32) } else if _, exist := jybuser.JybInfos[jybuseerid]; exist { // 该类型礼包玩家已经领取过 - return model.ErrJYBPlCode + if ret.CodeType != 3 { + return model.ErrJYBPlCode + } } - jybuser.JybInfos[jybuseerid] = 1 + jybuser.JybInfos[jybuseerid]++ err = cjybuse.Update(bson.M{"_id": jybuser.JybUserId}, bson.D{{"$set", bson.D{{"jybinfos", jybuser.JybInfos}}}}) if err != nil { diff --git a/model/config.go b/model/config.go index bd47bb1..0ccec47 100644 --- a/model/config.go +++ b/model/config.go @@ -34,7 +34,7 @@ const ( type ShopInfo struct { Id int32 // 商品ID - Page int32 // 页面 1,金币页面 2,钻石页面 3,道具页面 + Page int32 // 页面 1,金币页面 2,钻石页面 3,道具页面 4,房卡 Order int32 // 排序 页面内商品的位置排序 Location []int32 // 显示位置 第1位,竖版大厅 第2位,Tienlen1级选场 第3位,捕鱼1级选场 Picture string // 图片id @@ -44,7 +44,7 @@ type ShopInfo struct { AdTime int32 // 观看几次广告 RepeatTimes int32 // 领取次数 CoolingTime []int32 // 观看冷却时间 - Type int32 // 获得类型 1,金币 2,钻石 3,道具类型 + Type int32 // 获得类型 1,金币 2,钻石 3,道具类型 4,房卡 Amount int64 // 获得数量 AddArea []int32 // 加送百分比(比如加送10%,就配置110) ItemId int32 // 获得道具ID diff --git a/model/jyb.go b/model/jyb.go index c365ef4..78b60f0 100644 --- a/model/jyb.go +++ b/model/jyb.go @@ -53,7 +53,7 @@ type JybInfo struct { JybId bson.ObjectId `bson:"_id"` // 礼包ID Platform string //平台 Name string // 礼包名称 - CodeType int32 // 礼包类型 1 通用 2 特殊 + CodeType int32 // 礼包类型 1 通用 2专属(自动生成兑换码,每个玩家领一个) 3活动(自动生产兑换码,每个兑换码领一个) StartTime int64 // 开始时间 Unix EndTime int64 // 结束时间 Content string // 礼包内容 diff --git a/worldsrv/hundredscenemgr.go b/worldsrv/hundredscenemgr.go index 2766caa..70c59e0 100644 --- a/worldsrv/hundredscenemgr.go +++ b/worldsrv/hundredscenemgr.go @@ -346,7 +346,7 @@ func (this *HundredSceneMgr) ModuleName() string { } func (this *HundredSceneMgr) Init() { - this.TryCreateRoom() + //this.TryCreateRoom() } func (this *HundredSceneMgr) Update() { diff --git a/worldsrv/shopmgr.go b/worldsrv/shopmgr.go index 5cce9b1..a296bee 100644 --- a/worldsrv/shopmgr.go +++ b/worldsrv/shopmgr.go @@ -63,6 +63,8 @@ const ( ShopTypeCoin = iota + 1 // 金币 ShopTypeDiamond // 钻石 ShopTypeItem // 道具 + ShopTypeFangKa // 房卡 + ShopTypeMax ) // 兑换商品状态 @@ -539,10 +541,10 @@ func (this *ShopMgr) shopAddItem(p *Player, shopInfo *model.ShopInfo, vipShopId // createOrder 保存购买记录 func (this *ShopMgr) createOrder(p *Player, shopInfo *model.ShopInfo, costNum int64, amount [3]int32) { - if shopInfo.Type < ShopTypeCoin && shopInfo.Type > ShopTypeItem { - logger.Logger.Errorf("createOrder err: type = %v", shopInfo.Type) - return - } + //if shopInfo.Type < ShopTypeCoin && shopInfo.Type >= ShopTypeMax { + // logger.Logger.Errorf("createOrder err: type = %v", shopInfo.Type) + // return + //} task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { dbShop := model.NewDbShop(p.Platform, shopInfo.Page, amount[:], "sys", 0, shopInfo.ConstType, int32(costNum), @@ -1228,17 +1230,15 @@ func (this *ShopMgr) SendAPICreateOrder(p *Player, ConfigPayId int32, data any, amount[ShopTypeDiamond-1] = int32(addTotal) var itemInfo []model.ItemInfo var webItemInfo []*webapi_proto.ItemInfo - if shopInfo.AddItemInfo != nil { - for _, info := range shopInfo.AddItemInfo { - itemInfo = append(itemInfo, model.ItemInfo{ - ItemId: info.ItemId, - ItemNum: int64(info.ItemNum), - }) - webItemInfo = append(webItemInfo, &webapi_proto.ItemInfo{ - ItemId: info.ItemId, - ItemNum: info.ItemNum, - }) - } + for _, info := range shopInfo.GetItems() { + itemInfo = append(itemInfo, model.ItemInfo{ + ItemId: info.ItemId, + ItemNum: info.ItemNum, + }) + webItemInfo = append(webItemInfo, &webapi_proto.ItemInfo{ + ItemId: info.ItemId, + ItemNum: info.ItemNum, + }) } dbShop = this.NewDbShop(p, shopInfo.Page, amount[:], ShopConsumeMoney, costNum, From 5c6dce2f4db7631de8ab309d2b60e53f658d8190 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 3 Sep 2024 10:54:28 +0800 Subject: [PATCH 48/56] =?UTF-8?q?=E6=88=BF=E5=8D=A1=E5=9C=BA=E4=B8=AD?= =?UTF-8?q?=E9=80=94=E4=B8=8D=E8=83=BD=E7=A6=BB=E5=BC=80=E6=88=BF=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/tienlen/scenepolicy_tienlen.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gamesrv/tienlen/scenepolicy_tienlen.go b/gamesrv/tienlen/scenepolicy_tienlen.go index a64bbd5..46bf98c 100644 --- a/gamesrv/tienlen/scenepolicy_tienlen.go +++ b/gamesrv/tienlen/scenepolicy_tienlen.go @@ -2765,7 +2765,10 @@ func (this *SceneBilledStateTienLen) OnLeave(s *base.Scene) { continue } player_data.Clear() - if sceneEx.IsMatchScene() { + if sceneEx.IsCustom() { + player_data.UnmarkFlag(base.PlayerState_WaitNext) + } + if sceneEx.IsMatchScene() || sceneEx.IsCustom() { continue } if !player_data.IsOnLine() { From 034abb64e2c373d6ccfd23edc514600f09d196f9 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Tue, 3 Sep 2024 11:20:49 +0800 Subject: [PATCH 49/56] =?UTF-8?q?=E7=89=8C=E5=B1=80=E5=9B=9E=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/base/scene.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gamesrv/base/scene.go b/gamesrv/base/scene.go index fd3f0f7..592b308 100644 --- a/gamesrv/base/scene.go +++ b/gamesrv/base/scene.go @@ -117,6 +117,8 @@ func NewScene(args *CreateSceneParam) *Scene { KeyGameDif: args.GetDBGameFree().GetGameDif(), } s.CycleID, _ = model.AutoIncGameLogId() + s.rrVer = ReplayRecorderVer[gameId] + s.RecordReplayStart() s.init() return s } From ddcaa62f136cc4aea4b60be66757ad7cf05fd6a8 Mon Sep 17 00:00:00 2001 From: kxdd Date: Tue, 3 Sep 2024 15:10:41 +0800 Subject: [PATCH 50/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/action_clawdoll.go | 29 ++++++++- gamesrv/clawdoll/player_clawdoll.go | 13 +++- gamesrv/clawdoll/scenepolicy_clawdoll.go | 14 +---- machine/action/action_server.go | 1 - protocol/machine/machine.pb.go | 78 +++++++++--------------- protocol/machine/machine.proto | 2 - 6 files changed, 68 insertions(+), 69 deletions(-) diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index 7036746..b0078c4 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -2,6 +2,7 @@ package clawdoll import ( "mongo.games.com/game/common" + rule "mongo.games.com/game/gamerule/clawdoll" "mongo.games.com/game/gamesrv/base" "mongo.games.com/game/protocol/clawdoll" "mongo.games.com/game/protocol/machine" @@ -52,6 +53,22 @@ func (h *CSPlayerOpHandler) Process(s *netlib.Session, packetid int, data interf func MSDollMachineoCoinResultHandler(session *netlib.Session, packetId int, data interface{}) error { logger.Logger.Tracef("收到返回上分结果!!!!!!!!!!") if msg, ok := data.(*machine.MSDollMachineoPerateResult); ok { + + p := base.PlayerMgrSington.GetPlayerBySnId(msg.GetSnid()) + if p == nil { + logger.Logger.Warn("CSGetTokenHandler p == nil") + return nil + } + + scene := p.GetScene() + if scene == nil { + return nil + } + sceneEx, ok := scene.ExtraData.(*SceneEx) + if !ok { + return nil + } + switch msg.TypeId { case 1: if msg.Result == 1 { @@ -61,10 +78,17 @@ func MSDollMachineoCoinResultHandler(session *netlib.Session, packetId int, data } case 2: if msg.Result == 1 { - logger.Logger.Tracef("下抓成功!!!!!!!!!!!!snid = ", msg.Snid) + } else { logger.Logger.Tracef("下抓失败!!!!!!!!!!!!snid = ", msg.Snid) } + + scene.ChangeSceneState(rule.ClawDollSceneStateBilled) + + sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateBilled)) + + ClawdollBroadcastRoomState(scene) + ClawdollSendPlayerInfo(scene) } } return nil @@ -92,7 +116,6 @@ func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interf } pack := &machine.SMGetToken{} pack.Snid = p.SnId - pack.Sid = p.GetSid() scene := p.GetScene() if scene == nil { @@ -123,7 +146,7 @@ func MSSendTokenHandler(session *netlib.Session, packetId int, data interface{}) if msg, ok := data.(*machine.MSSendToken); ok { //给客户端返回token token := msg.Token - p := base.PlayerMgrSington.GetPlayer(int64(msg.GetSid())) + p := base.PlayerMgrSington.GetPlayerBySnId(msg.GetSnid()) if p == nil { logger.Logger.Warn("MSSendTokenHandler p == nil") return nil diff --git a/gamesrv/clawdoll/player_clawdoll.go b/gamesrv/clawdoll/player_clawdoll.go index 34f3441..2fb434e 100644 --- a/gamesrv/clawdoll/player_clawdoll.go +++ b/gamesrv/clawdoll/player_clawdoll.go @@ -11,9 +11,10 @@ type PlayerEx struct { clawDollState int32 // 抓娃娃状态 dollCardsCnt int32 // 娃娃卡数量 - gainCoin int64 // 本局赢的金币 - taxCoin int64 // 本局税收 - odds int32 + winDollCardType int32 // 本局赢取娃娃的类型 + gainCoin int64 // 本局赢的金币 + taxCoin int64 // 本局税收 + odds int32 } func (this *PlayerEx) Clear(baseScore int32) { @@ -39,6 +40,12 @@ func (this *PlayerEx) CanPayCoin() bool { return true } +// 投币消耗 +func (this *PlayerEx) CostPlayCoin() bool { + + return true +} + // 能否移动 func (this *PlayerEx) CanMove() bool { diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 6246929..114e41c 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -283,7 +283,6 @@ func (this *PolicyClawdoll) SendGetVideoToken(s *base.Scene, p *base.Player, sce } pack := &machine.SMGetToken{} pack.Snid = p.SnId - pack.Sid = p.GetSid() machineId := s.DbGameFree.GetId() % 6080000 appId, serverSecret := sceneEx.GetMachineServerSecret(machineId, p.Platform) @@ -419,6 +418,7 @@ func (this *BaseState) OnEnter(s *base.Scene) { func (this *BaseState) OnLeave(s *base.Scene) {} func (this *BaseState) OnTick(s *base.Scene) { + } func (this *BaseState) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { @@ -666,10 +666,6 @@ func (this *PlayGame) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, para //1-弱力抓 2 -强力抓 sceneEx.OnPlayerSMGrabOp(p.SnId, int32(sceneEx.machineId), grapType) - s.ChangeSceneState(rule.ClawDollSceneStateBilled) - - sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateBilled)) - case rule.ClawDollPlayerOpMove: if !sceneEx.CheckMoveOp(playerEx) { @@ -697,15 +693,9 @@ func (this *PlayGame) OnTick(s *base.Scene) { if time.Now().Sub(sceneEx.StateStartTime) > rule.ClawDollScenePlayTimeout { if sceneEx.TimeOutPlayGrab() { - + logger.Logger.Trace("PlayGame OnTick TimeOutPlayGrab SnId", sceneEx.playingSnid, " machineId:", sceneEx.machineId) } - s.ChangeSceneState(rule.ClawDollSceneStateBilled) - - sceneEx.SetPlayingState(int32(rule.ClawDollSceneStateBilled)) - - ClawdollBroadcastRoomState(s) - ClawdollSendPlayerInfo(s) return } } diff --git a/machine/action/action_server.go b/machine/action/action_server.go index 561f364..ea9d138 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -300,7 +300,6 @@ func SMGetTokenHandler(session *netlib.Session, packetId int, data interface{}) info := &machine.MSSendToken{} info.Snid = msg.Snid info.Token = token - info.Sid = msg.GetSid() info.Appid = msg.AppId session.Send(int(machine.DollMachinePacketID_PACKET_MSSendToken), info) diff --git a/protocol/machine/machine.pb.go b/protocol/machine/machine.pb.go index 39a1133..464b384 100644 --- a/protocol/machine/machine.pb.go +++ b/protocol/machine/machine.pb.go @@ -505,7 +505,6 @@ type SMGetToken struct { Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` AppId int64 `protobuf:"varint,2,opt,name=AppId,proto3" json:"AppId,omitempty"` ServerSecret string `protobuf:"bytes,3,opt,name=ServerSecret,proto3" json:"ServerSecret,omitempty"` - Sid int64 `protobuf:"varint,4,opt,name=Sid,proto3" json:"Sid,omitempty"` } func (x *SMGetToken) Reset() { @@ -561,13 +560,6 @@ func (x *SMGetToken) GetServerSecret() string { return "" } -func (x *SMGetToken) GetSid() int64 { - if x != nil { - return x.Sid - } - return 0 -} - //返回token type MSSendToken struct { state protoimpl.MessageState @@ -577,7 +569,6 @@ type MSSendToken struct { Snid int32 `protobuf:"varint,1,opt,name=Snid,proto3" json:"Snid,omitempty"` Appid int64 `protobuf:"varint,2,opt,name=Appid,proto3" json:"Appid,omitempty"` Token string `protobuf:"bytes,3,opt,name=Token,proto3" json:"Token,omitempty"` - Sid int64 `protobuf:"varint,4,opt,name=Sid,proto3" json:"Sid,omitempty"` } func (x *MSSendToken) Reset() { @@ -633,13 +624,6 @@ func (x *MSSendToken) GetToken() string { return "" } -func (x *MSSendToken) GetSid() int64 { - if x != nil { - return x.Sid - } - return 0 -} - var File_machine_proto protoreflect.FileDescriptor var file_machine_proto_rawDesc = []byte{ @@ -677,42 +661,40 @@ var file_machine_proto_rawDesc = []byte{ 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x41, - 0x64, 0x64, 0x72, 0x22, 0x6c, 0x0a, 0x0a, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x64, 0x64, 0x72, 0x22, 0x5a, 0x0a, 0x0a, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x53, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x53, 0x69, - 0x64, 0x22, 0x5f, 0x0a, 0x0b, 0x4d, 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x53, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x53, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x53, - 0x69, 0x64, 0x2a, 0xb9, 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x65, 0x64, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x47, 0x72, 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, - 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0xa4, - 0x9c, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, - 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x6f, 0x50, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x10, 0xa5, 0x9c, 0x01, 0x12, 0x17, 0x0a, 0x11, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x10, 0xa6, 0x9c, 0x01, 0x12, 0x18, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, - 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0xa7, 0x9c, 0x01, 0x42, 0x27, - 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, + 0x4d, 0x0a, 0x0b, 0x4d, 0x53, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2a, 0xb9, + 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5a, 0x65, + 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x4d, 0x47, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, + 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x4d, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x47, 0x72, + 0x61, 0x62, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x10, 0xa3, 0x9c, 0x01, 0x12, 0x26, 0x0a, 0x20, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x4d, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0xa4, 0x9c, 0x01, 0x12, 0x27, + 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x6f, 0x50, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x10, 0xa5, 0x9c, 0x01, 0x12, 0x17, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x4d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0xa6, 0x9c, 0x01, + 0x12, 0x18, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x53, 0x53, 0x65, 0x6e, + 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0xa7, 0x9c, 0x01, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, + 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protocol/machine/machine.proto b/protocol/machine/machine.proto index 5cbb18e..472cb4b 100644 --- a/protocol/machine/machine.proto +++ b/protocol/machine/machine.proto @@ -64,12 +64,10 @@ message SMGetToken{ int32 Snid = 1; int64 AppId = 2; string ServerSecret = 3; - int64 Sid = 4; } //返回token message MSSendToken{ int32 Snid = 1; int64 Appid = 2; string Token = 3; - int64 Sid = 4; } \ No newline at end of file From e7a60493416c9244a8c8f4afec7d133129239ca6 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Tue, 3 Sep 2024 15:12:24 +0800 Subject: [PATCH 51/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E9=85=8D=E7=BD=AE=20=E5=A2=9E=E5=8A=A0StreamId?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/webapi/common.pb.go | 30 ++++++++++++++++++++---------- protocol/webapi/common.proto | 1 + 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/protocol/webapi/common.pb.go b/protocol/webapi/common.pb.go index db47b49..f00c43a 100644 --- a/protocol/webapi/common.pb.go +++ b/protocol/webapi/common.pb.go @@ -8202,6 +8202,7 @@ type MachineInfo struct { MachineId int32 `protobuf:"varint,1,opt,name=MachineId,proto3" json:"MachineId,omitempty"` //娃娃机Id AppId int64 `protobuf:"varint,2,opt,name=AppId,proto3" json:"AppId,omitempty"` ServerSecret string `protobuf:"bytes,3,opt,name=ServerSecret,proto3" json:"ServerSecret,omitempty"` + StreamId string `protobuf:"bytes,4,opt,name=StreamId,proto3" json:"StreamId,omitempty"` } func (x *MachineInfo) Reset() { @@ -8257,6 +8258,13 @@ func (x *MachineInfo) GetServerSecret() string { return "" } +func (x *MachineInfo) GetStreamId() string { + if x != nil { + return x.StreamId + } + return "" +} + var File_common_proto protoreflect.FileDescriptor var file_common_proto_rawDesc = []byte{ @@ -9546,16 +9554,18 @@ var file_common_proto_rawDesc = []byte{ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x27, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x65, 0x0a, 0x0b, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x42, 0x26, 0x5a, 0x24, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2f, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x81, 0x01, 0x0a, 0x0b, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x22, 0x0a, + 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x42, 0x26, 0x5a, + 0x24, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x77, + 0x65, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protocol/webapi/common.proto b/protocol/webapi/common.proto index c3b53b9..e34b8b3 100644 --- a/protocol/webapi/common.proto +++ b/protocol/webapi/common.proto @@ -901,4 +901,5 @@ message MachineInfo{ int32 MachineId = 1; //娃娃机Id int64 AppId = 2; string ServerSecret = 3; + string StreamId = 4; } \ No newline at end of file From 59535c2015c00ca74c8b5bba946e346424c87468 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Tue, 3 Sep 2024 15:46:54 +0800 Subject: [PATCH 52/56] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/DB_GameFree.json | 46 ----- data/DB_PropExchange.dat | Bin 384 -> 384 bytes data/DB_Task.dat | Bin 5299 -> 5299 bytes protocol/webapi/common.pb.go | 371 +++++++++++++++++++++++++---------- 4 files changed, 270 insertions(+), 147 deletions(-) diff --git a/data/DB_GameFree.json b/data/DB_GameFree.json index 7dc842d..564a1f9 100644 --- a/data/DB_GameFree.json +++ b/data/DB_GameFree.json @@ -5463,52 +5463,6 @@ "PlayerWaterRate": 100, "BetWaterRate": 100 }, - { - "Id": 6080001, - "Name": "娃娃机", - "Title": "公共服", - "GameId": 608, - "GameRule": 60800, - "GameType": 1, - "SceneType": 1, - "Desc": "0", - "ShowType": 3, - "ShowId": 60800, - "BaseScore": 1000000, - "BetDec": "0", - "Ai": [ - 0 - ], - "MaxChip": 100000000, - "OtherIntParams": [ - 0 - ], - "Jackpot": [ - 0 - ], - "RobotNumRng": [ - 1, - 1 - ], - "RobotTakeCoin": [ - 80000, - 500000 - ], - "RobotLimitCoin": [ - 1000000, - 2000000 - ], - "BetLimit": 1000000, - "SameIpLimit": 1, - "GameDif": "608", - "GameClass": 1, - "PlatformName": "越南棋牌", - "MaxBetCoin": [ - 0 - ], - "PlayerWaterRate": 100, - "BetWaterRate": 100 - }, { "Id": 3010001, "Name": "财运神", diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat index da1a818deb15b21f90dfd22e217edec0842f838c..12cce5f4165edd740dfa268af25289251ffeba4c 100644 GIT binary patch delta 82 zcmZo*ZeX5JXnCcLS%6WBjpI6$z5%6gLFvm-`YM#Z2BmLKT&2KxYa*A*#A(74Ux`i@ HXUqfuHEb0Y delta 54 zcmZo*ZeX5J$as0;X>-O~6IUs4UTI?%V3cCxxHj>%jtG#x3gusi(zhlHGv)#S@O2Oz diff --git a/data/DB_Task.dat b/data/DB_Task.dat index f4201d072fd9f5f3f799a9bbb64688919b6fe0b0..f5a92be4c65bea8e256c4b0c15ec32c4d5e978b2 100644 GIT binary patch delta 295 zcmdn2xmk09p&$px!d^Ck1&8Fk*f^E|S*#PCOa&oK5ih7@FWbb9Q!tgiY*3YQo0Ay@ zn1E^*0kttA)J|?;{s&VGHuhp0vjEHF$t;#o(FqIrfkuEtnKs{LF=v|mnOkJD275o_ zWD$0e$)`E=p=L5e&3v$2Xfiiv#pLTeB9o_c7EdnW5Sy&Pr8{{$huG$1t`ern&72~W zU-NvEg*X?e9B4eqQOr?HjEr3N99Mu=iBERm6=ydzFwkH%V4r-BOPmKR>A-OnC@Bk) aoE*l-2Q*4>b1B~{#>vJUf}0Hlnppt;Yf)nW delta 317 zcmdn2xmk09p&%Q_l3q3eRxb{Yg+O}2A-Rc8rh-sTFPj%cT4Z9!DX2<0n95$Z&B=@c zOp{AEL?*X0{{~85Y-1K+fk_{dn>?At5-Q3B6`iny^bg2lB=3TiJ8)bD iDwhQ*pB%==2QhwgDc>qas7pnl<~MX!Z8i{SW&r>yaaMr< diff --git a/protocol/webapi/common.pb.go b/protocol/webapi/common.pb.go index a284f6a..bb8e8a7 100644 --- a/protocol/webapi/common.pb.go +++ b/protocol/webapi/common.pb.go @@ -8193,6 +8193,134 @@ func (x *GuideConfig) GetSkip() int32 { return 0 } +//娃娃机配置视频 +// etcd /game/machine_config +type MachineConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Platform string `protobuf:"bytes,1,opt,name=Platform,proto3" json:"Platform,omitempty"` // 平台 + Info []*MachineInfo `protobuf:"bytes,2,rep,name=Info,proto3" json:"Info,omitempty"` +} + +func (x *MachineConfig) Reset() { + *x = MachineConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_common_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineConfig) ProtoMessage() {} + +func (x *MachineConfig) ProtoReflect() protoreflect.Message { + mi := &file_common_proto_msgTypes[86] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineConfig.ProtoReflect.Descriptor instead. +func (*MachineConfig) Descriptor() ([]byte, []int) { + return file_common_proto_rawDescGZIP(), []int{86} +} + +func (x *MachineConfig) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +func (x *MachineConfig) GetInfo() []*MachineInfo { + if x != nil { + return x.Info + } + return nil +} + +type MachineInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MachineId int32 `protobuf:"varint,1,opt,name=MachineId,proto3" json:"MachineId,omitempty"` //娃娃机Id + AppId int64 `protobuf:"varint,2,opt,name=AppId,proto3" json:"AppId,omitempty"` + ServerSecret string `protobuf:"bytes,3,opt,name=ServerSecret,proto3" json:"ServerSecret,omitempty"` + StreamId string `protobuf:"bytes,4,opt,name=StreamId,proto3" json:"StreamId,omitempty"` +} + +func (x *MachineInfo) Reset() { + *x = MachineInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_common_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MachineInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MachineInfo) ProtoMessage() {} + +func (x *MachineInfo) ProtoReflect() protoreflect.Message { + mi := &file_common_proto_msgTypes[87] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MachineInfo.ProtoReflect.Descriptor instead. +func (*MachineInfo) Descriptor() ([]byte, []int) { + return file_common_proto_rawDescGZIP(), []int{87} +} + +func (x *MachineInfo) GetMachineId() int32 { + if x != nil { + return x.MachineId + } + return 0 +} + +func (x *MachineInfo) GetAppId() int64 { + if x != nil { + return x.AppId + } + return 0 +} + +func (x *MachineInfo) GetServerSecret() string { + if x != nil { + return x.ServerSecret + } + return "" +} + +func (x *MachineInfo) GetStreamId() string { + if x != nil { + return x.StreamId + } + return "" +} + // etcd /game/match_audience type MatchAudience struct { state protoimpl.MessageState @@ -8207,7 +8335,7 @@ type MatchAudience struct { func (x *MatchAudience) Reset() { *x = MatchAudience{} if protoimpl.UnsafeEnabled { - mi := &file_common_proto_msgTypes[86] + mi := &file_common_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8220,7 +8348,7 @@ func (x *MatchAudience) String() string { func (*MatchAudience) ProtoMessage() {} func (x *MatchAudience) ProtoReflect() protoreflect.Message { - mi := &file_common_proto_msgTypes[86] + mi := &file_common_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8233,7 +8361,7 @@ func (x *MatchAudience) ProtoReflect() protoreflect.Message { // Deprecated: Use MatchAudience.ProtoReflect.Descriptor instead. func (*MatchAudience) Descriptor() ([]byte, []int) { - return file_common_proto_rawDescGZIP(), []int{86} + return file_common_proto_rawDescGZIP(), []int{88} } func (x *MatchAudience) GetPlatform() string { @@ -8271,7 +8399,7 @@ type SpiritConfig struct { func (x *SpiritConfig) Reset() { *x = SpiritConfig{} if protoimpl.UnsafeEnabled { - mi := &file_common_proto_msgTypes[87] + mi := &file_common_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8284,7 +8412,7 @@ func (x *SpiritConfig) String() string { func (*SpiritConfig) ProtoMessage() {} func (x *SpiritConfig) ProtoReflect() protoreflect.Message { - mi := &file_common_proto_msgTypes[87] + mi := &file_common_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8297,7 +8425,7 @@ func (x *SpiritConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use SpiritConfig.ProtoReflect.Descriptor instead. func (*SpiritConfig) Descriptor() ([]byte, []int) { - return file_common_proto_rawDescGZIP(), []int{87} + return file_common_proto_rawDescGZIP(), []int{89} } func (x *SpiritConfig) GetPlatform() string { @@ -8337,7 +8465,7 @@ type RoomType struct { func (x *RoomType) Reset() { *x = RoomType{} if protoimpl.UnsafeEnabled { - mi := &file_common_proto_msgTypes[88] + mi := &file_common_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8350,7 +8478,7 @@ func (x *RoomType) String() string { func (*RoomType) ProtoMessage() {} func (x *RoomType) ProtoReflect() protoreflect.Message { - mi := &file_common_proto_msgTypes[88] + mi := &file_common_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8363,7 +8491,7 @@ func (x *RoomType) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomType.ProtoReflect.Descriptor instead. func (*RoomType) Descriptor() ([]byte, []int) { - return file_common_proto_rawDescGZIP(), []int{88} + return file_common_proto_rawDescGZIP(), []int{90} } func (x *RoomType) GetPlatform() string { @@ -8428,7 +8556,7 @@ type RoomConfig struct { func (x *RoomConfig) Reset() { *x = RoomConfig{} if protoimpl.UnsafeEnabled { - mi := &file_common_proto_msgTypes[89] + mi := &file_common_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8441,7 +8569,7 @@ func (x *RoomConfig) String() string { func (*RoomConfig) ProtoMessage() {} func (x *RoomConfig) ProtoReflect() protoreflect.Message { - mi := &file_common_proto_msgTypes[89] + mi := &file_common_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8454,7 +8582,7 @@ func (x *RoomConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomConfig.ProtoReflect.Descriptor instead. func (*RoomConfig) Descriptor() ([]byte, []int) { - return file_common_proto_rawDescGZIP(), []int{89} + return file_common_proto_rawDescGZIP(), []int{91} } func (x *RoomConfig) GetPlatform() string { @@ -9866,56 +9994,70 @@ var file_common_proto_rawDesc = []byte{ 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x4f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x22, 0x4f, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x41, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, + 0x05, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x22, 0x54, 0x0a, 0x0d, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x54, 0x73, 0x22, 0x4c, 0x0a, 0x0c, 0x53, 0x70, 0x69, 0x72, - 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x02, 0x4f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x55, 0x72, 0x6c, 0x22, 0x72, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, + 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x27, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x81, 0x01, + 0x0a, 0x0b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, + 0x09, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x41, + 0x70, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, + 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x22, 0x4f, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x64, 0x69, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, + 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, + 0x54, 0x73, 0x22, 0x4c, 0x0a, 0x0c, 0x53, 0x70, 0x69, 0x72, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, - 0x4f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x53, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x22, 0xcc, 0x03, 0x0a, 0x0a, 0x52, - 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, - 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x52, 0x6f, 0x6f, - 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x4f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, - 0x04, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x77, 0x65, - 0x62, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, - 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x74, 0x65, - 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, - 0x0d, 0x4f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x65, 0x65, 0x49, - 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x65, - 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x50, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x4e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x65, 0x64, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4e, - 0x65, 0x65, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x43, - 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x43, - 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x6f, 0x69, 0x63, 0x65, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x56, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x52, 0x49, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x52, 0x49, 0x42, 0x26, 0x5a, 0x24, 0x6d, 0x6f, 0x6e, - 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x77, 0x65, 0x62, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x4f, 0x6e, 0x12, 0x10, + 0x0a, 0x03, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x72, 0x6c, + 0x22, 0x72, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x4f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x4f, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x53, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x53, 0x6f, + 0x72, 0x74, 0x49, 0x64, 0x22, 0xcc, 0x03, 0x0a, 0x0a, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x4f, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x53, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x53, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x04, 0x43, 0x6f, 0x73, 0x74, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x49, + 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, + 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x6e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x4f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x65, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x05, 0x52, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x65, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x05, 0x52, 0x05, 0x52, 0x6f, + 0x75, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4e, 0x75, 0x6d, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x05, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4e, 0x75, + 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x65, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x4e, 0x65, 0x65, 0x64, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x43, 0x6f, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x56, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x55, 0x52, 0x49, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x55, 0x52, 0x49, 0x42, 0x26, 0x5a, 0x24, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, + 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x77, 0x65, 0x62, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -9930,7 +10072,7 @@ func file_common_proto_rawDescGZIP() []byte { return file_common_proto_rawDescData } -var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 100) +var file_common_proto_msgTypes = make([]protoimpl.MessageInfo, 102) var file_common_proto_goTypes = []interface{}{ (*MysqlDbSetting)(nil), // 0: webapi.MysqlDbSetting (*MongoDbSetting)(nil), // 1: webapi.MongoDbSetting @@ -10018,36 +10160,38 @@ var file_common_proto_goTypes = []interface{}{ (*AwardLogInfo)(nil), // 83: webapi.AwardLogInfo (*AnnouncerLogInfo)(nil), // 84: webapi.AnnouncerLogInfo (*GuideConfig)(nil), // 85: webapi.GuideConfig - (*MatchAudience)(nil), // 86: webapi.MatchAudience - (*SpiritConfig)(nil), // 87: webapi.SpiritConfig - (*RoomType)(nil), // 88: webapi.RoomType - (*RoomConfig)(nil), // 89: webapi.RoomConfig - nil, // 90: webapi.Platform.BindTelRewardEntry - nil, // 91: webapi.PlayerData.RankScoreEntry - nil, // 92: webapi.ItemShop.AwardEntry - nil, // 93: webapi.VIPcfg.AwardEntry - nil, // 94: webapi.VIPcfg.Privilege1Entry - nil, // 95: webapi.VIPcfg.Privilege7Entry - nil, // 96: webapi.VIPcfg.Privilege9Entry - nil, // 97: webapi.ActInviteConfig.PayScoreEntry - nil, // 98: webapi.SkinLevel.UpItemEntry - nil, // 99: webapi.SkinItem.UnlockParamEntry - (*server.DB_GameFree)(nil), // 100: server.DB_GameFree - (*server.DB_GameItem)(nil), // 101: server.DB_GameItem + (*MachineConfig)(nil), // 86: webapi.MachineConfig + (*MachineInfo)(nil), // 87: webapi.MachineInfo + (*MatchAudience)(nil), // 88: webapi.MatchAudience + (*SpiritConfig)(nil), // 89: webapi.SpiritConfig + (*RoomType)(nil), // 90: webapi.RoomType + (*RoomConfig)(nil), // 91: webapi.RoomConfig + nil, // 92: webapi.Platform.BindTelRewardEntry + nil, // 93: webapi.PlayerData.RankScoreEntry + nil, // 94: webapi.ItemShop.AwardEntry + nil, // 95: webapi.VIPcfg.AwardEntry + nil, // 96: webapi.VIPcfg.Privilege1Entry + nil, // 97: webapi.VIPcfg.Privilege7Entry + nil, // 98: webapi.VIPcfg.Privilege9Entry + nil, // 99: webapi.ActInviteConfig.PayScoreEntry + nil, // 100: webapi.SkinLevel.UpItemEntry + nil, // 101: webapi.SkinItem.UnlockParamEntry + (*server.DB_GameFree)(nil), // 102: server.DB_GameFree + (*server.DB_GameItem)(nil), // 103: server.DB_GameItem } var file_common_proto_depIdxs = []int32{ 2, // 0: webapi.Platform.Leaderboard:type_name -> webapi.RankSwitch 3, // 1: webapi.Platform.ClubConfig:type_name -> webapi.ClubConfig 4, // 2: webapi.Platform.ThirdGameMerchant:type_name -> webapi.ThirdGame - 90, // 3: webapi.Platform.BindTelReward:type_name -> webapi.Platform.BindTelRewardEntry + 92, // 3: webapi.Platform.BindTelReward:type_name -> webapi.Platform.BindTelRewardEntry 6, // 4: webapi.GameConfigGlobal.GameStatus:type_name -> webapi.GameStatus - 100, // 5: webapi.GameFree.DbGameFree:type_name -> server.DB_GameFree + 102, // 5: webapi.GameFree.DbGameFree:type_name -> server.DB_GameFree 8, // 6: webapi.PlatformGameConfig.DbGameFrees:type_name -> webapi.GameFree 0, // 7: webapi.PlatformDbConfig.Mysql:type_name -> webapi.MysqlDbSetting 1, // 8: webapi.PlatformDbConfig.MongoDb:type_name -> webapi.MongoDbSetting 1, // 9: webapi.PlatformDbConfig.MongoDbLog:type_name -> webapi.MongoDbSetting - 100, // 10: webapi.GameConfigGroup.DbGameFree:type_name -> server.DB_GameFree - 91, // 11: webapi.PlayerData.RankScore:type_name -> webapi.PlayerData.RankScoreEntry + 102, // 10: webapi.GameConfigGroup.DbGameFree:type_name -> server.DB_GameFree + 93, // 11: webapi.PlayerData.RankScore:type_name -> webapi.PlayerData.RankScoreEntry 32, // 12: webapi.PlayerData.Items:type_name -> webapi.ItemInfo 14, // 13: webapi.PlayerData.RoleUnlockList:type_name -> webapi.ModInfo 14, // 14: webapi.PlayerData.PetUnlockList:type_name -> webapi.ModInfo @@ -10060,7 +10204,7 @@ var file_common_proto_depIdxs = []int32{ 32, // 21: webapi.ExchangeShop.Items:type_name -> webapi.ItemInfo 25, // 22: webapi.ExchangeShopList.List:type_name -> webapi.ExchangeShop 29, // 23: webapi.ExchangeShopList.Weight:type_name -> webapi.ShopWeight - 92, // 24: webapi.ItemShop.Award:type_name -> webapi.ItemShop.AwardEntry + 94, // 24: webapi.ItemShop.Award:type_name -> webapi.ItemShop.AwardEntry 30, // 25: webapi.ItemShopList.List:type_name -> webapi.ItemShop 32, // 26: webapi.MatchInfoAward.ItemId:type_name -> webapi.ItemInfo 33, // 27: webapi.GameMatchDate.Award:type_name -> webapi.MatchInfoAward @@ -10081,14 +10225,14 @@ var file_common_proto_depIdxs = []int32{ 38, // 42: webapi.WelfareSpree.Item:type_name -> webapi.WelfareDate 48, // 43: webapi.WelfareFirstPayDataList.List:type_name -> webapi.WelfareSpree 48, // 44: webapi.WelfareContinuousPayDataList.List:type_name -> webapi.WelfareSpree - 93, // 45: webapi.VIPcfg.Award:type_name -> webapi.VIPcfg.AwardEntry - 94, // 46: webapi.VIPcfg.Privilege1:type_name -> webapi.VIPcfg.Privilege1Entry - 95, // 47: webapi.VIPcfg.Privilege7:type_name -> webapi.VIPcfg.Privilege7Entry - 96, // 48: webapi.VIPcfg.Privilege9:type_name -> webapi.VIPcfg.Privilege9Entry + 95, // 45: webapi.VIPcfg.Award:type_name -> webapi.VIPcfg.AwardEntry + 96, // 46: webapi.VIPcfg.Privilege1:type_name -> webapi.VIPcfg.Privilege1Entry + 97, // 47: webapi.VIPcfg.Privilege7:type_name -> webapi.VIPcfg.Privilege7Entry + 98, // 48: webapi.VIPcfg.Privilege9:type_name -> webapi.VIPcfg.Privilege9Entry 51, // 49: webapi.VIPcfgDataList.List:type_name -> webapi.VIPcfg 38, // 50: webapi.ChessRankConfig.Item:type_name -> webapi.WelfareDate 55, // 51: webapi.ChessRankcfgData.Datas:type_name -> webapi.ChessRankConfig - 97, // 52: webapi.ActInviteConfig.PayScore:type_name -> webapi.ActInviteConfig.PayScoreEntry + 99, // 52: webapi.ActInviteConfig.PayScore:type_name -> webapi.ActInviteConfig.PayScoreEntry 62, // 53: webapi.ActInviteConfig.Awards1:type_name -> webapi.RankAward 62, // 54: webapi.ActInviteConfig.Awards2:type_name -> webapi.RankAward 62, // 55: webapi.ActInviteConfig.Awards3:type_name -> webapi.RankAward @@ -10105,24 +10249,25 @@ var file_common_proto_depIdxs = []int32{ 69, // 66: webapi.DiamondLotteryData.Info:type_name -> webapi.DiamondLotteryInfo 70, // 67: webapi.DiamondLotteryData.Players:type_name -> webapi.DiamondLotteryPlayers 72, // 68: webapi.DiamondLotteryConfig.LotteryData:type_name -> webapi.DiamondLotteryData - 101, // 69: webapi.ItemConfig.Items:type_name -> server.DB_GameItem + 103, // 69: webapi.ItemConfig.Items:type_name -> server.DB_GameItem 32, // 70: webapi.RankAwardInfo.Item:type_name -> webapi.ItemInfo 75, // 71: webapi.RankTypeInfo.Award:type_name -> webapi.RankAwardInfo 76, // 72: webapi.RankTypeConfig.Info:type_name -> webapi.RankTypeInfo - 98, // 73: webapi.SkinLevel.UpItem:type_name -> webapi.SkinLevel.UpItemEntry - 99, // 74: webapi.SkinItem.UnlockParam:type_name -> webapi.SkinItem.UnlockParamEntry + 100, // 73: webapi.SkinLevel.UpItem:type_name -> webapi.SkinLevel.UpItemEntry + 101, // 74: webapi.SkinItem.UnlockParam:type_name -> webapi.SkinItem.UnlockParamEntry 78, // 75: webapi.SkinItem.Levels:type_name -> webapi.SkinLevel 79, // 76: webapi.SkinConfig.Items:type_name -> webapi.SkinItem 82, // 77: webapi.AwardLogConfig.AwardLog:type_name -> webapi.AwardLogData 84, // 78: webapi.AwardLogConfig.AnnouncerLog:type_name -> webapi.AnnouncerLogInfo 83, // 79: webapi.AwardLogData.AwardLog:type_name -> webapi.AwardLogInfo - 32, // 80: webapi.RoomConfig.Cost:type_name -> webapi.ItemInfo - 32, // 81: webapi.RoomConfig.Reward:type_name -> webapi.ItemInfo - 82, // [82:82] is the sub-list for method output_type - 82, // [82:82] is the sub-list for method input_type - 82, // [82:82] is the sub-list for extension type_name - 82, // [82:82] is the sub-list for extension extendee - 0, // [0:82] is the sub-list for field type_name + 87, // 80: webapi.MachineConfig.Info:type_name -> webapi.MachineInfo + 32, // 81: webapi.RoomConfig.Cost:type_name -> webapi.ItemInfo + 32, // 82: webapi.RoomConfig.Reward:type_name -> webapi.ItemInfo + 83, // [83:83] is the sub-list for method output_type + 83, // [83:83] is the sub-list for method input_type + 83, // [83:83] is the sub-list for extension type_name + 83, // [83:83] is the sub-list for extension extendee + 0, // [0:83] is the sub-list for field type_name } func init() { file_common_proto_init() } @@ -11164,7 +11309,7 @@ func file_common_proto_init() { } } file_common_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MatchAudience); i { + switch v := v.(*MachineConfig); i { case 0: return &v.state case 1: @@ -11176,7 +11321,7 @@ func file_common_proto_init() { } } file_common_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SpiritConfig); i { + switch v := v.(*MachineInfo); i { case 0: return &v.state case 1: @@ -11188,7 +11333,7 @@ func file_common_proto_init() { } } file_common_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoomType); i { + switch v := v.(*MatchAudience); i { case 0: return &v.state case 1: @@ -11200,6 +11345,30 @@ func file_common_proto_init() { } } file_common_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpiritConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoomType); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_common_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoomConfig); i { case 0: return &v.state @@ -11218,7 +11387,7 @@ func file_common_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_proto_rawDesc, NumEnums: 0, - NumMessages: 100, + NumMessages: 102, NumExtensions: 0, NumServices: 0, }, From da83b674d2ed22a8346829c7deba00474052e0f1 Mon Sep 17 00:00:00 2001 From: kxdd Date: Tue, 3 Sep 2024 15:48:23 +0800 Subject: [PATCH 53/56] =?UTF-8?q?public=20=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public b/public index d789cca..fd8bef9 160000 --- a/public +++ b/public @@ -1 +1 @@ -Subproject commit d789cca81a36ddbaf30e5414b6c4fe530e0631f6 +Subproject commit fd8bef907ea15489504529da70f72038444b54e0 From df04ede6710870af568d430e48098368b7f7fed2 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Tue, 3 Sep 2024 15:53:09 +0800 Subject: [PATCH 54/56] public --- public | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public b/public index 682e8f3..d789cca 160000 --- a/public +++ b/public @@ -1 +1 @@ -Subproject commit 682e8f3ccf7d1056210c3ee68c9d1db271d9069d +Subproject commit d789cca81a36ddbaf30e5414b6c4fe530e0631f6 From 9ef1f9d896b88a95586f10fe49a3346220c01285 Mon Sep 17 00:00:00 2001 From: kxdd Date: Tue, 3 Sep 2024 16:09:43 +0800 Subject: [PATCH 55/56] =?UTF-8?q?=E5=A8=83=E5=A8=83=E6=9C=BA=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamesrv/clawdoll/action_clawdoll.go | 4 ++-- gamesrv/clawdoll/scenepolicy_clawdoll.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gamesrv/clawdoll/action_clawdoll.go b/gamesrv/clawdoll/action_clawdoll.go index b0078c4..11fddd2 100644 --- a/gamesrv/clawdoll/action_clawdoll.go +++ b/gamesrv/clawdoll/action_clawdoll.go @@ -126,7 +126,7 @@ func (h *CSGetTokenHandler) Process(s *netlib.Session, packetid int, data interf return nil } - machineId := scene.DbGameFree.GetId() % 6080000 + machineId := scene.GetDBGameFree().GetId() % 6080000 appId, serverSecret := sceneEx.GetMachineServerSecret(machineId, p.Platform) logger.Logger.Tracef("获取娃娃机 appId = %v, serverSecret = %v", appId, serverSecret) if serverSecret == "" || appId == 0 { @@ -158,7 +158,7 @@ func MSSendTokenHandler(session *netlib.Session, packetId int, data interface{}) } pack := &clawdoll.SCCLAWDOLLSendToken{ - LogicId: scene.DbGameFree.GetId(), + LogicId: scene.DBGameFree.GetId(), Appid: msg.Appid, Token: token, } diff --git a/gamesrv/clawdoll/scenepolicy_clawdoll.go b/gamesrv/clawdoll/scenepolicy_clawdoll.go index 114e41c..713da22 100644 --- a/gamesrv/clawdoll/scenepolicy_clawdoll.go +++ b/gamesrv/clawdoll/scenepolicy_clawdoll.go @@ -284,7 +284,7 @@ func (this *PolicyClawdoll) SendGetVideoToken(s *base.Scene, p *base.Player, sce pack := &machine.SMGetToken{} pack.Snid = p.SnId - machineId := s.DbGameFree.GetId() % 6080000 + machineId := s.DBGameFree.GetId() % 6080000 appId, serverSecret := sceneEx.GetMachineServerSecret(machineId, p.Platform) logger.Logger.Tracef("获取娃娃机 appId = %v, serverSecret = %v", appId, serverSecret) if serverSecret == "" || appId == 0 { From fe375fb15f7761cd1d3fbfa9a1a25be7e9072e10 Mon Sep 17 00:00:00 2001 From: by <123456@qq.com> Date: Tue, 3 Sep 2024 16:22:47 +0800 Subject: [PATCH 56/56] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- machine/action/action_server.go | 1 - public | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/machine/action/action_server.go b/machine/action/action_server.go index ea9d138..6138a53 100644 --- a/machine/action/action_server.go +++ b/machine/action/action_server.go @@ -259,7 +259,6 @@ func SMGameLinkSucceedHandler(session *netlib.Session, packetId int, data interf for i, _ := range machinedoll.MachineMgr.ConnMap { info := &machine.DollMachine{} info.Id = int32(i) - info.VideoAddr = "www.baidu.com" msg.Data = append(msg.Data, info) } session.Send(int(machine.DollMachinePacketID_PACKET_MSDollMachineList), msg) diff --git a/public b/public index fd8bef9..d789cca 160000 --- a/public +++ b/public @@ -1 +1 @@ -Subproject commit fd8bef907ea15489504529da70f72038444b54e0 +Subproject commit d789cca81a36ddbaf30e5414b6c4fe530e0631f6