上传服务cmd 启动程序

This commit is contained in:
liwei1dao 2022-09-21 14:44:44 +08:00
parent 5e9f50e10f
commit 97cff7c81c
8 changed files with 330 additions and 8 deletions

47
bin/gm.json Normal file
View File

@ -0,0 +1,47 @@
{
"AreaId": "dfli01",
"ConsulAddr": "10.0.0.9:10012",
"IsCross": false,
"BelongCrossServerId": "dflicross01",
"LoaclDB": {
"RedisIsCluster": false,
"RedisAddr": "10.0.0.9:10011",
"RedisPassword": "li13451234",
"RedisDB": 5,
"MongodbUrl": "mongodb://10.0.0.9:10013",
"MongodbDatabase": "dreamfactory5"
},
"CrossDB": {
"RedisIsCluster": false,
"RedisAddr": "10.0.0.9:10011",
"RedisPassword": "li13451234",
"RedisDB": 6,
"MongodbUrl": "mongodb://10.0.0.9:10013",
"MongodbDatabase": "dreamfactory6"
},
"Services": [
{
"ServiceType": "gateway",
"Host": "127.0.0.1",
"Port": 9567,
"Loglevel": 5,
"MaxAgeTime": 7,
"ListenPort": 7891
},
{
"ServiceType": "mainte",
"Host": "127.0.0.1",
"Port": 9568,
"Loglevel": 5,
"MaxAgeTime": 7,
"ListenPort": 8000
},
{
"ServiceType": "worker",
"Host": "127.0.0.1",
"Port": 9569,
"Loglevel": 5,
"MaxAgeTime": 7
}
]
}

32
comm/gameconfig.go Normal file
View File

@ -0,0 +1,32 @@
package comm
//游戏区服配置
type GameConfig struct {
AreaId string //区服id 每个区服id都必须是唯一
ConsulAddr string //区服Consul
IsCross bool ///是否是跨区区服
BelongCrossServerId string //所属跨服Id (区服id) 不是跨服区服才有效
LoaclDB *DBConfig //本地db
CrossDB *DBConfig //跨服db
Services []*ServiceConfig //服务列表 可以配置多个gateway 和多个 worker 只能有一个mainte
}
//区服db配置
type DBConfig struct {
RedisIsCluster bool //redis 是否是集群模式
RedisAddr string //redis 地址
RedisPassword string //redis 密码
RedisDB int32 //redis db
MongodbUrl string //mgondb 地址
MongodbDatabase string //数据库地址
}
//服务配置
type ServiceConfig struct {
ServiceType string //服务类型:gateway(网关服务),worker(业务服务),mainte(维护服务)
Host string //运行主机ip
Port int32 //监控Prot
Loglevel int32 //日志文件输出级别
MaxAgeTime int32 //日志文件保存时长
ListenPort int32 //网关和维护服务 都需要提供http服务 所以需要监听端口
}

View File

@ -45,7 +45,7 @@ func (this *AttributeNumeric) Value() float32 {
}
func (this *AttributeNumeric) SetBase(value float32) float32 {
this.BaseValue.Set(value)
this.BaseValue.SetFloat(value)
this.onChange()
return this.BaseValue.Value()
}

View File

@ -2,7 +2,7 @@ package attribute
func NewFixedNumeric(pData float32) FixedNumeric {
fixed := FixedNumeric{}
fixed.Set(pData)
fixed.SetFloat(pData)
return fixed
}
@ -10,17 +10,38 @@ type FixedNumeric struct {
baseValue FixedPoint
}
func (this FixedNumeric) Set(value float32) float32 {
this.baseValue = NewFixedPoint(value)
return this.baseValue.Scalar()
}
func (this FixedNumeric) Fixed() FixedPoint {
return this.baseValue
}
func (this FixedNumeric) Value() float32 {
return this.baseValue.Scalar()
}
func (this FixedNumeric) GetValue(pDefault float32) float32 {
if this.Value() != 0 {
return this.Value()
} else {
return pDefault
}
}
func (this FixedNumeric) SetFloat(value float32) float32 {
this.baseValue = NewFixedPoint(value)
return this.baseValue.Scalar()
}
func (this FixedNumeric) Set(value FixedPoint) float32 {
this.baseValue = value
return this.baseValue.Scalar()
}
/// <summary>
/// 增加基本值
/// </summary>
func (this FixedNumeric) Add(value float32) float32 {
this.baseValue.Add(value)
return this.baseValue.Scalar()
}
/// <summary>
/// 减少基本值
/// </summary>

View File

@ -36,6 +36,12 @@ func (this FixedPoint) ToString() string {
return fmt.Sprintf("%f", this.Scalar())
}
/// -
func (this FixedPoint) Add(v float32) {
y := NewFixedPoint(v)
this.rawValue = this.rawValue + y.rawValue
}
/// -
func (this FixedPoint) Reduce(v float32) {
y := NewFixedPoint(v)

View File

@ -36,6 +36,12 @@ type HealthPoint struct {
CurrMaxHpAppend *AttributeNumeric
}
/// <summary>
/// 重置当前生命值为最大值
/// </summary>
func (this *HealthPoint) Reset() {
this.Hp.SetFloat(this.CurrMaxHp.Value())
}
func (this *HealthPoint) Value() int32 {
return int32(this.Hp.Value())
}
@ -43,10 +49,35 @@ func (this *HealthPoint) MaxValue() int32 {
return int32(this.CurrMaxHp.Value())
}
/// <summary>
/// 扣血
/// </summary>
/// <param name="value"></param>
func (this *HealthPoint) Minus(value float32) {
this.Hp.Minus(value)
}
/// <summary>
/// 加血
/// </summary>
func (this *HealthPoint) Add(value float32) {
if FixedPoint_Add(this.Hp.Fixed(), NewFixedPoint(value)).rawValue > this.CurrMaxHp.Fixed().rawValue {
this.Reset()
} else {
this.Hp.Add(value)
}
}
/// <summary>
/// 获取治疗溢出值
/// </summary>
func (this *HealthPoint) Overflow(value float32) float32 {
if FixedPoint_Add(this.Hp.Fixed(), NewFixedPoint(value)).rawValue > this.CurrMaxHp.Fixed().rawValue {
return FixedPoint_Divide(FixedPoint_Add(this.Hp.Fixed(), NewFixedPoint(value)), this.CurrMaxHp.Fixed()).Scalar()
}
return 0
}
/// <summary>
/// 剩余血量百分比
/// </summary>

View File

@ -6,6 +6,7 @@ import (
cfg "go_dreamfactory/sys/configure/structs"
)
///战斗角色
type FightRole struct {
/// <summary>
/// 战斗实例
@ -15,7 +16,15 @@ type FightRole struct {
/// 角色数据
/// </summary>
data core.FightRoleData
CurrentHealth attribute.HealthPoint
CurrentHealth *attribute.HealthPoint
}
func (this *FightRole) Initialize(pData core.FightRoleData) {
// this.data = pData
// this.CurrentHealth = attribute.NewHealthPoint(this.data.Hp)
// this.CurrentHealth.Reset()
// this.data.BuffStore.OwnerRole = this
// this.data.PassiveStore.OwnerRole = this
}
/// <summary>
@ -28,7 +37,7 @@ func (this *FightRole) ReceiveDamage(DamageValue float32) {
//有不死buff生命值设置为1
for _, v := range this.data.BuffStore.HasBuffTypes {
if v == cfg.GameBuffType_UNDEAD {
this.CurrentHealth.Hp.Set(1)
this.CurrentHealth.Hp.SetFloat(1)
break
}
}

176
services/cmd/main.go Normal file
View File

@ -0,0 +1,176 @@
package main
import (
"encoding/json"
"flag"
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/log"
"io/ioutil"
"os"
"os/exec"
"gopkg.in/yaml.v3"
)
/*
服务类型:区服启动程序
服务描述:通过读取游戏json配置,启动服务程序
*/
var (
gmpath = flag.String("p", "./gm.json", "区服配置json") //启动服务的Id
)
func main() {
flag.Parse()
if err := log.OnInit(nil,
log.SetFileName("./log/cmd.log"),
log.SetLoglevel(log.DebugLevel),
log.SetIsDebug(true)); err != nil {
panic(fmt.Sprintf("Sys log Init err:%v", err))
} else {
log.Infof("Sys log Init success !")
}
if config, err := readergmconf(*gmpath); err != nil {
log.Error("读取区服配置失败!", log.Field{Key: "err", Value: err})
} else {
for i, v := range config.Services {
if sseting, err := convertServiceSttings(config, i, v); err != nil {
log.Error("转换服务配置异常!", log.Field{Key: "v", Value: v}, log.Field{Key: "err", Value: err})
return
} else {
if err = writeServiceConfig(fmt.Sprintf("./conf/%s.yaml", sseting.Id), sseting); err != nil {
log.Error("写入服务配置失败!", log.Field{Key: "sseting", Value: sseting}, log.Field{Key: "err", Value: err})
return
}
startService(sseting)
}
}
}
}
//读取游戏配置文件
func readergmconf(path string) (config *comm.GameConfig, err error) {
config = &comm.GameConfig{}
var (
jsonFile *os.File
byteValue []byte
)
if jsonFile, err = os.Open(path); err != nil {
return
} else {
defer jsonFile.Close()
if byteValue, err = ioutil.ReadAll(jsonFile); err != nil {
return
}
err = json.Unmarshal(byteValue, config)
}
return
}
//转换游戏服务配置
func convertServiceSttings(config *comm.GameConfig, id int, sconfig *comm.ServiceConfig) (sseting *core.ServiceSttings, err error) {
sseting = &core.ServiceSttings{}
sseting.Modules = make(map[string]map[string]interface{})
sseting.Sys = make(map[string]map[string]interface{})
sseting.Sys["rpcx"] = map[string]interface{}{
"ConsulServers": config.ConsulAddr,
}
switch sconfig.ServiceType {
case comm.Service_Gateway: //网关服务
sseting.Type = comm.Service_Gateway
sseting.Sys["rpcx"]["RpcxStartType"] = 1
sseting.Modules["gateway"] = map[string]interface{}{
"ListenPort": sconfig.ListenPort,
"SpanServiceTag": config.BelongCrossServerId,
}
break
case comm.Service_Worker: //业务服务
sseting.Type = comm.Service_Worker
sseting.Sys["rpcx"]["RpcxStartType"] = 0
break
case comm.Service_Mainte: //维护服务
sseting.Type = comm.Service_Mainte
sseting.Sys["rpcx"]["RpcxStartType"] = 0
sseting.Modules["web"] = map[string]interface{}{
"WebDir": "./dist",
"Port": sconfig.ListenPort,
"Key": "@234%67g12q4*67m12#4l67!",
}
break
default:
err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type)
return
}
sseting.Id = fmt.Sprintf("%s_s%d", config.AreaId, id)
sseting.Tag = config.AreaId
sseting.Ip = sconfig.Host
sseting.Port = int(sconfig.Port)
sseting.Sys["log"] = map[string]interface{}{
"FileName": fmt.Sprintf("./log/%s.log", sseting.Id),
"Loglevel": sconfig.Loglevel,
"MaxAgeTime": sconfig.MaxAgeTime,
}
sseting.Sys["configure"] = map[string]interface{}{
"ConfigurePath": "./json",
}
sseting.Sys["db"] = map[string]interface{}{}
sseting.Sys["db"]["Loacl"] = map[string]interface{}{
"Enabled": true,
"RedisIsCluster": config.LoaclDB.RedisIsCluster,
"RedisAddr": config.LoaclDB.RedisAddr,
"RedisPassword": config.LoaclDB.RedisPassword,
"RedisDB": config.LoaclDB.RedisDB,
"MongodbUrl": config.LoaclDB.MongodbUrl,
"MongodbDatabase": config.LoaclDB.MongodbDatabase,
}
if !config.IsCross { //不是跨服区服务 需要配置所属跨服db
sseting.Sys["db"]["Cross"] = map[string]interface{}{
"Enabled": true,
"RedisIsCluster": config.CrossDB.RedisIsCluster,
"RedisAddr": config.CrossDB.RedisAddr,
"RedisPassword": config.CrossDB.RedisPassword,
"RedisDB": config.CrossDB.RedisDB,
"MongodbUrl": config.CrossDB.MongodbUrl,
"MongodbDatabase": config.CrossDB.MongodbDatabase,
}
}
return
}
//启动服务程序
func startService(sseting *core.ServiceSttings) (err error) {
var (
cmd *exec.Cmd
)
switch sseting.Type {
case comm.Service_Gateway: //网关服务
cmd = exec.Command("./stup.sh", "start", sseting.Id, "gateway", fmt.Sprintf("./conf/%s.yaml", sseting.Id))
break
case comm.Service_Worker: //业务服务
cmd = exec.Command("./stup.sh", "start", sseting.Id, "worker", fmt.Sprintf("./conf/%s.yaml", sseting.Id))
break
case comm.Service_Mainte: //维护服务
cmd = exec.Command("./stup.sh", "start", sseting.Id, "mainte", fmt.Sprintf("./conf/%s.yaml", sseting.Id))
break
default:
err = fmt.Errorf("服务类型异常 stype:%s", sseting.Type)
return
}
err = cmd.Start()
return
}
//写入服务配置文件
func writeServiceConfig(filename string, sseting *core.ServiceSttings) (err error) {
var data []byte
if data, err = yaml.Marshal(sseting); err != nil {
return
} else {
err = ioutil.WriteFile(filename, data, 0777)
}
return
}