Compare commits
7 Commits
b87858fbf1
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| e098d95fb0 | |||
| 151d088004 | |||
| 4ac1cb4a23 | |||
| 185518257f | |||
| 146c1734fa | |||
| c659d3d83b | |||
| 918774e1e8 |
30
app/app.go
30
app/app.go
@@ -2,11 +2,11 @@ package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.hlsq.asia/mmorpg/service-common/discover/common"
|
||||
"git.hlsq.asia/mmorpg/service-common/log"
|
||||
"git.hlsq.asia/mmorpg/service-common/module"
|
||||
"git.hlsq.asia/mmorpg/service-scene/config"
|
||||
"git.hlsq.asia/mmorpg/service-scene/internal/grpc_server"
|
||||
"git.hlsq.asia/alex/service-common/discover/common"
|
||||
"git.hlsq.asia/alex/service-common/log"
|
||||
"git.hlsq.asia/alex/service-common/module"
|
||||
"git.hlsq.asia/alex/service-scene/config"
|
||||
"git.hlsq.asia/alex/service-scene/internal/grpcserver"
|
||||
"github.com/judwhite/go-svc"
|
||||
"sync"
|
||||
)
|
||||
@@ -16,21 +16,15 @@ type Program struct {
|
||||
}
|
||||
|
||||
func (p *Program) Init(_ svc.Environment) error {
|
||||
base := &ModuleBase{}
|
||||
if err := base.Init(); err != nil {
|
||||
return err
|
||||
}
|
||||
p.moduleList = append(p.moduleList, base)
|
||||
p.moduleList = append(p.moduleList, (&module.DB{}).Bind(config.Get().DB, config.Get().App.Name))
|
||||
p.moduleList = append(p.moduleList, (&module.Grpc{}).Bind(grpc_server.NewServer(config.Get().Serve.Grpc)))
|
||||
p.moduleList = append(p.moduleList, (&module.Prometheus{}).Bind(config.Get().Metric))
|
||||
p.moduleList = append(p.moduleList, (&module.Tracer{}).Bind(config.Get().Metric, common.KeyDiscoverServiceNameScene))
|
||||
p.moduleList = append(p.moduleList, &module.Log{Cfg: config.Get().Log})
|
||||
p.moduleList = append(p.moduleList, &module.DB{Cfg: config.Get().DB, AppName: config.Get().App.Name})
|
||||
p.moduleList = append(p.moduleList, &module.Snowflake{})
|
||||
p.moduleList = append(p.moduleList, &module.Grpc{Server: grpcserver.NewServer(config.Get().Serve.Grpc)})
|
||||
p.moduleList = append(p.moduleList, &module.Prometheus{Cfg: config.Get().Metric})
|
||||
p.moduleList = append(p.moduleList, &module.Tracer{Cfg: config.Get().Metric, ServiceName: common.KeyDiscoverServiceNameScene})
|
||||
p.moduleList = append(p.moduleList, &module.Discover{})
|
||||
|
||||
for i, m := range p.moduleList {
|
||||
if i == 0 {
|
||||
continue
|
||||
}
|
||||
for _, m := range p.moduleList {
|
||||
if err := m.Init(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
27
app/base.go
27
app/base.go
@@ -1,27 +0,0 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"git.hlsq.asia/mmorpg/service-common/log"
|
||||
"git.hlsq.asia/mmorpg/service-common/module"
|
||||
"git.hlsq.asia/mmorpg/service-common/utils"
|
||||
"git.hlsq.asia/mmorpg/service-scene/config"
|
||||
"math/rand"
|
||||
)
|
||||
|
||||
// ModuleBase 基础模块,或者一些零散的模块
|
||||
type ModuleBase struct {
|
||||
module.DefaultModule
|
||||
}
|
||||
|
||||
func (m *ModuleBase) Init() error {
|
||||
// 配置
|
||||
if err := config.LoadConfig(); err != nil {
|
||||
return err
|
||||
}
|
||||
cfg := config.Get()
|
||||
// 日志
|
||||
log.Init(cfg.Log.Debug, cfg.Log.MaxSize, cfg.Log.MaxBackups, cfg.Log.MaxAge, cfg.Log.Level)
|
||||
// 雪花
|
||||
utils.InitSnowflake(int64(rand.Intn(1000)))
|
||||
return nil
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package config
|
||||
|
||||
import "git.hlsq.asia/mmorpg/service-common/config"
|
||||
import "git.hlsq.asia/alex/service-common/config"
|
||||
|
||||
const path = "./config"
|
||||
|
||||
|
||||
2
deploy/Jenkinsfile
vendored
2
deploy/Jenkinsfile
vendored
@@ -3,7 +3,7 @@ pipeline {
|
||||
|
||||
environment {
|
||||
// 仓库
|
||||
REPO_URL = 'https://git.hlsq.asia/mmorpg/service-scene.git'
|
||||
REPO_URL = 'https://git.hlsq.asia/alex/service-scene.git'
|
||||
REPO_CREDENTIALS_ID = '80805ba2-f4ac-4d84-aee6-d4cce5fc0a96'
|
||||
|
||||
// Registry
|
||||
|
||||
4
go.mod
4
go.mod
@@ -1,9 +1,9 @@
|
||||
module git.hlsq.asia/mmorpg/service-scene
|
||||
module git.hlsq.asia/alex/service-scene
|
||||
|
||||
go 1.24.0
|
||||
|
||||
require (
|
||||
git.hlsq.asia/mmorpg/service-common v0.0.0-20260130035320-5dc5391b07ed
|
||||
git.hlsq.asia/alex/service-common master
|
||||
github.com/judwhite/go-svc v1.2.1
|
||||
go.uber.org/zap v1.27.0
|
||||
google.golang.org/grpc v1.77.0
|
||||
|
||||
4
go.sum
4
go.sum
@@ -1,7 +1,7 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
git.hlsq.asia/mmorpg/service-common v0.0.0-20260130035320-5dc5391b07ed h1:O08p0egfekFqQSnc4sfEJUTI5dGiEyiDRNW/VYa/Ce4=
|
||||
git.hlsq.asia/mmorpg/service-common v0.0.0-20260130035320-5dc5391b07ed/go.mod h1:mMhZcumphj6gaVTppVYsMTkd+5HupmQgAc53Pd4MH9I=
|
||||
git.hlsq.asia/alex/service-common v0.0.0-20260211064821-558677bc3a2e h1:MNVS1NXNVn4DeTZPcvvA8YFM8afCzZedLPUYMffNgZs=
|
||||
git.hlsq.asia/alex/service-common v0.0.0-20260211064821-558677bc3a2e/go.mod h1:mMhZcumphj6gaVTppVYsMTkd+5HupmQgAc53Pd4MH9I=
|
||||
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
|
||||
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/IBM/sarama v1.46.3 h1:njRsX6jNlnR+ClJ8XmkO+CM4unbrNr/2vB5KK6UA+IE=
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
package grpc_server
|
||||
package grpcserver
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.hlsq.asia/mmorpg/service-common/log"
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb"
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/ss/ss_pb"
|
||||
"git.hlsq.asia/mmorpg/service-scene/internal/instance"
|
||||
"git.hlsq.asia/alex/service-common/log"
|
||||
"git.hlsq.asia/alex/service-common/proto/rs/rspb"
|
||||
"git.hlsq.asia/alex/service-common/proto/ss/sspb"
|
||||
"git.hlsq.asia/alex/service-scene/internal/instance"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func (s *Server) Enter(ctx context.Context, req *grpc_pb.EnterReq) (*grpc_pb.EnterResp, error) {
|
||||
func (s *Server) Enter(ctx context.Context, req *rspb.EnterReq) (*rspb.EnterResp, error) {
|
||||
ins, loaded := instance.Mgr.LoadOrStoreByInstanceID(req.InstanceID, instance.NewScene(s.SID, req.InstanceID))
|
||||
if !loaded {
|
||||
ins.Start(s.Cfg.TTL)
|
||||
}
|
||||
ins.EventIn <- req
|
||||
|
||||
payload, _ := proto.Marshal(&ss_pb.S2C_EnterInstance{
|
||||
Info: &ss_pb.PositionInfo{
|
||||
payload, _ := proto.Marshal(&sspb.S2C_EnterInstance{
|
||||
Info: &sspb.PositionInfo{
|
||||
USN: req.USN,
|
||||
X: 1,
|
||||
Y: 1,
|
||||
},
|
||||
})
|
||||
return &grpc_pb.EnterResp{
|
||||
return &rspb.EnterResp{
|
||||
SceneSID: s.SID,
|
||||
UniqueNo: ins.UniqueNo,
|
||||
MessageID: int32(ss_pb.MessageID_MESSAGE_ID_ENTER_INSTANCE),
|
||||
MessageID: int32(sspb.MessageID_MESSAGE_ID_ENTER_INSTANCE),
|
||||
Payload: payload,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *Server) Leave(ctx context.Context, req *grpc_pb.LeaveReq) (*grpc_pb.LeaveResp, error) {
|
||||
func (s *Server) Leave(ctx context.Context, req *rspb.LeaveReq) (*rspb.LeaveResp, error) {
|
||||
if i := instance.Mgr.GetByUniqueNo(req.UniqueNo); i != nil {
|
||||
i.EventIn <- req
|
||||
}
|
||||
return &grpc_pb.LeaveResp{}, nil
|
||||
return &rspb.LeaveResp{}, nil
|
||||
}
|
||||
|
||||
func (s *Server) Action(server grpc_pb.Scene_ActionServer) error {
|
||||
func (s *Server) Action(server rspb.Scene_ActionServer) error {
|
||||
wg := &sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
@@ -64,5 +64,5 @@ func (s *Server) Action(server grpc_pb.Scene_ActionServer) error {
|
||||
}
|
||||
}()
|
||||
wg.Wait()
|
||||
return server.SendAndClose(&grpc_pb.ActionResp{})
|
||||
return server.SendAndClose(&rspb.ActionResp{})
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
package grpc_server
|
||||
package grpcserver
|
||||
|
||||
import (
|
||||
"git.hlsq.asia/mmorpg/service-common/config"
|
||||
"git.hlsq.asia/mmorpg/service-common/discover/common"
|
||||
"git.hlsq.asia/mmorpg/service-common/net/grpc/service"
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb"
|
||||
"git.hlsq.asia/alex/service-common/config"
|
||||
"git.hlsq.asia/alex/service-common/discover/common"
|
||||
"git.hlsq.asia/alex/service-common/net/grpc/service"
|
||||
"git.hlsq.asia/alex/service-common/proto/rs/rspb"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
grpc_pb.UnimplementedSceneServer
|
||||
rspb.UnimplementedSceneServer
|
||||
service.Base
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ func (s *Server) OnCustomGrpcServerOption() []grpc.ServerOption {
|
||||
}
|
||||
|
||||
func (s *Server) OnInit(serve *grpc.Server) {
|
||||
grpc_pb.RegisterSceneServer(serve, s)
|
||||
rspb.RegisterSceneServer(serve, s)
|
||||
}
|
||||
|
||||
func (s *Server) OnClose() {
|
||||
@@ -3,13 +3,13 @@ package instance
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git.hlsq.asia/mmorpg/service-common/discover"
|
||||
"git.hlsq.asia/mmorpg/service-common/log"
|
||||
"git.hlsq.asia/mmorpg/service-common/net/grpc/grpc_client"
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb"
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/ss/ss_pb"
|
||||
"git.hlsq.asia/mmorpg/service-common/utils"
|
||||
"git.hlsq.asia/mmorpg/service-scene/internal/npc"
|
||||
"git.hlsq.asia/alex/service-common/discover"
|
||||
"git.hlsq.asia/alex/service-common/log"
|
||||
"git.hlsq.asia/alex/service-common/net/grpc/grpcclient"
|
||||
"git.hlsq.asia/alex/service-common/proto/rs/rspb"
|
||||
"git.hlsq.asia/alex/service-common/proto/ss/sspb"
|
||||
"git.hlsq.asia/alex/service-common/utils"
|
||||
"git.hlsq.asia/alex/service-scene/internal/npc"
|
||||
"go.uber.org/zap"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"runtime/debug"
|
||||
@@ -90,25 +90,25 @@ func (i *Instance) Start(ttl int64) {
|
||||
// 网络帧,将玩家的操作储存起来,到逻辑帧再处理玩家操作
|
||||
func (i *Instance) onEvent(e proto.Message) {
|
||||
switch v := e.(type) {
|
||||
case *grpc_pb.EnterReq:
|
||||
case *rspb.EnterReq:
|
||||
i.players[v.USN] = npc.NewPlayerNode(v.GatewaySID, v.USN)
|
||||
case *grpc_pb.ActionReq:
|
||||
case *rspb.ActionReq:
|
||||
if node, ok := i.players[v.USN]; ok {
|
||||
node.AddAction(v)
|
||||
}
|
||||
case *grpc_pb.LeaveReq:
|
||||
case *rspb.LeaveReq:
|
||||
delete(i.players, v.USN)
|
||||
}
|
||||
}
|
||||
|
||||
// 逻辑帧
|
||||
func (i *Instance) onLogic(delta int64) {
|
||||
positionUpdate := make([]*ss_pb.PositionInfo, 0)
|
||||
positionUpdate := make([]*sspb.PositionInfo, 0)
|
||||
sid := int64(0)
|
||||
// 处理玩家指令
|
||||
for _, node := range i.players {
|
||||
if node.LogicAction(delta) {
|
||||
positionUpdate = append(positionUpdate, &ss_pb.PositionInfo{
|
||||
positionUpdate = append(positionUpdate, &sspb.PositionInfo{
|
||||
USN: node.USN,
|
||||
X: int32(node.Position[0] * 100),
|
||||
Y: int32(node.Position[1] * 100),
|
||||
@@ -117,12 +117,12 @@ func (i *Instance) onLogic(delta int64) {
|
||||
}
|
||||
}
|
||||
if len(positionUpdate) > 0 {
|
||||
payload, _ := proto.Marshal(&ss_pb.S2C_Position{
|
||||
payload, _ := proto.Marshal(&sspb.S2C_Position{
|
||||
Info: positionUpdate,
|
||||
})
|
||||
if err := grpc_client.SendMessageToGateway(sid, grpc_client.FunToClient, &grpc_pb.ToClientReq{
|
||||
if err := grpcclient.SendMessageToGateway(sid, grpcclient.FunToClient, &rspb.ToClientReq{
|
||||
USN: -1,
|
||||
MessageID: int32(ss_pb.MessageID_MESSAGE_ID_POSITION),
|
||||
MessageID: int32(sspb.MessageID_MESSAGE_ID_POSITION),
|
||||
Payload: payload,
|
||||
}); err != nil {
|
||||
i.logger.Errorf("send action err: %v", err)
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package npc
|
||||
|
||||
import (
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb"
|
||||
)
|
||||
import "git.hlsq.asia/alex/service-common/proto/rs/rspb"
|
||||
|
||||
// NPCNode 定义NPC节点
|
||||
type NPCNode struct {
|
||||
@@ -11,7 +9,7 @@ type NPCNode struct {
|
||||
|
||||
Position [2]float64 // 二维坐标 [x, y]
|
||||
MoveCross int8 // 移动十字,1 上 2 下 4 左 8 右
|
||||
Action []*grpc_pb.ActionReq // 其他操作
|
||||
Action []*rspb.ActionReq // 其他操作
|
||||
}
|
||||
|
||||
func NewNPCNode(gatewaySID int64, usn int64) *NPCNode {
|
||||
@@ -20,6 +18,6 @@ func NewNPCNode(gatewaySID int64, usn int64) *NPCNode {
|
||||
GatewaySID: gatewaySID,
|
||||
Position: [2]float64{0, 0},
|
||||
MoveCross: 0,
|
||||
Action: make([]*grpc_pb.ActionReq, 0),
|
||||
Action: make([]*rspb.ActionReq, 0),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package npc
|
||||
|
||||
import (
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb"
|
||||
"git.hlsq.asia/mmorpg/service-common/proto/ss/ss_pb"
|
||||
"git.hlsq.asia/alex/service-common/proto/rs/rspb"
|
||||
"git.hlsq.asia/alex/service-common/proto/ss/sspb"
|
||||
)
|
||||
|
||||
// PlayerNode 定义玩家节点结构体
|
||||
@@ -14,7 +14,7 @@ type PlayerNode struct {
|
||||
Position [2]float32 // 二维坐标 [x, y]
|
||||
MoveDirection [2]int8 // 移动方向 [x, y]
|
||||
MoveCount int8 // 移动指令使用计数
|
||||
Action []*grpc_pb.ActionReq // 其他操作
|
||||
Action []*rspb.ActionReq // 其他操作
|
||||
}
|
||||
|
||||
func NewPlayerNode(gatewaySID int64, usn int64) *PlayerNode {
|
||||
@@ -23,12 +23,12 @@ func NewPlayerNode(gatewaySID int64, usn int64) *PlayerNode {
|
||||
GatewaySID: gatewaySID,
|
||||
MoveSpeed: 5 * 0.00001,
|
||||
Position: [2]float32{0, 0},
|
||||
Action: make([]*grpc_pb.ActionReq, 0),
|
||||
Action: make([]*rspb.ActionReq, 0),
|
||||
}
|
||||
}
|
||||
|
||||
// AddAction 将指令存储到玩家身上
|
||||
func (p *PlayerNode) AddAction(e *grpc_pb.ActionReq) {
|
||||
func (p *PlayerNode) AddAction(e *rspb.ActionReq) {
|
||||
p.Action = append(p.Action, e)
|
||||
}
|
||||
|
||||
@@ -36,14 +36,14 @@ func (p *PlayerNode) AddAction(e *grpc_pb.ActionReq) {
|
||||
// return 是否更新玩家状态
|
||||
func (p *PlayerNode) LogicAction(delta int64) bool {
|
||||
for _, a := range p.Action {
|
||||
switch ss_pb.ActionID(a.Action) {
|
||||
case ss_pb.ActionID_ACTION_ID_MOVE:
|
||||
switch sspb.ActionID(a.Action) {
|
||||
case sspb.ActionID_ACTION_ID_MOVE:
|
||||
p.MoveDirection = [2]int8{int8(a.DirX), int8(a.DirY)}
|
||||
p.MoveCount = 0
|
||||
case ss_pb.ActionID_ACTION_ID_ATTACK:
|
||||
case sspb.ActionID_ACTION_ID_ATTACK:
|
||||
}
|
||||
}
|
||||
p.Action = make([]*grpc_pb.ActionReq, 0)
|
||||
p.Action = make([]*rspb.ActionReq, 0)
|
||||
|
||||
return p.move(delta)
|
||||
}
|
||||
|
||||
6
main.go
6
main.go
@@ -2,12 +2,16 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.hlsq.asia/mmorpg/service-scene/app"
|
||||
"git.hlsq.asia/alex/service-scene/app"
|
||||
"git.hlsq.asia/alex/service-scene/config"
|
||||
"github.com/judwhite/go-svc"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if err := config.LoadConfig(); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
if err := svc.Run(&app.Program{}, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user