From 461731a9a327235fe8c0a5caac849394de061f08 Mon Sep 17 00:00:00 2001 From: LiuShaowen Date: Wed, 1 Sep 2021 13:44:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E7=8E=A9=E5=AE=B6=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mmo/api/Move.go | 32 +++++++++ mmo/core/Player.go | 83 ++++++++++++++++++++++ mmo/main.go | 3 + mmo/pb/msg.proto | 11 +++ mmo/pb/msg/msg.pb.go | 165 +++++++++++++++++++++++++++++++++++++++---- 5 files changed, 281 insertions(+), 13 deletions(-) create mode 100644 mmo/api/Move.go diff --git a/mmo/api/Move.go b/mmo/api/Move.go new file mode 100644 index 0000000..b04eae4 --- /dev/null +++ b/mmo/api/Move.go @@ -0,0 +1,32 @@ +package api + +import ( + "fmt" + "github.com/golang/protobuf/proto" + "wukong/iface" + "wukong/mmo/core" + "wukong/mmo/pb/msg" + "wukong/net" +) + +type MoveApi struct { + net.BaseRouter +} + +func (m *MoveApi) Handle(request iface.IRequest) { + protoMag := &msg.Position{} + err := proto.Unmarshal(request.GetData(), protoMag) + if err != nil { + fmt.Println("Move : Position Unmarshal error", err) + return + } + + pId, err := request.GetConnection().GetProperty("PId") + if err != nil { + fmt.Println("GetProperty pId error", err) + return + } + + player := core.WorldManagerObj.GetPlayerByPId(pId.(int32)) + player.UpdatePos(protoMag.X, protoMag.Y, protoMag.Z, protoMag.V) +} diff --git a/mmo/core/Player.go b/mmo/core/Player.go index 26df671..e4f82fe 100644 --- a/mmo/core/Player.go +++ b/mmo/core/Player.go @@ -97,3 +97,86 @@ func (p *Player) Talk(content string) { } } + +func (p *Player) SyncSurrounding() { + pIds := WorldManagerObj.AoiManager.GetPIdsByPos(p.X, p.Z) + players := make([]*Player, 0, len(pIds)) + for _, pId := range pIds { + players = append(players, WorldManagerObj.GetPlayerByPId(int32(pId))) + } + + protoMsg := &msg.BroadCast{ + PId: p.PId, + Tp: 2, + Data: &msg.BroadCast_P{ + P: &msg.Position{ + X: p.X, + Y: p.Y, + Z: p.Z, + V: p.V, + }, + }, + } + for _, player := range players { + player.SendMsg(200, protoMsg) + } + + playersProtoMsg := make([]*msg.Player, 0, len(players)) + for _, player := range players { + p := &msg.Player{ + PId: player.PId, + P: &msg.Position{ + X: player.X, + Y: player.Y, + Z: player.Z, + V: player.V, + }, + } + + playersProtoMsg = append(playersProtoMsg, p) + } + + syncPlayersProtoMsg := &msg.SyncPlayers{ + Ps: playersProtoMsg, + } + + p.SendMsg(202, syncPlayersProtoMsg) + +} + +func (p *Player) UpdatePos(x float32, y float32, z float32, v float32) { + p.X = x + p.Y = y + p.Z = z + p.V = v + + protoMsg := &msg.BroadCast{ + PId: p.PId, + Tp: 4, + Data: &msg.BroadCast_P{ + P: &msg.Position{ + X: x, + Y: y, + Z: z, + V: v, + }, + }, + } + + players := p.GetSurroundingPlayers() + + for _, Player := range players { + Player.SendMsg(200, protoMsg) + } +} + +func (p Player) GetSurroundingPlayers() []*Player { + pIds := WorldManagerObj.AoiManager.GetPIdsByPos(p.X, p.Z) + + players := make([]*Player, 0, len(pIds)) + for _, pid := range pIds { + players = append(players, WorldManagerObj.GetPlayerByPId(int32(pid))) + } + + return players +} diff --git a/mmo/main.go b/mmo/main.go index 24ccaf8..bf5e7f6 100644 --- a/mmo/main.go +++ b/mmo/main.go @@ -19,6 +19,8 @@ func OnConnectionAdd(conn iface.IConnection) { conn.SetProperty("PId", player.PId) + player.SyncSurrounding() + fmt.Println("===========》 Player id = ", player.PId, "is arrived ========") } @@ -28,6 +30,7 @@ func main() { s.SetOnConnStart(OnConnectionAdd) s.AddRouter(2, &api.WorldChatApi{}) + s.AddRouter(3, &api.MoveApi{}) s.Serve() } diff --git a/mmo/pb/msg.proto b/mmo/pb/msg.proto index 83260fb..f238bd8 100644 --- a/mmo/pb/msg.proto +++ b/mmo/pb/msg.proto @@ -33,4 +33,15 @@ message Talk{ string name = 2; } +//同步玩家显示数据 +message SyncPlayers{ + repeated Player ps = 1; +} + +//玩家信息 +message Player{ + int32 PId = 1; + Position P = 2; +} + diff --git a/mmo/pb/msg/msg.pb.go b/mmo/pb/msg/msg.pb.go index 6c743d2..ef6af42 100644 --- a/mmo/pb/msg/msg.pb.go +++ b/mmo/pb/msg/msg.pb.go @@ -307,6 +307,110 @@ func (x *Talk) GetName() string { return "" } +//同步玩家显示数据 +type SyncPlayers struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ps []*Player `protobuf:"bytes,1,rep,name=ps,proto3" json:"ps,omitempty"` +} + +func (x *SyncPlayers) Reset() { + *x = SyncPlayers{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncPlayers) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncPlayers) ProtoMessage() {} + +func (x *SyncPlayers) ProtoReflect() protoreflect.Message { + mi := &file_msg_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 SyncPlayers.ProtoReflect.Descriptor instead. +func (*SyncPlayers) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{4} +} + +func (x *SyncPlayers) GetPs() []*Player { + if x != nil { + return x.Ps + } + return nil +} + +//玩家信息 +type Player struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PId int32 `protobuf:"varint,1,opt,name=PId,proto3" json:"PId,omitempty"` + P *Position `protobuf:"bytes,2,opt,name=P,proto3" json:"P,omitempty"` +} + +func (x *Player) Reset() { + *x = Player{} + if protoimpl.UnsafeEnabled { + mi := &file_msg_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Player) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Player) ProtoMessage() {} + +func (x *Player) ProtoReflect() protoreflect.Message { + mi := &file_msg_proto_msgTypes[5] + 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 Player.ProtoReflect.Descriptor instead. +func (*Player) Descriptor() ([]byte, []int) { + return file_msg_proto_rawDescGZIP(), []int{5} +} + +func (x *Player) GetPId() int32 { + if x != nil { + return x.PId + } + return 0 +} + +func (x *Player) GetP() *Position { + if x != nil { + return x.P + } + return nil +} + var File_msg_proto protoreflect.FileDescriptor var file_msg_proto_rawDesc = []byte{ @@ -329,8 +433,15 @@ var file_msg_proto_rawDesc = []byte{ 0x44, 0x61, 0x74, 0x61, 0x22, 0x34, 0x0a, 0x04, 0x54, 0x61, 0x6c, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x5a, 0x05, 0x2e, 0x2f, - 0x6d, 0x73, 0x67, 0xaa, 0x02, 0x02, 0x50, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0b, 0x53, 0x79, + 0x6e, 0x63, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x02, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x52, 0x02, 0x70, 0x73, 0x22, 0x36, 0x0a, 0x06, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, + 0x10, 0x0a, 0x03, 0x50, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x01, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, + 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x01, 0x50, 0x42, 0x0c, 0x5a, + 0x05, 0x2e, 0x2f, 0x6d, 0x73, 0x67, 0xaa, 0x02, 0x02, 0x50, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -345,20 +456,24 @@ func file_msg_proto_rawDescGZIP() []byte { return file_msg_proto_rawDescData } -var file_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_msg_proto_goTypes = []interface{}{ - (*SyncPid)(nil), // 0: pb.SyncPid - (*Position)(nil), // 1: pb.Position - (*BroadCast)(nil), // 2: pb.BroadCast - (*Talk)(nil), // 3: pb.Talk + (*SyncPid)(nil), // 0: pb.SyncPid + (*Position)(nil), // 1: pb.Position + (*BroadCast)(nil), // 2: pb.BroadCast + (*Talk)(nil), // 3: pb.Talk + (*SyncPlayers)(nil), // 4: pb.SyncPlayers + (*Player)(nil), // 5: pb.Player } var file_msg_proto_depIdxs = []int32{ 1, // 0: pb.BroadCast.P:type_name -> pb.Position - 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 + 5, // 1: pb.SyncPlayers.ps:type_name -> pb.Player + 1, // 2: pb.Player.P:type_name -> pb.Position + 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 } func init() { file_msg_proto_init() } @@ -415,6 +530,30 @@ func file_msg_proto_init() { return nil } } + file_msg_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncPlayers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msg_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Player); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_msg_proto_msgTypes[2].OneofWrappers = []interface{}{ (*BroadCast_Content)(nil), @@ -427,7 +566,7 @@ func file_msg_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_msg_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 6, NumExtensions: 0, NumServices: 0, },